Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Dictionaries in VBA auslesen ... Rätsel

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von hendersson an!   Senden Sie eine Private Message an hendersson  Schreiben Sie einen Gästebucheintrag für hendersson

Beiträge: 27
Registriert: 12.08.2004

erstellt am: 26. Aug. 2004 15:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für hendersson 10 Unities + Antwort hilfreich

Hi hendersson,

geht's jetzt wirklich nur drum, eine Variable aus dem Lisp-Speicher auszulesen? Kein Problem. Blätter ein bisschen weiter runter zu dem Thread von tappenbeck betr. vlax-curve-getpointatdist.

Da habe ich beschrieben, wie man an das VLAX-Klassenmodul von Frank Oquendo kommt. Mit dieser Klasse und ihren Methoden ist es möglich, Lisp-Ausdrücke aus VBA heraus zu evaluieren.

Aber was hat das jetzt mit den Dictionaries zu tun?

Gruß, Axel Strube-Zettler

------------------

Meine AutoLisp-Seiten
Meine private Homepage
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


Sehen Sie sich das Profil von hendersson an!   Senden Sie eine Private Message an hendersson  Schreiben Sie einen Gästebucheintrag für hendersson

Beiträge: 27
Registriert: 12.08.2004

erstellt am: 30. Aug. 2004 09:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für hendersson 10 Unities + Antwort hilfreich

Es spielt doch keine Rolle, ob ein Dict mit Lisp angelegt wurde. Mit ThisDrawing.ActiveDocument.Dictionaries("<Name>") bist du dabei.

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


Sehen Sie sich das Profil von hendersson an!   Senden Sie eine Private Message an hendersson  Schreiben Sie einen Gästebucheintrag für hendersson

Beiträge: 27
Registriert: 12.08.2004

erstellt am: 30. Aug. 2004 10:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

...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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für hendersson 10 Unities + Antwort hilfreich

Vielleicht steht gar nix drin? Da ist es doch ein Riesenaufwand, sich ein VBA-Programm zu schreiben, das Lisp aufruft, um mal rein zu schauen. Das kannst du dann über Lisp selbst einfacher haben. Oder die Zeichnung mal als DXF speichern und anschauen...

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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für hendersson 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für hendersson 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von hendersson an!   Senden Sie eine Private Message an hendersson  Schreiben Sie einen Gästebucheintrag für hendersson

Beiträge: 27
Registriert: 12.08.2004

erstellt am: 31. Aug. 2004 10:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

...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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz