Rozdział l
Podstawy użytkowania
AutoLISP-u
Typy danych w AutoLISP-ie
Wśród wykorzystywanych przez AutoLISP danych można wyróżnić następu-
jące typy:
symbole (typ SYM, symbol)
listy (typ LIST, lista)
łańcuchy alfanumeryczne (typ STR, string)
wartości rzeczywiste (typ REAL, real)
wartości całkowitoliczbowe (typ INT, integer)
deskryptory plików (typ FILE, deskryptor-pliku)
nazwy elementów rysunku AutoCAD-a (typ ENAME, nazwa-elementu)
zbiory wybranych elementów rysunku AutoCAD-a (typ PICKSET, zbiór-
wskazań)
standardowe podprogramy (typ SUBR, funkcja-wewn)
podprogramy zewnętrzne (funkcje ADS)
Zawsze, gdy AutoCAD żąda od użytkownika wprowadzenia danych określo-
nego typu (na przykład punktu lub współczynnika skali), do wprowadzenia
tych danych można wykorzystać wyrażenie AutoLISP-u tego typu lub funkcji
AutoLISP-u, zwracającej wynik wymaganego typu.
Symbole
Symbole w AutoLISP-ie są wykorzystywane do przechowywania wartości.
Poniższy przykład ilustruje użycie funkcji setq do przypisania symbolowi pt1
wartości współrzędnych punktu (1,2):
(setq pt1 '(1 2))
Pojęcia "symbol" i "zmienna" są używane zamiennie.
Typy danych w AutoLISP-ie 9
Podstawy użytkowania AutoLISP-u
Listy
Listy (dane typu list) są szeroko używane przez AutoLISP. Są one efektywną
metodą przechowywania licznych, powiązanych ze sobą wartości jako jeden
symbol. Niektóre funkcje AutoLISP-u stanowią bazę do programowania
dwu- i trójwymiarowych programów użytkowych. Funkcje te zwracają war-
tości współrzędnych punktu w postaci listy.
Do obsługi współrzędnych graficznych AutoLISP wykorzystuje następującą
konwencję:
Punkty dwuwymiarowe
są wyrażane jako lista dwóch liczb rzeczywistych (.X Y), na przykład:
(3.4 7.52)
Pierwsza wartość jest współrzędną X, a druga wartość - współrzędną Y.
Punkty trójwymiarowe
są wyrażane jako lista trzech liczb rzeczywistych (X Y Z), na przykład:
(3.47.52 1.0)
Pierwsza wartość jest współrzędną X, druga wartość - współrzędną Y, a war-
tość trzecia - współrzędną Z.
Łańcuchy alfanumeryczne
Łańcuchy alfanumeryczne (dane typu string) mogą mieć dowolną długość,
gdyż pamięć dla nich jest przydzielana dynamicznie. Chociaż podczas wpro-
wadzania danych typu string obowiązuje ograniczenie długości łańcucha do
132 znaków, to jednak metodą łączenia łańcuchów przy użyciu funkcji strcat,
mogą być tworzone łańcuchy o nieograniczonej długości.
Wartości całkowite
Wartości całkowite (dane typu integer) należą do zbioru liczb całkowitych.
Wprowadzane są bez kropki dziesiętnej. W AutoLISP-ie dane typu integer
są wartościami 32-bitowymi ze znakiem, mieszczącymi się w zakresie od -
2,147,483,648 do +2,147,483,647. Mimo, że wewnętrznie AutoLISP wykorzy-
stuje format 32-bitowy, do wymiany danych pomiędzy AutoLISP-em
i AutoCAD-em wykorzystywanych jest tylko 16 bitów (oznacza to, że do
AutoCAD-a nie można przesłać danych większych niż +32767, lub
mniejszych niż -32768). Jeśli zachodzi konieczność użycia liczby wykra-
czającej poza ten zakres, należy skorzystać z funkcji float, zmieniającej typ
wartości całkowitej na rzeczywistą (typu real), gdyż wartości rzeczywiste są
transferowane jako 32- bitowe.
10 Typy danych w AutoLISP-ie
Rozdział 1
Wartości rzeczywiste
Wartości rzeczywiste (dane typu real) są liczbami zawierającymi kropkę
dziesiętną. Liczby z zakresu od -l do l muszą rozpoczynać się od zera. Liczby
rzeczywiste są przechowywane w postaci liczb zmiennoprzecinkowych o podwój-
nej dokładności. Zapewnia to zapamiętanie co najmniej 14 cyfr znaczących, mimo
że linia poleceń AutoCAD-a pokazuje jedynie sześć cyfr znaczących.
Deskryptory plików
Deskryptory plików są liczbowymi etykietami, związanymi z plikami otwierany-
mi przez AutoUSP. Gdy funkcja AutoLISP-u musi mieć dostęp do pliku (w celu
zapisu lub odczytu), musi być wywołana ta właśnie etykieta. Poniższy przykład
powoduje otwarcie pliku myinfo.dat, udostępniając możliwość czytania go przez
inne funkcje oraz przydziela symbolowi fil wartość deskryptora pliku:
(setą fil (open "myinfo.dat" "r"))
Powyższe wyrażenie może zwrócić na przykład
.
Nazwy elementów
Nazwy obiektów są liczbowymi etykietami, przypisanymi do elementów
w rysunku AutoCAD-a. W rzeczywistości jest to wskaźnik do pliku utrzymy-
wanego przez AutoCAD, w którym AutoLISP może odszukać rekord elemen-
tu w bazie danych i związane z nim wektory (jeśli jest to element widoczny
na ekranie). Etykiety te mogą być wywoływane przez funkcje AutoLISP-u,
umożliwiając wybieranie elementów przeznaczonych do różnego rodzaju wy-
korzystania. Poniższy przykład powoduje przypisanie symbolowi e1 wartości
nazwy obiektu ostatniego elementu umieszczonego w rysunku:
(setq e1 (entlast))
Wyrażenie to może zwrócić wynik o postaci:
Zbiory wskazań
Zbiory wskazań są grupami jednego lub więcej obiektów. Podobnie jak
w zwykłym procesie wybierania obiektów w AutoCAD-zie, w procedurach
AutoLISP-u do tworzenia zbiorów wskazań możliwe jest interakcyjne doda-
wanie lub odejmowanie obiektów do i ze zbioru. Poniższy przykład przypi-
suje symbolowi ssprev zbiór wskazań, składający się z poprzednio wybra-
nych elementów.
(setq ssprev (ssget "P"))
Wyrażenie takie może zwrócić wynik .
Typy danych w AutoLISP-ie 11
Podstawy użytkowania AutoLISP-u
Procedury i procedury zewnętrzne
Wszystkie funkcje AutoLISP-u, opisane w tym podręczniku, są typu subr,
czyli ss^procedurami wewnętrznymi. Procedura typu subr może być przedefi-
niowana za pomocą funkcji defun. W takim wypadku jednak jej oryginalne
znaczenie nie będzie już dostępne dla innych procedur (przedefiniowywanie
procedur wewnętrznych nie jest zalecane). Procedura zewnętrzna (typu ex-
ternal subr) jest procedurą zdefiniowaną przez program użytkowy (aplikację)
w systemie ADS.
Konwencje leksykalne
Wprowadzanie informacji z użyciem AutoLISP-u może odbywać się w różny
sposób. Wyrażenia AutoLISP-u mogą być wpisywane z klawiatury, wczyty-
wane z dyskowego pliku tekstowego w formacie ASCII lub odczytywane ze
zmiennych typu string. We wszystkich przypadkach muszą być zachowane
następujące reguły:
Nazwy symboli mogą stanowić dowolne sekwencje znaków drukarskich
za wyjątkiem:
().'";
Następujące znaki oznaczają koniec nazwy symbolu lub koniec stałej licz-
bowej:
( ) ' " ; (spacja) (koniec linii)
Wyrażenia nie muszą być pisane w jednej linii.
Zwielokrotnione spacje między symbolami są równoważne spacji poje-
dynczej. Stosowanie wcięć wyróżniających linie wchodzące w skład po-
szczególnych wyrażeń nie jest wymagane, ale jednak znacznie poprawiają
one przejrzystość struktury programu. Stosowanie znaków tabulacji
w AutoLISP-ie nie jest zalecane. Najczęściej są one traktowane jak spa-
cje, jednak na niektórych platformach mogą być interpretowane inaczej.
Nazwy symboli i funkcji (podprogramów) mogą być pisane zarówno ma-
łymi, jak i dużymi literami; nie ma to dla AutoLISP-u znaczenia.
Stałe typu integer mogą rozpoczynać się opcjonalnym znakiem + lub -. Jak
wcześniej wspomniano, mieszczą się one w zakresie od -2,147,483,648 do
+2,147,483,647.
Stałe typu real mogą rozpoczynać się od opcjonalnego znaku + lub - i skła-
dać się z jednej lub wielu cyfr, kropki dziesiętnej i kolejnych cyfr. Przykła-
dowo, wprowadzenie .4 nie zostanie zinterpretowane jako wprowadzenie
danej typu real. Poprawne jest wprowadzenie tej liczby w postaci 0.4. Po-
dobnie, zapis 5. nie jest rozpoznawany jako liczba rzeczywista, prawidłowy
jest format 5.0. Liczby rzeczywiste typu real mogą być przedstawiane w no-
tacji wykładniczej. Po liczbie występuje wtedy opcjonalnie litera e lub E, któ-
ra poprzedza wartość wykładnika jej potęgi (oznacza to, że 0.0000041
i 4.1e-6 to te same wartości).
Łańcuchy alfanumeryczne są sekwencjami znaków ujętych z obu stron
12 Konwencje leksykalne
Rozdział 1
podwójnymi cudzysłowami. Umieszczany w obrębie między cudzysłowa-
mi znak lewego ukośnika (\)jest używany w celu umożliwienia wprowa-
dzania znaków sterujących (lub tzw. kodów sterujących).
Aktualnie rozpoznawanymi kodami są:
Tabela 1-1. Kody sterujące
\\ oznacza pojedynczy znak \
\" oznacza pojedynczy znak"
\e oznacza znak ucieczki (escape)
\n oznacza znak nowej linii
\r oznacza znak powrotu karetki (retum)
\t oznacza znak tabulacji (łab)
\nnn oznacza znak o kodzie ósemkowym nnn
Na przykład poniższa instrukcja powoduje pojawienie się zgłoszenia go-
towości z pytaniem o punkt:
(prompt "NWskaż pierwszy punkt: ")
Natomiast instrukcja
(princ "\361")
w systemach opartych o DOS wyświetla znak "+/-".
Znak apostrofu jest skróconą formą funkcji cytowania (quote). Stąd:
'foo jest równoważne (quote foo)
W plikach programów w AutoLISP-ie mogą być umieszczane komenta-
rze. Komentarze rozpoczynają się średnikiem i kończą wraz z końcem li-
nii. Oto przykłady komentarzy:
; Ta linia tekstu jest komentarzem
(setq area (* pi r r)) ; Obliczenie powierzchni okręgu
Ignorowany jest każdy tekst pomiędzy "; | ... |;". Dzięki temu możliwe
jest tworzenie komentarzy wewnątrz linii kodu lub komentarzy zajmu-
jących wiele linii. Przykładem komentarza wewnątrz linii programu mo-
że być poniższa instrukcja:
(setq tmode ;l tu jakaś uwaga l; (getvar "tilemode"))
Poniższe linie zawierają przykład komentarza zajmującego wiele linii:
(setvar "orthomode" 1) ;ltu rozpoczyna się komentarz i zajmuję tę linię, a koń-
czy się aż tu. l; (princ ("\nORTHOMODE w stanie aktywnym.")
Konwencje leksykalne 13
Podstawy użytkowania AutoLISP-u
Interpreter AutoLISP-u
Działanie każdego interpretera LISP-ujest podobne. Podstawowymi opera-
cjami są kolejno: pobranie linii wyrażenia wprowadzonego przez użytkow-
nika, wyznaczenie jego wartości dewaluacja) i zwrócenie otrzymanego wyni-
ku. Proces wartościowania obiektów podlega w AutoLISP-ie następującym regu-
łom:
Wynikiem ewaluacji obiektów typu integer, real, string oraz deskryptorów
plików i funkcji wewnętrznych są te same obiekty.
Wynikiem ewaluacji symboli są przypisane im aktualnie wartości.
Wynik ewaluacji list zależy od pierwszego elementu listy. Jeżeli wynikiem
ewaluacji tego elementu jest:
lista (lub nil), to przyjmowane jest założenie, że lista jest definicją
funkcji i wartość funkcji jest wyznaczana dla argumentów, którymi
są pozostałe elementy listy;
nazwa funkcji wewnętrznej (podprogramu), to pozostałe elementy listy
traktowane są jako argumenty formalne tej funkcji i są poddawane
ewaluacji przez podprogram.
Wyrażenia w AutoLISP-ie
Wszystkie wyrażenia w AutoLISP-ie mają następującą postać:
(nazwa-funkcji (argumenty)...)
Każde wyrażenie rozpoczyna się lewym nawiasem okrągłym i składa się z nazwy
funkcji i opcjonalnej listy argumentów tej funkcji (z kolei każdy z argumentów też
może być wyrażeniem). Wyrażenie kończy się prawym nawiasem okrągłym. Każ-
de wyrażenie zwraca jakąś wartość, która może być wykorzystana przez wyra-
żenie wyższego poziomu (czyli zawierające rozpatrywane wyrażenie). Jeżeli nie
istnieje wyrażenie wyższego poziomu, wartość zwracana jest do AutoCAD-a.
Jeżeli w odpowiedzi na zgłoszenie gotowości AutoCAD-a Polecenie: zosta-
nie wprowadzone wyrażenie AutoLISP-u, to jego wartość jest bezzwłocznie
wyznaczana i wyświetlana przez AutoLISP. Potem ponownie pojawia się
zgłoszenie AutoCAD-a Polecenie:. AutoLISP wyświetla liczby rzeczywiste
typu real z dokładnością do 6 cyfr znaczących.
Jeżeli zostanie wpisane (lub wczytane z pliku) wyrażenie formalnie niepo-
prawne, AutoLISP może wyświetlić następujący komunikat:
n>
gdzie n jest liczbą całkowitą typu integer, która pokazuje ile otwartych le-
wych nawiasów nie zostało zamkniętych prawymi. Aby wybrnąć z tej sytu-
acji, należy wprowadzić w odpowiedzi n prawych nawiasów. Często popeł-
nianą pomyłką j est ominięcie w łańcuchu znaków tekstowych zamykaj ącego
cudzysłowu podwójnego ("). W tym przypadku, prawe nawiasy są interpre-
towane dosłownie, jakby były ujęte w cudzysłów i ich wprowadzanie nie daje
efektu w postaci zmiany n. W takiej sytuacji, aby skorygować popełniony
błąd, należy unieważnić funkcję przez wciśnięcie klawiszy Ctrl + C, a następnie
14 Interpreter AutoLISP-u
Rozdział 1
ponownie wprowadzić ją poprawnie.
Zmienne w AutoLISP-ie
W AutoLISP-ie można korzystać ze zmiennych czterech typów: całkowitych
(integer), rzeczywistych (real), punktowych (point) i łańcuchów alfanumery-
cznych (string). Zmienna zostaje przyporządkowana do określonego typu
automatycznie, w oparciu o przypisywaną jej wartość. Zmienne zachowują
swoją wartość aż do momentu przypisania im innej wartości lub zakończenia
bieżącej sesji edycji. Zmienne mogą otrzymywać dowolne nazwy pod warun-
kiem, że zaczynają się one od litery. Zmienna pi ma wstępnie przypisaną war-
tość n. Można jej używać tak, jak dowolnej innej zmiennej zdefiniowanej sa-
modzielnie.
Do przypisywania zmiennym wartości służy w AutoLISP-ie funkcja setq. Jej
format jest następujący:
(setq nazwa-zmiennej wartość)
Funkcja setq powoduje przypisanie określonej wartości zmiennej o podanej
nazwie. Ponadto zwraca wartość jako wynik wykonania funkcji. Użycie fun-
kcji setq w odpowiedzi na zgłoszenie Polecenie: AutoCAD-a powoduje usta-
lenie wartości zmiennej i wyświetlenie przypisywanej wartości. Nawiasy
okrągłe, obejmujące wyrażenie, są konieczne. Oto kilka przykładów:
(setq k 3)
(setq x 3.875)
(setq layname "EXTERIOR-WALLS")
W przykładach tych kolejno następuje przypisanie wartości zmiennym typu:
całkowitego, rzeczywistego i łańcuchowego. Zmienne typu punktowego są
bardziej złożone, gdyż zawierają współrzędne X, Y i (opcjonalnie) Z. Punkty
są przedstawiane jako listy dwóch lub trzech liczb, ujętych w nawiasy okrąg-
łe, na przykład:
(3.875 1.23) punkt dwuwymiarowy (2W)
(88.0 14.77 3.14) punkt trójwymiarowy (3W)
Pierwsza wartość jest współrzędną X, druga - współrzędną Y, a trzecia (o ile
występuje) - współrzędną Z. Do utworzenia takiej listy współrzędnych może
być wykorzystana funkcja list:
(list 3.875 1.23)
(list 88.0 14.773.14)
Jak z tego wynika, do przypisania określonych współrzędnych do zmiennej
typu punktowego można wykorzystać jedną z poniższych instrukcji:
(setq pt (list 3.875 1.23))
(setq pt (list 88.0 14.77 3.14))
(setq pt (list abc 1.23))
Ostatnie z powyższych wyrażeń wykorzystuje wartość zmiennej abc w cha-
rakterze współrzędnej X punktu.
Każdą ze współrzędnych: X, Y lub Z można wykorzystywać indywidualnie,
dzięki trzem dalszym wewnętrznym funkcjom: car, cadr i caddr.
Interpreter AutoLISP-u 15
Podstawy użytkowania AutoLISP-u
(car pt)
(cadr pt)
(caddr pt)
zwraca współrzędną X zmiennej punktowej pt
zwraca współrzędną Y zmiennej punktowej pt
zwraca współrzędną Z zmiennej punktowej pt
Przypuśćmy na przykład, że zmiennym pt1 i pt2 przypisano punkty (1.0 2.0)
i (3.0 4.0), definiujące lewy dolny i prawy górny wierzchołek prostokąta. Ko-
rzystając z funkcji car i cadr można wyznaczyć punkt pt3 lewego górnego
wierzchołka prostokąta, wydobywając współrzędną X z punktu pt1, a współ-
rzędną Y - z punktu pt2:
(setq pt3 (list (car pt1) (cadr pt2)))
Powyższe wyrażenie przypisuje zmiennej pt3 punkt (1.0,4.0).
Wartości zmiennych AutoLISP-u mogą być wykorzystywane jako odpowiedzi
na zgłoszenia gotowości AutoCAD-a. W tym celu należy wprowadzić nazwę
zmiennej, poprzedzoną wykrzyknikiem !. Przypuśćmy na przykład, że
wcześniej została zdefiniowana zmienna abc o wartości 14.88702. W każ-
dym wypadku, gdy w odpowiedzi na zgłoszenie AutoCAD-a powinna być po-
dana wartość 14,88702, można wpisać !abc. Na przykład:
Odległość między kolumnami: !abc
Analogicznie, jeśli ma być narysowany odcinek o końcu w punkcie (1.0,4.0),
a wcześniej zmiennej pt został przypisany ten właśnie punkt, można wpro-
wadzić następującą odpowiedź:
Polecenie: linia
Od punktu: !pt
Uwagi:
1. Aby wyrażenie lub wywołanie zmiennej AutoLISP-u zostało zinterpre-
towane właściwie, pierwszym znakiem wprowadzonym w odpowiedzi na
zgłoszenie gotowości musi być lewy nawias (lub wykrzyknik !.
2. Jeżeli zmienna lub wyrażenie AutoLISP-u mają zostać wykorzystane do
wprowadzenia łańcucha tekstowego dla takich poleceń, jak TEKST lub
ATRDEF, należy wcześniej ustawić zmienną systemową TEXTEVAL na
l. Konieczność ta wynika stąd, że zwyczajny tekst także może rozpoczy-
nać się od nawiasu (lub wykrzyknika !.
3. Odwołanie do zmiennej AutoLISP-u nie może być wykorzystane do wpro-
wadzenia polecenia AutoCAD-a. Na przykład, po przypisaniu zmiennej
x wartości "linę" i podaniu !x, w odpowiedzi na zgłoszenie AutoCAD-a
Polecenie:, spowoduje wyświetlenie wartości "linę" w linii poleceń. Pole-
cenie LINIA nie zostanie wywołane. Do wywoływania poleceń
AutoCAD-a z programów AutoLISP-u służy funkcja command, omówio-
na na stronie 107.
16 Interpreter AutoLISP-u
Rozdział 1
Biblioteki i automatyczne wczytywanie definicji
funkcji
Definicje funkcji mogą być przechowywane w plikach dyskowych i wczyty-
wane do pamięci przy użyciu opisywanej dalej funkcji load lub umieszczone
w pliku acad.isp. Jeżeli na dysku znajduje się plik acad.lsp, to przy każdym
uruchomieniu edytora rysunku AutoCAD-a jest on automatycznie wczyty-
wany przez AutoLISP. Wczytanie pliku .Isp związane jest z automatycznym
wyznaczaniem wartości umieszczonych w nim wyrażeń AutoLISP-u. Naj-
częściej pliki .Isp wykorzystują funkcję defun do przechowywania w pamięci
komputera grup funkcji, gotowych do późniejszego użycia (patrz opis funkcji
defun na stronie 111).
Jeśli zdefiniowana funkcja ma nazwę postaci C:XXX, to można j ą wywoływać
z linii poleceń, w sposób identyczny jak wewnętrzne polecenia AutoCAD-a.
Następna część omawia bliżej tę ideę.
Ważne: Przedrostek S:: nazwy funkcji należy traktować jako rezerwowy.
Aby uniknąć konfliktu z innymi funkcjami, przedrostek S:: powinien być
wykorzystywany jedynie do specjalnej funkcji S::STARTUP, opisanej na
stronie 20.
Funkcje C:XXX- Definiowanie nowych poleceń AutoCAD-a
Funkcja defun umożliwia definiowanie funkcji, pozwalających na wprowa-
dzanie do programu AutoCAD nowych poleceń. Funkcje takie, by mogły być
używane jako polecenia AutoCAD-a, muszą spełniać następujące warunki:
1. Funkcja musi mieć nazwę w postaci C:XXX(zapisaną przy użyciu dużych
lub małych liter). Zawsze musi występować przedrostek C:. Część nazwy
oznaczona przez XXXjest dowolnie wybraną nazwą właściwą polecenia.
Funkcja C:XXX może być wykorzystana do przesłonięcia wbudowanego
polecenia AutoCAD-a, jeśli definicja tego polecenia nie została wcześ-
niej unieważniona poleceniem UDEF (polecenie UDEF jest opisane
w AutoCAD Podręcznik Użytkownika).
Uwaga: W omawianym tu wypadku, C: jest specjalnym przedrostkiem,
oznaczającym funkcję wywoływaną z linii poleceń. Nie jest to odwołanie
do napędu dyskowego.
2. Funkcja musi być zdefiniowana z pustą listą argumentów (dopuszczalne są
jednak symbole lokalne). Symbole lokalne są omówione w opisie funkcji
setq, na stronie 167.
Przykład
Przedstawiony dalej przykład pokazuje definicję funkcji służącej do rysowa-
nia kwadratu przy wykorzystaniu polilinii.
(defun C:KWADRAT (/ pkt1 pkt2 pkt3 pkt4 długość-boku)
(setq pkt1 (getpoint "Dolny lewy róg kwadratu: "))
(setq długość-boku (getdist pkt1 "Długość boku: "))
(setq pkt2 (polar pkt1 0.0 długość-boku))
Biblioteki i automatyczne wczytywanie definicji funkcji 17
Podstawy użytkowania AutoLISP-u
(setq pkt3 (polar pkt2 (/ pi 2.0) długość-boku))
(setq pkt4 (polar pkt3 pi długość-boku))
(command "PLINIA" pkt1 pkt2 pkt3 pkt4 "Z")
)
Tak zdefiniowana funkcja może być wywoływana przez wprowadzenie sta-
nowiącego część jej nazwy ciągu znaków XXXw odpowiedzi na zgłoszenie Po-
lecenie:. Jeżeli XXX nie jest nazwą znanego polecenia, to AutoCAD próbuje
wywołać bez parametrów funkcjęAutoLISP-uC:XXX. W przypadku przykła-
dowej funkcji C: KWADRAT, dialog z użytkownikiem przebiega następująco:
Polecenie: kwadrat
Dolny lewy róg kwadratu: (punkt)
Długość boku: (odległość)
Funkcja wywołuje następnie polecenie PLINIA programu AutoCAD i prze-
kazuje dane, potrzebne do narysowania kwadratu, jako odpowiedzi na po-
jawiające się kolejne zgłoszenia gotowości.
Możliwość dodawania w ten sposób poleceń do AutoCAD-ajest bardzo istot-
ną zaletą AutoLISP-u. Nowe, raz zdefiniowane polecenie, może wykorzystać
wszystkie możliwości oferowane przez AutoLISP. Wykorzystanie nowego po-
lecenia nie wymaga umieszczania jego nazwy w nawiasach. Polecenia wbu-
dowane za pomocą AutoLISP-u są więc używane dokładnie tak samo, jak
wszystkie inne polecenia AutoCAD-a.
Zdefiniowana w ten sposób funkcja może być uruchamiana współbieżnie,
w odpowiedzi na każde zgłoszenie dowolnego wewnętrznego polecenia
AutoCAD-a, pod warunkiem jednak, że funkcja wywoływana współbieżnie
nie zawiera wywołań funkcji command. Przy współbieżnym stosowaniu po-
lecenia zdefiniowanego funkcją C:XXX, nazwę XXX należy poprzedzić apo-
strofem '"" (w powyższym przykładzie będzie to 'KWADRAT). Jeśli podczas
działania polecenia typu C:XXX trzeba współbieżnie wywołać inną funkcję,
jej nazwę należy poprzedzić apostrofem '"" (tak jak wszystkie polecenia wy-
woływane współbieżnie).
Podczas wywoływania funkcji zdefiniowanej jako polecenie z wnętrza
innej funkcji AutoLISP-u, należy podać pełną nazwę (czyli na przykład
(C:KWADRAT)).
Uwaga: Zwykle nie można odpowiedzieć wyrażeniem AutoLISP-u na zgło-
szenie polecenia, zaimplementowanegojako funkcja AutoLISP-u. Jeśli jed-
nak procedura w AutoLISP-ie korzysta z funkcji initget, dla pewnych funkcji
możliwe jest podanie dowolnej odpowiedzi z klawiatury. Dzięki temu możli-
we jest zaakceptowanie wyrażenia AutoLISP-u w odpowiedzi na zgłoszenie
polecenia zaimplementowanegojako funkcja AutoLISP-u. Również wartości
zwracane przez wyrażenia typu DIESEL mogą wykonywać pewne obliczenia
na bieżącym rysunku i zwracać te wartości do AutoLISP-u. W rozdziale 8
AutoCAD Podręcznik Adaptacyjny można znaleźć więcej informacji na temat
języka wyrażeń łańcuchowych DIESEL.
Biblioteki funkcji - wczytywanie automatyczne
Po utworzeniu biblioteki użytecznych procedur AutoLISP-u, możliwe jest
spowodowanie, że będzie ona automatycznie wczytywana podczas każdego
uruchamiania AutoCAD-a. Jeśli plik acad.lsp istnieje na bibliotecznej ścież-
ce poszukiwań, zostaje on automatycznie wczytywany przy każdym urucho-
18 Biblioteki i automatyczne wczytywanie definicji funkcji
Rozdział 1
mieniu AutoCAD-a oraz przy każdym rozpoczęciu nowego rysunku.
Innym typem plików, które mogą być wczytywane automatycznie, są pliki
.mni. Pliki takie zawierają zwykle procedury AutoLISP-u, konieczne do wła-
ściwego działania plików menu (.mnu). Po wczytaniu pliku menu (wskutek
rozpoczęcia nowego rysunku lub wywołania polecenia MENU), AutoCAD po-
szukuje pliku .mni o nazwie takiej, jak wczytany właśnie plik menu i w tym
samym katalogu, co ten plik. Jeśli plik .mni spełniający te warunki zostanie
znaleziony, po wczytaniu pliku menu AutoCAD wczytuje zawarty w nim kod
w AutoLISP-ie (oznacza to, że po wczytaniu skompilowanego pliku menu
acad.mnx, AutoCAD wczytuje plik acad.mni).
Istnienie plików acad.lsp i acad.mni nie jest konieczne. Jeśli jednak co naj-
mniej jeden z nich istnieje, AutoCAD wczytuje najpierw acad.lsp, a nastę-
pnie związany z nim plik .mni.
Jeśli plik menu jest wczytywany przez funkcję AutoLISP-u command, to
związany z tym menu plik .mni nie zostanie wczytany, aż do zakończenia
pracy całej procedury w AutoLISP-ie.
Biblioteczna ścieżka poszukiwań plików jest przeglądana przez AutoCAD
w następującej kolejności:
1. Katalog bieżący.
2. Katalog zawierający bieżący rysunek.
3. Katalogi o nazwach podanych przez zmienną środowiskową ACAD (o ile
zmienna ta została określona).
4. Katalog zawierający pliki programu AutoCAD.
Pliki acad.lsp i acad.mni mogą bezpośrednio definować potrzebne funkcje
AutoLISP-u, lub mogą zawierać wywołania funkcji load, wczytującej zawar-
tość innych plików . Ta druga metoda ułatwia edycję tych plików i zmniejsza
ich wielkość.
Poniżej podany jest przykład zawartości pliku acad.lsp lub acad.mni (przy
założeniu, że pliki wczytywane przez kolejne wywołania funkcji load znaj-
dują się na bibliotecznej ścieżce poszukiwań).
(load "3darray")
(tóad "chgtext")
(load "setup")
(load "newJunc")
(princ)
wczytuje plik Sdarray.lsp
wczytuje plik chgtext.lsp
wczytuje plik setup.lsp
wczytuje plik new_func.lsp
opuszcza plik bez zbędnego wydruku
Opisane tu możliwości można wykorzystać do utworzenia biblioteki funkcji
użytecznych i dostępu do nich zawsze, gdy mogą być potrzebne.
Uwaga: W plikach acad.lsp i acad.mni nie należy umieszczać wywołań fun-
kcji command, ani żadnych innych funkcji posiadających bezpośredni dostęp
do rysunkowej bazy danych. Na etapie wczytywania tych plików rysunek nie
jest w pełni zainicjowany, tak że mogą wystąpić nieprzewidziane zachowa-
nia systemu. Jeśli potrzebne jest wywołanie tego typu funkcji, należy zasto-
sować funkcję S::STARTUP.
Aby osiągnąć efekt automatycznego wykonywania ciągu wywołań funkcji
command po wczytaniu rysunku, należy umieścić je w definicji defun spe-
cjalnej funkcji S::STARTUP.
Biblioteki i automatyczne wczytywanie definicji funkcji 19
Podstawy użytkowania AutoLISP-u
Funkcje S::STARTUP - Automatyczne wykonanie
funkcji
Jeżeli zdefiniowana przez użytkownika funkcja S::STARTUP jest umiesz-
czona w pliku acad.lsp lub acad.mni, to zostanie ona automatycznie wywo-
łana (bez żadnych argumentów) przy każdym wczytaniu istniejącego rysun-
ku lub utworzeniu nowego. Dlatego utworzoną przy pomocy defun definicję
funkcji S::STARTUP można umieścić w pliku acad.lsp tak, aby zawsze, na
początku sesji edycyjnej wykonywana była sekwencja określonych czynności
wstępnych.
Przykład
Jeżeli użytkownik chce zastąpić standardowe polecenia AutoCAD-a
REZYGNUJ i KONIEC swoimi własnymi, to powinien umieścić w pliku
acad.lsp następujące linie:
(defun C:REZYGNUJ ()
... definicja ...
)
(defun C:KONIEC ()
... definicja ...
)
(defun S::STARTUP ()
(command "udef" "rezygnuj")
(command "udef" "koniec")
)
Przed zainicjowaniem rysunku nowe definicje funkcji REZYGNUJ i KO-
NIEC zostaną utworzone za pomocą funkcji defun. Gdy już całkowicie za-
kończy się inicjowanie rysunku, funkcja S::STARTUP jest wywoływana
i anulowane zostają standardowe definicje poleceń REZYGNUJ i KONIEC.
Ze względu na to, że funkcja startowa S::STARTUP może być zdefiniowana
w wielu miejscach (w plikach acad.lsp, acad.mni lub dowolnym innym pliku
AutoLISP-u, wczytanym przez któryś z tych dwóch plików), może dojść do
przykrycia poprzedniej definicji funkcji S::STARTUP przez nową. Poniższy
przykład pokazuje metodę, gwarantującą harmonijną współpracę tej funkcji
z pozostałymi.
(defun mystartup ()
... funkcja startowa użytkownika ...
)
(if s::startup
(setq s::startup (append s::startup '((mystartup))))
(defun s::startup () (mystartup))
)
20 Biblioteki i automatyczne wczytywanie definicji funkcji
Rozdział 1
Obsługa błędów
Jeżeli AutoLISP wykryje błąd w trakcie wyznaczania wartości jakiegoś wy-
rażenia, to pojawi się następujący komunikat:
błqd: tekst
gdzie fekstjest opisem błędu. Jeżeli funkcja *error* zostanie zdefiniowana
i jest ona różna od nil, to jest ona wykonywana przez AutoLISP zamiast wy-
świetlania komunikatu, a tekst jest wówczas argumentem tej funkcji. Jeżeli
funkcja *error* nie jest zdefiniowana, lub jej aktualną wartością jest nil, to
AutoLISP przerywa proces ewaluacji i wyświetlony zostaje sięgający do 100
poziomów wstecz zapis wywołanych funkcji i ich wywołań.
Kod ostatniego błędu jest zapamiętywany jako wartość zmiennej systemo-
wej AutoCAD-a o nazwie ERRNO, którą można odczytać za pomocą fun-
kcji getvar. Dodatkowe informacje można znaleźć w części "Obsługa
błędów', przy opisach komunikatów błędów w dodatku D i w opisach ko-
dów błędów w dodatku C. Funkcja *error*jest opisywana w rozdziale 4.
Można także ostrzec użytkownika o wystąpieniu warunków błędu wyświet-
lając okno ostrzegawcze, czyli małe okno dialogowe zawierające komunikat
dostarczony przez program. W celu wyświetlenia okienka alarmowego nale-
ży wywołać funkcję alert. Okna ostrzegawcze są bardziej absorbującym użyt-
kownika sposobem ostrzegania go o błędach, gdyż przed kontynuowaniem
programu musi on wcisnąć przycisk ekranowy TAK.
Przykład
poniższe wywołanie funkcji alert wyświetla ukazane poniżej okno ostrzegawcze:
(alert "Nie znaleziono pliku:")
Więcej informacji na temat funkcji alert można znaleźć w rozdziale 4.
Obsługa błędów 21
Wyszukiwarka
Podobne podstrony:
01 podstawy
01 Podstawy języka UML 2 0
01 podstawowe pojecia
Podstawy uzytkowania programu LabView
01 Podstawy teoretyczne
2008 01 Podstawy terapii przeciwzastoinowej dla pacjentow w warunkach domowych
01 podstawowe pojęcia
Ćwiczenie 2 3 Podstawy użytkowania wiersza poleceń systemu Windows 2000;XP;2003
GI W 01 podstawowe figury i aksonometria
Matematyka dyskretna 2004 01 Podstawowe pojęcia, oznaczenia
01 PODSTAWY RACHUNKU PRAWDOPODOBIENSTWA
więcej podobnych podstron