Sunteți pe pagina 1din 268

50793936.doc R.2.1 2/3/2011 ATC.

Iasi •1

AutoLISP

Introducere
AutoLISP-ul este un limbaj de programare pentru AutoCAD.
Acest curs ofer\ cursantului posibilitatea de a-[i `nsu[i
cuno[tin]e practice de lucru `n AutoLISP prin cursuri [i texte
care explic\ structura [i sintaxa limbajului [i rela]ia acestuia
cu AutoCAD-ul. Prin exerci]ii aplicative la teoria de
programare [i exemple concrete cursantul `[i completeaz\
aceste cuno[tin]e.

Acest curs reprezint\ o culegere de texte [i un ghid pentru


un curs AutoLISP pe o perioada de 3 zile, oferit de
Autodesk, Inc. Training Department. La exerci]iile de
proiectare se adaug\ lec]ii suplimentare [i discu]ii la obiect.
Acest curs poate fi folosit individual atunci c`nd este `n
combina]ie cu o dischet\ ce con]ine fi[ierele necesare
pentru rezolvarea exerci]iilor.

Acest curs este bazat pe o versiune AutoLISP ce poate fi


g\sit\ pe toate platformele pe care este implementat
AutoCAD R12.

Obiective
La sf`r[itul acestui curs, cursantul va fi capabil s\ `n]eleag\
sintaxa AutoLISP, o varietate de func]ii standard [i procesul
de evaluare Lisp. Cursantul va putea folosi
AutoLISP-ul pentru:
• Utilizarea comenzilor AutoCAD prin intermediul
func]iilor de baz\ AutoLISP.
• Crearea de noi func]ii AutoLISP.
• Crearea de noi func]ii AutoCAD pe baza limbajului
AutoLISP.
• Corectarea [i modificarea entit\]ilor din baza de
date a AutoCAD-ului.
• Citirea [i scrierea `n fi[iere cu texte ASCII cu
ajutorul limbajului AutoLISP.
• Combinarea programelor de tip AutoLISP cu
fi[ierele AutoCAD de tip script.

50793936.doc R.2.1 2/3/2011 ATC. Iasi •1


AUTODESK, INC.

Cuprins
Acest material cuprinde subiectele prezentate mai jos.
Explicarea acestor subiecte reprezint\ con]inutul principal al
capitolelor de mai jos.
Introducere...........................................................................1
Generalit\]i............................................................................3
Expresii simbolice.................................................................7
Atomi [i liste........................................................................13
Evalu\ri ...............................................................................21
Expresii simbol AutoLISP far\ comenzi AutoCAD.................35
Tipuri de date numerice......................................................41
Puncte AutoCAD [i liste AutoLISP........................................47
Prelucrare de liste...............................................................57
Comenzi AutoCAD [i liste AutoLISP.....................................71
Selec]ie interactiv\ de puncte.............................................79
Func]ii.................................................................................87
Func]ii care ac]ioneaz\ ca [i comenzi AutoCAD...................97
Fi[iere de programare AutoLISP........................................101
Func]ia C...........................................................................105
Teste logice [i condi]ionale...............................................113
Bucle de program.............................................................123
Opera]ii cu [iruri................................................................131
Acces la entit\]i.................................................................139
Liste asociate entit\]ilor....................................................147
Modificarea unei entit\]i....................................................155
Selectarea grafic\ a unei entit\]i.......................................165
Tratarea erorilor...............................................................171
Opera]ii cu fi[iere..............................................................175
................................................................................................
Seturi de selec]ie..............................................................193
Tabele [i nume de obiecte................................................203
Fi[iere script [i AutoLISP....................................................211

•2
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la entit\]i simple [i la polilinii...............................217


Accesul la entit\]i simple [i la blocuri................................221
Crearea entit\]ilor cu func]ia entmake.............................225
Crearea poliliniilor [i a definitiilor de bloc cu func]ia
entmake ...........................................................................227
Tratarea [irurilor...............................................................231
Tratarea entit\]ilor............................................................243

50793936.doc R.2.1 2/3/2011 •3


AUTODESK, INC.

Generalit\]i despre AutoLISP


Ce este AutoLISP-ul ?

AutoLISP-ul este un dialect al limbajului de programare Lisp


utilizat pentru completarea posibilit\]ilor de proiectare `n
AutoCAD.

Lisp este un acronim pentru list processing (in alte texte,


list programming. Este un limbaj de programare superior
foarte cunoscut pentru aplica]iile lui `n domeniul sistemelor
specializate, inteligen]\ artificial\, programare pe baz\ de
reguli [i AutoCAD.

Lisp este unul dintre limbajele de programare cele mai


vechi. Ca [i FORTRAN, primele implement\ri ale limbajului
Lisp dateaz\ din anii 60. Multe sublimbaje ale limbajului Lisp
exist\ `n prezent, incluz`nd Common Lisp, Franz Lisp, Mu
Lisp [i X Lisp.

Limbajul Lisp are multe caracteristici care se adreseaz\ at`t


profesioni[tilor c`t [i amatorilor.
• AutoLISP are o sintax\ simpl\, precis\. Procesul de
evaluare [i sintaxa folosit\ pentru crearea
expresiilor Lisp sunt u[or de `nv\]at.
• Este un interpretor a[a `nc`t rezultatele ob]inute
din calcule pot fi vizualizate interactiv `ntr-o
sesiune AutoCAD.
• AutoLISP interac]ioneaz\ direct cu AutoCAD f\r\ s\
necesite programe de sprijin extern, cum ar fi
compilatorul.
• Programele AutoLISP s`nt u[or de `n]eles [i
modificat.
• AutoLISP-ul este capabil de itera]ie [i recursivitate.
Func]iile pot utiliza instruc]iuni condi]ionale [i
de start standard [i pot fi definite `n a[a fel
`nc`t o func]ie apeleaza la recursiune .
• AutoLISP-ul `ncurajeaz\ programatorul s\ scrie
func]ii simple,structurate [i s\ combine aceste
func]ii cu scopul de a crea programe complexe
dar u[or de `n]eles.
Pentru cei ce s`nt interesa]i s\ lucreze cu programe
AutoLISP le recomand\m urm\toarele c\r]i:

Common LISP: A Gentle Introduction to Symbolic


Computing de David S. Touretzky; LISP de Winston & Horn

•4
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Looking at LISP de Tony Hasemer Common LispCraft de


Robert Wilensky AutoLISP Programmer's Reference
Manual.

Ce poate face AutoLISP-ul ?


AutoLISP-ul este o scul\ puternic\. Poate fi folosit pentru a
adapta AutoCAD-ul la orice fel de aplica]ii, f\c`nd astfel
AutoCAD-ul mai sensibil la modul de lucru. Multe dintre cele
mai complicate aplica]ii proiectate pentru AutoCAD folosesc
pe scar\ larg\ limbajul de programare AutoLISP.

AutoLISP poate crea subrutine [i macrouri puternice.


Subrutinele AutoLISP pot fi alc\tuite din comenzi AutoCAD [i
func]ii AutoLISP [i pot automatiza opera]ii complexe `n
cadrul AutoCAD-ului.

Subrutinele AutoLISP pot crea noi func]ii AutoLISP [i noi


comenzi AutoCAD care pot fi folosite `n linia de comand\
sau `n cadrul fi[ierelor script [i menu-urilor AutoLISP.

Cum `nc\rc\m AutoLISP-ul ?


AutoLISP-ul este o component\ standard a AutoCAD-ului,
portabil\ pe toate ma[inile de calcul. Interpretorul AutoLISP
se `ncarc\ automat la fiecare sesiune AutoCAD.

AutoLISP opereaz\ `n cadrul editorului grafic AutoCAD.


Interpretorul st\ `n "umbr\" `n timpul unei sesiuni de
interpretare grafic\ a[tept`nd s\ evalueze o expresie
simbolic\ introdus\ `n linia de comand\ a AutoCAD-lui.

AutoLISP-ul este disponibil numai `n cadrul editorului


grafic.

Ce trebuie s\ [tim pentru a folosi AutoLISP-ul ?


• Cuno[tinte temeinice de lucru cu AutoCAD.
Trebuie de asemenea s\ ave]i cuno[tin]e despre:
• Fi[iere script.
• Menu-uri utilizator.
~n unele cazuri este mai simplu [i mai u[or s\ optimiza]i o
secvent\ de desenare cu un fi[ier script sau cu un menu de
baz\ dec`t s\ folosi]i un program AutoLISP.

Ce editor de text ar trebui folosit ?


Este nevoie de un editor de text ASCII pentru a crea fi[iere
program AutoLISP pe baza acestui manual.

50793936.doc R.2.1 2/3/2011 •5


AUTODESK, INC.

Fi[ierele de text ASCII pot fi `nt`lnite sub denumirea de


fi[iere "programmer", "non-document" sau "unformatted".

Versiunea MS-DOS® 5.0 a ap\rut cu un editor de text


simplu numit EDIT. Dac\ folosi]i versiunea DOS 386 a
AutoCAD-ului din acest manual este posibil s\ dori]i s\
folosi]i acest editor.

Aplica]ia NOTEPAD din Microsoft® WindowsTM este un editor


de text ASCII a[a cum este aplica]ia Text Editor din Sun
Mycrosystems® SPARCTM din Open WindowsTM.

Exist\ o varietate de editoare de text gratuite [i care circul\


liber pentru AutoCAD [i AutoLISP `n cadrul Forumului
CompuServe AutoCAD (GO ACAD). Orice editor profesional
de programare este o unealt\ bun\ cu care se pot scrie
fi[iere program AutoLISP.

Hardware pentru AutoLISP [i necesarul de memorie


Computerul dumneavoastr\ trebuie s\ aib\ hardware-ul [i
memoria cerut\ de AutoCAD pentru a putea folosi AutoLISP-
ul. Manualele AutoCAD Interface [i Installation And
Performance Guide prezint\ cerin]ele specifice fiec\rei
platforme.

Lansarea `n execu]ie
Lansa]i editorul grafic AutoCAD `nainte de a lansa orice alt\
comanda. Va trebui s\ introduce]i s-expresiile AutoLISP din
linia de comand\.

V\ suger\m s\ lansa]i sesiunea de editare grafic\ ori de c`te


ori utiliza]i acest manual.

•6
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Expresii simbolice

Expresiile simbolice s`nt instruc]iuni de baz\ ale


limbajului AutoLISP.

Obiective
~n acest capitol ve]i `nv\]a:
• Cum s\ crea]i o expresie simbolic\
• Cum recunoa[te AutoCAD-ul expresiile simbolice
• Cum s\ folosi]i expresiile simbolice `n cadrul
comenzilor AutoCAD
• Cum s\ afla]i valoarea unei expresii simbolice

Instruc]iuni `n AutoLISP

~n principal LISP-ul proceseaz\ listele: el proceseaz\ [i


evalueaz\ listele de obiecte. AutoLISP-ul proceseaz\ liste
cunoscute ca expresii simbolice, `n cadrul AutoCAD-ului.

Listele s`nt principalul mijloc de construire a expresiilor


simbolice `n AutoLISP. O expresie simbolic\ din AutoLISP
poate fi comparat\ cu o propozi]ie `n limba englez\.

O expresie simbolic\ sau o s-expresie are `ntotdeauna o


anumit\ valoare. Func]ia principal\ a LISP-ului este s\
determine valoarea unei s-expresii. De fiecare dat\ c`nd
lans\m o s-expresie interpretorului LISP (de obicei sub
forma unei liste, el va evalua acea expresie [i ne va da
rezultatul. Acest rezultat se nume[te valoarea expresiei.

O expresie simbolic\ sau o s-expresie reprezint\ pur [i


simplu o instruc]iune `n LISP.

S-expresiile `n AutoLISP s`nt construite prin `ncadrarea


unei secven]e valide de caractere `ntre paranteze.
Caracterul parantez\ st`nga sau ( se nume[te parantez\
deschis\ [i caracterul parantez\ dreapta sau ) se nume[te
parantez\ `nchis\. ~n mod obi[nuit aceste caractere s`nt
denumite deschis [i `nchis.

Parantezele dintr-o s-expresie trebuie s\ fie echilibrate.


Oric\rei paranteze deschise trebuie sa-i corespund\ una
`nchis\.

Obs. Cea mai frecvent\ gre[eal\ `n AutoLISP este


ne`nchiderea parantezelor. Editoarele de text profesionale

50793936.doc R.2.1 2/3/2011 •7


AUTODESK, INC.

au aceast\ caracteristic\ de a g\si parantezele


corespondente cu un minim de efort.

Cum recunoa[te AutoCAD-ul o s-expresie

AutoCAD-ul recunoa[te o s-expresie AutoLISP printr-o


parantez\ deschis\. Dac\ g\se[te o astfel de parantez\,
AutoCAD-ul transfer\ intrarea utilizatorului c\tre
interpretorul AutoLISP [i a[teapt\ rezultatul. AutoCAD
afi[eaz\ rezultatul s-expresiei.

Command: (+ 1 2)

(+ 1 2)
AutoC AD AutoLISP
3

3
Command:

Figura 1. Diagrama de comunicatie dintre AutoCAD si AutoLISP

Exemplu
Pe linia de comand\ a AutoCAD-ului `nscrie]i s-expresiile `n
coloana din st`nga a tabelului care urmeaz\. Compara]i
rezultatele date de AutoCAD cu rezultatele care se afl\ `n
coloana din dreapta a tabelului.
Command:(+12)
3
Command:
S-expresii Rezultate
(+ 1 2) 3
(- 2 1) 1
(/ 4 2) 2
(* 4 2) 8
Tabelul 1. Rezultatele expresiilor simbolice

•8
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

S-expresiile [i comenzile AutoCAD


S-expresiile pot fi introduse ca intrare la comenzi AutoCAD.
AutoCAD-ul va recunoa[te parantezele deschise, va
transfera intrarea interpretorului AutoLISP [i va a[tepta
rezultatul.

AutoCAD-ul tip\re[te rezultatul intr\rii s-expresiilor pe linia


de comand\. AutoCAD-ul folose[te rezultatul unei s-expresii
introduse, drept intrare la comanda curent\.

Command:array
last
polar
5,5
(/ 360 15)

(/ 360 15)
AutoCAD 24
AutoLISP

Command:array
last
polar
5,5
20
Figura 2. Cum AutoCAD-ul si AutoLISP-ul comunica intr-o comanda AutoCAD

50793936.doc R.2.1 2/3/2011 •9


AUTODESK, INC.

Exemplu
~n comanda "polar array" care urmeaz\, `mp\r]ind 360 de
grade la 15 se determin\ num\rul de obiecte de creat, de
exemplu se creaz\ un obiect la fiecare 15 grade de rota]ie.

Introduce]i comenzile.
Command: line
From point: 5,5
To point: 5,8
To point: Enter

Command: array
Select objects: last
1 found
Select objects: Enter
Rectangular or Polar array (R/P): p
Center point of array: 5,5
Number of items: (/ 360 15)
Angle to fill (+=ccw, -=cw) <360>:Enter
Rotate objects as they are copied? <Y>Enter

Figura 3. Expresia (/360 15) genereaza un array de 24 linii

Caracterul semnul exclam\rii


AutoCAD-ul analizeaz\ intrarea utilizatorului `n linia de
comand\ caut`nd un alt caracter AutoLISP asociat: semnul
exclamarii sau !. Acest caracter este denumit `n mod
frecvent bang. Dac\ semnul exclamarii este primul
caracter, AutoCAD-ul transfer\ intrarea c\tre interpretorul
AutoLISP [i a[teapt\ rezultatul.

Orice s-expresie valid\ poate urma dup\ semnul exclam\rii.

Command: !(+ 12)

•10
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Caracterul "bang" este deseori folosit pentru a cere


AutoLISP-ului valoarea unui simbol. ~n acest caz, simbolul
nu trebuie s\ se afle `ntre paranteze.

Command: !pi

Exemplu
pieste un simbol predefinit `n AutoLISP. Extrage]i valoarea
simbolului pi pe linia de comand\ AutoCAD.
Command: !pi
3.14159
Command:

Recapitulare

• S-expresiile s`nt expresii AutoLISP valide aflate


`ntre paranteze.
• AutoCAD-ul caut\ dou\ caractere speciale:
parantezele deschise sau open [i semnul
exclam\rii sau bang.
• Open indic\ AutoCAD-ului c\ urmeaz\ o s-expresie.
• Bang indic\ AutoCAD-ului c\ urmeaz\ o s-expresie
sau un simbol.
• S-expresiile [i caracterul bang pot fi folosite `n linia
de comand\ sau `n cadrul comenzilor AutoCAD.
• Caracterul bang poate precede S-expresiile sau
simbolurile.

50793936.doc R.2.1 2/3/2011 •11


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•12
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Atomi [i liste

Exist\ dou\ mari categorii de tipuri de date `n AutoLISP:


atomi [i liste. Atomii s`nt obiecte simple. Listele s`nt
obiecte complexe. Acest capitol define[te atomii [i listele.

Obiective

~n acest capitol se va studia:


• Diferen]a dintre atomi [i liste
• Componentele unei liste
• Cum s\ recunoa[tem un raport de erori AutoLISP
• Natura obiectului AutoLISP nil

Atomi

Un atom este cel mai simplu tip de date din Lisp. Un atom
poate fi un num\r `ntreg
• 1
• un num\r real
• 4587.993401
• un [ir de caractere
• “A String Of Pearls “
• o func]ie AutoLISP predefinit\
• +
• un simbol
• XYZ
• sau oricare alt tip de obiecte existente `n tabelul 3-1.

50793936.doc R.2.1 2/3/2011 •13


AUTODESK, INC.

Tipuri de atomi Exemple Tip de data


AutoLISP

simbol pi,x,mid_pt SYM

sir "Hello, world." STR

intreg 1,32767,-32768 INT

numar real 1.0,45.678,-876543.21 REAL

descriptor de fi[ier <File: #a82> FILE

nume entitate AutoCAD <Entity name: 6000001a> ENAME

set de selectie AutoCAD <Selection set: 1> PICKSET

subr (functie interna) <Subr: #1e32> SUBR

subr externa (Functia ADS) <Ext. Subr: 1 #3a970498> EXSUBR

Tabelul 2. Exemple de atomi din AutoLISP si tipul de date al acestora

Exist\ o regul\ simpl\ pentru a afla dac\ un obiect este un


atom sau o list\. Dac\ obiectul nu se afl\ `ntre paranteze
atunci este un atom; dac\ da, atunci este o list\.

Liste
Listele s`nt s- expresii complexe formate din atomi [i/sau
alte liste. Listele necesit\ sintaxe simple dar riguroase.
• O list\ trebuie s\ se afle `ntre paranteze.
• Pentru orice list\ care poate fi evaluat\, primul
termen din cadrul listei respective trebuie s\ fie
o func]ie.
• Obiectele din cadrul listei trebuie separate prin cel
pu]in un spa]iu.
Iat\ c`teva exemple de liste. Observa]i c\ fiecare obiect
este separat printr-un spa]iu de celelalte obiecte din cadrul
listei.
(+ 1 2 )
(- 4 2 )
(x y z )
(1.0 1.0 0.0 )

Despre evaluarea listelor vom vorbi pu]in mai t`rziu.

Elementele unei liste


Atomii [i listele pot fi combinate sub form\ de liste. ~n
urm\toarele patru exemple am introdus trei atomi `ntr-o
list\. Fiecare atom este un element al listei.

•14
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
Aceast\ list\ are trei elemente: numerele reale 1.0, 1.0 [i
0.0
(1.0 1.0 0.0)
Aceast\ list\ are trei elemente: func]ia de adunare +
(func]ie intern\), nr. `ntreg 1 [i nr. `ntreg 3.
(+ 1 3)

Aceast\ list\ are trei elemente: func]ia de adunare +, nr.


`ntreg 1 [i list\ (+ 2 3)
(+ 1 (+ 2 3 ))

(+ 1 (+ 2 3))

First elem ent: +


S econd elem ent: 1
Third elem ent: (+ 2 3)
Figura 4. Lista de trei elemente: doi atomi si o lista

Exemplu

Aceast\ list\ are trei elemente: func]ia de adunare +, lista


(+ 1(+ 2 3)) [i lista (+ 4 5).

(+ (+ 1 (+ 2 3)) (+ 4 5))

(+ (+ 1 (+ 2 3)) (+ 4 5))

F irst e le m e n t: +
S e co n d e le m e n t: (+ 1 (+ 2 3 ))
T h ird e le m e n t: (+ 4 5 )
Figura 5. Lista de trei elemente: un atom si doua liste.

Ceea ce este `ncadrat `ntre paranteze reprezint\ o list\.

O list\ se compune dintr-o parantez\ de deschidere


urmat\ de zero sau de mai multe obiecte care pot fi
atomi sau liste dup\ care urmeaz\ o parantez\ de
`nchidere.

50793936.doc R.2.1 2/3/2011 •15


AUTODESK, INC.

Condi]ii de eroare
C`nd introduce]i s-expresii `n linia de comand\ AutoCAD,
interpretorul AutoLISP v\ va spune dac\ a]i introdus o
expresie neechilibrat\. O expresie neechilibrat\ are mai
multe paranteze deschise dec`t `nchise.

Iat\ o expresie neechilibrat\. ~i lipse[te o parantez\ `nchis\.


Command: (+ 1 (+ 2 3)
1>
AutoLISP-ul semnalizeaz\ o expresie neechilibrat\ printr-un
mesaj special.
n>
unde n este num\rul de paranteze `nchise care lipsesc.

S`nt dou\ modalit\]i de rezolvare `n cazul condi]iilor de


eroare: completa]i num\rul corect de paranteze `nchise sau
ap\sa]i Ctrl-C pentru a anula expresia [i a ne re`ntoarce `n
linia de comand\.

Not\ Este de asemenea posibil s\ vede]i acest mesaj c`nd


un [ir este neechilibrat. Un [ir neechilibrat are ghilimele
duble la un cap\t [i simple la cel\lalt.

Particularit\]ile obiectului nil


Toate obiectele din AutoLISP s`nt atomi sau liste. Atomii [i
listele se exclud mutual. Un atom nu este niciodat\ list\ [i o
list\ nu este niciodat\ atom.

Excep]ia o face obiectul nil.

Obiectul nil este "lista goal\". Prin conven]ie nil este [i


atom [i list\. nil poate fi exprimat `n dou\ moduri: 0 sau nil;.

nileste echivalentul AutoLISP pentru fals. Multe func]ii `n


AutoLISP testeaz\ dac\ o condi]ie este adevarat\ sau fals\,
de exemplu dac\ valoarea unui num\r este mai mare dec`t
0. De c`te ori un test de condi]ie este fals, AutoLISP-ul va
returna obiectul nil ca fiind valoarea testului.

nileste singurul obiect din AutoLISP corespunzator lui "fals";


de aceea orice alt\ valoare returnat\ de un test de condi]ie
trebuie s\ corespund\ lui "adev\rat".

•16
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare
• Cele dou\ mari clase de obiecte din AutoLISP s`nt
atomii [i listele.
• Exist\ c`teva tipuri diferite de atomi.
• Atomii s`nt obiecte care nu s`nt `ncadrate `ntre
paranteze.
• Listele s`nt `ntodeauna `ncadrate `ntre paranteze
• Obiectele con]inute `ntr-o list\ constituie
elementele unei liste
• Elementele unei liste pot fi atomi sau liste
• Elementele unei liste s`nt separate `ntre ele de cel
pu]in un spa]iu
• AutoLISP detecteaz\ expresiile neechilibrate
• nil este [i atom [i list\
• nil este lista goal\
• nil este returnat de testele de condi]ie pentru a
indica "fals"

50793936.doc R.2.1 2/3/2011 •17


AUTODESK, INC.

EXERCITIUL 1: ATOMI SI LISTE

• ~n acest exerci]iu ve]i:


• Recapitula ce a]i `n]eles despre atomi [i liste
• Determina dac\ un obiect este atom sau list\
• Folosi AutoLISP pentru a afla valoarea diferitelor
obiecte

Partea I
1. Determina]i dac\ obiectul este atom sau list\.
2. Completa]i rezultatul evalu\rii `n c\su]a
corespunzatoare.

Obiecte Atomi Liste

73.5

"0,0"

(1.0 2.0 3.0)

"String"

("String")

()
Tabelul 3. Determinarea naturii obiectului

•18
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a
1. Gasi]i valoarea acestui atom `n linia de comand\
AutoCAD
2. Tip\ri]i "!" urmat de un atom
3. Scrie]i r\spunsul `n coloana din dreapta:
Exemplu
Command: !4.5

Atomi Valori

4.5

"text"

17

setq

xyz

nil
Tabelul 4. Determinarea valorii atomului

Partea a III-a
1. Determina]i num\rul de elemente con]inut de fiecare
list\.
2. Scrie]i r\spunsul `n coloana din dreapta.
Lista Numar de elemente

(1.0 2.0 3.0)

(+ 1 2)

(+ 1 (+ 2 3))

(+ 1 2 (+ 3 4) 5)

(+ 1 (+ 2 (+ 3 4)) 5)

()

Tabelul 5. Determinarea numarului de elemente din lista

50793936.doc R.2.1 2/3/2011 •19


AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat

•20
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Evaluarea
Evaluarea este procesul prin care AutoLISP-ul determin\
valoarea unui obiect. Evaluarea se aplic\ [i la atomi [i la
liste.

Fiecare obiect din AutoLISP are o valoare. Prin evaluarea


unui obiect, AutoLISP-ul determin\ valoarea acestuia.

Obiective
~n acest capitol ve]i studia:
• Procesul evalu\rii
• Cum returneaz\ AutoLISP-ul o valoare
• Cum evalueaz\ AutoLISP-ul atomi [i liste
• Cum se folosesc func]iile aritmetice de baz\ `n
AutoLISP
• Cum se anuleaz\ evaluarea unui obiect
• Cum leag\ AutoLISP-ul o valoare de o variabil\

Returnarea valorii
C`nd transmite]i un obiect spre evaluare AutoLISP-ului,
acesta `i determin\ valoarea [i o returneaz\. ~ntr-un
exemplu anterior, folosind caracterul "!", AutoLISP-ul a
evaluat obiectul pi [i a returnat valoarea AutoCAD-ului.
AutoCAD-ul a tip\rit valoarea returnat\ `n zona liniei de
comand\.
Command: !pi
3.14159 <--- valoare returnata

~ntr-un exemplu anterior folosind comanda ARRAY ,


AutoLISP-ul a evaluat lista (/ 360 15) [i a returnat valoarea
24 AutoCAD-ului. AutoCAD-ul a folosit valoarea returnat\ la
intrare `n comanda ARRAY .
Center point of array: 5,5
Number of items: (/ 360 15)
Angle to fill (+=ccw, -=cw) <360>:Enter

50793936.doc R.2.1 2/3/2011 •21


AUTODESK, INC.

AutoCAD prompt User enters


Number of items: (/ 360 15)

AutoLISP

receives
(/ 360 15)
returns
24

Figura 6. AutoLISP returneaza valoarea expresiei in linia de comanda AutoCAD.

Evaluarea atomilor
Atomii s`nt obiecte simple [i s`nt evalua]i folosind reguli
simple potrivit tipului lor de date. Majoritatea atomilor se
autoevalueaz\. Numerele `ntregi, numerele reale, [irurile,
se autoevalueaz\ la valoarea pe care o au. Modul `n care se
evalueaz\ un simbol nu poate fi discutat dec`t dup\ ce
`nv\]am cum se leag\ o list\.
Tip de atom Exemplu Regula de Valoare
evaluare

Intreg 1 Valoarea este 1


nr. insusi

Real 4.5 Valoarea este 4.5


nr. insusi

Sir "text" Valoarea este "text"


nr. insusi

Simbol x Legarea curenta Ultima asignare


Tabelul 6. Reguli de evaluare a atomilor

Evaluarea listelor
Evaluarea unei liste poate fi facut\ `ntr-unul din aceste dou\
moduri: se ia lista ca atare sau se evalueaz\. ~n func]ie de
natura listei, metodele dau rezultate diferite,de exemplu,
valori diferite.

•22
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Dac\ o list\ este luat\ ca atare, atunci valoarea ei este lista


`ns\[i. Acest lucru va fi mai clar dup\ explicarea func]iei
quote mai t`rziu `n aceast\ lec]ie.

Dac\ o list\ urmeaz\ a fi evaluat\ de AutoLISP, atunci trebuie


respectat\ regula sintactic\.
• Pentru orice list\ care poate fi evaluat\, primul
element din cadrul listei trebuie s\ fie o func]ie.
Listele s`nt evaluate potrivit instruc]iunilor referitoare la
primul element al listei. Dac\ primul element este numele
unei subrutine interne AutoLISP sau func]ii, restul de
elemente ale listei s`nt transferate func]iei ca argumente
formale [i s`nt evaluate de c\tre func]ie.

Func]iile s`nt fie func]ii interne AutoLISP, fie subrutine, a[a


cum s`nt cele prezentate `n capitolul 4 al manualului
AutoLISP Programmer’s Reference Manual, fie func]ii
externe definite de utilizator sau exsubr definite de
aplica]ii ADS, sau func]ii AutoLISP definite de utilizator.

Cum evalueaz\ AutoLISP-ul o list\


Vom folosi o list\ simpl\ pentru a ilustra procesul de
evaluare a unei liste.

Aceasta este o list\ format\ din trei elemente: func]ia +


numerele `ntregi 1 [i 2.
(+ 1 2)

Etapa I: Analiza primului element


Primul element al unei liste pe care AutoLISP-ul o poate
evalua trebuie s\ fie o func]ie.

AutoLISP-ul verific\ primul element al listei unde se a[teapt\


s\ g\seasc\ o func]ie. Dac\ primul element al listei pe care
AutoLISP-ul `ncearc\ s\ o evalueze nu este o func]ie, acesta
va da na[tere unei erori.

Elementele care urmeaz\ dup\ o func]ie `n cadrul unei liste


s`nt argumentele func]iei; adic\ ele reprezint\ datele
asupra c\rora func]ia opereaz\.

Etapa a II-a: Evaluarea func]iei


AutoLISP evalueaz\ func]ia. O func]ie evalueaz\ un set de
instruc]iuni care sugereaz\ AutoCAD-ului cum s\ ac]ioneze
mai departe.

Func]ia + evalueaz\ un set de instruc]iuni pentru AutoLISP.


Dac\ ar fi s\ exprim\m `n cuvinte aceste instruc]iuni, am

50793936.doc R.2.1 2/3/2011 •23


AUTODESK, INC.

putea spune: g\si]i valoarea fiec\rui element din aceast\


list\. Care s`nt argumentele func]iei? Pune]i toate valorile la
un loc [i returna]i rezultatul ca fiind valoarea `ntregii liste.

•24
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Etapa a III-a: Continuarea instruc]iunilor func]iei


(.. 1 ..)

Urm\rind instruc]iunile din func]ia +, AutoLISP-ul g\se[te


valoarea urm\torului element din list\: num\rul `ntreg 1.
Numerele `ntregi se evalueaz\ pe sine. Astfel AutoLISP-ul
memoreaz\ valoarea 1 `n stiva programului, de exemplu o
introduce `ntr-o loca]ie de memorie temporar\.

(.. .. 2)

Con]in`nd cu instruc]iunile de la func]ia +, AutoLISP-ul


verific\ dac\ mai s`nt [i alte elemente `n list\. Mai exist\ un
element: num\rul `ntreg 2. AutoLISP-ul `i pastreaz\ valoarea
`n stiv\.

Etapa a IV-a: Returnarea valorii func]iei


Nemaig\sind alte elemente `n list\, de exemplu argumente
la func]ie, AutoLISP-ul `[i termin\ instruc]iunile de la func]ia
+ prin ad\ugarea valorilor argumentelor 1 [i 2 [i prin
returnarea num\rului `ntreg 3 ca fiind valoarea listei.
Command: (+ 1 2)
3
Command:

Un exemplu mai complex


AutoLISP evalueaz\ elementele dintr-o list\ de la st`nga la
dreapta.

~n multe cazuri ar fi convenabil pentru noi s\ urm\m


procesul de evaluare din interior spre exterior dec`t de la
dreapta spre st`nga. Rezultatele s`nt de obicei acelea[i [i
adesea este mai u[or pentru noi s\ citim coduri AutoLISP cu
un grad de imbricare mai mare, lucr`nd din interior `n
exterior. Dar nu acesta este modul `n care AutoLISP-ul
evalueaz\ o list\. ~ntotdeauna lucreaz\ de la st`nga la
dreapta.

Considera]i aceast\ list\ format\ din trei elemente: (+ 1 (+ 2


3))
• Func]ia +
• Atomul 1
• Lista (+ 2 3)

50793936.doc R.2.1 2/3/2011 •25


AUTODESK, INC.

(+ 1 (+ 2 3))

value is 1 value is 5

value is 6
Figura 7. Evaluarea unei liste complexe

AutoLISP-ul evalueaz\ aceast\ list\ folosind exact aceea[i


metod\ ca `n exemplul anterior.

(+ ..

AutoLISP-ul caut\ primul element al listei a[tept`nd s\


g\seasc\ o func]ie [i apoi o evalueaz\. Func]ia returneaz\
valoarea ei ca un set de instruc]iuni pentru AutoLISP.

(.. 1 ..

Urm`nd instruc]iunile func]iei +, AutoLISP-ul afl\ valoarea


celui de al doilea element al listei, de ex. primul argument
la func]ia +: atomul 1. Apoi `i memoreaz\ valoarea [i
continu\.

(.. .. (+ 2 3) ..

AutoLISP-ul g\se[te valoarea celui de al treilea element al


listei, cum ar fi al doilea argument la func]ia +.

Al treilea element este el `nsu[i o list\. Cum afl\ AutoLISP-ul


valoarea unei liste? Prin evaluare. Cum evalueaz\ AutoLISP-
ul o list\?

(.. .. (+ ..

Mai `nt`i evalueaz\ func]ia + [i `i prime[te instruc]iunile

( .. .. (.. 2 ..

(.. .. (.. .. 3) ..

Apoi g\se[te valoarea argumentelor 2 [i 3. Termin`ndu-i


instruc]iunile de la func]ia + din cadrul listei (+ 2 3), AutoLISP-
ul adaug\ valorile [i returneaz\ rezultatul care `n acest caz
este nr. `ntreg 5.

•26
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Nemaig\sind alte elemente `n list\, AutoLISP-ul termin\


instruc]iunile de la func]ia + `n lista principal\ prin
ad\ugarea valorii celor dou\ elemente la un loc [i return`nd
valoarea 6.

Func]ii aritmetice
AutoLISP-ul include func]ii interne pentru opera]ii aritmetice
ca: adunarea, sc\derea, `nmul]irea [i `mp\r]irea
• + func]ia de adunare
• - func]ia de sc\dere
• * func]ia de `nmul]ire
• / func]ia de `mp\r]ire

50793936.doc R.2.1 2/3/2011 •27


AUTODESK, INC.

Exemple

Expresii aritmetice S-expresii AutoLISP

1+2 (+ 1 2)

2-1 (- 2 1)

2*4 (* 2 4)

4/2 (/ 4 2)

Tabelul 7. Aritmetica AutoLISP

Ordinea argumentelor `n func]iile de adunare [i de


`nmul]ire nu are importan]\. Este `ns\ important\ pentru
sc\dere [i `mp\r]ire.

(- 2 1)

Subtract this...
... from this.
Fig. 8 Ordinea argumentelor in functia de scadere

~n cazul sc\derii, valoarea celui de al doilea argument este


sc\zut\ din valoarea primului argument [i rezultatul returnat
este valoarea listei.

(/ 4 2)

Divide this...
... by this.
Fig. 9 Ordinea argumentelor in functia de impartire

~n cazul `mp\r]irii, valoarea celui de al doilea argument


este divizorul valorii primului argument.

Iat\ c`teva exemple complexe.

•28
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemple

Expresii aritmetice S-expresii AutoLISP

1 + (2 - 3) (+ 1 (- 2 3))

(4 + 2) - 1 (- (+ 4 2) 1)

4*4/2 (/ (* 4 4) 2)

4/2*3 (* 3 (/ 4 2))

Tabelul 8. Exemple complexe de expresii aritmetice

Recapitulare
• AutoLISP-ul determin\ valoarea unui obiect prin
evaluare.
• AutoLISP-ul returneaz\ valoarea fiec\rui obiect pe
care il evalueaz\.
• Majoritatea atomilor se evalueaz\ pe sine.
• Simbolurile se evalueaz\ prin legare sau atribuire.
• Listele s`nt evaluate printr-un proces standard.
• Primul element al oricarei liste ce poate fi evaluat\
trebuie s\ fie o func]ie.
• AutoLISP-ul are func]ii standard pentru opera]ii
aritmetice.

50793936.doc R.2.1 2/3/2011 •29


AUTODESK, INC.

EXERCITIUL 2: LISTE SI ARITMETICA LISTELOR

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre procesul de
evaluare
• ~ncepe scrierea expresiilor AutoLISP folosind
listele
• Transforma expresiile aritmetice `n expresii
AutoLISP
• Transforma expresiile AutoLISP `n expresii
aritmetice

Partea I
1. Folosi]i func]ia +, -, /, [i *.
2. Transforma]i expresiile aritmetice `n expresii AutoLISP.
3. Scrie]i r\spunsurile `n coloana din dreapta.
Exemplu
Expresia `n nota]ia aritmetic\ standard:
1 + 2
Expresia `n AutoLISP:
( + 1 2 )

Expresii aritmetice S-expresii

3 + 10 + 5

20 * 15

16 - 10

15 / 3

5 + (10 * 2)

(5 + 10) * 2

Tabelul 9. Traducerea expresiilor aritmetice

•30
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a
1. Transforma]i s-expresiile `n expresii aritmetice
2. Scrie]i r\spunsurile `n coloana din dreapta

Exemplu
Expresia `n nota]ia aritmetic\ standard
(2 * 5) / (7 - 2)
Expresia `n AutoLISP
(/ (* 2 5) (- 7 2))

s-expresii expresii aritmerice

(+ 2 (+ 5 4) (- 4 2))

(- 5 (+ 4 (- 3 2)))

(/ 8 (- (/ 6 2) 1))

(* 2 (/ (+ 2 4) 3))

(- 5 (/ 6 (+ 1 2)))

(+ (/ (* 2 3) (- 4 2)) 1)
Tabelul 10. Traducerea expresiilor AutoLISP

50793936.doc R.2.1 2/3/2011 •31


AUTODESK, INC.

Liste neevaluate
Valoarea unei liste poate fi determinat\ `n unul din aceste
dou\ moduri: se evalueaz\ lista sau se consider\ lista ca
atare.

Func]ia AutoLISP quote este folosit\ pentru a returna o list\


sau un atom neevaluat, adic\ la valoarea ca list\.

Folosi]i quote ca fiind primul element `ntr-o list\ [i ad\uga]i


un singur argument. Valoarea listei va fi valoarea
neevaluat\ a celui de al doilea element al listei, adic\
argumentul la quote.

Exemplu
Aceast\ expresie returneaz\ lista (1.0 2.0 3.0) neevaluat\.
Command: (quote (1.0 2.0 3.0))
(1.0 2.0 3.0)
Ce s-ar `nt`mpla dac\ AutoLISP-ului i s-ar cere s\ evalueze
lista?

De ce?
Command: (1.0 2.0 3.0)
?

Opera]ia de legare a dou\ obiecte


Legarea este procesul prin care o valoare este atribuit\
unui simbol definit de utilizator sau unei variabile. ~n
AutoLISP, spunem c\ la un simbol sau la o variabil\ se leag\
o valoare. Aceasta `nseamn\ `n limbajul BASIC c\ o valoare
este egal\ de o variabil\ sau c\ o valoare este atribuit\
unei variabile.

Func]ia AutoLISP setq se folose[te pentru a lega un simbol


sau o variabil\ de o valoare.

Exemplu
Aceast\ expresie leag\ simbolul x de valoarea 4.5.
Command: (setq x 4.5)
4.5
Command: !x
4.5

•32
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

~n BASIC, aceea[i opera]ie ar putea fi exprimat\ astfel:

LET x = 4.5

Cum func]ioneaz\ func]ia setq


