Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Dynamischer Block ändert Namen?

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:  Dynamischer Block ändert Namen? (1310 mal gelesen)
udouk
Mitglied



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

Beiträge: 13
Registriert: 26.08.2009

Win XP SP3
ACAD 2007

erstellt am: 24. Okt. 2012 14:22    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 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




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: 24. Okt. 2012 14: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 udouk 10 Unities + Antwort hilfreich

...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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 24. Okt. 2012 14:37    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 udouk 10 Unities + Antwort hilfreich

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



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

Beiträge: 13
Registriert: 26.08.2009

Win XP SP3
ACAD 2007

erstellt am: 25. Okt. 2012 10:19    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

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
良い精神




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

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 25. Okt. 2012 10:44    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 udouk 10 Unities + Antwort hilfreich

Ä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




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: 25. Okt. 2012 10:47    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 udouk 10 Unities + Antwort hilfreich

Nicht einfach Copy-Paste !!!!!
Nachdenken !
Analysieren!
Verstehen!

lass das ssset bei meiner Funktion weg und gib SSET2 zurück

.... also

(sssetfirst SSET2 SSET2) durch SSET2 ersetzen


.. so macht das alles keinen Spaß 

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

udouk
Mitglied



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

Beiträge: 13
Registriert: 26.08.2009

Win XP SP3
ACAD 2007

erstellt am: 25. Okt. 2012 11:14    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

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




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: 25. Okt. 2012 11: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 Nur für udouk 10 Unities + Antwort hilfreich

War auch nicht bös gemeint .... und mit den Kommentaren: Ich erstelle die Codes eigentlich für mich, da gibts maximal Funktionsheader ... wenn es "schulungsgerecht" sein soll , würde ne Menge Mehraufwand drinstecken .. sorry

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

udouk
Mitglied



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

Beiträge: 13
Registriert: 26.08.2009

Win XP SP3
ACAD 2007

erstellt am: 25. Okt. 2012 11:47    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

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

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