| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY WIRD VON NVIDIA ZUM HÄNDLER DES JAHRES GEWÄHLT, eine Pressemitteilung
|
Autor
|
Thema: Dyn. Blöcke - welches Dictionary ist zuständig? (1152 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: 05. Sep. 2008 12:33 <-- editieren / zitieren --> Unities abgeben:
Hallo! Sobald ein dynamischer Block verändert wurde, hat er bei (entget) im Gruppencode 2 ja nicht mehr seinen ursprünglichen Namen, sondern z. B. "*U793"; Wie kann ich damit weiterarbeiten bzw. wie (meiner Meinung nach über Dictionarys) finde ich die Verbindung zw. ursprünglichen Blocknamen und *U793 ?; Wie finde ich raus, welches Dictionary zuständig ist? Gruß, Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 05. Sep. 2008 12:41 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
Wenn von einem dynamischen Block eine Referenz erstellt wird, wird zuerst eine anonyme (statische) Blockdefinition (Name "*U...") entsprechend den eingestellten dyn.Parametern erstellt und diese dann referenziert... die Verbindung zwischen Blockreferenz und ursprünglicher dyn. Blockdefinition bekommst du über die ActiveX-Eigenschaft "Effektivename". Randfrage: Mit den Lispgrundlagen bist du durch ? ------------------ - 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: 05. Sep. 2008 13:26 <-- editieren / zitieren --> Unities abgeben:
Hi! Das mit dem ActiveX-... hab' ich mal in der Hilfe angesehen, denke aber das mir das doch noch zu "steil" ist! Kann ich die Verbindung nicht auch über's normale Lisp, sprich über Dictionary's herausfinden - meiner Meinung nach müsste das möglich sein, aber wie? PS: zur Randfrage: Also durch bin ich scheinbar auch mit den Grundlagen nicht - wie Du siehst, bin ich soeben dabei, mir bei den dyn. Blöcken bzw. Dictionary's die Zähne auszubeissen .... Gruß, Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 05. Sep. 2008 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
na ok .. wenn du normales Lisp einfacher findest .. die Parameter usw. stehen in Extensiondictionary der jeweiligen Referenz .. an den Effektivnamen kommst du z.B. so: (and(setq A(Car(Entsel "\nReferenz eines dyn. Blockes wählen:"))) (setq A(entget A)) (setq A(cdr(assoc 360 A))) (setq A(entget A)) (setq A(cdr(assoc 360 A))) (setq A(entget A)) (setq A(member'(3 . "ACDBREPDATA") (mapcar '(lambda(X) (if(and(=(car X)3) (=(type(cdr X))) ) (cons 3 (strcase (cdr X))) X ) ) A ) ) ) (setq A(cdr(assoc 360 A))) (setq A(entget A)) (setq A(cdr(assoc 340 A))) (setq A(entget A)) (setq A(cdr(assoc 2 A))) (princ (strcat "\n" A)) ) Hoffe, dir ist jetzt alles klarer ------------------ - 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: 08. Sep. 2008 11:34 <-- editieren / zitieren --> Unities abgeben:
Hi! @ CADmium: Danke für deine Hilfe; habe mittlerweile stundenlang über deinen Code-Tipp gegrübelt und probiert, hab' aber leider die Logik der DICTIONARY's bzw. dieser speziellen DICTIONARY's noch nicht durchschaut, daher folgende Fragen: a) warum ist jenes DICTIONARY, das für die Neubenennung der Blockreferenzen bei dyn. Blöcken zuständig ist, nicht im Hauptwörterbuch (namedobjdict) auffindbar; bzw. was ist speziell daran? b) wie weiß ich, wenn ich in die DICTIONARY's und "Sub-"DICTIONARY's gehe, daß ich beim Objektnamen der Gruppe 360 in die Tiefe gehen muß (ist ja laut DXF-Beschreibung eine "Hard-Besitzer-Referenz")? Warum nicht in Gruppe 330 (Soft-Zeiger-Referenz ..."normale" -1 Objektnamen sind ja auch Softreferenzen, oder? c) schon bei deiner 5. Codezeile fange ich in's "schwimmen" an: das Ergebnis meiner 4. Zeile sieht bei mir in etwa so aus: ((-1 . <Objektname: 7ef62ae0> ) (0 . "DICTIONARY") (330 . <Objektname: 7ef62ad8> ) (5 . "14BBC") (100 . "AcDbDictionary") (280 . 1) (281 . 1) (3 . "AcDbBlockRepresentation") (360 . <Objektname: 7ef62ae8> ) (3 . "AcDbContextDataManager") (360 . <Objektname: 7ef62b40> )) Da gibt es ZWEI 360er-Gruppen: wie weiß (assoc) dann in der 5. Zeile, welche 360er-Gruppe es nehmen soll ... zwar sehe ich, daß es die zuerst gefundene Entsprechung nimmt <Objektname: 7ef62ae8>, aber warum?? d) ab dem Ergebnis der 6.Zeile stehe ich völlig an: das Ergebnis dieser Zeile sieht bei mir etwa so aus: ((-1 . <Objektname: 7ef62ae8> ) (0 . "DICTIONARY") (5 . "14BBD") (102 . "{ACAD_REACTORS") (330 . <Objektname: 7ef62ae0> ) (102 . "}") (330 . <Objektname: 7ef62ae0> ) (100 . "AcDbDictionary") (280 . 1) (281 . 1) (3 . "AcDbRepData") (360 . <Objektname: 7ef62af0> ) (3 . "AppDataCache") (360 . <Objektname: 7ef62af8> )) Kann mir jemand erklären, was da was bedeutet? Gruß, Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 08. Sep. 2008 11:46 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
zu a) weil die adesk-Programmierer das so gemacht haben und weil es IMHO logisch ist, dass es zur Blockreferenz gehört zu b)Erfahrung,Zeichnungsanalyse und DBVIEW-Einsatz.. solche speziellen Sachen gibts IMHO nirgends nachzulesen( außer vielleicht in Foren, wo solche speziellen Fragen gestellt werden) zu c)assoc gibt immer das erste gefundene zurück, bei mehreren gleichen GCs muß man etwas mehr aufwand in die Programmierung stecken zu d) na da gehts dann weiter mit den Objektverweisen .. bis man schließlich am Ende beim Blocknamen gelandet ist .. siehe dazu auch b) ------------------ - 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: 08. Sep. 2008 12:59 <-- editieren / zitieren --> Unities abgeben:
Hi! zu d) ... weiter mit Objektverweisen ..: Wenn ich beim Ergebnis der 6. Zeile wiederum das Objekt der Gr. 360 extrahiere, bekomme ich das Ergebnis: ((-1 . <Objektname: 7ef62af0> ) (0 . "ACDB_BLOCKREPRESENTATION_DATA") (5 . "14BBE") (102 . "{ACAD_REACTORS") (330 . <Objektname: 7ef62ae8> ) (102 . "}") (330 . <Objektname: 7ef62ae8> ) (100 . "AcDbBlockRepresentationData") (70 . 1) (340 . <Objektname: 7ef098f0> )) Wenn ich daraus das Objekt der Gr. 340 extrahiere, sieht das Ergebnis so aus: 0000000000000000000000000000000000000000000000FF00FFFFFF00000000000000000000000 00000000000000000000000000000FF0000FFFFFF000000000000000000000000000000000000000 0000000000000FF0000FFFFFFFF000000000000000000000000000000000000000000000000FF000 000FFFFFFFFFF00") ..... Wo ist da der Objektverweis ?? 2. Frage: Gibt es bzw. wo gibt des DBVIEW für AutoCAD 2009 oder ev. für 2008? Ich hab' zwar eine Version gefunden, gibt aber Meldung "nicht kompatibel" Gruß, Roman
[Diese Nachricht wurde von romi1 am 08. Sep. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 08. Sep. 2008 13:03 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
(340 . <Objektname: 7ef098f0> ) ist ein entity und denke (entget..) liefert da was anderes, als das von dir gepostete ... aber aus der Ferne läßt sich das schlecht beurteilen.... und dbview für 2007 könnte mit 2009 kompatibel sein .. hab ich aber nicht getestet ------------------ - 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: 08. Sep. 2008 13:18 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 08. Sep. 2008 13:39 <-- 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: 08. Sep. 2008 13:51 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 08. Sep. 2008 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
also bei mir klappt das: Code:
Befehl: (and(setq A(Car(Entsel "\nReferenz eines dyn. Blockes wählen:"))) (_> (setq A(entget A)) (_> (setq A(cdr(assoc 360 A))) (_> (setq A(entget A)) (_> (setq A(cdr(assoc 360 A))) (_> (setq A(entget A)) (_> (setq A(member'(3 . "ACDBREPDATA") (((_> (mapcar ((((_> '(lambda(X) (((('(_> (if(and(=(car X)3) (((('(((_> (=(type(cdr X))) (((('(((_> ) (((('((_> (cons 3 (strcase (cdr X))) (((('((_> X (((('((_> ) (((('(_> ) ((((_> A ((((_> ) (((_> ) ((_> ) (_> (setq A(cdr(assoc 360 A))) (_> (setq A(entget A)) (_> (setq A(cdr(assoc 340 A))) (_> (setq A(entget A)) (_> (setq A(cdr(assoc 2 A))) (_> (princ (strcat "\n" A)) (_> )Referenz eines dyn. Blockes wählen: _hk_schnittT Befehl:
------------------ - 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: 08. Sep. 2008 14:07 <-- editieren / zitieren --> Unities abgeben:
Ja - dein Code klappt bei mir auch - hab' ich auch nicht in Frage gestellt! Aber ich kapier nicht, was nach der 6. Zeile vor sich geht - deshalb meine Vorgehensweise mit dem letzten Element und dann immer die Extrahierung der Gr. 360 bzw. 340 - bis ich anstehe Gruß, roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 08. Sep. 2008 14:10 <-- editieren / zitieren --> Unities abgeben: Nur für romi1
sorry, dann weiß ich nicht, was du machst und wo die Reise überhaupt hingehen soll?! Die Forenhilfe dürfte sich also in der Sache erschöpft haben. Ach ja .. ab der 6. Zeile interessiert mich nur das Dict "ACDBREPDATA" und das drumrum schließt Fehler aufgrund Groß-Kleinschreibung ect. aus, da waren die Adesk-Progger nämlich mal wieder inkonsequent ------------------ - 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: 08. Sep. 2008 14:57 <-- editieren / zitieren --> Unities abgeben:
Hi! Danke mal zwischendurch für deine Geduld CADmium! Ich hab' mittlerweile einen Verdacht, warum es zu dieser "wilden" Ausgabe bei mir kommt. Irgendwas dürfte mit dem dyn. Block "_hk_schnitt" wohl nicht richtig sein. Wenn ich meine Versuche nämlich mit einem dyn. Block der AutoCAD-Samples mache, dann komme ich scheibar doch ans Ziel. Was kann da faul sein - an meinem Block? Roman Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |