Zurück zur HomepageZurück zu DokumenteHier sind Sie gerade
LT-Applikationen


Wie funktionieren eigentlich LT-Applikationen?

VG-Wort Access-ZählmarkeInzwischen gibt es eine ganze Reihe von Anbietern, die LT-basierende Lösungen für die mechanische Konstruktion, für das Architekturwesen oder ganz einfach zum schnelleren Zeichnen anbieten. Die Vielzahl von LT-Applikationen läßt den unbedarften Anwender zunächst erstaunen. Schließlich wird LT von Autodesk als das AutoCAD vermarktet, daß eben nicht programmierbar ist. Und betrachtet man AutoCAD LT für Windows 95/97/98 im Vergleich zu Release 13/14, so ist LT nichts anderes als ein Release 13/14 ohne die Programmierschnittstellen und die auf diesen Schnittstellen aufbauenden Zusatzbefehle.

Viele Leser haben uns deshalb gefragt, wie es möglich ist, LT trotz der fehlenden Programmierschnittstellen zu programmieren. Muß man dazu eine Geheimwissenschaft studieren, den Programmcode knacken oder Autodesk-Mitarbeiter bestechen? Keins von alledem. Es gibt eine ganze Reihe von Möglichkeiten, jedes x-beliebige Windows-Programm extern zu "programmieren". Einige dieser Tricks sind relativ einfach, und wir wollen sie in diesem Artikel einmal vorstellen.

Zwei wichtige Voraussetzungen

Die Programmierung von AutoCAD LT basiert auf zwei ganz einfachen Überlegungen:

1. Windows (egal ob NT, 95 oder 3.1) ist ein Multitasking-Betriebssystem.

Dies bedeutet, daß im Speicher mehrere voneinander unabhängige Programme aktiv sein können. Den einzelnen Programmen wird entweder vom Betriebssystem nach und nach Rechenzeit zugewiesen oder sie warten einfach auf ein Signal von außen, z.B. einen Mausklick.

2. Jedes Windows-Programm benutzt vorgegebene Schnittstellen.

Das Betriebssystem Windows definiert die Kanäle, über die ein Programm mit der Außenwelt kommuniziert. Eingaben erhält das Programm niemals direkt von der Tastatur oder der Maus, sondern immer über das Betriebssystem, Ausgaben gehen niemals direkt an den Bildschirm oder Drucker, sondern ebenfalls nur über das Betriebssystem.

Daraus folgt, daß Windows-Programme im Prinzip ziemlich dumm sind: Sie können nämlich gar nicht unterscheiden, ob eine Eingabe von der Tastatur stammt oder auf anderem Weg in den Eingabekanal gelangt ist. Dies schließlich erlaubt uns, mit einem parallel laufenden, zweiten Programm die Tastatureingaben von AutoCAD LT zu simulieren.

Das steuernde Programm

Praktisch jede Applikation für das "große" AutoCAD arbeitet zum Teil intern im Speicher des AutoCAD-Programms, egal ob sie über AutoLISP, ADS oder ARX implementiert wurde.

Umgekehrt arbeitet praktisch jede LT-Applikation völlig unabhängig von AutoCAD als separates Programm. Dieses externe Programm simuliert Tastatureingaben. AutoCAD LT hält diese Simulation für echte Tastendrücke und wird quasi ferngesteuert. Einige LT-Applikationen simulieren auch die Mauseingaben, das Prinzip dabei ist exakt dasselbe.

Kommerzielle LT-Applikationen bestehen zumeist aus einem unabhängigen, in C, Delphi oder Visual Basic geschriebenen Steuerprogramm. Es ist in Form eines Werkzeugkastens oder eines Dialogprogramms parallel zu AutoCAD auf dem Bildschirm sichtbar. Dieses Steuerprogramm liefert die Tastendrücke, die im Hintergrund an AutoCAD übergeben werden.

WinWord tut’s auch

Allerdings brauchen Sie jetzt nicht irgendein teures Entwicklungssystem zu kaufen, nur um auszuprobieren, ob sich Ihre LT-Anwendungen auch automatisieren lassen. Jedes Windows-Programm mit einfacher Programmiermöglichkeit tut’s auch. So lassen sich Datenbanken in Access oder Paradox pflegen und in LT grafisch darstellen. Komplizierte Optimierungen lassen sich in Excel erledigen und dann in LT zeichnen.

Für die folgenden Beispiele verwenden wir Word für Windows 6.0, das wohl allen Lesern ein Begriff sein wird. Sie können die Anweisungen sehr einfach auf jedes andere Programm mit einer Makrosprache übertragen.

