| |
| 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: Block mit (entmake) erstellen (3979 mal gelesen)
|
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 17. Sep. 2008 17:30 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich möchte mit (entmake) einen Block erstellen, und - um das zu verstehen - studiere ich gerade die (entget)-Ausgabe von herkömmlich definierten Blöcken. z. B. eine Blockdefinition "bb", die eine Polyline und eine Linie enthält: Befehl: Code: (setq aa (tblsearch "BLOCK" "bb"))
((0 . "BLOCK") (2 . "bb") (70 . 0) (10 0.0 0.0 0.0) (-2 . <Objektname: 7df4dd28>))-> ich dachte, daß ich nun über die Gruppe -2 an die einzelnen Elemente komme: Befehl: Code: (entget (cdr (assoc -2 aa)))
((-1 . <Objektname: 7df4dd28> ) (0 . "LWPOLYLINE") (330 . <Objektname: 7df4dd10> ) (5 . "4DD") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 -35.533 -28.7869) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 48.0176 -28.7869) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 48.0176 23.0295) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 -35.533 23.0295) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))Aber da ist scheinbar nur die Polyline zu finden; wo ist die Linie bzw. die weiteren im Block def. Elemente bzw. wie kommt man an diese ran? Gruß, Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 17. Sep. 2008 17:39 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
|
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 17. Sep. 2008 18:48 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
|
romi1 Mitglied Bautechniker
Beiträge: 647 Registriert: 09.02.2006 Xeon E3-1245V2 16GB RAM Windows 10 Professional 64 bit AutoCAD 2014
|
erstellt am: 18. Sep. 2008 10:43 <-- editieren / zitieren --> Unities abgeben:
Hi! Danke Udo!! Das mit (entnext <...> ) hätte ich eigentlich wissen müssen - hab' mal wieder ordentlich ein Brett vor dem Kopf gehabt ... Roman [Diese Nachricht wurde von romi1 am 18. Sep. 2008 editiert.] 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: 22. Sep. 2008 15:03 <-- editieren / zitieren --> Unities abgeben:
Hi! Habe es mit untenstehendem Code geschafft, testweise eine Blockdefinition zu erzeugen: Code: (entmake (list (cons 0 "BLOCK") (cons 2 "testblock") (list 10 0 0 0) (cons 70 0) ) )(entmake (list (cons 0 "LINE") (list 10 -3 0 0) (list 11 3 0 0) ) ) (entmake (list (cons 0 "LINE") (list 10 0 2 0) (list 11 0 -2 0) ) ) (entmake (list (cons 0 "ENDBLK") ) )
Aber noch folgende Frage: Hier muß ich den Block mit "ENDBLK" abschließen, daß scheint mir irgendwie logisch; aber wenn ich bei einer herkömlich erzeugten Blockdefinition die Elemente der Reihe nach durchgehe (mit entnext) komme ich am Ende NICHT auf das Element "ENDBLK". Warum ist da nicht anzutreffen ??
Gruß, Roman
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Geos Mitglied Vermessungstechniker i.R.
Beiträge: 1017 Registriert: 21.09.2001 ACAD Map 2010, Win 7 Pro eigene Lisp's<P>HW: Core i7 860, 2.8 GHz 3.3 GB, NVIDIA GeForce GTS 250
|
erstellt am: 22. Sep. 2008 18:38 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Code: Befehl: (entget (setq nam (car (entsel))))Objekt wählen: ((-1 . <Objektname: 400c19f0>;) (0 . "INSERT") (330 . <Objektname: 400d4120>;) (5 . "1880D6C04F7ACF8E") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "S-S1") (100 . "AcDbBlockReference") (66 . 1) (2 . "GDK10") (10 11713.8 362390.0 0.0) (41 . 0.25) (42 . 0.25) (43 . 0.25) (50 . 1.01097) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0)) Befehl: (entget (setq nam (entnext nam))) ((-1 . <Objektname: 400c19f8>;) (0 . "ATTRIB") (330 . <Objektname: 400c19f0>;) (5 . "1880D6C04F7ACF8F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "B-S") (100 . "AcDbText") (10 11713.7 362391.0 0.0) (40 . 0.5) (1 . "11") (50 . 1.01097) (41 . 1.0) (51 . 0.261799) (7 . "R0") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "BEZ") (70 . 0) (73 . 0) (74 . 0)) Befehl: (entget (setq nam (entnext nam))) ((-1 . <Objektname: 400c1a00>;) (0 . "ATTRIB") (330 . <Objektname: 400c19f0>;) (5 . "1880D6C04F7ACF90") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "H-S") (100 . "AcDbText") (10 11714.8 362390.0 0.0) (40 . 0.45) (1 . "") (50 . 1.01097) (41 . 1.0) (51 . 0.0) (7 . "F0") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "HOEHE") (70 . 0) (73 . 0) (74 . 0)) Befehl: (entget (setq nam (entnext nam))) ((-1 . <Objektname: 400c1a08>;) (0 . "SEQEND") (330 . <Objektname: 400c19f0>;) (5 . "1880D6C04F7ACF91") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "S-S1") (-2 . <Objektname: 400c19f0>;))
Na ja, bei einem Block ohne Attribute gibts eben nur das INSERT. Und hast Du Attribute (66) dann findest Du am Ende ein SEQEND ... falls Du das INSERT meinst, welches Du mit entnext durchgehen willst... ------------------ Schöne Grüße Ernst
www.geopaint.at [Diese Nachricht wurde von Geos am 22. Sep. 2008 editiert.] 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: 23. Sep. 2008 06:19 <-- editieren / zitieren --> Unities abgeben:
Hallo! @Geos: Danke für deine Antwort, aber du hast meine Frage missverstanden: ich meine die Daten bei der eigentlichen Blockdefinition (0 . "BLOCK"), nicht das Insert. Gruß, Roman [Diese Nachricht wurde von romi1 am 23. Sep. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 24. Sep. 2008 10:05 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Zitat:
Hier muß ich den Block mit "ENDBLK" abschließen, daß scheint mir irgendwie logisch; aber wenn ich bei einer herkömlich erzeugten Blockdefinition die Elemente der Reihe nach durchgehe (mit entnext) komme ich am Ende NICHT auf das Element "ENDBLK". Warum ist da nicht anzutreffen ??
Tja hier verhält sich einfach entnext anders. Anstatt das Objekt ENDBLK zurückzugeben gibt es halt einfach NIL zurück Z.B.: gegeben eine Block TESTBLOCK mit einer Linie und einem Bogen ergibt folgendes: Code:
Befehl: (entget (setq a1 (tblobjname "BLOCK" "TESTBLOCK"))) ((-1 . <Objektname: 4006fd70>) (0 . "BLOCK") (330 . <Objektname: 4006fd68>) (5 . "2E") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockBegin") (70 . 0) (10 0.0 0.0 0.0) (-2 . <Objektname: 4006fd78>) (2 . "TESTBLOCK") (1 . "")) Befehl: (entget (setq a1 (entnext a1))) ((-1 . <Objektname: 4006fd78>) (0 . "LINE") (330 . <Objektname: 4006fd68>) (5 . "2F") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbLine") (10 -68.3753 -39.2322 0.0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0)) Befehl: (entget (setq a1 (entnext a1))) ((-1 . <Objektname: 4006fd80>) (0 . "CIRCLE") (330 . <Objektname: 4006fd68>) (5 . "30") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 0.0 0.0 0.0) (40 . 28.5979) (210 0.0 0.0 1.0)) Befehl: (entnext a1) nil
das erleichtert allerdings eher das programmieren, weil man hier relativ leicht mit einer WHILE Schleife die Sub elemente eines Blockes durchlaufen kann. Das EndBLK Objekt gibt es aber tatsächlich, wenn man sich die dazugehörige DXF Datei anschaut
Code:
0 BLOCK 8 0 2 TESTBLOCK 70 0 10 0.0 20 0.0 30 0.0 3 TESTBLOCK 1 0 LINE 5 2F 8 0 10 -68.375263485221922 20 -39.23219809702811 30 0.0 11 0.0 21 0.0 31 0.0 0 CIRCLE 5 30 8 0 10 0.0 20 0.0 30 0.0 40 28.59794801783563 0 ENDBLK 5 31 8 0
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 24. Sep. 2008 10:12 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Etwas Offtopic, aber ich wollte es mal erwähnen: wenn man den Block so abschließt (entmake (list (cons 0 "ENDBLK") (cons 8 "ABC") ) ) bekommt man , solange der Block in der Dwg existiert, den LAYER "ABC" nicht bereinigt (auch wenn keine anderen Objekte den Layer referenzieren), und auch Programmiertechnisch mit Lisp oder ActiveX nicht ran...weil ja beim "endblk" nil zurückgegeben wird ... böse, böse ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."
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: 24. Sep. 2008 13:21 <-- editieren / zitieren --> Unities abgeben:
Hi! @fuchsi: Das war es, was ich meinte. Ok, ich nehme zur Kenntnis: Der Elementname des Elementes (0 . "ENDBLK") wird von entnext quasi nicht gefunden. Danke, Roman [Diese Nachricht wurde von romi1 am 24. Sep. 2008 editiert.] 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: 10. Okt. 2008 11:19 <-- editieren / zitieren --> Unities abgeben:
Hi! Nun happert's nochmals bei mir bei der Blockerstellung, und zwar lässt sich bei dem Block, der mit beigefügtem Test-Code-Auszug erstellt wurde, das Attribut nicht befüllen, wenn er als INSERT gesetzt wird. Was ist da noch falsch? Code: (entmake (list (cons 0 "BLOCK") ;(cons 2 azbeschrblocknam) (cons 2 "b1test") (list 10 0 0) (cons 70 0) ) ) (entmake (list (cons 0 "CIRCLE") (cons 100 "AcDbEntity") (cons 8 "0") (list 10 0 0 0) (cons 40 0.25) ; Radius (cons 370 25) ; Linienstärke ) ) (entmake (list (cons 0 "ATTDEF") (cons 100 "AcDbEntity") (cons 8 "0") (cons 100 "AcDbText") (list 10 0.5 0 0.0) (cons 40 0.25) ; Beschriftungshöhe (cons 1 "vorg") (cons 50 0.0) (cons 41 1.0) ; Drehwinkel (cons 51 0.0) (cons 7 "Standard") (cons 71 0) (cons 72 0) (list 11 0.5 0.0 0.0) (list 210 0.0 0.0 1.0) (cons 100 "AcDbAttributeDefinition") (cons 3 "eingabeauff") (cons 2 "eisendaten") (cons 70 0) (cons 73 0) (cons 74 2) ; vert. Textausr (cons 280 1) ; Pos sperren ) ) (entmake (list (cons 0 "ENDBLK") (cons 8 "0") ) )
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 10. Okt. 2008 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
(entmake (list (cons 0 "BLOCK") (cons 2 "b1test") (list 10 0 0) (cons 70 2) ;;; -> Block enthält Attributdefs!!! ) )....... Siehe auch hier ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." 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: 10. Okt. 2008 11:43 <-- editieren / zitieren --> Unities abgeben:
|