Laden von AutoLISP-Routinen beim Starten und Ausführen von Befehlen und Funktionen zu bestimmten Zeitpunkten während einer Zeichnungssitzung
AutoCAD-basierte Produkte laden den Inhalt von drei benutzerdefinierbaren Dateien automatisch: von acad.lsp, acaddoc.lsp und der MNL-Datei, die zu Ihrer aktuellen Anpassungsdatei gehört.
Vorgabemäßig wird die Datei acad.lsp nur einmal beim Start des Programms geladen, während acaddoc.lsp mit jedem einzelnen Dokument (oder jeder Zeichnung) geladen wird. Auf diese Weise können Sie das Laden der Datei acad.lsp mit dem Programmstart und das Laden der Datei acaddoc.lsp mit dem Aufruf des Dokuments (oder der Zeichnung) verknüpfen. Die Vorgabemethode zum Laden dieser Startdateien kann geändert werden, indem Sie die Einstellung der Systemvariablen ACADLSPASDOC ändern.
Wenn eine dieser Dateien eine Funktion des Sondertyps S::STARTUP definiert, wird diese Routine sofort nach der Initialisierung der Zeichnung ausgeführt. Alternativ stellt der Befehl APPLOAD eine Startgruppen-Option zur Verfügung, mit der die angegebenen Anwendungen geladen werden, ohne dass Dateien bearbeitet werden müssen.
Die Startdateien acad.lsp und acaddoc.lsp sind in AutoCAD-basierten Produkten nicht enthalten. Diese Dateien müssen vom Benutzer erstellt und gepflegt werden.
Wenn Sie eine AutoLISP-Datei laden, benötigen die Befehlsdefinitionen in der Datei Speicherplatz, unabhängig davon, ob Sie sie tatsächlich verwenden. Die AutoLISP-Funktion autoload stellt einen Befehl zur Verfügung, ohne dass dabei die gesamte Routine in den Speicher geladen wird. Wenn Sie den folgenden Code der Datei acaddoc.lsp hinzufügen, werden die Befehle CMD1, CMD2 und CMD3 aus der Datei cmds.lsp und der Befehl NEWCMD aus der Datei newcmd.lsp automatisch geladen.
(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) (autoload "NEWCMD" '("NEWCMD"))
Wenn Sie einen automatisch geladenen Befehl das erste Mal in der Befehlszeile eingeben, lädt AutoLISP die gesamte Befehlsdefinition aus der entsprechenden Datei. AutoLISP stellt außerdem die Funktion autoarxload für ObjectARX-Anwendungen zur Verfügung.
Sie können eine acad.lsp-Datei erstellen, wenn Sie regelmäßig bestimmte AutoLISP-Routinen verwenden. Beim Start von AutoCAD wird der Suchpfad für die Support-Datei nach der Datei acad.lsp durchsucht. Wenn die Datei acad.lsp gefunden wird, wird sie in den Speicher geladen.
Da die Datei acad.lsp zur Verwendung bestimmter anwendungsspezifischer Start-Routinen ausgelegt ist, stehen alle in einer acad.lsp-Datei definierten Funktionen und Variablen nur in der ersten Zeichnung zur Verfügung. Nach Möglichkeit sollten Sie Routinen, die in allen Dokumenten verfügbar sein sollten, aus der Datei acad.lsp in die Datei acaddoc.lsp verschieben.
Die empfohlenen Funktionen der Dateien acad.lsp und acaddoc.lsp können mit der Systemvariablen ACADLSPASDOC überschrieben werden. Die Systemvariable ACADLSPASDOC wird auf 0 eingestellt (Vorgabe), die Datei acad.lsp wird nur einmal beim Start der Anwendung geladen. Bei der Einstellung 1 wird die Datei acad.lsp erneut geladen, wenn eine neue Zeichnung erstellt oder eine vorhandene Zeichnungsdatei geöffnet wird.
Die Datei acad.lsp kann AutoLISP-Code für eine oder mehrere Routinen oder eine Serie von load-Funktionsaufrufen enthalten. Die letztere Methode empfiehlt sich, da die Änderungen einfacher vorzunehmen sind. Wenn Sie den folgenden Code als acad.lsp-Datei speichern, werden die Dateien mysessionapp1.lsp, databasesynch.lsp und drawingmanager.lsp jedes Mal geladen, wenn Sie das Programm starten.
(load "mysessionapp1") (load "databasesynch") (load "drawingmanager")
Die Datei acaddoc.lsp ist jeder Dokument- bzw. Zeichnungsinitialisierung zugeordnet. Diese Datei ist nützlich, wenn Sie eine Bibliothek mit AutoLISP-Routinen laden möchten, die bei jedem Start einer neuen Zeichnung oder Öffnen einer vorhandenen Zeichnung zur Verfügung stehen.
Jedes Mal, wenn eine Zeichnung geöffnet wird, durchsucht AutoCAD den Bibliothekspfad nach der Datei acaddoc.lsp. Wird eine Datei gefunden, lädt das Programm die Datei in den Speicher. Die Datei acaddoc.lsp wird mit jeder Zeichnung geladen, unabhängig von den Einstellungen für ACADLSPASDOC.
Die meisten Benutzer verfügen über eine einzige acaddoc.lsp-Datei für alle dokumentbasierten AutoLISP-Routinen. Das Programm sucht anhand der im Bibliothekspfad angegebenen Reihenfolge nach einer acaddoc.lsp-Datei. Dank dieser Funktion ist es daher möglich, über verschiedene acaddoc.lsp-Dateien in den jeweiligen Zeichnungsverzeichnissen zu verfügen, sodass bestimmte AutoLISP-Routinen für bestimmte Zeichnungstypen oder Aufträge geladen werden können.
Die Datei acaddoc.lsp kann AutoLISP-Code für eine oder mehrere Routinen oder eine Serie von load-Funktionsaufrufen enthalten. Die letztere Methode empfiehlt sich, da die Änderungen einfacher vorzunehmen sind. Wenn Sie den folgenden Code in der Datei acaddoc.lsp speichern, werden die Dateien mydocumentapp1.lsp, build.lspund counter.lsp jedes Mal geladen, wenn ein neues Dokument geöffnet wird.
(load "mydocumentapp1") (load "build") (load "counter")
Beim Laden einer Anpassungsdatei (CUI-/CUIx-Datei) sucht das Programm nach einer MNL-Datei mit einem entsprechenden Dateinamen. Wird die Datei gefunden, lädt das Programm die Datei in den Speicher. Durch diese Funktion wird sichergestellt, dass die für die ordnungsgemäße Ausführung der Benutzeroberflächenelemente erforderlichen AutoLISP-Funktionen geladen werden.
Die Anpassungsdatei acad.cuix sucht beispielsweise nach der Datei acad.mnl, durch die möglicherweise zahlreiche AutoLISP-Funktionen definiert werden, die wiederum von den Elementen der Benutzeroberfläche in der Anpassungsdatei verwendet werden. Die MNL-Datei wird nach der Datei acaddoc.lsp geladen.
(command "menu" "newmenu") (princ "Newmenu utilities… Loaded.") (Princ)
In diesem Beispiel können princ-Funktionsaufrufe verwendet werden, um Statusmeldungen anzuzeigen. Bei der ersten Verwendung von princ wird Folgendes in der Befehlszeile angezeigt:
Newmenu utilities… Loaded.
Der zweite Aufruf von princ beendet die AutoLISP-Funktion. Ohne diesen zweiten Aufruf von princ wird die Meldung zweimal angezeigt. Wie bereits erwähnt, können Sie das Argument onfailure mit Aufrufen der load-Funktion als zusätzliche Vorsichtsmaßnahme einschließen.
Sie können eine S::STARTUP-Funktion definieren, um nach der Zeichnungsinitialisierung benötigte Einrichtungsoperationen durchzuführen.
Die Start-LISP-Dateien (acad.lsp, acaddoc.lsp und MNL) werden in den Speicher geladen, bevor eine Zeichnung vollständig initialisiert ist. Dies stellt normalerweise kein Problem dar, es sei denn, Sie möchten die command-Funktion verwenden. Es kann nicht garantiert werden, dass diese vor der Zeichnungsinitialisierung funktioniert.
Wenn die benutzerdefinierte Funktion S::STARTUP in eine acad.lsp-, acaddoc.lsp- oder MNL-Datei eingefügt wird, wird sie beim Starten einer neuen Zeichnung oder beim Öffnen einer vorhandenen Zeichnung aufgerufen. Sie können daher eine Definition von S::STARTUP in die AutoLISP-Startdatei einfügen, um Startoperationen durchzuführen.
Wenn Sie beispielsweise den Vorgabebefehl SCHRAFF überschreiben möchten, indem sie eine Meldung hinzufügen und anschließend zum Befehl GSCHRAFF wechseln, verwenden Sie eine acaddoc.lsp-Datei mit folgendem Inhalt:
(defun C:HATCH ( ) (alert "Using the BHATCH command!") (princ "\nEnter OLDHATCH to get to real HATCH command.\n") (command "BHATCH") (princ) ) (defun C:OLDHATCH ( ) (command ".HATCH") (princ) ) (defun-q S::STARTUP ( ) (command "undefine" "hatch") (princ "\nRedefined HATCH to BHATCH!\n") )
Vor der Initialisierung der Zeichnung werden neue Definitionen für SCHRAFF und OLDHATCH mithilfe der defun-Funktion definiert. Nach der Initialisierung der Zeichnung wird die S::STARTUP-Funktion aufgerufen, und die Vorgabedefinition von SCHRAFF wird aufgehoben.
Da eine S::STARTUP-Funktion an verschiedenen Stellen definiert werden kann (in einer acad.lsp-, acaddoc.lsp- oder MNL-Datei oder einer anderen von diesen Dateien geladenen AutoLISP-Datei), ist es möglich, eine zuvor definierte S::STARTUP-Funktion zu überschreiben.
Im nachfolgenden Beispiel ist eine Möglichkeit dargestellt, wie Sie sicherstellen können, dass die Startfunktion mit anderen Funktionen zusammen funktioniert.
(defun-q MYSTARTUP ( )
... Ihre Startfunktion ...
) (setq S::STARTUP (append S::STARTUP MYSTARTUP))
Der vorhergehende Code hängt Ihre Startfunktion an die einer vorhandenen S::STARTUP-Funktion an und definiert die S::STARTUP-Funktion anschließend neu, um Ihren Startcode zu übernehmen. Dies funktioniert ordnungsgemäß unabhängig von einer bereits vorhandenen S::STARTUP-Funktion.