Valoarea func]iei setq este un set de instruc]iuni pentru
AutoLISP.

Aceste instruc]iuni ar putea fi exprimate astfel: Lua]i primul


argument ca atare. Nu-l evalua]i. G\si]i valoarea celui de al
doilea argument. Lega]i primul argument de valoarea celui
de al doilea argument. Returna]i valoarea leg\rii ca fiind
valoarea listei.

Exemplu
Nota]i returnarea valorii acestei expresii. Valoarea listei
este valoarea leg\turii stabilite pentru simbolul x de c\tre
func]ia setq.
Command: (setq x 4.5)
4.5

Recapitulare
• Func]ia quote suprim\ procesul de evaluare.
• Legarea este procesul de atribuire a unei valori la
o variabil\.
• Functia setq este folosit\ pentru a lega o variabil\
de o valoare.

50793936.doc R.2.1 2/3/2011 •33


AUTODESK, INC.

EXERCITIUL 3: EVALUAREA LISTELOR SI LEGAREA VARIABILELOR

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre procesul de
evaluare
• Determina dac\ o list\ poate fi evaluat\ f\r\ erori
• Consolida cuno[tin]ele despre procesul de legare
• Folosi func]ia setq pentru a lega variabile de valori,
adic\ ve]i atribui valori variabilelor

Partea I
1. Determina]i dac\ o list\ poate fi evaluat\ sau trebuie
considerat\ ca atare.
2. Pune]i un semn `n coloana corespunz\toare
Tabelul 11. Determinarea situatiei in care o lista poate fi evaluata
s-expresii Evaluari? Numai fata
valorii?

(+ 1 2)

(+ 1 (+ 2 3))

(1.0 2.0 3.0)

(quote (1.0 2.0


3.0))

(setq x 4.5)

(setq y (1.0 2.0


3.0))

(y (1 2))

•34
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a

1. Lega]i variabila x de valorile din tabel


2. Folosi]i func]ia setq [i func]ia quote dac\ este necesar
3. Verifica]i valoarea variabilei folosind "bang" pentru a-i
afla legarea curent\.
Exemplu

Command: (setq x 1)
1
Command: !x
1

Command:(setq x (+ 1 2 3))
6
Command: !x
6

Command: (setq x (quote (4 (+ 5 6)))


(4 (+ 5 6))
Command:!x
(4 (+ 5 6))

Valoare pentru
x

4.5

"text"

(1.0 2.0 3.0)

(+ 1 2 3)

(1 (+ 2 3))

Tabelul 12. Legarea lui x unor valori diferite

50793936.doc R.2.1 2/3/2011 •35


AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat.

•36
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

S-expresii AutoLISP `n cadrul comenzilor AutoCAD


S-expresiile AutoLISP pot fi folosite `n cadrul comenzilor
AutoCAD.

Obiective
~n acest capitol ve]i studia:
• Cum s\ folosi]i AutoLISP-ul `n cadrul comenzilor
AutoCAD
• Cum s\ returna]i o valoare din AutoLISP c\tre o
comand\ AutoCAD

Returnarea unei valori `n linia de comand\


Valoarea unei expresii AutoLISP este trecut\ din AutoLISP `n
AutoCAD ca r\spuns la linia AutoCAD `n ac]iune.

Dac\ linia de comand\ este `n ac]iune, valoarea unei


expresii este pur [i simplu tiparit\ `n zona liniei de
comand\.
Command: (setq x (+ 4 6))
10
Command: !x
10
Aceast\ expresie returneaz\ valoarea diviz\rii r\d\cinii
p\trate num\rului 50 prin num\rul real 9.
Command: (/ (sqrt 50.0) 9.0)
0.78567
Aceast\ expresie returneaz\ valoarea multiplic\rii
rezultatului ob]inut prin adunarea lui 2.5 cu 6.3 de 24.0.
Command: (* (+ 2.5 6.3) 24.0)
211.2

Returnarea unei valori la o comand\ AutoCAD


Dac\ o comand\ AutoCAD este `n ac]iune, atunci evaluarea
unei expresii AutoLISP returneaz\ valoarea expresiei `n
AutoCAD. Valoarea devine r\spunsul la linia curent\ a
comenzii AutoCAD.

~n acest exemplu, comanda ARRAY recep]ioneaz\ ca num\r


de repeti]ii ale func]iei, rezultatul unei expresii AutoLISP
pentru care 6.0 se divide la 0.35; cu alte cuvinte, nu [tim
dinainte c`te repeti]ii cuprinde unitatea 0.35 la o distant\ de
6.0 unita]i, deci rug\m AutoLISP-ul s\ calculeze valoarea
pentru noi [i s\ returneze r\spunsul AutoCAD-ului.Deoarece
comanda din ARRAY accept\ numai numere `ntregi [i nu
numere reale, vom folosi func]ia AutoLISP fix pentru a
rotunji cel mai apropiat num\r `ntreg.

50793936.doc R.2.1 2/3/2011 •37


AUTODESK, INC.

Exemplu
~ncepe]i un desen nou.

Tip\ri]i comenzile [i expresiile care urmeaz\.

Command: (/ 6.0 0.35)


17.1429
Command: (fix 17.1429)
17
Command: (fix (/ 6.0 0.35))
17

Command: line
From point: 1,1
To point: 5,5
To point: Enter

Command: array
Select objects: I
Select objects: Enter
Rectangular or Polar array (R/P): r
Number of rows (-) <1>: 1
Number of columns (III) <1>: (fix (/ 6.0 0.35))
Distance between columns: 0.35
AutoCAD creaz\ 17 elemente `n array.

Trebuie avut `n vedere faptul c\ o expresie AutoLISP a fost


folosit\ interactiv, `n mijlocul unei comenzi AutoCAD, pentru
a calcula o valoare (`n acest caz un num\r `ntreg) care
ulterior este dat\ automat comenzii `n acel punct special la
secven]a de cerere a comenzii.

•38
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

~n exemplul urmator, AutoLISP-ul calculeaz\ m\rimea razei


unei racord\ri.

Exemplu
~ncepe]i un desen nou.

Tip\ri]i expresiile [i comenzile care urmeaz\.

M\rimea razei unei racord\ri este stabilit\ la 2.24.


Command: line
From point: 1,1
To point: 5,5
To point: Enter

Command: line
From point: 10,1
To point: 6,5
To point: Enter

Command: fillet
Polyline/Radius/<Select two lines>: r
Enter fillet radius <1.0>: (/ 28.0 12.5)

Command: fillet
Polyline/Radius/<Select two lines>: pick first line
Select second object: pick second line

Figura 10. Doua linii cu o racordare la o raza de (/28.0 12.5) sau 2.24

Recapitulare
• S-expresiile pot fi folosite ca r\spunsuri la cererile
de comand\ AutoCAD.
• AutoLISP returneaz\ valoarea unei s-expresii
folosite `n cadrul unei comenzi AutoCAD la
cererea comenzii.

50793936.doc R.2.1 2/3/2011 •39


AUTODESK, INC.

EXERCITIUL 4: EXPRESII AUTOLISP IN CADRUL COMENZILOR AUTOCAD

~n acest exerci]iu ve]i:


• Folosi func]ii aritmetice [i func]ia setq pentru a crea
valori [i leg\turi simbol
• Folosi valorile [i simbolurile ca r\spunsuri la
cererile de comand\ AutoCAD
Instruc]iuni
1. ~ncepe]i un desen nou.
2. Desena]i un arc cu un unghi inclus de 1 radian.
3. Desena]i dou\ cercuri concentrice: unul cu o raz\ de dou\
treimi pi [i unul cu o raz\ la jum\tate din aceast\
valoare.
4. Amplasa]i arcul `n jurul centrului cercurilor.
5. Fixa]i c`te o copie la fiecare 15 grade de rota]ie.
Command: arc
Center/<Start point>: 5,5
Center/End/<Second point>: c
Center: 3,5
Angle/Length of chord/<End point>: a
Included angle: (/ 180 pi)
Command: (setq x (* pi (/ 2.0 3.0)))
2.0944

Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<Radius>: !x

Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<Radius>: (/ x 2)

•40
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (setq x (/ 360 15))


24

Command: array
Select objects: pick the arc
1 found
Select objects: Enter
Rectangular or Polar array (R/P): p
Center point of array: 5,5
Number of items: !x
Angle to fill (+=ccw, -=cw) <360>:Enter
Rotate objects as they are copied? <Y>Enter

Figura 11. Array completat

50793936.doc R.2.1 2/3/2011 •41


AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat.

•42
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Tipuri de date numerice


AutoLISP-ul are dou\ tipuri de date numerice: numere
`ntregi [i numere reale. Func]ia type returneaz\ tipurile de
date ale unui obiect.

Obiective
~n acest capitol ve]i studia:
• Diferen]ele dintre cele dou\ tipuri de date
numerice
• Cum s\ determina]i tipul de date al unui obiect

Determinarea tipului de date ale unui obiect


Func]ia AutoLISP type se folose[te pentru a determina tipul
de date al unui obiect. type cere un argument [i returneaz\
un simbol care indic\ tipul de date al argumentului.

De exemplu, aceast\ expresie returneaz\ tipul de date al


num\rului real 1.0
Command: (type 1.0)
REAL

Numere reale
AutoLISP-ul reprezint\ numerele reale `n virgul\ mobil\,
dubl\ precizie cu cel pu]in 14 zecimale. Nu exist\ tipuri de
date care s\ reprezinte numere cu simpl\ precizie `n
AutoLISP. Toate numerele reale s`nt cu dubl\ precizie [i ele
s`nt reprezentate `n AutoLISP `n aceea[i manier\ ca `n
AutoCAD.

Numerele reale s`nt numere introduse cu punct zecimal, de


exemplu 4.5 sau 123.456.
Command: (setq x 4.5)
4.5
Pentru valori cuprinse `ntre 1.0 [i -1.0, zero trebuie s\
precead\ punctul zecimal, de exemplu, 0.45 sau 0.123
sau -0.876.
Command: (setq x 0.123)
0.123

Precizia afi[\rii si precizia intern\


Precizia implicit\ a afi[\rii unui num\r real `n AutoLISP este
de 5 zecimale. Reprezentarea intern\ este `ntotdeauna
men]inut\ cu cel pu]in 14 zecimale semnificative de
precizie.

50793936.doc R.2.1 2/3/2011 •43


AUTODESK, INC.

Dac\ este necesar\ afi[area sau tip\rirea valorii unui num\r


real cu o precizie mai mare dec`t precizia de afi[are a
AutoLISP-ului, num\rul real poate fi transformat `ntr-un [ir
cu ajutorul func]iei AutoLISP rtos [i apoi afi[at sau tip\rit cu
precizia de afi[are dorit\.

rtoscere p`n\ la 3 argumente: un num\r real, un num\r


`ntreg care reprezint\ unul dintre sistemele de unita]i
AutoCAD [i num\rul de zecimale pentru [irul care va fi
returnat.

Exemplu
Introduce]i expresiile care urmeaz\.

Lega]i simbolul x de num\rul real 4.5


Command: (setq x 4.5)
4.5
Verifica]i-i valoarea [i tipul de date
Command: !x
4.5
Command: (type x)
Folosi]i func]ia rtos pentru a vizualiza valoarea lui x ca
num\r zecimal cu o precizie de 8 zecimale.
Command: (rtos x 2 8)
"4.50000000"

Numere `ntregi
Numerele `ntregi s`nt numere introduse f\r\ punct zecimal.
Numerele `ntregi `n AutoLISP s`nt numere `ntregi cu semn
pe 32 bi]i cuprinse `ntre 2.147.483.648 [i +2.147.483.647.
De[i AutoLISP-ul folose[te valori de 32 bi]i, cele transferate
`ntre AutoLISP [i AutoCAD s`nt limitate la valori de 16 bi]i,
de exemplu nu se poate transfera o valoare mai mic\ de
-32.768 sau mai mare de +32.767 `n AutoCAD. Dac\ folosi]i
o valoare care dep\[este aceste limite, pute]i folosi func]ia
float pentru a o transforma `ntr-un num\r real `nainte de a o
transfera `n AutoCAD.

•44
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
Introduce]i expresiile care urmeaz\.

Lega]i simbolul x de un num\r `ntreg cu valoarea de


65535.
Command: (setq x 64435)
65535
Verifica]i-i valoarea [i tipul de date.
Command: !x
65535
Command: (float x)
65535.0
Command: (fix (float x))
65535
Command: (type x)
INT
Folosi]i func]iile float [i fix pentru a returna valoarea lui x cu
tipuri de date diferite [i folosi]i func]ia rtos pentru a imprima
valoarea cu un format de zece zecimale.
Command: (type (float x))
REAL
Command: (type (fix (float x)))
INT
Command: (rtos (float x) 2 10)
"65535.0000000000"

Conversia automat\ a numerelor `ntregi


AutoLISP-ul va converti numerele `ntregi `n numere reale
ori de c`te ori va `nt`lni ambele tipuri de date ca
argumente la func]ie.

Dac\ dou\ numere `ntregi s`nt folosite ca argumente la


func]ia de adunare +, valoarea returnat\ a expresiei este
un num\r `ntreg; totu[i, dac\ argumentele s`nt un num\r
real [i un num\r `ntreg, valoarea returnat\ este exprimat\
printr-un num\r real.

Exemplu
Aceast\ expresie returneaz\ un num\r `ntreg.

50793936.doc R.2.1 2/3/2011 •45


AUTODESK, INC.

Command: (+ 1 2)
3
Command: (type (+ 1 2))
INT
Aceast\ expresie returneaz\ un num\r real.
Command: (+ 1.0 2)
3.0
Command: (type (+ 1.0 2)
REAL

Recapitulare

• AutoLISP-ul are dou\ tipuri de date numerice:


numere `ntregi [i numere reale.
• Numerele `ntregi au valori de 32 bi]i `n AutoLISP.
• Numai numerele `ntregi cu valori de 16 bi]i pot fi
transferate `ntre AutoLISP [i AutoCAD.
• Numerele reale s`nt numere zecimale cu dubl\
precizie.
• Numerele reale s`nt re]inute cu cel pu]in 14
zecimale de precizie.
• AutoLISP-ul va converti un num\r `ntreg `ntr-un
num\r real c`nd le `nt`lne[te pe am`ndou\ `n
cadrul aceleia[i expresii.
• Un num\r real trebuie `ntotdeauna s\ aib\ o cifr\
care precede punctul zecimal.
• Func]ia type returneaz\ tipul de date al unui
obiect.
• Func]ia fix transform\ un num\r real `ntr-un num\r
`ntreg.
• Func]ia float transform\ un num\r `ntreg `ntr-un
num\r real.

•46
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 5: FOLOSIREA NUMERELOR INTREGI SI REALE

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre tipurile de date ale
numerelor `ntregi [i reale.
• Folosi func]ia setq pentru a lega variabile de valori
cu tipuri de date numerice diferite.
• Determina valoarea returnat\ [i tipul de date
numerice ale unei expresii AutoLISP

Partea I
1.Lega]i simbolurile de valori diferite.
2.Introduce]i s-expresia corespunzatoare `n linia de
comand\ AutoCAD.

simbol valoare

a 1

b 2

c 3

x 1.0

y 2.0

z 4.5

Tabelul 13. Legarea variabilelor de valori numerice.

50793936.doc R.2.1 2/3/2011 •47


AUTODESK, INC.

Partea aII-a
1.Determina]i valoarea returnat\ [i tipul de date pentru
fiecare expresie.
2.Scrie]i r\spunsurile `n coloanele corespunzatoare
3.Trebuie mai `nt`i s\ efectua]i prima parte a acestui
exerci]iu.

expresia-s returnarea valorii tip de data pentru


valoarea returnata

(+ 1 2)

(+ 1 2.0)

(+ 1.0 2.0)

(+ a b)

(+ a y)

(+ y z)

(fix x)

(float a)

(fix z)

(float (fix z))

(fix (+ (float a) (float b)))

(/ x y)

(fix (/ x y))

(float (fix (/ x y)))

(+ (fix (/ a y)) (fix (float a)))

Tabelul 14. Valorile returnate si tipurile de date numerice ale expresiilor.

•48
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Puncte AutoCAD [i liste AutoLISP

AutoCAD-ul folose[te coordonatele carteziene pentru a


descrie punctele 2- [i 3-dimensionale. AutoLISP-ul reprezint\
un punct sub forma unei liste de numere reale.

Obiective
~n acest capitol ve]i studia:
• Cum reprezint\ AutoLISP-ul puncte
• Cum s\ construi]i o list\ care reprezint\ un punct
folosind at`t constante c`t [i variabile.

Puncte AutoCAD
Un punct 3-dimensional este format din trei numere, fiecare
av`nd o valoare independent\ care corespunde unei
distan]e de la originea sistemului de coordonate de-a lungul
axelor X, Y [i Z. Imagina]i-v\ punctul 3-D sub forma a trei
cutii, fiecare con]in`nd un num\r real.

X axis Y axis Z axis

Distance from origin


Figura 12. Punct 3-d reprezentat prin trei coordonate

Lua]i, de exemplu, punctul 3-D 1,2,3. AutoCAD-ul are o


gam\ larg\ de operatori pentru a descrie acest punct:
Introducerea `n coordonate absolute, relative [i polare,
ag\]area de obiecte, filtre de coordonate etc. Dar
reprezentarea intern\ a punctului se reduce la o asociere
`ntre trei numere reale.

X = 1.0 Y = 2.0 Z = 3.0

3-dimensional point 1,2,3


Figura 13. Valori de-a lungul axelor de coordonate.

AutoLISP-ul reprezint\ un punct AutoCAD 3-D sub forma


unei liste formate din trei numere reale, unde primul

50793936.doc R.2.1 2/3/2011 •49


AUTODESK, INC.

element este valoarea coordonatei X, al doilea valoarea Y [i


al treilea valoarea Z.

Punctul 1,2,3 exprimat sub forma unui obiect AutoLISP este


(1.0 2.0 3.0)

(1.0 2.0 3.0)


3-d im ension al poin t 1 ,2,3 as an A utoLISP object
Figura 14. Lsta AutoLISP sub forma unui punct AutoCAD

Construirea listelor de coordonate ale punctelor


Rezultatul unei `ncerc\ri de a crea un obiect AutoLISP,
recunoscut de AutoCAD ca punct 3-D, este clar: o list\
format\ din trei numere reale. Cum se poate construi o
astfel de list\?

Exist\ dou\ func]ii pentru construirea acestor obiecte: quote


[i list.

Construirea punctelor cu func]ia quote


A[a cum a]i observat mai devreme, func]ia quote impiedic\
procesul de evaluare pentru singurul ei argument [i
returneaz\ acest argument neevaluat.

Construirea unei liste format\ din trei numere reale este un


proces simplu cu ajutorul func]iei quote. De exemplu,
expresia (quote (1.0 2.0 3.0) returneaz\ valoarea (1.0 2.0
3.0), o reprezentare AutoLISP valid\ a unui punct AutoCAD.

•50
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
Introduce]i expresiile care urmeaz\. Crea]i dou\ liste
formate din c`te trei numere reale [i folosi]i listele `n linia
de comand\ AutoCAD.
Command: (setq pt1 (quote (1.0 1.0 1.0)))
(1.0 1.0 0.0)
Command: !pt1
(1.0 1.0 0.0)
Command: (setq pt2 (quote (5.0 5.0 0.0)))
(5.0 5.0 0.0)
Command: !pt2
(5.0 5.0 0.0)
Command: line
From point: !pt1
To point: !pt2
To point: Enter

pt2 (5.0 5.0 0.0)

pt1 (1.0 1.0 0.0)


Figura 15. Linie de la pt1 la pt2

Construirea punctelor cu func]ia list


Valoarea returnat\ a func]iei list este o list\ format\ din
valorile argumentelor func]iei. Func]ia poate primi
oric`te argumente dori]i.

listevalueaz\ fiecare argument, unul dup\ altul [i le


memoreaz\ valoarea temporar. C`nd func]ia list `[i
epuizeaz\ argumentele `[i compune valorile argumentelor
din elemente `n cadrul unei liste [i returneaz\ lista.

50793936.doc R.2.1 2/3/2011 •51


AUTODESK, INC.

Exemplu
Introduce]i expresiile care urmeaz\.

~n timp ce lucra]i, nu uita]i c\ numerele reale se evalueaz\


pe sine, de exemplu, Command: !4.5 returneaz\ 4.5.

Folosi]i func]ia list pentru a returna o list\ format\ din trei


numere reale.
Command: (list 1.0 2.0 3.0)
(1.0 2.0 3.0)
Folosi]i func]ia setq pentru a lega simbolul pt la o list\ cu trei
numere reale.
Command: (setq pt (list 1.0 2.0 3.0))
(1.0 2.0 3.0)
Command: !pt
(1.0 2.0 3.0)
Folosi]i simbolul pt ca intrare la comanda AutoCAD ID [i
verifica]i dac\ AutoCAD-ul recunoa[te valoarea simbolului ca
punct valid 3-D.
Command: id
Point: !pt
X=1.0000 Y=2.0000 Z=3.0000
Command:

(1.0 2.0 3.0)


return value

(list 1.0 2.0 3.0)

evaluate all arguments


and return a list of values
evaluates to 1.0

evaluates to 2.0
evaluates to 3.0
Figura 16. Valoare returnata de functia list

•52
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Construirea punctelor din variabile cu func]ia list


Deoarece func]ia list `[i evalueaz\ argumentele, pute]i folosi
simboluri sau variabile ca argumente ale func]iei list pe/sau
`n loc de numere reale.

S\ admitem c\ ave]i trei variabile x, y [i z care s`nt legate de


numerele reale 1.0, 2.0 [i 3.0.

Bind x to 1.0
(setq x 1.0) Value of x is 1.0, or x = 1.0

Bind y to 2.0
(setq y 2.0) Value of y is 2.0, or y = 2.0

Bind z to 3.0
(setq z 3.0) Value of z is 3.0, or z = 3.0
Figura 17.Legarea variabilelor de numere reale cu functia setq

Atunci expresia (list x y z) va returna aceea[i valoare ca [i


expresia (list 1.0 2.0 3.0)

(1.0 2.0 3.0)


return value

(list x y z )

evaluate all arguments


and return a list of values
evaluates to 1.0
evaluates to 2.0
evaluates to 3.0
Figura 18. Valoare returnata de functia list

50793936.doc R.2.1 2/3/2011 •53


AUTODESK, INC.

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i simbolurile x, y [i z de trei numere reale


Command: (setq x 1.0)
1.0
Command !x:
1.0
Command: (setq y 2.0)
2.0
Command: !y
2.0
Command: (setq z 3.0)
3.0
Command: !z
3.0
Folosi]i variabilele ca argumente la func]ia list.
Command: (list x y z)
(1.0 2.0 3.0)
Memora]i lista `ntr-o variabil\ numit\ pt [i folosi]i-o `n cadrul
comenzii AutoCAD.
Command: (setq pt (list x y z))
(1.0 2.0 3.0)

Command: !pt
(1.0 2.0 3.0)

Command: id
Point: !pt
X=1.0000 Y=2.0000 Z=3.0000
Command:

•54
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare
• AutoCAD-ul folose[te sistemul de coordonate
carteziene 3-D pentru a specifica punctele.
• Un punct AutoCAD este reprezentat `n AutoLISP
sub forma unei liste de numere reale.
• AutoLISP-ul reprezint\ un punct AutoCAD 2-D sub
forma unei liste format\ din dou\ numere reale.
• Un punct AutoCAD 3-D este reprezentat sub forma
unei liste cu trei numere reale.
• Func]ia quote poate construi o list\ de numere din
constante.
• Func]ia list poate construi o list\ de numere din
constante sau din variabile.

50793936.doc R.2.1 2/3/2011 •55


AUTODESK, INC.

EXERCITIUL 6: UTILIZAREA LISTELOR DE NUMERE CA PUNCTE AUTOCAD

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre rela]ia dintre listele
AutoLISP formate din dou\ sau trei numere reale
[i punctele AutoCAD.
• Lega variabile pentru a reprezenta coordonatele
unui punct.
• Crea liste ale variabilelor coordonatelor pentru a
reprezenta puncte.
• Folosi liste ca r\spunsuri la cererile de comand\
AutoCAD.

Partea I
1. Introduce]i expresiile `n coloana din st`nga.
2. Scrie]i valoarea returnat\ a fiecarei expresii `n coloana
din mijloc.
3. Dac\ o legatur\ simbol apare `n cadrul expresiei, scrie]i-
i valoarea `n coloana din dreapta.

Expresia Valoarea expresiei Simbol de atribuire

(setq x 1.0) 1.0 x = 1.0

(setq y 2.0)

(setq z 0.0)

(list 1.0 2.0 0.0)

(list x y z)

(setq pt1 (list x y z))

!pt1

(quote (5.0 6.0 0.0))

(setq pt2 (quote (5.0 6.0 0.0)))

!pt2

(quote (x y z))

(setq notapoint (quote (x y z)))

!notapoint
Tabelul 15. Crearea punctelor din liste de numere

•56
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a
1. ~n acela[i desen din partea I introduce]i expresiile care
urmeaz\.
2. Crea]i o Linie [i un Cerc folosind variabilele legate de
liste formate din numere reale a[a cum s`nt
punctele pentru comenzile AutoCAD.
3. Legaturile simbol se bazeaz\ pe partea I a acestui
exerci]iu.
Command: line
From point: !pt1
To point: !pt2
To point: Enter

Command: circle
3P/2P/TTR/<center point>: 2p
First point on diameter: !pt1
Second point on diameter: !pt2

5,6,0

1,2,0
Figura 19. Linie si cerc folosind variabilele pt1 si pt2

50793936.doc R.2.1 2/3/2011 •57


AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat.

•58
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Separarea listelor
Av`nd instruc]iuni pentru construirea listelor - func]iile list [i
quote - ne-ar fi de folos s\ avem [i c`teva instruc]iuni pentru
separarea listelor.

Dac\ am avea un set instruc]iuni pentru extragerea fiec\rui


element dintr-o list\, atunci am putea realiza mult mai u[or
programe AutoLISP.
• Desena]i un dreptunghi cunosc`nd numai
coordonatele col]urilor opuse.
• G\si]i punctul de mijloc dintre oricare ar fi dou\
puncte ( nu numai punctele finale ) ale unei
linii sau ale unui cerc.
• Determina]i dac\ un punct se afl\ `ntr-o anumit\
regiune 2-D sau 3-D a unui sistem de
coordonate carteziane.
De vreme ce acest lucru necesit\ mai mult dec`t abilitatea
de a separa liste, separarea listelor este o cerin]\
fundamental\ `n aceast\ opera]ie.

Obiective
~n acest capitol ve]i studia:
• Cum s`nt reprezentate listele `n memoria
computerului sub forma unui arbore binar.
• Cum s`nt listele reprezentate grafic.
• Cum s\ folosi]i func]iile car [i edr pentru separarea
listelor.
• Cum s\ separa]i liste care reprezint\ puncte `n
AutoCAD [i cum s\ specifica]i puncte prin
crearea unor liste noi bazate pe punctele
existente.

Structura intern\ a unei liste


O list\ AutoLISP este reprezentat\ `n memoria computerului
sub forma unui arbore binar. Orice punct de pe arborele
binar unde poate ap\rea o ramifica]ie se nume[te nod.
Nodul este una din unit\]ile fundamentale pentru stocarea
memoriei `n AutoLISP.

Primul nod de sus al unui arbore binar se nume[te nodul


radacin\.

50793936.doc R.2.1 2/3/2011 •59


AUTODESK, INC.

Structura unei liste AutoLISP este desf\cut\ nod cu nod,


`ncep`nd de la nodul r\d\cin\. Fiecare nod se desface `n
dou\ ramifica]ii reprezent`nd diferite p\r]i ale listei: primul
element al listei [i lista cu primul element `ndep\rtat.

root of list

first element list without first element


Figura 20. Nodul radacina si primul set de ramificatii pentru o lista.

De exemplu prima ramifica]ie a listei (1.0 2.0 3.0) ar putea


fi reprezentat\ astfel.

(1.0 2.0 3.0)

1.0 (2.0 3.0)


Figura 21. Nodul radacina si primul set de ramificatii pentru lista (1.0 2.0 3.0)

•60
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Subdivizarea de-a lungul ramifica]iei arborelui continu\ p`n\


ce partea dreapt\ a ramifica]iei se termin\ cu lista goal\ sau
nil.

(1.0 2.0 3.0)

1.0 (2.0 3.0)

2.0 (3.0)

3.0 ()
Figura 22. Arbore binar complet pentru lista (1.0 2.0 3.0)

AutoLISP-ul are apelative speciale pentru cele dou\ par]i ale


ramifica]iei listei. Primul element al listei se nume[te car-ul
listei. Lista f\r\ primul ei element se nume[te cdr-ul listei.
Ramifica]ia st`ng\ este partea car a listei iar ramifica]ia
dreapt\ este partea cdr.

root of list

car cdr
Figura 23. Partile car si cdr de la nodul radacina al listei.

50793936.doc R.2.1 2/3/2011 •61


AUTODESK, INC.

Reprezentarea unei liste cu trei elemente atomice prin car [i


cdr, c\reia `i este atribuit simbolul x, ar ar\ta dup\ cum
urmeaz\. Dac\ o list\ format\ din unul sau mai multe
elemente se afl\ la oricare din nodurile arborelui, este
urmat\ de o ramifica]ie. Partea st`ng\ a ramifica]iei este car-
ul listei la care se refer\ nodul iar partea dreapt\ este cdr-ul
listei la care se refer\ nodul.

root of x

(car x) (cdr x)

(car (cdr x)) (cdr (cdr x))

(car (cdr (cdr x))) (cdr (cdr (cdr x))) or ()


Figura 24. Reprezentarea completa a unei liste cu trei atomi ca elemente cu car
si cdr.

S\ combin\m graficul care reprezint\ arborele binar pentru


valorile simbolului pt, care este legat de lista (1.0 2.0 3.0)
cu ramifica]iile car [i cdr ale arborelui.

root of list
pt
(1.0 2.0 3.0)

(car of list) (cdr of list)


(car pt) (cdr pt)
1.0 (2.0 3.0)

(car (cdr of list)) (cdr (cdr of list))


(car (cdr pt)) (cdr (cdr pt))
2.0 (3.0)

(car (cdr (cdr of list))) (cdr (cdr (cdr of list)))


(car (cdr (cdr pt))) (cdr (cdr (cdr pt)))
3.0 ()
Figura 25. Grafic combinat pentru simbolul pt, legat de lista (1.0 2.0 3.0).

•62
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare
• Listele s`nt reprezentate `n memorie sub forma
unui arbore binar.
• Primul element al listei este car-ul listei.
• Lista dup\ ce primul element este `ndep\rtat
reprezint\ cdr-ul listei.
• Func]iile car [i cdr formeaz\ ramifica]iile car [i cdr
ale listei.
• O ramifica]ie cdr a unui arbore binar se termin\ `n
nil sau lista goal\.

50793936.doc R.2.1 2/3/2011 •63


AUTODESK, INC.

EXERCITIUL 7: GRAFUL VALORILOR INTR-UN ARBORE BINAR

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre reprezentarea
listelor `n memorie.
• Completa un grafic a valorilor unei liste,
reprezentat sub forma unui arbore binar.
Instruc]iuni
1. Termina]i graful complet al unui arbore binar pentru
variabila alst.
2. alst este legat\ de lista (8.0 3.0 0.0).
3. Ar\ta]i valoarea fiecarui nod din grafic.
(8.0 3.0 0.0)

8.0 ?

? ?

? ?
Figura 26. Completarea grafului binar

•64
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 8: GRAFUL EXPRESIILOR INTR-UN ARBORE BINAR

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre separarea listelor [i
restabilirea elementelor lor individuale.
• Completa un grafic al expresiilor care restabilesc
elementele unei liste, grafic reprezentat sub
forma unui arbore binar.
Instruc]iuni
1. Termina]i graficul complet al unui arbore binar pentru
variabila xlst.
2. xlst este legat\ de lista (1.0 (2.0 3.0) 4.0).
3. Ar\ta]i valoarea fiec\rui nod din grafic
4. Ar\ta]i expresia care restabile[te fiecare valoare din
grafic.
5. Marca]i ramifica]iile car [i cdr ale unui arbore.
6. Observa]i c\ elementele acestei liste s`nt formate din
doi atomi [i o list\.

50793936.doc R.2.1 2/3/2011 •65


AUTODESK, INC.

xlst
(1.0 (2.0 3.0) 4.0)

1.0 ((2.0 3.0) 4.0)


(car xlst) (cdr xlst)

(2.0 3.0) ?
(car (cdr xlst)) (cdr (cdr xlst))

? ? ? ?
(car (car (cdr xlst))) ? ? ?

? ?
? ?

Figura 27. Completarea graficul binar

•66
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]iile car si cdr

Func]iile car [i cdr s`nt func]ii non-destructive. Nici una


dintre ele nu afecteaz\ legarea argumentului ei ceea ce
este un mod curios de a spune despre (car x) c\ poate
returna o valoare diferit\ de x dar nu va schimba
valoarea lui x.

car
Func]ia car returneaz\ primul element al listei. Singurul
argument al func]iei car trebuie s\ fie o list\, iar lista trebuie
s\ aib\ unul sau mai multe elemente.

Exemplu
Introduce]i expresia care urmeaz\. Lega]i variabila pt la o
list\ cu trei numere reale. Folosi]i func]ia car pentru a
returna coordonata x `n list\ (primul element) [i lega]i
variabila x de acea valoare.
Command: (setq pt (list 1.0 2.0 0.0))
(1.0 2.0 0.0)
Command: !pt
(1.0 2.0 0.0)

Command: (car pt)


1.0

Command: (setq x (car pt))


1.0
Command: !x
1.0

Command: !pt
(1.0 2.0 0.0)

cdr
Func]ia cdr returneaz\ o list\ [i elementele ei cu excep]ia
primului element; cu alte cuvinte `ndep\rteaz\ primul
element al listei `n afara valorii lui returnate.

50793936.doc R.2.1 2/3/2011 •67


AUTODESK, INC.

Exemplu
Introduce]i expresiile care urmeaz\.

Lega]i variabila pt de o list\ cu trei numere reale.


Command: (setq pt (list 1.0 2.0 0.0))
(1.0 2.0 0.0)

Command: !pt
(1.0 2.0 0.0)
Folosi]i func]ia cdr pentru a returna o list\ f\r\ primul
element [i lega]i variabila yzlst de acea valoare.
Command: (cdr pt)
(2.0 0.0)

Command: (setq yzlst (cdr pt))


(2.0 0.0)

Command: !lyzlst
(2.0 0.0)

Command: !pt
(1.0 2.0 0.0)

Construirea unui dreptunghi cunosc`nd col]urile opuse


~n figurile care urmeaz\ cunoa[tem dou\ puncte din
col]urile unui dreptunghi. Celelalte dou\ puncte se
calculeaz\ prin combinarea cordonatelor X [i Y ale
punctelor cunoscute `n diverse moduri pentru a forma noi
perechi de coordonate.

known point calculated point

calculated point known point


Figura 28. Valorile X si Y pentru colturile unui dreptunghi.

•68
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat

50793936.doc R.2.1 2/3/2011 •69


AUTODESK, INC.

Figura care urmeaz\ reprezint\ coordonatele punctelor `n


func]ie de variabilele X [i Y.

X1,Y1 X2,Y1

X1,Y2 X2,Y2

0,0

Figura 29. Valorile X,Y pentru colturile dreptunghiului

Considera]i c\ dou\ variabile s`nt legate de cele dou\ liste


formate din numere reale.
(setq pt1 (list 1.0 5.0 0.0))
(setq pt2 (list 10.0 1.0 0.0))
Acest tabel arat\ func]iile necesare pentru returnarea
valorilor X, Y [i Z din fiecare punct.
coordinate pt1 pt2

X (car pt1) (car pt2)

Y (car (cdr pt1)) (car (cdr pt2))

Z (car (cdr (cdr pt1))) (car (cdr (cdr pt2)))

Tabelul 16. Expresiile folosite pentru returnarea coordonatelor X, Y si Z.

•70
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Figura urm\toare exprim\ punctele de coordonate sub


forma de expresii AutopLISP, bazate pe cunoa[terea a dou\
puncte pt1 [i pt2. Pentru a simplifica lucrurile, acestea s`nt
tratate ca puncte 2-dimensionale.

pt1 (list (car pt2) (car (cdr pt1)))

(list (car pt1) (car (cdr pt2))) pt2

0,0

Figura 30. Calcularea colturilor unui dreptunghi

50793936.doc R.2.1 2/3/2011 •71


AUTODESK, INC.

Exemplu
Introduce]i expresiile care urmeaz\.

Folosi]i func]ia list pentru a le combina `n alte dou\ puncte


ale dreptunghiului.
Command: (setq pt1 (list 1.0 5.0))
(1.0 5.0)

Command: !pt1
(1.0 5.0)

Command: (setq pt3 (list 10.0 1.0))


(10.0 1.0)

Command: !pt3
(10.0 1.0)
Folosi]i func]iile car [i cdr pentru a extrage valorile X [i Y ale
punctelor cunoscute.
Command: (car pt1)
1.0

Command: (car (cdr pt3))


1.0

Command: (list (car pt1) (car (cdr pt3)))


(1.0 1.0)

Command: (setq pt2 (list (car pt1) (car (cdr pt3))))


(1.0 1.0)

Command: !pt2
(1.0 1.0)

Command: (car pt3)


10.0

Command: (car (cdr pt1))


5.0

Command: (list (car pt3) (car (cdr pt1)))


(10.0 5.0)

•72
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (setq pt4 (list (car pt3) (car (cdr pt1))))


(10.0 5.0)

Command: !pt4
(10.0 5.0)
Desena]i dreptunghiul folosind linia de comand\ AutoCAD.

Punctele s`nt 2-dimensionale. Linia de comand\ AutoCAD va


completa automat valoarea Z a punctului bazat\ pe
valoarea curent\ a in\l]imii (elevation).
Command: line
From point: !pt1
To point: !pt2
To point: !pt3
To point: !pt4
To point: close

pt1 pt4
1,5 10,5

pt2 pt3
1,1 10,1

0,0

Figura 31. Localizarea colturilor unui dreptunghi

Recapitulare
• Func]ia car returneaz\ primul element al unei
listei.
• Func]ia cdr returneaz\ o list\ cu excep]ia primului
element.
• Exist\ func]ii standard la care se face apel pentru
stabilirea componentelor X, Y [i Z ale unui punct
reprezentat printr-o list\.

50793936.doc R.2.1 2/3/2011 •73


AUTODESK, INC.

EXERCITIUL 9: LUCRUL CU LISTE DE PUNCTE

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre func]ii care separ\
liste [i func]ii care creaz\ liste.
• Crea puncte formate din liste [i le ve]i lega de
variabile.
• Crea puncte formate din liste bazate pe valorile X
[i Y din alte puncte formate din liste.
Matematica problemei
Dou\ puncte 2-dimensionale [i punctul care se afl\ la
mijlocul distan]ei dintre ele pot fi exprimate logic `n func]ie
de X [i Y dup\ cum urmeaz\.

pt1 = pt1x, pt1y


pt2 = pt2x, pt2y
midpt = mptx, mpty

Valorile X [i Y ale lui mpt pot fi exprimate aritmetic dup\ cum


urmeaz\.

mptx = (pt1x + pt2x)/2


mpty = (pt1y + pt2y)/2

Instruc]iuni
Scrie]i un set de expresii AutoLISP care execut\ urmatoarele
comenzi `n ordine
1. Lega]i o variabil\ pt1 de lista format\ din dou\ numere
reale 1.5 [i 8.9.
2. Lega]i o variabil\ pt2 de o list\ format\ din dou\
numere reale 7.8 [i 3.2.
3. Scrie]i un set de expresii care leag\ variabila midpt de
punctul care se afl\ la mijlocul distan]ei dintre
punctele pt1 [i pt2.
Dupa ce a]i verificat expresiile `n editorul AutoCAD scrie]i-
le mai jos.

•74
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Comenzi AutoCAD si AutoLISP


Comenzile AutoCAD pot fi chemate direct din AutoLISP, s-
expresiile AutoLISP pot fi folosite ca r\spunsuri la cererile de
comand\.

Obiective
~n acest capitol ve]i studia:
• Cum s\ chema]i o comand\ AutoCAD direct din
AutoLISP.
• Cum s\ folosi]i [irul AutoLISP, s-expresiile constante
[i variabile ca r\spunsuri la cererile de comand\.
• Sintaxa func]iei AutoLISP command .
• Cum s\ evita]i lucrul c`nd traduce]i un program
folosind comenzile `n limba englez\ indiferent
de versiunea AutoCAD.

Func]ia command
Func]ia command apeleaz\ func]iile AutoCAD din AutoLISP.
Func]ia command accept\ un argument de tip [ir care
trebuie s\ fie numele unei comenzi AutoCAD [i oricare alte
argumente op]ionale care ar fi `n mod normal introduse `n
linia de comand\.

~n cazurile `n care este nevoie de un return ca r\spuns la o


comand\, [irul "" este folosit ca argument. Aceasta este
reprezentarea AutoLISP a [irului nul pe care AutoCAD-ul o
interpreteaz\ ca un return `n cadrul func]iei apelative
command .

Func]ia command accept\ [iruri [i variabile AutoLISP ca


argumente. De exemplu aceste trei seturi de expresii
traseaz\ aceea[i entitate Line.

Folosirea argumentelor de tip [ir

Command: (command "line" "1,1" "5,5" "")


nil

Folosirea argumentelor constante

Command: (command "line” (quote (1.0 1.0)) (quote (5.0 5.0)) "")
nil

Folosirea argumentelor variabile

Command: (setq pt1 (list 1.0 1.0) pt2 (list 5.0 5.0))
(5.0 5.0)

50793936.doc R.2.1 2/3/2011 •75


AUTODESK, INC.

Command: (command "line" pt1 pt2"")


nil

Efecte secundare
Func]ia command returneaz\ `ntotdeauna nil. Efectul
secundar al unei expresii command este mult mai
interesant dec`t valoarea returnat\. Un efect secundar al
unei expresii AutoLISP reprezint\ o schimbare `n starea
programului care se produce datorit\ unei func]ii de
apelare. Efectul secundar al apel\rii unei func]ii setq este
pentru a crea un nou simbol de legatur\ sau pentru a atribui
o valoare la o variabil\. Efectul secundar al apel\rii unei
func]ii command este de a realiza o comand\ AutoCAD care
modific\ fi[ierul grafic `ntr-un anume fel.

Exemplu
~ncepe]i un desen nou.

Introduce]i expresiile care urmeaz\.

Lega]i dou\ variabile de dou\ puncte 2-dimensionale.


Command: (setq pt1 (list 1.0 1.0))
(1.0 1.0)

Command: (setq pt2 (list 5.0 5.0))


(5.0 5.0)
Apela]i la comanda LINE [i folosi]i variabilele ca argumente.
Command: (command "line" pt1 pt2 "")
nil
5,5

1,1
Figura 32. Linie de la 1.1 la 5.5

•76
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
Introduce]i expresiile care urmeaz\.

Folosi]i variabilele pt1 [i pt2 de la exerci]iul anterior ca


puncte reprezent`nd centrele a dou\ cercuri [i ca puncte
finale ale diametrului unui cerc.
Command: circle
3P/2P/TTR/<center point>: !pt1
Diameter/<Radius>: 0.5
Command: (command "circle" pt2 0.5)
Command: (command "circle" "2p" pt1 pt2)

Figura 33. Cercuri definite de pt1 si pt2

50793936.doc R.2.1 2/3/2011 •77


AUTODESK, INC.

Exemplu
Folosi]i valorile lui pt1 [i pt2 de la exerci]iul anterior.

Introduce]i expresiile care urmeaz\.

Desena]i dou\ arce folosind pt1 [i pt2 ca puncte finale [i o


valoare a razei de 3.5.
Command: arc
Center/<Start point>: !pt1
Center/End/<Second point>: e
End point: !pt2
Angle/Direction/Radius/<Center point>: r
Radius: 3.5

Command:(comand”arc” pt2 ”e” pt1 ”r” 3.5)

Figura 34. Arce definite de pt1 si pt2

•78
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Globalizarea comenzilor

Toate versiunile AutoCAD-ului vor accepta comenzile [i


op]iunile din limbajul american [i englezesc indiferent de
versiunea limbii surs\. Acest lucru permite utilizatorului s\
scrie o aplica]ie AutoLISP care poate fi folosit\ `n toate
versiunile de limbaj ale AutoCAD-ului f\r\ a traduce func]iile
command `n limba surs\.

Fiecare versiune AutoCAD tradus\ `ntr-o anumit\ limb\


pastreaz\ un menu de op]iuni [i comenzi din limba surs\. De
exemplu versiunea german\ AutoCAD pastreaz\ un menu de
op]iuni [i comenzi `n limba german\ astfel `ncit cei care o
folosesc `[i pot introduce comenzile `n german\. Toate
versiunile AutoCAD indiferent de limba surs\ p\strez\ un
menu de op]iuni [i comenzi `n engleza american\ `mpreun\
cu un menu `n limba surs\.

Pentru a folosi versiunea englezeasc\ a comenzilor [i


op]iunilor AutoCAD, prefa]ati [irul cu un caracter
“subliniere” sau cu "_". De exemplu acesta este modul `n
care se apeleaz\ la linia de comand\ `n toate versiunile
AutoCAD.
Command: (command "_line" "1.1" "5.1" "1.5" "_c")

Recapitulare
• Functia command permite apelarea comenzilor AutoCAD
din AutoLISP.

• {irul nul sau "" este tratat ca un return de c\tre func]ia


command.

• Expresiile AutoLISP s`nt acceptate ca r\spunsuri la cererile


de comand\ AutoCAD `n cadrul func]iei command .

• Argumentele func]iei command s`nt numele comenzii


AutoCAD urmate de r\spunsurile la cererile de comand\.

• Caracterul subliniere poate fi prefa]at `n cadrul unei


instruc]iuni de tip command `n engleza american\ [i va
func]iona `n toate versiunile de limbaj ale AutoCAD-ului.

50793936.doc R.2.1 2/3/2011 •79


AUTODESK, INC.

EXERCITIUL 10: TRANSFORMAREA COMENZILOR IN AUTOLISP

~n acest exerci]iu ve]i:


• Transforma comenzile AutoCAD script `n expresii
AutoLISP.
• Scrie expresiile.
• Testa expresiile `n editorul AutoCAD.
Instruc]iuni
1. ~ncepe]i un desen nou.
2. Transforma]i comenzile [i cererile AutoCAD `n expresii
ale func]iei command. Scrie]i r\spunsurile `n coloana
din dreapta.
3. Testa]i expresiile `n editorul AutoCAD.

Comenzi si cereri Expresii AutoLISP

Command: line (command "line" "1,1" "5,5" "")


From point: 1,1 or
To point: 5,5
To point: ENTER (command "line" '(1.0 1.0) '(5.0 5.0) "")

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

Command: circle
3P/2P/TTR/<Center point>: 2p
First point on diameter: 1,1
Second point on diameter: 5,5

Command: arc
Center/<Start point>: 2,1
Center/End/<Second point>: c
Center: 1,1
Angle/Length of chord/<End point>: l
Length of chord: 1.414
Tabelul 17. Traducerea comenzilor in AutoLISP

•80
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 11: APELUL COMENZII POLYLINE DIN AUTOLISP

~n acest exerci]iu:
• Ve]i folosi AutoLISP-ul pentru a executa o comand\
AutoCAD [i pentru a desena o nou\ entitate.
• Ve]i apela comanda AutoCAD PLINE din AutoLISP.
• Ve]i scrie un set de expresii AutoLISP pentru a
desena o polilinie rectangular\.
Instruc]iuni
1. ~ncepe]i un desen nou.
2. Crea]i urmatoarele legaturi de variabile `n AutoCAD:
(setq pt1 (list 1.0 1.0 0.0))
(setq pt3 (list 11.0 8.0 0.0))

3. Folosi]i variabilele pt1 [i pt3.


4. Scrie]i un set de expresii ce vor desena un dreptunghi,
folosind comanda "Polyline" op]iunea 2-D `nchis\ de
la punctul 1,1 la 11,1 la 11,8 la 1,8, folosind
variabilele pt1 [i pt3.
5. Folosi]i func]iile car, cdr, list [i command dac\ este nevoie.
6. Testa]i expresiile `n AutoCAD.
7. Scrie]i-le mai jos.

50793936.doc R.2.1 2/3/2011 •81


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•82
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Selec]ia interactiv\ a punctelor


AutoLISP-ul dispune de func]ii care opresc evaluarea unei
expresii [i permit utilizatorului s\ stocheze puncte [i distan]e
folosind metodele standard AutoCAD de specificare a
acestor valori. Punctul sau distan]a devine valoarea
returnat\ a expresiei.

Obiective
~n acest capitol ve]i studia:
• Cum s\ cere]i informa]ii utilizatorului `n cadrul unui
program AutoLISP.
• Cum s\ cere]i coordonatele unui punct
utilizatorului.
• Cum s\ cere]i o distan]\ utilizatorului.
• Cum s\ cere]i utilizatorului valoarea pe care o
dori]i.
• Cum s\ folosi]i puncte [i distan]e de la utilizator `n
cadrul func]iilor AutoLISP command [i comenzilor
AutoCAD.

Puncte si distan]e
Func]ia getpoint permite utilizatorului s\ selecteze un punct
folosind orice metode standard AutoCAD de selectare a
punctelor: selectare grafic\, coordonate absolute, relative
sau relative polare, ag\]area obiectelor, filtre de coordonate
sau accesarea ultimului punct.

Func]ia getdist permite utilizatorului s\ specifice o distant\


prin introducerea valorii sau selec]iond dou\ puncte. Este
acela[i mecanism folosit de fiecare comand\ AutoCAD care
cere utilizatorului o distan]\.

getpoint
Func]ia getpoint folose[te serviciile AutoCAD pentru a
permite utilizatorului s\ introduc\ un punct. Punctul selectat
de utilizator reprezint\ valoarea returnat\ a expresiei.
AutoLISP-ul returneaz\ punctul sub forma unei liste format\
din trei numere reale: valorile coordonatelor X, Y [i Z.
Command:(getpoint)
1,1,0
(1.01.00.0)
Func]ia getpoint este folosit\ pentru a ob]ine un punct de la
utilizator `n cadrul unei expresii AutoLISP. De exemplu ar
putea fi nevoie s\ cere]i utilizatorului din cadrul unui

50793936.doc R.2.1 2/3/2011 •83


AUTODESK, INC.

program AutoLISP, puncte care vor fi folosite apoi ca puncte


finale ale unei linii.

•84
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (setq pt1 (getpoint))


1,1
(1.0 1.0 0.0)

Command: (setq pt2 (getpoint))


5,5
(5.0 5.0 0.0)
Command: (command ”line” pt1 pt2 “”)

Deoarece toate serviciile AutoCAD de specificare a


punctelor s`nt disponibile `n timpul apel\rii func]iei getpoint,
nu s`nte]i constr`ns s\ introduce]i coordonatele exacte ale
punctului.
Command: (setq pt1 (getpoint))
<pick a point with the mouse>
<list of three reals returned>
Command: (setq pt2 (getpoint))
<pick a point with the mouse>
<list of three reals returned>
Command: (command “line “ pt1 pt2 “”)

Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabilele pt1 [i
pt2 de puncte pe care le selecta]i cu mouse-ul `n cadrul
unei func]ii de apelare getpoint [i folosi]i variabilele `ntr-o
comanda LINE.
Command: ( setq pt1 (getpoint))
pick a point
Command: (setq pt2 (getpoint))
pick a point
Command: (command “line” pt1 pt2””)

Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de
un punct pe care `l selecta]i cu mouse-ul [i variabila pt2 de
un punct descris de coordonatele polare relative.
Folosi]i variabilele `n linia de comand\.
Command: (setq pt1 (getpoint ))
pick a point
Command: (setq pt2 (getpoint))
@2<45

50793936.doc R.2.1 2/3/2011 •85


AUTODESK, INC.

Command: (command “line” pt1 pt2” “)

Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de
un punct pe care `l selecta]i cu mouse-ul `n cadrul unei
func]ii de apelare getpoint [i folosi]i variabila `ntr-o comand\
CIRCLE.
Command: (setq pt1 (getpoint))
pick a point

Command: (command “circle” pt1 0.5)

getdist
Func]ia getdist cere utilizatorului dou\ puncte. Valoarea
returnat\ este un num\r real: distan]a 3-D `ntre dou\
puncte.
Command: (setq dst1 (getdist))
Second point: 2,2
1.41421
Command: !dst1
1. 41421
Func]ia getdist prime[te un argument op]ional, punctul de
baz\ de la care se m\soar\ distan]a. ~n acest caz func]ia
cere utilizatorului un singur punct.

Command: (setq pt1 (list 1.0 1.0 0.0))


(1.0 1.0 0.0)
Command: (setq dst1 (getdist pt1))
2,2
1.41421
Command: !dst1
1.41421

•86
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Figura 35. Functia getdist “drag” din punctul initial 1,1,0

Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de
un punct folosind coordonatele absolute [i variabila rad
de distan]a dintre dou\ puncte pe care o selecta]i cu
mouse-ul. Folosi]i variabila `n comanda CIRCLE.
Command: (setq pt1 (getpoint))
5,5
(5.0 5.0 0.0)
Command: (setq rad (getdist))
pick two points
Command: (command “circle” pt1 rad)

Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila cen de
un punct pe care `l selecta]i cu mouse-ul. Lega]i variabila
rad de distan]a dintre cen [i un punct pe care `l selecta]i cu
mouse-ul. Folosi]i variabilele `n comanda CIRCLE.
Command: (setq cen (getpoint))
pick a point
Command: (setq rad (getdist cen))
pick a point
Command: (command “circle” cen rad)

50793936.doc R.2.1 2/3/2011 •87


AUTODESK, INC.

Dialog cu utilizatorul
Func]iile getpoint [i getdist primesc [i argumente op]ionale:
un [ir de text care este afi[at `n zona liniei de comand\ ca o
cerere pentru utilizator.

Command: (getpoint “Point:”)


Point: 1,1
(1.0 1.0 0.0)

Dac\ getdist cere dou\ puncte, se cere automat al doilea


punct "Second point:".

Command: (getdist “From point:”)


From poin: 1,1
(1.0 1.0 0.0)
Second point: 2,2
1.41421

Deoarece getdist prime[te dou\ cereri op]ionale, ordinea [i


tipul de date `n acest caz s`nt importante. Dac\ primul
argument al func]iei getdist este un [ir, acesta reprezint\ o
cerere. Dac\ primul argument este un punct, atunci se
poate proceda la cererea celui de-al doilea argument.

Command: (getdist (quote (1.0 1.0 0.0)) “To point:”)


To point: 2,2
1.41421

Recapitulare

• Func]ia getpoint returneaz\ un punct de la
utilizator.
• Func]ia getdist returneaz\ o distan]\ dat\ sub
forma unui num\r real de la utilizator.
• Ambele func]ii primesc argumente op]ionale
pentru utilizator.
• Utilizatorul poate aplica oricare dintre metodele
AutoCAD de specificare a punctelor [i
distan]elor la o cerere AutoLISP pentru un punct
sau o distan]\.

•88
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

50793936.doc R.2.1 2/3/2011 •89


AUTODESK, INC.

EXERCITIUL 12: CEREREA SI FOLOSIREA PUNCTELOR DE LA UTILIZATOR

~n acest exerci]iu ve]i:


• Scrie expresiile care cer utilizatorului puncte [i
distan]e.
• Scrie comenzile de desenare `n AutoCAD.

Partea I
Instruc]iuni
Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD
apoi scrie]i-le mai jos.
1. Cere]i utilizatorului patru puncte.
2. Atribui]i-le variabilelor pt1 prin pt4.
3. Trasa]i o polilinie 2-D `nchis\ `ntre cele patru puncte.

Partea a II-a
Instruc]iuni
Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD
apoi scrie]i-le mai jos.
1. Cere]i utilizatorului un punct centru [i atribui]i valoarea
unei variabile numite cen.
2. Cere]i utilizatorului distan]a de la variabila cen [i atribui]i
valoarea unei variabile numite rad.
3. Desena]i un cerc cu centrul cen [i raza rad.

•90
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a III-a

Instruc]iuni
Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD
apoi scrie]i-le mai jos.
1. Cere]i utilizatorului dou\ puncte.
2. Atribui]i-le variabilelor pt1 [i pt2.
3. Desena]i o polilinie 2-D `nchis\.
4. Folosi]i pt1 [i pt2 pentru col]urile opuse ale poliliniei.
5. Calcula]i celelalte dou\ puncte din pt1 [i pt2 folosind
func]iile car, cdr [i list.

50793936.doc R.2.1 2/3/2011 •91


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•92
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ii
Pe l`ng\ func]iile interne, AutoLISP-ul permite crearea
func]iilor definite de utilizator, adic\ func]ii ale caror seturi
de instruc]iuni [i nume au fost definite.

Obiective
~n acest capitol ve]i studia:
• Defini]ia func]iei AutoLISP.
• Cum s\ crea]i propriile func]ii AutoLISP.
• Sintaxa func]iei defun.
• Cum s\ trimite]i argumente unei func]ii.
• Cum returneaz\ func]ia o valoare.

Func]iile si evaluarea listelor


Considera]i procesul de evaluare al unei expresii tipice
care folose[te o func]ie intern\ AutoLISP.

(setq x 10)

AutoLISP-ul evalueaz\ primul element unde se a[teapt\ s\


gasesc\ o func]ie. Aici g\se[te subprogramul setq [i reface
leg\tura. Legarea lui setq reprezint\ un set de instruc]iuni
care arat\ cum trebuie facut\ procesarea. AutoLISP-ul
evalueaz\ argumentele lui setq `n ordine [i termin\ prin
aplicarea instruc]iunilor de procesare la valoarea
argumentelor.

Rezultatul `n acest caz este o valoare returnat\, 10, pentru


expresie [i un efect secundar al variabilei x care este legat\
de 10.

setq este un subprogram [i instruc]iunile lui au fost


predefinite `n AutoLISP. Utilizatorul nu le poate schimba.
Totu[i este posibil\ crearea unor noi func]ii care s\ execute
orice instruc]iuni de procesare dorite de utilizator.

Leg\turi noi se creaz\ prin folosirea subprogramului defun


care este func]ia de definire.

50793936.doc R.2.1 2/3/2011 •93


AUTODESK, INC.

Sintaxa func]iei defun


Sintaxa func]iei defun este pu]in diferit\ de cea a celorlalte
func]ii folosite p`n\ acum.

(defun <sym name> (<arg list> / <local var>) <expr> ...)

defun cere obligatoriu dou\ argumente [i un num\r variabil


de argumente care urmeaz\ dup\ primele dou\.

Argumentele func]iei defun


Primul argument al func]iei este numele noii func]ii de
definit. Folosi]i un nume nou pe care l-a]i creat, de
preferin]\ unul care descrie ac]iunile func]iei.

ATEN}IE Nu folosi]i niciodat\ numele unei func]ii sau a unui


simbol construite intern deoarece acesta se va suprapune
peste defini]ia original\ [i `l va face inaccesibil p`n\ lansa]i
AutoLISP-ul `n cadrul unei noi sesiuni AutoCAD.

~n acest exemplu, primul argument al func]iei defun este


numele simbol myfun care devine numele func]iei definite de
utilizator.

(defun myfun (<arg list> / <local var>) <expr> ...)

Al doilea argument cerut de defun este o list\ de


argumente cerute [i variabile locale. Cele dou\ tipuri de
argumente s`nt separate de o linie. Acum este suficient s\
folosi]i o list\ goal\.

Exemplul este extins pentru a include lista argumentelor


cerute [i a variabilelor locale.
(defun MYFUN ( ) <expr> ... )
Argumentele care urmeaz\ dup\ argumentele cerute s`nt
expresii de evaluat c`nd se execut\ func]ia definit\ de
utilizator. Ele reprezint\ instruc]iunile de procesare care vor
fi executate c`nd func]ia va fi apelat\.

Returnarea valorii unei func]ii

Valoarea returnat\ a func]iei definite de utilizator este


valoarea ultimei expresii din corpul defini]iei func]iei.

•94
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

~n urm\toarele exemple, expresiile vor fi ad\ugate corpului


func]iei myfun . Seturi diferite de expresii vor da `n]elesuri
diferite func]iei myfun precum [i valori returnate diferite.

~n acest exemplu myfun adaug\ dou\ numere [i returneaz\


r\spunsul.
(defun myfun ( )
(+ 1 2 )
)

Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun
apoi apela]i-o.

Command: (defun myfun () (+1 2 ))


MYFUN

Command: (myfun)
3

Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun
apoi apela]i-o. myfun va returna radacina patrat\ a lui 624,
rotunjit\ p`na la cel mai apropiat num\r `ntreg.

Command: (defun myfun () (fix (sqrt 624.0))


MYFUN

Command: (myfun)
24

Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun
apoi apela]i-o. myfun va returna distan]a dintre dou\ puncte
alese de utilizator.
Command: (defun myfun () (getdist “From point: “))
MYFUN

Command: (myfun)
From point: pick a point
Second point: pick a point

50793936.doc R.2.1 2/3/2011 •95


AUTODESK, INC.

~n cele trei exemple pe care le-a]i parcurs, valoarea


returnat\ a func]iei myfun este valoarea returnat\ a ultimei
expresii din corpul defini]iei.

function name

(defun myfun () list of required arguments and local variables

(+ 1 2) body of definition

)
Figura 36.Corp de expresii pentru o definitie a functiei

Expresii multiple pot fi introduse `n corpul defini]iei


func]iei. Valoarea returnat\ a func]iei este valoarea
returnat\ a ultimei expresii din corpul defini]iei.

~n acest exemplu valoarea returnat\ a func]iei myfun este


valoarea expresiei (+3 4)
Command: (defun myfun () (+1 2) (+3 4))
MYFUN
Command: (myfun)
7
function name

(defun myfun () list of required arguments and local variables

(+ 1 2) body of definition

return value of function (+ 3 4)

)
Figura 37.Ultima expresie din corp este valoarea returnata a functiei.

•96
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Argumentele unei func]ii


(defun myfun (<arg list> / <local var>) <expr>... )

Lista argumentelor cerute dintr-o expresie defun v\


permite s\ ad\uga]i argumente la func]iile de apelare.

~n acest exemplu func]ia myfun este definit\ cu un singur


argument solicitat: simbolul x. x este folosit `n cadrul
expresiei din corpul defini]iei func]iei myfun : (* x 10). Orice
valoare se utilizeaz\ ca argument la myfun, aceasta va
deveni automat valoarea lui x din corpul expresiei (* x 10).

Command: (defun myfun (x) (* x 10))


MYFUN
10
Command: (myfun 1)
20
Command: (myfun 2)
Command:

(myfun 1) user calls myfun with argument of 1

(defun myfun (x) 1 is mapped into argument x


(* x 10)
)

(defun myfun (1)

(* x 10) value of x becomes 1 in body of expressions


)
Figura 38. Valoarea argumentului se afla in corpul de expresii al functiei.

50793936.doc R.2.1 2/3/2011 •97


AUTODESK, INC.

Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o func]ie numit\
add-one care solicit\ un argument. Ad\uga]i unu la valoarea
lui [i returna]i. Folosi]i func]ia cu dou\ valori diferite

.
Command: (defun add-one (x) (+ x 1))
ADD-ONE
Command: (add-one 1)
2
Command: (add-one 4)
5

Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o func]ie numit\
dtr care cere un argument exprimat `n grade [i returneaz\
valoarea transformat\ `n radiani. Folosi]i func]ia cu trei
valori diferite.

Formula aritmetic\ pentru transformarea gradelor `n radiani


pentru valoarea d este:
(d / 180) * pi

Command: (defun dtr (d) (* pi (/ d 180.0)))


DTR
Command: (dtr 180)
3.14159
Command: (dtr 360)
6.28319
Command: (dtr 90)
1.5708

Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o func]ie care se
nume[te add-two care cere dou\ argumente, adaug\ valorile
lor [i returneaz\. Folosi]i func]ia cu dou\ seturi de valori
diferite.

Command: (defun add-two (x y) (+x y))


ADD-TWO
Command: (add-two 1 2)
3
Command: (add-two 4 5)
9

•98
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare

• Noile func]ii externe s`nt create cu ajutorul func]iei
defun.
• Toate func]iile returneaz\ o valoare.
• Func]iile s`nt definite f\r\ argumente sau cu un
num\r fix de argumente solicitate.
• Argumentele unei func]ii s`nt evaluate oriunde s-
ar afla `n corpul defini]iei func]iei.

50793936.doc R.2.1 2/3/2011 •99


AUTODESK, INC.

EXERCITIUL 13: DEFINREA UNOR NOI FUNCTII

Trebuie s\ completa]i partea a III-a a acestui


exerci]iu. Se vor face referiri la aceast\ parte `n
exerci]iile care urmeaz\.

~n acest exerci]iu ve]i:


• Consolida cuno[tin]ele despre cum s`nt create
func]iile definite de utilizator.
• Scrie func]ii cu argumente solicitate.
• Scrie o func]ie care apeleaz\ o comand\ AutoCAD.

Partea I
Instruc]iuni

1. Crea]i o func]ie numit\ times-two.


2. Func]ia solicit\ dou\ argumente.
3. Func]ia multiplic\ cele dou\ argumente [i returneaz\
valoarea.
4. Testa]i-o `n AutoCAD.
5. Scrie]i-o mai jos.

Partea a II-a

Instruc]iuni
1. Crea]i o func]ie numit\ rtd.
2. Func]ia solicit\ un argument.
3. Func]ia transform\ valoarea argumentului din radiani `n
grade [i returneaz\ valoarea.
4. Testa]i-o `n AutoCAD.
5. Scrie]i-o mai jos.
Formula aritmetic\ de transformare din radiani `n grade
pentru valoarea r este:
(r / pi) * 180

•100
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a III-a
Instruc]iuni
1. Crea]i o func]ie numit\ rectangle.
2. Func]ia nu cere argumente.
3. Cere]i utilizatorului dou\ puncte [i memora]i-le sub form\
de variabile.
4. Trasa]i o polilinie 2-D `nchisa folosind punctele pentru
col]urile opuse.
5. Calcula]i celelalte dou\ puncte cu ajutorul func]iilor car,
cdr [i list.
6. Testa]i-o `n AutoCAD.
7. Scrie]i-o mai jos.

50793936.doc R.2.1 2/3/2011 •101


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ inten]ionat.

•102
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ii care ac]ioneaz\ sub form\ de comenzi AutoCAD


O func]ie definit\ de utilizator poate apela o func]ie
AutoLISP command `n cadrul corpului defini]iei ei. Apelarea
ei apare utilizatorului sub forma unei comenzi AutoCAD, o
comand\ ce poate fi apelat\ f\r\ ca aceasta s\ se afle `ntre
paranteze.

Obiective
~n acest capitol ve]i studia:
• Cum s\ transforma]i o func]ie AutoLISP definit\ de
utilizator `ntr-o nou\ comand\ AutoCAD.
• Cum s\ folosi]i simbolul pause `n cadrul func]iilor
de tip command .
• Cum s\ ob]ine]i valoarea unei variabile de sistem
`n AutoLISP.

O noua comand\ ZOOM


Pentru a ilustra unele puncte sensibile ale definirii func]iilor
[i comenzilor AutoCAD vom crea o func]ie simpl\ [i util\ care
combin\ comanda ZOOM cu op]iunea Center, schimb`nd
factorul de afi[are cu 2.

Considera]i cererile pentru o opera]ie ZOOM CENTER.


Command: zoom
All/Center/Dynamic/Extens/Left/Previous/Vmax/Window/<Scale(X/XP>:
Center point:
Magnification or Heigh<current>:
Avem nevoie de dou\ valori pentru aceast\ func]ie: noul
punct centru [i factorul curent de afi[are multiplicat cu 2.
Vom ob]ine cele dou\ puncte de la utilizator prin
suspendarea evolu]iei func]iei [i vom ob]ine factorul de
afi[are prin setarea variabilei de sistem VIEWSIZE.

Simbolul "pause"
Putem ob]ine un punct de la utilizator prin legarea unei
variabile cu setq [i getpoint [i transferarea variabilei c\tre
comanda ZOOM.

(setq pt (getpoint “Center point: “))


(command “zoom” “c” pt ...)
Putem suspenda cererile de comand\ care vin din AutoCAD
pentru a permite utilizatorului s\ r\spund\ direct.

50793936.doc R.2.1 2/3/2011 •103


AUTODESK, INC.

(command “zoom” “c” pause ...)

Simbolul special AutoLISP pause este folosit ca argument


pentru func]iile tip command . pause suspend\ evaluarea
expresiei [i permite utilizatorului s\ raspund\ `n linia de
comand\ unde este introdus (`n cazul ilustrat mai sus,
cererea pentru un nou punct de centru pentru afi[are).

Variabile de sistem AutoCAD


Func]ia AutoLISP getvar are un singur argument: numele
unei variabile de sistem exprimat\ sub forma unui [ir, adic\
`ntre ghilimele. Func]ia returneaz\ valoarea variabilei de
sistem.

~n acest exemplu func]ia getvar returneaz\ valoarea


variabilei de sistem VIEWSIZE.
Command: (getvar “viewsize”)

Func]ia ZPLUS
Avem toate instruc]iunile necesare pentru definirea func]iei
noastre.
• O modalitate de a suspenda comanda ZOOM [i de a
permite utilizatorului s\ selecteze un nou punct
de centru.
• O modalitate de a ob]ine factorul de afi[are curent
zoom.
Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o nou\ func]ie
numit\ zplus [i folosi]i-o. zplus va afi[a noul punct de centru
pe care `l selecta]i cu factorul 2. defun zp
Command: (defun zplus() )
1> (setq zplus-height (*0.5 (getvar “viewsize”)))
1> (command “zoom” “c” pause zplus-height))
ZPLUS
Command: (zplus)
All/Center/Dynamic/Extens/Left/Previous/Vmax/Windows/<Scale(X/XP)>:
Center point: pick a point 4.
Magnification or Heigh<9.0000>:4.5.000000000
Command: nil
Command:

Func]ia C:ZPLUS
O sintax\ special\ pentru numele func]iei definite de
utilizator ne permite s\ apel\m func]ia sub o form\
prescurtat\ f\r\ s\ folosim paranteze. Aceast\ func]ie apare
mai cur`nd sub forma unei comenzi AutoCAD dec`t sub
forma unei func]ii.

•104
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Dac\ numele unei func]ii `ncepe cu litera C:, atunci func]ia


poate fi apelat\ fie sub forma unei func]ii sau sub forma
unei comenzi.

Dac\ numele unei func]ii `ncepe cu caracterul C:, func]ia


poate fi apelat\ pe linia de comand\ fie ca o func]ie, fie ca o
comand\.

~n acest exemplu, func]ia c:zplus este apelat\ ca o func]ie [i ca o


comand\.

Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia c:zplus [i
apela]i-o `n ambele moduri, ca o func]ie [i ca o comand\.
Command: (defunc: zplus ()
1> (setq zplus-height (* 0.5 (getvar "viewsize")))
1> (command "zoom" "c" pause zplus-height))
C:ZPLUS
Command: (c:zplus)
All/Center/Dynamic/Extents/Left/Previous/Vmax/Window/<Scale(X/XP)>:c
Center point: pick a point
Magnification or Height <2.250000>: 1125000000000
Command: nil

Command:zplus

All/Center/Dynamic/Extents/Left/Previous/Vmax/Window/<S
cale(X/XP)>:c Center point: pick a point
Magnification or Height <9.0000>: 4.5000000000
Command:nil
Command:

Recapitulare

• Simbolul pause permite utilizatorului s\ r\spund\ la
o cerere dintr-o comand\ AutoCAD apelat\ de
func]ia AutoLISP de tip command.
• Func]ia getvar stabile[te valoarea variabilei de
sistem.
• Prefa]`nd numele unei func]ii definit\ de utilizator
cu C: se creaz\ o nou\ comand\ AutoCAD

50793936.doc R.2.1 2/3/2011 •105


AUTODESK, INC.

EXERCITIUL 14: CREAREA DE NOI COMENZI AUTOCAD

Trebuie s\ completa]i partea I a acestui exerci]iu,


deoarece se vor face referiri la aceast\ parte [i `n alte
exerci]ii.

~n acest exerci]iu ve]i:


• Crea comenzi noi `n AutoCAD din func]ii AutoLISP.
• Modifica o func]ie existent\ dintr-un exerci]iu
anterior [i o ve]i transforma `ntr-o comand\.

Partea I

1. Modifica]i func]ia rectangle din partea a III-a a exerci]iului


11-1.
2. Defini]i func]ia ca c:rectangle.
3. Scrie]i func]ia mai jos.
4. Testa]i-o `n AutoCAD.

Partea a II-a
1. Defini]i o func]ie numit\ c:zminus.
2. Aceasta trebuie s\ fac\ acelea[i lucruri ca [i func]ia
c:zplus, dar schimba]i factorul de afi[are de la 2 la
1/2.
3. Scrie]i func]ia mai jos.
4. Testa]i-o `n AutoCAD.

•106
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Fi[ierele program AutoLISP

Pute]i crea func]ii definite de utilizator introduc`nd codul


corespunz\tor `n linia de comand\. Pentru definirea
func]iilor [i pentru succesiuni complexe de s-expresii este
adesea mult mai eficient s\ folosi]i un editor de text [i s\
scrie]i func]iile sau expresiile `ntr-un fi[ier de tip text cu o
extensie .lsp. Codul din fi[ier poate fi `nc\rcat `n editorul
grafic cu ajutorul func]iei AutoLISP load.

Obiective
~n acest capitol ve]i studia:
• Cum s\ scrieti fi[iere text care con]in programe
AutoLISP.
• Cum s\ `ncarca]i fi[ierele program AutoLISP `n
editorul grafic AutoCAD.
• Cum lucreaz\ func]ia AutoLISP load.
• Cum s\ recunoa[te]i cele mai frecvente mesaje de
erori `n timpul inc\rc\rii.

Evaluarea la `nc\rcarea fi[ierului

Func]ia load cite[te pe r`nd expresiile dintr-un fi[ier [i


evalueaz\ fiecare expresie `n parte. Valoarea returnat\ de
func]ia load este valoarea ultimei expresii care a fost
evaluat\.

Func]ia load cere un singur argument de tip [ir: numele


fi[ierului .lsp de `nc\rcat.
(load “filename”).
Dac\ ad\uga]i codul pentru func]ia c:rectangle la numele unui
fi[ier rectang.lsp pute]i `nc\rca fi[ierul `ntr-o sesiune de
editare grafic\ f\r\ s\
reintroduce]i `ntreaga defini]ie a func]iei

NOT| • Func]ia AutoLISP load este diferit\ de comanda


AutoCAD LOAD.

50793936.doc R.2.1 2/3/2011 •107


AUTODESK, INC.

C\utarea fi[ierului

AutoLISP-ul va c\uta fi[ierul rectang.lsp `n directorul curent


`mpreun\ cu alte directoare men]ionate `n specificarea de
cale a bibliotecii AutoCAD-ului. Dac\ g\se[te fi[ierul, `l va
`nc\rca `n editor.

Pentru lista de directoare aflate `n specificarea de cale a


bibliotecii AutoCAD consulta]i descrierea func]iei findfile `n
capitolul 4 din AutoLISP Programmer's Reference Manual.

Mesaje de eroare la `nc\rcare

Dac\ AutoLISP-ul afi[eaz\ un mesaj de eroare la `nc\rcarea


fi[ierului, trebuie s\ edita]i fi[ierul [i s\ corecta]i eroarea.

Lista erorilor AutoLISP [i a cauzelor acestora se afl\ `n


Appendix D din AutoLISP Programmer's Reference Manual..
O list\ succint\ a erorilor pe care este posibil s\ le `nt`lni]i la
`nc\rcare este dat\ mai jos. Majoritatea mesajelor indic\
erori tipice de programare AutoLISP cum ar fi:
• Ortografierea gre[it\ a func]iilor sau a numelor
simbol
• Tipuri gre[ite de argumente la func]ie
• Paranteze ne`mperecheate
• Ghilimele ne`mperecheate

•108
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Mesaje de eroare Explicatii

can't open file for input -- LOAD failed Fisierul numit in Functia load nu poate fi
gasit., sau utilizatorul nu are acces sa
citeasca fisierul.

extra right paren S-a detectat una sau mai multe paranteze
dreapta in plus.

insufficient string space Nu exista spatiu suficient pentru a aranja sirul


text specificat, de obicei datorita ghilimelelor
neimperecheate.

malformed list O lista citita dintr-un fisier s-a terminat


prematur. Cea mai frecventa cauza este
imperecherea gresita a parantezelor sau a
ghilimeleor..

Tabelul 18. Mesaje de eroare la incarcare

Recapitulare

• Programele AutoLISP pot fi stocate `n fi[iere text


externe.
• Fi[ierele AutoLISP au extensia .lsp.
• Func]ia load `ncarc\ un program AutoLISP `n
AutoCAD.
• AutoLISP-ul v\ atrage aten]ia printr-un mesaj de
eroare dac\ are o problem\ la `nc\rcarea
fi[ierului.

50793936.doc R.2.1 2/3/2011 •109


AUTODESK, INC.

EXERCITIUL 15: INCARCAREA UNUI FISIER SURSA AUTOLISP

~n acest exerci]iu ve]i:


• Crea un fi[ier program AutoLISP.
• ~nc\rca fi[ierul `n editorul grafic .
• Folosi comanda definit\ de fi[ier.

Instruc]iuni

1. Folosi]i editorul text pe sta]ia dvs. de lucru. Ruga]i


instructorul s\ v\ ajute s\ configura]i editorul de text
`n sistemul dvs.
2. Crea]i un fi[ier de text numit rectang.lsp.
3. Salva]i fi[ierul `n directorul de lucru.
4. ~nc\rca]i fi[ierul `n editorul grafic.
5. Folosi]i comanda RECTANGLE.

(defun c:rectangle ()
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command
"_.pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
)
Command: (load "rectang")
C:RECTANGLE

Command: rectangle
First corner:

•110
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Sugestii de programare optim\ a func]iilor C:

Acest capitol trateaz\ o serie de aspecte referitoare la


interfa]a [i opera]iile interne ale func]iilor C:, dar aceste
rezultate pot fi aplicate la orice defini]ie a unei func]ii nu
numai la cele a c\ror nume `ncepe cu C:.

Obiective
~n acest capitol ve]i studia:
• Cum se `ntrerupe execu]ia unei func]ii definite de
utilizator.
• Cum s\ anula]i afi[area cererilor de comand\
AutoCAD `n timpul execut\rii unei comenzi
AutoLISP.
• Conceptul de alocare [i de variabile locale [i
globale.
• Diferen]a dintre variabilele locale [i globale.
• Cum s\ declara]i [i s\ folosi]i variabilele locale `n
cadrul defini]iei func]iei.

Returnarea [irului vid de la o func]ie C:

Valoarea ultimei expresii din corpul de expresii care


urmeaz\ dup\ argumentele cerute [i variabilele locale din
defini]ia unei func]ii este `ntotdeauna returnat\ ca valoarea
func]iei. Cred c\ a]i observat c\ func]ia c:rectangle returneaz\
nil. Acest lucru este evident deoarece o func]ie de apelare
de tip command este ultima expresie din corpul defini]iei
func]iei c:rectangle [i func]ia de tip command returneaz\
`ntotdeauna nil.

Func]ia AutoLISP prin1 va vizualiza un [ir vid pe ecran dac\


prin1 este ultima expresie din defini]ia func]iei. De exemplu,
aceast\ versiune modificat\ a comenzii RECTANGLE nu
vizualizeaz\ nil la cererea de comand\ dup\ ce aceasta a fost
executat\.

50793936.doc R.2.1 2/3/2011 •111


AUTODESK, INC.

( defun c:rectangle ()
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command
"_.pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(prin1)
)

Anularea afi[\rii cererilor de comand\ AutoCAD


Implicit AutoCAD-ul dubleaz\ toate comenzile [i op]iunile `n
zona liniei de comand\, incluzind [i pe cele emise de un
program AutoLISP.

Variabila de sistem CMDECHO poate suprima aceast\


"comand\ dubl\".

~n aceast\ versiune modificat\ a func]iei c:rectangle,


CMDECHO este setat\ pe off la startul rutinei iar la ie[ire este
setat\ pe on.
(defun c:rectangle ()
(setq old_cmdecho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command "pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(setvar "CMDECHO" old_cmdecho)
(prin1)
)

Alocarea: Moduri de legare a unei variabile


AutoLISP-ul folose[te o schem\ dinamic\ de alocare.
Alocarea unei variabile este determinat\ `n timpul
func]ion\rii de ordinea apel\rii func]iei [i de declara]iile de
variabil\.

Variabilele s`nt legate `n dou\ moduri: global [i local

O variabil\ global\ este o variabil\ a c\rei legare (sau


atribuire a unei valori) a fost f\cut\ cu ajutorul func]iilor set [i
setq [i nedeclarat\ local\ `n func]ie. Variabilele globale pot fi
vizualizate sub forma de liste pe ecran folosind func]ia de
apelare (familia de atomi 0).

•112
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Variabilele globale s`nt accesibile tuturor func]iilor definite


de utilizator at`t pentru citire c`t [i pentru
scriere.Variabilele globale s`nt adesea folosite pentru
"comunicare" `ntre programele AutoLISP. De exemplu
Programul 1 va seta o condi]ie `ntr-o variabil\ global\ pe
care Programul o va verifica `nainte de a ac]iona.

O variabil\ local\ este o variabil\ a c\rei legare a fost facut\


cu ajutorul func]iilor set [i setq `n cadrul unei func]ii a c\rei
variabil\ a fost declarat\ local\ sau cu ajutorul declara]iei
sub forma unui argument cerut la o func]ie.

Variabilele locale `[i men]in leg\tura numai `n contextul


unei func]ii `n care au fost declarate ca fiind locale. Ele `[i
pierd leg\tura odat\ cu ie[irea func]iei.

Legarea unei variabile globale se poate schimba `n cazul


aloc\rii unei func]ii `n care o variabil\ cu acela[i nume a fost
declarat\ local. La ie[irea func]iei, variabila este legat\ din
nou de valoarea global\ original\.

Un set de s-expresii ilustreaz\ aceste concepte.

Exemplu
Citi]i explica]iile [i introduce]i s-expresiile adecvate.

Mai `nt`i ve]i lega global variabila x de valoarea 1.


Command: (setq x 1)
1
Command: !x
1
Apoi ve]i defini o func]ie local_arg care `l declar\ pe x ca
argument. Legarea lui x se poate schimba local `n cadrul
aloc\rii func]iei local_arg [i legarea global\ va fi restabilit\ la
ie[irea func]iei local_arg .
Command: (defun local_arg (x) (print x) (* x x))
LOCAL_ARG
Command: (local_arg 2)
2
4
Command: !x
1
Apoi ve]i defini o func]ie local_var care `l declar\ pe x ca
variabil\ local\. Legarea lui x se poate schimba local `n
cadrul aloc\rii func]iei local_var [i legarea global\ va fi
restabilit\ la ie[irea func]iei local_var.
Command: (defun local_var (/ x) (setq x 3) (print x))
LOCAL_VAR
Command: (local_var)

50793936.doc R.2.1 2/3/2011 •113


AUTODESK, INC.

3
Command: !x
1
Ve]i defini apoi o func]ie global_var unde variabila x nu a fost
definit\ nici ca argument nici ca variabil\ local\; de aceea
schimbarea `n interiorul leg\turii se va face global, `n afara
alocarii func]iei global_var.
Command: (defun global_var () (setq x 4) (print x))
GLOBAL_VAR
Command: (global_var)
4
Command: !x
4

Folosirea variabilelor locale


Func]ia c:rectangle a fost pe deplin clarificat\. ~n acest
exemplu, variabilele old_emdecho, pt1 [i pt2 s`nt declarate ca
fiind locale la func]ie; deci ele nu pot intra `n conflict cu
variabilele globale care au acela[i nume [i nici cu variabilele
cu acela[i nume care pot fi g\site `n cadrul altor func]ii.

(defun c:rectangle (/ old_cmdecho pt1 pt3)


(setq old_cmdecho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt2 (getpoint "\nOther corner: "))
(command "pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(setvar "CMDECHO" old_cmdecho)
(prin1)
)

Declara]ia variabilelor locale se face de obicei dup\ un


program care a fost verificat [i pus la punct `ntruc`t
declara]ia face dificil\ sau chiar imposibil\ examinarea
valorilor lor `n cazul `n care func]ia aborteaz\ sau face ceva
nea[teptat din cauza unei erori `n cod.

Globalizarea variabilelor de sistem


Variabilele de sistem apelate de func]ia AutoLISP setvar nu
se traduc niciodat\ din limba englez\ `n limba utilizatorului.
Cererile de apelare a func]iei setvar func]ioneaz\ `n toate
versiunile AutoCAD-ului f\r\ s\ necesite traducerea numelui
variabilei de sistem din limba englez\ `n limba utilizatorului.

•114
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Variabilele de dimensiune se traduc numai `n linia de


comand\ pentru dimensionare.

Redefinirea comenzii
Pute]i `nlocui comenzile AutoCAD existente cu comenzi
AutoLISP care au acela[i nume.

Utilizatorul poate apela o comand\ AutoCAD prin prefa]area


numelui comenzii prin caracterul punct (.), de
exemplu, .LINE, indiferent dac\ comanda a fost nedefinit\.

Este bine s\ prefa]a]i numele unei comenzi apelate de


func]ia AutoLISP de tip command printr-un punct (.) sau prin
subliniere (pentru a v\ asigura c\ func]ioneaza `n toate
limbile).

S`nt dou\ etape de parcurs pentru `nlocuirea comenzii


AutoCAD cu o comand\ AutoLISP care are acela[i nume.
• Folosi]i comanda UNDEFINE pentru a anihila o
comand\ AutoCAD pentru sesiunea de editare
curent\.
• Crea]i o func]ie AutoLISP care are acela[i nume ca
[i comanda AutoCAD [i prefa]a]i-o cu c:.
Pute]i redefini o comand\ AutoCAD folosind comanda
REDEFINE.

Exemplu
Introduce]i expresiile care urmeaz\.

Anihila]i comanda AutoCAD LINE.


Command: undefine
Command name: line
~nlocui]i-o cu o comand\ AutoLISP cu acela[i nume care
deseneaz\ o linie segment. Apela]i versiunea englezeasc\ a
comenzii AutoCAD LINE din cadrul func]iei AutoLISP.
Command: (defun c: line () (command “._ line “ pause pause “”))
C: LINE
Apela]i comanda LINE.

50793936.doc R.2.1 2/3/2011 •115


AUTODESK, INC.

Command: line
.- line From point: pick a point
To point pick a point
To point:
Command: nil
Redefini]i comanda AutoCAD.
Command: redefine
Command name: line

•116
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare

• Pute]i ie[i dintr-o func]ie apel`nd prin1 sau princ


care reprezint\ ultima expresie `n corpul
definitiei func]iei.
• Variabila de sistem CMDECHO poate suprima
afi[area cererilor de comand\ AutoCAD.
• AutoLISP-ul utilizeaz\ o schem\ dinamic\ de
alocare.
• Variabilele globale s`nt accesibile pentru toate
func]iile.
• Variabilele locale s`nt accesibile numai `n
contextul func]iilor `n care au fost declarate.
• Pute]i folosi variabile locale `n cadrul func]iilor
pentru a evita posibilitatea unor conflicte `ntre
variabile cu acelea[i nume din alte func]ii.
• Variabilele de sistem apelate de func]ia setvar nu
se traduc niciodat\ din englez\.
• Comenzile AutoCAD pot fi `nlocuite cu comenzi
AutoLISP care au acela[i nume, folosind
comanda UNDEFINE.
• Comanda AutoCAD va fi `ntotdeauna apelat\ c`nd
numele comenzii este prefa]at printr-un punct;
de exemplu .LINE, indiferent dac\ comanda a
fost anihilat\.
• Prefa]a]i `ntotdeauna numele unei comenzi cu un
punct (.) sau prin caracterul subliniere ( _ ) `n
cazul func]iei de tip command .
• Prefa]a]i `ntotdeauna op]iunea de comand\ prin
caracterul subliniere ( _ ) `n cazul func]iei de tip
command .

50793936.doc R.2.1 2/3/2011 •117


AUTODESK, INC.

EXERCITIUL 16: FUNCTIA DE PROGRAMARE OPTIMA

~n acest exerci]iu:
• Ve]i consolida cuno[tin]ele cu privire la ordonarea
func]iilor C:, incluz`nd ie[irea func]iilor,
dublarea cererii de comand\ [i declara]ia
variabilei locale.
• Ve]i modifica fi[ierul rectang.lsp pentru a introduce
noi concepte din acest capitol.
• Ve]i crea un nou fi[ier text cu o func]ie modificat\.

Partea I
Etape de lucru
1. Modifica]i fi[ierul rectang.lsp
2. Ad\uga]i func]ia de ie[ire imediat\.
3. Anula]i ecoul cererii de comand\.
4. Declara]i variabilele corespunz\toare ca variabile locale.
5. ~nc\rca]i, lansa]i [i testa]i programul dup\ ce a]i f\cut
modific\rile.

Partea a II-a
Etape de lucru
• Rescrie]i func]ia c:zplus de la sf`r[itul capitolul 12
`ntr-un fi[ier numit zplus.lsp.
• Folosi]i func]ia getpoint pentru a ob]ine noul punct
de centru a ecranului.
• Anula]i ecoul din op]iunile [i cererile de comand\
ZOOM.
• Declara]i toate variabilele local.
• Introduce]i func]ia de ie[ire.
• ~nc\rca]i, demara]i [i testa]i programul dup\ ce a]i
f\cut modific\rile.

NOTA • Func]iile GETxxx nu pot fi folosite `n cadrul


expresiilor func]iilor command; de exemplu, (command "line"
(getpoint)) nu este permis\.

•118
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

50793936.doc R.2.1 2/3/2011 •119


AUTODESK, INC.

Teste logice [i de egalitate


Programele AutoLISP pot face un salt pe baza valorii unei
expresii test.

Obiective
~n acest capitol ve]i studia:
• Cum se poate schimba controlul desf\[urarii
unui program pe baza unei expresii test.
• Cum s\ folosi]i testele de egalitate [i testele
logice ca expresii test.
• Diferen]a dintre simbolul t [i simbolul nil.
• Cum s\ determina]i tipul de date al unui obiect.

Ramificarea programului
Aceasta diagrama simpl\ ilustreaz\ principiul ramific\rii
programului.

Set value of x

x = "Hello, world."?

t or true nil or false

Branch to function (y) Branch to function (z)

Figura 2. Ramificarea programului bazata pe testul de conditie

~n aceast\ diagram\, dac\ valoarea variabilei x este egal\ cu


[irul de tip text "Hello, world", atunci programul se va
ramifica `n expresia y [i va continua; dac\ nu , se va
ramifica `n expresia z [i va continua.
Func]iile care realizeaz\ testele condi]ionale s`nt folosite
pentru ramifica]ii `n interiorul programelor AutoLISP. Cele
dou\ func]ii de baz\ pentru testele condi]ionale s`nt:
• if
• cond

•120
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Unele valori sau seturi de valori s`nt testate cu if sau cond


iar programul se ramific\ conform rezultatelor testului.
AutoLISP-ul dispune de o varietate de func]ii care testeaz\
valorile pe baza anumitor criterii sau unele valori pe baza
celorlalte. ~n acest capitol ne concentr\m aten]ia asupra
unora dintre cele mai utilizate func]ii de acest tip.
• =, >, <
• equal
• and
• or
• not
• logand

t si nil
~n AutoLISP, simbolul t este echivalentul pentru "adev\rat"
`n orice test condi]ional. Simbolul nil este echivalentul lui
"fals".

Dac\ o expresie AutoLISP nu se evalueaz\, atunci expresia


este nil sau fals\. Dac\ o expresie nil este folosit\ `ntr-un test
condi]ional, atunci va fi executat\ o ramifica]ie pentru o
condi]ie fals\.

Dac\ o expresie AutoLISP evalueaz\ orice altceva dec`t nil,


atunci expresia este t sau adev\rat\. Dac\ o expresie t este
folosit\ `ntr-un test condi]ional, atunci va fi executat\
ramifica]ia pentru o condi]ie adevarat\.

t[i nil se exclud mutual. Dac\ o expresie este t, atunci nu


poate fi nil. Dac\ o expresie este nil, atunci nu poate fi t.

50793936.doc R.2.1 2/3/2011 •121


AUTODESK, INC.

EXERCITIUL NR 17: OBIECTELE SI EXPRESIILE POT FI T SAU NIL

~n acest exerci]iu:
• Ve]i `nv\]a s\ determina]i dac\ valoarea returnat\ a
unei func]ii este t sau nil.
Instruc]iuni
1. ~ntr-un desen nou, desena]i o entitate de tip linie.
2. Introduce]i expresiile `n coloana din st`nga a tabelului.
3. Determina]i dac\ expresiile s`nt t sau nil.
4. Verifica]i c\su]a adecvat\ din tabel.

Expresie t nil

(setq ename (entnext))

!ename

(setq ename (entnext ename))

!ename

(+ 1 2)

(- 1 1)

()

(command "erase" "last" "")

(command "u")

Tabelul 19. Expresiile pot fi t sau nil

•122
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ii care testeaz\ egalitatea


Func]ia = are dou\ sau mai multe argumente cu orice tip de
date. Aceast\ func]ie verific\ dac\ toate argumentele au
valori echivalente. Dac\ da, func]ia returneaz\ t; dac\ nu,
returneaz\ nil.

De exemplu, aceast\ expresie verific\ dac\ valorile num\rului


real 4.0 [i expresia (+ 2.0 2.0) s`nt echivalente
Command: (= 4.0 (+ 2.0 2.0))
T
Aceast\ expresie verific\ dac\ 4.0 este echivalent cu
expresia (+ 1.5 2.0)
Command: (= 4.0 (+ 1.5 2.0))
nil
Func]ia < verific\ dac\ primul ei argument este numeric mai
mic dec`t al doilea argument.
Command: (< 45 50)
T
Func]ia equal este `n esen]\ aceea[i cu func]ia =.

Exerci]iu
Introduce]i expresiile care urmeaz\.
Lega]i dou\ variabile de valori numerice. Folosi]i variabilele
ca argumente la c`teva func]ii [i verifica]i rezultatele.

Command: (setq x 1)
1

Command: (setq y 1.5)


1.5

Verifica]i dac\ x este mai mic dec`t y.


Command: (< x y)
T

Verifica]i dac\ x este mai mare dec`t y.


Command: (> x y)
nil

50793936.doc R.2.1 2/3/2011 •123


AUTODESK, INC.

Verifica]i dac\ y este mai mare sau egal cu 1,5.


Command: (>= y 1.5)
T

Verifica]i dac\ x este mai mic sau egal cu y.

Command: (<= x y)
T

Verifica]i dac\ x nu este egal cu y.


Command: (/= x y)
T

Acest tabel arat\ func]iile care verific\ egalitatea `n


AutoLISP.

Functie Test

= Egal cu

/= Nu este egal cu

< Mai mic decit

<= Mai mic sau egal cu

> Mai mare decit

>= Mai mare sau egal cu

minusp Mai mic decit zero

zerop Egal cu zero

equal Egal cu

eq Au aceeasi legatura

Tabelul 20. Functii de egalitate

•124
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ii care verific\ tipul de date


AutoLISP-ul dispune de c`teva func]ii care verific\ tipul de
date ale unui simbol sau expresii.
Functie Test

ATOM Este argumentul un atom?

LISTP Este argumentul o lista?

BOUNDP Este argumentul legat de o valoare?

NULL Este argumentul nil?

NUMBERP Este argumentul un num\r?

Tabelul 21. Functii care testeaza tipul de date

Exemplu
Introduce]i expresiile care urmeaz\.

Lega]i trei variabile de trei tipuri de date diferite: un simbol,


un num\r real [i o list\.

Command: (setq x 'abc)


ABC

Command: (setq y 1.0)


1.0

Command: (setq z '(1 2 3))


(1 2 3)

Folosi]i variabilele ca argumente la func]ii care testeaz\


tipul de date. Examina]i rezultatele func]iilor.

S`nt aceste variabile atomi?


Command: (atom x)
T

Command: (atom y)
T

Command: (atom z)
nil
S`nt aceste variabile liste?

Command: (listp x)
nil

Command: (listp y)
nil

50793936.doc R.2.1 2/3/2011 •125


AUTODESK, INC.

Command: (listp z)
T

Combinarea func]iilor type cu func]iile "="


Pute]i verifica tipul de date al unui obiect `n AutoLISP
folosind fie func]ia =, fie func]ia equal cu func]ia type.

Exemplu
Introduce]i expresiile care urmeaz\.

Lega]i dou\ variabile cu tipuri de date diferite: un num\r


`ntreg [i un num\r real.
Command: (setq x 1)
1

Command: (setq y 1.5)


1.5

Folosi]i func]iile type [i = pentru a verifica tipul lor de date.


Command: (= (type x) 'INT)
T

Command: (equal (type x) 'REAL)


nil

Command: (equal (type y) 'REAL)


T

•126
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ii logice
Exist\ c`teva func]ii de test logic `n AutoLISP. ~n acest
capitol vom studia patru dintre cele mai importante func]ii:
not, and, or [i logand .

Func]ia not
Func]ia not solicit\ un argument. Dac\ argumentul este nil,
atunci expresia returneaz\ t; dac\ nu, aceasta returneaz\
nil.

Func]ia not este o func]ie a c\rei valoare returnat\ este


opusul argumentului ei. Da]i-i nil [i va returna t. Da]i-i t [i va
returna nil.

Exemplu
Command: (not nil)
T

Command: (not t)
nil

Func]ia and
Func]ia and solicit\ unul sau mai multe argumente. Dac\
unul dintre argumente este nil, ea returneaz\ nil. Dac\ toate
argumentele s`nt t , atunci returneaz\ t.

Func]ia and opre[te procesarea de `ndat\ ce g\se[te un


argument nil. Unele programe s`nt scrise `n acord cu acest
comportament. De exemplu, pute]i fi siguri c\ programul nu
va g\si o instruc]iune `ntr-o list\ de argumente ale func]iei
and dac\ nici unul dintre argumentele anterioare nu este nil.

Exemplu
Command: (and 1 2 3)
T

Command: (and 1 2 nil)


nil

Func]ia or
Func]ia or solicit\ unul sau mai multe argumente. Dac\ unul
dintre argumente este t, func]ia returneaz\ t. Dac\ toate
argumentele s`nt nil, atunci func]ia returneaz\ nil.

Func]ia or opre[te procesarea de `ndat\ ce g\se[te un


argument t. Unele programe s`nt scrise `n conformitate cu

50793936.doc R.2.1 2/3/2011 •127


AUTODESK, INC.

acest comportament. De exemplu, pute]i fi siguri c\


programul nu va g\si o instruc]iune `ntr-o list\ de
argumente ale func]iei or dac\ nici unul dintre argumentele
anterioare nu este t.

Exemplu
Command: (or 1 2 3)
T

Command: (or 1 2 nil)


T

Command: (or nil nil nil)


nil

Func]ia logand
Func]ia logand are dou\ sau mai multe argumente care ar
trebui s\ fie numere `ntregi. Func]ia returneaz\ un num\r
`ntreg.

Func]ia logand realizeaz\ o compara]ie AND bit cu bit a


bi]ilor din argumentele care s`nt numere `ntregi. Dac\ un
bit este setat la valoarea "adev\rat" `n toate argumentele
func]iei logand, atunci acel bit este setat la valoarea
"adev\rat" [i `n valoarea returnat\.

Numerele `ntregi 7, 3 [i 15 s`nt reprezentate `n bi]i `n


tabelul de mai jos.

Intreg 1 bit 2 bit 4 bit 8 bit 16 bit

7 X X X

3 X X

15 X X X X

Tabelul 22. Biti setati la valoarea "adevarat" in trei numere intregi.

Aceast\ expresie va returna un num\r `ntreg `n care to]i


bi]ii care s`nt seta]i la valoarea "adev\rat" `n toate cele trei
argumente vor fi seta]i la valoarea "adev\rat”. ~n acest
caz, bi]ii pentru valorile 1 [i 2 vor fi returna]i ca "adev\rat"
de c\tre expresie, deoarece s`nt singurii bi]i seta]i
"adev\rat" `n toate cele trei argumente.

Command: (logand 7 15 3)
3

•128
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ia logand va fi de folos atunci c`nd va fi folosit\


`mpreun\ cu func]iile "entity access" mai t`rziu `n acest
curs, `n special cu valorile binare cum ar fi codurile grupului
70 DXF pentru Polylines [i Block Definitions .

50793936.doc R.2.1 2/3/2011 •129


AUTODESK, INC.

Recapitulare
• Ramificarea unui program depinde de valoarea unui
test condi]ional.
• Toate obiectele [i expresiile din AutoLISP s`nt t sau nil.
• AutoLISP dispune de o varietate de func]ii care
testeaz\ tipul de egalitate [i tipul de date ale
obiectelor [i expresiilor.
• Pute]i testa tipul exact de date al unui obiect
combin`nd func]iile type [i =.
• Func]iile logice not, and [i or verific\ dac\ una sau mai
multe expresii s`nt t sau nil.
• Func]ia logand realizeaz\ o compara]ie AND bit cu bit a
unei liste de numere; aceasta func]ie va fi de ajutor
`n combina]ie cu func]iile de tip entity access mai
t`rziu.

•130
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Expresii test [i expresii condi]ionale

• Func]iile de egalitate [i func]iile logice s`nt folosite


`n expresii test. Expresiile test s`nt folosite `n
expresii condi]ionale [i iterative formate din
func]ii ca if [i while. Ele verific\ dac\ exist\ o
anumit\ condi]ie [i arat\ AutoLISP-ului ce func]ie
s\ execute care depinde de condi]ie, sau de
rezultatul testului.

NOT| • Orice atom, simbol sau expresie poate fi folosit\ ca


expresie test deoarece orice obiect `n LISP are o valoare:
fie nil, fie altceva.

Obiective
~n acest capitol ve]i studia:
• Cum s\ folosi]i expresiile condi]ionale pentru a
face salt la diferite seturi de expresii `n cadrul
programului AutoLISP
• Sintaxa func]iilor if [i cond.
• Cum s\ folosi]i func]ia progn pentru a executa
multiple s- expresii `n cadrul func]iei if.
Expresii condi]ionale

Expresiile condi]ionale controleaz\ desf\[urarea unui


program AutoLISP. Folosim expresiile test pentru a verifica
dac\ o anumit\ condi]ie exist\, iar rezultatul expresiei test
este folosit pentru a comuta expresia condi]ional\. Expresia
condi]ional\ poate opta pentru execu]ia programului `n
oricare din cele c`teva direc]ii posibile. Fiecare direc]ie va
avea un set de expresii de evaluat `n AutoLISP.

Cele mai folosite expresii condi]ionale `n AutoLISP s`nt


func]iile if [i cond.

Func]ia if
Func]ia if are dou\ argumente obligatorii [i un al treilea
argument care este op]ional.

Dac\ valoarea primului argument este t, adic\ oricare `n


afar\ de nil, AutoLISP-ul evalueaz\ al doilea argument.

Dac\ valoarea primului argument este nil, AutoLISP-ul sare


peste al doilea argument. Dac\ exist\ cel de-al treilea
argument op]ional, AutoLISP-ul il evalueaz\.

50793936.doc R.2.1 2/3/2011 •131


AUTODESK, INC.

Simplific`nd pu]in lucrurile, func]ia if ar ar\ta cam a[a:

(if
(I_return_true)
(do_this)
(else_do_this)
)

Exemplu
Introduce]i expresiile care urmeaz\:

Lega]i variabila x de o valoare a lui 1. Lega]i valoarea lui y


bazat\ pe valoarea lui x.
Command: (setq x 1)
1

Command: (if (= x 1) (setq y 1) (setq y 0))


1

Command: !y
1
Lega]i variabila x de o valoare a lui 0. Lega]i variabila y
bazat\ pe valoarea x.
Command: (setq x 0)
0

Command: (if (= x 1) (setq y 1) (setq y 0))


0

Command: !y
0

•132
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 18: RAMIFICAREA PROGRAMULUI FOLOSIND FUNCTIA IF

~n acest exerci]iu :

• Ve]i folosi func]ia if.


• Ve]i scrie o func]ie pentru a comuta SNAP pe on sau
off `n func]ie de setarea curent\.

Etape de lucru
1. ~ntr-un fi[ier nou, folosi]i editorul de text pentru a
crea o func]ie numit\ c:snaptog.
2. Introduce]i codul de mai jos.
3. Func]ia ar trebui s\ comute modul SNAP `n func]ie
de valoarea curent\.
(defun c:snaptog (/ snapval)

(setq snapval (getvar "SNAPMODE")) ;get current SNAPMODE

(if
(= 1 snapval) ;if it's on...
(setvar "SNAPMODE" 0) ;turn it off...
(setvar "SNAPMODE" 1) ;otherwise, turn it on
)

(prin1) ;quiet exit

4. Salva]i func]ia `ntr-un fi[ier numit snaptog.lsp din


directorul student.
5. ~nc\rca]i fi[ierul `n AutoCAD.
6. Desena]i c`teva entit\]i tip Line [i Circle.
7. Folosi]i SNAPTOG pentru a comuta SNAP pe on sau off
c`nd desena]i entit\]ile.

NOT| • ~ncerca]i s\ apela]i SNAPTOG `n cadrul unei


comenzi LINE sau CIRCLE.

50793936.doc R.2.1 2/3/2011 •133


AUTODESK, INC.

Expresii multiple `n cadrul func]iei if.


Func]ia if permite execu]ia unei singure expresii dup\ ce a
fost evaluat\ expresia test.

Pute]i face ca expresii multiple s\ apar\ ca o singur\


expresie la func]ia if prin amplasarea acestora `n cadrul
expresiei progn .

Func]ia progn evalueaz\ pe fiecare dintre argumentele sale,


pe r`nd [i returneaz\ valoarea ultimului argument. Expresii
multiple aflate `n cadrul func]iei progn apar sub forma unei
simple expresii la o func]ie de apelare.

~n acest exemplu, dac\ variabila x este egala cu 1, atunci


valorile vor fi atribuite ambelor variabile y [i z. Asignarea
este realizat\ de dou\ s-expresii.

Exemplu
Command: (setq x 1)
1

Command: (if (= x 1) (progn (setq y 2) (setq z 3)) (setq y 0))


3

Command: !y
2

Command: !z
3

•134
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 19: EXPRESII MULTIPLE IN CADRUL FUNCTIEI IF

~n acest exerci]iu:
• Ve]i modifica func]ia existent\ de la exerci]iul 18.
• Ve]i folosi func]ia progn .
• Ve]i executa s-expresii multiple prin apelarea unei
func]ii if.

Etape de lucru
1. ~n editorul de text, deschide]i fi[ierul snaptog.lsp din
directorul student.
2. Redenumi]i func]ia c:modetog.
3. Cu ajutorul func]iei progn , ad\uga]i codul care comut\
SNAPMODE [i GRIDMODE pe baza valorii curente a lui
SNAPMODE.
4. Salva]i fi[ierul pe disc ca modetog.lsp.
5. ~nc\rca]i programul modificat `n AutoCAD.
6. Testa]i comanda MODETOG .

50793936.doc R.2.1 2/3/2011 •135


AUTODESK, INC.

Func]ia cond
Func]ia cond cere un argument obligatoriu [i un num\r
oarecare de argumente op]ionale.

Fiecare argument al func]iei cond poate fi un set de expresii


incluse `ntr-o list\ extern\.

Func]ia cond evalueaz\ prima expresie `n fiecare din listele


de argumente, pe r`nd, p`n\ ce o expresie evalueaz\
"adev\rat". Atunci func]ia cond evalueaz\ expresiile care
urmeaz\ primei expresii din cadrul argumentului [i
returneaz\.

Func]ia cond este de preferat func]iei if ori de c`te ori exist\


mai mult de dou\ cazuri de testat, adic\ mai mult de dou\
ramific\ri `n orice punct din program.

Exemplu
Aceast\ defini]ie a func]iei va introduce valori diferite `n
zona liniei de comand\, `n func]ie de valoarea numeric\ a
variabilei x.

Fi]i aten]i `n mod special la modul `n care pot fi construite


argumentele la func]ia cond . Prima expresie dintr-un
argument este expresia test [i expresiile care urmeaz\ dup\
test vor fi evaluate dac\ argumentul test este adev\rat.

Func]ia cond opre[te testarea argumentelor de `ndat\ ce


g\se[te un argument a c\rui expresie test este adevarat\,
adic\ nu este nil.
(defun testx (x)
(cond
(
(= x 0)
(prompt "\nX equals 0.")
)
(
(< x 0)
(prompt "\nX is less than 0.")
)
(
(> x 0)
(prompt "\nX is greater than 0.")
)
)
(prin1)
)

Recapitulare
Func]ia if testeaz\ o expresie [i se ramific\ spre oricare
dintre cele dou\ s-expresii.

•136
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ia progn este folosit\ pentru a executa s-expresii


multiple `n cadrul func]iei if.

50793936.doc R.2.1 2/3/2011 •137


AUTODESK, INC.

Func]ia cond poate testa mai multe expresii [i poate


executa orice num\r de s-expresii `ntr-o ramifica]ie dat\.

•138
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 20: UTILIZAREA FUNCTIEI COND PENTRU RAMIFICAREA PROGRAMULUI

~n acest exerci]iu:
• Ve]i folosi func]ia cond `n cadrul unei func]ii noi.
• Ve]i testa o variabil\ pentru egalitate numeric\.
• Ve]i executa toate trei ramifica]iile expresiei cond.

Etape de lucru
1. Crea]i o nou\ func]ie `ntr-un nou fi[ier cu ajutorul
editorului de text.
2. Numi]i aceast\ func]ie testx.
3. Func]ia cere un argument obligatoriu.
4. ~ntr-o instruc]iune cond, folosi]i testele de egalitate
pentru a vedea dac\ valoarea argumentului este
egal\, mai mic\ sau mai mare dec`t 0.
5. Dac\ este satisfacut un test de egalitate, folosi]i func]ia
prompt pentru a semnaliza utilizatorul.

(prompt "\nX equals 0.")

6. Salva]i fi[ierul ca testx.lsp `n directorul student.


7. ~nc\rca]i fi[ierul `n AutoCAD.
8. Folosi]i func]ia testx cu valorile argumentelor 0, 1 [i -1.

50793936.doc R.2.1 2/3/2011 •139


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•140
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Bucle de program
Buclele de program reprezint\ un concept important pentru
orice limbaj de programare. Buclele permit instruc]iunilor
programului s\ fie executate de nenum\rate ori pe baza
valorii unei espresii test.

Obiective
~n acest capitol ve]i studia:
• Cum s\ folosi]i buclele pentru a repeta un set de
expresii.
• Sintaxa func]iilor repeat [i while.

Explicarea modului de func]ionare a buclelor


O bucl\ se explic\ astfel:

" Testa]i o expresie. Dac\ expresia este adev\rat\, atunci


executa]i un set de instruc]iuni ale programului, pe r`nd,
apoi testa]i expresia din nou. Dac\ este tot adev\rat\,
executa]i toate instruc]iunile programului apoi testa]i din
nou expresia la infini.

A[a lucreaz\ func]ia while. Func]ia repeat execut\ un set de


expresii de un num\r de ori prestabilit.

Ca exemplu s\ presupunem c\ avem un set de expresii pe


care vrem s\-l execut\m de 5 ori. Este mai `n]elept s\ scrie]i
setul de expresii o singur\ dat\ `n program [i s\ folosi]i unele
func]ii care s\ cear\ AutoLISP-ului s\ repete expresiile de 5
ori dec`t s\ scrie]i setul de expresii de 5 ori.

Ca exemplu (si nu unul str\lucit) vom construi o func]ie


simpl\ de num\rare folosind func]ia repeat. Func]ia va ad\uga
num\rul `ntreg 1 la valoarea unei variabile ori de c`te ori
func]ia este apelat\ [i apoi va tip\ri valoarea variabilei `n
zona liniei de comand\.

50793936.doc R.2.1 2/3/2011 •141


AUTODESK, INC.

Func]ia repeat
Func]ia repeat cere dou\ argumente [i un num\r oarecare de
argumente op]ionale.

Primul argument trebuie s\ fie un num\r `ntreg (sau evaluat


`ntr-un num\r `ntreg). Acesta spune func]iei repeat de c`te
ori s\ execute al doilea argument p`n\ la al n -lea
argument.

Exemplu
Command: (repeat 3 (prompt "\nHello"))
Hello
Hello
Hellonil
nil de la sf`r[it este valoarea returnat\ de func]ia repeat.

Exemplu
Introduce]i expresiile care urmeaz\.

Expresiile definesc func]ia count.

~n func]ia count, dup\ ce variabila num este legat\ de 0,


valoarea lui num este vizualizat\ pe monitor [i incrementat\
cu 1 p`n\ la un total de 10 ori.
Command: (defun count ()
1> (setq num 0)
1> (repeat 10 (print num) (setq num (1+ num)))
1> (prin1))
COUNT
Folosi]i func]ia count. Aceasta va introduce numerele de la 0
la 9 `n zona liniei de comand\.
Command: (count)
0
1
2
3
4
5
6
7
8
9

•142
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

O versiune ceva mai interesant\ a func]iei count va {TERGE


ultimele trei entita]i desenate [i care s`nt vizibile pe
monitor.

Exemplu
~ntr-un desen nou, desena]i cel pu]in trei (3) entit\]i de
orice fel.

Introduce]i expresiile care urmeaz\.

Command: (defun count () (repeat 3 (command "erase" "l" "")))


COUNT
Folosi]i func]ia count pentru a [terge ultimele entit\]i din
desen.
Command: (count)

Mai multe despre intr\rile utilizatorului


Func]ia initget poate reface valorile permise pentru intrarea
utilizatorului `n timpul oric\rei apel\ri a func]iilor de tip
GETXXX , de exemplu func]iile getpoint [i getdist.

Apela]i initget care are un num\r `ntreg ca argument [i/sau o


list\ de cuvinte cheie acceptabile, imediat dup\ apelarea
unei func]ii GETXXX.

Acest exemplu admite numai numere `ntregi cu excep]ia


lui 0, ca r\spuns la getint.
(initget (+ 1 2 4))
(setq response (getint "\nEnter an integer: "))

Func]ia getkword reface un cuv`nt cheie de la utilizator bazat


pe un [ir de cuvinte cheie stabilite de func]ia initget.

Acest exemplu permite utilizatorului s\ raspund\ cu YES sau


NO la cererea de comand\. Un r\spuns nul sau un return nu
s`nt admise.
(initget 1 "Yes No")
(getkword "\nContinue? Yes/No: ")

50793936.doc R.2.1 2/3/2011 •143


AUTODESK, INC.

EXERCITIUL 21: BUCLARE IN PROGRAM

~n acest exerci]iu:
• Ve]i consolida cuno[tin]ele despre bucle de
program.
• Ve]i consolida cuno[tin]ele despre func]ia cond.
• Ve]i folosi func]ia repeat pentru a executa un set de
s-expresii de un num\r stabilit de ori.
• Ve]i scrie o func]ie care cere utilizatorului num\rul
de bucl\ri de program.
• Ve]i folosi instruc]iunea cond `n cadrul buclei.

Etape de lucru
1. ~ncepe]i un desen nou `n AutoCAD.
2. Desena]i un Cerc cu centrul `n punctul 5,5 [I o raz\ de o
unitate.
3. ~n editorul text, deschide]i fi[ierul numit displace.lsp
din directorul student.
4. Crea]i func]ia c:displace. Folosi]i codul `n displace.lsp ca
baz\ pentru func]ie.
5. DISPLACE ar trebui s\ execute urm\toarele:
• S\ cear\ utilizatorului o incrementare a deplas\rii.
• S\ cear\ utilizatorului de c`te ori s\ execute
deplasarea.
• S\ cear\ utilizatorului direc]ia de deplasare.
• S\ repete codul care restabile[te ultima entitate
desenat\ [i care este vizualizat\ pe monitor [i s\ o
deplaseze cu un increment adecvat de un num\r
de ori.

continuare pe pagina urmatoare

•144
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

;No null, zero or negative response allowed


(initget (+ 1 2 4))
(setq increment (getdist "\nIncrement for movement: "))

;No null, zero or negative response allowed


(initget (+ 1 2 4))
(setq number_of_times (getint "\nNumber of times to displace: "))

;No null response allowed, setup keywords for response


(initget 1 "Up Down Right Left")
(setq direction (getkword "\nUp/Down/Left/Right: "))
(repeat number of times (command “MOVE” (entlast)”” (list 0.0 0.0 0.0)

(cond ;match direction of movement...


((= direction "Up") ;based on keyword supplied by user
(command (list 0.0 increment))
)
((= direction "Down")
(command (list 0.0 (- 0.0 increment)))
)
((= direction "Right")
(command (list increment 0.0))
)
((= direction "Left")
(command (list (- 0.0 increment) 0.0))
)
)

(command "") ;second point of displacement...


;for MOVE command prompt

6. Salva]i fi[ierul text.


7. ~nc\rcati fi[ierul `n AutoCAD.
8. Activa]i comanda DISPLACE.

50793936.doc R.2.1 2/3/2011 •145


AUTODESK, INC.

Func]ia while
Func]ia repeat este cea mai simpl\ func]ie de buclare util\
dac\ [ti]i exact de c`te ori trebuie s\ repeta]i evaluarea
grupului de expresii anterioare intr\rii buclei.

Totu[i ve]i `nt`lni ocazii c`nd ve]i dori s\ repeta]i ceva de un


num\r nedefinit de ori; adic\ num\rul de repeti]ii nu poate fi
determinat `naintea intr\rii `n bucl\.

~ntr-un astfel de caz, func]ia while v\ d\ posibilitatea s\


repeta]i un set de expresii de c`te ori este necesar p`n\ ce
valoarea unei expresii test se schimb\.

Exemplu
(setq x 0) ;set initial value for test

(while
(< x 10) ;while x is less than 10...
(print x) ;print value of x...
(setq x (+ 1 x)) ;add 1 to x and then...
) ;go back to test expression

(setq x 10) initialize x

(while x is less than 10?


(< x 10)

NO YES

(print x) print the value of x

(setq x (+ 1 x)) add 1 to x

) go back to test

Figuae 3. Diagrama buclei functiei while

•146
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Pentru a ie[i dintr-o bucl\ while, valoarea expresiei test


trebuie s\ fie egal\ cu nil. De aceea, dac\ expresia test este
ini]ial t, valoarea expresiei test trebuie s\ se schimbe ca
rezultat al unei atribuiri din cadrul corpului buclei.

Recapitulare
• Buclele repet\ un set de expresii.
• Buclele pot repeta de un num\r de ori prestabilit
sau p`n\ ce valoarea expresiei test este nil.
• Func]ia repeat repet\ un set de expresii de un
num\r de ori stabilit.
• Func]ia while repet\ un set de s-expresii p`n\ ce
expresia test este egal\ cu nil.

50793936.doc R.2.1 2/3/2011 •147


AUTODESK, INC.

EXERCITIUL 21: UTILIZAREA FUNCTIEI WHILE PENTRU BUCLARE IN PROGAM

~n acest exerci]iu:
• Ve]i consolida cuno[tin]ele despre buclele de
program din AutoLISP.
• Ve]i modifica o func]ie existent\ de la exerci]iul
anterior.
• Ve]i crea un program care deseneaz\ dreptunghiuri
multiple.
• Ve]i folosi func]ia while.

Etape de lucru
1. ~n editorul de text, `nc\rca]i fi[ierul rectangle.lsp.

2. Salva]i fi[ierul ca mrectang.lsp `n directorul student.

3. Face]i modific\ri `n fi[ier.

4. Modifica]i func]ia c:rectangle pentru a cere utilizatorului s\


deseneze dreptunghiuri multiple `n timpul unei
singure secven]e de func]ionare.

5. Plasa]i corpul codului care cere col]urile [i deseneaz\


polilinia `n cadrul unei func]ii while.

6. Un r\spuns nul, adic\ un return la cererea "first corner"


va termina func]ia.

7. Numi]i noua func]ie c:mrectangle pentru "dreptunghiuri


multiple".

8. Salva]i fi[ierul.

9. ~nc\rca]i fi[ierul `n AutoCAD.


10.Activa]i comanda MRECTANGLE.

•148
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

{iruri [i tip\rirea lor


~n AutoLISP, orice serie de caractere alfanumerice aflate
`ntre ghilimele duble reprezint\ un [ir text. {irul poate
include caractere speciale cum ar fi *, &, , % [i .

Obiective
~n acest capitol ve]i studia:
• Despre [irurile text [i valorile lor
• Cum s\ folosi]i caracterele de control `n [irurile text.
• Cum s\ lua]i [iruri text de la utilizator.
• Cum s\ folosi]i comanda AutoCAD TEXT cu variabile
AutoLISP-ul legate la [iruri text.
• Diferen]ele dintre cele [ase func]ii de tip\rire `n
AutoLISP.
• Cum s\ folosi]i func]iile de tip\rire.

Valorile [irurilor text


{irurile text se evalueaz\ pe sine, adic\ valoarea unui [ir
text este [irul `n sine.
Command: !"This is a string"
"This is a string."
Command: (setq x "This is a string.")
"This is a string."

Command: !x
"This is a string."

Caractere de control
Caracterul "\" precede un caracter de control `n cadrul
unui [ir text. Caracterul care urmeaz\ imediat are o
semnifica]ie special\.

~n urm\torul tabel g\si]i caracterele de control cunoscute


de asemenea [i ca "escape codes" care s`nt recunoscute
`n cadrul [irurilor AutoLISP.

50793936.doc R.2.1 2/3/2011 •149


AUTODESK, INC.

Cod Semnificatie

\\ \ caracter

\" " caracter

\e caracter escape

\n caracter newline

\r caracter return

\t caracter tab

\nnn Caracter al carui cod octal este nnn

Tabelul 2. Caractere de control `n [iruri

Func]ia getstring
Func]ia getstring a[teapt\ ca utilizatorul s\ introduc\ un [ir
text. Are dou\ argumente op]ionale: suprim\ caracterul
spa]iu ca [i return [i un [ir de la utilizator.

Dac\ primul argument op]ional este furnizat [i acesta nu


este nil, atunci este posibil ca [irul s\ con]in\ spa]ii; primul
spa]iu din [ir este tratat ca "return".

Exemplu
Introduce]i expresiile care urmeaz\.

Lega]i variabila txt de [irul text "single".


Command: (setq txt (getstring "\nEnter text: "))
Enter text: single
"single"

Command: !txt
"single"
Lega]i variabila txt de [irul text `n care s-au introdus spa]ii.
Command: (setq txt (getstring T "\nEnter text: "))
Enter text: embedded spaces
"embedded spaces"

Command: !txt
"embedded spaces"

•150
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Variabila de sistem TEXTEVAL


Dac\ variabila de sistem TEXTEVAL este mai mare dec`t 0,
pute]i r\spunde la o cerere de comand\ TEXT sau DTEXT cu o
variabil\ AutoLISP [i comanda va tip\ri valoarea asignat\
variabilei; dac\ nu, comanda va tip\ri semnul exclamarii [i
numele variabilei.

Comanda TEXT va tip\ri `ntotdeauna valoarea unei variabile


[ir atunci c`nd este apelat\ `n cadrul unei func]ii AutoLISP
de tip command indiferent de setarea TEXTVAL.

Comanda DTEXT nu poate fi apelat\ de func]ia AutoLISP de


tip command.

50793936.doc R.2.1 2/3/2011 •151


AUTODESK, INC.

Exemplu
~ntr-un desen nou introduce]i expresiile care urmeaz\.

Prima comand\ TEXT va tip\ri !txt1. A dou\ comand\ TEXT va


tip\ri Second line. Vezi figura 18-1.
Command: (setq txt1 "First line.")
"First line."

Command: (setq txt2 "Second line.")


"Second line."

Command: text
Justify/Style/<Start point>: 1,5
Height: 0.5
Rotation: 0
Text: !txt1

Command: (setvar "texteval" 1)


1

Command: text
Justify/Style/<Start point>: Enter
Text: !txt2

Figura 41. entitati tip text

•152
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]iile de tip\rire
Exist\ [ase func]ii de tip\rire `n AutoLISP. Cinci dintre ele
tip\resc [iruri text iar una tip\re[te caractere text. Trei
dintre aceste func]ii tip\resc orice fel de expresii indiferent
dac\ acestea s`nt de tipul [ir text. Func]ia pentru caractere
[i patru dintre func]iile de tip [ir pot tip\ri nu numai `ntr-un
fi[ier dar [i pe un monitor.
Functia Argumente Descriere

prin1 [expr [file-desc]] Tipareste expr si returneaza expr. Expandeaza


caracterele de control.

princ [expr [file-desc]] Tipareste expr si returneaza expr. Nu expandeaza


caracterele de control

print [expr [file-desc]] La fel ca prin1, si in plus tipareste un newline


inainte de expr si un spatiu dupa expr.

prompt [msg] Tipareste msg pe display si returneaza nil.

write-char num [file-desc] Tipareste un caracter ASCII conform cu argumentul


num pentru codul zecimal ASCII si returneaza
num\rul.

write-line string [file-desc] Tipareste string f\r\ quotes si returneaz\ string cu


quotes. Asemanator cu princ.

Table 3. Functii de tiparire

Intrarea [i ie[irea `n/[i dintr-un fi[ier incluz`nd [i tip\rirea


`ntr-un fi[ier vor fi discutate mai t`rziu `n acest curs.

Func]ia prompt este folosit\ pentru tip\rirea mesajelor


destinate utilizatorului, pe afi[aj.

Func]ia print tip\re[te expresii `ntr-o manier\ compatibil\ cu


func]ia load, `n timp ce func]ia princ le tip\re[te `ntr-o
manier\ compatibil\ cu func]ia read-line. Ve]i studia func]ia
read-line `n capitolul destinat intr\rii [i ie[irii `ntr-un fi[ier
mai t`rziu `n acest curs.

Func]iile prin1, princ [i print accept\ orice expresie ca


argument [i `i va tip\ri valoarea.

Func]iile prompt [i write-line accept\ numai argumente de tip


[ir.

50793936.doc R.2.1 2/3/2011 •153


AUTODESK, INC.

Recapitulare
• {irurile text s`nt caractere alfanumerice aflate
`ntre ghilimele duble.
• Caracterele de control din cadrul unui [ir de tip
text `ncep cu un caracter "a".
• Func]ia getstring primeste [iruri interactiv de la
utilizator.
• Variabila de sistem TEXTEVAL demonstreaz\ cum
comanda AutoCAD TEXT va tip\ri o variabil\
AutoLISP.
• AutoLISP-ul dispune de o varietate de func]ii de
tip\rire pentru diferite `ntrebuin]\ri.

•154
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 22: SIRURI DE TEXT SI FUNCTII DE TIPARIRE

~n acest exerci]iu:
• Ve]i consolida cuno[tin]ele despre [iruri de tip text
[i func]ii de tip\rire.
• Ve]i ob]ine dou\ [iruri text interactiv de la
utilizator.
• Ve]i folosi [irurile de tip text cu patru dintre
func]iile de tip\rire.

Etape de lucru
1. Intoduce]i expresiile care urmeaz\.
2. Lega]i cinci variabile de la a la d de diferite tipuri de
date: num\r `ntreg, list\, [ir [i [ir care con]ine
caractere de control.
Command: (setq a 1)

Command:(setq b '(1.0 1.0 0.0))

Command: (setq c (getstring "\nString: "))


String: xyz
"xyz"

Command: (setq d (getstring "\nFile name: "))


File name: \student\x.dwg
"\\student\\x.dwg"
3. Folosi]i variabilele ca argumente la diferite func]ii de
tip\rire.
4. Scrie]i valorile `n casu]ele corespunzatoare din tabelul
care urmeaz\.

Variabila prin1 princ print prompt

Tabelul 25. Variabile si functii de tiparire

50793936.doc R.2.1 2/3/2011 •155


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ in mod inten]ionat.

•156
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la entit\]i
Fiec\rei entit\]i dintr-o sesiune de editare `i este atribuit
un nume de entitate de c\tre AutoCAD. Numele unei
entit\]i este un identificator unic al fiec\rei entit\]i
dintr-un desen. Numele unei entit\]i se poate
schimba de la o sesiune de editare la alta, dar
fiecare nume de entitate este unic determinat\ `n
timpul unei sesiuni de editare.

Obiective

~n acest capitol ve]i studia:

• Cum s\ folosi]i numele de entit\]i pentru a stabili [i


modifica entit\]ile individuale.
• Cum s\ afla]i numele ultimei entit\]i ad\ugate la desen.
• Cum s\ afla]i numele primei entit\]i ad\ugate la desen.
• Cum se pot trece `n revist\ numele entit\]ilor din desen.
• Cum s\ crea]i noi comenzi AutoCAD care ac]ioneaz\ asupra
numelor de entit\]i.

Func]ii de acces la entit\]i


Numele de entit\]i pot fi stabilite de AutoLISP [i entit\]ile
la care se refer\ pot fi modificate de AutoLISP.

~n acest capitol ve]i folosi func]iile de acces la entit\]i


din AutoLISP pentru a lucra cu entit\]i [i grupuri de
entit\]i.
• Afla]i o entitate sau un grup de entit\]i.
• Activa]i o entitate cu o comand\ AutoCAD.
• Examina]i propriet\]ile unei entit\]i.
• Modifica]i propriet\]ile unei entit\]i.

Functii de acces la Descriere


entitati

entlast returneaza numele ultimei entita]i adaugata


in baza de date

entsel returneaza lista formata din numele entita]ii


si punctul in care a fost selectata entitatea

entnext returneaza prima entitate din baza de date

entnext ename returneaza numele entita]ii in baza de date


dupa argumentul ename

Tabelul 26.Functii de acces a entitatilor

50793936.doc R.2.1 2/3/2011 •157


AUTODESK, INC.

Cum se afl\ numele ultimei entit\]i


Introduce]i comenzile [i expresiile care urmeaz\.

~ntr-un desen nou crea]i o entitate Line.


Command: line
From point: 1,1
To point: 5,5
To point: Enter
Folosi]i func]ia entlast pentru a stabili numele ultimei entit\]i
ad\ugate la desen, adic\ entitatea Line. (Num\rul din numele
entit\]ii poate fi diferit pe computerul dumneavoastra).
Command: (entlast)
<Entity name: 60000022>
Func]ia entlast stabile[te numele ultimei entit\]i principale
ne[tears\ din desen.

Lega]i variabla numit\ ename de valoarea returnat\ de func]ia


entlast. Verifica]i legarea lui ename .
Command: (setq ename (entlast))
<Entity name: 60000022>

Command: !ename
<Entity name: 60000022>

Folosirea numelui unei entit\]i intr-o comand\ AutoCAD


Numele entit\]ilor pot fi folosite ca argumente la func]ia de
tip command ori de c`te ori o comand\ AutoCAD cere un set
de selec]ie.

~n acest exemplu, numele entit\]ii Line este furnizat ca


argument la comanda AutoCAD ERASE .Aceasta expresie va
[terge entitatea Line.
Command: (command "erase" ename "")

Exemplu
Introduce]i expresiile [i comenzile care urmeaz\. Expresia
AutoLISP va [terge entitatea Line. Comanda U o va restabili.
Command: (command "erase" ename "")
nil

•158
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: U
GROUP

Aflarea numelui primei entit\]i


Exemplu
Citi]i instruc]iunile [i tip\ri]i expresiile cu caractere aldine.

~n acela]i desen, cu ajutorul entit\]ii Line, crea]i o entitate


Circle.
Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<Radius>: 1

5,5

1,1
Figura 42.Entitati tip linie si cerc

Folosi]i func]ia entlast pentru a stabili numele ultimei entit\]i


ad\ugat\ la desen, entitatea Circle. (Num\rul din numele
entita]ii poate fi diferit pe computerul dvs.).
Command: (entlast)
<Entity name: 60000028>
Func]ia entlast stabile[te ultima entitate principal\ ne[tears\
din desen; `n acest caz entitatea Circle.

Folosi]i func]ia entnext pentru a extrage numele primei


entit\]i din baza de date, adic\, entitatea Line.

50793936.doc R.2.1 2/3/2011 •159


AUTODESK, INC.

Lega]i o variabil\ numit\ entname de valoarea returnat\ de


entnext. Verifica]i legarea lui ename .

Command: (setq ename (entnext))


<Entity name: 60000022>
Command: !ename
<Entity name: 60000022>

Exemplu
Introduce]i expresiile care urmeaz\.
Afla]i numele primei entit\]i din desen, entitatea Linie.
Sterge]i-o. Restabili]i-o cu comanda U.
Command: (setq ename (entnext))
<Entity name: 60000022>

Command: (command "erase" ename "")


nil

Command: U
ERASE
Afla]i numele ultimei entit\]i din desen: entitatea Circle.
Deplasa]i-o cu o unitate `n directia X pozitiv\ din pozi]ia
ini]ial\.
Command: (setq ename (entlast))
<Entity name: 60000028>

Command: (command "move" ename "" "1,0" "")


nil

•160
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

5,5

1,1
Figura 43. Situatia dupa miscarea cercului cu o unitate in directia X pozitiva

Aduce]i cercul `n pozi]ia ini]ial\.


Command: U
MOVE

Baleierea bazei de date entitate cu entitate


Func]ia entlast stabile[te numele ultimei entit\]i din baza de
date. Func]ia entnext stabile[te numele primei entit\]i din
baza de date.

Func]ia entnext are un argument op]ional: numele unei


entit\]i. ~n acest caz func]ia entnext returneaz\ numele
entit\]ii care urmeaz\ dup\ argument `n baza de date.

Dac\ nu exist\ nici o entitate care se urmeze dup\ cea din


numele argumentului entita]ii, entnext returneaz\ nil.

De exemplu acest set de expresii vor returna numele celei


de a doua entit\]i din baza de date.

Command: (entnext (entnext))


<Entity name: 60000028>

sau

Command: (setq ename1 (entnext))


<Entity name: 60000022>
Command: (setq ename2 (entnext ename1))
<Entity name: 60000028>

50793936.doc R.2.1 2/3/2011 •161


AUTODESK, INC.

Expresia care urmeaz\ ar [terge atunci a doua entitate din


baza de date.
Command: (command "erase" ename2 "")
Ar fi bine s\ se poat\ stabili numele tuturor entit\]ilor din
baza de date, pe r`nd, pentru a le procesa una c`te una.
Func]ia entnext poate face acest lucru c`nd este plasat\
`ntr-o bucl\ while `mpreun\ cu instruc]iunile de procesare
pentru entit\]i.

Recapitulare
• Fiecare entitate dintr-un desen are un nume unic
de entitate.
• Numele entit\]ilor nu se schimb\ niciodat\ `n timpul
unei sesiuni de editare grafic\, dar se pot
schimba pe parcursul sesiunilor de editare
grafic\.
• AutoLISP dispune de func]ii care returneaz\
numele entit\]ii.
• Func]ia entlast returneaz\ numele ultimei entit\]i
ad\ugat\ la desen.
• Func]ia entnext returneaz\ numele primei entit\]i
ad\ugat\ la desen sau numele entit\]ii care
urmeaz\ dup\ argumentul op]ional.
• Pute]i folosi entnext [i o bucl\ while pentru a accesa
fiecare entitate din desen.
• Numele entit\]ilor pot fi folosite cu comenzi
AutoCAD.

•162
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 23: ACCESAREA NUMELOR DE ENTITATI

~n acest exerci]iu:
• Ve]i aprofunda cuno[tin]ele despre accesarea
numelor de entit\]i.
• Ve]i crea o comanda MOVEALL care afl\ numele
fiec\rei entit\]i din baza de date, pe r`nd, [i
deplaseaz\ fiecare entitate cu o unitate `n X
pozitiv.
• Ve]i folosi func]iile entnext [i while.
• Ve]i folosi numele entit\]ilor [i comanda AutoCAD
MOVE.

Etape de lucru
1. Folosi]i editorul de texte pentru a salva urm\torul cod `n
fi[ierul numit moveall.lsp.

(defun c:moveall ()
(setq ename (entnext)) ;get first entity
(while
ename ;we have an entity?
(command "._MOVE" ename "" "1,0" "") ;move it
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)

2. Desena]i c`teva entit\]i `n desenul dvs.


3. ~nc\rca]i fi[ierul moveall.lsp.
4. Activa]i comanda MOVEALL.
5. Urm\ri]i deplasarea entit\]ilor, c`te una pe r`nd.

Command: (load "moveall")


C:MOVEALL

Command: moveall

50793936.doc R.2.1 2/3/2011 •163


AUTODESK, INC.

EXERCITIUL 24: SCALAREA TUTUROR ENTITATILOR ACCESATE PRIN NUME

~n acest exerci]iu:
• Ve]i aprofunda cuno[tin]ele despre accesarea
numelor de entit\]i.
• Ve]i modifica func]ia de la exerci]iul 24.
• Ve]i folosi func]iile entnext [i while.
• Ve]i crea o comand\ care scaleaz\ fiecare entitate
din desen.
• Ve]i tip\ri num\rul de entita]i scalate folosind un
contor `n cadrul unei bucle.
Aceste expresii vor tip\ri [irul “Scaling entity 1.” `n zona
liniei de comand\.

(setq counter 1)

(prompt (strcat "\nScaling entity " (itoa counter) "."))

Etape de lucru
1. Deschide]i fi[ierul text moveall.lsp.

2. Salva]i textul `ntr-un nou fi[ier numit scaleall.lsp.

3. Folosi]i codul din func]ia c:moveall.lsp.

4. Modifica]i c:moveall.

• Numi]i noua func]ie c:scaleall.

• Scala]i fiecare entitate cu un factor (0.5) relativ fa]\


de punctul origine 0,0.

• Ad\uga]i codul care tip\re[te `n zona liniei de


comand\ num\rul de entit\]i modificate.
Command: scaleall
Scaling entity 1.
Scaling entity 2.
Scaling entity 3.

5. ~nc\rca]i fi[ierul scaleall.lsp.

6. Activa]i comanda SCALEALL.

•164
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Liste asociate entit\]ilor


Pute]i folosi numele unei entit\]i pentru a extrage toate
elementele unei entit\]i. ~n AutoLISP un astfel de document
este reprezentat print-o list\ asociat\. Listele asociate
cuprind subliste ale listelor obi[nuite sau perechi cu
punct.

Obiective
~n acest capitol ve]i studia:
• Formatul unei perechi cu punct sau cum s\ crea]i
o astfel de pereche.
• Formatul unei liste asociate.
• Cum s\ extrage]i o list\ asociat\ unei entit\]i.
• Cum s\ examina]i o lista asociat\.
• Cum s\ determina]i tipul entit\]ii din lista asociat\.

Perechi cu punct
O pereche cu punct este o form\ special\ a unei liste. O
pereche cu punct este o list\ format\ din dou\ elemente a
c\rei parte cdr din arborele binar se termin\ cu ultimul
element al listei [i nu cu nil.
At`t listele obi[nuite c`t [i perechile cu punct s`nt folosite `n
listele asociate entit\]ilor pentru a reprezenta grupul de
coduri DXF [i valorile asociate acestora.
Perechile cu punct con]in `ntotdeauna dou\ elemente.
Primul element al unei perechi cu punct poate fi stabilit la
fel ca [i primul element al unei liste obi[nuite: cu func]ia car.
Al doilea element al perechii cu punct poate fi stabilit direct
cu func]ia cdr [i acest lucru difer\ de modul `n care se
stabile[te al doilea element dintr-o list\ obi[nuit\.

Exemplu
Perechea cu punct care con]ine cele dou\ elemente 0 [i
"Line" arat\ astfel.
(0 . "LINE")

Ilustra]ia care urmeaz\ prezint\ arborii binari pentru dou\


obiecte similare: o list\ [i o pereche cu punct, ambele
con]in`nd acelea[i elemente.

50793936.doc R.2.1 2/3/2011 •165


AUTODESK, INC.

(0 "LINE") (0 . "LINE")

car cdr car cdr

0 ("LINE") 0 "LINE"

car cdr

"LINE" ()
Figura 44. Arbori binari pentru lista obisnuita si pereche cu punct avind elemente
identice.

Func]ia cons
Func]ia cons cere dou\ argumente obligatorii: o valoare care
se adaug\ [i o valoare la care se adaug\.

Dac\ valoarea care se adaug\ este un atom, atunci func]ia


cons returneaz\ o pereche cu punct a celor dou\ elemente.

Dac\ valoarea la care se adaug\ este o lista, atunci func]ia


cons returneaz\ lista cu primul argument ad\ugat `n capul
listei.

Exemplu
Introduce]i expresiile care urmeaz\.

Forma]i o list\ obi[nuit\ din elementele 0 [i "Line".


Command: (setq xlist (list 0 "LINE"))
(0 "LINE")
Forma]i o pereche cu punct din elementele 0 [i "Line".
Command: (setq xdot (cons 0 "LINE"))
(0 . "LINE")
Extrage]i primul element din list\ [i din perechea punct cu
car.
Command: (car xlist)
0

•166
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (car xdot)


0
Extrage]i cel de-al doilea element din lista normal\ cu car [i
cdr.
Command: (car (cdr xlist))
"LINE"
Extrage]i cel de-al doilea element din list\ [i din perechea
punct cu car.
Command: (cdr xdot)
"LINE"

Entit\]i `nregistrate `n baza de date [i liste asociate


Modul `n care AutoLISP-ul reprezint\ o entitate `nregistrat\
`n baza de date pentru o entitate desenat\ de tip Line de la
1,1 la 5,5 pe Layerul 0 este prezentat `n continuare.
(
(-1 . <Entity name: xxxxxxxx>)
(0 . "LINE")
(8 . "0")
(10 1.0 1.0 0.0)
(11 5.0 5.0 0.0)
(210 0.0 0.0 1.0)
)

Entitatea `nregistrat\ `n baza de date este p\strat\ sub


forma unei liste asociate.

O list\ asociat\ este o list\ de liste.

Primul element al fiec\rei subliste este tipul acelei liste.


Celelalte elemente reprezint\ datele asociate cu codul.

De exemplu, codul din prima sublist\ este num\rul `ntreg


-1. Data asociat\ este numele entit\]ii. Codul din a dou\
sublist\ este num\rul `ntreg 0. Data asociat\ este tipul
entit\]ii; `n acest caz, o entitate Line.

Semnifica]ia codurilor 8,10 [i 11 si datele lor s`nt u[or de


imaginat ce reprezint\.

Datele codului 210 s`nt reprezentate de sensul pozitiv al


axei Z din sistemul de coordonate care con]ine entitatea.

Memorarea si extragerea formatelor


Prin conven]ie, datele dintr-o list\ asociat\ entit\]ii pot fi
extrase prin scoaterea cdr-ului unei subliste. Pentru
aceasta, AutoLISP-ul folose[te perechi cu punct `n cazul
sublistelor cu dou\ elemente [i forme normale de liste `n
cazul sublistelor cu mai mult de dou\ elemente.

50793936.doc R.2.1 2/3/2011 •167


AUTODESK, INC.

De exemplu, aceste expresii returneaz\ Layerul entit\]ii


Line [i punctul de start.

Command: (cdr '(8 . "0"))


"0"
Command: (cdr '(10 1.0 1.0 0.0))
(1.0 1.0 0.0)

Coduri de Grup DXF


Codul fiec\rei subliste dintr-o list\ asociat\ unei entit\]i
corespunde unui cod de grup DXF. Documenta]ia despre
aceste coduri exist\ `n AutoCAD Release 12 AutoLISP
Programmer’s Reference Manual, Appendix B.

Exist\ mici diferen]e `ntre codurile de grup dintr-un fi[ier


DXF [i codurile de grup returnate `ntr-o list\ asociat\ unei
entit\]i. ~n anexa din AutoLISP Programmer’s Reference
Manual g\si]i lista corect\ a codurilor de grup pentru liste
asociate entit\]ilor.

Acestea s`nt codurile listelor asociate entit\]ilor (sau coduri


de grup DXF) pentru entitatea Line.

Cod de group Semnificatie

-1 Numele entitatii

0 Tipul (Line, Circle, Arc, etc.)

8 Layer

10 Punct de start

11 Punct final

210 Directia pozitiva a axei Z de


extruziune

Tabelul 27. Coduri de grup DXF si proprietatile entita]ilor

•168
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Extragerea unei entit\]i din baza de date cu func]ia entget


Func]ia entget cere un singur argument: numele unei
entit\]i. Func]ia va returna `nregistrarea entit\]ii sub forma
unei liste asociate.

Exemplu
~ncepe]i un desen nou [i desena]i o linie de la 1,1 la 5,5;
tip\ri]i expresiile care urmeaz\.
Command: (setq ename (entnext))
<Entity name: xxxxxxxx>
Command: (setq elist (entget ename))
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Command: !elist
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))

Extragerea datelor dintr-o list\ asociat\


Func]ia assoc cere dou\ argumente: valoarea unui cod [i o
list\ asociat\. Dac\ func]ia g\se[te o pereche pentru cod `n
lista asociat\, atunci returneaz\ sublista corespunzatoare;
dac\ nu, returneaz\ nil.

Presupune]i c\ variabila elist este legat\ de lista asociat\ `n


cazul entit\]ii Line.
Command: (setq elist (entget (entnext)))
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))

Command: !elist
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Aceast\ expresie va returna sublista care descrie layerul
entit\]ii.
Command: (assoc 8 elist)
(8 . "0")
~n aceast\ expresie, apel\m cdr care returneaz\ layerul
entit\]ii.
Command: (cdr (assoc 8 elist))
"0"

50793936.doc R.2.1 2/3/2011 •169


AUTODESK, INC.

Exemplu
Introduce]i expresiile care urmeaz\.

Asigura]i-v\ c\ variabila elist este legat\ de lista asociat\ `n


cazul entit\]ii Line.
Command: (setq ename (entnext))
<Entity name: xxxxxxxx>

Command: !ename
<Entity name: xxxxxxxx>

Command: (setq elist (entget ename))


( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))

Command: !elist
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Extrage]i tipul entit\]ii, Layerul [i punctul de start al
sublistei din lista asociat\.
Command: (assoc 0 elist)
(0 . "LINE")

Command: (assoc 8 elist)


(8 . "0")

Command: (assoc 10 elist)


(10 1.0 1.0 0.0)
Apela]i cdr pentru a extrage tipul entit\]ii, Layerul [i punctul
de start din subliste.
Command: (cdr (assoc 0 elist))
"LINE"

Command: (cdr (assoc 8 elist))


"0"

Command: (cdr (assoc 10 elist))


(1.0 1.0 0.0)

•170
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare
• Perechile cu punct au dou\ elemente [i s`nt
forme speciale de liste.
• Al doilea element al perechii cu punct este returnat
de cdr.
• Perechile cu punct s`nt folosite ca liste obi[nuite `n
listele asociate entit\]ilor.
• Entit\]ile `nregistrate `n baza de date s`nt
reprezentate `n AutoLISP sub forma de liste
asociate.
• O lista asociat\ este o list\ de liste.
• Fiecare sublist\ dintr-o list\ asociat\ are dou\ p\r]i:
car [i cdr.
• Partea car a unei liste asociate entit\]ii este un cod
de grup DXF care desemneaz\ o proprietate a
entit\]ii car este de asemenea denumit codul
sublistei.
• Partea cdr a unei liste asociate entit\]ii reprezint\
valoarea codului de grup DXF.
• Func]ia assoc returneaz\ o sublista prin c\utarea
unui cod.

50793936.doc R.2.1 2/3/2011 •171


AUTODESK, INC.

EXERCITIUL 25: UTILIZAREA LISTELOR ASOCIATE ENTITATLOR

~n acest exerci]iu :
• Ve]i consolida cuno[tin]ele despre listele asociate
entit\]ilor.
• Ve]i folosi func]ia entget.
• Ve]i modifica func]ia de la exerci]iul 25.
• Ve]i crea o func]ie care scaleaz\ numai entit\]ile de
tip Line din desen.

Etape de lucru
1. Deschide]i fi[ierul text scaleall.lsp.
2. Salva]i textul `ntr-un nou fi[ier scline.lsp.
3. Schimba]i numele func]iei din c:scaleall `n c:scline.
4. Modifica]i func]ia ca s\ scaleze numai entit\]ile de tip
Line din desen.
5. Salva]i fi[ierul.
6. Desena]i c`teva tipuri de entit\]i `n desen:.Lines,
Circles and Arcs.
7. Inc\rca]i fi[ierul scline.lsp [i activa]i comanda SCLINE.
Numai entit\]ile de tip Line vor fi scalate cu aceasta
comand\.

•172
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

C:SCALEALL
(defun c:scaleall ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(command "._SCALE" ename "" "0,0" "0.5");scale it
(prompt ;tell user which one
(strcat
"\nScaling entity "
(itoa counter)
".\n"
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)

C:SCLINE
(defun c:scline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(if ;if it's a Line...
(=
"LINE"
(cdr (assoc 0 (entget ename)))
)
(progn
(command "._SCALE" ename "" "0,0" "0.5");scale it and...
(prompt ;tell user which one
(strcat
"\nScaling entity "
(itoa counter)
".\n"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)

50793936.doc R.2.1 2/3/2011 •173


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•174
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Modificarea unei entit\]i


Modificarea unei entit\]i cu AutoLISP-ul are loc `n dou\
etape.
• Modifica]i lista asociat\ unei entit\]i cu func]ia subst.
• Actualiza]i entitatea prin aplicarea func]iei entmod
la noua list\ asociat\.

Obiective
~n acest capitol ve]i studia:
• Cum s\ modifica]i o list\ asociat\ unei entit\]i.
• Cum s\ actualiza]i `nregistrarea unei entit\]i `ntr-
un desen pe baza schimb\rilor din lista asociat\.

Substituirea valorilor intr-o list\ asociat\


Func]ia subst `nlocuie[te un element dintr-o list\. Func]ia
cere trei argumente: valoarea de substituire, valoarea de
substituit `ntr-o list\ [i o list\ care con]ine valoarea de
substituit.

Pute]i folosi func]ia subst pentru a `nlocui o valoare `ntr-o


list\ asociat\ unei entit\]i.

Iat\ un exemplu care ilustreaz\ modul cum func]ioneaz\


func]ia subst. Vom `nlocui num\rul 15 cu num\rul 16 `n lista
noastr\ de p\trate de numere `ntregi.

Command: (setq mylist (list 4 9 15))


(4 9 15)
Command: !mylist
(4 9 15)

Command: (subst 16 15 mylist)


(4 9 16)
Command: !mylist
(4 9 15)
Deoarece func]ia subst este non-destructiv\, ea nu va afecta
legarea variabilei mylist. ~n acest exemplu func]ia setq este
ad\ugat\ expresiei pentru a schimba legarea.

Command: (setq mylist (subst 16 15 mylist))


(4 9 16)
Command: !mylist
(4 9 16)

50793936.doc R.2.1 2/3/2011 •175


AUTODESK, INC.

Exemplu
Introduce]i comenzile [i expresiile care urmeaz\.

~ntr-un desen nou, desena]i o entitate Line de la 1,1 la 5,5.

Command: line
From point: 1,1
To point: 5,5
To point: Enter
Folosi]i func]ia subst pentru a schimba punctul de start al
listei asociate entit\]ii Line.

Extrage]i sublista pentru punctul de start [i p\stra]i-o sub


forma unei variabile.

Command: (setq ename (entnext))


<Entity name: xxxxxxxx>)

Command: (setq elist (entget ename))


( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))

Command: (setq old_start (assoc 10 elist))


(10 1.0 1.0 0.0)
~nlocui]i vechiul punct de start cu unul nou de 7.5,2.5,0 [i
schimba]i legarea variabilei elist.

Command: (setq new_start (list 10 7.5 2.5 0.0))


(10 7.5 2.5 0.0)

Command: (setq elist (subst new_start old_start elist))


( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 7.5 2.5 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))

Command: (assoc 10 elist)


(10 7.5 2.5 0.0)

•176
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Actualizarea unei entit\]i


Func]ia entmod modific\ propriet\]ile unei entit\]i cer`nd
AutoCAD-ului s\ actualizeze entitatea pe baza modific\rilor
f\cute `n lista asociat\ entit\]ii.

Func]ia entmod solicit\ un singur argument : o list\ valabil\


asociat\ entit\]ii.

Exemplu
Folosi]i func]ia entmod pentru a aplica modific\rile la
entitatea Line pe baza modific\rilor f\cute `n copia listei
asociate.

Introduce]i expresiile care urmeaz\.

Command: !elist
((-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 7.5 2.5 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))

Command: (entmod elist)


((-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 7.5 2.5 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Punctul de start al entit\]ii Line ar trebui s\ se deplaseze de
la 1.0, 1.0, 0.0 la 7.5, 2.5, 0.0.

5,5,0 5,5,0

1,1,0 7.5,2.5,0

Figura 45. Linie inainte si dupa apelarea functiei entmod.

Recapitulare
• O sublist\ dintr-o list\ asociat\ poate fi `nlocuit\ cu
func]ia subst.
• Func]ia entmod va actualiza `nregistrarea unei
entit\]i `n baza de date pe baza modific\rilor din
lista asociat\.

50793936.doc R.2.1 2/3/2011 •177


AUTODESK, INC.

EXERCITIUL 26: ACTUALIZAREA INREGISTRARII UNEI ENTITATI

~n acest exerci]iu:
• Ve]i aprofunda cuno[tin]ele despre modificarea
entita]ilor [i despre listele asociate.
• Ve]i folosi func]ia entmod.
• Ve]i modifica func]ia de la exerci]iul 26.
• Ve]i modifica listele asociate tuturor entit\]ilor
Line.
• Ve]i actualiza `nregistrarea entit\]ilor acestora.

Etape de lucru
• Deschideti fi[ierul text scline.lsp.
• Salva]i textul `ntr-un fi[ier nou numit modline.lsp.
• Schimba]i numele func]iei din c:scline `n c:modline.
• Modifica]i func]ia.
• Dac\ entitatea este de tip Line, modifica]i-i punctul
de cap\t din valoarea curent\ `n punctul 5.0,
5.0, 0.0.
• Salva]i fi[ierul.
• ~ntr-un desen nou, desena]i c`teva linii [i cercuri
`n diferite pozi]ii.
• ~nc\rca]i fi[ierul modline.lsp.
• Activa]i comanda MODLINE.

•178
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

C:SCLINE
(defun c:scline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(if ;if it's a Line...
(=
"LINE"
(cdr (assoc 0 (entget ename)))
)
(progn
(command "._SCALE" ename "" "0,0" "0.5");scale it and...
(prompt ;tell user which one
(strcat
"\nScaling entity "
(itoa counter)
".\n"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)

C:MODLINE
(defun c:modline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(setq elist (entget ename)) ;get its assoc list
(if ;if it's a Line...
(= "LINE" (cdr (assoc 0 elist)))
(progn
(entmod ;change its end point
(subst '(11 5.0 5.0 0.0) (assoc 11 elist) elist)
)
(prompt ;tell user which one
(strcat
"\nModifying entity "
(itoa counter)
".\n"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter

50793936.doc R.2.1 2/3/2011 •179


AUTODESK, INC.

(setq ename (entnext ename)) ;get the next entity


)
(prin1) ;quiet exit
)

•180
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 27: ACTUALIZAREA TUTUROR ENTITATILOR “DIMENSION” INTR-UN DESEN

Acesta este un exerci]iu op]ional.

~n acest exerci]iu:
• Ve]i aprofunda cuno[tin]ele despre modificarea
entit\]ilor [i listele asociate.
• Ve]i scrie o func]ie care s\ modifice toate entita]ile
de tip Dimmension din desen.

Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg `n directorul
student.

Figure 5. Desenul moddim.dwg.

2. Dimensiunile din acest desen au fost amplasate pe


c`teva nivele diferite. Sarcina dvs. este s\ scrie]i un
program AutoLISP care s\ caute toate entit\]ile
Dimension din acest desen [i s\ le amplasa]i pe nivelul
DIM.
3. Fi[ierul program AutpLISP moddim.lsp din directorul
student con]ine schi]a programului. Deschide]i acest
fi[ier cu editorul de text [i ad\uga]i codul necesar pentru
a completa programul.

50793936.doc R.2.1 2/3/2011 •181


AUTODESK, INC.

Selectarea numelui unei entit\]i prin selec]ie


grafic\ cu cursorul
Un program AutoLISP poate extrage numele unei entit\]i
cer`nd utilizatorului s\ selecteze o entitate.

Obiective
~n acest capitol ve]i studia:
• Cum s\ extrage]i numele unei entit\]i interactiv cu
utilizatorul.
• Cum s\ folosi]i func]ia entsel.
• Cum s\ deplasa]i centrul cercului selectat de
utilizator.

Func]ia entsel
Func]ia entsel v\ cere s\ selecta]i un singur obiect. Func]ia
returneaz\ o list\ cu dou\ obiecte: numele entit\]ii [i punctul
`n care a fost selectat; dac\ nu se selecteaz\ nimic atunci
func]ia returneaz\ nil.

Pute]i extrage numele entit\]ii din lista returnat\ de func]ia


entsel cu ajutorul func]iei car.

Exemplu
Introduce]i expresiile care urmeaz\.

~ntr-un desen nou , desena]i o linie [i un cerc.

Command: line
From point: 1,1
To point: 5,5
To point: Enter

Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<Radius>: 1
Selecta]i cercul `n punctul 5,6,0 ca r\spuns la cererea
func]iei entsel [i lega]i valoarea returnat\ de variabila epick.

Command: (setq epick (entsel))


Select object: pick circle at 5,6,0
(<Entity name: xxxxxxxx> (5.0 6.0 0.0))

Command: !epick
(<Entity name: xxxxxxxx> (5.0 6.0 0.0))

•182
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Extrage]i numele entit\]ii din lista returnat\ de func]ia entsel


[i p\stra]i-l `n variabila ename.

Command: (setq ename (car epick))


<Entity name: xxxxxxxx>

Command: !ename
<Entity name: xxxxxxxx>

{terge]i entitatea Circle.

Command: (command "._erase" ename "")

Recapitulare
• Func]ia entsel extrage o list\ a propriet\]ilor unui
obiect selectat de utilizator: numele entit\]ii [i
punctul `n care a fost selectat.
• Partea car a unei liste selectate de entsel reprezint\
numele unei entit\]i.

50793936.doc R.2.1 2/3/2011 •183


AUTODESK, INC.

EXERCITIUL 28: SELECTAREA SI MODIFICAREA UNUI CERC

~n acest exerci]iu:
• Ve]i consolida cuno[tin]ele despre selec]ia
interactiv\ a entit\]ilor.
• Ve]i crea un program care cere utilizatorului s\
selecteze o entitate Circle [i un nou punct de
centru care deplaseaz\ centrul cercului

Etape de lucru
1. ~n editorul de texte, deschide]i fi[ierul text numit
circen.lsp din directorul student.
2. Ad\uga]i codul care face urmatoarele:
• Define[te func]ia c:circen.
• Cere utilizatorului o entitate cu func]ia entsel.
• Dac\ utilizatorul selecteaz\ o entitate, codul trimite
lista asociat\ entit\]ii ca argument la func]ia
circen_mod .
3. Salva]i fi[ierul.
4. ~nc\rca]i programul `n AutoCAD.
5. Verifica]i comanda CIRCEN `ntr-un desen care con]ine
cel pu]in un cerc.

(defun circen_mod (elist)


(if
(/= "CIRCLE" (cdr (assoc 0 elist))) ;is it a circle?
(prompt "\nNot a circle.") ;if not, exit
(progn
(setq old_cen (cdr (assoc 10 elist))) ;get current center
(initget 1) ;no null reponse...
;for getpoint

;get new center


(setq new_cen (getpoint old_cen "\nCenter point: "))

(entmod ;modify the circle


(subst (cons 10 new_cen) (assoc 10 elist) elist)
)
)
)
)

•184
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 29: PROBLEME OPTIONALE DE ACCES LA ENTITATI

Acestea s`nt exerci]ii op]ionale pe care le pute]i completa


`n clas\ sau `n afara clasei.

Scrie]i un set de defini]ii de func]ii.

c:movelast
• Deplasa]i ultima entitate `n baza de date.
• Cere]i operatorului punctul de baz\ [i al doilea
punct al deplas\rii..
c:printent
• Selecta]i fiecare entitate din desen, una dup\ alta.
• Tip\ri]i fiecare tip [i layer ale entit\]ii `n zona liniei
de comand\.
c:red
• Cere]i operatorului s\ selecteze o entitate.
• Schimba]i culoarea entit\]ii `n RED (reprezentat\
`ntr-o list\ asociat\ de codul de grup 62 [i
num\rul `ntreg 1).
• Observa]i c\ pute]i ad\uga o nou\ sublist\ la lista
asociat\ `n loc s\ `nlocui]i o list\ existent\
folosind func]ia entmod . O sublist\ de grup 62 nu
este prezent\ `ntr-o list\ asociat\ unei entit\]i
dac\ culoarea entit\]ii este BYLAYER.
c:chglayer
• Cere]i operatorului s\ selecteze o entitate.
• Cere]i operatorului numele unui nivel.
• Schimba]i nivelul entit\]ii.

50793936.doc R.2.1 2/3/2011 •185


AUTODESK, INC.

Tratarea erorilor
AutoLISP dispune de o metod\ pentru tratarea erorilor de
program [i de utilizare.

Obiective
~n acest capitol ve]i studia:
• Cum s\ folosi]i func]iile exit [i quit pentru a for]a o
eroare AutoLISP.
• Cum s\ `nlocui]i rutina implicit\ AutoLISP de tratare
a erorilor.
• Cum s\ utiliza]i rutina de tratare a erorilor pentru
"a [terge" un program dup\ ce a fost abortat din
cauza unei erori sau pentru c\ utilizatorul a
anulat programul.
• Cum s\ folosi]i comanda UNDO `n rutina de tratare
a erorilor.

For]area unei erori


Func]iile exit [i quit realizeaz\ aceea[i opera]ie, f\r\
argumente.

Func]iile exit [i quit for]eaz\ aplica]ia curent\ s\ se termine


prin for]area unei erori AutoLISP. Ele returneaz\ [irul
"quit/exit abort" [i transfer\ [irul func]iei de tratare a
erorilor *error*. Dup\ executarea func]iei de tratare a
erorilor, AutoCAD-ul se `ntoarce la linia de comand\.

O aplica]ie poate folosi func]iile exit [i quit `n combina]ie cu


o func]ie de tratare a erorilor definit\ de utilizator pentru a
opri propria-i execu]ie, pentru a reface orice valori necesare
`n AutoCAD [i pentru a prezenta utilizatorului un mesaj
adecvat.

Func]ia *error*
Pute]i fi siguri c\ pozi]ionarea unei variabile de sistem sau o
anumit\ condi]ie AutoCAD pot fi restabilite dup\ apari]ia
unei erori nea[teptate folosind func]ia *error*. ~n cadrul
acestei func]ii care poate fi definit\ de utilizator pute]i
evalua condi]iile de eroare, pute]i returna un mesaj adecvat
utilizatorului [i puteti restabili setarea variabilelor AutoCAD.

Parcurge]i aceste etape pentru a implementa o subrutin\ de


tratare a erorilor definit\ de utilizator pentru o comand\.
• Salva]i defini]ia curent\ a func]iei *error*.

•186
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Defini]i o nou\ func]ie *error* pentru comand\ sau func]ie.

Redefini]i subrutina veche de tratare a erorilor prin


comanda exit sau prin exit dintr-o nou\ subrutin\ de tratare a
erorilor.

Redefinirea rutinei de tratare a erorilor ar trebui f\cut\ `n


contextul unei comenzi sau a unei func]ii; plasa]i codul
pentru a defini o rutin\ de tratare a erorilor `n cadrul
codului pentru comand\.

50793936.doc R.2.1 2/3/2011 •187


AUTODESK, INC.

Exemplu

Acest cod implementeaz\ comanda c:rectangle [i propria-i


rutin\ de tratare a erorilor.

(defun c:rectangle (/ pt1 pt2)

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


(setvar "CMDECHO" old_cmdecho) ;restore system variable
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
(princ) ;deliberately aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)

(setq old_cmdecho (getvar "CMDECHO"))


(setvar "CMDECHO" 0)
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command "pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(setvar "CMDECHO" old_cmdecho)

(setq *error* old_error) ;restore default error handler


;if command is successful
(prin1)
)
Dup\ cum vede]i, AutoLISP-ul v\ permite s\ defini]i o func]ie
(adic\ s\ apela]i func]ia defun ) `n timpul execut\rii unei
comenzi sau func]ii definite de utilizator. Deci rutina de
tratare a erorilor pentru func]ia c:rectangle este definit\ de
`ndat\ ce utilizatorul apeleaz\ comanda RECTANGLE dar nu
`nainte de asta. Rutina AutoLISP, implicit\ de tratare a
erorilor este refacut\ `n toate cazurile: c`nd comanda
ajunge s\ fie `ndeplinit\ cu succes sau la cap\tul rutinei de
tratare a erorilor cu comanda specific\.

Aceast\ tehnic\ v\ permite s\ adapta]i rutina AutoLISP de


tratare a erorilor pentru orice situa]ie.

•188
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Rutina noastr\ de tratare a erorilor cu comand\ specific\


reface pozi]ionarea original\ a variabilei de sistem CMDECHO
`n cazul `n care Comanda RECTANGLE `nt`lne[te o eroare `n
timpul execu]iei. Variabila definit\ de utilizator old_emdecho
a fost facut\ global a[a `nc`t valoarea ei este accesibil\ noii
func]ii *error*.

50793936.doc R.2.1 2/3/2011 •189


AUTODESK, INC.

EXERCITIUL 30: DEFINIREA SI UTILIZAREA UNEI NOI SUBRUTINE DE TRATARE A ERORILOR

~n acest exerci]iu:
• Ve]i aprofunda cuno[tin]ele despre modul cum se
folose[te o rutin\ de tratare a erorilor.
• Ve]i modifica func]ia de la exerci]iul 29.

Etape de lucru
1. Ad\uga]i o rutin\ de tratare a erorilor pentru comanda
CIRCEN `n fi[ierul circen.lsp.
2. Folosi]i exemplul de la c:rectangle ca o baz\ de la care s\
porni]i.
3. ~nc\rca]i programul `n AutoCAD.
4. Activa]i comanda CIRCEN [i anula]i-o cu Ctrl-C pentru a
verifica rutina de tratare a erorilor.

•190
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

UNDO [i tratarea erorilor


Pentru a permite utilizatorului s\ anuleze `ntr-o singur\
etap\ rezultatul unei comenzi pe baz\ de AutoLISP,
amplasa]i un UNDO MARK la `nceputul rutinei.

Pute]i folosi rutina de tratare a erorilor pentru a anula


automat rezultatele unei comenzi pe baz\ de AutoLISP p`n\
la punctul unde a intervenit eroarea, admi]ind faptul ca
UNDO CONTROL este setat pentru ONE sau ALL.

Variabilele de sistem UNDOCTRL [i UNDOMARKS pot fi


examinate de un program AutoLISP pentru a determina ce
ac]iune de anulare, dac\ exist\ vreouna, este adecvat\
pentru sesiunea curent\ AutoCAD.

Exemplu
Aceast\ defini]ie a comenzii RECTANGLE permite utilizatorului
s\ anuleze rezultatele comenzii `ntr-o singur\ etap\.
Instruc]iunea if testeaz\ dac\ UNDO este activat\. Dac\ da,
atunci d\ o comand\ UNDO MARK la `nceputul rutinei.
Dup\ ce utilizatorul introduce o comand\ RECTANGLE,
utilizatorul poate anula rezultatul comenzii cu comenzile U
sau UNDO BACK.

(defun c:rectangle (/ pt1 pt2)

(setq old_cmdecho (getvar "CMDECHO"))


(setvar "CMDECHO" 0)

(if
(= 1 (logand 1 (getvar "UNDOCTL")))
(command "._UNDO" "_MARK")
)

(setq pt1 (getpoint "\nFirst corner: "))


(setq pt3 (getpoint "\nOther corner: "))
(command "._PLINE"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"_C"
)
(setvar "CMDECHO" old_cmdecho)

(prin1)
)

50793936.doc R.2.1 2/3/2011 •191


AUTODESK, INC.

Exemplu
Extindem codul UNDO pentru a include rutina de tratare a
erorilor. Dac\ rutina este anulat\ dintr-un motiv oarecare [i
UNDO este disponibil, rezultatul comenzii p`n\ la punctul de
eroare este anulat automat. Se seteaz\ o variabila de
condi]ie pentru a fi examinat\ `n rutina de tratare a
erorilor. Un UNDO GROUP este activat `n comand\ [i corelat
cu un UNDO END.

NOTA • Fi[ierul ai_utils.lsp, versiunea 12 din directorul


support con]ine c`teva rutine pentru folosirea codului UNDO
`ntr-un program AutoLISP.

continuare pe pagina urmatoare

•192
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(defun c:rectangle (/ pt1 pt2)

(setq old_cmdecho (getvar "CMDECHO")) ;store orignal command echo


(setvar "CMDECHO" 0) ;turn off command echo

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler

(command) ;cancel any command `n progress

(if
rect_undo_flag ;if the undo flag is t...
(progn
(command "._UNDO" "_END") ;end the group...
(command "._U") ;undo the command...
(setq rect_undo_flag nil) ;and clear the flag
)
)
(setvar "CMDECHO" old_cmdecho) ;restore system variable
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
(princ) ;deliberately aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)

(if
(= 1 (logand 1 (getvar "UNDOCTL")));if UNDO is on...
(progn
(command "._UNDO" "_GROUP") ;start an UNDO GROUP...
(setq rect_undo_flag t) ;and set a flag
)
(setq rect_undo_flag nil) ;else, clear the flag
)

(setq pt1 (getpoint "\nFirst corner: "))


(setq pt3 (getpoint "\nOther corner: "))
(command "pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(if
rect_undo_flag ;if the flag is set...
(progn
(command "._UNDO" "_END") ;end the UNDO GROUP...
(setq rect_undo_flag nil) ;and clear the flag
)
)

50793936.doc R.2.1 2/3/2011 •193


AUTODESK, INC.

(setvar "CMDECHO" old_cmdecho) ;reset original command echo

(setq *error* old_error) ;restore default error handler


;if command is successful
(prin1) ;quiet exit
)

•194
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Opera]ii cu fi[iere
AutoLISP poate citi [i scrie fi[iere text de tip ASCII.

Obiective
~n acest capitol ve]i studia:
• Ce este un descriptor de fi[ier [i cum este
folosit.
• Cum s\ deschide]i un fi[ier pentru opera]ii de citire
sau scriere.
• Cum s\ scrie]i linii de text `ntr-un fi[ier deschis.
• Cum s\ citi]i linii de text dintr-un fi[ier deschis.
• Cum s\ descoperi]i sf`r[itul unui fi[ier text.
• Cum s\ `nchide]i un fi[ier.

Func]iile fi[ier I/O


Opera]iile de citire [i scriere `ntr-un fi[ier sau opera]ii I/O
`ntr-un fi[ier se realizeaz\ cu ajutorul a dou\ func]ii: read-line
[i write-line. Deschiderea [i `nchiderea fi[ierelor se realizeaz\
de asemenea prin dou\ func]ii: open [i close.

Deschiderea unui fi[ier


Func]ia open cere dou\ argumente: numele unui fi[ier ce
urmeaz\ a fi deschis [i modul de deschidere a acestuia.
Ambele argumente trebuie s\ fie [iruri.
Dac\ func]ia open reu[e[te, returneaz\ un descriptor de
fi[ier. Dac\ e[ueaz\, returneaz\ nil.
Programul dvs. trebuie s\ p\streze descriptorul de
fi[ier `ntr-o variabil\! Dac\ nu-l p\stra]i, nu ve]i putea citi,
scrie sau `nchide fi[ierul.

Descriptorul de fi[ier este un argument obligatoriu pentru


func]iile care scriu `n, citesc din/sau `nchid fi[ierul.
Exist\ trei tipuri valide de moduri de deschidere a unui fi[ier.
Fiecare trebuie s\ fie reprezentat de o liter\ mic\ despar]it\
prin semne de punctua]ie.

50793936.doc R.2.1 2/3/2011 •195


AUTODESK, INC.

Open mode Descriere

"r" Deschiderea fisierului pentru citire.

"w" Deschiderea fisierului pentru scriere. daca exista un


fisier cu acelasi nume se va produce o
suprascriere.

"a" Deschiderea fisierului pentru adaugare. daca exista


un fisier cu acelasi nume, va fi adaugat la sfirsitul
acestuia.

Tabelul 28. Moduri de a deschide un fi[ier.

De exemplu, aceast\ expresie deschide un fi[ier numit


test.txt. pentru o opera]ie de scriere.
Command: (setq fp (open "test.txt" "w"))
<File: #xxxxx>

Command: !fp
<File: #xxxxx>

Scrierea `ntr-un fi[ier


Func]ia write-line va scrie un [ir de text `ntr-un fi[ier deschis.
Aceast\ func]ie cere dou\ argumente: un [ir de tip text [i un
descriptor de fi[ier. Al doilea argument este op]ional; dac\
nu este introdus, func]ia write-line va scrie [irul pe display.

Presupune]i c\ variabila fp este legat\ de un descriptor de


fi[ier valid returnat prin deschiderea unui fi[ier pentru o
opera]ie de scriere.

Aceste expresii scriu dou\ linii de text `ntr-un fi[ier.

Command: (write-line "First line." fp)


"First line."

Command: (write-line "Second line." fp)


"Second line."

~nchiderea unui fi[ier


Trebuie s\ `nchide]i fi[ierul imediat dup\ opera]ii de scriere,
citire sau ad\ugare. Dac\ nu-l inchide]i, resursele sistemului
dvs. vor fi limitate, `n particular num\rul de handlere de
fi[iere disponibil.

Func]ia close va `nchide un fi[ier deschis. Func]ia cere un


argument: un descriptor de fi[ier valid. Func]ia returneaz\
nil .

Aceast\ expresie va `nchide fi[ierul deschis [i `n care s-a


scris `n cele dou\ exemple anterioare.
Command: (setq fp (close fp))

•196
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Deoarece descriptorul de fi[ier fp nu mai este valid dup\ ce


fi[ierul la care se refer\ este `nchis, de exemplu dac\ se
seteaza fp la nil este echivalent cu a `nchide fi[ierul. Se
elibereaz\ astfel memoria [i se ob]ine asigurarea c\ fp nu
poate fi folosit `n afara contextului.

Exemplu
Introduce]i expresiile care urmeaz\.

Deschide]i un fi[ier, scrie]i c`teva linii de text `n fi[ier [i


`nchide]i fi[ierul. Examina]i fi[ierul cu editorul de text dup\
ce a fost `nchis.

Deschide]i un fi[ier numit test.txt pentru o opera]ie de


scriere.
Command: (setq fp (open "test.txt" "w"))
<File: #xxxxx>
Command: !fp
<File: #xxxxx>
Scrie]i c`teva linii de text `ntr-un fi[ier.
Command: (write-line "Coders" fp)
"Coders"
Command: (write-line "of the" fp)
"of the"
Command: (write-line "Lost Spark" fp)
"Lost Spark"
~nchide]i fi[ierul.
Command: (setq fp (close fp))
nil
Command: !fp
nil
Deschide]i fi[ierul test.txt `n editorul text [i examina]i-l. Ar
trebui s\ con]in\ trei linii de text.
Coders
of the
Lost Spark

50793936.doc R.2.1 2/3/2011 •197


AUTODESK, INC.

Deschiderea unui fi[ier pentru o opera]ie de citire


C`nd deschide]i un fi[ier pentru o opera]ie de citire, pute]i
citi datele din fi[ier, linie cu linie. Nu pute]i modifica sau
scrie `ntr-un fi[ier care a fost deschis pentru o opera]ie de
citire. (Dac\ vre]i s\ introduce]i date `n fi[ier, `nchide]i-l [i
redeschide]i-l pentru o opera]ie de scriere.)

Func]ia open apelat\ cu un argumenr "r" returneaz\ un


descriptor de fi[ier dac\ fi[ierul specificat exist\; dac\ nu,
returneaz\ nil.

Func]ia read-line cite[te o linie de text dintr-un fi[ier. Cere un


argument op]ional: un descriptor de fi[ier valid pentru un
fi[ier care a fost deschis pentru o opera]ie de citire. Dac\
argumentul nu este ad\ugat, func]ia read-line cite[te intrarea
de pe tastatur\.

Func]ia read-line returneaz\ o linie de text pe care o cite[te


dintr-un fi[ier. Func]ia read-line returneaz\ nil dac\ ajunge la
cap\tul fi[ierului.

Func]ia read-line `ncepe cu prima linie de text dintr-un fi[ier.


O apelare ulterioar\ a func]iei read-line va face ca func]ia s\
citeasc\ urm\toarea linie de text din fi[ier [i a[a mai
departe.

•198
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
Introduce]i expresiile care urmeaz\.

~n acest exemplu se presupune c\ a]i creat cu succes


fi[ierul text.txt din exerci]iul anterior.

Deschide]i fi[ierul test.txt pentru o opera]ie de citire.

Command: (setq fp (open "test.txt" "r"))


<File: #XXXX>

Command: !fp
<File: #XXXX>
Citi]i prima, a dou\ [i a treia linie din fi[ier.

Command: (read-line fp)


“Coders”

Command: (read-line fp)


"of the"

Command: (read-line fp)


"Lost Spark"
~ncerca]i s\ citi]i p`n\ la sf`r[itul fi[ierului. Func]ia read-line
va returna nil.
Command: (read-line fp)
nil
~nchide]i fi[ierul.
Command: (setq fp (close fp))

nil
Command: !fp
nil

50793936.doc R.2.1 2/3/2011 •199


AUTODESK, INC.

Recapitulare
• Un descriptor de fi[ier este un pointer al unui
fi[ier returnat de func]ia open .
• Un program trebuie s\ p\streze un descriptor
de fi[ier pentru a avea acces la fi[ierul pe care
l-a deschis.
• Fi[ierele pot fi deschise pentru opera]ii de citire,
scriere [i ad\ugare.
• Argumentele pentru modul de deschidere a
fi[ierelor la func]ia open trebuie s\ fie litere mici.
• Un fi[ier poate fi deschis numai pentru o singur\
opera]ie.
• Func]iile write-line [i read-line scriu [i citesc din
fi[iere.
• Func]ia read-line returneaz\ nil c`nd ajunge la
cap\tul fi[ierului.

•200
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 31: COPIEREA UNUI FISIER TEXT

Ave]i 30 de minute la dispozi]ie s\ termina]i acest exerci]iu;


este un program vast. Ave]i nevoie de timp ca s\ revizui]i [i
s\ `n]elegeti codul [i de asemenea s\ introduce]i textul
surs\.
~n acest exerci]iu:
• Ve]i aprofunda cuno[tin]ele despre fi[iere I/O `n
AutoLISP.
• Ve]i crea un program AutoLISP pentru citit fi[iere
text de tip ASCII [i pentru copiat fi[iere `ntr-un
fi[ier cu nume diferit.
• Ve]i deschide fi[iere at`t pentru citit c`t [i pentru
scris.

Instruc]iuni
1. Introduce]i codul care urmeaz\ `ntr-un document nou din
editorul text.

2. Salva]i fi[ierul `n directorul student sub numele de


copyfile.lsp.

3. Aceast\ func]ie folose]te o rutin\ de tratare a erorilor cu


apelare asem\n\toare cu cea din exerci]iul precedent.
Varibilele legate de descriptoarele de fi[ier au fost
definite global a[a `nc`t rutina de tratare a erorilor le
poate `nchide dac\ este necesar.

4. ~nc\rca]i copyfile.lsp `n AutoCAD.

5. Activa]i comanda COPYFILE.

6. ~ncerca]i s\ copia]i dou\ fi[iere text.

7. Depana]i programul dac\ este necesar.

continuare pe pagina urmatoare

50793936.doc R.2.1 2/3/2011 •201


AUTODESK, INC.

(defun c:copyfile (/ r_fp_name w_fp_name r_fp_line)

; r_fp source file descriptor


; w_fp destination file descriptor
; r_fp_name source file name
; w_fp_name destination file name
; r_fp_line source file text line

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


(if ;close source file if open
r_fp
(setq r_fp (close r_fp))
)
(if ;close destination file if open
w_fp
(setq w_fp (close w_fp))
)
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)

;get source file from user with dialogue

(setq r_fp_name (getfiled "Select Source File" "" "txt" 0))

;if source file returned, get destination file from user

(if
r_fp_name
(setq w_fp_name (getfiled "Destination File" "" "txt" 1))
)

;check that we got good values for both file names


;exit if not

(if
(or
(not r_fp_name)
(not w_fp_name)
)
(progn
(prompt "\nMust specify both source and destination file.")
(exit)
)

•202
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

continuare pe pagina urmatoare

50793936.doc R.2.1 2/3/2011 •203


AUTODESK, INC.

;check that file names are different


;exit if not

(if
(= r_fp_name w_fp_name)
(progn
(prompt "\nSource same name as destination file.")
(exit)
)
)

;open source file for read


;exit if it fails

(if
(not (setq r_fp (open r_fp_name "r")))
(progn
(prompt "\nCould not open source file.")
(exit)
)
)

;open destination file for read


;close source file and exit if it fails

(if
(not (setq w_fp (open w_fp_name "w")))
(progn
(setq r_fp (close r_fp))
(prompt "\nCould not open destination file.")
(exit)
)
)

;get first line from source file

(setq r_fp_line (read-line r_fp))

;write source line to destination file and get next...


;source line until end of file is reached

(while
r_fp_line
(write-line r_fp_line w_fp)
(setq r_fp_line (read-line r_fp))
)

;close the source and destination files

(setq r_fp (close r_fp))


(setq w_fp (close w_fp))

;restore original error handler

•204
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(setq *error* old_error)

(prin1) ;quiet exit


)

50793936.doc R.2.1 2/3/2011 •205


AUTODESK, INC.

EXERCITIUL32: CITIREA UNUI FISIER TEXT SI CREAREA ENTITATII “TEXT”

Acesta este un exerci]iu op]ional.


Dac\ termina]i cu comanda COPYFILE pute]i continua cu
acest exerci]iu op]ional.

Func]ia c:iotext v\ arat\ cum s\ citi]i un fi[ier text de pe disc [i


s\ scrie]i textul sub form\ de entita]i text AutoCAD. Acesta
este un subset de facilit\]i inclus `n ACAD R 12 din cadrul
fi[ierului asctext.lsp.

Etape de lucru
1. Deschide]i un nou fi[ier `n editorul text.

2. Introduce]i codul care urmeaz\ [i salva]i-l `ntr-un fi[ier


numit iotext.lsp.

3. ~nc\rca]i fi[ierul `n AutoCAD.

4. Activa]i comanda IOTEXT.

Un singur lucru trebuie s\ schimba]i: cere]i utilizatorului s\


pun\ spa]ii `ntre linii `n loc s\ scaleze mereu `n\l]imea
textului cu 1.5.

continuare pe pagina urmatoare

•206
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

; Iotext.lsp
;
; Command function IOTEXT prompts for the name of a text file.
; It reads each line of the file and draws the corresponding Text
; entities `n AutoCAD.
;
; It prompts for the height, rotation angle and insertion point
; of the text. Text is always drawn left-justified.

(defun dtr (d) ;convert degrees to radians


(/ (* d pi) 180.0)
)

(defun rtd (r) ;convert radians to degrees


(/ (* r 180.0) pi)
)

(defun C:IOTEXT()

(setq old_cmdecho (getvar "CMDECHO")) ;save old command echo


(setvar "CMDECHO" 0) ;turn off command echo

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


(if ;close source file if open
io_fp
(setq io_fp (close io_fp))
)
(setvar "CMDECHO" old_cmdecho) ;restore command echo
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)

(setq io_fp_name ;name of text file to read


(getfiled "Select Text File" "" "txt" 0)
)

(if ;if the file dialogue is


canceled
(= io_fp_name nil) ;then exit
(exit)
)

50793936.doc R.2.1 2/3/2011 •207


AUTODESK, INC.

continuare pe pagina urmatoare

•208
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(if ;if we can't open file then exit


(not (setq io_fp (open io_fp_name "r")))
(progn
(prompt "\nCan't open file for input.")
(exit)
)
)

(initget 1) ;no null


(setq ;text insertion point
io_ins_pt (getpoint "\nInsertion point: ")
)

(initget (+ 1 2 4)) ;no null, zero, negative #


(setq ;text height
io_txt_ht (getdist io_ins_pt "\nHeight: ")
)

(setq io_txt_rot ;text rotation angle


(getangle io_ins_pt "\nRotation: ")
)

(if ;if null response to rotation


(not io_txt_rot) ;prompt, set it to 0.0
(setq io_txt_rot 0.0)
)

(setq ;set line spacing distance


io_line_spacing (* io_txt_ht 1.5)
)

(setq ;set line spacing angle


io_spacing_rot (- (dtr io_txt_rot) (/ pi 2))
)

(setq io_fp_line (read-line io_fp)) ;read line from file

;while we have a line of text from the file, draw a Text entity
;in AutoCAD. Set the next Text entity insertion point. Get the
;next line of text from the file.

(while
io_fp_line
(command "text" io_ins_pt io_txt_ht io_txt_rot io_fp_line)
(setq io_ins_pt (polar io_ins_pt io_spacing_rot io_line_spacing))
(setq io_fp_line (read-line io_fp))
)

(setq io_fp (close io_fp)) ;close file

(setvar "CMDECHO" old_cmdecho) ;restore command echo


(setq *error* old_error) ;restore default error handler
(prin1) ;quiet exit
)

50793936.doc R.2.1 2/3/2011 •209


AUTODESK, INC.

Seturi de selec]ie
AutoCAD-ul poate a[eza grupuri de entit\]i `n seturi de
selec]ie. Comenzile AutoCAD [i func]iile AutoLISP pot
ac]iona asupra unui set de selec]ie [i fac`nd aceasta, poate
ac]iona global asupra grupului de entit\]i din setul de
selec]ie.

Obiective
~n acest capitol ve]i `nv\]a:
• Cum s\ crea]i un set de selec]ie.
• Cum s\ folosi]i un set de selec]ie cu comenzi
AutoCAD.
• Cum s\ crea]i un set de selec]ie interactiv, cu
fereastr\, cu filtru [i prin selectarea tuturor
componentelor dintr-un desen.
• Cum s\ afla]i lungimea num\rului de entit\]i `ntr-un
set de selec]ie.
• Cum s\ lucra]i cu nume de entit\]i `ntr-un set de
selec]ie.

Note `n leg\tur\ cu seturile de selec]ie


Un set de selec]ie `n AutoLISP reprezint\ un tip unic de date
numit PICKSET, alc\tuit dintr-o colec]ie de nume de entit\]i.
Setul de selec]ie nu este o list\.

AutoLISP poate p\stra maximum 128 de seturi de selec]ie


deschise odat\ (num\rul ar putea fi mai mic pentru un
sistem dat).

Lega]i `ntotdeauna o variabil\ de un set de selec]ie pe care


`l crea]i sau modifica]i; altfel nu ave]i acces la setul de
selec]ie [i nici o cale de a elibera resursele sistemului
consumate de setul de selec]ie p`n\ ce nu ie[iti din
AutoCAD.

C`nd a]i terminat cu o variabil\ atribuit\ setului de selec]ie,


este bine s\ seta]i variabila pe nil pentru a elibera resursele
folosite de setul de selec]ie.

•210
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

AutoLISP dispune de o varietate de func]ii pentru a crea [i


manipula seturile de selec]ie. Acest capitol descrie
func]ionalitatea [i arat\ exemple de func]ii ssget, sslength [i
ssname .

Functia Operatia

ssget Creaza un set de selectie

ssadd Adauga o entitate la un set de selectie

ssdel Sterge o entitate dintr-un set de selectie

sslength Determina numarul de entitati dintr-un set de selectie

ssmemb Verifica daca fiecare entitate este parte a setului de selectie

ssname Extrage numele entitatilor din setul de selectie


Tabelul 29. Functii pentru seturi de selectie

Crearea unui set de selec]ie


Func]ia ssget include virtual toate seturile de selec]ie
interactive, cuprinz`nd metode care s`nt disponibile `n
AutoCAD la mesajul “Select objects:”. Sintaxa complet\ [i
num\rul de aplica]ii ale func]iei s`nt prea complicate pentru
a fi descrise aici `n `ntregime. De aceea ne vom concentra
aten]ia asupra c`torva dintre formele de sintax\ cele mai
folosite [i vom l\sa descrierea complet\ `n seama
manualului AutoLISP Programmer’s Reference Manual.

Sintaxa functiei Operatia

(ssget) “Select objects ´standard:cererea


permite utilizatorului selec]ia
interactiva "

(ssget "X") Selecteaza toate entita]ile din


desen

(ssget "W" '(1.0 1.0 0.0) '(11.0 8.0 0.0)) Selecteaza toate entita]ile din
fereastra de la 1,1,0 la 11,8,0

(ssget "X" '((0 . "LINE"))) Selecteaza toate entita]ile Line


din desen

Tabelul 30.Sintaxa si opera]iile functiei ssget.

Exemple de lucru
Deschide]i desenul ssget.dwg `n directorul student. Ve]i
folosi acest desen pentru urm\toarele patru exemple care
arat\ cum s\ folosi]i ssget.

50793936.doc R.2.1 2/3/2011 •211


AUTODESK, INC.

Selec]ia interactiv\
Func]ia ssget apelat\ f\r\ argumente va genera cererea
standard "select objects:" `n zona liniei de comand\ [i va
permite utilizatorului s\ selecteze obiecte interactiv. C`nd
utilizatorul termin\ procesul de selec]ie cu tasta Return sau
Space, func]ia ssget returneaz\ valoarea ei sub forma unui
nou set de selec]ie.

Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile
care urmeaz\.

Folosi]i ssget pentru a cere utilizatorului s\ selecteze


obiecte.
Command: (setq ss1 (ssget))
Select objects: pick several objects
Select objects: Enter
<Selection set: 1>
Verifica]i tipul de date ale variabilei ss1.
Command: !ss1
<Selection-set: 1>
Command: (type ss1)
PICKSET
Folosi]i setul de selec]ie pentru care variabila ss1 este legat\
`n cadrul comenzii AutoCAD.
Command: erase
Select objects: !ss1
Select objects: Enter
Reface]i obiectele [terse.
Command: oops

•212
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Selectarea componentelor dintr-un desen


Func]ia ssget apelat\ cu un singur argument, [irul "X", va
returna un set de selec]ie compus din entit\]ile
componente din desen. Aceast\ func]ie include entit\]ile
care nu s`nt afi[ate pe monitor [i entita]ile de pe layere
care s`nt `nghe]ate [i/sau `nchise.

Exemplu
C`nd s`nte]i `n desenul ssget.dwg, introduce]i expresiile
care urmeaz\.

Folosi]i func]ia ssget pentru a crea un set de selec]ie format


din toate entit\]ile din desen.
Command: (setq ss1 (ssget "X"))
<Selection set: 2>
{terge]i toate obiectele din desen.
Command: (command ".erase" ss1 "")
Reface]i obiectele [terse.
Command: oops

Selectarea componentelor dintr- o fereastr\


Pute]i apela func]ia ssget cu un argument de tip [ir care
corespunde oric\rei op]iuni standard la cererea "select
objects:", op]iuni cum ar fi "W" pentru entit\]ile incluse `n
fereastr\, "C" pentru entita]ile care traverseaz\ sau s`nt
incluse `n fereastr\ [i "F" pentru entit\]i care intersecteaz\ o
polilinie de selec]ie.

Exemplu
C`nd s`nte]i `n desenul ssget.dwg, introduce]i expresiile
care urmeaz\.

Crea]i un set de selec]ie din entit\]i care apar]in unei


ferestre definit\ de punctele 6,3,0 [i 11,8,,0.
Command: (setq ss1 (ssget "W" '(6 3 0) '(11 8 0)))
<Selection set: 3>
{terge]i toate entit\]ile care se afl\ `n interiorul ferestrei.
Command: (command ".erase" ss1 "")
Reface]i toate entit\]ile [terse.

50793936.doc R.2.1 2/3/2011 •213


AUTODESK, INC.

Selectarea cu filtru
Func]ia ssget v\ permite s\ selecta]i entit\]ile prin filtru.
Pute]i filtra `n acord cu oricare dintre propriet\]ile entit\]ilor
care s`nt p\strate `n coduri de grup DXF `n cadrul listelor
asociate entit\]ilor.

O list\ filtru este asem\n\toare cu o list\ asociat\ entit\]ii.


Implicit, o entitate trebuie s\ corespund\ fiec\rei propriet\]i
din filtru pentru a putea fi ad\ugat\ la setul de selec]ie.
Exist\ [i alte metode de creare a listelor de tip filtru.

Comanda AutoCAD FILTER definit\ de fi[ierele filter.lsp [i


filter.dcl este `n general o interfa]\ bazat\ pe dialog la
func]ia ssget [i listele de tip filtru.

Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile
care urmeaz\.

Crea]i un set de selec]ie format din entit\]ile de tip Line din


desen.
Command: (setq ss1 (ssget "X" '((0 . "LINE"))))
<Selection set: 4>
{terge]i toate entit\]ile de tip Line din desen.
Command: (command ".erase" ss1 "")
Reface]i obiectele [terse.
Command: oops
Seta]i variabila ss1 pe nil [i elibera]i resursele folosite curent
de setul de selec]ie.
Command: (setq ss1 nil)
nil

•214
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Lungimea unui set de selec]ie


Func]ia sslength cere un singur argument: un set de selec]ie
valid. Func]ia returneaz\ num\rul de nume al entit\]ilor din
setul de selec]ie.

Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile
care urmeaz\.

Crea]i un set de selec]ie din trei (3) entit\]i.


Command: (setq ss1 (ssget))
Select objects: pick three objects
Select objects: Enter
<Selection set: 5>
Folosi]i func]ia sslength pentru a verifica num\rul de entit\]i
din setul de selec]ie.
Command: (sslength ss1)
3
Seta]i variabila ss1 pe nil [i elibera]i resursele folosite curent
de setul de selec]ie.
Command: (setq ss1 nil)
nil

50793936.doc R.2.1 2/3/2011 •215


AUTODESK, INC.

Numele entit\]ilor dintr-un set de selec]ie


Un set de selec]ie este un grup format din nume de entit\]i
AutoCAD. Func]ia ssname poate stabili numele oric\rei
entit\]i dintr-un set de selec]ie.

Func]ia ssname cere dou\ argumente: un set de selec]ie


valid [i un num\r `ntreg. Num\rul `ntreg corespunde unui
index 0 al numelui entit\]ii din setul de selec]ie.

Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile
care urmeaz\.

Crea]i un set de selec]ie din trei entit\]i.


Command: (setq ss1 (ssget))
Select objects: pick three objects
Select objects: Enter
<Selection set: 6>
Folosi]i ssname pentru a returna numele fiec\rei entit\]i din
setul de selec]ie.

Folosi]i entget pentru a returna lista asociat\ fiec\rei entit\]i.


Command: (setq ename (ssname ss1 0))
<Entity name: xxxxxxxx>

Command: (entget ename)

Command: (setq ename (ssname ss1 1))


<Entity name: xxxxxxxx>

Command: (entget ename)

Command: (setq ename (ssname ss1 2))


<Entity name: xxxxxxxx>

Command: (entget ename)


Seta]i variabila ss1 pe nil [i elibera]i resursele folosite curent
de setul de selec]ie.
Command: (setq ss1 nil)
nil

•216
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare
• Grupurile de entit\]i pot fi plasate `n seturi de selec]ie.

• Un set de selec]ie `n AutoLISP are un tip de date PICKSET.


Setul de selec]ie nu este o list\.

• AutoLISP poate men]ine 128 de seturi de selec]ie


deschise `n acela[i timp.

• Lega]i o variabil\ ori de c`te ori crea]i un set de


selec]ie.

• Elibera]i `ntotdeauna resursele folosite de un set de


selec]ie dup\ ce a]i terminat de lucrat cu acesta.

• Func]ia ssget poate crea un set de selec]ie `n diferite


moduri.

• Func]ia sslength returneaz\ num\rul de entit\]i din setul


de selec]ie.

• Func]ia ssname returneaz\ numele entit\]ii din setul de


selec]ie.

50793936.doc R.2.1 2/3/2011 •217


AUTODESK, INC.

EXERCITIUL33: CREAREA INTERACTIVA A SETURILOR DE SELECTIE

~n acest exerci]iu:

• Ve]i aprofunda cuno[tin]ele despre seturile de selec]ie


din AutoLISP.

• Ve]i folosi func]ia ssget.

• Ve]i ob]ine un set de selec]ie interactiv de la utilizator.


• Ve]i accesa entit\]ile dintr-un set de selec]ie.

Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg din directorul student.
2. ~n editorul de text deschide]i fi[ierul numit chdim.lsp din directorul
student.
3. Ad\uga]i codul care realizeaz\ urm\toarele:
• Crea]i o func]ie numit\ c:chdim.
• Cere]i utilizatorului un set de selec]ie.
• Explora]i fiecare entitate din setul de selec]ie.
• Transfera]i ficare list\ asociat\ entit\]ii ca argument
la func]ia chdim_mod.
• Elibera]i setul de selec]ie.
4. Salva]i fi[ierul chdim.lsp.
5. ~nc\rca]i fi[ierul `n AutoCAD [i `ncerca]i comanda CHDIM.
6. Ie[i]i din desen moddim f\r\ a salva modific\rile.
7. Dac\ ave]i timp v\ pute]i modifica programul astfel:
• Ad\uga]i o rutin\ de tratare a erorilor.
• Ad\uga]i un dic]ionar de date.
• Transforma]i variabilele corespunz\toare mai
degrab\ `n variabile locale dec`t `n variabile
globale.

•218
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(defun chdim_mod (elist)


(if ;if entity is a dimension...
(= "DIMENSION" (cdr (assoc 0 elist)))
(entmod ;modify it based on...
(subst
(cons 8 "DIM") ;substituting layer DIM...
(assoc 8 elist) ;for its current layer.
elist
)
)
)
)

50793936.doc R.2.1 2/3/2011 •219


AUTODESK, INC.

EXERCITIUL 34: SETURI DE SELECTIE CU FILTRU

Acesta este un exerci]iu op]ional.

Rezolva]i acest exerci]iu numai dac\ ave]i timp `n clas\.

Codul care urmeaz\, implementeaz\ o versiune a CHDIM care


este din punct de vedere func]ional echivalent\ cu
versiunea anterioar\. Aceast\ versiune folose[te un filtru
pentru set de selec]ie `n combina]ie cu o selec]ie interactiv\
de entit\]i cu scopul de a amplasa numai entit\]ile de tip
dimension `n setul de selec]ie.

Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg din directorul
student.

2. Crea]i un nou fi[ier `n editorul text numit chdim2.lsp.

3. Introduce]i codul care urmeaz\.

Acest cod creaz\ func]ia c:chdim2. CHDIM2 va cere


utilizatorului un set de selec]ie, va filtra toate entit\]ile cu
excep]ia entit\]ilor de tip dimension [i va schimba entit\]ile
pe layerul DIM.

(defun c:chdim2 ()

;get a selec]ion-set from user and filter out all but dimensions
(setq ss (ssget “X”((0 . "DIMENSION"))))

(if ;if no selec]ion-set, exit


(not ss)
(exit)
)

;change the layer


(command "._chprop" ss "" "LA" "DIM" "")

(setq ss nil) ;free selec]ion-set

(prin1) ;quiet exit


)
4. Salva]i fi[ierul chdim2.lsp.

5. ~nc\rca]i fi[ierul `n AutoCAD.

6. Activa]i comanda CHDIM2.

7. P\r\si]i desenul moddim f\r\ s\ face]i modific\ri.

•220
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

50793936.doc R.2.1 2/3/2011 •221


AUTODESK, INC.

Tabele [i nume de simboluri


Tabelele p\strez\ lista AutoCAD-ului cu nume de simboluri
cum ar fi : layere, defini]ii Block [i tipuri de linii.

Obiective
~n acest capitol ve]i studia:

• Tipuri diferite de tabele `ntr-un fi[ier grafic AutoCAD.

• Cum s\ citi]i fiecare intrare `ntr-un tabel AutoCAD.

• Cum s\ c\uta]i o intrare anume `ntr-un tabel AutoCAD.

Tabele `ntr-un desen


AutoCAD are 8 tabele diferite care pot fi accesate de
AutoLISP.
• • Block
• • Dimstyle
• • Layer
• • Ltype
• • Style
• • UCS
• • View
• • Vport
Fiecare tabel\ poate fi citit\ direct din AutoLISP. Fiecare `n
parte poate fi accesat\ secven]ial sau accesat\ pentru un
nume de simbol dat.

Func]iile AutoLISP care acceseaz\ tabelele AutoCAD pot


extrage datele asociate cu o tabel\ dar nu pot modifica o
tabel\ sau datele sale.

C\utarea secven]ial\ a tabelului layer


Func]ia tblnext scaneaz\ un tabel [i returneaz\ o list\ asociat\ care
con]ine datele unui obiect denumit din tabel sau returneaz\ nil
dac\ ultima instruc]iune din tabel a fost atins\.

Func]ia tblnext are o sintax\ ciudat\. Func]ia cere un argument: un


[ir care corespunde unuia dintre numele de tabele AutoCAD. Dac\
se adaug\ al doilea argument op]ional [i acesta nu este nil, atunci
func]ia tblnext returneaz\ primul nume de simbol din tabel; dac\
nu se adaug\ argumentul, func]ia returneaz\ simbolul cerut care
`l urmeaz\ pe cel returnat prin apelarea anterioar\ a func]iei
tblnext.

•222
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
Aceast\ expresie returneaz\ lista asociat\ pentru prima
intrare `n tabelul layer.
Command: (tblnext "LAYER" t)
((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))
Lista asociat\ este o list\ cu perechi cu punct, a c\rei cod
este realizat `n acela[i mod `n care s`nt realizate codurile
pentru liste asociate entit\]ilor. Deoarece nu lucr\m cu
entit\]i individuale, este clar c\ aceast\ list\ asociat\ nu are
un grup -1 reprezent`nd un nume de entitate.

Vezi anexa B din AutoLISP Programmer’s Reference Manual,


"Block and Table Group Codes", pentru o descriere complet\
a codurilor din lista asociat\ layerelor.

Exemplu
Dac\ un desen ar con]ine layerele din tabelul de mai jos,
atunci s-expresiile care urmeaz\ ar returna listele asociate
ar\tate mai jos.
Layer Stare Culoare Tipul de linie

0 Dezghetat, On 7 sau alb continuu

DIM Dezghetat, Off 2 sau galben continuu

HIDDEN Inghetat, Off 5 sau albastru ascuns

OBJECT Dezghetat, On 1 sau rosu continuu

Tabelul 31. Lista de layere si proprietati care ilustreaza valorile returnate de


functia tblnext
Command: (tblnext "LAYER" t)
((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

Command: (tblnext "LAYER")


((0 . "LAYER") (2 . "DIM") (70 . 0) (62 . -2) (6 . "CONTINUOUS"))

Command: (tblnext "LAYER")


((0 . "LAYER") (2 . "HIDDEN") (70 . 1) (62 . -5) (6 . "HIDDEN"))

Command: (tblnext "LAYER")


((0 . "LAYER") (2 . "OBJECT") (70 . 0) (62 . 1) (6 . "CONTINUOUS"))

Command: (tblnext "LAYER")


nil

50793936.doc R.2.1 2/3/2011 •223


AUTODESK, INC.

O bucl\ care returneaz\ listele asociate pentru toate


numele de simboluri dintr-un tabel este u[or de
implementat. Acest fragment de cod tip\re[te lista asociat\
pentru fiecare nume de simbol din tabelul layer.

(setq tlist (tblnext "LAYER" t))

(while
tlist
(print tlist)
(setq tlist (tblnext "LAYER"))
)

•224
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 35: CAUTAREA INTR-O TABELA

~n acest exerci]iu :

• Ve]i consolida cuno[tin]ele despre tabele.

• Ve]i crea o nou\ func]ie care scaneaz\ fiecare intrare din


tabel.

• Ve]i tip\ri numele fiec\rui simbol `n tabel.

Etape de lucru
1. Deschide]i desenul moddim.dwg `n directorul student.

2. ~ntr-un fi[ier nou din editorul text, introduce]i codul care


urmeaz\. Acesta implementeaz\ func]ia c:tlist.

TLIST cere utilizatorului un cod care corespunde unuia dintre


tabelele AutoCAD iar apoi scaneaz\ tabelul secven]ial
folosind func]ia tblnext [i tip\re[te numele fiec\rui simbol `n
tabel.
(defun c:tlist ()

;set up list of keywords for user prompt


(initget "Block Dimstyle LAyer LType Style Ucs View VPort")

(setq ttype ;get table type from user


(getkword "\nBlock/Dimstyle/LAyer/LType/Style/Ucs/View/VPort: ")
)

(if ;if user pressed return, exit


(not ttype)
(exit)
)

(setq tlist (tblnext ttype t)) ;get first entry `n table

(while ;while we have a valid entry...


tlist ;in the table...
(print (cdr (assoc 2 tlist))) ;print its name...
(setq tlist (tblnext ttype)) ;get the next entry...

(prin1) ;quiet exit


)

3. Salva]i fi[ierul ca tlist.lsp `n directorul student.

4. ~nc\rca]i programul `n AutoCAD.

5. Activa]i comanda TLIST.

50793936.doc R.2.1 2/3/2011 •225


AUTODESK, INC.

C\utarea unui nume de simbol


Func]ia tblsearch va c\uta un nume de simbol `ntr-un tabel.
Func]ia cere dou\ argumente: un [ir care corespunde unui
tabel AutoCAD [i un [ir care corespunde numelui unui
simbol cerut.

Dac\ numele cerut nu exist\, func]ia tblsearch returneaz\ nil.

Exemplu
Aceast\ expresie caut\ layerul 0 [i-i returneaz\ lista asociat\.
Command: (tblsearch "LAYER" "0")
((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

Recapitulare
• AutoCAd p\streaz\ simbolurile cum ar fi layer-ele [i Block
Definitions `n tabele.

• Exist\ 8 tabele `n AutoCAD.

• Func]ia tblnext poate scana fiecare simbol din tabel.

• Func]ia tblsearch poate c\uta un anume simbol `ntr-un


tabel.

• Tabelele nu pot fi modificate direct de AutoLISP.

•226
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 36: CAUTAREA IN TABELA DE LAYER-E

~n acest exerci]iu:

• Ve]i folosi func]ia tblsearch.

• Ve]i c\uta `n tabela Layer numele layerului dat de


utilizator.

• Ve]i determina dac\ layerul exist\ [i ve]i informa


utilizatorul `n consecin]\.

Instruc]iuni
1. Deschide]i desenul moddim.dwg din directorul student.

2. ~ntr-un fi[ier nou din editorul de text introduce]i codul


care urmeaz\. Acesta implementeaz\ func]ia c:chklayer.

CHKLAYER cere utilizatorului numele layerului [i determin\


dac\ layerul exist\ `n desenul respectiv iar apoi tip\re[te un
mesaj adecvat pentru utilizator.
(defun c:chklayer ()

(setq lname ;get layer name from user


(getstring "\nName of layer: ")
)

(if
(tblsearch "LAYER" lname) ;layer exists?
(prompt (strcat "\nLayer " lname " exists. ")) ;yes
(prompt (strcat "\nLayer " lname " does not exist. ")) ;no
)

(prin1) ;quiet exit


)

3. Salva]i fi[ierul text ca chklayer:lsp `n directorul student.

4. ~nc\rca]i programul `n AutoCAD.

5. Activa]i comanda CHKLAYER.

50793936.doc R.2.1 2/3/2011 •227


AUTODESK, INC.

EXERCITIUL 37: EXERCITII SUPLIMENTARE CU TABELE

Acesta este un exerci]iu op]ional.

Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg `n directorul
student.

2. ~ntr-un fi[ier nou din directorul student scrie]i dou\


func]ii: c:chktable [i c:layerset.

3. Salva]i totul `ntr-un fi[ier. ~nc\rca]i func]iile `n AutoCAD


[i testa]i-le `n desenul moddim.

c:chktable
1. ~ntreab\ utilizatorul ce tabel\ s\ caute.

2. ~ntreab\ utilizatorul care este simbolul cautat.

3. Caut\ tabelul pentru simbolul c\utat.

4. Spune utilizatorului dac\ simbolul c\utat exist\.

c:layerset
1. ~ntreab\ utilizatorul care este numele layerului.

2. Dac\ layerul exist\, func]ia spune operatorului tipul de


linie [i culoarea atribuite layerului.

3. Dac\ layerul exist\, lega]i o variabil\ global\ de un set de


selec]ie format din toate entita]ile de pe layerul
respectiv.

•228
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 14: UN EXECITIU MAI COMPLEX DE CAUTARE IN TABELE

Acesta este un exerci]iu op]ional

Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg din directorul
student.

2. ~ntr-un fi[ier nou din editorul de text, introduce]i codul


care urmeaz\. Acesta implementeaz\ func]ia c:tsearch.

3. TSEARCH caut\ simbolul `ntr-un tabel [i dac\ simbolul


exist\ tip\re[te fiecare cod de grup [i valoare din lista
asociat\ simbolului.

50793936.doc R.2.1 2/3/2011 •229


AUTODESK, INC.

(defun c:tsearch ()

;set up list of keywords for user prompt


(initget "Block Dimstyle LAyer LType Style Ucs View VPort")

(setq ttype ;get table type from user


(getkword "\nBlock/Dimstyle/LAyer/LType/Style/Ucs/View/VPort: ")
)

(if ;if user pressed return, exit


(not ttype)
(exit)
)

(setq ttarget ;get target search name


(getstring (strcat "\n" ttype " table entry: "))
)

(if ;if user pressed return, exit


(not ttarget)
(exit)
)

(setq tlist (tblsearch ttype ttarget));get list for target...


;from its table.

(if
(not tlist) ;if no list, then target...
(progn ;was not found, so exit.
(prompt "\nNo such entry.")
(exit)
)
)

(while
tlist ;while we still have a list...
(print (car (car tlist))) ;print first group code...
(print (cdr (car tlist))) ;and value from assoc list...
(setq tlist (cdr tlist)) ;then truncate assoc list.
)

(prin1) ;quiet exit


)
4. Salva]i fi[ierul text ca tsearch.lsp `n directorul student.

5. ~nc\rca]i programul `n AutoCAD [i testa]i comanda


TSEARCH .

•230
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Fi[iere script [i AutoLISP


Dac\ vre]i s\ folosi]i un program AutoLISP pentru a procesa
c`teva desene `n editor, pe r`nd, probabil ve]i combina un
program AutoLISP cu un fi[ier script pentru o procesare
automat\.

AutoLISP se ini]ializeaz\ la fiecare nou\ sesiune de editare,


adic\ ori de c`te ori `ncepe]i un nou desen sau edita]i unul
deja existent. Ini]ializarea elibereaz\ zona de memorie
destinat\ AutoLISP-ului [terg`nd toate func]iile definite de
utilizator [i de aplica]ii, [i variabilele din proces.

S\ presupunem c\ avem o func]ie AutoLISP definit\ dup\ cum


urmeaz\. Ce se `nt`mpl\ c`nd aceast\ func]ie este `n
ac]iune?
Command: (defun c:my_new () (command "._new" ""))
C:MY_NEW
Command: my_new
Command: ._new File name:
Command: !c:my_new
nil
C:MY_NEW apeleaz\ comanda AutoCAD NEW [i `ncepe un nou
desen. Dup\ ce editorul grafic a fost ini]ializat, verific\m
setarea fun]iei C:MY_NEW... [i vedem c\ este nil. Acest lucru
se datoreaz\ faptului c\ AutoLISP este `ntotdeauna ini]ializat
`mpreun\ cu editorul grafic.

Cu alte cuvinte, orice func]ie AutoLISP care recicleaz\


editorul grafic se autodistruge.

Pentru a rezolva aceast\ problem\, pute]i folosi fi[iere script


`n combina]ie cu programe AutoLISP pentru a procesa mai
multe desene cu acela[i cod AutoLISP. Fi[ierul script
re`ncarc\ [i apeleaz\ programul AutoLISP la fiecare nou
desen. Codul AutoLISP scrie fi[ierul script, define[te func]ia
pentru a fi apelat\ din fi[ierul script [i apeleaz\ fi[ierul script.

Iat\ un exemplu tipic.

Dorim s\ proces\m toate fi[ierele grafice din directorul


student/batchdwg cu un program AutoLISP care tip\re[te un
raport ce cuprinde num\rul de Block Definitions din desen [i
numele lor. (Acest exerci]iu presupune c\ un astfel de
director cu fi[iere grafice exist\ deja `n computer.)

Fi[ierul program run.lsp define[te dou\ func]ii AutoLISP:


C:RUN [i C:RUN_REPORT.

50793936.doc R.2.1 2/3/2011 •231


AUTODESK, INC.

C:RUN execut\ urm\toarele activit\]i `n ordine.

• V\ asigur\ c\ aplica]ia ADS XDOS este `nc\rcat\.

• Cere un nume de director de la utilizator.

• Cere o list\ cu toate fi[ierele grafice din director.

• Scrie un fi[ier script care deschide fiecare desen,


re`ncarc\ run.lsp [i apeleaz\ func]ia C:RUN_REPORT
pentru fiecare desen.

• Apeleaz\ fi[ierul script.

Func]ia C:RUN_REPORT scrie un fi[ier raport pentru fiecare


desen care con]ine Block Definitions. Fi[ierul raport are
acela[i nume ca [i desenul cu o extensie .rpt [i se afl\ `n
acela[i director ca [i desenul. Func]ia listeaz\ numele
fiec\rui Block `n desen [i de c`te ori Block a fost inserat.

c:run folose[te func]ia dosdir din fi[ierul xdos.exe, o aplica]ie


ADS real mode pentru ACAD R12 care se afl\ `n
CompuServe ACAD Forum `n Library 2. xdos este `n
directorul student din computerul dvs. Instruc]iunile de
folosire a acestei func]ii se afl\ `n fi[ierul xdos.txt.

~ntr-un desen nou, folosi]i comanda definit\ `n run.lsp.


Urma]i instruc]iunile de mai jos.
Command: (load "run")
C:RUN_REPORT
Command: run
Dup\ ce ultimul desen a fost procesat, examina]i con]inutul
urm\toarelor trei fi[iere:
• • d:\student\run.scr
• • d:\student\batchdwg\block5.rpt
• • d:\student\batchdwg\block10.rpt

•232
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(defun C:RUN ()

(if
(not (member "DOSDIR" (atoms-family 1))) ;Check for dosdir
function.
(if ;If not there, attempt
to
(= "bad" (xload "XDOS.EXE" "bad")) ;load XDOS program; exit
(progn ;if attempt fails.
(prompt "\nCan't load XDOS.EXE.")
(exit)
)
)
)

(setq dwgdir (getstring "\nDirectory: ")) ;Get directory from


user.

(setq dwgnames ;Get list of drawings.


(dosdir (strcat dwgdir "\\" "*.dwg") 0)
)

(setq fp (open "run.scr" "w")) ;Open file run.scr for


;writing `n current dir.

;The script commands will open each drawing `n turn, load the
;file run.lsp and apply the run_report command to each file.

(foreach a dwgnames ;Write script file.


(progn
(princ "(if (= 0 (getvar \"DBMOD\")) (command \"._OPEN\")" fp)
(princ "(command \"._OPEN\" \"N\"))\n" fp)
(princ (strcat dwgdir "\\" a "\n") fp)
(princ "(load \"run.lsp\")\n" fp)
(princ "run_report\n" fp)
)
)

(setq fp (close fp)) ;Close run.scr file.

(command "._SCRIPT" "run") ;Call script as last


; expression.
)

(defun C:RUN_REPORT ()

(setq block_name_list nil) ;Initialize list of Block names.

(if
(setq block_table_list (tblnext "BLOCK" t)) ;We have a Block?
(progn
(prompt "\nFinding Block names.") ;Keep the customer happy.
(while ;Add its name to the list and
block_table_list ;get the next one.
(setq block_name (cdr (assoc 2 block_table_list)))
(setq block_name_list (cons block_name block_name_list))
(setq block_table_list (tblnext "BLOCK"))
)

;Sort the list of Block names.


(setq block_name_list (acad_strlsort block_name_list))

;Get the number of Insert entities for each Block.

50793936.doc R.2.1 2/3/2011 •233


AUTODESK, INC.

;Create a list of dotted pairs. Each dotted pair consists


;of a Block name and the number of Insert entities.

(prompt "\nFinding INSERT entities.") ;Keep the customer


happy.
(setq report_list nil count 0) ;Initialize the list and
counter.
(repeat ;For all the Block names...
(length block_name_list) ;find how many INSERT entities.
(setq block_name (nth count block_name_list))
(setq s_set ;Returns selec]ion-set of all
(ssget "X" ;the INSERT entities of the
(list ;current block_name.
(cons 0 "INSERT")
(cons 2 block_name)
)
)
)
(setq ;Add a dotted pair of the form
report_list ;("BLOCK_NAME" . "NUMBER") to
(cons ;the report_list.
(cons
block_name
(if ;If, for example, the Block
"DOOR"
s_set ;is not inserted `n this
drawing,
(itoa (sslength s_set)) ;add the dotted pair ("DOOR" .
"0").
"0"
)
)
report_list
)
)
(setq count (1+ count)) ;Next Block name.
(princ ".") ;Keep the customer happy.
)

(setq report_list (reverse report_list)) ;Reverse report list.

(setq s_set nil) ;Free selec]ion-set.

;Print report to disk file dwgname.rpt.

(prompt "\nWriting report to disk.")


(setq fp (open (strcat (getvar "DWGNAME") ".rpt") "w"))

(write-line (strcat "Drawing " (getvar "DWGNAME") "\n") fp)


(write-line "Block names # of insertions"
fp)
(write-line "=========== ==============="
fp)

(setq count 0) ;First Block name.


(repeat
(length report_list) ;Get 'em all...
(setq block_name
(car (nth count report_list))
insert_number
(cdr (nth count report_list))
)
(setq spacer "") ;Calculate number of spaces to 36th

•234
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(repeat ;character from end of Block name.


(- 36 (strlen block_name))
(setq spacer (strcat " " spacer))
)
(write-line ;Write Block name, spaces to the
(strcat ;36th character, and the number of
block_name ;INSERT entities for that Block.
spacer
insert_number
)
fp
)
(setq count (1+ count)) ;Next block name.
)
(setq fp (close fp)) ;Close dwgname.rpt file.
)
)
(prin1) ;Quiet exit.
)

50793936.doc R.2.1 2/3/2011 •235


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•236
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la Polilinii
Poliliniile s`nt entit\]i complexe. Ele s`nt formate dintr-o
entitate principal\ de tip "POYLINE" urmat\ de una sau mai
multe entit\]i de tip "VERTEX " terminate de o entitate de tip
"SEQUEND". Aceast\ diagram\ ilustreaz\ lan]ul de entit\]i [i
numele lor.

POLYLINE SEQEND

Main entity Sub entity

Next entity name: Next entity name:

VERTEX Next main entity


in database

VERTEX

Sub entity

Next entity name:

VERTEX
or
SEQEND

Figura 47.Relatia dintre polyline ca entitate principala si subentitati

~n afara acces\rii entit\]ilor principale ne[terse din baza de


date, func]ia entnext va accesa subentit\]ile unei Polilinii [i
atributele entit\]ilor Insert. Acest capitol ilustreaz\ acest
principiu cu ajutorul unei func]ii care:

• Cere utilizatorului s\ selecteze o polilinie.

• Acceseaz\ subentita]ile unei polilinii.

• Vizualizeaz\ un raport despre fiecare entitate pe display.

• Iese atunci c`nd a ajuns la cap\tul poliliniei.

50793936.doc R.2.1 2/3/2011 •237


AUTODESK, INC.

(defun c:polylist ()

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)

(setq epick (entsel "\nSelect polyline: "))


;select an entity
(if
(not epick) ;if no entity selected, exit
(exit)
)

(setq ename (car epick)) ;get entity name


(setq elist (entget ename)) ;get association list
(setq etype (cdr (assoc 0 elist))) ;store entity type

(if
(/= "POLYLINE" etype) ;if not a Polyline, exit
(progn
(prompt "\nNot a polyline.")
(exit)
)
)

(while ;while we have an entity name


(and ;and it's not the end of the
ename ;Polyline...
(/= "SEQEND" etype)
)
(princ "\nEntity type: ") ;print the entity type
(princ etype)

(if ;if it's a Vertex entity...


(= "VERTEX" etype) ;get its group 70 flags and
(progn ;location, and print location
(setq vflags (cdr (assoc 70 elist)))
(setq pt (cdr (assoc 10 elist)))
(princ "\nLocation: ")
(princ (car pt))
(princ " ")
(princ (car (cdr pt)))
(princ " ")
(princ (car (cdr (cdr pt))))
(if ;check each flag and print
(= 1 (logand 1 vflags)) ;each if true
(princ "\nVertex inserted by curve-fitting.")
)
(if
(= 2 (logand 2 vflags))

•238
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(princ "\nCurve-fit tangent defined for this vertex.")


)
(if
(= 8 (logand 8 vflags))
(princ "\nSpline vertex created by spline-fitting.")
)
(if
(= 16 (logand 16 vflags))
(princ "\nSpline frame control point.")
)
(if
(= 32 (logand 32 vflags))
(princ "\n3D Polyline vertex.")
)
(if
(= 64 (logand 64 vflags))
(princ "\n3D Polyline mesh vertex.")
)
(if
(= 128 (logand 128 vflags))
(princ "\nPolyface mesh vertex.")
)
)
)
;stop screen from scrolling
(getstring "\n\nPress RETURN to continue...")

(setq ename (entnext ename)) ;get next entity `n Polyline

(if ;if we have an entity name...


ename ;get its assocation list and
(progn ;entity type
(setq elist (entget ename))
(setq etype (cdr (assoc 0 elist)))
)
)

)
(setq *error* old_error) ;restore old error handler
(prin1) ;quiet exit
)

50793936.doc R.2.1 2/3/2011 •239


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•240
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la Block Definitions


Block Definitions s`nt entit\]i complexe. O entitate principal\
de tip "BLOCK" cu un nume unic este p\strat\ `n tabela
AutoCAD Block. Aceast\ entitate este urmat\ de una sau mai
multe entit\]i de orice tip, terminat\ cu o entitate de tip
"ENDBLK". Aceast\ diagram\ ilustreaz\ lan]ul de entit\]i [i
numele entit\]ilor.

Block Table ENDBLK

Named object Sub entity

Next entity name: Next entity name:


Any type None

Next sub entity

Any type

Next entity name:


Any type

Figura 48. Relatia dintre intrarea in tabela Block si subentitatile acestuia.

Func]ia entnext acceseaz\ subentit\]ile din defini]iile Block.


Acest capitol ilustreaz\ acest principiu printr-o func]ie care:

• Cere utilizatorului s\ selecteze o entitate Insert care se


refer\ la Block Definition.

• Acceseaz\ Block Definition `n cadrul tabelei Block.

• Acceseaz\ subentit\]ile din Block Definition

• Tip\re[te lista asociat\ fiec\rei subentit\]i pe display.

• Iese c`nd ajunge la cap\tul entit\]ii Block Definition.

50793936.doc R.2.1 2/3/2011 •241


AUTODESK, INC.

(defun c:blklist (/ blist bname elist ename epick etype)

;blist Association list from Block table


;bname Name of Block Definition
;elist Entity association list
;ename Entity name
;epick List returned by entsel
;etype Entity type as string
;old_error Default error handler

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)

(setq epick (entsel "\nSelect block: "))


;select an entity
(if
(not epick) ;if no entity selected, exit
(exit)
)

(setq ename (car epick)) ;get entity name


(setq elist (entget ename)) ;get association list
(setq etype (cdr (assoc 0 elist))) ;store entity type

(if
(/= "INSERT" etype) ;if not an Insert, exit
(progn
(prompt "\nNot a block.")
(exit)
)
)

(setq bname (cdr (assoc 2 elist))) ;get name of Block Definition

(setq blist (tblsearch "BLOCK" bname));get its assoc list

(setq ename (cdr (assoc -2 blist))) ;get first entity `n Block


(setq elist (entget ename)) ;get its assoc list
(setq etype (cdr (assoc 0 elist))) ;store entity type

(while ;while we have an entity name


(and ;and it's not the end of the
ename ;Block Definition...
(/= "ENDBLK" etype)
)

(print elist) ;print entity's assoc list

•242
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

;stop screen from scrolling


(getstring "\n\nPress RETURN to continue...")

(setq ename (entnext ename)) ;get next entity `n Block

(if ;if we have an entity name...


ename ;get its assocation list and
(progn ;entity type
(setq elist (entget ename))
(setq etype (cdr (assoc 0 elist)))
)
)

)
(setq *error* old_error) ;restore old error handler
(prin1) ;quiet exit
)

50793936.doc R.2.1 2/3/2011 •243


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•244
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Crearea entit\]ilor Line cu func]ia entmake


Func]ia entmake creaz\ noi entit\]i AutoCAD f\r\ s\ foloseasc\
comenzi AutoCAD de tip LINE, ARC, CIRCLE. Func]ia entmake
adaug\ entit\]i noi direct `n baza de date.

Func]ia entmake cere un argument: o list\ asociat\ entit\]ii.


Func]ia returneaz\ lista asociat\ entit\]ii `n `ntregime dac\
reu[e[te s\ creeze o entitate, altfel returneaz\ nil.

Lista asociat\ folosit\ ca argument trebuie s\ con]in\ toate


informa]iile necesare pentru a defini entitatea. Defini]ii
op]ionale, cum ar fi layerul implicit, s`nt omise din lista
asociat\.

De exemplu, fiecare dintre aceste expresii creaz\ o entitate


Line `n WCS pe Layerul 0 de la 1,1,0 la 5,5,0.

Exemplul 1
(entmake
'(
(0 . "LINE")
(8 . "0")
(10 1.0 1.0 0.0)
(11 5.0 5.0 0.0)
(210 0.0 0.0 1.0)
)
)

Exemplul 2
(entmake
(list
(cons 0 "LINE")
(cons 8 "0")
(list 10 1.0 1.0 0.0)
(list 11 5.0 5.0 0.0)
(list 210 0.0 0.0 1.0)
)
)

50793936.doc R.2.1 2/3/2011 •245


AUTODESK, INC.

EXERCITIUL 39: CREAREA UNEI LINII CU ENTMAKE

Crea]i o func]ie numit\ c:xline `ntr-un fi[ier text numit


xline.lsp `n directorul student

Comanda XLINE ar trebui s\ fac\ urm\toarele:


• S\ cear\ utilizatorului un punct de start.
• S\ cear\ utilizatorului un punct de sf`r[it.
• S\ creeze o entitate de tip Line `n baza de date
prin apelarea func]iei entmake.
• S\ deseneze linia `ntre cele dou\ puncte pe layerul
curent.

•246
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Crearea entit\]ilor Polylines si Block Definitions cu


func]ia entmake
Entit\]i complexe cum s`nt poliliniile, defini]iile de Block [i
entit\]ile Insert atribute pot fi definite prin apelarea de
c`teva ori a func]iei entmake care s\ le defineasc\
subentit\]ile.

De `ndat\ ce AutoCAD vede c\ func]ia entmake creaz\ o


entitate complex\, acesta creaz\ un fi[ier temporar `n care
pastreaz\ toate datele defini]iilor. Dup\ definirea entit\]ii
prin apelarea func]iei entmake), AutoCAD creaz\ [i adaug\ o
entitate de cap\t (o entitate SEQEND pentru o polilinie sau o
entitate BLKEND pentru o defini]ie Block), desfiin]eaz\ fi[ierul
temporar [i, `n cazul defini]iei Block, returneaz\ numele
Blockului care a fost definit [i nu lista asociat\ entita]ii
definite.

Polylines
Expresiile care urmeaz\ creaz\ o entitate de tip polilinie pe
layerul curent [i UCS cu o eleva]ie 0 [i dou\ vertexuri la
1,1,0 [i 5,5,0.
(entmake
(list
(cons 0 "POLYLINE")
(cons 66 1)
(list 10 0.0 0.0 0.0)
)
)

(entmake
(list
(cons 0 "VERTEX")
(list 10 1.0 1.0 0.0)
)
)

(entmake
(list
(cons 0 "VERTEX")
(list 10 5.0 5.0 0.0)
)
)

(entmake
(list
(cons 0 "SEQEND")
)
)

Blocks
Expresiile care urmeaz\ creaz\ o defini]ie Block numit\
myblock `n tabelul Block. Defini]ia are un punct de baz\ de
5,5,0 [i este format\ din urm\toarele entit\]i:

50793936.doc R.2.1 2/3/2011 •247


AUTODESK, INC.

• O entitate de tip Line pe layerul curent [i UCS de la 5,5,0


la 10,1,0.

• O entitate de tip Circle pe layerul curent [i UCS la 5,5,0


cu o raz\ de 1.0.
(entmake
(list
(cons 0 "BLOCK")
(cons 2 "MYBLOCK")
(cons 70 0)
(list 10 0.0 0.0 0.0)
)
)

(entmake
(list
(cons 0 "LINE")
(list 10 5.0 5.0 0.0)
(list 11 10.0 1.0 0.0)
)
)

(entmake
(list
(cons 0 "CIRCLE")
(list 10 5.0 5.0 0.0)
(cons 40 1.0)
)
)

(entmake
(list
(cons 0 "ENDBLK")
)
)

•248
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 40: CREAREA UNEI POLILINII CU FUNCTIA ENTMAKE

1. Crea]i o func]ie numit\ c:polymake `ntr-un nou fi[ier text


numit polymake.lsp `n directorul student.

Func]ia trebuie s\ fac\ urm\toarele:


• S\ fac\ o nou\ entitate de tip Polyline cu func]ia
entmake.
• S\ introduc\ o bucl\.
• S\ cear\ utilizatorului un vertex.
• S\ apeleze func]ia entmake at`ta timp c`t utilizatorul
selecteaz\ un punct.
• S\ ias\ din bucla c`nd utilizatorul introduce o
valoare nul\.
• S\ termine de f\cut polilinia prin apelarea func]iei
entmake pentru inserarea entit\]ii SEQUEND.
2. Salva]i fi[ierul text.
3. ~nc\rca]i programul `n AutoCAD [i `ncerca]i comanda
POLYMAKE .

50793936.doc R.2.1 2/3/2011 •249


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•250
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Tratarea [irurilor
AutoLISP dispune de un set redus de func]ii care realizeaz\
opera]ii de baz\ pe [iruri: lungimea [irului, modificarea
caracterelor, concatenarea [i analiza.

Obiective
~n acest capitol ve]i studia:
• Cum s\ determina]i num\rul de caractere dintr-un
[ir.
• Cum s\ modifica]i caracterele dintr-un [ir.
• Cum s\ concatena]i dou\ sau mai multe [iruri.
• Cum s\ analiza]i un [ir, fiecare caracter pe r`nd.

Func]ia strlen
{irurile de tip text s`nt formate din 0 sau mai multe
caractere aflate `ntre semnele cit\rii duble (“). Un [ir cu nici
un caracter este reprezentat ca "", sau cu null string.

Func]ia strlen cere un singur [ir ca argument. Func]ia


returneaz\ lungimea unui [ir `n caractere ca un `ntreg.

Un spa]iu valoreaz\ c`t un caracter, caracterul escape este


echivalent cu "an".

Exemplu
Introduce]i expresiile care urmeaz\. Afla]i lungimea c`torva
[iruri de text.
.Command: (strlen "")
0

Command: (strlen "123456789")


9

Command: (strlen "1 3 5 7 9")


9

Command: (strlen "\nPoint:")


7

50793936.doc R.2.1 2/3/2011 •251


AUTODESK, INC.

Func]ia strcase
Func]ia strcase cere un argument [i un argument op]ional.
Primul argument trebuie s\ fie un [ir de tip text. Dac\ al
doilea argument este omis sau este nil, [irul cu toate
caracterele transformate `n litere mari este returnat; sau
dac\ al doilea argument este t, adic\ nu este nil, atunci se
returneaz\ [irul cu caracterele transformate `n litere mici.

Exemplu
Introduce]i expresiile care urmeaz\. Transforma]i
caracterele celor trei [iruri de tip text.
Command: (strcase "to upper")
"TO UPPER"

Command: (strcase "To Upper")


"TO UPPER"

Command: (strcase "to upper" nil)


"TO UPPER"

Command: (strcase "TO LOWER" t)


"to lower"

Func]ia strcat
Func]ia strcat cere unul sau mai multe argumente [i fiecare
dintre ele trebuie s\ fie un [ir de tip text. Func]ia returneaz\
un singur [ir text: rezultatul concaten\rii argumentelor.

Func]ia strcat, printre altele, este folositoare pentru a


formula cereri la utilizator. De exemplu, este posibil s\ fie
nevoie s\ cere]i utilizatorului ca a n-a instruc]iune dintr-un
grup de instruc]iuni s\ fie procesat\. Pentru aceasta trebuie
s\ lua]i num\rul n, sa-l transforma]i `ntr-un [ir, apoi s\-l
concatena]i cu restul.

Exemplu
Introduce]i expresiile care urmeaz\. Concatena]i cele dou\
[iruri.
Command: (setq x "one" y "two")
"two"

Command: (setq z (strcat x y))


"one two"

•252
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (setq z (strcat x x z y y))


"one one one two two two"

Exemplu
Introduce]i expresiile care urmeaz\. Formula]i o cerere
dintr-un [ir [i un num\r `ntreg.
Command: (setq index 1)
1
Command: (setq a "Processing object " b "...")
"..."
Command: (strcat a (itoa 1) b)
"Processing object 1..."

Analiza [irurilor
Pu]ine texte `n Lisp acord\ subiectului despre analiza
[irurilor importan]a cuvenit\. De[i pare ciudat, probabil v\
este mai comod s\ c\uta]i un text despre limbajul C cu
explica]ii [i exemple de analiz\ a [irului. Manualele The C
Programming Language de Brian Kernighan [i Dennis
Ritchiei, Programming `n C de Stephen G. Kochan [i
Advanced Turbo C de Herbert Schildt s`nt manuale care
acord\ cel pu]in un capitol [irurilor [i analizei [irurilor.

Analiza [irurilor simple, adic\ citirea pe r`nd a caracterelor


dintr-un [ir [i compararea acestora cu valori, este discutat\
`n urm\torul capitol destinat func]iei substr.

Func]ia substr
Func]ia substr cere trei argumente: un [ir de tip text, un
num\r `ntreg de indexare a caracterelor din [ir de la st`nga
la dreapta, [i un pas de incrementare a num\rului de
caractere spre dreapta [i inclusiv a caracterului indexat.

Func]ia substr returneaz\ un [ir care `ncepe cu caracterul


indexat din [ir [i se continu\ cu num\rul de caractere din
dreapta indexului indicat de al treilea argument.

Argumentul index `ncepe cu 1; adic\ primul caracter din [ir


are indexul 1.

De exemplu aceast\ expresie returneaz\ [irul "4".

50793936.doc R.2.1 2/3/2011 •253


AUTODESK, INC.

(substr "123456" 4 1)

Aceast\ expresie returneaz\ [irul "456".


(substr "123456" 4 3)

Formarea buclelor de program cu func]ia substr


Pentru a analiza caracterele unui [ir pe r`nd, ar trebui s\
apela]i func]ia substr aflat\ `ntr-o bucl\.

Un index al unui caracter dintr-un [ir este ini]ializat cu 1.


Bucla `ncepe [i se repet\ pentru fiecare caracter din [ir.
Fiecare caracter este returnat [i tip\rit separat [i indexul
incrementat cu 1 `n bucl\.
(setq index 1)
(setq string "Hello, world.")

(repeat
(strlen string)
(print (substr string index 1))
(setq index (1+ index))
)

Recapitulare
• strlen returneaz\ lungimea unui [ir `n caractere.
• Func]ia strcase poate returna un [ir de tip text a
c\rui caractere s`nt transformate `n litere mari
sau mici.
• Func]ia strcat concateneaz\ dou\ sau mai multe
[iruri.
• Analiza [irului `n AutoLISP se face cu func]ia substr.

•254
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 41: SIRURI SI ANALIZA LOR

~n acest exerci]iu:
• Ve]i concatena [iruri pentru a crea cereri la
utilizator.
• Ve]i folosi lungimea [irului pentru a determina de
c`te ori trebuie repetat\ o bucl\.
• Ve]i analiza toate caracterele dintr-un [ir, pe r`nd,
[i ve]i elimina toate spa]iile din [ir.

Etape de lucru
~n editorul de text crea]i un fi[ier nou numit nospace.lsp `n
directorul student.~n acest fi[ier crea]i o func]ie numit\
nospace . Aceast\ func]ie ar trebui s\ fac\ urmatoarele opera]ii
`n ordine.

1. S\ cear\ un argument: un [ir.

2. S\ seteze o variabil\ de indexare la 1.

3. S\ seteze o variabil\ de ie[ire la [irul nul "".

4. S\ `nceap\ o bucl\ care s\ se repete conform num\rului de


caractere din [ir.

5. S\ extrag\ un caracter din [ir de la pozi]ia curent\.

6. ~n cazul `n care caracterul este un spa]iu, acesta se


ignor\; dac\ nu, adaug\ caracterul la valoarea
concatenat\.

7. S\ incrementeze indexul cu 1.

8. S\ returneze variabila cu spa]iile eliminate.

50793936.doc R.2.1 2/3/2011 •255


AUTODESK, INC.

EXERCITIUL 41: ANALIZA SIRURILOR CU CARACTERE DE DELIMITARE

Pute]i rezolva acest exerci]iu dac\ Lotus® 1-2-3® [i


Microsoft® Excel s`nt instalate `n computerul dvs.

Generalit\]i
Programele de calcul tabelar cum s`nt programele Lotus 1-
2-3 [i Microsoft Excel pot scrie date `ntr-un fi[ier de tip text.
Fiecare linie din calculul tabelar reprezint\ un singur r`nd de
text `n fi[ierul de ie[ire. Coloanele dintr-un [ir s`nt separate
unele de altele printr-un caracter delimitator. Delimitatorul
este selectabil de c\tre utilizator [i de obicei lipsit de TAB
sau virgul\.

Programul prezentat mai jos implementeaz\ o func]ie


numit\ parse. Func]ia parse cite[te un singur r`nd de text
creat dup\ formatul descris mai sus. Func]ia returneaz\ o
lista de [iruri unde fiecare coloan\ dintr-un r`nd este tratat\
ca un [ir individual.

Func]ia parse cere trei argumente: [irul de analizat,


caracterul folosit ca delimitator `n interiorul [irului [i un
indicator de condi]ie care dac\ nu este nil va returna toate
pozi]iile unde apare delimitatorul care separ\ [irul `n lista
returnat\.

~mpreun\ cu func]ia parse este definit\ [i func]ia c:test_parse.


Func]ia TEST_PARSE cite[te o list\ de [iruri, le analizeaz\ pe
fiecare [i scrie rezultatul `ntr-un fi[ier asociat numit
testpars.txt `n directorul curent. Fiecare valoare returnat\ de
parse este testat\; dac\ apare o eroare, se scrie un mesaj `n
fi[ierul asociat.

Etape de lucru
1. Lansa]i programul de calcul tabelar.

2. ~n acest program deschide]i fi[ierul testpars.xls `n


directorul student.

3. Folosi]i comanda SAVE AS pentru a salva datele ca un


format text `ntr-un fi[ier. ~n programul Excel
comanda folose[te caracterul TAB ca delimitator.

4. ~nchide]i programul de calcul tabelar.

5. ~n editorul de text, examina]i formatul Text din fi[ier.

6. ~nc\rca]i programul parse.lsp `n AutoCAD.

•256
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

7. Activa]i comanda PARSETEXT [i urm\ri]i cererile.

8. PARSETEXT va analiza fiecare [ir din fi[ierul text [i va afi[a


pe display lista de [iruri returnat\ pentru fiecare r`nd de
c\tre func]ia parse.

; PARSE.LSP
; Version 1.0 3/29/93
;
; (parse str str expr)
;
; Parse a delimited text string and return a list of strings. Adds a
; null string between two sequential delimiters.
;
; Arguments:
;
; str (required) Text string to parse.
; str (required) Character used to delimit the string.
; expr (required) If t, return delimiter as a separate string.
;
; Local variables:
;
; char STR Current character from string.
; index INT Current location of character from string.
; rl LIST Return list of strings.
; sstr STR Current string to add to return list.
; strl INT Length of string.

(defun parse (str delim rd / char index rl sstr strl)

(setq ;initialize...
sstr "" ;string to place `n list
rl nil ;list to return
index 1 ;character index `n string
strl (strlen str) ;length of string
)

continuare pe pagina urmatoare

50793936.doc R.2.1 2/3/2011 •257


AUTODESK, INC.

(if ;if string length is zero


(zerop strl) ;return list with null string
'("")
(progn
(repeat ;repeat for the length of string
strl
(setq char (substr str index 1)) ;get a character
(cond
(
(= char delim) ;if it's a delimiter
(if ;and the string is null, it's
(= str "") ;line start or last was delim so
(setq rl (cons "" rl)) ;add null string to return list
(progn ;else
(setq rl (cons sstr rl)) ;add string to return list
(setq sstr "") ;then reinitialize string
)
)
(if ;if flag is true...
rd
(setq rl (cons char rl)) ;add delimiter to return list
)
(if ;if it's the last char `n string
(= index strl)
(setq rl (cons "" rl)) ;add null string to return list
)
)
(
t ;if we're here, just append the
(setq sstr (strcat sstr char)) ;current string to the char
(if
(= index strl) ;if it's the last char `n string
(progn
(setq rl (cons sstr rl)) ;add string to return list
)
)
)
);end cond

(setq index (1+ index)) ;increment the char index

);end repeat

(reverse rl) ;reverse the list to return so


the
;strings are `n original order
);end progn
);end if
)

continuare pe pagina urmatoare

•258
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

; TEST_PARSE.LSP
; Version 1.0 3/30/93
;
; test_parse
;
; Test the function (parse). Use two lists of strings with different
; delimiter characters: "\t" and ",". Test for both nil and t delimiter
; flag. Write test results to the log file TESTPARS.TXT `n the current
; directory. Write an error message with index every time (parse) fails
; to match a value `n a result list.
;
;
; Local variables:
;
; fp FILE Pointer to log file
; string STR Current string argument to parse
; t1 LIST List of strings to test
; t2 LIST List of strings to test
; t1_r1 LIST List of t1 results for nil delim flag
; t1_r2 LIST List of t1 results for t delim flag
; t2_r1 LIST List of t2 results for nil delim flag
; t2_r2 LIST List of t2 results for t delim flag

(defun c:test_parse (/ fp string t1 t1_r1 t1_r2 t2 t2_r1 t2_r2)


(setq
t1
'("" "\t" "a" "ab" "a\t" "\ta" "a\tb" "a\tb\t" "\ta\t" "\t\t")
t1_r1
'(("") ("" "") ("a") ("ab") ("a" "") ("" "a") ("a" "b") ("a" "b" "")
("" "a" "") ("" "" "")
)
t1_r2
'(("") ("" "\t" "") ("a") ("ab") ("a" "\t" "") ("" "\t" "a")
("a" "\t" "b") ("a" "\t" "b" "\t" "") ("" "\t" "a" "\t" "")
("" "\t" "" "\t" "")
)
t2
'("" "," "a" "ab" "a," ",a" "a,b" "a,b," ",a," ",,")
t2_r1
'(("") ("" "") ("a") ("ab") ("a" "") ("" "a") ("a" "b") ("a" "b" "")
("" "a" "") ("" "" "")
)
t2_r2
'(("") ("" "," "") ("a") ("ab") ("a" "," "") ("" "," "a")
("a" "," "b") ("a" "," "b" "," "") ("" "," "a" "," "")
("" "," "" "," "")
)
)

(setq fp (open "testpars.txt" "w"))

continuare pe pagina urmatoare

50793936.doc R.2.1 2/3/2011 •259


AUTODESK, INC.

(setq index 0)
(repeat
(length t1)
(setq string (nth index t1))
(print string fp)
(print (parse string "\t" nil) fp)
(print (parse string "\t" t) fp)
(if
(not
(equal
(setq x (parse string "\t" nil))
(setq y (nth index t1_r1))
)
)
(print
(strcat
"Test t1_r1 failed `n index " (itoa index) "."
)
fp
)
);end if
(if
(not
(equal
(parse string "\t" t)
(nth index t1_r2)
)
)
(print
(strcat
"Test t1_r2 failed `n index " (itoa index) "."
)
fp
)
);end if
(setq index (1+ index))
);end repeat

continuare pe pagina urmatoare

•260
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(setq index 0)
(repeat
(length t2)
(setq string (nth index t2))
(print string fp)
(print (parse string "," nil) fp)
(print (parse string "," t) fp)
(if
(not
(equal
(parse string "," nil)
(nth index t2_r1)
)
)
(print
(strcat
"Test t2_r1 failed `n index " (itoa index) "."
)
fp
)
);end if
(if
(not
(equal
(parse string "," t)
(nth index t2_r2)
)
)
(print
(strcat
"Test t2_r2 failed `n index " (itoa index) "."
)
fp
)
);end if
(setq index (1+ index))
);end repeat
(setq fp (close fp))
(prin1)
)

50793936.doc R.2.1 2/3/2011 •261


AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•262
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Pointere de entit\]i
Un pointer de entitate este un identificator unic [i
permanent pentru o entitate dintr-un desen AutoCAD.
Aplica]iile pot folosi pointere de entit\]i pentru a men]ine
leg\turi asociative `ntre entita]i sau `ntre entit\]i [i seturi
arbitrare de date `n timpul sesiunii de editare grafic\.

Obiective
~n acest capitol ve]i studia:
• Cum s\ activa]i sau s\ distruge]i pointerele de
entit\]i.
• Cum s\ extrage]i un pointer dintr-o list\ asociat\
entit\]ii.
• Cum s\ g\si]i o entitate cu ajutorul pointerului.

Formatul unui pointer de entitate


Pointerele de entita]i s`nt p\strate ca numere hexadecimale
exprimate sub forma unui [ir. De exemplu, primul pointer
atribuit entit\]ii `ntr-un desen poate fi "1" iar pointerul
treizeci [i unu poate fi "1F".

Pointerul unei entit\]i nu poate fi schimbat: poate fi numai


distrus. C`nd se [terge o entitate dintr-un desen, pointerul
ei este retras [i niciodat\ refolosit `n acel desen.

Lungimea maxim\ a unui [ir este de 16 caractere, ceea ce


`nseamn\ c\ num\rul maxim de pointere pentru un singur
desen este 264-1.

Pointerele s`nt p\strate `n codul de grup DXF cimpul 5 al


unei liste asociat\ entit\]ii.

Atribuirea de pointere entit\]ilor


Spunem c\ al 31-lea pointer atribuit entit\]ii ar putea fi "1F"
deoarece atribuirea pointerelor nu este `ntotdeauna
secven]ial\, de[i `ntotdeauna progreseaz\ de la mai mic la
mai mare. Este imposibil de prev\zut `n toate cazurile care
va fi urm\toarea atribuire pe care o va face AutoCAD-ul; de
aceea este necesar de stabilit `n mod explicit pointerul unei
entit\]i din lista asociat\ entit\]ii, dec`t s\ `ncerc\m s\ ghicim
ce pointer va atribui AutoCAD-ul entit\]ii.

50793936.doc R.2.1 2/3/2011 •263


AUTODESK, INC.

Activarea si dezactivarea pointerelor


Ac]iunea de atribuire a pointerelor este dezactivat\ `n
momentul `n care pointerele lipsesc. Comanda HANDLE ON
va activa pointerele permanent `n desenul curent.

Pointerele pot fi dezactivate. Deoarece prin aceasta se


poate dezactiva orice legatur\ `ntre entit\]ile AutoCAD [i de
bazele de date externe (de exemplu pointerele s`nt
folosite extensiv de c\tre AutoCAD SQL Extension),
pointerele pot fi distruse printr-un act deliberat din partea
utilizatorului.

Comanda HANDLES DESTROY <CONFIRMATION-STRING> va


dezactiva toate activit\]ile de atribuire a pointerelor `n
sesiunea curent\. <CONFIRMATION-STRING> este unul din cele
[ase [iruri posibile pe care le poate introduce utilizatorul.
AutoCAD genereaz\ unul dintre [iruri la `nt`mplare `n
timpul execu]iei comenzii; de aceea este imposibil de prezis
de care [ir este nevoie ca s\ confirme comanda.

Verificarea atribuirii pointerelor


Variabila de sistem HANDLES este setat\ la 1 c`nd pointerele
s`nt activate `n sesiunea curent\.

G\sirea unei entit\]i cu ajutorul pointerului


Func]ia handent cere un argument de tip [ir: pointerul unei
entit\]i. Dac\ unei entit\]i din sesiunea curent\ i se atribuie
un pointer, func]ia handent va returna numele entit\]ii; dac\
nu, va returna nil.

Exemplu
~ntr-o nou\ sesiune, introduce]i comenzile [i expresiile care
urmeaz\. Extrage]i un pointer de entitate [i stabili]i numele
entit\]ii folosind pointerul.

Activa]i pointerele `n sesiunea curent\.


Command: handles
Handles are disabled.
ON/DESTROY: on
Desena]i c`teva entit\]i Line.
Command: line
etc...
Extrage]i un pointer cu una din entit\]ile Line.

Command: (setq elist (entget (car (entsel))))


Select object: pick a line

•264
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (setq ehand (cdr (assoc 5 elist)))

Command: !ehand
"1B" (sau un [ir similar)

50793936.doc R.2.1 2/3/2011 •265


AUTODESK, INC.

Extrage]i numele entit\]ii folosindu-i pointerul.


Command: (setq ename (handent ehand))
<Entity name: xxxxxxxx>

Recapitulare
• Pointerele de entit\]i s`nt p\strate ca numere
hexazecimale exprimate sub form\ de [iruri.
• Pointerul nu poate fi schimbat niciodat\. El poate fi
numai distrus.
• Pointerele s`nt p\strate `n coduri DXF de grup 5
`ntr-o list\ asociat\ entit\]ii.
• Atribuirea de valori nu este `ntotdeauna
secven]ial\.
• Comanda HANDLES activeaz\ sau dezactiveaz\
pointerele.
• Func]ia handent va returna numele entit\]ii prin
pointerul entit\]ii.

•266
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 43: SALVAREA SETURILOR DE SELECTIE

~n acest exerci]iu:
• Ve]i folosi un program pentru a citi pointerele
entit\]ilor.
• Ve]i p\stra pointerele `ntr-un fi[ier extern.
• Ve]i citi fi[ierul extern [i ve]i crea un set de selec]ie
din pointerele entit\]ilor.
Programul savset.lsp din directorul student implementeaz\
dou\ comenzi pentru AutoCAD: SAVESET [i GETSET .

SAVESET p\streaz\ p`n\ la [ase seturi de selec]ie diferite


dintr-un desen [i permite ca acestea s\ fie folosite `n timpul
sesiunii de editare grafic\. SAVESET salveaz\ pointerele dintr-
un set de selec]ie `ntr-un fi[ier extern a c\rui nume este
<dwgname>.st<n>, unde <dwgname> este numele
desenului respectiv [i <n> este un num\r cuprins `ntre 1 [i
6.

GETSET cite[te pointerele entit\]ilor dintr-un fi[ier creat de


SAVESET [i construie[te setul de selec]ie anterior din
entit\]ile asociate cu pointerele.

Etape de lucru
P\stra]i seturile de selec]ie `n timpul sesiunii de editare prin
scrierea [i cititrea pointerelor `n/[i din fi[ierul extern.
• Deschide]i desenul ssget.lsp din directorul student.
• ~nc\rca]i programul savset.lsp `n AutoCAD.
• Folosi]i comanda SAVESET [i salva]i dou\ sau mai
multe seturi de selec]ie.
• Deschide]i o nou\ sesiune de editare grafic\ cu
ssget.
• ~nc\rca]i programul saveset.lsp.
• Folosi]i comanda GETSET pentru a extrage unul
dintre seturile de selec]ie p\strate.
• Folosi]i comanda MOVE cu setul de selec]ie
anterior.
• Deschide]i fi[ierul savset.lsp `n editorul de text [i
examina]i codul.

50793936.doc R.2.1 2/3/2011 •267


AUTODESK, INC.

EXECITIUL 44: UN MANAGER SIMPLU PENTRU FISIERELE TIP DWG

Acesta este un exerci]iu op]ional

Fi[ierul drawman.lsp din directorul student implementeaz\


un sistem de management pentru fi[iere tip dwg, foarte
simplu pentru a ilustra modul cum pot fi folosite pointerele.

Pute]i folosi comenzile din acest fi[ier urm`nd aceste etape:

1. ~nc\rca]i fi[ierul drawman.lsp `n AutoCAD.

2. Folosi]i comanda LOGIN.

3. Desena]i c`teva entit\]i.

4. Folosi]i comanda LOGOUT.

5. Folosi]i oricare dintre aceste comenzi pentru a afla


informa]ii despre entit\]ile pe care le-a]i desenat prin
leg\turi `ntre pointere [i atribute `ntr-un bloc inserat
aplica]iei.
FINGER
RLIST
SELUSER
SELECO

Aduce]i fi[ierul `n editorul de text [i studia]i-l. Codul este


scurt, u[or de `n]eles [i bine comentat.

•268