You are on page 1of 22

3/![bojn!{bd{ojfnz!

qsphsbnpxb

44

Zanim zaczn omawia na poszczeglnych przykadach podstawy jzyka AutoLISP,


chciabym w paru punktach poda jeszcze troch teorii, ktra mam nadziej, bdzie
pomocna przy pisaniu Twoich wasnych programw w AutoLISPie.

Wszystkie programy w AutoLISPie s plikami tekstowymi, ktre adujemy do interpretera AutoLISPu funkcj load. Podczas adowania programu nastpuje jego weryfikacja
od strony leksykalnej, natomiast podczas wykonywania programu nastpuje jego weryfikacja od strony formalnej. Poniewa w pierwszym okresie programowania w AutoLISPie prawie kady program bdzie zawiera mniejsz lub wiksz ilo bdw,
Twoja praca bdzie polega przede wszystkim na wczytywaniu, uruchamianiu i poprawianiu bdw w kodzie rdowym programu. Dlatego te chc pokaza Ci, jak
z poziomu programu AutoCAD mona wywoa edytor tekstu.
Pomocny okae si tutaj zbir ACAD.PGP (programm parameters file plik parametrw wywoania programw). Zbir ACAD.PGP powinien si znajdowa w katalogu
gwnym AutoCADa jeli go tam nie ma, naley go utworzy dowolnym edytorem
ASCII.

45

BvupMJTQ!!qsbluzd{oz!lvst
Plik parametrw wywoania programw ACAD.PGP jest plikiem tekstowym, zawierajcym definicje polece AutoCADa. Plik ten podzielono na dwie sekcje: w sekcji pierwszej zdefiniowano sposoby dziaania programu w przypadku wywoywania polece
zewntrznych, natomiast sekcja druga dotyczy tworzenia skrtw nazw polece standardowych. Plik ACAD.PGP moe rwnie zawiera komentarze. Komentarz jest tekstem informacyjnym, poprzedzonym rednikiem (;).
My zajmiemy si tutaj sekcj pierwsz sekcj polece zewntrznych.
Kada linia pliku ACAD.PGP, dotyczca polecenia zewntrznego, posiada pi pl.
Pola te s od siebie oddzielone przecinkami, nawet jeeli s puste. W kolejnych polach
wystpuj:

3/2/2/!Ob{xb!qpmfdfojb
3/2/2/!Ob{xb!qpmfdfojb
Dodane polecenie zewntrzne AutoCADa. Jest to polecenie podawane w odpowiedzi na
zgoszenie Command: (Polecenie:), wystpujce w linii polece AutoCADa. Nie moe
ono pokrywa si z nazw polecenia wewntrznego, gdy w takim przypadku polecenie
zewntrzne bdzie ignorowane. Nazwa moe zawiera litery due i mae.

3/2/3/!Qpmfdfojf!TP!)tztufn
3/2/3/!Qpmfdfojf!TP!)tztufnv!pqfsbdz
TP!)tztufnv!pqfsbdzkofhp*
v!pqfsbdzkofhp*
Pole zawiera acuch tekstowy wysyany do systemu operacyjnego po wywoaniu polecenia zewntrznego AutoCADa. Moe to by kade polecenie dopuszczalne w danym
systemie operacyjnym, rwnie polecenie wewntrzne systemu takie, jak dir czy set.
acuch moe zawiera przeczniki, parametry itd.

3/2/4/!Pct{bs!{xb
3/2/4/!Pct{bs!{xbmojbofk!qbnj
4/!Pct{bs!{xbmojbofk!qbnjdj
mojbofk!qbnjdj
Pole to suy do zapewnienia kompatybilnoci z poprzednimi wersjami AutoCADa
i, mimo e AutoCAD nie korzysta z danych zawartych w tym polu, musi by ono obecne
i zwykle przypisuje mu si warto 0.

3/2/5/![h"pt{fojf
3/2/5/![h"pt{fojf
W polu tym umieszcza si acuch tekstowy, wywietlany po wywoaniu polecenia
w systemie operacyjnym. Odpowied na to zgoszenie jest doczana do acucha
wystpujcego w polu drugim (nazwa polecenia w systemie operacyjnym) lub podaje
nazw bloku, gdy kod powrotu ma przypisan warto 1. Jeli pierwszy znak w polu
jest gwiazdk (*), wtedy odpowied moe zawiera spacje i musi zosta potwierdzona
klawiszem ENTER. Gdy gwiazdka nie wystpuje, odpowied mona zakoczy bd
spacj, bd klawiszem ENTER. W przypadku rezygnacji ze zgoszenia, pole zawiera
acuch pusty ("").

3/![bojn!{bd{ojfnz!qsphsbnpxb

46

3/2/6/!Lpe!qpxspuv
3/2/6/!Lpe!qpxspuv
Jest to pole zawierajce opcjonalny parametr w postaci liczby cakowitej, odpowiadajcej sumie wartoci poszczeglnych bitw, np. jeli uytkownik chce osign tryby
pracy zgodne z wartociami 1, 2 i 4, do pola wprowadza warto 7. Poszczeglne
wartoci maj nastpujce przypisania:
0 powrt do ekranu tekstowego,
1 wczytaj plik DXB,
2 utwrz blok z pliku DXB,
4 powrt do poprzedniego ekranu.
Z powyszych kodw interesujcymi nas wartociami s 0 lub 4. AutoCAD ignoruje w pliku
ACAD.PGP wszystkie linie puste i wszystkie teksty lece na prawo od rednika.
Poniewa moim ulubionym edytorem jest Norton Edytor 2.0, tak wic dopisaem nastpujc lini w pliku ACAD.PGP:
NE,C:\NC\NE,0,Zbior do edycji: ,4

W ten sposb mam nastpujce moliwoci edycji plikw z programami lispowymi:


Command: ne

Zbior do edycji: demo1.lsp

Powysza sekwencja wywouje edytor Nortona z jednoczesnym wczytaniem zbioru


DEMO1.LSP, a w przypadku, gdy zbir DEMO1.LSP nie istnieje w biecym katalogu,
utworzenie pustego zbioru DEMO1.LSP w celu napisania w nim np. nowej funkcji.
Command: ne

Zbior do edycji: c:\users\marek\lisp\demo1.lsp

Powysza sekwencja wywouje edytor Nortona z jednoczesnym wczytaniem zbioru


DEMO1.LSP, znajdujcego si w katalogu C:\USERS\MAREK\LISP, a w przypadku, gdy
zbir DEMO1.LSP nie istnieje w tym katalogu, utworzenie nowego zbioru DEMO1.LSP
w podanym katalogu.
Command: ne

Zbior do edycji:

Powysza sekwencja (nacinicie samego ENTER w odpowiedzi na nazw zbioru do


edycji) wywouje edytor Nortona bez wczytywania jakiegokolwiek zbioru. Zbir do
edycji mona wybra wywoujc opcj FILE => OPEN..., ktra wywietla okno dialogowe katalogw i zbiorw, z ktrych w atwy sposb mona wybra dany zbir.
Command: ne

Zbior do edycji: <Ctrl-C>

47

BvupMJTQ!!qsbluzd{oz!lvst
Powysza sekwencja przerywa komend zewntrzn nastpuje powrt do AutoCADa
bez uruchamiania edytora. Sekwencja powysza moe by przydatna w przypadku
pomykowego wywoania edytora Nortona.
Na koniec tego punktu chciabym jeszcze wymieni kilka najwaniejszych zalet programu Norton Edytor 2.0. Zalety te to:
1. Stosowanie menu rozwijanych, poprzez ktre moliwy jest dostp do wikszoci
funkcji programu.
2. Moliwo wsppracy z mysz.
3. Moliwo pracy z bardzo dugimi dokumentami.
4. Moliwo pracy jednoczenie z dwoma dokumentami, w dwch oknach edycji.
5. Istnienie operacji blokowych umoliwiajcych przenoszenie blokw tekstu
w obrbie jednego bd dwch dokumentw.
6. Moliwo sprawdzania w tekcie dokumentu poprawnej iloci nawiasw
prawych i lewych kadego rodzaju. Z funkcji tej bd korzysta w pierwszej
kolejnoci uytkownicy piszcy programy komputerowe.
7. Moliwo wydrukowania z poziomu edytora caego dokumentu lub zaznaczonego bloku mamy tym samym moliwo wydrukowania kodu interesujcej
nas funkcji bez drukowania caego programu.
Cennymi waciwociami uatwiajcymi redagowanie tekstu s moliwoci skonfigurowania edytora tak, aby:
1. Marginesy ustawiane byy automatycznie, zgodnie z wybran wczeniej ich
dugoci.
2. Sowa wychodzce poza zadeklarowan dugo linii byy przenoszone automatycznie do nastpnej linii.
3. Wcicia linii tekstowych byy ustawiane automatycznie przy przechodzeniu do
linii nastpnej.
Istnieje te moliwo automatycznego formatowania paragrafu bd caego dokumentu, pautomatycznego wprowadzania znakw amania stron lub ich usuwania oraz
ustawiania wielkoci marginesw na stronie drukowanej. Z moliwoci tych nie naley
jednak korzysta podczas pisania kodw rdowych programw, gdy interpreter
AutoLISPu wymaga czystego kodu ASCII (tzn. bez kodw formatujcych dokument).

3/![bojn!{bd{ojfnz!qsphsbnpxb

48

W punkcie tym zostanie podanych kilka najwaniejszych uwag, ktre mam nadziej
pomog Ci zminimalizowa ilo bdw podczas pisania Twoich pierwszych programw w AutoLISPie.
A oto najwaniejsze zasady:
1. W pliku z kodem rdowym programu oddzielaj od siebie poszczeglne funkcje, na przykad:
;========================================
;
(defun FUNKCJA_1 ()
(progn
ciao_funkcji
);progn
);FUNKCJA_1
;
;========================================
;
(defun FUNKCJA_2 ()
(progn
ciao_funkcji
);progn
);FUNKCJA_2
;
;========================================

2. Stosuj wcicia w kodzie rdowym programu. Tak rozplanuj swj kod, e im


bardziej zagniedona jest dana linia kodu, tym dalej odsunita jest od lewego
marginesu. W swoich programach stosuj wcicia co dwie kolumny, np.
(defun FUNKCJA_1 ()
(progn
(setq
x1 (getint "\nPodaj liczbe : ")
x2 (* x1 2)
);setq
(princ
(strcat
"\nLiczba x2 = "
(rtos x2 2 0)
);strcat
);princ
);progn
);FUNKCJA_1

49

BvupMJTQ!!qsbluzd{oz!lvst
3. Kiedy jest to moliwe, stosuj grupowanie komend. Staraj si rwnie nie
umieszcza wicej ni jednej instrukcji w jednej linii, np.
(setq x1 1 x2 "string" x3 (list 1 2 3))

rozbij na:
(setq
x1 1
x2 "string"
x3 (list 1 2 3)
);setq

4. Opatruj komentarzem nawias zamykajcy instrukcji, np.


(setq
.....
.....
);setq

(command
.....
.....
);command

5. Korzystaj z komentarzy w kodzie rdowym programu. Obfite komentowanie


kodu rdowego podczas pisania programw jest prac, ktra sowicie si
opaca. Komentarze te bd przydatne dla Ciebie jak rwnie i dla przyszego
uytkownika Twoich programw, ktry moe by zmuszony do dostosowania
programu do wasnych potrzeb przez zmian czci jego kodu. Komentarze
mog by wykorzystywane na przykad w nastpujcych celach:
do nadawania tytuw, podawania autora lub daty utworzenia funkcji lub
programu,
podawania instrukcji uytkowania programu,
podawania uwag objaniajcych wewntrz kodu funkcji,
umieszczania osobistych notatek podczas uruchamiania programu,
wstawiania znakw poprawiajcych estetyk programu.
6. Korzystaj z funkcji edytora do wyszukiwania odpowiadajcych sobie nawiasw
otwierajcych i zamykajcych sprawdzaj zawsze, czy nawiasowi otwierajcemu funkcji odpowiada nawias zamykajcy. Jeli Twj edytor nie ma opcji
wyszukiwania nawiasw najwyszy czas wymieni go na inny.
7. Po napisaniu kodu funkcji przetestuj j natychmiast, zanim zaczniesz pisa
nastpne funkcje.

3/![bojn!{bd{ojfnz!qsphsbnpxb

4:

Jak ju wspomniaem wczeniej, programy w AutoLISPie zapisywane s w plikach


tekstowych w formacie ASCII. Aby skorzysta z danego programu, naley go najpierw
zaadowa do interpretera AutoLISPu a nastpnie uruchomi. Poniej, w poszczeglnych punktach, podane zostan metody adowania i uruchamiania programw
w AutoLISPie.

3/4/2/
Joufsbldzkof!"bep
zkof!"bepxbojf!qsp
3/4/2/ Joufsbld
zkof!"bepxbojf!qsphsbn(x
xbojf!qsphsbn(x
x!BvupMJTQjf
x!BvupMJTQjf
W metodzie tej, wpisujemy z klawiatury nazw danego programu. Nazwa ta jest
argumentem standardowej funkcji AutoLISPu load, przeznaczonej do adowania
programw w AutoLISPie.
Format funkcji load jest nastpujcy:
(load filename [onfailure])

Argument filename jest acuchem alfanumerycznym (warto typu string), krry reprezentuje nazw pliku bez rozszerzenia (domylnie zakadane jest rozszerzenie .LSP).
Jeeli rozszerzenie pliku jest inne ni .LSP, naley je poda razem z nazw pliku, na
przykad TEST.DAT. Ponadto filename moe zawiera przedrostek okrelajcy ciek
dostpu, na przykad:
"c:/acad12/users/marek/kombajn"

lub
"c:\\acad12\\users\\marek\\kombajn".

Jeli nie podasz w argumencie filename cieki dostpu do pliku, to funkcja load przeszukuje ciek biblioteczn AutoCADa w nastpujcej kolejnoci:
katalog biecy,
katalog zawierajcy plik biecego rysunku,
katalogi okrelone przez zmienn rodowiskow ACAD,
katalog zawierajcy pliki programu AutoCAD.
Jeli argument filename zawiera ciek dostpu, to funkcja load szuka pliku tylko na
tej ciece. Jeeli na tej ciece/ciekach zostanie znaleziony podany plik, to jest on
wczytywany do pamici. Jeli operacja adowania zakoczy si sukcesem, load zwraca
warto ostatniego wyraenia w pliku, ktre czsto jest nazw ostatniej zdefiniowanej

51

BvupMJTQ!!qsbluzd{oz!lvst
w pliku funkcji. Jeeli operacja load zakoczya si porak, zostaje wywietlony odpowiedni komunikat o bdzie. Jeeli jednak funkcja load zawiera opcjonalny argument
onfailure (jeli_bd), to funkcja zwraca warto tego argumentu. Mamy wwczas
moliwo wypisania wasnego komunikatu o bdzie.
Zakadajc przykadowo, e plik C:/ACAD12/USERS/MAREK/TEST1.LSP zawiera
dwie definicje funkcji:
;====================
(defun FUNKCJA_1 ()
(progn
ciao_funkcji
);progn
);FUNKCJA_1
;====================
(defun FUNKCJA_2 ()
(progn
ciao_funkcji
);progn
);FUNKCJA_2
;====================

oraz, e plik TEST2.LSP nie istnieje, a zmienna rodowiskowa ACAD zawiera katalog
C:/ACAD12/USERS/MAREK, otrzymamy nastpujce wyniki wywoania funkcji load:
Command: (load "c:/acad12/users/marek/test1")

FUNKCJA_2
Command:

Powysze wyraenie powoduje przeszukanie katalogu C:/ACAD12/USERS/MAREK


w poszukiwaniu pliku TEST1.LSP. Poniewa plik ten istnieje w podanym katalogu,
zostaje on zaadowany oraz zostaje zwrcona warto ostatniego wyraenia w pliku
FUNKCJA_2.
Command: (load "c:\\acad12\\users\\marek\\test1")

FUNKCJA_2
Command:

Jest to przykad podobny do poprzedniego z t rnic, e cieka dostpu do pliku


podana zostaa w inny sposb.
Command: (load "test1")

FUNKCJA_2
Command:

Powysze wyraenie powoduje przeszukanie cieki bibliotecznej AutoCADa, w poszukiwaniu pliku TEST1.LSP. Poniewa plik ten znajduje si w katalogu C:/ACAD12/
USERS/MAREK, a parametr ten zosta umieszczony w zmiennej rodowiskowej ACAD,
plik zostaje zaadowany oraz zostaje zwrcona warto ostatniego wyraenia
w pliku FUNKCJA_2.
Command: (load "test1" "\nPlik TEST1.LSP nie zostal
wczytany.")

3/![bojn!{bd{ojfnz!qsphsbnpxb

52

FUNKCJA_2
Command:

W powyszym wyraeniu argument onfailure = "\nPlik TEST1.LSP nie zostal


wczytany." nie jest wykorzystany przez funkcj load, bowiem plik TEST1.LSP zosta
znaleziony na ciece bibliotecznej AutoCADa oraz podczas jego wczytywania nie
wykryto bdw.
Command: (load "test2" "\nPlik TEST2.LSP nie zostal
wczytany.")

Plik TEST2.LSP nie zostal wczytany.


Command:

Powysze wyraenie powoduje przeszukanie cieki bibliotecznej AutoCADa, w poszukiwaniu pliku TEST2.LSP. Poniewa plik ten nie istnieje, funkcja load zwraca warto
argumentu onfailure = "\nPlik TEST2.LSP nie zostal wczytany.".
Command: (load "test2")

Can't open "test2.lsp" for input


error: LOAD failed
(LOAD "test2")
*Cancel*
Command:

Powysze wyraenie powoduje przeszukanie cieki bibliotecznej AutoCADa, w poszukiwaniu pliku TEST2.LSP. Poniewa plik ten nie istnieje oraz nie zosta zdefiniowany
opcjonalny argument onfailure, funkcja load powoduje wypisanie standardowego bdu
AutoLISPu.
Funkcja load moe by uyta wewntrz innej funkcji AutoLISPu, a nawet
rekurencyjnie (we wczytywanym pliku).

3/4/3/!+bepxbojf!qsphsbn
/4/3/!+bepxbojf!qsphsbn(x!x!BvupMJ
ojf!qsphsbn(x!x!BvupMJTQjf
(x!x!BvupMJTQjf
{b!qpnpd,!qmjlv!
{b!qpnpd,!qmjlv!BDBE/MTQ
npd,!qmjlv!BDBE/MTQ
Plik ACAD.LSP pozwala na wczytanie biblioteki programw, napisanych w AutoLISPie, przy kadym uruchamianiu AutoCADa lub rozpoczynaniu nowego rysunku.
Plik ACAD.LSP moe zawiera kod AutoLISPu dla jednej lub wikszej liczby funkcji
lub, po prostu, szereg wywoa funkcji load. Zalecam uycie tego drugiego sposobu
postpowania, gdy pozwala on na atwiejsze przeprowadzenie ewentualnych modyfikacji zawartoci biblioteki.
Gdy w pliku ACAD.LSP umiecimy nastpujce linie:
(load "ddtype")
(load "edge")
(load "mvsetup")

53

BvupMJTQ!!qsbluzd{oz!lvst
przy kadym uruchamianiu AutoCADa lub rozpoczynaniu nowego rysunku automatycznie bd wczytywane pliki: DDTYPE.LSP, EDGE.LSP oraz MVSETUP.LSP.
Gdy w pliku ACAD.LSP umiecimy nastpujc lini:
(defun c:k ()(load "kombajn"))

wtedy wpisujc liter k (lub K) w odpowiedzi na polecenie AutoCADa Command:,


spowodujemy zaadowanie pliku KOMBAJN.LSP.
Jeli podczas wczytywania pliku ACAD.LSP zostanie wykryty bd, pozostaa cz
pliku jest ignorowana i nie zostaje wczytana. W takim przypadku pomocne moe
okaza si uycie w funkcji load opcjonalnego argumentu onfailure (jeli_bd).
Plik ACAD.LSP moe wtedy wyglda nastpujco:
(princ (load "ddtype" "\nPlik DDTYPE.LSP nie zostal
wczytany."))
(princ (load "edge" "\nPlik EDGE.LSP nie zostal wczytany."))
(princ (load "mvsetup" "\nPlik MVSETUP.LSP nie zostal
wczytany."))
(princ)

Jeli wywoanie funkcji load koczy si pozytywnie, zwracana jest warto ostatniego
wyraenia w pliku (zwykle nazwa ostatniej funkcji zdefiniowanej w pliku lub komunikat dotyczcy sposobu uycia funkcji). W przypadku wykrycia bdu, zwracana jest
warto opcjonalnego argumentu onfailure. W powyszym przykadzie, warto zwracana przez funkcj load zostaa podstawiona jako argument funkcji princ, co spowoduje, w razie pojawienia si bdu, wywietlenie odpowiedniego komunikatu w linii
polece AutoCADa. Na przykad, jeli zostanie wykryty bd podczas wczytywania
pliku DDTYPE.LSP, funkcja princ wywietli komunikat:
Plik DDTYPE.LSP nie zostal wczytany.

i AutoCAD bdzie kontynuowa wczytywanie dwch nastpnych plikw.


Plik ACAD.LSP moe rwnie zawiera komentarze. Komentarz jest tekstem informacyjnym, poprzedzonym rednikiem ";".
Plik ACAD.LSP poszukiwany jest w pierwszej kolejnoci w katalogu biecym.
Oznacza to, e masz moliwo tworzenia wielu plikw ACAD.LSP, znajdujcych si w rnych katalogach i obsugujcych aplikacje tam umieszczone.
W pliku ACAD.LSP nie naley umieszcza wywoa funkcji command, ani
adnych innych funkcji posiadajcych bezporedni dostp do rysunkowej bazy
danych. Na etapie wczytywania pliku ACAD.LSP rysunek nie jest jeszcze
w peni zainicjowany, tak e mog wystpi nieprzewidziane zachowania
systemu. Aby osign efekt automatycznego wykonywania cigu wywoa
funkcji command po wczytaniu rysunku, naley umieci je w definicji defun
specjalnej funkcji S::STARTUP.

3/![bojn!{bd{ojfnz!qsphsbnpxb

54

3/4/4/!+bepxbojf!qsphsbn
3/4/4/!+bepxbojf!qsphsbn(x!x!BvupMJ
ojf!qsphsbn(x!x!BvupMJTQjf
(x!x!BvupMJTQjf
{b!qpnpd,!plob!e
{b!qpnpd,!plob!ejbmphpxfhp
npd,!plob!ejbmphpxfhp
MPBE!BVUPMJTQ!BOE!BET!
PBE!BVUPMJTQ!BOE!BET!GJMFT
MJTQ!BOE!BET!GJMFT
Okno dialogowe Load AutoLISP and ADS Files (Wczytywanie plikw AutoLISP
i ADS) pozwala Ci zarzdza Twoimi ulubionymi programami. Daje ono moliwo
atwego odnajdowania i wybierania programw uytkowych. Po zlokalizowaniu pliku,
staje si on czci listy Files to Load (Pliki do wczytania). Dziki temu nie bdziesz go
musia szuka za kadym razem, gdy jest potrzebny. Nawet po opuszczeniu AutoCADa
lista wybranych plikw zostaje zachowana w pliku dyskowym APPLOAD.DFS.
Okno dialogowe Load AutoLISP and ADS Files wywoujemy z menu grnego [File]
[Applications...] ([Pliki] [Aplikacje...]) lub wpisujemy z klawiatury APPLOAD.

Poszczeglne opcje okna dialogowego oznaczaj:


File... (Plik...)
Dodaje aplikacj do listy. Wywietlone zostaje okno dialogowe (podobne jak w komendzie OPEN (OTWRZ)) i program oczekuje na wskazanie pliku aplikacji. Nazwa aplikacji i cieka dostpu zostaje umieszczona na licie w oknie dialogowym.
Remove (Usu z listy)
Usuwa wskazane aplikacje z listy.
Save List (Zapisz List)
Zaznaczenie przecznika spowoduje automatyczny zapis na dysku utworzonej listy
aplikacji w momencie opuszczenia okna dialogowego przyciskiem Load, Unload lub
Exit.

55

BvupMJTQ!!qsbluzd{oz!lvst
Load (Wczytaj)
Wczytuje aplikacje wskazane w oknie kartotekowym Files to Load.
Unload (Usu)
Usuwa z pamici aplikacje ADS.
Exit (Koniec)
Opuszcza okno dialogowe.
Help... (Pomoc...)
Wywietla standardowe okno pomocy AutoCADa z opisem komendy APPLOAD.

3/4/5/!Gvoldkb!T;;TU
3/4/5/!Gvoldkb!T;;TUBSUVQ
voldkb!T;;TUBSUVQ
Gdy omawiaem zastosowanie pliku ACAD.LSP, wspomniaem, e aby osign efekt
automatycznego wykonywania cigu wywoa funkcji command po wczytaniu
rysunku, naley umieci je w definicji defun specjalnej funkcji S::STARTUP. Jeeli
funkcja ta jest umieszczona w pliku ACAD.LSP, to zostanie ona automatycznie
wywoana (bez adnych argumentw) przy kadym wczytaniu istniejcego rysunku lub
utworzeniu nowego. Dlatego utworzon przy pomocy defun definicj funkcji
S::STARTUP mona umieci w pliku ACAD.LSP tak, aby zawsze, na pocztku sesji
edycyjnej wykonywana bya sekwencja okrelonych czynnoci wstpnych. Uycie
funkcji S::STARTUP przeanalizujemy na nastpujcych przykadach.

Qs{zlbe!2
Ponisza zawarto pliku ACAD1.LSP spowoduje utworzenie warstw 1 i 2, nadanie
warstwie 1 koloru czerwonego, warstwie 2 koloru niebieskiego, narysowanie na
warstwie 1 okrgu o rodku w punkcie (6,4.5) i promieniu 2, narysowanie na warstwie 2
trjkta o wierzchokach (2,2), (6,7), (10,2) oraz ustalenie warstwy 0 jako warstwy
biecej.
;=================================================ACAD1.LSP
;test funkcji S::STARTUP - wersja 1
;
(defun S::STARTUP ()
(progn
(princ "\nRozpoczecie wykonywania funkcji startowej.")
(command

"_zoom" "_window" "0,0" "12,9"
"_layer"

"_new" "1,2"

"_color" "1" "1"

"_color" 5 2

""

"_layer" "_set" "1" ""

"_circle" (list 6 4.5) 2


3/![bojn!{bd{ojfnz!qsphsbnpxb
"_layer" "_set" "2" ""

"_line" "2,2" '(6 7) (list 10 2) "_c"

"_layer" "_set" "0" ""


);command
(princ "\nZakonczenie wykonywania funkcji startowej.")
(princ)
);progn
);S::STARTUP
;
;=================================================KONIEC

Omwmy teraz wyrnione linie programu:


 Rozpoczynamy cig wywoa funkcji command.
Funkcja command posiada format:
(command [arguments]...)

i suy do wywoania polece AutoCADa z programu napisanego w jzyku


AutoLISP. Argumentami funkcji command s polecenia programu AutoCAD
i ich opcje. Argumenty te mog mie posta acuchw alfanumerycznych, liczb
typu real i integer oraz punktw, zalenie od tego, czego oczekuje wykonywana
wanie funkcja AutoCADa.
 Wywoujemy standardowe polecenie AutoCADa LAYER (WARSTWA). Znak
podkrelenia "_" przed nazw komendy umoliwia jej rozpoznanie w narodowych wersjach AutoCADa.
Tak wic sekwencja:
(command "_layer" ...)

jest rwnowana sekwencji:


(command "warstwa" ...)
Obsuga jzykw narodowych zostaa wprowadzona od wersji 12 programu
AutoCAD. We wczeniejszych wersjach AutoCADa komenda "_layer" nie
zostanie rozpoznana (dotyczy to tak wersji angielskiej jak i wersji narodowych).

 Bdc w dalszym cigu w trakcie wykonywania komendy LAYER, tworzymy


dwie nowe warstwy 1 i 2. Nazwy warstw oddzielone s od siebie przecinkami
i umieszczone w jednym acuchu.
 Przyporzdkowujemy kolor "1" (czerwony) do warstwy "1". Zarwno numer
koloru jak i nazwa warstwy podane s jako acuchy alfanumeryczne.
 Przyporzdkowujemy kolor 5 (niebieski) do warstwy 2. Zarwno numer koloru
jak i nazwa warstwy podane s jako liczby cakowite.
 Koczymy wykonywanie komendy LAYER. Podwjny cudzysw rozumiany
jest przez AutoLISP jako nacinicie klawisza ENTER.
 Wywoujemy now komend LAYER i powodujemy ustalenie warstwy 1 jako
warstwy aktualnej.
 Wywoujemy komend CIRCLE, rysujc okrg.

56

57

BvupMJTQ!!qsbluzd{oz!lvst
Ustalamy warstw 2 jako aktualn.

Wywoujemy komend LINE i rysujemy trjkt zoony z trzech linii.


Zaprezentowane tutaj zostay trzy sposoby podawania wsprzdnych punktu.
Dwa pierwsze z nich, tj. "2,2" '(6 7) s to wsprzdne punktu podane w sposb
jawny (nie moe tu wystpi wyraenie AutoLISPu). W sposobie trzecim, tj. (list
10 2) moemy uy wyrae AutoLISPu, np.:
(setq
x 10
y 1
punkt (list x (+ y 1))
);setq
Zauwa, e utworzono tylko 2 boki trjkta. Narysowanie trzeciego boku
wymusza opcja "_c" (CLOSE ZAMKNIJ) komendy LAYER, ktra powoduje
zamknicie narysowanej figury.

Aby uruchomi plik ACAD1.LSP, wykonaj jedn z nastpujcych czynnoci:


dodaj zawarto pliku ACAD1.LSP do Twojego pliku ACAD.LSP (najlepiej na
kocu pliku ACAD.LSP) pod warunkiem, e funkcja S::STARTUP nie bya
wczeniej zdefiniowana w pliku ACAD.LSP,
przekopiuj plik ACAD1.LSP na ACAD.LSP pod warunkiem, e w biecym
katalogu nie ma jeszcze pliku ACAD.LSP inaczej jego zawarto zostanie
skasowana.
Jeli interesuje Ci, co si stanie, gdy instrukcje z pliku ACAD1.LSP nie byyby czci
funkcji S::STARTUP, we w komentarz definicj funkcji, nie zapominajc o odpowiadajcym jej nawiasie zamykajcym linie wzite w komentarz zaznaczone s tustym
drukiem, opu program AutoCAD i wywoaj go ponownie lub wywoaj nowy rysunek
(aby wczyta ponownie plik ACAD.LSP => ACAD1.LSP).
;(defun S::STARTUP ()
(progn
ciao_funkcji
);progn
;);S::STARTUP

Qs{zlbe!3
W przykadzie 1 pokazaem sposoby podawania wsprzdnych punktu. Pooenie
kadego punktu na paszczynie mona okreli za pomoc ukadu wsprzdnych
prostoktnych (kartezjaskich) lub ukadu wsprzdnych biegunowych. Kady rodzaj
wsprzdnych moe by zapisany w formie wsprzdnych bezwzgldnych lub
w formie wsprzdnych wzgldnych (poprzedzonych znakiem @).

3/![bojn!{bd{ojfnz!qsphsbnpxb

58

Wsprzdne bezwzgldne odnosz si do pocztku ukadu wsprzdnych, wsprzdne wzgldne do ostatnio wskazanego punktu. Jeeli chcesz, aby wprowadzone
wsprzdne odniesione byy do Globalnego Ukadu Wsprzdnych raczej ni do
ukadu biecego to poprzed je znakiem *. Jeeli znaki @ i * wystpuj razem to znak
@ powinien wystpowa przed *.
Poniszy przykad pokazuje kolejne sposoby podawania wsprzdnych punktw .
;*************************************************ACAD2.LSP
;Test funkcji S::STARTUP - wersja 2
;
;Podawanie wspolrzednych punktow w ukladzie
;bezwzglednym, wzglednym oraz biegunowym.
;
;=================================================
;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER...
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
(princ)
;---------);progn
);CZEKAJ
;
;=================================================
;
(defun S::STARTUP (/ p1 p2 p3 p4)
(progn
;---------(command

"_cmdecho" "0"
"_blipmode" "_off"
"_ucs" "_world"
"_zoom" "_window" "0,0" "12,9"
);command

;---------;zastosowanie wspolrzednych bezwzglednych

;
(princ "\nZastosowanie wspolrzednych bezwzglednych.")
(CZEKAJ)
(setq
p1 "1,1"
p2 '(1 8)
p3 (list 11 8)
p4 "11,1"
);setq
(princ "P1=")(princ p1)(princ "
")
(princ "P2=")(princ p2)(princ "
")
(princ "P3=")(princ p3)(princ "
")
(princ "P4=")(princ p4)(princ "
")

59

BvupMJTQ!!qsbluzd{oz!lvst
(command
"_color" "1"
"_pline" p1 p2 p3 p4 "_c"
);command

;---------;zastosowanie wspolrzednych wzglednych
;
(princ "\nZastosowanie wspolrzednych wzglednych.")
(CZEKAJ)
(setq
p1 "2,2"
p2 (strcat "@" "0,5")
p3 (strcat "@" "8,0")
p4 (strcat "@" "0,-5")
);setq
(princ "P1=")(princ p1)(princ "
")
(princ "P2=")(princ p2)(princ "
")
(princ "P3=")(princ p3)(princ "
")
(princ "P4=")(princ p4)(princ "
")
(command
"_color" "3"
"_pline" p1 p2 p3 p4 "_c"
);command

;---------;zastosowanie wspolrzednych biegunowych

;
(princ "\nZastosowanie wspolrzednych biegunowych.")
(CZEKAJ)
(setq
p1 "3,3"
p2 "@3<90"
p3 "@6<0"
p4 "@-3<90"
);setq
(princ "P1=")(princ p1)(princ "
")
(princ "P2=")(princ p2)(princ "
")
(princ "P3=")(princ p3)(princ "
")
(princ "P4=")(princ p4)(princ "
")
(command
"_color" "5"
"_pline" p1 p2 p3 p4 "_c"
);command

;---------(command "_color" "_bylayer")
;---------(princ)
;---------);progn
);S::STARTUP
;
;*************************************************KONIEC

W powyszym przykadzie, funkcj S::STARTUP podzielono na 4 gwne sekcje:

3/![bojn!{bd{ojfnz!qsphsbnpxb

5:

 Ustawienie zmiennych pocztkowych.


Wyczamy echo komend (CMDECHO) oraz znaczniki punktw (BLIPMODE),
ustawiamy globalny ukad wsprzdnych oraz ekran roboczy o wymiarach 129.
Poniewa wystpuj rnice w okrelaniu granic rysunku prototypowego
w wersji 12 i 13 AutoCADa, we wszystkich przykadowych programach wykorzystujcych komendy do rysowania poszczeglnych obiektw rysunkowych,
zastosowano komend ZOOM do ustalenia odpowiednich rozmiarw okna
roboczego.

 Przykad zastosowania wsprzdnych bezwzgldnych.


Jeszcze raz zostay tutaj powtrzone sposoby podawania wsprzdnych punktu
za pomoc acucha, listy kwotowanej oraz zwykej listy.
 Przykad zastosowania wsprzdnych wzgldnych.
Aby uzyska efekt programowego przekazania wsprzdnych wzgldnych,
wsprzdne takie naley poda w formie acucha, gdzie pierwszym znakiem
w acuchu jest znak @. Zgodnie z powyszym przykadem, wsprzdne punktw p2, p3 i p4 wynosz odpowiednio:
p2[X] = p1[X] + 0 = 2
p2[Y] = p1[Y] + 5 = 7
p3[X] = p2[X] + 8 = 10
p3[Y] = p2[Y] + 0 = 7
p4[X] = p3[X] + 0 = 10
p4[Y] = p3[Y] - 5 = 2

 Przykad zastosowania wsprzdnych biegunowych wzgldnych.


Wsprzdne biegunowe podwane w formacie r<
okrelaj pooenie punktu na
paszczynie w biegunowym ukadzie wsprzdnych przez podanie promienia
i kta odchylenia. Wsprzdne biegunowe mog by bezwzgldne (obliczane
wzgldem biecego UCS) lub wzgldne (obliczane wzgldem ostatnio wprowadzonego punktu). Wsprzdne biegunowe wzgldne @r<
okrelaj pooenie
wzgldem ostatnio wprowadzonego punktu. Wsprzdne biegunowe poprzedzone znakiem mnoenia * okrelaj pooenie wzgldem globalnego ukadu
wsprzdnych.
Ukad odniesienia dla pomiaru ktw oraz dodatni kierunek kta ustalamy
komend UNITS (JEDN).

Qs{zlbe!4
Ponisza zawarto pliku ACAD3.LSP definiuje dwie funkcje: FUNKCJA_1 oraz
S::STARTUP. Zadaniem funkcji FUNKCJA_1 jest utworzenie warstwy WARSTWA_1
oraz narysowanie na niej kwadratu. Zadaniem funkcji S::STARTUP jest wywoanie
funkcji FUNKCJA_1.

61

BvupMJTQ!!qsbluzd{oz!lvst
;=================================================ACAD3.LSP
;test funkcji S::STARTUP - wersja 3
;
;------------------------------------------------;definicja funkcji FUNKCJA_1
;
(defun FUNKCJA_1 ()
(progn
(command
"_zoom" "_window" "0,0" "12,9"
"_layer" "_new" "warstwa_1" ""
"_line" "2,2" "2,4" "4,4" "4,2" "_c"
"_layer" "_set" "0" ""
);command
(princ)
);progn
);FUNKCJA_1
;
;------------------------------------------------;wypisanie komunikatu na ekran tekstowy
;
(textscr) ;przejscie na ekran tekstowy
(princ "\nFunkcja FUNKCJA_1 zostala juz zaladowana do
pamieci.")
(princ "\nNacisnij ENTER w celu jej wykonania.")
(setq x (getstring T))
(graphscr) ;przejscie na ekran graficzny
;
;------------------------------------------------;definicja funkcji S::STARTUP
;
(defun S::STARTUP ()
(progn
(FUNKCJA_1) ;wywolanie funkcji FUNKCJA_1
(princ)
);progn
);S::STARTUP
;
;------------------------------------------------;=================================================KONIEC

Ju od razu wida, e plik ACAD3.LSP skada si z trzech gwnych blokw:


definicja funkcji FUNKCJA_1,
wypisanie komunikatu na ekran tekstowy,
definicja funkcji S::STARTUP.
Omwmy po kolei kady z blokw.
W bloku pierwszym definiujemy funkcj FUNKCJA_1, ktrej zadaniem jest narysowanie kwadratu na warstwie WARSTWA_1. Poniewa na etapie wczytywania pliku

3/![bojn!{bd{ojfnz!qsphsbnpxb

62

ACAD.LSP rysunek nie jest jeszcze w peni zainicjowany, funkcj t musimy wywoa
z funkcji S::STARTUP.
W bloku drugim, po przejciu na ekran tekstowy, wypisujemy komunikat o pomylnym
zaadowaniu funkcji FUNKCJA_1. Aby zatrzyma wykonywanie pliku ACAD.LSP,
wywoujemy funkcj getstring, ktra pobiera z klawiatury dowolny cig znakw
zakoczony naciniciem klawisza ENTER. Dopiero wwczas przechodzimy na ekran
graficzny AutoCADa i tym samym koczymy wykonywanie bloku drugiego.
Blok drugi uwidacznia jeszcze jedn wan spraw. Wszystkie wyraenia
w pliku .LSP, nie bdce czci instrukcji defun, s automatycznie wykonywane podczas wczytywania pliku. Wasno t mona wykorzysta do ustalenia
wartoci wybranych parametrw albo wykona wszelkie inne potrzebne procedury wstpne, niezalenie od wywietlenia informacji tekstowych. O praktycznym wykorzystaniu tej wasnoci bdzie jeszcze mowa w dalszej czci ksiki.

W bloku trzecim, definiujemy funkcj S::STARTUP, ktrej zadaniem jest wywoanie


zdefiniowanej wczeniej funkcji FUNKCJA_1.

Qs{zlbe!5
Podczas omawiania pliku ACAD.LSP wspomniaem, e plik ten moe zawiera kod
AutoLISPu dla jednej lub wikszej liczby funkcji lub, po prostu, szereg wywoa
funkcji load. Zalecaem rwnie uycie tego drugiego sposobu postpowania, gdy
pozwala on na atwiejsze przeprowadzenie ewentualnych modyfikacji zawartoci
biblioteki.
W przykadzie trzecim funkcja FUNKCJA_1 zostaa zdefiniowana w taki wanie sposb
(tj. wewntrz pliku ACAD.LSP). Dopki funkcji takich jest niewiele i s one bardzo krtkie,
mona postpi tak jak to zostao zaprezentowane w przykadzie 3. Osobicie odradzam
jednak tego sposobu postpowania. W miar upywu czasu wzronie bowiem liczba
aplikacji, ktrych bdziesz uywa, bd one rwnie coraz dusze. Znalezienie i
poprawienie czegokolwiek w jednym ogromnym pliku bdzie nie lada wyczynem. Inn
niedogodnoci jest te to, e w takich plikach nie mogoby by dwch funkcji o
identycznych nazwach inaczej wczytana ostatnio przesoni wszystkie poprzednie.
Tak wic najlepszym rozwizaniem jest adowanie kolejnych plikw .LSP tak, jak to
opisano w punkcie adowanie programw w AutoLISPie za pomoc pliku
ACAD.LSP, bd tak, jak to zrobimy teraz.
Niech dany bdzie plik ACAD4.LSP, zawierajcy definicj funkcji FUNKCJA_1,
krrej dziaanie jest identyczne jak w przykadzie 3.
Plik ACAD4.LSP wyglda nastpujco:
;=================================================ACAD4.LSP
;test funkcji S::STARTUP - wersja 4
;

63

BvupMJTQ!!qsbluzd{oz!lvst
;------------------------------------------------;definicja funkcji FUNKCJA_1
;
(defun FUNKCJA_1 ()
(progn
(command
"_zoom" "_window" "0,0" "12,9"
"_layer" "_new" "warstwa_1" ""
"_line" "2,2" "2,4" "4,4" "4,2" "_c"
"_layer" "_set" "0" ""
);command
(princ)
);progn
);FUNKCJA_1
;
;------------------------------------------------;=================================================KONIEC

Plik ACAD.LSP mgby wtedy wyglda nastpujco:


;=================================================ACAD.LSP
;------------------------------------------------;tutaj definiujemy pozostala czesc pliku acad.lsp

;------------------------------------------------;tutaj definiujemy nasza funkcje S::STARTUP


;
(defun S::STARTUP ()
(progn
;---------;zaladowanie pliku acad4.lsp
(load "acad4")
;---------;wywolanie funkcji FUNKCJA_1
(FUNKCJA_1)
;---------(princ)
);progn
);S::STARTUP
;
;------------------------------------------------;
;=================================================KONIEC

W pliku ACAD.LSP w funkcji S::STARTUP powodujemy zaadowanie pliku


ACAD4.LSP i wywoanie funkcji FUNKCJA_1.
W tym miejscu moesz zapyta, dlaczego plik ACAD4.LSP adujemy w funkcji
S::STARTUP. W powyszym przypadku nie musimy tego robi, gdy plik ten nie zawiera instrukcji poza obrbem funkcji defun. Gdyby jednak zawarto pliku
ACAD4.LSP bya nastpujca (tustszym drukiem zaznaczone s dodane linie):

3/![bojn!{bd{ojfnz!qsphsbnpxb

64

;=================================================ACAD4.LSP
;plik acad4.lsp po modyfikacji
;test funkcji S::STARTUP - wersja 4
;
;------------------------------------------------;definicja funkcji FUNKCJA_1
;
(defun FUNKCJA_1 ()
(progn
(command
"_zoom" "_window" "0,0" "12,9"
"_layer" "_new" "warstwa_1" ""
"_line" "2,2" "2,4" "4,4" "4,2" "_c"
"_layer" "_set" "0" ""
);command
(princ)
);progn
);FUNKCJA_1
;
;------------------------------------------------;wywoanie funkcji FUNKCJA_1
(FUNKCJA_1)
;------------------------------------------------;=================================================KONIEC

wwczas prba zaadowania pliku ACAD4.LSP poza funkcj S::STARTUP spowodowaaby nieokrelone zachowanie si AutoCADa.
Tak wic, jeli w pliku aplikacji znajduj si instrukcje wywoujce funkcj command,
ktre maj zosta wykonane automatycznie po zaadowaniu programu, program naley
adowa we wntrzu funkcji S::STARTUP. Temat ten bdzie jeszcze poruszany w dalszych czciach ksiki.

3/4/6/!Vsvdib
3/4/6/!Vsvdibnjbojf!qsphsbn
4/6/!Vsvdibnjbojf!qsphsbn(x!x!BvupMJ
njbojf!qsphsbn(x!x!BvupMJTQjf
(x!x!BvupMJTQjf
Po zaadowaniu programu naleaoby go uruchomi. Metod uruchamiania programw
te jest kilka. Oto one, w najwikszym skrcie:
Jeli dany plik zosta napisany poprawnie, po zaadowaniu powinien wywietli
w obszarze komend nazw lub nazwy funkcji, ktre powoduj jego uruchomienie.
Jeli plik zawiera funkcje wykonywane automatycznie po jego zaadowaniu,
sprawa jego uruchomienia sama si rozwizuje.
Wiksze aplikacje, oprcz funkcji wykonywanych automatycznie, posiadaj
swoje wasne menu oraz systemy pomocy dla uytkownika (nie mwic ju o instrukcji obsugi danej aplikacji). Dopiero praca z takimi aplikacjami dostarcza
prawdziwej przyjemnoci.
Jeli dany plik nie posiada adnej z cech wymienionych powyej, naley przegldn go dowolnym edytorem ASCII, wypisa nazwy funkcji w nim zdefinio-

65

BvupMJTQ!!qsbluzd{oz!lvst
wanych i prbowa po kolei uruchamia kolejne funkcje. Bardziej zaawansowani uytkownicy AutoLISPu mog sprbowa analizowa kody poszczeglnych funkcji (jest to jednak dobre dla krtkich plikw o maej liczbie
funkcji).

Rozdzia ten zapozna Ci z przystosowaniem edytora tekstu do pracy pod AutoCADem, poznae najwaniejsze reguy pisania programw (nie tylko w jzyku AutoLISP) oraz sposoby wczytywania i uruchamiania programw w AutoLISPie.
Nastpny rozdzia pomoe Ci zrozumie mechanizm dziaania interpretera AutoLISPu
w jaki sposb i w jakiej kolejnoci realizowane s polecenia wpisywane z klawiatury
bd te wczytywane z pliku.

You might also like