| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Insert verschieben in anderen Insert (1623 / mal gelesen)
|
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 21. Aug. 2017 18:01 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich habe eine Anzahl Inserts auf der obersten Ebene. Um die eigentliche Struktur besser darzustellen möchte ich nun einige Inserts in einen anderen Insert verschieben. Also ein Insert wird zum Haupt-Insert auf der obersten Ebene und die Subinserts werden in den Haupt-Insert verschachtelt und sind nicht mehr auf der obersten Ebene. Für dieeses nachträgliche Verschieben suche ich eine Lisp-Funktion die die beiden Handles übergeben bekommt und die Verschachtelung ausführt. Grafisch soll sich dabei nichts ändern. Grüsse, Hans-Peter ------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 21. Aug. 2017 18:13 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
|
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 21. Aug. 2017 18:58 <-- editieren / zitieren --> Unities abgeben:
Hallo, Naja die Frage war: ...eine Lisp-Funktion die die beiden Handles übergeben bekommt und die Verschachtelung ausführt. Code habe ich noch nicht. Ich habe schon mal eine Funktion programmiert die einen Block durchliesst und Entyties darin mit (entmod .) modifiziert. Habe auch schon bei meiner Suche code gesehen wo mit entmake neue Blöcke erstellt wurden. Was jetzt der beste Weg ist einen vorhandenen Block um einen Sub-Block zu erweitern, da fehlt mir der Ansatz wie das am besten gemacht wird. Grüsse, Hans-Petet
------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 21. Aug. 2017 21:27 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
Zitat: Original erstellt von HPW: Hallo,Naja die Frage war: ...eine Lisp-Funktion die die beiden Handles übergeben bekommt und die Verschachtelung ausführt. Code habe ich noch nicht. Ich habe schon mal eine Funktion programmiert die einen Block durchliesst und Entyties darin mit (entmod .) modifiziert. Habe auch schon bei meiner Suche code gesehen wo mit entmake neue Blöcke erstellt wurden. Was jetzt der beste Weg ist einen vorhandenen Block um einen Sub-Block zu erweitern, da fehlt mir der Ansatz wie das am besten gemacht wird. Grüsse, Hans-Petet
Ich nehme an, Du willst ein Insert nicht in ein anderes Insert, sondern in eine vorhandene Blockdefinition verschieben. Das geht nicht. Du kannst eine Blockdefinition nicht wie eine Datei oder wie ein Pickset öffnen und neue Zeilen oder Elemente dran hängen. Du musst die Blockdefinition mit ihren bisherigen Entities und zusätzlich Deinem Insert neu erzeugen. Die Referenzen auf diese Blockdefinition (also die Inserts in Deiner DWG, die sich darauf beziehen), werden mit ENTUPD aktualisiert und zeigen dann auch den neuen Inhalt an.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 07:14 <-- editieren / zitieren --> Unities abgeben:
Hallo, Danke für die Klarstellung. Ich denke ich hab jetzt die Vorgehensweise verstanden. Block durchlesen und Daten einsammeln. Insert's anhängen. Block neu erzeugen. SubInsert auf oberer Ebenen löschen. Grüsse, Hans-Peter ------------------ Hans-Peter
[Diese Nachricht wurde von HPW am 22. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 22. Aug. 2017 07:50 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
... noch ein Hinweis: den SubInsert kannst du nicht einfach mit den Koordinaten, wie dieser im Modellbereich eingefügt ist, übernehmen. Du musst die Lage, Drehung/Skalierung auf den Block umrechnen, der den Hauptblock darstellt, und durch den HauptInsert repräsentiert wird. Ist dieser gedreht und skaliert und auf irgendeiner Koordinate eingefügt, und du fügst den SubInsert einfach so, wie dieser im Modellbereich dargestellt ist, hinzu, ändert sich die Lage, also auch das Erscheinungsbild der Zeichnung. 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 |
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 08:15 <-- editieren / zitieren --> Unities abgeben:
|
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 11:38 <-- editieren / zitieren --> Unities abgeben:
Hallo, Habe nun ein Problem: Code:
ent_info1 : ((0 . INSERT) (330 . <Objektname: 7efec4d0>) (5 . 140D8) (100 . AcDbEntity) (67 . 0) (8 . KCAD) (100 . AcDbBlockReference) (2 . GEN22B0C0ABJVE9) (10 0.0 0.0 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))ent_info2 : ((0 . INSERT) (330 . <Objektname: 7efe0240>) (5 . 1433C) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . kcadsbg) (100 . AcDbBlockReference) (66 . 1) (2 . INT225751_[__200.010]_J5253_DK_1_1_1) (10 505.0 -7.0 1.55431e-015) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 2.22045e-016 1.0)) Nach entmake ent_info2 ent_info2 : ((0 . INSERT) (330 . <Objektname: 7efe0240>) (5 . 146B0) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . kcadsbg) (100 . AcDbBlockReference) (66 . 1) (2 . INT225751_[__200.020]_J7253_DR_1_1_1) (10 505.0 -1.06581e-014 25.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 2.22045e-016 1.0)) Ungültiges komplexes Objekt. Nach entmake ent_info2 ent_info2 : ((0 . INSERT) (330 . <Objektname: 7efe0240>) (5 . 147E4) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . kcadsbg) (100 . AcDbBlockReference) (66 . 1) (2 . INT225751_[__200.030]_J9251_DT_1_1_1) (10 505.0 -455.0 25.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 2.22045e-016 1.0)) Nach entmake ent_info2 ent_info2 : ((0 . INSERT) (330 . <Objektname: 7efe0240>) (5 . 14926) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . kcadsbg) (100 . AcDbBlockReference) (66 . 1) (2 . INT225751_[__200.040]_J9251_DT_1_1_2) (10 952.0 -455.0 25.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 2.22045e-016 1.0)) Ungültiges komplexes Objekt. Nach entmake ent_info2 ent_info2 : ((0 . INSERT) (330 . <Objektname: 7efe0240>) (5 . 14A71) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . kcadsbg) (100 . AcDbBlockReference) (66 . 1) (2 . INT225751_[__200.050]_J0443_DE_1_1_1) (10 952.0 -26.2 322.9) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 2.22045e-016 1.0)) Nach entmake ent_info2 ent_info2 : ((0 . INSERT) (330 . <Objektname: 7efe0240>) (5 . 14BC7) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . kcadsbg) (100 . AcDbBlockReference) (66 . 1) (2 . INT225751_[__200.060]_J0443_DE_1_1_2) (10 952.0 -26.2 622.9) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 2.22045e-016 1.0)) Ungültiges komplexes Objekt. Nach entmake ent_info2 EndBlk.
In ent_info1 steht die Entget-Liste eines schon im Hauptblock enthaltenen SubBlock. Der wird so übernommen und es entsteht der neue Block. Beim ersten SubBlock in ent_info2 wirft er keinen Fehler bei entmake. Bei zweiten dann: Ungültiges komplexes Objekt. Entget-Liste sieht aber so ähnlich aus wie bei der ersten. Und dann kommt der Fehler bei jedem zweiten SubBlock Jemand eine Idee? Grüsse, Hans-Peter ------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 22. Aug. 2017 11:45 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
|
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 11:48 <-- editieren / zitieren --> Unities abgeben:
Code:
(setq OldBlockName (strcase (cdr (assoc 2 (entget HposEnt))))) ; (setq rewind T) ; (while (setq Info (tblnext "BLOCK" rewind)) ; (setq BlockName (strcase (cdr (assoc 2 Info)))) ; (if (= OldBlockName BlockName) ; (setq BlockInfo Info) ; ) ; (setq rewind nil) ; ) ;ende while (if BlockInfo ; (progn ; (setq ent_name (cdr (assoc -2 BlockInfo))) ; ; header definition: (entmake ; (list (cons 0 "BLOCK") ; (cons 2 NewBlockName) ; (cons 70 2) ; (cons 10 (list 0 0 0)) ; ) ; ) ; ; body definition: (entmake (cdr (entget ent_name))) ; (while (setq ent_name (entnext ent_name)) ; (setq ent_info (cdr (entget ent_name))) ; ; (setq ent_typ (cdr (assoc 0 ent_info))) ; (princ "\n\nent_info1 : ") (princ ent_info) (entmake ent_info) ; ) ;ende while ; UPOS binding: (if (setq masterliste (getref HposEnt "CADT_CAB_MASTER")) ;wenn master (progn ; (setq masterliste (reverse masterliste)) ;Liste in richtige Reihenfolge (foreach m masterliste ; (if (handent m) ; (if (getvareed0 (handent m) "CADT_MBI_VAR" "") ; (progn ; (setq ent_info (cdr (entget (handent m)))); (princ "\n\nent_info2 : ") (princ ent_info) (entmake ent_info) ; (princ "\nNach entmake ent_info2\n") ) ;ende progn ) ;ende if ) ;ende if ) ;ende foreach ) ;ende progn ) ;ende if ; footer definition: (princ "\n\nEndBlk") (entmake (list(cons 0 "ENDBLK"))) (setq adat0(CADT:WOINT:GETTXT HposEnt 0) ; adat1(CADT:WOINT:GETTXT HposEnt 1) ; adat2(CADT:WOINT:GETTXT HposEnt 2) ; adat3(CADT:WOINT:GETTXT HposEnt 3) ; adat4(CADT:WOINT:GETTXT HposEnt 4) ; adat5(CADT:WOINT:GETTXT HposEnt 5) ; adat6(CADT:WOINT:GETTXT HposEnt 6) ; adat7(CADT:WOINT:GETTXT HposEnt 7) ; adat8(CADT:WOINT:GETTXT HposEnt 8) ; adat9(CADT:WOINT:GETTXT HposEnt 9) ; adat10(CADT:WOINT:GETTXT HposEnt 10) ; adat11(CADT:WOINT:GETTXT HposEnt 11) ; ) ; (command "._INSERT" NewBlockName pause "1" "1" pause adat0 adat1 adat2 adat3 adat4 adat5 adat6 adat7 adat8 adat9 adat10 adat11) ) ; ) ;ende if
------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 11:53 <-- editieren / zitieren --> Unities abgeben:
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 22. Aug. 2017 12:10 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
Zitat: Original erstellt von HPW: Hallo,Habe da was gefunden: http://ww3.cad.de/foren/ubb/Forum54/HTML/009903.shtml Die SubBlöcke enthalten auch Atrribute. Muss weiter suchen. Grüsse,
Attribute sind eigenständige Entitis, die in der DWG liegen. Die werden den Inserts nur angehängt (Flag "Elemente folgen"). Die musst Du unterscheiden von Attributdefinitionen, die wiederum in den Blockdefinitionen enthalten sind. Die Attributdefinitionen sind nur dazu da, den Anwender beim Einfügen einer Blockreferenz nach den entsprechenden Attributwerten zu fragen bzw die Attribute mit vordefinierten Werten an die Inserts zu hängen. Ich hab' mir Deinen Code nicht angesehen, aber der Hinweis hilft Dir vielleicht weiter: Du brauchst nur die Blockdefinition durchzugehen, um dort alle darin stehenden Entities (auch die Attributdefinitionen, ud auch die ATTRIBs eventuell drin stehender Inserts) zu sammeln. Dazu schreibst Du Dir eine sehr einfache und übersichtliche Funktion, die den Blocknamen als Input erhält und als Rückgabewert die Liste der ENamen der Blockdefinition zurück gibt. Bei der Neudefintion der Blockdefinition gehst Du einfach diese Liste durch, und erzeugst die Entities mit (entmake (entget ename))) neu. Und dann hängst Du einfach Deine Inserts noch dran, bevor Du die Blockdefinition beendest.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 12:38 <-- editieren / zitieren --> Unities abgeben:
Hallo, Was du beschrieben hast, meine ich auch so zu tun. Ohne Dranhängen der SubBlock's funktioniert das ja auch. Nur beim 'Einfach Dranhängen' kommt ja der Fehler. Grüsse,
------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 22. Aug. 2017 14:07 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
Zitat: Original erstellt von HPW: Hallo,Was du beschrieben hast, meine ich auch so zu tun. Ohne Dranhängen der SubBlock's funktioniert das ja auch. Nur beim 'Einfach Dranhängen' kommt ja der Fehler. Grüsse,
Warum nennst Du das Ding "Subblock"? Du hängst ein INSERT Entitiy an. Und das sollte keinen Fehler ergeben. Wie eine INSERT-Entmake-Liste aussieht, kannst Du ja leicht abfragen. Und wenn Du uns hier nicht mitteilst, welche Fehlermeldung Dir ausgegeben wird, können wir nur unsere leider ziemlich schlecht funktionierenden Kristallkugeln befragen. darauf hab' ich keine Lust.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 14:31 <-- editieren / zitieren --> Unities abgeben:
Hallo, Entschuldigung wenn ich es nicht klar genug beschrieben habe. Im Post 8 hatte ich sowohl die jeweilige entmake-Liste ausgegeben als auch die Fehlermeldung: Ungültiges komplexes Objekt. Im Post 10 dann der code mit den princ-Ausgaben die zum Post 8 paasen. Was fehlt dazu noch? Grüsse, ------------------ Hans-Peter
[Diese Nachricht wurde von HPW am 22. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 22. Aug. 2017 15:23 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
HP Ohne die Sache genauer zu prüfen greife ich den Hinweis von oben erneut auf: Du erzeugst ein INSERT mit der Eigenschaft '(66 . 1), Acad erwartet also nachfolgend mind. ein Attribut, anstatt eines Attributes kommt ein weiteres Insert: MÖÖÖP Fehler. Da du offenbar noch keine Attributierten Blockreferenzen erstellt hast, teste erst einmal mit ein paar Test-Zeilen. Wenn du dies dann kannst, dann steht auch der Verwendung/Erzeugung für eine Blockdefinition nichts im Wege: ; Insert 66 . 1 (progn (entmake e2_insert_66=1) (entmake e2_folgendes_Attribute1) ; ein Attribut folgt (entmake e2_folgendes_Attribute2) ; wenn ein Zweites folgt, usw. (entmake '((0 . "SEQEND"))) ; erst hier ist eine Blockreferenz mit Attributen "fertig" ) ; Block (progn (entmake '((0 . "BLOCK")(2 . "TEST555")(70 . 2)(10 0.0 0.0 0.0))) (entmake e1) ; Irgendein Objekt
(entmake e2_insert_66=1) (entmake e2_folgendes_Attribute1) (entmake e2_folgendes_Attribute2) ; wenn ein Zweites folgt, usw. (entmake '((0 . "SEQEND"))) ; erst hier ist eine Blockreferenz mit Attributen "fertig" (entmake e3) ; Irgendein anderes Objekt (entmake (list(cons 0 "ENDBLK"))) ; Blockende ; TEST (command "_.-INSERT" "TEST555" (while (> (getvar "cmdactive") 0) (command pause))) ) ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 22. Aug. 2017 15:51 <-- editieren / zitieren --> Unities abgeben:
Hallo, Danke für den Tip. Ich denke das es das sein wird. Ich hatte gerade einen Block händisch erzeugt mit denselben Inserts und dann die Daten ausgelesen. Da stehen dann die Attribute und das SEQEND dazwischen. Werde es testen. Grüsse, ------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 23. Aug. 2017 12:01 <-- editieren / zitieren --> Unities abgeben:
Hallo, Danke nochmal an alle die mir geduldig auf den richtigen Weg geholfen haben. Ich hatte noch etwas zu kämpfen, aber jetzt funktioniert es. Man muss verstehen das an den neuen Haupt-Block ATTDEF dran gehängt werden müssen und an die INSERTS aber die ATTRIB. Die muss man dann auch erst mal ermitteln. Das Transformieren des Einfügepunkts der Inserts ins Block-Koordinaten-Systems war nach obigen Hinweisen auch möglich. Zum Schluss noch Weglöschen der INSERTS auf der Hauptebene und gut wars. Grüsse, ------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 23. Aug. 2017 12:18 <-- editieren / zitieren --> Unities abgeben: Nur für HPW
Zitat: Original erstellt von HPW:
Man muss verstehen das an den neuen Haupt-Block ATTDEF dran gehängt werden müssen und an die INSERTS aber die ATTRIB.
Die ATTDEFs sind nicht zwingend nötig. Du kannst auch an ein INSERT, dessen Blockdefinition keine ATTDEFs hat, problemlos ATTRIBs anhängen. Ob die ATTDEFs nötig sind, hängt davon ab, ob die INSERTs auch händisch, also nicht durch eine Applikation, eingesetzt werden sollen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |