Automatyczne wczytywanie i uruchamianie procedur AutoLISP

Możliwe jest wczytywanie procedur AutoLISP podczas uruchamiania oraz wykonywanie poleceń lub funkcji w określonych momentach podczas sesji rysunkowej.

Produkty oparte na oprogramowaniu AutoCAD i AutoCAD LT automatycznie wczytują zawartość trzech plików zdefiniowanych przez użytkownika:

Plik definiowany przez użytkownika Windows Mac OS
AutoCAD AutoCAD LT AutoCAD AutoCAD LT
acad.lsp -- --
acaddoc.lsp -- --
acadlt.lsp -- -- --
acadltdoc.lsp -- -- --
Plik MNL z dołączonym bieżącym plikiem dostosowywania -- --

Domyślnie plik acad.lsp lub acadlt.lsp jest wczytywany tylko raz, podczas uruchamiania produktu, natomiast plik acaddoc.lsp lub acadltdoc.lsp jest wczytywany z każdym osobnym dokumentem (lub rysunkiem). Pozwala to połączyć wczytywanie pliku acad.lsp lub acadlt.lsp z uruchamianiem aplikacji oraz wczytywanie pliku acaddoc.lsp lub acadltdoc.lsp z otwieraniem dokumentu (lub rysunku). Domyślna metoda wczytywania tych plików może zostać zmodyfikowana przez zmianę ustawienia zmiennej systemowej ACADLSPASDOC.

Jeśli jeden z tych plików definiuje funkcję specjalnego typu S::STARTUP, procedura ta jest uruchamiana bezpośrednio po zakończeniu inicjalizacji rysunku. Polecenie WCZYTAJAPL zapewnia też opcję Pakiet uruchomieniowy, która wczytuje określone aplikacje bez potrzeby edycji jakichkolwiek plików.

Pliki startowe acad.lsp lub acadlt.lsp oraz acaddoc.lsp lub acadltdoc.lsp nie są dostarczane wraz z produktem. Tworzenie i utrzymywanie tych plików zależy tylko od użytkownika.

Uwaga: Począwszy od produktów opartych na programie AutoCAD 2014, niestandardowe aplikacje muszą działać w trybie bezpiecznym, gdy zmienna systemowa SECURELOAD jest ustawiona na wartość 1 lub 2. W trybie bezpiecznym produkt może wczytywać i uruchamiać tylko te pliki, które zawierają kod z zaufanych lokalizacji określonych przez zmienną systemową TRUSTEDPATHS.

Automatyczne wczytywanie poleceń

Po wczytaniu pliku AutoLISP definicje poleceń w pliku zajmują pamięć, niezależnie od tego, czy polecenia są rzeczywiście używane. Funkcja AutoLISP autoload udostępnia polecenie bez wczytywania do pamięci całej procedury. Dodanie poniżej przedstawionych kodów do pliku acaddoc.lsp lub acadltdoc.lsp powoduje automatyczne wczytanie poleceń POL1, POL2 i POL3 z pliku cmds.lsp oraz polecenia NEWCMD z pliku newcmd.lsp.

(autoload "CMDS" '("CMD1" "CMD2" "CMD3")) 
(autoload "NEWCMD" '("NEWCMD"))

Przy pierwszym wprowadzeniu automatycznie wczytanego polecenia w wierszu polecenia AutoLISP wczytuje całą definicję polecenia z pliku skojarzonego. AutoLISP zawiera także funkcję autoarxload dla aplikacji ObjectARX.

Uwaga: Pliki startowe AutoLISP o podobnej nazwie są wczytywane na podstawie ich znacznika czasu Zmodyfikowany. Plik LSP wczytywany jest z bieżącym czasem w tym znaczniku, jeśli nie zostanie podana pełna nazwa pliku (łącznie z rozszerzeniem).

Plik ACAD.LSP lub ACADLT.LSP

Jeśli określone procedury AutoLISP są stale używane, można utworzyć plik acad.lsp lub acadlt.lsp. Po uruchomieniu program AutoCAD szuka pliku acad.lsp lub acadlt.lsp w ścieżce wyszukiwania plików pomocniczych. Po jego znalezieniu plik acad.lsp lub acadlt.lsp jest wczytywany do pamięci.

Ponieważ plik acad.lsp lub acadlt.lsp jest przeznaczony do użycia dla procedur startowych określonych aplikacji, wszystkie funkcje i zmienne zdefiniowane w pliku acad.lsp lub acadlt.lsp są dostępne tylko w pierwszym rysunku. Procedury, które powinny być dostępne we wszystkich dokumentach, mogą być przeniesione z pliku acad.lsp lub acadlt.lsp do pliku acaddoc.lsp lub acadltdoc.lsp.

Zalecane działanie plików acad.lsp lub acadlt.lsp oraz acaddoc.lsp lub acadltdoc.lsp można zmienić przez ustawienie zmiennej systemowej ACADLSPASDOC. Jeśli zmienna systemowa ACADLSPASDOC ma wartość 0 (ustawienie domyślne), wówczas plik acad.lsp lub acadlt.lsp jest wczytywany tylko raz — podczas uruchamiania aplikacji. Jeśli ta zmienna ma wartość 1, plik acad.lsp lub acadlt.lsp jest ponownie wczytywany podczas tworzenia nowego rysunku lub otwierania istniejącego pliku rysunku.

Plik acad.lsp lub acadlt.lsp może zawierać kody AutoLISP dla jednej lub większej liczby procedur bądź po prostu szereg wywołań funkcji load. Zaleca się stosowanie tej drugiej metody, ponieważ przeprowadzanie modyfikacji jest wówczas łatwiejsze. Po zapisaniu poniższego kodu w postaci pliku o nazwie acad.lsp lub acadlt.lsp pliki mysessionapp1.lsp, databasesynch.lsp oraz drawingmanager.lsp są wczytywane przy każdym uruchomieniu programu.

(load "mysessionapp1")
(load "databasesynch")
(load "drawingmanager")
Uwaga: Nie należy modyfikować zarezerwowanych plików acad<wersja>.lsp lub acadlt<wersja>.lsp. Firma Autodesk dostarcza plik acad<wersja>.lsp lub acadlt<wersja>.lsp zawierający wymagane, specyficzne dla wersji, definiowane przez AutoLISP funkcje. Ten plik jest wczytywany do pamięci bezpośrednio przed wczytaniem pliku acad.lsp lub acadlt.lsp. <wersja> oznacza wersję produktu, na przykład acad2025.lsp to plik wczytywany przez produkty oparte na oprogramowaniu AutoCAD i AutoCAD 2025, natomiast acadlt2025.lsp to plik wczytywany przez program AutoCAD LT 2025.

Plik ACADDOC.LSP lub ACADLTDOC.LSP

Plik acaddoc.lsp lub acadltdoc.lsp jest przeznaczony do kojarzenia z każdą inicjacją dokumentu (lub rysunku). Plik ten pozwala na wczytywanie do pamięci biblioteki procedur AutoLISP przy tworzeniu nowego (lub otwarciu istniejącego) rysunku.

Za każdym razem, gdy otwierany jest rysunek, program AutoCAD przeszukuje ścieżkę dostępu do biblioteki w celu wyszukania pliku acaddoc.lsp lub acadltdoc.lsp file. Jeśli plik ten zostanie znaleziony, jest on wczytywany do pamięci operacyjnej. Plik acaddoc.lsp lub acadltdoc.lsp jest zawsze wczytywany wraz z każdym rysunkiem, niezależnie od ustawienia zmiennej ACADLSPASDOC.

Większość użytkowników posiada pojedynczy plik acaddoc.lsp lub acadltdoc.lsp dla wszystkich procedur AutoLISP opartych na dokumentach. Program wyszukuje plik acaddoc.lsp lub acadltdoc.lsp w kolejności określonej ścieżką dostępu do biblioteki, dlatego też w każdym z katalogów rysunków można umieszczać inny plik acaddoc.lsp lub acadltdoc.lsp, który będzie wczytywać określone procedury AutoLISP dla różnych typów rysunków i zadań.

Plik acaddoc.lsp lub acadltdoc.lsp może zawierać kody AutoLISP dla jednej lub większej liczby procedur bądź po prostu szereg wywołań funkcji load. Zaleca się stosowanie tej drugiej metody, ponieważ przeprowadzanie modyfikacji jest wówczas łatwiejsze. Po zapisaniu poniższego kodu do pliku o nazwie acaddoc.lsp lub acadltdoc.lsp pliki mydocumentapp1.lsp, build.lsp oraz counter.lsp są wczytywane przy każdym otwarciu nowego dokumentu.

(load "mydocumentapp1")
(load "build")
(load "counter")
Uwaga: Nie należy modyfikować zarezerwowanych plików acad<wersja>doc.lsp lub acadlt<wersja>doc.lsp. Firma Autodesk dostarcza plik acad<wersja>doc.lsp lub acadlt<wersja>doc.lsp zawierający wymagane, specyficzne dla wersji, definiowane przez AutoLISP funkcje. Ten plik jest wczytywany do pamięci bezpośrednio przed wczytaniem pliku acaddoc.lsp lub acadltdoc.lsp. <wersja> oznacza wersję produktu, na przykład acad2025doc.lsp to plik wczytywany przez produkty oparte na oprogramowaniu AutoCAD i AutoCAD 2025, natomiast acadlt2025doc.lsp to plik wczytywany przez program AutoCAD LT 2025.

Pliki MNL i dostosowywanie menu AutoLISP

Gdy produkt wczytuje plik adaptacji (CUI/CUIx), szuka pliku MNL o odpowiedniej nazwie. Po znalezieniu pliku jest on wczytywany do pamięci operacyjnej. Ten tryb postępowania zapewnia wczytanie funkcji AutoLISP niezbędnych do poprawnego działania elementów interfejsu użytkownika.

Uwaga: Program AutoCAD LT nie obsługuje automatycznego wczytywania plików MNL, ale pliki można wczytywać za pomocą funkcji LOAD języka AutoLISP z innego pliku LISP.

Jeśli na przykład produkt wczytuje plik dostosowywania o nazwie custom.cuix, wyszuka on plik o nazwie custom.mnl, który może definiować wiele funkcji AutoLISP wykorzystywanych przez elementy interfejsu użytkownika w pliku dostosowywania. Plik MNL jest wczytywany po pliku acaddoc.lsp.

Uwaga: Jeśli plik dostosowywania jest wczytywany za pomocą funkcji AutoLISP command (ze składnią podobną do (command "menu" "nowemenu"), wówczas skojarzony plik MNL nie jest wczytywany, dopóki nie zakończy się cała procedura AutoLISP.
(command "menu" "newmenu")

(princ "Newmenu utilities… Loaded.")
(Princ)

W przykładzie tym wywołania funkcji princ są używane do wyświetlenia komunikatów o stanie. Pierwsze wywołanie funkcji princ wyświetla w wierszu polecenia następujący tekst:

Newmenu utilities… Wczytane.

Z kolei drugie wywołanie funkcji princ powoduje zakończenie funkcji bez żadnych komunikatów. Bez drugiego wywołania funkcji princ komunikat zostałby wyświetlony dwukrotnie. Jak wcześniej wspomniano, jako dodatkowy środek ostrożności przy wywoływaniu funkcji load można zastosować argument komunikat_o_błędzie.

Funkcja S::STARTUP: wykonywanie po inicjalizacji

Można zdefiniować funkcję S::STARTUP w taki sposób, aby wprowadzała różne ustawienia po inicjalizacji rysunku.

Wszystkie pliki startowe LISP (acad.lsp lub acadlt.lsp oraz acaddoc.lsp lub acadltdoc.lsp) są wczytywane do pamięci wraz z wszystkimi automatycznie wczytywanymi plikami MNL przed zakończeniem inicjalizacji rysunku. Procedura ta zwykle przebiega bez problemów, o ile nie zachodzi potrzeba użycia funkcji command, która może nie działać poprawnie przed inicjacją rysunku.

Uwaga: Program AutoCAD LT nie obsługuje automatycznego wczytywania plików MNL, ale pliki można wczytywać za pomocą funkcji LOAD języka AutoLISP z innego pliku LISP.

Jeśli funkcja użytkownika S::STARTUP znajduje się w pliku acad.lsp lub acadlt.lsp, w pliku acaddoc.lsp lub acadltdoc.lsp, ewentualnie w pliku MNL, jest ona wywoływana podczas tworzenia nowego rysunku lub otwierania istniejącego rysunku. W ten sposób można dołączyć definicję funkcji S::STARTUP do pliku startowego AutoLISP, aby umożliwić wykonywanie operacji konfiguracyjnych.

Jeśli na przykład użytkownik chce nadpisać standardowe polecenie KRESKUJ przez dodanie komunikatu i przełączenie do polecenia GKRESKUJ, należy użyć pliku acaddoc.lsp lub acadltdoc.lsp zawierającego następujący kod:

(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")
)

Przed inicjacją rysunku nowe definicje poleceń KRESKUJ i GKRESKUJ tworzone są przez funkcję defun. Po inicjalizacji rysunku wywoływana jest funkcja S::STARTUP, a standardowa definicja polecenia KRESKUJ jest usuwana.

Uwaga: Aby funkcja S::STARTUP mogła zostać dołączona, musi być zdefiniowana przez funkcję defun-q zamiast defun.

W związku z tym, że funkcję S::STARTUP można definiować w wielu lokalizacjach (w pliku acad.lsp lub acadlt.lsp, acaddoc.lsp lub acadltdoc.lsp, ewentualnie w pliku MNL oraz w innych plikach AutoLISP wczytywanych z jednego z wcześniej wymienionych), możliwe jest zastąpienie wcześniej zdefiniowanej funkcji S::STARTUP.

Poniższy przykład przedstawia jedną z metod upewnienia się, że używana funkcja startowa działa z innymi funkcjami.

(defun-q MYSTARTUP ( )

... używana funkcja startowa ...

)
(setq S::STARTUP (append S::STARTUP MYSTARTUP))

Powyższy kod dołącza używaną funkcję startową do istniejącej funkcji S::STARTUP, a następnie ponownie definiuje funkcję S::STARTUP, aby włączyć do niej używany kod startowy. Metoda ta działa poprawnie bez względu na to, czy funkcja S::STARTUP wcześniej istniała.