Documente Academic
Documente Profesional
Documente Cultură
CAPITOLUL 1
Pictograme
Ferestre de
editare
a
programelo
Meniul
desfurtor
Fereastra
Visual
LISP
Fereastr
a
Fereastr
a
Build
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
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
13
14
15
(+ 2 3 4)9
(+ 2 1.0)3.0
(+ 3)3
(+)0
16
(- 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
(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:
(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
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
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)
a a
(sin (/ pi 3)) (sin (/ pi 3))
(a b c d) (a b c d)
(1 2 3) (1 2 3)
Observaie: Abrevierea funciei nu poate fi utilizat ca prim funcie pe
prompter-ul Command: al AutoCAD-ului deoarece aceasta nu pred controlul
AutoLISP-ului, dar poate fi utilizat n VLISP (fereastra Visual LISP Console).
Urmtorul exemplu nu este valid:
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
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
25
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:
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
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))
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)
Fig. 2.7 Nodul rdcin i primele dou ramuri ale listei (1.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
)
()
()
P1=(x y z)
(car P1)x
(cdr P1)(y z)
32
Exemple:
Pentru un punct AutoCAD cu trei coordonate (x y z) definit astfel:
(setq x 1 y 2 z 3)
(setq p (list x y z))
coordonatele se obin cu urmtoarele expresiile simbolice:
(car p) 1 ;se obine coordonata x
(car (cdr p)) 2 ;identic cu expresia (cadr p), se obine coordonata y
(car(cdr(cdr p))) 3
;identic cu expresia (caddr p),se obine coordonata z
33
Exemple:
(last (a b c))c
(last (a b c (d e f)))(d e f)
Exemple:
(length (a b c))3
(length (a b c (d e f)))4
(length ( ))0
Funcia MEMBER
Sintax:
(MEMBER <expr> <list >)
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 (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)
AutoLISP-ul este un limbaj de programare care nu altereaz originalul.
Dac se consider urmtoarele expresii:
Exemple:
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)
;se definesc variabilele p1, p2 i raza
raza 10)
(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
(setq lx 100
ly 50
lz 75
r 10
u5
p1 '(50 50)
)
;setare valori parametrii de intrare
(setq p3 (list (+ (car p1) lx) (+ (cadr p1) ly))
p2 (list (car p3) (cadr p1))
p4 (list (car p1) (cadr p3))
)
;calcul puncte caracteristice
(command "pline" p1 p2 p3 p4 "c") ;traseaz polilinia
(command "fillet" "t" "t" "r" r
39
Observaii:
1. ncepnd cu AutoCAD2002, funciile din categoria getxxx pot fi apelate din
interiorul funciei command. De exemplu:
(setvar cmdecho 0)
(command line
(setq p1 (getpoint \nPunct de start:))
(setq p2 (getpoint p1 \nPunct de final:))
)
2. O comand AutoCAD lansat din AutoLISP cu o funcia command:, poate fi
ncheiat ulterior cu o alt funcie command: . De exemplu:
(setq pc (100 100))
(command circle pc)
(setq dia 32.345)
(command d dia)
Toate versiunile de AutoCAD accept nume de comenzi i opiuni n
limba englez, indiferent de versiunea lingvistic disponibil. Aceast facilitate
permite programatorilor s scrie programe portabile, ce pot fi utilizate n cadrul
tuturor versiunilor de AutoCAD, indiferent de limba utilizat, fr a traduce
comenzile folosite n cadrul funciei command. Pentru a utiliza versiunea n
limba englez a comenzilor i opiunilor acestea vor fi precedate de liniua de
subliniere (_) sau de punct liniu de subliniere (._). n cel de-al doilea caz
(._) sunt evitate chiar i redefinirile de comenzi AutoCAD. De exemplu modul
n care se apeleaz comanda LINE n orice versiune lingvistic de AutoCAD
este ._LINE.
40
41
Exemple:
(setq nume (getstring \nIntroducei numele:))
(setq numep (getstring T \nIntroducei numele i prenumele:))
(setq s (getstring T "\nIntroducei numele fiierului: "))
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).
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>)
44
Exemple:
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
47
48
49
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>)
50
51
Dup cum se poate observa, sintaxa lui defun este puin diferit de a
celorlalte funcii prezentate pn acum. Funcia are dou argumente obligatorii
(numele funciei i o expresie simbolic care este corpul funciei) i trei
argumente opionale (lista de parametrii formali, lista de parametrii locali i cele
m-1 expresii simbolice din corpul funciei). n cazul n care lipsesc att
parametrii locali ct i cei formali atunci se va indica lista vid ( ) n locul lor.
Defun returneaz ntotdeauna numele funciei definite.
Se observ c parametrii formali sunt separai de cei locali prin
intermediul caracterului slash (/). Foarte important de reinut este faptul c
nainte i dup slash se las cel puin un spaiu, n caz contrar, toi parametrii din
list vor fi considerai ca fiind formali.
Privitor la numele funciei, este important de reinut c acesta trebuie s
fie diferit de numele funciilor i a simbolurilor predefinite, deoarece n acest fel
se evit modificarea semnificaiilor iniiale a subrutinelor standard. n cazul
modificrii, acestea rmn inaccesibile pn la reiniializarea AutoLISP-ului, de
exemplu nceperea unui nou desen.
O funcie definit de programator se apeleaz ca oricare alt funcie
AutoLISP i anume:
52
(defun s1 (x y)
(/ (* (+ x y) (- x y)) (* x y))
)
Funcia se apeleaz fie utiliznd expresia (s1 23.0 5), fie (s1 t v) dac t i
v sunt simboluri de tip ntreg sau real, dar cel puin unul de tip real. Dac att t
ct i v sunt ntregi atunci se efectueaz operaiile de mprire i nmulire cu
ntregi, obinndu-se ca rezultat un ntreg. n cazul n care se dorete preluarea
valorii returnate de funcia definit, atunci aceasta se apeleaz astfel:
(setq val (s1 23.0 5)) sau (setq val (s1 t v))
53
54
55
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:
(= 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
60
Funcia >=
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:
61
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.
62
Exemple:
Pentru atribuirile:
(setq lista (a b c)
l1 lista)
se obine:
(atom lista)T ;deoarece lista este considerat ca fiind simbol
(atom lista)nil
(atom l1)T
;deoarece l1 memoreaz simbolul lista
(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
(listp x)nil
;deoarece x este simbol
(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)
63
(boundp x)T
(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>)
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
Funcia NOT
Sintax:
(NOT <expr>)
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:
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:
Funcia IF
Sintax:
(IF <expr-test> <expr-then> [ <expr-else> ])
67
2.
(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
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
70
Funcia REPEAT
Sintax:
(REPEAT <numr>
[ <expr1>
<expr2>
........
<exprn> ]
)
Funcia repeat evalueaz expresiile simbolice notate cu <expr1>,
<expr2>,.....<exprn> de un numr fix de ori dat de argumentul <numr>, i
returneaz valoarea ultimei expresii evaluate. Dac la apelarea funciei nu se
indic nici o expresie atunci este returnat valoarea nil. Funcia are un argument
obligatoriu i mai multe argumente opionale. Argumentul obligatoriu trebuie s
fie un ntreg sau expresie simbolic care n urma evalurii s returneze o valoare
ntreag. Acest argument specific funciei repeat de cte ori s evalueze
expresiile simbolice care formeaz corpul ciclului.
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.
72
Funcia WHILE
Sintax:
(WHILE <expr-test>
[ <expr1>
<expr2>
........
<exprn> ]
)
Funcia while evalueaz <expr-test> i dac nu are valoarea nil, evalueaz
setul de expresii notate cu <expr1>, <expr2>,.....,<exprn> care formeaz corpul
ciclului i apoi se reevalueaz expresia test. Aciunile prezentate mai sus sunt
repetate pn cnd expresia <expr-test> returneaz nil. Deci atta timp ct este
ndeplinit expresia <expr-test> se execut corpul ciclului. Funcia returneaz
valoarea rezultat n urma evalurii ultimei expresii simbolice.
Datorit faptului c while este o funcie mai complex, pentru a evita
apariia unor erori, programatorul trebuie s aib n vedere urmtoarele:
n pentru ca setul de expresii simbolice din corpul funciei s fie parcurs mcar
o dat, trebuie ca valoarea iniial a expresiei test s fie diferit de nil; deci
trebuie ndeplinit condiia de intrare n ciclu while, adic programatorul
trebuie s seteze corect variabilele care intervin n expresia test nainte de a se
intra n ciclu;
o pentru a evita intrarea ntr-un ciclu infinit, trebuie ca n corpul acestuia s fie
modificate valori ale anumitor variabile astfel nct expresia test s returneze
nil la un anumit moment (condiia de ieire din ciclu).
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))
)
73
74
Funcia FOREACH
Sintax:
(FOREACH <variabil> <list>
[ <expr1>
<expr2>
........
<exprn> ]
)
Aceast funcie parcurge element cu element lista <list> atribuindu-i
variabilei notat cu <variabil> valoarea fiecrui element, evalund succesiv
setul de expresii simbolice <expr1>, <expr2>,.....,<exprn> cu valoarea curent a
variabilei. Foreach necesit dou argumente obligatorii i anume: variabila
<variabil> i lista (<list>) de valori aferente acesteia. La ieirea din ciclu
variabila va avea valoarea ultimului element din list, iar valoarea returnat de
funcie este rezultat din evaluarea ultimei expresii <exprn>. Dac funcia nu are
expresii drept argument, cele care formeaz corpul ciclului, atunci este returnat
valoarea nil.
Observaie: Elementele listei <list> trebuie s fie de acelai tip sau de tipuri
compatibile.
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.
(foreach I (2 5 6 9 23 45 46 61) (factp I))
75
Funcia ITOA
Sintax:
(ITOA <intreg>)
Funcia itoa (Integer TO Ascii) este inversa funciei atoi i permite
convertirea unui ntreg ntr-un ir de caractere.
Exemple:
(itoa 56)56
(itoa -5) -5
Funcia RTOS
Sintax:
(RTOS <real> [ <format> [ <precizie> ] ])
76
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
Funcia ATOF
Sintax:
(ATOF <ir>)
77
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
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
Funcia ANGTOF
Sintax:
(ANGTOF <ir> [ <format> ])
Convertete argumentul <ir> de tip ir de caractere ntr-un real care
reprezint un unghi exprimat n radiani. Formatul de reprezentare a unghiului n
irul de caractere, este dat de argumentul opional <format>. Formatele posibile
sunt cele din cadrul comenzii AutoCAD UNITS prezentate n tabelul 2.5.
Exemple:
Funcia ASCII
Sintax:
(ASCII <ir>)
Funcia returneaz ntregul aferent transformrii primului caracter al
irului n cod ASCII.
Exemple:
(ascii A) 65
(ascii B) 66
(ascii AutoLISP) 65
Funcia CHR
80
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).
81
Exemple:
1. Dac se consider c UCS-ul curent este rotit cu 90 n jurul axei Z i
cu 45 n jurul axei X, atunci se poate scrie:
(setq p1 '(1.0 2.0 3.0))
; punctul de translatat
(setq sc1 0)
; WCS
(setq sc2 1)
]
; UCS-ul curent
(trans p1 sc1 sc2) (2.0 1.41421 2.82843) ; punctul translatat
Funcia SUBSTR
82
Sintax:
(SUBSTR <ir> <poziie> [ <lungime> ])
Extrage un subir de caractere din irul de caractere notat cu <ir>,
ncepnd cu poziia <poziie> i cu un numr de <lungime> caractere. Dac
numrul de caractere nu este dat, se extrage subirul din poziia indicat pn la
sfritul irului argumentului <ir>. Numerotarea caracterelor se face ncepnd
cu 1. Argumentele <poziie> i <lungime> trebuie s fie ntregi strict pozitivi.
Dac poziia indicat este mai mare dect lungimea irului de caractere atunci
funcia returneaz nil.
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
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
84
Specificaie
[...]
[~...]
85
86
Funcia PRINC
Sintax:
(PRINC [ <expr> [ <df> ] ])
Aceast funcie acioneaz ca i prin1 dar caracterele de control sunt
tiprite cu expandare (sunt evaluate).
Exemple:
(setq a 67.78)
(setq b '(x y))
(princ 'a)
;afieaz
A
i returneaz
A
(princ a)
;afieaz
67.78
i returneaz
67.78
(princ b)
;afieaz
(x y)
i returneaz
(x y)
(princ "LISP")
;afieaz
"LISP"
i returneaz
"LISP"
(princ "\nCalea este: \d:\\studenti\\ppac\\aplicatii\")
;afieaz Calea este: d:\studenti\ppac\aplicatii pe line noua i
returneaz "\nCalea este: \d:\\studenti\\ppac\\aplicatii\"
(princ)
;afieaz o linie goala
Funcia PRINT
Sintax:
(PRINT [ <expr> [ <df> ] ])
Print acioneaz ca i prin1 (caracterele de control nu sunt expandate), dar
este tiprit o linie nou (un caracter \n) nainte de <expr> i un spaiu dup
<expr>.
Funcia PROMPT
Sintax:
(PROMPT <mesaj>)
Funcia prompt returneaz nil i afieaz <mesaj> pe ecran cu expandarea
caracterelor de control. Argumentul <mesaj> este de tip ir de caractere.
87
Exemple:
(prompt \nIntroduceti o valoare:)
1.
;returneaz nil i afieaz mesajul pe linie nou
(setq n 5)
2.
(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.
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
)
)
(setq f (close f))
;nchide fiierul
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> ])
Read-char citete un singur caracter de la tastatur sau dintr-un fiier
deschis anterior pentru citire de date, identificat prin argumentul <df>.
Returneaz codul ASCII, n baza 10, al caracterului citit.
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.
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
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.
Funcia GETFILED
Sintax:
(GETFILED <titlu> <nume_fiier> <extensie> <mod>)
Funcia getfiled genereaz o fereastr de dialog cu un antet dat de <titlu>,
care conine lista fiierelor disponibile pe disc, cu extensia dat n argumentul
<extensie> i cu fiierul implicit indicat de <nume_fiier>. Primele trei
argumente din sintaxa funciei, sunt de tip ir de caractere, iar argumentul
<mod> este de tip ntreg i poate s aib una din valorile date n tabelul 2.8.
Funcia returneaz numele fiierului (precedat de cale) specificat de utilizator
sau nil. Subdirectoarele din cale sunt separate de caracterul / sau de caracterele
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)
(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
97
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
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.
Se remarc faptul c cele dou elemente sunt separate de punct, iar nainte
i dup punct, exist ntotdeauna spaiu.
Exemple:
(8 . 0)
1.
102
2.
(0 . LINE)
(0 . LINE)
(0 LINE)
(LINE)
0
LINE
LINE
()
Funcia CONS
Sintax:
(CONS <e1> <e2>)
Funcia cons este utilizat pentru generarea perechilor cu punct sau a unor
liste normale. Dac argumentul <e2> este o list, se genereaz lista format din
elementele lui <e2> cu <e1> inserat pe prima poziia a listei. Dac att <e1> ct
i <e2> sunt atomi atunci este generat automat perechea cu punct (<e1> .
<e2>).
Exemple:
(setq pp (cons 0 LINE)) (0 . LINE)
103
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
Data asociat
104
-1
0
5
8
67
100
410
10
11
210
Numele entitii
Tipul entitii (Line, Arc, Circle, etc)
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
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
;returneaz tipul entitii
(setq tipent (cdr (assoc 0 lasoc)))
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
106
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)
;se preia prima entitate
(setq ne (entnext)
nou (cons 8 L1)) ;se genereaz perechea cu punct
107
(while ne
;cat timp exist entitate
(setq lasoc (entget ne))
;se preia lista asociat
(if (= (cdr (assoc 0 lasoc)) LINE) ;dac entitatea este linie
(entmod (subst nou (assoc 8 lasoc) lasoc));se reactualizeaz
)
(setq ne (entnext ne));se trece pe urmtoarea entitate din desen
)
(prin1)
)
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:
108
109
((0 . LINE)
(8 . NOU)
(10 1.0 1.0 0.0)
(11 100.0 0.0 0.0))
) ((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.
Exemplu: Urmtoarea expresie simbolic genereaz o nou entitate AutoCAD
cu urmtoarele proprieti: tip entitate CIRCLE, layer-ul de apartenen 0,
cu punct de centru 100.0,100.0,0.0 i raz 35.5 .
(entmakex
((0 . Circle)
(8 . 0)
(10 100.0 100.0 0.0)
(40 . 35.5))
) ;returneaz un nume de entitate
110
111
112
113
Observaii:
1. Mulimile de selecie returnate de ssget sunt formate numai din numele
aferente entitilor principale.
2. O mulime de selecie poate s conin att entiti din spaiul model ct i
entiti din hrtie. Cnd o mulime de selecie este utilizat ntr-o operaie, ssget
elimin temporar entitile din spaiul care nu este curent.
Funcia SSLENGTH
Sintax:
(SSLENGTH <m_sel>)
Aceast funcie returneaz un ntreg care semnific numrul de entiti
coninute n mulimea de selecie indicat ca argument. Dac numrul de entiti
este mai mare dect limita maxim a tipului de dat ntreg, atunci data returnat
este de tip real.
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
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>)
Ssdel permite tergerea entitii <nume_ent> din mulimea de selecie
<m_sel> i returneaz mulimea de selecie modificat. Dac entitatea nu face
parte din mulimea de selecie atunci funcia returneaz nil.
Exemplu:
(setq e1 (entnext)) ;se preia prima entitate din baza de date
(setq s1 (ssadd e1)) ;se genereaz o mulime de selecie format din e1
(setq s1 (ssdel e1 s1));se terge e1 din mulimea de selecie
(ssdel e1 s1)
;returneaz nil deoarece e1 nu mai face parte din
;mulimea de selecie
Funcia SSMEMB
Sintax:
(SSMEMB <nume_ent> <m_sel>)
Funcia ssmemb verific dac entitatea <nume_ent> este coninut de
mulimea de selecie <m_sel> i returneaz numele entitii dac aceasta face
parte din mulimea respectiv. Dac entitatea nu face parte din mulimea de
selecie atunci funcia returneaz nil.
Exemplu:
(setq e1 (entnext))
(setq e2 (entnext e1))
(setq s1 (ssadd e1))
(ssmemb e1 s1)
(ssmemb e2 s1)
116
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
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)
;se citeste P3
(setq p3 (getcorner p1 "\nIntroduceti punctul P3:"))
;se calculeza valorile simbolurilor necesare generarii
(setq
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)))))
)
;se traseaza conturul
(command "circle" "3p" p1 p2 p5
"line" p1 p2 p3 p5 p4 "c"
"line" p4 p3 ""
)
(setvar "osmode" osm)
(setvar "cmdecho" cmd)
(prin1)
)
120
121
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
)
(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
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
)
(setq m3d (entlast))
;se preia numele modelului 3d rezultat
(command
"extrude" e2 "" he ue ;se extrudeaza cercul obtinandu-se un cilindru
"subtract" m3d "" "l" "" ;se extrage cilindrul din modelul 3d
"vpoint" "-1,-1,1"
;se stabileste directia de privire 1,1,1
"hide"
;se ascund muchiile invizibile
)
(setvar "lwdisplay" lwd)
(setvar "osmode" osm)
(setvar "cmdecho" cmd)
(prin1)
)
127
BIBLIOGRAFIE