Automatisches Laden und Ausführen von AutoLISP-Routinen

Laden von AutoLISP-Routinen beim Starten und Ausführen von Befehlen und Funktionen zu bestimmten Zeitpunkten während einer Zeichnungssitzung

AutoCAD-basierte Produkte und AutoCAD LT laden den Inhalt von drei benutzerdefinierten Dateien automatisch:

Benutzerdefinierbare Datei Windows Mac OS
AutoCAD AutoCAD LT AutoCAD AutoCAD LT
acad.lsp -- --
acaddoc.lsp -- --
acadlt.lsp -- -- --
acadltdoc.lsp -- -- --
MNL-Datei mit aktueller Anpassungsdatei -- --

Vorgabemäßig wird die Datei acad.lsp oder acadlt.lsp nur einmal beim Start des Produkts geladen, während die Datei acaddoc.lsp oder acadltdoc.lsp mit jedem einzelnen Dokument (oder jeder Zeichnung) geladen wird. Auf diese Weise können Sie das Laden der Datei acad.lsp oder acadlt.lsp beim Programmstart und das Laden der Datei acaddoc.lsp oder acadltdoc.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 oder acadlt.lsp und acaddoc.lsp oder acadltdoc.lsp sind nicht im Lieferumfang des Produkts enthalten. Diese Dateien müssen vom Benutzer erstellt und gepflegt werden.

Anmerkung: In den AutoCAD-basierten Produkten ab Version 2014 müssen benutzerdefinierte Anwendungen im sicheren Modus ausgeführt werden. Die Systemvariable SECURELOAD ist auf den Wert 1 oder 2 festgelegt. Wenn Sie im abgesicherten Modus arbeiten, kann das Produkt nur solche Dateien laden und ausführen, die Code aus vertrauenswürdigen Speicherorten enthalten; die vertrauenswürdigen Speicherorte werden durch die Systemvariable TRUSTEDPATHS festgelegt.

Befehl-Autoloader

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 oder acadltdoc.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.

Anmerkung: AutoLISP-Startdateien mit ähnlichem Namen werden basierend auf dem Zeitstempel der letzten Änderung geladen; die LSP-Datei mit dem jüngsten Zeitstempel wird geladen, wenn Sie nicht den vollständigen Dateinamen angegeben (einschließlich der Dateinamenerweiterung).

Die Datei ACAD.LSP bzw. ACADLT.LSP

Sie können eine acad.lsp- oder acadlt.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 oder acadlt.lsp durchsucht. Wenn die Datei acad.lsp oder acadlt.lsp gefunden wird, wird sie in den Speicher geladen.

Da die Datei acad.lsp oder acadlt.lsp zur Verwendung bestimmter anwendungsspezifischer Start-Routinen ausgelegt ist, stehen alle in einer acad.lsp- oder acadlt.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 oder acadlt.lsp in die Datei acaddoc.lsp oder acadltdoc.lsp verschieben.

Die empfohlenen Funktionen der Dateien acad.lsp oder acadlt.lsp und acaddoc.lsp oder acadltdoc.lsp können mit der Systemvariablen ACADLSPASDOC überschrieben werden. Die Systemvariable ACADLSPASDOC wird auf 0 gesetzt (Vorgabe), die Datei acad.lsp oder acadlt.lsp wird nur einmal beim Start der Anwendung geladen. Mit der Einstellung 1 wird die Datei acad.lsp oder acadlt.lsp erneut geladen, wenn eine neue Zeichnung erstellt oder eine vorhandene Zeichnungsdatei geöffnet wird.

Die Datei acad.lsp oder acadlt.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- oder acadlt.lsp-Datei speichern, werden die Dateien mysessionapp1.lsp, databasesynch.lsp und drawingmanager.lsp jedes Mal geladen, wenn Sie das Produkt starten.

(load "mysessionapp1")
(load "databasesynch")
(load "drawingmanager")
Anmerkung: Nehmen Sie keine Änderungen an der reservierten Datei acad<Version>.lsp oder acadlt<Version>.lsp vor. Autodesk stellt die Datei acad<Version>.lsp oder acadlt<Version>.lsp bereit, die in AutoLISP definierte erforderliche versionsspezifische Funktionen enthält. Diese Datei wird in den Speicher geladen, unmittelbar bevor die Datei acad.lsp oder acadlt.lsp geladen wird. <Version> steht für die Version des Produkts, z. B. wäre acad2024.lsp die von AutoCAD und AutoCAD 2024-basierten Produkten und acadlt2024.lsp die von AutoCAD LT 2024 geladene Datei.

