| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Blockattribute in Multi-Führungslinie ausgeben (3295 mal gelesen)
|
Andyt8 Mitglied Planungstechniker, Systemadministrator
Beiträge: 195 Registriert: 13.06.2003
|
erstellt am: 17. Jun. 2013 14:46 <-- editieren / zitieren --> Unities abgeben:
Hallo, Wir haben ein älteres AutoLisp Script, das Attribute von Blöcken auslesen und damit eine Schnellführung erstellen kann. Dies ist als Dateianhang inkludiert. Nun möchten wir auf die Multi-Führung umstellen - hat diese doch einige Vorteile. Der neue Befehl ist "_mleader" und das Skript wurde entsprechend angepasst. Jedoch bei Blöcke mit mehreren Attributen gibt es Probleme. Das erste Attribut wird für die Multi-Führung verwendet, jedoch alle weiteren werden nach Abschluss der Multi-Führung zur Kommandozeile gesendet und da natürlich als nicht vorhandener Befehl erkannt. Ich weiß ungefähr an was es liegt - aber nicht wie ich das lösen könnte. Kann jemand weiterhelfen?
Ich hatte schon mal versucht, dass Ganze komplett neu zu schreiben, da der Code wohl auch schon etwas älter ist - aber da bin ich leider noch früher gescheitert...
------------------ Unmögliche Vielfalt mit unmöglich vielen Variationen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 17. Jun. 2013 16:27 <-- editieren / zitieren --> Unities abgeben: Nur für Andyt8
Hello... Hab mir deinen Code nicht angschaut, weil mir dort einfach zu viele Kommentare drinnen sind Habe mit Multileadern wenig erfahrung, hab jetzt mal schnell was zusammengebaut... das einfügen des Textes ohne Commands
Wenn ich dich richtig verstanden habe... Folgendes schreibt eine Liste von String's, in deinem Fall die gänze der attribute mehrzeilig in einen Multileader...
Code:
(defun C:My_mleader (/) (command "_mleader" (getpoint "\nP1") (getpoint "\nP2") "") ( (lambda (ent txt-list / txt) (while txt-list (setq txt (cons "\n" (cons (car txt-list) txt))) (setq txt-list (cdr txt-list)) ) (setq txt (apply 'strcat (reverse (cdr txt)))) (entmod (subst (cons 304 txt) (assoc 304 ent) ent ) ) ) (entget (entlast)) '("1te Zeile" "2te Zeile") ;hier ist die Liste von Strings ) (princ) )
Sollte klar sein dass du das noch ergänzen musst, ja? lg reltro
[Diese Nachricht wurde von reltro am 17. Jun. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andyt8 Mitglied Planungstechniker, Systemadministrator
Beiträge: 195 Registriert: 13.06.2003
|
erstellt am: 18. Jun. 2013 06:44 <-- editieren / zitieren --> Unities abgeben:
Danke für die Antwort - ich habe mittlerweile eine eigene Lösung gefunden. Ist zwar noch nicht komplett fertig - funktioniert reibungslos bei Versuchen mit Blöcken wo 1 bis 3 Attribute vorhanden waren. Jetzt muss es nur mehr formell überarbeitet werden. PS.: ja, die Kommentare sind auch mir zu viel. Bei der Überarbeitung werde ich diese bereinigen.
------------------ Unmögliche Vielfalt mit unmöglich vielen Variationen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 18. Jun. 2013 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für Andyt8
Hey hey... Zeig mal her... Aber Warum auf 1 2 3 Attribute beschränken? nun kommt es darauf an, ob du selbst basteln willst oder es auch ausreicht eine Lösung zu bekommen. Bin ja stark für basteln, desshalb hab ichs schnell mal zusammengebaut... Will dich aber nicht vom selberbasteln abhalten; außer du willst abgehalten werden (m)eine Lösung steht bereit, sag bescheid... lg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andyt8 Mitglied Planungstechniker, Systemadministrator
Beiträge: 195 Registriert: 13.06.2003
|
erstellt am: 18. Jun. 2013 16:06 <-- editieren / zitieren --> Unities abgeben:
Es ist nicht auf 1,2,3 Attribute beschränkt. Wir brauchen das Skript nur nicht für mehr Attribute. Wir nutzen dies für unsere dynamische Schrauben-/Normteilbibliothek. Diese haben Attribute wie DIN, Bezeichnung, Werkstoff und Länge enthalten. Das wird nach dem einfügen und anpassen einfach mit der Führungslinie beschriftet... Also eigentlich ist es nicht nur irgendeine "Lösung" - so denke ich mal. Es ging primär darum, das bereits vorhandene Skript zu überarbeiten. Im Kern (bzw. das was ich gegenüber dem posl.lsp Skript vom ersten Beitrag geändert habe) sieht es nun wie folgt aus:
Code:
(progn (setq old_al (reverse old_al)) (setq p2 (getpoint p1 "\nNach Punkt :")) (command "_mleader" p1 p2) (while old_al (setq tx (car old_al)) (setq txco (strcat txco "\n" tx)) ; put all attributs to one variabel (setq old_al (cdr old_al)) ) (setq txco (substr txco 2)) ; remove unnecessary signs (command txco) ; post all attributs as one string )
Das gesamte Skript wird mit dem nächsten Neustart der Computer im FOB Menu 7.2 for AutoCAD 2014 bei uns intern ausgerollt. Da wird es dann weiter getestet. Ein Teil der Arbeitsplätze läuft bereits auf AutoCAD 2014. Bis jetzt lief es in der Testumgebung aber sehr gut. Ich hatte es sogar bei einem Block probiert, der 10 Attribute hatte - und auch das wurde korrekt als Multi-Führungslinie ausgegeben. ------------------ Unmögliche Vielfalt mit unmöglich vielen Variationen [Diese Nachricht wurde von Andyt8 am 18. Jun. 2013 editiert.] [Diese Nachricht wurde von Andyt8 am 19. Jun. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 18. Jun. 2013 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für Andyt8
Anscheind tut es was es soll... Hier noch meine (überflüssiggewordene ) Variante bzw. eben der Kern... Code:
(defun C:My_mleader (/ GetAtt att BlockRef Blockref-p mleader) (vl-load-com) (setq GetAtt (lambda (obj / obj) (if (= (type obj) 'ename) (setq obj (vlax-ename->vla-object obj)) ) (if (= (vla-get-ObjectName obj) "AcDbBlockReference") (if (= :vlax-true (vla-get-hasattributes obj)) (mapcar '(lambda (AttObj / ) (list AttObj (cons (vla-get-TagString AttObj) (vla-get-TextString AttObj) ) ) ) (vlax-invoke obj 'GetAttributes) ) 'nil ) 'nil ) ) ) (cond ( (and (setq Blockref-p (= (cdr (assoc 0 (entget (setq BlockRef (car (entsel "\nBlock wählen")))))) "INSERT")) (setq att (mapcar 'cdadr (GetAtt BlockRef))) ) (command "_mleader" (getpoint "\nP1") (getpoint "\nP2") "") (setq mleader (entlast)) ( (lambda (ent txt-list / txt) (while txt-list (setq txt (cons "\n" (cons (car txt-list) txt))) (setq txt-list (cdr txt-list)) ) (setq txt (apply 'strcat (reverse (cdr txt)))) (entmod (subst (cons 304 txt) (assoc 304 ent) ent ) ) ) (entget mleader) att ) ) (Blockref-p (princ "\n*** Block enthält keine Attribute ***")) ('T (princ "\n*** gewähltes Objekt ist kein Block ***")) ) (princ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andyt8 Mitglied Planungstechniker, Systemadministrator
Beiträge: 195 Registriert: 13.06.2003
|
erstellt am: 19. Jun. 2013 07:40 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich wollte den Code von dir ausprobieren und mal vergleichen, aber das Skript tut nicht was es soll(te). Zumindest bei mir kann das Skript nicht ausgeführt werden. Es kommt schon beim Laden "; Fehler: Fehlerhafter Argumenttyp: stringp nil" ------------------ Unmögliche Vielfalt mit unmöglich vielen Variationen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
reltro Mitglied student
Beiträge: 125 Registriert: 08.11.2009 Acad 2012 - VBA,Lisp Revit 2012 3dsMax 2012 Rhino 5 - GH,Pyhton 3,rhino.Common<P>Win 7 - i7 4x3.2GHz - 8Gb DDR3
|
erstellt am: 19. Jun. 2013 09:28 <-- editieren / zitieren --> Unities abgeben: Nur für Andyt8
Hey Kann ich beim besten Willen nicht nachvollziehen... Beim laden darf es keine schwierigkeiten geben, weil dabei gar nichts ausgeführt wird außer die Definition der Funktion. Die Funktion ist in sich komplett lokal, also dürfte es auch keinerlei Probleme geben wenn bereits irgendwelche variablen gesetzt waren. Demnach schließe ich darauf, dass du entweder etwas verwendest das keine vl-befehle kennt... Mit was arbeitest du denn? oooder du hast vergessen was zu kopieren oder hast zu viel kopiert... Hab das ganze nochmals überprüft und keinen Fehler gefunden. Getestet auf acad 2012 und 2014... rennt...
Hab was kleines ausgebessert: wenn kein Objekt gewählt wurde führte es vorher zu einem Fehler, beseitigt...
Code:
(defun C:My_mleader (/ GetAtt att BlockRef Blockref-p mleader) (vl-load-com) (setq GetAtt (lambda (obj / obj) (if (= (type obj) 'ename) (setq obj (vlax-ename->vla-object obj)) ) (if (= (vla-get-ObjectName obj) "AcDbBlockReference") (if (= :vlax-true (vla-get-hasattributes obj)) (mapcar '(lambda (AttObj / ) (list AttObj (cons (vla-get-TagString AttObj) (vla-get-TextString AttObj) ) ) ) (vlax-invoke obj 'GetAttributes) ) 'nil ) 'nil ) ) ) (setq BlockRef (car (entsel "\nBlock wählen"))) (cond ((null BlockRef) (princ "\n*** Kein Objekt gewählt ***")) ( (and (setq Blockref-p (= (cdr (assoc 0 (entget BlockRef))) "INSERT")) (setq att (mapcar 'cdadr (GetAtt BlockRef))) ) (command "_mleader" (getpoint "\nP1") (getpoint "\nP2") "") (setq mleader (entlast)) ( (lambda (ent txt-list / txt) (while txt-list (setq txt (cons "\n" (cons (car txt-list) txt))) (setq txt-list (cdr txt-list)) ) (setq txt (apply 'strcat (reverse (cdr txt)))) (entmod (subst (cons 304 txt) (assoc 304 ent) ent ) ) ) (entget mleader) att ) ) (Blockref-p (princ "\n*** Block enthält keine Attribute ***")) ('T (princ "\n*** gewähltes Objekt ist kein Block ***")) ) (princ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |