|
AutoCAD... AutoLISP... VisualLISP... |
|
[12] "Pułapki" command |
|
» Command a sprawa polska Właściwie nie tylko polska bo sprawa ma charakter miedzynarodowy. Chodzi o składnię argumentów funkcji command. Możesz dysponować jedną z 16 narodowych wersji AutoCAD-a. W każdej z nich zlokalizowane polecenia mogą brzmieć (i z pewnością tak jest) inaczej. Chcąc aby program działał w każdej narodowej wersji musisz używać rdzennych (angielskich) polecen i opcji tych poleceń. Mało tego - aby one rzeczywiście działały muszą być poprzedzone znakiem"_". I tak zamiast
(command "OKRĄG" ... )
należy uzywać (command "_CIRCLE" ...), a dla opcji poleceń: zamiast (command "USUN" "WSZ" "") użyj (command "_ERASE" "_A" ""). Dla opcji poleceń można używac skrotow, podobnie jak jest to w wersjach narodowych. Zatem "O" ("okno") należy zastąpić "_W" ("window"). Jest użyteczna funkcja która zwraca nazwę rdzenną (lub zlokalizowaną) polecenia. Jest to funkcja getcname.Wywołanie (w polskiej wersji AutoCAD-a): (getcname "LINIA") zwraca "_LINE" oraz(getcname "_ARC") zwraca "ŁUK" ale (getcname "ARC") zwroci NIL.
Niestety funkcja ma pewne ograniczenia: zwraca tylko nazwy poleceń (bez opcji), oraz tylko poleceń AutoCAD-a. Polecenia zdefiniowane w osobnych plikach arx, czy polecenia zdefiniowane jako lispowe funkcje typu "C:", nie są rozpoznawane. Jeśli nie znasz skladni angielskiej pleceń ich odpowiednikow i skrotow opcji poleceń, musisz szukac w pomocy, literaturze, lub w sieci. Podsumowując: Dobrze napisany program lispowy wywołania command ma ZAWSZE po angielsku - będzie działał wszędzie.» ...ale to nie koniec: AutoCAD posiada dwa sprytne poleceniaREDEF (_REDEFINE) i UNDEF (_UNDEFINE). Sluzą one do zmiany definicji poleceń AutoCAD-a (i odwrocenia tego stanu). Z wielu różnych powodów moze zaistniec sytuacja że polecenie zostanie przedefiniowanie. Z tego też powodu wywołania poleceń w funkcji command mogą dawać nieoczekiwane efekty. Aby zabezpieczyć się przed taką sytuacją należy do polecenia dodac znak ".", czyli wymagać od AutoCAD-a reakcji na polecenie, nawet wtedy gdy zostalo ono przedefiniowane. Biorąc pod uwage to co było wcześniej powiedziane składnia polecenia powinna wyglądac np. tak:(command "_.ARC" ...) lub (command "._ARC" ...).Jak widać miejsce kropki nie ma znaczenia, może ona znajdowac sie przed lub po znaku podkreślenia. Wspomnieć należy że kropki nie dodaje sie do opcji poleceń, a wiec używamy "_Close" a nie "_.Close".
» Milczenie jest złotem... Skazani nacommand, nie mają wyboru - polecenia AutoCAD-a mają zgłoszenia i pojawiają sie one w linii poleceń. Im polecenie ma więcej opcji i są one wykorzystywane, "zaśmiecanie" linii poleceń jest smutną tego konsekwencją. Pojawianie sie zgloszeń i komunikatow podczas działania programu może być dla uzytkownika denerwujące. Istnieje zmienna systemowa "CMDECHO" (wartośc domyślna 1) ktora pozwala wyłączyc "echo" poleceń. W pomocy (albo w podreczniku użytkownika) poczytaj rownież o zmiennej systemowej "EXPERT" która steruje pojawianiem sie pewnych zgłoszeń dla niektórych poleceń. Dodatkowo zobacz: linia poleceń on-off. Oczywiście nie można zapomnieć o przywróceniu stanu zmienianych zmiennych do ich pierwotnego ustawienia czyli...
» ... o nie pozostawianiu po sobie śladów Dobrym zwyczajem (coraz rzadziej niestety spotykanym) jest tworzenie takiego oprogramowania, aby miało ono jak najmniejszy wpływ na ustawienia AutoCAD-a. Zmiany ustawień pewnych zmiennych systemowych należy pozostawić użytkownikowi, zakładając ze ustawienia takie zapewniają mu odpowiedni komfort pracy.Dlatego jako zasadę należy przyjąć takie działanie programu aby przywracał on poprzednie ustawienia zmiennych, ktorymi manipulował. Pomimo tego że odnosi sie to ogólnie do programowania w AutoLISP-ie, w przypadku stosowania command ma szczególne znaczenie, bo wystepuje najcześciej (w wielu przypadkach używanie innych technik niż command nie wymaga zmian zmiennych systemowych). Działanie takie wiąze się z koniecznością zapamiętywania wartości zmiennych, a po zmianie - ich przywrocenia. Przy wiekszęj ilości zmiennych warto je zapamietywac na jednej liście (jako zmienną globalną LISP). Fakt zmian zmiennych systemowych ma rowniez wpływ na dodatkowe działania w formie budowania funkcji obsługujących błędy - lecz jest to temat osobnych rozważań.
» Rysowanie Rozwijając temat zmiennych systemowych należy zaznaczyć że wykorzystywanie funkcjicommand do zadan rysujących, narażone jest jeszcze na jedno niebezpieczenstwo, związane ze zmienną systemową o nazwie OSMODE. Niezwykle użyteczny tryb lokalizacji obiektow, w czasie "normalnego rysowania z ręki", staje się prawdziwą przeszkodą precyzyjnego rysowania za pomocą LISP-a. Zmienna OSMODE powinna być wyłączona (wartośc 0), zawsze gdy w kodzie programu występuje command wykorzystywany do rysowania.
» Command zmienną jest... Wlaściwie niecommand (jako funkcja) co jej argumenty czyli wywołania poleceń przez nią realizowane. Pojawienie sie nowej wersji AutoCAD-a wiąze sie zwykle z wprowadzeniem nowych poleceń, oraz udoskonaleniem istniejących, czego skutkiem może byc zmiana ich skladni, opcji, zmiana słow kluczowych itp. Wprawdzie istnieje nadzieja (?), ze programiści Autodesk bedą starali sie zachować jak najwiekszą zgodność z poprzednią wersją, lecz w wielu sytuacjach zmiany są tak głębokie że nie jest to możliwe. W takim przypadku z calą pewnością, program wywołujący command (a pracujący bezbłędnie we wcześniejszych wersjach), nie bedzie zdolny do wykonywania swoich zadań.
Z pewnością, jest to jeszcze jeden powód aby zastanowić sie nad innym, alternatywnym sposobem wykonania pewnych dzialań programu - bez używania command.
» Punkty a command Ponieważ wywołanie polecenia przez funkcjecommand nie rożni niczym, od normalnego użycia polecenia w edytorze AutoCAD-a, trzeba pamietać o pewnych prawach rządzących sie poleceniami. Podawanie współrzednych odbywa się w aktualnym układzie współrzednych, oraz że cześc poleceń nie może zostać wykonana w płaszczyznach nierownóleglych do układu aktualnie obowiązującego. Jak wiadomo polecenia opierają sie w wiekszości na komunikacji z użytkownikiem (wskazywanie punktów, wybór obiektow, zmiana opcji, potwierdzenia itp.). Zamiana pewnych cześci dialogu przez wyrażenia LISP, może skutkowac złym, lub niemożliwym działaniem polecenia, ze względu na te ograniczenia. Wywołanie command musi zostac poprzedzone sprawdzeniem, pewnych ustawien rysunku (uklady wspolrzednych), a punkty powinny podlegać transformacji - nie można bowiem zakładac że użytkownik pracuje zawsze w globalnym układzie. Zarówno entmake jak i metody ActiveX w większości, pozwalają tworzyć obiekty w globalnym układzie współrzednych nie bacząc na aktualne ustawienia. Transformacje punktow jako stosunkowo szeroki temat wymagają odrębnego opisu.
» Na koniec Podsumowując, używaniecommand jest najprostszym sposobem rysowania w AutoCAD-zie za pomocą LISP-a. Pamiętanie o kilku wymienionych tutaj powyżej zasadach sprawi, ze command bedzie działał poprawnie i zgodnie z naszymi oczekiwaniami. Niemniej nad zasadnością używania command, w wielu sytuacjach należy sie zastanowić.
|
|
|
|
|