| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Dictionaries in VBA auslesen ... Rätsel (3008 mal gelesen)
|
hendersson Mitglied GeoInformatiker
Beiträge: 27 Registriert: 12.08.2004
|
erstellt am: 26. Aug. 2004 15:40 <-- editieren / zitieren --> Unities abgeben:
Und wieder da mit einem neuen Problem. Wir erstellen derzeit ein Programm, in dem es nötig ist, eine in LISP (ich bin hier im richtigen Forum) Variable ausgelesen werden soll. Wir wollen keine Uservariablen von ACad verwenden und können deshalb auch keine GetVariable-Methode verwenden. Die Variable enthält eine mitgeführte Maßstabs-Info, die der Anwender in einem älteren LISP-Teil des Programmpaketes festlegt - deshalb auch der Verweis auf LISP im oberen Teil. Vielleicht kommt Euch das ja bekannt vor. der hendersson ------------------ ---------------------------- .~. /V\ L I N U X /( )\ >Phear the Penguin< ^^-^^ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 26. Aug. 2004 22:43 <-- editieren / zitieren --> Unities abgeben: Nur für hendersson
|
hendersson Mitglied GeoInformatiker
Beiträge: 27 Registriert: 12.08.2004
|
erstellt am: 30. Aug. 2004 09:44 <-- editieren / zitieren --> Unities abgeben:
Hallochen und danke für die Hilfe, die Sache mit den Dictionaries liegt so: Die Werte, die wir haben wollen, liegen in einem speziellen Dict. eines Kunden und das wurde mal mit LISP angelegt. Ich werde Deine Lösung auf alle Fälle durchgehen und die unsere ggf. ändern. Wir haben es jetzt doch mit einer User-Variablen gemacht, die jedoch nur ein mal zur Laufzeit benötigt wird. Melde mich wieder, wenn das alles abgeschlossen ist. Vielen Dank, h. ------------------ ---------------------------- .~. /V\ L I N U X /( )\ >Phear the Penguin< ^^-^^ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 30. Aug. 2004 10:04 <-- editieren / zitieren --> Unities abgeben: Nur für hendersson
|
hendersson Mitglied GeoInformatiker
Beiträge: 27 Registriert: 12.08.2004
|
erstellt am: 30. Aug. 2004 10:10 <-- editieren / zitieren --> Unities abgeben:
...klar, soweit war ich auch schon. Das entsprechende Dic. wurde auch richtig erkannt (laut Lokalfenster), allerdings standen sämtliche enthaltenen Werte auf EMPTY. Konnte mir darauf keinen Reim machen. ------------------ ---------------------------- .~. /V\ L I N U X /( )\ >Phear the Penguin< ^^-^^ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 30. Aug. 2004 10:22 <-- editieren / zitieren --> Unities abgeben: Nur für hendersson
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 30. Aug. 2004 13:49 <-- editieren / zitieren --> Unities abgeben: Nur für hendersson
Hab noch mal drüber nachgedacht: Ich vermute, dass es gar nicht um Dictionaries geht, sondern um LDATA! (LData ist ein separates 'Feature', das in R14 eingeführt wurde und für sehr viel Ärgernisse gesorgt hat. Benutzen tut's keiner, der sich auskennt!). Die Daten sind in Lisp sehr schnell gespeichert:
Code:
(vlax-ldata-put "mydict" "mykey" "mystringvalue")
Vermutlich wolltest du in VBA so drankommen: Code:
Public Sub falsch() Dim myDict As AcadDictionary Set myDict = ThisDrawing.Dictionaries.Item("mydict") Dim dataOut As Variant Dim typeOut As Variant myDict.GetXData "mykey", typeOut, dataOut Debug.Print TypeName(typeOut) ' => empty Debug.Print TypeName(dataOut) ' => empty End Sub
Das ist ein falscher Ansatz, weil du damit versuchst, XDaten auszulesen, die dem Dictionary als weiteres ExtensionDictionary zugeordnet sind - aber nicht die, die drinstehen... Das Problem ist nur, dass du auch mit dem richtigen Ansatz nicht weiterkommst:
Code:
Public Sub richtig() Dim myDict As AcadDictionary Set myDict = ThisDrawing.Dictionaries.Item("mydict") Dim o As Object Set o = myDict.GetObject("mykey") Debug.Print TypeName(o) ' => IAcadObject 'Debug.Print CStr(o) ' => Error End Sub
Das Problem ist, dass es für LDATA keine ActiveX-Methoden gibt (die gibt es nur für Dictionaries). In VBA stehst du also da mit dem object o und kannst es nicht verwerten. Da wird dir wohl kein andere Weg bleiben, als wirklich über Lisp zu gehen und VLAX.cls zu benutzen. Dieses Klassenmodul ist wohl der einzig existierende Weg, Lisp-Ausdrücke (in diesem Fall wäre das (vlax-ldata-get "mydict" "mykey")) zu evaluieren. Eine bessere Lösung wäre allerdings, eine Lisproutine zu schreiben, die die LDaten in Dictionaries umwandelt (die Werte in XRecords verpackt). Diese Lisproutine in der Acaddoc.lsp - und du kannst mit wenigen Zeilen VBA auf die XRecords zugreifen und sie auslesen. Damit würdest du auch grundsätzlich das LDATA-Problem aus den Zeichnungen verbannen. Gruß, Axel Strube-Zettler ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 30. Aug. 2004 19:13 <-- editieren / zitieren --> Unities abgeben: Nur für hendersson
Noch ein Nachtrag: Das, was du in object o als IAcadObject erhältst, ist ein Entity namens VLO-VL! Dieses Entity enthalt die Daten (kann natürlich mehrfach auftreten). Kleines Beispiel: (vlax-ldata-put "mydict" "mykey" "mystringvalue") (setq d(entget(cdr(assoc -1 (dictsearch (namedobjdict) "mydict")))))==> ((-1 . <Objektname: 7ef57f78> ) (0 . "DICTIONARY") (5 . "EF") (102 . "{ACAD_REACTORS") (330 . <Objektname: 7ef57c60> ) (102 . "}") (330 . <Objektname: 7ef57c60> ) (100 . "AcDbDictionary") (280 . 0) (281 . 1) (3 . "mykey") (350 . <Objektname: 7ef57f80> )) (setq e(entget(cdr(assoc 350 d)))) ==> ((-1 . <Objektname: 7ef57f80> ) (0 . "VLO-VL") (5 . "F0") (102 . "{ACAD_REACTORS") (330 . <Objektname: 7ef57f78> ) (102 . "}") (330 . <Objektname: 7ef57f78> ) (100 . "vlo_VL") (90 . -64512) (91 . 15) (92 . 0) (300 . "\"mystringvalue\"")) Was es nicht alles gibt in AutoCAD - ein Entity-Typ namens VLO-VL! Es ist auch kein 'echtes' Entity, sondern ein von VLISP kreiertes und benutztes CUSTOM ENTITY. Deshalb treten/traten bei Zeichnungen mit LDATA auch mal Proxy-Meldungen auf. Und für Custom Entities kann's natürlich keine ActiveX-Methoden geben. Gruß, Axel Strube-Zettler ------------------ (defun - Lisp over night - AutoLisp-Programmierung für AutoCad - Da weiß man, wann man's hat Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hendersson Mitglied GeoInformatiker
Beiträge: 27 Registriert: 12.08.2004
|
erstellt am: 31. Aug. 2004 10:35 <-- editieren / zitieren --> Unities abgeben:
...Mannomann, da hats Du es mir aber ganz schön gegeben. Ich hoffe, daß ich hier bald die Zeit für die Umsetzung Deiner Anregungen haben werde. Melde mich auf alle Fälle noch mal unter diesem Thread. Vielen Dank !!!! der hendersson ------------------ ---------------------------- .~. /V\ L I N U X /( )\ >Phear the Penguin< ^^-^^ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |