Hot News aus dem CAD.de-Newsletter:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Elemente aus Blockreferenz entfernen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   Elemente aus Blockreferenz entfernen (1298 mal gelesen)
WolfgangE
Mitglied



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


test.dwg.txt

 
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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4136
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 30. Jun. 2005 12:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für WolfgangE 10 Unities + Antwort hilfreich

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




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13435
Registriert: 30.11.2003

.

erstellt am: 30. Jun. 2005 12:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für WolfgangE 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4136
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 30. Jun. 2005 13:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für WolfgangE 10 Unities + Antwort hilfreich


extdelete.VLX.txt

 
Hallo Wolfgang,

hast du am Ende mal regeneriert? Erst danach wird die Änderung sichtbar.

Im angehängten Tool, ist genau die Zeile aus obigen Beitrag drin .. es funzt also mit (vla-delete ..)
Falls das Tool bei dir auch nicht geht, dann stell mal solchen Bsp-Block hier rein.

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



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4136
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 30. Jun. 2005 13:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für WolfgangE 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von WolfgangE an!   Senden Sie eine Private Message an WolfgangE  Schreiben Sie einen Gästebucheintrag für WolfgangE

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2020 CAD.de | Impressum | Datenschutz