Die Datei ACADDOC.LSP bzw. ACADLTDOC.LSP

Die Datei acaddoc.lsp oder acadltdoc.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 oder acadltdoc.lsp. Wird eine Datei gefunden, lädt das Programm die Datei in den Speicher. Die Datei acaddoc.lsp oder acadltdoc.lsp wird mit jeder Zeichnung geladen, unabhängig von den Einstellungen für ACADLSPASDOC.

Die meisten Benutzer verfügen über eine einzige acaddoc.lsp- oder acadltdoc.lsp-Datei für alle dokumentbasierten AutoLISP-Routinen. Das Programm sucht anhand der im Bibliothekspfad angegebenen Reihenfolge nach einer acaddoc.lsp- oder acadltdoc.lsp-Datei. Dank dieser Funktion ist es daher möglich, über verschiedene acaddoc.lsp- bzw. acadltdoc.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 oder acadltdoc.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 oder acadltdoc.lsp laden, werden die Dateien mydocumentapp1.lsp, build.lsp und counter.lsp jedes Mal geladen, wenn ein neues Dokument geöffnet wird.

(load "mydocumentapp1")
(load "build")
(load "counter")
Anmerkung: Nehmen Sie keine Änderungen an der reservierten Datei acad<Version>doc.lsp oder acadlt<Version>doc.lsp vor. Autodesk stellt die Datei acad<Version>doc.lsp oder acadlt<Version>doc.lsp bereit, die in AutoLISP definierte erforderliche versionsspezifische Funktionen enthält. Diese Datei wird in den Speicher geladen, unmittelbar bevor die Datei acaddoc.lsp oder acadltdoc.lsp geladen wird. <Version> steht für die Version des Produkts, z. B. wäre acad2024doc.lsp die von AutoCAD und AutoCAD 2024-basierten Produkten und acadlt2024doc.lsp die von AutoCAD LT 2024 geladene Datei.

MNL-Dateien und AutoLISP-Menüanpassung

Beim Laden einer Anpassungsdatei (CUI-/CUIx-Datei) sucht das Produkt 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.

Anmerkung: AutoCAD LT unterstützt nicht das automatische Laden von MNL-Dateien, die Dateien können jedoch mit der AutoLISP-Funktion LOAD aus einer anderen LISP-Datei geladen werden.

Wenn das Produkt beispielsweise die Anpassungsdatei custom.cuix lädt, sucht es nach der Datei custom.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.

Anmerkung: Wenn eine Anpassungsdatei mit einer command-Funktion von AutoLISP geladen wird, d. h. mit einer Syntax wie (command "menu" "newmenu"), wird die zugehörige MNL-Datei erst dann geladen, wenn die gesamte AutoLISP-Routine ausgeführt wurde.
(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 durch Aufrufen der load-Funktion als zusätzliche Vorsichtsmaßnahme einschließen.

S::STARTUP-Funktion: Ausführung nach der Initialisierung

Sie können eine S::STARTUP-Funktion definieren, um nach der Zeichnungsinitialisierung benötigte Einrichtungsoperationen durchzuführen.

Die Start-LISP-Dateien (acad.lsp oder acadlt.lsp und acaddoc.lsp oder acadltdoc.lsp) werden zusammen mit allen automatisch geladenen MNL-Dateien in den Speicher geladen, bevor die Zeichnung vollständig initialisiert wird. 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.

Anmerkung: AutoCAD LT unterstützt nicht das automatische Laden von MNL-Dateien, die Dateien können jedoch mit der AutoLISP-Funktion LOAD aus einer anderen LISP-Datei geladen werden.

Wenn die benutzerdefinierte Funktion S::STARTUP in eine acad.lsp-, acadlt.lsp-, acaddoc.lsp-, acadltdoc.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- oder acadltdoc.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.

Anmerkung: Um angefügt werden zu können, muss die S::STARTUP-Funktion mit der Funktion defun-q statt defun definiert werden.

Da eine S::STARTUP-Funktion an verschiedenen Stellen definiert werden kann (in einer acad.lsp-, acadlt.lsp-, acaddoc.lsp-, acadltdoc.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.