Introducere
in AutoLISP
Limbajul LISP (LISt Processing) a fost creat in anii (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 li 18218n137s sta 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 ).
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
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).
|