| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Dynamischer Block ändert Namen? (1367 mal gelesen)
|
udouk Mitglied
Beiträge: 13 Registriert: 26.08.2009 Win XP SP3 ACAD 2007
|
erstellt am: 24. Okt. 2012 14:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Cad-DE ler. Ich hab da ein Problem mit Dynamischen Blöcken. Ich hab eine LISP geschrieben (mehr zusammenkopiert), die unter anderem einen Block mit bestimmten Namen sucht und dann Attributswerte aus diesem Block ausliest und weiterverarbeitet (in meinem Fall für die Dateinamenerstellung beim DXF-Export) Code: (defun c:IMADXFBATCHNEU () (init) (command "_pasteclip" "0,0,0") (setq ORDNER (strcat "C:\\Users\\" (getvar "LOGINNAME") "\\Favorites\\")) (setq Blockwahl (ssget "_X" '((0 . "INSERT")(2 . "Nummerierung_1zu10")))) (if (= Blockwahl nil) (progn (setq DATEI (strcat ORDNER "0-000")) ) (progn (setq Block (entget (ssname Blockwahl 0))) (setq DATEINAME (strcat (ATTRIB-GIBWERT Block "POS" 1) "-" (ATTRIB-GIBWERT Block "LAUFENDENUMMER" 1))) (setq DATEI (strcat ORDNER DATEINAME)) ) ) (setq Name (getfiled "DXF speichern unter" DATEI "dxf" 1)) (setq ORDNER (strcat (vl-filename-directory Name) "\\")) (setq DATEI Name) (command "dxfout" DATEI "V" "R12" "") (command "_erase" "_all" "" "_-purge" "al" "*" "n") (reinit) (prompt DATEI) (princ) ) (defun ATTRIB-GIBWERT ( blk attrib flag / blk-typ next attname wert) (if (and blk attrib flag) (while (/= blk-typ "SEQEND") (setq blk (entget (entnext (cdr (assoc -1 blk)))) blk-typ (cdr (assoc 0 blk))) (if (/= blk-typ "SEQEND") (if (= (cdr (assoc 2 blk)) (strcase attrib)) (setq wert (cdr (assoc flag blk))) );if );if );while );(if blk attrib flag wert );defun
(defun init () (setq err *error* *error* Fehler osx (getvar "osmode") fil (getvar "filedia") ) ) (defun reinit () (setvar "Osmode" osx) (setvar "filedia" fil) (setq *error* err) (princ) ) (defun Fehler (s) (print (strcat "Fehler: " s)) (command) (command) (command) (Reinit) )
Das läuft nun schon einige Zeit PRIMA. Nun hat ein Kollege in den Block "Nummerierung_1zu10" eine dynamische Funktion eingefügt. Schaltet man nun irgend etwas an dem Block, findet man ihn nicht mehr unter dem Namen - (heist nun "*u...") Gibt es eine möglichst einfache Möglichkeit nach einem Block zu suchen, der ein bestimmtes Attribut enthält? Komme leider nicht selber drauf. Besten Dank im Vorraus an alle Udo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 24. Okt. 2012 14:30 <-- editieren / zitieren --> Unities abgeben: Nur für udouk
...bei Referenzen von Dynamischen Blöcken nicht nach Blocknamen suchen, sondern nach deren Effektivnamen .. dazu die vla-Funktionen nutzen, da es über Normalo-Lisp nicht direkt implementiert und der Zugriff etwas tricki ist .... Mal etwas Bsp-Code für C&P (defun BLOCKSELECT ( NAMEFILTER / BLOCK LISTE SSET SSET2 ITEM VLAITEM INDEX) (vl-load-com) (or(=(type NAMEFILTER)'STR)(setq NAMEFILTER "*")) (vlax-for BLOCK (vla-get-blocks(vla-get-activedocument(vlax-get-acad-object))) (if(and(=(vla-get-isxref BLOCK):vlax-false) (=(vla-get-islayout BLOCK):vlax-false) (wcmatch (strcase (vla-get-name BLOCK))(strcase NAMEFILTER)) ) (setq LISTE (cons (strcase(vla-get-name BLOCK)) LISTE)) ) ) (if(and LISTE (setq SSET (ssget "_X" (list '(0 . "INSERT") (cons 410 (getvar"CTAB")) ) ) ) ) (progn (setq SSET2(ssadd)) (setq INDEX -1) (repeat(sslength SSET) (setq ITEM(ssname SSET (setq INDEX(1+ Index)))) (setq VLAITEM(vlax-ename->vla-object ITEM)) (if(and(or(and(vlax-property-available-p VLAITEM "EFFECTIVENAME") (setq NAME(vla-get-effectivename VLAITEM)) ) (setq NAME(vla-get-Name VLAITEM)) ) (setq NAME(strcase NAME)) (member NAME LISTE) ) (ssadd ITEM SSET2) ) ) (sssetfirst SSET2 SSET2) ) ) ) ------------------ Also ich finde Unities gut ... --------------------------------------- - 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 |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 24. Okt. 2012 14:37 <-- editieren / zitieren --> Unities abgeben: Nur für udouk
Hallo Udo, 1. Glückwunsch das du erst jetzt (Lisp)Erfahrung mit dynamischenBlöcken machst 2. Suche mal nach EFFECTIVENAME , hier ein toller Link dazu: Klick! 3. Für die letzte Frage gibt es nur eine einzige Möglichkeit: Man muß die ganze Datei durchlaufen, alle Attribute von allen Inserts nach dem gesuchten Namen überprüfen. ------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
udouk Mitglied
Beiträge: 13 Registriert: 26.08.2009 Win XP SP3 ACAD 2007
|
erstellt am: 25. Okt. 2012 10:19 <-- editieren / zitieren --> Unities abgeben:
Euch Beiden für die Antworten erstmal besten Dank!! Der Vorschlag mir der "BLOCKSELECT"-Funktion ist sehr gut. Es hat zwar einige Zeit gedauer, bis ich die Auswahl weiterverarbeiten konnte aber nun läuft es. Nun frage ich mich halt, ob das so, wie ich es gemacht habe richtig und sinnig ist? Code: (BLOCKSELECT "Nummerierung_1zu10") (setq Blockwahl (ssget "_P" '((0 . "INSERT"))))
Oder kann man das eventuell auch einfacher lösen? MFG Udo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 25. Okt. 2012 10:44 <-- editieren / zitieren --> Unities abgeben: Nur für udouk
Ändere die letzten Zeilen des Programmes wie folgt ab: Code: .. (sssetfirst SSET2 SSET2) ; dieses Zeile wahlweise auskommentieren, sie dient nur dem markieren und aktuellesetzen des Auswahlsatzes am Bildschirm SSET2 ) ) )
Und dann verwendest du es so: (setq Blockwahl (BLOCKSELECT "Nummerierung_1zu10"))
------------------ CAD.de System-Angaben - CAD on demand - User:FAQ(Acad) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 25. Okt. 2012 10:47 <-- editieren / zitieren --> Unities abgeben: Nur für udouk
|
udouk Mitglied
Beiträge: 13 Registriert: 26.08.2009 Win XP SP3 ACAD 2007
|
erstellt am: 25. Okt. 2012 11:14 <-- editieren / zitieren --> Unities abgeben:
SUPER - Danke!! @Thomas Also, mein Verständnis von LISP ist leider etwas eingeschränkt. Benutze es meistens um Plinien mit bestimmten Eigenschaften zu erstellen oder zu ändern - dafür reichte es bislang aus - glaube ich. Nun möchte ich mich aber gerne etwas tiefer in LISP einarbeiten, da man halt immer mehr will. Die Seite von MAPCAR ist zur Zeit meine Abendlektüre . Das mit C&P ist halt einfach um eine schnelle Lösung zu finden. Du könntest, wenn Du eventuell mal etwas Zeit hast, Deinen Code mit einigen Kommentaren versehen, um das Analysieren für den "kleinen Lispler" etwas zu erleichtern, denn so ist der Code an einigen Stellen für mich nicht zu verstehen - SORRY, ist halt so! MFG Udo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 25. Okt. 2012 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für udouk
|
udouk Mitglied
Beiträge: 13 Registriert: 26.08.2009 Win XP SP3 ACAD 2007
|
erstellt am: 25. Okt. 2012 11:47 <-- editieren / zitieren --> Unities abgeben:
Kein Problem, muß ich halt noch mal einige Zeit über dem CODE brüten (interessiert mich ja selber, was da passiert) - wenn ich die Zeit mal habe ! Ihr macht hier auch so schon eine UNGLAUBLICH GUTE ARBEIT !!! Also BESTEN DANK NOCHMAL für die wirklich schnellen und auch guten Antworten!!! MFG Udo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |