You are on page 1of 42

24/!Qpcjfsbojf!jogpsnbdkj!pe!

vzulpxojlb

552

Wejcie oznacza wprowadzanie danych do komputera na uytek programu. Wprowadzane dane s przypisywane zmiennym mwimy, e s wprowadzane do zmiennych.
Oznacza to, e dana, jak wpisuje bd wskazuje uytkownik w odpowiedzi na danie
wprowadzenia, staje si wartoci zmiennej, przechowywan w pamici. Potem korzysta si z tej zmiennej w dowolnym procesie, jaki wykonuje program.
Poprawne wejcie jest krytycznym elementem kadego programu. Jak mwi stare
powiedzenie: Garbage in, Garbage out, czyli dosownie mieci na wejciu to
mieci na wyjciu. Jeli dane wejciowe programu s bdne, to informacja wyjciowa
te bdzie bdna. Dokadno informacji wyjciowej nie moe by lepsza ni dokadno danych na wejciu.
Dane mona wprowadza tylko do zmiennej. Wprowadzajc warto do zmiennej powodujemy umieszczenie tej wartoci w komrce pamici przypisanej do zmiennej. Jeli
zmienna ma ju warto, to nowa warto, ktr wprowadzamy, zajmie jej miejsce.
Stara warto zniknie na zawsze.
Gdy jest wykonywana jedna z funkcji wprowadzania danych, wydaje si, e program
stan. W rzeczywistoci oczekuje on wtedy od uytkownika wpisania danej lub innej
operacji (np. wskazania obiektu na ekranie). Podczas wprowadzania danych alfanumerycznych, jeli popenimy bd, to przed naciniciem ENTER mona klawiszem
Backspace usun bdne znaki i wpisa je ponownie.
Programy omwione w tym rozdziale
PROG_097.LSP
Przykady wywoania wybranych funkcji z grupy getxxx bez wywoania funkcji initget.

553

BvupMJTQ!!qsbluzd{oz!lvst
PROG_098.LSP
Przykady wywoania wybranych funkcji z grupy getxxx z wywoaniem funkcji initget
wraz z argumentem bits.
PROG_099.LSP
Przykady wywoania funkcji getreal z wywoaniem funkcji initget wraz z argumentami bits oraz string.
PROG_100.LSP
Przykady wymuszenia podania odpowiedniego acucha znakw alfanumerycznych.
PROG_101.LSP
Przykady moliwoci podania wartoci domylnych w funkcjach z grupy getxxx.
PROG_102.LSP
Przykady dowolnych odpowiedzi z klawiatury dla funkcji z grupy getxxx przykad 1.
PROG_103.LSP
Przykady dowolnych odpowiedzi z klawiatury dla funkcji z grupy getxxx przykad 2.
PROG_104.LSP
Przykady wywoa HELPu z funkcji uytkownika.
Program korzysta ze zbioru PROG_104.HLP.

Kada z funkcji getxxx, pobierajcych informacje od uytkownika, oczekuje na wprowadzenie przez niego danych wskazanego typu i zwraca wprowadzon warto.
Program uytkowy moe te okrela tre opcjonalnego zgoszenia, wywietlanego
przed przejciem funkcji w stan oczekiwania na odpowied uytkownika.
Funkcje getvar i getenv nie nale do kategorii funkcji getxxx, pobierajcych
dane od uytkownika nie oczekuj one na wprowadzenie danych.
Funkcje getint, getreal i getstring wstrzymuj swoje dziaanie w oczekiwaniu
na wprowadzenie przez uytkownika informacji wymaganego typu z linii
polece AutoCADa. Wbudowany w nie mechanizm sprawdzajcy umoliwia im
zwrcenie wycznie wartoci tego typu, ktry jest oczekiwany.
Funkcje getpoint, getcorner i getdist wstrzymuj swoje dziaanie w
oczekiwaniu na wprowadzenie przez uytkownika informacji wymaganego typu
z linii polece AutoCADa lub poprzez wskazanie na ekranie. Te funkcje rwnie
odfiltrowuj dane niepoprawne. Funkcje getpoint i getcorner zwracaj punkt
3W, a funkcja getdist zwraca warto rzeczywist.

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

554

Tabela 13.1. Dozwolone odpowiedzi dla funkcji getxxx, pobierajcych dane od uytkownika
Nazwa funkcji

Format i typ odpowiedzi uytkownika

initget

(initget [bits][string])
Okrela dopuszczalne rodzaje danych, wprowadzanych przez uytkownika
podczas najbliszego wywoania funkcji z grupy getxxx.

getint

(getint [prompt])
Warto cakowita, wprowadzana w linii polece.

getreal

(getreal [prompt])

getstring

(getstring [cr][prompt])

Warto rzeczywista lub cakowita, wprowadzana w linii polece.


acuch alfanumeryczny, wprowadzany w linii polece.
getpoint

(getpoint [pt][prompt])
Warto punktowa, wprowadzana w linii polece lub poprzez wskazanie
na ekranie.

getcorner

(getcorner pt [prompt])
Warto punktowa (przeciwlegy wierzchoek prostokta), wprowadzana
w linii polece lub poprzez wskazanie na ekranie.

getdist

(getdist [pt][prompt])
Warto rzeczywista lub cakowita (odlego), wprowadzana w linii
polece lub okrelana na podstawie dwch wskazanych na ekranie
punktw.

getangle

(getangle [pt][prompt])
Warto kta (zgodna z aktualnym formatem ktw), wprowadzana w linii
polece lub okrelana na podstawie wskazanych na ekranie punktw.

getorient

(getorient [pt][prompt])
Warto kta (zgodna z aktualnym formatem ktw), wprowadzana w linii
polece lub okrelana na podstawie wskazanych na ekranie punktw.

getkword

(getkword [prompt])
Predefiniowane sowo kluczowe lub jego skrt, wprowadzane w linii
polece.

Funkcje getangle i getorient wstrzymuj swoje dziaanie w oczekiwaniu na


wprowadzenie przez uytkownika wartoci kta z linii polece AutoCADa lub
zdefiniowanie go poprzez wskazanie punktw na ekranie. Dla funkcji getangle
kt zerowy ma zawsze kierunek poziomy w prawo: wschd lub godzina 3.00.
Dla funkcji getorient kt zerowy wyznacza warto zmiennej ANGBASE, ktra
moe by ustawiona na dowolny kt. Obie funkcje: getangle i getorient
zwracaj wartoci kta (wartoci rzeczywiste) w radianach, mierzonych od bazy
(kta zerowego): ANGBASE dla getangle i wschodu dla getorient, w
kierunku przeciwnym do ruchu wskazwek zegara. Jako odpowied dla obu
tych funkcji, uytkownik moe poda dane w linii polece lub wskaza punkty
na ekranie.

555

BvupMJTQ!!qsbluzd{oz!lvst
Funkcje pobierajce informacje od uytkownika maj zalet AutoCADa,
polegajc na sprawdzaniu poprawnoci informacji. Bdy trywialne (takie jak
wprowadzenie pojedynczej liczby w odpowiedzi na pytanie o punkt) s
wychwytywane przez AutoCAD i nie s zwracane przez funkcje pobierajce
informacje od uytkownika. Wczeniejsze wywoanie omawianej dalej funkcji
initget daje dodatkowe moliwoci filtrowania, zmniejszajc potrzeb
szerokiego sprawdzania odpowiedzi.
Funkcja getkword wstrzymuje dziaanie, oczekujc na wprowadzenie sowa
kluczowego lub jego skrtu. Przed wywoaniem getkword sowa kluczowe
musz by zdefiniowane za pomoc funkcji initget. Wszystkie funkcje
pobierajce informacje od uytkownika (za wyjtkiem getstring, z oczywistych
powodw), oprcz standardowo zwracanych przez nie wartoci, mog
akceptowa take sowa kluczowe, jeli wczeniej zostay one zdefiniowane w
funkcji initget.
Wszystkie funkcje pobierajce dane od uytkownika pozwalaj na
zdefiniowanie opcjonalnego argumentu prompt. Podawanie tego argumentu jest
bardziej zalecanym sposobem powodowania wywietlania przez program
dania podania odpowiedzi, ni wykorzystanie funkcji prompt lub princ przed
getxxx. Jeeli argument prompt jest podany podczas wywoania funkcji
pobierajcej odpowied uytkownika, to w przypadku niepoprawnej odpowiedzi
jest wywietlany ponownie. Jeeli argument prompt nie jest podany, to w
przypadku niepoprawnej odpowiedzi, w linii zgosze i polece AutoCADa
wywietlany jest nastpujcy komunikat:
Try again: (Sprbuj jeszcze raz:)
Moe to by nieco mylce, gdy zgoszenie oryginalne mogo ju zosta
przesunite poza obszar wywietlania zgosze i polece.
Zazwyczaj uytkownik AutoCADa nie moe poda wyraenia AutoLISPu w
odpowiedzi na danie podania odpowiedzi dla funkcji z grupy getxxx. Jeeli
procedura w AutoLISPie wykorzystuje funkcj initget, dowolne dane
wprowadzane z klawiatury mog stanowi odpowied dla niektrych funkcji,
zezwalajcych na wprowadzanie wyrae AutoLISPu jako odpowiedzi dla
polece AutoCADa utworzonych w AutoLISPie.

Poniszy program zawiera przykady wywoa niektrych funkcji z grupy getxxx.


;*************************************************PROG_097
;Przyklady wywolania wybranych funkcji z grupy GETXXX
;bez wywolania funkcji INITGET.
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
;---------(princ)

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Wywolanie funkcji getint - wersja 1.
;
(defun FUNKCJA_1 (/ x)
(progn
;---------(princ "Wprowadz dowolna liczbe calkowita: ")
(setq x (getint))
(princ "Wprowadziles: ")
(princ x)
;---------(princ)
;---------);progn
);FUNKCJA_1
;
;------------------------------------------------;Wywolanie funkcji getint - wersja 2.
;
(defun FUNKCJA_2 (/ x)
(progn
;---------(setq x (getint "Wprowadz dowolna liczba calkowita: "))
(princ "Wprowadziles: ")
(princ x)
;---------(princ)
;---------);progn
);FUNKCJA_2
;
;------------------------------------------------;Wywolanie funkcji getint - wersja 3.
;
(defun FUNKCJA_3 (/ jeszcze x)
(progn
;---------(setq jeszcze T)
(while jeszcze
(progn
;---------(setq
x (getint
"Wprowadz dowolna liczba calkowita [0 koniec]: "
);getint
);setq
(cond
((/= x 0)
(princ "Wprowadziles: ")

556

557

BvupMJTQ!!qsbluzd{oz!lvst
(princ x)
(princ "\n")
)
;
(T
(princ
"Wprowadziles 0 - a wiec konczymy."
);princ
(setq jeszcze nil)
)
);cond
;---------);progn
);while jeszcze
;---------(princ)
;---------);progn
);FUNKCJA_3
;
;------------------------------------------------;Wywolanie funkcji getstring.
;
(defun FUNKCJA_4 (/ x)
(progn
;---------(setq
x (getstring
"Wprowadz dowolny lancuch alfanumeryczny bez
spacji: "
);getstring
);setq
(princ "Wprowadziles: ")
(princ x)
(princ "\n")
;
(setq
x (getstring T
"Wprowadz dowolny lancuch alfanumeryczny ze
spacjami: "
);getstring
);setq
(princ "Wprowadziles: ")
(prin1 x)
(princ "\n")
;---------(princ)
;---------);progn
);FUNKCJA_4
;
;------------------------------------------------;Wywolanie funkcji getpoint + getcorner.
;

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

558

(defun FUNKCJA_5 (/ p1 p2)


(progn
;---------(setq
p1 (getpoint "Wskaz pierwszy wierzcholek prostokata: ")
p2 (getcorner
p1 "\nWskaz przeciwlegly wierzcholek prostokata: "
);getcorner
);setq
(command
"_pline"
p1
(list (car p1)(cadr p2))
p2
(list (car p2)(cadr p1))
"_c"
);command
;---------(princ)
;---------);progn
);FUNKCJA_5
;
;------------------------------------------------;Wywolanie funkcji getpoint + getangle + getdist.
;
(defun FUNKCJA_6 (/ p1 angle dist)
(progn
;---------(setq
p1 (getpoint "Punkt poczatkowy prostej: ")
angle (getangle p1 "Nachylenie prostej: ")
dist (getdist p1 "Dlugosc prostej: ")
);setq
(command
"_line"
p1
(polar p1 angle dist)
""
);command
;---------(princ)
;---------);progn
);FUNKCJA_6
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu
;
(textpage)
(CZEKAJ)
(FUNKCJA_1)
(CZEKAJ)
(FUNKCJA_2)
(CZEKAJ)

559

BvupMJTQ!!qsbluzd{oz!lvst
(FUNKCJA_3)
(CZEKAJ)
(FUNKCJA_4)
(CZEKAJ)
(graphscr)
(FUNKCJA_5)
(CZEKAJ)
(FUNKCJA_6)
(princ)
;*************************************************KONIEC

Wykonanie powyszego programu moe przebiega nastpujco:


Command: (load "prog_097")

Nacisnij ENTER...

Wprowadz dowolna liczbe calkowita: 2.5

Requires an integer value.


Try again: 2

Wprowadziles: 2
Nacisnij ENTER...

Wprowadz dowolna liczbe calkowita: 2.5

Requires an integer value.


Wprowadz dowolna liczbe calkowita: 2

Wprowadziles: 2

Nacisnij ENTER...

Wprowadz dowolna liczbe calkowita [0 - koniec]: 5

Wprowadziles: 5
Wprowadz dowolna liczbe calkowita [0 - koniec]: 0

Wprowadziles 0 - a wiec konczymy.


Nacisnij ENTER...

Wprowadz dowolny lancuch alfanumeryczny bez spacji: test

Wprowadziles: test
Wprowadz dowolny lancuch alfanumeryczny ze spacjami: a b c
d

Wprowadziles: "a b c d"


Nacisnij ENTER...

Wskaz pierwszy wierzcholek prostokata: 0,0

Wskaz przeciwlegly wierzcholek prostokata: 4,2

Nacisnij ENTER...

Punkt poczatkowy prostej: 3,3

Nachylenie prostej: 45

Dlugosc prostej: 2

Command:

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

55:

Omwmy teraz gwne funkcje programu.


FUNKCJA_1
W funkcji tej pobieramy liczb cakowit, a nastpnie wypisujemy j na ekran. Komunikat
dla uytkownika wypisujemy wykorzystujc funkcj princ. Wpisz przykadowo string w
odpowiedzi na getint, aby zobaczy tok postpowania AutoCADa w takim przypadku.
FUNKCJA_2
Jest to modyfikacja poprzedniej funkcji. Komunikat dla uytkownika wypisujemy wykorzystujc opcjonalny argument prompt funkcji getint. Wpisujc przykadowo string
w odpowiedzi na getint zobaczysz tok postpowania AutoCADa w tym przypadku.
FUNKCJA_3
W funkcji tej, funkcj getint wywoujemy w ptli while. Ptl wykonujemy tak dugo,
dopki uytkownik nie wprowadzi cyfry 0. W zalenoci od wprowadzonej liczby,
podejmujemy odpowiednie dziaania wykorzystujc instrukcj warunkow cond.
FUNKCJA_4
W funkcji tej pobieramy dwa acuchy alfanumeryczne. Pierwszy acuch nie moe
zawiera spacji koczymy go naciskajc klawisz spacji lub ENTER. Wprowadzony
acuch wypisujemy na ekran przy pomocy funkcji princ. Drugi acuch moe
zawiera spacje, a wypisujemy go na ekran przy pomocy funkcji prin1. Zauwa rnic
w wypisywaniu acucha pomidzy funkcj princ a prin1.
FUNKCJA_5
W funkcji tej pobieramy wsprzdne 2 punktw: p1 wykorzystujc funkcj getpoint
oraz p2 wykorzystujc funkcj getcorner z argumentem p1. Nastpnie rysujemy prostokt, ktrego przeciwlegymi wierzchokami s punkty p1 i p2.
FUNKCJA_6
W funkcji tej pobieramy 3 zmienne: wsprzdn punktu za pomoc funkcji getpoint,
kt w oparciu o punkt p1 (w przypadku wskazania zamiast wpisania) za pomoc funkcji
getangle oraz odlego w oparciu o punkt p1 (w przypadku wskazania zamiast
wpisania) za pomoc funkcji getdist. Nastpnie rysujemy lini o pocztku we wskazanym punkcie, podanym kcie nachylenia oraz podanej dugoci.

Bardzo czsto pobierajc informacje od uytkownika naley dodatkowo zawzi przedzia wprowadzanych danych. Przykadowo podczas wprowadzania liczb cakowitych
naley dodatkowo uniemoliwi wprowadzenie liczb cakowitych ujemnych. Powysze
zadanie mona rozwiza umieszczajc funkcj getint w ptli while, wyjcie z ktrej

561

BvupMJTQ!!qsbluzd{oz!lvst
bdzie moliwe dopiero wtedy, kiedy uytkownik w odpowiedzi na funkcj getint poda
liczb cakowit dodatni.
AutoLISP udostpnia wbudowan funkcj initget, realizujc tego typu zadania. Funkcja
initget okrela rne opcje wykorzystywane przez wywoywane po niej funkcje entsel,
nentsel, nentselp oraz funkcje getxxx (oprcz getstring, getvar i getenv). Funkcja
initget akceptuje dwa opcjonalne argumenty: bits i string. Argument bits ustawia jeden
lub kilka bitw sterujcych, dopuszczajcych lub zabraniajcych podawanie wartoci
okrelonego typu w odpowiedzi na pniejsze wywoania funkcji pobierajcych dane od
uytkownika. Argument string moe definiowa sowa kluczowe, rozpoznawane podczas
pniejszego wywoania funkcji pobierajcych dane od uytkownika.
Ustalone przez initget bity sterujce i sowa kluczowe obowizuj tylko do
nastpnego wywoania funkcji pobierajcej dane od uytkownika. Bezporednio
potem argumenty te przestaj obowizywa. Program nie musi wic ponownie
wywoywa initget w celu uniewanienia nietypowych wartoci tych
argumentw.

24/3/2/ Pqdk
Pqdkf!peqpxjfe{j!emb!
f!peqpxjfe{j!emb!gvoldkj
f!peqpxjfe{j!emb!gvoldkj
qpcjfsbkdzd
qpcjfsbkdzdi!ebof!pe!v
cjfsbkdzdi!ebof!pe!vzulpxojlb
i!ebof!pe!vzulpxojlb
Warto argumentu bits ogranicza typy wartoci podanych przez uytkownika do
nastpnego wywoania funkcji pobierajcej dane od uytkownika. Dziki zmuszeniu
uytkownika do wprowadzenia wymaganego typu informacji, zmniejszone zostaj
wymagania odnonie sprawdzania poprawnoci jego odpowiedzi. W poniszej tabeli
podano dozwolone wartoci argumentu bits funkcji initget.
Tabela 13.2. Opcje wprowadzania danych, ustalane przez initget
Warto bitu

Znaczenie

Niedopuszczalne wprowadzenie odpowiedzi pustej

Niedopuszczalne wartoci zerowe

Niedopuszczalne wartoci ujemne

Granice nie s sprawdzane, nawet gdy zmienna LIMCHECK ma warto 1

16

(Ten bit nie jest aktualnie wykorzystywany)

32

Ruchoma linia pomocnicza i ramka s rysowane lini kreskow

64

Ignorowane s wsprzdne Z punktw 3W (dotyczy tylko funkcji getdist)

128

Zwracana jest dowolna odpowied z klawiatury

Ustalenie jednoczenie kilku warunkw polega na zwykym zsumowaniu odpowiadajcych im wartoci i utworzeniu jednej wartoci argumentu bits, z zakresu od 0 do
255 lub te uyciu konstrukcji typu (initget (+ 1 2 4)). Jeli argument bits nie jest
podany, lub ma warto zero, dla najbliszego wywoania funkcji pobierajcej dane od
uytkownika nie obowizuj adne warunki ograniczajce.

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

562

Poniszy program pokazuje sposoby uycia argumentu bits funkcji initget w powizaniu z funkcjami typu getxxx.
;*************************************************PROG_098
;Przyklady wywolania wybranych funkcji z grupy GETXXX
;z wywolaniem funkcji INITGET wraz z argumentem BITS.
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
;---------(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Funkcja rysujaca prostokat, ktorego przeciwleglymi
;wierzcholkami sa punkty p1 i p2.
;
(defun RYSUJ_PROSTOKAT (p1 p2)
(progn
;---------(command
"_pline"
p1
(list (car p1)(cadr p2))
p2
(list (car p2)(cadr p1))
"_c"
);command
;---------(princ)
;---------);progn
);RYSUJ_PROSTOKAT
;
;------------------------------------------------;Wywolanie funkcji getint.
;
(defun FUNKCJA_1 (/ x)
(progn
;---------(initget 1)
(setq
x (getint
"Wprowadz dowolna liczbe calkowita: "
);getint
);setq
;

563

BvupMJTQ!!qsbluzd{oz!lvst
(initget (+ 1 2)) ; <=> (initget 3)
(setq
x (getint
"Wprowadz liczbe calkowita rozna od zera: "
);getint
);setq
;
(initget (+ 1 2 4)) ; <=> (initget 7)
(setq
x (getint
"Wprowadz liczbe calkowita wieksza od zera: "
);getint
);setq
;---------(princ)
;---------);progn
);FUNKCJA_1
;
;------------------------------------------------;Wywolanie funkcji getpoint i getcorner - wersja 1.
;
(defun FUNKCJA_2 (/ p1 p2)
(progn
;---------(command "_color" "1")
(initget 1)
(setq
p1 (getpoint "Wskaz pierwszy wierzcholek prostokata:
")
);setq
;
(initget 1)
(setq
p2 (getcorner
p1 "\nWskaz przeciwlegly wierzcholek prostokata:
"
);getcorner
);setq
;
(RYSUJ_PROSTOKAT p1 p2)
;---------(princ)
;---------);progn
);FUNKCJA_2
;
;------------------------------------------------;Wywolanie funkcji getpoint i getcorner - wersja 2.
;
(defun FUNKCJA_3 (/ p1 p2)
(progn
;---------(command "_color" "5")
(initget 1)

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

564

(setq
p1 (getpoint "Wskaz pierwszy wierzcholek prostokata:
")
);setq
;
(initget (+ 1 32))
(setq
p2 (getcorner
p1 "\nWskaz przeciwlegly wierzcholek

prostokata:

"
);getcorner
);setq
;
(RYSUJ_PROSTOKAT p1 p2)
;---------(princ)
;---------);progn
);FUNKCJA_3
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu
;
(textpage)
(CZEKAJ)
(FUNKCJA_1)
(CZEKAJ)
(graphscr)
(FUNKCJA_2)
(CZEKAJ)
(FUNKCJA_3)
(princ)
;------------------------------------------------;*************************************************KONIEC

Omwmy teraz gwne funkcje programu.


FUNKCJA_1
W funkcji tej wywoujemy trzykrotnie funkcj getint, zmieniajc za kadym razem
argument bits funkcji initget. Warto zwrotn funkcji getint podstawiamy kadorazowo pod zmienn lokaln x.
FUNKCJA_2
W funkcji tej, zastosowano funkcje getpoint i getcorner do pobrania wsprzdnych
dwch punktw, bdcych przeciwlegymi wierzchokami prostokta. Podane punkty
wprowadzane s nastpnie jako argumenty funkcji RYSUJ_PROSTOKAT. Warto
argumentu bits = 1 w funkcji initget nie pozwala na podanie pustej odpowiedzi
w funkcjach getpoint i getcorner. Ruchoma ramka rysowana jest przez funkcj
getcorner lini cig.

565

BvupMJTQ!!qsbluzd{oz!lvst
FUNKCJA_3
Jest to modyfikacja funkcji poprzedniej polegajca na dodaniu dodatkowego argumentu
bits = 32 w funkcji initget obsugujcej wywoanie funkcji getcorner. Ruchoma ramka
rysowana jest wtedy przez funkcj getcorner lini przerywan.

24/3/3/!Pqdkf!tx!lmvd{
4/3/3/!Pqdkf!tx!lmvd{pxzdi
tx!lmvd{pxzdi
Drugi opcjonalny argument funkcji initget string okrela list sw kluczowych,
ktre bd rozpoznawane przy nastpnym wywoaniu funkcji pobierajcej dane od
uytkownika. Znaczenie kadego ze sw kluczowych i dziaanie podejmowane po ich
wybraniu okrela program w AutoLISPie.
Funkcja initget umoliwia rozpoznawanie oprcz penych sw kluczowych take ich
skrtw. Istniej dwie metody skracania sw kluczowych, obie omawiane w katalogu
funkcji AutoLISPu podczas omawiania funkcji initget. Funkcja pobierajca dane od
uytkownika zwraca zdefiniowane sowo kluczowe, jeli odpowied uytkownika jest
zgodna ze sowem kluczowym (nie ma znaczenia pisownia duymi lub maymi
literami), lub gdy odpowied uytkownika odpowiada skrtowi sowa kluczowego.
Poniej przedstawiono program wykorzystujcy sowa kluczowe do obsugi funkcji
getreal.
;*************************************************PROG_099
;Przyklady wywolania funkcji GETREAL z wywolaniem funkcji
;INITGET wraz z argumentami BITS oraz STRING.
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
;---------(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Przyklad 1.
;
(defun FUNKCJA_1 (/ x)
(progn
;---------(initget 1 "Pi Dwa-pi")
(setq x (getreal "Pi/Dwa-pi/Liczba: "))
(cond
((= x "Pi") (setq x pi))

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
((= x "Dwa-pi") (setq x (* 2.0 pi)))
);cond
(princ "Wprowadzona liczba: ")
(princ x)
;---------(princ)
;---------);progn
);FUNKCJA_1
;
;------------------------------------------------;Przyklad 2.
;
(defun FUNKCJA_2 (/ lista jeszcze x i)
(progn
;---------(setq
lista (list)
jeszcze T
);setq
;
(princ "\n\n")
(while jeszcze
(progn
;---------(initget 1 "K")
(setq
x (getreal "Wprowadz liczbe [K - koniec]: ")
);setq
;
(cond
((/= x "K")
(setq
lista (append lista (list x))
);setq
)
;
((= x "K")
(setq jeszcze nil)
)
);cond
;---------);progn
);while jeszcze
;
(if lista
(progn
;---------(princ "\nWprowadzone liczby:\n")
(foreach i lista
(progn
;---------(princ i)
(princ " ")
;----------

566

567

BvupMJTQ!!qsbluzd{oz!lvst
);progn
);foreach
;---------);progn
);if
;---------(princ)
;---------);progn
);FUNKCJA_2
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu
;
(textpage)
(CZEKAJ)
(FUNKCJA_1)
(CZEKAJ)
(FUNKCJA_2)
(princ)
;------------------------------------------------;*************************************************KONIEC

Wykonanie programu moe by nastpujce:


Command: (load "prog_099")

Nacisnij ENTER...

Pi/Dwa-pi/Liczba: pi

Wprowadzona liczba: 3.14159


Nacisnij ENTER...

Wprowadz liczbe [K - koniec]: 1

Wprowadz liczbe [K - koniec]: 2

Wprowadz liczbe [K - koniec]: a

Requires numeric value or option keyword.


Wprowadz liczbe [K - koniec]: 10

Wprowadz liczbe [K - koniec]: k

Wprowadzone liczby:
1.0 2.0 10.0
Command:

Omwmy teraz gwne funkcje programu.


FUNKCJA_1
Jest to przykad wywoania funkcji getreal, poprzedzonej przez zdefiniowanie dwch
sw kluczowych przez funkcj initget. Program sprawdza, czy uytkownik wprowadzi
w odpowiedzi jedno z tych sw i odpowiednio ustawia warto wprowadzon.

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

568

Wywoanie initget blokuje moliwo wprowadzenia odpowiedzi pustej (bits = 1)


i ustala list dwch sw kluczowych: "Pi" i "Dwa-pi". Nastpnie funkcja getreal
pobiera od uytkownika liczb rzeczywist, wywietlajc przy tym zgoszenie:
Pi/Dwa-pi/Liczba:

Wynik jest umieszczany w lokalnym symbolu x. Jeli uytkownik wprowadzi liczb,


jest ona bezporednio wypisywana na ekranie. Jeli jednak uytkownik wprowadzi
w odpowiedzi sowo kluczowe Pi (lub nawet samo P lub p), funkcja getreal zwrci
sowo kluczowe Pi. Wykrywa to funkcja cond i podstawia w tym wypadku pod
zmienn x warto 3.14159. Podobnie traktowane jest sowo kluczowe Dwa-pi.
FUNKCJA_2
Jest to przykad wywoania funkcji getreal w ptli while. Dziki wywoaniu funkcji
initget funkcja getreal pozwala na podanie dowolnej liczby rzeczywistej lub sowa
kluczowego "K" lub "k", ktre koczy wykonywanie ptli while. Argument bits = 1
w funkcji initget uniemoliwia wprowadzenie odpowiedzi pustej. Jeli w odpowiedzi
na getreal zostanie podana dowolna liczba cakowita lub rzeczywista, jest ona dopisywana do listy wprowadzonych liczb. Lista ta jest wypisywana na ekran po wyjciu z ptli while, jeeli nie jest list pust (co bdzie miao miejsce, gdy odpowiemy sowem
kluczowym na pierwsze wywoanie funkcji getreal).
Na koniec tego punktu chciabym powiedzie jeszcze co nieco na temat funkcji getstring
oraz getkword. Funkcja getstring nie akceptuje ani argumentw bits, ani te sw
kluczowych wprowadzanych w funkcji initget. Uytkownik moe wic zawsze poda
dowolny cig znakw lub wprowadzi odpowied pust. Moemy mie wpyw jedynie na
to, czy wprowadzany acuch moe zawiera spacje. Jeli wic chcemy wymusi podanie
konkretnego acucha znakw (np. podziaka rysunku), musimy dany acuch przyporzdkowa do liczby cakowitej, wymusi wprowadzenie liczby z podanego zakresu
a nastpnie na podstawie wprowadzonej liczby zwrci odpowiedni acuch.
Moemy rwnie wykorzysta do tego celu funkcj getkword. Funkcja ta wymaga, aby
uytkownik wprowadzi sowo kluczowe. Lista aktualnie branych pod uwag sw
kluczowych jest ustalana przed wywoaniem getkword, poprzez wywoanie funkcji
initget. Opcjonalny argument prompt jest acuchem alfanumerycznym, wywietlanym
jako zgoszenie programu. Funkcja getkword zwraca sowo kluczowe, odpowiadajce
wprowadzonemu przez uytkownika acuchowi.
Poniszy przykad pokazuje sposoby wymuszenia na uytkowniku wprowadzenia
okrelonego acucha znakw.
;*************************************************PROG_100
;Przyklady wymuszenia podania odpowiedniego lancucha
;znakow alfanumerycznych.
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn

569

BvupMJTQ!!qsbluzd{oz!lvst
;---------(getstring "\nNacisnij ENTER...")
;---------(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Wykorzystanie funkcji GETINT i COND.
;
(defun FUNKCJA_1 (/ podz jeszcze odp)
(progn
;---------(setq
podz ""
jeszcze T
);setq
;
(textpage)
(while jeszcze
(progn
;---------(princ
(strcat
"\nWybierz podzialke rysunku."
"\n1 - 1:1"
"\n2 - 1:2"
"\n3 - 1:5"
"\n4 - 1:10"
);strcat
);princ
(setq odp (getint "\n\nTwoj wybor [1 2 3 4]: "))
(cond
((= odp 1)
(setq podz "1:1")
(setq jeszcze nil)
)
;
((= odp 2)
(setq podz "1:2")
(setq jeszcze nil)
)
;
((= odp 3)
(setq podz "1:5")
(setq jeszcze nil)
)
;
((= odp 4)
(setq podz "1:10")
(setq jeszcze nil)
)
;
(T

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
(princ "\n\nBledny wybor podzialki rysunku!.")
(princ "\nSprobuj jeszcze raz.\n")
)
);cond
;---------);progn
);while jeszcze
;
(princ "Wybrana podzialka rysunku: ")
(prin1 podz)
;---------(princ)
;---------);progn
);FUNKCJA_1
;
;------------------------------------------------;Wykorzystanie funkcji INITGET i GETKWORD.
;
(defun FUNKCJA_2 (/ podz)
(progn
;---------(initget 1 "1:1 1:2 1:5 1:10")
(setq
podz (getkword
(strcat
"\nPodzialki rysunkowe: "
"1:1 1:2 1:5 1:10"
"\nTwoj wybor [1:1 1:2 1:5 1:10]: "
);strcat
);getkword
);setq
;
(princ "Wybrana podzialka rysunku: ")
(prin1 podz)
;---------(princ)
;---------);progn
);FUNKCJA_2
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu
;
(textpage)
(CZEKAJ)
(FUNKCJA_1)
(CZEKAJ)
(FUNKCJA_2)
(princ)
;------------------------------------------------;*************************************************KONIEC

56:

571

BvupMJTQ!!qsbluzd{oz!lvst
Wykonanie programu moe by nastpujce:
Command: (load "prog_100")

Nacisnij ENTER...

Wybierz podzialke rysunku.


1 - 1:1
2 - 1:2
3 - 1:5
4 - 1:10
Twoj wybor [1 2 3 4]: 3

Wybrana podzialka rysunku: "1:5"


Nacisnij ENTER...

Podzialki rysunkowe: 1:1 1:2 1:5 1:10


Twoj wybor: [1:1 1:2 1:5 1:10]: 1:2

Wybrana podzialka rysunku: "1:2"


Command:

Omwmy teraz gwne funkcje programu.


FUNKCJA_1
Wykorzystujemy tutaj funkcje getint oraz cond. W funkcji tej podziaki rysunkowe
kojarzymy z liczbami cakowitymi z przedziau od 1 do 4. Funkcj pobierajc informacje od uytkownika jest funkcja getint. Jest ona wywoywana w ptli while tak dugo,
dopki uytkownik nie wprowadzi cyfry od 1 do 4. Wyrniamy tutaj dwa poziomy
kontroli wprowadzonej informacji:
poziom 1 stanowi sama funkcja getint. Zapobiega ona podaniu informacji innej
ni liczba cakowita lub odpowied pusta.
poziom 2 stanowi funkcja cond. Zawa ona zakres informacji poprawnej dla
poziomu 1. Nie jest tutaj dopuszczalna odpowied pusta ani liczby spoza
przedziau od 1 do 4.
Po podaniu poprawnej odpowiedzi (a tym samym wyjciu z ptli while), wypisywana
jest wybrana podziaka rysunkowa.
FUNKCJA_2
Wykorzystujemy tutaj funkcje initget oraz getkword. Funkcja initget zapobiega
podaniu odpowiedzi pustej oraz ustawia list sw kluczowych (podziaek rysunkowych) obowizujcych w wywoywanej zaraz po niej funkcji getkword. Funkcja
getkword wywoywana jest tak dugo, dopki uytkownik nie wprowadzi jednego
z obowizujcych sw kluczowych. Gdy tak si stanie, wypisywana jest wybrana
podziaka rysunkowa.

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

572

Bardzo czsto zdarza si, e pobierajc informacje od uytkownika chcemy mu zaproponowa odpowied domyln. Aby wybra odpowied domyln, wystarczy, aby
uytkownik w odpowiedzi na funkcje getxxx nacisn sam klawisz ENTER (poda
odpowied pust). Wiele ze standardowych polece AutoCADa pozwala na wybr opcji
domylnej opcja taka umieszczona jest w nawiasach ostrych i znajduje si zazwyczaj
na kocu komunikatu nakazujcego wybr jednej z wartoci. Aby umoliwi wprowadzenie wartoci domylnych w funkcjach uytkownika, naley speni dwa warunki:
1. Jeli przed funkcj getxxx wywoywana jest funkcja initget, nie wolno w niej
ustawia argumentu bits na 1, poniewa uniemoliwi to wprowadzenie odpowiedzi pustej przez uytkownika brak moliwoci podania samego ENTER.
2. Funkcja uytkownika musi sama zadba o prawidow obsug wprowadzania
wartoci domylnych.
W poniszej tabeli zamieszczono wartoci zwrotne funkcji z grupy getxxx w przypadku
odpowiedzi pustej (nacinicia samego klawisza ENTER).
Tabela 13.3. Wartoci zwrotne funkcji getxxx w przypadku odpowiedzi pustej
Nazwa funkcji

Warto zwrotna

getint

nil

getreal

nil

getstring

"" pusty acuch

getpoint

nil

getcorner

nil

getdist

nil

getangle

nil

getorient

nil

getkword

nil

Poniszy program pokazuje, w jaki sposb uzyska wartoci domylne w wybranych


funkcjach z grupy getxxx.
;*************************************************PROG_101
;Przyklady mozliwosci podania wartosci domyslnych
;w funkcjach z grupy GETXXX.
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.

573

BvupMJTQ!!qsbluzd{oz!lvst
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
;---------(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Wprowadzenie wartosci domyslnej w funkcji getint.
;
(defun FUNKCJA_1 (/ x)
(progn
;---------(setq x 2)
(setq
x (getint "Podaj dowolna liczbe calkowita <2>: ")
);setq
(cond
((= x nil)(setq x 2))
);cond
(princ "Wprowadzona liczba = ")
(princ x)
;---------(princ)
;---------);progn
);FUNKCJA_1
;
;------------------------------------------------;Wprowadzenie wartosci domyslnej w funkcji getstring.
;
(defun FUNKCJA_2 (/ x)
(progn
;---------(setq x "Test")
(setq
x (getstring
"\nPodaj dowolny lancuch bez spacji <\"Test\">: "
);getstring
);setq
(cond
((= x "")(setq x "Test"))
);cond
(princ "Wprowadzony lancuch = ")
(princ x)
;---------(princ)
;---------);progn
);FUNKCJA_2
;

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

574

;------------------------------------------------;Wprowadzenie wartosci domyslnej w funkcji getpoint.


;
(defun FUNKCJA_3 (punkt / x)
(progn
;---------(setq
msg (strcat
"\nWskaz punkt <"
(rtos (car
punkt) 2 4)
" "
(rtos (cadr punkt) 2 4)
" "
(rtos (caddr punkt) 2 4)
">: "
);strcat
);setq
(setq x (getpoint msg))
(cond
((= x nil)(setq x punkt))
);cond
(princ "Wprowadzony punkt = ")
(princ x)
;---------(princ)
;---------);progn
);FUNKCJA_3
;
;------------------------------------------------;Wprowadzenie wartosci domyslnej w funkcji getkword.
;
(defun FUNKCJA_4 (/ jeszcze x odp)
(progn
;---------(setq jeszcze T)
;
(while jeszcze
(progn
;---------(initget 1)
(setq x (getint "Podaj dowolna liczbe calkowita: "))
(initget "T N")
(setq odp (getkword "Czy konczymy [T N] <N>: "))
(cond
((= odp "T")(setq jeszcze nil))
);cond
;---------);progn
);while jeszcze
;---------(princ)
;---------);progn
);FUNKCJA_4

575

BvupMJTQ!!qsbluzd{oz!lvst
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu
;
(textpage)
(CZEKAJ)
(FUNKCJA_1)
(CZEKAJ)
(FUNKCJA_2)
(CZEKAJ)
(graphscr)
(FUNKCJA_3 '(2 4.5 12.25))
(textscr)
(CZEKAJ)
(terpri)
(FUNKCJA_4)
(princ)
;------------------------------------------------;*************************************************KONIEC

Wykonanie powyszego programu moe przebiega nastpujco:


Command: (load "prog_101")

Nacisnij ENTER...

Podaj dowolna liczbe calkowita <2>:


Wprowadzona liczba = 2
Nacisnij ENTER...

Podaj dowolny lancuch bez spacji <"Test">: abcd

Wprowadzony lancuch = abcd


Nacisnij ENTER...

Wskaz punkt <2.0000 4.5000 12.5000>:


Wprowadzony punkt = (2.5 4.5 12.5)
Nacisnij ENTER...

Podaj dowolna liczbe calkowita: 5

Czy konczymy [T N] <N>:


Podaj dowolna liczbe calkowita: 10

Czy konczymy [T N] <N>: t

Command:

Omwmy teraz gwne funkcje programu.


FUNKCJA_1
Funkcja ta pokazuje nam sposb wprowadzenia wartoci domylnej w funkcji getint.
Naciskajc samo ENTER w odpowiedzi na getint powodujemy wprowadzenie pod

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

576

zmienn x wartoci nil, co zostaje wychwycone w instrukcji cond, ktra podstawia


wwczas pod zmienn x cyfr 2.
FUNKCJA_2
Funkcja ta pokazuje nam sposb wprowadzenia wartoci domylnej w funkcji
getstring. Zwr uwag na sposb wprowadzania wartoci domylnej "Test" w argumencie prompt funkcji getstring.
FUNKCJA_3
Funkcja ta pokazuje nam sposb wprowadzenia wartoci domylnej w funkcji getpoint.
Funkcja wywoywana jest z jednym argumentem punkt bdcym wsprzdnymi
punktu, jakie naley przyj w przypadku wprowadzenia przez uytkownika
odpowiedzi pustej. Zwr uwag na budow zmiennej msg, ktra bdzie nastpnie
wprowadzona jako argument prompt funkcji getpoint.
FUNKCJA_4
Funkcja ta pokazuje nam sposb wprowadzenia wartoci domylnej w funkcji
getkword. W ptli while pobieramy dwie zmienne:
zmienn x, bdc dowoln liczb cakowit (nie jest tutaj dozwolona odpowied
pusta),
zmienn odp, bdc jednym ze zdefiniowanych sw kluczowych. Nacinicie
w odpowiedzi na getkword samego ENTER powoduje dalsze wykonywanie
ptli while. Aby przerwa ptl while, naley w odpowiedzi na getkword
wpisa T lub t.

Funkcja initget zezwala take na wprowadzenie dowolnych danych z klawiatury dla


wikszoci z funkcji getxxx. Uzyskujemy to ustawiajc argument bits funkcji initget na
128. Dane te s przesyane do aplikacji jako acuch tekstowy. Program uytkowy
korzystajcy z tej moliwoci moe by napisany w celu umoliwienia uytkownikowi
podania wyraenia AutoLISPu w odpowiedzi na zgoszenie funkcji getxxx. Poniszy
program pokazuje przykad wykorzystania tej moliwoci.
;*************************************************PROG_102
;Przyklady dowolnych odpowiedzi z klawiatury
;dla funkcji z grupy GETXXX - przyklad 1.
;
;------------------------------------------------;Ustawienia poczatkowe.
;
(defun RYSUNEK_PROTOTYPOWY ()

577

BvupMJTQ!!qsbluzd{oz!lvst
(progn
;---------;ustawienie okna roboczego
(command "_zoom" "_window" "0,0" "12,9")
;
;wylaczenie echa komend
(setvar "cmdecho" 0)
;
;wylaczenie znacznikow punktow
(setvar "blipmode" 0)
;
;utworzenie warstw i przyporzadkowanie kolorow
(command
"_layer"
"_new" "punkty,rysunek"
"_color" "_red" "punkty"
"_color" "_blue" "rysunek"
""
);command
;
;wyglad i wielkosc punktu
(setvar "pdmode" 33)
(setvar "pdsize" 0.10)
;---------(princ)
;---------);progn
);RYSUNEK_PROTOTYPOWY
;
;------------------------------------------------;Funkcja oblicza i zwraca wspolrzedne srodka
;odcinka o koncach w punktach p1 i p2.
;
(defun SRODEK_ODCINKA (/ p1 p2 x y z)
(progn
;---------;pobranie wspolrzednych dwoch punktow
(setq
p1 (getpoint "\nWskaz pierwszy punkt: ")
p2 (getpoint p1 "\nWskaz drugi punkt: ")
);setq
;
;obliczenie wspolrzednych punktu srodkowego
(setq
x (/ (+ (car p1)(car p2)) 2.0)
y (/ (+ (cadr p1)(cadr p2)) 2.0)
z (/ (+ (caddr p1)(caddr p2)) 2.0)
);setq
;
;zwrot wspolrzednych punktu srodkowego
(list x y z)
;---------);progn
);SRODEK_ODCINKA
;

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

578

;------------------------------------------------;Funkcja pozwalajaca na wprowadzenie dowolnej


;odpowiedzi z klawiatury.
;
(defun FUNKCJA_1 (/ jeszcze lista_1 punkt)
(progn
;---------(setq
jeszcze T
lista_1 (list)
);setq
;
(while jeszcze
(progn
;---------(initget 128)
(setq punkt (getpoint "\nPunkt <ENTER - koniec>: "))
(cond
((= punkt nil)
(setq jeszcze nil)
)
;
((= (type punkt) 'STR)
(setq punkt (eval (read punkt)))
(setq lista_1 (append lista_1 (list punkt)))
(command
"_layer" "_set" "punkty" ""
"_point" punkt
"_layer" "_set" "0" ""
);command
)
;
(T
(setq lista_1 (append lista_1 (list punkt)))
(command
"_layer" "_set" "punkty" ""
"_point" punkt
"_layer" "_set" "0" ""
);command
)
);cond
;---------);progn
);while jeszcze
;
(if (> (length lista_1) 1)
(progn
;---------(command "_layer" "_set" "rysunek" "")
(command "_pline")
(foreach punkt lista_1 (command punkt))
(command "")
(command "_layer" "_set" "0" "")
;---------);progn

579

BvupMJTQ!!qsbluzd{oz!lvst
);if
;---------(princ)
;---------);progn
);FUNKCJA_1
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu
;
(graphscr)
(RYSUNEK_PROTOTYPOWY)
(FUNKCJA_1)
;------------------------------------------------;*************************************************KONIEC

Omwmy teraz gwne funkcje programu.


RYSUNEK_PROTOTYPOWY
Funkcja ta jest automatycznie wywoywana jako pierwsza po zaadowaniu programu.
Jej zadaniem jest przygotowanie rodowiska pracy dla innych funkcji. Zwr uwag na
sposb tworzenia nowych warstw. Moemy jednoczenie utworzy kilka warstw,
podajc je oddzielone przecinkami w jednym acuchu.
SRODEK_ODCINKA
Funkcja ta pobiera wsprzdne dwch dowolnych punktw oraz zwraca punkt
rodkowy odcinka wyznaczonego przez pobrane punkty. Zalet funkcji jest to, e
punkty te mog by cakowicie dowolne (nie musz lee na tym samym obiekcie),
mona rwnie stosowa standardowe tryby lokalizacji punktw (OSNAP) wzgldem
obiektw rysunkowych AutoCADa.
FUNKCJA_1
Jest to funkcja pozwalajca na podanie dowolnej odpowiedzi z klawiatury podczas
wywoania funkcji getpoint. Funkcja dziaa w ptli while, wyjcie z ktrej jest moliwe
poprzez podanie odpowiedzi pustej w funkcji getpoint.
W przypadku, gdy uytkownik wprowadzi punkt, funkcja docza go na list lista_1
oraz rysuje punkt o podanych wsprzdnych na warstwie PUNKTY.
W przypadku, kiedy w odpowiedzi na getstring uytkownik wprowadzi acuch
znakw, jest to traktowane jako danie wykonania innej funkcji z podstawieniem jej
wartoci zwrotnej pod zmienn punkt. Jeeli funkcja zostaa wykonana poprawnie
(wpisano poprawnie nazw funkcji oraz jest to funkcja zwracajca wsprzdne
punktu), nastpuje doczenie punktu na list oraz jego narysowanie na warstwie
PUNKTY. Przykadowe wykorzystanie funkcji SRODEK_ODCINKA z wntrza
funkcji FUNKCJA_1 moe wyglda nastpujco:
Punkt <ENTER - koniec>: (srodek_odcinka)

Wskaz pierwszy punkt: nod

of

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

57:

Wskaz drugi punkt: end

of
Punkt <ENTER - koniec>:

Po wyjciu z ptli while sprawdzamy, czy na licie lista_1 znajduj si co najmniej dwa
punkty (if (> (length lista_1) 1). Jeeli tak, przechodzimy na warstw RYSUNEK
i rysujemy polilini przebiegajc przez kolejno podawane punkty, po czym wracamy
na warstw 0.
Powyszy program ma jednak pewne niedogodnoci. Nie widzimy poszczeglnych
odcinkw polilinii podczas wskazywania jej kolejnych wierzchokw, nie ma te pomocniczej linii czcej ostatnio podany punkt z aktualn pozycj kursora. Niedogodnoci
te zostay usunite w zmodyfikowanej wersji programu, przedstawionej poniej.
;*************************************************PROG_103
;Przyklady dowolnych odpowiedzi z klawiatury
;dla funkcji z grupy GETXXX - przyklad 2.
;
;------------------------------------------------;Ustawienia poczatkowe.
;
(defun RYSUNEK_PROTOTYPOWY ()
(progn
;---------;ustawienie okna roboczego
(command "_zoom" "_window" "0,0" "12,9")
;
;wylaczenie echa komend
(setvar "cmdecho" 0)
;
;wylaczenie znacznikow punktow
(setvar "blipmode" 0)
;
;utworzenie warstw i przyporzadkowanie kolorow
(command
"_layer"
"_new" "punkty,rysunek"
"_color" "_red" "punkty"
"_color" "_blue" "rysunek"
""
);command
;
;wyglad i wielkosc punktu
(setvar "pdmode" 33)
(setvar "pdsize" 0.10)
;---------(princ)
;---------);progn
);RYSUNEK_PROTOTYPOWY
;
;------------------------------------------------;Funkcja oblicza i zwraca wspolrzedne srodka
;odcinka o koncach w punktach p1 i p2.

581

BvupMJTQ!!qsbluzd{oz!lvst
;
(defun SRODEK_ODCINKA (/ p1 p2 x y z)
(progn
;---------;pobranie wspolrzednych dwoch punktow
(setq
p1 (getpoint "\nWskaz pierwszy punkt: ")
p2 (getpoint p1 "\nWskaz drugi punkt: ")
);setq
;
;obliczenie wspolrzednych punktu srodkowego
(setq
x (/ (+ (car p1)(car p2)) 2.0)
y (/ (+ (cadr p1)(cadr p2)) 2.0)
z (/ (+ (caddr p1)(caddr p2)) 2.0)
);setq
;
;zwrot wspolrzednych punktu srodkowego
(list x y z)
;---------);progn
);SRODEK_ODCINKA
;
;------------------------------------------------;Wykorzystanie funkcji GRDRAW do narysowania linii
;o danym kolorze przechodzacych przez punkty
;umieszczone na liscie lista_punktow.
;
(defun LINIA_POMOCNICZA (lista_punktow color highlight /
dlugosc licznik p1 p2
)
(progn
;---------(setq
dlugosc (length lista_punktow)
licznik 0
);setq
(if (> dlugosc 1)
(progn
;---------(repeat (- dlugosc 1)
(progn
;---------(setq
p1 (nth licznik lista_punktow)
p2 (nth (1+ licznik) lista_punktow)
);setq
;
(grdraw p1 p2 color highlight)
;
(setq licznik (1+ licznik))

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

582

;
;---------);progn
);repeat
;---------);progn
);if
;---------(princ)
;---------);progn
);LINIA_POMOCNICZA
;
;------------------------------------------------;Funkcja pozwalajaca na wprowadzenie dowolnej
;odpowiedzi z klawiatury.
;
(defun FUNKCJA_1 (/ jeszcze lista_1 punkt)
(progn
;---------(setq
jeszcze T
lista_1 (list)
);setq
;
(while jeszcze
(progn
;---------(if lista_1
(progn
(LINIA_POMOCNICZA lista_1 1 1)
(initget 128)
(setq
punkt (getpoint
(last lista_1) "\nPunkt <ENTER - koniec>: "
);getpoint
);setq
);progn
(progn ;else
(initget 128)
(setq punkt (getpoint "\nPunkt <ENTER - koniec>: "))
);progn
);if
;
(cond
((= punkt nil)
(setq jeszcze nil)
)
;
((= (type punkt) 'STR)
(setq punkt (eval (read punkt)))
(setq lista_1 (append lista_1 (list punkt)))
(command

583

BvupMJTQ!!qsbluzd{oz!lvst
"_layer" "_set" "punkty" ""
"_point" punkt
"_layer" "_set" "0" ""
);command
)
;
(T
(setq lista_1 (append lista_1 (list punkt)))
(command
"_layer" "_set" "punkty" ""
"_point" punkt
"_layer" "_set" "0" ""
);command
)
);cond
;---------);progn
);while jeszcze
;
(if (> (length lista_1) 1)
(progn
;---------(command "_layer" "_set" "rysunek" "")
(command "_pline")
(foreach punkt lista_1 (command punkt))
(command "")
(command "_layer" "_set" "0" "")
;---------);progn
);if
;---------(princ)
;---------);progn
);FUNKCJA_1
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu
;
(graphscr)
(RYSUNEK_PROTOTYPOWY)
(FUNKCJA_1)
;------------------------------------------------;*************************************************KONIEC

Omwmy teraz zmiany wprowadzone w stosunku do programu PROG_102.


LINIA_POMOCNICZA
Funkcja ta umoliwia nam wizualizacj kolejno rysowanych wierzchokw polilinii.
Wykorzystujemy do tego celu funkcj grdraw. Format funkcji jest nastpujcy:
(grdraw from to color [highlight])

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

584

Funkcja ta rysuje wektor midzy dwoma danymi punktami podanymi w argumentach


from i to w kolorze okrelonym przez argument color. Dodanie opcjonalnego argumentu highlight o wartoci rnej od zera powoduje, e wektor bdzie rysowany w taki
sposb, jaki jest dla danego wywietlacza standardowo uywany do wyrniania obiektw (zwykle uywana jest linia kreskowa).
Funkcja grdraw wywoywana jest tutaj z argumentami color i highlight podanymi w wywoaniu funkcji LINIA_POMOCNICZA. Funkcja repeat pozwala na przetworzenie
wszystkich punktw umieszczonych na licie przekazanej jako argument lista_punktow.
FUNKCJA_1
W funkcji tej zmodyfikowano jej pocztek instrukcja warunkowa if lista_1.
W przypadku, gdy jest to lista pusta (wprowadzamy pierwszy punkt) warunek else
pozwalamy na wprowadzenie dowolnej odpowiedzi z klawiatury oraz pobieramy
wsprzdne punktu.
W przypadku gdy lista nie jest pusta, wywoujemy funkcj LINIA_POMOCNICZA,
pozwalamy na wprowadzenie dowolnej odpowiedzi z klawiatury oraz pobieramy
wsprzdne punktu wprowadzajc w funkcji getpoint argument (last lista_1), powodujcy narysowanie linii pomocniczej pomidzy ostatnio wprowadzonym punktem a aktualn pozycj kursora.

Poprzez dodanie i rozszerzenie informacji zawartych w tekstowym pliku pomocy


ACAD.HLP mona uzupeni zarwno opisy istniejcych polece oraz komunikatw
AutoCADa, jak i wprowadzi opisy programw wasnych. Istnieje rwnie moliwo
utworzenia wasnych plikw pomocy, ktre s wywoywane przez programy napisane
w AutoLISPie. Pliki te s tekstowymi plikami ASCII i standardowo posiadaj rozszerzenie HLP.
Standardowo, wywoanie polecenia HELP (POMOC) powoduje wywietlenie okna
dialogowego, pozwalajcego na przegldanie zawartoci pliku ACAD.HLP. Programy
pisane w AutoLISPie mog wywietla dodatkowe pliki pomocy poprzez wywoanie
funkcji acad_helpdlg. Format funkcji jest nastpujcy:
(acad_helpdlg helpfile [topic])

Funkcja wywietla standardowe okno z informacjami pomocniczymi AutoCADa,


odczytanymi ze wskazanego pliku dyskowego. Argument helpfile jest acuchem
alfanumerycznym, okrelajcym plik z informacjami pomocniczymi AutoCADa (rozszerzenie nazwy .HLP jest opcjonalne). Argument topic jest hasem, ktre pocztkowo jest

585

BvupMJTQ!!qsbluzd{oz!lvst
wywietlane w oknie dialogowym. Jeli argument topic jest acuchem pustym (""), okno
dialogowe zawiera informacje wstpne z pliku informacji pomocniczych.
Dla wasnych programw uytkownika, plik HLP bdzie zwykle wskazywa nazw
wasnego pliku informacji pomocniczych uytkownika. Format tego pliku jest opisany
w rozdziale 2 AutoCAD Podrcznik Adaptacyjny.
Poniej przedstawiony zostanie program umoliwiajcy wywietlenie wasnego pliku
pomocy poprzez wpisanie znakw "?", "H" lub "h" jako odpowiedzi na funkcje
z grupy getxxx.
;*************************************************PROG_104
;Przyklady wywolan HELPu z funkcji uzytkownika.
;Program korzysta ze zbioru PROG_104.HLP.
;
;------------------------------------------------;Przyklady wywolania HELPu z warunkow typu GETXXX .
;
;UWAGA!!!
; Zbior ...HLP nie moze miec linii dluzszej niz 72
; znaki - inaczej zostanie obciety w oknie.
;------------------------------------------------;Podanie liczby calkowitej dodatniej bez wartosci domyslnej
;
(defun C:FUNKCJA_1 (/ nazwa_funkcji jeszcze liczba)
(progn
;---------(textscr)
;---------(setq nazwa_funkcji "C:FUNKCJA_1")
;---------(setq jeszcze T)
;
(while jeszcze
(progn
(initget (+ 1 2 4) "? H")
(setq
liczba
(getint "Wprowadz liczbe calkowita dodatnia: ")
);setq
(cond
((or (= liczba "?")(= liczba "H"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;
((and (> liczba 0))
(setq jeszcze nil)
);liczba calkowita dodatnia
);cond
);progn
);while jeszcze
;
(princ "\nWprowadzona liczba: ")
(princ liczba)

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

586

;---------(princ)
;---------);progn
);C:FUNKCJA_1
;
;------------------------------------------------;Podanie liczby calkowitej dodatniej z wartoscia domyslna
;
(defun C:FUNKCJA_2 (/ nazwa_funkcji jeszcze liczba)
(progn
;---------(textscr)
;---------(setq nazwa_funkcji "C:FUNKCJA_2")
;---------(setq jeszcze T)
;
(while jeszcze
(progn
(initget (+ 2 4) "? H")
(setq
liczba
(getint "Wprowadz liczbe calkowita dodatnia <5>: ")
);setq
(cond
((or (= liczba "?")(= liczba "H"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;
((and (/= liczba nil)(> liczba 0))
(setq jeszcze nil)
);liczba calkowita dodatnia
;
((= liczba nil)
(setq liczba 5)
(setq jeszcze nil)
);odpowiedz pusta - przyjecie wartosci domyslnej
);cond
);progn
);while jeszcze
;
(princ "\nWprowadzona liczba: ")
(princ liczba)
;---------(princ)
;---------);progn
);C:FUNKCJA_2
;
;------------------------------------------------;Podanie liczby calkowitej z przedzialu -5 +15
;bez wartosci domyslnej.
;
(defun C:FUNKCJA_3 (/ nazwa_funkcji jeszcze liczba)

587

BvupMJTQ!!qsbluzd{oz!lvst
(progn
;---------(textscr)
;---------(setq nazwa_funkcji "C:FUNKCJA_3")
;---------(setq jeszcze T)
;
(while jeszcze
(progn
(initget 1 "? H")
(setq
liczba
(getint
"Wprowadz liczbe calkowita z przedzialu -5 +15: "
);getint
);setq
(cond
((or (= liczba "?")(= liczba "H"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;
((and (>= liczba -5)(<= liczba 15))
(setq jeszcze nil)
);liczba calkowita z podanego przedzialu
;
((or (< liczba -5)(> liczba 15))
(princ
(strcat
"Nalezy wprowadzic liczbe calkowita "
"z przedzialu -5 +15 !!!\n"
);strcat
);princ
);liczba calkowita poza podanym przedzialem
);cond
);progn
);while jeszcze
;
(princ "\nWprowadzona liczba: ")
(princ liczba)
;---------(princ)
;---------);progn
);C:FUNKCJA_3
;
;------------------------------------------------;Podanie lancucha bez wartosci domyslnej
;
(defun FUNKCJA_4 (/ nazwa_funkcji jeszcze lancuch)
(progn

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

588

;---------(textscr)
;---------(setq nazwa_funkcji "FUNKCJA_4")
;---------(setq jeszcze T)
;
(while jeszcze
(progn
(setq
lancuch (getstring T "Wprowadz lancuch : ")
);setq
(cond
((or (= lancuch "?")(= lancuch "H")(= lancuch "h"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;
(T
(setq jeszcze nil)
);dowolny lancuch
);cond
);progn
);while jeszcze
;
(princ "\nWprowadzony lancuch: ")
(prin1 lancuch)
;---------(princ)
;---------);progn
);FUNKCJA_4
;
;------------------------------------------------;Podanie lancucha z wartoscia domyslna
;
(defun FUNKCJA_5 (/ nazwa_funkcji jeszcze lancuch)
(progn
;---------(textscr)
;---------(setq nazwa_funkcji "FUNKCJA_5")
;---------(setq jeszcze T)
;
(while jeszcze
(progn
(setq
lancuch
(getstring T "Wprowadz lancuch <CMG KOMAG> : ")
);setq
(cond
((or (= lancuch "?")(= lancuch "H")(= lancuch "h"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;

589

BvupMJTQ!!qsbluzd{oz!lvst
((/= lancuch "")
(setq jeszcze nil)
);dowolny lancuch
;
((= lancuch "")
(setq lancuch "CMG KOMAG")
(setq jeszcze nil)
);odpowiedz pusta - przyjecie wartosci domyslnej
);cond
);progn
);while jeszcze
;
(princ "\nWprowadzony lancuch: ")
(prin1 lancuch)
;---------(princ)
;---------);progn
);FUNKCJA_5
;
;------------------------------------------------;Przyklad HELPu dotyczacego konkretnego fragmentu funkcji.
;
(defun C:FUNKCJA_6 (/ nazwa_funkcji jeszcze zm_int zm_real
zm_str)
(progn
;---------(textscr)
;---------;wprowadzenie liczby calkowitej dodatniej
;bez wartosci domyslnej
(setq
nazwa_funkcji
"C:FUNKCJA_6,Wprowadz liczbe calkowita dodatnia: "
);setq
(setq jeszcze T)
(while jeszcze
(progn
(initget (+ 1 2 4) "? H")
(setq
zm_int
(getint "Wprowadz liczbe calkowita dodatnia: ")
);setq
(cond
((or (= zm_int "?")(= zm_int "H"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;
((and (> zm_int 0))
(setq jeszcze nil)
);liczba calkowita dodatnia
);cond
);progn
);while jeszcze
;----------

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

58:

;wprowadzenie liczby rzeczywistej z przedzialu -7.5 +2.5


(setq
nazwa_funkcji
(strcat
"C:FUNKCJA_6,"
"Wprowadz liczbe rzeczywista z przedzialu -7.5
+2.5: "
);strcat
);setq
(setq jeszcze T)
(while jeszcze
(progn
(initget 1 "? H")
(setq
zm_real
(getreal
"Wprowadz liczbe rzeczywista z przedzialu -7.5
+2.5: "
);getreal
);setq
(cond
((or (= zm_real "?")(= zm_real "H"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;
((and (>= zm_real -7.5)(<= zm_real 2.5))
(setq jeszcze nil)
);liczba rzeczywista z podanego przedzialu
;
((or (< zm_real -7.5)(> zm_real 2.5))
(princ
(strcat
"Nalezy wprowadzic liczbe rzeczywista "
"z przedzialu -7.5 +2.5 !!!\n"
);strcat
);princ
);liczba rzeczywista poza podanym przedzialem
);cond
);progn
);while jeszcze
;---------;wprowadzenie formatu arkusza rysunkowego z wartoscia
;domyslna "A4"
(setq
nazwa_funkcji
(strcat
"C:FUNKCJA_6,"
"Wprowadz format arkusza rysunkowego [A4 A3 A2]
<A4>: "
);strcat
);setq
(setq jeszcze T)
(while jeszcze
(progn
(initget "A4 A3 A2 ? H h")

591

BvupMJTQ!!qsbluzd{oz!lvst
(setq
zm_str
(getkword
(strcat
"Wprowadz format arkusza "
"rysunkowego [A4 A3 A2] <A4>: "
);strcat
);getkword
);setq
(cond
((or (= zm_str "?")(= zm_str "H")(= zm_str "h"))
(acad_helpdlg "prog_104" nazwa_funkcji)
);okno HELPu
;
((= zm_str nil)
(setq zm_str "A4")
(setq jeszcze nil)
);odpowiedz pusta - przyjecie wartosci domyslnej
;
(T
(setq jeszcze nil)
);jedno ze slow kluczowych
);cond
);progn
);while jeszcze
;---------;wypisanie na ekran wprowadzonych wartosci
(princ "\n\n\nWprowadzone wartosci:")
(princ "\n
Liczba calkowita:
")
(princ zm_int)
(princ "\n
Liczba rzeczywista: ")
(princ zm_real)
(princ "\n
Lancuch:
")
(prin1 zm_str)
;---------(princ)
;---------);progn
);C:FUNKCJA_6
;
;------------------------------------------------;*************************************************KONIEC

Po zaadowaniu pliku wybran funkcj wywoujemy z linii komend.


Z uwagi na zmian formatu pliku pomocy plik PROG_104.HLP nie pracuje
z AutoCAD 13.

24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb

592

Sposb postpowania we wszystkich funkcjach jest taki sam:


Pod zmienn lokaln lub globaln podstawiamy acuch z umown nazw
funkcji, z ktr nastpnie bdziemy wywoywa funkcj acad_helpdlg. Taka
sama nazwa musi rwnie wystpi w pliku pomocy. Np. dla funkcji
C:FUNKCJA_1 pod zmienn lokaln nazwa_funkcji podstawiamy acuch
"C:FUNKCJA_1".
Funkcj z grupy getxxx wywoujemy w ptli while tak dugo, dopki
uytkownik nie wprowadzi danej wymaganego typu i zakresu (w przypadku
funkcji z wartoci domyln wyjcie z ptli jest rwnie moliwe poprzez
podanie odpowiedzi pustej w odpowiedzi na funkcj getxxx).
W funkcji initget ustawiamy odpowiednie bity sterujce oraz sowa kluczowe.
Funkcja getstring nie akceptuje ani bitw sterujcych ani sw kluczowych.

Wywoujemy funkcj z grupy getxxx, podstawiajc jej warto zwrotn pod


zmienn lokaln.
W instrukcji warunkowej cond sprawdzamy typ i warto zmiennej lokalnej
zwrconej przez funkcj z grupy getxxx. W przypadku wpisania znakw "?",
"H" lub "h" wywietlane jest okno pomocy z opisem wybranej komendy, po
czym sterowanie wraca na pocztek ptli while.
Dodatkowego wyjanienia wymaga funkcja C:FUNKCJA_6. Poniewa wystpuje
w niej kilka funkcji z grupy getxxx, dla kadej z nich zmieniamy warto zmiennej
lokalnej oznaczajcej nazw funkcji w zbiorze pomocy. Zauwa, e cz gwna
zmiennej nie ulega zmianie (C:FUNKCJA_6 jestemy przecie cay czas w tej
samej funkcji), zmianie ulega tylko cz dotyczca konkretnej funkcji z grupy getxxx.
Oczywicie nic nie stoi na przeszkodzie, by przygotowa opis dla caej funkcji lub
wybranej grupy funkcji.

Rozdzia ten zapozna Ci ze sposobami pobierania informacji od uytkownika.


AutoLISP udostpnia w tym celu funkcje z grupy getxxx. Za pomoc tych funkcji
AutoLISP wczytuje punkty, odlegoci, acuchy, liczby i inne dane. Obowizkiem
programisty jest sprawdzenie, czy wprowadzone dane s okrelonego typu i zakresu.
Przedstawione programy zapoznay Ci rwnie z proponowaniem wartoci
domylnych oraz z wywoywaniem plikw pomocy wywietlajcych informacje
odnonie aktualnie uywanej funkcji lub komendy.
W nastpnym rozdziale omwimy tworzenie i operacje na zbiorach wyboru (wskaza).

593

BvupMJTQ!!qsbluzd{oz!lvst

You might also like