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 programie AutoCAD automatycznie wczytują zawartość trzech definiowalnych przez użytkownika plików: acad.lsp, acaddoc.lsp oraz pliku MNL, który towarzyszy bieżącemu plikowi adaptacji.

Domyślnie plik acad.lsp jest wczytywany tyko raz, przy uruchomieniu programu, podczas gdy plik acaddoc.lsp jest wczytywany wraz z każdym dokumentem (lub rysunkiem). Pozwala to połączyć wczytywanie pliku acad.lsp z uruchamianiem aplikacji i wczytywanie pliku acaddoc.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 i acaddoc.lsp nie są dostarczane z produktami opartymi na programie AutoCAD. 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 program 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 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

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

Ponieważ plik acad.lsp jest przeznaczony do użycia dla procedur startowych określonych aplikacji, wszystkie funkcje i zmienne zdefiniowane w acad.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 do nowego pliku acaddoc.lsp.

Zalecane działanie plików acad.lsp i acaddoc.lsp może zostać zmienione przez ustawienie zmiennej systemowej ACADLSPASDOC. Jeśli zmienna systemowa ACADLSPASDOC ma wartość 0 (ustawienie domyślne), wówczas plik acad.lsp jest wczytywany tylko raz, tj. przy uruchomieniu aplikacji. Jeśli ta zmienna ma wartość 1, plik acad.lsp jest ponownie wczytywany podczas tworzenia nowego rysunku lub otwierania istniejącego pliku rysunku.

Plik acad.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 pliki mysessionapp1.lsp, databasesynch.lsp i drawingmanager.lsp są wczytywane przy każdym uruchomieniu programu.

(load "mysessionapp1")
(load "databasesynch")
(load "drawingmanager")
Uwaga: Nie należy modyfikować zarezerwowanego pliku acad<wersja>.lsp. Firma Autodesk dostarcza plik acad<wersja>.lsp zawierający wymagane, specyficzne dla wersji, definiowane przez AutoLISP funkcje. Plik ten jest wczytywany do pamięci bezpośrednio przed wczytaniem pliku acad.lsp. <wersja> reprezentuje wersję produktu opartego na programie AutoCAD; na przykład acad2023.lsp to plik wczytywany przez produkty oparte na programie AutoCAD 2023.

Plik ACADDOC.LSP

Plik acaddoc.lsp jest przeznaczony do kojarzenia z każdą inicjalizacją 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. Jeśli plik ten zostanie znaleziony, jest on wczytywany do pamięci operacyjnej. Plik acaddoc.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 dla wszystkich procedur AutoLISP opartych na dokumentach. Program wyszukuje plik acaddoc.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 plikacaddoc.lsp, który będzie wczytywać określone procedury AutoLISP dla różnych typów rysunków i zadań.

Plik acaddoc.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 pliki mydocumentapp1.lsp, build.lsp i counter.lsp są wczytywane przy każdym otwarciu nowego dokumentu.

(load "mydocumentapp1")
(load "build")
(load "counter")
Uwaga: Nie należy modyfikować zarezerwowanego pliku acad<wersja>doc.lsp. Firma Autodesk dostarcza plik acad<wersja>doc.lsp zawierający wymagane, specyficzne dla wersji, definiowane przez AutoLISP funkcje. Plik ten jest wczytywany do pamięci bezpośrednio przed wczytaniem pliku acaddoc.lsp. <wersja> oznacza wersję produktu opartego na programie AutoCAD, na przykład acaddoc2023.lsp będzie plikiem wczytywanym przez produkty oparte na programie AutoCAD 2023.

Pliki MNL i dostosowywanie menu AutoLISP

Gdy program wczytuje plik adaptacji (CUI/CUIx), szuka pliku MNL o pasującej 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.

Przykładowo plik dostosowywania acad.cuix wyszukuje plik acad.mnl, który może definiować wiele funkcji AutoLISP używanych 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.

Pliki startowe LISP (acad.lsp, acaddoc.lsp i MNL) są wczytywane do pamięci 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 inicjalizacją rysunku.

Jeśli funkcja użytkownika S::STARTUP znajduje się w pliku acad.lsp, acaddoc.lsp lub MNL, jest 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, zawierającego poniższy 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 inicjalizacją 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.

Ponieważ funkcję S::STARTUP można definiować w wielu lokalizacjach (plikach acad.lsp, acaddoc.lsp lub MNL oraz innych plikach AutoLISP wczytanych z jednego z 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.