| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: ssget verschachtelte Blöcke (3593 mal gelesen)
|
Frank-WZB Mitglied Konstrukteur-WZB
Beiträge: 7 Registriert: 22.09.2004 Acad2004, LT2004 deutsch Win2000, NT4
|
erstellt am: 22. Sep. 2004 12:49 <-- editieren / zitieren --> Unities abgeben:
Hallo Lisp Gemeinde 1. Wie wählt man per ssget nur die Blöcke an in die weitere Blöcke eingebaut sind, die angewählten sollen dann per command ursprung zerlegt werden. 2. Ist das auch per Fensterwahl möglich damit nur ein Teil der Zeichnungsblöcke zerlegt wird,(die Werkstattrechner sind schon etwas in die Jahre gekommen und dadurch recht langsam) 3. Wie sieht der Ablauf für den Mehrfachdurchlauf aus, bis keine Blockverschachtelungen mehr da sind. Das ganze soll unter Acad2004 und LT2004 mit LT-Extender verwendet werden für ein paar erklärende Worte bin ich dankbar, ich zähle mich immer noch zu den Lisp-Anfängern Grund: Wir haben viele verschachtelte Blöcke, d.h. in Blöcken sind weitere Blöcke und Zeichnungselemente zusammengefast, für das Auslesen in dxf's per Objektwahl und das Erstellen von Koordinatentabellen für die CNC-Bearbeitung sollen alle oberen Blockebenen aufgelöst werden, ! es sollen also nur die Blöcke übrig bleiben, die keine weiteren Blöcke mehr enthalten ! (Die Originalzeichnung bleibt automatisch unverändert, weil die Werkstatt keine Schreibrechte hat) Vielen Dank im voraus! Frank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 22. Sep. 2004 13:03 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
EDIT: WILLKOMMEN !!Über ssget geht das nicht, dazu gehört mehr... Du müßtest jede Blockdefinition überprüfen ob sie INSERTs enthalten, wenn JA = Verschachtelung. usw Zu diesem Thema (Blockdefinitionen etc) gibt es hier bereits mehrere Thread´s und auch Code-Schnipsel ! [ Das später auf eine Fensterwahl zu begrenzen ist dann ja kein Thema !? ] siehe zB Hier (Suchfunktion nutzen) http://ww3.cad.de/foren/ubb/Forum145/HTML/000771.shtml ------------------ Bitte Systemdaten eintragen (siehe links unter dem Namen), wie & warum siehst du HIER [Diese Nachricht wurde von cadffm am 22. Sep. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4186 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 22. Sep. 2004 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Hallo Frank, und auch von mir ein herzliches Willkommen. Sebastian hat Recht, am besten ist, du ermittelst dir alle Blöcke. Aus dieser Liste entfernst du alle die, die einen INSERT enthalten in deren Definition. Aus den verbleibenden erstellst du dir einen Auswahlsatz, und explodierst die einzeln! siehe: hier Bei Fragen ... Grüße Holger
------------------ Holger Brischke (defun - Lisp over night! AutoLISP-Programmierung für AutoCAD Da weiß man, wann man's hat! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 22. Sep. 2004 13:28 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Nach all den guten Tips noch einer : Guck dir mal Mapcar's Seiten an, und auch etwas (schnell zusammenkopierten) Code: (defun c:INSERTEXPLODE (/ BLOCKDEF OBJEKT FOUND LISTE) (princ "\n Verschachtelte Blöcke auflösen \n") (command "._undo" "m") (while (setq BLOCKDEF (tblnext "BLOCK" (null BLOCKDEF))) ; BLocktable durchlaufen (progn (setq OBJEKT (cdr (assoc -2 BLOCKDEF))) ; Adresse der Blockelemente holen (setq FOUND nil) (while (and OBJEKT (not FOUND)) (setq FOUND (=(cdr(assoc 0 (entget OBJEKT))) "INSERT"));Blockreferenz gefunden (setq OBJEKT (entnext OBJEKT)) ; nächstes Blockelement, Blockende="nil" ) (if FOUND (setq LISTE (cons (cdr(assoc 2 BLOCKDEF)) LISTE))) ) ) (if(and Liste (setq AUSWAHL (ssget "_X" (list '(0 . "INSERT")(cons 410 (getvar "CTAB"))))) ) (progn (while (> (sslength AUSWAHL) 0 ) (setq OBJEKT (entlast)) (setq INDEX -1) (repeat (sslength AUSWAHL) ; Auswahl durchlaufen und abarbeiten... (setq INSERT(ssname AUSWAHL (setq INDEX (1+ INDEX)))) (if(and(=(cdr(assoc 0 (entget INSERT))) "INSERT") (member(cdr(assoc 2 (entget INSERT))) LISTE) ) (command "_.explode" (ssname AUSWAHL INDEX)) ;... dann auflösen ) ) (setq AUSWAHL(ssadd)) ; leeren Auswahlsatz erzeugen (setq OBJEKT (entnext OBJEKT)) ; auf das erste Element nach "Merker"! (while OBJEKT (if (=(cdr(assoc 0 (entget OBJEKT))) "INSERT") (setq AUSWAHL (ssadd OBJEKT AUSWAHL)) ; Auswahlsatz mit neuen Elementen ) (setq OBJEKT (entnext OBJEKT)) ) ) (initget "J N") (if (not(=(getkword(strcat "\nUnreferenzierte Blöcke bereinigen? <J>a / <N>ein: <J> ")) "N" ) ) (repeat 5 (command "._purge" "_BL" "*" "_N")) ) (command "._regen") ) ) ) ------------------ - 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 |
Frank-WZB Mitglied Konstrukteur-WZB
Beiträge: 7 Registriert: 22.09.2004 Acad2004, LT2004 deutsch Win2000, NT4
|
erstellt am: 23. Sep. 2004 06:58 <-- editieren / zitieren --> Unities abgeben:
Danke für das Willkommen ! Ihr seid ja super schnell Danke für die einführenden Erläuterungen Die Lisp "insertexplode" von CADmium trifft genau ins Schwarze, also volle Punktzahl Für andere die's nutzen wollen noch einige Testhinweise von mir dazu: zuerst lief es nicht, (bei Zeile 27) Objekt wählen:-_explode *ungültige Auswahl* erwartet einen Punkt oder Letztes/Alle/Gruppe/Klasse dies liegt bei mir an den Layout's zum Ausdrucken, als diese aus der Zeichnung entfernt waren dann funktionierte es, die ganze Zeichnung abzuarbeiten dauert allerdings recht lange, weil wirklich alles wunschgemäß zerlegt wird, also (in Zeile 16) bei ssget das "_X" raus damit man einen Zeichnungsbereich anwählen kann, dann arbeitet das Programm nur dort wo ich es brauche und ist richtig schnell, dadurch werden auch nur noch Elemente aus dem aktuellen Zeichnungsbereich gewählt und die Fehlermeldung ist weg. Herzlichen Dank an CADmium, das Problem ist gelöst Gruß Frank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 08:08 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Hallo, bei mir werden durch insertexplode teilweise Blöcke völlig aufgelöst. Da bleiben zum Teil nur noch Polylinien übrig. Ich habe gehofft, das die unterste Blockstruktur erhalten bleibt. Kann man da noch etwas anpassen? Danke und Grüße Jörg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 08:32 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Hallo, spontan würde ich auch sagen: Das sollte nicht geschehen, stelle uns doch bitte ein Beispiel zur Verfügung bei dem das passiert. (bitte lösche alles andere, eine Blockreferenz ist völlig ausreichend in der DWG, danke)Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 08:52 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 09:13 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Das Bricscad solltest du vielleicht direkt am Anfang erwähnen Dein Modell hat zwei Blockreferenzen, bei beiden funktioniert es bei meinem Test korrekt. Ich testete aber mit V16 und natürlich mit Autodesk Produkten - wofür dieses Tool geschrieben wurde, wir sind hier ja beim AutoDESK-LISP ANS3D30_02007 hinterlässt weit über dreihundert Blockreferenzen und DVI_FIGURE_02813 verbleibt als Referenz auf Block _D2 Nehme bitte selbst einmal die Datei aus dem Forum (herunterladen falls du ggf. zwischenzeitlich daran gearbeitet hast), die Datei öffnen und das Programm einmal ausführen, danach die Datei unter anderem Namen speichern und hier wieder anhängen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1988 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 09. Aug. 2022 09:18 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 09:25 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 09:30 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Am liebsten JA, aber ich habe geschrieben "herunterladen falls du ggf. zwischenzeitlich daran gearbeitet hast" Warum: Erfahrung mit Computernanwendern Es kommt einfach sehr oft vor das ein Anwender nicht vom selben Dateistand aus testet und statt 10min Erklärung (die im Zweifelsfall eh nichts bringt) umgeht man diesen unnötigen Ärger in dem man einfach sagt: Datei selbst herunterladen und öffnen. Dieser Anleitung kann jeder folgen und der Dateiinhalt der sich dann präsentiert und auf dem der Test durchgeführt wird, ist uns dann auch 100%ig bekannt, Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 09:37 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 09:41 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
357 Blockreferenzen vorhanden, wie in AutoCAD - daher spare ich mir eine Datei zu erzeugen für dich. Deine Aussage passt also nicht zu dem Beispiel oder deine Beschreibung war irgendwie falsch bzw. unpräzise. Prüfe selbst noch einmal das Ergebnis und wenn du die 357 Blockreferenzen siehst und dich nicht wunderst: Fange mal an dein Anliegen neu (und besser) zu beschreiben
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 09:44 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Sorry, wenn es zu Missverständnissen kommt... Ein Beispiel zu der Zeichnung: Wenn ich in der Zeichnung die Funktion Ursprung ausführe und dann immer wieder auf das Alu RR 70x20 klicke und wiederhole so wird bleibt irgendwann die Blockreferenz Alu RR 70x20_02483. Diesen Stand will ich erreichen. Wenn ich _explode weiter wiederhole bleiben nur noch Polylinien. Das ist dann zu viel aufgelöst. Nutze ich die Funktion insertexplode wird das Alu RR 70x20 in Polylinien aufgelöst (was ich ja nicht haben möchte!). Andere Blockreferenzen werden wiederum nicht in Polylinien aufgelöst (so sollte es ja auch sein) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Zitat: Original erstellt von Jörg: >>"so wird bleibt irgendwann die Blockreferenz Alu RR 70x20_02483" Das prüfe ich jetzt nicht, aber die letzte Blockreferenz ist vom Block TFIELD_02488 und nicht vom Block Alu RR 70x20_02483>>"Diesen Stand will ich erreichen." Das ist aber die 2. verschachtelungsebene von 6 oder 7, also "irgendwas mittendrin" Man könnte zwar ein Programm schreiben was immer "irgendwas mittendrin" stehen lässt, oder auch immer nur die 3. Verschachtelungsebene, abeer ich befürchte du würdest mit beiden Varianten nicht glücklich werden. Im Einzelfall des Textes "Alu RR 70x20" würden beide das gewünschte Ergebnis liefern aber ich befürchte du willst nicht immer die 3.Ebene. >>" Wenn ich _explode weiter wiederhole bleiben nur noch Polylinien. " Nicht im Fall von 'Alu RR 70x20_02483', da kommen noch 5 weitere Verschachtelungen und bei der zugehörigen "Hinweislinie" sind es immerhin noch 4 (also eine weniger wie beim Text). >>"Nutze ich die Funktion insertexplode wird das Alu RR 70x20 in Polylinien aufgelöst (was ich ja nicht haben möchte!). >>"Andere Blockreferenzen werden wiederum nicht in Polylinien aufgelöst (so sollte es ja auch sein)" Das Programm ist dafür geschrieben Blockreferenzen auszulösen solange diese eine andere Blockreferenz enthalten, für nichts anderes und genau das macht das Programm (auch bei dir).
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 10:19 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Mir ist aufgefallen, das die Bockreferenzen welche fälschlicherweise aufgelöst werden, aus 2D-Polylinien bestehen. Die Blockreferenzen die nicht aufgelöst werden, bestehen aus Linien. Ist das Ursache?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 10:26 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Lese meine letzte Antwort vielleicht noch einmal (am Ende hatte ich auch noch ergänzt). Hier mal eine Vermutung wie deine Anforderung aussehen könnte - wenn ich es denn richtig verstanden habe. Entgegen dem Thema/Ziel um welches in diesem Thread eigentlich ging ist dein Wunsch: Blockreferenzen auflösen solange daraus wiederum nur Blockreferenzen verbleiben. Allerdings wäre das in deinem konkreten Fall der Block Alu RR 70x20_02484 und nicht der Block Alu RR 70x20_02483, daher bin ich mir noch etwas unsicher ob ich es richtig erfasst habe. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 10:32 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 10:42 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Nein, sonst hätte ich dir den Befehl gleich genannt. Bleibt also nur eine Programmmerweiterung, ein Tool. Wobei.. keine Ahnung, ich kenne mich mit Bricscad v8 nicht aus, ich bin AutoCAD Anwender Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 09. Aug. 2022 11:10 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
cadffm Moderator 良い精神
Beiträge: 22171 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Aug. 2022 11:15 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|
archtools Mitglied
Beiträge: 943 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 10. Aug. 2022 10:22 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Zitat: Original erstellt von Jörg: Hallo,bei mir werden durch insertexplode teilweise Blöcke völlig aufgelöst. Da bleiben zum Teil nur noch Polylinien übrig.
Du musst das richtig herum machen: 1. Aus der Block-Table alle Blocknamen finden, bei denen INSERTs in der Blockdefinition sind. 2. Nacheinander mit SSGET und Filter auf die gefundenen Blocknamen die INSERTs finden, und diese nur einmal auflösen. Das machst Du solange, bis keine INSERTs mit Blocknamen aus 1) mehr gefunden werden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 943 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 13. Aug. 2022 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
Forumssoftware ist kaputt: Zitat: Original erstellt von : [B][/B]
Hier hast Du eine Funktion, die Dir alle Elemente einer Table liefert, also auch Blockdefinitionen , inkl. anonyme Blöcke. Aufzurufen für Block-Table: (get-table-list "BLOCK") (defun get-table-list (tbl / lst nxt) (setq tbl (strcase tbl) lst (list (cdr (assoc 2 (tblnext tbl T)))) ) (while (setq nxt (tblnext tbl)) (setq lst (cons (cdr (assoc 2 nxt)) lst)) ) (vl-sort lst '< ) ) Und hier hast Du eine Funktion, die Dir die Entities für eine Blockdefinition mit Namen <name> liefert, wie sie von der get-table-list kommen: (defun get-blockdef-entities (name / en result space el) (setq result (list (setq en (tblobjname "BLOCK" name)))) (if en (progn (setq space (assoc 410 (entget en))) (while (and (setq en (entnext en)) (setq el (entget en)) (equal space (assoc 410 el))) (setq result (cons en result)) ) ) ) (reverse result) ) Jetzt musst Du nur noch prüfen, ob in einer Blockdef ein INSERT vorkommt (oder eine Dimension, weil diese anonyme Blöcke sind). Hier werden sie als Liste in l-blockwithinsert gesammelt: (setq l-blockwithinsert nil) (foreach blockname (get-table-list "BLOCK") (foreach en (get-blockdef-entities blockname) (if (and (= "INSERT" (cdr (assoc 0 (entget en)))) (not (member blockname l-blockwithinsert)) ) (setq l-blockwithinsert (cons blockname l-blockwithinsert)) ) ) ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jörg Mitglied selbstständig
Beiträge: 104 Registriert: 24.07.2000 Bricscad V8
|
erstellt am: 15. Aug. 2022 07:38 <-- editieren / zitieren --> Unities abgeben: Nur für Frank-WZB
|