| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Zugriff auf Text innerhalb von Blöcken (2021 mal gelesen)
|
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 07. Dez. 2016 21:48 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich komme hier nicht weiter bzw. steh auf dem Schlauch. Ich möchte alle Texte einer DWG in eine XML Schreiben mit Objekt_id um beim Import wieder die Texte dem jeweiligem Objekt zu zuweisen. Also mit Textobjekten hab ich es schon hinbekommen, nur mit den Text in Blöcken weiß ich nicht, wie ich das machen soll. Vielleicht weiß jemand den richtigen bzw. einen anderen Weg um eine XML für ein Übersetzungsbüro zu erstellen und dann diese je nach Wunsch nach der Sprache in die DWG zu laden. Code:
(vl-load-com)(defun textauslesen_XML ( _O ) (setq TXTLIST nil TEXT nil ) (setq TXTLIST(mapcar 'cdr (vl-remove-if-not'(lambda(X) (member (car X) '( 1 3))) _O ))) (setq TEXT (apply 'strcat TXTLIST)) ) (defun c:Textexport_XML ( / AUSWAHL excelFILE FILE INDEX Inhalt) (if (and (setq FILE (getfiled "TEXT-Export" "" "XML" 1 )) (setq excelFILE (strcat "\"" FILE "\"" )) (setq AUSWAHL (ssget '((0 . "*TEXT,*LEADER" )))) ;(ssget "_x" '((0 . "*TEXT")))) ) (progn (setq INDEX -1) (repeat (sslength AUSWAHL ) (setq _O (entget (ssname AUSWAHL (setq INDEX (1+ INDEX ))))) ;Text auslesen (setq TEXT nil) (setq TEXT (textauslesen_XML _O)) ;Text auslesen ende (setq _ID (cdr (assoc 5 _O ))); ID auslesen ;text (if (= Inhalt nil ) (setq Inhalt (strcat "<ROW>\n<OBJECT_ID>"_ID "</OBJECT_ID>\n<TEXT>" TEXT "</TEXT>\n</ROW>\n" )) (setq Inhalt (strcat Inhalt "<ROW>\n<OBJECT_ID>"_ID "</OBJECT_ID>\n<TEXT>" TEXT "</TEXT>\n</ROW>\n" )) ) ) (setq Inhalt (strcat "<?xml version='1.0' encoding = 'UTF-8' ?>\n<DATA>\n" Inhalt "</DATA>" )) (vk_WriteTextStream_XML Inhalt FILE "UTF-8" ) ) ) (command "shell" excelFILE ) ) (defun c:Textimport_XML ( / AUSWAHL FILE INDEX) (if (and (setq FILE (getfiled "TEXT-Import" (getvar "dwgprefix") "XML" 8 )) (setq Inhalt (vk_ReadTextStream_XML FILE "UTF-8" )) ) (progn (setq AUSWAHL (ssget "_X" '((0 . "*TEXT,*LEADER" )))) (setq INDEX -1) (repeat (sslength AUSWAHL ) (setq _O (entget (ssname AUSWAHL (setq INDEX (1+ INDEX ))))) (setq OBJ (vlax-ename->vla-object (ssname AUSWAHL INDEX ))) (setq _ID (cdr (assoc 5 _O ))) (if (vl-string-search _ID Inhalt ) (progn (setq position1 (+ (vl-string-search _ID Inhalt ) (strlen _ID ) 20 )) (setq position2 (+ (vl-string-search "</TEXT>" Inhalt position1 ) 1 )) (setq _TXTi(substr inhalt position1 (- position2 position1 ))) ;(setq _TXTi (strcat "GEÄNDERT " _TXTi )) (princ _TXTi ) (vla-put-textstring OBJ _TXTi ) ) ) ) ) (alert "Kein Text gefunden" ) ) ) (defun vk_WriteTextStream_XML (Stream FileName Charset / ADODBStreamObj Result) (if (setq ADODBStreamObj (vlax-create-object "ADODB.Stream")) (progn (setq Result (vl-catch-all-apply (function (lambda () (vlax-put ADODBStreamObj "Charset" Charset) (vlax-invoke ADODBStreamObj "Open") (vlax-invoke-method ADODBStreamObj "WriteText" Stream 0) (vlax-invoke ADODBStreamObj "SaveToFile" FileName 2) ) ) ) ) (vlax-release-object ADODBStreamObj) (if (not (vl-catch-all-error-p Result)) FileName ) ) ) ) (defun vk_ReadTextStream_XML (FileName Charset / ADODBStreamObj Result) (if (and (setq FileName (findfile FileName)) (setq ADODBStreamObj (vlax-create-object "ADODB.Stream")) ) (progn (setq Result (vl-catch-all-apply (function (lambda () (vlax-put ADODBStreamObj "Charset" Charset) (vlax-invoke ADODBStreamObj "Open") (vlax-invoke ADODBStreamObj "LoadFromFile" FileName) (vlax-invoke-method ADODBStreamObj "ReadText" -1) ) ) ) ) (vlax-release-object ADODBStreamObj) (if (not (vl-catch-all-error-p Result)) Result ) ) ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Vino Mitglied
Beiträge: 207 Registriert: 24.05.2005 Windows 10 BricsCAD V20-22
|
erstellt am: 08. Dez. 2016 06:46 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Hallo, Zu deiner Frage... Texte in verwendeten Blöcken bekommst du so: Code: (setq countr 0 blist '()) (if (setq olist (ssget "_X" '((0 . "INSERT")))) (repeat (sslength olist) (setq elem (ssname olist countr)) (setq elem1 (tblobjname "BLOCK" (cdr (assoc 2 (entget elem))))) (if (not (member elem1 blist)) (progn (setq blist (cons elem1 blist)) (while (not (= (cdr (assoc 0 (entget elem1))) "ENDBLK")) (if (= (cdr (assoc 1 (entget elem1))) "TEXT") (progn ;elem1 ist dein Text... Mach was damit! ) ) (setq elem1 (entnext elem1)) ) ) ) (setq countr (+ countr 1)) ) )
Aber generell stellst du dir das ganze vielleicht etwas leichter vor, als es ist... Was ist mit Mtexten? Mit Attributen? Textüberschreibungen in Bemaßungen? Das alles vielleicht noch in Blöcken verschachtelt? Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 08. Dez. 2016 07:57 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Hallo Ikarus, hier nochmal eine vla-Variante, fast wie die Lösung von Stefan. Es werden alle Blockdefinitionen in der Zeichnung durchlaufen (auch Modellbereich und Layouts), wenn dort Texte (=(vla-get-Objectname Item)"AcDbText") gefunden werden wird für die Rückgabeliste der Blockname, das vla-Text-Objekt und der Textwert zurückgegeben. Wie die Laufzeit bei riesigen Zeichnungen ist weiß ich nicht, ich habe das nur in einer überschaubaren Zeichnung mal getestet: Code:
(defun c:test ( / RETLIST) (vlax-for BlocksItem (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)) ) (vlax-for Item BlocksItem (if(=(vla-get-Objectname Item)"AcDbText") (setq RetList (cons (list (vla-get-name BlocksItem) Item (vla-get-TextString Item)) RetList)))) ) RetList)
------------------ viele Grüße Jörn http://www.bosse-engineering.com Liniensignaturen Youtube Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 08. Dez. 2016 08:46 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
|
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 08. Dez. 2016 08:51 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
|
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 08. Dez. 2016 09:27 <-- editieren / zitieren --> Unities abgeben:
Danke für eure schnelle Antwort. Ich schaue mir das mal genauer an, wenn ich das so überfliege, dann müsste ich in die XML einen TAG für inBLOCK und inDOKUMENT sowie einen TAG für vonMTEXT, vonTEXT, vonATTRIBUT und vonBEMUEBERSCHREIBUNG setzten. Bin ich mit dem Gedankengang auf dem richtigen Weg? Gruß Jürgen [Diese Nachricht wurde von -ikarus- am 08. Dez. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 08. Dez. 2016 09:52 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Die Grundidee deiner Lösung ist schon merkwürdig, aber egal, zumindest verwundert mich die Lösung jedes Objekt(pro Zeichnung) einzeln zu übersetzen und dies nicht allgemeingültiger zu gestalten. Neue Objekte werden nicht übersetzt, andere Dateien auch nicht. Für sowas gibt es professionelle Lösungen. Aber bleiben wir dabei, dann: Deine Importfunktion ist generell der falsche Weg, denn wenn du ein Handle hast, dann kannst du das Objekt DIREKT ansprechen. Dein Weg über Auswahlsatz und vergleichen von Handle auf vorhanden sein in einer Liste ist kannst du in die Tonne hauen. Von der Konstruktion her: (defun SchreibTextwert (Handle Wert / Obj) WertXY in Objekt mit HandleZ schreiben ) (handent HANDLE) => ENAME und vom ENAME zum Vla-Objekt kannst du ja bereits. Mit der nötigen Fehlerkontrolle sollte der Großteil mit vla-put-TextString in das Objekt geschrieben werden können. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 08. Dez. 2016 10:04 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Jo, Jörn, sorry hab nicht richtig hingeschaut @-ikarus- Dein Code brücksichtigt erstmal gar keine Blockdefinitionen. Um diese auch zu bearbeiten, musst du eine Schleife durch die Blocktabelle gehen und da die Blöcke durchgehen um nach Texten innerhalb der Definitionen zu suchen. Dann kannst du die CAD-Handles mit den Werten in eine xml oder Excel oder Textdatei schreiben lassen. Der Weg zurück nach CAD ist denn das Gleiche - nur Rückwärts Ich habe das Gleiche schon einmal gemacht, auch für Textübersetzungen, allerdings wird nach Excel geschrieben ------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 08. Dez. 2016 11:04 <-- editieren / zitieren --> Unities abgeben:
Hallo, das Übersetzungsbüro arbeitet mit SDL Trados und möchte die Texte wenn es machbar ist, im XML Format. Mir persönlich sagt das Programm nichts. Villeicht gibt es ja auch einen einfacheren weg als der von mir angedachte. Vielen dank für eure Antworten. Die warden mich schonmal weiterbringen. Gruß Jürgen 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: 2966 Registriert: 26.08.2002 ACAD R11 - 2018.1.2 (Plant3D) AVIS ACAD LT 2013- 2020 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. Dez. 2016 11:22 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Zitat: Original erstellt von -ikarus-: ... das Übersetzungsbüro arbeitet mit SDL Trados und möchte die Texte wenn es machbar ist, im XML Format. Mir persönlich sagt das Programm nichts.....
Hallo Ikarus deshalb gilt eigentlich immer sich erst mal mit Quelle und Ziel vertraut zu machen. Ebenso eine genaue Beschreibung was das Ziel ist ( okay vergesse ich auch immer wieder , aber wollt es gesagt haben ) löst vieles schon von vornherein cu cw ------------------ Also ich finde Unities gut ... und andere sicher auch ------------------------------------------------ cadwomen™ Plant ist wie Öl suchen, je tiefer man bohrt desto mehr kommt ans Tageslicht [Diese Nachricht wurde von cadwomen am 08. Dez. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 12. Dez. 2016 14:04 <-- editieren / zitieren --> Unities abgeben:
Hallo, hab da wieder eine Fragen, wenn ich die Objecte im Modelspace und Paperspace durchgehe und den Text mit (vla-put-TextString Item Wert_ ) setzte dann wird dieser geändert, nur in den Blöcken passiert nichts. Kann mir jemand vielleicht sagen was ich falsch mache?
Code:
(defun Block*Text_Import ( Handle_ Wert_ / RETLIST) ; Alle Text in den Blöcken (vlax-for BlocksItem (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object) ) ) (vlax-for Item BlocksItem (if (= (vla-get-Handle Item) Handle_ ) ;vla-HandleToObject (vla-put-TextString Item Wert_ ) (princ) ) ) ) )
Danke Gruß Jürgen [Diese Nachricht wurde von -ikarus- am 12. Dez. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 12. Dez. 2016 14:08 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
|
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 12. Dez. 2016 14:11 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 12. Dez. 2016 14:15 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
|
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 12. Dez. 2016 14:17 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 12. Dez. 2016 14:27 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Zitat: Original erstellt von -ikarus-: ...ich hänge die Datei mal an...
Ohne jetzt intensiv geschaut zu haben: Der Codeausschnitt weiter oben prüft, ob die Handle gleich einer gegebenen Hanlde ist und setzt dann den Textstring. Bist du dir sicher, dass die Handle stimmt und diese einem Textelement zugeordnet ist? Kommt das Programm an diese stelle beim Debuggen überhaupt an? Dass die Blöcke bei dir nicht aktualisiert werden hängt aus meiner Sicht mit den Daten zusammen -- das müsstest du prüfen. Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 12. Dez. 2016 15:00 <-- editieren / zitieren --> Unities abgeben:
|
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 13. Dez. 2016 06:29 <-- editieren / zitieren --> Unities abgeben:
Hallo, hab jetzt gefunden woran es lag. Code: (vla-put-TextString Item Wert_ )
zu Code: (progn (vla-put-TextString Item Wert_ ) Wert_)
geändert und es geht. Zitat: Original erstellt von -ikarus-:
Code:
(defun Block*Text_Import ( Handle_ Wert_ / RETLIST) ; Alle Text in den Blöcken (vlax-for BlocksItem (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object) ) ) (vlax-for Item BlocksItem (if (= (vla-get-Handle Item) Handle_ ) ;vla-HandleToObject (vla-put-TextString Item Wert_ ) (princ) ) ) ) )
Jetzt hab ich noch ein Problem mit *Paberspace es werden nur die Objekte auf dem zuletzt aktiven Layout geändert, wo ran könnte das liegen? Danke für die gute Hilfe. Gruß Jürgen
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1968 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 13. Dez. 2016 09:05 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Das ist sicher nur Augescheinlich wahr. Der Codeschnipsel geht alle Blockcontainer (Modelspace, alle Layouts und alle sonstigen Blockdefinitionen) der Zeichnung durch. Ich vermute den Fehler eher in den CAD-Handles. Diese sind wahrscheinlich nicht richtig. Code: (vlax-for BlocksItem (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object) ) ) (prin1 BlocksItem)(terpri) (vlax-for Item BlocksItem (prin1 item)(terpri) ) )
------------------ Gruß CADwiesel Besucht uns im CHAT
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 13. Dez. 2016 09:17 <-- editieren / zitieren --> Unities abgeben:
|
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 13. Dez. 2016 09:55 <-- editieren / zitieren --> Unities abgeben: Nur für -ikarus-
Du solltest dich meiner Antwort 08. Dez. 2016 09:52 (doch) noch einmal annehmen, alles löschen und bei Null anfangen. Lisp 1. Aufbau/Struktur "langsam" erarbeiten damit es auch verstanden wird. Forum 2. Das Querbeet zwischen Posting, Postingcode und Code aus dem Anhang ist nicht so schön. Da behält man schwer den Überblick und vor allem: Da hat kaum jemand Lust den Überblick zu behalten(!) Deine Lösung zu dem einen Problem passt nicht zu deinen Codes, es ist sicher nicht "die Lösung". Zu deiner letzten Frage: Das liegt daran das Autodesk mit dem "Paperspace" den (letzten)aktiven Layoutbereich verknüpft. In anderem Codeteil werden aber alle Objekte bearbeitet - wie Wiesel schon sagte. Du hast da einfach etwas kopiert, was nicht zu deiner Aufgabe passt. Mit einem Beispiel verdeutlicht sieht dein Ablauf so aus: Alle entsprechenden Einträge aus dem Modell werden in deine Exportliste geschrieben, Alle entsprechenden Einträge aus dem (zuletzt) aktiven Layoutbereich werden in deine Liste geschrieben. Alle entsprechenden Einträge aus der Blocktabelle werden in deine Liste geschrieben. Die DWG hat zwei Layouts, in beiden + Modell sind drei Texte enthalten: Code: ("aus c:Model*Text" "*Model_Space" "70" #<VLA-OBJECT IAcadText 000000002dbd7068> "1A6" "MeinModelltext3") ("aus c:Model*Text" "*Model_Space" "70" #<VLA-OBJECT IAcadText 000000002dbd7d88> "1A5" "MeinModelltext2") ("aus c:Model*Text" "*Model_Space" "70" #<VLA-OBJECT IAcadText 000000002ddaf2b8> "15E" "MeinModelltext1") ("aus c:Paper*Text" "*Paper_Space" "174" #<VLA-OBJECT IAcadText 000000002dbd7158> "1BA" "MeinLayout2text1") ("aus c:Paper*Text" "*Paper_Space" "174" #<VLA-OBJECT IAcadText 000000002dbd6f78> "1B9" "MeinLayout2text2") ("aus c:Paper*Text" "*Paper_Space" "174" #<VLA-OBJECT IAcadText 000000002ddae4a8> "17C" "MeinLayout2text3") ("aus c:Block*Text" "*Paper_Space5" "6C" #<VLA-OBJECT IAcadText 000000002dbd5ad8> "1B1" "MeinLayout1text3") ("aus c:Block*Text" "*Paper_Space5" "6C" #<VLA-OBJECT IAcadText 000000002dbd6258> "1B0" "MeinLayout1text2") ("aus c:Block*Text" "*Paper_Space5" "6C" #<VLA-OBJECT IAcadText 000000002ddb1a18> "151" "MeinLayout1text1") ("aus c:Block*Text" "*Paper_Space" "174" #<VLA-OBJECT IAcadText 000000002dbd7158> "1BA" "MeinLayout2text1") ("aus c:Block*Text" "*Paper_Space" "174" #<VLA-OBJECT IAcadText 000000002dbd6f78> "1B9" "MeinLayout2text2") ("aus c:Block*Text" "*Paper_Space" "174" #<VLA-OBJECT IAcadText 000000002ddae4a8> "17C" "MeinLayout2text3") ("aus c:Block*Text" "*Model_Space" "70" #<VLA-OBJECT IAcadText 000000002dbd7068> "1A6" "MeinModelltext3") ("aus c:Block*Text" "*Model_Space" "70" #<VLA-OBJECT IAcadText 000000002dbd7d88> "1A5" "MeinModelltext2") ("aus c:Block*Text" "*Model_Space" "70" #<VLA-OBJECT IAcadText 000000002ddaf2b8> "15E" "MeinModelltext1")
>> Wofür speicherst du so viel Information, wenn diese nicht berücksichtigt wird beim Import? << Das sieht schon schlimm aus, da sind 15 Einträge erstellt worden, es wird aber noch schlimmer bei deiner Import-Variante: Für die NEUN Textobjekte in der Zeichnung, zu denen du 15 Datensätze exportiert hast (also 6 Stück doppelt), wird der Handle-Vergleich 375x durchgeführt, obwohl es nur um 9 Objekte geht. Also: Zurück auf Null und die Textausgab "Modellbereich / Layoutbereich XX Objekte" spare ich mir mal. c:Model*Text uninteressant, löschen c:Paper*Text uninteressant, löschen c:Block*Text scheint ja alles zu berücksichtigen, behalten. C:Textimport_XML komplett umkrempeln, dabei kann man gleich Model*Text_Import löschen Paper*Text_Import löschen Block*Text_Import löschen Und jetzt mein Vorschlag von vor ein paar Tagen: Durchlaufe die importliste und spreche die Objekte DIREKT an. Code: (defun C:Textimport_XML ( / HANDLE_ WERT_ OBJ) ; Importieren
; Alles nötige um die Importliste zu durchlaufen ; Durchlauf der Liste ; INNERHALB foreach, mapcar,repeat, while oder wie auch immer man es umsetzt ; nun HANDLE_ und WERT_ definieren (eigentlich unnötig dies an eine Variable zu hängen, dient aber deiner Übersicht) ; setq handle_ wert_ .. ; ---- schnipp ---- ; Hier der Part um das Objekt zu ermitteln und den Wert zu schreiben: (if (and ; Ist Acad das Handle in dieser Datei aktuell bekannt? (handent HANDLE_) ; VLA-Object ermitteln, falls das Objekt aktuell existiert / könnte ja gelöscht worden sein (setq OBJ (vlax-ename->vla-object (handent HANDLE_))) ; Hat das aktuelle Objekt mit dem Handle überhaupt eine Eigenschaft "Textstring"? (vlax-property-available-p OBJ 'Textstring) ) ; Wenn alles zutrifft, dann mach! (if (vl-catch-all-error-p (vl-catch-all-apply ; Diese Konstruktion kann Fehler abfangen, das Programm läuft also auch im Fehlerfall weiter 'vla-put-Textstring (list OBJ WERT_) ; Wert zuweisen ) ) ; Wenn es zu einem Fehler kam (princ(strcat "\nProblem bei Handle '" HANDLE_ "' - Gesperrte Layer? Oder kein Objekt mit Textstring Eigenschaft?")) ) ; Wenn nicht alle Bedingungen von IF erfüllt wurden (princ(strcat "\nObjekte mit Handle '" HANDLE_ "' nicht verfügbar")) ) ; ---- schnapp ---- ; SchleifenGedöns )
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
-ikarus- Mitglied Zeichner
Beiträge: 142 Registriert: 12.02.2007 ACAD 2015,PSP 2011, Showcase 2015, Mudbox 2015 Indesign CC, Illustrator CC, Photoshop CC, After Effects CC, Premiere Pro CC, Edge Animate CC, Acrobat DC Pro mit PitStop Pro, Visual Studio 2013 Notepad++ Rechner: HP Z620 Workstation NVIDIA Quadro K4000
|
erstellt am: 13. Dez. 2016 10:29 <-- editieren / zitieren --> Unities abgeben:
|