Úvod do programových rozhraní – AutoLISP a Visual LISP, 3. díl
Soubor MNL pro nabídku AutoLISPu Jiný typ souboru, který AutoCAD automaticky načte, doprovází soubor aktuální nabídky a má příponu .mnl. Jestliže AutoCAD načítá soubor nabídky, hledá soubor MNL s odpo…
Soubor MNL pro nabídku AutoLISPu
Jiný typ souboru, který AutoCAD automaticky načte, doprovází soubor aktuální nabídky a má příponu .mnl. Jestliže AutoCAD načítá soubor nabídky, hledá soubor MNL s odpovídajícím názvem souboru. Pokud soubor nalezne, načte jej do paměti.
Tato funkčnost umožňuje AutoCADu načítat funkce AutoLISPu, které jsou nutné pro správnou činnost položek nabídky. Například výchozí nabídka AutoCADu acad.mnu je závislá na souboru acad.mnl. Tento soubor definuje početné funkce AutoLISPu používané nabídkou. Soubor MNL je načten po souboru acaddoc.lsp.
Poznámka: Pokud načítáte nabídku pomocí funkce AutoLISPu command – se syntaxí podobnou (command „menu“ „novánabídka“) – připojený soubor MNL nebude načten až do doby ukončení funkce AutoLISPu.
Jestliže například vytvoříte uživatelskou nabídku nazvanou novanabidka.mnu a potřebujete načíst tři soubory AutoLISPu (novy1.lsp, novy2.lsp, a novy3.lsp), aby nabídka správně fungovala, měli byste vytvořit textový ASCII soubor nazvaný novanabidka.mnl následujícím způsobem:
(load „novy1“)
(load „novy2“)
(load „novy3“)
(princ „nPomůcky pro novánabídka… načteny.“)
(princ)
V tomto příkladu byla použita funkce princ pro zobrazení informací. První volání funkce princ zobrazí na příkazovém řádku:
Pomůcky pro novánabídka… načteny.
Druhé volání princ ukončí funkci AutoLISPu. Bez druhého volání funkce princ by hlášení bylo zobrazeno dvakrát. Jak bylo uvedeno dříve, můžete do volání funkce load zahrnout argument onfailure, který ošetří případné chyby.
Zabránění chybám AutoLISPu při načtení spouštěcích souborů
Pokud při načítání spouštěcího souboru dojde k chybě, zbytek souboru zůstane ignorován a nebude načten.
Obvykle se chyby vyskytnou, když soubory uvedené ve spouštěcím souboru neexistují nebo nebyly nalezeny ve vyhledávací cestě knihovny. V tom případě můžete použít argument onfailure funkce load. Následující příklad ukazuje použití argumentu onfailure:
(princ (load „mydocapp1“ „nSoubor MYDOCAPP1.LSP nebyl načten.“))
(princ (load „build“ „nSoubor BUILD.LSP nebyl načten.“))
(princ (load „counter“ „nSoubor COUNTER.LSP nebyl načten.“))
.(princ)
Pokud je volání funkce load úspěšné, vrátí se hodnota posledního výrazu v souboru (obvykle název poslední definované funkce v souboru nebo hlášení ohledně používání funkce). Jestliže volání selže, funkce vrátí hodnotu argumentu onfailure. V předchozím příkladu byla hodnota vrácená funkcí load předána jako argument funkci princ, která zobrazí tuto hodnotu na příkazovém řádku.
Pokud například dojde k chybě při načítání souboru mydocapp1.lsp funkce princ zobrazí následující hlášení a AutoCAD pokračuje v načítání zbývajících dvou souborů:
Soubor MYDOCAPP1.LSP nebyl načten.
Používáte-li v souboru acad.lsp, acaddoc.lsp nebo souboru MNL funkci command, měla by být volána pouze v rámci funkce defun. Příkazy, které se mají provést bezprostředně po inicializaci výkresu, definujte pomocí funkce S::STARTUP.
Funkce S::STARTUP: spuštění po inicializačním procesu
Spouštěcí soubory LISPu (acad.lsp, acaddoc.lsp a MNL) jsou všechny načteny do paměti před kompletní inicializací výkresu. Většinou nevznikne žádný problém, ale správná funkčnost funkce command není garantována před dokončením inicializace výkresu.
Pokud je funkce S::STARTUP obsažena v souboru acad.lsp, acaddoc.lsp nebo souboru MNL, je volána při přechodu do nového výkresu nebo otevření existujícího výkresu. Je možné tedy vložit definici S::STARTUP do spouštěcího souboru LISPu k provedení inicializačních kroků.
Chcete-li například změnit standardní příkaz ŠRAFY tak, aby nejprve zobrazil hlášení a potom vykonal příkaz HŠRAFY, vložte do souboru acaddoc.lsp následující kód:
(defun C:ŠRAFY ( )
(alert „Použití příkazu HŠRAFY!“)
(princ „nNapište PŮVŠRAFY aby se provedl původní příkaz ŠRAFY.n“)
(command „HŠRAFY“)
.(princ)
)
(defun C:PŮVŠRAFY ( )
(command „.HATCH“)
.(princ)
)
(defun-q S::STARTUP ( )
(command „undefine“ „šrafy“)
(princ „Předefinování ŠRAFY na HŠRAFY!n“)
)
Před inicializací výkresu jsou pomocí funkce defun definovány příkazy ŠRAFY a PŮVŠRAFY. Po inicializaci výkresu je volána funkce S::STARTUP , která zruší definici standardního příkazu ŠRAFY.
Poznámka: Z důvodu připojení je nutné funkci S::STARTUP definovat pomocí funkce defun-q místo funkce 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 AutoLISPu 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 nejprve přidá spouštěcí funkci do již existující funkce S::STARTUP a potom znovu definicí 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.