Professional Documents
Culture Documents
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
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])
(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.
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.
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
559
BvupMJTQ!!qsbluzd{oz!lvst
(FUNKCJA_3)
(CZEKAJ)
(FUNKCJA_4)
(CZEKAJ)
(graphscr)
(FUNKCJA_5)
(CZEKAJ)
(FUNKCJA_6)
(princ)
;*************************************************KONIEC
Nacisnij ENTER...
Wprowadziles: 2
Nacisnij ENTER...
Wprowadziles: 2
Nacisnij ENTER...
Wprowadziles: 5
Wprowadz dowolna liczbe calkowita [0 - koniec]: 0
Wprowadziles: test
Wprowadz dowolny lancuch alfanumeryczny ze spacjami: a b c
d
Nacisnij ENTER...
Nachylenie prostej: 45
Dlugosc prostej: 2
Command:
24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
55:
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
16
32
64
128
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
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
Nacisnij ENTER...
Pi/Dwa-pi/Liczba: pi
Wprowadzone liczby:
1.0 2.0 10.0
Command:
24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
568
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...
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
getpoint
nil
getcorner
nil
getdist
nil
getangle
nil
getorient
nil
getkword
nil
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
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
Nacisnij ENTER...
Command:
24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
576
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
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
of
24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
57:
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
24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
584
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:
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
24/!Qpcjfsbojf!jogpsnbdkj!pe!vzulpxojlb
592
593
BvupMJTQ!!qsbluzd{oz!lvst