| |
| 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: Variable von .Net nach Lisp übergeben (1815 / mal gelesen)
|
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2017/2018 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 02. Sep. 2016 08:09 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen Zusammen, ich habe ein Lisp - Programm mit folgenden Variablen: Code:
(setq BlockPfad "NEWBLOCKPFAD") (setq BlockName "NEWBLOCKNAME")
Ich möchte/muss dieses Lispprogramm aus einer .Net Anwendung öffnen und suche die Möglichkeit, aus .Net diese Variablen zu füllen. Lisp - Programmaufruf wäre: Code:
Dim MyCommand As String = "(load ""C:/Testordner/Bloecke/Test_NET_LISP.lsp"")" app.ActiveDocument.SendCommand(MyCommand & "(C:TESTLISP) ")
Hintergrund: Das Lisp - Programm, welches ich ansprechen soll ist fester Bestandteil einer AutoCAD Applikationssoftware. Aus Unserer Blockverwaltung (.Net - Programm) filter ich den BLOCKPFAD und en BLOCKNAMEN. Diese benötige dann unter Lisp. Wäre super, wenn mir da jemand weiterhelfen könnte. Vielen Dank.
------------------ Gruß Dirk 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: 02. Sep. 2016 08:39 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
|
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Sep. 2016 08:44 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Wenn du eh schon Sendcommand nutzt, dann kannst du auch die Variablen darüber setzen, Lisp-Ausdrücke versteht die Befehlszeile direkt. (oder wird das häufig gestartet/Performace?) Ansonsten: Hast du den Quellcode? Dann ändere doch das Programm und verwende Users1&Users2 Variable, oder eine Umgebungsvariablen, die kannst du mit.Net sicher lesen und schreiben? Oder schreibe doch gleich einen Funktionsaufruf dem man beides Angaben direkt übergeben kann: (defun TESTLISP (BlockPfad BlockName) (alert (strcat BlockPfad BlockName)) ) app.ActiveDocument.SendCommand(MyCommand & "(TESTLISP "c:\" "MeinBlock") ") ; ja, die Zeile ist nicht ganz korrekt Ansonsten: Klick!
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2017/2018 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 02. Sep. 2016 16:25 <-- editieren / zitieren --> Unities abgeben:
Sorry, aber leider komme ich damit noch nicht klar. Hab nun so einiges ausprobiert, jedoch ohne Erfolg. Hier einmal der letzte Stand. In VB.NET:
Code:
'--Variablen Dim BLOCKPFAD As String = "N:/Konstruktion/" Dim BLOCKNAME As String = "STFJÄ+FR02-ECKWK-M10" '--Laden Lisp - Datei Dim MyCommand As String = "(load ""N:/Konstruktion/TESTLISP.lsp"")" '--Programmstart app.ActiveDocument.SendCommand(MyCommand & "(C:TEST_DB BLOCKPFAD BLOCKNAME) ")
In Lisp:
Code:
(defun C:TEST_DB (/ BLOCKPFAD BLOCKNAME) (alert (strcat BLOCKPFAD BLOCKNAME)) (print "\nDas Programm wurde erfolgreich geladen") (princ) )
Als Meldung bekomme ich: Befehl: (load "N:/Konstruktion/TESTLISP.lsp")(C:TEST_DB BLOCKPFAD BLOCKNAME) ***Error in load: Reason: Zu viele Argumente ------------------ Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
spider_dd Mitglied
Beiträge: 1144 Registriert: 27.11.2003 Win 10Pro Intel(R) Core(TM) i7-7700 NVIDIA Quadro P1000 ACAD, Civil-3D 2018
|
erstellt am: 02. Sep. 2016 16:37 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, lass mal das C: vor TEST_DB sowohl im Lisp als auch in .Net weg. Außerdem müssen die beiden Variablen in lisp (defun ...) als Parameter angelegt werden, also VOR dem / in ( / ...) So wie von cadffm schon gezeigt. HTH Gruß Thomas 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: 02. Sep. 2016 19:47 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
... der Umweg über eine extra Lispfunktion ist gar nicht nötig, da du ja lediglich die globalen Lisp-Variablen setzen willst. Darum genügt es doch wenn du einfach die zwei von dir geposteten Lispzeilen (setq ...)(setq ...) an erster Stelle deines SendCommands einfügst - natürlich mit den .Net- Variablenwerten in der korrekten Lisp-Syntax. 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 |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2017/2018 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 04. Sep. 2016 19:20 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen! Vielen Dank für die Infos. Ich hab nun so einiges ausprobiert, aber leider ohne Erfolg. @Holger Die beiden (setq ..) direkt ansprechen bzw. übergeben ok, aber wie? Wie ich die *.lsp lade und starte habe ich ja bereits beschrieben. Wie übergebe ich denn die Variablen? Die gehören ja eigentlich in die Syntax des Programmstarts, oder nicht? ------------------ Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 04. Sep. 2016 19:45 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
|
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 04. Sep. 2016 19:53 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, meines Erachtens hast Du einen Fehler im VB.NET Programm Code:
'--Programmstart ' falsch : app.ActiveDocument.SendCommand(MyCommand & "(C:TEST_DB BLOCKPFAD BLOCKNAME) ") app.ActiveDocument.SendCommand (MyCommand) ' hier wird das Programm geladen app.ActiveDocument.SendCommand ("TEST_DB " & BLOCKPFAD & " " & BLOCKNAME ) ' hier wird es aufgerufen ' evtl. besser wenn pfad oder Name auch Leerzeichen enthalten: ' app.ActiveDocument.SendCommand ("TEST_DB " & chr(34) & BLOCKPFAD & chr(34) & " " & chr(34) & BLOCKNAME & chr(34)) ' hier wird es aufgerufen
Ansonsten wird nicht der Inhalt der Variablen übergeben sondern nur der Variablenname, Grüße Klaus PS.: ungetestet, habe gerade kein Acad griffbereit, sollte aber so passen ... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 04. Sep. 2016 21:39 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Dirk, wir gingen die ganze Zeit davon aus das du dich etwas mit Lisp auskennst, dem ist wohl nicht so. In meiner Antwort oben ist bereits eine mögliche Lösung. Nun versuchen wir es noch mal (falls ich richtig liegen sollte): Hier die Änderung für den Fall das es auch noch wie bisher laufen soll: Bisher: (defun c:test (/ vieleichtsteht hier was) (setq Blockname ..) (setq Blockpfas ..) Und vieles mehr ) nehme die beiden setq-Zeilen raus und die erste Zeile bist du um: (defun test (Blockname Blockpfad / vielleichtstehthierwas) Nun kannst du das Programm SO aufrufen: (testfunk "meinblock" "c:/meinpfad/") SO muss es als String in Acad ankommen, aber du kannst es auch so direkt in Acad testen, wie erwähnt kapiert die Befehlszeile Lispausdrücke nämlich direkt! Willst du es zusätzlich wie gewohnt aufrufen definierst du zusätzlich einen Autocadbefehlsaufruf:
(defun c:test () (testfunk "meinBlock" "c:/meinpfad/") )
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD 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: 05. Sep. 2016 08:17 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
... jetzt etwas ausführlicher, da ich die Antwort nun nicht mehr am Handy tippe. Auf deinen ersten Post Bezug nehmend, sollte das nach deinen Angaben wie folgt genügen:
Code:
Dim MyCommand As String = "(load ""C:/Testordner/Bloecke/Test_NET_LISP.lsp"")"
app.ActiveDocument.SendCommand("(setq BlockPfad \"" + NEWBLOCKPFAD + "\") ") app.ActiveDocument.SendCommand("(setq BlockName \"" + NEWBLOCKNAME + "\") ")
app.ActiveDocument.SendCommand(MyCommand & "(C:TESTLISP) ")
Das ist zwar meiner Meinung nach nicht sauber, da die beiden Lispvariablen dann global belegt sind, aber es ist die einfachste Möglichkeit. Aus meiner Sicht gibt es aber verschiedene Möglichkeiten. Die sauber wären. Was du davon nutzt ist abhängig von deinen persönlichen Vorlieben bzw. Kenntnissen in den jeweiligen Programmiersprachen. (1) == cadffm's Vorschlag: Ein Lisp Funktion definieren, die beide Variablen als Funktionsparameter enthält. (2) in .Net eine Lisp-Funktion definieren, die du aus deiner Lisp aufrufst. Die Rückgabe dieser in .Net definierten Lisp-Funktion sind dann die 2 Werte. (3) gänzlich auf Lisp zu verzichten, und die Funktion in .Net abbilden. (aber nur, wenn du dich in .Net auskennst und der Umfang der womöglich bestehenden Lisp nicht zu groß ist). 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 |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2017/2018 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 05. Sep. 2016 17:01 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen! Erst einmal vielen Dank für eure Geduld und Unterstüzung. Nun funktioniert es testweise wie folgt: VB-Net:
Code:
'... BLOCKNAME = BLOCKNAME & ".dwg" BLOCKPFAD = Replace(Microsoft.VisualBasic.Left(BLOCKPFAD, Len(BLOCKPFAD) - Len(BLOCKNAME)), "\", "/") '... Dim MyCommand As String = "(load ""N:/Konstruktion/TESTLISP.lsp"")" app.ActiveDocument.SendCommand(MyCommand & "(TESTDB " & Chr(34) & BLOCKPFAD & Chr(34) & " " & Chr(34) & BLOCKNAME & Chr(34) & ") ") '...
Testtool in Lisp:
Code:
(defun TESTDB (BLOCKPFAD BLOCKNAME) (alert (strcat BLOCKPFAD BLOCKNAME)) (print "Das Programm wurde erfolgreich geladen") (princ) )
------------------ Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 05. Sep. 2016 17:53 <-- editieren / zitieren --> Unities abgeben: Nur für Dirk.B
Hallo Dirk, schön wenn es geholfen hat. Bitte vergesse nicht den Erledigt-Haken zu setzen wenn keine Fragen mehr offen sind. Allerdings muß ich schon noch einmal nachfragen warum Du die beiden Befehle unbedingt in einem Sendcommand packen willst. Es sollte doch reichen wenn die lsp einmal geladen wurde ... Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Dirk.B Mitglied Tischler / Leiter Arbeitsvorbereitung
Beiträge: 534 Registriert: 25.11.2003 AutoCAD 2017/2018 CAD+T HP ZBook 15 G4, 64-bit, WIN 10 Pro
|
erstellt am: 05. Sep. 2016 20:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus! Hintergrund dieser Aktion ist folgende. Ich habe für unser Unternehmen unter VB.NET eine Anbindung als Blockverwaltung zwischen unserer Branchensoftware und AutoCAD programmiert. Diese funktioniert auch prima. Nun soll bei uns ein Aufsatztool auf AutoCAD installiert werden in dem vieles noch unter Lisp programmiert ist. Unsere User wollen aber auf unser Tool Blockverwaltung nicht verzichten, daher der Umstand bzw. Lösungsansatz. Mit eurer Hilfe aus dem Forum konnte ich nun meinen Teil erledigen und die Schnittstelle bilden. Nochmals vielen Dank an alle. ------------------ Gruß Dirk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |