Sunteți pe pagina 1din 6

Modul 03 Universitatea “Petru Maior” Tg.

Mureş
LecŃia nr. 1 Centrul de Instruire CAD&CAM

LecŃia nr. 1: Introducere în AutoLISP

AutoLISP este un limbaj de programare de nivel înalt, care face parte integrantă din mediul
AutoCAD. LISP este un acronim pentru LISt Processing (procesare de liste). AutoLISP este un
dialect al limbajului de programare LISP, o variantă dedicată exclusiv AutoCAD-ului. LISP este
unul dintre cele mai vechi limbaje de programare de nivel înalt, cunoscut mai ales pentru
aplicaŃiile din domeniile sistemelor expert şi inteligenŃei artificiale. Ca şi FORTRAN-ul, prima
implementare a LISP-ului datează din jurul anului 1960. Acum există mai multe dialecte
(variante) ale LISP-ului, incluzând Common Lisp, Franz Lisp, Mu Lisp şi X Lisp.

Primele încercări AutoLISP


AutoLISP este un limbaj de care beneficiem odată cu instalarea AutoCAD-ului. Programele
AutoLISP nu pot fi folosite decât în AutoCAD; orice încercare de program AutoLISP se face
deci în AutoCAD. Limbajul este de tip interpretor, astfel încât rezultatul calculelor sale pot fi
vizualizate interactiv în editorul de desenare AutoCAD. AutoLISP interacŃionează direct cu
AutoCAD-ul, fără a cere programe suport externe cum ar fi un compilator.
Pentru a putea face primele încercări AutoLISP, lansaŃi AutoCAD-ul. La prompt-ul Command:
tastaŃi o primă expresie AutoLISP, prin care să adunaŃi două numere întregi, după care apăsaŃi
tasta Enter:
Command: (+ 2 3)
5
Aşa cum se vede în exemplul de mai sus, pe rândul următor expresiei AutoLISP, este afişat
rezultatul adunării: 5. Când AutoCAD “vede”, în loc de o comandă, o expresie AutoLISP, el
cedează execuŃia interpretorului AutoLISP, care este dator să evalueze expresia. Expresia
AutoLISP are reguli simple de formare:
• începe cu o paranteză rotundă;
• după paranteză urmează un nume de funcŃie AutoLISP;
• funcŃia AutoLISP este urmată de argumentele sale, despărŃite cel puŃin de câte un spaŃiu;
• argumentele pot fi la rândul lor expresii AutoLISP;
• în ansamblu, câte paranteze se deschid, tot atâtea trebuie şi închise.
În exemplul de mai sus, aŃi folosit funcŃia “+” din AutoLISP. Numerele 2 şi 3 sunt argumente
ale funcŃiei “+”. Structura expresiei AutoLISP este simplă dar neobişnuită. Cele mai multe bătăi
de cap ridică parantezele şi împerecherea lor corectă. Astfel, iată câteva expresii aritmetice
simple şi echivalentele AutoLISP, într-o formă tabelară (verificaŃi fiecare expresie în parte):

Expresie aritmetică Expresia echivalentă în AutoLISP


