| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| CIDEON Whitepaper: Konfigurationsprozess - durchgängig und zukunftsweisend, ein Whitepaper |
Autor
|
Thema: hierarchische Anordnung der Block-Attribute beim Export (1451 mal gelesen)
|
kakoin Mitglied
Beiträge: 10 Registriert: 04.08.2009
|
erstellt am: 04. Aug. 2009 14:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, folgendes Problem hat sich aus unserer Büropraxis ergeben - zum besseren Verständnis angehängt ein Beispiel als PDF: Eine Baugruppe besteht aus verschiedenen Bauteilen. - Baugruppe ist definiert als Block mit den Attributen "Baugruppenbezeichnung" (Outer Mast Type 2) und "Positionsnummer" (Pos. 001 bzw. 002). - die Baugruppen bestehen aus teilweise gleichen Bauteilen (der obere Teil beider Positonen besteht aus lediglich 3 unterschiedlichen Blechen, der untere Teil ist unterschiedlich). - alle gleichen Bauteile bestehen aus dem selben Block (um Veränderungen, bspw. Blechdicken über alle Positionen hinweg anpassen zu können). Das Problem: lese ich die Attribute mit Hilfe von EATTEXT aus, habe ich keine Möglichkeit die Attribute der "eingelagerten" (nested) Blocks (Bauteile) den beiden "haupt" Blöcken (Baugruppen) zuzuordnen - quasi eine hierarchische Anordnung der Attribute. Eine nachträgliche Zuordnung in Excel scheidet bei komplexeren Zeichnungen aus. Welche Möglichkeiten gibt es den Export wie vorgesehen vorzunehmen? Ggf Scripte, externe Programme - alles ist willkommen! So ungewöhnlich dürfte das Problem nicht sein - gefunden in den Weiten des Netzes habe ich zu diesem Thema nichts. Wie wird das Problem gelöst werden? Dank Euch schon mal für die Hilfe, Gruß kakoin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 04. Aug. 2009 15:45 <-- editieren / zitieren --> Unities abgeben: Nur für kakoin
Hallo kakoin, blos daß ichs richtig verstanden hab: 1. Eine Baugruppe ist ein Block mit Attributen 2. Eine Baugruppe besteht aus Bauteilen 3. Ein Bauteil ist auch ein Block mit Attributen Du möchtest eine Liste die Informationen (Blockname, Attribute) über die Baugruppe und deren Bauteile enthält. Daß das mit EATEXT nicht geht hast du schon bemerkt. Mit Lisp machbar . Sind denn alle Infos in Attributen oder muß z.B. der Blockname auch erfasst werden ? Gib mal ne Info, ich glaub da hätt ich Spass dabei ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kakoin Mitglied
Beiträge: 10 Registriert: 04.08.2009
|
erstellt am: 04. Aug. 2009 16:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, jop - stimmt so. Alle wesentlichen Infos wären als Attribute hinterlegt, der Blockname könnte aber optional erfasst werden (ist aber nicht zwingend notwendig). Jedes Element in ACAD hat doch eine eindeutige Nummer, vielleicht kann die Zuordnung darüber geschen? Danke vorab! (wenn ich noch irgendwie helfen kann...?) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 05. Aug. 2009 17:53 <-- editieren / zitieren --> Unities abgeben: Nur für kakoin
Hallo kakoin, probier mal diese Lisp. Bei mir gehts, bei dir hoffentlich auch. Erzeugt eine Textdatei die du dann im Excel einlesen kannst. (defun c:get_natt (/ satz ent_name att_list) (defun get_attlist (ent_name / obj_name att_list) (setq obj_name (vlax-ename->vla-object ent_name)) (if (and (vlax-property-available-p obj_name "hasattributes") (= (vla-get-hasattributes obj_name) :vlax-true) ) (progn (setq att_list (mapcar '(lambda (obj) (list (vla-get-tagstring obj) (vla-get-textstring obj) ) ) (vlax-safearray->list (vlax-variant-value (vla-getattributes (vlax-ename->vla-object ent_name)) ) ) ) ) (setq att_bez_list (append att_bez_list (mapcar 'car att_list)) ) ) ) att_list ) (defun get_nested_att (ent_name / ent_data b_att_list) (setq ent_data (entget ent_name)) (setq blk_bez (cdr (assoc 2 ent_data))) (setq blk_data (tblsearch "BLOCK" blk_bez)) (setq e_name (cdr (assoc -2 blk_data))) (while e_name (setq e_data (entget e_name)) (if (= (cdr (assoc 0 e_data)) "INSERT") (setq b_att_list (cons (get_attlist e_name) b_att_list)) ) (setq e_name (entnext e_name)) ) (reverse b_att_list) ) (defun purge_list (liste / dummy_list ent) (setq dummy_list (list)) (foreach ent liste (if (not (member ent dummy_list)) (setq dummy_list (cons ent dummy_list)) ) ) (reverse dummy_list) ) (if (setq satz (ssget)) (progn (setq att_bez_list (list "Objektreferenz")) (setq n (1- (sslength satz))) (repeat (sslength satz) (setq ent_name (ssname satz n)) (setq ent_data (entget ent_name)) (setq att_list (append att_list (append (list (cons (list "Objektreferenz" (cdr (assoc 5 ent_data)) ) (get_attlist ent_name) ) ) (get_nested_att ent_name) ) (list 'nil) ) ) ) (setq n (1- n)) ) ) (setq att_bez_list (purge_list att_bez_list)) (setq pfad (getfiled (getvar "dwgprefix") "sichern" "txt" 3)) (setq datei (open pfad "w")) (write-line (apply 'strcat (mapcar '(lambda (att_bez) (strcat att_bez (chr 9))) att_bez_list ) ) datei ) (foreach txt (mapcar '(lambda (data) (print data) (if data (progn (apply 'strcat (mapcar '(lambda (att_bez) (if (assoc att_bez data) (strcat (nth 1 (assoc att_bez data)) (chr 9) ) (chr 9) ) ) att_bez_list ) ) ) "" ) ) att_list ) (write-line txt datei) ) (close datei) (princ) ) ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kakoin Mitglied
Beiträge: 10 Registriert: 04.08.2009
|
erstellt am: 06. Aug. 2009 11:21 <-- editieren / zitieren --> Unities abgeben:
Super - Vielen Dank! leider bekomme ich bei sowohl bei ACAD 2007 und bei ACAD 2010 eine Fehlermeldung. Den Code habe ich in eine txt Datei kopiert, als ANSI gespeichert und "BlockAttribute.lsp" benannt. Nach Einbinden in Autocad und Ausführen mit dem Befehl GET_NATT und Anwählen des Schatelblocks wird folgende Fehlermeldung angezeigt: ACAD2007 (english): Select objects: ; error: ActiveX Server returned an error: Invalid index ACAD2010 (deutsch): Objekte wählen: ; Fehler: no function definition: VLAX-ENAME->VLA-OBJECT VLA bedeutet vermutlich "visual lisp application"? Hängts in mit der .dll zusammen?
Habe nach (defun c:get_natt (/ satz ent_name att_list) zum Aufrufen von vla folgende Zeilen eingefügt: (vl-load-com) (setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object) ) ;_ end of vla-get-activedocument *modelspace* (vla-get-ModelSpace *thisdrawing*) ) ;_ end of setq leider ergebinslos. Kannst du mir auf Grund meiner Beschreibung weiterhelfen? Gruß und Danke! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 06. Aug. 2009 12:18 <-- editieren / zitieren --> Unities abgeben: Nur für kakoin
Hm ... also (vl-load-com) ist gut, das vergess ich immer wieder gern aber warum VLAX-ENAME->VLA-OBJECT unbekannt ist will mir nicht in den Kopf Kennt sich damit jemand aus ? Ich kann den Fehler bei mir leider nicht nachvollziehen, hab hier nur 2009 und bei mir läufts. ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kakoin Mitglied
Beiträge: 10 Registriert: 04.08.2009
|
erstellt am: 06. Aug. 2009 12:57 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, Habs jetzt auch mit ACAD2009 probiert - mit gleichem negativen Ergebnis. Zur Kontrolle, dass wir mit der gleichen Basis testen, anbei beide Dateien - die *.dwg mit den Schachtelblöcken und Attributen und deine *.lsp Datei, zusätzlich mit (vl-load-com). Wie immer wahrscheinlich nur eine Kleinigkeit.... bin gespannt was die Lösung ist! Gruß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dorfy Mitglied Double-Dipl.-Ing. Bleistiftanspitzer
Beiträge: 900 Registriert: 21.07.2006 AutoCad2007, ProE, HiCad
|
erstellt am: 06. Aug. 2009 14:53 <-- editieren / zitieren --> Unities abgeben: Nur für kakoin
hi, @Andreas läuft aber ich werf mal (vla-GetConstantAttributes Block) in die Runde und noch (vl-catch-all... (Andreas weiß sicher bescheid ) ------------------ Mfg Heiko Elefantenjagd in Afrika "... LISP-Programmierer bauen einen Irrgarten aus Klammern und hoffen, dass sich der Elefant darin verirrt..." (www.uni-leipzig.de/~rotheh/elefant.htm) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 06. Aug. 2009 16:50 <-- editieren / zitieren --> Unities abgeben: Nur für kakoin
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 10. Aug. 2009 10:42 <-- editieren / zitieren --> Unities abgeben: Nur für kakoin
So - jetzt müsts laufen. Geht sicher noch etwas eleganter als mit den If-Abfragen aber ich möcht erst mal ne Rückmeldung obs läuft. (defun c:get_natt (/ satz ent_name att_list) (vl-load-com) (defun get_attlist (ent_name / obj_name att_list) (setq obj_name (vlax-ename->vla-object ent_name)) (if (and (vlax-property-available-p obj_name "hasattributes") (= (vla-get-hasattributes obj_name) :vlax-true) ) (progn (if (and (>= (vlax-safearray-get-l-bound (vlax-variant-value (vla-getattributes obj_name) ) 1 ) 0 ) (>= (vlax-safearray-get-u-bound (vlax-variant-value (vla-getattributes obj_name) ) 1 ) 0 ) ) (setq att_list (mapcar '(lambda (obj) (list (vla-get-tagstring obj) (vla-get-textstring obj) ) ) (vlax-safearray->list (vlax-variant-value (vla-getattributes obj_name) ) ) ) ) ) (if (and (>= (vlax-safearray-get-l-bound (vlax-variant-value (vla-GetConstantAttributes obj_name) ) 1 ) 0 ) (>= (vlax-safearray-get-u-bound (vlax-variant-value (vla-GetConstantAttributes obj_name) ) 1 ) 0 ) ) (setq att_list (append att_list (mapcar '(lambda (obj) (list (vla-get-tagstring obj) (vla-get-textstring obj) ) ) (vlax-safearray->list (vlax-variant-value (vla-GetConstantAttributes obj_name) ) ) ) ) ) ) (setq att_bez_list (append att_bez_list (mapcar 'car att_list)) ) ) ) att_list ) (defun get_nested_att (ent_name / ent_data b_att_list) (setq ent_data (entget ent_name)) (setq blk_bez (cdr (assoc 2 ent_data))) (setq blk_data (tblsearch "BLOCK" blk_bez)) (setq e_name (cdr (assoc -2 blk_data))) (while e_name (setq e_data (entget e_name)) (if (= (cdr (assoc 0 e_data)) "INSERT") (setq b_att_list (cons (get_attlist e_name) b_att_list)) ) (setq e_name (entnext e_name)) ) (reverse b_att_list) ) (defun purge_list (liste / dummy_list ent) (setq dummy_list (list)) (foreach ent liste (if (not (member ent dummy_list)) (setq dummy_list (cons ent dummy_list)) ) ) (reverse dummy_list) ) (if (setq satz (ssget)) (progn (setq att_bez_list (list "Objektreferenz")) (setq n (1- (sslength satz))) (repeat (sslength satz) (setq ent_name (ssname satz n)) (setq ent_data (entget ent_name)) (setq att_list (append att_list (append (list (cons (list "Objektreferenz" (cdr (assoc 5 ent_data)) ) (get_attlist ent_name) ) ) (get_nested_att ent_name) ) (list 'nil) ) ) ) (setq n (1- n)) ) ) (setq att_bez_list (purge_list att_bez_list)) (setq pfad (getfiled (getvar "dwgprefix") "sichern" "txt" 3)) (setq datei (open pfad "w")) (write-line (apply 'strcat (mapcar '(lambda (att_bez) (strcat att_bez (chr 9))) att_bez_list ) ) datei ) (foreach txt (mapcar '(lambda (data) (print data) (if data (progn (apply 'strcat (mapcar '(lambda (att_bez) (if (assoc att_bez data) (strcat (nth 1 (assoc att_bez data)) (chr 9) ) (chr 9) ) ) att_bez_list ) ) ) "" ) ) att_list ) (write-line txt datei) ) (close datei) (princ) ) ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kakoin Mitglied
Beiträge: 10 Registriert: 04.08.2009
|
erstellt am: 10. Aug. 2009 11:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, die Blockattribute können herausgeschrieben werden - klappt sehr gut! Aber: beim Auswählen mehrerer, unterschiedlicher Blöcke werden nur die Attribute eines Blocks herausgeschrieben - dafür aber mehrfach. Beipiel dwg Datei von weiter oben (nicht irritieren lassen - die Spalten stimmen): Objektreferenz DESCRIPTION FINISHING POS THIKNESS VOLUMEN MATERIAL 16A Outer Mast Type 2 hot dip galvanized and coated POS. 001 10 30 S355 10 28 S355 10 28 S355 10 21 S355 10 21 S355 10 26 S355 16A Outer Mast Type 2 hot dip galvanized and coated POS. 001 10 30 S355 10 28 S355 10 28 S355 10 21 S355 10 21 S355 10 26 S355 Gruß - und tausend Dank!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1451 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 10. Aug. 2009 12:10 <-- editieren / zitieren --> Unities abgeben: Nur für kakoin
Mann binn ich dabbisch den Zähler an die falsche Stelle gesetzt. (defun c:get_natt (/ satz ent_name att_list) (vl-load-com) (defun get_attlist (ent_name / obj_name att_list) (setq obj_name (vlax-ename->vla-object ent_name)) (if (and (vlax-property-available-p obj_name "hasattributes") (= (vla-get-hasattributes obj_name) :vlax-true) ) (progn (if (and (>= (vlax-safearray-get-l-bound (vlax-variant-value (vla-getattributes obj_name) ) 1 ) 0 ) (>= (vlax-safearray-get-u-bound (vlax-variant-value (vla-getattributes obj_name) ) 1 ) 0 ) ) (setq att_list (mapcar '(lambda (obj) (list (vla-get-tagstring obj) (vla-get-textstring obj) ) ) (vlax-safearray->list (vlax-variant-value (vla-getattributes obj_name) ) ) ) ) ) (if (and (>= (vlax-safearray-get-l-bound (vlax-variant-value (vla-GetConstantAttributes obj_name) ) 1 ) 0 ) (>= (vlax-safearray-get-u-bound (vlax-variant-value (vla-GetConstantAttributes obj_name) ) 1 ) 0 ) ) (setq att_list (append att_list (mapcar '(lambda (obj) (list (vla-get-tagstring obj) (vla-get-textstring obj) ) ) (vlax-safearray->list (vlax-variant-value (vla-GetConstantAttributes obj_name) ) ) ) ) ) ) (setq att_bez_list (append att_bez_list (mapcar 'car att_list)) ) ) ) (print att_list) att_list ) (defun get_nested_att (ent_name / ent_data b_att_list) (setq ent_data (entget ent_name)) (setq blk_bez (cdr (assoc 2 ent_data))) (setq blk_data (tblsearch "BLOCK" blk_bez)) (setq e_name (cdr (assoc -2 blk_data))) (while e_name (setq e_data (entget e_name)) (if (= (cdr (assoc 0 e_data)) "INSERT") (setq b_att_list (cons (get_attlist e_name) b_att_list)) ) (setq e_name (entnext e_name)) ) (reverse b_att_list) ) (defun purge_list (liste / dummy_list ent) (setq dummy_list (list)) (foreach ent liste (if (not (member ent dummy_list)) (setq dummy_list (cons ent dummy_list)) ) ) (reverse dummy_list) ) (if (setq satz (ssget)) (progn (setq att_bez_list (list "Objektreferenz")) (setq n (1- (sslength satz))) (repeat (sslength satz) (setq ent_name (ssname satz n)) (setq ent_data (entget ent_name)) (setq att_list (append att_list (append (list (cons (list "Objektreferenz" (cdr (assoc 5 ent_data)) ) (get_attlist ent_name) ) ) (get_nested_att ent_name) ) (list 'nil) ) ) (setq n (1- n)) ) ) ) (setq att_bez_list (purge_list att_bez_list)) (setq pfad (getfiled (getvar "dwgprefix") "sichern" "txt" 3)) (setq datei (open pfad "w")) (write-line (apply 'strcat (mapcar '(lambda (att_bez) (strcat att_bez (chr 9))) att_bez_list ) ) datei ) (foreach txt (mapcar '(lambda (data) (print data) (if data (progn (apply 'strcat (mapcar '(lambda (att_bez) (if (assoc att_bez data) (strcat (nth 1 (assoc att_bez data)) (chr 9) ) (chr 9) ) ) att_bez_list ) ) ) "" ) ) att_list ) (write-line txt datei) ) (close datei) (princ) ) ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kakoin Mitglied
Beiträge: 10 Registriert: 04.08.2009
|
erstellt am: 10. Aug. 2009 13:13 <-- editieren / zitieren --> Unities abgeben:
|