| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Lisp aus Delphi starten (1763 mal gelesen)
|
mundal Mitglied Techniker
Beiträge: 320 Registriert: 14.02.2005
|
erstellt am: 13. Mai. 2008 09:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, 2 für mich wichtige Fragen: 1.) wie wird ein LISP Programm aus Delphi heraus gestartet. 2.) Wie wird ein AuroCAD-VBA aus Delphi heraus angestossen. Hat mir jemand Programmbeispiele. Danke für Eure Hilfe Joachim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 13. Mai. 2008 10:45 <-- editieren / zitieren --> Unities abgeben: Nur für mundal
Hm. Delphi. Schwierige Frage. Delphi verwendet meines Wissens nach lediglich die COM-Schnittstelle von Autocad. Da gibts es nicht wirklich viele Möglichkeiten. Die einzige Möglichkeit die mir einfällt wäre über die SendCommand Methode des Drawing Objektes in VBA würde es so ausschauen ThisDrawing.SendCommand ("(MeineLisp)" & vbCr)
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC 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: 13. Mai. 2008 14:06 <-- editieren / zitieren --> Unities abgeben: Nur für mundal
Hallo Joachim, es kommt darauf an, was du mit dem Delphi-Code machst. Willst du einen Script(Batch)lauf über viele Zeichnungen realisieren, dann könnte die Erzeugung einer acaddoc.lsp(im Zeichnungsverzeichnis) helfen. Diese Datei weird automatisch nach dem Öffnen geladen. Wenn in dieser der Lisp-Aufruf steht, startet das Programm also ganz allein. Den VBA-Code kannst du mit _vbarun starten - im Zweifel auch wieder über SendCommand. Bei Fragen ... Grüße Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mundal Mitglied Techniker
Beiträge: 320 Registriert: 14.02.2005
|
erstellt am: 13. Mai. 2008 14:25 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, Danke für Deine prompte Hilfe. Kannst Du mir eine Beispieldatei senden? Ich sollte ein kleines Delphiprogramm haben das sich problemlos compilieren und starten lässt. Das Programm soll nur AutoCAD starten, eine Zeichnung laden und in diese Zeichnung einen Kreis mit beliebeigem Radius an beliebigem Punkt zeichnet. Den Rest bekomme ich dann bestimmt alleine gebacken. Gruss Joachim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 15. Mai. 2008 10:48 <-- editieren / zitieren --> Unities abgeben: Nur für mundal
hallo mundal, fuer lisp so in der art: procedure xxx; var path, lsp: string; acad: IAcadApplication; doc: IAcadDocument; begin path:= ExtractFilePath(Application.ExeName); path:= StringReplace(path, '\', '\\', [rfReplaceAll, rfIgnoreCase]); lsp:= path + 'lispfile.lsp'; acad:= GetAcadApplication(True); doc:= acad.ActiveDocument; doc.SetVariable('CMDECHO', 0); beispiel fuer setzen einer sys-var doc.SendCommand(chr(VK_ESCAPE) + chr(VK_ESCAPE) + '(load "' + lsp + '")' + chr(VK_RETURN)); // laden der lisp-datei doc.SendCommand('(lispfunc)' + chr(VK_RETURN)); // ausfuehren einer funktion aus der lisp-datei end; function GetAcadApplication(start: Boolean): IAcadApplication; var acad: OleVariant; begin Result:= nil; try acad:= GetActiveOleObject(AcadApp); Result:= IDispatch(acad) as IAcadApplication; except if start then begin Result:= CoAcadApplication.Create; Result.Visible:= True; end; end; end; gruss marco
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mundal Mitglied Techniker
Beiträge: 320 Registriert: 14.02.2005
|
erstellt am: 15. Mai. 2008 13:00 <-- editieren / zitieren --> Unities abgeben:
Klasse + Danke @Marco, das war genau das was ich benötigte. Jetzt komme ich bestimmt gut voran. !!! Nochmals 1000 x Danke !!!! Ich hatte in der Programmzeile acad:= GetActiveOleObject(AcadApp); das AcadApp in Acad umgewandelt dann lief das Programm. Ist das dann soweit ok ? Falls Du weitere Beispielprogramme von Delphi und AutoCAD hast dann wäre ich ein dankbarer Abnehmer. Viele Grüße
Joachim
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 15. Mai. 2008 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für mundal
da hab ich doch wirklich eine konstantendeklaration uebersehen AcadApp = 'AutoCAD.Application.15'; fuer 2000-2002 AcadApp = 'AutoCAD.Application.16'; fuer 2004-2006 AcadApp = 'AutoCAD.Application.17'; fuer 2007-2008 ------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 16. Mai. 2008 02:32 <-- editieren / zitieren --> Unities abgeben: Nur für mundal
|
HPW Mitglied Holz-Techniker
Beiträge: 80 Registriert: 11.01.2005 Dell Precision T3610 Autocad 2016
|
erstellt am: 19. Mai. 2008 09:49 <-- editieren / zitieren --> Unities abgeben: Nur für mundal
Hallo, Interessante Funktion! Dazu eine Frage: Was ist wenn es mehrere Autocad-Sitzungen gibt? Welche wird genommen? Eindeutigkeit? Ich habe in der Vergangenheit dann über die WIN-API mit dem eindeutigen Fenster-Titel-String mir das Fenster-Handle geholt und per Sendkeys den Lisp-Callback gestartet. (Fenster-Titel wurde beim Delphi-Start als Kommando-Zeilenparameter übergeben).
------------------ Hans-Peter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
neurosis Mitglied dipl.ing.
Beiträge: 224 Registriert: 22.08.2006
|
erstellt am: 19. Mai. 2008 11:44 <-- editieren / zitieren --> Unities abgeben: Nur für mundal
ich selber verwende delphi nur fuer die konfiguration meiner programme in autocad nach der installation (aufruf einer lisp-datei, um supportpfade zu setzen und menues/toolbars dynamisch zu erzeugen). ueber die entsprechenden tlb-dateien werden die unterschiedlichen produktzyklen von autocad (2000-2002, 2004-2006, 2007-2008) angesprochen. innerhalb eines zyklus' kommt es drauf an, welche version zuletzt gestartet wurde (d.h. wenn kein autocad offen ist, wird das zuletzt gestartete vom entsprechenden zyklus verwendet -> standardvorgehen dieses code-fragments). fuer jeden zyklus wuerde man also eine eigene .exe erzeugen. dies laesst sich natuerlich beim kompilieren automatisieren. wenn du eine bestimmte offene programminstanz (z.b. bei 2 gestarteten autocad2006) ueber eine .exe ansprechen moechtest, wirst du nicht ohne die win-api und das fenster-handle (zu bekommen z.b. [wie beschrieben] ueber angabe des titels) auskommen. gruss marco ------------------ Marco Heuer www.arc-aachen.de Airport Office Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |