O automatickém načítání a spouštění procedur jazyka AutoLISP

Procedury jazyka AutoLISP je možné načítat při spuštění a příkazy nebo funkce lze provádět v určitých okamžicích během relace kreslení.

Produkty založené na aplikaci AutoCAD automaticky načítají obsah tří souborů, které může definovat uživatel: acad.lsp, acaddoc.lsp a soubor MNL, který doplňuje aktuální soubor uživatelských úprav.

Soubor acad.lsp je ve výchozím nastavení načten pouze jednou (při spuštění aplikace), zatímco soubor acaddoc.lsp je načítán s každým dokumentem (výkresem). To umožňuje sdružit soubor acad.lsp se spuštěním aplikace a soubor acaddoc.lsp s otevřením dokumentu (výkresu). Výchozí metodu načítání těchto spouštěcích souborů lze upravit změnou systémové proměnné ACADLSPASDOC.

Pokud jeden z těchto souborů definuje funkci speciálního typu S::STARTUP, tato funkce se spustí bezprostředně po úplné inicializaci výkresu. Jako alternativu lze použít příkaz APLČTI s možností Při spuštění, jež načte zadané aplikace, aniž by bylo nutné upravovat soubory.

Spouštěcí soubory acad.lsp a acaddoc.lsp nejsou poskytovány s produkty založenými na aplikaci AutoCAD. Je na uživateli, aby tyto soubory v případě potřeby vytvořil a upravoval.

Poznámka: Počínaje produkty založenými na aplikaci AutoCAD 2014 musí vlastní aplikace pracovat v zabezpečeném režimu, pokud je systémová proměnná SECURELOAD nastavena na hodnotu 1 nebo 2. Při práci v zabezpečeném režimu je načítání a spouštění souborů obsahujících kód v aplikaci omezeno na důvěryhodná umístění. Důvěryhodná umístění jsou určena systémovou proměnnou TRUSTEDPATHS.

Automatické načítání příkazů

Po načtení souboru jazyka AutoLISP budou definice příkazů v souboru zabírat paměť bez ohledu na to, zda ve skutečnosti příkazy používáte či nikoli. Funkce jazyka AutoLISP autoload načítá požadovaný příkaz bez načtení celé funkce do paměti. Přidáním následujícího kódu do souboru acaddoc.lsp budou automaticky načteny příkazy CMD1, CMD2 a CMD3 ze souboru cmds.lsp a příkaz NEWCMD ze souboru newcmd.lsp.

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

Při prvním zadání automaticky načteného příkazu na příkazovém řádku AutoLISP načte celou definici příkazu z asociovaného souboru. Jazyk AutoLISP rovněž nabízí funkci autoarxload pro aplikace ObjectARX.

Poznámka: Podobně pojmenované spouštěcí soubory jazyka AutoLISP jsou načteny podle jejich upravené časové značky; pokud neurčíte úplný název souboru, načte se soubor LSP s nejnovější časovou značkou (včetně přípony soubory).

Soubor ACAD.LSP

Pokud pravidelně používáte určité procedury jazyka AutoLISP, můžete vytvořit soubor acad.lsp. Aplikace AutoCAD při spuštění hledá soubor acad.lsp v cestě pro vyhledávání podpůrných souborů. Pokud je soubor acad.lsp nalezen, je načten do paměti.

Protože soubor acad.lsp je určen k inicializaci aplikace, všechny funkce a proměnné definované v souboruacad.lsp budou dostupné pouze pro první výkres. Jakékoli procedury, které mají být dostupné pro všechny dokumenty, je nutné přesunout ze souboru acad.lsp do souboru acaddoc.lsp.

Doporučená funkčnost souborů acad.lsp a acaddoc.lsp může být potlačena pomocí systémové proměnné ACADLSPASDOC. Pokud je systémová proměnná ACADLSPASDOC nastavena na hodnotu 0 (výchozí nastavení), soubor acad.lsp bude načten jen jednou: při spuštění aplikace. Pokud je nastavena na hodnotu 1, soubor acad.lsp se znovu načte při vytvoření nového výkresu nebo při otevření existujícího výkresového souboru.

Soubor acad.lsp může obsahovat kód jazyka AutoLISP pro jednu nebo více procedur nebo pouze sérii volání funkce load. Druhá metoda je výhodnější z hlediska úprav. Pokud uložíte následující kód do souboru acad.lsp, budou soubory mysessionapp1.lsp, databasesynch.lspa drawingmanager.lsp načteny při každém spuštění aplikace.

(load "mysessionapp1")
(load "databasesynch")
(load "drawingmanager")
Poznámka: Neměňte rezervovaný soubor acad<verze>.lsp. Společnost Autodesk poskytuje soubor acad<verze>.lsp, který obsahuje požadované funkce definované jazykem AutoLISP, jež jsou specifické pro každou verzi. Tento soubor je načten do paměti bezprostředně před načtením souboru acad.lsp. Zástupný text <verze> představuje verzi produktu založeného na aplikaci AutoCAD, například acad2015.lsp by byl soubor načítaný produkty založenými na aplikaci AutoCAD 2015.

Soubor ACADDOC.LSP

Soubor acaddoc.lsp je určen k inicializaci jednotlivých dokumentů (výkresů). Tento soubor je užitečný v případě, kdy potřebujete, aby knihovna funkcí jazyka AutoLISP byla dostupná při každém vytvoření nového nebo otevření již existujícího výkresu.

