|  |  | 
|  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | 
|  |  | 
|  | Exklusives EDU-Programm für RTX PRO Blackwell, eine Pressemitteilung 
 | 
| Autor | Thema:  Dynamischer Block ändert Namen? (1686 mal gelesen) | 
 | udouk Mitglied
 
 
  
 
      Beiträge: 13Registriert: 26.08.2009
 Win XP SP3ACAD 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: 13533Registriert: 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: 22689Registriert: 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 machst2. 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: 13Registriert: 26.08.2009
 Win XP SP3ACAD 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? MFGUdo
 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP | 
                        | cadffm Moderator
 良い精神
 
         
 
  
 
      Beiträge: 22689Registriert: 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: 13533Registriert: 30.11.2003
 . |    erstellt am: 25. Okt. 2012 10:47  <-- editieren / zitieren -->    Unities abgeben:           Nur für udouk   | 
                        | udouk Mitglied
 
 
  
 
      Beiträge: 13Registriert: 26.08.2009
 Win XP SP3ACAD 2007
 |    erstellt am: 25. Okt. 2012 11:14  <-- editieren / zitieren -->    Unities abgeben:            
  SUPER - Danke!! @ThomasAlso, 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!
 MFGUdo
 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP | 
                        | CADmium Moderator
 Maschinenbaukonstrukteur
 
         
 
  
 
      Beiträge: 13533Registriert: 30.11.2003
 . |    erstellt am: 25. Okt. 2012 11:25  <-- editieren / zitieren -->    Unities abgeben:           Nur für udouk   | 
                       
| 
  
 |  | 
 | udouk Mitglied
 
 
  
 
      Beiträge: 13Registriert: 26.08.2009
 Win XP SP3ACAD 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!!! MFGUdo
 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |