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