Při každém otevření výkresu aplikace AutoCAD hledá soubor acaddoc.lsp v cestě knihovny. Jestliže jej nalezne, načte soubor do paměti. Soubor acaddoc.lsp je bez ohledu na nastavení proměnné ACADLSPASDOC vždy načten s každým výkresem.

Většina uživatelů bude mít pouze jeden soubor acaddoc.lsp pro všechny dokumenty založené na procedurách jazyka AutoLISP. Aplikace hledá soubor acaddoc.lsp v pořadí definovaném cestou knihovny. Díky této funkci tedy může v každém adresáři s výkresy existovat jiný soubor acaddoc.lsp, který načte procedury jazyka AutoLISP specifické pro určité typy výkresů nebo úloh.

Soubor acaddoc.lsp může obsahovat kód jazyka AutoLISP pro jednu nebo více procedur nebo pouze sérii volání funkce load. Druhá metoda je výhodnější z hlediska úprav. Pokud uložíte následující kód jako soubor acaddoc.lsp, budou soubory mydocumentapp1.lsp, build.lsp a counter.lsp načteny při každém otevření nového dokumentu.

(load "mydocumentapp1")
(load "build")
(load "counter")
Poznámka: Neměňte rezervovaný soubor acad<verze>doc.lsp. Společnost Autodesk poskytuje soubor acad<verze>doc.lsp, který obsahuje požadované funkce definované jazykem AutoLISP, jež jsou specifické pro každou verzi. Tento soubor je načten do paměti bezprostředně před načtením souboru acaddoc.lsp. Zástupný text <verze> představuje verzi produktu založeného na aplikaci AutoCAD, například acad2015doc.lsp by byl soubor načítaný produkty založenými na aplikaci AutoCAD 2015.

Přizpůsobení souborů MNL a nabídky jazyka AutoLISP

Když aplikace načte soubor uživatelských úprav (CUI/CUIx), hledá soubor MNL s odpovídajícím názvem. Pokud jej najde, načte tento soubor do paměti. Tato funkce zajišťuje, aby byly načteny funkce jazyka AutoLISP, které jsou nutné pro správné fungování prvků uživatelského rozhraní.

Například soubor uživatelských úprav acad.cuix vyhledává soubor acad.mnl, který by mohl definovat řadu funkcí jazyka AutoLISP používaných prvky uživatelského rozhraní v souboru uživatelských úprav. Soubor MNL je načten po souboru acaddoc.lsp.

Poznámka: Pokud načítáte soubor uživatelských úprav pomocí funkce command jazyka AutoLISP — se syntaxí podobnou (command "menu" "newmenu") — asociovaný soubor MNL nebude načten až do doby ukončení procedury jazyka AutoLISP.
(command "menu" "newmenu")

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

V tomto příkladu lze volání funkce princ použít k zobrazení stavových informací. Při prvním použití příkazu princ se zobrazí na příkazovém řádku následující data:

Newmenu utilities… Loaded.

Druhé volání princ ukončí funkci jazyka AutoLISP. Bez druhého volání funkce princ by zpráva byla zobrazena dvakrát. Jak bylo uvedeno dříve, můžete do volání funkce load zahrnout argument onfailure, který ošetří případné chyby.

Funkce S::STARTUP: spuštění po inicializačním procesu

Definováním funkce S::STARTUP můžete po inicializaci výkresu provést libovolné potřebné nastavení.

Spouštěcí soubory jazyka LISP (acad.lsp, acaddoc.lsp a MNL) jsou všechny načteny do paměti před úplnou inicializací výkresu. Většinou k žádnému problému nedojde, pokud však nepoužíváte funkci command, jejíž funkčnost není garantována před dokončením inicializace výkresu.

Pokud je uživatelem definovaná funkce S::STARTUP obsažena v souboru acad.lsp, acaddoc.lsp nebo v souboru MNL, je volána při přechodu do nového výkresu nebo otevření existujícího výkresu. Definici S::STARTUP je tedy možné vložit do spouštěcího souboru jazyka AutoLISP za účelem provedení spouštěcích operací.

Chcete-li například předefinovat standardní příkaz ŠRAFY tak, aby zobrazil zprávu a potom provedl příkaz HŠRAFY, vložte do souboru acaddoc.lsp následující kód:

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

Před inicializací výkresu jsou nové definice příkazů ŠRAFY a PŮVŠRAFY definovány funkcí defun. Po inicializaci výkresu je volána funkce S::STARTUP, která zruší definici standardního příkazu ŠRAFY.

Poznámka: Aby mohla být připojena, musí být funkce S::STARTUPdefinována pomocí příkazu defun-q a nikoli pomocí příkazu defun.

Protože funkce S::STARTUP může být definována na mnoha místech (soubor acad.lsp, acaddoc.lsp, soubor MNL nebo jiný soubor jazyka AutoLISP z nich načtený), je možné přepsat dříve definovanou funkci S::STARTUP.

Následující příklad ukazuje způsob, jak se lze ujistit, že spouštěcí funkce funguje s ostatními.

(defun-q MYSTARTUP ( )

...spouštěcí funkce ...

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

Předchozí kód připojí spouštěcí funkci do již existující funkce S::STARTUP a potom předefinováním funkce S::STARTUP začlení do spouštěcího kódu. Tento kód funguje správně bez ohledu na předchozí definici funkce S::STARTUP.