| |
| 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 – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Arbeitsweise VBA VLISP (1951 mal gelesen)
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 31. Aug. 2004 16:25 <-- editieren / zitieren --> Unities abgeben:
Mal am Rande... VBA und VLisp greift doch auf die gleichen ActiveX-Routinen zu ? - Oder nicht ganz? Warum wird z.B: bei (command "vbastmt") (strcat"AcadApplication.Documents.Open" .... die geöffnete Zeicnhung gleich aktiviert? Und warum muß ich bei (vla-open(vla-get-documents(vlax-get-acad-object) NAME ..)) ein vla-activate für den gleichen Effekt hinterherschicken?
------------------ - Thomas - Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 31. Aug. 2004 21:02 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
|
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator
Beiträge: 2494 Registriert: 02.11.2001 Windows 10 64bit AutoCAD Architecture 2018/2019 (deu/eng) AEC-Collection 2019 (Revit und Zeugs) Wenn sich's nicht vermeiden läßt: D-A-CH Erweiterung (mies implementierter Schrott)
|
erstellt am: 31. Aug. 2004 21:40 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
|
CADchup Ehrenmitglied V.I.P. h.c.
Beiträge: 3336 Registriert: 14.03.2001 Sicher ist, dass nichts sicher ist. Selbst das nicht. Joachim Ringelnatz
|
erstellt am: 31. Aug. 2004 22:02 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 31. Aug. 2004 23:41 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 01. Sep. 2004 08:18 <-- editieren / zitieren --> Unities abgeben:
Mhmm, soll ich jetzt je 1 U für den Inhalt oder 10 für die Originalität der Antworten verteilen. Danke zumindest allen für die Lesebestätigung! Auf alle Fälle fühle ich mich jetzt nicht mehr so "allein" mit meinem "Problem"! ------------------ - Thomas - Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 01. Sep. 2004 10:28 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
Tag zusammen. Nach einigen Wochen der Abstinenz melde ich mich mal wieder zu Wort. Allerdings bin ich nicht letztlich sicher, denke aber, dass die Unterschiede im Verhalten auf den 'Ausführungs-Kontext' (nameSpace) der Programme zurück zu führen sind: VLisp-Programme laufen immer im Namensraum der Zeichnung, in der sie geladen wurden - mir ist kein Weg bekannt, wie diese Grenze zu überwinden ist (außer vielleicht mit dynamischen AutoLoads). Ist aber eine weitere Zeichnung geöffnet worden, dann kann VLisp seinen Ausführungs-Kontext nicht dorthin verlagern, ergo wird das (vermutlich) implizite Aktivieren der geöffneten Zeichnung verpuffen. Wie nun im VBA-Environment ausschaut kann ich nicht sagen, aber wenn dort die Möglichkeit besteht (liegt bei der Beschreibung des Sachverhalts nahe) Programme über Zeichnungs-Grenzen hinaus zu bearbeiten, das Programm also im Namensraum der Applikation läuft, ist das ein stichhaltiges Indiz für die unterschiedlichen Verhaltensweisen der APIs. Achim Dabrunz [Diese Nachricht wurde von Dabrunz am 01. Sep. 2004 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: 01. Sep. 2004 10:35 <-- editieren / zitieren --> Unities abgeben:
|
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 01. Sep. 2004 11:28 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 01. Sep. 2004 11:33 <-- editieren / zitieren --> Unities abgeben:
|
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 01. Sep. 2004 13:53 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
Hi Achim, für mich ist dein Beitrag zwar eine schöne, ausführliche Umschreibung der Frage, aber noch keine Antwort... Warum sollte bei Ausführung einer ActiveX-Methode etwas 'verpuffen'? Diese Methoden werden doch von AutoCAD ausgeführt, nicht von Lisp! Lisp greift auf die gleichen Mechanismen zu wie VBA oder jeder andere ActiveX-Client. Der ActiveX-Server (AutoCAD) weiss ja nicht mal, welcher Client die Methoden ausführt, oder irre ich da? Wie kann da also ein unterschiedliches Verhalten von AutoCAD (nicht AutoLisp!) zustandekommen? Letztendlich ist Cadmiums Frage genau die selbe Frage, die hier kürzlich gestellt wurde: Warum kann man mit Lisp nicht das letzte Dokument schließen (es geht nur, wenn man aus Lisp heraus ein entspr. VBA-Statement absetzt)? Eine Vermutung wäre, dass diese Unterschiede in (vl-load-com) begründet liegen. Könnte es sein, dass da Sachen verbogen werden? Dann müsste man mal untersuchen, ob das Verhalten immer noch so ist, wenn man auf (vl-load-com) verzichtet und stattdessen (vlax-import-type-library) benutzt. Eigentlich sollte, wenn man als Präfix überall vla- verwendet, exakt das gleiche Bild entstehen. Das jetzt zu untersuchen, ist mir aber etwas zu viel heute... Eine andere Vermutung wäre, dass die entspr. ActiveX-Methoden in AutoCAD grundsätzlich prüfen, ob im Moment der Ausführung ein Lisp-Programm aktiv ist - wenn ja, wird nicht aktiviert bzw. geschlossen. Heisst: es wird zwar ein neues Dokument geöffnet, aber nicht aktiviert, weil Lisp aktiv ist, und beim Schließen genauso. Das liesse sich verifizieren, indem man von außen drangeht (VB ohne A z.B.). In die zweite Richtung gehen auch folgende Überlegungen: Inwieweit benutzt AutoCAD selbst den SendCommand-Mechanismus? Dazu ein Denkanstoß: Man mache eine Zeichnung auf und lasse dann Lisp ein bisschen 'hängen', z.B. indem man (read-char) o.ä. eingibt. Damit ist Lisp aktiv, ohne groß Strom zu verbrauchen (bei (while 1) wird's ätzend, da liegt die CPU sofort bei 100%). Wenn man jetzt auf Datei->Neu klickt, wird Lisp gecancelt. Aktiviert man aber im Fenster-Menü ein anderes Dokument, läuft (read-char) im anderen Fenster weiter, Lisp bleibt also aktiv (Damit ist der übrigens auch der Beweis erbracht, dass man (theoretisch) durchaus mehrere Lisp-Programme gleichzeitig in Acad laufen lassen kann, aber das tut hier nix zur Sache). Mir kam's hier mehr auf den Ansatz an, dass dieser Fensterwechsel (== vla-activate) eben nichts ist, was man mit SendCommand in irgendeiner Form erschlagen könnte. Wenn ich mal viel Zeit habe, probiere ich das alles aus;-) Gruß, Axel
------------------ (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 |
Dabrunz Mitglied
Beiträge: 127 Registriert: 28.05.2003
|
erstellt am: 01. Sep. 2004 16:39 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
Zitat:
Warum sollte bei Ausführung einer ActiveX-Methode etwas 'verpuffen'? Diese Methoden werden doch von AutoCAD ausgeführt, nicht von Lisp! [..]
Wie ich bereits sagte, bin ich nicht sicher, wenn alle Aktionen vollständig innerhalb des Application-Servers laufen, dann kann ein Wechsel des Zeichnungs-Kontexts keine Auswirkungen auf die Aktivierung der neuen Zeichnung haben. Nun hat sie aber doch! Sieht für mich so aus, als ob da eine Referenz ins Nirvana zeigt - ist aber spekulativ - zugegeben. Zitat:
Eine Vermutung wäre, dass diese Unterschiede in (vl-load-com) begründet liegen. Könnte es sein, dass da Sachen verbogen werden? Dann müsste man mal untersuchen, ob das Verhalten immer noch so ist, wenn man auf (vl-load-com) verzichtet und stattdessen (vlax-import-type-library) benutzt. [..]
Dann doch gleich ganz zu Fuß mit vlax-invoke[-method] oder vlax-get-property, da braucht's gleich gar keinen Import. Das hier ohne vl-load-com: Code:
(vlax-invoke-method (vlax-get-property(vlax-get-acad-object)'Documents) 'open "s:\\test\\polyline.dwg" )
Da passiert auch nix von wegen Umschalten - daran liegt's wohl nicht. Zitat:
Eine andere Vermutung wäre, dass die entspr. ActiveX-Methoden in AutoCAD grundsätzlich prüfen, ob im Moment der Ausführung ein Lisp-Programm aktiv ist - wenn ja, wird nicht aktiviert bzw. geschlossen. Heisst: es wird zwar ein neues Dokument geöffnet, aber nicht aktiviert, weil Lisp aktiv ist, und beim Schließen genauso. Das liesse sich verifizieren, indem man von außen drangeht (VB ohne A z.B.).
Das ist eigendlich eine prima Idee, aber warum funktioniert dann der (command "vbastmt"-Kram, wo doch Lisp ganz sicher aktiv ist? Zitat:
In die zweite Richtung gehen auch folgende Überlegungen: Inwieweit benutzt AutoCAD selbst den SendCommand-Mechanismus? Dazu ein Denkanstoß: Man mache eine Zeichnung auf und lasse dann Lisp ein bisschen 'hängen', z.B. indem man (read-char) o.ä. eingibt. Damit ist Lisp aktiv, ohne groß Strom zu verbrauchen (bei (while 1) wird's ätzend, da liegt die CPU sofort bei 100%). Wenn man jetzt auf Datei->Neu klickt, wird Lisp gecancelt. Aktiviert man aber im Fenster-Menü ein anderes Dokument, läuft (read-char) im anderen Fenster weiter, Lisp bleibt also aktiv [..]. Mir kam's hier mehr auf den Ansatz an, dass dieser Fensterwechsel (== vla-activate) eben nichts ist, was man mit SendCommand in irgendeiner Form erschlagen könnte.
Das verstehe ich nicht, denn schließlich wird auch jeder AutoCAD-Befehl abgebrochen, wenn Datei->Neu aufgerufen wird. Was ist hier die Quintessenz? Alternativ gibt's auch noch diverse Ungereimtheiten der ActivX-Inplementierung im VLisp (siehe auch ActiveX: Layer-Erzeugung erzeugt Access Violation) und die sind natürlich für die mögliche Erklärung solcher Fänomene immer gut ... Achim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Time flies like an arrow, fruit flies like a banana (Groucho Marx)
|
erstellt am: 02. Sep. 2004 01:47 <-- editieren / zitieren --> Unities abgeben: Nur für CADmium
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 03. Okt. 2004 21:30 <-- editieren / zitieren --> Unities abgeben:
Nochwas zum Thema: (vl-catch-all-apply 'vla-open (if (=(getvar "SDI")1) (list (vla-get-Activedocument(vlax-get-acad-object)) NAME ) (list (vla-get-documents(vlax-get-acad-object)) NAME (if Writeprotected? :vlax-true :vlax-false) nil ) ) ) funktioniert bei im SDI-Modus (1) nicht! (Fehlermeldung : Methode im SDI-Modus nicht verfügbar) die VBA-Variante schon : (vl-catch-all-apply 'vla-sendcommand (list (vla-get-activedocument (vlax-get-acad-object) ) (if (/=(getvar"SDI")1) (strcat "vbastmt " "AcadApplication.Documents.OPEN" (chr 34)NAME(chr 34) (if Writeprotected? ", TRUE" ", FALSE" ) (chr 13) ) (strcat "vbastmt " "AcadApplication.ActiveDocument.OPEN" (chr 34)NAME(chr 34) (chr 13) ) ) ) ) Einer ne Ahnung warum, oder hab ich heut Tomaten auf den Augen? ------------------ - Thomas - "Bei 99% aller Problemen 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 |