| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: ENTMOD - Blockdefinition (3085 mal gelesen)
|
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 13. Mai. 2003 20:21 <-- editieren / zitieren --> Unities abgeben:
Hi Ich möchte zu einem 'Symbol Tabel Entity' XDATA mit ENTMOD hinzufügen. Bei 'normalen' Zeichnungelementen habe ich mit XDATA keine Probleme, aber bei dem 'Symbol Tabel Entity' funzt das ganze nicht. Dieses Entity kann ich überhaupt nicht mit ENTMOD ändern (ergibt immer 'nil). (laut Online-Hilfe solls aber gehen) hier nur mal ein Beispiel (ohne XDATA): (setq ename (tblobjname "BLOCK" "myblock")) -> <Objektname: 400b4da0> (setq dxflist (entget (ename))) -> ((-1 . <Objektname: 400b4da0> ) (0 . "BLOCK") (330 . <Objektname: 400b4d98> ) (5 . "C74") (100 . "AcDbEntity") (67 . 0) (8 . "0") (62 . 2) (100 . "AcDbBlockBegin") (70 . 0) (10 0.0 0.0 0.0) (-2 . <Objektname: 400b4db0> ) (2 . "myblock") (1 . "")) (entmod dxflist) -> nil Bei dem Beispiel werden keine Werte geändert. ENTMOD müßte aber trotzdem was zurückgeben ?!? Warum läßt sich dieses Entity nicht ändern ? Wie kann ich diesem Entity XDATA aufdrängen ? (geht das überhaupt ?) Ich probiere schon seit Stunden herum. Ihr seid meine letzte hoffnung... Grüße Andi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADwiesel Moderator CAD4FM UG
Beiträge: 1989 Registriert: 05.09.2000 AutoCAD, Bricscad Wir machen das Mögliche unmöglich
|
erstellt am: 14. Mai. 2003 08:34 <-- editieren / zitieren --> Unities abgeben: Nur für andi2050
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 14. Mai. 2003 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für andi2050
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 14. Mai. 2003 10:10 <-- editieren / zitieren --> Unities abgeben: Nur für andi2050
Code:
(setq oBlock(vlax-ename->vla-object(tblobjname "BLOCK" "test"))) (setq ar1 (vlax-make-safearray vlax-vbInteger '(0 . 3))) (vlax-safearray-fill ar1 '(1001 1000 1070 1040)) (setq ar2 (vlax-make-safearray vlax-vbVariant '(0 . 3))) (vlax-safearray-fill ar2 '("myApp" "myString" 777 333.333 ))(vla-setXdata oBlock ar1 ar2) ; => nil (entget(tblobjname"block""test")'("*")) ; => ((-1 . <Objektname: 4007de68> ) (0 . "BLOCK") ; (330 . <Objektname: 4007de60> ) (5 . "9DC2F45") ; (100 . "AcDbEntity") (67 . 0) (8 . "0") ; (100 . "AcDbBlockBegin") (70 . 0) (10 0.0 0.0 0.0) ; (-2 . <Objektname: 4007de70> ) (2 . "test") (1 . "") ; (-3 ("myApp" (1000 . "myString") (1070 . 777) ; (1040 . 333.333)))) (vla-getXdata oBlock "myApp" 'v1 'v2)
(vlax-safearray->list v1) ; => (1001 1000 1070 1040) (vlax-safearray->list v2) ; => (#<variant 8 myApp> #<variant 8 myString> ; #<variant 2 777> #<variant 5 333,333> )
Mit ActiveX geht's also. ABER: Ich kann keinen GC 1002 verwenden, da kommt sofort eine Fehlermeldung. Ohne Gruppierung mit (1002 . "{") und (1002 . "}") kann man das Ganze aber wohl in die Tonne treten... Nachtrag: Geht doch! Mein AutoCAD war wohl schon instabil.... Bei mir raucht Acad übrigens ab, wenn ich vla-setXData und vla-getXdata direkt hintereinander aufrufe. Gruss, Axel ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... [Diese Nachricht wurde von mapcar am 14. Mai 2003 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 14. Mai. 2003 19:35 <-- editieren / zitieren --> Unities abgeben:
Erstmal Danke für Eure Antworten ! Schade, daß es nicht so ohne Probleme geht. Muß ich halt mein Programm zum 3.Mal umstellen... (nerv ! ) @mapcar Danke für Deine Bemühungen, aber das ganze ist mir etwas zu unsicher. Hab in meinem Programm vorher mit LDATA gearbeitet. Es sah anfangs auch ganz gut aus und war recht einfach zu handhaben. Leider zeigte sich beim Testen, daß ACAD ständig abkackte ! -> LDATA + Grafik-Entitys = Müll ! Brauche jetzt eine stabile Lösung, sonst werde ich nie fertig ! Der XDATA-Satz soll auf jeden Fall irgendwo in der Blockdefinition enthalten sein. Da der BLOCK durch mein LISP erstellt wird, 'male' ich mir einfach als erstes ENTITY einen Punkt, an den ich dann XDATA anhänge. Dauert zwar etwas länger die Daten zu erhalten, ist aber glaub ich stabil. Den Punkt kann ich ja über GC60 unsichtbar machen, dann stört er nicht. Grüße Andi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andi2050 Mitglied
Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 16. Mai. 2003 23:36 <-- editieren / zitieren --> Unities abgeben:
Falls es jemanden interessiert... XDATA läßt sich problemlos mir ENTMOD auf das BLOCKRECORD-Entity draufklatschen. (GC 330 von TBLOJNAME "BLOCK"...) Design-Center haut da auch seine XDATA drauf. Könnte vielleicht Speicherplatzprobleme geben, aber 'a bisserl wos geht oiwei'. Grüße Andi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 27. Dez. 2019 18:39 <-- editieren / zitieren --> Unities abgeben: Nur für andi2050
Hallo! Wie ist es möglich mittels Lisp eine Blockdefinition derart zu ändern, daß man entweder ein Objekt hinzufügt bzw. eines löscht. Z. B. wenn der Block als Kreis mit div. Attributen definiert ist soll ein zweiter Kreis hinzugefügt werden oder wenn ein Block bereits mit 2 Kreisen definiert ist soll einer gelöscht werden. Unten geht es z. B. um den Block "500". Wie man sieht folgen auf den "CIRCLE" die Attribute. Deren gibt es mehrere - ich habe hier nurs eines hereinkopiert. Wie kann ich einen weiteren CIRCLE hinzufügen. Geht das z. B. über entmake??. Schön wär's, wenn es eine Lösung mit herkömlichen (alten?) lisp-Befehlen gibt. Mit den vl-Befehlen (Visual-Lisp) kenn ich mich leider nicht aus. Gruß, Roman
Code: Befehl: (entget(tblobjname "BLOCK" "500")) ((-1 . <Objektname: 7ff45bb84350>) (0 . "BLOCK") (330 . <Objektname: 7ff45bb84330>) (5 . "10E2D") (100 . "AcDbEntity") (67 . 0) (8 . "0") (62 . 7) (370 . 25) (100 . "AcDbBlockBegin") (70 . 2) (10 0.0 0.0 0.0) (-2 . <Objektname: 7ff45b00fbf0>) (2 . "500") (1 . "")) Befehl: (entget(entnext(tblobjname "BLOCK" "500"))) ((-1 . <Objektname: 7ff45b00fbf0>) (0 . "CIRCLE") (330 . <Objektname: 7ff45bb84330>) (5 . "3436F") (100 . "AcDbEntity") (67 . 0) (8 . "0") (62 . 7) (6 . "Continuous") (370 . 18) (100 . "AcDbCircle") (10 0.0 0.0 0.0) (40 . 0.25) (210 0.0 0.0 1.0)) Befehl: (entget(entnext(entnext(tblobjname "BLOCK" "500")))) ((-1 . <Objektname: 7ff45b00fc70>) (0 . "ATTDEF") (330 . <Objektname: 7ff45bb84330>) (5 . "34387") (100 . "AcDbEntity") (67 . 0) (8 . "PUNKTE1") (100 . "AcDbText") (10 1.44327 3.89793 0.0) (40 . 1.0) (1 . "") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "TXT") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (280 . 0) (3 . "Nummer") (2 . "PNUM") (70 . 0) (73 . 0) (74 . 0) (280 . 0))
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |