Professional Documents
Culture Documents
lpoxfstkj
214
Operatory konwersji s to funkcje, suce do konwersji typw i jednostek (inaczej mwic, zamiany jednej wielkoci na drug). W swoich programach bdziesz ich bardzo
czsto uywa. Poniej, w porzdku alfabetycznym, zostan omwione standardowe
funkcje AutoLISPu przeznaczone do konwersji zmiennych rnych typw.
AutoLISP w razie potrzeby samoczynnie dokonuje jedynie konwersji liczb cakowitych na rzeczywiste, pozostae konwersje trzeba wymusza przez uycie odpowiednich operatorw.
)bohupg!tusjoh!\npef^*
*
)bohupg!
Funkcja wykonuje konwersj acucha string, reprezentujcego kt w formacie wywietlanym okrelonym przez argument mode, na warto zmiennoprzecinkow (typu real).
Funkcja zwraca wynik w radianach.
215
BvupMJTQ!!qsbluzd{oz!lvst
Warto argumentu mode
Format acucha
stopnie
stopnie/minuty/sekundy
grady
radiany
jednostki geodezyjne
Przykadowo:
(angtof
(angtof
(angtof
(angtof
(angtof
"180"
"180"
"180"
"180"
"180"
zwraca
zwraca
zwraca
zwraca
zwraca
0)
1)
2)
3)
4)
3.14159
3.14159
2.82743
4.07081
3.14159
)bohupt!bohmf!\npef!\qsfdjtjpo^^*
*
)bohupt!
Funkcja bierze kt angle (wyraony liczb rzeczywist typu real, okrelajc miar kta
w radianach) i zwraca go w postaci acucha alfanumerycznego o formacie zalenym
od argumentw mode, precision, od wartoci zmiennej systemowej UNITMODE AutoCADa oraz od wartoci zmiennej wymiarowania DIMZIN. Argumenty mode i precision
s liczbami typu integer, ktre okrelaj rodzaj jednostek i dokadno wartoci ktowych. Wartoci argumentu mode s takie same, jak w funkcji angtof. Argument precision jest liczb typu integer, ktra ustala wymagan dokadno wartoci ktowych,
okrelajc ilo miejsc dziesitnych po przecinku.
Przykadowo:
(angtos
(angtos
(angtos
(angtos
(angtos
3.14159
3.14159
3.14159
3.14159
3.14159
0
1
2
3
4
2)
2)
2)
2)
2)
zwraca
zwraca
zwraca
zwraca
zwraca
"180.00"
"180d0'"
"200.00g"
"3.14r"
"N 90d0' W"
)btdjj!
*
)btdjj!tusjoh*
jj!
Funkcja zwraca liczb typu integer, otrzyman w wyniku konwersji pierwszego znaku
w acuchu alfanumerycznym przekazanym w argumencie string na jego kod ASCII.
Przykadowo:
(ascii "A")
zwraca 65
8/!Pqfsbupsz!lpoxfstkj
(ascii "a")
(ascii "nowy")
216
zwraca 97
zwraca 110 kod litery "n"
Rnica pomidzy kodem litery maej a odpowiadajcym jej kodem litery duej
wynosi 32. Waciwo ta zostanie wykorzystana przy budowie funkcji do
obrbki tekstw.
!)bupg!tusjoh*
*
!)bupg!
Funkcja zwraca wynik konwersji acucha tekstowego przekazanego w argumencie
string na warto typu real (liczba rzeczywista).
Przykadowo:
(atof "1.25")
(atof "10")
zwraca 1.25
zwraca 10
Przykadowo:
(atof "a")
(atof "")
zwraca 0.0
zwraca 0.0
)bupj!tusjoh*
*
)bupj!
Funkcja zwraca wynik konwersji acucha tekstowego przekazanego w argumencie
string na liczb cakowit typu integer.
Przykadowo:
(atoi "1.25")
(atoi "10")
zwraca 1
zwraca 10
Przykadowo:
(atoi "a")
(atoi "")
zwraca 0
zwraca 0
217
BvupMJTQ!!qsbluzd{oz!lvst
)dis!ovncfs*
*
)dis!
Funkcja zwraca wynik konwersji liczby typu integer, reprezentujcej kod ASCII, na
odpowiadajcy temu kodowi znak, przedstawiony jako jednoznakowy acuch tekstowy
(warto typu string).
Przykadowo:
(chr 65)
(chr 66)
(chr 97)
zwraca "A"
zwraca "B"
zwraca "a"
)dwvoju!
*
)dwvoju!wbmvf!gspn!up*
voju!
Funkcja przelicza warto lub wsprzdne punktu, wyraone w miarach jednego
ukadu jednostek, na wartoci w innych jednostkach. Po udanym przeliczeniu, funkcja
zwraca wyznaczon w wyniku konwersji now warto lub nowe wsprzdne punktu.
Jeeli nazwa jednostki nie jest znana (nie zostaa znaleziona w pliku ACAD.UNT) lub
dwie podane jednostki dotycz miar rnych wielkoci (jak na przykad prba zamiany
cali na miesice), funkcja zwraca nil.
Argument value jest wyraony wartoci liczbow, przeznaczon do przeliczenia. Moe
on by rwnie list, zawierajc dwie lub trzy liczby do przeliczenia (punkt 2W lub
3W). Argument from okrela jednostki, w ktrych podana jest wielko, a argument to
okrela jednostki, na ktre wielko ma zosta przeliczona. Argumenty from i to mog
by nazwami dowolnych jednostek, zapisanymi w pliku ACAD.UNT.
Przykadowo:
(cvunit
(cvunit
(cvunit
(cvunit
(cvunit
(cvunit
1 "min" "sec")
1 "min" "s")
1 "min" "s")
1.0 "inch" "cm")
1.0 "cal" "cm")
1.0 "cal" "cm")
zwraca
zwraca
zwraca
zwraca
zwraca
zwraca
60.0
nil
60.0
2.54
nil
2.54
wersja angielska
wersja angielska
wersja polska
wersja angielska
wersja angielska
wersja polska
8/!Pqfsbupsz!lpoxfstkj
218
)ejtupg!tusjoh!\npef^*
*
)ejtupg!
Funkcja wykonuje konwersj acucha przekazanego w argumencie string, zawierajcego warto rzeczywist w formacie wywietlania okrelanym przez argument mode,
na warto typu real.
Argument mode okrela jednostki, w ktrych sformatowany jest acuch string.
Warto argumentu mode
Format acucha
Wykadniczy
Uamki dziesitne
Uamki zwyke
Przykadowo:
(distof "125E2")
(distof "1.25")
(distof "1 1/4")
zwraca 1.25
zwraca 1.25
zwraca 1.25
)gjy!
*
)gjy!ovncfs*
y!
Funkcja zwraca wynik konwersji argumentu number na liczb typu integer. Argument
number moe by typu real lub integer.
Przykadowo:
(fix 1.25)
(fix 10)
zwraca 1
zwraca 10
)gmpbu!ovncfs*
*
)gmpbu!
Funkcja zwraca wynik konwersji argumentu number na liczb typu real. Argument
number moe by typu real lub integer.
Przykadowo:
(float 2.55)
(float 20)
zwraca 2.55
zwraca 20.0
219
BvupMJTQ!!qsbluzd{oz!lvst
)jupb!jou*
)jupb! *
Funkcja zwraca wynik konwersji liczby typu integer przekazanej w argumencie int na
acuch cyfr (warto typu string).
Przykadowo:
zwraca "12"
zwraca "5"
(itoa 12)
(itoa 5)
)supt!ovncfs!\npef!\qsfdjtjpo^^*
*
)supt!
Funkcja zwraca acuch alfanumeryczny, ktry reprezentuje argument number (warto
typu real) w sposb zaleny od argumentw mode, precision, wartoci zmiennej
systemowej UNITMODE oraz zmiennej wymiarowania DIMZIN programu AutoCAD.
Argumenty mode i precision s typu integer i okrelaj system i dokadno zapisu
jednostek liniowych.
Warto argumentu mode
Sposb zapisu
Zapis wykadniczy
Uamki dziesitne
Przykadowo:
(rtos
(rtos
(rtos
(rtos
2.5
2.5
2.5
2.5
1
2
2
2
0)
0)
2)
4)
zwraca
zwraca
zwraca
zwraca
"2.5000E+00"
"2"
"2.50"
"2.5000"
8/!Pqfsbupsz!lpoxfstkj
21:
Qs{zlbe!2
W przykadzie tym, poprzez uycie funkcji ascii wymuszamy wprowadzenie tylko
maej litery alfabetu.
;*************************************************PROG_008
;Przyklad uzycia operatora konwersji ASCII.
;
;=================================================
(textpage) ;przejscie na ekran tekstowy
;
(princ "\nPrzyklad wykorzystania funkcji (ascii string).")
(setq jeszcze T)
(while jeszcze
(progn
(setq
litera (getstring "\nWprowadz mala litera alfabetu: ")
kod (ascii litera)
);setq
(if (and (>= kod 97)(<= kod 122))
(progn
(princ "\nWprowadziles litere ")
(princ litera)
(princ "\nKod ASCII dla tej litery = ")
(princ kod)
(setq jeszcze nil)
);progn
(progn ;else
(princ "\nNALEZY WPROWADZIC MALA LITERA ALFABETU !!!")
);progn
);if
);progn
);while jeszcze
221
BvupMJTQ!!qsbluzd{oz!lvst
;
;=================================================
;
(princ)
;
;*************************************************KONIEC
Wprowadziles litere a
Kod ASCII dla tej litery = 97
Command:
Qs{zlbe!3
W programie PROG_008 dokonana zostaa tzw. jawna konwersja kodw ASCII
poprzez uycie funkcji ascii zmienna litera zostaa zamieniona na odpowiadajcy jej
kod ASCII. Kod ten by porwnywany w instrukcji warunkowej if (linia programu
PROG_008).
8/!Pqfsbupsz!lpoxfstkj
222
Mona rwnie dokonywa tzw. niejawnego porwnywania kodw. W kodzie rdowym porwnujemy wtedy ze sob dwa dowolne stringi, np. (= "a" "a") (= "B" "Z") (=
"1" "?") (= "acad" "ACAD"), itp. Poniewa, jak ju wspomniaem wczeniej, wszystkie
znaki maj swoj reprezentacj kodow, w rzeczywistoci interpreter AutoLISPu i tak
dokonuje porwnania ich kodw ASCII.
Oto program, wykorzystujcy tzw. niejawne porwnywanie kodw ASCII:
;*************************************************PROG_009
;Przyklad niejawnego porownywania kodow ASCII.
;
;=================================================
(textpage) ;przejscie na ekran tekstowy
;
(princ "\nPrzyklad niejawnego porownywania kodow ASCII.")
(setq jeszcze T)
(while jeszcze
(progn
(setq
litera (getstring "\nWprowadz mala litera alfabetu: ")
);setq
(if (and (>= litera "a")(<= litera "z"))
(progn
(princ "\nWprowadziles litere ")
(princ litera)
(princ "\nKod ASCII dla tej litery = ")
(princ (ascii litera))
(setq jeszcze nil)
);progn
(progn ;else
(princ "\nNALEZY WPROWADZIC MALA LITERA ALFABETU !!!")
);progn
);if
);progn
);while jeszcze
;
;=================================================
;
(princ)
;
;*************************************************KONIEC
223
BvupMJTQ!!qsbluzd{oz!lvst
Aby wypisa kod ASCII pierwszego znaku dowolnego stringu, musimy uy
funkcji ascii w celu jego uzyskania.
Przykadowo:
(setq litera "a")
(princ litera)
(princ (ascii litera))
wypisuje "a"
wypisuje a
wypisuje 97
i zwraca "a"
i zwraca "a"
i zwraca 97
Qs{zlbe!4
Przykad ten pokazuje wykorzystanie funkcji rtos w celu uzyskania rnej postaci
wywietlania podanej liczby cakowitej lub rzeczywistej.
;*************************************************PROG_010
;Przyklad uzycia operatora konwersji RTOS - wersja 1.
;
;=================================================
(textpage) ;przejscie na ekran tekstowy
;
(princ
(strcat
"\nPrzyklad wykorzystania funkcji "
"(rtos number [mode [precision]])."
);strcat
);princ
(initget (+ 1 2))
(setq
liczba (getreal "\nPodaj liczbe rzeczywista rozna od zera: ")
);setq
(princ
(strcat
"\nPodana liczba: "
(rtos liczba)
"\nPostac wykladnicza: "
(rtos liczba 1)
"\nPostac dziesietna: "
(rtos liczba 2)
"\nPostac calowa (dziesietna): "
(rtos liczba 3)
"\nPostac calowa (ulamkowa): "
(rtos liczba 4)
"\nPostac ulamkowa: "
(rtos liczba 5)
"\n"
"\nPostac dziesietna z 1 miejscem po przecinku: "
(rtos liczba 2 1)
"\nPostac dziesietna z dwoma miejscami po przecinku: "
(rtos liczba 2 2)
"\nPostac dziesietna z czterema miejscami po przecinku : "
(rtos liczba 2 4)
);strcat
);princ
8/!Pqfsbupsz!lpoxfstkj
224
;
;=================================================
;
(princ)
;
;*************************************************KONIEC
Podana
Postac
Postac
Postac
Postac
Postac
liczba: 1.25
wykladnicza: 1.2500E+00
dziesietna: 1.2500
calowa (dziesietna): 1.2500"
calowa (ulamkowa): 1 1/4"
ulamkowa: 1 1/4"
Qs{zlbe!5
W przykadzie powyej, jeli podae np. liczba = 1.25, zapis w postaci wykadniczej
wyglda nastpujco:
225
BvupMJTQ!!qsbluzd{oz!lvst
Postac wykladnicza: 1.2500E+00
Zapis ten, na pozr dobry, posiada jedno mae ale. Ot, funkcja rtos dokonuje
konwersji podanej liczby na acuch alfanumeryczny. Dlaczego wic zapis w postaci
wykadniczej nie wyglda nastpujco?
Postac wykladnicza: "1.2500E+00"
Ot, do wypisania rnych postaci tej samej liczby, zastosowana zostaa nastpujca
konwencja:
(princ
(strcat
lancuch_1
lancuch_2
.........
lancuch_n
);strcat
);princ
zamienia si na:
(princ
(strcat
"\nPostac wykladnicza: "
"1.2500E+00"
);strcat
);princ
co daje z kolei:
(princ "\nPostac wykladnicza: 1.2500E+00")
Co wic zrobi, jeli chcemy, aby dana liczba zostaa wypisana jako acuch?
Zapis:
(princ "Postac wykladnicza: \"1.2500E+00\"")
moemy zastosowa tylko wwczas, gdy dana liczba jest nam z gry wiadoma.
Pomocna okae si tutaj standardowa funkcja AutoLISPu prin1.
Format funkcji prin1 jest nastpujcy:
8/!Pqfsbupsz!lpoxfstkj
226
Funkcja wypisuje argument expr na ekranie monitora i zwraca go jako wynik. Argument expr moe by dowolnego typu nie musi to by acuch alfanumeryczny.
W przypadku wystpowania opcjonalnego argumentu file-desc, jeeli jest to deskryptor
pliku otwartego do zapisu, argument expr jest zapisywany do pliku dokadnie w takiej
formie, w jakiej pojawiby si na ekranie monitora. Zapisywane jest tylko podane expr,
bez dodanych znakw spacji lub nowej linii.
Przykadowo, jeeli dokonane zostay przypisania:
(setq
a 1.25
b (rtos 1.25 2 2)
c "Taki sobie string"
);setq
wwczas:
(prin1 'a)
(prin1 a)
(prin1 b)
(prin1 c)
string"
wypisuje
wypisuje
wypisuje
wypisuje
A
i zwraca A
1.25
i zwraca 1.25
"1.25" i zwraca "1.25"
"Taki sobie string" i zwraca "Taki sobie
Wrmy jednak do naszego przykadu. Chcemy, aby nasza linia tekstu wygldaa
nastpujco:
Postac wykladnicza: "1.2500E+00"
wwczas otrzymamy:
"Postac wykladnicza: 1.2500E+00"
Jak wic widzimy, cae wyraenie nie moe by argumentem funkcji prin1. Musimy
tutaj poczy wynik zastosowania funkcji princ z wynikiem zastosowania funkcji
prin1.
227
BvupMJTQ!!qsbluzd{oz!lvst
Prawidowy zapis wyglda wic nastpujco:
(princ "\nPostac wykladnicza: ")
(prin1 (rtos liczba 1))
);setq
(princ
(strcat
"\nPodana liczba: "
(rtos liczba)
);strcat
);princ
(princ "\nPostac wykladnicza: ")
(prin1 (rtos liczba 1))
(princ "\nPostac dziesietna: ")
(prin1 (rtos liczba 2))
(princ "\nPostac calowa (dziesietna): ")
(prin1 (rtos liczba 3))
(princ "\nPostac calowa (ulamkowa): ")
(prin1 (rtos liczba 4))
(princ "\nPostac ulamkowa: ")
(prin1 (rtos liczba 5))
(princ "\n")
(princ "\nPostac dziesietna z 1 miejscem po przecinku: ")
(prin1 (rtos liczba 2 1))
(princ "\nPostac dziesietna z dwoma miejscami po przecinku: ")
8/!Pqfsbupsz!lpoxfstkj
228
Podana
Postac
Postac
Postac
Postac
Postac
liczba: 1.25
wykladnicza: "1.2500E+00"
dziesietna: "1.2500"
calowa (dziesietna): "1.2500""
calowa (ulamkowa): "1 1/4""
ulamkowa: "1 1/4""
Rozdzia ten zapozna Ci z operatorami konwersji AutoLISPu. Operatory te s pomocne wszdzie tam, gdzie trzeba zamieni jedn wielko (jednostk) na drug. Odpowiednie zastosowanie operatorw konwersji w poczeniu z funkcjami princ, prin1
oraz strcat pozwala na utworzenie dowolnie skomplikowanego acucha tekstu.
W nastpnym rozdziale omwimy ptle i konstrukcje sterujce.
229
BvupMJTQ!!qsbluzd{oz!lvst