Programmierung in der WinWord-Makrosprache ist sehr einfach. Öffnen Sie in WinWord den Makroeditor und schreiben Sie beispielsweise folgende Zeile zwischen "Sub MAIN" und "End Sub":

Shell "c:\aclt95\aclt.exe", 1

Ersetzen Sie dabei die Pfadangabe durch das Installationsverzeichnis von AutoCAD LT. Führen Sie das Makro aus. AutoCAD LT wird automatisch gestartet! Nun sind WinWord und AutoCAD LT als zwei gleichberechtigte Programme geladen.

"Shell" ist ein Befehl aus der Makrosprache von WinWord. Möchten Sie mehr zu diesem Befehl und seinen Parametern wissen, so setzen Sie einfach den Cursor auf das Wort und drücken die Taste F1.

AutoCAD LT fernsteuern

Die allereinfachste Variante einer LT-Applikation ist es, AutoCAD LT Tastendruck für Tastendruck fernzusteuern. Dazu brauchen wir nur zwei weitere Makrobefehle aus WinWord: "AnwAktivieren" und "SendKeys".

"AnwAktivieren" aktiviert eine andere Anwendung, z.B. AutoCAD LT. Dies sorgt dafür, daß alle nun folgenden Tastatureingaben nicht bei WinWord landen, sondern in der angegebenen Anwendung.

"SendKeys" schließlich übergibt die mitgegebenen Zeichen an die gerade aktive Anwendung, hier also AutoCAD LT. In WinWord-Makros werden Spezialtasten wie {Esc} oder {Eingabe} durch Klammern eingeschlossen. In anderen Makrosprachen werden Sie eine andere Syntax finden.

Betrachten Sie das Listing 1, um ein einfaches Beispiel dieser Fernsteuerung zu sehen. Das gezeigte Makro zeichnet in AutoCAD LT ein Punktfeld aus ausgefüllten Ringen. Eckpunkt, Größe und Anzahl der Punkte können frei bestimmt werden.

Das Makro definiert zunächst ein Dialogfenster mit vier Eingabefeldern. Diese werden vorbelegt. Dann wird das Dialogfenster auf dem Bildschirm gezeigt und gefüllt (siehe Bild 1).

Aus der eingegebenen Punktgröße berechnen wir den Punktabstand. Zum Wandeln zwischen Zeichenfolgen und Zahlen sind hier einige komplizierte Aufrufe notwendig. Ansonsten wurde aus Gründen der Übersichtlichkeit auf jede Fehlerprüfung verzichtet.

Als nächstes setzen wir die beiden nötigen AutoCAD-Befehle zusammen. Der Befehl _DONUT (RING) zeichnet den ersten Punkt an die angegebene Eckposition. Der Innendurchmesser ist null, der Außendurchmesser wird aus dem Dialogfenster übernommen. Der Befehl _ARRAY (REIHE) vervielfältigt den Punkt anschließend.

Die letzten Zeilen stellen die eigentliche Fernsteuerung von AutoCAD dar: Zunächst wird die Anwendung aktiviert, dann drücken wir mehrmals auf {Esc}, um einen eventuell aktiven Befehl zu beenden. (Anwender älterer LT-Versionen müssen hier die Zeichenfolge "^C" verwenden.)

In den darauffolgenden Zeilen schicken wir erst den Ring-Befehl, dann den Reihe-Befehl an AutoCAD. Zwischendurch drücken wir noch einmal auf {Esc}, um den Befehl _DONUT abzubrechen. Bild 1 zeigt das Ergebnis in AutoCAD LT.

Informationen aus AutoCAD LT

Damit haben wir gezeigt, wie man Daten in AutoCAD LT hinein bekommt. Dies ist nützlich, wenn parametrische Zeichnungen automatisch erstellt werden sollen. Für andere Applikationen ist es wichtig, Daten aus AutoCAD LT heraus zu bekommen.

Da wir nicht in den internen Speicher von AutoCAD LT schauen können (wie es im "großen" AutoCAD möglich ist), müssen wir LT überreden, die für uns interessanten Daten in eine externe Datei zu schreiben. Diese Datei können wir dann von unserem Steuerprogramm analysieren lassen.

AutoCAD LT bietet drei Befehle, die interne Daten in eine externe Datei schreiben, so daß sie relativ leicht auszuwerten sind: _ATTEXT, _DXFOUT und _LOGFILEON.

