Documente Academic
Documente Profesional
Documente Cultură
Visual LISP/AutoLISP
CAPITOLUL 1
Visual LISP/AutoLISP
Pictograme
Ferestre de
editare
a
programelo
Meniul
desfurtor
Fereastra
Visual
LISP
Fereastr
a
Fereastr
a
Build
Visual LISP/AutoLISP
Visual LISP/AutoLISP
CAPITOLUL 2
LIMBAJUL AUTOLISP
2.1 Aspecte generale privitoare la limbajul AutoLISP
AutoLISP-ul, ca parte integrant a mediului AutoCAD, este un limbaj de
programare de nivel nalt, conceput special pentru editorul AutoCAD-ului.
Utiliznd limbajul AutoLISP, se pot scrie macroprograme i funcii utilizate n
aplicaii grafice care ruleaz sub AutoCAD [1, 2, 3, 4, 5].
Pn la AutoCAD R14, pentru editarea programelor AutoLISP se utilizau
diverse editoare de texte, ncepnd cu AutoCAD2000, pentru editarea, testarea i
depanarea programelor se utilizeaz mediul Visual LISP (prezentat n capitolul 1
al acestei lucrri).
Acest capitol v familiarizeaz cu cunotinele necesare programrii n
AutoLISP, explic structura i sintaxa limbajului, prezint funciile predefinite
ale limbajului utilizate cu precdere n domeniul proiectrii mecanice
parametrizate, precum i relaia acestuia cu mediul AutoCAD. Exemplele
prezentate n acest capitol, pot fi tastate n zona prompter-ului Command: al
AutoCAD-ului sau n fereastra Visual LISP Console a mediului VLISP.
Aplicaiile mai mari se tasteaz n ferestrele de editare ale Visual LISP-ului, se
salveaz pe disc i apoi se ncarc n AutoCAD.
AutoLISP-ul este o extensie standard a AutoCAD-ului, fiind disponibil de
la primele versiuni de AutoCAD. Interpretorul de AutoLISP este ncrcat
automat la deschiderea oricrei sesiuni de lucru cu AutoCAD-ul. Este disponibil
numai n editorul de desenare al AutoCAD-ului. Interpretorul ateapt
introducerea pe prompter-ul Command: a unei expresii simbolice care apoi este
evaluat. Interpretorul AutoLISP nu face difereniere ntre expresiile scrise cu
caractere mici sau mari (cu excepia irurilor de caractere).
Sistemul de calcul utilizat trebuie s permit din punct de vedere hardware
instalarea i rularea AutoCAD-ului pentru a se putea utiliza AutoLISP-ul i n
mod implicit Visual LISP-ul.
2.2 Expresii simbolice
Expresiile simbolice sunt elementele de baz ale programelor scrise n
AutoLISP, ele fiind formate din obiecte AutoLISP (simboluri, liste, atomi,
funcii etc.) separate de cel puin un spaiu. O expresie simbolic este precizat
ntre paranteze rotunde (orice parantez deschis trebuie nchis) i are ca prim
Visual LISP/AutoLISP
10
obiect un nume de funcie AutoLISP. Acesta este motivul pentru care orice
expresie simbolic returneaz ntotdeauna o valoare.
Exemplu:
(+ 4 5) 9
AutoCAD
(+ 1 2)
3
AutoLISP
3
Fig. 2.1 Ilustrarea mecanismului de predare a controlului din
AutoCAD n AutoLISP.
Un alt caracter care pred din AutoCAD, din zona prompter-ului
Command:, controlul AutoLISP-ului este caracterul semn de exclamare (!),
denumit i bang. Acesta foreaz evaluarea unei expresii simbolice sau evaluarea
unui simbol.
A doua modalitate de predare a controlului, permite interogarea (aflarea
valorii atribuite) pe prompter-ul Command: a diverselor simboluri AutoLISP.
Exemple:
1. Pe lng alte simboluri predefinite, n AutoLISP exist predefinit i simbolul
pi n care este memorat valoarea numrului . Dac se tasteaz pe prompter-ul
Command: expresia:
Command: !pi
3.14159.
atunci se obine valoarea acestuia.
2. Dac simbolului a i-a fost atribuit valoarea 4.5 prin expresia (setq a 4.5)
Command: (setq a 4.5)
atunci avem:
Command: !a
4.5
11
12
Visual LISP/AutoLISP
13
14
Visual LISP/AutoLISP
15
(+ 2 3 4)9
(+ 2 1.0)3.0
(+ 3)3
(+)0
16
Visual LISP/AutoLISP
(- 10 3 4)3
(- 2 1.0)1.0
(- 2 ) -2
(-)0
Se observ c dac toate argumentele sunt ntregi, atunci rezultatul este un
ntreg, iar dac cel puin un argument este un real, atunci rezultatul este un real.
Dac funciei nu i se indic argumente, atunci este returnat valoarea 0.
Funcia de nmulire *
Sintax:
(* [ <nr1> ... <nrn> ])
Funcia returneaz produsul
argumente.
Exemple:
(* 10 3 2)60
(* 2 4.0)8.0
(* 2)2
Se observ c dac toate argumentele sunt ntregi, atunci rezultatul este un
ntreg, iar dac cel puin un argument este un real, atunci rezultatul este un real.
Dac funciei nu i se indic argumente, atunci este returnat valoarea 0.
Funcia de mprire /
Sintax:
(/ [ <nr1> ... <nrn> ])
17
(/ 1 2)0
(/ 1 2.0)0.5
(/ 2 2 4.0)0.25
(/ 4.0)4.0
(1+ 4)5
(1+ 100.0)101.0
Funcia 1Sintax:
(1- <nr>)
Funcia 1- returneaz valoarea argumentului decrementat cu o unitate.
Tipul rezultatului este identic cu al argumentului (ntreg sau real).
Exemple:
(1- 4)3
(1- 100.0)99.0
Funcia ABS
Sintax:
(ABS <nr>)
18
Visual LISP/AutoLISP
(abs 100)100
(abs -78.23)78.23
Funcia EXP
Sintax:
(EXP <nr>)
Exp returneaz valoarea expresiei e la puterea <nr>, unde e este baza
logaritmului natural (2.71828). Tipul rezultatului este real.
Exemple:
(exp 1)2.71828
(exp -0.4)0.67032
(exp (exp 1)) 15.1543 ;returneaz ee
Funcia LOG
Sintax:
(LOG <nr>)
Funcia log returneaz valoarea logaritmului natural din argumentul <nr>.
Rezultatul returnat este un numr real dac argumentul este pozitiv.
Exemple:
(log 1.22)0.198851
(log (exp 1))1.0
Funcia EXPT
Sintax:
(EXPT <nr1> <nr2>)
Funcia returneaz valoarea argumentului <nr1> la puterea <nr2>. Tipul
rezultatului returnat este real dac cel puin un argument este real, sau ntreg
dac ambele argumente sunt ntregi.
Exemple:
19
(expt 3 2)9
(expt 3.0 3)27.0
(expt (exp 1) pi)23.1407 ;returneaz epi
Funcia SQRT
Sintax:
(SQRT <nr> )
Sqrt returneaz valoarea radicalului din argumentul <nr>. Tipul
rezultatului returnat este ntotdeauna real. Argumentul trebuie s fie pozitiv.
Exemple:
(sqrt 9)3.0
(sqrt 2)1.41421
Funcia REM
Sintax:
(REM [ <nr1> ... <nrn> ])
Funcia rem returneaz restul mpririi lui <nr1> la <nr2> dac sunt
indicate dou argumente. Dac sunt date mai multe argumente, atunci se
efectueaz mprirea repetat fiind returnat restul ultimei mpriri. Tipul
rezultatului returnat este real dac cel puin un argument este real, sau ntreg
dac ambele argumente sunt ntregi. n situaia n care se indic un singur
argument, rem returneaz valoarea acestuia, iar dac nu sunt date argumente se
returneaz 0.
Exemple:
(rem 9 4)1
(rem 20 6.0)2.0
(rem 26 7 2)1
Funcia FIX
Sintax:
(FIX <nr>)
Funcia convertete argumentul real <nr> la un ntreg prin trunchiere.
Dac argumentul este ntreg, funcia returneaz valoarea acestuia.
20
Exemple:
Visual LISP/AutoLISP
(fix 9.4)9
(fix 20.6)20
(fix 10)10
Funcia FLOAT
Sintax:
(FLOAT <nr>)
Float convertete argumentul ntreg <nr> la un real. Dac argumentul
este real, funcia returneaz valoarea acestuia.
Exemple:
(float 9)9.0
(float 20)20.0
(float 2.3)2.3
Funcia MAX
Sintax:
(MAX [ <nr1> .... <nrn> ])
Funcia max returneaz argumentul cu valoarea cea mai mare din irul de
argumente. Dac cel puin un argument este real, atunci funcia returneaz o
valoare de tip real, n caz contrar returneaz un ntreg. n situaia n care se nu
sunt indicate argumente, funcia returneaz valoarea 0.
Exemple:
Funcia MIN
Sintax:
(MIN [ <nr1> .... <nrn> ])
Funcia min returneaz argumentul cu valoarea cea mai mic din irul de
argumente. Dac cel puin un argument este real, atunci funcia returneaz o
valoare de tip real, n caz contrar returneaz o valoare ntreag. n situaia n care
se nu sunt date argumente, funcia returneaz valoarea 0.
Exemple:
21
Funcia GCD
Sintax:
(GCD <intreg1> <intreg2>)
Funcia returneaz cel mai mare divizor comun al numerelor indicate ca
argumente, <intreg1>i <intreg2>. Argumentele trebuie s fie de tip ntreg, iar
rezultatul este tot un ntreg.
Exemple:
(gcd 81 57) 3
(gcd 12 28) 4
Visual LISP/AutoLISP
22
(cos (/ pi 2))0.0
(cos (/ pi 3))0.5
Funcia ATAN
Sintax:
(ATAN <nr1> [ <nr2> ])
Dac <nr2> nu este indicat ca argument, funcia returneaz valoarea
arctangentei de <nr1> n radiani. Argumentul <nr1> poate s fie negativ, iar
intervalul de valori al rezultatului este , .
2 2
Exemple:
(atan 0.5)0.463648
(atan 1.0)0.785398
(atan -1.0) -0.785398
Funcia QUOTE
Sintax:
(QUOTE <expr>)
Funcia returneaz argumentul <expr> neevaluat, nghend practic
mecanismul de evaluare a expresiilor simbolice coninute de argument. Se
utilizeaz de regul pentru formarea listelor cu valori iniiale cunoscute. Exist o
form abreviat a funciei i anume caracterului apostrof ( ).
Exemple:
23
(quote a) a
(quote (sin (/ pi 3))) (sin (/ pi 3))
(quote (a b c d)) (a b c d)
(quote (1 2 3)) (1 2 3)
Command:(sin (/ pi 3))
i AutoCAD-ul va furniza un mesaj de eroare, dar este corect astfel:
Command: (setq ex (sin (/ pi 3)))
iar dac se tasteaz:
Command:!ex (sin (/ pi 3)))
se observ c simbolul ex are atribuit valoarea neevaluat a argumentului.
Observaie: Ambele exemple de mai sus pot fi tastate n fereastra Visual LISP
Console fr a fi semnalate erori.
Funcia EVAL
Sintax:
(EVAL <expr>)
Returneaz rezultatul evalurii expresiei simbolice <expr>.
Exemple:
Dac se consider urmtoarele atribuiri:
(setq x AutoLisp)
(setq y x)
(setq b (sqrt 4.0))
atunci sunt valide urmtoarele expresii simbolice:
24
Visual LISP/AutoLISP
Funcia APPLY
Sintax:
(APPLY <funcie> <list>)
Apply aplic funcia <funcie> pe argumentele existente n <list> i
returneaz valoarea rezultat n urma evalurii.
Exemple:
(apply + (1 2 3)) 6
(apply strcat (Exemplu apply)) Exemplu apply.
Apply poate fi utilizat att pe funcii standard ct i pe cele definite de
programator.
Funcia TYPE
Sintax:
(TYPE <articol>)
Aceast funcie returneaz tipul argumentului <articol>. n AutoLISP
exist variantele de rezultat prezentate n tabelul 2.1.
Exemple:
Considerndu-se urmtoarele atribuiri:
(setq i
45
r
34.3
s
AUTOCAD
l
(1 2 3)
f
(open DATE.TXT w)
)
se obin, aplicnd TYPE pe fiecare simbol definit mai sus, urmtoarele rezultate:
(type i) SYM
(type i) INT
(type r) REAL
(type s) STR
(type l) LIST
(type f) FILE
(type getreal) SUBR
25
Tabelul 2.1
Rezultatul returnat
REAL
INT
STR
LIST
FILE
SYM
SUBR
USUBR
PICKSET
ENAME
EXRXSUBR
NIL
Explicaie
pentru un argument numeric de tip real
pentru un argument numeric de tip ntreg
pentru un argument de tip ir de caractere
pentru un argument de tip list
pentru un argument de tip descriptor de fiier
pentru un simbol AutoLISP
pentru o funcie standard a AutoLISP-ului sau
definit de programator i ncrcat din fiiere FAS
sau VLX sau definit de programator direct pe
prompter-ul Command:
pentru o funcie AutoLISP definit de programator
sau ncrcat din fiier surs LISP (LSP)
pentru un argument de tip mulime de selecie
pentru un argument de tip nume de entitate
pentru aplicaii externe ObjectARX
pentru un simbol evaluat prin nil (adic nu are
atribuit o valoare)
Funcia SET
Sintax:
(SET <simbol> <expr>)
Funcia set atribuie simbolului notat cu <simbol> valoarea prin care este
evaluat expresia <expr>. Spre deosebire de setq, funcia set accept ca prim
argument, chiar o expresie care returneaz un simbol.
Exemple:
Visual LISP/AutoLISP
26
(READ [ <ir> ])
Funcia read citete prima dat AutoLISP (atom, list, simbol etc) din
irul de caractere dat ca argument i o convertete n tipul de dat corespondent.
Dac irul conine spaii atunci se preia doar prima dat (sub irul de pn la
primul spaiu) din acesta. Listele pot s conin spaii.
Exemple:
(read "a")A
(read "b c d")B
(read "78")78
(read "7.5")7.5
(read "(a b c)") (A B C)
(read "Visual LISP) VISUAL
(set (read "a") 10) ;simbolul a va avea valoarea 10
(read "(+ (exp 3) (* pi 2))") (+ (exp 3) (* pi 2))
(eval (read "(+ (exp 3) (* pi 2))")) 26.3687
Funcia ATOMS-FAMILY
Sintax:
(ATOMS-FAMILY <format> [ <lista-simboluri> ])
Funcia atoms-family returneaz o list cu simbolurile curent definite n
AutoCAD. Argumentul <format> este un ntreg i precizeaz modul n care se
indic lista returnat astfel: pentru valoarea 0 returneaz o list cu numele
simbolurilor iar pentru valoarea 1 returneaz o list cu numele simbolurilor date
ca iruri de caractere. Argumentul opional <lista-simboluri>, reprezint o list
de iruri de caractere care reprezint simboluri ce vor fi cutate de atoms-family.
Pentru simbolurile ce nu sunt gsite, n lista rezultat, va fi returnat nil.
Exemple:
1. (atoms-family 0) (VL-CONSP LISPED *MERR* VL-ACAD-DEFUN
C:MVSETUP GRCLEAR _AUTOARXLOAD GETANGLE .......)
2. (atoms-family 1) ("VL-CONSP" "LISPED" "*MERR*" "VL-ACADDEFUN" "C:MVSETUP" "GRCLEAR" "_AUTOARXLOAD" .....)
3. (atoms-family 1 '("getint" "getdist" "getx" "gety"))("GETINT" "GETDIST"
nil nil)
Ultimul exemplu verific dac simbolurile: getint, getdist, getx i gety
sunt definite. Se observ c simbolurile getx i gety nu sunt definite deoarece n
list a fost returnat valoarea nil.
27
Coordonata
X
Coordonata
Y
Coordonata
Z
Coordonata
X=1.0
Coordonata
Y=2.0
Coordonata
Z=3.0
Visual LISP/AutoLISP
28
29
(-34 10 19)
Specify next point or [Undo]:
2. Exemplu pentru trasarea unui cerc prin dou puncte (P1 i P3) pe diametru:
Command: Circle
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 2p
Specify first end point of circle's diameter: !p1
(2 3)
Specify second end point of circle's diameter: !p3
(100 100)
3. Exemplu pentru trasarea unui arc de cerc prin trei puncte (P1, P2 i P3):
Command: Arc
ARC Specify start point of arc or [Center]: !p1
(2 3)
Specify second point of arc or [Center/End]: !p2
(6 12 -4)
Specify end point of arc: !p3
(100 100)
Funcia APPEND
Sintax:
(APPEND [ <1ista1>...<1istan> ])
Funcia returneaz lista format din toate elementele listelor indicate ca
argumente (adaug la elementele listei <lista1> elementele celorlalte liste date ca
argument). Append apelat fr argumente returneaz nil.
Exemple:
(setq a 10 b 20 c 30)
(setq p1 (list a b c)
p2 (list 40 50 60)
)
(append p1 p2)(10 20 30 40 50 60)
(append ( (x) (y)) ((u) (v))) ((x) (y) (u) (v))
Visual LISP/AutoLISP
30
Nodul rdcin
primul element al listei
Fig. 2.6 Nodul rdcin i primele dou ramuri ale unei liste oarecare.
(1.0 2.0 3.0)
1.0
(2.0 3.0)
Fig. 2.7 Nodul rdcin i primele dou ramuri ale listei (1.0 2.0 3.0) .
(1.0 2.0 3.0)
(2.0 3.0)
1.0
2.0
(3.0)
3.0
()
31
(x (y z) t)
x
((y z) t)
(t)
(y z)
(z
)
()
()
(car P1)x
(cdr P1)(y z)
Visual LISP/AutoLISP
32
33
Funcia LAST
Sintax:
(LAST <list>)
Funcia returneaz ultimul element al listei argument. Argumentul trebuie
s fie diferit de nil iar rezultatul poate fi atom sau list.
Exemple:
(last (a b c))c
(last (a b c (d e f)))(d e f)
Funcia LENGTH
Sintax:
(LENGTH <list>)
Aceast funcie returneaz un ntreg care indic numrul de elemente
coninute de argumentul <list>.
Exemple:
(length (a b c))3
(length (a b c (d e f)))4
(length ( ))0
Funcia MEMBER
Sintax:
(MEMBER <expr> <list >)
Member caut n argumentul <lista> elementul <expr>; dac l gsete
returneaz lista format din elementele plasate dup <expr> (inclusiv <expr>).
Dac <expr> nu apare n list atunci funcia returneaz nil.
Exemple:
Visual LISP/AutoLISP
34
(member c (a b c d e)) (c d e)
(member p (a b c d)) nil
Funcia NTH
Sintax:
(NTH <n> <list>)
Funcia nth returneaz elementul de pe poziia n (n+1 pentru utilizator)
din cadrul listei prezente n apelul funciei. Numerotarea elementelor se face de
la zero, iar dac <n> este mai mare dect poziia ultimului element al listei
argument, atunci funcia returneaz nil. Rezultatul obinut este de tip atom sau
list.
Exemple:
(nth 2 (a b c d))c
(nth 0 (a b c d ))a
(nth 4 (a b c d ))nil
Funcia REVERSE
Sintax:
(REVERSE <list>)
Reverse returneaz o list rezultat prin inversarea elementelor
argumentului <list>.
Exemple:
(reverse (a b c d))(d c b a)
(reverse ((a b) (c d )))((c d) (a b))
Funcia SUBST
Sintax:
(SUBST <e-nou> <e-vechi> <1ist>)
Funcia subst caut n list apariia elementului <e-vechi> i returneaz o
copie a listei argument cu toate apariiile lui <e-vechi> substituite cu <e-nou>.
Dac <e-vechi> nu este coninut de list, atunci subst returneaz lista iniial
neschimbat.
Exemple:
35
(subst 5 1 (1 3 5 1 1)) (5 3 5 5 5)
(subst b a (a b c d))(b b c d)
(subst a t (a b c d ))(a b c d)
Funcia MAPCAR
Sintax:
(MAPCAR <funcie> <list1> <list2>......<listn>)
Funcia returneaz o list ca rezultat al evalurii argumentelor <list1>,
<list2> ...... <listn> pe care se aplic funcia <funcie>. Numrul de argumente
de tip list depinde de natura funciei notat cu <funcie>.
Exemple:
Visual LISP/AutoLISP
36
37
Exemple:
1. (command line 20,20 30,30 @45<-10 c)
;traseaz un triunghi care are definite colurile ca i n AutoCAD
2. (setq p1 (1 4)
p2 (23 56)
raza 10)
;se definesc variabilele p1, p2 i raza
(command line p1 p2
circle 2p p1 p2
circle p2 raza) ;se traseaz o linie din p1 pn n p2
;un cerc prin 2 puncte p1 i p2
;un cerc cu centrul n p2 i de raz raza
3. (command line (1 2 3) (30 4 22) ) ;traseaz o linie n spaiu
4. (command line pause pause pause c)
;traseaz un triunghi, pentru fiecare col se solicit un punct n AutoCAD
(command circle pause 23)
;traseaz un cerc de centru dat n AutoCAD i de raz 23.
5. Pentru a obine modelul 3D din figura 2.11, se traseaz o polilinie plana
(cu punct de start 50,50 i de dimensiuni 100x50) cu coluri rotunjite (raz 10)
care apoi se extrudeaz cu tapper angle 0. n final se seteaz direcia de privire
1,1,1 i apoi se ascund liniile invizibile aferente modelului 3D generat.
(command "pline" "50,50" "@100,0" "@0,50" "@-100,0" "c" )
; traseaz polilinia
(command "fillet" "t" "t" "r" 10
;seteaz raza de racordare i
"fillet" "p" "l")
;racordeaz polilinia
(command "extrude" "l" "" 75 "") ;extrudeaz polilinia
(command "vpoint" "1,1,1")
;seteaz direcia de privire
(command "hide")
;ascunde liniile invizibile
38
Visual LISP/AutoLISP
39
40
Visual LISP/AutoLISP
41
Funcia GETPOINT
Sintax:
(GETPOINT [ <pb> ] [ <mesaj> ])
Aceast funcie permite citirea unui punct introdus printr-una din
metodele cunoscute n AutoCAD (de la tastar-coordonate absolute/relative
carteziene sau polare, punctare cu mouse-ul, moduri osnap, filtre) i returneaz
valoarea citit sub form de list. Punctul citit poate fi unul 2D sau 3D dar el va
fi ntotdeauna returnat ca punct 3D n UCS-ul curent. Mesajul este opional i
dac el exist atunci este afiat n zona prompter-ului Command: la citirea
punctului. Parametrul opional <pb> este un punct de baz reprezentat n UCSul curent ca punct 2D sau 3D. Dac este indicat se deseneaz o linie elastic
(rubber-band) din acest punct pn n punctul de intersecie al firelor reticulare
(cursorului grafic).
Visual LISP/AutoLISP
42
Exemple:
(setq p (getpoint))
(setq p1 (getpoint \nIntroducei punctul P1:))
(setq p2 (getpoint p1 \nIntroducei punctul P2:))
Funcia GETCORNER
Sintax:
(GETCORNER <pb> [ <mesaj> ])
Funcia getcorner, ca i getpoint, citete i returneaz un punct n UCS-ul
curent. ntotdeauna getcorner, care necesit un punct de baz ca argument,
genereaz un dreptunghi elastic cu primul col n <pb> i un al doilea col n
punctul de intersecie al firelor reticulare. Punctul de baz este exprimat conform
cu UCS-ul curent i dac el este indicat ca punct 3D, atunci coordonata Z este
ignorat fiind considerat egal cu elevaia curent.
Exemplu:
(setq p3 (getcorner p2 \nIntroducei punctul P3:))
Funcia GETDIST
Sintax:
(GETDIST [ <pb> ] [ <mesaj> ])
Funcia permite utilizatorului s introduc un numr real, un punct sau
dou puncte. Dac se indic dou puncte sau punct de baz la apelarea funciei i
un al doilea punct, atunci Getdist returneaz un numr real care este calculat ca
distan dintre puncte. Se poate specifica o distan introducnd un real n
formatul curent al unitilor, iar rezultatul returnat este unul de tip real chiar
dac realul a fost indicat de exemplu n inches.
Dac parametrii opionali <pb> (punctul de baz) i <mesaj> exist,
atunci utilizatorul va trebui s indice, la afiarea mesajului, fie un real, fie cel de
al doilea punct. ntre punctul de baz <pb> i intersecia firelor reticulare se
traseaz vector elastic (rubber-band).
Dac parametrul opional <pb> lipsete i se dorete definirea realului ca
distan ntre dou puncte, atunci mesajul este afiat la cererea primului punct,
pentru al doilea punct va fi generat automat mesajul Second point:.
Punctul de baz este exprimat n UCS-ul curent i dac el este indicat ca
punct 3D, atunci distana este calculat ca distan 3D. Dar, dac anterior a fost
apelat funcia initget cu bitul 64 setat, atunci getdist va ignora coordonata Z la
calculul distanei, obinndu-se n acest caz distana 2D.
43
Exemple:
(setq d (getdist))
(setq d1 (getdist p2 \nIntroducei raza cercului:))
(setq d2 (getdist p2))
(setq d3 (getdist \nIntroducei raza cercului:))
Funcia GETANGLE
Sintax:
(GETANGLE [ <pb> ] [ <mesaj> ])
Funcia permite citirea (introducerea) unui unghi de la tastatur sau dat cu
ajutorul mouse-ului i returneaz valoarea citit. Unghiul introdus de la tastatur
va fi indicat n formatul curent de reprezentare a unghiurilor, iar unghiul returnat
este exprimat n radiani respectnd planul de construcie curent (planul XOY al
UCS-ului curent). Aceast funcie returneaz ntotdeauna unghiul n radiani
chiar dac n AutoCAD unitile curente pentru unghiuri nu sunt radiani.
Getangle ine cont de direcia curent a unghiului de zero i sensul pozitiv curent
de msurare a unghiurilor.
Argumentul <mesaj> este un ir de caractere opional care este afiat la
preluarea unghiului, iar <pb> este un punct de baz reprezentat ca punct 2D n
UCS-ul curent. Dac punctul de baz lipsete atunci se pot preciza dou puncte,
trasndu-se linie elastic ntre puncte.
Exemple:
(setq unghi1 (getangle))
(setq unghi2 (getangle \nIntroduceti unghiul 2:))
(setq p1 (getpoint \nIntroduceti punctul P1:))
(setq unghi3 (getangle p1 \nIntroduceti unghiul 3:))
Funcia GETORIENT
Sintax:
(GETORIENT [ <pb> ] [ <mesaj> ])
Funcia getorient lucreaz ca i getangle, dar nu ine cont de direcia
curent a unghiului de zero, unghiul va rezulta prin calculul relativ la direcia
unghiului de 0 standard (ora 3 sau Est) i sensul trigonometric de msurare a
unghiului.
Funcia GETVAR
Sintax:
(GETVAR <nume_variabil>)
Visual LISP/AutoLISP
44
Funcia INITGET
Sintax:
(INITGET [ <mod> ] [ <cuvinte_cheie> ])
Aceast funcie stabilete diverse opiuni pentru funciile getxxx
(exceptnd funciile getstring i getvar) limitnd valorile introduse de utilizator.
Initget returneaz ntotdeauna nil i este valabil numai pentru urmtoarea
funcie din categoria getxxx. Argumentul opional <mod> poate s aib
urmtoarele valori ntregi:
1 = nu permite introducerea nul (enter), fornd introducerea unei
valori valide;
45
64
GETINT
GETREAL
;
GETDIST
GETANGLE
GETORIENT
GETPOINT
GETCORNER
GETKWORD
GETSTRING
GETVAR
Argumentul opional <cuvinte_cheie> este reprezentat sub forma unui ir
de caractere n care cuvintele cheie sunt separate de spaii. Forma general este:
46
Visual LISP/AutoLISP
Funcia GETKWORD
Sintax:
(GETKWORD [ <mesaj> ])
Funcia getkword este utilizat pentru introducerea de la tastatur a unui
cuvnt cheie i returneaz cuvntul citit sub forma unui ir de caractere.
Rspunsul nul, rezultat n urma apsrii doar a tastei enter, are ca efect
returnarea atomului nil. Tot nil este returnat i n cazul n care nu este stabilit
lista de cuvinte cheie prin apelul funciei initget.
Dac nu se introduce un cuvnt cheie valid, funcia afieaz mesajul Invalid
option keyword.
Exemple:
1. (initget 1 DA,D NU,N)
;seteaz cuvintele cheie Da i Nu fr a permite apsarea numai a tastei
Enter
(setq optiune (getkword \nContinuai? Da/Nu:))
;citete unul din cuvintele cheie stabilite anterior
2. (initget 1 LType LAyer eXit)
47
Visual LISP/AutoLISP
48
; se traseaz polilinia
(command "fillet" "t" "t" "r" r
"fillet" "p" "l")
;se seteaz raza de racordare i apoi se racordeaz polilinia
(command "extrude" "l" "" lz u)
; se extrudeaz polilinia
(command "vpoint" "1,1,1")
;se seteaz convenabil direcia de privire
(command "hide")
;se ascund liniile invizibile
2.9 Funcii de calcul geometric
49
Toate punctele sunt exprimate relativ la UCS-ul curent. Dac ele sunt
puncte 3D atunci se returneaz intersecia 3D iar dac un punct este 2D atunci
liniile sunt proiectate n planul curent de lucru i se va returna intersecia 2D.
Parametrul opional <ind> dac exist i este nil atunci liniile definite de
cele 4 puncte sunt considerate de lungime infinit (drepte).
Exemple:
(setq p1 (1.0 1.0) p2 (9.0 9.0))
(setq p3 (4.0 1.0) p4 (4.0 2.0))
(inters p1 p2 p3 p4) nil
(inters p1 p2 p3 p4 nil) (4.0 4.0)
Funcia OSNAP
Sintax:
(OSNAP <pct> <mod>)
Funcia osnap returneaz un punct 3D n urma aplicrii modurilor osnap,
indicate n argumentul <mod> sub forma unui ir de caractere, pe o entitate care
trece prin punctul <pct>.
n argumentul <mod> se indic ntre ghilimele, eventual separate de
virgul unul sau mai multe moduri OSNAP. Dac punctul <pct> nu este plasat
pe o entitate atunci funcia osnap returneaz nil.
Exemple:
(setq p1 (getpoint \nIntroduceti un punct de pe o entitate:))
(setq p2 (osnap p1 mid))
(setq p4 (osnap p1 mid, end, centre))
Funcia POLAR
Sintax:
(POLAR <pct> <unghi> <distanta>)
Polar returneaz un punct dispus la un anumit <unghi> i <distan> fa
de punctul <pct>. Unghiul este dat n radiani i este msurat n sens
trigonometric fa de axa OX a UCS-ului curent. Chiar dac <pct> este un punct
3D, ntotdeauna este respectat planul de construcie curent.
Exemplu:
Visual LISP/AutoLISP
50
Funcia ANGLE
Sintax:
(ANGLE <pct1> <pct2>)
Angle returneaz unghiul format de linia determinat de punctele <pct1> i
<pct2> din planul de construcie cu axa OX a UCS-ului curent. Unghiul este
returnat n radiani i este msurat n sens trigonometric. Dac punctele sunt
reprezentate cu 3 coordonate, atunci acestea sunt proiectate n planul XOY al
UCS-ului curent.
Exemple:
(angle (1.0 1.0) (1.0 4.0)) 1.5708
(angle (6.0 2.3) (2.0 2.3)) 3.14159
Dup cum se poate observa, sintaxa lui defun este puin diferit de a
celorlalte funcii prezentate pn acum. Funcia are dou argumente obligatorii
51
n care pa1 ... pan sunt parametri actuali. Legtura dintre parametrii actuali i cei
formali se realizeaz prin locul ocupat de acetia n cele dou liste. Parametrii de
pe acelai loc trebuie s fie de acelai tip, n caz contrar se afieaz un mesaj de
eroare. Numrul de parametri formali trebuie s fie egal cu numrul de parametri
actuali, n caz contrar la apelarea funciei se afieaz un mesaj de eroare.
Dup apelarea unei funcii, va fi returnat valoarea ultimei expresii
evaluate n corpul funciei.
Observaie: Funciile noi definite n versiunile de AutoLISP pentru
AutoCAD2000 sau 2002, sunt memorate ca i subrutine (subprograme) definite
de utilizator (USUBR sau SUBR). n versiunile anterioare de AutoLISP,
funciile definite de programator sunt memorate sub forma unor liste. Din
motive de compatibilitate ntre diversele versiuni de AutoCAD, au fost definite
n AutoCAD2000/2002, noile funcii AutoLISP:
defun-q pentru definirea funciei i memorarea acesteia sub forma unei
liste (are aceeai sintax ca i defun);
defun-q-lis-ref pentru afiarea structurii funciei definite.
Exemple:
52
Visual LISP/AutoLISP
(setq val (s1 23.0 5)) sau (setq val (s1 t v))
2. S se calculeze aceeai relaie, dar utiliznd o funcie cu un parametru
formal i unul local.
(defun s2 (x / y)
(setq y (getreal \nIntroduceti y:))
(/ (* (+ x y) (- x y)) (* x y))
)
Funcia se apeleaz astfel:
(s2 20) sau (s2 t);
(setq val (s2 20)) sau (setq val (s2 t))
3. S se defineasc o funcie AutoLISP care s traseze un cerc, dup ce n
prealabil utilizatorul a introdus centrul i raza cercului.
53
Exemple:
1. S se defineasc o nou comand AutoCAD care s permit trasarea
unui triunghi oarecare, solicitndu-se utilizatorului cele trei puncte care
materializeaz vrfurile acestuia.
(defun C:triunghi (/ p1 p2 p3)
(initget 1)
(setq p1 (getpoint \n Introduceti p1:))
(initget 1)
(setq p2 (getpoint p1 \n Introduceti p2:))
(initget 1)
(setq p3 (getpoint p2 \n Introduceti p3:))
(command line p1 p2 p3 c)
(prin1)
)
Funcia se apeleaz ca orice comand standard a AutoCAD-ului, prin
tastarea numelui triunghi n zona prompter-ului Command: .
2. S se defineasc o nou comand AutoCAD care s permit generarea
modelului 3D din figura 2.12 parametrizat cu simboluri variabile. Semnificaia
simbolurilor este aceeai ca i n exemplul de la subcapitolul 2.7. Noua comand
AutoCAD trebuie s aib ecoul inhibat (nu sunt afiate pe ecran comenzile
AutoCAD apelate din program) i trebuie s funcioneze corect, atunci cnd sunt
moduri OSNAP curent setate.
54
Visual LISP/AutoLISP
55
Visual LISP/AutoLISP
56
Tabelul 2.3
Mesaje de eroare
LOAD failed Nume-fiier
extra right paren on input
malformed string on input
malformed list on input
Explicaie
Numele invocat de funcia load nu
poate fi gsit, sau utilizatorul nu are
acces pentru citirea fiierului.
Au fost ntlnite prea multe paranteze
dreapta (nchise)
Mesajul se datoreaz nenchiderii
unor ghilimele.
S-a citit o list incomplet. De obicei
cauza
este
nenchiderea
unor
paranteze.
57
58
Exemple:
Visual LISP/AutoLISP
(= 1 1.0)T
(= 8 6.23) nil
(= 1.2 1.2 1.2 1.2)T
(= 3.22 3.21 3.22) nil
(= AutoLISP AutoCAD) nil
(= Auto Auto)T
(= auto Auto) nil
(= 10) T
Funcia /=
Sintax:
(/= <atom1> [ <atom2> ..... <atomn> ])
Aceasta este funcia relaional de neegalitate (diferit). Returneaz T dac
nu exist dou argumente succesive, de tip atom, valoric diferite, sau nil n cazul
n care cel puin dou argumente succesive sunt egale. i aceast funcie se
utilizeaz pentru atomii numerici i iruri de caractere. Dac funcia are un
singur argument se returneaz T.
Exemple:
(/= 1 1.0)nil
(/= 8 6.23)T
(/= 1.2 1.2 1.2 1.2)nil
(/= 1.2 10 1.2 20)T
(/= 12 10 12 12)nil
(/= 3.22 3.21 3.22)T
(/= AutoLISP AutoCAD)T
(/= Auto Auto)nil
(/= a A) T
(/= 10) T
Funcia <
Sintax:
(< <atom1> [ <atom2> ..... <atomn> ])
Funcia relaional < returneaz T dac toate argumentele (de tip atom)
respect valoric relaia cerut (ir strict cresctor), sau nil n caz contrar. n
cazul existenei mai multor argumente se compar atomul curent cu cel din
dreapta sa. Aceast funcie se utilizeaz pentru atomii numerici i iruri de
caractere. Dac funcia are un singur argument atunci este returnat T.
Exemple:
59
(< 10 12.0)T
(< 8 6.23 89)nil
(< 1.2 2.2 5.2 12)T
(< A D)T
(< AutoLISP) T
Funcia <=
Sintax:
(<= <atom1> [ <atom2> ..... <atomn> ])
Funcia relaional <= returneaz T dac toate argumentele (de tip
atom) respect valoric relaia cerut (ir cresctor), sau nil n caz contrar. n
cazul existenei mai multor argumente, se compar atomul curent cu cel din
dreapta sa. Dac funcia are un singur argument atunci se returneaz T.
Exemple:
(<= 10 12.0)T
(<= 8 23.23 89)T
(<= 1.2 2.2 -1.2 12)nil
(<= A A)T
(<= 12)T
Funcia >
Sintax:
(> <atom1> [ <atom2> ..... <atomn> ])
Funcia relaional > returneaz T dac toate argumentele respect
valoric relaia cerut (ir strict descresctor), sau nil n caz contrar. n cazul
existenei mai multor argumente, se compar atomul curent cu cel din dreapta sa.
i aceast funcie se utilizeaz pentru atomii numerici i iruri de caractere. Dac
funcia are un singur argument atunci se returneaz T.
Exemple:
(> 10 12.0)nil
(> 8 6.23 1.89)T
(> 1.2 2.2 5.2 12)nil
(> h a)T
(> ha)T
Funcia >=
60
Visual LISP/AutoLISP
Sintax:
(>= <atom1> [ <atom2> ..... <atomn> ])
Funcia relaional >= returneaz T dac toate argumentele (de tip
atom) respect valoric relaia cerut (ir descresctor), sau nil n caz contrar. n
cazul existenei mai multor argumente se compar atomul curent cu cel din
dreapta sa.
Dac funcia are un singur argument atunci se returneaz T i poate fi utilizat
pentru argumente de tip numeric/ir de caractere.
Exemple:
(>= 10 10.0)T
(>= 8 23.23 89)nil
(>= 1.2 1.2 1.2 1.2)T
(>= A A)T
(>= -5)T
Funcia EQ
Sintax:
(EQ <expr1> <expr2>)
Aceast funcie determin dac <expr1> i <expr2> sunt identice, adic la
momentul curent cele dou argumente au atribuite acelai obiect (de exemplu cu
ajutorul funciei setq). Eq returneaz T dac cele dou expresii sunt identice, sau
nil n caz contrar. Este tipic utilizat pentru a determina dac dou liste sunt
identice.
Exemple:
S considerm urmtoarele atribuiri:
(setq l1 (a b c))
(setq l2 (a b c))
(setq l3 l2)
dac utilizm funcia eq pe perechi de liste avem:
(eq l1 l3)nil ;deoarece l1 i l3 nu sunt perfect identice (au fost
obinute prin metode diferite)
(eq l3 l2)T ;deoarece argumentele l3 i l2 refer aceeai list
;s-a utilizat funcia setq la obinerea lui l3 din l2
Funcia EQUAL
Sintax:
(EQUAL <expr1> <expr2> [ <eroare> ])
61
Funcia equal determin dac <expr1> i <expr2> sunt egale, adic dac
cele dou argumente sunt evaluate la aceeai valoare n marja de eroare dat de
argumentul opional <eroare>. Equal returneaz T dac cele dou expresii sunt
egale, sau nil n caz contrar.
Exemple:
Dac considerm urmtoarele atribuiri:
(setq l1 (a b c))
(setq l2 (a b c))
(setq l3 l2)
utiliznd funcia equal pe liste avem:
(equal l1 l3)T ;deoarece l1 i l3 sunt evaluate la acelai obiect
(equal l3 l2)T ;deoarece l2 i l3 sunt exact aceleai liste
Dac se compar de exemplu dou numere reale (sau dou liste de numere
reale, ca n cazul punctelor AutoCAD), care ar trebui s fie identice dar ele
difer foarte puin, datorit faptului c au fost obinute prin metode diferite,
poate fi utilizat funcia equal deoarece permite, conform sintaxei generale,
verificarea egalitii ntr-o marj de eroare stabilit de programator.
Exemple:
Dac avem urmtoarele atribuiri:
(setq x 2.222222
y 2.222223)
n cazul utilizrii funciei equal se obine:
(equal y x)nil
(equal y x 0.0000011)T
(equal y x 0.000001)nil
Observaie: Este foarte important de neles diferenele dintre funciile equal, eq
i funcia =, prezentate n acest subcapitol.
Funcia ATOM
Sintax:
(ATOM <articol>)
Aceast funcie returneaz nil dac <articol> este o list i T n caz
contrar. Argumentul funciei poate fi orice obiect AutoLISP. Funcia se bazeaz
pe faptul c tot ce nu este list este considerat atom.
Exemple:
62
Visual LISP/AutoLISP
Pentru atribuirile:
(setq lista (a b c)
l1 lista)
se obine:
(atom lista)T ;deoarece lista este considerat ca fiind simbol
(atom lista)nil
;deoarece l1 memoreaz simbolul lista
(atom l1)T
(atom l1)T
(atom (a b c))nil
(atom getpoint) T
(atom nil) T
(atom ()) T
Ultimele dou exemple, demonstreaz faptul c simbolul nil poate fi att
atom ct i list.
Funcia LISTP
Sintax:
(LISTP <articol>)
Funcia listp returneaz T dac <articol> este o list sau nil n caz contrar.
Argumentul funciei poate fi o list, un atom sau o expresie.
Exemple:
(listp (1 2 3 4 5))T
(listp 1.23)nil
;deoarece x este simbol
(listp x)nil
(listp nil)T
;deoarece nil este att atom ct i list
(listp initget) nil
(listp (setq a '(1 1))) T
;deoarece expresia simbolic argument este caz particular de list
Funcia BOUNDP
Sintax:
(BOUNDP <simbol>)
Funcia returneaz T dac <simbol> are o valoare atribuit. Dac nici o
valoare nu este atribuit argumentului, sau i este atribuit atomul nil, atunci
funcia returneaz nil.
Exemple:
(setq x 2 y nil)
(boundp x)T
63
(boundp y)nil
Funcia NULL
Sintax:
(NULL <articol>)
Funcia null returneaz T dac <articol> este legat la nil, iar n caz
contrar returneaz nil. Argumentul notat cu <articol> este un simbol sau o
expresie AutoLISP.
Exemple:
Pentru atribuirile:
(setq x 243
s AutoLISP
y nil)
n urma aplicrii funciei null se poate scrie:
(null y)T
(null x)nil
(null s)nil
(null ())T
(null 20) nil
Funcia MINUSP
Sintax:
(MINUSP <nr>)
Aceast funcie returneaz T dac <nr> este un real sau ntreg evaluat la o
valoare negativ, n caz contrar returneaz nil.
Exemple:
(minusp -1.1)T
(minusp 1110.1)nil
(minusp -45.671)T
Funcia NUMBERP
Sintax:
(NUMBERP <articol>)
Visual LISP/AutoLISP
64
Funcia returneaz T dac <articol> este un real sau un ntreg, iar n caz
contrar nil. Argumentul notat cu <articol> este un simbol sau o expresie.
Exemple:
Pentru atribuirile:
(setq x 243
s AutoLISP
y x)
se obin urmtoarele rezultate:
(numberp 23)T
(numberp 57.35)T
(numberp x)T
(numberp y)nil
(numberp s)nil
(numberp (eval y))T
Funcia ZEROP
Sintax:
(ZEROP <nr>)
Zerop returneaz T dac <nr> este un real sau un ntreg evaluat la
valoarea zero, iar n caz contrar nil. Funcia nu este definit pentru alte tipuri de
date.
Exemple:
(zerop 0)T
(zerop 0.04)nil
(zerop 100)nil
(zerop 0.0)T
65
Funcia not returneaz T dac expresia <expr> este evaluat prin nil, iar
n caz contrar nil. Funcia este utilizat de regul pentru tipuri de date diferite de
liste.
Exemple:
(setq a 1212
b LISP
c nil)
(not a)nil
(not b)nil
(not (= a b)) T
(not c)T
(not ())T
Funcia AND
Sintax:
(AND [ <expr1> <expr2> .... <exprn> ] )
Aceast funcie returneaz rezultatul aplicrii operatorului I logic
expresiilor notate cu <expr>. Cu alte cuvinte, se evalueaz argumentele de la
stnga la dreapta, iar dac exist cel puin un argument evaluat prin valoarea
nil, rezultatul este nil; n caz contrar rezultatul este T. Funcia apelat fr
argument returneaz valoarea T.
Exemple:
Pentru atribuirile:
(setq a 1.0
b nil
c ABC)
avem:
(and 2 a c)T
(and 2 a b c)nil
(and)T
Funcia OR
Sintax:
(OR [ <expr1> <expr2> .... <exprn> ])
Funcia or returneaz rezultatul aplicrii operatorului SAU logic
expresiilor notate cu <expr>. Se evalueaz argumentele de la stnga la dreapta,
Visual LISP/AutoLISP
66
iar dac exist cel puin un argument evaluat printr-o valoare diferit de nil,
rezultatul este T; dac toate argumentele sunt nil returneaz nil. Funcia apelat
fr argumente returneaz valoarea nil.
Exemple:
Pentru atribuirile:
(setq a 1.0
b nil
c ABC)
avem:
cond.
2.11.3 Funcia condiional if
Funcia IF
Sintax:
(IF <expr-test> <expr-then> [ <expr-else> ])
67
(setq b 3)
(if (and (/= a 0) (numberp b)) (setq z 0) (setq x 20))0
Se solicit valorile lui z i x (!z !x n AutoCAD).
3.
(setq b nil)
( if b (setq b 10) (setq b 0))0
Se solicit valoarea lui b (!b n AutoCAD).
Funcia PROGN
Sintax:
(PROGN [ <expr1> <expr2> .... <exprn> ])
Funcia progn evalueaz secvenial expresiile <expr> i returneaz
valoarea ultimei expresii evaluate. Rolul principal al funciei const n faptul c
grupeaz expresiile care urmeaz a fi evaluate (este funcia echivalent
instruciunii compuse din alte limbaje de programare). Se utilizeaz cu precdere
n funcia if.
Exemple:
1.
(setq a 34 b 56)
(if (/= a b) (progn
Visual LISP/AutoLISP
68
(setq a 10)
(setq b 20)
)
(progn
(setq a (+ a 10))
(setq b (+ b 20))
)
)20
Se solicit apoi valorile lui a i b (!a !b n AutoCAD).
2.
(setq a 3)
(if (>= a 0) (progn
(setq y 12)
(setq z 0)
)
(setq x 20)
)0
Se solicit apoi valorile lui y, z i x (!y !z !x n AutoCAD).
2.11.4 Funcia condiional cond
Funcia COND
Sintax:
(COND
[ ( <expr-test_1> <expr11> <expr12>.... )
( <expr-test_2> <expr21> <expr22>.... )
......................
( <expr-test_n> <exprn1> <exprn2>.... )
[ (T <exprn+1 1> <exprn+1 2>.... )] ]
)
Funcia cond are un numr oarecare de argumente opionale. Dup cum se
observ, fiecare argument al funciei conine mai multe expresii simbolice,
prima dintre ele <expr-test_i> fiind expresia test.
Cond evalueaz pe rnd expresiile logice <expr-test_i> i cnd ntlnete
una diferit de nil, se evalueaz expresiile <expri1>, <expri2>.... care urmeaz
expresiei test respective, urmnd a se relua programul cu urmtoarea expresie
simbolic de dup cond. Dac toate expresiile <expr-test_i> evaluate sunt nil i
exist ramura de else, este parcurs aceasta (expresiile simbolice <exprn+1 1>,
<exprn+1 2>....) deoarece expresia test aferent are ntotdeauna valoarea T.
Aceast funcie returneaz valoarea ultimei expresii evaluate. Dac funcia nu
are argumente este returnat valoarea nil.
69
Exemple:
1. Funcia urmtoare testeaz dac argumentul este mai mare, mai mic sau egal
cu zero i afieaz mesajul corespunztor.
(defun test (x)
(cond
((> x 0) (princ \nValoare pozitiva))
((< x 0) (princ \nValoare negativa))
(T (princ \nValoare egal cu zero))
)
(prin1)
)
Funcia definit se apeleaz n diverse ipostaze: (test y) dac anterior s-a
tastat (setq y 100), (test -5) i (test 0).
2. Funcia urmtoare permite utilizatorului s aleag o suprafa de revoluie
(cilindric, frontal sau conic), afieaz suprafaa aleas i returneaz cuvntul
cheie aferent acesteia. Suprafaa cilindric este cea implicit.
(defun tip-supr (/ supr)
(initget CIlindrica Frontala COnica)
(setq supr (Getkword \n Tipul suprafeei [CIlindrica/Frontala/COnica]
<Cilindrica>:))
(cond
((= supr CIlindrica) (princ \nSuprafaa selectata este Cilindrica\n))
((= supr Frontala) (princ\nSuprafaa selectata este Frontala\n))
((= supr COnic) (princ \nSuprafaa selectata este Conica\n))
(T(setq supr CIlindrica)(princ \nSuprafaa aleasa este Cilindrica\n))
)
;returneaz cuvntul cheie ales (suprafaa aleas)
supr
)
Se apeleaz prin expresia simbolic (tip-supr).
Visual LISP/AutoLISP
70
Exemple:
1. Se atribuie variabilelor a i b valorile iniiale 1 i respectiv 10. Aceste
variabile se incrementeaz de 10 ori, cu ajutorul unui repeat, cu 1 respectiv 10.
Dup fiecare incrementare, se afieaz valorile asociate variabilelor.
(setq a 1
b 10)
(repeat 10
71
(setq a (1+ a)
b (+ 10 b)
)
(princ\na=)
(princ a)
(princ\nb=)
(princ b)
)
Dup parcurgerea de 10 ori a corpului funciei repeat, a are valoarea 11
iar b 110.
2. Calculul factorialului unui numr natural cu ajutorul funciei repeat.
Visual LISP/AutoLISP
72
Exemple:
1. n timp ce variabila a este diferit de nil (deci T) i este mai mare dect 0, se
micoreaz valoarea lui a i apoi se afieaz aceast valoare dac este diferit de
nil. Se iese din while atunci cnd a devine egal cu nil. Valoarea iniial a
variabilei a este 20.
(setq a 20)
(while a
(if (> a 0) (setq a (1- a)) (setq a nil))
(if a (princ a))
)
2. Calculul factorialului unui numr natural cu ajutorul funciei while (fr
parametru formal).
73
Visual LISP/AutoLISP
74
Exemple:
1.
(setq a AutoLISP
b AutoCAD
c (strcat b si a)
)
(foreach s (list a b c) (print s)) AutoCAD i AutoLISP
Ultima expresie simbolic va atribui pe rnd simbolului s valorile
coninute de lista (a b c) cu a, b i c evaluate i le va afia pe ecran.
2.
75
Visual LISP/AutoLISP
76
Moduri
RTOS
Format
Exemplu
tiinific (Scientific)
5.56600E+01
Zecimal (Decimal)
23.454
Ingineresc (Engineering)
1 -5.50
Arhitectural (Architectural)
1 -5 1/2
Fracional (Fractional)
12 2/3
77
Observaii:
1. Dac primele caractere ale irului sunt de tip numeric, dar irul conine i alte
caractere diferite de cele numerice, atunci atof va converti la un real doar
primele caractere. Iar dac primul caracter este unul alfabetic atunci funcia
returneaz valoarea 0.0.
2. Funcia nu poate fi folosit (n mod direct) la evaluarea unor expresii test
pentru c 0.0 este echivalent cu T. Pentru acestea este indicat a se utiliza funcia
distof.
Funcia DISTOF
Sintax:
(DISTOF <ir> [ <format> ])
Ca i atof funcia distof permite convertirea unui ir de caractere la un
real, dar cu precizarea formatului din care se convertete irul. Argumentul
opional <format> are aceeai semnificaie ca i n cazul funciei rtos.
Exemple:
(distof 56.34)56.34
(distof 5.01)5.01
(distof -5)-5.0
(distof 50.67klll2)nil
(distof k2ll)nil
(distof 56.34 2)56.34
(distof 17 1/2 5)17.5
(distof 1-5.5\ 3)17.5
Observaii:
1. Dac irul de caractere nu poate fi convertit ntr-un real, funcia returneaz
valoarea nil.
2. Funciile rtos i distof sunt complementare.
Funcia ANGTOS
Visual LISP/AutoLISP
78
Sintax:
(ANGTOS <unghi> [ <format> [ <precizie> ] ])
Transform argumentul <unghi> ntr-un ir de caractere innd cont de
formatul indicat de <format> i cu un numr de zecimale dat de <precizie>.
Argumentul funciei se va preciza n radiani iar <format> i <precizie> sunt
atomi sau simboluri de tip ntreg. Formatele posibile sunt cele existente n cadrul
comenzii AutoCAD UNITS i prezentate n tabelul 2.5.
Tabelul 2.5
Moduri
ANGTOS
Format
Exemplu
Grade (Degree)
180
Grade/minute/secunde
(Degrees/minutes/seconds)
82d 20 10
120.235g
Radiani (Radians)
3.1416r
Uniti speciale
(Surveyors units)
N 54d0 E
Exemple:
(setq a PI)
(angtos a 0 0) 180
(angtos a 0 4) 180.0000
(angtos a 1) 180 d 0 0
(angtos a 3 4) 3.1416r
(angtos a 4) W
(angtos a 2 4) 200.0000g
79
Exemple:
Exemple:
(ascii A) 65
(ascii B) 66
(ascii AutoLISP) 65
Funcia CHR
80
Visual LISP/AutoLISP
Sintax:
(CHR <ntreg> )
Returneaz caracterul al crui cod ASCII n baza 10 este argumentul.
Exemple:
(chr 65) A
(chr 66) B
Funcia CVUNIT
Sintax:
(CVUNIT <articol> <su1> <su2>)
Convertete argumentul <articol> din sistemul de uniti <su1> n
sistemul de uniti <su2>. Argumentul <articol> poate fi un ntreg, un real sau o
list ce materializeaz un punct 2D sau 3D. Argumentele <su1> i <su2> sunt
iruri de caractere care desemneaz unitile de msur n conformitate cu datele
stocate n fiierul acad.unt.
Exemple:
(cvunit 1.5 "minute" "second") 90.0
(cvunit 32 "degrees" "radians")0.558505
(cvunit 1.0 "inch" "mm") 25.4
(cvunit '(100 250) "mm" "in") (3.93701 9.84252)
(cvunit '(10 20 30) "ft" "in") (120.0 240.0 360.0)
Funcia TRANS
Sintax:
(TRANS <pct> <sc1> <sc2>)
Translateaz punctul notat cu <pct> din sistemul de coordonate <sc1> (n
care este exprimat) n sistemul de coordonate <sc2> (n care urmeaz a fi
exprimat). Sistemele de coordonate pot fi exprimate ca:
ntregi valoare 0 - pentru WCS, 1 - pentru UCS-ul curent, 2 - pentru DCS-ul
curent (Display Coordinate System care este sistemul de coordonate din
viewport-ul curent), 3 - pentru PSDCS (Paper Space Display Coordinate System
care este sistemul de coordonate din spaiul hrtie);
nume de entiti care specific OCS-ul (Object Coordinate System este
sistemul relativ la care funcia entget returneaz punctele din lista asociat) unei
entiti AutoCAD;
ca un vector 3D de extrudare (acesta este ntotdeauna reprezentat n WCS).
Exemple:
81
Exemple:
(setq s (strcat Auto LISP)) AutoLISP
(setq s (strcat s si Auto CAD)) AutoLISP si AutoCAD
(strcat VisualLISP/ s) VisualLISP/AutoLISP si AutoCAD
(strcat)
Funcia SUBSTR
Sintax:
Visual LISP/AutoLISP
82
Exemple:
(setq s AutoLISP si AutoCAD)
(substr s 5 4) LISP
(substr s 13 4) Auto
(substr s 13 17) AutoCAD
(substr s 10 2) si
(substr s 25 4) nil
Observaie: n cadrul irurilor de caractere primul element (caracter) se afl pe
poziia 1, spre deosebire de liste i mulimi de selecie unde primul element se
afl pe poziia 0.
Funcia STRLEN
Sintax:
(STRLEN [ <ir1> [ <ir2> ... <irn> ] ])
Funcia strlen returneaz un ntreg care semnific lungimea (numrul de
caractere) al irului de caractere argument. Dac sunt prezente mai multe
argumente atunci va fi returnat numrul total de caractere care le compun. n
situaia n care nu se indic argumente este returnat valoarea 0.
Exemple:
(strlen AutoLISP si AutoCAD) 19
(strlen LISP) 4
(strlen ) 0
(strlen) 0
Funcia STRCASE
Sintax:
83
Exemple:
(strcase AutoLISP - AutoCAD) AUTOLISP - AUTOCAD
(strcase AutoLISP - AutoCAD T) autolisp - autocad
Observaie: Caracterele diferite de cele alfabetice nu sunt modificate de funcia
strcase.
Funcia WCMATCH
Sintax:
(WCMATCH <ir> <model_cutare> )
Funcia wcmatch returneaz T dac argumentul <ir> ndeplinete criteriul
de cutare impus de <model_cutare> sau nil n caz contrar. Ambele argumente
sunt de tip ir de caractere. Specificaiile de cutare (valorile pe care le poate lua
<model_cutare>) sunt date n tabelul 2.6.
Exemple:
(wcmatch 2 #) T
(wcmatch 12 #) nil
(wcmatch a @) T
(wcmatch abv @) nil
(wcmatch a .) nil
(wcmatch < .) T
(wcmatch Desen D*)T
;testeaz dac Desen are caracterul D pe prima poziie
(wcmatch Desen a*)nil
;testeaz dac Desen are caracterul a pe prima poziie
(wcmatch a ?) T
(wcmatch abc ???) T
(wcmatch abv ?????) nil
(wcmatch Desen ~*s*) nil
;testeaz dac Desen nu conine caracterul s
(wcmatch Desen *s*) T
;testeaz dac Desen conine caracterul s
Visual LISP/AutoLISP
84
Caracter
Specificaie
[...]
[~...]
85
86
Visual LISP/AutoLISP
87
Exemple:
1.
(prompt \nIntroduceti o valoare:)
;returneaz nil i afieaz mesajul pe linie nou
2.
(setq n 5)
(setq f 120)
(prompt (strcat \nFactorialul calculat este (itoa n) != (rtos f 2 0)))
;returneaz nil i afieaz mesajul pe o linie nou
Observaii:
1. Funcia se recomand a fi utilizat la afiarea mesajelor pe ecran (vezi
exemplul 2 de mai sus) deoarece expandeaz caracterele de control i afieaz
mesajele fr ghilimele.
2. Prompt nu afieaz valorile n fereastra Visual LISP Console ci nu mai n
zona prompter-ului Command:.
Funcia WRITE-LINE
Sintax:
(WRITE-LINE <ir> [ <df> ])
Aceast funcie scrie pe o linie de ecran, sau n fiier, argumentul <ir>
(de tip string) ntre ghilimele, cu expandarea caracterelor de control.
Exemple:
1. Afiare pe ecran
(write-line \nExemplu) ; scrie pe ecran Exemplu i returneaz pe linia
; urmtoare \nExemplu
2. Scriere n fiier
(setq f (open EX.TXT w)) ;deschide fiierul
(write-line \nExemplu write-line\n f) ;scrie n fiier: prima linie goal,
;pe a doua linie Exemplu write-line i a treia linie goal.
(setq f (close f)) ;nchide fiierul
Observaie: Scrierea fizic n fiiere se realizeaz atunci cnd acestea se nchid
cu funcia close.
Funcia READ-LINE
Sintax:
(READ-LINE [ <df> ])
Funcia read-line citete un ir de caractere ce formeaz o linie, de la
tastatur sau din fiier i returneaz irul citit. Dac citirea se face dintr-un fiier
la atingerea sfritului de fiier returneaz ntotdeauna nil.
Visual LISP/AutoLISP
88
Exemple:
1. Citire din fiierul EX.TXT creat la exemplul 2 de la funcia write-line
(setq f (open EX.TXT r)) ;deschide fiierul
(if f
;dac fiierul exist
(setq linie1 (read-line f) ;citete prima linie i avanseaz
; pointer-ul de fiier pe linia urmtoare
linie2 (read-line f) ; citete a doua linie i avanseaz
; pointer-ul de fiier pe linia urmtoare
linie3 (read-line f) ; citete a treia linie i avanseaz
; pointer-ul de fiier pe linia urmtoare
)
)
;nchide fiierul
(setq f (close f))
Dup tastarea expresiilor de mai sus, linie1 i linie3 vor conine irul vid
() iar linie2 irul Exemplu write-line.
2. Citire de la tastatur
(read-line) ;utilizatorul va introduce de la tastatur un ir
Funcia WRITE-CHAR
Sintax:
(WRITE-CHAR <nr> [ <df> ])
Funcia write-char scrie un caracter pe ecran sau n fiier, dat prin codul
ASCII (n baza 10) din argumentul <nr>. Returneaz codul ASCII al
caracterului afiat.
Exemple:
(write-char 65) ;scrie caracterul A pe ecran i returneaz 65
(write-char 67) ;scrie caracterul C pe ecran i returneaz 67
(write-char 90 f) ;scrie caracterul Z n fiierul identificat prin f i
;returneaz 90
Funcia READ-CHAR
Sintax:
(READ-CHAR [ <df> ])
89
Exemplu:
(read-char )
Expresia simbolic de mai sus, atept introducerea de la tastatur a unuia
sau a mai multor caractere. Dac se introduce spre exemplu ABC urmat de enter,
read-char citete primul caracter i returneaz 65 (codul ASCII al primului
caracter). La urmtoarele trei apeluri ale funciei se vor returna automat codurile
ASCII 66, 67 i 10 (codul caracterului linie nou). Abia la urmtorul apel al
funciei se ateapt introducerea unor alte caractere. Datele introduse sunt
pstrate n buffer-ul de intrare-ieire.
Observaie: La citirea datelor din fiier, funcia read-char returneaz nil la
atingerea sfritului de fiier.
Visual LISP/AutoLISP
90
Funcia TEXTSCR
Sintax:
(TEXTSCR)
Ca i funcia textpage comut ecranul din mod grafic n mod text
(acioneaz ca i tasta funcional F2). Funcia returneaz nil.
91
Exemple:
(setq f (open EX.TXT w)) #<file "EX.TXT">
(setq f (open INEXIST.DTA r))nil
(setq f (open EX1.DAT a)) #<file "EX1.DAT">
Observaii:
1. Argumentul <nume_fiier> poate s conin ca prefix i calea pn la fiierul
care urmeaz a fi deschis. Calea poate s fie prefixat i cu o unitate de disc.
Subdirectoarele din aceasta trebuie separate prin slash (/) sau prin dou
backslash-uri (\\) conform interpretrii caracterelor de control.
2. Nu pot fi deschise n vederea citirii sau scrierii datelor dect fiiere text.
Exemple:
(setq f (open d:/student/ppac/ex.txt w))#<file"d:/student/ppac/ex.txt">
(setq f (open \\student\\inexist.dta r))nil
(setq f(open c:/teh/arbore.dat a))#<file"c:/teh/arbore.dat ">
Tabelul 2.7
Mod de
Descriere
deschidere
Deschide fiierul pentru citire, pointer-ul de fiier este poziionat
r
pe primul caracter din fiier. Dac <nume_fiier> nu exist, se
ntoarce nil, nefiind permis accesul la citirea datelor.
Deschide fiierul pentru scriere. Dac <nume_fiier> nu exist,
este creat un nou fiier i este deschis pentru scriere. Dac
w
<nume_fiier> deja exist, datele anterioare vor fi suprascrise.
Deschide fiierul pentru adugare de date. Dac <nume_fiier>
nu exist, este creat un nou fiier i este deschis pentru scriere;
iar dac <nume_fisier> exist deja, fiierul este deschis i
a
pointer-ul de fiier este poziionat la sfritul acestuia, n acest
fel datele pot fi adugate n fiier dup cele existente.
Funcia CLOSE
Sintax:
(CLOSE <df>)
Funcia close nchide un fiier deschis prin apelarea funciei open. Aceasta
are un singur argument i anume un descriptor de fiier valid. Dup apelare,
close returneaz nil dac operaia de nchidere s-a realizat cu succes sau afieaz
un mesaj de eroare n caz contrar.
92
Visual LISP/AutoLISP
Exemplu:
(setq f (close f))
Deoarece descriptorul de fiier f nu mai este valabil dup ce fiierul la
care se refer este nchis, exemplul atribuie variabilei f valoarea nil, acesta fiind
modul recomandat de nchidere a unui fiier. n acest fel, se elibereaz memoria
calculatorului, existnd posibilitatea testrii strii unui fiier (dac este nchis
sau deschis) i se asigur utilizarea corect a variabilelor n program.
Exemple:
1. Urmtorul exemplu permite citirea unui fiier text, cu un nume indicat de
programator (DATE.TXT), afind pe ecran coninutul acestuia.
(defun c:citdate ( / linie f)
(setq linie ""
f (open "date.txt" "r")
)
(if f
(while linie
(setq linie (read-line f))
(if linie (write-line linie)(setq f (close f)))
)
(prompt "\n!!!!!FISIER INEXISTENT!!!")
)
(prin1)
)
93
Funcia FINDFILE
Sintax:
(FINDFILE <nume_fiier>)
Funcia findfile permite utilizatorului s caute un fiier sau o cale existent
pe disc. Dac numele fiierului este precedat de o anume cale atunci cutarea
acestuia se realizeaz doar n subdirectorul respectiv. n cazul n care se
specific doar numele fiierului, acesta este cutat n cile de cutare curent
setate n AutoCAD. Funcia returneaz sub forma unui ir de caractere, calea i
numele fiierului dac acesta a fost gsit, sau nil dac nu a fost gsit fiierul
respectiv. Subdirectoarele din cale sunt separate de caracterul / sau de
caracterele \\.
Exemple:
S presupunem c:
subdirectorul din care este lansat AutoCAD-ul este D:\\Program
Files\\MDT6;
desenul editat se gsete n subdirectorul D:\\studenti\\ppac;
fiierul DATE.DTA se gsete n subdirectorul D:\\studenti\\ppac\\;
fiierul INEXIST.LSP nu este pe disc.
Dac se apeleaz findfile obinem:
(findfile "ex.txt") "D:\\Program Files\\MDT6\\ex.txt"
(findfile inexist.lsp) nil
(findfile "date.dta")"D:\\studenti\\ppac\\date.dta"
(findfile " D:\\studenti\\ppac")"D:\\studenti\\ppac"
Visual LISP/AutoLISP
94
\\. Dac utilizatorul nu indic un nume valid de fiier sau apas butonul
Cancel atunci getfiled returneaz nil.
Tabelul 2.8
<mod>
Semnificaie
(bitul 0)
4
(bitul 2)
8
(bitul 3)
16
(bitul 4)
32
(bitul 5)
64
(bitul 6)
128
(bitul 7)
Exemple:
1. Expresia simbolic urmtoare:
95
va genera fereastra de dialog din figura 2.14, permind indicarea unui nume de
fiier.
2. Urmtoarea expresia simbolic:
(getfiled Creati un nou fisier d:\\Program Files\\mdt6\\date txt 1)
va genera fereastra de dialog din figura 2.15 ce va permite indicarea numelui
unui nou fiier. Dac utilizatorul alege de pe disc un fiier existent, AutoCAD-ul
solicit, prin fereastra din figura 2.16, validarea operaiei de modificare a
coninutului fiierului.
3. Expresia simbolic urmtoare:
(getfiled Selectati un fiier desen d:/Program Files/mdt6/sample/exemplu
dwg 8)
genereaz fereastra de dialog din figura 2.17, care permite indicarea unui nume
de fiier desen (cu extensia DWG).
Observaii:
1. Dac extensia este indicat ca fiind irul vid () atunci aceasta este
considerat ca fiind oricare (*) iar n fereastr sunt prezentate numele tuturor
fiierelor (All files).
2. n situaia n care la apelare se indic extensia DWG, fereastra de dialog
conine o zon de previzualizare a fiierelor existente pe disc (cele care au
extensia DWG).
96
Visual LISP/AutoLISP
97
Visual LISP/AutoLISP
98
)
)
neu
)
99
Funcia ENTSEL
Sintax:
(ENTSEL [ <mesaj> ])
Funcia entsel este utilizat pentru aflarea numelui unei entiti selectate
de utilizator. Returneaz o list format din dou elemente: numele entitii
selectate i lista care materializeaz punctul n care aceasta a fost selectat, adic
(<nume_ent> (x y z)). Dac argumentul opional <mesaj> (de tip ir de
caractere) este indicat, acesta va fi afiat naintea selectrii entitii, n caz
contrar este generat automat mesajul Select objects:. Funcia acioneaz numai
pentru entiti principale. Dac prin punctul indicat nu trece o entitate atunci este
returnat nil.
Exemplu:
Exemplul de mai jos permite selectarea unei entiti i afieaz numele i
punctul de selectare al acesteia. Dac nu este selectat o entitate, funcia afieaz
un mesaj i permite din nou selectarea unei entiti.
(defun c:exsel (/ ne lp lista)
;simbolurile din program reprezint: ne-numele entitii
;
lp-lista punctului de selectare
;
lista-lista returnat de entsel
(while (not lista)
(setq lista (entsel "\nSelectati o entitate:")) ;se preia lista returnat
(if lista
;dac s-a selectat o entitate
(progn
;se preia numele entitii
(setq
ne (car lista)
lp (cadr lista)
;se preia punctul de selectare
)
(prompt "\nNumele entitatii selectate este:")
(prin1 ne)
;se afieaz numele entitii
(prompt "\nPunctul de selectare este:")
(prin1 lp)
;se afieaz punctul de selectare
)
(prompt "\nNu ati selectat o entitate!!! Mai incercati!!")
)
)
(prin1)
)
Observaie: La selectarea entitii prin intermediul funciei entsel, modurile
OSNAP setate permanent n AutoCAD, nu sunt luate n considerare.
Funcia NENTSEL
100
Visual LISP/AutoLISP
Sintax:
(NENTSEL [ <mesaj> ])
Funcia nentsel permite aflarea numelui unei entiti principale sau
secundare selectate de utilizator. Aceasta returneaz o list format din numele
entitii selectate i lista punctului n care entitatea a fost selectat, adic o list
de forma: (<nume_ent> (x y z)) pentru entitile principale sau (<nume_subent>
(x y z)) pentru entitile secundare. Dac argumentul opional <mesaj> (de tip ir
de caractere) este specificat, va fi afiat naintea selectrii entitii, n caz contrar
este generat automat mesajul Select objects:. Dac prin punctul dat de utilizator,
nu trece nici o entitate, atunci se returneaz valoarea nil.
Observaii:
1. La selectarea entitii prin intermediul funciei nentsel, modurile OSNAP
setate permanent n AutoCAD, nu sunt luate n considerare.
2. Dac entitatea selectat este o polilinie de tip lightweight (lwpolyline), atunci
ea este recunoscut de nentsel ca o singur entitate.
Funcia NENTSELP
Sintax:
(NENTSELP [ <mesaj> ] [ <pct> ])
Aceast funcie acioneaz ca i nentsel, n plus argumentul <pct> este
lista unui punct de pe entitate. Funcia returneaz i matricea standard de
transformare 4x4.
Numele unei entiti AutoCAD se poate schimba de la o sesiune de
editare la alta. Exist totui un identificator, denumit handle, care rmne
neschimbat (n orice sesiune de editare) atta timp ct entitatea exist n desen.
Gestionarea acestor identificatori poate fi realizat cu ajutorul funciei handent.
Funcia HANDENT
Sintax:
(HANDENT <ir>)
Funcia returneaz numele entitii, din sesiunea curent de editare,
asociat argumentului <ir> care este handle-ul (de tip ir de caractere). Odat
obinut, numele entitii poate fi utilizat ca argument al funciilor din familia
ENTXXX (anterior prezentate). Dac irul specificat ca argument nu identific o
entitate, funcia returneaz nil.
101
Exemplu:
(handent "2B")) ;poate s returneze <Entity name: 40063d58> n sesiunea
curent de editare.
Utiliznd aceeai expresie simbolic n acelai desen AutoCAD, ntr-o alt
sesiune de editare, se poate obine un alt nume de entitate. Deci identificatorul
de tip handle este acelai, pentru o entitate, n orice sesiune de editare.
Funcia handent poate s returneze i numele entitilor terse n sesiunea
curent de editare, existnd astfel posibilitatea readucerii acestora n desen cu
ajutorul funciei entdel (prezentat n subcapitolul 2.18).
(<e1> . <e2>).
Se remarc faptul c cele dou elemente sunt separate de punct, iar nainte
i dup punct, exist ntotdeauna spaiu.
Exemple:
1.
(8 . 0)
2.
(0 . LINE)
Visual LISP/AutoLISP
102
(0 . LINE)
(0 LINE)
(LINE)
0
LINE
LINE
()
Exemple:
(setq pp (cons 0 LINE)) (0 . LINE)
(setq ln (list 0 LINE)) (0 LINE)
(car pp)0
103
(car ln)0
(cdr pp) LINE
(cdr ln) (LINE)
(cons 5 (6 7 8 9)) (5 6 7 8 9)
(cons (5) (6 7 8 9)) ((5) 6 7 8 9)
Exemplu:
Pentru o entitate de tip linie, lista asociat cu datele asociate obligatorii,
are urmtoarea form:
((-1 . <Entity name: .......>)
; numele entitii
(0 . LINE)
; tipul entitii
(5 . 2F)
; handle-ul
(8 . 0)
; layer-ul
(67 . 0)
; spaiul n care este entitatea
(100 . "AcDbLine")
; marcatorul de subcals
(410 . "Model")
; numele layout-ului
(10 20.0 40.0 60.0)
; punctul de start
(11 30.0 70.0 80.0)
; punctul final
(210 0.0 0.0 1.0)
; direcia de extruziune
)
Primul element al fiecrei subliste este cheia sau codul DXF al acesteia,
elementele rmase sunt datele asociate seciunii determinate de cheie.
n exemplul dat, cheia primei subliste este ntregul -1, data aferent
acestei chei este numele entitii. Cheia celei de a doua subliste este atomul 0, iar
data asociat este tipul entitii. n tabelul 2.9 sunt prezentate codurile DXF
pentru o entitate de tip linie, iar n Anexa acestei lucrri sunt prezentate codurile
principalelor entiti grafice utilizate n liste asociate.
Tabelul 2.9
Codul DXF
-1
0
Data asociat
Numele entitii
Tipul entitii (Line, Arc, Circle, etc)
Visual LISP/AutoLISP
104
5
8
67
100
410
10
11
210
Handle-ul entitii
Layer-ul de apartenen
Spaiul (Model/Paper) n care se gsete
entitatea
Marcatorul de subclas
Numele Layout-ului
Punctul de start
Punctul final
Direcia de extruziune
Exemplu:
Dac se traseaz n layer-ul 0 o linie din punctul 10,10 pn n punctul
100,100 atunci se poate obine lista asociat acestei entiti prin expresiile:
(setq ne (entlast))
(setq lasoc (entget ne))
Simbolul lasoc va avea atribuit o list asociat de genul:
((-1 . <Entity name: 40063d78>)
(0 . "LINE")
(330 . <Entity name: 40063cf8>)
(5 . "2F")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbLine")
(10 10.0 10.0 0.0)
(11 100.0 100.0 0.0)
(210 0.0 0.0 1.0)
)
105
Observaie: Funcia entget accept un al doilea parametru opional (<listaaplic>), care permite obinerea datelor extinse. n subcapitolul 2.21 al prezentei
lucrri, va fi tratat conceptul de date extinse i se va reveni asupra funciei.
Extragerea unei subliste sau a unei perechi cu punct dintr-o list asociat
este realizabil prin apelarea funciei assoc.
Funcia ASSOC
Sintax:
(ASSOC <cod> <1ista_asoc>)
Funcia necesit dou argumente i anume: <cod> care este cheia ce
permite identificarea sublistei din cel de al doilea argument <1ista_asoc>, care
conine o list asociat unei entiti. Assoc returneaz ntotdeauna o list sau o
pereche cu punct. Pentru a obine datele aferente unei chei se va aplica cdr pe
rezultatul returnat de funcia assoc. Dac codul DXF indicat n sintaxa de apel a
funciei assoc nu exist n lista asociat, atunci este returnat atomul nil.
Exemplu:
(setq lasoc (entget (entlast))) ;returneaz lista asociat ultimei entiti
(assoc 8 lasoc)
;returneaz perechea (8 . nume-layer)
(setq numelayer (cdr (assoc 8 lasoc))) ;returneaz numele layer-ului
(setq tipent (cdr (assoc 0 lasoc)))
;returneaz tipul entitii
Observaie: Funcia assoc poate fi utilizat i pentru extragerea datelor dintr-o
list de liste normale i/sau perechi cu punct.
Exemplu:
(setq supraf ((tip . CILINDRICA) (dia . 123.4) (aid . -0.05)
(asd . 0.05) (lung . 50.0) (ail . 0) (asl . 0) (rugo . 1.6)))
(assoc tip supraf) (tip . CILINDRICA)
(cdr (assoc tip supraf)) CILINDRICA
(setq d1 (cdr (assoc dia supraf))) 123.4
(setq rug (cdr (assoc rugo supraf))) 1.6
Modificarea entitilor AutoCAD din AutoLISP se realizeaz n dou
etape:
n preluarea listei asociate entitii i modificarea acesteia cu ajutorul funciei
subst;
o reactualizarea entitii, n baza de date, aplicnd funcia entmod asupra
noii liste asociate.
106
Visual LISP/AutoLISP
Funcia ENTMOD
Sintax:
(ENTMOD <1ista_asoc>)
Funcia necesit argumentul <1ista_asoc> (care reprezint noua list
asociat entitii de modificat) i actualizeaz entitatea (cu noua lista asociat)
n baza de date a desenului (inclusiv pe ecran), returnnd lista asociat sau nil n
cazul unei liste asociate invalide.
Observaii:
1. Funcia entmod poate modifica att entiti grafice ct i nongrafice.
2. Entmod nu poate modifica tipul entitii, numele entitii i handle-ul
entitii.
3. Nu poate fi utilizat pentru entiti de tip viewport.
Exemple:
1. Se traseaz o linie n AutoCAD i apoi se tasteaz expresiile simbolice de
mai jos care modific punctul de final al liniei n 100,100,0.
(setq ne (entlast))
;se preia numele ultimei entiti trasate
(setq la (entget ne))
;se preia lista asociat ultimei entiti trasate
(setq lamod (subst (11 100 100 0) (assoc 11 la) la ))
;se genereaz noua list asociat entitii modificate
(entmod lamod) ;se modific entitatea
2. Se traseaz un cerc n AutoCAD i apoi se tasteaz expresiile simbolice de
mai jos care modific raza cercului (noua raz va fi 35) i centrul acestuia n
punctul 100,100,0.
(setq ne (entlast))
;se preia numele ultimei entiti trasate
(setq la (entget ne))
;se preia lista asociat ultimei entiti trasate
(setq lamod (subst (10 100 100 0) (assoc 10 la) la ))
(setq lamod (subst (cons 40 35) (assoc 40 lamod) lamod ))
;se genereaz noua list asociat entitii modificate
(entmod lamod) ;se modific entitatea
3. Urmtorul exemplu preia toate entitile din baza de date a desenului i
modific pentru entitile de tip linie, layer-ul n care sunt desenate (n layer-ul
existent L1).
(defun c:mod (/ ne nou lasoc)
(setq ne (entnext)
;se preia prima entitate
nou (cons 8 L1)) ;se genereaz perechea cu punct
(while ne
;cat timp exist entitate
(setq lasoc (entget ne))
;se preia lista asociat
107
Exemplu:
(setq e1 (entlast))
;se preia n simbolul e1 numele ultimei entiti desenate
(entdel e1)
;se terge entitatea identificat prin e1
(entdel e1)
;se readuce pe ecran entitatea tears e1
Funcia ENTUPD
Sintax:
(ENTUPD <nume_ent>)
Funcia reactualizeaz pe ecran imaginea unei entiti compuse (polilinie
3D sau bloc) dup ce au fost modificate (cu entmod) subentiti componente.
Valoarea returnat este numele entitii compuse dac a fost realizat operaia de
reactualizare a entitii sau nil n caz contrar.
Exemplu:
Se traseaz o polilinie 3D n AutoCAD i apoi se tasteaz expresiile
simbolice de mai jos care modific punctul primului vertex al poliliniei n
100,50,0.
(setq e1 (entlast))
;se preia numele ultimei entiti trasate
108
Visual LISP/AutoLISP
(setq e2 (entnext e1)) ;se preia numele primei subentiti (vertex) din polilinie
(setq la (entget e2))
;se preia lista asociat primului vertex
(setq la
(subst '(10 100.0 50.0 0.0)
;se modific lista asociat
(assoc 10 la)
la
)
)
(entmod la)
;se mut vertexul n desen
(entupd e1)
;se regenereaz polilinia
AutoLISP-ul permite programatorilor generarea entitilor AutoCAD n
mod direct, fr apelarea funciei command, prin specificarea listei asociate
entitii respective (care va fi generat) ca argument al funciilor entmake sau
entmakex.
Funcia ENTMAKE
Sintax:
(ENTMAKE <1ista_asoc>)
Dac entitatea dat de argumentul <1ista_asoc> este creat cu succes,
atunci funcia entmake returneaz lista asociat (indicat ca argument), iar dac
entitatea nu poate fi creat (deoarece lista asociat nu este corect) se returneaz
nil.
O metod de creare a unei noi entiti, const n obinerea mai nti, cu
ajutorul funciei entget, a listei asociate unei entiti existente n desen de acelai
tip cu noua entitate, modificarea acesteia cu datele caracteristice noii entiti i
apoi adugarea n desen a entitii cu funcia etnmake, care va avea ca argument
noua list asociat.
nainte de a crea o entitate nou, entmake verific dac numele layer-ului
este valid, dac numele tipului de linie i al culorii sunt cunoscute. Dac un nou
nume de layer este introdus, atunci funcia creeaz automat layer-ul.
109
) ((0 . "LINE") (8 . "NOU") (10 1.0 1.0 0.0) (11 100.0 0.0 0.0))
Observaii:
1. Perechile cu punct (-1 . <Entity name: .......> i (5 . .....) sunt generate
automat de ctre AutoCAD, dac ele apar n lista asociat, atunci ele sunt
ignorate de comand.
2. Perechile cu punct ce au codul DXF 100 sunt ignorate de entmake pentru
majoritatea categoriilor de entiti AutoCAD.
3. Funcia poate fi utilizat pentru entiti grafice i nongrafice.
Funcia ENTMAKEX
Sintax:
(ENTMAKEX <1ista_asoc>)
n cazul n care entitatea descris prin lista asociat <1ista_asoc>,
specificat ca argument al funciei entmakex, este creat cu succes, se returneaz
numele acesteia (<Entity name: .......>), iar dac entitatea nu poate fi creat
(deoarece lista asociat nu este corect) se returneaz nil.
Funcia poate fi utilizat att pentru entiti grafice ct i pentru entiti
nongrafice.
Visual LISP/AutoLISP
110
111
Exemple:
(ssget)
;solicit utilizatorului formarea mulimii de selecie
(ssget L)
;selecteaz ultima entitate adugat n baza de date
(ssget P)
;selecteaz entitile indicate la formarea ultimei mulimi de selecie
(ssget W (1.0 2.0) (20.0 10.0))
;selecteaz toate entitile aflate n ntregime n fereastra determinat
(ssget WP (list (1.0 2.0) (20.0 10.0) (150.0 50.0) (20.0 80.0)))
;selecteaz toate entitile aflate n ntregime n poligonul determinat ;de punctele 1,2 20,10 150,50 i 20 80
112
Visual LISP/AutoLISP
113
Exemplu:
(setq s1 (ssget L))
(sslength s1)1
Funcia SSNAME
Sintax:
(SSNAME <m_sel> <index>)
Funcia ssname returneaz numele entitii din mulimea <m_sel>,
identificat prin parametrul <index>. Numerotarea entitilor ntr-o mulime de
selecie se face ncepnd cu zero. Dac <index> este negativ sau mai mare dect
numrul de elemente minus unu (din mulime) se returneaz nil.
Exemple:
(setq s1 (ssget X))
114
Visual LISP/AutoLISP
Funcia SSNAMEX
Sintax:
(SSNAMEX <m_sel> [ <index> ])
Funcia returneaz numele entitii din mulimea <m_sel>, identificat
prin <index> mpreun cu descrierea modului n care a fost selectat entitatea i
punctele caracteristice modului respectiv, sub forma unei liste de liste. Modurile
de selectare sunt codificate, cu numere ntregi, astfel:
0 mod neprecizat (de exemplu Last, All etc.);
1 selectare prin punctare;
2 Window sau WPoligon;
3 Crossing sau CPolygon;
4 Fence.
Dac <index> este negativ sau mai mare dect numrul de elemente
minus unu (din mulime) se returneaz nil.
Exemple:
(setq s1 (ssget X))
;se genereaz o mulime de selecie format din toate entitile din desen
(setq l1 (ssnamex s1 0)) ((0 <Entity name: 40079d68> 0))
;se preia numele i modul primei entiti din mulime
(setq s2 (ssget))
;se genereaz o mulime prin selectarea entitilor de ctre utilizator
(setq l2 (ssnamex s1 0))
((1 <Entity name: 40079d60> 0 (0 (201.413 110.595 0.0))))
;se preia numele i modul primei entiti din mulime
Funcia SSADD
Sintax:
(SSADD [ <nume_ent>[ <m_sel> ] ])
Funcia ssadd adaug entitatea identificat prin <nume_ent> la mulimea
de selecie <m_sel> i returneaz mulimea de selecie modificat. Dac funcia
este apelat fr argumente, se genereaz o mulime de selecie vid, iar dac
este apelat doar cu un argument de tip nume de entitate, este generat o
mulime de selecie care conine entitatea specificat prin argument. n cazul n
care entitatea dat ca argument este coninut de mulimea de selecie, atunci
ssadd ignor operaia fr a afia un mesaj de eroare.
Exemple:
(setq e1 (entnext))
(setq s1 (ssadd))
(setq s2 (ssadd e1))
(setq e2 (entnext e1))
(setq s2 (ssadd e2 s2))
115
Funcia SSDEL
Sintax:
(SSDEL <nume_ent> <m_sel>)
Exemplu:
(setq e1 (entnext))
(setq e2 (entnext e1))
(setq s1 (ssadd e1))
(ssmemb e1 s1)
(ssmemb e2 s1)
116
Visual LISP/AutoLISP
CAPITOLUL 3
APLICAII
3.1 Pentru conturul indicat n figura 3.1 s se defineasc o nou comand
AutoCAD care s permit generarea acestuia (fr grosime), n layer-ul curent,
cu inhibarea ecoului i a modurilor OSNAP la desenare.
117
(setvar "cmdecho" 0)
;se seteaz variabila CMDECHO pe zero (se inhib ecoul)
(setvar "osmode" 0)
;se seteaz variabila OSMODE pe zero (se inhib modurile OSNAP)
(initget 1)
(setq p1 (getpoint "\nIntroduceti punctul de baza :"))
;se solicit utilizatorului punctul de baz cu preluarea erorii de
;introducere nul
(initget (+ 1 2 4))
(setq r (getdist p1 "\nIntroduceti raza :"))
;se solicit utilizatorului raza cu preluarea erorilor de introducere
;nul, zero sau valori negative
(setq
p2 (list (car p1) (+ (cadr p1) r))
p3 (list (+ (car p2) (* (/ 15 4.0) r)) (cadr p2))
p4 (list (car p3) (cadr p1))
p5 (list (car p4) (- (cadr p4) r))
p6 (list (- (car p5) r) (cadr p5))
p7 (list (car p1) (cadr p5))
)
;se calculeaz coordonatele punctelor care definesc conturul
(command
"arc" p2 "c" p1 p7
"arc" p5 "c" p4 p3
"line" p2 p3 ""
"line" p7 p5 ""
"line" p2 p6 p3 ""
)
;se traseaz conturul de generat
(setvar"cmdecho" cmd)
;se restaureaz vechea valoare a variabilei CMDECHO
118
Visual LISP/AutoLISP
119
)
In situaia n care se consider c P1 i P3 sunt date de intrare, programul
AutoLISP este urmtorul :
(defun c:ex2mod (/ p1 p2 p3 p4 l osm cmd )
(setq osm (getvar "osmode"))
(setq cmd (getvar "cmdecho"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(initget 1)
(setq p1 (getpoint "\nIntroduceti punctul de baza P1:")) ;se citeste P1
(initget 1)
(setq p3 (getcorner p1 "\nIntroduceti punctul P3:"))
;se citeste P3
(setq
;se calculeza valorile simbolurilor necesare generarii
p2 (list (car p3) (cadr p1))
p4 (list (car p1) (cadr p3))
L (- (car p3) (car p1))
p5 (list (+ (car p1) (/ L 2)) (+ (cadr p4)(* L (cos(/ pi 6)))))
)
(command "circle" "3p" p1 p2 p5
;se traseaza conturul
"line" p1 p2 p3 p5 p4 "c"
"line" p4 p3 ""
)
(setvar "osmode" osm)
(setvar "cmdecho" cmd)
(prin1)
)
120
Visual LISP/AutoLISP
121
Visual LISP/AutoLISP
122
(setq
p2 (list (car p1) (-(cadr p1) (- h r)))
p3 (list (car p1) (- (cadr p1) r ))
p4 (list (car p1) (+ (cadr p1) r))
p5 (list (- (car p1) r 5) (cadr p2))
p6 (list (+ (car p1) r 5) (cadr p2))
)
(command
line p5 p6
trim p4 p2 p3 p5 p6
bhatch p u 45 2 n (list (car p2) (+ (cadr p2) 3))
)
(setvar osmode osm)
(setvar cmdecho cmd)
(prin1)
)
123
)
(command "circle" p1 r2)
(setq h r2
p4 (list (car p1) (+ (cadr p1) r1))
) ;se asigur intrarea n while i se calculeaz punctul P4
(while (or (< h (+ r1 r2)) (> h (* 2 r1))) ;atat timp cat H< R1+R2 sau H > 2*R1
(initget 7)
(setq h (getdist p4 "\nIntroduceti inaltimea H:"))
;se introduce inaltimea cu punct de baza p4
124
Visual LISP/AutoLISP
)
(setq
p2 (list (car p1) (-(cadr p1) (- h r1)))
p3 (list (car p1) (- (cadr p1) r1 ))
p5 (list (- (car p1) r1 5) (cadr p2))
p6 (list (+ (car p1) r1 5) (cadr p2))
) ;se calculeaz punctele caracteristice
(command
"zoom" "e"
"line" p5 p6 ""
"trim" p4 p2 "" p3 p5 p6 ""
"bhatch" "p" "u" 45 2 "n" (list (car p2) (- (cadr p4) (/ (- r1 r2)2 ))) ""
"zoom" "p"
) ;se finalizeaz trasarea conturului
(setvar "osmode" osm)
(setvar "cmdecho" cmd)
(prin1)
)
3.6 Considerndu-se modelul 3D din figura 3.7, care este obinut prin
extrudarea piesei 2D din figura 3.6, s se defineasc o nou comand AutoCAD
care s permit generarea acesteia cu grosime de 0.35, n layer-ul curent, cu
inhibarea ecoului i a modurilor OSNAP la desenare. Datele de intrare vor fi:
punctul de baz P1, raza mare R1, raza mic R2, cota H, nlimea de extrudare
He i unghiul de extrudare Ue. Comanda va conine protecii la introducerea
datelor, astfel nct piesa s existe din punct de vedere geometric i va trasa
entitile pe msur ce se introduc datele de intrare.
125
)
(command "circle" p1 r2)
(setq e2 (entlast)) ;se preia numele aferent celei de a 2-a entitate trasata
(setq h r2
p4 (list (car p1) (+ (cadr p1) r1))
) ;se asigur intrarea n while i se calculeaz punctul P4
(while (or(< h (+ r1 r2))(> h (* 2 r1)));atat timp cat h< R2+R1 sau h> 2*R1
se repeta
(initget 7)
(setq h (getdist (list (car p1) (+ (cadr p1) r1))
inaltimea H:"))
"\nIntroduceti
)
(setq
p2 (list (car p1) (-(cadr p1) (- h r1)))
nu
este
Visual LISP/AutoLISP
126
(initget 1)
(setq ue (getreal "\nIntroduceti unghiul de extrudare Ue:"))
;se introduce unghiul de extrudare Ue
(command "pedit" e3 "" "j" e1 "" "" ;se genereaza polilinia de baza
"extrude" "l" "" he ue ;si apoi aceasta este extrudata
)
;se preia numele modelului 3d rezultat
(setq m3d (entlast))
(command
"extrude" e2 "" he ue ;se extrudeaza cercul obtinandu-se un cilindru
"subtract" m3d "" "l" "" ;se extrage cilindrul din modelul 3d
;se stabileste directia de privire 1,1,1
"vpoint" "-1,-1,1"
;se ascund muchiile invizibile
"hide"
)
(setvar "lwdisplay" lwd)
(setvar "osmode" osm)
(setvar "cmdecho" cmd)
(prin1)
)
127
BIBLIOGRAFIE