Sunteți pe pagina 1din 126

2

Visual LISP/AutoLISP

Prof. dr. ing. Gheorghe OANCEA

CAPITOLUL 1

MEDIUL VISUAL LISP


1.1 Aspecte generale privitoare la mediul Visual LISP
AutoLISP este un dialect al limbajului LISP, conceput special pentru
editorul de desenare AutoCAD.
LISP este o abreviere de la LISt Processing (sau LISt Programming) i este
specializat n prelucrarea listelor. Este un limbaj de programare de nivel nalt
bine cunoscut pentru aplicaiile sale n domeniile de vrf, cum ar fi: sisteme
expert, inteligen artificial i baze de cunotine [ 1, 3, 4, 5, 6, 7] .
Prima implementare a limbajului LISP dateaz din anii 1950. Astzi, pe
plan mondial, exist mai multe dialecte ale acestuia, cum ar fi: Common Lisp,
FranzLisp, MuLisp, XLisp etc [1, 4 ,5].
nc de la primele versiuni de AutoCAD (versiunea 2.1 1980), limbajul
AutoLISP s-a constituit ntr-un standard de dezvoltare a aplicaiilor ce ruleaz
sub AutoCAD [3].
AutoLISP-ul posed faciliti deosebite care atrag att programatorii
profesioniti ct i pe cei ocazionali.
Principalele caracteristici ale limbajului sunt [1, 7]:
AutoLISP are o filozofie simpl i uor de neles;
are o sintax simpl i riguroas; mecanismul de evaluare a liniilor de
program este uor de neles aa cum este i sintaxa pentru definirea
expresiilor utilizate n acestea;
limbajul de programare este de tip interpretor, rezultatele obinute pot fi
vizualizate interactiv n cadrul editorului de desenare AutoCAD;
este un limbaj funcional deoarece n cadrul programelor pot fi definite
numai subprograme de tip funcie;
AutoLISP-ul este perfect compatibil cu AutoCAD-ul fr a fi necesare alte
programe de interfaare;
programatorul poate s scrie uor funcii structurate i le poate combina
pentru a crea programe complexe;
conine un set puternic de funcii grafice specializate;
programele scrise n AutoLISP pot reprezenta noi funcii definite de
programator, sau noi comenzi AutoCAD;
ofer o serie de faciliti (funcii) suplimentare fa de limbajul LISP
clasic, care uureaz munca programatorului;
AutoLISP-ul permite iteraii i recursivitate; funciile definite de
programatori pot utiliza funciile standard, condiionale i repetitive, i pot
fi definite astfel nct s se poat apela pe ele nsele.

Visual LISP/AutoLISP

ncepnd cu anul 2000, pachetul AutoCAD a inclus mediul Visual LISP


(VLISP) care se constituie n urmtoarea generaie de LISP pentru sistemul
AutoCAD[3]. VLISP este un mediu integrat de dezvoltare a aplicaiilor
(Integrated Development Environment - IDE) care are o serie de faciliti pentru
editarea, compilarea, testarea, rularea i depanarea programelor AutoLISP i
casetelor de dialog. Pentru AutoCAD Release 14, Visual LISP este un mediu de
sine stttor, dezvoltat n limbajul C, iar pentru folosirea acestuia trebuie
ncrcat aplicaia aferent n AutoCAD.
Pn la nglobarea VLISP-ului n AutoCAD, dezvoltarea programelor
AutoLISP se realiza prin scrierea codului surs n diverse editoare de texte
externe, ncrcarea lui n AutoCAD i apoi lansarea n execuie a aplicaiilor.
Depanarea programelor mari, cu multe subprograme, era deosebit de anevoioas
oblignd programatorul s fac diverse artificii pentru corectarea erorilor.
Mediul VLSIP, prin componentele ce le nglobeaz, elimin neajunsurile
semnalate mai sus, permind o depanare uoar a programelor. Principalele
caracteristici ale acestuia sunt urmtoarele [3]:
editarea programelor se realizeaz prin intermediul unui editor propriu
care utilizeaz culori diferite la scrierea categoriilor de simboluri
AutoLISP sau DCL i are faciliti de control (cutare, mperechere) a
parantezelor;
rearanjarea programelor n pagin poate fi uor realizat astfel nct
acestea s devin lizibile;
realizeaz verificarea sintaxei programelor prin recunoaterea
construciilor incorecte, argumentelor greite la apelarea diverselor funcii
etc.;
compilarea fiierelor conduce la mrirea vitezei de rulare a aplicaiei i la
mrirea gradului de securitate a programelor;
permite lucrul cu proiecte care de regul conin mai multe fiiere; la
compilarea acestora, fiierele sunt nglobate ntr-un singur modul;
depanarea aplicaiilor permite, printre altele, rularea pas cu pas a acestora
n timp ce pe ecran pot fi afiate rezultatele ntr-o fereastr desen
AutoCAD, oprirea rulrii programelor n punctele dorite i cercetarea
valorilor anumitor simboluri n cursul execuiei;
accesul la valorile simbolurilor (date AutoLISP, entiti AutoCAD) i
expresiilor se realizeaz prin ferestre de tip Watch;
nlocuiete fereastra text a AutoCAD-ului cu fereastra Visual LISP
Console care furnizeaz i o serie de faciliti suplimentare la tastarea
expresiilor simbolice;
ofer asisten prin sistemul de Help implementat care este de tip context
sensitive.

Prof. dr. ing. Gheorghe OANCEA

n concluzie, Visual LISP-ul este un mediu foarte puternic, prin intermediul


lui se poate mbunti modul de lucru n AutoCAD, particulariznd sistemul de
proiectare n funcie de cerinele utilizatorului.
1.2 Lansarea n execuie a mediului Visual LISP
Visual LISP ca mediu interactiv de dezvoltare a aplicaiilor AutoLISP,
ruleaz separat de restul AutoCAD-ului ntr-o serie de ferestre proprii. Acesta
are trsturile specifice unei aplicaii care ruleaz sub sistemul de operare
Windows. Pentru lansarea n execuie a VLISP-ului, mai nti se lanseaz
AutoCAD-ul i apoi se alege comanda Visual LISP Editor din submeniul
AutoLISP poziionat n submeniul Tools al AutoCAD-ului (figura 1.1a), sau se
tasteaz n zona prompter-ului Command: comanda vlisp sau vlide (figura 1.1b).
Dup lansarea n execuie, pe ecran apare mediul VLISP, prezentat n figura 1.2,
care are o configuraia de ferestre n funcie de la ultima rulare a acestuia.

a) Accesare din meniul desfurtor al AutoCAD-ului.

b) Accesare din zona prompter-ului Command: .


Fig. 1.1 Lansarea n execuie a VLISP-ului.

Pictograme

Fig. 1.2 Componentele mediului VLISP.


Linia
de
stare

Ferestre de
editare
a
programelo

Meniul
desfurtor
Fereastra
Visual
LISP

Fereastr
a

Fereastr
a
Build

Visual LISP/AutoLISP

Prof. dr. ing. Gheorghe OANCEA

1.3 Componentele mediului Visual LISP


La prima lansare a VLISP-ului, pe ecran pot fi identificate urmtoarele
componente: meniul desfurtor aflat pe a doua linie a mediului, mai multe
grupuri de butoane (toolbars-uri) plasate de regul pe urmtoarele linii ale
mediului, o linie de stare (Status Bar), fereastra consol (Visual LISP Console
Window) i o fereastr denumit Trace. n timpul utilizrii mediului, la
compilarea programelor, pe ecran apare i fereastra Build Output.
Meniul desfurtor conine mai multe submeniuri n care sunt plasate
comenzile mediului care pot fi lansate n execuie de ctre utilizator. Sunt 9
submeniuri: File, Edit, Search, View, Project, Debug, Tools, Window i Help.
Comenzile pot fi lansate n execuie i de pe liniile de pictograme
poziionate, de regul, imediat sub meniul desfurtor. Exist 5 grupuri de
pictograme: Standard, Search, Tools, Debug, i View care reprezint grupuri
funcionale de comenzi VLISP.
Linia de stare este plasat pe ultima linie a mediului i afieaz informaii
despre locul n care se gsete cursorul n mediul VLISP.
Fereastra Visual LISP Console este utilizat att pentru tastarea expresiilor
simbolice AutoLISP ca i n zona prompter-ului Command: al AutoCAD-ului,
ct i pentru afiarea mesajelor funciilor AutoLISP princ, print etc. Tot n
aceast fereastr sunt afiate diverse mesaje la rularea i depanarea programelor.
Fereastra Trace, la prima lansare a mediului, este minimizat. Aici se
afieaz mesaje de informare a utilizatorului asupra versiunii de Visual LISP i
eventualele erori ce apar la lansarea n execuie a VLISP-ului. n plus, aceast
fereastr, poate s conin o serie de informaii referitoare la interaciunea
mediului VLISP cu AutoCAD-ul, starea subprogramelor apelate i starea stivei.
Fereastra Build Output conine mesajele ce apar la: verificarea sintactic a
programelor AutoLISP, compilarea fiierelor surs, compilarea proiectelor i
compilarea aplicaiilor independente.
1.3.1 Fereastra Visual LISP Console
n fereastra Visual LISP Console se pot introduce i evalua expresii
simbolice AutoLISP ca i n zona prompter-ului Command: al AutoCAD-ului.
Exist ns cteva diferene ntre cele dou ferestre. De exemplu, pentru a afla
valoarea atribuit unui simbol, pe prompter-ul Command: se tasteaz semnul de
exclamare (!) i numele simbolului iar n fereastra Visual LISP Console se
tasteaz direct numele simbolului. Prompter-ul ferestrei Visual LISP Console
este _$.
Principalele faciliti oferite de fereastra Visual LISP Console sunt [3]:

Visual LISP/AutoLISP

evaluarea expresiilor AutoLISP i afiarea imediat a valorilor returnate de


acestea;
afiarea mesajelor la rularea programelor;
introducerea expresiilor AutoLISP scrise pe mai multe linii (trecerea la
linia urmtoare se realizeaz prin apsarea combinaiei Ctrl-Enter);
evaluarea mai multor expresii simbolice n acelai timp;
copierea i transferarea textelor ntre ferestrele de editare i fereastra
Visual LISP Console;
repetarea comenzilor anterior introduse (se tasteaz Tab sau Shift Tab
pentru parcurgerea ntr-un sens sau altul istoricul de comenzi introduse);
renunarea la textul curent introdus apsndu-se tasta ESC;
apsndu-se combinaia Shift-F10 sau butonul din dreapta mouse-ului, se
afieaz meniul contextual al ferestrei Visual LISP Console care conine
comenzi specifice de editare, depanare, inspectare a simbolurilor etc.;
se poate memora activitatea desfurat n fereastr ntr-un fiier cu
extensia LOG, ulterior acest fiier poate fi rencrcat n mediu i
comenzile salvate sunt automat executate.

Prof. dr. ing. Gheorghe OANCEA

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

n momentul n care AutoCAD-ul ntlnete o expresie simbolic (o


parantez rotund deschis tastat pe prompter-ul Command:), pred controlul
AutoLISP-ului care evalueaz expresia i i returneaz rezultatul.
Exemplu:
Command: (+ 1 2)

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

Prof. dr. ing. Gheorghe OANCEA

11

Observaie: n fereastra Visual LISP Console a mediului Visual LISP, valorile


atribuite diverselor simboluri, se obin prin tastarea numelui simbolului fr ca
acesta s fie precedat de caracterul special semn de exclamare.
Expresiile simbolice pot fi utilizate i ca rspunsuri la cereri ale
AutoCAD-ului, adic pe alte promptere dect Command: .
Exemple:
1. Dac se dorete trasarea unui cerc cu centrul n punctul 30,30 i de raz 2*
atunci se tasteaz:
Command: Circle
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:30,30
Specify radius of circle or [Diameter]: (* 2 pi)
2. Dac simbolului p1 i se atribuie o list cu elementele 100 i 100 prin expresia:
Command: (setq p1 (list 100 100))
(100 100)
atunci se poate scrie:
Command: Circle
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:!p1
Specify radius of circle or [Diameter]: D
Specify diameter of circle: (/ 156.41 3.12)
Pe ecran se observ c a fost trasat un cerc cu centrul n punctul p1 (de
coordonate 100,100) i de un diametru rezultat n urma evalurii expresiei
156.41/3.12.
Se observ c n acest ultim exemplu au fost utilizate cele dou modaliti
de predare a controlului (din AutoCAD) AutoLISP-ului.
2.3 Tipuri de date n AutoLISP
n AutoLISP se ntlnesc dou tipuri de date i anume atomi i liste.
Atomii sunt date primare care respect proprietatea de indivizibilitate, iar listele
sunt date complexe care sunt compuse din atomi i/sau liste. Spre deosebire de
atomi, listele pot fi descompuse n elementele componente. Regula general care
caracterizeaz cele dou tipuri de date este urmtoarea: tot ce este atom nu este
list i invers, tot ce este list nu este atom.
n continuare se prezint cele dou tipuri de date:
atomii sunt reprezentai n sintaxele funciilor prin <atom>, pot fi:
numerici reprezentai n sintaxe prin <nr>, sunt de dou feluri:

12

Visual LISP/AutoLISP

- ntregi, sunt toate numerele care nu conin punct zecimal; intervalul de


valori utilizat de AutoLISP este -2 147 483 648 . . +2 147 483 647,
exemple: 12, 137, -443;
- reali, sunt reprezentate n dubl precizie cu 14 cifre semnificative
exemplu 23.45, 12e34 (12*1034);
iruri de caractere reprezentate n sintaxe prin <ir>, sunt delimitate de
ghilimele, de exemplu AutoCAD \nIntrod. Punctul P1:;
simboluri reprezentate n sintaxe sub forma <simbol>, acestea pot fi
variabile i statice, cele variabile sunt identificatori (nume) de variabile
i funcii, definite de programator, reprezentate prin iruri de caractere
fr ghilimele, primul caracter fiind de regul o liter (dar nu n mod
obligatoriu); cele statice desemneaz funcii AutoLISP standard (se
observ c n acest limbaj de programare pn i funciile predefinite sunt
considerate ca tip de date - atomi), de exemplu: -, +, *, /, SETQ, GETINT,
ENTNEXT, etc;
nume de entiti, acestea sunt asociate entitilor generate n AutoCAD,
sunt de forma <Entity name: xxxxxxx>, iar n sintaxe se utilizeaz
<nume_ent>;
mulimi de selecie, au forma <Selection set: xxx> i sunt de fapt colecii
de nume de entiti (a nu fi confundate cu listele), n sintaxe se utilizeaz
<m_sel>;
descriptori de fiier sunt de forma <df> i sunt utilizai pentru gestionarea
fiierelor text din AutoLISP.
listele, reprezentate n sintaxe prin <1ista>, sunt de dou feluri: liste normale
i liste speciale.
Listele normale au urmtoarea sintax general:
(<elem1> <elem2> ..... <elemn>)
unde: <elem1>, <elem2>,..... <elemn> sunt elementele ce compun o list (pot fi
atomi i/sau liste), ele trebuind s fie separate de cel puin un spaiu.
Reamintim c dac pe prima poziie a unei liste se gsete o funcie
AutoLISP (standard sau definit de programator), atunci aceasta se numete
expresie simbolic i este un caz particular de list.
Exemple:
(1 2 3)
(a b c)
(1 2 3 (4 6) 56)
(+ 90 (* 56.78 (/ 89 4.1) 23) 10)
(* x y (+ z t) a b)
Exist n AutoLISP i liste speciale, denumite perechi cu punct
reprezentate <pp>, au forma general (<e1> . <e2>). Acestea, dup cum se

Prof. dr. ing. Gheorghe OANCEA

13

poate observa, conin dou elemente separate de un punct, i sunt utilizate de


regul la reprezentarea listelor asociate entitilor AutoCAD.
Numrul de elementele al listelor se determin cu ajutorul unei funcii
specializate dar i prin numrare.
Exemple:
(x y) are 2 elemente (2 atomi),
(+ 10 20) are 3 elemente (3 atomi),
(+ (* 45 67) (+ 34 89.0) 67) are 4 elemente (2 atomi i 2 liste),
(+ 90 (* 56.78 (/ 89 4.1) 23) 10 (- 10.23 5.67) ) are 5 elemente (3 atomi i
2 liste).
Este predefinit i un simbol special, denumit nil, care este att atom ct i
list, fiind singurul care nu se satisface regula enunat mai sus. Reprezentarea
lui nil ca list este ( ), adic lista vid cu zero elemente. Prin nil se nelege n
AutoLISP fals, nimic, nul.
Observaii:
1. Numele unui identificator utilizat n AutoLISP, nu poate s conin
urmtoarele caractere (, ), , , ., ; i nu poate fi format numai din caractere de tip
cifr. Caracterele utilizate la scrierea identificatorilor pot fi mari sau mici
deoarece limbajul nu este de tip case sensitive.
2. Dac un ntreg depete intervalul alocat (-2147483648 .. +2147483647)
atunci acesta este transformat automat n real.
3. Comentariile n AutoLISP sunt scrise dup caracterul ; .

2.4 Evaluarea expresiilor AutoLISP


Evaluarea este mecanismul prin care AutoLISP-ul determin valoarea
unui atom sau a unei expresii simbolice.
2.4.1 Evaluarea atomilor
Atomii de tip ntreg, real, ir de caractere i nume de funcii sunt evaluai
prin valoarea lor. Spre exemplu, atomul ntreg 10 va fi evaluat prin valoarea 10,
atomul real 1.3 va fi evaluat prin valoarea 1.3 i atomul de tip ir de caractere
ACAD va fi evaluat prin valoarea ACAD. Pentru exemplificarea acestui
lucru, se tasteaz n AutoCAD !10, !1.3, !ACAD iar n VLISP (n fereastra
Visual LISP Console) direct atomii respectivi.

14

Visual LISP/AutoLISP

Simbolul se evalueaz prin valoarea lui curent (ultima valoare atribuit)


sau prin nil (atomul nul) n cazul n care acesta nu are atribuit o valoare. Se pot
atribui valori anumitor simboluri cu ajutorul funciei setq sau set.
Sintax:
(SETQ <simbol1> <expresie1> [ <simbol2> <expresie2>... ])
Aceast funcie atribuie simbolurilor <simbol1>,<simbol2>, ....<simboln>,
valorile rezultate n urma evalurii expresiilor simbolice
<expresie1>,
<expresie2>... <expresien>. Pe lng aceste aciuni, funcia returneaz valoarea
ultimei atribuiri.
Exemple:
1. Dac n zona prompter-ului Command: se tasteaz expresia:
(setq x 3.4 z 2 text AutoCAD)
atunci se atribuie variabilelor x, z i text valorile indicate. Iar dac n continuare
se tasteaz n AutoCAD !x !z !text iar n VLISP (n Visual LISP Console)
direct numele variabilelor respective atunci se vor obin valorile curente ale
simbolurilor x, z i text.
2. Dac se dorete atribuirea unor valori rezultate n urma evalurii unor expresii
simbolice atunci se poate considera urmtorul exemplu:
(setq a (* x (+ 5 z))
b (* z pi)
p1 (list a b (+ a b z))
)
n urma tastrii expresiei de mai sus, a primete valoarea expresiei x*(5+z), b
valoare a lui z* iar p1 va fi o list format din trei elemente.
Simbolurile protejate la atribuire (n principal simbolurile standard, nil, T,
pause i acele simboluri protejate de utilizator n VLISP) care apar ca argumente
impare la apelarea funciei setq, genereaz mesaje de genul celor din figura 2.2.

Fig. 2.2 Mesajul afiat la ncercarea de atribuire a simbolului protejat pi.

Prof. dr. ing. Gheorghe OANCEA

15

Dac n zona prompter-ului Command: se tasteaz expresia (setq pi 123)


atunci pe ecran apare mesajul implicit din figura 2.2 care ntreab utilizatorul
dac se introduce o bucl de ntrerupere. Dac se rspunde cu No simbolul
protejat i modific valoarea, iar dac se rspunde cu Yes atunci este generat n
VLISP o bucl de ntrerupere (ca i n cazul depanrii programelor n VLISP).
Dac se iese din bucl cu comenzile Reset to Top Level sau Quit to Current
Level atunci simbolul nu-i modific valoarea, iar dac se iese cu Continue
atunci simbolul i modific valoarea.
Pentru a preciza ce s rspund AutoLISP-ul (ce mesaj s afieze) la
ncercarea de modificare a simbolurilor protejate, se apeleaz comanda Tools/
Environment Options/General Options din meniul mediului Visual LISP. De
regul utilizatorul seteaz afiarea unei erori.
Observaie: Pentru atribuirea valorilor se poate utiliza i funcia set care este
prezent la finalul prezentului subcapitol.
2.4.2 Evaluarea expresiilor simbolice (listelor)
Pentru ca o list s poat fi evaluat, trebuie ca aceasta s fie o expresie
simbolic, adic primul element s fie numele unei funcii AutoLISP.
2.4.2.1 Funcii aritmetice predefinite
n AutoLISP exist o serie de funcii matematice predefinite care permit
efectuarea diverselor calcule matematice. Fa de alte limbaje de programare, cel
pe care l prezentm n lucrarea de fa, trateaz toate operaiile aritmetice ca
funcii. Deci vom vorbi despre funcia i nu operaia de: adunare, scdere,
nmulire, mprire, etc.
Funcia de adunare +
Sintax:
(+ [ <nr1> ... <nrn> ])
Returneaz suma tuturor simbolurilor numerice indicate ca argumente.
Exemple:

(+ 2 3 4)9
(+ 2 1.0)3.0
(+ 3)3
(+)0

16

Visual LISP/AutoLISP

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 scdere -
Sintax:
(- [ <nr1> ... <nrn> ])
Returneaz diferena iterativ a simbolurilor numerice date ca argumente,
adic din primul argument se scade suma celorlalte.
Exemple:

(- 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.

simbolurilor de tip numeric date ca

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> ])

Prof. dr. ing. Gheorghe OANCEA

17

Funcia returneaz mprirea iterativ a simbolurilor numerice date ca


argumente, adic se mparte primul argument la produsul celorlalte.
Exemple:

(/ 1 2)0
(/ 1 2.0)0.5
(/ 2 2 4.0)0.25
(/ 4.0)4.0

Se observ c dac toate numerele sunt ntregi, atunci rezultatul este


ntreg (mprire ntreag), iar dac cel puin un argument este un real, atunci
rezultatul este real (mprire real). Funcia de mprire trebuie utilizat cu
atenie deoarece pot s apar rezultate eronate (dac toate argumentele sunt
ntregi, n loc de mprire real se efectueaz o mprire ntreag). Dac
funciei nu i se indic argumente, atunci este returnat valoarea 0.
Funcia 1+
Sintax:
(1+ <nr>)
Funcia returneaz valoarea argumentului incrementat cu o unitate. Tipul
rezultatului este identic cu al argumentului (ntreg sau real).
Exemple:

(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

Funcia abs returneaz valoarea absolut (modulul) a argumentului. Tipul


rezultatului este identic cu cel al argumentului.
Exemple:

(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:

Prof. dr. ing. Gheorghe OANCEA

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:

(max -23 3 1.0 8 9)9.0


(max 20 21 0 30)30
(max)0

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.

Prof. dr. ing. Gheorghe OANCEA

Exemple:

21

(min -23 3 1.0 8 9)-23.0


(min 20 21 0 30)0
(min)0

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

2.4.2.2 Funcii trigonometrice predefinite


Funcia SIN
Sintax:
(SIN <unghi>)
Aceast funcie returneaz valoarea sinusului din argumentul <unghi> ca
un numr real. Se consider c unghiul dat ca argument funciei sin, se indic n
radiani.
Exemple:
(sin (/ pi 2))1.0
(sin (/ pi 6))0.5
Funcia COS
Sintax:
(COS <unghi>)
Funcia cos returneaz valoarea cosinusului de <unghi> ca un real. Se
consider c unghiul se indic n radiani.
Exemple:

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

Dac ambele argumente exist, funcia returneaz, n radiani, valoarea


expresiei matematice atan (nr1/nr2). Dac argumentul <nr2> are valoarea zero,

atunci rezultatul va fi n funcie de semnul lui <nr1>.


2
Exemple:

(atan 2.0 3.0)0.463648


(atan 2.0 -3.0)2.55359
(atan -2.0 -3.0) -2.55359
(atan -0.5 0.0) -1.5708
(atan 0.5 0.0) 1.5708

2.4.2.3 Funcii de gestionare a simbolurilor

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 ( ).

Prof. dr. ing. Gheorghe OANCEA

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)

expresiile de mai sus sunt echivalente cu:


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

Visual LISP/AutoLISP

(eval 3.0) 3.0


(eval (sin (/ pi 6))) 0.5
(eval b) 2.0
(eval x) AutoLisp
(eval y) 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

Prof. dr. ing. Gheorghe OANCEA

25

(type nil) nil

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:

(set x (+ 5 23 (* pi 3))) 37.4248


(set (read y) 10) 10

Prin tastarea expresiilor de mai sus, variabilele x i y memoreaz valorile


37.4248 i respectiv 10.
Funcia READ
Sintax:

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.

Prof. dr. ing. Gheorghe OANCEA

27

2.5 Reprezentarea punctelor AutoCAD n AutoLISP

Este cunoscut faptul c AutoCAD-ul folosete un sistem cartezian de


coordonate pentru a descrie punctele 2D sau 3D n baza de date a desenului.
Un punct 3D este o asociere de trei numere reale, fiecare corespunznd
distanei de la originea sistemului de coordonate de-a lungul axelor X,Y i Z.

Coordonata
X

Coordonata
Y

Coordonata
Z

Fig. 2.3 Reprezentarea unui punct AutoCAD.


Pentru definirea unui punct 3D de coordonate 1,2,3 AutoCAD-ul permite
utilizatorului s l indice prin mai multe metode: coordonate carteziene absolute,
coordonate carteziene relative, coordonate polare absolute, coordonate polare
relative, moduri OSNAP, filtre etc. Reprezentarea intern (n baza de date a
AutoCAD-ului) a oricrui punct, indiferent de metoda prin care a fost descris, se
reduce la o asociere de trei numere reale.

Coordonata
X=1.0

Coordonata
Y=2.0

Coordonata
Z=3.0

Fig. 2.4 Reprezentarea punctului de coordonate 1.0, 2.0, 3.0 .


AutoLISP-ul interpreteaz punctele AutoCAD sub forma unor liste de
dou numere reale dac punctul este 2D sau trei numere reale dac punctul este
3D, n care primul element al listei este coordonata X, al doilea este coordonata
Y, iar al treilea element, dac exist, reprezint coordonata Z.
Punctul AutoCAD de coordonate 1,2,3 este exprimat n AutoLISP sub
forma listei (1.0 2.0 3.0).

Visual LISP/AutoLISP

28

(1.0 2.0 3.0)


Punctul 3D 1,2,3 ca un obiect AutoLISP

Fig. 2.5 List AutoLISP care reprezint un punct AutoCAD.


Listele aferente punctelor AutoCAD pot fi generate cu ajutorul funciei
quote (prin inhibarea mecanismului de evaluare) n cazul n care coordonatele
acestora rezult prin evaluarea unor atomi numerici, sau cu ajutorul funciei list
n cazul n care coordonatele rezult n urma evalurii unor expresii simbolice,
variabile sau atomi numerici.
Funcia LIST
Sintax:
(LIST [ <expr1> <expr2>.....<exprn> ])
Funcia list are ca argument una sau mai multe expresii simbolice i
returneaz lista format din valorile rezultate n urma evalurii expresiilor
simbolice. List apelat fr argumente returneaz nil.
Exemple:
(setq a 1 b 2 c 3)
(list a b c)(1 2 3)
(list a (c d) b)(1 (c d) 2)
(1 2 3)(list 1 2 3)
Exemple de generare a punctelor cu ajutorul funciei list:
(setq p1 (list (+ 1 a) (+ 1 b))) (2 3)
(setq p2 (list (+ a b c) (* 2 b c) (- a b c))) (6 12 -4)
Exemple de generare a punctelor cu ajutorul funciei quote:
(setq p3 (100 100))(100 100)
(setq p4 (-34 10 19)) (-34 10 19)
Avnd definite punctele de mai sus, ele pot fi utilizate la trasarea unor
entiti n AutoCAD care solicit diverse puncte.
1. Exemplu pentru trasarea unei linii ntre punctele P2 i P4:
Command: Line
Specify first point: !p2
(6 12 -4)
Specify next point or [Undo]: !p4

Prof. dr. ing. Gheorghe OANCEA

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

2.6 Funcii de prelucrare a listelor

O list AutoLISP este reprezentat n memoria calculatorului sub forma


unui arbore binar. Orice zon a arborelui binar care conecteaz dou ramuri
poart numele de nod. Nodul este una din unitile de baz ale memoriei
gestionate de AutoLISP. Vrful unui arbore binar (primul nod al acestuia) poart
denumirea de nod rdcin.
Structura unei liste poate fi descompus nod dup nod pornind de la vrful
arborelui (nodul rdcin). Fiecare nod se descompune n dou ramuri
reprezentnd diferite pri ale listei: primul element al listei i restul listei cu
primul element eliminat.

Nodul rdcin
primul element al listei

list fr primul element

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

()

Fig. 2.8 Arborele binar complet al listei (1.0 2.0 3.0) .

Prof. dr. ing. Gheorghe OANCEA

31

(x (y z) t)
x

((y z) t)
(t)

(y z)

(z
)

()

()

Fig. 2.9 Arborele binar al listei (x (y z) t) .


P1=(x y z)

(car P1)x

(cdr P1)(y z)

(car (cdr P1))y


(car (cdr (cdr P1)))z

(cdr (cdr P1))(z)


(cdr (cdr (cdr P1)))( )
lista vid sau nil

Fig. 2.10 Reprezentarea sub forma car/cdr i arbore binar


al unei liste cu trei atomi.
Spre exemplificare, prima ramificare a listei (1.0 2.0 3.0) se prezint n
figura 2.7. Divizarea listei continu de-a lungul ramificaiilor acesteia pn cnd
pe ramura din dreapta se obine lista vid, adic nil.
n AutoLISP, cele dou pri ale unei ramificaii poart denumiri speciale.
Prima ramur, cea din stnga, este denumit car, iar cea de-a doua (ramura din
dreapta) este denumit cdr. Deci primul element al unei liste este elementul car
iar lista rezultat n urma ndeprtrii primului element este elementul cdr.

Visual LISP/AutoLISP

32

Pe ramura car se obine un atom sau o list, pe ramura cdr se gsete


ntotdeauna o list.
Arborele binar aferent unei liste compuse din elemente de tip atomi i liste
este reprezentat n figura 2.9.
Reprezentarea car i cdr a unei liste format din trei elemente de tip
atomi, ce a fost atribuit simbolului P1, este prezentat n figura 1.9.
Exist dou funcii, car i cdr, aferente celor dou ramuri ale arborelui
binar, care permit extragerea elementelor ce compun o list. Cele dou funcii
sunt nedistructive, adic nu altereaz elementele coninute de lista original.
Funcia CAR
Sintax:
(CAR <list>)
Funcia car returneaz primul element al listei argument sau nil dac lista
este vid. Tipul rezultatului poate fi atom sau list.
Funcia CDR
Sintax:
(CDR <list>)
Aceast funcie returneaz, spre deosebire de funcia car, lista rezultat
prin ndeprtarea primului element al listei indicat ca argument sau nil dac
lista este vid. n consecin rezultatul returnat este ntotdeauna list.
Cele dou funcii prezentate mai sus se apeleaz de regul repetat (de mai
multe ori) n cadrul unei expresii simbolice. Avnd n vedere acest lucru, pentru
a uura munca programatorului, AutoLISP-ul are predefinite funcii de forma
caadr, caddr, caaddr, cdddr, etc. Aceste funcii pot nlocui maxim patru
apeluri consecutive ale funciilor car i cdr.
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

Prof. dr. ing. Gheorghe OANCEA

33

Observaie: Expresiile (car ( )) (cdr ( )) returneaz atomul nil.

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)

Observaie: Funcia last pare a fi uor de utilizat n aflarea ultimei coordonate a


unui punct AutoCAD dar, n realitate nu se cunoate dac punctul este
reprezentat 2D sau 3D. n concluzie pentru aflarea acesteia, se vor utiliza
funciile car i cdr sau funciile abreviere ale combinaiilor acestora.

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:

Prof. dr. ing. Gheorghe OANCEA

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:
(setq note (4 7 4 5))
(subst 5 4 note) (5 7 5 5)

atunci se observ c variabila note nu se modific dar, funcia subst returneaz o


list derivat din elementele coninute note.
Observaie: Aceast funcie se utilizeaz de regul, n paralel cu assoc, la
prelucrarea listelor asociate entitilor pentru substituirea listelor sau perechilor
cu punct identificate prin chei DXF.

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:

(mapcar + (1 2 3) (10 20 30)) (11 22 33)


(setq a 1 b 2 c 3)
(mapcar 1+ (list a b c)) (2 3 4)
Ultima expresie este echivalent cu expresiile:
(1+ a)
(1+ b)
(1+ c)
Mapcar poate fi utilizat att pe funcii standard ct i pe cele definite de
programator.

Visual LISP/AutoLISP

36

2.7 Apelarea comenzilor AutoCAD din AutoLISP

Una dintre cele mai importante faciliti ale AutoLISP-ului const n


faptul c acesta permite apelarea comenzilor AutoCAD n mod direct. Se pot
utiliza expresii simbolice ca rspuns la opiunile comenzilor. Aceste aciuni pot
fi realizate prin intermediul funciei predefinite command.
Funcia COMMAND
Sintax:
(COMMAND [ <argumente> ])
Funcia command este cea care apeleaz o comand AutoCAD dintr-un
program AutoLISP i ntotdeauna returneaz nil. Ea fiind mijlocul principal de
acces din AutoLISP la desenele AutoCAD. Argumentele funciei, notate prin
<argumente> pot fi:
iruri de caractere care desemneaz comenzi AutoCAD, opiuni ale unor
comenzi, numere reale i puncte exprimate ca n zona prompter-ului
Command: al AutoCAD-ului (se pot indica punctele prin orice modalitate
cunoscut n AutoCAD);
numere reale sau ntregi necesare ca rspuns la anumite opiuni ale
comenzilor AutoCAD;
simboluri AutoLISP prin a cror evaluare se obin valori utilizate ca
rspuns la opiunile comenzilor apelate;
expresii simbolice prin a cror evaluare se obin iruri de caractere, puncte,
reali etc;
irul vid () care este echivalentul tastei enter din AutoCAD, apsat fr
a fi precedat de alte date;
simbolul special PAUSE, care suspend temporar comanda AutoLISP i
permite introducerea datelor direct de ctre utilizator, interactiv n
AutoCAD;
funcia apelat fr argumente permite renunarea la orice comand
AutoCAD, este echivalent cu apsarea tastei Esc.
n cazul funciei command intereseaz efectul obinut, deci nu valoarea
returnat de aceasta. Principalul efect al funciei este acela de modificare a strii
desenului curent.
Observaie: Funcia command, evalueaz fiecare argument pe care l transmite
apoi AutoCAD-ului ca rspuns la prompter-ele succesive pe care acesta le
afieaz n zona Command:.

Prof. dr. ing. Gheorghe OANCEA

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

Fig. 2.11 Model 3D generat cu AutoLISP-ul.

38

Visual LISP/AutoLISP

6. Pentru a obine modelul 3D din figura 2.12 parametrizat cu simboluri


(n care sunt memorate date constante) se genereaz o polilinie plan cu coluri
rotunjite care se extrudeaz cu tapper angle care poate fi diferit de 0. n final se
seteaz direcia de privire 1,1,1 i apoi ascund liniile invizibile aferente
modelului 3D generat. Modelul este generat cu parametrii: lx - lungimea pe x, ly
- lungimea pe y, lz - lungimea pe z, r - raza de racordare a poliliniei, u unghiul
de extrudare, p1- punctul de baz al modelului, p3 - punct plasat pe diagonal
fa de p1, p2 i p4 - puncte plasate pe cealalt diagonal a poliliniei.

Fig. 2.12 Model 3D parametrizat din AutoLISP.


(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

Prof. dr. ing. Gheorghe OANCEA

"fillet" "p" "l")


(command "extrude" "l" "" lz u)
(command "vpoint" "1,1,1")
(command "hide")

39

;seteaz raza i racordeaz polilinia


;extrudeaz polilinia
;seteaz direcia de privire
;ascunde liniile invizibile

Comenzile lansate n execuie cu ajutorul funciei command, nu sunt


afiate pe ecran dac variabila de sistem AutoCAD CMDECHO (care poate fi
accesat prin intermediul funciilor setvar i getvar sau a comenzii AutoCAD
SETVAR) este setat pe valoarea zero. Pentru anularea modurilor OSNAP,
existente n desenul curent, se pe seteaz (tot din program) pe valoarea zero
variabila OSMODE.
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

Visual LISP/AutoLISP

2.8 Funcii pentru introducerea datelor

AutoLISP-ul pune la dispoziia programatorilor un set de funcii care


ntrerup evaluarea unei expresii simbolice i permit introducerea interactiv a
unor date, utiliznd metode standard din AutoCAD.
Funciile din aceast categorie sunt de forma GETXXX. Majoritatea
utilizeaz un mesaj (ir de caractere) care este afiat nainte de preluarea datei.
Acesta poate s conin urmtoarele caractere speciale:
\n pentru linie nou (new-line);
\e pentru escape;
\r pentru return;
\t pentru tab;
\ pentru caracterul ghilimele (), n interiorul mesajului;
\\ pentru caracterul backslash (\), n interiorul mesajului;
\nnn pentru caracterul al crui cod octal (n baza 8 de numeraie) este nnn.
Observaie: Caracterele speciale vor fi scrise n mesaje cu caractere mici.
Funcia GETINT
Sintax:
(GETINT [ <mesaj> ])
Aceast funcie ateapt introducerea de la tastatur a unei valori ntregi,
i returneaz valoarea citit. Valorile citite trebuie s se ncadreze n
intervalul -32768..32767. Argumentul <mesaj> este opional i este afiat pe
ecran n momentul cererii de introducere a datei.
Funcia nu accept s fie introdus de la tastatur, ca rspuns, dect un
ntreg, n caz contrar afieaz pe ecran mesajul Requires an integer value.
Exemple:
(setq J (getint))
(setq I (getint \nIntroducei ntregul I=))
;se afieaz n zona prompter-ului Command: mesajul indicat, permind
introducerea unui ntreg de la tastatur i atribuirea acestuia simbolului I.
Funcia GETREAL
Sintax:
(GETREAL [ <mesaj> ])
Funcia getreal permite introducerea de la tastatur a unei valori reale i
returneaz valoarea citit. Mesajul este opional, fiind afiat pe ecran n
momentul n care trebuie introdus numrul real.

Prof. dr. ing. Gheorghe OANCEA

41

Funcia nu accept s fie introdus de la tastatur, ca rspuns, dect un


ntreg sau un real, n caz contrar afieaz pe ecran mesajul Requires numeric
value.
Exemple:
(setq r1 (getreal))
(setq r2 (getreal \nIntroducei raza:))
Funcia GETSTRING
Sintax:
(GETSTRING [ <ind> ] [ <mesaj> ])
Funcia getstring permite citirea de la tastatur a unui ir de caractere, i
returneaz valoarea. Dac irul este mai mare dect 132 de caractere atunci sunt
returnate numai primele 132 de caractere ale irului. Dac n ir apare caracterul
backslash (\) atunci acesta este convertit n dou caractere de acelai fel (\\).
Acest lucru este foarte util la indicarea cilor i a numelor de fiiere. n sintaxa
general a funciei, apar doi parametrii opionali <mesaj> i <ind>. Dac <ind>
apare i este diferit de nil, atunci irul introdus poate s conin spaii; irul va fi
preluat n momentul apsrii tastei enter. Argumentul <mesaj> este un ir de
caractere opional i este afiat ca prompter.
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).

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.

Prof. dr. ing. Gheorghe OANCEA

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

Returneaz valoarea unei variabile de sistem AutoCAD, indicat ca


argument sub forma unui ir de caractere.
Exemple:
(getvar DIMASZ) 3
(getvar CMDECHO) 1
Funcia SETVAR
Sintax:
(SETVAR <nume_variabil> <valoare>)
Seteaz variabila de sistem AutoCAD indicat prin nume, ca un ir de
caractere, la valoarea dat ca argument.
Exemple:
(setvar DIMASZ 5) 5
(setvar CMDECHO old_cmdecho)0
Funcia GETENV
Sintax:
(GETENV <nume_variabil>)
Funcia returneaz setarea curent a unei variabile ambientale (de sistem
de operare) sub forma unui ir de caractere. Argumentul funciei este de
asemenea un ir de caractere.
Exemple:

(getenv ACAD) /acad/support


(getenv INEXSIT) nil

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;

Prof. dr. ing. Gheorghe OANCEA

45

2 = nu permite introducerea valorii egale cu zero;


4 = nu permite introducerea valorilor negative;
8 = nu verific limitele, chiar dac sunt setate pe on;
16= nu este utilizat;
32= utilizeaz linii punctate pentru rubber-band;
64= ignor coordonata Z pentru puncte 3D (numai pentru getdist).
Observaie: Pentru argumentul <mod> se pot utiliza valori cumulate, cum ar fi
3 (rezultat din 1+2), 7 (rezultat din 1+2+4) etc. Efectul obinut n acest caz, va
nsuma efectele modurilor de baz.
Dac utilizatorul nu introduce valori conforme cu modurile date de
programator cu ajutorul funciei initget, atunci primete mesaje de avertizare pe
ecran, putnd reintroduce valori corecte. De exemplu, raza unui cerc nu trebuie
s fie negativ sau zero. Utilizatorul nu trebuie lsat s ias din funcia getreal
cu apsarea numai a tastei enter, deoarece n acest caz, funcia returneaz nil i
nu poate fi acceptat aceast valoare ca raz. n acest caz expresiile simbolice
sunt:
(initget (+ 1 2 4))
(setq raza (getreal \nIntroduceti raza cercului:))
sau
(setq p1 (getpoint \nIntroduceti centrul cercului:))
(initget (+ 1 2 4))
(setq raza (getdist p1 \nIntroduceti raza cercului:))
Valorile modurilor din sintaxa lui initget, acioneaz pe funciile
AutoLISP conform tabelului 2.2.
Tabelul 2.2
Funcia
1
;
;
;
;
;
;
;
;

Modurile funciei INITGET


2
4
8
32
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

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

cheie1 [ ,ABREV1 ] cheie2 [ ,ABREV2 ] ..... cheien [ ,ABREVN ]


n care parametrii opionali ABREV1 , ABREV2 , ......... ABREVN reprezint
abrevierile cuvintelor cheie (acestea vor fi scrise cu majuscule). O alt
modalitate de precizare a abrevierilor const n scrierea acestora cu majuscule n
cuvntul cheie (restul caracterelor vor fi minuscule). Cuvintele cheie sunt citite
cu ajutorul funciei getkword.
Urmtoarele exemple prezint cele dou modaliti de indicare a
cuvintelor cheie:
LType LAyer eXit
LTYPE,LT LAYER,LA EXIT,X
Utilizatorul poate s tasteze pentru primul cuvnt cheie ltype, ltyp, lty sau lt, dar
l este insuficient deoarece exist confuzie cu cheia layer. n acest ultim caz,
sistemul va solicita din nou un rspuns corect deoarece anteriorul a fost
ambiguu. Pentru ultimul cuvnt cheie se tasteaz doar x.
Observaii:
1. Modurile i cuvintele cheie stabilite de funcia initget sunt valabile numai
pentru urmtoarea funcie getxxx dup care acestea sunt automat anulate. Dac
se dorete activarea acelorai moduri i cuvinte cheie, trebuie repetat expresia
simbolic aferent.
2. Cuvintele cheie se utilizeaz de regul atunci cnd se dorete selectarea unei
opiuni dintr-o list de variante posibile.

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)

Prof. dr. ing. Gheorghe OANCEA

47

;seteaz cuvintele cheie LType, LAyer i eXit fr a permite apsarea


;numai a tastei Enter
(setq optiune (getkword \Optiune LType/ LAyer/eXit :))
;citete unul din cuvintele cheie stabilite anterior
3. (initget LType LAyer eXit)
;seteaz cuvintele cheie LType, LAyer i eXit
(setq optiune (getkword \Optiune LType/ LAyer/<eXit> :))
;citete unul din cuvintele cheie stabilite anterior sau nil
(if (not optiune) (setq optiune eXit))
;dac opiunea este nil atunci s-a ales opiunea implicit care este eXit
Observaie: Ultimul exemplu prezint care sunt expresiile simbolice ce
realizeaz preluarea unei opiuni implicite.
Exemplu de parametrizare cu variabile: Urmtoarea secven de program
genereaz modelul 3D din figura 2.12 parametrizat cu simboluri variabile.
Semnificaia simbolurilor este aceeai ca i n exemplul de la subcapitolul 2.7.
(initget 1)
; nu permite introducere nul (apsarea doar a tastei enter)
(setq p1 (getpoint "\nPunctul de baza P1:"))
;citete punctul de baz
(initget (+ 1 2 4))
; nu permite introducere nul sau un numr 0
(setq lx (getdist p1 "\n Cota lx:"))
; citete cota lx (lungimea pe axa x)
(initget (+ 1 2 4))
; nu permite introducere nul sau un numr 0
(setq ly (getdist p1 "\n Cota ly:"))
;citete cota ly (lungimea pe axa y)
(initget (+ 1 2 4))
; nu permite introducere nul sau un numr 0
(setq lz (getdist p1 "\n Cota lz:"))
;citete cota lz (lungimea pe axa z)
(initget (+ 1 2 4))
; nu permite introducere nul sau un numr 0
(setq r (getdist p1 "\n Raza r:")
u (getangle p1 "\n Unghiul de extrudare u:")
u (/(* 180 u) pi)
) ;citete raza de racordare, unghiul de extrudare i l convertete n grade
(setq p3 (list (+ (car p1) lx) (+ (cadr p1) ly))
p2 (list (car p3) (cadr p1))
p4 (list (car p1) (cadr p3))
); se calculeaz punctele caracteristice poliliniei
(command "pline" p1 p2 p3 p4 "c")

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

Funciile din aceast categorie sunt utilizate pentru calcularea anumitor


parametri din cadrul unui desen parametrizat, necesari la adugarea ulterioar a
unor noi entiti.
Funcia DISTANCE
Sintax:
(DISTANCE <pct1> <pct2>)
Aceast funcie returneaz distana 3D dintre punctele <pct1> i <pct2>.
Exemplu:
(setq P1 (getpoint \nIntroducei P1:)
P2 (getpoint \nIntroducei P2:)
)
(setq d (distance p1 p2))
Dac unul din cele dou puncte are dou coordonate (este un punct 2D)
atunci funcia distance returneaz distana 2D dintre cele dou puncte altfel
returneaz distana 3D.
Funcia INTERS
Sintax:
(INTERS <pct1> < pct2> <pct3> <pct4> [ <ind> ])
Funcia inters examineaz dac dou linii, determinate de cte dou
perechi de puncte, se intersecteaz i returneaz punctul de intersecie sau nil
dac ele nu se intersecteaz. Argumentele <pct1> i <pct2> sunt punctele ce
delimiteaz primul segment, iar <pct3> i <pct4> cel de al doilea segment.

Prof. dr. ing. Gheorghe OANCEA

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:

(polar (1 1 3.5) 0.783398 1.414214) (2.0 2.0 3.5)

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

2.10 Definirea noilor funcii AutoLISP

n AutoLISP, spre deosebire de alte limbaje de programare, programatorii


pot defini numai subprograme de tip funcie. Noile funcii definite completeaz
setul de subrutine (funcii) predefinite. Acestea pot fi definite cu ajutorul funciei
defun (DEfine FUNction).
Funcia DEFUN
Sintax:

(DEFUN <nume_functie> ([ pf1 ...pfn ] [/ pl1 ...p1k ])


<expr1>
[ <expr2>
.....
<exprm> ]
)
n sintaxa funciei defun apar urmtoarele elemente:
<nume_functie> identific numele funciei definite;
pf1 ... pfn reprezint lista parametrilor formali;
pl1 ... plk este lista parametrilor locali;
<expr1> ... <exprm> sunt expresii simbolice care formeaz corpul funciei.

Dup cum se poate observa, sintaxa lui defun este puin diferit de a
celorlalte funcii prezentate pn acum. Funcia are dou argumente obligatorii

Prof. dr. ing. Gheorghe OANCEA

51

(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:
(nume_functie pa1 ... pan)

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

1. S se defineasc o funcie AutoLISP care s permit calcularea


x+y
expresiei: S =
( x y) . Funcia va avea doi parametrii formali x, y i nici
xy
un parametru local.
(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))
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.

(defun cerc (/ centru raza)


(initget 1)
(setq centru (getpoint \nIntroduceti centrul cercului))
(initget (+ 1 2 4))
(setq raza (getdist centru \nIntroduceti raza cercului:))
(command circle centru raza)
(prin1) ;pentru inhibarea valorii returnate la apelarea funciei
)
Funcia definit se apeleaz cu ajutorul expresiei simbolice (cerc).
Dup cum se observ din ultimul exemplu, o funcie definit de
programator poate apela n cadrul corpului ei, comenzi AutoCAD prin

Prof. dr. ing. Gheorghe OANCEA

53

intermediul funciei command. Funcia definit pare a fi o nou comand


AutoCAD, difer doar modul de apelare (se apeleaz ntre paranteze rotunde ca
orice funcie AutoLISP). Acest impediment este rezolvat dac la definirea unei
noi funcii n faa numelui se specific secvena de caractere C:. n acest fel se
definete complet o nou comand AutoCAD, care se apeleaz din zona
prompter-ului Command: al editorului de desenare, prin tastarea numelui
funciei. Noua comand este tratat ca orice comand intern a AutoCAD-ului.
n consecin, pentru a defini o nou comand AutoCAD, se utilizeaz n sintax
ca nume al funciei definite C:XXX, unde XXX este numele noii comenzi
AutoCAD.
Observaii:
1. Dac se dorete apelarea din AutoLISP, sau n fereastra Visual LISP Console
a mediului VLISP, a unei funcii de tip comand AutoCAD (definit de
programator), atunci va fi utilizat expresia simbolic (c:nume_functie). Se
observ c nu este apelat prin intermediul funciei predefinit command.
2. O funcie care definete o nou comand AutoCAD poate fi apelat n mod
transparent (pe alte promptere dect Command: prin specificarea numelui
comenzii respective precedat de caracterul apostrof, de exemplu XXX) dac
aceasta nu apeleaz funcia AutoLISP command.

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

(defun c:model3d (/ p1 p2 p3 p4 lx ly lz r u cmd osn)


(setq cmd (getvar "cmdecho")) ; se preia valoarea variabilei cmdecho
(setvar "cmdecho" 0) ; se inhib ecoul
(setq osn (getvar "osmode")) ;se preia valoarea variabilei osmode
(setvar "osmode" 0) ; se inhib modurile OSNAP curent setate
(initget 1) ; nu permite introducere nul (apsarea doar a tastei enter)
(setq p1 (getpoint "\nPunctul de baza P1:")) ;citete punctul de baz
(initget (+ 1 2 4)) ; nu permite introducere nul sau un numr 0
(setq lx (getdist p1 "\n Cota lx:")) ;citete cota lx (lungimea pe axa x)
(initget (+ 1 2 4)) ; nu permite introducere nul sau un numr 0
(setq ly (getdist p1 "\n Cota ly:")) ;citete cota ly (lungimea pe axa y)
(initget (+ 1 2 4)) ; nu permite introducere nul sau un numr 0
(setq lz (getdist p1 "\n Cota lz:")) ;citete cota lz (lungimea pe axa z)
(initget (+ 1 2 4)) ; nu permite introducere nul sau un numr 0
(setq r (getdist p1 "\n Raza r:") ;citete raza de racordare
u (getangle p1 "\n Unghiul de extrudare u:")
u (/(* 180 u) pi)
) ;citete unghiul de extrudare i l convertete n grade
(setq p3 (list (+ (car p1) lx) (+ (cadr p1) ly))
p2 (list (car p3) (cadr p1))
p4 (list (car p1) (cadr p3))
); se calculeaz punctele caracteristice poliliniei ce urmeaz a fi racordat i
apoi extrudat
(command "pline" p1 p2 p3 p4 "c") ; se traseaz polilinia
(command "fillet" "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
(setvar "cmdecho" cmd) ; se readuce variabila cmdecho pe valoare iniial
(setvar "osmode" osn) ; se readuce variabila osmode pe valoare iniial
(prin1) ; se inhib valoarea returnat de funcie
)
Posibilitatea adugrii unor noi comenzi AutoCAD, cu ajutorul funciei
defun, se constituie ntr-o facilitate foarte important oferit de AutoLISP.
Funciile pot fi stocate n fiiere care pot fi oricnd ncrcate n AutoCAD i
lansate n execuie. ncrcarea fiierelor AutoLISP se realizeaz cu ajutorul
funciei load, descris n acest subcapitol.
Dac pe disc exist fiierul acad.lsp, AutoCAD-ul l ncarc automat de
fiecare dat, la nceputul fiecrei sesiuni de lucru. Se poate utiliza aceast

Prof. dr. ing. Gheorghe OANCEA

55

facilitate pentru a crea o colecie de funcii utilitare care sunt ntotdeauna la


dispoziia utilizatorului.
Pentru ca imediat dup intrarea n editorul de desenare al AutoCAD-ului,
s fie executate i anumite aciuni specifice, prin lansarea automat n execuie a
anumitor funcii, fiierul acad.lsp trebuie s aib definit o funcie special
denumit S::STARTUP. Aceast funcie nu are parametrii formali sau actuali i
de regul, este definit cu defun-q pentru a putea aduga oricnd cu funcia
append cod surs. Prefixul S:: trebuie considerat de ctre programatori nume
rezervat.
Funcia LOAD
Sintax:
(LOAD <nume-fiier> [ <mesaj> ])
Funcia load ncarc un fiier care are, n ordine, una din extensiile VLX,
FAS, LSP. Dac se ncarc un fiier AutoLISP (cu extensia LSP) atunci citirea
se face secvenial, pe msur ce se citesc expresii, acestea sunt evaluate.
Valoarea returnat de funcie este identic cu valoarea ultimei expresii evaluate.
Funcia are un singur argument obligatoriu de tip ir de caractere care
desemneaz numele fiierului fr extensie (deoarece extensia implicit este
LSP) ce trebuie ncrcat. Al doilea argument de tip atom este opional, i dac
este indicat, atunci n cazul ncrcrii fr succes a unui fiier, se va afia
valoarea acestuia n locul mesajului de eroare.
De regul funcia load este utilizat pentru ncrcarea fiierelor din
programe AutoLISP.
Exemple:
(load ex1)
(load a:\\work\\desen)
(load /work/desene/inexist Eroare la incarcare)
Observaie: Funcia AutoLISP load este diferit de comanda AutoCAD LOAD.
La apelarea funciei load, AutoLISP-ul caut fiierul menionat, mai nti
n subdirectorul curent i apoi n celelalte subdirectoare pentru care s-au definit
n AutoCAD ci de cutare suplimentare prin variabile de sistem (vezi funcia
getenv).
Dac AutoLISP-ul furnizeaz un mesaj de eroare n timpul ncrcrii unui
fiier, va trebui editat fiierul i depanat programul. Cele mai multe mesaje
indic erori tipice cum ar fi: tastarea eronat a numelor de funcii sau simboluri,
tip sau numr de argumente eronat n apelul funciilor, paranteze nenchise,
ghilimele nenchise. Cele mai frecvente mesaje de eroare aprute la execuia
funciei load sunt prezentate n tabelul 2.3

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.

Fig. 2.13 Fereastra prin care se gestioneaz aplicaiile ncrcate n AutoCAD.


De reinut este faptul c n versiunile mai noi de AutoCAD (2000, 2002),
pentru ncrcarea unei aplicaii (n particular realizat n AutoLISP) se lanseaz

Prof. dr. ing. Gheorghe OANCEA

57

n execuie comanda Load Application din submeniul Tools. Pe ecran se prezint


fereastra din figura 2.13 prin care se gestioneaz aplicaiile ncrcate.
Pot fi ncrcate n AutoCAD urmtoarele tipuri de aplicaii: salvate n
fiiere surs LISP (LSP), compilate n fiiere FAS, independente (VLX),
ObjectARX (ARX) i VisualBasic.
Aplicaiile AutoLISP pot fi ncrcate i din mediul VLISP. Modalitile de
ncrcare au fost prezentate n capitolul 1 al acestei lucrri.

2.11 Funcii condiionale


n orice limbaj de programare sunt puse la dispoziia programatorului
modaliti de ramificare a programelor. Programele AutoLISP sunt ramificate pe
baza unor expresii test. Expresiile test sunt acele expresii simbolice care pot s
returneze una din valorile: true (adevrat) sau false (fals). Ramificarea poate fi
simpl sau multipl, existnd cte o funcie predefinit pentru fiecare variant: if
i respectiv cond). Cu ajutorul celor dou funcii se testeaz una sau mai multe
expresii simbolice, iar programul va urma ramificaia adecvat n concordan
cu rezultatul testrii.

2.11.1 Funcii relaionale i de test. Egaliti i teste logice


n AutoLISP simbolul predefinit T este echivalent cu true (adevrat), iar
atomul nil este echivalent cu false (fals).
Dac o expresie AutoLISP, din cadrul unei funcii condiionale,
returneaz nil (false), atunci va fi parcurs ramura de fals.
Spre deosebire de alte limbaje de programare, dac n urma evalurii unei
expresii se returneaz altceva dect nil, expresia este echivalent cu T sau true
(adevrat). Dac o expresie test este T, atunci se va continua parcurgerea
programului pe ramura de true (adevrat). T i nil se exclud prin definiie; dac o
expresie este evaluat prin T atunci ea nu poate fi nil, i reciproc. Funciile ce
vor fi prezentate n continuare sunt utilizate cu precdere n expresii test.
Funcia =
Sintax:
(= <atom1> [ <atom2> ..... <atomn> ])
Aceasta este funcia relaional de egalitate. Returneaz T dac toate
argumentele, de tip atom, sunt valoric egale, i nil n caz contrar. Aceast funcie
se utilizeaz pentru atomii numerici i iruri de caractere. Dac funcia are un
singur argument se returneaz T.

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.

Prof. dr. ing. Gheorghe OANCEA

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> ])

Prof. dr. ing. Gheorghe OANCEA

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

Prof. dr. ing. Gheorghe OANCEA

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

2.11.2 Funcii pentru formarea condiiilor compuse


Funcia NOT
Sintax:
(NOT <expr>)

Prof. dr. ing. Gheorghe OANCEA

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:

(or nil 2 a c)T


(or 2 a b c)T
(or nil b ())nil
(or)nil

Funciile relaionale, de test i logice (de formare a condiiilor compuse)


sunt utilizate la scrierea expresiilor test. Ele sunt utilizate n expresiile simbolice
condiionale sau repetitive care apar n cadrul funciilor: if, cond i while. n
funcie de valorile returnate, se verific dac este ndeplinit o anumit condiie
i se indic ce set de expresii simbolice s se execute n continuare.
Observaie important: n expresiile test pot fi utilizai atomi, simboluri sau
orice alte expresii, deoarece orice obiect AutoLISP are o valoare: nil sau ceva
diferit de nil care poate fi considerat T.
Spre deosebire de alte limbaje de programare, AutoLISP-ul fiind un
limbaj funcional, ramificarea programelor se face cu ajutorul unor funcii.
Funciile condiionale controleaz, prin intermediul unor expresii test, fluxul
unui program. Acestea au posibilitatea de a conduce rularea programului pe una
din variantele posibile de continuare. Fiecare variant are ataat cte un set de
expresii simbolice.
Dup cum am precizat, n AutoLISP exist dou funcii condiionale: if i

cond.
2.11.3 Funcia condiional if
Funcia IF
Sintax:
(IF <expr-test> <expr-then> [ <expr-else> ])

Prof. dr. ing. Gheorghe OANCEA

67

Funcia if are dou argumente obligatorii expresiile simbolice notate cu


<expr-test>, <expr-then> i unul opional expresia simbolic <expr-else>.
Se evalueaz primul argument <expr-test> i dac valoarea rezultat este
echivalent cu T, adic este diferit de nil, atunci se evalueaz al doilea
argument <expr-then>. Dac valoarea returnat de primul argument este nil,
atunci AutoLISP-ul va evalua, dac exist, al treilea argument <expr-else> (cel
opional). Funcia returneaz valoarea ultimei expresii simbolice evaluate, deci
rezultatul evalurii lui <expr-then> sau <expr-else>.

Observaie: Cele dou expresii <expr-then> i <expr-else>, care desemneaz


ramurile then i else, sunt expresii simbolice simple. Dac pe aceste ramuri se
dorete evaluarea mai multor expresii simbolice, atunci acestea trebuie grupate
cu ajutorul funciei progn.
Exemple:
Urmtoarele expresii se vor tasta direct pe prompter-ul Command: sau n
Visual LISP Console.
1.
(setq a 2)
(if (= a 2) (setq y 15) (setq y 20))15
Se solicit apoi valoarea lui y (!y n AutoCAD).
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

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.

Prof. dr. ing. Gheorghe OANCEA

69

Din multe puncte de vedere funcia cond este asemntoare instruciunii


Case din alte limbaje de programare.

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

2.12 Funcii repetitive


Ciclurile sunt concepte importante n orice limbaj de programare. Ele
permit parcurgerea unei secvene de program, denumit corpul ciclului, de un
anumit numr de ori, cunoscut apriori sau pe baza unei valori returnate de o
expresie test.
n AutoLISP ciclurile sunt materializate prin intermediul unei expresii
simbolice, n sintaxa creia intervine o funcie repetitiv. Exist trei funcii
repetitive: repeat, while i foreach.

2.12.1 Funcia Repeat


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

Prof. dr. ing. Gheorghe OANCEA

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.

(defun factorial (/ n contor f)


(initget 7)
(setq n (getint \nIntroducei n=)
f 1.0
contor 1)
(repeat n
(setq f (* f contor)
contor (1+ contor) )
)
(princ(strcat \nFactorialul calculat este (itoa n) != (rtos f 2 0)))
(prin1)
)
Funcia definit se apeleaz prin (factorial).
Observaie: Funcia repeat este diferit de instruciunile cu acelai nume din
alte limbaje de programare, ea putnd fi asimilat, din anumite puncte de vedere,
cu instruciunea FOR.
Repeat este cea mai simpl funcie repetitiv, dac se cunoate apriori, de
cte ori trebuie evaluat setul de expresii simbolice care formeaz corpul funciei.
Exist uneori situaii n care trebuie repetat un set de expresii simbolice de
un numr necunoscut iniial de ori. n acest caz, funcia while este cea care
permite efectuarea aciunii specificate, pe baza valorii returnate de o expresie
test.

Visual LISP/AutoLISP

72

2.12.2 Funcia repetitiv While


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))
)
2. Calculul factorialului unui numr natural cu ajutorul funciei while (fr
parametru formal).

Prof. dr. ing. Gheorghe OANCEA

73

(defun factorial (/ n contor f)


(initget 7)
(setq n (getint \nIntroduceti n=)
f 1.0
contor 1
)
(while (<= contor n)
(setq f (* f contor)
contor (1+ contor)
)
)
(princ (strcat\nFactorialul calculat este (itoa n) != (rtos f 2 0)))
(prin1)
)
Se apeleaz prin expresia simbolic (factorial).
3. Calculul factorialului unui ntreg pozitiv cu ajutorul funciei while (cu
parametru formal).

(defun factp ( n / contor f)


(setq f 1.0
contor 1
)
(while (<= contor n)
(setq f (* f contor)
contor (1+ contor)
)
)
(princ (strcat \nFactorialul calculat este (itoa n) != (rtos f 2 0)))
(prin1)
)
Se apeleaz, de exemplu, prin expresia (factp 10).
Observaie: Funcia while, din punctul de vedere al modului n care acioneaz,
este echivalenta instruciunii cu acelai nume din alte limbaje de programare.
Exist unele situaii n care anumite probleme sunt destul de greu de
rezolvat cu ajutorul funciei while sau repeat. De exemplu dac se dorete
calcularea factorialului, cu ajutorul funciei factp, pentru mai multe valori ntre
care nu exist o relaie de recuren. Acest lucru se rezolv foarte uor cu
ajutorul funciei foreach.

Visual LISP/AutoLISP

74

2.12.3 Funcia repetitiv Foreach


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))


n acest ultim exemplu, va fi calculat factorialul numerelor date n list,
prin apelarea funciei factp, definit n exemplul 3 de la funcia while.

Prof. dr. ing. Gheorghe OANCEA

75

2.13 Funcii de conversie


Funciile din aceast categorie permit de regul convertirea unor iruri de
caractere n ntregi sau reali sau a unor numere (ntregi/reali) n iruri de
caractere.
Funcia ATOI
Sintax:
(ATOI <ir>)
Funcia atoi (abreviere de la Ascii TO Integer) permite convertirea unui
ir de caractere la un numr ntreg. Dac irul de caractere desemneaz un real
atunci conversia se face prin trunchiere.
Exemple:
(atoi 56)56
(atoi 5.6)5
(atoi -5)-5
(atoi 50.67klll2)50
(atoi k2ll)0

Observaie: Dac irul de caractere nu poate fi convertit ntr-un ntreg, funcia


returneaz atomul 0, iar dac primul/primele caractere din ir sunt numerice
atunci doar acestea vor fi convertite la un ntreg.
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> ] ])

Visual LISP/AutoLISP

76

Funcia rtos (Real TO String) este utilizat pentru conversia argumentului


<real> (de tip real) ntr-un ir de caractere. Parametrii opionali <format> i
<precizie> sunt de tip ntreg i semnific formatul unitilor liniare respectiv
numrul de zecimale coninute de irul de caractere rezultat. Pot fi utilizate
aceleai formate (tabelul 2.4) prezente n cazul comenzii AutoCAD UNITS.
Dac parametrii opionali lipsesc atunci conversia se va face n formatul i
cu numrul de zecimale curente (setate cu ajutorul comenzii UNITS).
Exemple:
(rtos 56.78 1 5)5.67800E+01
(rtos 56.78 2 4)56.7800
(rtos 17.5 3 )1-5.5\
(rtos 17.5 4 )1-5 1/2\
(rtos 7.5 5 )7 1/2
Tabelul 2.4

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

Observaie: Variabila DIMZIN influeneaz rezultatul conversiei. Dac


valoarea acesteia este 8, atunci sunt suprimate zerourile zecimalelor.
Funcia ATOF
Sintax:
(ATOF <ir>)

Prof. dr. ing. Gheorghe OANCEA

77

Funcia atof (abreviat de la Ascii TO Float) permite convertirea unui ir


de caractere ntr-un real.
Exemple:
(atof 56.34)56.34
(atof 5.01)5.01
(atof -5)-5.0
(atof 50.67klll2)50.67
(atof k2ll)0.0

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

Grade centezimale (Grads)

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

Prof. dr. ing. Gheorghe OANCEA

79

Funcia accept chiar i valori negative pentru argument, dar la


transformare, valorile rezultate n irurile de caractere vor fi ncadrate n
intervalul [0,2].
Exemple:
(angtos (/ PI 4) 0 2) 45.00
(angtos ((* (/ PI 4) -1) 0 2) 315.00

Observaie: Variabila DIMZIN influeneaz rezultatul conversiei. Dac


valoarea acesteia este 8, atunci sunt suprimate zerourile zecimalelor.
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:

(angtof 180 0) 3.14159


(angtof 180d00\ 1) 3.14159
(angtof 3.1416r 3 ) 3.1416
(angtof W 4 ) 3.14159
(angtof 200.0g 2) 3.14159

Observaie: Funciile angtos i angtof sunt complementare.


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

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:

Prof. dr. ing. Gheorghe OANCEA

81

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
2. Dac se traseaz n WCS o linie avnd punctul de start n 10,10 i
punctul de final n 100,100 i apoi 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 p2 (cdr (assoc 10 (entget (entlast))))) (10.0 10.0 0.0)
; punctul start
(setq sc1 (entlast))
; OCS-ul entitii linie
(setq sc2 1)
; UCS-ul curent
(trans p2 sc1 sc2) (10.0 -7.07107 7.07107) ; punctul translatat

2.14 Funcii pentru gestionarea irurilor de caractere


Funciile pentru gestionarea irurilor de caractere permit: concatenarea a
dou sau mai multe iruri de caractere, extragerea unor subiruri (secvene din
cadrul irurilor de caractere), transformarea caracterelor n majuscul sau
minuscul (litere mici) i aflarea lungimii unor iruri de caractere.
Funcia STRCAT
Sintax:
(STRCAT [ <ir1> [ <ir2> ... <irn> ] ])
Funcia returneaz irul de caractere rezultat n urma concatenrii
(adunrii) irurilor de caractere furnizate ca argumente. Dac nu este precizat
nici un argument atunci se returneaz irul vid ().

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

(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:

Prof. dr. ing. Gheorghe OANCEA

83

(STRCASE <ir> [ <ind> ])


Aceast funcie permite generarea unei copii a argumentului <ir>, n care
caracterele sunt modificate n majuscul sau minuscul n funcie de valoarea
argumentului opional <ind>. Dac <ind> este omis sau este evaluat prin nil,
atunci toate caracterele irului sunt convertite n majuscul, iar dac <ind> exist
i este diferit de nil atunci caracterele sunt transformate n litere mici.

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

(wcmatch Desen ~*a*) T


;testeaz dac Desen nu conine caracterul a
Tabelul 2.6

Caracter

Specificaie

O singur cifr numeric

Un singur caracter alfabetic

Un singur caracter diferit de alfanumeric

Orice secven de caractere

Un singur caracter (alfanumeric sau special)

Dac este prim caracter are efect: cu excepia a


ceea ce urmeaz

[...]

Unul din caracterele incluse

[~...]

Exceptnd caracterele incluse

Specificare interval n interiorul parantezelor

Separ dou pattern-uri

Pentru a indica literal un caracter de control

Observaie: Dac se dorete indicarea unor condiii de cutare compuse se


utilizeaz caracterul de separaie virgul. Pentru ca funcia s returneze T trebuie
s fie ndeplinit cel puin un criteriu.
Exemplu:

(wcmatch Desen ???,~*s*,D*) T ;testeaz dac Desen


este format din trei caractere (nil), nu conine caracterul s (nil) i ncepe cu
caracterul D (T). Rezultatul returnat va fi T.

Prof. dr. ing. Gheorghe OANCEA

85

2.15 Funcii pentru controlul afirii


2.15.1 Funcii pentru citire/scriere din/n fiiere sau tastatur/ecran
Majoritatea funciilor din aceast categorie au un parametru opional de
tip descriptor de fiier, notat cu <df>. Dac acesta este prezent n apel (i este un
descriptor care identific n mod corect un fiier deschis cu funcia open)
permite realizarea operaiilor n fiierul aferent descriptorului. n cazul n care nu
este prezent un descriptor de fiier la apelarea funciilor, se realizeaz afiarea
rezultatelor n AutoCAD n zona prompter-ului Command:, iar n VLISP n
fereastra Visual LISP Console.
Funcia PRIN1
Sintax:
(PRIN1 [ <expr> [ <df> ] ])

Prin1 afieaz argumentul <expr> evaluat i returneaz valoarea acestuia


(apelat fr argument, nu returneaz nici o valoare). Argumentul poate fi o
expresie simbolic sau n particular un ir de caractere. Dac se precizeaz ca
argument un ir care conine caractere de control, funcia nu le va evalua
(expanda). Dup afiarea rezultatului, funcia scrie automat caracterul \n (linie
goal).
Exemple:
1. Afiare pe ecran
(setq a 67.78)
(setq b (x y))
(prin1 a)
;afieaz
A
i returneaz
A
(prin1 a)
;afieaz
67.78
i returneaz
67.78
(prin1 b)
;afieaz
(x y)
i returneaz
(x y)
(prin1 LISP)
;afieaz
LISP
i returneaz
LISP
(prin1 \nLISP) ;afieaz
\nLISP i returneaz
\nLISP
(prin1 " \nCalea este: \d:\\studenti\\ppac\\aplicatii\")
;afiseaz Calea este: \d:\studenti\ppac\aplicatii\ pe line noua i
;returneaz " \nCalea este: \d:\\studenti\\ppac\\aplicatii\")
(prin1)
;afieaz o linie goal
2. Scriere n fiier
(setq f (open EX.TXT w)) ;deschide fiierul

86

Visual LISP/AutoLISP

(prin1 Exemplu prin1 f);scrie mesajul pe o linie n fiier i l returneaz


;pe ecran
(setq f (close f))
;nchide fiierul
Observaie: Funcia prin1 poate fi apelat fr argumente, ca ultim expresie
ntr-o funcie definit de programatori pentru quiet exit (ieire fr a fi returnat
o valoare).
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.

Prof. dr. ing. Gheorghe OANCEA

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> ])

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.

Prof. dr. ing. Gheorghe OANCEA

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.

2.15.2 Funcii de gestionare a ecranului AutoCAD


Funciile din aceast categorie comut ecranul AutoCAD-ului din mod
text n mod grafic i invers sau afieaz pe ecran o linie nou.
Funcia GRAPHSCR
Sintax:
(GRAPHSCR)
Funcia graphscr schimb ecranul din mod text n mod grafic (acioneaz
ca i tasta funcional F2). Returneaz ntotdeauna nil.
Funcia TERPRI
Sintax:
(TERPRI)
Funcia tiprete pe ecran o linie nou i returneaz nil. Terpri nu poate fi
utilizat n cazul fiierelor. Pentru aceast aciune se vor utiliza funciile
AutoLISP: write-line, princ,prin1 sau print.
Funcia TEXTPAGE
Sintax:
(TEXTPAGE)
Funcia textpage comut ecranul din mod grafic n mod text. Returneaz
ntotdeauna nil.

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.

2.16 Funcii pentru gestionarea fiierelor


AutoLISP-ul, spre deosebire de alte limbaje de programare, permite
accesul doar la fiiere text (ASCII). Introducerea (scrierea) i extragerea (citirea)
de date n/din fiiere text se realizeaz de regul prin intermediul a dou funcii
(prezentate anterior): read-line i write-line. Deschiderea i nchiderea fiierelor
n vederea scrierii, respectiv citirii de date, se controleaz prin intermediul a
dou funcii: open i close.
Funcia OPEN
Sintax:
(OPEN <nume_fiier> <mod>)
Funcia open impune specificarea a dou argumente: numele fiierului
care urmeaz a fi deschis i modul de acces la datele fiierului. Ambele
argumente trebuie s fie de tip ir de caractere. Dac operaia de deschidere
reuete atunci funcia returneaz un atom de tip descriptor de fiier (forma lui
fiind, de exemplu, #<file "c:\\studenti\\ppac\\aplicatii\\date.txt">). Dac
operaia eueaz atunci este returnat atomul nil.
Pentru a lucra n continuare cu fiierul, programatorul trebuie s
memoreze descriptorul de fiier ntr-un simbol, deoarece este necesar indicarea
acestuia ca argument al funciilor de citire/scriere. Dac descriptorul nu este
reinut atunci nu pot fi prelucrate datele n/din fiier; mai mult, acesta nici mcar
nu poate fi nchis, deoarece la nchiderea fiierului este necesar descriptorul de
fiier.
Descriptorul de fiier este de fapt fiierul logic, prin intermediul cruia se
refer fiierul fizic ntr-un limbaj de programare.
Numele fiierului, identificat n sintaxa funciei prin <nume_fiier>, este
de tip ir de caractere, iar argumentul <mod> este constituit dintr-un caracter
alfabetic. Nu se accept pentru argumentul <mod> majuscule pentru versiunile
de AutoCAD anterioare AutoCAD-ului 2000. Acesta poate s aib valorile
prezentate n tabelul 2.7.

Prof. dr. ing. Gheorghe OANCEA

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)
)

;se asigura intrarea in ciclu while


;se deschide fisierul pentru citirea datelor
;daca exista fiierul
;atta timp cat exista linie in fiier
;se citete o linie din fiier
;daca exista linie afieaz-o pe ecran
;altfel nchide fiierul
;daca nu exista fiierul afieaz mesajul
;ieire fr a fi returnata o valoare

2. Exemplul urmtor definete o nou comand AutoCAD care permite citirea


unui fiier text, i afieaz coninutul acestuia pe ecran.
(defun c:citfis ( / nume linie f rep)
(setq rep T)
;se asigura intrarea in primul ciclu while
(while rep
(setq nume
;se citete numele fiierului
(getstring "\nIntroduceti numele fisierului [cu extensie]:"))
(setq linie T
;se asigura intrarea in al doilea while
f (open nume "r")
;se deschide fiierul pentru citirea datelor
)
(if f
;daca exista fiierul
(while linie
;atta timp cat exista linie in fiier
(setq linie (read-line f))
;se citete o linie din fiier
(if linie (write-line linie) (setq f (close f))) ;daca exista linie se afieaz pe ecran
(setq rep nil)
;se asigura ieirea din primul ciclu while
)
;altfel nchide fiierul
(prompt (strcat \nFISIERUL nume ESTE INEXISTENT!!!))
;daca nu exista fiierul afiseaza mesajul
)
)
(prin1)
;ieire fr a fi returnata o valoare
)

Prof. dr. ing. Gheorghe OANCEA

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"

Observaie: Dac se indic doar o cale de cutare ca argument al funciei


findfile i aceasta exist pe disc, atunci funcia returneaz calea respectiv.
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

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

Cerere de creare a unui nou fiier; nu este indicat setarea


acestui mod atunci cnd se dorete deschiderea unui fiier
existent pe disc.

(bitul 0)

4
(bitul 2)

8
(bitul 3)

16
(bitul 4)

32
(bitul 5)

64

Permite utilizatorului introducerea unui nume arbitrar (utilizat de


regul pentru indicarea extensiilor de fiiere); dac se precizeaz
o extensie anume, atunci aceasta nu mai poate fi modificat n
fereastr, utilizatorul fiind obligat s aleag un fiier existent pe
disc.
Execut o cutare n cile curent setate n AutoCAD pentru
fiierul cerut i returneaz doar numele fiierului respectiv; dac
fiierul este gsit ntr-un alt subdirector atunci este returnat i
calea.
Argumentul <nume_fiier> poate s conin doar o cale de
cutare pentru fiiere.
La alegerea unui fiier de pe disc, utilizatorul nu mai este
avertizat de nlocuirea fiierului selectat, operaia de nlocuire
realizndu-se n mod automat.
Nu transfer fiierul dac utilizatorul specific un URL.