_ATTEXT arbeitet nur mit Attributwerten, wird deshalb nur selten verwendet. _DXFOUT schreibt alle Informationen über Zeichnungsobjekte in eine externe Datei. Dabei kann _DXFOUT wahlweise die gesamte Zeichnung, einzelne Objektgruppen oder auch nur ein einzelnes Objekt protokollieren.

Der nützlichste Befehl in diesem Zusammenhang heißt _LOGFILEON. AutoCAD protokolliert bekanntlich jede Eingabe und Ausgabe in die Befehlszeile und in das Befehlsfenster. Ist die Logdatei aktiv, so landen diese Daten zusätzlich auch noch in der Datei aclt.log im LT-Verzeichnis.

Da AutoCAD praktisch alle Informationen im Befehlsfenster protokolliert, kann eine externe Applikation auf diesem Weg fast alle internen Informationen über den aktuellen AutoCAD-Zustand erfahren.

Listing 2 zeigt ein WinWord-Makro, das eine Liste aller Layer der aktuellen Zeichnung zusammenstellt. Es schickt zunächst den Befehl _LOGFILEOFF an AutoCAD, damit eine eventuell aktive Logdatei geschlossen und gelöscht werden kann. Dann wird die Logdatei erneut geöffnet, der Befehl _LAYER aufgerufen, alle Layer abgefragt und die Logdatei wieder geschlossen. Der Rest des Makros beschäftigt sich damit, die Logdatei sauber zu formatieren.

Interaktion mit AutoCAD LT

Die beiden grundlegenden Funktionen der LT-Programmierung haben wir nun kennengelernt. Wir können Informationen an AutoCAD LT senden und so beliebige Funktionen von AutoCAD fernsteuern. Und wir können grafische wie nichtgrafische Daten aus AutoCAD LT auslesen. Damit lassen sich schon viele interessante Applikationen realisieren.

Eine wichtige Anforderung ist aber noch nicht erfüllt: die direkte Interaktion zwischen unserem Steuerprogramm und AutoCAD. Wie schaffen wir es, ferngesteuert den Befehl _INSERT (EINFÜGE) aufzurufen, zu warten, bis der Anwender den Block plaziert hat, und danach automatisch die Attribute des Blocks zu füllen?

Wir können per Fernsteuerung den AutoCAD-Befehl aufrufen. Wir können auch anschließend warten und den Benutzer irgendwas mit AutoCAD machen lassen. Wir schaffen es mit den bisher vorgestellten Mitteln aber nicht, direkt nach der Eingabe des Benutzers unser Steuerprogramm fortzusetzen. Der Grund dafür ist einsichtig: da AutoCAD LT ja ein eigenständiges Programm ist, merkt unser Steuerprogramm gar nicht, daß und ob AutoCAD inzwischen eine Eingabe erhalten hat.

Wir haben zwei Probleme zu lösen:

  1. Wie steuern wir AutoCAD so fern, daß es eine Benutzeranfrage zuläßt und anschließend noch eine weitere Aktion ausführt?
  2. Wie synchronisieren wir unser Steuerprogramm mit der Benutzereingabe in AutoCAD LT, möglichst ohne den aktuellen AutoCAD-Befehl zu verlassen?

Umweg 1: Die Menüdatei

Bei der Programmierung im "großen" AutoCAD ist es einfach, an einer beliebigen Stelle des Programms eine Benutzereingabe anzufordern und anschließend das Programm fortzusetzen. In AutoCAD LT ist das Ganze viel schwieriger.

Schicken wir dem LT-Prozeß lediglich Tastatureingaben, haben wir keine Möglichkeit, eine Benutzereingabe anzufordern. Auch wenn wir eine Scriptdatei ausführen lassen, gibt es keine Möglichkeit zur Interaktion.

Erinnern wir uns deshalb an die letzte, in LT verbliebene Programmierschnittstelle: das Menü. Jeder Anwender (oder Programmierer) kann eigene Menüeinträge oder Werkzeuge programmieren. Menümakros werden wie Tastatureingaben Zeichen für Zeichen abgearbeitet.

Zusätzlich haben Menümakros aber eine nützliche Besonderheit, die wir für unsere Zwecke hervorragend verwenden können: Das Sonderzeichen "\" in einem Menümakro steht für eine Benutzereingabe. AutoCAD wartet nun, bis der Anwender per Maus oder Tastatur eine Antwort gegeben hat. Danach wird das Menümakro wieder Zeichen für Zeichen abgearbeitet.

Die typische Lösung aller LT-Applikationen ist deshalb ein Menümakro, das eine Benutzeranfrage ausführt und anschließend das Steuerprogramm darüber informiert, daß die Eingabe abgeschlossen ist.

