| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Intelligenter Workflow von Köln bis Delhi mit SAP PLM - KHD Humboldt Wedag , ein Anwenderbericht
|
Autor
|
Thema: Objekthierarchie ausgeben (2797 mal gelesen)
|
AutoArch Mitglied Designer/Konstrukteur
Beiträge: 43 Registriert: 04.11.2010 XEON E5630 2,53 GHz, 12 GB, Win7 Ultimate 64Bit (SP1), NVIDIA Quadro 4000<P>AutoCAD 2014 64 Bit
|
erstellt am: 08. Nov. 2010 15:36 <-- editieren / zitieren --> Unities abgeben:
Hallo, AutoCAD-Experten, ich habe diverse Bauteile als einzelne DWGs abgelegt, die ich mir als Blöcke in meine jeweilige Hauptzeichnung ziehe. Die Blöcke sind mit Attributen versehen, um per Attext eine Stückliste erstellen zu können, die in Excel per Pivottabelle zusammengefasst und ausgewertet wird. Da aber in der Realität diese Bauteile bei ein und demselben Projekt teilweise sowohl als Einzelteile als auch schon zu Baugruppen vormontiert ausgeliefert werden, fasse ich ggf. einige Bauteile in einem übergeordneten Block zusammen. Meine Vorstellung ist jetzt: Ich möchte per Schriftfeld in einem Attribut den Namen des jeweils übergeordneten Objekts wie auch den eigenen Namen auslesen, so daß dieser bei Attext mit ausgegeben wird. Wenn dann bei Attext per BL:Level noch die Verschachtelungsebene der einzelnen Blöcke mit ausgegeben wird, könnte ich meine Stückliste im Excel anschließend hierarchisch sortieren. D.h. wenn ich ein Bauteil in eine neue Zeichnung ziehe, sollte im Attribut „Baugruppe“ z.B. „*Modell_Space“ stehen, wenn ich das selbe Bauteil z.B. in den Block „Schreibtisch“ ziehe, sollte im Attribut „Baugruppe“ der Wert „Schreibtisch“ stehen. Versucht habe ich bisher: Ins Attribut „Baugruppe“ ein Schriftfeld einfügen. Leider gibt es keine fertige Funktion, die das, was ich brauche, bereitstellt. Also habe ich mir aus der Kategorie „Blockplatzhalter“ (nur im Blockeditor verfügbar) die Funktion für den Namen rauskopiert: %<\AcObjProp.16.2 Object(?BlockRefId).EffectiveName>% Mit einer kleinen Änderung läßt sich auch wunderbar die ID des übergeordneten Blocks auslesen: %<\AcObjProp.16.2 Object(?BlockRefId).OwnerID>% Nun hatte ich gehofft, die Funktion in diesem Schriftfeld so erweitern zu können, daß mir statt der ID der Name des übergeordneten Objekts angezeigt wird z.B.: %<\AcObjProp Object(%<\AcObjProp.16.2 Object(?BlockRefId).OwnerId>%).Name>% oder vielleicht noch besser: %<\AcObjProp Object(%<\AcObjProp.16.2 Object(?BlockRefId).OwnerId>%).EffectiveName>% Das Problem: in einer Testdatei funktioniert das alles einigermaßen, solange ich sowohl die über- als auch die untergeordneten Blöcke in derselben Datei erstelle. Sobald ich diese aber per WBlock als eigene Dateien ablege und in eine neue Datei hineinziehe erscheint als Attributswert nur noch ####, da der Bezug futsch ist. AutoCAD kürzt die Funktion %<\AcObjProp Object(%<\AcObjProp.16.2 Object(?BlockRefId).OwnerId>%).Name>% zu %<\AcObjProp Object(%<\_ObjId 2102986952>%).Name>% zusammen. Auch die Abfrage der OwnerId wird auf %<\AcObjProp Object(%<\_ObjId 2103154312>%).TextString>% eingedampft. Lassen sich solche Funktionen in einem Schriftfeld nicht anständig verschachteln? Oder kann man das ganze vielleicht über ein Formel-Feld lösen? Habe leider keine wirkliche Ahnung von Lisp, Diesel oder was da so hilfreich wäre… Wenn man die Blöcke mit dem zusammgekürzten Schriftfeld sprengt, steht in der Attributsdefinition wieder die ursprüngliche, verschachtelte Funktion. Alternativ ginge auch eine Funktion, mit der ich statt des Namens des Owner-Objekts die ID der Blockdefinition meiner jeweiligen Blockreferenz auslesen kann, so daß ich hinterher in Excel den EffectiveName mit der ID der Blockdefinition abgleichen kann. Leider habe ich bisher keine Möglichkeit gefunden, die ID einer Blockdefinition auszulesen. Die Funktion %<\AcObjProp.16.2 Object(?BlockRefId).ObjectId>% liest logischerweise jeweils nur die ID der jeweiligen Blockreferenz aus. D.h. wenn ich einen Block mehrfach in meine Zeichnung einfüge, hat jede Referenz ihre eigene ID. Ich habe schon alles mögliche gegooglet und diverse Foren durchforstet, aber leider keine Lösung gefunden. Ok… ziemlich viel Text, ich hoffe Ihr steigt durch Wäre super, wenn mir jemand weiterhelfen könnte.
------------------ AutoArch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3067 Registriert: 26.08.2002 ACAD R11 - 2022 (Plant3D) AVIS ACAD LT 2013- 2021 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 08. Nov. 2010 17:12 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
AutoArch Mitglied Designer/Konstrukteur
Beiträge: 43 Registriert: 04.11.2010 XEON E5630 2,53 GHz, 12 GB, Win7 Ultimate 64Bit (SP1), NVIDIA Quadro 4000<P>AutoCAD 2014 64 Bit
|
erstellt am: 10. Nov. 2010 11:49 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, bin leider noch nicht wirklich weiter gekommen. Habe mit den Funktionen Blockdoc von Cadwiesel und der Funktion von Andreas aus diesem Beitrag experimentiert. Geht schon in die richtige Richtung, macht aber einiges doch anders als es für mich sinnvoll ist. Am einfachsten wäre es für mich, wenn ich per Schriftfeld in einem Attribut entweder
den (Effective)Name des übergeordneten Objekts oder die Objekt-ID der Blockdefinition von der meine Blockreferenz, in der das besagte Attribut enthalten ist, abgeleitet ist, anzeigen und ausgeben könnte. Die Zuordnung von ID und Namen könnte ich dann in Excel vornehmen. Allerdings scheint es, wie oben beschrieben, nicht möglich zu sein, Funktionen in Schriftfeldern dynamisch zu verschachteln. Nur die äußerste Funktion scheint dynamisch zu bleiben, die darin "eingepackten" Funktionen werden immer in statische Werte umgewandelt (s.o.), die erst wieder aufgelöst werden, wenn man den Block sprengt.
Weiß jemand von Euch, ob es eine Möglichkeit gibt, diese internen Funktionen "dynamisch" zu halten? Oder geht das, was ich versuche auf die Art einfach nicht? Wäre echt dankbar für hilfreiche Tips ------------------ AutoArch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 11. Nov. 2010 01:41 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3067 Registriert: 26.08.2002 ACAD R11 - 2022 (Plant3D) AVIS ACAD LT 2013- 2021 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 11. Nov. 2010 09:13 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 11. Nov. 2010 10:11 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
Hallo AutoArch, Zitat: bin leider noch nicht wirklich weiter gekommen. Habe mit den Funktionen Blockdoc von Cadwiesel und der Funktion von Andreas aus diesem Beitrag experimentiert. Geht schon in die richtige Richtung, macht aber einiges doch anders als es für mich sinnvoll ist.
Ja ja, Attribute aus verschachtelten Blöcken. Du brauchst hier sicher eine Funktion für beliebige Verschachtelungstiefen. Das muß ich wohl mal Updaten, ich setz mich in der Mittagspause mal dran. Kann aber sein daß ich das in der Zeit nicht ganz schaff (essen muß ich auch noch ), dann wirds erst morgen was. Ich meld mich. Ach ja, noch ne Frage: Brauchst du für jedes Objekt den kompletten Verschachtelungspfad oder nur das direkt übergeordnete Objekt ? Ich denke der komplete Pfad wäre sinnvoller. Beispiel Schloss für Schublade im Schreibtisch und auch im Rollcontainer eingebaut, würde nur Schublade als Ergebnis liefern und nicht Rollcontainer/Schublade und Schreibtisch/Schublade. Oder ? ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AutoArch Mitglied Designer/Konstrukteur
Beiträge: 43 Registriert: 04.11.2010 XEON E5630 2,53 GHz, 12 GB, Win7 Ultimate 64Bit (SP1), NVIDIA Quadro 4000<P>AutoCAD 2014 64 Bit
|
erstellt am: 11. Nov. 2010 14:08 <-- editieren / zitieren --> Unities abgeben:
Hallo, Andreas, vielen Dank schonmal im Voraus Zitat: Ach ja, noch ne Frage: Brauchst du für jedes Objekt den kompletten Verschachtelungspfad oder nur das direkt übergeordnete Objekt ? Ich denke der komplete Pfad wäre sinnvoller. Beispiel Schloss für Schublade im Schreibtisch und auch im Rollcontainer eingebaut, würde nur Schublade als Ergebnis liefern und nicht Rollcontainer/Schublade und Schreibtisch/Schublade. Oder ?
Der vollständige Pfad wäre natürlich spitze! Dann könnte man das ganze in Excel sortieren per Autogliederung zusammenfassen und nach Bedarf ein- und ausblenden. Falls das nicht geht, wäre mir auch schon mit der jeweils übergeordneten Ebene geholfen. Da müßte ich mir denn in Excel ein entsprechendes Makro basteln. Das D-Tool von Holger sieht in der Doku schon ziemlich nach dem aus, was ich suche, hab´s aber noch nicht ausprobiert. Allerdings hatte ich gehofft, das ganze mit ACAD-Bordmitteln erschlagen zu können, damit man ggf. noch selber Anpassungen vornehmen kann. Daher auch der Ansatz mit den Schriftfeldern. Sah mir nach einer praktikablen Lösung aus. Aber anscheinend die Funktionen beim Verschachteln ja nicht dynamisch. Hat das von Euch schonmal jemand probiert? Oder weiß einen Workaround? Ich hab mal eine meiner Test-Dateien zum ausprobieren angehängt, bei der die Abfrage der OwnerID funktioniert. Wenn ich anhand dieser ID jetzt noch den Namen auslesen könnte, wäre ich schon überglücklich...
------------------ AutoArch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 11. Nov. 2010 15:57 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 11. Nov. 2010 16:02 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
Aha ! Dann sollte das hier eigentlich funktionieren. Du brauchst auch keine Schriftfelder mehr die dir die Objekt-ID in ein Attribut schreiben. Probiers mal ohne, macht alles das Programm. Die Textdatei einfach in Excel einlesen, Tabstop-getrennt. Viel Spass damit und wenn was ist .... melden ! (defun c:get_natt () (defun get_att (obj_name / att_list) (if (and (vlax-property-available-p obj_name "hasattributes") (= (vla-get-hasattributes obj_name) :vlax-true) (not (minusp (vlax-safearray-get-u-bound (vlax-variant-value (vla-getattributes obj_name) ) 1 ) ) ) ) (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) ) ) ) ) ) att_list ) (defun get-block-data (block namen parent-id / data_list) (vlax-for obj block (if (= (vla-get-objectname obj) "AcDbBlockReference") (setq data_list (append (list (list (list "Objekt ID" (itoa (vla-get-objectid obj))) (list "Parent ID" parent-id) (list "Namen" (strcat namen " / " (vla-get-effectivename obj)) ) (list "Attribute" (get_att obj)) ) ) (get-block-data (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object) ) ) (vla-get-effectivename obj) ) (strcat namen " / " (vla-get-effectivename obj)) (itoa (vla-get-objectid obj)) ) data_list ) ) ) ) data_list ) (defun purge_list (liste / dummy) (while liste (setq dummy (cons (car liste) dummy)) (setq liste (vl-remove (car liste) liste)) ) (reverse dummy) ) ;;; ################################################### ;;; Blockdefinition des aktuellen Layouts holen (setq block (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)) ) ) ) ;;; Datenliste rekursiv erstellen (setq data_list (get-block-data block (getvar "ctab") (itoa (vla-get-objectid block)) ) ) ;;; Überschriftenliste erstellen (setq überschriften (append (list "Objekt ID" "Parent ID" "Namen") (setq att_list (vl-sort (purge_list (mapcar 'car (apply 'append (vl-remove nil (mapcar '(lambda (data) (cadr (assoc "Attribute" data)) ) data_list ) ) ) ) ) '< ) ) ) ) ;;; Liste mit Texte der Daten erstellen (setq txt_list (mapcar '(lambda (data) (mapcar '(lambda (txt) (if txt txt "" ) ) (append (list (cadr (assoc "Objekt ID" data)) (cadr (assoc "Parent ID" data)) (cadr (assoc "Namen" data)) ) (if (setq att_data (cadr (assoc "Attribute" data))) (mapcar '(lambda (att) (cadr (assoc att att_data))) att_list ) (list) ) ) ) ) data_list ) ) ;;; und das Ganze in eine Textdatei (setq pfad (getfiled "Daten in Datei schreiben" "Daten.txt" "" 3)) (setq datei (open pfad "w")) (foreach zeile (cons überschriften txt_list) (write-line (substr (apply 'strcat (mapcar '(lambda (txt) (strcat "\t" txt)) zeile) ) 2 ) datei ) ) (close datei) (princ) ) ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 12. Nov. 2010 06:32 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
Hallo Andreas! Bei deinem ersten Code get_natt (http://ww3.cad.de/foren/ubb/Forum54/HTML/023305.shtml#000011) funktioniert die benutzerdefinierten Objektauswahl. Nur die mehrfache Verschachtelungstiefe (die Verschachtelungstiefe kann auch mal 5 Ebenen haben) nicht. Könnte man dies im Programm noch hinbiegen. Die benutzerdefinierte Objektauswahl ist für mich genau das richtige. Lg Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 12. Nov. 2010 07:21 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 12. Nov. 2010 07:33 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 Hinweis: Meine Mitarbeit auf CAD.DE ist fakultativ, unentgeltlich und beruht nur auf einem ausgeprägtem Helfersyndrom.
|
erstellt am: 12. Nov. 2010 07:41 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 12. Nov. 2010 07:45 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 12. Nov. 2010 08:28 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
@Thomas Der Code entfernt alle mehrfachen Einträge aus der Liste daß von jedem Eitrag nur noch einer übrig bleibt. Der Name ist vielleicht etwas missverständlich (muß ich mal ändern) aber ich hatte das noch irgendwo rumliegen und habs einfach so eingebaut. Wenns besser geht ... her mit der Info. vla-get-effectivename bei Versionen vor 2006 kommt noch, ich hab ja heute auch noch ne Pause vla-get-objectid bei 64Bit kann noch dauern ich hab hier noch keine 64Bit und kenne den Unterschied noch nicht. Das hab ich aber auch nur eingebaut weil AutoArch damit wohl das machen will, ich hab die ObectID noch nie verwendet (hab mich auch noch nie damit beschäftigt ). Was macht man damit überhaupt ? Ich hab meine Objekte bis jetzt immer übers Handle identifizieren können. ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 12. Nov. 2010 12:08 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
So - damit müßte es auch für Versionen vor 2006 gehn. Wär toll wenns jemans mal ausprobiert, ich hab keine alte Version mehr hier. (defun c:get_natt () (defun get_att (obj_name / att_list) (if (and (vlax-property-available-p obj_name "hasattributes") (= (vla-get-hasattributes obj_name) :vlax-true) (not (minusp (vlax-safearray-get-u-bound (vlax-variant-value (vla-getattributes obj_name) ) 1 ) ) ) ) (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) ) ) ) ) ) att_list ) (defun get-block-data (block namen parent-id / data_list) (vlax-for obj block (if (= (vla-get-objectname obj) "AcDbBlockReference") (setq data_list (append (list (list (list "Objekt ID" (itoa (vla-get-objectid obj))) (list "Parent ID" parent-id) (list "Namen" (strcat namen " / " (get_blockname obj)) ) (list "Attribute" (get_att obj)) ) ) (get-block-data (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object) ) ) (get_blockname obj) ) (strcat namen " / " (get_blockname obj)) (itoa (vla-get-objectid obj)) ) data_list ) ) ) ) data_list ) (defun purge_list (liste / dummy) (while liste (setq dummy (cons (car liste) dummy)) (setq liste (vl-remove (car liste) liste)) ) (reverse dummy) ) (defun get_blockname (obj) (if (vlax-property-available-p obj_name "effectivename") (vla-get-effectivename obj) (vla-get-name obj) ) ) ;;; ################################################### ;;; Blockdefinition des aktuellen Layouts holen (setq block (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)) ) ) ) ;;; Datenliste rekursiv erstellen (setq data_list (get-block-data block (getvar "ctab") (itoa (vla-get-objectid block)) ) ) ;;; Überschriftenliste erstellen (setq überschriften (append (list "Objekt ID" "Parent ID" "Namen") (setq att_list (vl-sort (purge_list (mapcar 'car (apply 'append (vl-remove nil (mapcar '(lambda (data) (cadr (assoc "Attribute" data)) ) data_list ) ) ) ) ) '< ) ) ) ) ;;; Liste mit Texte der Daten erstellen (setq txt_list (mapcar '(lambda (data) (mapcar '(lambda (txt) (if txt txt "" ) ) (append (list (cadr (assoc "Objekt ID" data)) (cadr (assoc "Parent ID" data)) (cadr (assoc "Namen" data)) ) (if (setq att_data (cadr (assoc "Attribute" data))) (mapcar '(lambda (att) (cadr (assoc att att_data))) att_list ) (list) ) ) ) ) data_list ) ) ;;; und das Ganze in eine Textdatei (setq pfad (getfiled "Daten in Datei schreiben" "Daten.txt" "" 3)) (setq datei (open pfad "w")) (foreach zeile (cons überschriften txt_list) (write-line (substr (apply 'strcat (mapcar '(lambda (txt) (strcat "\t" txt)) zeile) ) 2 ) datei ) ) (close datei) (princ) ) ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 15. Nov. 2010 09:17 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 15. Nov. 2010 12:15 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 15. Nov. 2010 12:51 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 15. Nov. 2010 13:04 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 15. Nov. 2010 13:15 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 15. Nov. 2010 14:44 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
Das kommt davon wenn man Feierabend haben will (defun c:get_natt () (defun get_att (obj_name / att_list) (if (and (vlax-property-available-p obj_name "hasattributes") (= (vla-get-hasattributes obj_name) :vlax-true) (not (minusp (vlax-safearray-get-u-bound (vlax-variant-value (vla-getattributes obj_name) ) 1 ) ) ) ) (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) ) ) ) ) ) att_list ) (defun get-block-data (block namen parent-id / data_list) (vlax-for obj block (if (= (vla-get-objectname obj) "AcDbBlockReference") (setq data_list (append (list (list (list "Objekt ID" (itoa (vla-get-objectid obj))) (list "Parent ID" parent-id) (list "Namen" (strcat namen " / " (get_blockname obj)) ) (list "Attribute" (get_att obj)) ) ) (get-block-data (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object) ) ) (get_blockname obj) ) (strcat namen " / " (get_blockname obj)) (itoa (vla-get-objectid obj)) ) data_list ) ) ) ) data_list ) (defun purge_list (liste / dummy) (while liste (setq dummy (cons (car liste) dummy)) (setq liste (vl-remove (car liste) liste)) ) (reverse dummy) ) (defun get_blockname (obj) (if (vlax-property-available-p obj "effectivename") (vla-get-effectivename obj) (vla-get-name obj) ) ) ;;; ################################################### (vl-load-com) ;;; Blockdefinition des aktuellen Layouts holen (setq block (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object)) ) ) ) ;;; Datenliste rekursiv erstellen (setq data_list (get-block-data block (getvar "ctab") (itoa (vla-get-objectid block)) ) ) ;;; Überschriftenliste erstellen (setq überschriften (append (list "Objekt ID" "Parent ID" "Namen") (setq att_list (vl-sort (purge_list (mapcar 'car (apply 'append (vl-remove nil (mapcar '(lambda (data) (cadr (assoc "Attribute" data)) ) data_list ) ) ) ) ) '< ) ) ) ) ;;; Liste mit Texte der Daten erstellen (setq txt_list (mapcar '(lambda (data) (mapcar '(lambda (txt) (if txt txt "" ) ) (append (list (cadr (assoc "Objekt ID" data)) (cadr (assoc "Parent ID" data)) (cadr (assoc "Namen" data)) ) (if (setq att_data (cadr (assoc "Attribute" data))) (mapcar '(lambda (att) (cadr (assoc att att_data))) att_list ) (list) ) ) ) ) data_list ) ) ;;; und das Ganze in eine Textdatei (if (setq pfad (getfiled "Daten in Datei schreiben" "Daten.txt" "" 3)) (progn (setq datei (open pfad "w")) (foreach zeile (cons überschriften txt_list) (write-line (substr (apply 'strcat (mapcar '(lambda (txt) (strcat "\t" txt)) zeile) ) 2 ) datei ) ) (close datei) ) ) (princ) ) ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 15. Nov. 2010 15:27 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
Hallo Andreas! Jetzt funktioniert es super. Nur beim Import in Exel werden die Blocknamen "(Model / Wohnwand / Oberschrank / Tür)" alle in 1 Spalte geschrieben. Besser wäre doch pro Name eine Spalte. Ich bin kein Profi in Exel. Vielleicht hab ich auch beim Import was falsch gemacht--nur was?? lg Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadwomen Ehrenmitglied V.I.P. h.c. Mädchen für fast alles
Beiträge: 3067 Registriert: 26.08.2002 ACAD R11 - 2022 (Plant3D) AVIS ACAD LT 2013- 2021 ZWCAD 2015 Versuch "nun ja" [s]History P3D 2012/(13) SP und Hotfix([/s]<P> Windows 10 / 64 Bit Xeon CPU 3.5GHz 16GB Ram NVIDIA Quadro P2000 3x Dell TV100 88P Monitore
|
erstellt am: 15. Nov. 2010 15:56 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 15. Nov. 2010 15:59 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
Nee, du hast nichts falsch gemacht. Das ist ja die Struktur wie der entsprechende Block verschachtelt ist. Ich hätte nicht gedacht daß das "aufgedröselt" sein soll. Kann man machen, aber heut nicht mehr Ich glaub ich mach das "schaltbar", sonst kommt einer und wills anders ------------------ Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 15. Nov. 2010 16:00 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
MARTINLE Mitglied Tischler
Beiträge: 485 Registriert: 18.10.2007 AUTOCAD 2016, MS Windows7, 64-bit
|
erstellt am: 15. Nov. 2010 16:02 <-- editieren / zitieren --> Unities abgeben: Nur für AutoArch
|
AutoArch Mitglied Designer/Konstrukteur
Beiträge: 43 Registriert: 04.11.2010 XEON E5630 2,53 GHz, 12 GB, Win7 Ultimate 64Bit (SP1), NVIDIA Quadro 4000<P>AutoCAD 2014 64 Bit
|
erstellt am: 18. Nov. 2010 14:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, Andreas, bin ja echt begeistert Das Programm funktioniert echt gut! Allerdings hat Martin schon Recht, wenn der Blockname und der Block-Pfad in getrennten Feldern ausgegeben würden wär´s noch praktischer - und eine Objektauswahl wär natürlich auch toll. Was mir noch aufgefallen ist: Bei einer Test-DWG wurden auch Blöcke mit ausgegeben, die nicht über Attribute verfügten (in diesem Fall Tasten von Computertastaturen - also ziemlich viele...). Ich hatte angenommen, das würde durch die Abfrage Zitat: (if (and (vlax-property-available-p obj_name "hasattributes") (= (vla-get-hasattributes obj_name) :vlax-true)
ausgeschlossen - oder hab ich das falsch interpretiert (Kenn mich mit LISP nicht wirklich aus)? Natürlich kann ich leere Datensätze später in Excel noch ausfiltern, aber wenn man über "hasattributes" verhindern könnten, daß solche Attribut-losen Blöcke überhaupt ausgegeben werden, würde das eine Menge Zeilen in der Extrakt-Datei und Rechneleistung in Excel sparen. Und dabei fällt mir ein: Ist es möglich im Blockpfad auch nur die Blöcke auszugeben, die ebenfalls Attribute besitzen? D.h. wenn jemand einen Block als feste Baugruppe erstellt hat und diesem Block ein Attribut zugewiesen hat (z.B. Attribut "Typ", Wert "Baugruppe") würde dies im Block-Pfad mit auftauchen. Wenn aber jemand Objekte nur zu Gruppierungszwecken als Block (OHNE Attribute) zusammengefasst hat, sollte dieser Block in der Ausgabe der Objekthierarchie nicht auftauchen, da es diese Baugruppe in der Realität gar nicht körperlich zusammenhängend existiert. Ich hoffe mal, das war jetzt nicht zu verwirrend - wär wirklich super, wenn das technisch machbar wäre. Auf jeden Fall schonmal vielen Dank bis hierher, hat schon echt weitergeholfen!
Danke auch nochmal an Holger - Das Ergebnis mit dem eingefügten Blocksymbol in der Tabelle ist natürlich auch schnieke! Muß mal ausprobieren, ob das auch mit 3D-Blöcken funktioniert. Freundliche Grüße, vielen Dank und frohes Schaffen!
------------------ AutoArch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |