Sunteți pe pagina 1din 6

Introducere in AutoLISP

Limbajul LISP (LISt Processing) a fost creat in anii 50 (John McCarthy - 1958), fiind
destinat domeniului inteligentei artificiale. Modelul sau logico-matematic se bazeaza pe
calculul LAMBDA (elaborat in 1941, ca instrument in studiul teoretic al calculabilitatii).
AutoLISP este un dialect al limbajului XLISP (eXperimental LISP - David Betz).
Autodesk a ales LISP ca limbaj de programare in AutoCAD pentru ca are posibilitatea de
a lucra cu liste. De exemplu, coordonatele unui punct sunt continute intr-o lista. LISP-ul
poate manipula structuri oricat de complexe de date, structuri ce se construiesc dinamic,
in cursul
executiei programului. Datele sunt organizate in liste. Lista este o secventa oarecare de
elemente, care pot fi liste sau atomi. Atomii sunt obiectele primare cu care lucreaza LISP-
ul; pot fi simboluri, numere sau siruri de caractere. Grupurile de atomi formeaza liste,
care la randul lor pot fi grupate in alte liste. Acest mod de organizare a informatiei ofera o
mare flexibilitate programului, dar are dezavantajul consumului mai mare de memorie,
deoarece fiecare element din lista trebuie sa fie insotit de adresa elementului urmator.

Notatia folosita pentru liste este:

(a1 a2 ..... an) , unde a1...an sunt atomi sau alte elemente AutoLISP.

Tipuri de date folosite de AutoLISP

Simboluri
(symbols)
Sunt utilizate pentru memorarea unor valori. De exemplu, (setq s 1) atribuie simbolului
(variabilei) s valoarea 1.

Liste
(lists)
O lista este o colectie de simboluri, numere sau siruri. Coordonatele unui punct sunt
stocate intr-o lista de forma (x y z).
(1.0 2.0 3.0) este lista corespunzatoare punctului cu coordonatele (1,2,3).

Siruri
(strings)
Sirul este o colectie de caractere alfanumerice. Lungimea maxima a unei constante de tip
string este de 132 caractere. O variabila string de orice lungime poate fi creata folosind
functia strcat (concatenarea sirurilor).

Numere intregi
(integers)
Un intreg este un numar fara punct zecimal. Un intreg AutoLISP este un numar cu semn,
stocat pe 32 de biti. AutoCAD-ul nu intelege decat intregi de 16 biti, deci limiteaza
valoarea pe care AutoLISP-ul i-o poate transfera la 32767 si respectiv -32768. Pentru a
folosi intregi mai mari, se poate face conversia in numere reale.

Numere reale
(reals)
Sunt numere care contin punctul zecimal.
Ex: (setq a 1) - a este intreg
(setq a 1.0) - a este real

Descriptori de fisiere
(file descriptors)
Descriptorul de fisier este eticheta asignata unui pointer la fisierul respectiv.
Ex: (setq f (open "fis.ext" "r")) - f este descriptor de fisier

Nume de entitati
(entity names)
Entitatile AutoCAD pot fi referite prin AutoLISP, folosind eticheta numerica a acestora.
Ex: (setq e (entlast))
<Entity name: 60000016>

Multimi de selectie
(selection sets)
O multime de selectie este un grup de una sau mai multe entitati. Poate fi creata cu
functia AutoLISP ssget.
(setq m (ssget)) va produce prompterul:
Select objects:
La incheierea selectarii va returna: <Selection set: 1>

Functii
Functiile sunt folosite de AutoLISP pentru evaluarea listelor. Numele functiei este
totdeauna primul element al listei (este constructorul listei). Functii noi pot fi definite
folosind functia defun.

Variabilele AutoLISP

In AutoLISP exista patru tipuri de variabile: numere intregi (cu semn), numere reale,
puncte si siruri.
Exemple: intreg 1
real 1.0
punct 2D (1.1 10.5)
punct 3D (1.1 10.5 3.4)
sir "SIR"
Pi este un nume de variabila predefinit, dar utilizatorul poate sa-l redefineasca.
Tipul unei variabile se defineste implicit prin setarea variabilei respective.

Exemplu: (setq a 1) a este intreg


(setq a 1.0) a este real

Exista mai multe nivele la care poate fi utilizat AutoLISP-ul:

- utilizarea unor programe AutoLISP existente


- evaluarea de expresii AutoLISP in timpul unei sesiuni obisnuite de desenare
- scrierea programelor AutoLISP

AutoLISP preia controlul in momentul deschiderii unei paranteze, si il cedeaza la


inchiderea parantezei.

Evaluarea expresiilor AutoLISP

Inima interpretorului AutoLISP este evaluatorul. Acesta preia fiecare linie de la


dispozitivul de intrare (tastatura sau fisier) si returneaza rezultatul evaluarii ei, astfel:
- constantele, sirurile, descriptorii de fisiere si functiile returneaza propria lor valoare.
- simbolurile (variabilele) returneaza valoarea lor curenta.
- listele sunt evaluate in functie de primul element.

Utilizarea programelor AutoLISP

In pachetul AutoCAD sunt incluse multe fisiere cu extensia .LSP. Acestea contin
programe LISP, ce se pot incarca in cursul unei sesiuni de desenare cu load, astfel:

Command: (load "xplode")


C:XPLODE

De acum XPLODE este o comanda AutoCAD obisnuita.


Incarcarea automata a programelor LISP se poate face prin includerea fisierelor sau a
comenzilor de incarcare a acestora in fisierul ACAD.LSP. Acesta este incarcat automat la
pornirea AutoCAD-ului.
De exemplu, continutul fisierului ACAD.LSP poate fi:

(load "xplode")
(load "elist")
(load "3D")
(princ)

Se pot folosi programe AutoLISP in felul acesta, fara sa fie necesara cunoasterea
continutului lor.
Introducerea programelor de la tastatura

AutoLISP-ul este implementat printr-un interpretor, ceea ce permite introducerea


programelor de la tastatura, linie cu linie. Fiecare linie reprezinta o lista, care va fi
evaluata imediat dupa inchiderea ei, adica dupa inchiderea tuturor parantezelor deschise
in lista respectiva. AutoLISP semnalizeaza daca o paranteza a ramas deschisa prin

1>

sau pentru doua paranteze deschise

2> s.a.m.d.

Setarea unei variabile se face astfel:

Command: (setq a 1) - atribuie variabilei a valoarea intreaga 1.

Command: (setq a 1.0) - atribuie variabilei a valoarea reala 1.0

Se poate citi valoarea unei variabile prin apelarea numelui acesteia precedat de semnul
"!":

Command: !a
1.0
Putem folosi acest mod de apelare al variabilelor si in cadrul unei comenzi:

Command: (setq p1 '(0.0 0.0))


(0.0 0.0)
Command: (setq p2 '(10.0 10.0))
(10.0 10.0)
- pana aici am definit doua puncte 2D
- acum desenam o linie intre ele:

Command: LINE
From point: !p1
To point: !p2
To point: Enter

Pentru a folosi rezultatul evaluarii unei variabile AutoLISP intr-un text, variabila
TEXTEVAL trebui sa aiba valoarea 1, altfel "!" sau "(" vor fi tratate ca orice alt caracter.
Nu se poate folosi un nume de variabila pentru a inlocui o comanda AutoCAD.

Exemplu:

Command: (setq a "LINE")


"LINE"
Command: !a
"LINE"
- nu se executa comanda "LINE"; se evalueaza variabila a.

Evaluarea unei expresii se face astfel:

Command: (+ 1.0 1.0)


2.0
- 2 este rezultatul adunarii 1.0+1.0.

Scrierea programelor AutoLISP

Un program AutoLISP se scrie de obicei intr-un fisier, folosind un editor de texte care
produce fisiere ASCII.
Programul urmator defineste o functie AutoLISP care dupa incarcarea fisierului cu load
va putea fi utilizata ca o comanda AutoCAD cu numele ELIST. Rezultatul executiei sale
va fi lista corespunzatoare entitatii selectate.

;comanda de listare a continutului listei


;asociate unei entitati selectate

(defun c:elist()
(setq e (entsel))
(setq e (car e))
(setq l (entget e))
(setq nume (cdr (assoc '0 l)))
(if (= nume "POLYLINE") (progn
(setq n (getint "\nNumarul vertexului : "))
(repeat n
(setq e (entnext e))
)
))
(setq l (entget e))
)

Alt exemplu: selectarea tuturor entitatilor din desen care au culoarea rosie (cod 1):

(defun rosu()
(setq e (entnext))
(setq m (ssadd))
(while (/= e nil)
(setq l (entget e))
(setq color (cdr (assoc '62 l)))
(if (= color 1) (setq m (ssadd e m)))
(setq e (entnext e))
)
)

Apelarea acestei functii se face in felul urmator:

Command: (load "rosu")


ROSU
Command: (rosu)

Rezultatul executiei sale este crearea multimii de selectie m, care va contine toate
entitatile care au culoarea rosie (exceptandu-le pe cele aflate intr-un eventual layer cu
culoarea implicita 1).

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