1 Command: (/ 1 (sqrt 2))
2 0.707107
− 21 (* 4 3)))
Command: (sqrt (−
21 − 4 ⋅ 3
3.0
Command: (+ (expt 2.17 3) 1)
2.17 3 + 1 11.2183
− 1 (sin (/ pi 4)))
Command: (−
1 − sin 45°
0.292893

M03-1
Modul 03 Universitatea “Petru Maior” Tg.Mureş
LecŃia nr. 1 Centrul de Instruire CAD&CAM

Analizând expresiile de mai sus, pot fi sintetizate câteva aspecte ale scrierii AutoLISP:
• prima expresie AutoLISP din tabel transpusă în cuvinte ar suna aşa: împarte pe unu la
radicalul lui doi - nu uita deci că întâi numeşti funcŃia şi apoi argumentele sale;
• după fiecare paranteză deschisă urmează o funcŃie;
• numerele reale se scriu folosind punctul zecimal;
• funcŃiile trigonometrice aşteaptă unghiurile în radiani, nu în grade;
• pentru numărul π se foloseşte cuvântul “pi”;
• fiecare funcŃie are dreptul la un număr dat de argumente, iar folosirea unui număr
incorect de argumente atrage un mesaj de eroare.
Un tabel cu funcŃiile aritmetice uzuale şi exemple de utilizare ale acestora, este dat în tabelul de
mai jos, alături de câteva observaŃii importante:

FuncŃia Exemplu de utilizare ObservaŃii


AutoLISP
+ Command: (+ 1 2 −6) Adunarea poate avea oricâte argumente; numerele
−3 negative sunt precedate de semnul −.

− − 7 –1 5)
Command: (− Când argumentele sunt întregi, rezultatul este
3 întreg.
/ Command: (/ 9 3 2.0) Dacă cel puŃin un argument este real, atunci
1.5 rezultatul este real; încercaŃi cu 2 în loc de 2.0!
* Command: (* 9 −3 2.0) FuncŃia înmulŃire admite de la nici unul până la
oricâte argumente; fără argument întoarce 0.
−54.0
sqrt Command: (sqrt 4) FuncŃia radical nu admite decât un singur
2.0 argument, iar rezultatul este întotdeauna un real.
expt Command: (expt 2 3) Ridicarea la putere admite şi mai mult de două
8 argumente; încercaŃi efectul.
sin Command: (sin (/ pi 3)) FuncŃiile trigonometrice lucrează cu unghiurile în
0.866025 radiani.
cos Command: (cos (/ pi 3)) Nu există funcŃiile tangentă şi cotangentă, iar
0.5 dintre cele inverse există doar arctangenta.
atan Command: (atan 1 0.0) Întoarce arctangenta raportului dintre cele două
1.5708 argumente; dacă primul argument este pozitiv iar
al doilea este zero, atunci întoarce 1.5708 (90°).

Legarea variabilelor şi interogarea lor


Numărul π este exprimat în AutoLISP prin cuvântul pi. Pe de altă parte, + sau sqrt sunt de
asemenea cuvinte rezervate pentru nume de funcŃii interne AutoLISP – primul fiind dedicat
adunării şi cel de-al doilea extragerii radicalului de ordinul doi. Asemenea oricărui limbaj de
programare, AutoLISP permite utilizarea de variabile. Expresia de mai jos permite legarea
întregului 1 la variabila cu numele a:
Command: (setq a 1)
1
FuncŃia AutoLISP care permite legarea de valori unei variabile, este setq. Este evident că
numirea variabilelor trebuie să evite o serie de nume rezervate funcŃiilor interne sau constantelor
AutoLISP; astfel, vor fi evitate nume precum +, −, sqrt, abs, sin, atan, setq etc.

M03-2
Modul 03 Universitatea “Petru Maior” Tg.Mureş
LecŃia nr. 1 Centrul de Instruire CAD&CAM

Pentru a vedea care este valoarea legată de o variabilă, se foloseşte semnul exclamării “!”, pus
înaintea variabilei. Prin exemplul de mai jos veŃi putea evalua valorile legate de variabilele a, b
şi setq:
Command: !a
1
Command: !b
Nil
Command: !setq
<Subr: #22a3e24>
Variabilei a i s-a legat anterior întregul 1, este deci normal ca AutoLISP să raporteze 1. Această
valoare se păstrează până la legarea unei noi valori de variabila a, sau până la începerea unei noi
sesiuni de desenare în AutoCAD.
În AutoLISP, nil înseamnă “nimic” sau “fals”, iar variabilei b nefiindu-i legată nici o valoare,
este raportată ca fiind nil. La începerea unei noi sesiuni AutoCAD, până la atribuirea unei
valori, astfel de variabile sunt nil. Nu sunt nil însă numele de funcŃii AutoLISP, acestora
fiindu-le legaŃi indicativi de subrutină, aşa cum apare în exemplul de mai sus pentru funcŃia
setq.

Răspunsuri AutoLISP la cereri AutoCAD


Cererilor formulate de comenzi AutoCAD li se poate răspunde cu expresii AutoLISP. Folosind
astfel de expresii, pot fi lansate chiar comenzi AutoCAD. Pentru câteva încercări, desenaŃi mai
întâi o linie oarecare în AutoCAD. În exemplul de mai jos, în cadrul unei comenzi de rotire a
liniei desenate, unghiul de rotire se indică printr-o expresie AutoLISP:
Command: rotate
Select objects: last
Select objects: apasă tasta Enter pentru a încheia selecŃia de obiecte de rotit
Base point: 0,0
<Rotation angle>/Reference: (/ 45 2.0)
În exemplul următor, este lansată printr-o expresie AutoLISP însăşi comanda rotate, cu tot
dialogul care îi urmează; rezultatul va fi o nouă rotire a liniei, în jurul aceluiaşi punct, cu acelaşi
unghi rezultat din calcul AutoLISP:
Command: (command "rotate" "last" "" "0,0" (/ 45 2.0))
Expresia de mai sus cere o serie de explicaŃii suplimentare. Astfel, funcŃia command din
AutoLISP permite lansarea de comenzi AutoCAD. Numele comenzilor se scriu ca şir, fără spaŃii
suplimentare în cadrul şirului – care ar avea efect de Enter. Diferitele opŃiuni din dialogul unei
comenzi pot fi de asemenea indicate ca şiruri: ″last″ va răspunde la cererea de selecŃie şi
provoacă selectarea pentru rotire a ultimei entităŃi AutoCAD desenate; şirul nul ″″ are efect de
Enter; şirul ″0,0″ indică coordonatele punctului de bază. ExersaŃi şi alte exemple, pe baza
tabelului următor (asiguraŃi-vă să lucraŃi în sistem metric).

Comenzi AutoCAD Expresii AutoLISP


Command: line
From point: 20,20 Command: (command “line” “20,20” “100,100” “”)
To point: 100,100
To point: Enter

Command: circle
3P/2P/TTR/<Center point>: 60,60
Diameter/<Radius>: 10

M03-3
Modul 03 Universitatea “Petru Maior” Tg.Mureş
LecŃia nr. 1 Centrul de Instruire CAD&CAM

Command: arc
Center/<Start point>: 40,20
Center/End/<Second point>: c
Center: 1,1
Angle/Legth of chord/<End point>: l
Length of chord: 28.2

Atomi şi liste
Expresiile AutoLISP pot să răspundă oricăror cereri AutoCAD. În dialogul comenzilor
AutoCAD pot să apară cereri de numere reale, numere întregi, puncte, texte, selecŃii de obiecte,
nume de fişiere etc. Am enumerat mai sus o serie de tipuri de date, pe care expresiile AutoLISP
trebuie să le poată prelucra.
Ca orice program de desenare, AutoCAD are de-a face mai ales cu puncte, definite prin
coordonatele lor într-un sistem de referinŃă. Pentru a răspunde în AutoCAD unei cereri de punct,
AutoLISP formează o listă cu doi sau trei reali, reprezentând coordonatele x, y, z ale punctului;
astfel, exprimarea în AutoLISP a punctului de coordonate x = 10, y = − 20, z = 30.7 este prin lista
(10 –20 30.7).
Listele se prelucrează şi se generează prin funcŃii AutoLISP specifice. Iată un exemplu, probat
la prompt-ul Command: din AutoCAD, prin care se generează lista (10 −20 30.7):
Command: (list 10 −20 30.7)
(10 −20 30.7)
Valoarea returnată de funcŃia list este o listă compusă din valorile argumentelor sale. FuncŃia
list admite oricâte argumente, dar pentru reprezentarea punctelor sunt necesare 2 sau 3
argumente de tip întreg sau real. În exemplul următor, se leagă lista la variabila pt, iar apoi
această variabilă este utilizată într-o cerere de punct pentru comanda line din AutoCAD:
Command: (setq pt (list 10 −20 30.7))
(10 −20 30.7)
Command: line
From point: !pt
To point: (list 100 100)
To point: Enter
Reprezentarea liniei poate fi provocată şi printr-o expresie AutoLISP de tipul:
Command: (command “line” pt (list 100 100) “”)
unde trebuie remarcat faptul că variabila pt nu cere ghilimele! Ghilimele sunt folosite atunci
când parametri de transmis AutoCAD-ului, la utilizarea funcŃiei command, nu trebuie evaluaŃi de
interpretorul AutoLISP.

În AutoLISP există două categorii majore de obiecte: atomii şi listele. Un atom este cel mai
simplu obiect în AutoLISP. Un atom poate fi un întreg, un număr real, un şir, o funcŃie
AutoLISP predefinită, sau orice alt tip de obiect din tabelul alăturat.

Tipul atomului Exemple Tip de dată AutoLISP


Nume de variabilă (simbol) pi, a, pt SYM
Şir ″exemplu″ STR
Întreg 2, -4 INT
Real 3.14, 0.2, -84.7665 REAL
Descriptor de fişier <File: #a82> FILE
Nume de entitate AutoCAD <Entity name: 37e0520> ENAME

M03-4
Modul 03 Universitatea “Petru Maior” Tg.Mureş
LecŃia nr. 1 Centrul de Instruire CAD&CAM

Set de selecŃie AutoCAD <Selection set: 1> PICKSET


FuncŃii <Subr: #22a3e24> SUBR
FuncŃii ADS <Ext. Subr: 1 #3a970498> EXSUBR

Există o regulă simplă de a determina dacă un obiect este un atom sau o listă: dacă obiectul nu
este închis între paranteze, atunci el este un atom; altfel este o listă.
Listele sunt expresii complexe care includ atomi şi/sau alte liste. Listele au reguli sintactice
stricte, dar simple:
• o listă trebuie închisă între paranteze;
• pentru orice listă care trebuie evaluată, primul element al listei trebuie să fie o funcŃie;
• obiectele din listă trebuie separate cu cel puŃin un spaŃiu.
Iată într-o formă tabelară, câteva exemple de liste:

Lista Nr. Tipul elementelor din listă


elemente
(1 2 3) 3 Numerele întregi: 1, 2 şi 3
(+ 1 2.5) 3 FuncŃia +, întregul 1 şi realul 2.5
(+ 1 (/ 5 2.0)) 3 FuncŃia +, întregul 1 şi lista (/ 5 2.0)
(setq pt (list 1 2 3)) 3 FuncŃia setq, variabila pt şi lista (list 1 2 3)
() 0

Toate obiectele din AutoLISP sunt fie atomi fie liste. Un atom nu poate fi niciodată listă, iar o
listă nu poate fi niciodată atom. Cu excepŃia lui nil. Câteva aspecte legate de nil au fost deja
prezentate într-un paragraf precedent.
Obiectul nil este o listă vidă. Prin convenŃie, nil este simultan atom şi listă. El poate fi
exprimat în două feluri: ( ) sau nil.
În AutoLISP nil este echivalent cu fals. Multe funcŃii în AutoLISP testează dacă o condiŃie este
falsă sau adevărată; de exemplu dacă valoarea unui număr este egală cu zero. Întotdeauna când
rezultatul unui test este “fals”, AutoLISP returnează nil ca valoare a testului efectuat.
nil este singurul obiect AutoLISP care corespunde lui “fals”; în opoziŃie, ceea ce nu este fals,
este “adevărat”.

Evaluarea
Evaluarea este procesul prin care AutoLISP determină valoarea unui obiect. Sunt supuşi
evaluării atât atomii cât şi listele. În AutoLISP fiecare obiect are o valoare. Prin evaluare,
AutoLISP determină valoarea obiectului şi returnează acea valoare.
Atomii sunt obiecte simple, evaluate după o regulă simplă în funcŃie de tipul lor. Cei mai mulŃi
atomi sunt evaluaŃi la valorile lor în sine. Valoarea unei variabile este egală cu ultima valoarea
legată ei. Câteva exemple de evaluare sunt date în tabelul de mai jos.
Pentru orice listă care trebuie evaluată, primul element din listă trebuie să fie o funcŃie. Listele
se evaluează în funcŃie de regulile date de primul element din listă. În general, paşii de evaluare
sunt:
• AutoLISP priveşte la primul element; el trebuie să fie o listă. Dacă primul element nu
este o listă, atunci AutoLISP va genera un mesaj de eroare. Elementele care urmează
funcŃiei într-o listă sunt argumentele funcŃiei – adică datele asupra cărora operează
funcŃia.
• AutoLISP evaluează funcŃia pentru a şti cum să proceseze argumentele care îi urmează.
Pentru o anume funcŃie, numărul şi tipul argumentelor admise trebuie respectat – altfel,

M03-5
Modul 03 Universitatea “Petru Maior” Tg.Mureş
LecŃia nr. 1 Centrul de Instruire CAD&CAM

AutoLISP returnează un mesaj de eroare. Pentru a le putea procesa, AutoLISP evaluează


de la stânga la dreapta şi argumentele în sine - care pot fi de tip atom sau listă.
• AutoLISP returnează valoarea listei.
Exemple de evaluare a unor atomi sau liste:
Atom / listă de evaluat Valoare ObservaŃii
returnată
″text″ ″text″ Atom de tip şir, evaluat la sine însăşi
(setq a 1) 1 Se returnează valoarea legată variabilei
A 1 Se returnează valoarea legată variabilei
(1 2 3) Mesaj de eroare Primul element nu este o funcŃie
(+ 1 2 3) 6 Se returnează întregul 6
(list 1 2 (+ 2.5 0.5)) (1 2 3.0) Se returnează o listă cu doi întregi şi un real

Rezumat
• AutoLISP este un limbaj de programare asociat lucrului exclusiv în AutoCAD; acest
limbaj este parte integrantă a programului AutoCAD.
• Încercările AutoLISP pot fi efectuate la prompt-ul Command: al AutoCAD-ului. Pot fi
astfel efectuate calcule aritmetice, utilizând expresii AutoLISP cu o sintaxă mai specială,
dată de lucrul cu multe paranteze. FuncŃiile aritmetice uzuale folosite în AutoLISP sunt:
+, −, /, *, sqrt, expt, sin, cos, atan.

• În AutoLISP pot fi folosite variabile; funcŃia AutoLISP care permite atribuirea de valori
unei variabile, este setq. Evaluarea unei variabile la prompt-ul Command al AutoCAD-
ului, este posibilă cu utilizarea semnului “!”. La începerea unei noi sesiuni AutoCAD, se
pierd atribuirile făcute în sesiunea precedentă.
• Cererile AutoCAD pot fi satisfăcute prin răspunsuri cu expresii AutoLISP. Fiecărui tip
de cerere trebuie să i se răspundă cu un tip de dată corespunzător: unei cereri de rază i se
poate răspunde cu un real sau un întreg, unei cereri de punct i se poate răspunde cu o
listă, unei cereri de obiect i se răspunde cu un nume de obiect sau un set de selecŃie etc.
• AutoLISP lucrează cu două tipuri majore de obiecte: atomi şi liste. . Un atom poate fi un
întreg, un număr real, un şir, o funcŃie AutoLISP predefinită etc. Există o regulă simplă
de a determina dacă un obiect este un atom sau o listă: dacă obiectul nu este închis între
paranteze, atunci el este un atom; altfel este o listă.
• Evaluarea este procesul prin care AutoLISP determină valoarea unui obiect. Sunt supuşi
evaluării atât atomii cât şi listele. În urma evaluării, AutoLISP returnează valoarea
determinată. Pentru orice listă care trebuie evaluată, primul element din listă trebuie să
fie o funcŃie.

M03-6