| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Elemente aus Blockreferenz entfernen (2239 mal gelesen)
|
WolfgangE Mitglied
Beiträge: 1006 Registriert: 29.01.2003 Compass2000 in (fast) allen Ausbaustufen: Jobserver, ACM, Replikator, DBQ-Programmierung. Programmierung, Wartung und Administration von MSSQL2000-Datenbanken. Grundlegende Kenntnisse in AutoLisp-Programmierung.
|
erstellt am: 30. Jun. 2005 12:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Lispler, gleich vorweg: bin sowohl in Lisp als auch AutoCad ziemlicher Laie. Ich habe in AutoCad eine Blockreferenz (also ein 0.INSERT). Nun möchte ich aus dieser Blockreferenz bestimmte Elemente rauslöschen, z.B. alle Linien auf einem bestimmten Layer. Ich bin schon mal so weit, wenn ich mir das Element 0.BLOCK aus der Blocktabelle hole, dass ich in Folge alle Elemente des Blocks auflisten kann. Wenn ich nun aber die Elemente löschen will, funktioniert das nicht. Warum? Hier mein Ansatz: (SETQ CurrInsert (SSNAME (SSGET "X" '((0 . "INSERT"))) 0)) (SETQ CurrInsert (TBLOBJNAME "block" (CDR (ASSOC 2 (ENTGET CurrInsert))))) (SETQ CurrObject (ENTNEXT CurrInsert)) (WHILE CurrObject (PRINT (ENTGET CurrObject)) (IF (= (CDR (ASSOC 8 (ENTGET CurrObject))) "Layer2" ) (ENTDEL CurrObject) );;IF (SETQ CurrObject (ENTNEXT CurrObject)) ) (PRINC) Anbei ein kleine Testzeichung. Ich möchte also die Linie auf Layer 2 löschen, der Block soll aber erhalten bleiben, ich möchte also am Ende wieder mein INSERT haben. Ich weiß dass ich auch den Block zuerst auflösen, dann das Element filtern und löschen und abschließend den Block wieder zusammensetzen könnte. Ich dachte obiges Beispiel wäre eine praktikablere Alternative. Besten Dank zusammen, WolfgangE ------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 30. Jun. 2005 12:26 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangE
Hallo Wolfgang, versuch es mal mit (vla-delete (vlax-ename->vla-object CurrObject)) anstelle des (entdel CurrObject) (ich habe es nicht getestet, aber mit (vla-delete lässt sich Erfahrungsgemäß einiges mehr löschen) EDIT: Was mir eben auch noch aufgefallen ist: Du kannst nicht mit (entnext ..) auf ein bereits gelöschtes Element gehen. Sammle also zunächst mal alle Blockelemente ein und vergleiche danach und lösche. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Autodesk User Group Central Europe Individuelle Lösungen von Heute auf Morgen. AUGCE Manager Deutschland
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 30. Jun. 2005 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangE
mit activx-Schnipsel sollte es gehen (progn (vl-load-com) (SETQ CurrInsert (SSNAME (SSGET "X" '((0 . "INSERT"))) 0)) (SETQ CurrInsert (TBLOBJNAME "block" (CDR (ASSOC 2 (ENTGET CurrInsert))))) (SETQ CurrObject (ENTNEXT CurrInsert)) (WHILE CurrObject (setq NEXT(ENTNEXT CurrObject)) (IF (=(CDR (ASSOC 8 (ENTGET CurrObject)))"Layer2") (vla-delete (vlax-ename->vla-object CurrObject)) ) (SETQ CurrObject NEXT) ) (PRINC) ) ------------------ - 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 |
WolfgangE Mitglied
Beiträge: 1006 Registriert: 29.01.2003 Compass2000 in (fast) allen Ausbaustufen: Jobserver, ACM, Replikator, DBQ-Programmierung. Programmierung, Wartung und Administration von MSSQL2000-Datenbanken. Grundlegende Kenntnisse in AutoLisp-Programmierung.
|
erstellt am: 30. Jun. 2005 13:11 <-- editieren / zitieren --> Unities abgeben:
Hallo Ihr beiden, erst mal Danke für die raschen Antworten. Leider bringt's nichts, die zu löschende Linie ist nach wie vor im Block drinnen. Ich frage mich ob ich den Block auflösen muss? Oder muss ich zusätzlich zum Element noch was anderes löschen, irgendwelche Referenze oder so? Mit REFEDIT würd's ja wie gewüscht funktionieren, nur brauch ich's eben vollautomatisch. Hier noch mal mein korrigierter Ansatz, hab die Änderung von Brischke auch eingebaut (von wegen ENTNEXT, eigentlich wär's ja logisch): (VL-LOAD-COM) (DEFUN wec_test ( / CurrInsert CurrObject BlockElements counter) (SETQ CurrInsert (SSNAME (SSGET "X" '((0 . "INSERT"))) 0)) (SETQ CurrInsert (TBLOBJNAME "block" (CDR (ASSOC 2 (ENTGET CurrInsert))))) (SETQ CurrObject (ENTNEXT CurrInsert)) (WHILE CurrObject (SETQ BlockElements (CONS CurrObject BlockElements)) (SETQ CurrObject (ENTNEXT CurrObject)) ) ;;WHILE (FOREACH CurrElement BlockElements (IF (= (CDR (ASSOC 8 (ENTGET CurrElement))) "Layer2") ;;(PRINT CurrElement) ;;(ENTDEL CurrElement) (vla-delete (vlax-ename->vla-object CurrElement)) );;IF ) ;;FOREACH (PRINC) ) ;;DEFUN Ihr habt nicht zufällig noch Ideen? Besten Dank, WolfgangE ------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 30. Jun. 2005 13:18 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangE
|
WolfgangE Mitglied
Beiträge: 1006 Registriert: 29.01.2003 Compass2000 in (fast) allen Ausbaustufen: Jobserver, ACM, Replikator, DBQ-Programmierung. Programmierung, Wartung und Administration von MSSQL2000-Datenbanken. Grundlegende Kenntnisse in AutoLisp-Programmierung.
|
erstellt am: 30. Jun. 2005 13:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Brischke, besten Dank, mit dem REGEN funktioniert's. Zumindest wenn ich mit dem VL-Befehl lösche, ENTGET funktioniert dennoch nicht, aber passt gut so. Besten Dank, WolfgangE P.S.: Der Anhang im ersten Beitrag wäre eine Beispiel-DWG gewesen, hätte ich dazu schreiben sollen. ------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangE Mitglied
Beiträge: 1006 Registriert: 29.01.2003 Compass2000 in (fast) allen Ausbaustufen: Jobserver, ACM, Replikator, DBQ-Programmierung. Programmierung, Wartung und Administration von MSSQL2000-Datenbanken. Grundlegende Kenntnisse in AutoLisp-Programmierung.
|
erstellt am: 30. Jun. 2005 13:26 <-- editieren / zitieren --> Unities abgeben:
Hätte dann noch eine Frage dazu. Ich möchte mit obigen Programm mehrere Blöcke durchsuchen. Wie weiß ich in der Schleife mit dem ENTGET, wann der aktuelle Block zu Ende ist? Kann ich mich da auf DXF-Code 330 stützen? Wenn sich der ändert, ist der aktuelle Block zu Ende? ------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 30. Jun. 2005 13:36 <-- editieren / zitieren --> Unities abgeben: Nur für WolfgangE
Hallo Wolfgang, wenn ich mich recht entsinne, dann gibt (entnext) nil zurück, sobald man über das letzet Element hinaus möchte. Somit wäre ein (while (entnext elem) .. ) das funktionierende Konstrukt. Ich mache das seit geraumer Zeit nur noch mit (vl-..), deshalb stütze ich mich hier auf die Erinnerungen. Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Autodesk User Group Central Europe Individuelle Lösungen von Heute auf Morgen. AUGCE Manager Deutschland Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangE Mitglied
Beiträge: 1006 Registriert: 29.01.2003 Compass2000 in (fast) allen Ausbaustufen: Jobserver, ACM, Replikator, DBQ-Programmierung. Programmierung, Wartung und Administration von MSSQL2000-Datenbanken. Grundlegende Kenntnisse in AutoLisp-Programmierung.
|
erstellt am: 30. Jun. 2005 15:56 <-- editieren / zitieren --> Unities abgeben:
Hallo Brischke, hast recht, das Konstrukt funktioniert bereits so wie es ist. Ich war der Meinung (ENTNEXT) würde am Ende des Blocks einfach mit dem Rest der Zeichnungsdatenbank weitermachen, bis alles durch ist. Ist aber genau so wie du sagst. Perfekt! ------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |