Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Löschen und bereinigen verschachtelter Blöcke

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
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Löschen und bereinigen verschachtelter Blöcke (765 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: 23. Sep. 2004 10:25    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 Lisp-Gemeinde,

bin hier ein wenig am verzweifeln, bitte um gute Raschläge. Ich möchte per AutoLisp einen Block (Schriftfeld) löschen. Anschließend möchte ich den Block über den Befehl "PURGE" bereinigen.

Wenn der gelöschte Block nun aber verschachtelt ist, muss ich "PURGE" immer wieder aufrufen, bis die letzte verschachtelte Ebene abgearbeitet ist.

Mein Lösungsansatz:
Habe mir von MapCar die Funktion Get-Subinserts ausgeliehen, um die verschachtelten Blöcke zu erhalten.
Code:
----------------------------------------------------------------------
(defun get-subinserts(insert / subinserts ent)
  (setq subinserts(list insert))
  (setq ent(cdr(assoc -2(tblsearch "block"(cdr(assoc 2(entget insert)))))))
  (while ent
    (if(="INSERT"(cdr(assoc 0(entget ent))))
      (setq subinserts(append subinserts(get-subinserts ent)))
    )
    (setq ent(entnext ent))
  )
  subinserts
)
----------------------------------------------------------------------

Also:
(SETQ BLÖCKE (GET-SUBINSERTS MyBlock)) ;;Blöcke suchen
(FOREACH OBJ BLÖCKE (ENTDEL OBJ)) ;; Blöcke löschen

So weit so gut, nur beim Bereinigen habe ich so meine Probleme:
;; Bereinigen des angegebenen Blocks
(DEFUN PurgeBlock (block / blockname)
  (SETQ blockname (CDR (ASSOC 2 (ENTGET block))))
  (COMMAND "_PURGE" "Blöcke" BlockName "N")
  );;Defun

(FOREACH OBJ (BLÖCKE (PurgeBlock OBJ))


AutoCad rattert zwar jetzt den Purge-Befehl durch, tut aber im Endeffekt nichts, da ich immer die Meldung "Keine unreferenzierten Blöcke gefunden." erhalte.

Was mache ich falsch?

Mit bestem Dank und freundlichen Grüßen,
WolfgangE

------------------
An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!!

[Diese Nachricht wurde von WolfgangE am 23. Sep. 2004 editiert.]

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: 13508
Registriert: 30.11.2003

.

erstellt am: 23. Sep. 2004 10:30    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

guck mal hier Fast ähnliches Thema. .. Hoffe, es hilft weiter. Ansonsten guck dir mal ActiveX an .. vl-delete und so..

------------------
- Thomas -
"Bei 99% aller Problemen 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: 23. Sep. 2004 10:40    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

Ich glaube bei mir haperts wo anders. Die Liste der Blöcke habe ich ja.
Sieht dann z.B. so aus:
(FOREACH OBJ BLÖCKE (PRINT OBJ))
<Objektname: 7ef5c5a8>
<Objektname: 7ef5c2d0>
<Objektname: 7ef5c4e0>
<Objektname: 7ef5c4e8>
<Objektname: 7ef5c508>
<Objektname: 7ef5c510> <Objektname: 7ef5c510>

Wenn ich allerdings auf die Namen abfragen möchte, klappt das nicht so richtig:
(FOREACH OBJ BLÖCKE (ASSOC 2 (ENTGET OBJ)))
(2 . "AME_SOL")

Warum erhalte ich hier nur 1 Zeile zurück? Wo sind meine anderen blöcke geblieben?

------------------
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

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: 13508
Registriert: 30.11.2003

.

erstellt am: 23. Sep. 2004 10:46    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

die Schleife (repeat .. ) bringt dir bloß das Ergebnis der letzten Operation innerhalb der Schleife als Rückgabe!
Teste mal (FOREACH OBJ BLÖCKE
              (prin1(ASSOC 2 (ENTGET OBJ)))
          )


aber guck auch mal hier das alles als ActivX-Variante. und ein _purge kann man dann mit
(vlax-for ITEM (vla-get-blocks
                 (vla-get-active-document
                   (vlax-get-acad-object)
                 )
               )
    (vl-catch-all-apply
       'vla-delete
       (list ITEM)
    )
)

errreichen  ..

------------------
  - Thomas -
"Bei 99% aller Problemen ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

[Diese Nachricht wurde von CADmium am 23. Sep. 2004 editiert.]

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: 23. Sep. 2004 11: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

GEIIIIIIIIIIIISTESBLITZ!

kann ja auf meine Art gar nicht funktionieren. Ich mache ja das
(FOREACH OBJ BLÖCKE (ENTDEL OBJ))

Wenn ich jetzt genau diese Objekte lösche, kann (ENTGET ...) der jeweiligen Objekte natürlich nichts mehr zurückliefern.

Wenn ich's so mache, müsste ich mir VOR dem (ENTDEL ...) die Namen der Blöcke rausspeichern und dann fortfahren.

Danke und ciao,
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

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)2023 CAD.de | Impressum | Datenschutz