| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Blockinhalt löschen (1171 mal gelesen)
|
ryfCAD Mitglied Architekt
Beiträge: 126 Registriert: 21.06.2005 ryfCAD rC Architektur für AutoCAD und GstarCAD
|
erstellt am: 10. Mai. 2020 17:55 <-- editieren / zitieren --> Unities abgeben:
Guten Tag, ich benötige eine Unterfunktion um in Blöcken, und nur in Blöcken, Schraffuren oder Solids oder Texte oder Masse zu löschen. Hier mein Ansatz mit dem Problem, dass ich bei der Funktion Element löschen weder mit VL noch mit command weiter komme. Der zweite Code den ich im Forum gefunden habe funktioniert einwandfrei, mit einer Ausnahme: Es werden auch Elemente ausserhalb des Blockes tangiert, was ich nicht will. Ich habe den zweiten Code auch schon angepasst und nur den 2. Teil ab "(vlax-for BLOCK" laufen lassen, ohne Erfolg. Sitze nun schon einige Zeit an diesem Problem und bin dankbar für jeden Hinweis. ------------------------------------------------------------------------------------- Hier mein Ansatz:
(defun inBlockOperation () (setq countr 0 blklist '()) (if (setq Obj (ssget "_X" '((0 . "INSERT")))) (repeat (sslength Obj) (setq elem (ssname Obj countr)) (setq element (tblobjname "BLOCK" (cdr (assoc 2 (entget elem))))) (if (not (member element blklist)) (progn (setq blklist (cons element blklist)) (while (not (= (cdr (assoc 0 (entget element))) "ENDBLK") ) (if (= (cdr (assoc 1 (entget element))) "HATCH") (progn ;------------------ ;Element löschen ;------------------ ;(vla-delete (vlax-ename->vla-object element)) ;geht nicht, nil ;(command "_.erase" element "") ;geht nicht: ausserhalb Bereich ) ) (setq element (entnext element)) ) ) ) (setq countr (+ countr 1)) ) ) )
------------------------------------------------------------------------------------- Hier der Code der auch Elemente ausserhalb des Blockes tangiert: (defun C EL-SOLID( / BLOCK ) (vl-load-com) (vlax-for LAYOUT (vla-get-layouts(vla-get-activedocument(vlax-get-acad-object))) (vlax-for ITEM (setq BLOCK (vla-get-Block LAYOUT)) (if(and(=(strcase(vla-get-objectname ITEM))(strcase "AcDbHatch")) (wcmatch (strcase(vla-get-PatternName ITEM)) "SOLID*") ) (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list ITEM) ) ) ) ) ) (vlax-for BLOCK (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object))) (vlax-for ITEM BLOCK (if(and(=(strcase(vla-get-objectname ITEM))(strcase "AcDbHatch")) (wcmatch (strcase(vla-get-PatternName ITEM)) "SOLID*") ) (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list ITEM) ) ) ) ) ) (vla-regen(vla-get-activedocument (vlax-get-acad-object)) acAllViewports) )
------------------ Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein [Diese Nachricht wurde von ryfCAD am 10. Mai. 2020 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ryfCAD Mitglied Architekt
Beiträge: 126 Registriert: 21.06.2005 ryfCAD rC Architektur für AutoCAD und GstarCAD
|
erstellt am: 10. Mai. 2020 17:58 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 10. Mai. 2020 18:14 <-- editieren / zitieren --> Unities abgeben: Nur für ryfCAD
Dein Ansatz, nicht im Detail geprüft, schaut richtig ob ein Objekt vom Typ ENDBLK ist, aber falsch ob es ein Objekt HATCH ist. Gruppencode 0 ist der Objekttyp, nicht 1 Der andere Code enthält ja einen fast identischen Part. Ich bin sicher du kannst es auch damit lösen. Tip: Lasse dir einfach mal die Objektnamen ausgeben statt etwas zu löschen, einfach um in einer minimalen Testdatei zu sehen was da so durch die Schleifen verarbeitet wird.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 10. Mai. 2020 18:20 <-- editieren / zitieren --> Unities abgeben: Nur für ryfCAD
|
ryfCAD Mitglied Architekt
Beiträge: 126 Registriert: 21.06.2005 ryfCAD rC Architektur für AutoCAD und GstarCAD
|
erstellt am: 10. Mai. 2020 18:26 <-- editieren / zitieren --> Unities abgeben:
Das wars, zu lange am Compi gesessen. Ein Durchlauf funktioniert, der zweite gibt eine Fehlermeldung: Befehl inblockoperation) ; Fehler: Argument type error: lentityp nil ------------------ Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ryfCAD Mitglied Architekt
Beiträge: 126 Registriert: 21.06.2005 ryfCAD rC Architektur für AutoCAD und GstarCAD
|
erstellt am: 10. Mai. 2020 18:29 <-- editieren / zitieren --> Unities abgeben:
ich lösche mittels: (vla-delete (vlax-ename->vla-object element)) ein Durchgang ist OK. danach die Fehlermeldung. ------------------ Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Mai. 2020 07:15 <-- editieren / zitieren --> Unities abgeben: Nur für ryfCAD
|
ryfCAD Mitglied Architekt
Beiträge: 126 Registriert: 21.06.2005 ryfCAD rC Architektur für AutoCAD und GstarCAD
|
erstellt am: 11. Mai. 2020 07:38 <-- editieren / zitieren --> Unities abgeben:
@CADmium: funktioniert! Besten Dank! Suche noch den Unterschied von Code 2, 2. Abschnitt, zu deiner Lösung. Frage: weshalb ist meine Funktion an der Stelle von (setq element (entnext element)) ins Stocken geraten? Die repeat- Schlaufe wird mit der Anzahl der gefundenen Blöcken begrenz, funktioniert. Die while- Schlaufe wird mit (= (cdr (assoc 0 (entget element))) "ENDBLK") begrenzt, funktioniert nicht, weshalb? Besten Dank!!! (defun inBlockOperation () (setq countr 0 blklist '()) (if (setq Obj (ssget "_X" '((0 . "INSERT")))) (repeat (sslength Obj) (setq elem (ssname Obj countr)) (setq element (tblobjname "BLOCK" (cdr (assoc 2 (entget elem))))) (if (not (member element blklist)) (progn (setq blklist (cons element blklist)) (while (not (= (cdr (assoc 0 (entget element))) "ENDBLK") ) (if (= (cdr (assoc 1 (entget element))) "HATCH") (progn ;(vla-delete (vlax-ename->vla-object element)) *als Variante* (entdel element) ) ) (setq element (entnext element)) ) ) ) (setq countr (+ countr 1)) ) ) )
------------------ Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 11. Mai. 2020 07:53 <-- editieren / zitieren --> Unities abgeben: Nur für ryfCAD
Zitat: Original erstellt von ryfCAD:
Frage: weshalb ist meine Funktion an der Stelle von (setq element (entnext element)) ins Stocken geraten?
ungetestet .... nach dem Löschen fehlt vielleicht der Bezug für entnext ... Tipp : sammle erst in der while-Schleife alle Schraffurobjekte in einer Liste und lösch die nach Beendigung der Whileschleife ... z.B: so (defun inBlockOperation ( / LISTE) (setq countr 0 blklist '()) (if (setq Obj (ssget "_X" '((0 . "INSERT")))) (repeat (sslength Obj) (setq elem (ssname Obj countr)) (setq element (tblobjname "BLOCK" (cdr (assoc 2 (entget elem))))) (if (not (member element blklist)) (progn (setq LISTE nil) (setq blklist (cons element blklist)) (while (not (= (cdr (assoc 0 (entget element))) "ENDBLK") ) (if (= (cdr (assoc 1 (entget element))) "HATCH") (progn (setq LISTE (cons ELEMENT LISTE)) ) ) (setq element (entnext element)) ) (mapcar '(lambda(X)(vla-delete (vlax-ename->vla-object X))) LISTE ) ) ) (setq countr (+ countr 1)) ) ) ) (auch ungetestet ) ------------------ Also ich finde Unities gut ... und andere sicher auch --------------------------------------- - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ryfCAD Mitglied Architekt
Beiträge: 126 Registriert: 21.06.2005 ryfCAD rC Architektur für AutoCAD und GstarCAD
|
erstellt am: 11. Mai. 2020 08:14 <-- editieren / zitieren --> Unities abgeben:
leider: ; Fehler: Argument type error: lentityp nil Aber Ok. Deine Lösung funktioniert nun sowohl für Schraffuren und angepasst auch für nur Solid-Schraffuren.
Anmerkung: Deine schon lange veröffentlichte Lösung ist auch toll, wenn alle Schraffuren oder Solid-Schraffuren gelöscht werden sollen! Da ich mich mit der direkten Manipulation von Elementen noch nicht auskenne, arbeite ich oft über (command). Oft werden Zeichnungen mit Blöcken zur Weiterbearbeitung abgegeben. Innerhalb der Blöcke befindet sich oft unnützer Balast wie Schraffuren, Texte, Masse etc. Eine entsprechende Bereinigung NUR innerhalb der Blöcke ist sehr nützlich und der Code kann entsprechend perfekt angepasst werden: "AcDbHatch" "AcDbText" "AcDbDimension" etc. Besten Dank! ------------------ Auch für LT gibt es Lösungen, aber Lisp erleichtert das Leben ungemein Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |