3/![bojn!{bd{ojfnz!q3ph3bnpxb 44 Zanim zacznÄ… omawiać na poszczególnych przykÅ‚adach podstawy jÄ…zyka AutoLISP, chciaÅ‚bym w paru punktach podać jeszcze trochÄ… teorii, która mam nadziejÄ…, bÄ…dzie pomocna przy pisaniu Twoich wÅ‚asnych programów w AutoLISPie. Wszystkie programy w AutoLISPie sÄ… plikami tekstowymi, które Å‚adujemy do interpre- tera AutoLISPu funkcjÄ… load. Podczas Å‚adowania programu nastÄ…puje jego weryfikacja od strony leksykalnej, natomiast podczas wykonywania programu nastÄ…puje jego wery- fikacja od strony formalnej. Ponieważ w pierwszym okresie programowania w Auto- LISPie prawie każdy program bÄ…dzie zawieraÅ‚ mniejszÄ… lub wiÄ…kszÄ… ilość bÅ‚Ä…dów, Twoja praca bÄ…dzie polegać przede wszystkim na wczytywaniu, uruchamianiu i popra- wianiu bÅ‚Ä…dów w kodzie zródÅ‚owym programu. Dlatego też chcÄ… pokazać Ci, jak z poziomu programu AutoCAD można wywoÅ‚ać edytor tekstu. Pomocny okaże siÄ… tutaj zbiór ACAD.PGP (programm parameters file plik para- metrów wywoÅ‚ania programów). Zbiór ACAD.PGP powinien siÄ… znajdować w katalogu głównym AutoCADa jeÅ›li go tam nie ma, należy go utworzyć dowolnym edytorem ASCII. 45 BvupMJTQ! !q3bluzd{oz!lv3t Plik parametrów wywoÅ‚ania programów ACAD.PGP jest plikiem tekstowym, zawiera- jÄ…cym definicje poleceÅ„ AutoCADa. Plik ten podzielono na dwie sekcje: w sekcji pier- wszej zdefiniowano sposoby dziaÅ‚ania programu w przypadku wywoÅ‚ywania poleceÅ„ zewnÄ…trznych, natomiast sekcja druga dotyczy tworzenia skrótów nazw poleceÅ„ stan- dardowych. Plik ACAD.PGP może również zawierać komentarze. Komentarz jest tek- stem informacyjnym, poprzedzonym Å›rednikiem (;). My zajmiemy siÄ… tutaj sekcjÄ… pierwszÄ… sekcjÄ… poleceÅ„ zewnÄ…trznych. Każda linia pliku ACAD.PGP, dotyczÄ…ca polecenia zewnÄ…trznego, posiada piąć pól. Pola te sÄ… od siebie oddzielone przecinkami, nawet jeżeli sÄ… puste. W kolejnych polach wystÄ…pujÄ…: 3/2/2/!Ob{xb!qpmfdfojb 3/2/2/!Ob{xb!qpmfdfojb 3/2/2/!Ob{xb!qpmfdfojb 3/2/2/!Ob{xb!qpmfdfojb Dodane polecenie zewnÄ…trzne AutoCADa. Jest to polecenie podawane w odpowiedzi na zgÅ‚oszenie Command: (Polecenie:), wystÄ…pujÄ…ce w linii poleceÅ„ AutoCADa. Nie może ono pokrywać siÄ… z nazwÄ… polecenia wewnÄ…trznego, gdyż w takim przypadku polecenie zewnÄ…trzne bÄ…dzie ignorowane. Nazwa może zawierać litery duże i maÅ‚e. 3/2/3/!Qpmfdfojf!TP!)tztufnv!pqf3bdzkofhp* 3/2/3/!Qpmfdfojf!TP!)tztufnv!pqf3bdzkofhp* 3/2/3/!Qpmfdfojf!TP!)tztufnv!pqf3bdzkofhp* 3/2/3/!Qpmfdfojf!TP!)tztufnv!pqf3bdzkofhp* Pole zawiera Å‚aÅ„cuch tekstowy wysyÅ‚any do systemu operacyjnego po wywoÅ‚aniu pole- cenia zewnÄ…trznego AutoCADa. Może to być każde polecenie dopuszczalne w danym systemie operacyjnym, również polecenie wewnÄ…trzne systemu takie, jak dir czy set. AaÅ„cuch może zawierać przeÅ‚Ä…czniki, parametry itd. 3/2/4/!Pct{b3!{xbmojbofk!qbnj dj 3/2/4/!Pct{b3!{xbmojbofk!qbnj dj 3/2/4/!Pct{b3!{xbmojbofk!qbnj dj 3/2/4/!Pct{b3!{xbmojbofk!qbnj dj Pole to sÅ‚uży do zapewnienia kompatybilnoÅ›ci 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 3/2/5/![h pt{fojf 3/2/5/![h pt{fojf W polu tym umieszcza siÄ… Å‚aÅ„cuch tekstowy, wyÅ›wietlany po wywoÅ‚aniu polecenia w systemie operacyjnym. Odpowiedz na to zgÅ‚oszenie jest doÅ‚Ä…czana do Å‚aÅ„cucha wystÄ…pujÄ…cego w polu drugim (nazwa polecenia w systemie operacyjnym) lub podaje nazwÄ… bloku, gdy kod powrotu ma przypisanÄ… wartość 1. JeÅ›li pierwszy znak w polu jest gwiazdkÄ… (*), wtedy odpowiedz może zawierać spacje i musi zostać potwierdzona klawiszem ENTER. Gdy gwiazdka nie wystÄ…puje, odpowiedz można zakoÅ„czyć bÄ…dz spacjÄ…, bÄ…dz klawiszem ENTER. W przypadku rezygnacji ze zgÅ‚oszenia, pole zawiera Å‚aÅ„cuch pusty (""). 3/![bojn!{bd{ojfnz!q3ph3bnpxb 46 3/2/6/!Lpe!qpx3puv 3/2/6/!Lpe!qpx3puv 3/2/6/!Lpe!qpx3puv 3/2/6/!Lpe!qpx3puv Jest to pole zawierajÄ…ce opcjonalny parametr w postaci liczby caÅ‚kowitej, odpowia- dajÄ…cej sumie wartoÅ›ci poszczególnych bitów, np. jeÅ›li użytkownik chce osiÄ…gnąć tryby pracy zgodne z wartoÅ›ciami 1, 2 i 4, do pola wprowadza wartość 7. Poszczególne wartoÅ›ci majÄ… nastÄ…pujÄ…ce przypisania: 0 powrót do ekranu tekstowego, 1 wczytaj plik DXB, 2 utwórz blok z pliku DXB, 4 powrót do poprzedniego ekranu. Z powyższych kodów interesujÄ…cymi nas wartoÅ›ciami sÄ… 0 lub 4. AutoCAD ignoruje w pliku ACAD.PGP wszystkie linie puste i wszystkie teksty leżące na prawo od Å›rednika. Ponieważ moim ulubionym edytorem jest Norton Edytor 2.0, tak wiÄ…c dopisaÅ‚em nastÄ…- pujÄ…cÄ… liniÄ… w pliku ACAD.PGP: NE,C:\NC\NE,0,Zbior do edycji: ,4 W ten sposób mam nastÄ…pujÄ…ce możliwoÅ›ci edycji plików z programami lispowymi: Command: neµ! µ! µ! µ! Zbior do edycji: demo1.lspµ! µ! µ! µ! Powyższa sekwencja wywoÅ‚uje edytor Nortona z jednoczesnym wczytaniem zbioru DEMO1.LSP, a w przypadku, gdy zbiór DEMO1.LSP nie istnieje w bieżącym 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µ! µ! µ! µ! Powyższa sekwencja wywoÅ‚uje edytor Nortona z jednoczesnym wczytaniem zbioru DEMO1.LSP, znajdujÄ…cego siÄ… w katalogu C:\USERS\MAREK\LISP, a w przypadku, gdy zbiór DEMO1.LSP nie istnieje w tym katalogu, utworzenie nowego zbioru DEMO1.LSP w podanym katalogu. Command: neµ! µ! µ! µ! Zbior do edycji: µ! µ! µ! µ! Powyższa sekwencja (naciÅ›niÄ…cie samego ENTER w odpowiedzi na nazwÄ… zbioru do edycji) wywoÅ‚uje edytor Nortona bez wczytywania jakiegokolwiek zbioru. Zbiór do edycji można wybrać wywoÅ‚ujÄ…c opcjÄ… FILE => OPEN..., która wyÅ›wietla okno dialo- gowe katalogów i zbiorów, z których w Å‚atwy sposób można wybrać żądany zbiór. Command: neµ! µ! µ! µ! Zbior do edycji: 47 BvupMJTQ! !q3bluzd{oz!lv3t Powyższa sekwencja przerywa komendÄ… zewnÄ…trznÄ… nastÄ…puje powrót do AutoCADa bez uruchamiania edytora. Sekwencja powyższa może być przydatna w przypadku pomyÅ‚kowego wywoÅ‚ania edytora Nortona. Na koniec tego punktu chciaÅ‚bym jeszcze wymienić kilka najważniejszych zalet pro- gramu Norton Edytor 2.0. Zalety te to: 1. Stosowanie menu rozwijanych, poprzez które możliwy jest dostÄ…p do wiÄ…kszoÅ›ci funkcji programu. 2. Możliwość współpracy z myszÄ…. 3. Możliwość pracy z bardzo dÅ‚ugimi dokumentami. 4. Możliwość pracy jednoczeÅ›nie z dwoma dokumentami, w dwóch oknach edycji. 5. Istnienie operacji blokowych umożliwiajÄ…cych przenoszenie bloków tekstu w obrÄ…bie jednego bÄ…dz dwóch dokumentów. 6. Możliwość sprawdzania w tekÅ›cie dokumentu poprawnej iloÅ›ci nawiasów prawych i lewych każdego rodzaju. Z funkcji tej bÄ…dÄ… korzystać w pierwszej kolejnoÅ›ci użytkownicy piszÄ…cy programy komputerowe. 7. Możliwość wydrukowania z poziomu edytora caÅ‚ego dokumentu lub zaznaczo- nego bloku mamy tym samym możliwość wydrukowania kodu interesujÄ…cej nas funkcji bez drukowania caÅ‚ego programu. Cennymi wÅ‚aÅ›ciwoÅ›ciami uÅ‚atwiajÄ…cymi redagowanie tekstu sÄ… możliwoÅ›ci skonfigu- rowania edytora tak, aby: 1. Marginesy ustawiane byÅ‚y automatycznie, zgodnie z wybranÄ… wczeÅ›niej ich dÅ‚ugoÅ›ciÄ…. 2. SÅ‚owa wychodzÄ…ce poza zadeklarowanÄ… dÅ‚ugość linii byÅ‚y przenoszone automa- tycznie do nastÄ…pnej linii. 3. WciÄ…cia linii tekstowych byÅ‚y ustawiane automatycznie przy przechodzeniu do linii nastÄ…pnej. Istnieje też możliwość automatycznego formatowania paragrafu bÄ…dz caÅ‚ego doku- mentu, półautomatycznego wprowadzania znaków Å‚amania stron lub ich usuwania oraz ustawiania wielkoÅ›ci marginesów na stronie drukowanej. Z możliwoÅ›ci tych nie należy jednak korzystać podczas pisania kodów zródÅ‚owych programów, gdyż interpreter AutoLISPu wymaga czystego kodu ASCII (tzn. bez kodów formatujÄ…cych dokument). 3/![bojn!{bd{ojfnz!q3ph3bnpxb 48 W punkcie tym zostanie podanych kilka najważniejszych uwag, które mam nadziejÄ… pomogÄ… Ci zminimalizować ilość bÅ‚Ä…dów podczas pisania Twoich pierwszych pro- gramów w AutoLISPie. A oto najważniejsze zasady: 1. W pliku z kodem zródÅ‚owym programu oddzielaj od siebie poszczególne fun- kcje, na przykÅ‚ad: ;======================================== ; (defun FUNKCJA_1 () (progn ciaÅ‚o_funkcji );progn );FUNKCJA_1 ; ;======================================== ; (defun FUNKCJA_2 () (progn ciaÅ‚o_funkcji );progn );FUNKCJA_2 ; ;======================================== 2. Stosuj wciÄ…cia w kodzie zródÅ‚owym programu. Tak rozplanuj swój kod, że im bardziej zagnieżdżona jest dana linia kodu, tym dalej odsuniÄ…ta jest od lewego marginesu. W swoich programach stosujÄ… wciÄ…cia 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! !q3bluzd{oz!lv3t 3. Kiedy jest to możliwe, stosuj grupowanie komend. Staraj siÄ… również nie umieszczać wiÄ…cej 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 zamykajÄ…cy instrukcji, np. (setq ..... ..... );setq (command ..... ..... );command 5. Korzystaj z komentarzy w kodzie zródÅ‚owym programu. Obfite komentowanie kodu zródÅ‚owego podczas pisania programów jest pracÄ…, która sowicie siÄ… opÅ‚aca. Komentarze te bÄ…dÄ… przydatne dla Ciebie jak również i dla przyszÅ‚ego użytkownika Twoich programów, który może być zmuszony do dostosowania programu do wÅ‚asnych potrzeb przez zmianÄ… czÄ…Å›ci jego kodu. Komentarze mogÄ… być wykorzystywane na przykÅ‚ad w nastÄ…pujÄ…cych celach: " do nadawania tytułów, podawania autora lub daty utworzenia funkcji lub programu, " podawania instrukcji użytkowania programu, " podawania uwag objaÅ›niajÄ…cych wewnÄ…trz kodu funkcji, " umieszczania osobistych notatek podczas uruchamiania programu, " wstawiania znaków poprawiajÄ…cych estetykÄ… programu. 6. Korzystaj z funkcji edytora do wyszukiwania odpowiadajÄ…cych sobie nawiasów otwierajÄ…cych i zamykajÄ…cych sprawdzaj zawsze, czy nawiasowi otwiera- jÄ…cemu funkcji odpowiada nawias zamykajÄ…cy. JeÅ›li Twój edytor nie ma opcji wyszukiwania nawiasów najwyższy czas wymienić go na inny. 7. Po napisaniu kodu funkcji przetestuj jÄ… natychmiast, zanim zaczniesz pisać nastÄ…pne funkcje. 3/![bojn!{bd{ojfnz!q3ph3bnpxb 4: Jak już wspomniaÅ‚em wczeÅ›niej, programy w AutoLISPie zapisywane sÄ… w plikach tekstowych w formacie ASCII. Aby skorzystać z danego programu, należy go najpierw zaÅ‚adować do interpretera AutoLISPu a nastÄ…pnie uruchomić. Poniżej, w poszcze- gólnych punktach, podane zostanÄ… metody Å‚adowania i uruchamiania programów w AutoLISPie. 3/4/2/ Jouf3bldzkof! bepxbojf!q3ph3bn x 3/4/2/ Jouf3bldzkof! bepxbojf!q3ph3bn x 3/4/2/ Jouf3bldzkof! bepxbojf!q3ph3bn x 3/4/2/ Jouf3bldzkof! bepxbojf!q3ph3bn x x!BvupMJTQjf x!BvupMJTQjf x!BvupMJTQjf x!BvupMJTQjf W metodzie tej, wpisujemy z klawiatury nazwÄ… żądanego programu. Nazwa ta jest argumentem standardowej funkcji AutoLISPu load, przeznaczonej do Å‚adowania programów w AutoLISPie. Format funkcji load jest nastÄ…pujÄ…cy: (load filename [onfailure]) Argument filename jest Å‚aÅ„cuchem alfanumerycznym (wartość typu string), króry repre- zentuje nazwÄ… pliku bez rozszerzenia (domyÅ›lnie zakÅ‚adane jest rozszerzenie .LSP). Jeżeli rozszerzenie pliku jest inne niż .LSP, należy je podać razem z nazwÄ… pliku, na przykÅ‚ad TEST.DAT. Ponadto filename może zawierać przedrostek okreÅ›lajÄ…cy Å›cieżkÄ… dostÄ…pu, na przykÅ‚ad: "c:/acad12/users/marek/kombajn" lub "c:\\acad12\\users\\marek\\kombajn". JeÅ›li nie podasz w argumencie filename Å›cieżki dostÄ…pu do pliku, to funkcja load prze- szukuje Å›cieżkÄ… bibliotecznÄ… AutoCADa w nastÄ…pujÄ…cej kolejnoÅ›ci: " katalog bieżący, " katalog zawierajÄ…cy plik bieżącego rysunku, " katalogi okreÅ›lone przez zmiennÄ… Å›rodowiskowÄ… ACAD, " katalog zawierajÄ…cy pliki programu AutoCAD. JeÅ›li argument filename zawiera Å›cieżkÄ… dostÄ…pu, to funkcja load szuka pliku tylko na tej Å›cieżce. Jeżeli na tej Å›cieżce/Å›cieżkach zostanie znaleziony podany plik, to jest on wczytywany do pamiÄ…ci. JeÅ›li operacja Å‚adowania zakoÅ„czy siÄ… sukcesem, load zwraca wartość ostatniego wyrażenia w pliku, które czÄ…sto jest nazwÄ… ostatniej zdefiniowanej 51 BvupMJTQ! !q3bluzd{oz!lv3t w pliku funkcji. Jeżeli operacja load zakoÅ„czyÅ‚a siÄ… porażkÄ…, zostaje wyÅ›wietlony odpo- wiedni komunikat o bÅ‚Ä…dzie. Jeżeli jednak funkcja load zawiera opcjonalny argument onfailure (jeÅ›li_bÅ‚Ä…d), to funkcja zwraca wartość tego argumentu. Mamy wówczas możliwość wypisania wÅ‚asnego komunikatu o bÅ‚Ä…dzie. ZakÅ‚adajÄ…c przykÅ‚adowo, że plik C:/ACAD12/USERS/MAREK/TEST1.LSP zawiera dwie definicje funkcji: ;==================== (defun FUNKCJA_1 () (progn ciaÅ‚o_funkcji );progn );FUNKCJA_1 ;==================== (defun FUNKCJA_2 () (progn ciaÅ‚o_funkcji );progn );FUNKCJA_2 ;==================== oraz, że plik TEST2.LSP nie istnieje, a zmienna Å›rodowiskowa ACAD zawiera katalog C:/ACAD12/USERS/MAREK, otrzymamy nastÄ…pujÄ…ce wyniki wywoÅ‚ania funkcji load: Command: (load "c:/acad12/users/marek/test1")µ! µ! µ! µ! FUNKCJA_2 Command: Powyższe wyrażenie powoduje przeszukanie katalogu C:/ACAD12/USERS/MAREK w poszukiwaniu pliku TEST1.LSP. Ponieważ plik ten istnieje w podanym katalogu, zostaje on zaÅ‚adowany oraz zostaje zwrócona wartość ostatniego wyrażenia w pliku FUNKCJA_2. Command: (load "c:\\acad12\\users\\marek\\test1")µ! µ! µ! µ! FUNKCJA_2 Command: Jest to przykÅ‚ad podobny do poprzedniego z tÄ… różnicÄ…, że Å›cieżka dostÄ…pu do pliku podana zostaÅ‚a w inny sposób. Command: (load "test1")µ! µ! µ! µ! FUNKCJA_2 Command: Powyższe wyrażenie powoduje przeszukanie Å›cieżki bibliotecznej AutoCADa, w poszu- kiwaniu 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 zaÅ‚adowany oraz zostaje zwrócona wartość ostatniego wyrażenia w pliku FUNKCJA_2. Command: (load "test1" "\nPlik TEST1.LSP nie zostal wczytany.")µ! µ! µ! µ! 3/![bojn!{bd{ojfnz!q3ph3bnpxb 52 FUNKCJA_2 Command: W powyższym wyrażeniu argument onfailure = "\nPlik TEST1.LSP nie zostal wczytany." nie jest wykorzystany przez funkcjÄ… load, bowiem plik TEST1.LSP zostaÅ‚ znaleziony na Å›cieżce bibliotecznej AutoCADa oraz podczas jego wczytywania nie wykryto bÅ‚Ä…dów. Command: (load "test2" "\nPlik TEST2.LSP nie zostal wczytany.")µ! µ! µ! µ! Plik TEST2.LSP nie zostal wczytany. Command: Powyższe wyrażenie powoduje przeszukanie Å›cieżki bibliotecznej AutoCADa, w poszu- kiwaniu 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: Powyższe wyrażenie powoduje przeszukanie Å›cieżki bibliotecznej AutoCADa, w poszu- kiwaniu pliku TEST2.LSP. Ponieważ plik ten nie istnieje oraz nie zostaÅ‚ zdefiniowany opcjonalny argument onfailure, funkcja load powoduje wypisanie standardowego bÅ‚Ä…du AutoLISPu. Funkcja load może być użyta wewnÄ…trz innej funkcji AutoLISPu, a nawet rekurencyjnie (we wczytywanym pliku). 3/4/3/! bepxbojf!q3ph3bn x!x!BvupMJTQjf 3/4/3/! bepxbojf!q3ph3bn x!x!BvupMJTQjf 3/4/3/! bepxbojf!q3ph3bn x!x!BvupMJTQjf 3/4/3/! bepxbojf!q3ph3bn x!x!BvupMJTQjf {b!qpnpd !qmjlv!BDBE/MTQ {b!qpnpd !qmjlv!BDBE/MTQ {b!qpnpd !qmjlv!BDBE/MTQ {b!qpnpd !qmjlv!BDBE/MTQ Plik ACAD.LSP pozwala na wczytanie biblioteki programów, napisanych w Auto- LISPie, przy każdym uruchamianiu AutoCADa lub rozpoczynaniu nowego rysunku. Plik ACAD.LSP może zawierać kod AutoLISPu dla jednej lub wiÄ…kszej liczby funkcji lub, po prostu, szereg wywoÅ‚aÅ„ funkcji load. Zalecam użycie tego drugiego sposobu postÄ…powania, gdyż pozwala on na Å‚atwiejsze przeprowadzenie ewentualnych mody- fikacji zawartoÅ›ci biblioteki. Gdy w pliku ACAD.LSP umieÅ›cimy nastÄ…pujÄ…ce linie: (load "ddtype") (load "edge") (load "mvsetup") 53 BvupMJTQ! !q3bluzd{oz!lv3t przy każdym uruchamianiu AutoCADa lub rozpoczynaniu nowego rysunku automa- tycznie bÄ…dÄ… wczytywane pliki: DDTYPE.LSP, EDGE.LSP oraz MVSETUP.LSP. Gdy w pliku ACAD.LSP umieÅ›cimy nastÄ…pujÄ…cÄ… liniÄ…: (defun c:k ()(load "kombajn")) wtedy wpisujÄ…c literÄ… k (lub K) w odpowiedzi na polecenie AutoCADa Command:, spowodujemy zaÅ‚adowanie pliku KOMBAJN.LSP. JeÅ›li podczas wczytywania pliku ACAD.LSP zostanie wykryty bÅ‚Ä…d, pozostaÅ‚a cząść pliku jest ignorowana i nie zostaje wczytana. W takim przypadku pomocne może okazać siÄ… użycie w funkcji load opcjonalnego argumentu onfailure (jeÅ›li_bÅ‚Ä…d). Plik ACAD.LSP może wtedy wyglÄ…dać nastÄ…pujÄ…co: (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) JeÅ›li wywoÅ‚anie funkcji load koÅ„czy siÄ… pozytywnie, zwracana jest wartość ostatniego wyrażenia w pliku (zwykle nazwa ostatniej funkcji zdefiniowanej w pliku lub komu- nikat dotyczÄ…cy sposobu użycia funkcji). W przypadku wykrycia bÅ‚Ä…du, zwracana jest wartość opcjonalnego argumentu onfailure. W powyższym przykÅ‚adzie, wartość zwra- cana przez funkcjÄ… load zostaÅ‚a podstawiona jako argument funkcji princ, co spowo- duje, w razie pojawienia siÄ… bÅ‚Ä…du, wyÅ›wietlenie odpowiedniego komunikatu w linii poleceÅ„ AutoCADa. Na przykÅ‚ad, jeÅ›li zostanie wykryty bÅ‚Ä…d podczas wczytywania pliku DDTYPE.LSP, funkcja princ wyÅ›wietli komunikat: Plik DDTYPE.LSP nie zostal wczytany. i AutoCAD bÄ…dzie kontynuowaÅ‚ wczytywanie dwóch nastÄ…pnych plików. Plik ACAD.LSP może również zawierać komentarze. Komentarz jest tekstem informa- cyjnym, poprzedzonym Å›rednikiem ";". Plik ACAD.LSP poszukiwany jest w pierwszej kolejnoÅ›ci w katalogu bieżącym. Oznacza to, że masz możliwość tworzenia wielu plików ACAD.LSP, znajdu- jÄ…cych siÄ™ wróżnych katalogach i obsÅ‚ugujÄ…cych aplikacje tam umieszczone. W pliku ACAD.LSP nie należy umieszczać wywoÅ‚aÅ„ funkcji command, ani żadnych innych funkcji posiadajÄ…cych bezpoÅ›redni dostÄ™p do rysunkowej bazy danych. Na etapie wczytywania pliku ACAD.LSP rysunek nie jest jeszcze w peÅ‚ni zainicjowany, tak że mogÄ… wystÄ…pić nieprzewidziane zachowania systemu. Aby osiÄ…gnąć efekt automatycznego wykonywania ciÄ…gu wywoÅ‚aÅ„ funkcji command po wczytaniu rysunku, należy umieÅ›cić je w definicji defun specjalnej funkcji S::STARTUP. 3/![bojn!{bd{ojfnz!q3ph3bnpxb 54 3/4/4/! bepxbojf!q3ph3bn x!x!BvupMJTQjf 3/4/4/! bepxbojf!q3ph3bn x!x!BvupMJTQjf 3/4/4/! bepxbojf!q3ph3bn x!x!BvupMJTQjf 3/4/4/! bepxbojf!q3ph3bn x!x!BvupMJTQjf {b!qpnpd !plob!ejbmphpxfhp {b!qpnpd !plob!ejbmphpxfhp {b!qpnpd !plob!ejbmphpxfhp {b!qpnpd !plob!ejbmphpxfhp MPBE!BVUPMJTQ!BOE!BET!GJMFT MPBE!BVUPMJTQ!BOE!BET!GJMFT MPBE!BVUPMJTQ!BOE!BET!GJMFT MPBE!BVUPMJTQ!BOE!BET!GJMFT Okno dialogowe Load AutoLISP and ADS Files (Wczytywanie plików AutoLISP i ADS) pozwala Ci zarzÄ…dzać Twoimi ulubionymi programami. Daje ono możliwość Å‚atwego odnajdowania i wybierania programów użytkowych. Po zlokalizowaniu pliku, staje siÄ… on czÄ…Å›ciÄ… listy Files to Load (Pliki do wczytania). DziÄ…ki temu nie bÄ…dziesz go musiaÅ‚ szukać za każdym razem, gdy jest potrzebny. Nawet po opuszczeniu AutoCADa lista wybranych plików zostaje zachowana w pliku dyskowym APPLOAD.DFS. Okno dialogowe Load AutoLISP and ADS Files wywoÅ‚ujemy z menu górnego [File] [Applications...] ([Pliki] [Aplikacje...]) lub wpisujemy z klawiatury APPLOAD. Poszczególne opcje okna dialogowego oznaczajÄ…: File... (Plik...) Dodaje aplikacjÄ… do listy. WyÅ›wietlone zostaje okno dialogowe (podobne jak w komen- dzie OPEN (OTWÓRZ)) i program oczekuje na wskazanie pliku aplikacji. Nazwa apli- kacji i Å›cieżka dostÄ…pu zostaje umieszczona na liÅ›cie w oknie dialogowym. Remove (UsuÅ„ z listy) Usuwa wskazane aplikacje z listy. Save List (Zapisz ListÄ™) Zaznaczenie przeÅ‚Ä…cznika spowoduje automatyczny zapis na dysku utworzonej listy aplikacji w momencie opuszczenia okna dialogowego przyciskiem Load, Unload lub Exit. 55 BvupMJTQ! !q3bluzd{oz!lv3t Load (Wczytaj) Wczytuje aplikacje wskazane w oknie kartotekowym Files to Load. Unload (UsuÅ„) Usuwa z pamiÄ…ci aplikacje ADS. Exit (Koniec) Opuszcza okno dialogowe. Help... (Pomoc...) WyÅ›wietla standardowe okno pomocy AutoCADa z opisem komendy APPLOAD. 3/4/5/!Gvoldkb!T;;TUBSUVQ 3/4/5/!Gvoldkb!T;;TUBSUVQ 3/4/5/!Gvoldkb!T;;TUBSUVQ 3/4/5/!Gvoldkb!T;;TUBSUVQ Gdy omawiaÅ‚em zastosowanie pliku ACAD.LSP, wspomniaÅ‚em, że aby osiÄ…gnąć efekt automatycznego wykonywania ciÄ…gu wywoÅ‚aÅ„ funkcji command po wczytaniu rysunku, należy umieÅ›cić je w definicji defun specjalnej funkcji S::STARTUP. Jeżeli funkcja ta jest umieszczona w pliku ACAD.LSP, to zostanie ona automatycznie wywoÅ‚ana (bez żadnych argumentów) przy każdym wczytaniu istniejÄ…cego rysunku 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. Użycie funkcji S::STARTUP przeanalizujemy na nastÄ…pujÄ…cych przykÅ‚adach. Q3{zl be!2 Poniższa zawartość pliku ACAD1.LSP spowoduje utworzenie warstw 1 i 2, nadanie warstwie 1 koloru czerwonego, warstwie 2 koloru niebieskiego, narysowanie na warstwie 1 okrÄ…gu o Å›rodku w punkcie (6,4.5) i promieniu 2, narysowanie na warstwie 2 trójkÄ…ta o wierzchoÅ‚kach (2,2), (6,7), (10,2) oraz ustalenie warstwy 0 jako warstwy bieżącej. ;=================================================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!q3ph3bnpxb 56 "_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 Omówmy teraz wyróżnione linie programu: Rozpoczynamy ciÄ…g wywoÅ‚aÅ„ funkcji command. Funkcja command posiada format: (command [arguments]...) i sÅ‚uży do wywoÅ‚ania poleceÅ„ AutoCADa z programu napisanego w jÄ…zyku AutoLISP. Argumentami funkcji command sÄ… polecenia programu AutoCAD i ich opcje. Argumenty te mogÄ… mieć postać Å‚aÅ„cuchów alfanumerycznych, liczb typu real i integer oraz punktów, zależnie od tego, czego oczekuje wykonywana wÅ‚aÅ›nie funkcja AutoCADa. WywoÅ‚ujemy standardowe polecenie AutoCADa LAYER (WARSTWA). Znak podkreÅ›lenia "_" przed nazwÄ… komendy umożliwia jej rozpoznanie w naro- dowych wersjach AutoCADa. Tak wiÄ…c sekwencja: (command "_layer" ...) jest równoważna sekwencji: (command "warstwa" ...) ObsÅ‚uga jÄ™zyków narodowych zostaÅ‚a wprowadzona od wersji 12 programu AutoCAD. We wczeÅ›niejszych wersjach AutoCADa komenda "_layer" nie zostanie rozpoznana (dotyczy to tak wersji angielskiej jak i wersji narodowych). BÄ…dÄ…c w dalszymciÄ…gu w trakcie wykonywania komendy LAYER, tworzymy dwie nowe warstwy 1 i 2. Nazwy warstw oddzielone sÄ… od siebie przecinkami i umieszczone w jednym Å‚aÅ„cuchu. PrzyporzÄ…dkowujemy kolor "1" (czerwony) do warstwy "1". Zarówno numer koloru jak i nazwa warstwy podane sÄ… jako Å‚aÅ„cuchy alfanumeryczne. PrzyporzÄ…dkowujemy kolor 5 (niebieski) do warstwy 2. Zarówno numer koloru jak i nazwa warstwy podane sÄ… jako liczby caÅ‚kowite. KoÅ„czymy wykonywanie komendy LAYER. Podwójny cudzysłów rozumiany jest przez AutoLISP jako naciÅ›niÄ…cie klawisza ENTER. WywoÅ‚ujemy nowÄ… komendÄ… LAYER i powodujemy ustalenie warstwy 1 jako warstwy aktualnej. WywoÅ‚ujemy komendÄ… CIRCLE, rysujÄ…cÄ… okrÄ…g. 57 BvupMJTQ! !q3bluzd{oz!lv3t Ustalamy warstwÄ… 2 jako aktualnÄ…. WywoÅ‚ujemy komendÄ… LINE i rysujemy trójkÄ…t zÅ‚ożony z trzech linii. Zaprezentowane tutaj zostaÅ‚y trzy sposoby podawania współrzÄ™dnych punktu. Dwa pierwsze z nich, tj. "2,2" '(6 7) sÄ… to współrzÄ™dne punktu podane w sposób jawny (nie może tu wystÄ…pić wyrażenie AutoLISPu). W sposobie trzecim, tj. (list 10 2) możemy użyć wyrażeÅ„ AutoLISPu, np.: (setq x 10 y 1 punkt (list x (+ y 1)) );setq Zauważ, że utworzono tylko 2 boki trójkÄ…ta. Narysowanie trzeciego boku wymusza opcja "_c" (CLOSE ZAMKNIJ) komendy LAYER, która powoduje zamkniÄ™cie narysowanej figury. Aby uruchomić plik ACAD1.LSP, wykonaj jednÄ… z nastÄ…pujÄ…cych czynnoÅ›ci: " dodaj zawartość pliku ACAD1.LSP do Twojego pliku ACAD.LSP (najlepiej na koÅ„cu pliku ACAD.LSP) pod warunkiem, że funkcja S::STARTUP nie byÅ‚a wczeÅ›niej zdefiniowana w pliku ACAD.LSP, " przekopiuj plik ACAD1.LSP na ACAD.LSP pod warunkiem, że wbieżącym katalogu nie ma jeszcze pliku ACAD.LSP inaczej jego zawartość zostanie skasowana. JeÅ›li interesuje CiÄ…, co siÄ… stanie, gdy instrukcje z pliku ACAD1.LSP nie byÅ‚yby czÄ…Å›ciÄ… funkcji S::STARTUP, wez w komentarz definicjÄ… funkcji, nie zapominajÄ…c o odpowia- dajÄ…cym jej nawiasie zamykajÄ…cym linie wziÄ…te w komentarz zaznaczone sÄ… tÅ‚ustym drukiem, opuść program AutoCAD i wywoÅ‚aj go ponownie lub wywoÅ‚aj nowy rysunek (aby wczytać ponownie plik ACAD.LSP => ACAD1.LSP). ;(defun S::STARTUP () (progn ciaÅ‚o_funkcji );progn ;);S::STARTUP Q3{zl be!3 W przykÅ‚adzie 1 pokazaÅ‚em sposoby podawania współrzÄ…dnych punktu. PoÅ‚ożenie każdego punktu na pÅ‚aszczyznie można okreÅ›lić za pomocÄ… ukÅ‚adu współrzÄ…dnych prostokÄ…tnych (kartezjaÅ„skich) lub ukÅ‚adu współrzÄ…dnych biegunowych. Każdy rodzaj współrzÄ…dnych może być zapisany w formie współrzÄ…dnych bezwzglÄ…dnych lub w formie współrzÄ…dnych wzglÄ…dnych (poprzedzonych znakiem @). 3/![bojn!{bd{ojfnz!q3ph3bnpxb 58 WspółrzÄ…dne bezwzglÄ…dne odnoszÄ… siÄ… do poczÄ…tku ukÅ‚adu współrzÄ…dnych, współ- rzÄ…dne wzglÄ…dne do ostatnio wskazanego punktu. Jeżeli chcesz, aby wprowadzone współrzÄ…dne odniesione byÅ‚y do Globalnego UkÅ‚adu WspółrzÄ…dnych raczej niż do ukÅ‚adu bieżącego to poprzedz je znakiem *. Jeżeli znaki @ i * wystÄ…pujÄ… razem to znak @ powinien wystÄ…pować przed *. Poniższy przykÅ‚ad pokazuje kolejne sposoby podawania współrzÄ…dnych punktów . ;*************************************************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! !q3bluzd{oz!lv3t (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 powyższym przykÅ‚adzie, funkcjÄ… S::STARTUP podzielono na 4 główne sekcje: 3/![bojn!{bd{ojfnz!q3ph3bnpxb 5: Ustawienie zmiennych poczÄ…tkowych. WyÅ‚Ä…czamy echo komend (CMDECHO) oraz znaczniki punktów (BLIPMODE), ustawiamy globalny ukÅ‚ad współrzÄ…dnych oraz ekran roboczy o wymiarach 12×9. Ponieważ wystÄ™pujÄ… różnice w okreÅ›laniu granic rysunku prototypowego w wersji 12 i 13 AutoCADa, we wszystkich przykÅ‚adowych programach wyko- rzystujÄ…cych komendy do rysowania poszczególnych obiektów rysunkowych, zastosowano komendÄ™ ZOOM do ustalenia odpowiednich rozmiarów okna roboczego. PrzykÅ‚ad zastosowania współrzÄ…dnych bezwzglÄ…dnych. Jeszcze raz zostaÅ‚y tutaj powtórzone sposoby podawania współrzÄ…dnych punktu za pomocÄ… Å‚aÅ„cucha, listy kwotowanej oraz zwykÅ‚ej listy. PrzykÅ‚ad zastosowania współrzÄ…dnych wzglÄ…dnych. Aby uzyskać efekt programowego przekazania współrzÄ…dnych wzglÄ…dnych, współrzÄ…dne takie należy podać w formie Å‚aÅ„cucha, gdzie pierwszym znakiem wÅ‚aÅ„cuchu jest znak @. Zgodnie z powyższym przykÅ‚adem, współrzÄ…dne punk- tów 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 PrzykÅ‚ad zastosowania współrzÄ…dnych biegunowych wzglÄ…dnych. WspółrzÄ…dne biegunowe podwane w formacie r<Ć okreÅ›lajÄ… poÅ‚ożenie punktu na Ć Ć Ć pÅ‚aszczyznie w biegunowym ukÅ‚adzie współrzÄ…dnych przez podanie promienia i kÄ…ta odchylenia. WspółrzÄ…dne biegunowe mogÄ… być bezwzglÄ…dne (obliczane wzglÄ…dem bieżącego UCS) lub wzglÄ…dne (obliczane wzglÄ…dem ostatnio wprowa- dzonego punktu). WspółrzÄ…dne biegunowe wzglÄ…dne @r<Ć okreÅ›lajÄ… poÅ‚ożenie Ć Ć Ć wzglÄ…dem ostatnio wprowadzonego punktu. WspółrzÄ…dne biegunowe poprze- dzone znakiem mnożenia * okreÅ›lajÄ… poÅ‚ożenie wzglÄ…dem globalnego ukÅ‚adu współrzÄ…dnych. UkÅ‚ad odniesienia dla pomiaru kÄ…tów oraz dodatni kierunek kÄ…ta ustalamy komendÄ… UNITS (JEDN). Q3{zl be!4 Poniższa 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 wywoÅ‚anie funkcji FUNKCJA_1. 61 BvupMJTQ! !q3bluzd{oz!lv3t ;=================================================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 skÅ‚ada siÄ… z trzech głównych bloków: " definicja funkcji FUNKCJA_1, " wypisanie komunikatu na ekran tekstowy, " definicja funkcji S::STARTUP. Omówmy po kolei każdy z bloków. W bloku pierwszym definiujemy funkcjÄ… FUNKCJA_1, której zadaniem jest naryso- wanie kwadratu na warstwie WARSTWA_1. Ponieważ na etapie wczytywania pliku 3/![bojn!{bd{ojfnz!q3ph3bnpxb 62 ACAD.LSP rysunek nie jest jeszcze w peÅ‚ni zainicjowany, funkcjÄ… tÄ… musimy wywoÅ‚ać z funkcji S::STARTUP. W bloku drugim, po przejÅ›ciu na ekran tekstowy, wypisujemy komunikat o pomyÅ›lnym zaÅ‚adowaniu funkcji FUNKCJA_1. Aby zatrzymać wykonywanie pliku ACAD.LSP, wywoÅ‚ujemy funkcjÄ… getstring, która pobiera z klawiatury dowolny ciÄ…g znaków zakoÅ„czony naciÅ›niÄ…ciem klawisza ENTER. Dopiero wówczas przechodzimy na ekran graficzny AutoCADa i tym samym koÅ„czymy wykonywanie bloku drugiego. Blok drugi uwidacznia jeszcze jednÄ… ważnÄ… sprawÄ™. Wszystkie wyrażenia w pliku .LSP, nie bÄ™dÄ…ce częściÄ… instrukcji defun, sÄ… automatycznie wykony- wane podczas wczytywania pliku. WÅ‚asność tÄ™ można wykorzystać do ustalenia wartoÅ›ci wybranych parametrów albo wykonać wszelkie inne potrzebne proce- dury wstÄ™pne, niezależnie od wyÅ›wietlenia informacji tekstowych. O praktycz- nym wykorzystaniu tej wÅ‚asnoÅ›ci bÄ™dzie jeszcze mowa w dalszej części książki. W bloku trzecim, definiujemy funkcjÄ… S::STARTUP, której zadaniem jest wywoÅ‚anie zdefiniowanej wczeÅ›niej funkcji FUNKCJA_1. Q3{zl be!5 Podczas omawiania pliku ACAD.LSP wspomniaÅ‚em, że plik ten może zawierać kod AutoLISPu dla jednej lub wiÄ…kszej liczby funkcji lub, po prostu, szereg wywoÅ‚aÅ„ funkcji load. ZalecaÅ‚em również użycie tego drugiego sposobu postÄ…powania, gdyż pozwala on na Å‚atwiejsze przeprowadzenie ewentualnych modyfikacji zawartoÅ›ci biblioteki. W przykÅ‚adzie trzecim funkcja FUNKCJA_1 zostaÅ‚a zdefiniowana w taki wÅ‚aÅ›nie sposób (tj. wewnÄ…trz pliku ACAD.LSP). Dopóki funkcji takich jest niewiele i sÄ… one bardzo krótkie, można postÄ…pić tak jak to zostaÅ‚o zaprezentowane w przykÅ‚adzie 3. OsobiÅ›cie odradzam jednak tego sposobu postÄ…powania. W miarÄ… upÅ‚ywu czasu wzroÅ›nie bowiem liczba aplikacji, których bÄ…dziesz używaÅ‚, bÄ…dÄ… one również coraz dÅ‚uższe. Znalezienie i poprawienie czegokolwiek w jednym ogromnym pliku bÄ…dzie nie lada wyczynem. InnÄ… niedogodnoÅ›ciÄ… jest też to, że w takich plikach nie mogÅ‚oby być dwóch funkcji o identycznych nazwach inaczej wczytana ostatnio przesÅ‚oni wszystkie poprzednie. Tak wiÄ…c najlepszym rozwiÄ…zaniem jest Å‚adowanie kolejnych plików .LSP tak, jak to opisano w punkcie Aadowanie programów w AutoLISPie za pomocÄ… pliku ACAD.LSP, bÄ…dz tak, jak to zrobimy teraz. Niech dany bÄ…dzie plik ACAD4.LSP, zawierajÄ…cy definicjÄ… funkcji FUNKCJA_1, krórej dziaÅ‚anie jest identyczne jak w przykÅ‚adzie 3. Plik ACAD4.LSP wyglÄ…da nastÄ…pujÄ…co: ;=================================================ACAD4.LSP ;test funkcji S::STARTUP - wersja 4 ; 63 BvupMJTQ! !q3bluzd{oz!lv3t ;------------------------------------------------- ;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 mógÅ‚by wtedy wyglÄ…dać nastÄ…pujÄ…co: ;=================================================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 zaÅ‚adowanie pliku ACAD4.LSP i wywoÅ‚anie funkcji FUNKCJA_1. W tym miejscu możesz zapytać, dlaczego plik ACAD4.LSP Å‚adujemy w funkcji S::STARTUP. W powyższym przypadku nie musimy tego robić, gdyż plik ten nie za- wiera instrukcji poza obrÄ…bem funkcji defun. Gdyby jednak zawartość pliku ACAD4.LSP byÅ‚a nastÄ…pujÄ…ca (tÅ‚ustszym drukiem zaznaczone sÄ… dodane linie): 3/![bojn!{bd{ojfnz!q3ph3bnpxb 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 ; ;------------------------------------------------- ;wywoÅ‚anie funkcji FUNKCJA_1 (FUNKCJA_1) ;------------------------------------------------- ;=================================================KONIEC wówczas próba zaÅ‚adowania pliku ACAD4.LSP poza funkcjÄ… S::STARTUP spowodo- waÅ‚aby nieokreÅ›lone zachowanie siÄ… AutoCADa. Tak wiÄ…c, jeÅ›li w pliku aplikacji znajdujÄ… siÄ… instrukcje wywoÅ‚ujÄ…ce funkcjÄ… command, które majÄ… zostać wykonane automatycznie po zaÅ‚adowaniu programu, program należy Å‚adować we wnÄ…trzu funkcji S::STARTUP. Temat ten bÄ…dzie jeszcze poruszany w dal- szych czÄ…Å›ciach książki. 3/4/6/!V3vdibnjbojf!q3ph3bn x!x!BvupMJTQjf 3/4/6/!V3vdibnjbojf!q3ph3bn x!x!BvupMJTQjf 3/4/6/!V3vdibnjbojf!q3ph3bn x!x!BvupMJTQjf 3/4/6/!V3vdibnjbojf!q3ph3bn x!x!BvupMJTQjf Po zaÅ‚adowaniu programu należaÅ‚oby go uruchomić. Metod uruchamiania programów też jest kilka. Oto one, w najwiÄ…kszym skrócie: " JeÅ›li dany plik zostaÅ‚ napisany poprawnie, po zaÅ‚adowaniu powinien wyÅ›wietlić w obszarze komend nazwÄ… lub nazwy funkcji, które powodujÄ… jego urucho- mienie. " JeÅ›li plik zawiera funkcje wykonywane automatycznie po jego zaÅ‚adowaniu, sprawa jego uruchomienia sama siÄ… rozwiÄ…zuje. " WiÄ…ksze aplikacje, oprócz funkcji wykonywanych automatycznie, posiadajÄ… swoje wÅ‚asne menu oraz systemy pomocy dla użytkownika (nie mówiÄ…c już o in- strukcji obsÅ‚ugi danej aplikacji). Dopiero praca z takimi aplikacjami dostarcza prawdziwej przyjemnoÅ›ci. " JeÅ›li dany plik nie posiada żadnej z cech wymienionych powyżej, należy prze- glÄ…dnąć go dowolnym edytorem ASCII, wypisać nazwy funkcji w nim zdefinio- 65 BvupMJTQ! !q3bluzd{oz!lv3t wanych i próbować po kolei uruchamiać kolejne funkcje. Bardziej zaawan- sowani użytkownicy AutoLISPu mogÄ… spróbować analizować kody poszcze- gólnych funkcji (jest to jednak dobre dla krótkich plików o maÅ‚ej liczbie funkcji). RozdziaÅ‚ ten zapoznaÅ‚ CiÄ… z przystosowaniem edytora tekstu do pracy pod Auto- CADem, poznaÅ‚eÅ› najważniejsze reguÅ‚y pisania programów (nie tylko w jÄ…zyku Auto- LISP) oraz sposoby wczytywania i uruchamiania programów w AutoLISPie. NastÄ…pny rozdziaÅ‚ pomoże Ci zrozumieć mechanizm dziaÅ‚ania interpretera AutoLISPu w jaki sposób i w jakiej kolejnoÅ›ci realizowane sÄ… polecenia wpisywane z klawiatury bÄ…dz też wczytywane z pliku.