(bitul 6)

128

Nu permite introducerea unui URL.

(bitul 7)

Exemple:
1. Expresia simbolic urmtoare:

Prof. dr. ing. Gheorghe OANCEA

95

(getfiled Selectati un fisier lisp d:\\Program Files\\mdt6\\support\\ex.lsp


LSP8)

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).

Fig. 2.14 Fereastr de dialog generat la apelarea funciei getfiled


cu valoarea 8 pentru <mod>.

96

Visual LISP/AutoLISP

Fig. 2.15 Fereastr de dialog generat la apelarea funciei getfiled


cu valoarea 1 pentru <mod>.

Fig. 2.16 Fereastr de dialog pentru validarea operaiei de nlocuire a fiierului.

Fig. 2.17 Fereastr de dialog generat la apelarea funciei getfiled cu valoarea 1


pentru <mod> i cu extensia DWG.

Prof. dr. ing. Gheorghe OANCEA

97

2.17 Accesul la entitile desenelor


n AutoCAD, oricrei entiti generate ntr-o sesiune de editare i este pus
n coresponden un nume de entitate, atribuit n mod automat de sistem.
Numele de entitate este utilizat la identificarea entitilor AutoCAD. Un nume
de entitate se poate schimba de la o sesiune de editare la alta, dar fiecare nume
de entitate este ntotdeauna acelai (unic) ntr-o sesiune de editare. Acesta este
un atom special de forma <Entity name:xxxxxxx> (unde xxxxxxx este un numr
hexazecimal).
Numele de entiti pot fi utilizate n AutoCAD, de regul ca rspunsuri la
prompter-ul Select objects: . Nu se accept specificarea numelor de entiti, prin
scrierea lor de la tastatur. Sunt predefinite funcii care permit aflarea numelor
de entiti prin parcurgerea bazei de date a AutoCAD-ului sau prin selectare, de
ctre utilizator, a anumitor entiti.
n AutoCAD se ntlnesc dou categorii de entiti: entiti principale i
entiti secundare. Entitile principale sunt clasificare n: entiti AutoCAD
simple (linie, cerc, arc de cerc, punct, solid, text, trace, etc) i entiti compuse
(bloc sau polilinie 3D). Entitile secundare sunt constituite din subentitile care
fac parte din entitile compuse. Entitatea compus e caracterizat de un nume
de entitate care o identific n ntregime i mai multe nume de entiti care
identific subentitile (entitile secundare).
Funcia ENTLAST
Sintax:
(ENTLAST)
Funcia entlast returneaz numele ultimei entiti principale neterse din
baza de date a desenului. Este utilizat de regul pentru a obine numele unei noi
entiti (ultima) generate cu ajutorul funciei command.
Exemplu:
Exemplul de mai jos permite tergerea ultimei entiti desenate n
AutoCAD.
(setq ne (entlast))
(command erase ne )
Funcia ENTNEXT
Sintax:
(ENTNEXT [ <nume_ent> ])

Visual LISP/AutoLISP

98

Dac este apelat fr argument, funcia returneaz numele primei entiti


neterse din baza de date a desenului. Dac entnext este apelat cu un parametru
de tip nume de entitate, atunci returneaz numele entitii (neterse) din baza de
date poziionat imediat dup argumentul <nume_ent>. n cazul n care nu exist
o urmtoare entitate dup entitatea desemnat de argument, funcia returneaz
nil. Entnext returneaz att nume de entiti principale ct i de entiti
secundare (subentiti).
Exemple:
1. Exemplul de mai jos permite tergerea primelor dou entiti desenate n
AutoCAD (dac acestea sunt entiti principale).
(setq ne1 (entnext)
(setq ne2 (entnext e1)
(command erase ne1 ne2 )
2. Urmtorul exemplu parcurge ntreaga baz de date a desenului i afieaz
numrul i numele entitii, indiferent dac acestea sunt principale sau
secundare.
(defun c:contor (/ ne k)
;se initializeaza contorul
(setq k 1
ne (entnext)
;se preia numele primei entitati
)
(while ne
(prompt (strcat "\n Numar entitate:" (itoa k)))
;se afiseaza numarul entitatii
(prompt "\n Nume entitate:")
(prin1 ne)
;se afiseaza numele entitatii
(setq ne (entnext ne)
;se preia numele urmatoarei entitati
k (1+ k)
;se mareste contorul
)
)
(prin1)
)
3. n cazul n care se dorete aflarea ultimei entiti trasate, indiferent dac este
principal sau secundar, se definete urmtoarea funcie:
(defun c:ultimaent (/ neu nsb)
(if (setq neu (entlast))
;se preia numele ultimei entitati principale
(while (setq nsb (entnext neu));daca exista subentitate parcurge while

(setq neu nsb)

; pn cnd nu mai exist subentitate


; se preia numele subentitatii

)
)
neu
)

;returneaz numele ultimei entitati principale sau al subentitatii

Prof. dr. ing. Gheorghe OANCEA

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.

Prof. dr. ing. Gheorghe OANCEA

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).

2.18 Accesul la datele asociate entitilor AutoCAD


Cu ajutorul numelui unei entiti, programatorii pot obine caracteristicile
entitii identificate de acesta. n AutoLISP datele caracteristice entitilor sunt
memorate sub forma unor liste asociate. Listele asociate conin att liste normale
ct i liste speciale denumite perechi cu punct (dotted pairs).

2.18.1 Perechile cu punct n AutoLISP


O pereche cu punct este o list de o form special care conine dou
elemente de tip atom. ntotdeauna, pe ramura cdr (din dreapta) a arborelui binar
(aferent unei perechi cu punct) se gsete un element diferit de nil.
Att listele normale, ct i perechile cu punct sunt utilizate n listele
asociate entitilor, pentru reprezentarea codurilor DXF i a valorilor aferente
acestora.
Primul element al unei perechi cu punct poate fi obinut ca i cel al unei
liste normale, cu funcia car. Al doilea element poate fi obinut direct cu funcia
cdr. Se observ uor c al doilea element al unei liste normale se obine ntr-un
mod diferit.
Forma general a unei perechi cu punct este urmtoarea:

(<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

n figura 2.18 se prezint arborii binari pentru dou obiecte similare: o


list normal i o pereche cu punct, ambele coninnd aceleai elemente.

(0 . LINE)

(0 LINE)

(LINE)

0
LINE

LINE

()

Fig. 2.18 Arborii binari pentru o list normal i o pereche cu punct.


Perechile cu punct pot fi generate prin: nghearea mecanismului de
evaluare (prin apelarea funciei quote) sau cu ajutorul funciei cons.

n Prin nghearea mecanismului de evaluare:


Exemplu:
(setq pp (0 . LINE))
Observaie: A nu se uita spaiile nainte i dup punctul care separ cele dou
elemente ale unei perechi cu punct.
o Prin utilizarea funciei CONS:
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)
(setq ln (list 0 LINE)) (0 LINE)
(car pp)0

Prof. dr. ing. Gheorghe OANCEA

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)

2.18.2 Liste asociate entitilor


Listele asociate entitilor AutoCAD, se prezint sub forma unor liste
AutoLISP complexe, formate din subliste normale i perechi cu punct. Au
urmtoarea form generalizat:
( ...(codDXF [ . valoare ]/[ lista ]) ...)

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

Lista asociat oricrei entiti poate fi obinut cu ajutorul funciei entget.


Funcia ENTGET
Sintax:
(ENTGET <nume_ent> [ <lista-aplic> ])
Funcia entget necesit un argument obligatoriu, care specific numele
entitii pentru care se dorete extragerea listei asociate din baza de date a
AutoCAD-ului.

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)
)

Prof. dr. ing. Gheorghe OANCEA

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

Prof. dr. ing. Gheorghe OANCEA

107

(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)
)
tergerea entitilor AutoCAD din AutoLISP, cu acces direct la baza de
date, se realizeaz cu ajutorul funciei entdel.
Funcia ENTDEL
Sintax:
(ENTDEL <nume_ent>)
Funcia entdel necesit un argument <nume_ent> care reprezint numele
entitii care va fi tears din desenul curent sau al entitii care va fi readus pe
ecran dac aceasta a fost tears anterior n sesiunea curent de editare. Aceast
funcie acioneaz numai pe entiti principale.

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.

Exemplu: Urmtoarea expresie simbolic, genereaz o nou entitate


AutoCAD cu urmtoarele proprieti: de tip LINE, layer-ul de apartenen
NOU, cu punct de start 1.0,1.0,0.0 i punct final 100.0,100.0,0.0 .
(entmake
((0 . LINE)
(8 . NOU)
(10 1.0 1.0 0.0)
(11 100.0 0.0 0.0))

Prof. dr. ing. Gheorghe OANCEA

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.

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

Visual LISP/AutoLISP

110

2.19 Funcii pentru crearea i utilizarea mulimilor de selecie


n AutoCAD entitile pot fi grupate n mulimi de selecie (selection sets).
Mulimile de selecie sunt atomi speciali de forma: <Selection set: xxx>.
Comenzile AutoCAD i funciile AutoLISP pot utiliza mulimile de selecie, n
acest fel intervenindu-se global asupra tuturor entitilor coninute ntr-o
mulime de selecie. n AutoCAD, mulimile de selecie se folosesc n cadrul
comenzilor ce utilizeaz prompter-ul Select objects: .
Chiar dac o mulime de selecie este un atom, aceasta este creat ca o
colecie de nume de entiti.
AutoLISP-ul poate lucra cu maxim 128 de mulimi de selecie, deschise n
acelai timp. Numrul poate fi uneori mai mic, acesta depinde de configuraia de
calcul folosit i de mrimea mulimilor de selecie.
De obicei se asociaz cte un simbol fiecrei mulimi de selecie care se
creeaz sau se modific; n caz contrar nu este posibil accesul la mulimea de
selecie i nu exist nici o modalitate de a elibera resursele sistemului care o
utilizeaz (pn la ieirea definitiv din AutoCAD).
Se recomand ca, n momentul n care o mulime de selecie nu mai este
utilizat n aplicaie, s se atribuie forat simbolului aferent valoarea nil,
eliberndu-se n acest fel memoria ocupat.
AutoLISP-ul conine o serie de funcii pentru crearea i gestionarea
mulimilor de selecie, care sunt prezentate n continuare.
Funcia SSGET
Sintax:
(SSGET [<mod>] [[<pct1>] [<pct2>] [lista_puncte] [lista_filtre]])
Funcia ssget, creeaz returneaz o mulime de selecie. Argumentul
opional <mod> este un ir de caractere care specific metoda de selectare a
entitilor i poate s ia valorile prezentate n tabelul 2.10. Argumentele
opionale <pct1>, <pct2> i <lista_puncte> sunt puncte care completeaz
metoda de selectare. Dac se specific un punct fr un argument <mod>, atunci
va fi selectat entitatea care trece prin acel punct (ca la selectarea individual a
entitilor n AutoCAD). Modurile osnap sunt ignorate de aceast funcie.
Dac toate argumentele din sintaxa funciei ssget sunt omise, atunci
utilizatorul va fi cel care va forma mulimea de selecie, n mod interactiv, pe
prompter-ul Select objects:, afiat automat de mediu. n acest caz poate fi
utilizat orice metod de selectare cunoscut n AutoCAD.

Prof. dr. ing. Gheorghe OANCEA

111

Parametrul opional <lista_filtre> este o list de perechi cu punct sau liste


normale n care apar coduri DXF. Acest parametru este utilizat pentru filtrarea
entitilor din AutoCAD care satisfac anumite condiii.
Tabelul 2.10
Metoda de selectare
Semnificaia
L
Selectarea ultimei entiti desenate (last).
P
Selectarea tuturor entitilor indicate n cadrul
mulimii anterioare de selecie.
Selectarea tuturor entitilor care se gsesc n
W
ntregime n fereastra delimitat de argumentele
<pct1> i <pct2> (Window).
Selectarea tuturor entitilor care se gsesc n
WP
ntregime n poligonul descris prin argumentul
<lista_puncte> i (Window Polygon).
Selectarea tuturor entitilor coninute i a celor
C
care ating (traverseaz) fereastra delimitat de
argumentele <ptc1> i <pct2> (Crossing).
Selectarea tuturor entitilor coninute i a celor
CP
care traverseaz (ating) poligonul descris prin
argumentul <lista_puncte> i (Crossing Polygon)
Selectarea tuturor entitilor care traverseaz
F
(ating) conturul descris prin argumentul
<lista_puncte> i (Fence)
Selectarea tuturor entitilor din desen, dac nu
apare o list de filtre, vor fi selectate toate
X
entitile care satisfac condiiile impuse de lista
de filtre.

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

(ssget C (1.0 2.0) (20.0 10.0))


;selecteaz toate entitile coninute i a celor care ating fereastra
;determinat de punctele 1,2 i 20,10
(ssget CP (list (1.0 2.0) (20.0 10.0) (150.0 50.0) (20.0 80.0))
((0 . LINE)))
;selecteaz toate entitile aflate n ntregime sau care ating poligonul
;determinat de punctele 1,2 20,10 150,50 20 80 i sunt linii
(ssget F (list (1.0 2.0) (20.0 10.0) (150.0 50.0) (20.0 80.0)))
;selecteaz toate entitile care ating conturul delimitat de
;punctele 1,2 20,10 150,50 i 20 80
(ssget (100.0 20.0))
;selecteaz entitatea care trece prin punctul 100,20
(ssget X)
;selecteaz toate entitile din baza de date a desenului
(ssget X ((0 . LINE)))
;selecteaz toate entitile de tip linie din desen
(ssget X (list (cons 0 CIRCLE)))
;selecteaz toate cercurile din desen
(ssget X (list (cons 0 LINE) (cons 8 L1)))
;selecteaz toate entitile de tip linie care se gsesc n layer-ul L1
(ssget "X" (list (cons 0 "ARC") (cons 8 EXEMPLU)(cons 62 1)))
;selecteaz toate entitile de tip arc care se gsesc n layer-ul EXEMPLU
;i sunt de culoare RED (codul 1)
Prin intermediul codului -4 pot fi realizate grupri logice n lista de filtre.
Operatorii logici utilizai sunt urmtorii: <AND........AND> (pentru mai muli
operanzi), <OR........OR> (pentru mai muli operanzi), <XOR........XOR> (pentru
doi operanzi) i <NOT........NOT> (pentru un operand). Operatorii sunt
specificai ca iruri de caractere majuscul.
Exemplu:
(ssget X ((-4 . <OR)
(-4 . <AND)
(0 . CIRCLE)
(40 . 20.0)
(-4 . AND>)
(-4 . <AND)
(0 . LINE)
(8 . L1)
(-4 . AND>)
(-4 . OR>))
);selecteaz toate cercurile din desenul curent cu raza de 20.0 i toate
liniile din layer-ul L1
Observaii:

Prof. dr. ing. Gheorghe OANCEA

113

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

;genereaz o mulime de selecie format din


;ultima entitate desenat
;returneaz numrul de elemente din mulime

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))

;se genereaz o mulime de selecie format


;din toate entitile din desen
(setq e1 (ssname s1 0) ;se preia numele primei entiti din mulime
e12 (ssname s1 11);se preia numele entitii de pe poziia a 11-a
;(a 12-a pentru utilizator)
e100 (ssname s1 99) ;se preia numele entitii de pe poziia a 99-a
;(a 100-a pentru utilizator)
)

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:

Prof. dr. ing. Gheorghe OANCEA

(setq e1 (entnext))
(setq s1 (ssadd))
(setq s2 (ssadd e1))
(setq e2 (entnext e1))
(setq s2 (ssadd e2 s2))

115

;se preia prima entitate din baza de date


;se genereaz o mulime de selecie vid
;se genereaz o mulime cu o singur entitate
;se preia o nou entitate din baza de date
;se adaug la s2 entitatea e2

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)

;se preia prima entitate din baza de date


;se preia urmtoarea entitate din baza de date
;se genereaz o mulime de selecie, s1, format
;din e1
;returneaz numele de entitate e1
;returneaz nil deoarece e2 nu face parte din
;mulimea de selecie

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.

Fig. 3.1 Conturul de trasat.

Fig. 3.2 Simbolurile utilizate n program.

Prof. dr. ing. Gheorghe OANCEA

117

Programul AutoLISP care rezolv problema propus este prezentat n


continuare, iar la scrierea acestuia s-a inut cont de simbolurile indicate n figura
3.2.
(defun c:ex1 (/ r p1 p2 p3 p4 p5 p6 p7 cmd osm)
(setq cmd (getvar "cmdecho"))
;se preia starea curent a variabilei CMDECHO

(setvar "cmdecho" 0)
;se seteaz variabila CMDECHO pe zero (se inhib ecoul)

(setq osm (getvar "osmode"))


;se preia starea curent a variabilei OSMODE

(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

(setvar "osmode" osm)


;se restaureaz vechea valoare a variabilei CMDECHO
(prin1) ;pentru quiet exit

118

Visual LISP/AutoLISP

3.2 Pentru conturul indicat n figura 3.3 s se defineasc o nou comand


AutoCAD care s permit trasarea acestuia (fr grosime), n layer-ul curent, cu
inhibarea ecoului i a modurilor OSNAP la desenare. Datele de intrare sunt:
punctul de baz P1, lungimea L i nlimea H.

Fig. 3.3 Conturul de trasat cu simbolurile aferente.


Programul AutoLISP care rezolv problema propus este prezentat n
continuare, iar la scrierea acestuia s-a inut cont de simbolurile indicate n figura
3.3.
(defun c:ex2 (/ p1 p2 p3 p4 L h 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:))
(initget 7)
(setq L (getdist p1 \nLungimea L:))
(initget 7)
(setq h (getdist p1 \nInaltimea H:))
(setq
;se calculeza valorile simbolurilor necesare generarii
p2 (list (+ (car p1) L) (cadr p1))
p3 (list (car p2) (+ (cadr p2) H))
p4 (list (car p1) (cadr p3))
p5 (list (+ (car p1) (/ L 2)) (+ (cadr p4)(* L (cos(/ pi 6)))))
)

Prof. dr. ing. Gheorghe OANCEA

119

;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)

)
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

3.3 Pentru conturul din figura 3.4 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 i cu urmtoarele date
de intrare: punctele P1, P2 poziionate pe o orizontal i raza R.

Fig. 3.4 Conturul de trasat cu simbolurile aferente.


Programul AutoLISP care rezolv problema propus este prezentat n
continuare, iar la scrierea acestuia s-a inut cont de simbolurile prezentate n
figura 3.4.
(defun c:ex3 (/ r r2 p1 p2 p3 p4 p5 p6 p7 cmd osm ortho )
(setq osm (getvar osmode))
(setq cmd (getvar cmdecho))
(setq ortho (getvar orthomode))
(setvar orthomode 1)
;se activeaza modul ortho
(setvar osmode 0)
(setvar cmdecho 0)
(initget 1)
(setq p1 (getpoint \nIntroduceti punctul P1:)) ;se citeste punctul P1
(initget 1)
(setq p2 (getpoint p1 \nIntroduceti punctul P2:)) ;se citeste punctul P2
(setvar orthomode ortho)
(initget 7)
(setq r (getdist p1 \nRaza R:)) ;se citeste raza
(setq
;se calculeza simbolurile necesare generarii
r2 (-(car p2) (car p1) r)
p3 (list (car p2) (- (cadr p2) r2))

Prof. dr. ing. Gheorghe OANCEA

121

p4 (list (- (car p3) r2) (cadr p3))


p5 (list (car p1) (- (cadr p1) r))
p6 (list (car p4) (cadr p5))
p7 (list (car p6) (cadr p1))
)
(command circle p1 r
;se traseaza conturul
circle p2 p7
circle 2p p3 p4
line p1 p4 p2 c
line p3 p4 p7
line p5 p6
)
(setvar osmode osm)
(setvar cmdecho cmd)
(prin1)
)
3.4 Pentru seciunea prezent n figura 3.5 s se defineasc o nou
comand AutoCAD care s permit trasarea acesteia (fr grosime), n layer-ul
curent, cu inhibarea ecoului i a modurilor OSNAP la desenare. Datele de intrare
vor fi: punctul de baz P1, raza R i nlimea H. Caracteristicile haurii, ce
urmeaz a fi trasat, sunt: definit de utilizator, liniile de haur sunt aflate la
distana de 2 i sunt nclinate la 45.

Fig. 3.5 Seciunea de trasat cu simbolurile aferente.


Programul AutoLISP care parametrizeaz seciunea propus este prezentat
n continuare. La scrierea acestuia s-a inut cont de simbolurile indicate n figura
3.5.

Visual LISP/AutoLISP

122

(defun c:ex4 (/ r p1 p2 p3 p4 p5 p6 cmd osm )


(setq osm (getvar osmode))
(setq cmd (getvar cmdecho))
(setvar osmode 0)
(setvar cmdecho 0)
(initget 1)
(setq p1 (getpoint \nIntroduceti punctul de baza P1:))
(initget 7)
(setq r (getdist p1 \nIntroduceti Raza R:))
(initget 7)
(command circle p1 r)
(setq h (getdist (list (car p1) (+ (cadr p1) r))
"\nIntroduceti inaltimea H:"))
;se introduce inaltimea cu punct de baza quadrant-ul cercului situat la 90 de grade

(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)
)

3.5 Pentru piesa din figura 3.6 s se defineasc o nou comand


AutoCAD care s permit trasarea acesteia (fr grosime), 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 i nlimea H. 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.
Caracteristicile haurii sunt urmtoarele: definit de utilizator, liniile de haur
sunt aflate la distana de 2 i sunt nclinate la 45.

Prof. dr. ing. Gheorghe OANCEA

123

Fig. 3.6 Piesa de generat cu simbolurile aferente.


Aplicaia care rezolv problema propus mai sus, este prezentat n
continuare.
(defun c:ex5 (/ r1 r2 h p1 p2 p3 p4 p5 p6 cmd osm )
(setq osm (getvar "osmode"))
(setq cmd (getvar "cmdecho"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(initget 1)
(setq p1 (getpoint "\nIntroduceti punctul de baza P1:"))
(initget 7)
(setq r1 (getdist p1 "\nIntroduceti Raza mare R1:"))
(command "circle" p1 r1)
(setq r2 (1+ r1)) ;se asigura intrarea in while
(while (>= r2 r1) ;atat timp cat raza R2 este >= decat R1
(initget 7)
(setq r2 (getdist p1 "\nIntroduceti Raza mica R2:")) ;se introduce R2
(if (>= r2 r1) (princ "\nRaza R2 prea mare"))
;daca R2>=R1 se afiseaza mesaj de eroare

)
(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

(if (or (< h (+ r1 r2)) (> h (* 2 r1)))


(princ "\nInaltimea H nu este corespunzatoare"))

124

Visual LISP/AutoLISP

;daca h< R2+R1 sau h> 2*r1 se afiseaza mesaj de eroare

)
(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.

Fig. 3.7 Modelul 3D de generat.

Prof. dr. ing. Gheorghe OANCEA

125

Programul care parametrizeaz modelul 3D din figura 3.7, este prezentat


n continuare.
(defun c:ex6 (/ r1 r2 p1 p2 p3 p4 p5 p6 he ue e1 e2 e3 m3d cmd osm lwd)
(setq osm (getvar "osmode"))
(setq cmd (getvar "cmdecho"))
(setq lwd (getvar "lwdisplay"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setvar "lwdisplay" 1)
(initget 1)
(setq p1 (getpoint "\nIntroduceti punctul de baza P1:"))
(initget 7)
(setq r1 (getdist p1 "\nIntroduceti Raza mare R1:"))
(command
"lweight" 0.35 ;se seteaza grosimea de 0.35
"circle" p1 r1)
(setq e1 (entlast));se preia numele aferent primei entitati trasate
(setq r2 (1+ r1)) ;se asigura intrarea in while
(while (>= r2 r1) ;atata timp cat raza R2 este >= decat R1 se repeta
(initget 7)
(setq r2 (getdist p1 "\nIntroduceti Raza mica R2:")) ;se introduce R2
(if (>= r2 r1) (princ "\nRaza R2 prea mare"))
;daca R2>=R1 se afiseaza mesaj de eroare

)
(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

;se introduce inaltimea cu punct de baza p4

(if (or (< h (+ r1 r2)) (> h (* 2 r1)))


(princ
"\nInaltimea
corespunzatoare"))
;daca h< R2+R1 sau h> 2*r1 se afiseaza mesaj de eroare

)
(setq
p2 (list (car p1) (-(cadr p1) (- h r1)))

nu

este

Visual LISP/AutoLISP

126

p3 (list (car p1) (- (cadr p1) r1 ))


p5 (list (- (car p1) r1 5) (cadr p2))
p6 (list (+ (car p1) r1 5) (cadr p2))
);se calculeaza punctele caracteristice
(command "line" p5 p6 "" ;se traseaza linia
"zoom" "e")
;se preia numele acesteia
(setq e3 (entlast))
(command "trim" p4 p2 "" p3 p5 p6 "")
(initget 1)
(setq He (getdist p1 "\nIntroduceti inaltimea de extrudare He:"))
;se introduce inaltimea de extrudare He

(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)
)

Prof. dr. ing. Gheorghe OANCEA

127

BIBLIOGRAFIE

1. Oancea, Gh. Bruda, F., Drgoi, M.V, Grafic tehnologic asistat de


calculator. Parametrizarea desenelor n AutoCAD utiliznd AutoLISP,
Universitatea Transilvania din Braov, 1996.
2. Pozdrc, Al., Mocian, I., Albert, K., AutoCAD - programare n AutoLISP.
Editura Universitii Petru Maior Trgu-Mure, 2001.
3. * * * , Visual LISP Developer's Guide, Autodesk, 2000-2002.
4. * * *, AutoLISP Programmers Reference - Release 12, Autodesk Ltd, 1992.
5. * * *, Colecia de reviste Hello CAD_FANS, 1991-1997, Editura Fast Impex
Ltd, Bucureti.
6. * * * , AutoCAD Customization Guide, Autodesk, 1992-1998.
7. * * *, Fundamentals of AutoLISP, Autodesk Inc. Training Departament,
1992-1996.
8. * * *, DXF Reference, Autodesk, 2000-2002.

S-ar putea să vă placă și