Dieses Menümakro wird meist bei der Installation des Programms in die aktuelle Menüdatei integriert. Bei Bedarf wird es dann via Fernsteuerung aufgerufen. Für den ferngesteuerten Aufruf haben sich die Entwickler von LT-Applikationen mehrere Varianten ausgedacht. Üblicherweise trägt man das Makro in ein Pulldown-Menü ein und ruft dieses über Alt+XY auf. Alternativ gibt es auch das Makro im Knopfmenü der Maus, dann muß aber ein Systemprogramm einen Knopfdruck simulieren.

Unter AutoCAD LT für Windows 95/97/98 gibt es eine weitere, viel einfachere Möglichkeit. Hier bietet die Menüdatei auch Einträge für spezielle Tastenkombinationen. Im nachfolgenden Beispiel haben wir unser Eingabemakro einfach auf die Taste {Einfügen} gelegt, die wir über "SendKeys" aktivieren.

Umweg 2: Die Ini-Datei

Nach der Eingabe in AutoCAD LT muß unser Steuerprogramm geweckt werden, damit es die nächste Aktion auslösen kann. Zu diesem Zweck könnte man im Eingabemakro abschließend die Log-Datei schreiben oder eine DXF-Datei füllen.

Beides hat jedoch den Nachteil, daß ein eventuell begonnener und noch nicht abgeschlossener AutoCAD-Befehl abgebrochen wird. Beispielsweise können wir also nicht eine Polylinie beginnen, vom Anwender fortsetzen lassen und schließlich durch das Steuerprogramm schließen. Wir brauchen einen transparenten Befehl. Er muß eine Information in eine externe Datei schreiben, die unser Steuerprogramm als Fertigmeldung erkennen kann.

Freundlicherweise gibt es diesen Befehl in AutoCAD LT. Er heißt _SETENV und schreibt einen Eintrag in die Datei aclt.ini. Unser Eingabemakro wartet also auf eine Benutzereingabe, ist diese erfolgt, verändert es mit _SETENV einen Wert in aclt.ini.

Das Steuerprogramm muß nun lediglich warten, bis aclt.ini den gewünschten Inhalt bekommt. Dann weiß es, daß die Eingabe erfolgt ist und daß der Programmablauf fortgesetzt werden kann.

Welche Information wir zur Synchronisation verwenden, ist eigentlich nebensächlich. Jeder Eintrag in aclt.ini hat einen eindeutigen Schlüssel. Wir können einen der vorhandenen Schlüssel benutzen oder (besser) uns einen eigenen Schlüssel ausdenken.

Wir sollten einen Schlüssel verwenden, der unzweifelhaft unserer Applikation zugeordnet ist. Zu diesem Zweck hat ADGE, die internationale Vereinigung der AutoCAD-Entwickler jedem Mitgliedsunternehmen eine eindeutige Kennung zugewiesen. In unserem Beispiel heißt der Schlüssel EACR_LTAPPS.

Weiterhin haben wir die Freiheit, diesem Schlüssel einen beliebigen Wert zu geben. Deshalb können wir die Synchronisation gleichzeitig dazu benutzen, dem Steuerprogramm Informationen über die gerade erfolgte Eingabe mitzugeben. Für das nachfolgende Beispiel verwenden wir folgendes Eingabemakro:

***ACCELERATORS
["INSERT"]\’_SETENV;EACR_LTAPPS;$M=$(getvar,LastPoint);

Es füllt nach der erfolgten Eingabe den Schlüssel EACR_LTAPPS mit den Koordinaten des gerade angeklickten Punkts. Unser Steuerprogramm wartet, bis der Wert in der Datei aclt.ini erscheint und kann dann sofort mit den Koordinaten weiterarbeiten.

Beispielprogramm Kreis über zwei Punkte

Als Beispiel für eine winzige LT-Applikation, die mit AutoCAD interagiert, implementieren wir die in LT fehlende Option "2Punkte" des Befehls _CIRCLE (KREIS).

Das Winword-Makro in Listing 3 beginnt mit zwei Hilfsfunktionen zur AutoCAD-gerechten Zahlenformatierung und zum Zerlegen eines Punkts in seine Koordinaten. Auf diese brauchen wir hier nicht näher einzugehen.

Interessant wird dann die dritte Unterfunktion namens "Punktanfrage". Hier wird die Interaktion und Synchronisation mit AutoCAD LT abgewickelt.

Als erstes normiert die Funktion die Variable EACR_LTAPPS in der Datei aclt.ini. Dazu wird der Makrobefehl "SetPrivateProfileString" verwendet, den es in allen Windows-Programmiersprachen gibt. Solange die Variable EACR_LTAPPS den Wert 0 hat, ist die Punktanfrage in AutoCAD LT noch nicht erledigt.

Im nächsten Schritt aktiviert die Funktion den AutoCAD-Befehl _ID, der den Anwender zur Eingabe eines Punkts auffordert. Durch Simulation des Drucks auf die Taste {Einfügen} aktivieren wir unser Eingabemakro.

Nun wartet das WinWord-Makro, bis sich der Inhalt der Datei aclt.ini an der gewünschten Position verändert hat. Dazu wird das Gegenstück "GetPrivateProfileString" verwendet. Haben wir ein Ergebnis erhalten, zerlegen wir den Wert der Ini-Variablen in die einzelnen Koordinaten.

Das eigentliche Hauptprogramm ist dann einfach: Wir aktivieren AutoCAD LT, fragen nach dem ersten Kreispunkt und merken uns seine Koordinaten. Dann fragen wir nach dem gegenüberliegenden Kreispunkt. Ein wenig Arithmetik berechnet daraus den Mittelpunkt, den wir über den Befehl _CIRCLE an AutoCAD LT übergeben. Fertig!

Es ist nicht alles Gold ...

Unsere kurzen Beispiele haben Ihnen gezeigt, nach welchem Prinzip kommerzielle LT-Applikationen funktionieren. Die wesentlichen Überlegungen dabei sind unabhängig von AutoCAD LT. In genau derselben Weise können Sie jedes Windows-Programm "programmieren", sei es AutoCAD, AutoSketch oder den Taschenrechner.

Die Beispiele sollen nur einen ersten Einblick geben. Auf kompliziertere Funktionen wie auch auf jegliche Fehlerkontrolle haben wir großzügig verzichtet. Aber trotzdem zeigen schon diese einfachen Beispiele, welche Probleme die LT-Programmierung birgt und warum sich AutoCAD LT mehr für kurze, einfache Automatismen denn für komplette, kommerzielle Applikationen eignet.

Eine Unschönheit ist beispielsweise die Eigenart der AutoCAD-Fenster, jeden Tastendruck zu protokollieren. Jedes Zeichen, das wir per Fernsteuerung an AutoCAD senden, wird auf dem Bildschirm gezeigt. Bei einer kommerziellen Applikation ist dieser mitlaufende Text unerwünscht.

Ein weiteres Problem ist die Synchronisationszeit. Bei jeder Eingabe in AutoCAD muß das Steuerprogramm eine Warteschleife betreten. Es wartet einen vorgegebenen Zeitraum und prüft dann den Zustand der Ini-Datei. Dies wiederholt sich in regelmäßigen Abständen. Je länger jeder Zyklus, desto träger reagiert das Steuerprogramm auf die Eingabe in AutoCAD. Verkürzt man umgekehrt die Wartezeit sehr stark (wie im abgebildeten Beispiel), so geht zuviel Rechenzeit für das ständige Prüfen verloren. Der Rechner scheint zu hängen, und das Fadenkreuz stolpert.

Das wichtigste Problem jeder LT-Applikation aber ist Reaktion auf Fehlersituationen. Das Eingabemakro wartet genau eine AutoCAD-Eingabe ab. Dann wird das Steuerprogramm fortgesetzt. Wir haben jedoch im externen Programm nur sehr wenige Möglichkeiten, zu erkennen, was der Anwender in AutoCAD gemacht hat. Es gibt keine Möglichkeit, die Eingabe direkt zu prüfen. Wenn der Anwender an die falsche Stelle klickt, versehentlich eine falsche Zahl eingibt oder absichtlich einen Objektfang verändert, geschieht in fast allen LT-Applikationen Unvorhergesehenes.

Aus diesen Gründen eignen sich LT-Programme zumeist nur für den flexiblen und vor allem fehlertoleranten Anwender. Für sichere und stabile CAD-Applikationen wird ein Basispaket mit kompletten Programmierschnittstellen die erste Wahl bleiben.

Dietmar Rudolph

Dies ist ein Shareware-Dokument. Was ist ein Shareware-Dokument? Hat Ihnen dieses Dokument etwas genutzt? Haben Sie damit Geld gespart? Dann revanchieren Sie sich bitte:


Kontakt CR/LF GmbH

© 1999-2011 by CR/LF GmbH, Essen/Germany. All rights reserved.
No part of this document may be reproduced or published without written consent by CR/LF GmbH.
Last modification: 01.04.2011