Sunteți pe pagina 1din 371

Prof. univ. Dr. ing.

Constantin STţNCESCU

AutoLISP
Manual de programare

Editura FAST 2000


Bucureºti - 1996
Coperta: Bogdan STţNCESCU

 1996, FAST 2000


CP 39-119 Bucureºti
Str. Dimitrie Marinescu 52, Sector 2
Bucureºti - 73297
Tel/FAX: 250 - 6906

Editura, tipografia ºi autorul nu îºi asumã nici o rãspundere juridicã directã


sau indirectã pentru eventualele pierderi pricinuite celor care folosesc
informaþiile din aceastã carte, datoritã interpretãrii eronate, a aplicãrii superficiale,
sau chiar a unor greºeli de editare sau tipãrire.

AutoC AD, AutoLISP, ADI, ADS, ARX, ASE, DCL, DXF sunt mãrci înregistrate
ale firmei Autodesk, Inc., din SUA
Intel este marcã înregistratã a firmei Intel Corporation din SUA
IBM PC/XT/AT sunt mãrci înregistrate ale firmei International Business Machines Corporation din SUA
Microsoft, MS, MS-DOS, Windows sunt mãrci înregistrate ale firmei Microsoft Corporation din SUA
Cuprins

Prefaþã . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
0.1 Cui ne adresãm? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
0.2 De ce tocmai limbajul LISP? . . . . . . . . . . . . . . . . . . . . . . . . . . . .4

1. Primele noþiuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
1.1 AutoLISP, ADS, ARX ºi DCL . . . . . . . . . . . . . . . . . . . . . . . . . .5
1.2 ASE - alt cuvânt magic... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
1.3 Ce este un limbaj? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
1.4 Locul limbajului LISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
1.5 Ce înseamnã „interpretor“? . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
1.6 Filozofia limbajului AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . .10
1.7 Cum procedãm? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12
1.8 Volatilitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
1.9 Editorul Norton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18
1.9.1 Mutare cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20
1.9.2 Comenzi pe fiºiere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20
1.9.3 Comenzi de ºtergere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
1.9.4 Comenzi pe blocuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
1.9.5 Controlul formatului ecran . . . . . . . . . . . . . . . . . . . . . . . .23
1.9.6 Comenzi suplimentare . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
1.9.7 Comenzi de tipãrire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
1.9.8 Comenzi de cãutare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
1.9.9 Comenzi de cãutare ºi înlocuire . . . . . . . . . . . . . . . . . . . .26
ii Cuprins

2. Programare simplã în AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . .29


2.1 Elemente de limbaj AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . .29
2.2 Expresii AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
2.2.1 Expresii matematice . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
2.2.2 Funcþii ºir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
2.2.3 Expresii condiþionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
2.3 Funcþii de introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
2.4 Alte funcþii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
2.5 Un exemplu simplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48
2.6 Definirea funcþiilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52
2.7 Alt exemplu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60
2.8 Achiziþie de date cu AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . .66
2.9 Simboluri locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80
2.10 Selectarea de entitãþi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81
2.10.1 Aplicaþie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82

3. Fundalul de lucru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85


3.1 Tipuri de datã în AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . .85
3.2 Evaluatorul AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87
3.3 Convenþii lexicale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88
3.4 Convenþii de notare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
3.5 Tratarea erorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
3.6 Încãrcarea programelor ºi execuþia automatã . . . . . . . . . . . . .92
3.6.1 Biblioteci de funcþii ºi încãrcare automatã . . . . . . . . . . .92
3.6.2 Funcþii C:XXX - Adãugarea de comenzi la AutoCAD .93
3.6.3 Funcþii S::XXX - Execuþie automatã . . . . . . . . . . . . . . . .94
3.7 Funcþia ”command” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
3.8 Gestionarea memoriei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97
3.8.1 Recuperarea spaþiului node . . . . . . . . . . . . . . . . . . . . . . .98
3.8.2 Note tehnice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
3.8.2.1 Spaþiul ºir (string) . . . . . . . . . . . . . . . . . . . . . . . . . . .99
3.8.2.2 Stocarea simbolurilor . . . . . . . . . . . . . . . . . . . . . . .100
3.8.2.3 Alocarea manualã . . . . . . . . . . . . . . . . . . . . . . . . . .100
3.8.2.4 Paginarea funcþiilor virtuale . . . . . . . . . . . . . . . . .101
Cuprins iii

4. Mijloace avansate de programare . . . . . . . . . . . . . . . . . . . . . . . . . .105


4.1 Recursivitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105
4.2 Numere aleatoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .106
4.3 Dialog cu rãspuns ne-aºteptat . . . . . . . . . . . . . . . . . . . . . . . . .108
4.4 Prelucrarea listelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110
4.4.1 Eliminarea unui element dintr-o listã . . . . . . . . . . . . . .110
4.4.2 Ordonarea unei liste . . . . . . . . . . . . . . . . . . . . . . . . . . . .112
4.5 Acces la entitãþi ºi dispozitive . . . . . . . . . . . . . . . . . . . . . . . . .116
4.5.1 Tipuri speciale de datã . . . . . . . . . . . . . . . . . . . . . . . . . .117
4.5.2 Funcþii de manipulare a mulþimilor de selecþie . . . . . .118
4.5.3 Funcþii nume de entitate . . . . . . . . . . . . . . . . . . . . . . . . .123
4.5.4 Restricþii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129
4.5.5 Utilizarea numelor de entitãþi ºi
a mulþimilor de selecþie . . . . . . . . . . . . . . . . . . . . . .129
4.5.6 Note privind prelucrãrile Curve-fit ºi Spline-fit
la polilinii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130
4.5.7 Acces la ecranul grafic . . . . . . . . . . . . . . . . . . . . . . . . . . .131

5. Funcþii AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135

A Sumar de funcþii AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .303


A.1 Funcþii de bazã . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .304
A.2 Funcþii utilitare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .309
A.3 Funcþii de interfaþare ASE . . . . . . . . . . . . . . . . . . . . . . . . . . .311
A.4 Funcþii pentru mulþimi de selecþie, obiecte ºi tabele
de simboluri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313
A.5 Funcþii pentru casete de dialog programabile . . . . . . . . . . .314
A.6 Funcþii de gestionare a memoriei . . . . . . . . . . . . . . . . . . . . . .315

B Codul ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .317

C Erori AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .323


C.1 Erori program utilizator . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328
iv Cuprins

D Coduri de grup DXF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .339


D.1 Coduri de grup în ordine numericã . . . . . . . . . . . . . . . . . . .339
D.2 Entitãþi grafice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .341
D.2.1 Coduri de grup comune . . . . . . . . . . . . . . . . . . . . . . . . .341
D.2.2 Coduri de grup pe tipuri de entitãþi . . . . . . . . . . . . . . .342
D.2.3 Forþãri ale stilului de cotare . . . . . . . . . . . . . . . . . . . . .351
D.3 Entitãþi negrafice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .352
D.3.1 Coduri de grup comune . . . . . . . . . . . . . . . . . . . . . . . . .352
D.3.2 Coduri de grup dicþionar . . . . . . . . . . . . . . . . . . . . . . . .352
D.3.3 Coduri de grup pentru definiþii de bloc ºi
tabele de simboluri . . . . . . . . . . . . . . . . . . . . . . . . . .353
Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .357

Prefaþã
Am scris aceastã carte cu dorinþa de a dezvãlui cât mai multor profesioniºti
din sfera proiectãrii asistate cu AutoCAD extraordinara forþã pe care o pot
dobândi asupra calculatorului folosind un program, în loc de a da direct
comenzi. Am avut ocazia sã vãd adesea câte o studentã aparent micuþã ºi
neajutoratã, cãreia îi strãluceau ochii la susþinerea Proiectului de Diplomã,
demonstrând nonºalanþa cu care stãpâneºte aceastã forþã! Astfel de lucruri
se pot petrece, fireºte, ºi din cauzã cã încã din 1991 a început sã aparã la
Editura FAST revista lunarã „Hello CAD Fans” de Proiectare Asistatã de
Calculator. Pe lângã aceastã revistã, din 1993 a luat naºtere Clubul „CAD
Fans” al pasionaþilor de AutoCAD, club care în 1993 s-a afiliat cu drepturi
depline la Asociaþia Europeanã a Utilizatorilor de AutoCAD (EAAUG).
Acestea toate sunt fapte, sunt istorie adevãratã ºi demonstreazã cã în
România existã interes real pentru domenii de vârf, pasionaþii uitând ade-
sea cã vremile sunt potrivnice, sau cã au sãrit o masã...
Se întâmplã cã în conjuncþie cu AutoCAD este folosit LISP, un foarte vechi
limbaj de programare. AutoLISP este o implementare a limbajului LISP,
fiind inclus necondiþionat în pachetul AutoCAD al firmei Autodesk, Inc.
din SUA. AutoLISP oferã celor interesaþi posibilitatea de a transforma
pachetul de proiectare general AutoCAD într-o ºi mai puternicã unealtã
pentru aplicaþii particulare. Exploatând arhitectura deschisã a
AutoCAD–ului puteþi face ca tot dialogul sã se poarte în limba românã ºi
nici sã nu se mai vadã altceva decât aplicaþia Dvs.
LISP este un limbaj care are multe dialecte, incluzând MacLISP,
InterLISP, ZetaLISP ºi Common LISP. AutoLISP aderã cel mai mult la
sintaxa ºi convenþiile din Common LISP, deºi este o micã submulþime a
2 Prefaþã

acestuia, având însã multe funcþii în plus, specifice lucrului cu AutoCAD.


Dacã doriþi sã aprofundaþi LISP-ul ca limbaj în sine, vã recomandãm sã
cãutaþi cãrþile „LISP“ de Winston ºi Horn (ediþia a doua) ºi „Looking at
LISP“ de Tony Hasemer, ambele publicate de Addison Wesley. În limba
românã, puteþi citi „LISP“ de Cristian Giumale, Dan Preoþescu, Luca Dan
Serbãnaþi, Dan Tufiº, Gheorghe Tecuci ºi Dan Cristea, apãrutã la Editura
Tehnicã în 1987. Îmi permit sã citez din aceastã lucrare: „Apariþia la
Catedra de calculatoare din Institutul Politehnic Bucureºti a primului
interpretor competitiv de LISP pe minicalculatoarele româneºti, DMLISP
(1981), a fost un eveniment important în dezvoltarea cercetãrilor de
Inteligenþã artificialã în þara noastrã.[...] Cu DMLISP au fãcut ºcoalã ºi
apoi au realizat primele produse majoritatea specialiºtilor în Inteligenþã
artificialã din þara noastrã. Cu DMLISP au fãcut ºcoalã din 1981 toate pro-
moþiile de studenþi în domeniul calculatoarelor“. Din motive lesne de înþe-
les, dacã ne uitãm la anul de apariþie al cãrþii, nu sunt menþionaþi cei doi
prodigioºi autori ai acestui interpretor: Dominic Sotirescu ºi Mugur ªtefã-
nescu (ale cãror iniþiale participã la numele implementãrii). Aceºtia,
primul în calitate de profesor ºi al doilea în calitate de student aflat la ela-
borarea Lucrãrii de Diplomã, au devenit indezirabili datoritã opþiunii lor
de a pleca definitiv în strãinãtate; în prezent ambii lucreazã peste Ocean.
Cunosc aceste lucruri ºi mã mândresc cu faptul cã, atunci când n-au mai
putut lucra (la începutul lui 1981) la Catedra de Calculatoare - datoritã
opþiunii amintite - înþelegând importanþa lucrãrii pe care o elaboreazã,
le-am oferit posibilitatea de lucru extensiv la calculatorul Catedrei
Tehnologia Construcþiei de Maºini din Politehnicã, rupându-mi din
resursele extrem de restrânse de care dispuneam atunci (192K de memorie
ºi douã Centronics-uri pe un Coral 4011). Cartea, în sine, dovedeºte nivelul
înalt la care s-a ajuns la noi în stãpânirea LISP-ului.
ªi pentru cã tot am numit câþiva colegi, vreau sã spun cã aceastã carte n-ar
fi avut cum sã aparã dacã nu aº fi avut ºansa de a colabora cu foºtii mei stu-
denþi ºi actualii colegi ºi specialiºti de prestigiu, ªef lucrãri ing. Corneliu
Pârvu, ªef lucrãri ing. Ovidiu Alupei-Cojocariu, Asistent univ. ing. Cristian
Doicin ºi ing. cercet. Nicolae Biþoaicã. În materie de AutoLISP am învãþat
enorm de la ei ºi mã înclin în faþa minþilor lor profunde ºi iscoditoare...
Prefaþã 3

0.1 Cui ne adresãm?

În acest manual ne adresãm cunoscãtorilor AutoCAD-ului. Am decis sã


prezentãm implementãrile cele mai uzuale ºi mai recente de AutoLISP,
cuprinse între versiunile 10 ºi 13, precizând acolo unde trebuie diferenþele
care fac ca anumite elemente sã nu se aplice decât anumitor versiuni.
Portretul robot al utilizatorului cãruia ne adresãm în acest manual este:
 cunoscãtori ai proiectãrii ºi/sau desenãrii în domenii precum mecanic,
arhitecturã, construcþii, electrotehnicã, reþele electrice, topografie,
geodezie, îmbunãtãþiri funciare, cartografiere civilã sau militarã,
designeri, carosieri, graficieni, creatori din domeniul textil sau
vestimentaþie, deci tuturor celor interesaþi în a crea imagini, cel
mai adesea precise sub aspect dimensional, în vederea transpu-
nerii lor, pe o cale sau alta, în obiecte concrete;
 bun cunoscãtor al sistemului de proiectare asistatã AutoCAD;
 dotat de la mama naturã cu înclinaþie pentru activitãþi meticuloase,
exacte ºi riguroase, eventual cu experienþã în programare, în orice
limbaj, de la BASIC la C++, aceastã din urmã eventualitate
nefiind strict necesarã, deoarece cu programarea o luãm de la
zero.
Toate aceste condiþii sunt suficiente pentru a aborda AutoLISP, un suport
bun pentru aceastã aventurã fiindu-vã oferit permanent de amintita revistã
de Proiectare Asistatã „Hello CAD Fans“, care prezintã cu regularitate pro-
grame noi, în pas cu cerinþele de ultim moment ale utilizatorilor. Aceasta
este, de fapt, superioritatea de necontestat a unei publicaþii periodice faþã
de o carte. Dacã doriþi, totuºi, un material adunat într-o carte, vã recomand
„AutoCAD - Manual de iniþiere” scoasã de Editura Fast în 1993.
Odatã cu versiunea 11 de AutoCAD s-a adãugat ºi limbajul C ca interfaþã
de aplicaþii, în cadrul pachetului ADS (AutoCAD Development System).
Totuºi, firma Autodesk este angajatã în susþinerea în continuare a
AutoLISP-ului, iar orice alt limbaj este introdus ca alternativã adiþionalã a
acestuia.
4

0.2 De ce tocmai limbajul LISP?

A fost ales LISP ca limbaj primar de interfaþare software al AutoCAD-ului


pentru câteva motive:
 LISP este excelent în lucrul cu colecþii de obiecte eterogene în grupuri
de dimensiuni variabile, care sunt exact tipul de informaþii vehi-
culate de un sistem CAD ca AutoCAD-ul.
 Un interpretor LISP este ideal pentru interacþiunea nestructuratã ce
caracterizeazã procesul de proiectare.
 LISP este printre cele mai uºor de învãþat ºi stãpânit limbaje de progra-
mare.
 Este limbajul ales pentru cercetare ºi dezvoltare în inteligenþa artifi-
cialã ºi sisteme expert.
 Din cauza simplitãþii sale sintactice excesive, un interpretor LISP este,
de departe, uºor de implementat ºi foarte mic!
Primul avantaj vizibil pe care-l oferã folosirea AutoLISP-ului în contextul
proiectãrii cu calculatorul este legat de posibilitatea de parametrizare a
desenelor realizate cu AutoCAD, adicã de proiectarea efectiv asistatã.
Sigur cã alegerea LISP-ului ca limbaj fundamental de lucru este o opþiune
a autorilor AutoCAD-ului, iar noi n-avem decât sã ne supunem... Deºi
iniþial veþi avea o oarecare aversiune faþã de necesitatea aprofundãrii unui
nou limbaj (când o sã le epuizãm, oare?), pânã la urmã veþi constata cã
alegerea lui este extrem de potrivitã. Iar primele succese în realizarea unor
mici unelte cu care sã realizaþi automatizarea executãrii activitãþilor repet-
itive din lucrãrile Dvs. vã vor da un imbold extraordinar în a aprofunda ºi
aplica cele scrise în aceastã carte. Dacã nu veþi face acest prim pas (dar pe
o lucrare fierbinte de-a Dvs., nu numai pe exemple reci!) înseamnã cã nu
ne-am atins scopul...

Autorul
Bucureºti, Februarie 1996
Primele noþiuni
1
Dupã ce s-au scurs câteva decenii de la elaborarea primelor programe de
calculator, putem privi astãzi destul de detaºat acest acest domeniu care,
volens-nolens, face parte din viaþa noastrã. Un calculator nu poate
funcþiona decât pe baza unor programe care îi aratã ce are de fãcut în
fiecare moment. Pentru noi, un program este felul cum se transpune un
algoritm (sau reþetã) într-un limbaj de programare.

1.1 AutoLISP, ADS, ARX ºi DCL

AutoLISP este un limbaj folosit împreunã cu sistemul AutoCAD ºi bazat pe


limbajul de programare LISP. El este descris în aceastã carte.
Împreunã cu AutoCAD mai pot fi folosite ºi alte limbaje de programare.

(AutoCAD Development System). Deºi aplicaþiile ADS sunt scrise în C,


Unul dintre acestea este limbajul C, pentru care a fost creat mediul ADS

pentru AutoCAD ele apar identice cu funcþiile scrise în AutoLISP. O apli-


caþie ADS nu este scrisã ca un program de sine stãtãtor ci ca un set de

Încãrcarea unei aplicaþii ADS se face cu funcþia AutoLISP xload.


funcþii externe încãrcate ºi apelate de cãtre interpretorul de AutoLISP.

Din moment ce o aplicaþie ADS este echivalentã sub aspect funcþional cu o


aplicaþie AutoLISP, iar o aplicaþie ADS este dependentã de implementarea
C-ului pe platforma hardware cu care se lucreazã - deci introduce alte
restricþii - trebuie cã existã motive puternice pentru care sunt destui pro-
gramatori care preferã ADS. Aceste motive sunt legate, pe de o parte, de
6 Primele noþiuni

viteza mult mai mare a unei aplicaþii ADS (deoarece programul este com-
pilat ºi ajunge sub formã executabilã) în cazul când ponderea în acel pro-
gram o au calculele ºi iteraþiile în care lipseºte apelarea AutoCAD-ului, cât
ºi faptului cã o aplicaþie ADS nu poate fi cititã, nefiind datã niciodatã sub
forma de program sursã, pe de altã parte. Aceste douã motive compenseazã
ºi timpul mult mai mare necesar punerii la punct a unei aplicaþii ADS.
Cum am vãzut, o expresie AutoLISP poate fi introdusã ºi testatã direct pe
prompterul „Command:”, pe când un program ADS trebuie sã fie mai întâi
compilat etc. Oricum, programatorul care doreºte sã creeze aplicaþii ADS
trebuie sã stãpâneascã pe lângã C (la nivel profesional) ºi AutoCAD ºi
AutoLISP, deci învãþarea AutoLISP-ului este strict necesarã.
Odatã cu AutoCAD Release-13 a apãrut un nou mediu de programare bazat

Runtime Extension). Acest mediu suportã biblioteca ADS, iar în viitor va


pe programe compilate (ca ºi ADS). Este vorba de ARX (AutoCAD

suporta încã multe alte biblioteci. Raþiunea introducerii lui ARX rezidã în
faptul cã acesta comunicã direct cu AutoCAD, fãrã a mai interpune

funcþia arxload.
AutoLISP-ul ca intermediar (lent). Încãrcarea unei aplicaþii ARX se face cu

AutoCAD Release-12. Acesta este DCL (Dialog Control Language) ºi


Un limbaj independent de platformã a fost introdus odatã cu versiunea

serveºte la definirea ºi controlul casetelor de dialog. Casetele de dialog sunt


controlate prin intermediul AutoLISP ºi ADS, deci limbajul DCL este
necesar sã fie cunoscut pentru a putea descrie conþinutul ºi configuraþia

este încãrcat din AutoLISP prin funcþia load_dialog.


acestor casete. Un fiºier care descrie casete de dialog are extensia .DCL ºi

1.2 ASE - alt cuvânt magic...

AutoCAD asociazã obiecte grafice cu date extinse folosind atributele sto-


cate odatã cu blocurile inserate în desen. Pentru a conecta aceste date cu
baze de date externe desenului, se foloseºte în general interfaþa ASE
(AutoCAD SQL Environment), iar în particular o serie de comenzi
Capitolul 1 7

AutoCAD prefixate cu „ASE”. Limbajul SQL (Structured Query


Language) este un limbaj standardizat pentru acces la baze de date. Aºa
cum se poate constata cercetând capitolul 5 al acestei cãrþi, AutoLISP oferã
accesul la aceste facilitãþi prin funcþiile care au acelaºi prefix (ASE).
Accesul prin AutoLISP la funcþiile ASE a fost asigurat abia cu versiunea 13
de AutoCAD.

1.3 Ce este un limbaj?

Atunci când, aflându-vã în editorul de desen al AutoCAD-ului, daþi coman-


da „LINE“ ºi începeþi sã trasaþi o linie, rãspunzând la cererile „From point“
ºi „to point“, dialogaþi cu calculatorul, nu-i aºa?
Totuºi, acesta nu este un limbaj, în accepþiune informaticã. Un limbaj pre-
supune un vocabular ºi o gramaticã. Respectând regulile gramaticale pe
care le aplicãm asupra vocabularului, putem descrie o seamã de acþiuni pe
care sã le execute calculatorul. Textul pe care îl scriem noi se numeºte pro-
gram, mai exact, program sursã.
Vocabularul este format dintr-un numãr (finit) de cuvinte. Este clar cã aces-
te cuvinte trebuie sã aibã un înþeles bine definit, fãrã ambiguitãþi. Ele tre-
buie sã fie înþelese de om, urmând a fi traduse (sau compilate) pentru a
putea fi înþelese ºi de calculator. Ne-ar fi mult prea greu, mai ales nouã,
celor care nu suntem familiarizaþi cu informatica, sã dãm direct codurile
(maºinã) pe care sã le înþeleagã direct calculatorul. Chiar ºi informaticienii,
când doresc sã facã acest lucru, folosesc niºte „mnemonici“, iar limbajul
utilizat se cheamã „limbaj de asamblare“.
Limbajul care ne vine nouã, oamenilor, cel mai uºor de folosit este un aºa
numit „limbaj de nivel înalt“. Din aceastã categorie fac parte cele mai
multe limbaje: PASCAL, BASIC, FORTRAN, etc. Sunt ºi limbaje mixte,
cum este renumitul „C“ (citeºte si), care admite atât cuvinte de nivel înalt
cât ºi mnemonici specifice de asamblare.
Ei bine, AutoLISP este ºi el un limbaj de nivel înalt, derivat (ca „dialect“)
8 Primele noþiuni

din limbajul LISP. Acronimul „LISP“ provine de la sintagma „LISt


Processing“, adicã „prelucrare de listã“.

1.4 Locul limbajului LISP

Autorii AutoCAD-ului au gãsit cu cale sã asocieze acest limbaj cu sistemul


de proiectare asistatã propus de ei, deoarece au analizat mulþimea de lim-
baje ºi au constatat cã se potriveºte cel mai bine necesitãþilor unui astfel de
sistem. Ceea ce se doreºte de la limbaj într-un astfel de caz este sã permitã
crearea ºi manipularea omogenã a unor entitãþi eterogene. Dorim sã tratãm
unitar atât numere, cât ºi ºiruri de caractere, entitãþi geometrice sau mul-
þimi formate cu acestea. Uºor ajungi la concluzia cã toate pot fi cuprinse în
LISTE, asupra cãrora doreºti sã faci diverse PRELUCRţRI (deci LIST
PROCESSING...).
Dacã adãugãm la asta uºurinþa de implementare a limbajului LISP,
recunoscutã de toatã lumea, constaþi cã, într-adevãr, este un limbaj potrivit
pentru proiectare asistatã.
Dezavantajul major este cã e un limbaj puþin cunoscut de publicul larg. Se
cunoaºte, eventual, BASIC, FORTRAN, PASCAL, COBOL, chiar ºi C, dar
LISP mai puþin. Abia versiunea 11 a AutoCAD-ului asociazã limbajul C
(pe lângã AutoLISP) cu sistemul de proiectare asistatã.

1.5 Ce înseamnã „interpretor“?

Spuneam cã ansamblul acþiunilor exprimate prin cuvinte din vocabularul


limbajului, asupra cãrora se aplicã regulile gramaticale proprii, se numeºte
„program“. Un program este deci o înºiruire de linii de text.
Ce este o linie de program?
O linie de program este un ºir de cuvinte separate prin spaþii (blancuri) ºi
Capitolul 1 9

încheiate cu un semn special (invizibil), numit „terminator de linie“.


Practic, linia se încheie apãsând tasta „Enter“. Efectul vizibil este cã s-a tre-
cut la linia urmãtoare. Dacã acceptãm denumirile consacrate pentru acest
terminator, ca „ENTER”, „RETURN“, sau „CARRIAGE RETURN“ (adicã
„întoarcerea carului“ de tipãrire) ºi-l notãm <CR>, atunci liniile de pro-
gram pot arãta astfel:
xxx xx xxxxx x xxxxx<CR>
xxxxx x xxx xxxx xxxxxxx<CR>
xx xxxxx xxxxx xxx<CR>
...
În multe limbaje (PASCAL, C, LISP) nu mai conteazã unde se terminã o
linie. Sigur cã trebuie ca liniile sã se încheie la sfârºituri de cuvinte, adicã
separatorul „blanc“ poate fi oricând înlocuit cu <CR>. Programatorul
hotãrãºte unde s-o facã, legat numai de interesele de lizibilitate („citibili-
tate“) ale programului. De reþinut cã nu conteazã dacã se scrie cu literã
mare sau micã (cu mici excepþii).
Programele astfel scrise trebuie apoi traduse în limba maºinii. Traducerea
poate fi fãcutã printr-un „compilator“ sau un „interpretor“. Compilatorul
traduce întregul program, ca ansamblu, într-un ansamblu de coduri pe care
le înþelege calculatorul. Interpretorul traduce liniile pe rând, pe mãsurã ce
i se fac cunoscute.
În mod tipic, limbaje ca PASCAL, FORTRAN, C sunt implementate prin
compilatoare, iar BASIC prin interpretor.
Ei bine, AutoLISP este implementat printr-un interpretor.
Asta ne permite sã introducem programul de la tastaturã, linie cu linie,
observând direct efectele ºi eventualele erori.
Dacã, totuºi, programul este scris separat, acesta poate fi „încãrcat“ în
AutoCAD ca ansamblu (folosind funcþia „load“), dar tratamentul va fi ace-
laºi: citind liniile succesiv, interpretorul îºi întrerupe activitatea atunci
când întâlneºte o eroare, dând evident informaþii despre aceasta („mesaj de
eroare“). Un compilator care ar face acelaºi lucru, ar continua sã traducã ºi
celelalte linii, informând asupra erorilor abia în final, cu referire la fiecare
linie eronatã. ªi, ca sã extindem explicaþia, dupã ce a trecut o datã prin pro-
10 Primele noþiuni

gram, sesizând erorile locale, compilatorul trece a doua oarã, sesizând ero-
rile globale. Mai exact, în prima fazã compilatorul observã care cuvinte sau
„fraze” sunt rãu scrise, iar în faza a doua stabileºte dacã trimiterile dintr-o
parte în alta a programului sunt corecte. Astfel de trimiteri se fac pe baza
unor instrucþiuni de genul „go to” cãtre locaþii marcate prin etichete
(labels). Un interpretor nu are o astfel de a doua fazã, ba AutoLISP nici nu
foloseºte trimiteri ºi etichete, ca sã fie clar. În AutoLISP nu existã
„instrucþiuni” GO TO, totul curge simplu, de sus în jos...

1.6 Filozofia limbajului AutoLISP

LISP înseamnã procesare de listã. O listã este un ºir de „cuvinte“ separate


prin spaþii (sau <CR>-uri) ºi incluse între paranteze rotunde.
O listã poate arãta astfel:
(xx xxx x xxxx)
sau
(xx xxx
x xxxx)
Fiecare „cuvânt“ poate fi la rândul lui o listã; includerea listelor una în alta
se numeºte „imbricare“. Nivelul (sau adâncimea) de imbricare nu este li-
mitat(ã) decât de memoria calculatorului.
Iatã un exemplu de listã „pe bune“:
(* 23 3.2)
Este o listã formatã din trei articole (sau atomi): un asterisc, numãrul întreg
23 ºi numãrul real 3.2.
Primul articol exprimã un nume de funcþie - funcþia înmulþire - iar urmã-
toarele douã, argumentele acesteia.
Acþiunea întreprinsã de AutoLISP asupra listei este evaluarea ei. Practic,
inima AutoLISP-ului este evaluatorul. Ca efect al evaluãrii listei, se
returneazã valoarea ei.
Capitolul 1 11

În cazul prezentat, evaluarea duce E v a l u a r e Primul argument


la înmulþirea lui 23 cu 3.2 ºi

exact ca ºi când în loc de (* 23


returnarea rezultatului 73.6. Este Funcþia Al doilea argument

3.2) am scrie (73.6).


Dacã evaluarea nu conduce la o
(* 23 3.2)
mãrime semnificativã, pentru Proces
simetria limbajului ceva tot tre- de

nil, care înseamnã „nimic“! De


evaluare
buie sã se returneze: se returneazã
Rezultat
73.6
returnat

textscr care comutã ecranul din


exemplu, o funcþie AutoLISP este

este în mod grafic). Dacã într-o linie AutoLISP punem (textscr), atun-
mod grafic în mod text (ca ºi când am apãsa tasta F1, atunci când ecranul

ci are loc comutarea cu pricina, iar evaluarea „listei“ returneazã nil.


O listã poate fi imbricatã, cum spuneam, în altã listã. Mai întâi este eva-
luatã lista cea mai adânc imbricatã. Rezultatul returnat este pus în locul ei,
urmând evaluarea listei exterioare, care va considera acest rezultat ca ele-
ment de listã. Iatã un exemplu:
(+ 11 (* 23 3.2) 10)
Se evalueazã mai întâi lista interioarã, obþinându-se 73.6 ºi rezultând:
(+ 11 73.6 10)
Acum se evalueazã aceastã listã, care cere adunarea lui 11 cu 73.6 ºi 10. Se
returneazã 94.6, evident. Explicam unor studenþi sã-ºi imagineze acest pro-
ces ca pe cel ce se produce punând într-o tigaie o felie de pâine cu o bucatã
de unt deasupra: când tigaia este pusã pe foc, mai întâi se topeºte untul
(adicã paranteza cea mai interioarã), ºi abia pe urmã se prãjeºte felia de
pâine (paranteza externã), care a încorporat untul topit în ea. Sigur cã ei
mi-au spus cã vor sã facã aceastã experienþã, dar nu dispun decât de felia de
pâine... Le-am replicat cã dacã se ocupã intens de AutoCAD/AutoLISP vor
face repede rost de tot materialul didactic!
Cu timpul, ochiul se obiºnuieºte cu aceste construcþii (în care parantezele joacã
un rol determinant) ºi recunoaºte global acþiunile cuprinse într-un program.
12 Primele noþiuni

1.7 Cum procedãm?

Ne aflãm în AutoCAD. În zona de dialog se aflã binecunoscutul prompter:


Command:
Dacã acum, în loc de a da o comandã AutoCAD (cum ar fi LINE), punem
o parantezã deschisã, deja am invocat interpretorul de AutoLISP! O sã
ziceþi cã nu poate sã se întâmple aºa ceva, deoarece nu am încheiat linia.
Totuºi asta se întâmplã, ºi iatã de ce: dacã puneþi:
Command: (* 23 3.2)
se observã cã dupã * existã un spaþiu. În AutoCAD orice spaþiu încheie
linia, ca ºi când ar fi fost apãsat Enter, nu-i aºa? Ei bine, uitaþi-vã cã am
putut sã continui linia, scriind 23, etc. Asta ne determinã sã acceptãm cã nu
AutoCAD a preluat informaþiile din linie, ci altcineva. Acest „altcineva“
este chiar interpretorul de AutoLISP.
Efectul evaluãrii acestei linii apare dupã ce apãsãm Enter în urma paran-
tezei închise; pe linia urmãtoare apare:
73.6
adicã rezultatul evaluãrii listei.
Dacã nu punem paranteza închisã ºi apãsãm Enter, atunci pe linia urmã-
toare apare:
1>
Asta vrea sã spunã: vezi cã ai o parantezã deschisã pe care nu ai închis-o;
nu-i nimic, poþi sã scrii alte linii în continuare, dar ai grijã sã închizi paran-
teza!
Iatã cum ar putea sã decurgã introducerea de linii:
Command: (+ 11
1> (* 23
2> 3.2)
1> 10)
94.6
Command:
Capitolul 1 13

Se vede cã suntem informaþi permanent asupra numãrului de paranteze


rãmase neînchise. În final primim rezultatul evaluãrii listei externe.
Cred cã e clar. Avem libertatea de a introduce linii de program AutoLISP
direct din AutoCAD pe prompterul „Command:“. Când am închis ºi ulti-
ma parantezã - perechea primei paranteze deschise - ansamblul „progra-
mului“ este interpretat prin evaluarea dinspre interior a fiecãrei paranteze,
returnându-se rezultatul. Dacã s-a strecurat o eroare, evaluarea nu mai con-
tinuã, transmiþându-se un mesaj de eroare.
Iatã un exemplu cu eroare:
Command: (+ 11
1> (blabla 23
2> 3.2)
1> 10)
error: null function
(BLABLA 23 3.2)
(+ 11 (BLABLA 23 3.2) 10)
Command:
Se observã cã am introdus în loc de funcþia „*“ o funcþie caraghioasã,
numitã de mine „blabla“; totuºi, pânã ce nu încheiem împerecherea paran-
tezelor, AutoLISP nu se „ºifoneazã“. El ne informeazã conºtiincios asupra
numãrului de paranteze neînchise (prin „1>“, „2>“). Abia când am
împerecheat ºi ultima parantezã, evalueazã totul ºi constatã cã nu cunoaºte
funcþia „blabla“. Mesajul pe care îl transmite are întotdeauna forma:

unde mesaj este un text corelat cu eroarea sesizatã de AutoLISP.


error: mesaj

Ansamblul acestor mesaje ºi cauzele lor se prezintã în anexa C. Este foarte


util sã aveþi în faþã aceste informaþii atunci când purcedeþi sã lucraþi în

În cazul nostru, primim mesajul „null function“, adicã funcþie nulã.


AutoLISP.

Sigur cã am putea oricând sã definim (vom vedea cum) o funcþie cu numele


„blabla“, de ce nu? În acest caz funcþia respectivã s-ar executa ºi n-am mai
primi acest mesaj de eroare.
Dar sã vedem mai departe. Observaþi cã pe linia urmãtoare AutoLISP pune
14 Primele noþiuni

lista în care s-a gãsit eroarea. Remarcaþi faptul cã numele funcþiei este scris
cu litere mari! Asta ne lãmureºte cã AutoLISP transformã mai întâi toate
numele de funcþii (dar ºi alte nume) în litere majuscule ºi abia dupã aceea
le interpreteazã. Este logic sã se întâmple aºa; gândiþi-vã în câte feluri am
putea scrie numai acest cuvânt (Blabla, BlaBla, BLAbla, etc.) ºi cât timp ar
lua compararea fiecãrei variante cu numele simbolice aflate în baza de date

În continuare este pusã lista (+ 11 (BLABLA 23 3.2) 10) care


a AutoLISP-ului!

include lista cu eroarea. Trebuie sã reþineþi cã acest lucru se continuã: dacã


ºi aceastã listã este inclusã în alta, se prezintã ºi aceasta etc. Dacã imbri-
carea este profundã, veþi primi multe linii care conþin liste peste liste, din
ce în ce mai largi. Este ca ºi când, privind la microscop un þesut bolnav, vi
s-ar prezenta mai întâi celula bolnavã, apoi microscopul s-ar depãrta ºi aþi
vedea þesutul cu celula bolnavã în el, apoi organul cu þesutul cu celula bol-
navã, etc. Este clar cã cel mai interesant este mesajul de eroare, apoi lista
„cea mai interioarã“, iar restul nu face decât sã localizeze problema în
ansamblu. Nenorocirea este cã toate acestea fug pe ecran ºi putem pierde
exact partea interesantã, adicã începutul. Pentru a „îngheþa“ defilarea,
aveþi la dispoziþie tasta PAUSE (undeva sus - dreapta), dupã care pentru a
o relua puteþi apãsa orice tastã. Oricum, e nevoie de agilitate! Asta vã
menþine tineri, deci iatã încã un avantaj! O sã vã întrebaþi cât de multe liste
exterioare sunt prezentate. Vã spun eu: maxim 100! Fix 100, nici mai multe,
nici mai puþine! Adicã staþi, pot fi mai puþine doar dacã profunzimea
imbricãrii listelor din programul Dvs. nu atinge acest nivel, OK?

1.8 Volatilitate

A scrie linii de program AutoLISP în felul arãtat se justificã doar pentru


mici încercãri, „rutinuþe“, „funcþioare“, „progrãmele“.
Dacã aveþi un program mai mare, vã veþi chinui sã-l introduceþi linie cu
linie ºi, tocmai bine când aþi împerecheat ºi ultima parantezã, veþi primi un
mare ºi urât mesaj de eroare, totul „fâsâindu-se“! Veþi afla, eventual, unde
Capitolul 1 15

ºi ce aþi greºit, dupã care va trebui s-o luaþi de la capãt. De ce? Pentru cã
totul e volatil! Cum sã facem ca sã nu mai fie aºa?
Putem scrie programul nostru sub forma unui fiºier, în afara
AutoCAD–ului. Pentru asta va fi necesar sã folosim un editor de texte, ca
de exemplu Norton Editor (ne.com, descris în secþiunea ce urmeazã).
Odatã creat acest fiºier, el trebuie transmis AutoLISP-ului. Sã presupunem

Dacã nu sunteþi familiarizat(ã) cu editoarele de text de pe calculatoare


personale citiþi textul din aceastã casetã
Calea cea mai simplã de a crea un fiºier text folosi, desigur, caracterele care formeazã
este cea care foloseºte comanda COPY a sis- liniile AutoLISP, nu-i aºa?
temului de operare MS-DOS. Puteþi crea O altã cale presupune folosirea utilitarului
un fiºier cu numele „PROBA.LSP“, de Norton Commander. Pentru asta, pre-
exemplu, dând urmãtoarea succesiune de supunând cã este activ, apãsaþi simultan
comenzi: tastele <SHIFT> ºi <F4> (scriem pres-
copy con proba.lsp curtat SHIFT/F4). Apare o casetã care vã
linia 1 cere un nume de fiºier. Daþi–l dupã cum
linia 2 doriþi Dvs., dar numele sã nu depãºeascã 8
... caractere, iar extensia, dacã este, 3 carac-
linia n tere. Apãsând Enter, sunteþi eventual aver-
<^Z><Enter> tizaþi cã fiºierul nu existã (normal!) ºi vi se
Aici s-a indicat prin <^Z> apãsarea pune întrebarea dacã doriþi sã-l creaþi.
simultanã a tastelor CTRL ºi Z (scris une- Apãsaþi Enter, adicã da, doriþi sã-l creaþi.
ori CTRL/Z sau <CTRL/Z>), iar prin Din acest moment s-a intrat în editor ºi
<Enter> apãsarea tastei Enter. Sigur cã puteþi începe sã scrieþi textul. Folosiþi
fiecare linie de text se încheie apãsând tastele care fac sã aparã caractere pe ecran.
aceeaºi tastã <Enter>. Comanda COPY, Apãsaþi Enter la orice sfârºit de linie.
datã iniþial, creeazã fiºierul fãcând Folosiþi tasta BACKSPACE pentru a ºterge
„copierea“ caracterelor introduse de Dvs. ultimul caracter introdus (inclusiv Enter).
de la tastaturã (sau „consolã“, de unde ºi Dacã doriþi sã modificaþi textul (editare),
prescurtarea „con“) în fiºierul folosiþi tastele cu sãgeþi ºi aduceþi cursorul
PROBA.LSP. CON este sursa iar în linia ºi pe caracterul dorit (mai comod
PROBA.LSP este destinaþia. Dacã le inver- puteþi folosi pentru asta chiar mouse-ul),
saþi, prin CON se va înþelege ecranul, deci dupã care folosiþi BACKSPACE pentru a
consola este tastatura (la intrare) ºi ecranul ºterge înapoi, sau DELETE pentru a ºterge
(la ieºire). înainte. Introduceþi text în poziþia unde se
În liniile de text puteþi folosi orice tastã aflã cursorul ºi acesta va fi inserat acolo.
care produce apariþia unui caracter. Veþi Puteþi insera, evident, ºi Enter, pentru a
16 Primele noþiuni

crea noi linii. E foarte simplu, exersaþi a vedea cu ce versiune de sistem de operare
domnilor... Când aþi terminat, apãsaþi tasta lucraþi, daþi comanda VER). Editorul
ESC (stânga sus). Sunteþi întrebaþi dacã despre care vã vorbesc se apeleazã cu
salvaþi fiºierul (implicit), abandonaþi sau comanda EDIT. Daþi comanda
continuaþi editarea. Alegeþi (cu tastele cu EDIT nume.ext
sãgeþi sau mouse-ul) ºi apãsaþi Enter (în unde „nume.ext“ sunt numele ºi extensia
mod normal, apãsaþi direct Enter ca sã sal- fiºierului. Din acest moment se intrã în
vaþi ultima versiune a acestui fiºier). acest editor care este condus prin menu-uri
Fiºierul a apãrut acum în directorul în care („menu driven“), pe care le activaþi cu
lucraþi. Convingeþi-vã! mouse-ul. Acomodaþi-vã cu acest editor
Ca o facilitate, codul ASCII (zecimal) al care vã poate servi de minune!
caracterului pe care se aflã cursorul este Puteþi folosi orice alt editor de texte (unul
prezentat în colþul din dreapta sus al ecra- mic este NE.COM, de exemplu, care va fi
nului. prezentat la sfârºitul acestui capitol). Totul
Din pãcate, cu acest editor nu puteþi edita este sã fie un editor care nu deranjeazã tex-
un fiºier prea mare (de exemplu, nu puteþi tul, adãugând el coduri proprii, care pot
edita fiºierul ACAD.MNU), dar din fericire servi, de exemplu, la alinierea liniilor în
fiºierele AutoLISP sunt prin excelenþã paginã. Aºa procedeazã popularul procesor
micuþe. de cuvinte „Wordstar“, dar ºi acesta poate
fi folosit cum ne trebuie nouã, alegând opþi-
unea de editare „Non-document“ 
În sfîrºit, dacã lucraþi cu sistemul de ope-
rare MS-DOS v5.0 sau mai nou, dispuneþi
de un editor de text foarte puternic (pentru

cã am creat fiºierul „calcul.lsp“ (observaþi extensia „.LSP“, absolut obliga-


torie) cu conþinutul:
(+ 11
(* 23 3.2)
10)
Am fãcut asta, aºa cum spuneam, în afara AutoCAD-ului.
Acum lansãm AutoCAD-ul ºi primim prompterul obiºnuit, pe care vom da
„comanda“:
Command: (load ”calcul”)
94.6
Command:
Se observã cã „programul“ a fost încãrcat ºi s-au evaluat toate listele imbri-
cate, returnându-se rezultatul, dupã care apare iar prompterul obiºnuit.
Puteþi acum sã îmbunãtãþiþi programul, sã-l extindeþi etc. Totuºi, este inco-
Capitolul 1 17

mod sã pãrãsim AutoCAD-ul pentru a edita fiºierul (folosind editorul de


texte) ºi a reveni iar în AutoCAD pentru a vedea efectele. Ei bine, se poate
lucra ºi din interiorul AutoCAD-ului cu un editor de texte (ca ºi cu orice alt
program)! Pentru asta citiþi ceea ce scrie în caseta de mai jos:

Dacã doriþi sã configuraþi AutoCAD-ul în aºa fel încât sã puteþi lansa un


program extern, citiþi ceea ce scrie în aceastã casetã

Se poate aranja sã se lucreze din interiorul Commander, puneþi în ACAD.PGP ºi linia:


AutoCAD-ului cu un anumit editor de NC,NC,400000,,0
texte „umblând“ în fiºierul „acad.pgp“; Prin comanda NC datã pe prompterul
dacã acest fiºier nu existã, puteþi sã vi-l „Command:“ al AutoCAD-ului, aceasta
creaþi în directorul în care lucraþi. Este un invocã NC (dacã este declarat pe PATH,
simplu fiºier text (ASCII) care poate sã evident), oferindu-i un spaþiu de 40000 de
conþinã ºi numai o linie. Fiecare linie a sa octeþi, fãrã a mai prezenta un prompter
este formatã din cinci câmpuri separate (observaþi succesiunea de douã virgule alã-
prin virgulã. Puneþi, de exemplu, linia: turate). Folosind tasta <F10> pãrãsiþi
EDIT,NE,80000,Fisier de Norton-ul. Revenirea se face la modul text
editat:,4 al ecranului, datoritã codului 0 din final.
Aþi impus astfel ca, prin comanda EDIT Iatã altã linie demnã de probat în
(datã din AutoCAD), sã apelaþi Norton „acad.pgp“:
Editorul (NE), fãcându-i în acest scop un
spaþiu în memorie de 72000 octeþi (puteþi MEM,MEM /PRO-
pune aici orice editor de texte cu care sun- GRAM|MORE,130000,,0
teþi deja acomodat, numai sã cunoaºteþi Aceasta vã dã alocarea memoriei la momen-
spaþiul de memorie necesar ºi sã ºi dis- tul comenzii. Veþi putea „negocia“ alocarea
puneþi pe calculatorul Dvs. de acel spaþiu!). de spaþiu de memorie, umblând la valorile

afiºând prompterul „Fisier de edi-


El se va prezenta ºtergând ecranul ºi introduse de Dvs. în fiºierul ACAD.PGP ºi

tat:“. La ieºire, codul 4 va face ca ecranul


observând efectele.
Din cele scrise aici vã daþi seama cã puteþi
sã revinã la modul în care era în momentul crea chiar Dvs. un program EXEcutabil
emiterii comenzii EDIT: text sau grafic (cel (pentru calcule, prelucrãri statistice
care se comutã folosind tasta F1). Codul 0 º.a.m.d) pe care sã-l lansaþi din AutoCAD,
pus aici ar face revenire expresã la modul cu posibilitatea de revenire imediatã la
text. Dacã lucraþi curent cu Norton desenul pe care îl elaboraþi. 

„comanda“ (load ”nume”), reîncãrcând programul AutoLISP ºi


Dupã ce reveniþi în AutoCAD, dacã aþi fãcut modificãri în fiºier veþi da iar

observând efectele. Se economiseºte astfel enorm de mult timp.


18 Primele noþiuni

1.9 Editorul Norton

Aºa cum spuneam mai sus, existã un mic editor de texte foarte potrivit pen-
tru utilizare sub AutoCAD. Acesta este Norton Editor ºi însoþeºte pachetul
Norton Utility. Acesta are puþin peste 30 Kb ºi se gãseºte în fiºierul
NE.COM.
Activarea se poate face din sistemul de operare MS-DOS cu comanda:
NE nume.ext
unde „nume.ext“ este specificatorul de fiºier ce va fi accesat. Ecranul va
arãta ca aici:
Folosind informaþiile date în secþiunea anterioarã, prin includerea unei
linii în fiºierul ACAD.PGP putem activa editorul în mod similar, specifi-
catorul de fiºier fiind cerut printr-un prompter.
Oricare ar fi calea prin care activaþi editorul, primul ecran aratã aºa cum se
vede în pagina anterioarã.

Dupã cum se vede, dacã apãsaþi tasta F1 veþi primi informaþii de ajutor
Capitolul 1 19

(HELP). Orice altã tastã vã duce în ecranul:


Aici observaþi în partea de sus textul pe care îl introducem, iar în partea de
jos o aºa-numitã „linie de navigaþie“. Aceasta ne dã informaþii privind linia
ºi coloana unde se aflã cursorul, specificatorul de fiºier ce se editeazã
(inclusiv calea), ca ºi alte informaþii. Una dintre ele se referã la modul

Norton Editor - Starea iniþialã: pe linia de jos („linia de navigaþie“) se dau date privind po-
ziþia cursorului, numele fiºierului etc.

INSERARE/ÎNLOCUIRE. Cum este aici, modul este INSERARE, adicã


un caracter introdus în mijlocul unui rând face sã se deplaseze la dreapta
caracterele de dupã acesta. Putem trece la modul ÎNLOCUIRE (replace)
prin apãsarea tastei <INS> (sau a succesiunii F6 INS, cum vom vedea).
Revenirea se face prin tast <INS>. Alta (WW=65) ne aratã cã la depãºirea
lungimii de 65 caractere, textul va fi continuat pe linia urmãtoare, cu pãs-
trarea cuvintelor întregi (Word Wrap).
20 Primele noþiuni

În orice moment puteþi apãsa tasta <F1> care vã dã pânã la trei ecrane de
ajutor (în limba englezã). Ieºiþi când doriþi din succesiunea celor trei ecrane
folosind tasta <ESC>. În cele ce urmeazã vom spicui din informaþiile date
în aceste ecrane.

1.9.1 Mutare cursor

apãsat simultan cu tastele ← sau → cursorul se va deplasa pe cuvântul ante-


Cursorul poate fi mutat oriunde în text folosind tastele cu sãgeþi. Cu CTRL

rior/urmãtor. Tastele <Home> ºi <End> duc cursorul la începutul/


sfârºitul liniei curente. Combinând aceste taste cu CTRL, ajungem la
începutul/sfârºitul fiºierului. Cu tastele <Page UP> ºi <Page Down> tre-
cem la ecranul anterior/ulterior.

1.9.2 Comenzi pe fiºiere


Aflându-ne în NE putem face diverse operaþii cu fiºiere. Acestea se rea-
lizeazã apãsând ÎN SUCCESIUNE (nu simultan) tasta <F3> ºi o altã
tastã, dupã cum urmeazã:
F3 E = Salveazã fiºierul curent ºi ieºi (calea obiºnuitã de a pãrãsi
NE)
F3 S = Salveazã fiºierul curent ºi rãmâi în editor (când ne temem de
cãderea tensiunii ºi deci de pierderea a ceea ce am fãcut de la
începutul sesiunii NE)
F3 Q = Abandoneazã ºi ieºi (similar cu Quit din AutoCAD)
F3 X = Deschide în jumãtatea de jos a ecranului o nouã fereastrã
(vezi imaginea care urmeazã) în care poate fi adus un alt fiºier
pentru a fi editat, cerând numele acestui fiºier; atunci când cele
douã ferestre existã, comutã cursorul dintr-o fereastrã în alta;
atunci când vrem sã închidem una dintre ferestre, ducem curso-
rul în ea ºi folosim una dintre comenzile F3 E sau F3 Q, dupã
cum vrem sã salvãm, respectiv sã abandonãm acel fiºier.
F3 W = Transcrie în poziþia curentã a cursorului textul marcat ca
bloc (vezi mai jos comenzile pe blocuri) în altã fereastrã (vezi
imaginea de la comenzile pe blocuri); aceasta este calea obiºnu-
Capitolul 1 21

itã de a aduce text ales din alt fiºier „pe vãzute”.

Norton Editor - Efectul comenzii F3 X: apar douã ferestre separate de „linia de navigaþie“
care prezintã situaþia din fereastra curentã; folosirea repetatã comutã fereastra activã

1.9.3 Comenzi de ºtergere


Pentru a ºterge caracterul anterior apãsãm tasta <Backspace>, iar pentru
cel curent tasta <Delete>. Putem ºterge cuvântul anterior cu combinaþia
<CTRL/W> ºi cel urmãtor cu <ALT/W>. ªtergem întreaga linie cu
<ALT/K> (de la Kill) ºi pãrþi din aceasta cu <CTRL/L> (de la început la
cursor) ºi <ALT/L> (de la cursor la sfârºit).
În fine, putem ºterge un bloc de text (marcat cum se aratã în secþiunea
urmãtoare), folosind apãsarea succesivã a tastelor <F4> ºi D.
Orice am fi ºters, dacã nu apucãm sã facem absolut nimic (nici mãcar sã
deplasãm cursorul), putem reface partea ºtearsã cu combinaþia
<CTRL/U>. Aºadar, când ºtergeþi ceva uitaþi-vã mai întâi la rezultat ºi
abia pe urmã treceþi mai departe!
22 Primele noþiuni

1.9.4 Comenzi pe blocuri


Un bloc de text este o porþiune de text aflatã între marcaje (ca în imagine).

}
Textul poate fi pe o aceeaºi linie sau pe mai multe, reþinând cã ºi sfârºitul
de linie este un caracter (caracterul <CR>), deci ºi el poate face parte din

Bloc de text încadrat


între marcaje într-o fe-
reastrã pentru a fi dus în
cealalaltã prin copiere

Norton Editor - Marcarea unui bloc de text: se observã marcajele exprimate prin pãtrãþelele
înnegrite care delimiteazã exact 4 linii în fereastra de sus, adicã cele care încep cu semnul
„;“. Pentru a face copierea în cealaltã fereastrã, mutãm acolo cursorul (cu secvenþa F3 X), îl
aºezãm cu <Home> la un început de linie (pentru cazul acesta) ºi utilizãm secvenþa F4 W.

bloc, poate fi ºters sau inserat. Comenzile specifice sunt:


F4 S = Seteazã (creeazã) un marcaj de bloc exprimat printr-un
pãtrãþel înnegrit care apare imediat în poziþia curentã a curso-
rului; acestea pot fi ºterse direct cu <Backspace> sau
<Delete>. Practic, plasãm cursorul la începutul blocului de
marcat, apãsãm secvenþa F4 S, ducem cursorul la sfârºitul aces-
tuia ºi apãsãm din nou secvenþa F4 S. Este clar cã la un
Capitolul 1 23

moment dat nu poate fi marcat decât un singur bloc.


F4 L = Marcheazã linia curentã ca bloc (incluzând ºi sfârºitul de
linie <CR>)
F4 E = Marcheazã ca bloc porþiunea din linia curentã aflatã între
poziþia curentã a cursorului ºi sfârºitul liniei (fãrã <CR>)
F4 R = Retrage (eliminã, ºterge) toate marcajele de bloc, indiferent
de poziþia curentã a cursorului
F4 D = ªterge blocul curent marcat
F4 C = Copiazã blocul marcat în poziþia curent indicatã de cursor
F4 W = Copiazã blocul marcat în altã fereastrã în poziþia curent
indicatã de cursor
F4 M = Mutã blocul marcat în poziþia curent indicatã de cursor
F4 F = Gãseºte urmãtorul marcaj de bloc
De notat cã orice pãtrãþel de marcaj al blocurilor poate fi ºters direct,
folosind tasta <Del> sau <Backspace>.

1.9.5 Controlul formatului ecran


Pe ecran apar liniile de text pe mãsurã ce acestea sunt introduse. Atunci
când apãsãm tasta <Enter> trecem la altã linie în mod voit. Uneori vrem
sã scriem mai multe linii de text, iar acestea sã se aranjeze singure astfel
încât cuvintele sã rãmânã întregi. Mai exact, atunci când cursorul ajunge
într-o anumitã poziþie spre dreapta, cuvântul care a depãºit acea poziþie sã
fie trecut automat la începutul liniei urmãtoare. Aceastã facilitate se
numeºte „Word Wrap“ (împachetarea cuvintelor, prescurtat „WW“). Ea se
aplicã automat pe textul care se introduce acum. Pentru textul existent,
chiar dacã schimbãm setarea WW, nu se întâmplã nimic pânã ce nu cerem
aceasta în mod expres (adicã aplicãm „formatarea“ paragrafului). Legat de
ea ne gândim la douã lucruri: 1/ sã fie activã sau nu ºi 2/ sã stabilim poziþia
la care sã se aplice (atunci când e activã). Pe ecranele capturate în imaginile
prezentate pânã aici se vede cã facilitatea WW era activã, iar poziþia la care
se aplicã era 65. Se ºtie cã ecranul VGA normal are 25 de linii a câte 80 de
caractere, deci putem alege dacã ºi unde sã se aplice. Comenzile aferente
24 Primele noþiuni

pentru aceasta ºi pentru alte setãri ale ecranului sunt:


F5 L = Fixeazã lungimea liniei pentru WW
F5 W = Activeazã/Dezactiveazã facilitatea WW
F5 F = Formateazã un paragraf potrivit setãrii curente a WW
F5 T = Fixeazã spaþierea pe ecran a saltului de tabulare (obþinut cu
tasta <TAB>)
F5 C = Comutã tipul de cursor în mare/mic ºi clipitor/static
F5 D = Selecteazã succesiv culorile ecranului
F5 I = Comutã modul indent ON/OFF; când este ON, apãsarea lui
<Enter> pune cursorul în poziþia pe care a avut-o primul ca-
racter non-blanc din linia anterioarã
F5 K = Fixeazã efectul apãsãrii tastelor <TAB> ºi <INS> astfel:
<TAB> poate fi 1/ insereazã caracterul TAB, 2/ insereazã
blancuri care simuleazã poziþia urmãtorului stop de tabulare ºi
3/ duce cursorul pe urmãtorul stop de tabulare
<INS> poate fi: 1/ comutã mod INSERT/REPLACE ºi 2/ pen-
tru comutare trebuie folositã într-un sens tasta <INS> ºi în
altul succesiunea <F6> <INS>
F5 S = Salveazã starea curentã a editorului; este utilã pentru a par-
ticulariza editorul potrivit modului care ne place cel mai mult,
astfel încât sã-l regãsim în aceastã stare la urmãtorul apel

1.9.6 Comenzi suplimentare


F1 = Help
F2 = Afiºeazã starea curentã a editorului
F9 = Comutã pe sistemul de operare; revenirea se face cu coman-
da EXIT
INS = Seteazã mod inserare
F6 INS = Seteazã mod înlocuire (replace), dacã aºa a fost stabilit prin
secvenþa F5 K INS (vezi mai sus)
Capitolul 1 25

F6 G = Cere numãrul liniei pe care sã ducã cursorul (Go)


F6 M = Cursorul fiind poziþionat pe o parantezã, îl duce pe paran-
teza pereche (dacã aceasta existã). E s t e u n a d i n t r e c e l e
m a i u t i l e c o m e n z i p e n t r u l u c r u l c u A u t o L I S P . De
reþinut cã prin „parantezã“ la aceastã comandã se înþeleg urmã-
toarele semne perechi: ( ) [ ] { } ºi < >
F6 T = Testeazã diferenþele dintre textele aflate în cele douã ferestre
(deschise cu F3 X, vezi mai sus). În acest scop, cursorul trebuie
pus separat în fiecare fereastrã în poziþia de start comparaþie.
Dupã aplicarea comenzii (datã din oricare fereastrã), cursorul
va fi gãsit în fiecare fereastrã pe primul caracter care nu mai
este identric în cealaltã fereastrã. Este o comandã utilã, dar
adesea este ignoratã ºi ne chinuim sã gãsim diferenþele „cu
mâna“.
CTRL/P = Prefix care permite introducerea imediatã a unui caracter
netipãribil (de control). Se ºtie cã în codul ASCII primele 31
caractere sunt netipãribile. Unul dintre ele este TAB, corespun-
zând codului ASCII 9. Acestea pot fi introduse folosind simul-
tan tasta <ALT> ºi un numãr introdus de la tastele din blocul
numeric (în dreapta tastaturii). Cum pentru fiecare existã ºi li-
tera corespunzãtoare, le putem introduce ºi prin literã. De
exemplu, lui 9 îi corespunde litera I, deci putem introduce
TAB ºi prin CTRL/I. Ca sã putem introduce un astfel de cod
punem mai întâi prefixul CTRL/P (notat ºi ^P).
CTRL/V = Comutã caracterele de la cursor pânã la începutul liniei din
mici în MAJUSCULE ºi invers.
ALT/V = Ca ºi CTRL/V, dar pentru caracterele de la cursor la sfârºit-
ul liniei

1.9.7 Comenzi de tipãrire


Succint, acestea sunt:
F7 P = Tipãreºte la imprimantã tot textul
26 Primele noþiuni

F7 B = Tipãreºte la imprimantã blocul curent marcat


F7 E = Sãri la pagina urmãtoare (emite codul Form Feed)
F7 S = Fixeazã mãrimea paginii imprimate
F7 M = Fixeazã marginea din stânga pentru imprimare

1.9.8 Comenzi de cãutare


Orice editor de text trebuie sã permitã cãutarea unui ºir de caractere.
Aceasta se poate face de la cursor spre sfârºitul fiºierului (adicã în jos), sau
spre începutul acestuia (adicã în sus). Gãsirea ºirului cãutat se finalizeazã
prin plasarea cursorului pe acest ºir.
ALT/F = Cere un ºir text ce va fi cãutat de la cursor în jos
CTRL/F = Idem cu ALT/F, dar cautã în sus
ALT/C = Continuã cãutarea în jos a ºirului introdus cu comenzile
anterioare
CTRL/C = La fel ca ALT/C, dar cautã în sus
F4 F = Cautã urmãtorul marcaj de bloc (în jos)
De notat cã încheierea introducerii ºirului de caractere de cãutat se poate
face în douã feluri:
- prin <Enter>, ºi se vor cãuta exact caracterele introduse
- prin <ESC>, ºi se vor cãuta caracterele introduse indiferent dacã
literele sunt mari, mici sau combinate (de exemplu, intro-
ducând ºirul „EMIL“ va fi gãsit EMIL, sau Emil, sau emil)

1.9.9 Comenzi de cãutare ºi înlocuire


Cãutarea unui ºir de text poate fi combinatã ºi cu înlocuirea acelui ºir cu
unul nou, dat de utilizator. Comenzile posibile depind de sens, astfel:
Cãutare ºi înlocuire în jos:
ALT/F = Cere ºirul de caractere de înlocuit; dupã introducere se apasã
iar combinaþia ALT/F, urmatã imediat de ºirul înlocuitor
Cãutare ºi înlocuire în sus:
Capitolul 1 27

CTRL/F = Cere ºirul de caractere de înlocuit; dupã introducere se apasã


iar combinaþia CTRL/F, urmatã imediat de ºirul înlocuitor
Încheierea cu <Enter> sau <ESC> a ºirului de cãutat respectã aceleaºi
reguli ca mai sus. La gãsirea ºirului se aºteaptã rãspunsul utilizatorului
care poate fi:
Y = Executã înlocuirea
N = Nu executã înlocuirea
* = Executã toate înlocuirile ce vor mai fi gãsite în sensul de
cãutare considerat
<Blanc> = Abandoneazã comanda de cãutare ºi înlocuire în curs
Ulterior, poate fi folositã una din combinaþiile <ALT/C> sau <CTRL/C>
pentru a continua cãutarea/înlocuirea aceluiaºi ºir într-un sens sau altul. 
28 Note
Programare simplã în
AutoLISP
2
La ce ne-ar putea folosi un program dacã lucrãm în AutoCAD?
Ca sã vã puneþi aceastã problemã, trebuie sã fi lucrat suficient de mult în
AutoCAD încât sã-i descoperiþi limitele (oricum, aºa cum arãtam în prefaþa
acestei lucrãri, se recomandã sã aveþi o bunã experienþã de AutoCAD în
momentul în care vã propuneþi sã lucraþi în AutoLISP).
Pentru a rãspunde la întrebare, vã voi pune eu una: ce diferenþã este între
proiectare asistatã ºi desenare asistatã? Rãspunsul este cã desenarea
foloseºte mijloace directe pentru a transpune ideile în desene, ca ºi când în
loc de calculator s-ar folosi o planºetã (cu facilitãþi suplimentare notabile).
În schimb, proiectarea asistatã depãºeºte acest cadru, exploatând forþa cal-
culatorului sub aspecte multiple: generare de desene (prin program), cal-
cule geometrice, de rezistenþã, etc.
Dacã dorim sã facem calcule, sã generãm desene parametrizate (în care
diverse dimensiuni sunt cerute de la tastaturã), sã scãpãm de desenare
repetitivã etc. putem introduce într-un program întreaga reþetã de acþiuni.
Ne vom ocupa în prima etapã de posibilitatea de a face calcule.

2.1 Elemente de limbaj AutoLISP

În exemplul prezentat în capitolul anterior, unde apãrea lista (* 23


3.2), spuneam cã semnul „*“ reprezintã numele funcþiei înmulþire, iar 23
ºi 3.2 sunt argumentele acestei funcþii.
30 Programare simplã în AutoLISP

Practic, aceasta este o expresie. În general, expresiile AutoLISP au sintaxa:

(nume-funct [argumente]...)

Separaþia între numele funcþiei ºi argumente, ca ºi între argumente, este un


spaþiu (blanc). Orice argument poate fi la rândul lui o expresie. Parantezele
drepte [ ] indicã faptul cã ceea ce se aflã cuprins între ele este opþional; deci

În exemplul (* 23 3.2) argumentele sunt constante; unul e întreg, iar


pot fi ºi funcþii fãrã argumente.

celãlalt este real.


În loc de constante, însã, se poate lucra cu variabile. Acestea, ca ºi în alge-
brã, sunt exprimate literal. Practic, vã puteþi gândi la variabile ca la niºte
sertare: pe sertar este pusã o etichetã (numele variabilei), iar în sertar se
aflã valoarea ei.
Tipurile posibile de variabile în AutoLISP sunt patru, (într-o primã apro-
ximare):

Î N T R E G = numere întregi cu semn


RE AL = numere cu parte întreagã ºi zecimalã, cu semn
P UN C T = listã de douã sau trei variabile reale reprezentând coordo-
natele unui punct geometric
ªIR = secvenþã de caractere cuprinse între ghilimele

Tipul variabilei este asociat automat cu aceasta, potrivit valorii care i se


atribuie. Dacã ulterior i se atribuie altã valoare, de alt tip, se va schimba ºi
tipul variabilei.
Numele variabilei poate fi ales liber de cãtre Dvs. Singurele restricþii sunt

deauna, este predefinitã variabila π (notatã pi sau PI), cu valoarea cunos-


legate de necesitatea ca primul caracter sã fie o literã ºi de faptul cã, întot-

cutã: 3.141593.
Cum facem sã creãm o nouã variabilã?
Capitolul 2 31

Foarte simplu: atribuind unui nume o valoare! Funcþia de atribuire în


AutoLISP este „SETQ“. Ea este similarã cu „LET“ din BASIC, „=“ din
FORTRAN sau „:=“ din PASCAL, pentru cine cunoaºte unul dintre aces-
te limbaje. Sintaxa:
(setq nume-var valoare [nume-var valoare]...)
unde:
nume-var = numele liber ales de Dvs. pentru variabilã
valoare = valoarea pe care doriþi sã o atribuiþi variabilei; tipul ei va con-
feri un tip similar variabilei definite cu aceastã ocazie.
Se observã cã se pot defini mai multe variabile succesiv.

Atribuire
Numele variabilei (liber ales)
Funcþia SETQ
de atribuire Valoare atribuitã

(setq nume valoare)

Exemple:
(setq a 23)
(setq x1 2.3)
(setq pers ”Costache cel bun”)
(setq u 3 w 4.5 abc ”flansa”)
Variabila a va fi de tip întreg ºi va avea valoarea 23. Variabila x1 va fi de tip
real ºi va avea valoarea 2.3, iar variabila pers va fi de tip ºir, cu valoarea
”Costache cel bun“ (de reþinut cã ghilimelele nu fac parte din ºir).
În ultimul exemplu s-au definit simultan variabilele u, w ºi abc. Acesta
poate fi scris mai frumos:
(setq u 3
w 4.5
abc ”flansa”)
32 Programare simplã în AutoLISP

punând câte o variabilã pe o linie, ca sã fie mai clar.


La variabilele reale trebuie reþinut cã se impune ca punctul zecimal sã aibã
ºi de o parte ºi de alta câte o cifrã, chiar ºi dacã e zero (deci nu se admit 2.
ci 2.0, ºi nu .4 ci 0.4). Chiar dacã uneori merge, nu contaþi pe asta!
Dacã acum daþi:
(setq pers x1)
veþi schimba tipul variabilei pers din ºir în real ºi-i veþi atribui valoarea pe
care o are variabila realã x1. Ca sã continuãm exemplul cu sertarele, este ca
ºi când aþi pune sertarul pers deasupra lui x1 ºi i-aþi scoate fundul; când
cãutaþi ceva în pers, gãsiþi ceea ce se aflã în x1.
Sã vedem cum e cu variabilele de tip punct geometric, pe care le-am lãsat
special la urmã. Acestea conþin coordonatele X, Y ºi, opþional, Z. Practic, e
vorba de liste de douã sau trei reale cuprinse între paranteze, ca în:
(1.2 23.0)
(22.5 0.23 12.34)
Valorile corespund în ordine coordonatelor X, Y, Z. Dacã Z lipseºte, va-
loarea sa se ia potrivit contextului (dacã ELEVaþia curentã e 20.0, se ia
aceastã valoare, nu?).
Pentru a forma o listã în sens LISP, trebuie folositã funcþia „list“, sub
forma:
(list 1.2 23.0)
(list 22.5 0.23 12.34)
Pentru a crea o variabilã punct, vom atribui unui nume liber ales o astfel de
listã, ca în:
(setq pct1 (list 1.2 23.0))
(setq pct2 (list 22.5 0.23 12.34))
(setq pct3 (list x1 1.0 2.0))
În al treilea exemplu s-a folosit drept coordonatã X variabila x1 definitã
anterior.
Ca alternativã, se poate folosi prefixul apostrof, care face ca ceea ce
urmeazã sã fie luat ca atare, fãrã a fi evaluat. Astfel, puteþi pune:
(setq pct2 ‘(22.5 0.23 12.34))
Capitolul 2 33

definind identic punctul pct2 ca mai sus.


Vã daþi seama care este substratul?
Dacã n-ar fi apostroful, s-ar evalua lista internã (care n-ar duce la nimic

valuatã ºi se trece la evaluarea celei externe, care va atribui numelui pct2 o


bun...) ºi apoi cea externã. Dacã e pus apostroful, lista internã rãmâne nee-

listã ºi nu o simplã valoare (scalarã, aº zice). Ce este neplãcut este cã nu


puteþi folosi apostroful la început de linie decât într-un program scris ca
fiºier, deoarece dacã introduceþi linii pe prompterul „Command:“, apostro-
ful nu e acceptat cu acest sens, ci cu sensul de comandã „transparentã“.
Pe de altã parte, este evident cã nu putem folosi apostroful punând în listã
altceva decât valori constante. De ce? Pentru cã acestea sunt atribuite
orbeºte, fãrã a fi interpretate în vreun fel, or atunci când punem un nume
de variabilã cum ar fi „xmin“ ne gândim la valoarea care se aflã în spatele
ei, ºi nu la literele „x“, „m“, „i“ ºi „n“. Ba nici numele „PI“ (care este al unei
constante) nu poate fi folosit. De fapt, aceastã funcþie „apostrof“ este sino-
nima funcþiei „quote“, care poate fi folositã la fel de bine, dar vedeþi, aºa ne
întindem ºi diluãm conþinutul... Avem timp ºi pentru asta.
Invers, pentru a extrage una dintre coordonatele unui punct, vom folosi una
dintre funcþiile „car“, „cadr“ sau „caddr“:
(car pct1)
(cadr pct1)
(caddr pct3)
Prima returneazã coordonata X a punctului pct1 (adicã 1.2), a doua Y-ul
lui pct1 (adicã 23.0), iar a treia Z-ul lui pct3 (adicã 2.0).
Dacã doriþi sã definiþi un punct pcta care sã aibã X-ul lui pct1 ºi Y-ul lui
pct2, veþi pune:

În acest fel pcta va avea coordonatele (1.2 0.23).


(setq pcta (list (car pct1) (cadr pct2)))

Iatã cã acum ºtim sã definim orice tip de variabilã. Cum putem sã le


folosim? Pentru a folosi o variabilã AutoLISP definitã ca mai sus veþi pune
pur ºi simplu un semn de exclamare în faþa variabilei.
Un prim exemplu este dat în continuare.
34 Programare simplã în AutoLISP

Command: (setq raza 11)


11
Command: fillet
Polyline/Radius/<Select two objects>: r
Enter fillet radius <0.0000>: !raza
Command:
Am definit cu „setq“ variabila raza dându-i valoarea 11; apoi am dat

numele variabilei raza precedat de „!“. Asta a fãcut ca AutoCAD sã-ºi ia


comanda „fillet“ în AutoCAD ºi, când ni s-a cerut raza, am rãspuns dând

valoarea din memorie, cercetând conþinutul variabilei raza (adicã al ser-


tarului) atribuit de noi.
Iatã un alt exemplu:
Command: (setq p1 ‘(10 20) p2 ‘(30 40))
(30 40)
Command: line
From point: !p1
to point: !p2
to point: <Enter>
Command:
Ce s-a întâmplat? S-a trasat o linie de la punctul (10 20) la punctul (30 40).

mai întâi se atribuie valori de punct variabilelor p1 ºi p2 într-o singurã


Dacã vã uitaþi mai atent la dialog (folosind eventual tasta F1), veþi vedea cã

linie „setq“. Apoi se dã comanda „line“ care cere puncte; i se furnizeazã !p1
ºi !p2, adicã i se comunicã AutoCAD-ului sã ia coordonatele acestor puncte
din listele asociate variabilelor p1 ºi p2.
Iatã deci cã NOI am definit niºte nume simbolice (raza, p1, p2) care sunt
deja cunoscute. Trebuie spus aici cã, de fapt, încã de când intrãm în
AutoCAD (dacã AutoLISP este activ) sunt deja definite niºte nume simbo-

de o listã de nume simbolice. Aceastã listã are ºi ea un nume: atomlist.


lice, cele pe care le definim noi adãugându-se la acestea. Practic, este vorba

Dacã doriþi sã-i vedeþi conþinutul, introduceþi direct !atomlist ca rãspuns


la prompterul „Command:“ al AutoCAD-ului; mai întâi apãsaþi tasta
<F1> pentru a trece în mod text, deoarece ecranul se va umple pe trei sfer-
turi cu nume de simboluri. Iatã cam cum va apãrea aceastã listã:
Capitolul 2 35

(INTERS GRREAD GRTEXT ...


... STRLEN PI MINUSP ZEROP ...
... COS ATAN 1 1+ ABS MAX ...
... REM * + ASSOC MEMBER ...
... EXPAND ATOMLIST)
Pare instructiv, nu-i aºa?. Veþi vedea cã numele date de Dvs. vor apãrea
primele în aceastã listã.
NOTÃ
Numele simbolic atomlist depinde de versiune (Release) astfel:
Release-10, -11 = atomlist
Release-12, -13 = atoms-family
Odatã cu introducerea numelui atoms-family variabila s-a transformat
într-o funcþie, astfel cã acum trebuie introdus:
(atoms-family 0)
pentru a obþine efectul pe care îl dãdea !atomlist

2.2 Expresii AutoLISP

Cum, necum, iatã cã am aflat sensul câtorva funcþii AutoLISP: setq, list,
car, cadr, caddr. Acestea sunt folosite pentru a forma expresii AutoLISP,
potrivit sintaxei de acum cunoscute:
(nume-funct [argumente]...)
Expresiile AutoLISP pot fi:
 matematice
 ºir
 condiþionale
Ele sunt descrise mai jos. Înarmaþi-vã cu rãbdare, înþelegeþi-le ºi probaþi-le:
veþi vedea ce forþã teribilã vã oferã! Iar acesta este doar vârful aisbergului...
36 Programare simplã în AutoLISP

2.2.1 Expresii matematice

Expresiile matematice folosesc funcþii ale cãror argumente pot fi cel mai
des reale sau întregi. Dacã toate argumentele sunt întregi, atunci ºi rezul-
tatul va fi întreg; dacã mãcar unul e real, atunci toþi întregii vor fi avansaþi
la reale ºi rezultatul va fi real.
O primã categorie de funcþii ce intrã în compunerea expresiilor matematice

(+ x y)
este:

(- x y)
returneazã suma x+y

(* x y)
returneazã diferenþa x-y

(/ x y)
returneazã produsul x*y

(max x y)
returneazã câtul x/y

(min x y)
returneazã maximul dintre x ºi y
returneazã minimul dintre x ºi y
Observaþi de fiecare datã cã imediat dupã prima parantezã (fãrã vreun
blanc) urmeazã numele funcþiei, apoi blanc ºi argumentele; dupã ultimul
argument vine imediat paranteza închisã. Sã aveþi grijã sã respectaþi aceste
reguli, pentru ca programele Dvs. sã parã mereu ordonate. În particular, la

(- 100 60 30 7.5)
aceste funcþii argumentele pot fi mai multe decât douã. De exemplu:

(max 100 60 112 1.2)


returneazã 2.5
returneazã 112.0
Observaþi cã ultimul rezultat este real deoarece, chiar dacã maximul nu e
real, comparaþia dintre argumente a dus la transformarea celor întregi la
reale datoritã lui 1.2. Este demn de reþinut ce se întâmplã la calculul

radiani se face prin coeficientul π/180, dacã veþi converti 60 de grade la


amestecat cu întregi ºi reale. De exemplu, ºtiind cã trecerea de la grade la

radiani prin expresia:


(* (/ 60 180) pi)

se înmulþeºte cu π, veþi constata cã rezultatul este taman zero! De ce? E sim-


gândind cã se împarte întâi 60 la 180 iar apoi rezultatul (care ar fi 0.33333)
Capitolul 2 37

plu: pentru cã împãrþirea lui 60 la 180 face, într-adevãr 0.33333 dar ambele
argumente fiind ÎNTREGI, atunci ºi rezultatul se converteºte la întreg, dar
prin TRUNCHIERE, ºi nu prin rotunjire. Chiar dacã împãrþiþi 179 la 180
obþineþi tot zero! Ce e de fãcut? Puteþi pune unul din argumente ca real (de
exemplu 60.0 în loc de 60) sau puteþi sã ordonaþi socotelile astfel:
(* (/ pi 180) 60)
Alte funcþii matematice cer argumente mai puþine. Iatã-le, împreunã cu

(abs x) . . . . . . . . . . . . . . . .valoarea absolutã a lui x


numãrul exact de argumente necesare ºi cu valorile returnate:

(sqrt x) . . . . . . . . . . . . . . .radical din x


(expt x p) . . . . . . . . . . . .xp
(exp p) . . . . . . . . . . . . . . . .ep
(log x) . . . . . . . . . . . . . . . .ln x (sau loge x)
(float x)
(fix x) . . . . . . . . . . . . . . . .valoarea realului x trunchiatã la întreg; din
. . . . . . . . . . . . .valoarea întregului x convertitã la real

(sin alfa)
2.6 se obþine 2, iar din -2.6 se obþine -2

(cos alfa)
. . . . . . . . . . . .sinus de alfa (dat în radiani)

(atan x)
. . . . . . . . . . . .cosinus de alfa (dat în radiani)

(1+ x) . . . . . . . . . . . . . . . . .x mãrit cu 1; echivalent cu (+ x 1)


. . . . . . . . . . . . . .arctangent (în radiani) de x

(1- x) . . . . . . . . . . . . . . . . .x redus cu 1; echivalent cu (- x 1)


(angle p1 p2) . . . . . . . . .unghiul (în radiani) al segmentului p1-p2
mãsurat potrivit sensului ºi originei
unghiurilor curent stabilite cu comanda

(distance p1 p2)
UNITS (de obicei trigonometric)

(polar p1 alfa dist) punctul aflat la distanþa „dist“ ºi unghiul


. . . . .distanþa dintre punctele p1 ºi p2

(type a) . . . . . . . . . . . . . . .tipul variabilei a (integer = întreg,


„alfa“ (în radiani) faþã de punctul dat p1

real = real, list = listã, string = ºir)


38 Programare simplã în AutoLISP

Se observã cã nici una dintre funcþiile prezentate nu schimbã valoarea vari-

returneazã. De exemplu, (sin x) aflã care este valoarea variabilei x,


abilei pe care se aplicã; ele calculeazã, pur ºi simplu, o valoare ºi o

aplicã pe acea valoare funcþia sinus (considerând-o ca unghi dat în radiani)

înlocuiþi pe x cu sinusul sãu, puteþi sã faceþi o atribuire de genul (setq x


ºi returneazã rezultatul. Valoarea lui x nu s-a schimbat! Dacã doriþi Dvs. sã

(sin x)). Cum ºi-o face omul cu mâna lui...

2.2.2 Funcþii ºir

Atenþie cã nu am scris „expresii ºir“, ci „funcþii ºir“! Asta din cauzã cã

(itoa int)
prezentãm doar funcþiile cu efect asupra ºirurilor:
. . . . . . . . . . . .conversia valorii variabilei int în ºir ASCII
(atoi s) . . . . . . . . . . . . . . .conversia întreagã a ºirului s
(ascii c) . . . . . . . . . . . . .codul ASCII (întreg) al caracterului c
(chr int) . . . . . . . . . . . . .caracterul ASCII corespunzãtor codului int
(strcat s1 s2) . . . . . . .ºirul s1 concatenat cu s2
(strlen s) . . . . . . . . . . . . .lungimea ºirului s
(terpri) . . . . . . . . . . . . . . .începe o nouã linie pe ecran

(itoa 123) . . . . . . . . . . . . .returneazã ºirul „123“, deci în loc de un


Exemple:

(atoi ”123”) . . . . . . . . . .returneazã întregul 123


întreg gãsim un ºir

(ascii ”A”) . . . . . . . . . . . .returneazã 65, codul ASCII al lui A


(chr 65) . . . . . . . . . . . . . . .returneazã A
(strcat ”retea” ”-apa”) returneazã ºirul „retea-apa“
(strlen ”retea-apa”) returneazã lungimea 9 a ºirului anterior.
Pentru lãmuriri privind codurile ASCII consultaþi anexa B.
Capitolul 2 39

2.2.3 Expresii condiþionale

Un adevãrat program de calculator nu face numai calcule, ci ia ºi decizii,

limbaj de programare o oferã este decizia if („dacã“). Ea prezintã o ra-


funcþie de valorile momentane ale diferitelor variabile. O cale pe care orice

mificaþie în program, de forma:


„Dacã expr-cond atunci executã1 altfel executã2“
unde expr-cond este o expresie condiþionalã, ale cãrei valori pot fi true
(adevãrat) sau false (fals). În AutoLISP vom conveni sã notãm adevãrat
prin T, iar fals prin nil. Ca efect, dacã expr-cond este T, se executã acþi-
unea executã1, iar dacã e nil, se executã acþiunea executã2. Acþiunile

IF

T Expresie nil Opþional


condiþionalã

executã1 executã2

exprimate de executã2 pot sã lipseascã, astfel încât, ori se produc acþiunile


executã1, ori nimic. Ca urmare, funcþia if poate avea una din formele:
(if expr-cond executã1)
(if expr-cond executã1 executã2)
Se observã cã acþiunile din executã2 pot fi pur ºi simplu adãugate, dacã se
doreºte acest lucru, fãrã a exista un separator gen atunci.
Dacã þinem cont cã acþiunile în AutoLISP sunt date prin expresii conþinute

cã ceea ce apare mai sus sub numele executã1, de exemplu, este de fapt o
în liste ce pot fi imbricate oricât de profund unele în altele, ne dãm seama

listã.
40 Programare simplã în AutoLISP

Ne concentrãm acum pe expr-cond. Am spus cã valoarea acestei expresii


poate fi T sau nil. Atât!
Pentru a o construi, putem folosi una sau mai multe dintre urmãtoarele

(minusp num) . . . . . . . . . .T dacã num e negativ, nil altfel


funcþii (aici nu sunt date decât cele mai utile, restul mai încolo):

(zerop num) . . . . . . . . . . .T dacã num e zero, nil altfel


(numberp x) . . . . . . . . . . .T dacã x e numãr (real sau întreg), nil altfel
(not a b ...) . . . . . . . .NU logic aplicat pe a, b, ...
(or a b ...) . . . . . . . . . .SAU logic aplicat pe a, b, ...
(and a b ...) . . . . . . . .ªI logic aplicat pe a, b, ...
(= a b) . . . . . . . . . . . . . . . .T dacã a este egal cu b, nil altfel
(/= a b) . . . . . . . . . . . . . . .T dacã a este neegal cu b, nil altfel
(> a b) . . . . . . . . . . . . . . . .T dacã a este mai mare ca b, nil altfel
(>= a b) . . . . . . . . . . . . . . .T dacã a este mai mare sau egal cu b,
nil altfel
(< a b) . . . . . . . . . . . . . . . .T dacã a este mai mic ca b, nil altfel
(<= a b) . . . . . . . . . . . . . . .T dacã a este mai mic sau egal cu b,
nil altfel
(listp a) . . . . . . . . . . . . .T dacã a este o listã, nil altfel
(null a) . . . . . . . . . . . . . . .T dacã a este nil, nil altfel
Observaþi cã vi se oferã calea de a testa valorile diferitelor variabile pentru

bila ºir stare sã ia valoarea „OK“ dacã variabila întreagã ii este nulã, ºi va-
ca, funcþie de rezultat, sã luaþi o decizie. De exemplu, dacã doriþi ca varia-

loarea „GRESIT“ în orice altã situaþie, puteþi concepe o expresie de genul:


(if (= ii 0) (setq stare ”OK”) (setq stare ”GRESIT”))
unde expresia condiþionalã este (= ii 0), acþiunile executã1 sunt date de
(setq stare ”OK”) iar acþiunile executã2 de (setq stare ”GRE-
SIT”).
Acelaºi lucru poate fi scris mai compact:
(setq stare (if (= ii 0) ”OK” ”GRESIT”))
Se vede cã aici expresia if returneazã fie valoarea „OK“, fie „GRESIT“,
dupã valorile lui ii (evaluarea listei formatã de expresia if trebuie sã
returneze ceva!). Este mai elegant, dar mai greu de urmãrit. Alegeþi...
Capitolul 2 41

bilelor de sistem. În acest scop existã funcþia AutoLISP getvar, care aflã ce
Fiind în AutoCAD, putem folosi foarte bine pentru teste valorile varia-

valoare are orice variabilã de sistem. Sintaxa ei este:


(getvar nume-var)
Puteþi construi o expresie de genul:
(if (> (getvar ”FILLETRAD”) 8.3 (setvar ”GRIDMODE” 0))
Aici getvar obþine valoarea razei de racordare curente (FILLETRAD) ºi, în
cazul în care este mai mare ca 8.3, eliminã reþeaua de puncte ajutãtoare

AutoLISP, setvar, a cãrei sintaxã este:


(GRID-ul). Dupã cum se vede, acest lucru se face utilizând o altã funcþie

(setvar nume-var valoare)

mai mare decât 8.3). Se vede cã aici lipseºte cu totul secvenþa executã2.
Prin ea, variabila GRIDMODE este fãcutã 0 (dacã raza de racordare este

2.3 Funcþii de introducere

loare folosind funcþia setq. De exemplu, pentru a crea variabila x de tip


Am vãzut cã o variabilã poate fi creatã ºi/sau i se poate atribui o nouã va-

real atribuindu-i valoarea 123.45, vom pune linia:


(setq x 123.45)
Dacã acum dorim sã-i schimbãm valoarea (eventual ºi tipul), vom pune, de
exemplu:
(setq x 56)
Am schimbat valoarea în „56“, dar ºi tipul de la real la întreg, deoarece nu
am inclus punctul zecimal.

dialog, de la tastaturã, folosind una din funcþiile get. Alegerea uneia dintre
Asta e clar, nu? Ei bine, putem sã cerem utilizatorului sã dea valoarea prin

acestea depinde de tipul dorit al variabilei. Astfel, veþi folosi:


getint pentru variabile de tip intreg (integer)
getreal pentru variabile de tip real (real)
42 Programare simplã în AutoLISP

getstring pentru variabile de tip ºir (string)


getpoint pentru variabile de tip punct geometric (point)
getcorner pentru variabile de tip punct geometric (variantã)
getdist pentru variabile de tip punct geometric (variantã)
Sã vedem care este sintaxa acestor funcþii ºi cum lucreazã.

(getint [<prompt>])

<prompt> = ºir opþional de caractere inclus între ghilimele


unde:

Aºa cum ºtim, parantezele drepte [ ] din sintaxã încadreazã întotdeauna


elementele opþionale.
Practic, punând aceastã funcþie în programul Dvs., la întâlnirea ei de cãtre
interpretorul de AutoLISP, i se cedeazã controlul AutoCAD-ului care va
aºtepta introducerea manualã, de la tastaturã, a unei valori întregi. Odatã
introdusã aceastã valoare, evaluatorul AutoLISP-ului va înlocui întreaga

departe. Dacã se pune ºi un ºir pe post de <prompt>, acesta este afiºat ca


parantezã ce conþine funcþia cu valoarea datã astfel, dupã care va trece mai

atare în zona de dialog.


Exemplu:

afiºeazã ºirul Raza: în zona de dialog din josul ecranului ºi aºteaptã. Dacã
(getint ”Raza: ”)

acum introduceþi o valoare, de exemplu 73, paranteza este înlocuitã cu va-


loarea 73. O sã ziceþi: „stai domnule, ºi ce-i cu asta? cum adicã se înlocuieºte
paranteza cu valoarea 73?“
Ca sã vã lãmuriþi, am sã dau douã exemple care fac acelaºi lucru, dar pe cãi
diferite, ºi anume atribuie valoarea 73 variabilei de tip întreg RAZA:
(setq raza 73)
(setq raza (getint ”Raza: ”))
În cazul al doilea vom introduce de la tastaturã valoarea 73, ca sã fie la fel
ca în primul caz. Ce observãm? Observãm cã numele variabilei nu se aflã în
Capitolul 2 43

paranteza getint. Acolo este un simplu text care trebuie sã fie afiºat ca
atare, ca sã ºtim de ce s-a oprit rularea programului. Dacã puneam:
(setq raza (getint))
totul era logic similar, decât cã nu se afiºa nici un text atunci când se aºtep-
ta introducerea valorii. Asta poate sã producã derutã, deoarece e incomod
sã ºtii pe dinafarã care este succesiunea cererilor formulate de program ºi
sã introduci „orbeºte“ o valoare (aici 73).
Dupã ce aþi introdus fatidicul 73 ºi aþi apãsat Enter, aºa cum spuneam,
paranteza toatã este înlocuitã cu valoarea 73. Evaluatorul va trece acum la
analiza parantezei externe ºi o va gãsi absolut identicã - nu? - cu cea din
cazul anterior. Ca urmare, va atribui valoarea 73 variabilei RAZA. Asta-i

Încã ceva... Dacã doriþi ca textul <prompt> sã aparã singur pe linie (ºi nu
tot!

în prelungirea textului Command:, care apare în mod normal în zona de


dialog a AutoCAD-ului), va trebui sã puneþi un cod la începutul ºirului.
Acest cod este un ºir douã caractere, dintre care primul este un „backslash“,
adicã bara înclinatã invers „\“ (trebuie sã faceþi distincþie pe tastaturã între
cele douã bare înclinate: „slash“ (/) ºi „backslash“ (\)). Al doilea caracter
este „n“ (de la „new line“, adicã linie - de text - nouã).

\e
Celelalte coduri posibile sunt:

\r
pentru ESCAPE

\t
pentru RETURN

\\
pentru TAB

\nnn
pentru „backslash“ însuºi
pentru caracterul al cãrui cod octal este nnn
De remarcat la ultimul baza de numeraþie 8, nemaiîntâlnitã în MS-DOS
(vezi ºi anexa B pentru comentarii legate de bazele de numeraþie).
De exemplu, punând:

textul Raza: va apãrea sub linia Command: ºi nu în continuarea acesteia.


(setq raza (getint ”\nRaza: ”))

Probaþi!
44 Programare simplã în AutoLISP

(getreal [<prompt>])

Cu aceastã funcþie, singura diferenþã este cã tipul variabilei va fi real ºi nu


întreg. Veþi putea da rãspusul la aceastã cerere incluzând ºi punctul zeci-
mal în numãr. Dacã nu-l puneþi, atunci variabila va primi valoarea respec-

getint, puneþi ºi un punct zecimal, veþi primi un mesaj de eroare: acolo


tivã ca întreagã, urmatã de zecimale nule. Dacã, însã, la funcþia anterioarã

variabila este de tip întreg!


Exemplu:
(setq d1 (getreal ”\nIntroduceti valoarea lui D1: ”))

sub Command: ºi va aºtepta o valoare cu sau fãrã punct zecimal. Dacã


va afiºa mesajul „Introduceti valoarea lui D1“ (fãrã ghilimele) pe linia de

rãspundeþi, de exemplu, 0.023, valoarea variabilei D1 va fi 0.023, iar dacã


daþi 23, valoarea variabilei D1 va fi 23.0. Mai puteþi rãspunde ºi sub formã
exponenþialã; astfel, dând 1e6 aþi dat de fapt 1000000 (adicã 1x106), dar asta
se poate face oricând ºi în AutoCAD

(getstring [<cr>] [<prompt>])

(ca valoare „string“) paranteza getstring.


Aceastã funcþie aºteaptã introducerea unui ºir de caractere care va înlocui

<cr>
Aici aveþi douã elemente opþionale:

<prompt>
= constantã sau variabilã logicã, cu valoarea T sau nil
= ºir prompter, ca mai sus
Ce înseamnã „constantã logicã“ sau „variabilã logicã“. Pânã acum n-am
vorbit despre aºa ceva. Da, dar am vorbit despre „expresii condiþionale“,

din valorile bivalente T (de la True, adicã adevãrat) sau nil (adicã nul, adicã
nu? Acestea sunt tot niºte „paranteze“, doar cã evaluarea lor ducea la una

negaþie). Dacã în poziþia <cr> veþi pune „valoarea“ T sau nil, vom spune
Capitolul 2 45

sie condiþionalã care prin evaluare conduce la T sau nil, vom spune cã aþi
cã aþi pus o constantã logicã având aceastã valoare. Dacã veþi pune o expre-

folosit o variabilã logicã. Asta este o simplã convenþie, între noi, fiindcã
evaluatorul face acelaºi lucru, nu?
Dar n-am spus la ce foloseºte chestia asta!
Dacã <cr> este nil (sau lipseºte de tot, fiind opþional), atunci ºirul de ca-
ractere pe care-l introduceþi de la tastaturã va fi considerat încheiat la

cuvânt). Dacã <cr> este T, atunci se aºteaptã introducere de text ºi dupã


primul blanc (sau Enter) pe care îl introduceþi (deci este primit un singur

ce aþi introdus vreun blanc. Încheierea trebuie sã fie fãcutã în acest caz cu
Enter.
Exemplu:
(setq cmd (getstring „\nNume comanda: “))
aºteptã introducerea unui singur cuvânt, care va fi atribuit variabilei ºir
CMD. Veþi încheia introducerea ºirului fie cu blanc, fie cu Enter.
(setq nume (getstring T „\nNumele Dvs.: “))

loarea parametrului <cr> este T. Veþi încheia introducerea ºirului (numai)


Aici puteþi rãspunde dându-vã atât numele cât ºi prenumele, deoarece va-

cu <Enter>.

(getpoint [<pt>] [<prompt>])

Aceastã funcþie permite introducerea (dinamicã) a unui punct geometric.

<pt> = un punct geometric


Parametrii (opþionali) sunt:

<prompt> = ºir de caractere cu rol de prompter, ca mai sus


Punctul geometric pe care-l daþi opþional va servi ca bazã pentru linia elas-
ticã ce se va trasa dinamic de la acel punct pânã la punctul curent, indicat
cu colimatorul grafic. Linia elasticã este creatã de mecanismul specific al
AutoCAD-ului, putând sã desemneze distanþa sau direcþia mãsuratã de la o
bazã datã de Dvs., astfel încât, atunci când indicaþi celãlalt capãt (apãsând
46 Programare simplã în AutoLISP

butonul „pick“ - adicã cel din stânga - al mouse-ului), sã aveþi o imagine a


acestor douã puncte. Folosind acest mecanism puteþi sã faceþi fie desenãri
de entitãþi, fie deplasãri ale acestora, fie numai indicarea unor direcþii, etc.
Exemple:

afiºeazã prompterul Pozitie: în zona de dialog ºi aºteaptã coordonatele


(setq pcta (getpoint „\nPozitie: “))

unui punct. Ansamblul coordonatelor va fi atribuit (ca listã) variabilei de


tip punct geometric PCTA. Coordonatele pot fi indicate pe orice cale: abso-
lut, relativ sau prin indicare directã pe ecran cu cursorul grafic (colimator).
Efectul va fi cã variabila PCTA va primi acea poziþie ºi depinde de Dvs.
modul de folosire al ei.
(setq pctb (getpoint (list 10 20 30) „\nInaltime: “))
Aici se va trasa ºi o linie elasticã de la punctul (10,20,30) pânã la punctul
curent indicat (dinamic) cu colimatorul.
Este bine sã probaþi aceastã funcþie ca sã vã lãmuriþi exact ce face.

(getcorner <pt> [<prompt>])

Aceastã funcþie returneazã un punct, ca ºi GETPOINT, dar, în plus, cere ca


argument obligatoriu un punct de bazã <pt> ºi deseneazã un dreptunghi
începând din acel punct, pe mãsurã ce utilizatorul mutã cursorul grafic pe
ecran. Veþi dispune astfel, nu de o linie elasticã, ci de o fereastrã elasticã (a
se vedea exemplul ce urmeazã în curând).

(getdist [<pt>] [<prompt>])

Parametrul <prompt> este un ºir opþional ce va fi afiºat ca prompter iar


Aceastã funcþie aºteaptã introducerea unei distanþe de cãtre utilizator.

<pt> este un punct de bazã 2D sau 3D opþional din UCS-ul curent. Se


poate specifica o distanþã introducând orice numãr care se aliniazã la stan-
dardul curent de unitãþi al AutoCAD-ului. De notat cã, ºi dacã sistemul
curent este cel arhitectural anglo-saxon, cu unitãþi date în picioare ºi þoli,
Capitolul 2 47

funcþia returneazã totdeauna distanþa ca numãr real.


Se pot da, de asemenea, douã puncte, iar AutoCAD va returna distanþa din-
tre ele, desenând o linie elasticã de la primul punct la poziþia curentã a cur-

opþional <pt> al lui GETDIST, dacã este dat, este tratat ca primul punct
sorului grafic pentru a vã asista în vizualizarea distanþei. Argumentul

dintre acestea douã.


Iatã exemple cu GETDIST:
(setq dist (getdist))
(setq dist (getdist ‘(1.0 3.5)))
(setq dist (getdist „Pana unde? “))
(setq dist (getdist ‘(1.0 3.5) „Pana unde? “))

2.4 Alte funcþii

În cele ce urmeazã se mai dã sintaxa câtorva funcþii utile.

(command [<args>])

Aceastã funcþie asigurã transmisia de comenzi de la AutoLISP la

<args> = argumente reprezentând comenzi ºi subcomenzi AutoCAD


AutoCAD. Aici:

Sunt evaluate succesiv comanda ºi subcomenzile, fiind furnizate ca atare


lui AutoCAD. Dacã argumentele lipsesc cu totul, se executã un CTRL/C,
adicã se anuleazã o comandã datã anterior ºi rãmasã în suspensie.
Primul argument dã numele comenzii AutoCAD, adicã este cuvântul cheie
(din lista de comenzi ale AutoCAD-ului) ºi trebuie sã fie inclus între paran-
teze. Pe mãsurã ce comanda AutoCAD este executatã, în zona de dialog
apare efectiv dialogul, ca ºi când aþi da aceste comenzi „de mânã“. Dacã
doriþi sã nu se vadã acest lucru, setaþi variabila de sistem CMDECHO pe
zero. Pentru asta, folosiþi fie comanda SETVAR din AutoCAD, fie funcþia
48 Programare simplã în AutoLISP

setvar din AutoLISP explicatã mai sus. Evaluarea acestei funcþii


returneazã totdeauna nil.
Exemple:
(command „line“ (list 10 20) (list 25 60) (list 30 40) „c“)
traseazã o linie din punctul (10,20) în (25,60), apoi în (30,40) ºi închide
(datoritã lui „Close“) triunghiul început în (10,20). Datoritã faptului cã aici
listele de puncte au numai valori constante, aceeaºi comandã mai poate fi
scrisã ºi aºa:
(command „line“ ‘(10 20) ‘(25 60) ‘(30 40) „c“)
Alt exemplu:
(command „circle“ ‘(80 100) 70)
traseazã un cerc cu centrul în (80,100) ºi raza 70.

2.5 Un exemplu simplu

Dacã ne propunem sã scriem un program AutoLISP cu elementele cunos-


cute pânã acum, una dintre utilizãri poate sã fie aceea de a crea menu-uri.
Sã trasãm direct un dreptunghi (un chenar), indicând doar colþurile sale
diagonal opuse. Pentru asta, trebuie creat un fiºier text cu numele
Chenar.Mnu (de exemplu) al cãrui conþinut sã fie:

[CHENAR](setq a (getpoint „Primul colt: „));\(setq b (getcorner a


„Coltul opus: „));\pline !a (list (car a) (cadr b)) !b (list (car
b) (cadr a)) c;

Aici totul este pus într-o singurã linie. Dacã doriþi, puteþi secþiona linia ori-
unde, punând ca ultim caracter în fiecare nouã linie apãrutã semnul „+“,
cu excepþia ultimei linii. Acesta este caracterul de continuare la texte de
menu. Puteþi pune totul astfel:
[CHENAR](setq a (getpoint „Primul colt: „));\+
Capitolul 2 49

(setq b (getcorner a „Coltul opus: „));+


\pline !a (list (car a) (cadr b)) +
!b (list (car b) (cadr a)) c;
Trebuie sã aveþi grijã cu blancurile, pentru cã ele sunt semnificative! De
exemplu, dând comanda „PLINE“ urmatã de „!A“, arãtãm cã dorim sã
începem o polilinie din punctul dat de variabila „A“. Dacã între aceste douã
ºiruri punem douã blancuri ºi nu unul, atunci AutoCAD abandoneazã
comanda PLINE, fiindcã în loc de a-i da un punct de început (la cererea
„From point:“) apãsãm blanc, acesta comportându-se ca ºi Enter.
Având fiºierul Chenar.Mnu în directorul curent, dacã lansaþi AutoCAD ºi
daþi comanda MENU, rãspunzând cererii prin numele CHENAR, veþi
încãrca un nou menu în locul celui obiºnuit. Acesta dispune de o singurã
opþiune: opþiunea CHENAR, afiºatã pe ecran în dreapta sus. Ea apare
datoritã faptului cã eticheta [CHENAR] se aflã în prima poziþie din linia
menu.
Sã descifrãm ce face.
Dacã alegeþi din menu unica opþiune CHENAR, se lanseazã „comenzile“
care apar în urma etichetei de menu [CHENAR], luându-se în considerare
caracterele începând imediat dupã paranteza dreaptã închisã „]“. De reþi-
nut cã, potrivit sintaxei fiºierelor menu, parantezele drepte NU indicã ele-
mente opþionale (ca în sintaxele AutoLISP date mai sus), ci trebuie sã fie
înscrise ca atare în fiºier.
Comenzile din urma parantezei menþionate ar putea fi scrise mai clar ast-
fel:
(setq a (getpoint „Primul colt: „))
(setq b (getcorner a „Coltul opus: „))
pline !a (list (car a) (cadr b)) !b (list (car b) (cadr a)) c
Acestea sunt comenzi AutoCAD, sã fim înþeleºi! Dacã le daþi pe prompterul
„Command:“ ele se vor executa direct, chiar dacã unele sunt expresii
AutoLISP, nu-i aºa?
Prima dintre ele seteazã variabila A, cerându-vã Dvs. (prin prompterul
„Primul colt:“) sã daþi coordonatele unui punct, datoritã funcþiei GET-
POINT.
50 Programare simplã în AutoLISP

A doua linie atribuie, tot aºa, valoare de punct geometric variabilei B, dar
deseneazã (datoritã lui GETCORNER) ºi o fereastrã elasticã, al cãrei colþ
de referinþã este punctul A dat anterior.
A treia linie este un hibrid: apar aici mixate ºi comenzi AutoCAD (de fapt
una singurã) ºi expresii AutoLISP. Sã ne explicãm. Comanda PLINE din
AutoCAD starteazã trasarea unei polilinii. Dacã o daþi, veþi ajunge la:
Command: PLINE
From point:
Punctul pe care îl daþi acum este punctul de start al poliliniei. Linia noas-
trã începe cu cuvântul „pline“, un blanc ºi „!a“. Aceste elemente îi sunt
„livrate“ lui AutoCAD, care înþelege sã execute comanda PLINE, deoarece
blancul de dupã acest cuvânt este terminatorul de comandã, nu-i aºa? Mai
departe, „!a“ va exprima punctul definit anterior, adicã punctul A, expri-
marea þinând de mecanismul AutoLISP explicat mai sus. Aºadar se va exe-
cuta:
From point: !a
Current line-width is 0.0000
Arc/Close/Halfwidth/Length/Undo/Width/<Endpoint of line>:
Cum de s-a preluat ºirul „!a“? Vã spun eu: datoritã blancului care apare
dupã acest ºir în linia datã de noi! De acum, totuºi, vom considera cã se
înþelege bine funcþia exprimatã de caracterul „blanc“ (sau „space“, dacã vã
place mai mult). Prea am insistat asupra ei ca sã nu vã fi plictisit!
Mai departe, dupã cum vedeþi (ºi de fapt ºtiþi foarte bine din AutoCAD), vi
se cere sã daþi una din opþiunile A, C, H, L, U, W, sau sã daþi coordonatele
unui punct, care va fi considerat „Endpoint of line“. Acesta din urmã va fi
al doilea capãt al vertex-ului poliliniei începute în „!a“. Pe el ºi alegem sã–l
dãm ca rãspuns la cererea cu pricina. Îl dãm sub forma:
(list (car a) (cadr b))
Aici se dã un punct geometric prin coordonatele sale, aºa cum am învãþat.
Coordonata X a sa este coordonata X a punctului A, datoritã folosirii
funcþiei CAR din AutoLISP, care asta face. Tot aºa, coordonata sa Y este
coordonata Y a punctului B, prin utilizarea funcþiei CADR din AutoLISP.
Asta face sã se traseze deja primul vertex al poliliniei, ca în figura:
Capitolul 2 51

Observaþi punctele selectate A ºi B, ca ºi Endpoint-ul primului vertex.


Într–adevãr, acesta are coordonata X a lui A ºi coordonata Y a lui B.
Urmeazã linia:
Arc/Close/Halfwidth/Length/Undo/ Width/<Endpoint of line>:
care cere iarãºi un punct de capãt al noului vertex. I se furnizeazã „!b“,
deoarece chenarul pe care urmãrim sã-l trasãm va trece în continuare prin
punctul B. Pe ecran apare:

Acum e clar, nu? La cererea urmãtorului „Endpoint“ de vertex se dã:


(list (car b) (cadr a))
52 Programare simplã în AutoLISP

care specificã cele douã coordonate ale acestui punct: X-ul lui B ºi Y-ul lui
A. Chenarul nostru va arãta ca un „U“.
Ultimei cereri de acelaºi fel a comenzii PLINE i se furnizeazã opþiunea
„C“. Prin asta, dupã cum ºtiþi, în loc de a da un nou Endpoint de vertex se
cere închiderea („Close“) poliliniei începute din punctul A. Chenarul este
încheiat, comanda PLINE este încheiatã, deci apare iar prompterul:

Cred cã este clar cã în locul ultimei comenzi AutoCAD (pline) datã


Command:

direct, s-ar fi putut pune o expresie AutoLISP care sã foloseascã funcþia


command. În acest caz, în locul secvenþei:
pline !a (list (car a) (cadr b)) !b (list (car b) (cadr a)) c
am fi pus:
(command „pline“ a (list (car a) (cadr b)) b
(list (car b) (cadr a)) „c“)
cu acelaºi efect.
Vã rog sã încercaþi acest exemplu înainte de a trece mai departe! Nu vã li-
mitaþi numai sã citiþi aici, pentru cã nu veþi fixa cunoºtinþele. Cum spunea
regretatul Profesor Grigore Moisil, referindu-se chiar la calculator, ar fi ca
ºi când, dacã aþi dori sã învãþaþi pianul, aþi desena clapele pe o scânduricã
ºi aþi apãsa pe ea, imaginându-vã sunetele...

2.6 Definirea funcþiilor

Marea utilitate a AutoLISP-ului nu rezidã însã numai în a crea menu-uri.


Crearea de funcþii este, de fapt, miezul eficienþei acestui limbaj. Nici nu
este mare lucru. Citiþi cele ce urmeazã!
Pentru a crea funcþii se foloseºte tot o funcþie: defun.
Capitolul 2 53

(defun <simb> ([<lista_arg>]) <expr>...)

<simb> = numele funcþiei


unde:

<lista_arg> = argumentele funcþiei, date ca listã


<expr> = una sau mai multe expresii care formeazã „corpul“ funcþiei
Numele funcþiei este liber ales de Dvs. ºi nu trebuie sã fie pus între

funcþie internã. Ca sã vã asiguraþi, daþi un !atomlist (sau (atoms-family


ghilimele. Acest nume trebuie sã nu se suprapunã peste vreun nume de

0)), aºa cum s-a arãtat la 2.1, mai sus, pentru a vedea ce funcþii sunt deja
definite.
Dacã tot am descifrat exemplul cu chenarul de mai sus, sã facem o funcþie
care traseazã dreptunghiuri. Corpul ei va fi format din expresiile de acolo.
S-o numim DRPT. Iat-o:

(defun drpt ()
(setq a (getpoint „Primul colt: „))
(setq b (getcorner a „Coltul opus: „))
(command „pline“ a (list (car a) (cadr b))
b (list (car b) (cadr a)) „c“)
)

începutã cu paranteza de dinaintea lui defun ºi încheiatã cu ultima paran-


Dupã cum se observã, nimic nou sub soare... E vorba de o simplã listã,

tezã. N-am fãcut decât sã aliniez frumos expresiile ce compun corpul


funcþiei. Aici blancurile nu mai conteazã decât atunci când sunt intercalate
în ºirurile text cuprinse între ghilimele, ca ºi sfârºiturile de linie. Totul se
aranjeazã ca sã fie cât mai lizibil.
Scrieþi aceastã funcþie ca fiºier text, sub numele „DRPT1.LSP“, de exem-
plu. Intraþi în AutoCAD ºi, pe prompterul „Command: „ daþi „comanda“:
54 Programare simplã în AutoLISP

Command: (load „drpt1“)


DRPT
Command:
Dupã cum vedeþi, vi se returneazã numele funcþiei definitã în cadrul
fiºierului. Acum daþi:
Command: (drpt)
Vor apãrea cererile succesive:
Primul colt:
Coltul opus:
Dupã ce aþi rãspuns indicând cele douã colþuri diagonal opuse ale drep-
tunghiului (colþul al doilea vi se cere trasându-se dinamic fereastra elasticã
datoritã lui GETCORNER), acesta va fi trasat pe ecran sub forma unei
polilinii. Veþi vedea cã se dau ºi opþiunile comenzii PLINE. Dacã daþi
comanda SETVAR ºi setaþi pe zero variabila CMDECHO, aceste opþiuni
nu vor mai apãrea, aºa cum s-a spus.
Sã vedem ce mai putem face.
Dacã vã uitaþi, pentru a trasa acum un alt dreptunghi trebuie sã dãm (drpt),
deci sã punem ºi niºte paranteze. O perfecþionare extrem de interesantã este
cea care face ca noua noastrã funcþie sã fie „adoptatã“ de AutoCAD drept
comandã proprie. Pentru asta n-avem decât sã punem în definiþia funcþiei
prefixul „C:“ la numele acesteia. Atunci prima linie a definiþiei funcþiei va
fi:
(defun C:DRPT ()
urmãtoarele rãmânând la fel. Dacã acest nou fiºier va purta numele
„DRPT2.LSP“, vom încãrca funcþia cu:
Command: (load „drpt2“)
C:DRPT
Command:
Daþi acum „comanda“ DRPT nou creatã:
Command: DRPT
Primul colt:
Coltul opus:
etc.
Capitolul 2 55

Observaþi cã sunteþi înºtiinþat asupra faptului cã s-a creat o nouã comandã,


deoarece puteþi interpreta prefixul „C:“ prin „Comandã“. Dacã, imediat
dupã încheierea comenzii DRPT apãsaþi Enter (sau blanc), aceasta este

este perfectã. Dând un !atomlist (sau (atoms-family 0)) veþi gãsi


repetatã, potrivit mecanismului cunoscut al AutoCAD-ului, deci integrarea

„C:DRPT“ printre ceilalþi atomi, fapt ce confirmã existenþa acestei noi


comenzi.
Mai mult de atât, dacã doriþi sã faceþi ca funcþia DRPT sã fie permanent
accesibilã, ori de câte ori vã aflaþi în AutoCAD, veþi crea un fiºier cu numele
special „ACAD.LSP“ al cãrui conþinut sã fie reprezentat de aceastã funcþie.
Lansând AutoCAD-ul din directorul în care se aflã fiºierul „ACAD.LSP“
astfel creat, acesta îl va încãrca în mod automat de la bun început. Întot-
deauna, la lansare, AutoCAD cautã un fiºier cu acest nume în directorul
curent; dacã-l gãseºte, îl încarcã, dacã nu, nu face nimic. Ca variantã, puteþi
pune acest fiºier în directorul unde se aflã fiºierul ACAD.EXE ºi atunci el
va fi încãrcat întotdeauna, indiferent de directorul din care lansaþi ACAD.
Vã puteþi defini astfel o mulþime de funcþii ºi funcþioare pe care le-aþi rafi-
nat în timp ºi care vã vor servi la uºurarea activitãþilor rutiniere. O sã ziceþi:
stai, dar cum fac sã mai definesc încã o funcþie în acelaºi fiºier? Foarte sim-
plu, am sã vã rãspund, puneþi-o în continuarea celeilalte, pe liniile urmã-
toare!
De exemplu, dacã doriþi sã vã faceþi o funcþie interactivã de conversie din
grade în radiani, denumitã „GR“, n-aveþi decât sã scrieþi un fiºier GR.LSP
cu conþinutul:
(defun C:GR ()
(setq x (getreal „Grade: „))
(* (/ pi 180) x)
)
Încãrcând fiºierul ce conþine funcþia cu (load „gr“) ºi dând acum comanda
GR veþi parcurge un dialog de genul:
Command: GR
Grade: 90
1.5708
Într-adevãr, 90 de grade fac 1.5708 radiani (adicã π/2).
56 Programare simplã în AutoLISP

Ca sã aveþi la dispoziþie ambele funcþii, creaþi fiºierul ACAD.LSP care le


reuneºte:

(defun C:DRPT()
(setq a (getpoint „Primul colt: „))
(setq b (getpoint „Coltul opus: „))
(command „pline“ a (list (car a) (cadr b))
b (list (car b) (cadr a)) „c“)
)
(defun C:GR ()
(setq x (getreal „Grade: „))
(* pi (/ x 180))
)

Sã vedem acum ce este cu argumentele de funcþii.


Observaþi cã în ambele cazuri argumentele au lipsit, apãrând doar perechea
de paranteze „()“. Aceste argumente sunt necesare atunci când dorim ca la
apelul funcþiei sã transmitem ºi valori cu care aceasta sã opereze.
Sã prelucrãm puþin funcþia de trasare a unor dreptunghiuri, separând
partea de dialog de cea de trasare propriu-zisã a dreptunghiurilor. Putem
s–o organizãm astfel:

(defun C:CHENAR ()
(setq a (getpoint „Primul colt: „))
(setq b (getcorner a „Coltul opus: „))
(drpt a b)
)
(defun DRPT (a b)
(command „pline“ a (list (car a) (cadr b))
b (list (car b) (cadr a)) „c“)
)

Observaþi cã aici avem douã funcþii: una este CHENAR ºi alta DRPT.
Prima e definitã drept comandã AutoCAD (se vede cã e prefixatã cu „C:“)
Capitolul 2 57

iar a doua ca funcþie AutoLISP cu argumente. Cele douã defun fac aceste
definiri. Apelul celei de-a doua se face în prima prin linia:
(drpt a b)

se face cu defun, iar apelul se face direct prin numele astfel definit. La
De notat diferenþa între DEFINIREA unei funcþii ºi APELUL ei: definirea

definire, parametrii (sau argumentele) funcþiei se zice cã sunt formali, iar


la apel se numesc curenþi. Trebuie sã faceþi aceastã deosebire. Parametrii
formali aratã legãtura între nume ºi poziþie în cadrul funcþiei, iar cei
curenþi dau valorile care trebuie transferate de la funcþia apelantã la cea
apelatã. De fapt, asta reprezintã o problematicã aparte în programare.
La apel se vede cã nu e nici o diferenþã între funcþia definitã de noi ºi
funcþiile AutoLISP intrinseci: ºi a noastrã este o listã, în care primul atom

renþã formalã vedeþi între (drpt a b) ºi (* x y)? Nici una, nu-i aºa?
exprimã funcþia iar urmãtorii doi specificã argumentele acesteia. Ce dife-

Mergând mai departe, sã zicem cã fiºierul care conþine acest text se


numeºte DRPT3.LSP. Din AutoCAD dãm:
Command: (load „drpt3“)
DRPT
Command:
Am primit evaluarea ultimei liste: numele DRPT. Noi ºtim însã cã s-a
definit comanda CHENAR ºi cã DRPT este apelatã de aceasta. Într-adevãr,
dacã dãm acum:
Command: CHENAR
Primul colt: indicaþi primul colþ
Coltul opus: indicaþi colþul diagonal opus
se traseazã dreptunghiul, apãrând succesiv subopþiunile comenzii PLINE
Cum se vede, între funcþiile CHENAR ºi DRPT se transmit efectiv argu-
mentele A ºi B.
Ne deranjeazã douã lucruri: dupã încãrcare se afiºeazã numele funcþiei
DRPT ºi nu al comenzii CHENAR, pe de o parte, iar la execuþia comenzii
CHENAR se afiºeazã subopþiunile sale, pe de altã parte. Este neplãcutã
defilarea liniilor de subcomandã PLINE, care „aleargã“ prin zona de dia-
log, dând senzaþia cã ceva este greºit!
58 Programare simplã în AutoLISP

Sã vedem cum facem sã îndreptãm aceste neajunsuri. Primul îl rezolvãm


schimbând, pur ºi simplu, între ele poziþiile celor douã funcþii: vom pune
întâi DRPT ºi apoi CHENAR. Asta nu deranjeazã cu nimic, deoarece atât
CHENAR cât ºi DRPT vor fi douã funcþii clar definite în urma încãrcãrii.
Oricare funcþie poate apoi s-o apeleze pe cealaltã. Logica apelãrii a fost datã
de noi, prin includerea numelui unei funcþii (DRPT) în cealaltã
(CHENAR), lui AutoLISP fiindu-i suficient faptul cã îi sunt cunoscute.
Lansarea efectivã în rulare se face dând comanda CHENAR pe prompterul
„Command:“. Abia acum este necesar ca cele douã funcþii sã fie definite,
fãrã sã importe ordinea în care s-a fãcut definirea!

zero. Pentru asta, putem folosi, aºa cum se spunea mai sus, funcþia setvar
Al doilea neajuns îl rezolvãm setând variabila de sistem CMDECHO pe

din AutoLISP, sub forma:


(setvar „CMDECHO“ 0)
Sã mai punem ºi codurile „\n“ pentru a separa dialogul pe linii.
Atunci, fiºierul DRPT4.LSP va arãta astfel:

(defun DRPT(a b)
(command „pline“ a (list (car a) (cadr b))
b (list (car b) (cadr a)) „c“)
)
(defun C:CHENAR()
(setvar „CMDECHO“ 0)
(setq a (getpoint „\nPrimul colt: „))
(setq b (getcorner „\nColtul opus: „))
(drpt a b)
)
Secvenþa de lucru va fi:
Command: (load „drpt4“)
C:CHENAR
Command: CHENAR
Primul colt: indicaþi-l
Coltul opus: indicaþi-l
nil
Capitolul 2 59

Command:
Acum, dacã apãsaþi Enter (sau butonul Enter de pe mouse), comanda

De observat cã simbolul nil apare ca efect al „evaluãrii“ ultimei paranteze


CHENAR va fi repetatã automat. Puteþi trasa o groazã de dreptunghiuri!

le cerceteazã: dacã sunt corecte, le evalueazã. La noi, paranteza (command


a lui DRPT. Despre ce e vorba? Pãi, se ºtie, evaluatorul preia parantezele ºi

„pline“...) nu ne intereseazã pentru valoarea ce rezultã din evaluare


(valoarea fiind nil), ci ne intereseazã cã executã niºte acþiuni: traseazã drep-
tunghiul! Sunt alte situaþii în care tocmai evaluarea ne intereseazã. De
exemplu, dacã definim funcþiile:
(defun GR (x)
(* (/ pi 180) x)
)
(defun C:CONVERSIE ()
(setq x (getreal „\nGrade: „))
(gr x)
)
iar numele fiºierului este CONV.LSP, atunci dialogul poate fi:
Command: (load „conv“)
C:CONVERSIE
Command: CONVERSIE
Grade: 90
1.5708
Command:
E corect: 90 de grade fac π/2 = 1.5708 radiani. Cum s-a obþinut aceastã va-
loare? Dacã vã uitaþi cu atenþie, linia (gr x) apeleazã funcþia GR, trans-

getreal). La apelarea acestei funcþii, evaluatorul gãseºte paranteza (* (/


ferându-i argumentul X, a cãrui valoare este 90.0 (este un real datoritã lui

pi 180) x). Se evalueazã ºi dã 1.5708. Ca urmare, se afiºeazã aceastã


ultimã valoare, adicã exact ceea ce ne intereseazã!
Odatã definitã, o funcþie rãmâne utilizabilã ca atare pânã la:
- ieºirea din AutoCAD
- redefinirea prin încãrcarea unui defun cu o funcþie sinonimã
60 Programare simplã în AutoLISP

Ca sã ne raportãm la terminologia curentã din Programare, funcþia CON-


VERSIE este programul principal, iar funcþia GR este o subrutinã. Din pro-
gramul principal ºi din orice subrutinã pot fi apelate orice funcþii (care vor
juca rol de subrutine).

2.7 Alt exemplu

Dacã tot ºtim sã lucrãm cu funcþii, atunci haideþi sã scriem un program


AutoLISP pentru reprezentarea graficã prin cerculeþe a funcþiilor mate-
matice de o variabilã.
Pentru asta, facem un program principal ºi o funcþie AutoLISP.
Programul principal fixeazã spaþiul de lucru ºi declanºeazã un ciclu în care
deseneazã în mod repetat un cerc centrat în punctele graficului.
Fiºierul cu pricina poartã numele GRAF.LSP. Conþinutul lui este urmã-
torul:

(defun fct (x)


(sin x) ; functia de reprezentat...
) ; ... ce poate fi schimbata direct

(defun C:GRAFIC ()
(setvar „CMDECHO“ 0)
(setvar „BLIPMODE“ 0)
(setq n 30) ;nr. puncte reprezentare
(setq domx (* pi 2)) ;domeniu x
(setq colt1 (list -1 -2)) ;colt zoom
(setq colt2 (list (+ domx 1) 2)) ;colt zoom
(command „zoom“ „w“ colt1 colt2) ;zoom window
(command „line“ (list 0 0) (list domx 0) ““) ;axa x
(setq i 0) ;initializare contor
(while (<= i n) ;debut ciclu
Capitolul 2 61

(setq x (* i (/ domx n))) ;x curent


(command „circle“ (list x (fct x)) 0.1) ;cerc crt
(setq i (+ i 1)) ;incrementare contor
)
(princ „ OK grafic!“) ;mesaj final
(princ)
)

Observaþi cum se introduc comentariile: se pune un „;“ dupã care în linie


putem scrie ce vrem, deoarece AutoLISP nu se ocupã de restul liniei.
Funcþia de reprezentat se numeºte FCT ºi este banala funcþie sin, iar
comanda care o apeleazã este implementatã prin funcþia GRAFIC.

Command: (load „graf“)


Încãrcarea ºi execuþia sunt ilustrate de dialogul:

C:GRAFIC
Command: GRAFIC
OK grafic!
Command:
Ceea ce apare pe ecran este:

Sã vedem cum de se fac toate cele din pozã! La ce ne uitãm? La programul


principal, evident! Acesta este nucleul acþiunii; din el sunt apelate even-
tualele subrutine.
Aici, programul principal este funcþia-comandã GRAFIC. Prima datã sunt
setate variabilele de sistem CMDECHO ºi BLIPMODE astfel încât comen-
62 Programare simplã în AutoLISP

zile ºi subcomenzile sã nu aparã pe ecran în zona de dialog, pe de o parte,


ºi nici sã nu aparã cruciuliþele (blips) în zona graficã, pe de altã parte.
Apoi, se fixeazã variabila N pe valoarea 30; aceasta va preciza câte cerculeþe
sã fie desenate, divizând domeniul pe X al funcþiei de reprezentat.
Domeniul pe X este fixat prin setarea variabilei DOMX pe valoarea 2π, aºa
cum se vede.
Se definesc în continuare colþurile unei ferestre care sã delimiteze zona
afiºatã ºi se dã efectiv comanda ZOOM W pe aceastã fereastrã.

AutoCAD. Se observã ºirul vid ““ care încheie „To point:“-urile acestei


Se traseazã apoi axa X pe lungimea DOMX, folosind comanda LINE din

comenzi, fiind echivalent cu un Enter.


Urmeazã setarea unui contor, exprimat de variabila I. Acest lucru este nece-
sar pentru a controla un ciclu care sã execute repetitiv desenarea de cercuri.
În AutoLISP ciclarea este implementatã prin funcþia WHILE. În englezã,
„while“ înseamnã „atâta timp cât“. Despre asta încã nu am vorbit. Iatã sin-
taxa lui WHILE:

(while <expr_test> <expr>...)

<expr_test>
unde:

<expr>...
= expresie condiþionalã
= expresii oarecari puse una dupã alta
Practic, deschiderea parantezei din faþa numelui „while“ face ca AutoLISP
sã exploreze lista de expresii care urmeazã. El se aºteaptã ca prima expre-

departe sau nu. Dacã rezultatul NU este nil, atunci se vor evalua ºi expre-
sie sã fie condiþionalã; funcþie de rezultatul evaluãrii acesteia se trece mai

dacã rezultatul este nil, atunci expresiile care urmeazã nu mai sunt evalu-
siile care urmeazã, pânã la întâlnirea parantezei pereche a celei menþionate;

ate, adicã sunt „sãrite“, trecându-se la evaluarea celor DE DUPţ acea

strucþie la modul: „atâta timp cât expresia test nu este nil, evalueazã expre-
parantezã pereche. E simplu, domnilor, e simplu... Veþi citi o astfel de con-

siile urmãtoare; când expresia test a devenit nil, ieºi“. Spunem cã expresi-
Capitolul 2 63

cutã ori de câte ori expresia condiþionalã nu este nil. Prin asta se creeazã un
ile de dupã cea condiþionalã formeazã corpul lui while. Acest corp se exe-

ciclu, nu-i aºa, reluat atâta timp cât expresia test nu e nil. Puteþi, pentru
Dvs., sã ziceþi cã expresia test non-nil este adevãratã, dar nu-i aºa! Se neagã
negaþia... ºi aºa trebuie s-o gândiþi, deci expresia test conduce la reluarea

devenit nil.
ciclului indiferent de valoare, încheierea producându-se atunci când a

Trebuie sã observaþi cã în expresia test trebuie sã se schimbe ceva de la o


reluare la alta, fiindcã altfel ciclarea nu se terminã niciodatã, adicã se
ajunge într-o buclã infinitã. Acest lucru poate sã vã dea bãtaie de cap: ve-
rificaþi dacã în aceastã expresie apare o variabilã a cãrei valoare este modi-
ficatã în corpul lui while. Dacã nu e, atunci veþi aºtepta mult ºi bine ca sã
vi se încheie ciclul! Sã vedem un exemplu:

Command: (setq a 1)
1
Command: (while (<= a 10)
1> (setq c a)
1> (setq a (+ a 1))
1> )
11
Command:

S-a înþeles cã am introdus direct „la mânã“ din AutoCAD liniile de mai sus.
Se observã cã primim „1>“ pânã ce închidem paranteza deschisã în faþa lui

 (<= a 10) este expresia test, fiind prima expresie de dupã cuvântul
„while“. Sã recunoaºtem mai întâi componentele:

 corpul lui while este format din expresiile (setq c a) ºi (setq a


„while“; ea conþine testul „este a mai mic sau egal cu 10?“

(+ a 1)); prima atribuie lui c valoarea momentanã a lui a, iar a


doua modificã valoarea lui a.
Când închidem paranteza, expresia întreagã este evaluatã. Ni se returneazã
11. Ce s-a întâmplat? Nimic altceva decât cã s-a tot reluat corpul, majorân-
64 Programare simplã în AutoLISP

du-se succesiv valoarea lui a, pânã ce s-a ajuns la valoarea 11. În acel
moment testul a dat nil ºi s-a ieºit din while. E clar? Dacã daþi acum un !c,
veþi primi 10, deoarece atribuirea ultimei valori (11) lui a a dus la ieºire,
fãrã a se mai schimba valoarea lui c. Dacã urmãriþi exemplul de faþã vã

Expresia condiþionalã este (<= i n), adicã dacã i <= n, atunci evaluarea
lãmuriþi mai bine. Sã continuãm.

dã TRUE, iar dacã i > n, evaluarea dã nil. Iniþial i = 0 iar n = 30, deci
i < n. Ca urmare, conform definiþiei funcþiei while, se trece la evaluarea
expresiilor din lista while. Astfel, se atribuie variabilei X valoarea rezultatã
din expresia (* i (/ domx n)). Dacã vã uitaþi cu atenþie, vedeþi cã mai
întâi se va evalua paranteza internã, efectuându-se împãrþirea variabilei
DOMX la N. Rezultatul va înlocui aceastã parantezã. Trecând la paranteza
externã, evaluatorul va înmulþi pe I cu acest rezultat. Cum iniþial I = 0,
întreaga parantezã va da tot 0. Cu aceastã valoare a lui X se va trece mai
departe.

trul ºi raza cercului. I se furnizeazã centrul dat de paranteza (list x


În continuare, se dã comanda CIRCLE. Aceasta, dupã cum ºtiþi, cere cen-

(fct x)), adicã un punct geometric cu coordonata X obþinutã mai sus, ºi

AutoLISP, ar trebui spus cã se va evalua expresia (fct x), în care primul


Y-ul obþinut prin aplicarea funcþiei FCT pe variabila X. În termeni

atom spune ce funcþie se are în vedere, iar al doilea este argumentul


funcþiei. Într-adevãr, dacã ne uitãm mai sus, la definiþia funcþiei FCT,
vedem cã se va transmite X-ul ºi se va aplica pe el funcþia SIN. Evaluarea
acestei expresii se face pe baza funcþiei interne SIN. Ca efect, paranteza va
fi înlocuitã cu rezultatul evaluãrii lui sin(0). Acesta este 0, nu-i aºa?
Valoarea 0 este returnatã funcþiei GRAFIC apelante. Ea va reprezenta va-
loarea coordonatei Y necesare pentru definirea centrului cercului.
Urmãtorul parametru este raza cercului; acesta are o valoare constantã: 0.1.
Dispunând de centru ºi razã, AutoCAD va trasa cercul cu pricina.

I. El este majorat (incrementat) cu 1 prin expresia (setq i (+ i 1)).


Mai departe, în spiritul celor spuse mai sus, se face modificarea contorului

Observaþi cã, practic, I este înlocuit cu propria sa valoare mãritã cu 1. Asta


este o chestie obiºnuitã în programare. Dacã vã amintiþi, spuneam cã o va-
riabilã este ca un sertar. Pe sertar este eticheta (numele variabilei), iar în
Capitolul 2 65

sertar este valoarea ei. Ce-am fãcut? Am tras sertarul ºi am mai adãugat o
unitate la valoarea care era acolo!
Observaþi cã modificarea lui I se face în sensul apropierii ei de valoarea lui
N, pentru ca încet, încet, s-o întreacã ºi sã se termine ciclul. Acum I are va-
loarea 1.

cã acum se închide paranteza pereche a celei din faþa lui while.


Cu asta, prima trecere (sau iteraþie) prin ciclu s-a încheiat. De ce? Pentru

În continuare se reevalueazã expresia condiþionalã. Acum I = 1, iar pe N


nu l-a modificat nimeni, deci este tot 30. Atunci, cum I < N, se vor execu-
ta iarãºi cele trei expresii care compun „corpul“ ciclului:
- X capãtã valoarea I * (DOMX / N)
- se traseazã cercul cu centrul în punctul cu acest X ºi cu Y-ul dat de
FCT(X), raza fiind tot 0.1
- se incrementeazã contorul I, devenind 2
Din nou I < N, deci ciclul se reia. Când I ajunge la valoarea 30 prin acest
mecanism, avem I = N ºi ciclul se executã pentru ultima datã. Se vede cã
ultimul cerc este centrat pe capãtul liniei orizontale ce exprimã DOMX-ul.
În continuare, I se incrementeazã cu 1, devenind 31. Acum se iese, într-ade-
vãr, deoarece I > 30.
Dupã ieºirea din ciclu se evalueazã expresiile ce conþin funcþia PRINC.
Nici aceasta nu a fost explicatã pânã acum. Sintaxa ei (simplificatã) este:

(princ <expr>)

<expr>. Totodatã, din cauzã cã ºi ea este evaluatã, va returna valoarea


Aceastã funcþie afiºeazã în zona de dialog mesajul dat prin expresia

acelei expresii. De exemplu:


Command: (princ „Mesaj“)
Mesaj“Mesaj“
Command:
Iatã cã s-a întâmplat ceea ce am spus: s-a evaluat expresia, afiºându-se tex-
66 Programare simplã în AutoLISP

tul Mesaj, iar evaluarea a returnat ºi expresia, sub forma „Mesaj“, cu tot
cu ghilimele. De asta l-am dublat, fãrã a-i adãuga însã argument.

2.8 Achiziþie de date cu AutoLISP

Mulþi se pot întreba cum ar putea face sã preia în AutoCAD informaþii din
exterior (sub forma unor fiºiere de date) pentru a trasa entitãþi pe care, ulte-
rior, sã le poatã prelucra cu mijloacele specifice AutoCAD-ului. Deºi existã
ºi alte mijloace (prin fiºiere DXF, de exemplu), cel mai flexibil ºi mai adec-
vat este cel bazat pe utilizarea limbajului AutoLISP.
Sã vedem mai întâi care sunt instrucþiunile (funcþiile) AutoLISP care asi-
gurã preluarea de date din exterior. Ne referim la preluarea de date din
fiºiere ºi nu interactiv, de la tastaturã. Aceastã din urmã cale am prezen-
tat–o, într-o oarecare mãsurã, prin funcþiile GET.
Dacã dorim sã preluãm date dintr-un fiºier, atunci trebuie ca mai întâi sã–l
facem cunoscut AutoLISP-ului. Pentru asta trebuie sã-l deschidem. „A
deschide“ se spune în englezã „to open“. Funcþia OPEN deschide fiºiere.
Sintaxa ei este:

(open <specfis> <mod>)

specfis = specificatorul fiºierului de deschis, dat sub forma cunoscutã


unde:

mod
„nume.ext“ (inclusiv ghilimelele)
= exprimã intenþia pentru care a fost deschis fiºierul: citire
(read), scriere (write) sau adãugare (append); se dã fie „r“, fie „w“,
fie „a“ (inclusiv ghilimelele), potrivit dorinþei noastre legatã de
accesul la fiºier, dar atenþie, cu literã micã!

„r“ se returneazã nil, iar pentru „w“ ºi „a“ se creeazã unul cu acel nume.
Funcþie de modul ales, dacã fiºierul indicat de „specfis“ nu existã, pentru
Capitolul 2 67

Exemplu:
(setq fis1 (open „date.dat“ „r“))
Prin aceastã linie cereþi sã se atribuie variabilei „fis1“, creatã cu aceastã
ocazie, descriptorul asociat fiºierului „date.dat“, deschis numai pentru
citire (r = read). Ulterior, veþi folosi descriptorul „fis1“ pentru a citi linii
din fiºierul astfel deschis. Ca sã vã lãmuriþi pe deplin, variabilei „fis1“ i se
atribuie un cod intern de forma „#nnnn“, unde „nnnn“ este un numãr
hexazecimal (adicã în baza 16); acesta este returnat la evaluarea liniei (lis-
tei) de mai sus, dar pe noi nu ne intereseazã. Noi lucrãm mereu cu numele
„fis1“ al variabilei noastre ºi este treaba AutoLISP-ului cum îºi gestioneazã
fiºierele.
Se poate da, evident, ºi calea (path) prin care se ajunge la fiºier, ca de exem-
plu (de notat dublarea backslash-urilor):
(setq fis1 (open „c:\\p01\\martie\\date.dat“ „r“))
Din acest moment este definitã variabila descriptor „fis1“. Întrebarea este:
unde ºi cum se foloseºte? Staþi uºor...
Citirea dintr-un fiºier se face cu funcþii READ. Funcþia READ- CHAR
citeºte un singur caracter iar funcþia READ-LINE citeºte o linie întreagã.
Sintaxa:

(read-char [<descr_fis>])

(read-line [<descr_fis>])

<descr_fis> = variabilã opþionalã „descriptor de fiºier“ creatã cu


unde:

Dacã nu se dã <descr_fis>, atunci se aºteaptã caractere de la tastaturã,


funcþia OPEN, cum s-a spus.

în loc de a fi citite dintr-un fiºier.


Exemple:
68 Programare simplã în AutoLISP

(setq caract (read-char fis1))


(setq lintxt (read-line fis1))
În primul caz, variabila „caract“ va primi primul caracter din fiºierul
deschis (cu OPEN) cãruia i s-a alocat descriptorul „fis1“. Urmãtorul apel
(identic) al lui READ-CHAR va atribui variabilei „caract“ urmãtorul ca-
racter din fiºier, º.a.m.d. Variabila „caract“ primeºte codul ASCII al carac-
terului cu pricina. Practic, în acest cod, litera A are valoarea 65, B = 66, etc.
(anexa B). Atunci când, prin aceastã procedurã, se ajunge la sfârºitul unei

în AutoLISP). Atunci când se ajunge la sfârºitul fiºierului, se primeºte nil.


linii, codul primit este 10, care este denumit „end-of-line“ (sau „newline“,

Citirile ulterioare dau de acum numai acest nil (adicã „nimic“).


În al doilea caz, variabilei „lintxt“ i se atribuie valoare de ºir (string),

la liniile urmãtoare. Dacã se ajunge la sfârºitul fiºierului, i se atribuie nil.


conþinând toate caracterele dintr-o linie. Dacã se apeleazã repetat, se trece

Pentru a vã lãmuri pe deplin, creaþi un fiºier cu numele „exmpl.txt“ în care


puneþi liniile:

ABC
abcde
123456

Acum intraþi în AutoCAD ºi daþi:


Command: (setq fff (open „exmpl.txt“ „r“))
Vi se returneazã ceva de genul:
<File #50e0>
Acesta e codul hexa intern; nu ne intereseazã. Important este cã s-a creat
variabila descriptor „fff“, asociatã acestui fiºier. Introduceþi acum:
Command: (read-char fff)
Veþi primi 65, codul lui A.
Dacã acum daþi:
Command: (read-line fff)

primiþi „abcde“, deci întreaga linie urmãtoare. Dând iar (read-char fff),
primiþi „BC“, adicã atât cât a mai rãmas necitit din linia curentã. Repetând,
Capitolul 2 69

veþi primi codul 32, adicã blanc, etc. Dacã citiþi (cu read-char) un caracter
de dupã ultimul dintr-o linie, vi se returneazã codul 10, adicã end-of-line,
trecându-se la primul din linia urmãtoare.
Sigur cã nu este interesant sã citim fiºierul manual, caracter cu caracter,
sau linie cu linie, pânã la atingerea unui punct dorit. Fiºierele pot fi foarte
mari, cât timp ne-ar trebui? Pentru asta, trebuie sã facem ceva deosebit: tre-
buie sã citim automat fiºierul, linie cu linie, sau caracter cu caracter,

seazã. Folosim, cel mai bine, în acest scop, funcþia while descrisã mai sus.
testând mereu la ce s-a ajuns, pânã ce se atinge elementul care ne intere-

Se pot asocia cu aceastã funcþie încã douã funcþii specifice: „1+“ ºi „1-“.

1+, 1-

În loc de a scrie (+ a 1) puteþi scrie (1+ a), cu acelaºi efect: creºterea

loc de a scrie (- a 1), puteþi scrie (1- a), efectul fiind identic: micºo-
lui a cu 1. A se observa cã nu existã spaþiu (blanc) între 1 ºi +. Tot aºa, în

rarea lui a cu 1.
În aceste condiþii, ciclul while de mai sus poate fi scris:
(while (<= a 10)
(setq c a)
(setq a (1+ a)
)
Sã revenim la citirea noastrã de fiºiere, folosind în acest scop funcþia while.
Sã presupunem cã dorim sã atribuim variabilei cu numele lin3 valoarea ºir
exprimatã de conþinutul celei de-a treia linii din fiºierul „exmpl.txt“ dat
mai sus. Pentru asta, putem parcurge secvenþa:
Command: (setq fff (open „exmpl.txt“ „r“))
<File #50a0>
Command: (setq aaa 1)
1
Command: (while (< aaa 3)
1> (setq lin3 (read-line fff))
70 Programare simplã în AutoLISP

1> (setq aaa (1+ aaa))


1> )
3

declanºez un ciclu while cu expresia test „este aaa mai mic decât 3?“; cor-
V-aþi prins? Fac aºa: creez variabila numericã „aaa“ ºi-i dau valoarea 1, apoi

(cu read-line) ºi o alta care incrementeazã variabila aaa. În momentul în


pul acestui ciclu conþine o linie în care se citesc succesiv liniile din fiºier

care aaa, crescând, a devenit egalã cu 3, se ºi iese din ciclu. Prin asta, prac-
tic, am citit DE TREI ORI din fiºierul „exmpl.txt“, fiecare dintre citiri

citire, s-a ieºit deja, deci variabila lin3 a rãmas cu valoarea cãpãtatã de la a
avansând cu câte o linie în fiºier. Atunci când este pe cale sã se facã a patra

treia citire, adicã ºirul „abcde“.


Într-adevãr, se observã:
Command: !lin3
„abcde“
deci exact ceea ce am dorit.
O altã problemã poate fi aceea a cãutãrii unei linii într-un fiºier. De exem-
plu, sã citim fiºierul „exmpl.txt“ pânã ce gãsim o linie cu conþinutul
„abcde“. Vom face aºa:

Command: (setq fff (open „exmpl.txt“ „r“))


<File #50a0>
Command: (setq linie „“)
„“
Command: (while (/= linie „abcde“)
1> (setq linie (read-line fff))
1> )
„abcde“
Command:

dent. Ce s-a petrecut? Mai întâi sã observãm cã se atribuie variabilei linie


S-a ºi returnat „abcde“. Dând un „!linie“ veþi obþine acelaºi „abcde“, evi-

un ºir vid ““. Scopul este numai acela de a o crea ca variabilã ºir, pentru a
Capitolul 2 71

la aaa, dar cu scopul de face sã aibã sens expresia (1+ aaa)).


putea testa valoarea ei din start (acelaºi lucru am fãcut mai sus cu variabi-

În ciclul while am pus expresia test care foloseºte operatorul „/=“. Acesta
semnificã „neegal cu“. În corpul lui while am pus citirea de linii din
fiºierul cu descriptorul „fff“. Pe mãsurã ce sunt citite linii, valorile (ºir) ale

riabilã devine „abcde“, testul cade, adicã linie nu mai este neegalã cu
acestora sunt atribuite variabilei ºir „linie“, cum se vede. Când aceastã va-

„abcde“ (ci egalã!), deci se iese din ciclu. Asta am ºi dorit, nu-i aºa?
Pentru a cãuta un ºir mai scurt de o linie într-un fiºier vã las sã încercaþi pe
Dvs. Vã ofer însã explicaþii privind douã funcþii de care veþi avea nevoie:
SUBSTR ºi STRLEN.
Funcþia SUBSTR desparte un ºir (string) în subºiruri (substring).
Sintaxa:

(substr <ºir> <start> [<lungime>])

unde:
<ºir> = ºirul de cercetat
<start> = numãrul de ordine (începând cu 1) al caracterului de unde

<lungime> = valoare întreagã opþionalã care exprimã lungimea subºir-


sã înceapã secþionarea lui <ºir>

ului dorit; dacã lipseºte, se ia tot ce a mai rãmas din <ºir>.


Exemple:
(substr „abcde“ 2) returneazã „bcde“
(substr „abcde“ 2 1) returneazã „b“
(substr „abcde“ 3 2) returneazã „cd“

Funcþia STRLEN dã lungimea (în caractere) a unui ºir. În englezã, la


lungime se spune „length“, deci „lungime ºir“ se spune „string length“; de
aici ºi numele funcþiei.
Sintaxa:
72 Programare simplã în AutoLISP

(strlen <ºir>)

unde:
<ºir> = ºirul a cãrui lungime dorim s-o aflãm.

(strlen „abcde“) returneazã 5.


De exemplu:

***
Sã vedem acum cum putem face pentru a prelua date numerice din fiºiere,
urmând a le folosi în AutoCAD.
Trebuie sã ºtiþi cã, iniþial, vom citi datele sub formã de ºiruri de caractere.

Pentru astfel de conversii se pot folosi funcþiile: angtos, atof, atoi, itoa ºi
Odatã cunoscute de AutoLISP, vom putea sã le transformãm în numere.

rtos. Observaþi în fiecare literele „to“. Ele permit conversii între unghiuri
(angle = ang), ºiruri (string = s), coduri ASCII (a), întregi (integer = i),
reale (real = r) ºi numere în virgulã mobilã (float = f), adicã tot reale. Aþi
înþeles?
Sã le clarificãm, totuºi:
angtos = unghi → ºir
atof = ASCII → float (adicã real)
atoi = ASCII → întreg
itoa = întreg → ASCII
rtos = real → ºir

pentru atof (de care avem nevoie mai jos), atoi ºi itoa. Celelalte, vor fi
Deci sunt cinci, de toate... Le-om învãþa noi, nu? Dãm mai jos sintaxa doar

prezentate în capitolele urmãtoare.


Capitolul 2 73

(atof <ºir>)

(atof „97.1“)
Aceastã funcþie returneazã conversia ºirului într-un real. De exemplu:

(atof „3“)
returneazã 97.1
returneazã 3.0

(atoi <ºir>)

(atoi „97“)
Aceastã funcþie returneazã conversia unui ºir întrun întreg.

(atoi „3“)
returneazã 97

(atoi „3.9“)
returneazã 3
returneazã 3

(itoa <int>)

Aceastã funcþie returneazã conversia unui întreg întrun ºir de caractere

(itoa 33)
ASCII. De exemplu:

(itoa 17)
returneazã „33“
returneazã „17“

Gata, ºtim de ajuns!


Sã presupunem acum cã datele pe care le avem de citit din fiºier exprimã
coordonatele unor puncte 3D prezentate astfel:
0.000 0.000 0.000
26.180 0.000 25.882
52.359 0.000 50.000
78.539 0.000 70.710
74 Programare simplã în AutoLISP

104.719 0.000 86.602


...
104.719 261.797 74.998
130.898 261.797 83.650
157.078 261.797 86.601
183.258 261.797 83.651
Pentru cei care cunosc limbajul BASIC, aceste date (exact acestea, cu obser-
vaþia cã e vorba de 88 de triplete, de fapt...) sunt produse de programul ge-
nerator:

10 REM ———— GEN.BAS ——————


30 OPEN „date.dat“ FOR OUTPUT AS #1
50 pas = 3.14156 / 12
100 FOR i = 0 TO 10
110 FOR j = 0 TO 7
120 x = j * pas
130 y = i * pas
135 z = SIN(x) * COS(y)
148 PRINT #1, USING „###.### „; 100 * x; 100 * y; 100 * z
150 NEXT j
160 NEXT i
170 CLOSE #1

exprimând coordonatele a 11 x 8 puncte generate de funcþia 100 * sin


Dacã vã uitaþi cu atenþie, observaþi cã datele sunt aranjate în triplete,

(x) * sin (y) unde x ºi y cresc cu un pas de π/12 începând de la 0. Am


fãcut acest lucru ca sã nu introduc eu date la întâmplare, ci sã mi le
genereze un program. În acest fel ºi rezultatul va fi sigur ºi frumos. Evident
cã pot fi folosite orice fel de date. Singurele condiþii sunt ca numele fiºieru-
lui sã fie DATE.DAT (fiindcã aºa îl cere programul AutoLISP care
urmeazã) iar formatul datelor sã fie „xxx.xxx“ de trei ori, separate
printr–un singur blanc, unde fiecare „x“ este o cifrã sau un blanc (fiindcã
aºa le interpreteazã acelaºi program AutoLISP). De asemenea, trebuie ca
acestea sã fie ordonate dupã X ºi Y (crescãtor sau descrescãtor), pentru ca
rezultatul sã fie consistent. A se þine seama ºi de faptul cã formatul
Capitolul 2 75

„xxx.xxx “ a fost ales astfel observând cã nici o valoare negativã nu e mai


mare (adicã mai micã...) decât -99.999, fapt ce ar deranja transcrierea pe
numai 7 caractere a numerelor.
Este important sã observãm cã avem 11 x 8 = 88 de puncte.
Sã vedem cum aratã programul AutoLISP care citeºte ºi exploateazã aceste
date. De fapt, acesta este lucrul cel mai interesant, nu?
I-am pus numele RELIEF.LSP, fiindcã citeºte un relief, într-adevãr. Iatã-l:

; ——- relief.lsp ——————


(defun C:relief()
(setq fis (open „date.dat“ „r“))
(command „3DMESH“ 11 8)
(setq i 1)
(while (<= i 11)
(setq j 1)
(while (<= j 8)
(setq lin3 (read-line fis))
(setq x (atof (substr lin3 1 7))
y (atof (substr lin3 9 7))
z (atof (substr lin3 17 7))
)
(command (list x y z))
(setq j (1+ j))
)
(setq i (1+ i))
)
)

În figura ce urmeazã se vede ºi ceea ce produce. Vã place? (Atenþie, am dat


un VPOINT cu 1,1,1 în prealabil ºi am fixat limitele - cu LIMITS - pe 0,0
ºi 210,297!)
Sã studiem un pic cauzele acestei producþii (un 3DMESH).
Am definit o funcþie cu rol de comandã AutoCAD - funcþia RELIEF. În ea
76 Programare simplã în AutoLISP

deschid fiºierul DATE.DAT (folosind descriptorul „fis“) ºi-l citesc linie cu


linie, dupã ce, mai întâi, lansez comanda 3DMESH, indicând cele douã
dimensiuni ale acestei reþele (11 ºi 8). Mai departe, fixez contorul i pe va-

Declanºez apoi douã cicluri while imbricate unul în altul: cel exterior va
loarea 1 (ca sã-l pot incrementa ca pe o variabilã numericã, ºtiþi Dvs...).

lucra pe contorul i, iar cel interior pe contorul j, similar cu primul. Trec


acum la citirea liniilor din fiºierul DATE.DAT, una câte una. Atribui va-
riabilei LIN3 valoarea ºir a liniei curente citite.
Acum e interesant! Observaþi cã lãsasem în suspensie comanda 3DMESH.
Aceasta aºteaptã coordonatele vertex-urilor reþelei. Ca sã obþin aceste coor-
donate, trebuie sã „sparg“ linia care le conþine. Pentru asta profit de faptul
cã liniile au toate acelaºi format: de trei ori „xxx.xxx“ (unde un „x“ este o
cifrã sau un blanc), separate de câte un blanc. De asta vã spun cã am fãcut
programul BASIC: mi-ar fi fost greu sã introduc „de mânã“ niºte coordo-
nate atât de ordonate... Cum fac sã sparg linia? Folosesc funcþia SUBSTR,
aºa cum se vede. Iau mereu câte 7 caractere, începând de la caracterul 1, 9
ºi, respectiv, 17, respectând ce spuneam mai sus. Tot nu e de ajuns! Voi gãsi
Capitolul 2 77

ºiruri de caractere numerice, nu numere, vã daþi seama? Adicã voi gãsi, de

forma cum vreau eu, folosesc funcþia atof care tocmai asta face: ia un ºir,
exemplu, ºirul „ 26.180“ în loc de valoarea realã 26.180. Pentru a le trans-

vede cã nu conþine decât cifre ºi, eventual, punctul zecimal (cum e ºi la noi),
dupã care transformã efectiv acel ºir într-un numãr real! Dacã vã uitaþi cu
atenþie, vedeþi cã atribui rezultatele conversiilor de la ºir la real variabilelor
X, Y ºi Z (a se observa posibilitatea de atribuire multiplã cu SETQ).
Revenim acum la comanda 3DMESH lãsatã în suspensie. Noi ºtim cã pen-
tru a furniza date AutoCAD-ului din AutoLISP trebuie sã folosim funcþia
COMMAND. Asta ºi fac: invoc funcþia COMMAND (din AutoLISP, evi-
dent) ºi furnizez ceea ce trebuie, adicã liste AutoLISP de triplete numerice
(reale). Ele vor asigura puzderia de 88 de triplete ce vor da coordonatele
vertex-urilor reþelei.
În final fac „bucãtãria“ contorilor i ºi j, incrementându-i cum trebuie.
Asta-i tot!
Numai Dvs. veþi înþelege cã ceea ce am fãcut, per total, este o preþiozitate:
creez date cu un program (BASIC) ºi le citesc cu altul (AutoCAD). Asta s-ar
numi „export“ ºi „import“ de date, nu? Veþi fi însã de acord cã tot aºa puteþi
citi date din orice altã sursã. Totul este sã le preluaþi în mod ordonat, ca sã
ºtiþi cum sã le folosiþi.

problema desenãrii funcþiei sin(x)*cos(y) am face un program


Dacã ar fi sã generãm un relief, adicã sã rezolvãm direct din AutoCAD

AutoLISP „bine temperat“, evident. Vã intereseazã sã ºtiþi cum ar fi pro-


gramul? Iatã cum:
; ——- genrel.lsp ——————
(defun C:genrel()
(command „3DMESH“ 11 8)
(setq pas (/ pi 12))
(setq i 0)
(while (<= i 10)
(setq j 0)
(while (<= j 7)
(setq x (* j pas)
78 Programare simplã în AutoLISP

y (* i pas)
z (* (sin x) (cos y))
)
(setq x (* 100 x)
y (* 100 y)
z (* 100 z)
)
(command (list x y z))
(setq j (1+ j))
)
(setq i (1+ i))
)
)

sintaxa AutoLISP, fireºte. Aici, în ciclul while interior facem ceea ce


Observaþi cã se reiau elementele de program din BASIC, respectând însã

fãceam ºi în ciclul „FOR J“ din GEN.BAS: calculãm coordonatele X ºi Y,


înmulþindu-le cu pasul stabilit, dupã care calculãm coordonata Z, prin
înmulþirea lui sin(x) cu cos(y). Tot în acest ciclu multiplicãm cu 100 toate
coordonatele pentru a arãta bine pe întinderea unui format A4.
Dacã doriþi sã puneþi acolo o funcþie oarecare, veþi înlocui linia:
(setq z (* (sin x) (cos y)))
cu o linie de genul:
(setq z (fct x y))
unde „FCT“ este o funcþie definitã cam aºa:
(defun fct(x y)
(* (sin x) (cos y))
)
dacã ar fi sã punem aceeaºi funcþie (matematicã). Ca sã luãm alt exemplu,
dacã punem:
(defun fct(x y)
(/ (cos (+ x y)) (+ 1 (* x x) (* y y)))
)
ºi schimbãm un pic ºi funcþia program principal, astfel încât sã permitã
Capitolul 2 79

reprezentãri grafice de funcþii în douã variabile, sub forma:

(defun C:grafun()
(command „3DMESH“ 31 21)
(setq pas (/ pi 16))
(setq i -15)
(while (<= i 15)
(setq j -10)
(while (<= j 10)
(setq x (* j pas)
y (* i pas)
z (fct x y)
)
(command (list x y z))
(setq j (1+ j))
)
(setq i (1+ i))
)
)

atunci, rulând acest program (cu


numele „grafun.lsp“), prin simpla
încãrcare - cu (load „grafun“) - ºi
lansarea cu comanda GRAFUN, vom
obþine (punând VPOINT/1,1,1) ima-
ginea alãturatã.
Dacã revedeþi programul GRA-
FUN.LSP, observaþi cã n-am mai înmulþit cu 100 valorile obþinute (apro-
pos, aveþi grijã cã acum imaginea iese micuþã!). În aceste condiþii, ceea ce

cos(x+y)/(1+x2+y2) - luatã la întâmplare, dealtfel - cu X ºi Y furnizate


aveþi acum pe ecran este reprezentarea fidelã a funcþiei

în radiani, fiindcã aºa vrea AutoLISP. Puteþi da acum comanda ID ºi,


folosind modul INT al OSNAP (unealta INT), puteþi afla coordonatele
oricãrui vertex al reþelei ce ilustreazã reprezentarea graficã a funcþiei, cu
80 Programare simplã în AutoLISP

maximã exactitate. Dacã dispuneþi ºi de un calculator mai puternic (mãcar


25 MHz), puteþi sã daþi ºi un HIDE care vã va ascunde liniile, etc. (altfel
poate dura cam mult). Mai puteþi s-o oglindiþi, scalaþi, rotiþi º.a.m.d.

2.9 Simboluri locale

Este foarte important sã avem în vedere cã lungimea unui program nu


poate fi nelimitatã, iar aceastã lungime depinde ºi de numãrul simbolurilor
implicate. Un simbol, odatã declarat, ocupã o adresã de memorie pe toatã
durata cât este activ programul care l-a declarat. Putem totuºi sã declarãm
simboluri care sã fie temporare, adicã sã ocupe memorie doar pe durata cât
este activã funcþia în care acestea au fost declarate. Acestea se vor numi sim-

de argumente declarate cu defun separaþi argumentele funcþiei de sim-


boluri locale, faþã de celelalte care se numesc globale. Pentru asta, în lista

bolurile locale printr-un “/” (slash). De exemplu:


(defun FCT(x y / a b c)
declarã simbolurile x ºi y ca argumente ºi a, b, c ca simboluri locale.
Observaþi cã slash-ul este precedat ºi urmat de câte un blanc, altfel fãcând
parte din numele variabilei de care ar fi lipit. Fireºte cã simbolurile locale
pot sã lipseascã (împreunã cu slash-ul ce le precede), cum pot sã lipseascã

nut cã, atunci când dupã încheierea acþiunii funcþiei FCT dorim sã
argumentele (caz în care slash-ul este obligatoriu), sau chiar toate! De reþi-

cercetãm valoarea atribuitã unui simbol local (punând de exemplu !a pe


prompterul “Command:”), vom constata cã acesta este nedefinit!
Ca strategie, pentru a testa o funcþie cu menþinerea în memorie a tuturor
simbolurilor, eliminãm pe moment lista simbolurilor locale. Dupã
încheierea rulãrilor de probã - care vor acoperi cât mai multe dintre
cazurile previzibile - vom reintroduce lista acestora. Câtã vreme un simbol
este local, numele lui poate fi refolosit fãrã jenã în exteriorul funcþiei.
IMPORTANT: S i mb o l u r i l e l o c a l e d i s p a r o d a t ã c u f u n c þ i a !
Capitolul 2 81

2.10 Selectarea de entitãþi

O problemã tipicã ce se întâlneºte în lucrul cu AutoLISP este a selecta


diverse entitãþi în vederea prelucrãrii lor. Practic, este vorba de a reuºi ca
dând comenzi precum MOVE (din AutoCAD) sã putem selecta automat
entitãþile pe care sã se aplice acele comenzi.
Ne dãm seama cã autorii AutoLISP-ului nu puteau sã lase nerezolvatã
aceastã problemã. Rezolvarea a fost fãcutã prin introducerea de funcþii
specifice, evident. Se creeazã astfel puntea de legãturã AutoCAD -

Dvs. cunoaºteþi acum funcþiile command, getvar ºi setvar. Acestea nu au


AutoLISP. De fapt, aceastã punte a fost deja prezentatã din moment de

ce cãuta decât în context AutoCAD. Vom mai prezenta succint câteva (dar
la modul simplist, deocamdatã), pentru a rãspunde problemei din titlu.

(entlast)

Aceastã funcþie este interesantã prin ceea ce returneazã, ºi anume numele


ultimei entitãþi create în desen. Dacã aceasta a fost ºtearsã, atunci este
returnat numele penultimei entitãþi º.a.m.d. Entitatea în cauzã poate sã nu
se afle în ecran, ba poate sã se afle chiar într-un layer îngheþat (frozen).
Exemplu:
(setq eee (entlast))
Variabila eee va reþine numele ultimei entitãþi din desen.

(entnext [<nument>])

opþional <nument>. Dacã acesta lipseºte, atunci se returneazã numele


Ceea ce returneazã aceastã funcþie depinde de valoarea argumentului

primei entitãþi din desen. Dacã <nument> este prezent ºi conþine numele

entitãþi din desen, dacã existã ºi nil altfel.


unei entitãþi existente în desen, atunci se returneazã numele urmãtoarei
82 Programare simplã în AutoLISP

Exemplu:
(setq eee (entnext eee))
Variabila eee va conþine numele urmãtoarei entitãþi din desen dupã cea al
cãrei nume se afla anterior în eee. Altfel spus, eee a trecut pe entitatea
urmãtoare.

(ssadd [<nument>] [<ms>])

ale cãror nume încep cu ent ºi altele cu ss. Primele se referã la entitãþi, iar
Vom vedea în capitolele urmãtoare cã existã mai multe funcþii AutoLISP

ultimele la mulþimi de selecþie (selection sets). Din a doua categorie face


parte ºi funcþia de faþã.

creeazã o mulþime de selecþie vidã. Apelatã cu un argument <nument>


Ambele ei argumente sunt opþionale. Apelatã fãrã argumente, funcþia

care conþine un nume de entitate existentã în desen creeazã o mulþime de

<nument> este tot numele unei entitãþi existente, iar <ms> este o mulþime
selecþie care conþine acea entitate. Apelatã cu ambele argumente, unde

de selecþie creatã anterior, aceastã mulþime se mãreºte cu un nou membru,


prin adãugarea acelei entitãþi. Se returneazã mulþimea de selecþie astfel for-
matã (sau neschimbatã).
Exemplu:
(setq ss (ssadd))
(setq ss (ssadd (entnext) ss))
În acest exemplu, mai întâi se creeazã variabila ss ca mulþime de selecþie,
iar apoi se introduce în ea prime entitate din desen, deoarece entnext este
invocatã fãrã argument.

2.10.1 Aplicaþie
Folosind doar aceste trei funcþii noi ºi unele dintre cele prezentate anteri-
or, ne propunem sã rezolvãm urmãtoarea problemã. Sã desenãm efectiv
binecunoscutul icon de UCS în poziþia unde se aflã aºezat efectiv UCS-ul.
Cum se ºtie, icon-ul de UCS este o simplã iluzie, ºi nu un grup de entitãþi,
or dacã am vrea sã ilustrãm cumva poziþia curentã a UCS-ului ºi s-o imor-
Capitolul 2 83

talizãm în desen avem nevoie ca icon-ul sã fie realmente desenat.


Programul ce urmeazã realizeazã efectiv acest lucru.

numele în variabila primline. Apoi se traseazã toate celelalte entitãþi care


Ca idee, se traseazã o primã entitate din conturul icon-ului ºi i se reþine

gãsit cu funcþia entlast. Se face un mic ciclu care pune toate entitãþile din-
compun icon-ul. Când a fost trasatã ºi ultima se ºtie cã numele ei poate fi

tre primline ºi entlast într-o mulþime de selecþie numitã ss. Se dã automat


comanda SCALE ºi se furnizeazã mulþimea de selecþie astfel formatã,
lãsându-i-se utilizatorului libertatea sã arate (printr-o linie elasticã)
mãrimea realã pe care s-o capete icon-ul. A fost nevoie de aceastã manevrã
pentru a adapta mãrimea icon-ului la mãrimea variabilã a obiectelor deja
desenate ºi la importanþa pe care vrea s-o dea utilizatorului semnului cu
pricina. Comentariile (precedate în orice linie de semnul „;“) explicã sufi-
cient de clar amãnuntele acestui program.

; Desenare UCSICON
(defun C:ui()
(setq ce (getvar „cmdecho“))
(setq bm (getvar „blipmode“))
(setvar „cmdecho“ 0)
(setvar „blipmode“ 0)
; Trasarea unei prime linii din contur UCSicon
(command „line“ ‘(-2 -2) ‘(7 -2) „“)
; Fixare prima entitate
(setq primline (entlast))
; Trasare contur sageti
(command „line“ ‘(7 -2) ‘(7 -3) ‘(10 0) ‘(7 3) ‘(7 2) ‘(2 2)
‘(2 7) ‘(3 7) ‘(0 10) ‘(-3 7) ‘(-2 7) ‘(-2 -2) „“)
; Trasare litera X
(command „line“ ‘(6 1) ‘(8 -1) „“)
(command „line“ ‘(8 1) ‘(6 -1) „“)
; Trasare litera Y
(command „line“ ‘(-1 8) ‘(0 7) ‘(1 8) „“)
(command „line“ ‘(0 7) ‘(0 6) „“)
84 Programare simplã în AutoLISP

; Trasarea crucii in origina


(command „line“ ‘(-1 0) ‘(1 0) „“)
(command „line“ ‘(0 1) ‘(0 -1) „“)
; Cazul WCS pentru a trasa si litera W
(if (= (getvar „WORLDUCS“) 1)
(command „line“ ‘(-1 5) ‘(-1 3) ‘(0 4) ‘(1 3) ‘(1 5) „“)
)
; Cazul privirii VPOINT cu Z pozitiv pentru a trasa liniile specifice
(if (>= (caddr (getvar „VIEWDIR“)) 0)
(command „line“ ‘(-2 2) ‘(2 2) ‘(2 -2) „“)
)
; Formare multime de selectie cu toate entitatile din icon
(setq ss (ssadd))
(setq ss (ssadd primline ss))
(while (entnext primline)
(setq primline (entnext primline))
(setq ss (ssadd primline ss))
)
; Scalare dinamica a multimii de selectie
(command „scale“ ss „“ ‘(0 0) „R“ 40)
(setvar „cmdecho“ ce)
(setvar „blipmode“ bm)
)
Observaþi salvarea ºi restaurarea variabilelor de sistem CMDECHO ºi
BLIPMODE. Aceasta este o procedurã uzualã în programele AutoLISP.
Sunt demne de semnalat deciziile care se iau pe baza valorii curente a va-
riabilelor de sistem WORLDUCS ºi VIEWDIR. Prima spune dacã UCS-ul
curent este suprapus peste WCS (atunci când are valoarea 1), iar al doilea
aratã dacã privim spre originea UCS-ului curent dinspre +Z (când e mai
mare sau egal cu zero). Avem nevoie de aceste informaþii pentru a include
litera W în icon, respectiv pentru a trasa încã douã linii atunci când privim
dinspre +Z. 
Fundalul de lucru
3
Dupã ce am vãzut cum se procedeazã în general ºi am cãpãtat o oarecare
experienþã de programare simplã în AutoLISP, în acest capitol vom trece la
prezentarea unor elemente de fond, urmând ca în continuare sã le folosim
intens.

3.1 Tipuri de datã în AutoLISP

AutoLISP suportã câteva tipuri de datã. Acestea sunt:


 întregi
 numere reale
 ºiruri
 liste
 mulþimi de selecþie AutoCAD (engl. „selection sets“)
 nume de entitãþi AutoCAD
 descriptori de fiºiere
 simboluri
 subr (funcþii înglobate, sau intrinseci) (engl. „built-in functions“)
Pe sisteme PCDOS/MSDOS, întregii sunt numere cu semn pe 16 biþi, deci
gama de valori este de la 32768 la +32767. Pe staþii de lucru de 32 biþi
(adicã IBM-PC 386/486), întregii AutoLISP sunt numere cu valori între
2.147.483.648 ºi +2.147.483.647, deºi întregii transferaþi între AutoLISP ºi
AutoCAD sunt reduºi la valori pe 16 biþi.
Numerele reale sunt stocate în format virgulã mobilã dublã precizie, asi-
86 Fundalul de lucru

gurând cel puþin 14 cifre semnificative exacte, chiar dacã în linia de


comandã sunt prezentate numai 6 cifre semnificative.
ªirurile pot fi de orice lungime; memoria pentru ele este alocatã dinamic.
Totuºi, existã o lungime maximã de 132 caractere pentru constante ºir.
Listele sunt grupuri de valori similare separate prin blancuri ºi incluse
între paranteze. De exemplu, („cerc” „dreapta” „plan”) sau (12.4 23.6)
sunt liste. Atunci când o listã exprimã un punct geometric este necesar sã
se respecte niºte reguli:
 punctele 2D sunt exprimate ca liste de douã numere reale (X Y) ca în:
(3.4 2.52)
Prima valoare este coordonata X iar a doua valoare este coordona-
ta Y.
 punctele 3D sunt exprimate ca liste de trei numere reale (X Y Z) ca în:
(3.4 2.52 3.0)
Prima valoare este coordonata X, a doua valoare este coordonata

Mulþimile de selecþie sunt grupuri de una sau mai multe entitãþi.


Y, iar a treia valoare este coordonata Z.

interactiv. De exemplu, expresia (ssget ”X”) selecteazã toate entitãþile


Folosind funcþii AutoLISP aceste mulþimi pot fi completate sau reduse

din desenul curent ºi returneazã ceva în genul:


<Selection set: 1>
Numele de entitãþi sunt etichete numerice asociate unor entitãþi din

entitãþile cu care sunt asociate. De exemplu, funcþia (entlast) poate


desen. Aceste etichete pot fi referite de funcþiile AutoLISP pentru a selecta

returna ceva în genul:


<Entity name: 60000033>
Descriptorii de fiºiere sunt etichete alfanumerice atribuite fiºierelor

exemplu, expresia (open ”DATE.DAT” ”r”) poate returna descriptorul:


deschise de AutoLISP. Acestea asigurã accesul la fiºierele în cauzã. De

<File: #12a3>
Simbolurile sunt folosite de AutoLISP pentru a referi date. Numele sim-
bolice nu sunt sensibile la tipul de literã (micã sau MAJUSCULţ) ºi pot
consta din orice secvenþã de caractere alfanumerice ºi semne de punctuaþie
Capitolul 3 87

cu excepþia: ( ) . ‘ ” ;. Un nume simbolic nu poate fi format numai din


cifre. O variabilã este un nume simbolic care stocheazã o datã de program.
Existã trei variabile predefinite: PI (cu valoarea lui π), T (cu valoarea
non-nil, cu sens de adevãrat) ºi PAUSE (cu valoarea ºir ”\\”, cu sens de
pauzã, folositã în cadrul funcþiei command).
Subrs-urile sunt rutinele intrinseci AutoLISP (cum este funcþia princ).

prefixat cu ”!” pe prompterul „Command:”.


Puteþi vedea cum este simbolizatã intern o astfel de funcþie dând numele ei

3.2 Evaluatorul AutoLISP

Inima oricãrui interpretor LISP este evaluatorul. Evaluatorul preia o linie


de la intrarea utilizator, o evalueazã ºi returneazã un rezultat oarecare.
Redãm mai jos procesul de evaluare în AutoLISP:
 Întregi, reale, ºiruri, pointeri de fiºiere ºi subr evaluate în ele însele.
 Simboluri evaluate prin valoarea lor curent atribuitã.
 Listele sunt evaluate potrivit primului element al listei. Dacã el este
evaluat prin:
 o listã (sau nil) - lista este consideratã a fi o definiþie de funcþie,
iar funcþia este evaluatã folosind drept argumente valorile ele-
mentelor din lista rãmasã.
 numele unei funcþii interne (subr) - elementele din lista rãmasã
sunt transmise lui subr ca argumente formale ºi sunt evaluate de
subr.
În limba englezã „nil“ înseamnã nul (folosit mai ales în sport). În context,
prin „nil“ vom înþelege „listã vidã“.
Dacã introduceþi o expresie AutoLISP ca rãspuns la prompterul
„Command:“ al AutoCAD-ului, AutoLISP evalueazã expresia ºi afiºeazã
rezultatul. Când afiºeazã numere reale, AutoLISP pune pânã la 6 cifre sem-
nificative. Dacã se introduce sau se citeºte dintr-un fiºier o expresie
incorectã, AutoLISP poate afiºa urmãtorul prompter:
88 Fundalul de lucru

n>
unde n este un întreg indicând câte nivele de paranteze rãmân neînchise.
Dacã apare acest prompter, trebuie sã introduceþi n paranteze „dreapta“
(adicã închise) pentru a anula aceastã condiþie. O greºealã comunã este
omiterea închiderii ghilimelelor (”) într-un ºir text, caz în care parantezele

avea efect în schimbarea lui n. Pentru a corecta aceastã condiþie, intro-


„dreapta“ vor fi interpretate ca încorporate în ºirul text, astfel cã nu vor

duceþi ghilimelele de închidere a ºirului urmate de numãrul cerut de paran-


teze „dreapta“.

3.3 Convenþii lexicale

Introducerea de date în AutoLISP poate avea câteva forme. Ea poate fi


fãcutã de la tastaturã din AutoCAD, poate fi realizatã prin citirea dintr-un
fiºier ASCII, sau dintr-o variabilã ºir. În toate cazurile trebuie sã fie avute
în vedere anumite convenþii:
 Numele simbolice pot consta din orice secvenþã de caractere tipãribile,
exceptând caracterele ( ) . ‘ „ ;
 Urmãtoarele caractere vor încheia un nume simbolic sau o constantã
numericã: ( ) ‘ „ ; (spaþiu) (sfârºit-de-linie)
 Expresiile se pot întinde pe mai multe linii.
 Spaþiile multiple între simboluri sunt echivalente cu un singur spaþiu.
Întrucât indentarea (paginarea textului prin zimþare) nu este impusã,
o puteþi folosi pentru a face mai evidentã structura funcþiilor Dvs.
 Numele simbolice ºi de funcþii (subr) nu sunt sensibile la tipul de literã
(MAJUSCULA sau literã micã) in AutoLISP. În AutoCAD-10 era
interzis ca numele simbolice sã înceapã cu o cifrã, dar ulterior
acest lucru a fost admis, singura restricþie rãmânând aceea ca sã
existe mãcar un alt caracter dintre cele menþionate pe lângã cifre.
De exemplu, simbolul 123_s5 este admis, dar nu ºi 12345.
 Constantele întregi pot începe cu un caracter opþional „+“ sau „-“. Aºa cum
s-a menþionat mai sus, plaja admisã a lor este de la -32768 la +32767.
Capitolul 3 89

 Constantele reale constau din una sau mai multe cifre, urmate de punc-
tul zecimal, urmat de una sau mai multe cifre; astfel, .4 nu este
recunoscut ca un real; 0.4 este corect. Similar, 5. nu este recunos-
cut ca un real; 5.0 este corect. Realele pot fi exprimate în notaþie

urmat de exponentul numãrului, cum ar fi 2e-3.


ºtiinþificã, adicã având în compunere un „e“ sau „E“ opþional,

 ªirurile literale sunt secvenþe de caractere încadrate de ghilimele (“). In


interiorul ºirurilor literale, caracterul backslash (\) este folosit pentru

\\ înseamnã caracterul „\“


includerea caracterelor de control. Codurile recunoscute curent sunt:

\e înseamnã ESCAPE
\n înseamnã NEWLINE
\r înseamnã RETURN
\t înseamnã TAB
\nnn înseamnã caracterul al cãrui cod octal este nnn.
Legat de aceste coduri este util de consultat ºi anexa B.
De exemplu, urmãtorul ºir va produce un prompter pe linie nouã:
(prompt ”\nEnter first point: ”)
 Caracterul apostrof (‘) poate fi folosit ca prescurtare pentru funcþia
QUOTE. Astfel ‘abc este echivalentã cu (quote abc)
 Comentariile pot fi incluse în programele AutoLISP încãrcate din
fiºiere de pe disc. Comentariile încep cu punct-virgulã (;) ºi con-

; Aceasta este o linie de comentariu


tinuã pânã la sfârºitul liniei. De exemplu:

(setq area (* pi r r)) ;alt comentariu)


Odatã cu AutoCAD-12 a fost admisã introducerea comentariilor

secvenþa ;| este început un comentariu, iar prin secvenþa |; acesta


pe mai multe linii (ca în limbajul C, de exemplu). Astfel, prin

este încheiat, între cele douã putându-se afla mai multe linii de
program, sau doar câteva caractere. De exemplu, este admisã:
(setq rr ;| raza racordare |; (getvar ”FILLETRAD”))
ca ºi:
(setvar ”BLIPMODE” 0) ;| Eliminare
cruciulite
de marcaj |;
90 Fundalul de lucru

3.4 Convenþii de notare

În acest manual se folosesc anumite convenþii pentru a descrie comporta-


mentul funcþiilor. De exemplu:
(tst <ºir> <numãr>...)
Numele funcþiei apare aºa cum trebuie sã-l introduceþi. Articolele incluse
între paranteze ascuþite (<>), ce urmeazã dupã numele funcþiei indicã
numãrul ºi tipul argumentelor aºteptate de funcþie.
În acest exemplu, funcþia tst are douã argumente obligatorii: un ºir ºi un
numãr. Punctele de suspensie („...“) aratã cã funcþiei îi pot fi furnizate
argumente numerice adiþionale. Nu includeþi parantezele ascuþite sau

funcþiei tst, iatã apeluri valide ale acesteia:


punctele de suspensie când apelaþi funcþia. Având formatul menþionat al

(tst ”Hello” 5)
(tst ”Hi” 1 2 3)
Urmãtoarele exemple nu corespund formatului prescris ºi vor conduce la
erori:
(tst 1 2 3) ; primul argument trebuie sã fie un ºir
(tst ”Hello”) ; trebuie dat cel puþin un argument numeric
(tst ”do” ‘(1 2)) ; al doilea argument sã fie numãr, nu listã
Când un argument opþional poate apãrea o datã dar nu poate fi repetat,
argumentul este inclus între paranteze drepte („[]“), ca în:
(abc <ºir> [<numãr>])

nal. De exemplu, urmãtoarele pot fi apeluri valide ale funcþiei abc:


Funcþia „foo“ cere un argument ºir ºi acceptã un argument numeric opþio-

(abc ”catch”)
(abc ”catch” 22)
Urmãtoarele exemple nu corespund formatului prescris ºi vor conduce la
erori:
(abc 44 13) ; primul argument trebuie sã fie un ºir
(abc ”what” 44 13) ; prea multe argumente
Capitolul 3 91

3.5 Tratarea erorilor

Dacã AutoLISP întâlneºte o eroare în timpul evaluãrii, se tipãreºte un


mesaj de forma:
error: text
unde text este o descriere a erorii.
Dacã funcþia *ERROR* este definitã (non-nil), AutoLISP executã acea

Dacã *ERROR* nu este definitã sau este adusã la nil, evaluarea AutoLISP
funcþie (cu „text“ transmis ca singur argument) în loc sã tipãreascã mesajul.

se opreºte ºi se va afiºa parcursul funcþiei apelante ºi al apelanþilor ei pânã


la 100 nivele în adâncime. Practic, pe ecran va începe sã vã defileze toatã
istoria acelei erori, începând cu funcþia care a generat-o, venind apoi
funcþia care-o apeleazã pe aceasta º.a.m.d., pânã la cea mai generalã dintre
ele, sau cea de-a o suta, dacã-s multe. Este bine sã comutaþi (cu <F1>) pe
mod text, sã relansaþi comanda care a produs eroarea ºi sã apãsaþi repede
tasta <PAUSE> (cea mai de sus din dreapta pe o tastaturã standard),
observând în primul rând de unde începe deranjamentul. Dacã aveþi un pic
de rãbdare, dibuiþi uºor problema ºi o depanaþi.
De notat cã avem de a face cu un interpretor ºi nu cu un compilator, deci
cu un analizor care trateazã liniile pe mãsurã ce le primeºte. Dacã reþinem
acest lucru, vom lua în seamã altfel întregul comportament al
AutoLISP-ului. Închipuiþi-vã cã aþi avea Dvs. de fãcut acest interpretor!
Cum l-aþi face? N-aþi citi linia care vi s-a dat ºi aþi analiza-o din punct de
vedere sintactic? N-aþi stoca simbolurile care apar într-un repertoriu de
simboluri, care trebuie sã aibã în vedere tipul de datã al fiecãruia (e un
întreg, un real, sau altceva?), ca sã ºtiþi cât spaþiu sã-i alocaþi? Iatã cum, din
aproape în aproape, puteþi sã vã imaginaþi întreaga funcþionare a interpre-
torului de AutoLISP!
Revenind la problematica erorilor, noua variabilã ERRNO vã permite iden-
tificarea codului ultimei erori (vezi anexa C). Puteþi sã vã scrieþi propria
Dvs. funcþie *ERROR*. Când apare o eroare, AutoCAD apeleazã funcþia
*ERROR* aºa cum este ea definitã la momentul apelului ºi-i transmite
unicul argument (ºirul de text conþinând mesajul de eroare). Dacã vã
92 Fundalul de lucru

definiþi propria funcþie *ERROR*, aceasta va trebui sã îndeplineascã niºte


condiþii (vezi ºi funcþia *ERROR* în cap. 5):
- sã se încheie liniºtit la apãsarea tastei <ESC> sau abandon <CTRL/C>
- sã fie scurtã ºi rapidã
Se recomandã ca funcþia definitã de Dvs. sã conþinã secvenþa:
(if
(or
(/= msg ”Function cancelled”)
(= msg ”quit / exit abort”)
)
(princ
(princ (strcat ”\nError: ” msg))
)
Aceasta va asigura, pe de o parte, informarea utilizatorului asupra naturii
erorii, iar pe de altã parte, atunci când utilizatorul abandoneazã programul
funcþia nu va returna nimic.

3.6 Încãrcarea programelor ºi execuþia automatã

3.6.1 Biblioteci de funcþii ºi încãrcare automatã

load din AutoLISP, descrisã în capitolul 5. Dacã fiºierul „acad.lsp” existã,


Definiþiile de funcþii pot fi stocate în fiºiere ºi încãrcate folosind funcþia

AutoLISP îl va încãrca automat ori de câte ori este apelat Editorul de


Desenare AutoCAD; puteþi folosi aceastã caracteristicã pentru a crea o bi-
bliotecã de funcþii utile ºi a vã asigura cã acestea sunt prezente atunci când
aveþi nevoie de ele.

defun-uri. Deoarece încãrcarea unui fiºier produce evaluarea expresiilor


Orice fiºier de bibliotecã „.lsp” poate conþine ºi expresii în afarã de

sale, puteþi include apeluri de funcþii pentru a fi executate automat ori de


câte ori fiºierul este încãrcat. Totuºi, încãrcarea lui „acad.lsp” este fãcutã
Capitolul 3 93

lizat, deci nu folosiþi funcþia command în fiºierul „acad.lsp” (în afara unui
înainte ca Editorul de desenare al AutoCAD-ului sã fi fost pe deplin iniþia-

defun). Pentru a face fiºierul Dvs. „acad.lsp” sã execute automat o serie de


comenzi la încãrcare, includeþi în el un defun al funcþiei speciale
„S::STARTUP” (vezi mai jos).

3.6.2 Funcþii C:XXX - Adãugarea de comenzi la AutoCAD


Puteþi adãuga noi comenzi la AutoCAD folosind defun pentru a defini
funcþii ce implementeazã acele comenzi. Pentru a fi folosite drept comenzi
AutoCAD, astfel de funcþii trebuie sã respecte urmãtoarele reguli:
Funcþia trebuie sã aibã un nume de forma „C:XXX”, unde toate literele
sunt MAJUSCULE (începând cu AutoCAD-12 nu mai este strict necesar ca
acestea sã fie majuscule). Porþiunea „C:” a numelui trebuie sã fie întot-
deauna prezentã; porþiunea „XXX” poate fi un nume de comandã la
alegerea Dvs., cu asigurarea cã nu este un duplicat al unei comenzi
AutoCAD, înglobatã sau externã.

simboluri locale), deci cam aºa: (defun C:NUME( / argloc...) ...)


Funcþia trebuie sã fie definitã cu o listã de argumente nil (dar sunt permise

Prefixul „C:” poate fi considerat ca provenind etimologic de la


„Command:”.
De exemplu, iatã definirea unei funcþii de desenare a unui pãtrat folosind
polilinii:
(defun C:PATRAT (/ pt1 pt2 pt3 pt4 lng)
(setq pt1 (getpoint ”\nColt stanga jos: ”))
(setq lng (getdist pt1 ”\nLatura patrat: ”))
(setq pt2 (polar pt1 0.0 lng))
(setq pt3 (polar pt2 (/ pi 2.0) lng))
(setq pt4 (polar pt3 pi lng))
(command ”PLINE” pt1 pt2 pt3 pt4 ”C”)
)

Funcþiile definite în acest fel pot fi apelate simplu, prin introducerea pãrþii
„XXX” a numelui funcþiei când apare prompterul „Command:” al
94 Fundalul de lucru

AutoCAD-ului. Dacã „XXX” nu este o comandã cunoscutã, AutoCAD


încearcã sã apeleze funcþia AutoLISP „C:XXX” fãrã parametri. De exem-
plu, pentru funcþia C:PATRAT dialogul va arãta astfel:
Command: PATRAT
Colt stanga jos: (introduceþi un punct)
Latura patrat: (introduceþi o distanþã)
Funcþia va apela acum comanda PLINE a AutoCAD-ului ºi va rãspunde
prompterelor succesive ale acesteia, desenând pãtratul dorit. Veþi asista
pasivi la defilarea acestui dialog!
Adãugarea de comenzi AutoCAD-ului în aceastã manierã constituie o ca-
racteristicã foarte puternicã a limbajului AutoLISP. Odatã definitã, noua
comandã poate utiliza toate facilitãþile oferite de AutoLISP. Utilizarea
curentã a noii comenzi nu necesitã paranteze care sã-i delimiteze numele,
asfel încât comanda implementatã prin AutoLISP va fi folositã ca orice altã
comandã AutoCAD. Nu vã rãmâne decât sã încercaþi...

3.6.3 Funcþii S::XXX - Execuþie automatã


Funcþiile definite de utilizator care încep cu „S::” vor fi apelate (lansate, sau
„Startate”) automat atunci când apar anumite situaþii în cursul sesiunii de
editare. Puteþi considera prefixul „S::” al numelui funcþiei ca „rezervat”.
Pentru a evita conflictele cu funcþii irelevante, abþineþi-vã de a folosi acest
prefix pentru altceva decât aceste funcþii speciale.
În mod uzual, singura funcþie executatã automat este „S::STARTUP”. Dacã
aceastã funcþie este definitã, ea va fi apelatã automat (fãrã argumente) atun-

desen sau editarea unuia existent. Astfel, puteþi include un defun de


ci când editorul de desene AutoCAD este apelat pentru crearea unui nou

„S::STARTUP” în fiºierul Dvs. „acad.lsp” (care, dacã existã, se încarcã


automat, aºa cum spuneam) pentru a executa orice operaþie de iniþializare
doriþi la începutul sesiunii de editare.
De exemplu, sã presupunem cã doriþi sã înlocuiþi comenzile AutoCAD
standard QUIT ºi END cu versiuni personale ale acestora. Puteþi realiza
aceasta cu un fiºier „acad.lsp” conþinând urmãtoarele:
(defun C:QUIT()
Capitolul 3 95

...definiþia Dvs....
)
(defun C:END()
...definiþia Dvs....
)
(defun S::STARTUP()
(command ”undefine” ”quit”)
(command ”undefine” ”end”)
)

3.7 Funcþia ”command”

Deºi este descrisã în capitolul 5, aceastã funcþie impune unele precizãri.


Funcþia command are un numãr variabil de argumente care trebuie sã
corespundã în numãr ºi tip celor cerute de comanda pe care o va transmite
AutoCAD-ului. Argumentele pot fi ºiruri de caractere, valori reale, întregi,
nume de entitãþi sau mulþimi de selecþie. Unghiurile, distanþele ºi punctele
geometrice pot fi transmise atât ca ºiruri de caractere, cât ºi ca variabile. Un
ºir vid este echivalent cu introducerea unui blanc sau a unui <Enter>.
De exemplu, dacã sunt definite variabilele:
(setq centru (list 200 100))
(setq raza 56.75)
atunci urmãtoarele douã linii sunt echivalente:
(command ”CIRCLE” ”200,100” ”56.75”)
(command ”CIRCLE” centru raza)
Dacã întocmiþi un program care poate fi folosit cu o versiune de AutoCAD
asociatã cu o limbã strãinã (strãinã de limba englezã, desigur...), atunci
comenzile ºi cuvintele cheie sunt traduse automat în limba respectivã dacã
precedaþi numele comenzii sau cuvântul cheie cu caracterul ( _ ) de subli-
niere:
(command ”_line” pct1 pct2 pct3 ”_c”)
96 Fundalul de lucru

Dacã aþi redefinit anumite comenzi din AutoCAD ºi doriþi la un moment


dat sã apelaþi comanda originalã, atunci veþi pune un prefix punct (.) în faþa
numelui comenzii, ca în:
(command ”.line” pct1 pct2 pct3 ”c”)
Dacã folosiþi prefixul punct ºi doriþi sã aplicaþi aceasta ºi pentru
AutoCAD-ul în limbã strãinã, atunci veþi pune ambele prefixe (punct ºi
subliniere) în orice ordine, ca în:
(command ”_.line” pct1 pct2 pct3 ”_c”)
Funcþia command permite ºi introducerea unei pauze pentru a aºtepta

stanta predefinitã pause. Pe lângã introducerea datei aºteptate, dacã tot


introducerea unei date de cãtre utilizator. În acest scop poate fi folositã con-

parente precum ‘zoom sau ‘pan. De exemplu, linia ce urmeazã lanseazã


este suspendatã comanda, utilizatorul poate face uz ºi de comenzi trans-

comanda CIRCLE, îi dã centrul 100,100, apoi aºteaptã utilizatorul sã intro-


ducã raza, dupã care traseazã o linie din centru în punctul 200,100:
(command ”CIRCLE” ”100,100” pause ”LINE” ”100,100” ”200,100” ””)
Pe timpul pauzei menu-ul este activ, astfel cã utilizatorul poate alege
rãspunsul dintr-un menu anume creat. Menu-ul poate fi ºi el suspendat
prin caracterul backslash (\) introdus în articolul de menu.
Unele comenzi AutoCAD (precum TRIM sau EXTEND) aºteaptã utiliza-

a transfera aceste informaþii funcþiei command fãrã a folosi pause, tre-


torul sã indice un punct pick ºi abia pe urmã obiectul de modificat. Pentru

buie ca mai întâi sã le stocaþi în niºte variabile. Pentru a face un EXTEND


stocaþi entitatea border imediat dupã ce aþi creat-o, folosind:
(setq ebord (entlast))

într-o variabilã (de exemplu PCT) ºi apoi folosiþi funcþia command aºa:
apoi puneþi punctul care aratã capãtul de extins al entitãþii de modificat

Puteþi acum, eventual, sã ºtergeþi entitatea ebord:


(command ”EXTEND” ebord ”” PCT ””)

(command ”ERASE” ebord ””)


Capitolul 3 97

3.8 Gestionarea memoriei

Toate simbolurile ºi toate funcþiile, atât cele definite de utilizator cât ºi cele
standard, sunt stocate în memoria computerului Dvs. numai pe durata
sesiunii de editare AutoCAD. Când este lansat AutoLISP, el ocupã douã
spaþii largi de memorie pentru el însuºi. Primul, numit heap, este spaþiul în
care sunt stocate toate funcþiile ºi simbolurile (numite ºi nodes - sã le tra-
ducem noduri); cu cât aveþi mai multe simboluri ºi funcþii (ºi cu cât funcþi-
ile Dvs. sunt mai complexe), cu atât va fi utilizat mai mult spaþiu heap. Cel
de-al doilea spaþiu, numit stivã (engl. stack), reþine argumentele de funcþii
ºi rezultatele parþiale; cu cât mai adânc imbricaþi funcþiile, sau cu cât mai
recursive sunt funcþiile Dvs., cu atât va fi utilizat mai mult spaþiu de stivã.
Din pãcate, datoritã specificitãþii sale, termenul „heap” care s-ar traduce
prin „grãmadã” sau „morman”, va rãmâne netradus. Ceea ce este demn de
reþinut este cã heap corespunde unui spaþiu de memorie oarecum static,
legat de numãrul de elemente definite, în timp ce stiva are, prin excelenþã,
un net caracter dinamic, legat de funcþionarea efectivã a funcþiilor, de
recursivitatea lor.
Un „nod” este o structurã de memorie capabilã sã reprezinte toate tipurile
de datã AutoLISP. Uzual, un nod este lung de 12 octeþi. Pentru a se evita
fragmentarea memoriei ºi a se asigura gestionarea heap-ului, nodurile sunt
alocate din heap în grupuri numite segmente. Implicit, un segment are
lungimea de 514 noduri (6168 octeþi).
AutoLISP menþine o listã de noduri libere (noduri care nu sunt curent alo-
cate unui simbol). Când are nevoie de un nod în care sã stocheze un simbol
sau o valoare, AutoLISP cautã o listã liberã pentru a gãsi un nod disponi-
bil. Dacã nu este nici unul, se executã o colectare automatã de „resturi” (în
englezã, în original, se spune garbage collection, sintagmã acreditatã de
mult în context LISP), plasându-se orice nod care nu este asociat unui sim-
bol în lista liberã. Apoi este ales unul care sã satisfacã cererea. Dacã acea
colectare de resturi conduce la prea puþine noduri libere, AutoLISP cere un
segment adiþional din heap. Dacã cererea este încununatã de succes, noile
noduri sunt plasate pe lista liberã ºi este ales unul dintre ele pentru a satis-
98 Fundalul de lucru

face cererea originalã a unui nod. Dacã nu pot fi obþinute segmente


adiþionale din heap, este invocatã paginarea de funcþii virtuale pentru a

este afiºat un mesaj insufficient node space ºi este abandonatã funcþia


elibera ceva noduri prin evacuarea celei mai recent utilizate funcþii; altfel,

care cere spaþiu node. E important de notat cã spaþiul node nu este nicio-
datã returnat heap-ului pânã ce nu ieºiþi din AutoCAD.
Este posibil sã se forþeze o colectare de resturi folosind funcþia GC
(iniþialele lui „Garbage Collection”):
(gc)
Totuºi, trebuie notat cã, în general, colectarea de resturi este o operaþie con-
sumatoare de timp ºi nu e eficient sã fie executatã la nimerealã. Cel mai
bine e sã se lase în seama mecanismului automat AutoLISP sã execute
aceastã operaþie, care o face numai atunci când este absolut necesar.

3.8.1 Recuperarea spaþiului node

Vã puteþi gãsi în situaþia de a fi creat funcþii ºi simboluri de care aveþi


nevoie o scurtã perioadã de timp. Odatã ce utilitatea lor s-a sfârºit, puteþi

cat ºi aþi folosit o funcþie numitã setup de care nu mai aveþi nevoie, puteþi
efectiv sã le „indefiniþi” prin setarea lor pe nil. De exemplu, dacã aþi încãr-

da:
(setq setup nil)
pentru a vã descotorosi de ea. Spaþiul node folosit de funcþie este recuperat,
fãcându-l disponibil pentru uzul altor funcþii ºi simboluri.

este cel returnat de funcþia open), trebuie sã-l închideþi (close) înainte de
Dacã doriþi sã eliberaþi spaþiul node folosit de un simbol de tip FILE (cum

a-l seta pe nil. Existã un numãr finit de „conectori de fiºiere deschise” ºi


eºecul de închidere a unui fiºier va duce la menþinerea conectorului sãu în
uz, limitând numãrul de fiºiere noi care pot fi deschise.

Anterior lui Release-12, AutoCAD întreþinea atomlist - o listã a


NOTÃ:
Capitolul 3 99

tuturor funcþiilor ºi simbolurilor definite. Aceastã listã nu mai


este întreþinutã acum sub aceastã formã; de aceea, metoda
curãþãrii cunoscutã în trecut nu mai este valabilã pentru a elimina

bolurilor folosite, prin utilizarea funcþiei atoms-family (vezi capi-


funcþii ºi simboluri. Puteþi totuºi regãsi o listã a funcþiilor ºi sim-

tolul 5).

3.8.2 Note tehnice

Urmãtoarele informaþii sunt destinate numai utilizatorilor LISP experi-


mentaþi. Novicii pot (ºi trebuie) sã ignore aceastã discuþie. Aceastã secþiune
descrie mecanisme interne AutoLISP care sunt subiect de schimbare fãrã
înºtiinþare.
Sigur cã, a spune într-un document destinat informaticienilor de toate ori-
entãrile ºi vârstele cã n-are rost sã citeascã un capitol, este ca ºi când ai flu-
tura o cârpã roºie în faþa unui taur, ca sã parafrazez pe cineva... Adevãrul e
cã meritã sã citiþi, vã spun eu!

3.8.2.1 Spaþiul ºir (string)


Spaþiul de stocare a „ºirurilor” se suprapune tot pe heap ca segmente de
noduri. Dacã programul Dvs. apeleazã funcþiile de alocare manualã

fi foarte aproape de a obþine un mesaj insufficient string space, care este


(descrise mai jos) pentru a aloca toatã memoria disponibilã ca noduri, veþi

tot atât de devastator ca ºi insufficient node space. E înþelept sã lãsaþi


AutoLISP - prin mecanismul de alocare automatã de noduri - sã aibã în
grijã lucrurile, astfel încât sã ajungeþi la un final cu spaþiu de ºiruri sufi-
cient. Spaþiul de ºiruri este folosit pentru orice, de la nume de simboluri la
ºiruri prompter ºi ºiruri menu care sunt transmise lui AutoLISP spre eva-
luare (toate astea trebuie stocate undeva, nu-i aºa?). Dacã folosiþi menu-uri
lungi cu expresii AutoLISP pentru evaluare, acestea vor cere o cantitate
semnificativã de spaþiu contiguu de ºiruri din heap.
100 Fundalul de lucru

3.8.2.2 Stocarea simbolurilor


Structura memoriei în AutoLISP este bazatã intensiv pe pointeri.
Utilizarea nodurilor este atotcuprinzãtoare, totul fiind reprezentat în struc-
tura node. Simpla setare a unui simbol ca fiind egal cu o valoare, ca în:
(setq longsym 3.1415)
cere douã noduri: unul pentru stocarea numelui simbolului ºi unul pentru
stocarea valorii sale. Dacã numele simbolului este scurt de ºase sau mai
puþine caractere, numele este stocat direct în nodul nume simbol, altfel
spaþiul ºir serveºte ca pointer ce conþine adresa spaþiului ºir din heap unde
va fi pus acel simbol. Mai simplu spus, folosirea numelor scurte de sim-
boluri (ºase sau mai puþine caractere) reduce cererile de spaþiu ºir ºi frag-
mentarea heap-ului.

3.8.2.3 Alocarea manualã


Puteþi folosi funcþiile alloc ºi expand pentru a controla manual alocarea
de spaþiu node ºi ºir, crescând astfel eficienþa aplicaþiilor Dvs. Folosind
aceste expresii la începutul fiºierului Dvs. „acad.lsp”, puteþi pre-aloca
nodurile ºi rezerva de asemenea ceva spaþiu ºir. Aceasta poate reduce
colectarea de resturi, mãrind eficienþa de rulare a aplicaþiei Dvs.
Puteþi folosi funcþia alloc pentru a modifica mãrimea viitoarelor cereri de
segment astfel încât lungimea segmentului sã difere de 514 noduri per seg-
ment.
(alloc <numãr>)
Funcþia alloc seteazã mãrimea segmentului la <numãr> noduri ºi
returneazã setarea anterioarã.
Folosind funcþia expand, puteþi aloca manual spaþiul node, prin solici-
tarea unui numãr specificat de segmente.
(expand <numãr>)

alocaþi. Funcþia expand returneazã numãrul de segmente pe care a putut


Argumentul <numãr> exprimã numãrul de segmente pe care doriþi sã le

sã le obþinã din heap, care poate fi mult mai mic decât cel cerut, datoritã
mãrimii spaþiului heap rãmas.
Capitolul 3 101

(alloc 1024) fixeazã mãrimea segmentului pe 1024 noduri, ceea ce va


Exemple:

(alloc 100)
cere 12488 octeþi pentru spaþiul heap al fiecãrui segment.
fixeazã mãrimea segmentului la 100, ceea ce va solicita
numai 1200 octeþi pe segment.
Cu mãrimea implicitã a segmentului de 512 noduri, un apel cum este cel ce
urmeazã va cere 10 segmente (10x12x512=61480 octeþi):
(expand 10)
Puteþi cere mai multe segmente decât sunt disponibile.

(alloc 3000) ;fixeazã mãrimea segmentului node la 3000 noduri


Iatã un exemplu practic:

(expand 1)
(alloc 10000) ; fixeazã o mãrime mare de segment pentru a se evita
; obþine 3000 noduri libere (un segment)

;adãugarea de alte segmente


Aceastã schemã foloseºte 36000 de octeþi pentru spaþiul node, lãsând restul
lui heap pentru spaþiul ºir. Nodurile vor fi pre-alocate ºi plasate în lista
„liberã”. Aceasta înseamnã cã nu va fi necesarã nici o colectare de resturi
pânã ce nu vor fi folosite toate cele 3000 de noduri. Dupã ce le-aþi folosit pe

toarele cereri de noduri. Linia (alloc 10000) fixeazã mãrimea segmentu-


toate, sigur cã va fi invocatã colectarea de resturi pentru a satisface urmã-

lui la o valoare care va preveni alocarea de segmente în plus din heap, „re-
zervând” astfel acest spaþiu pentru utilizare la ºiruri.

pânã când cererea încã a unui nod eºueazã (adicã “(alloc 1) (expand 1)”
Dacã aplicaþi strategia opusã, reducând succesiv mãrimea segmentului

eroarea insufficient string space. Aceasta nu se recomandã, deoarece


returneazã 0), veþi folosi toatã zona heap ca spaþiu node, conducând la

AutoLISP devine inutilizabil dacã nu dispune de spaþiu ºir.

3.8.2.4 Paginarea funcþiilor virtuale


Paginarea funcþiilor virtuale poate avea efect doar atunci când toate cele-

cele mai multe platforme. Funcþia vmon este prevãzutã pentru compati-
lalte tipuri de memorie virtualã au fost epuizate; asta se întâmplã rar pe

bilitate cu versiunile anterioare de AutoCAD. Dacã aplicaþia Dvs. devine


102 Fundalul de lucru

prea mare pentru a încãpea în spaþiul node disponibil, puteþi activa pagi-
natorul de funcþii virtuale AutoLISP pentru a permite programului Dvs.

funcþia vmon înaintea primei defun din programul Dvs.


posibilitatea de a continua sã creascã. Pentru a realiza acest lucru, executaþi

(vmon)
Aceasta autorizeazã paginarea de funcþii virtuale pentru restul sesiunii de

poate fi dezactivatã. Numai funcþiile create cu defun dupã apelul lui vmon
desenare AutoCAD. Odatã ce aþi activat-o, paginarea de funcþii nu mai

intrã la paginare, astfel încât dacã definiþi funcþii înainte de a apela vmon,
acestea nu vor fi paginate, aceasta putând cauza în continuare erori de
spaþiu insuficient de noduri.
Dupã ce este executatã vmon, AutoLISP pagineazã (ºi evacueazã) funcþiile
rar folosite, ori de câte ori constatã cã spaþiul de noduri este insuficient ºi
le readuce automat în uz atunci când este necesar. Funcþiile sunt evacuate
într-un fiºier temporar care este gestionat prin paginatorul de fiºiere
AutoCAD. Sistemul de memorie virtualã pagineazã numai funcþii; trebuie
sã aveþi suficient spaþiu node pentru a cuprinde toate listele de date ºi
numele de funcþii ºi de variabile folosite de programul Dvs.
Funcþia mem afiºeazã starea curentã a memoriei AutoLISP-ului ºi
returneazã nil. În primul moment dupã lansare veþi primi ceva de genul:
Nodes: 1028
Free nodes: 454
Segments: 2
Allocate: 514
Collections: 3
Nodes este numãrul total de noduri alocate care va fi mai departe egal cu
mãrimea segmentului node înmulþitã cu numãrul de segmente. Free nodes
este numãrul de noduri aflate curent în lista „liberã”, plasate acolo de o
colectare de resturi. Segments este numãrul de segmente node care au fost
alocate, iar Allocate este mãrimea curentã de segment. Collection este un
contor pentru numãrarea colectãrilor de resturi, fie ele automate, fie
forþate.
Funcþia mem afiºeazã douã câmpuri adiþionale atunci când este activatã
vmon. Câmpul swap-ins exprimã numãrul de funcþii readuse în uz din
Capitolul 3 103

fiºierul de paginare creat pentru sistemul de memorie virtualã. Acestea


sunt funcþiile paginate apelate explicit la un moment dat prin programul
Dvs. Intrarea page file este mãrimea fiºierului de paginare creat pentru a
reþine funcþiile evacuate prin procesul de paginare.
Dupã execuþia funcþiei vmon, toate defun-urile plaseazã un nou nod
numit tabelã de paginare la începutul fiecãrei liste de funcþie. Acest nod
este adãugat înaintea listei ce conþine argumentele formale. Nodurile tabelã
de paginare sunt destinate exclusiv utilizãrii de cãtre paginator ºi nu tre-

type returneazã tipul PAGETB pentru aceste noduri.


buie sã fie în nici un fel modificate prin programul utilizatorului. Funcþia

Când AutoLISP are noduri insuficiente, funcþiile cel mai puþin folosite
sunt evacuate prin transcrierea în fiºierul de paginare, salvându-se adresa
fiºierului de paginare în tabela de paginare ºi eliberându-se toate nodurile
funcþiei ce urmeazã tabelei de paginare. Tabela de paginare este marcatã
astfel încât sã indice cã funcþia este evacuatã. Când este evaluatã o funcþie
evacuatã, ea este restauratã din fiºierul de paginare (evacuându-se, even-
tual, alte funcþii) înainte de a fi executatã. Odatã ce o funcþie a fost tran-
scrisã în fiºierul de paginare, urmãtoarele evacuãri doar îi elibereazã pur ºi
simplu nodurile; nu mai este nevoie sã se transcrie funcþia, din moment ce
ea este deja prezentã în fiºier.
În AutoLISP, funcþiile create cu defun sunt chiar liste ºi pot fi manevrate
ca orice alte liste. Programele care fac asta trebuie sã fie în cunoºtinþã de

niciodatã vmon). Înainte de toate, funcþiile create cu defun au în faþã o


cauzã în privinþa operaþiilor efectuate de paginator (sau sã nu foloseascã

tabelã de paginare, astfel cã va trebui s-o sãriþi dacã doriþi sã exploraþi

defun), ea va funcþiona minunat, dar nu va fi în mãsurã de a fi paginatã,


funcþia. Dacã Dvs. înºivã creaþi o funcþie direct ca listã (scurtcircuitând

astfel cã puteþi foarte uºor sã ajungeþi out of memory dacã faceþi multe
de-astea. În schimb, puteþi fixa o funcþie în memorie prin redefinirea ei fãrã

tru a fixa o funcþie definitã (cu defun) în memorie cu numele nuca, puteþi
tabelã de paginare (chestie încurajatã, cum se va vedea!). De exemplu, pen-

folosi:
(setq nuca (cdr nuca))
pentru a ºterge tabela de paginare din faþã. Tabelele de paginare sunt
104 Fundalul de lucru

tipãrite ca un simplu spaþiu când daþi un print al funcþiei. Puteþi spune


dacã o funcþie este evacuabilã prin cercetarea existenþei unui spaþiu dupã
prima parantezã deschisã; dacã e aºa, e evacuabilã.
Dacã încercaþi sã exploraþi funcþia ca pe date, ºi dacã ea este evacuatã, veþi
gãsi numai tabela de paginare în lista de funcþie. Apelul funcþiei n-o restau-

modificaþi „din zbor”, construiþi-le ca liste în loc de a folosi defun, sau


reazã - numai evaluarea ei face asta. Astfel, dacã Dvs. construiþi funcþii ºi le

folosiþi trucul de mai sus pentru a le fixa în memorie.



Mijloace avansate de
programare
4
În acest capitol vom prezenta unele dintre cele mai subtile posibilitãþi de
lucru cu AutoLISP. Este bine sã fi parcurs capitolele anterioare atunci când
vã veþi hotãrî sã treceþi la acesta.
S-a spus cã, pentru a folosi în cunoºtinþã de cauzã limbajul AutoLISP, este
necesarã cunoaºterea profundã a AutoCAD-ului. Dacã pentru ceea ce s-a
prezentat în capitolele 2 ºi 3 încã se mai putea lucra „vãzând ºi fãcând”,
acum este strict necesar sã fie bine stãpânit AutoCAD-ul pentru a înþelege
(ºi utiliza) de lucru ce se prezintã.

4.1 Recursivitate

Una dintre caracteristicile cele mai interesante ale limbajului AutoLISP


este marea disponibilitate spre recursivitate, adicã posibilitatea de a apela
o funcþie din ea însãºi. Fireºte cã asta se bazeazã pe lucru dinamic cu stive,
fapt ce conduce la o limitare legatã de memoria disponibilã. Nu veþi face uz
extensiv de astfel de soluþii de programare, pentru a nu ajunge în situaþia
depãºirii spaþiului disponibil de memorie.
Exemplul cel mai la îndemânã este programul Fact.Lsp, pentru calculul
factorialului unui numãr, care vine odatã cu pachetul de AutoCAD. Însãºi
rutina care face calculul efectiv al factorialului este necesarã pentru
declararea acelei rutine!
În continuare se vede cum aratã acest program.
106 Mijloace avansate de programare

; This is a programming example of a recursive function


; which calculates the factorial of an integer.
(defun factor (y)
(cond ((= 0 y) 1)
(t (* y (factor (1- y))))
)
)
(defun C:FACT (/ x)
(initget 7) ;x must not be null, negative or zero
(setq x (getint ”Enter an integer: ”))
(factor (float x))
)
Se observã cã în definiþia funcþiei factor apare apelul la factor, adicã la ea
însãºi. Atunci când este apelatã din interiorul funcþiei c:fact, dezvoltarea ei

culeazã factorialul. Dezvoltarea este gestionatã de funcþia cond care îºi


în memorie va depinde de mãrimea valorii numãrului pentru care se cal-

încheie acþiunea atunci când valoarea argumentului Y ajunge la 1.


Dacã rulaþi programul în AutoCAD-10 nu puteþi introduce un numãr mai
mare de 11 (dacã nu lucraþi cu Extended AutoLISP). Dacã lucraþi cu

numãr de peste 100. Oricum, acest lucru este posibil datoritã funcþiei float
AutoCAD-12, acesta îºi gestioneazã singur memoria ºi vã va permite un

pusã la crearea argumentului cu care este apelatã funcþia factor, fiindcã


altfel s-ar fi lucrat complet în numere întregi, iar acestea sunt mult mai
mici. Încercaþi!

4.2 Numere aleatoare

O problemã destul de dificilã la calculator este cea a generãrii de numere


aleatoare. Sunt cãrþi întregi de matematicã în care se trateazã astfel de
probleme. Cum numerele care trebuie generate sunt cuprinse între 0 ºi 1, o
cale posibilã este aceea de a împãrþi douã numere mari, prime între ele, ºi
de a lua o secvenþã de, sã zicem, ºase cifre din partea zecimalã rezultatã,
Capitolul 4 107

cãrora sã le punem în faþã un zero ºi un punct (sau virgulã, mã rog...).


AutoLISP nu are o funcþie care sã genereze numere aleatoare. O variantã
posibilã este cea de aici:
; Program ALEA.LSP
; Initializare baza de generare din data si ora curente
(setq baz_alea (atoi (rtos (rem (fix (* (getvar ”date”) 10000.0)) 1000) 2 0)))
; ”AL_EA” Functie pentru generarea numerelor aleatoare intre 0 si 1
(defun al_ea()
(setq baz_alea (* baz_alea 17381)) ;7x13x191=17381
(/ (Boole 1 baz_alea 65535) 65535.0)
)
Dacã vã aruncaþi o privire în capitolul 5, vedeþi cã funcþia Boole al cãrei
prim argument are valoarea 1 este echivalentã cu ºi logic. Într-adevãr,
expresia (Boole 1 12 5) returneazã 4 fiindcã singurul bit cu valoare 1 atât
în 12 cât ºi în 5 este bitul al treilea (de la dreapta la stânga), deci rezultatul
este 1002, adicã 4. În funcþia de mai sus, numãrul 65535 este folosit din

biþi dacã este reprezentat în binar. Cum variabila baz_alea este mai mare
cauzã cã fiind egal cu 216-1, conþine numai cifre de 1 pe o întindere de 16

nitare) cu 17381, înseamnã cã funcþia Boole va alege partea din numãrul


decât 17381 (fiind obþinutã prin înmulþirea valorii ei anterioare (suprau-

fie mai uºor de urmãrit, dacã aplicaþi funcþia ºi pe numerele 11101012 ºi


pe care ea îl exprimã corespunzãtoare unui numãr mai mic de 65535. Ca sã

1112 veþi obþine 1012, nu-i aºa? Vedeþi cã s-au extras din numãrul cel mare
ultimele sale trei cifre (binare) printr-un ºi logic între acest numãr ºi un
numãr binar de trei cifre format numai din 1. Tot aºa, în funcþia al_ea sunt
alese ultimele sale 16 cifre binare pentru a forma numãrul (mai mic sau
egal cu 65535) pe care aceastã funcþie îl va împãrþi la 65535.0, returnând un

al_ea va returna un numãr aleator cuprins în intervalul (0,1]. Dacã vreþi ca


numãr (aleator) subunitar (sau unitar, la limitã) real. Ca urmare, funcþia

din acest numãr sã obþineþi valoarea aleatoare a unui zar, faceþi un apel în

(* 6 (fix (+ 0.5 (al_ea))))


genul:

Variabila de sistem DATE are valori în genul 2450132.85865255. Oricât ar


108 Mijloace avansate de programare

pãrea de ciudat, acest numãr reprezintã o datã ºi o orã. Partea întreagã


reprezintã data (dupã calendarul iulian), iar partea zecimalã reprezintã
fracþiunea dintr-o zi scursã de la miezul nopþii pânã la momentul curent
(dacã vreþi sã aflaþi care este valoarea în secunde a acestei fracþiuni de zi,
înmulþiþi partea zecimalã cu 86400). În altã ordine de idei, dacã doriþi sã
aflaþi diferenþa de timp în secunde dintre douã momente, scãdeþi valorile
corespunzãtoare acestei variabile în cele douã momente ºi înmulþiþi va-
loarea obþinutã cu 86400 (24 x 3600 = 86400 = o zi în secunde).
Restul de amãnunte legate de program vã las sã le dibuiþi singuri.

4.3 Dialog cu rãspuns ne-aºteptat

Am scris „ne-aºteptat” în loc de „neaºteptat” fiindcã, aºa cum o sã vedem,


rãspunsul nu este dintre cele pe care programul se aºteaptã sã le primeascã.

principal, acestea sunt legate de funcþia initget. Ea este explicatã pe larg la


Limbajul AutoLISP oferã mijloace destul de puternice pentru dialog. În

capitolul 5, aºa cã nu o mai explic încã o datã. Ceea ce vreau, este sã vã dau
un exemplu. Aveþi aici ceva ce poate sã vã intereseze. Dacã doriþi sã rãspun-
deþi la o cerere de punct geometric pe ecran, uneori aþi dori sã-l daþi ca
punct raportat la unul existent pe ecran. De exemplu, vreþi sã începeþi ceva
dintr-un punct aflat mai la dreapta cu 12.3 unitãþi faþã de un punct existent
pe care îl puteþi identifica prin osnap-ul INTersection. Încãrcaþi programul
de mai jos:
; Program Cheie.Lsp
; Accepta ca intrare fie un punct, fie un nume de functie
(defun C:CHEIE( / pct)
(initget 128)
(setq pct (getpoint ”\nPunct: ”))
(if (= ‘STR (type pct))
(setq pct (eval (read pct)))
pct
)
Capitolul 4 109

)
(defun REF()
(setvar ”LASTPOINT” (getpoint ”\nPunct referinta: ”))
(getpoint ”\nPunctul urmator: ” (getvar ”LASTPOINT”))
)
dupã care parcurgeþi dialogul:
Command: CHEIE
Punct: (ref)
Punct referinta: INT
of indicati intersectia existentã pe ecran
Punctul urmator: @12.3,0
De reþinut cã la cererea „Punct: “ aþi fi putut arãta de-a dreptul un punct

Pãi sã ne uitãm un pic la cod. Mai întâi fixaþi cu (initget 128) posibili-
pe ecran ºi nu vi s-ar mai fi cerut altceva! Cum se rezolvã aceasta?

lui pentru initget au fost introduse abia de la AutoCAD-11). Apoi cereþi


tatea de introducere a unui cuvânt cheie (valorile 64 ºi 128 ale argumentu-

punctul pct ºi vã puneþi întrebarea:


(if (= ‘STR (type pct))
(setq pct (eval (read pct)))
pct

Prin (type pct) cereþi sã vi se returneze tipul variabilei pct. Dacã tipul este
)

cereþi prin (eval (read pct)) sã se evalueze conþinutul acestei variabile ca


STR (adicã ºir de caractere, cum este în exemplul rulat de mai sus), atunci

ºi când ar fi o funcþie, adicã sã se execute funcþia ref. Dacã tipul lui pct nu
este STR, atunci returnaþi chiar valoarea lui pct. Aceste subtilitãþi meritã
sã fie reþinute.
De notat cã exact facilitatea punctelor de referinþã oferitã de acest program
o aveþi la îndemânã în AutoCAD-13 prin OSNAP-ul „From”.
110 Mijloace avansate de programare

4.4 Prelucrarea listelor

Principalele elemente ale programelor AutLISP sunt listele. Dacã învãþãm


sã le stãpânim ca lumea, avem un prim punct câºtigat în stãpânirea
AutoLISP-ului ca limbaj. Existã numeroase funcþii care opereazã exclusiv
cu liste. Ele sunt frumos grupate în anexa A, dar iatã-le ºi aici:
append car/cdr foreach length listp member reverse
assoc cons last list mapcar nth subst
O funcþie mai nouã este acad_strlsort, introdusã odatã cu AutoCAD-12,
celelalte funcþionând ca atare inclusiv sub AutoCAD-10.
Ca sã nu vorbim abstract, vom prezenta niºte exemple.

4.4.1 Eliminarea unui element dintr-o listã


Nu existã o funcþie predefinitã prin care sã putem elimina un element

Fie lista LLL definitã ca (2 4 ”ABc” bac W 3.7) cu 6 elemente. Unele


dintr-o listã. Atunci trebuie sã ne-o facem singuri!

sunt valori numerice întregi (2 ºi 4), altele valori reale (3.7), altele ºiruri de

un element nu se repetã. Dorim sã eliminãm simbolul bac. Rezolvarea tre-


caractere („ABc”), iar altele simboluri (bac ºi W). Vã rog sã observaþi cã nici

buie sã fie generalã, deci sã plecãm de la faptul cã o listã poate sã conþinã


elementul respectiv ºi, dacã îl conþine, dorim sã fie eliminat ºi sã ni se
returneze lista fãrã el.
Iatã o funcþie care poate sã rezolve acest lucru:
; Functie ptr. eliminare element ”elm” din ”lista”
; Restrictie: ”elm” sa fie unic in ”lista”
(defun elim(elm lista)
(append (reverse (cdr (member elm (reverse lista))))
(cdr (member elm lista))
)
)
Vom proceda aºa:
Command: (load ”elim”)
Capitolul 4 111

ELIM
Command: (setq LLL ‘(2 4 ”ABc” bac W 3.7))
Command: (elim bac LLL)
(2 4 ”ABC” W 3.7)
Dupã cum se vede, ni s-a returnat lista fãrã simbolul bac. Sã desluºim cum
s-a realizat acest lucru. Pãi, sã revedem mai întâi care sunt rolurile jucate

append - returneazã lista formatã prin alãturarea a douã sau mai multe liste
de funcþiile ce apar în funcþia noastrã:

reverse - returneazã lista inversatã


cdr
member - returneazã lista începând de la element spre dreapta
- returneazã lista fãrã primul element

Atunci haideþi sã vedem cum se petrec lucrurile de la interior spre exterior.


Funcþia append va conecta douã pãrþi ale unei liste.
Prima parte este formatã prin expresia:
(reverse (cdr (member elm (reverse lista))))
iar a doua prin expresia:
(cdr (member elm lista))
Lista LLL este (2 4 ”ABc” bac W 3.7). Punem alãturi cauza ºi efectul:
(reverse LLL) => (3.7 W bac ”ABc” 4 2)
(member bac (reverse LLL)) => (bac ”ABc” 4 2)
(cdr (member bac (reverse LLL))) => (”ABc” 4 2)
(reverse (cdr (member bac (reverse LLL)))) => (2 4 ”ABc”)
Acum partea a doua:
(member bac LLL) => (bac W 3.7)
(cdr (member elm lista)) => (W 3.7)
Cele douã pãrþi rezultate puse împreunã dau:
(append (2 4 ”ABc”) (W 3.7)) = > (2 4 ”ABc” W 3.7)
Am obþinut exact ceea ce doream: lista iniþialã din care lipseºte bac.
Problema pe care aceastã micã funcþie nu o rezolvã este cã nu se descurcã

Într-adevãr, am uitat sã amintesc cã funcþia member returneazã ceea ce


în cazul în care elementul de eliminat apare de mai multe ori în listã.

rãmâne dintr-o listã începând cu prima apariþie a elementului dat ca argu-


112 Mijloace avansate de programare

ment ºi pânã la sfârºitul ei. Vã daþi seama cã a doua, a treia etc. apariþie a
elementului cu pricina vor rãmâne în listã ºi asta va conduce la un rezultat
nedorit. Totdeauna trebuie sã identificaþi situaþiile de acest gen ºi sã le
menþionaþi în preambulul funcþiei (aºa cum am fãcut ºi eu). Vã las pe Dvs.
sã vã distraþi încercând o rezolvare generalã.

4.4.2 Ordonarea unei liste


Aceastã problemã poate sã vã intereseze adesea. Veþi reþine însã cã prelu-
crarea unei liste mari poate sã ia timp, nu glumã, caz în care este preferabil
sã utilizaþi programarea în C (vezi secþiunea 3.1). Pentru liste mai mici
(conþinând, sã zicem, pânã la 100 de elemente), puteþi lucra liniºtiþi cu
AutoLISP.
Fie programul de mai jos stocat în fiºierul Ord.Lsp. Ca sã n-o mai lungim,
intrãm în AutoCAD (poate fi chiar Release-10) ºi parcurgem dialogul:
Command: (load ”ord”)
ORD_LST
Command: (setq aaa ‘(3 -1 5 2 7 33 -2e3 41 5 3 2))
(3 -1 5 2 7 33 -2000.0 41 5 3 2)
Command: (ord_lst aaa)
(-2000.0 -1 2 2 3 3 5 5 7 33 41)

funcþia ord_lst), apoi am declarat o variabilã de tip listã cu numele aaa ºi


Ce am fãcut? Am încãrcat programul (format dintr-o singurã funcþie -

am apelat funcþia ord_lst ºi i-am furnizat lista aaa ca argument. Ni s-a


i-am dat valoarea unei liste de constante întregi ºi reale la întâmplare. Apoi

returnat imediat lista ordonatã crescãtor.


Dacã acum suntem lãmuriþi ce face, sã vedem ºi cum face... Funcþia este lis-
tatã aici:
; Program de ordonare crescatoare a listei ”lst”
; Apel uzual: (setq lista (sort_lst lista))
; Se executa ordonarea listei ”lista” in ea insasi
(defun ord_lst(lst / mini tmp lord elem1)
(repeat (length lst)
(setq mini (apply ‘min lst)
Capitolul 4 113

tmp ()
)
(foreach elem1 lst
(if (/= elem1 mini) (setq tmp (append (list elem1) tmp))
(setq lord (append lord (list elem1)))
)
)
(setq lst tmp)
)
lord
)

Vom lua liniile pe rând. Definiþia:


(defun ord_lst(lst / mini tmp lord elem1)
fixeazã lst ca argument ºi mini, tmp, lord, ºi elem1 ca simboluri locale

cã dupã rularea programului o variabilã ca mini este nedefinitã!


(vezi secþiunea 2.9 pentru o discuþie pe aceastã temã). Vom reþine de aceea

Mai departe, se lanseazã un ciclu prin funcþia repeat care va executa atâtea
iteraþii câte elemente are lista, întrucât expresia (length lst) returneazã
exact numãrul de elemente pe care le conþine lista lst. (Aveþi grijã sã scrieþi
length ºi nu lenght, cum se mai întâmplã...)
(repeat (length lst)
Urmeazã corpul ciclului, care în prima parte face setãrile:
(setq mini (apply ‘min lst)
tmp ()
)
Aici se declarã variabila (localã) mini ca fiind elementul cu valoare minimã
din lista lst. Este preferatã funcþia apply, în loc de a se face un ciclu,
deoarece este mult mai directã ºi realizeazã acelaºi lucru. Nu ezitaþi sã con-

face funcþia apply.


sultaþi capitolul 5 dacã vi se pare necesar, adicã pentru a vedea ce anume

Tot aici se declarã variabila tmp ca drept listã vidã.


Urmeazã partea a doua a corpului ciclului formatã din liniile:
114 Mijloace avansate de programare

(foreach elem1 lst


(if (/= elem1 mini) (setq tmp (append (list elem1) tmp))
(setq lord (append lord (list elem1)))
)
)
(setq lst tmp)
Aici este tot ºpilul acestei funcþii. Prin foreach se parcurge pas cu pas toatã
lista. Practic, funcþia foreach atribuie succesiv variabilei elem1 (declaratã
chiar acum ºi cu efect limitat doar în cuprinsul lui foreach) câte o valoare
preluatã din lista lst. Corpul lui foreach este format dintr-o funcþie if care
are atât clauza then cât ºi else. Condiþia care se testeazã este dacã elem1
este diferit de mini. Cum elem1 este câte un element din lista lst, se

este diferit, atunci el este pus în faþa listei tmp care începe sã prindã ºi ea
cerceteazã dacã acesta este diferit de elementul minim din toatã lista. Dacã

iniþiale, deci acesta va fi primul element pus în lista lord de ieºire (aceasta
viaþã, dacã nu, înseamnã cã ne aflãm chiar pe elementul minim al listei

tot acum prinde ºi ea viaþã). Dupã ce se încheie ciclul foreach, lista lst
originalã este înlocuitã cu lista tmp, formatã din elementele ne-minime, ca
sã le zic aºa. Diferenþa între listele tmp ºi lord este cã tmp se reiniþia-
lizeazã pe listã vidã () la fiecare repeat, în timp ce lord acumuleazã pe
rând la coada ei elementul minim succesiv. Dacã în lista lst sunt mai multe

cadrul ciclului foreach la fiecare dintre acestea opereazã ramura else a lui
elemente care au valoare minimã identicã la un moment dat, atunci în

if, deci ele se adaugã la coada listei lord.


La fiecare iteraþie a ciclului repeat lista lst a pierdut practic elementul ei
minim de la momentul anterior (sau mai multe dacã sunt identice pe va-

ieºire lord. Deci, primul element al lui lord este minimul din lista origi-
loarea minimã), acestea fiind transferate în acelaºi ritm la coada listei de

nalã, urmãtorul este minimul din lista obþinutã din cea originalã prin eli-
minarea minimului º.a.m.d.
Reþinem cã funcþia append conecteazã douã sau mai multe liste într-una
singurã. Condiþia este ca argumentele ei sã fie liste! De aceea se pune (list
elem1) ºi nu elem1, ca sã transformãm elementul de listã elem1 într-o listã
(cu un unic element). Aha - o sã ziceþi - deci funcþia list transformã ele-
Capitolul 4 115

mente de listã disparate în listã adevãratã! Aºa e, v-aþi prins! Sã clarificãm

Dacã vã uitaþi la cele douã linii ale lui if:


un pic expresiile „în faþa” ºi „în coada” unei liste folosite de mine mai sus.

(setq tmp (append (list elem1) tmp))


(setq lord (append lord (list elem1)))
observaþi cum sunt aranjate argumentele funcþiei append: la prima este
(append ceva listã) iar a doua este (append listã ceva). Cred cã e clar
cã la prima ordinea este inversã faþã de a doua, ceea ce explicã ºi expresiile
menþionate.
Funcþia ord_lst se încheie prin menþionarea, pur ºi simplu, a numelui lis-
tei lord. Asta e o bunã tehnicã pentru a face ca o funcþie sã returneze ceea
ce dorim noi. Dacã apelãm aceastã funcþie în felul cum se aratã în antet:
(setq lista (ord_lst lista))
atunci paranteza internã va returna chiar lista ordonatã, deci aceasta se va
ordona în ea însãºi, nu-i aºa?
Dacã vreþi sã vedeþi cum evolueazã variabilele din cadrul funcþiei în timpul
desfãºurãrii acesteia, iatã cum se petrec lucrurile:
Lista initiala: (2 3 1 1 4 1)
Repeat #1 ==> Lst: (2 3 1 1 4 1)
Nrord: 2 Mini: 1 Tmp: (2) Lord: nil
Nrord: 3 Mini: 1 Tmp: (3 2) Lord: nil
Nrord: 1 Mini: 1 Tmp: (3 2) Lord: (1)
Nrord: 1 Mini: 1 Tmp: (3 2) Lord: (1 1)
Nrord: 4 Mini: 1 Tmp: (4 3 2) Lord: (1 1)
Nrord: 1 Mini: 1 Tmp: (4 3 2) Lord: (1 1 1)
Repeat #2 ==> Lst: (4 3 2)
Nrord: 4 Mini: 2 Tmp: (4) Lord: (1 1 1)
Nrord: 3 Mini: 2 Tmp: (3 4) Lord: (1 1 1)
Nrord: 2 Mini: 2 Tmp: (3 4) Lord: (1 1 1 2)
Repeat #3 ==> Lst: (3 4)
Nrord: 3 Mini: 3 Tmp: nil Lord: (1 1 1 2 3)
Nrord: 4 Mini: 3 Tmp: (4) Lord: (1 1 1 2 3)
Repeat #4 ==> Lst: (4)
Nrord: 4 Mini: 4 Tmp: nil Lord: (1 1 1 2 3 4)
Repeat #5 ==> Lst: nil
Repeat #6 ==> Lst: nil
Lista ordonata: (1 1 1 2 3 4)
Observaþi foarte clar cum evolueazã lucrurile: prin intermediul listei dezor-
116 Mijloace avansate de programare

donate tmp se transferã pe rând în ordine de la mic la mare elemente în


lista lord. În treacãt fie spus, dacã doriþi sã faceþi ordonare descrescãtoare
schimbaþi ‘min cu ‘max în funcþia apply. Mai puteþi observa cã la sfârºit
s-au consumat elementele ºi repeat nu mai are pe ce opera fiindcã lst
devine nil. Acestea sunt riscurile utilizãrii ciclului repeat, cu numãr fix
de iteraþii, în locul ciclului cu numãr variabil while. Alte funcþii de ciclare
nici nu mai sunt în AutoLISP (dacã ignorãm foreach, care este totuºi dife-
ritã). Dacã vreþi sã corectaþi ºi treaba asta, modificarea este foarte simplã.
În locul liniei:
(repeat (length lst)
puneþi:
(while lst
ºi gata! Asta lucreazã atâta timp cât lst este non-nil, nu?

4.5 Acces la entitãþi ºi dispozitive

Dupã ce am vãzut unele particularitãþi ale limbajului AutoLISP, trecem


acum la prezentarea funcþiilor care permit accesul liber al utilizatorului la
entitãþile de desen specifice AutoCAD-ului ºi la dispozitivele periferice
care formeazã (sau pot forma) o staþie de lucru profesionalã.
Funcþiile prezentate în continuare permit selectarea de entitãþi proprii
AutoCAD-ului, gãsirea valorilor ce le caracterizeazã ºi modificarea lor
liberã. Mulþimile de selecþie („selection-sets”) trebuie sã fie stocate în vari-
abile AutoLISP pentru a putea lucra cu colecþiile de entitãþi. Aceste mulþi-
mi sunt stocate, fireºte, ca liste, deci putem aplica asupra lor oricare dintre
funcþiile sau programele pe care le creãm singuri (cum este funcþia „sort”)
dedicate prelucrãrii de liste. De exemplu, putem selecta automat toate seg-
mentele de dreaptã verticale dintr-un desen ºi le putem aºeza în ordine
crescãtoare în punctele în care se aflau iniþial. Sau putem selecta toate cer-
curile roºii ºi liniile întrerupte pentru a le scala în raport cu un punct pe
care sã-l arãtãm cu mouse-ul.
Capitolul 4 117

De asemenea, prin funcþiile ce se prezintã aici se asigurã accesul la peri-


ferice, ca ecranul sau dispozitivele de intrare.

4.5.1 Tipuri speciale de datã


Pentru a se asigura accesul la entitãþile AutoCAD, sunt implementate douã
tipuri particulare de date (pe lângã liste, simboluri, ºiruri, numere reale,
întregi ºi descriptori de fiºiere): nume de entitate ºi mulþime de selecþie.
Aceste tipuri de datã sunt manipulate numai prin funcþii dedicate, struc-
tura lor nefiind relevantã pentru programele AutoLISP. Un nume de enti-
tate este, de fapt, un „pointer” dintr-un fiºier, ºtiut de AutoCAD numai pe
durata unei sesiuni cu Editorul de Desene AutoCAD; acesta din urmã îi
permite lui AutoLISP sã gãseascã informaþiile legate de acea entitate, asi-
gurându-i accesul la „înregistrarea” ce se referã la ea ºi la vectorii acesteia
(dacã se aflã pe ecran). Pe de altã parte, o mulþime de selecþie este o simplã
colecþie de nume de entitãþi.
Subliniem faptul cã numele de entitãþi ºi mulþimile de selecþie sunt valide
numai pe durata sesiunii cu Editorul de Desene în care acestea au fost
obþinute din AutoCAD. În schimb, funcþiile orientate pe entitãþi pot regãsi
ºi manipula aºa numitele „entity handles”, care sunt indicatori permanenþi
(valabili ºi în alte sesiuni cu acelaºi desen decât cea curentã) ce pot fi aso-
ciaþi entitãþilor prin AutoCAD. AutoLISP vede aceste „handles” ca ºiruri
de caractere compuse din cifre hexazecimale.
NOTE:
1. Prin „pointer” trebuie sã înþelegem un „indicator”, o „adresã”, care se
referã la ceva dintr-un fiºier. Cum fiºierele sunt compuse din
înregistrãri („records”), ne aºteptãm ca acel „ceva” sã fie o înregis-
trare. Mai precis, dacã de exemplu este vorba de un fiºier text,
atunci înregistrãrile pot fi pur ºi simplu liniile care-l compun, iar
un pointer (de linie) este adresa uneia dintre aceste linii. Prin
intermediul pointerilor (care reprezintã o unealtã extrem de pu-
ternicã în cadrul unor limbaje de programare, precum limbajul
„C”), în loc de a lucra cu înregistrãri - care ar trebui sã fie prelu-
ate din locul unde se aflã - se poate lucra cu pointerii care le
adreseazã. În acest fel, de exemplu, în loc de a ordona înregi-
118 Mijloace avansate de programare

strãrile din fiºier dupã un criteriu oarecare, vom ordona pointerii


care le referã! Cum toate acþiunile cu fiºierul se vor desfãºura
ulterior prin intermediul pointerilor, vom vedea permanent
fiºierul ca fiind ordonat, deºi practic în el nu s-a umblat!
2. Când spunem „sesiune cu Editorul de Desene AutoCAD” ne referim la
timpul scurs din momentul când am intrat într-un desen, pânã
când am dat comanda „END” (sau „QUIT”) ºi am ieºit. În tot
acest timp, AutoCAD-ul întreþine o „bazã de date” („database”) -
formatã din înregistrãri - care conþine toate informaþiile privind
entitãþile definite la un moment dat într-o formã canonicã. În
aceste înregistrãri se aflã numele de entitãþi menþionate.
3. În traducere, „handle” înseamnã „mâner”, sau „toartã”. Comanda
„HANDLES” din AutoCAD permite atribuirea unui numãr unic
(cu sens de nume) fiecãrei entitãþi din desenul curent, deci
creeazã o „toartã” de care putem „apuca” entitatea oricând, fãrã
probleme. „Apucarea” se poate face atât din exterior (printr-un
program de gestionare a unei baze de date, gen „dBASE”) folosind
fiºierele de transfer „.DXF”, cât ºi din interior, prin intermediul
AutoLISP-ului. Cum AutoLISP le vede ca ºiruri de cifre hexazeci-
male, ne vom aºtepta ca numerele asociate de AutoCAD drept
„mânere” pentru entitãþi sã aparã sub forme ca „1” pentru enti-
tatea cu numãrul 1 sau „FF” pentru entitatea cu numãrul 255.
4.5.2 Funcþii de manipulare a mulþimilor de selecþie
În cele ce urmeazã sunt listate toate funcþiile ce permit operaþii cu mulþimi
de selecþie. Numele lor conþine prefixul „ss”, care provine de la „selection
set”.
ssadd ssget ssmemb
ssdel sslength ssname
Un prim exemplu de lucru cu aceste funcþii aþi avut în secþiunea 2.10, dar
acolo prezentarea era fãcutã prin prisma scopului de moment.
Dintre funcþiile „ss” de departe cea mai importantã este ssget. Aceasta
asigurã cea mai generalã metodã de selectare a unor entitãþi ºi creare a unei
mulþimi de selecþie. În acest scop sunt folosite mai multe cãi de selectare,
Capitolul 4 119

începând de la prezentarea prompterului „Select objects:” ºi invitarea uti-


lizatorului sã facã interactiv acest lucru, pânã la selectarea directã a tuturor
entitãþilor din desen, cu prezentarea opþionalã a unui prompter ales de uti-
lizator.
De exemplu, dacã lucraþi cu o versiune de AutoCAD de dinaintea lui

„Select objects:”. Folosiþi în acest scop funcþia ssget astfel:


Release-12 nu dispuneþi de opþiunea „ALL” (adicã „toate”) pe prompterul

Command: (setq s (ssget ”X”))


iar la cererea „Select objects:” introduceþi !s care va invoca variabila s ce a
reþinut deja toate entitãþile aflate în acest moment în desen.
Mai mult, dacã doriþi, puteþi face asta direct pe prompterul „Select
objects:”. De exemplu, dacã doriþi sã mutaþi toate entitãþile din desen mai
sus cu 123 unitãþi, parcurgeþi dialogul:
Command: MOVE
Select objects: (ssget ”X”)
Select objects: <Enter>
Base point or displacement: 0,-123
Second point of displacement: <Enter>
Fireºte cã în AutoCAD-12, având la dispoziþie posibilitate de selectare
directã a tuturor entitãþilor (prin opþiunea „ALL”), nu mai aveþi nevoie de
astfel de artificii.
Dacã doriþi sã selectaþi entitãþi aflate în interiorul unei ferestre „Crossing”
puteþi face aºa:
(ssget ”C” pct1 pct2)
unde pct1 ºi pct2 sunt colþurile opuse ale ferestrei. În loc de „C” puteþi
pune caracterele pe care le cunoaºteþi, desigur:
„L” Last (ultima entitate neºtearsã creatã în desen)
„P” Previous (mulþimea de selecþie cea mai recentã)
„W” Window (selecteazã numai entitãþile complet incluse în fereastrã,
cerând douã puncte ca ºi la „C”)
„F” Fence (selecteazã entitãþile tãiate de linia frântã ce trece prin
punctele pct1 pct2 etc. pe care le veþi furniza Dvs.)
Mai interesante sunt însã posibilitãþile de filtrare a entitãþilor selectate. În
120 Mijloace avansate de programare

acest scop sunt folosite listele de filtrare. Ele se bazeazã pe codurile de grup
DXF (prezentate pe larg în anexa D).
De exemplu, dacã doriþi sã selectaþi toate entitãþile care se gãsesc în layerul
cu numele „ETAJ4” veþi introduce:
(setq s (ssget ”X” ‘((8 . ”ETAJ4”))))
Aici s-au introdus douã argumente pentru ssget, care reprezintã douã
mulþimi de selecþie: una este exprimatã prin „X” ºi înseamnã toate
entitãþile, iar alta este ‘((8 . ”ETAJ4”)) ºi înseamnã entitãþile din layerul
„ETAJ4” fiindcã 8 este codul de grup pentru layer (anexa D). Combinarea
acestor douã mulþimi se face prin intersectarea lor logicã (ºi nu reuniunea,
cum poate v-ar veni în minte, atunci când prima nu ar fi „X”).
Vã rog sã observaþi construcþia ‘((8 . ”ETAJ4”)). Aceasta este o listã de
constante luate ca atare (fiind precedatã de apostrof), conþinând un singur
element, adicã (8 . ”ETAJ4”). Acest element este o aºa numitã
pereche-cu-punct. Dupã cum vedeþi, este vorba de doi atomi separaþi prin
blanc-punct-blanc. Uneori, ºirului „ETAJ4” din aceastã construcþie i se mai
spune „asociativul 8”.
Evident cã puteþi scrie acelaºi lucru ºi aºa:
(list (cons 8 ”ETAJ4”))
mai ales cã aceasta este varianta mai generalã (vezi ºi funcþia cons la capi-
tolul 5). Zic „mai generalã” fiindcã atunci când vreþi sã folosiþi o variabilã
(notatã LAY, sã zicem) în care aþi pus ºirul „ETAJ8”, nu mai puteþi pune:
(setq s (ssget ”X” ‘((8 . LAY)))) ;gresit
ci numai:
(setq s (ssget ”X” (list (cons 8 LAY))))

NOTA:
Dacã nu daþi atenþie la amãnuntele acestui gen de construcþie vã

(list (8 . ”ETAJ4”)) care va fi respinsã de AutoLISP, sau


puteþi trezi cã puneþi:

(list 8 ”.” ”ETAJ4”) care nu va fi respinsã, dar produce lista


nedoritã (8 ”.” ”ETAJ4”); ea nu selecteazã nimic!
Capitolul 4 121

‘((8 . ”ETAJ4”)) (list (cons 8 ”ETAJ4”))


Deci reþineþi cele douã variante corecte:
sau
dintre care a doua este mai generalã decât prima, în sensul
menþionat.
Puteþi combina filtrele ºi aºa:
(setq s (ssget ”P” ‘((0 . ”CIRCLE”))))
Aici aþi cerut sã se selecteze toate cercurile care intrã în mulþimea

funcþia ssget: unul este „P” care reselecteazã mulþimea cea mai recent
„Previous”. Observaþi din nou introducerea a douã argumente pentru

selectatã, iar celãlalt este ‘((0 . ”CIRCLE”)) care selecteazã toate cercurile.
Aºa cum spuneam, mulþimea rezultantã este intersecþia celor douã.
Dar ce facem atunci când vrem sã punem douã sau mai multe filtre? De
exemplu, cum punem condiþia de a selecta toate cercurile de culoare verde?
Pãi, vom pune:
(setq s (ssget ”X” (list (cons 0 ”CIRCLE”) (cons 62 3))))
Din cauzã cã nu apar nume de variabile, ci numai valori constante, putem
folosi la fel de bine ºi construcþia cu apostrof, sub forma:
(setq s (ssget ”X” ‘((0 . ”CIRCLE”) (62 . 3))))
Dar sã vedem cum lucreazã ºi alte funcþii dintre cele menþionate la
începutul acestei secþiuni. Ca sã fie mai clar, vom studia un exemplu. Sã
zicem cã dorim sã rotim toate blocurile din layerul CADRE cu 90°, fiecare
în jurul punctului sãu de inserþie.
(defun C:R90()
(setq ss (ssget ”X” ‘((8 . ”CADRE”) (0 . ”INSERT”))))
(setq contor 0)
(while (< contor (sslength ss))
(setq ecrt (ssname ss contor))
(command ”UCS” ”e” ecrt)
(command ”ROTATE” ecrt ”” ”0,0” ”90”)
(setq contor (1+ contor))
)
(command ”REGEN”)
(princ)
)
122 Mijloace avansate de programare

Vom reþine cã sintagma „toate blocurile” se referã, de fapt, la „toate inserþi-


ile de blocuri”, fiindcã entitãþile oricãrui bloc sunt reþinute în desen o sin-
gurã datã (împreunã cu poziþia relativã a punctelor lor de inserþie), iar ceea
ce inserãm noi sunt aºa-numitele „inserþii”. Ca urmare, numele de entitate
(cod de grup 0) al acestor obiecte este „INSERT” (vezi ºi anexa D). De aici
rezultã imediat ºi motivul pentru care, dacã redefinim un bloc, atunci noua
definiþie înlocuieºte în tot desenul „blocul” vechi.
Dar sã ne lãmurim cum lucreazã programul R90.LSP. Ca sã puteþi sã-l
folosiþi efectiv faceþi un desen care sã reprezinte blocul, apoi creaþi layerul
CADRE, inseraþi de mai multe ori blocul în acest layer (punctele de inserþie

Încãrcaþi-l cu (load ”R90”) ºi apoi lansaþi-l cu comanda R90. Veþi vedea cã


pot avea altitudini Z diferite). Acum intrã în acþiune programul nostru.

toate blocurile (adicã inserþiile, nu?) se vor roti în jurul punctelor lor de
inserþie cu 90°.
Programul în sine selecteazã mai întâi toate inserþiile din layerul CADRE
prin linia:
(setq ss (ssget ”X” ‘((8 . ”CADRE”) (0 . ”INSERT”))))
care cred cã nu mai trebuie explicatã. Apoi, în ciclul while este luatã pe
rând fiecare inserþie prin linia:
(setq ecrt (ssname ss contor))
Dacã o sã cercetaþi ce face funcþia ssname (cap. 5) o sã observaþi cã ea vã
returneazã numele entitãþii cu numãrul de ordine „contor” din mulþimea
de selecþie „ss” (numerele de ordine încep de la 0 ºi nu de la 1). Deci „ecrt”
va fi numele inserþiei curente.
Mai departe, liniile:
(command ”UCS” ”e” ecrt)
(command ”ROTATE” ecrt ”” ”0,0” ”90”)
nu fac decât sã aºeze UCS-ul pe „ecrt” ºi apoi sã execute efectiv rotirea cu
90°. În final este dat un REGEN pentru a curãþa ecranul de rãmãºiþe. Acest
program vã poate fi foarte folositor! Puteþi roti la orice unghi, sau puteþi
face orice altã prelucrare geometricã aplicatã selectiv pe „blocuri”.
În cadrul exemplului de mai sus au apãrut funcþiile ssget, sslength ºi
ssname, ale cãror semnificaþii cred cã sunt clare. Repet, nu uitaþi cã in-
Capitolul 4 123

ssname începe de la 0, adicã prima entitate din mulþime este entitatea 0,


dexul prin care este aleasã o entitate din mulþimea de selecþie cu funcþia

apoi 1 º.am.d.
Funcþia ssadd adaugã o singurã entitate la mulþimea existentã. De exem-
plu, dupã ce aþi creat mulþimea SS în exemplul de mai sus, puteþi adãuga
la ea o altã entitate prin:
(setq entitate (entnext))
(setq ss (ssadd entitate ss))

tatea de adãugat se aflã deja în mulþime, atunci ssadd este ignoratã.


care adaugã prima entitate din desen la mulþimea SS. De notat cã dacã enti-

(Funcþia entnext va fi prezentatã mai în detaliu în secþiunea ce urmeazã.)


Sã vedem cum lucreazã ssdel ºi ssmemb. Dacã doriþi sã eliminaþi enti-
tatea ENTITATE din mulþimea de selecþie SS introduceþi linia:
(setq ss (ssdel entitate ss))
Dacã doriþi sã aflaþi dacã entitatea ENTITATE face parte din mulþimea SS
introduceþi linia:
(setq enty (ssmemb entitate ss))

setatã pe nil, iar dacã face parte, variabila va primi ca valoare numele
Dacã entitatea nu face parte din mulþime, atunci variabila ENTY va fi

entitãþii.

4.5.3 Funcþii nume de entitate


Pânã aici, funcþiile prezentate aveau numele prefixat cu „ss”, deoarece se
refereau la mulþimi de selecþie (selection set). Cele care fac obiectul acestui

excepþia lui handent; totdeauna trebuie sã fie ºi o excepþie, mãcar...). Ele


subcapitol sunt prefixate cu „ent”, deoarece se referã la nume de entitãþi (cu

executã diverse operaþii care au ca obiect numele de entitãþi. Aceste funcþii


sunt:
entdel entlast entmod entsel handent
entget entmake entnext entupd

gate funcþiile nentsel ºi nentselp (vezi cap. 5).


Din aceeaºi categorie, în ultimele versiuni de AutoCAD au mai fost adãu-
124 Mijloace avansate de programare

Conform bunelor noastre obiceiuri, haideþi sã studiem un exemplu.


Programul Lung3D.LSP, dat mai jos, vã cere sã selectaþi o polilinie 3D ºi
vã returneazã lungimea totalã a acelei polilinii. Dacã polilinia 3D este
planã puteþi obþine lungimea ºi cu comanda LIST datã în AutoCAD, dar
dacã vertex-urile poliliniei nu sunt coplanare, atunci numai un program ca
acesta vã poate oferi lungimea doritã. În acest program este interesant fap-
tul cã trebuie sã cercetãm segmentele care compun polilinia, adicã suben-
titãþile entitãþii complexe 3DPOLY. Dar iatã cum aratã programul:
; Calculeaza lungimea unei polilinii 3D
(defun C:LUNG3D ( / Pct Lng Ent En1)
(setq Ent (car (entsel ”\nSelectati polilinia 3D:”))
Ent (entnext Ent)
Lng 0.0
)
(while (= (cdr (assoc 0 (setq En1 (entget Ent)))) ”VERTEX”)
(cond
((null Pct) (setq Pct (cdr (assoc 10 En1))))
(t (setq Lng (+ Lng (distance Pct (setq Pct (cdr (assoc 10 En1)))))
)
)
)
(setq Ent (entnext Ent))
)
(prompt ”\nLungime totala: ”)
(princ Lng)
(princ)
)
Prin liniile:
(setq Ent (car (entsel ”\nSelectati polilinia 3D:”))
Ent (entnext Ent)
)
cereþi selectarea entitãþii 3DPOLY (funcþia entsel) ºi apoi treceþi imediat
pe prima subentitate a acesteia (funcþia entnext). Într-adevãr, baza de date
a AutoCAD-ului conþine entitãþi principale ºi subentitãþi, iar funcþia ent-
Capitolul 4 125

next trece de la entitatea principalã la prima sa subentitate, apoi la a doua


º.a.m.d., pânã ce ajunge iar la o entitate principalã, iar procesul poate con-
tinua pânã la ultima entitate din desen. Dacã noi arãtãm în cunoºtinþã de
cauzã o polilinie, atunci ºtim cã ea are subentitãþi pe care dorim sã le
explorãm. În acest scop lansãm ciclul:
while (= (cdr (assoc 0 (setq En1 (entget Ent)))) ”VERTEX”)

- construcþia (assoc nr entitate), unde nr este un cod de grup (vezi


Aici meritã sã semnalãm câteva amãnunte:

anexa D) iar entitate este lista de date de definiþie a unei entitãþi


(pe scurt, lista entitãþii, dacã n-aveþi nimic împotrivã...), permite

- funcþia entsel returneazã o listã cu douã subliste: numele entitãþii ºi


identificarea diferitelor caracteristici ale unei entitãþi

- funcþia entget cere un nume de entitate ºi returneazã lista entitãþii


punctul de selecþie în aceastã ordine

Ca sã fie mai clar vã fac o schemã, iar alãturi vã pun un posibil dialog (dupã
ce aþi desenat o linie pe ecran):

Command: (setq eee (entlast))


entsel
entlast
<Entity name: 60000018>
Command: !eee
<Entity name: 60000018>

Ent
Command: (entget eee)
((-1 . <Entity name: 60000018>) (0 .
”LINE”) (8 . ”0”) (10 93.0 106.0 0.0) (11
Stânga listei: Dreapta listei: 300.0 199.0 0.0) (210 0.0 0.0 1.0))

(car Ent) (cdr Ent)


Numele entitãþii Punct de selecþie Command: (setq fff (entsel))
Select object: Selectaþi linia
(<Entity name: 60000018> (139.0 126.0

Ex: <Entity name: 60000018> Ex: ((139.0 126.0 0.0))


0.0))
Command: !fff
(<Entity name: 60000018> (139.0 126.0
0.0))

entget
Command: (car fff)
<Entity name: 60000018>
Command: (cdr fff)
((139.0 126.0 0.0))

Ex: ((-1 . <Entity name: 60000018>) (0


Command: (entget (car fff))

. “LINE”) (8 . “0”) (10 93.0 106.0 0.0)


((-1 . <Entity name: 60000018>) (0 .

entitãþii (11 300.0 199.0 0.0) (210 0.0 0.0 1.0))


Lista ”LINE”) (8 . ”0”) (10 93.0 106.0 0.0) (11
300.0 199.0 0.0) (210 0.0 0.0 1.0))
126 Mijloace avansate de programare

Cine are ochi de vãzut îºi dã seama ce este aici. Funcþia entlast dã direct
numele entitãþii, pe când entsel mai adaugã ºi punctul în care s-a fãcut

funcþia entget aplicatã pe acesta ne dã lista entitãþii. Jucaþi-vã un pic cu


selecþia entitãþii. În schimb, odatã izolat ºi clarificat numele entitãþii,

se mai pune ºi punctul de selecþie dacã folosim entsel? De ce nu ni se dã


aceste treburi, fiindcã trebuie musai sã le stãpâniþi! O sã ziceþi: da, de ce ni

doar numele entitãþii? Rãspunsul este: ca sã aveþi la dispoziþie ºi Dvs. exact


mijloacele AutoCAD-ului, de asta! Dacã vã amintiþi cum lucreazã coman-
da BREAK, sau cotarea cu DIA, vã daþi seama cã acolo este folosit ºi punc-
tul în care se face selecþia entitãþii, or asta este de mare ajutor, nu?
De notat cã numele entitãþii este atribuit automat ºi este unic pentru o
sesiune datã cu editorul de desen (vezi ºi notele de la secþiunea 4.5.1). Deci,

totuºi, doriþi sã contaþi pe aceastã valoare, atunci folosiþi funcþia handent


nu contaþi pe valoarea respectivã, ci numai pe faptul cã ea este unicã. Dacã,

de funcþiile entlast, entsel ºi entget, iar noi sã revenim la exemplul ante-


(vezi capitolul 5). Eu vã invit sã reþineþi poziþiile ocupate în aceastã schemã

rior. Acum devin clare liniile:


(setq Ent (car (entsel ”\nSelectati polilinia 3D:”))
Ent (entnext Ent)
)
Cum entsel creeazã o listã de liste, cu funcþia car preluãm partea ei stângã
(deci numele entitãþii), iar apoi aplicãm entnext pe acel nume.
Mai departe, linia:
while (= (cdr (assoc 0 (setq En1 (entget Ent)))) ”VERTEX”)
preia subentitatea Ent ca nume de entitate ºi-i aplicã entget pentru a-i
obþine lista de entitate, listã pe care o pune în variabila En1. Apoi alege aso-

cut (0 . ”tip”). Elementul din dreapta al perechii cu punct este tipul


ciativul lui 0 din aceastã listã: se obþine o pereche cu punct de genul cunos-

„VERTEX”. Dacã sunt identice, atunci subentitatea En1 este într-adevãr


entitãþii (vezi anexa D). Tipul astfel gãsit al entitãþii este comparat cu ºirul

un vertex ºi se executã corpul ciclului while adicã:


(cond
((null Pct) (setq Pct (cdr (assoc 10 En1))))
(t (setq Lng (+ Lng (distance Pct (setq Pct (cdr (assoc 10 En1)))))
Capitolul 4 127

)
)
)
(setq Ent (entnext Ent))
Aici desfãºurarea este controlatã de funcþia cond astfel: dacã nu este
definitã variabila Pct (sau are valoarea nil), atunci ea este creatã, atribuin-

primului segment al poliliniei 3D. Dacã variabila Pct este definitã, atunci
du-i-se ca valoare lista punctului vertex, adicã a punctului de început al

(null Pct) nu va mai fi nil, deci se va executa cealaltã ramurã a lui cond.
Aceasta mãsoarã distanþa de la Pct-ul curent la Pct-ul noului vertex (fãcând
totodatã ca lui Pct sã i se atribuie valoarea de punct a noului vertex). Prin
aceastã manevrã nu a mai fost creatã o nouã variabilã Pct1, cum ar fi în:
(setq Pct1 (cdr (assoc 10 En1))
Lng (+ Lng (distance Pct Pct1))
Pct Pct1
)
Totuºi, ceea ce se urmãreºte este cumularea în variabila Lng a distanþelor
dintre vertex-uri, fapt care are loc dacã vã uitaþi la începutul liniei de pro-
gram originale (sau al liniei a doua datã mai sus). Dupã ce se încheie ciclul
- adicã atunci când asociativul lui 0 nu mai conþine numele „VERTEX” -
este afiºatã lungimea totalã. Pot sã vã pun o întrebare? Ce conþine în acest

iese cereþi (cdr (assoc 0 En1)) ºi veþi afla rãspunsul (dar numai dupã ce aþi
ultim moment asociativul lui 0? Dacã nu ºtiþi, rulaþi programul, iar când

mascat variabila localã En1 - vezi secþiunea 2.9).


O funcþie importantã este entmake (introdusã odatã cu versiunea 11 de
AutoCAD). Ea vã permite sã creaþi direct o entitate, cum ar fi, de exemplu,
un cerc roºu cu centrul în (50,50) ºi raza 25:
(entmake
‘((0 . ”CIRCLE”) ;tip entitate
(62 . 1) ;culoare
(10 50.0 50.0) ;centru
(40 . 25.0) ;raza
)
)
128 Mijloace avansate de programare

avantajul faþã de a folosi funcþia command este cã entitatea va fi creatã


Condiþia este sã cunoaºteþi lista de definiþie a entitãþii (vezi anexa D), iar

mai rapid, fiind introdusã direct în baza de date a AutoCAD-ului ºi nu prin


apelarea ºi transmiterea de date între AutoLISP ºi AutoCAD. Ca sã vã
lãmuriþi, puneþi liniile de mai sus într-un mic ciclu repeat cu 500 de iteraþii
(la care schimbaþi raza) ºi faceþi acelaºi lucru adresându-vã AutoCAD-ului,
ca în programul MAKE-CMP.LSP:
(defun C:CER-MAKE()
(setq raza 25.0)
(repeat 500
(entmake
(list ‘(0 . ”CIRCLE”) ;tip entitate
‘(62 . 1) ;culoare
‘(10 50.0 50.0) ;centru
(cons 40 raza) ;raza
)
)
(setq raza (1+ raza))
)
)
(defun C:CER-ACAD()
(setvar ”CMDECHO” 0)
(setq raza 25.0)
(repeat 500
(command ”CIRCLE” ”60,60” raza)
(setq raza (1+ raza))
)
)
Rulaþi succesiv funcþiile cer-acad ºi cer-make, consultându-vã crono-
metrul pentru fiecare dintre ele.

cu funcþia subst asupra listei de definiþie a entitãþii în cauzã - atunci tre-


Dacã faceþi doar modificarea unor caracteristici ale unei entitãþi - umblând

buie sã folosiþi funcþia entmod pentru a actualiza baza de date a


AutoCAD-ului. Aveþi un exemplu în acest sens la funcþia entmod în capi-
Capitolul 4 129

tolul 5. Ceea ce trebuie sã mai aveþi în vedere este faptul cã schimbarea se

vedea schimbarea ºi pe ecran folosiþi funcþia entupd (vezi capitolul 5).


produce doar în baza de date a AutoCAD-ului, nu ºi pe ecran. Pentru a

Funcþia entdel are efect reversibil. Astfel, dacã aþi creat entitatea eee, o
puteþi ºterge cu (entdel eee), iar dacã ulterior puneþi un alt apel
(entdel eee) atunci entitatea eee va fi refãcutã în baza de date a
AutoCAD-ului. Singura condiþie este ca al doilea entdel sã fie folosit în
aceeaºi sesiune AutoCAD, altfel entitatea este definitiv pierdutã.

4.5.4 Restricþii
Aºa cum am mai spus, numele de entitãþi ºi mulþimile de selecþie sunt
valide numai pentru sesiunea cu editorul de desene în care au fost obþinute

se desfãºoarã o comandã PLINE sau ATTEDIT, va fi returnat nil, iar


din AutoCAD. De asemenea, dacã încercaþi urmãtoarele operaþii în timp ce

funcþia încercatã nu va fi executatã:


entmod - pentru modificarea unei entitãþi existente
entupd - pentru regenerarea unei entitãþi complexe modificate
entdel - pentru recuperarea ºi regenerarea unei entitãþi ºterse
4.5.5 Utilizarea numelor de entitãþi ºi a mulþimilor de selecþie
Numele de entitãþi ºi mulþimile de selecþie sunt intrãri valide pe
prompterul AutoCAD de selecþie de obiecte. Astfel, entitãþile numite prin

„Select objects:” AutoLISP poate furniza un nume de entitate care


AutoLISP pot fi prelucrate prin comenzile AutoCAD. Pe prompterul

desemneazã o singurã entitate, sau o mulþime de selecþie care selecteazã


toate entitãþile din mulþime. Furnizarea numelor de entitãþi sau a mulþi-
milor de selecþie din AutoLISP este validã ori de câte ori este valid rãspun-
sul „Last” pentru selecþie în AutoCAD (ambele permit indicarea de entitãþi
în ceea ce priveºte vizibilitatea acestora ºi nici una nu specificã un punct
anume de indicare).

asociat selecþiei, sunt acceptate listele în forma returnatã de entsel. Ele


Ori de câte ori AutoCAD cere selecþia prin indicarea unui punct anume,

selecteazã entitãþile din listã, specificând punctul din listã ca punct asociat
selecþiei („pick point”). Asta permite lui AutoLISP transferul acestor
130 Mijloace avansate de programare

EXTEND. Listele tip entsel pot fi folosite tot aºa de bine ºi pentru alte
puncte unor comenzi ca BREAK, FILLET, CHAMFER, TRIM ºi

selecþii, în mãsura în care indicarea unui punct anume este permisã de


comandã.

4.5.6 Note privind prelucrãrile Curve-fit ºi Spline-fit


la polilinii
Când folosiþi entnext pentru a trece de la un vertex la altul într-o polilinie,
puteþi întâlni un numãr de vertex-uri pe care nu le-aþi creat explicit.
Vertex-urile auxiliare sunt inserate automat prin opþiunile „Fit” ºi „Spline”
ale lui PEDIT ºi le puteþi ignora, deoarece schimbãrile fãcute asupra aces-
tor vertex-uri vor fi automat descãrcate urmãtoarea datã când veþi folosi
PEDIT prin opþiunile „Fit” sau „Spline” asupra aceleiaºi polilinii.
Puteþi afla din indicatorii codului de grup 70 al entitãþii polilinie dacã ea a
fost potrivitã pe curbã („curve-fit”) sau pe o funcþie spline („spline-fit”),
dupã valorile lor pe biþi 2 ºi, respectiv, 4.

AutoLISP în genul (entget e2), unde e2 este un vertex), veþi întâlni o


Practic, cercetând lista poliliniei (folosind pentru asta o simplã linie

sublistã de genul „(70 . 2)” sau „(70 . 4)”. Valorile 2 ºi 4 dacã sunt consi-
derate ca valori ale unui octet, de exemplu, pot fi interpretate ca simple
setãri ale câte unui singur bit: bitul 1 (de la dreapta la stânga, socotind cã
primul din dreapta are numãrul de ordine zero) pentru valoarea 2, respec-
tiv bitul 2 pentru valoarea 4, deoarece 21=2 ºi 22=4. Tot aºa, valoarea 16, de
exemplu, semnificã setarea bitului 4, etc. Ceea ce este important, este cã se
seteazã un singur bit, deci se poate vorbi de un sistem de indicatori (flags).
Dacã nici unul din aceºti biþi nu este setat (deci valoarea este zero), atunci
toate vertex-urile poliliniei sunt normale. Dacã, însã, bitul „curve-fit” este
setat (adicã valoarea este 2), atunci vertex-urile din polilinie vor avea bitul

rate prin procesul de potrivire a curbei. Dacã folosiþi entmod pentru a


1 setat în indicatorul lor de grup 70 pentru a arãta faptul cã ele au fost inse-

muta vertex-urile unei astfel de polilinii cu intenþia de a repotrivi-o pe o


curbã folosind PEDIT, veþi ignora probabil aceste vertex-uri.
De asemenea, dacã indicatorul de potrivire pe spline („spline-fit”) al
Capitolul 4 131

grupului 70 al entitãþii polilinie este setat (adicã valoarea sa este 4), veþi
gãsi un numãr de vertex-uri suplimentare, unele cu bitul indicator 1 (inse-
rate de potrivirea pe curbã dacã variabila de sistem SPLINESEGS a fost
negativã), altele cu valoarea indicatorului 8 (inserate de potrivirea pe

dacã folosiþi entmod pentru a muta vertex-urile ºi intenþionaþi sã repotri-


spline) ºi toate celelalte cu valoarea 16 (punct de control spline). Iarãºi,

viþi polilinia pe spline dupã aceea, veþi muta probabil doar vertex-urile
puncte de control.

4.5.7 Acces la ecranul grafic


Funcþiile AutoLISP grdraw, grread, grtext, grclear ºi grvecs asigurã
accesul direct la ecranul grafic, oferind comenzi implementate în AutoLISP
pentru interacþiunea cu utilizatorul ca ºi când ele ar fi implementate în
AutoCAD.
Aceste comenzi pot „mânji” ecranul. Totuºi, orice deranjament care survine
poate fi înlãturat prin secvenþa:
(grtext)
(redraw)
astfel cã nu trebuie sã ne preocupe. Aceste funcþii sunt oferite numai uti-
lizatorilor experimentaþi. Cele mai multe aplicaþii AutoLISP nu necesitã
folosirea acestor funcþii. Utilizatorii care îºi propun sã le foloseascã, totuºi,
sunt avertizaþi sã se aºtepte ca ele sã se modifice de la o versiune la alta de
AutoCAD, astfel cã nu se garanteazã viitoarele compatibilitãþi ale aplicaþi-

funcþiile grtext ºi grread pot sã nu funcþioneze identic pe orice configu-


ilor care folosesc aceste funcþii. De asemenea, aplicaþiile care folosesc

raþie hardware, dacã utilizatorii nu respectã exact condiþiile de folosire


explicate în capitolul 5 la fiecare dintre ele. Un program care face uz de ast-
fel de funcþii este CLOCK.LSP, care se livra odatã cu kit-ul de AutoCAD-
10, pe vremuri. Vi-l prezint aici, cu comentariile traduse. Am îngroºat pe
parcursul programului funcþiile menþionate. Ca sã puteþi urmãri mai bine
programul, introduceþi textul sursã, încãrcaþi-l ºi rulaþi-l.
; Program Clock.Lsp
; Actualizeaza afisarea limbilor orara si minutara
(defun hrmn ()
132 Mijloace avansate de programare

(setq hour (* 100. (- time (fix time)))) ;citeste ora


(setq minute (* 100. (- hour (fix hour)))) ;citeste minutul
(setq angle (- tp5pi (* mnfac minute)))
(setq mnmid (polar center angle mnhl))
(setq mnv2 (subst (cons ‘10 mnmid) (assoc ‘10 mnv2) mnv2))
(setq mnend (polar center angle mnlen))
(setq mnv3 (subst (cons ‘10 mnend) (assoc ‘10 mnv3) mnv3))
(setq hour (if (> hour 13.) (- hour 12.) hour))
(setq angle (- tp5pi (* hrfac hour)))
(setq hrend (polar center angle hrlen))
(setq hrmid (polar center angle hrhl))
(setq hrv2 (subst (cons ‘10 hrmid) (assoc ‘10 hrv2) hrv2))
(setq hrv3 (subst (cons ‘10 hrend) (assoc ‘10 hrv3) hrv3))
(entmod mnv2)
(entmod mnv3)
(entmod hrv2)
(entmod hrv3)
(entupd hrhand)
(entupd mnhand)
(setq timer (strcat (itoa (fix hour)) ”:”
(itoa (fix minute)) ”:”))
)
; Actualizeaza afisarea limbii secundarului
(defun sec ()
(setq second (fix minute))
(setq end3 (polar center (- tp5pi (* mnfac second)) sclen))
(grdraw center start -1) ;sterge limba secundar veche
(setq start end3)
(if (> old second) (hrmn)) ;minut nou?
(grdraw center end3 -1) ;deseneaza-l
(grtext -2 (strcat timer (itoa second))) ;act. afisare digitala
(setq old second)
)
; Ciclu care face ceasul sa ”umble”
(defun go()
Capitolul 4 133

(repeat 32000
(setq time (getvar ”CDATE”)) ;citeste data&ora
(setq hour (* 10000. (- time (fix time)))) ;citeste hhmm.ss
(setq minute (* 100. (- hour (fix hour)))) ;acum ss.mil
(if (/= (fix minute) (fix second)) (sec))
)
)
(defun c:run()
(command ”regen”)
(grdraw center start -1)
(setq old 60)
(terpri)
(prompt ”Comanda CLOCK via AutoLISP”)
(terpri)
(go)
)
(defun rtd (a)
(* (/ a twopi) 360.)
)
; Curata ecranul, deseneaza cadran & seteaza factorii
(defun c:clock ()
(expand 100)
(setvar ”HIGHLIGHT” 0)
(setvar ”BLIPMODE” 0)
(setvar ”GRIDMODE” 0)
(setvar ”FILLMODE” 1)
(setq twopi (* 2. pi))
(setq tp5pi (* 2.5 pi))
(setq hrfac (/ (* 2. pi) 12.))
(setq mnfac (/ (* 2. pi) 60.))
(setq center (getvar ”VIEWCTR”))
(setq radius (* 0.45 (getvar ”VIEWSIZE”)))
(setq hrwid (* 0.04 radius))
(setq mnwid (* 0.02 radius))
(setq old 60)
134 Mijloace avansate de programare

(setq second 60)


(setq start (list (car center) (+ (cadr center) (* 0.9 radius))))
(command ”ERASE” ”W” (getvar ”LIMMAX”) (getvar ”LIMMIN”) ””)
(grclear)
(command ”CIRCLE” center radius)
(command ”TRACE” hrwid start (list (car center) (+ (cadr center) radius)) ””)
(command ”ARRAY” start ”” ”Polar” center 12 360 ”Yes”)
(setq sclen (* 0.8 radius))
(setq mnlen (* 0.8 sclen))
(setq mnhl (* 0.75 mnlen))
(setq hrlen (* 0.8 mnlen))
(setq hrhl (* 0.75 hrlen))
(setq hrend (list (car center) (+ (cadr center) hrlen)))
(setq hrmid (list (car center) (+ (cadr center) hrhl)))
(setq mnend (list (+ (car center) mnlen) (cadr center)))
(setq mnmid (list (+ (car center) mnhl) (cadr center)))
(command ”PLINE” center ”WIDTH” 0. hrwid hrmid ”WIDTH” hrwid 0. hrend ””)
(setq hrhand (entlast))
(setq hrv2 (entget hrhand))
(setq hrv2 (entget (entnext (entnext hrhand))))
(setq hrv3 (entget (entnext (cdr (assoc ‘-1 hrv2)))))
(command ”PLINE” center ”WIDTH” 0. mnwid mnmid ”WIDTH” mnwid 0. mnend ””)
(setq mnhand (entlast))
(setq mnv2 (entget mnhand))
(setq mnv2 (entget (entnext (entnext mnhand))))
(setq mnv3 (entget (entnext (cdr (assoc ‘-1 mnv2)))))
(grdraw center start -1)
(terpri)
(prompt ”CLOCK command via AutoLISP”)
(terpri)
(go)
) 
Funcþii AutoLISP
5
Chiar dacã în capitolele anterioare s-au fãcut unele dezvãluiri, în capitolul
de faþã sunt prezentate sec ºi profesional toate funcþiile AutoLISP,
incluzând referinþe la implicaþiile pe care acestea le au asupra sistemului
AutoCAD ºi a sistemului de calcul, în general.
O serie de funcþii sunt conþinute ºi în limbajul LISP standard, iar altele
sunt specifice dialectului AutoLISP. În prezentarea care urmeazã toate
sunt puse la rând, criteriul alfabetic oferind cea mai comodã cale de identi-
ficare a unei funcþii cãutate de utilizator.
Titlurile exprimã succint datele principale:
denumire - numele funcþiei
sintaxã - sintaxa care trebuie folositã (în [ ] sunt puse elementele

Release NN
opþionale)
- versiunea de AutoCAD de la care funcþia a fost disponi-
bilã (cuprinsã între Release-10 ºi Release-13)
Efect - o frazã explicativã privind efectul aplicãrii funcþiei
Ca poziþie, aceste componente sunt organizate aºa:
Aºadar, pentru funcþiile apãrute odatã cu versiunea 10 sau mai înaintea ei,
în cele ce urmeazã va fi menþionatã Release-10.

Release NN denumire
sintaxã
Efectul aplicãrii funcþiei
136 Funcþii AutoLISP

Release 10 + (adunare)
(+ <numãr> <numãr>...)
Returneazã suma argumentelor
Aceastã funcþie returneazã suma tuturor argumentelor <numãr>. Ea poate
fi folositã cu reali sau întregi. Dacã toate argumentele sunt întregi, rezul-
tatul va fi întreg; dacã oricare dintre argumente este real, atunci întregii vor

(+ 1 2)
fi avansaþi la reali iar rezultatul va fi real. De exemplu:

(+ 1 2 3 4.5)
returneazã 3

(+ 1 2 3 4.0)
returneazã 10.5
returneazã 10.0
De reþinut termenul „avansare la reali“ sau numai „avansare“ (engl. „pro-
motion“), deoarece va mai fi folosit. De avut mereu în vedere spaþiile (blan-
curile). Una este „(+ 3 ...“ ºi alta „(+3 ...“, aceasta din urmã conducând la
eroare (dacã n-aþi definit Dvs., cumva, funcþia „+3“!).

Release 10 - (scãdere)
(- <numãr> <numãr>...)
Returneazã diferenþa dintre primul argument ºi urmãtorul/urmãtoarele
Aceastã funcþie scade al doilea argument din primul ºi returneazã dife-
renþa. Dacã sunt date mai mult de douã argumente, atunci suma dintre al
doilea pânã la ultimul este scãzutã din primul ºi se returneazã rezultatul
final. Dacã se dã doar un singur argument, atunci se returneazã rezultatul
scãderii lui din zero. Aceastã funcþie poate fi folositã cu reali sau întregi,

(- 45 40)
respectându-se regula standard a avansãrii descrisã mai sus. De exemplu:

(- 45 40.0 2)
returneazã 5

(- 45 40.0 2.5)
returneazã 3.0

(- 16)
returneazã 2.5
returneazã -16
Capitolul 5 137

Release 10 * (înmulþire)
(* <numãr> <numãr>...)
Returneazã produsul argumentelor
Aceastã funcþie returneazã produsul tuturor argumentelor. Poate fi folositã

(* 2 3)
cu reale sau întregi, cu regula standard a avansãrii. De exemplu:

(* 2 3 4.0) returneazã 24.0


returneazã 6

(* -7 1.5) returneazã -10.5

Release 10 / (împãrþire)
(/ <numãr> <numãr>...)
Returneazã rezultatul împãrþirii primului argument la urmãtorul/urmãtoarele
Aceastã funcþie împarte primul argument prin al doilea ºi returneazã câtul.
Dacã se dau mai mult de douã argumente, atunci primul este împãrþit la
produsul dintre al doilea ºi urmãtoarele, pânã la ultimul, returnându-se
câtul final. Aceastã funcþie poate fi folositã cu reali sau întregi, respectân-

(/ 100 2)
du-se regula standard a avansãrii. Iatã exemple:

(/ 100 2.0)
returneazã 50

(/ 100 20.0 2)
returneazã 50.0

(/ 100 20 2)
returneazã 2.5

(/ 135 360)
returneazã 2

(/ 135 360.0)
returneazã 0
returneazã 0.375
De notat cã puteþi avea surprize atunci când împãrþiþi douã numere între-
gi (uitaþi-vã cu atenþie la ultimele douã exemple). Ca sã fiþi siguri/sigure
(atunci când nu doriþi un rezultat întreg obþinut prin trunchiere) puneþi un
punct zecimal (urmat musai de un zero) la unul dintre argumente. Asta va
face ca rezultatul sã fie avansat la real.
138 Funcþii AutoLISP

Release 10 = (egal cu)


(= <num_ºir> <num_ºir>...)
Returneazã T dacã argumentele sunt egale ºi nil altfel
Aceasta este funcþia relaþionalã „egal cu“. Ea returneazã T (True) dacã toate
argumentele sunt numeric egale ºi nil în caz contrar. Aceastã funcþie este

(= 14 14.0)
valabilã atât pentru numere cât ºi pentru ºiruri. Iatã exemple:

(= 123 321)
returneazã T

(= 0.4 0.4 0.4)


returneazã nil

(= 49 49 50)
returneazã T

(= ”HCF” ”HCF”)
returneazã nil

(= ”HCF” ”HCF ”)
returneazã T

(= ”HCF” ”COS”)
returneazã nil
returneazã nil

Release 10 /= (neegal cu)


(/= <num_ºir1> <num_ºir2>)
Returneazã T dacã argumentele nu sunt egale ºi nil altfel
Aceasta este funcþia relaþionalã „neegal cu“. Ea returneazã T dacã
<num_ºir1> nu este numeric egal cu <num_ºir2> ºi nil dacã cele douã
argumente sunt numeric egale. Funcþia este nedefinitã dacã se dau mai
mult de douã argumente.

(/= 10 20)
De exemplu:

(/= ”HCF” ”HCF”)


returneazã T

(/= 0.01 0.02)


returneazã nil
returneazã T
Capitolul 5 139

Release 10 < (mai mic decât)


(< <num_ºir> <num_ºir>...)
Returneazã T dacã fiecare argument e mai mic decât cel din dreapta lui, nil altfel
Aceasta este funcþia relaþionalã „mai mic decât“. Ea returneazã T dacã
primul argument este numeric mai mic decât al doilea ºi nil altfel. Dacã se
dau mai mult de douã argumente, se returneazã T dacã fiecare argument
este mai mic decât argumentul din dreapta sa (deci dacã ºirul de valori este

(< 10 20)
strict crescãtor). De exemplu:

(< ”A” ”B”) returneazã T


returneazã T

(< 11 1.1)
(< 1 8 99)
returneazã nil

(< 1 2 2 3) returneazã nil


returneazã T

Release 10 <= (mai mic sau egal cu)


(<= <num_ºir> <num_ºir>...)
Returneazã T dacã fiecare argument e mai mic sau egal cu urmãtorul, nil altfel
Aceasta este funcþia relaþionalã „mai mic sau egal cu“. Ea returneazã T dacã
primul argument este numeric mai mic sau egal cu al doilea ºi nil altfel.
Dacã se dau mai mult de douã argumente, se returneazã T dacã fiecare
argument este mai mic sau egal cu argumentul din dreapta sa (deci dacã

(<= 10 20)
ºirul de valori este crescãtor sau staþionar, sau amestecat). De exemplu:

(<= ”M” ”M”)


returneazã T (crescãtor)

(<= 22 5.4)
returneazã T (staþionar)

(<= 12 93 93 99) returneazã T (amestecat = crescãtor + staþionar)


returneazã nil

(<= 12 93 17.5) returneazã nil


140 Funcþii AutoLISP

Release 10 > (mai mare decât)


(> <num_ºir> <num_ºir>...)
Returneazã T dacã fiecare argument este mai mare decât urmãtorul, nil altfel
Aceasta este funcþia relaþionalã ”mai mare decât”. Ea returneazã T dacã
primul argument este numeric mai mare decât al doilea ºi nil altfel. Dacã
se dau mai mult de douã argumente , se returneazã T dacã fiecare argument
este mai mare decât argumentul din dreapta sa (deci dacã ºirul de valori

(> 112 23)


este strict descrescãtor). De exemplu:

(> ”z” ”a”)


returneazã T

(> 1.3 192)


returneazã T

(> 11 2 1)
returneazã nil

(> 33 14 14)
returneazã T
returneazã nil

Release 10 >= (mai mare sau egal)


(>= <num_ºir> <num_ºir>...)
Returneazã T dacã fiecare argument e mai mare sau egal cu urmãtorul, nil altfel
Aceasta este funcþia relaþionalã ”mai mare sau egal cu”. Ea returneazã T
dacã primul argument este numeric mai mare sau egal cu al doilea ºi nil alt-
fel. Dacã se dau mai mult de douã argumente, se returneazã T dacã fiecare

descrescãtor, staþionar sau amestecat - vezi funcþia <=). De exemplu:


argument este mai mare sau egal cu argumentul din dreapta sa (deci ºir

(>= 112 23)


(>= ”a” ”a”)
returneazã T (descrescãtor)

(>= 11.3 1234)


returneazã T (staþionar)

(>= 717 14 14 0.1)


returneazã nil

(>= 717 14 19)


returneazã T (amestecat)
returneazã nil
Capitolul 5 141

Release 10 ~ (NU la nivel de bit)


(~ <int>)
Returneazã NU la nivel de bit (complementul de 1) al argumentului
Aceastã funcþie returneazã NU la nivel de bit (complement de unu) al lui

(~ 3)
<int>, unde <int> trebuie sã fie un numãr întreg. De exemplu:

(~ 100)
returneazã 4

(~ 4)
returneazã 101
returneazã 3
Sunt necesare unele precizãri:
Semnul ”~” se citeºte ”tildã” ºi are valoarea 126 în codul ASCII (vezi anexa
B). Pe de altã parte, ”complement de unu” înseamnã cã cei 16 biþi ai între-
gului care ocupã aceºti biþi (dacã întregii sunt dimensionaþi pe doi octeþi)
vor fi pur ºi simplu inversaþi: cei care sunt 0 devin 1 ºi viceversa. Astfel, 310
este 00000000_000000112, deci devine 11111111_111111002 prin negare.
Primul 1 din stânga este bitul de semn, indicând semn negativ (0 este +),
iar ansamblul exprimã, într-adevãr, valoarea 4 în complement de 1.

(~ 0) returneazã 1 ºi viceversa
Încã un exemplu interesant:

Release 10 1+ (incrementare)
(1+ <numãr>)
Returneazã argumentul majorat (incrementat) cu 1
Aceastã funcþie returneazã <numãr> incrementat (majorat) cu 1. Aici,

(1+ 7)
<numãr> poate fi real sau întreg. De exemplu:

(1+ -14.2)
returneazã 8
returneazã -13.2
Observaþi alãturarea lui 1 cu +. Deci numele funcþiei este ”1+”, ºi nu ”1 +”.
142 Funcþii AutoLISP

Release 10 1- (decrementare)
(1- <numãr>)
Returneazã argumentul micºorat (decrementat) cu 1
Aceastã funcþie returneazã <numãr> decrementat (micºorat) cu 1.

(1- 75)
Argumentul <numãr> poate fi real sau întreg. De exemplu:

(1- -15.2)
returneazã 74
returneazã -16.2
Observaþi alãturarea lui 1 cu -. Deci numele funcþiei este ”1-”, ºi nu ”1 -”.

Release 10 abs
(abs <numãr>)
Returneazã valoarea absolutã a argumentului
Aceastã funcþie returneazã valoarea absolutã a <numãr>ului. Aici,

(abs -100)
<numãr> poate fi real sau întreg. De exemplu:

(abs 100)
returneazã 100

(abs -99.25)
returneazã 100
returneazã 99.25

Release 12 acad_colordg
(acad_colordg <nr_culoare> [<flag>])
Afiºeazã caseta standard de dialog AutoCAD pentru selectarea culorii
Argumentul <nr_culoare> trebuie sã fie un întreg cu valoarea cuprinsã
între 0..256 (inclusiv). Ea dã numãrul culorii AutoCAD care sã fie afiºatã
ca valoare implicitã iniþialã. Valoarea 0 conduce la setare implicitã
BYBLOCK, iar valoarea 256 la BYLAYER. Argumentul opþional <flag>
setat pe nil dezactiveazã butoanele BYBLOCK ºi BYLAYER. Omiterea
argumentului <flag> sau setarea lui pe o valoare non-nil activeazã
Capitolul 5 143

butoanele BYBLOCK ºi BYLAYER. Funcþia acad_colordlg returneazã


numãrul corespunzãtor culorii selectate de utilizator în caseta ce apare prin

(acad_colordlg 2) aºteaptã utilizatorul sã selecteze o culoare,


acest apel. De exemplu,

propunând galben drept culoare implicitã

Release 12 acad_helpdlg
(acad_helpdlg <fis_help> <topicã>)
Invocã facilitatea de HELP
Aceastã funcþie externã a fost înlocuitã prin funcþia internã help. Ea este

funcþia help pentru descriere completã.


menþinutã doar pentru compatibilitate cu versiunile anterioare. Vezi

Release 12 acad_strlsort
(acad_strlsort <listã>)
Sorteazã o listã de ºiruri de caractere în ordine alfabeticã
Argumentul <listã> este lista de ºiruri de sortat. Funcþia acad_strlsort
returneazã o listã a aceloraºi ºiruri ordonate alfabetic. Dacã argumentul

returna nil. De exemplu:


listã este invalid sau nu este memorie suficientã pentru sortare, funcþia va

(setq nume ‘(”Gigel” ”Nae” ”Anghel” ”Fane”))


(acad_strlsort nume)
returneazã lista <nume> ordonatã alfabetic:
(”Anghel” ”Fane” ”Gigel” ”Nae”)

Release 12 action_tile
(action_tile <cheie> <expr_act>)
Atribuie o acþiune de evaluare la selectarea de cãtre utilizator a zonei în casetã
144 Funcþii AutoLISP

Este vorba de zone (”tiles”) ale casetelor tipice de dialog introduse odatã cu
AutoCAD Release-12. Argumentele <cheie> ºi <expr_act> sunt ºiruri de
caractere. Argumentul <cheie> este numele zonei (”dalei”) folositã pentru
declanºarea acþiunii (acþiune numitã atribut al <cheii>). Argumentul
<cheie> este sensibil în privinþa tipului de literã (micã, MAJUSCULţ).

siei <expr_act>. Acþiunea atribuitã de action_tile forþeazã acþiunea


La selectarea zonei este executatã acþiunea specificatã prin evaluarea expre-

implicitã a casetei de dialog (atribuitã prin new_dialog) sau atributul


action al zonei, dacã acestea au fost specificate. Expresia se poate referi la
valoarea curentã a zonei (atributul sãu valoare) ca $valoare, numele sãu
ca $key, datele sale specifice aplicaþiei (setate prin client_data_tile) ca
$data, motivul sãu de apel ca $reason ºi coordonatele sale de imagine
(dacã zona este un buton imagine) ca $x ºi $y.

Release 12 add_list
(add_list <ºir>)
Adaugã sau modificã un ºir de caractere în lista casetei de dialog curent active
Înainte de utilizarea funcþiei add_list trebuie sã deschideþi lista ºi s-o
iniþializaþi printr-un apel al funcþiei start_list. Funcþie de operaþia specifi-
catã în start_list, argumentul <ºir> este fie adãugat la lista curentã, fie

activ are o popup_list sau list_box cu cheie longlist, urmãtorul fragment


înlocuieºte articolul curent de listã. Presupunând cã fiºierul DCL curent

de cod iniþializeazã lista ºi-i adaugã ºirurile de text din llist.


(setq llist ‘(”prima linie” ”a doua linie” ”a treia linie”))
(start_list ”longlist”)
(mapcar ‘add_list llist)
(end_list)
Dupã ce lista a fost definitã, urmãtorul fragment de cod schimbã textul din
a doua linie în ”2nd line”.
(start_list ”longlist” 1 0)
(add_list ”2nd line”)
(end_list)
Capitolul 5 145

Release 11 ads
(ads)
Returneazã o listã a aplicaþiilor ADS curent încãrcate
Fiecare aplicaþie ºi calea ei (”path”-ul) este un ºir pus între ghilimele în

(ads) poate returna (”C:\proiect\martie\prg1” ”prg2”)


listã. De exemplu:

Release 12 alert
(alert <ºir>)
Afiºeazã o casetã de alertã cu un mesaj de eroare sau avertiment transmis ca ºir
O casetã de alertã este o casetã de dialog cu un singur buton OK. De exem-
plu:
(alert ”Functie inexistenta”)
Puteþi pune mai multe linii folosind caracterul ”linie nouã” (\n) în argu-
mentul <ºir>:
(alert ”Functie inexistenta\nIncercati prin functia XXX”)
NOTA:
Lungimea liniei ºi numãrul de linii într-o casetã de alertã sunt
dependente de platformã, periferic ºi fereastrã. AutoCAD trun-
chiazã orice ºir care este prea lung pentru a încãpea într-o casetã
de alertã.

Release 10 alloc
(alloc <int>)
Fixeazã mãrimea segmentului de memorie pe un numãr dat de noduri
Aceastã funcþie returneazã mãrimea segmentului de memorie anterior.
Explicaþii despre gestionarea memoriei sunt date în secþiunea 3.8.
146 Funcþii AutoLISP

Release 10 and
(and <expr>...)
Returneazã valoarea ªI (AND) logic a unei liste de expresii

înceteazã evaluarea ºi returneazã nil dacã o expresie este evaluatã ca nil,


Aceastã funcþie returneazã ªI (AND) logic al unei liste de expresii. Ea

altfel returneazã T. De exemplu, fie urmãtoarele atribuiri:


(setq a 103)
(setq b nil)
(setq c ”string”)

(and 1.4 a c)
atunci

(and 1.4 a b c)
returneazã T
returneazã nil
De remarcat cã, practic, ”nil” are rol de NU, iar orice altceva de DA.

Release 10 angle
(angle <pt1> <pt2>)
Returneazã unghiul în radiani al dreptei definite de punctele argument
Aceastã funcþie returneazã unghiul unei drepte ce uneºte punctul UCS
<pt1> cu punctul UCS <pt2>. Acest unghi este mãsurat în radiani în sens
trigonometric faþã de direcþia pozitivã a axei X a planului curent. Dacã se

(angle ‘(1.0 1.0) ‘(1.0 4.0))


dau puncte 3D, ele sunt proiectate pe planul curent de lucru. De exemplu:
returneazã 1.5708 (adicã π/2)
(angle ‘(5.0 1.33) ‘(2.4 1.33)) returneazã 3.14159 (adicã π)

nificaþia apostrofului (‘), vezi funcþia quote.


UCS înseamnã, dupã cum ºtiþi, ”User Coordinate System”. Pentru sem-
Capitolul 5 147

Release 12 angtof
(angtos <ºir> [<mod>])
Returneazã un unghi ca numãr real (în radiani) convertind argumentul ºir
Argumentul <ºir> descrie un unghi bazat pe pe formatul specificat de
argumentul <mod>. Acesta din urmã specificã unitãþile unghiulare în care
este dat argumentul <ºir>, astfel:
<mod> Format pentru <ºir>
0 Grade sexagesimale
1 Grade/minute/secunde
2 Grade centezimale
3 Radiani

Dacã <mod> lipseºte, atunci angtof foloseºte formatul specificat de va-


4 Unitãþi topografice

de forma pe care o returneazã angtos (vezi), sau o formã acceptatã de


loarea curentã a variabilei de sistem AUNITS. Argumentul <ºir> poate fi

AutoCAD de la tastaturã.
Funcþiile angtof ºi angtos sunt complementare: dacã transferaþi lui
angtof o valoare returnatã de angtos, acesta o acceptã în mod garantat, ºi
reciproc (presupunând cã argumentul <mod> este corect).
Dacã angtof reuºeºte sã facã conversia, returneazã o valoare realã în ra-
diani; dacã nu, returneazã nil.

Release 10 angtos
(angtos <unghi> [<mod>[<precizie>]])
Returneazã o valoare unghiularã datã în radiani convertitã într-un ºir
Aceastã funcþie preia <unghi> (un real, în radiani) ºi-l returneazã într-un
ºir, potrivit setãrii lui <mod> ºi <precizie> ºi variabilei de cotare
DIMZIN din AutoCAD. Aici, <mod> ºi <precizie> sunt întregi care
specificã unitãþile unghiulare ºi precizia.
148 Funcþii AutoLISP

Valori admise pentru <mod>:


<mod> Format de editare
0 Grade sexagesimale
1 Grade/minute/secunde
2 Grade centezimale
3 Radiani
4 Unitãþi topografice
Argumentul <precizie> este un întreg care indicã numãrul de cifre zeci-
male dorite. Argumentele <mod> ºi <precizie> corespund variabilelor
AUNITS ºi AUPREC din AutoCAD. Dacã sunt omise argumentele, vor fi
folosite setãrile curente ale variabilelor AUNITS ºi AUPREC, respectiv.
De exemplu, fie DIMZIN = 0 ºi urmãtoarele atribuiri:
(setq pt1 ‘(5.0 1.33))
(setq pt2 ‘(2.4 1.33))
(setq a (angle pt1 pt2))

(angtos a 0 0) returneazã ”180”


atunci:

(angtos a 0 4) returneazã ”180.0000”


(angtos a 1 4) returneazã ”180d0’0””
(angtos a 3 4) returneazã ”3.1416r”
(angtos a 4 2) returneazã ”W” (de la „West”, adicã „Vest”)
ANGTOS acceptã un argument <unghi> negativ, dar îl reduce totdeauna
la o valoare pozitivã între zero ºi 2π radiani înainte de a efectua conversia

(angtos 0.785398 0 4)
specificatã. De exemplu:

(angtos 0.785398 0 4)
returneazã ”45.0000”
returneazã ”315.0000”
”ANGTOS” provine din ”ANGle TO String”, adicã ”unghi în ºir”. Uneori,
în acelaºi spirit al prescurtãrilor, puteþi gãsi ”ang2s” deoarece 2 se scrie

funcþia atan.
”two” ºi se citeºte cam ca ”to”. Pentru clarificãri suplimentare, vedeþi
Capitolul 5 149

Release 10 append
(append <expr>...)
Returneazã lista obþinutã prin alãturarea listelor argument
Aceastã funcþie preia oricâte liste (<expr>) ºi returneazã o singurã listã

(append ‘(a b) ‘(c d))


prin compunerea lor în ordine. De exemplu:

(append ‘((a)(b)) ‘((c)(d)))


returneazã (A B C D)
returneazã ((A)(B)(C)(D))
Funcþia append impune ca argumentele sale sã fie liste.

Release 10 apply
(apply <funcþie> <listã>)
Transferã o listã de argumente unei funcþii specificate
Executã funcþia specificatã prin <funcþie> cu argumentele date de

(apply ‘+ ‘(1 2 3))


<listã>. De exemplu:

(apply ‘strcat ‘(”a” ”b” ”c”))


returneazã 6

Funcþia apply lucreazã numai cu funcþii înglobate (subrs) sau definite de


returneazã ”abc”

utilizator (cele create cu defun sau lambda).

Release 13 arx
(arx)
Returneazã o listã a aplicaþiilor ARX curent încãrcate
Fiecare aplicaþie împreunã cu calea sa sunt câte un ºir pus între ghilimele

(arx) poate sã returneze (”programe/BIBUNO” ”BIBDUE”)


într-o listã. De exemplu:
150 Funcþii AutoLISP

Release 13 arxload
(arxload <aplicatie> [<esec>])
Încarcã o aplicaþie ARX
Argumentul <aplicatie> este dat ca ºir între ghilimele sau ca variabilã care
conþine numele unui fiºier executabil. În timpul încãrcãrii fiºierului, aces-
ta este verificat sã fie o aplicaþie validã ARX.

AutoLISP. Totuºi, dacã este dat ºi argumentul <esec>, funcþia arxload va


Dacã operaþia de încãrcare eºueazã, în mod normal se produce o eroare

returna valoarea acestui argument ca mesaj de eroare, în locul mesajului


original.
Dacã încãrcarea aplicaþiei reuºeºte, se returneazã numele acesteia. De

(arxload ”programe/bibdue”)
exemplu, dacã încãrcarea reuºeºte, atunci:
returneazã ”programe/bibdue”

Release 13 arxunload
(arxunload <aplicatie> [<esec>])
Descarcã o aplicaþie ARX
Dacã descãrcarea aplicaþiei reuºeºte, atunci este returnat numele aplicaþiei,
altfel este returnat un mesaj de eroare.

numele exact al unei aplicaþii încãrcate cu funcþia arxload. Dacã la încãr-


Numele trebuie sã fie un ºir între ghilimele sau o variabilã conþinând

carea cu arxload a fost menþionatã ºi o cale, aceasta poate fi omisã la

catã cu arxload:
descãrcare. De exemplu, codul de mai jos descarcã aplicaþia b i b d u e încãr-

(arxunload ”bibdue”)

Dacã operaþia de descãrcare eºueazã, ca ºi la arxload se poate folosi argu-


ºi returneazã ”bibdue” dacã reuºeºte.

mentul <esec> pentru mesajul de eroare personalizat.


Capitolul 5 151

Release 10 ascii
(ascii <ºir>)
Returneazã codul ASCII al primului caracter dintr-un ºir
Aceastã funcþie returneazã codul ASCII al primului caracter din <ºir> (un

(ascii ”A”)
întreg). Aceasta este similarã funcþiei ASC din BASIC. De exemplu:

(ascii ”a”)
returneazã 65

(ascii ”BIC”)
returneazã 97
returneazã 66

Release 13 ase_docmp
(ase_docmp <cale_ob1> <cale_ob2> [<cod>])
Comparã pãrþile unor cãi de baze obiect
Argumentele <cale_ob1> ºi <cale_ob2> sunt ºiruri care dau cãile de com-

comparã. Vezi ase_dopathname pentru a obþine lista codurilor valide. În


parat. Argumentul <cod> este un cod întreg care aratã ce parte a cãii se

cazul când <cod> lipseºte, funcþia ase_docmp comparã întreaga cale (cod
6). Ea returneazã T dacã pãrþile sunt similare ºi nil altfel.

Release 13 ase_docurrent
(ase_docurrent)
Raporteazã setãrile curente ASE
Returneazã un ºir care dã setãrile curente ASE dacã reuºeºte, ºi nil dacã nu
este setatã nici o referinþã de obiect bazã de date, sau în caz de eroare.

Release 13 ase_dolist
(ase_dolist [<cale_ob> [<atr>]])
Regãseºte o listã a cãilor obiectelor baze de date
152 Funcþii AutoLISP

Argumentul <cale_ob> este un ºir care dã nivelul ierarhic al obiectului


bazã de date. Aceastã funcþie returneazã o listã a numelor obiect având

ambiental specificat, daþi ºirul ce conþine mediul (name.attr), care


nivel subordonat. Pentru a trimite o listã de cãi spre cataloage în cadrul

specificã valorile atribut ale obiectelor specificate. Lista de mediu (envi-


ronment) este returnatã dacã argumentul <cale_ob> este un ºir vid sau
lipseºte. Argumentul <atr> este un întreg care dã valorile de atribut ale
obiectelor returnate.
Val Descriere
1 Obiectul bazã de date este curent
2 Obiectul bazã de date este înregistrat
4 Obiectul bazã de date existã în baza de date SQL

Funcþia ase_dolist returneazã lista tuturor obiectelor baze de date, accesi-


8 Obiectul bazã de date aparþine mediului conectat

bile, înregistrate ºi inaccesibile. Sunt returnate toate cãile dacã nu este


specificat <atr>. În caz de reuºitã este returnatã lista de ºiruri; în caz cã
nici un obiect bazã de date subordonat nu se potriveºte cu masca <atr> (de
exemplu, dacã este datã referinþa de tabelã), sau dacã apare o eroare, se
returneazã nil.

Release 13 ase_dopathcode
(ase_dopathcode <cale_obj>)
Regãseºte codul de definiþie al unui obiect bazã de date pentru calea specificatã
Argumentul <cale_ob> este un ºir care dã nivelul ierarhic al obiectului
bazã de date. Aceastã funcþie returneazã o valoare întreagã potrivit tabelei

Cod Articol cale


urmãtoare dacã reuºeºte, ºi nil altfel.

0 Necunoscut
1 Mediu (environment)
2 Catalog
3 Schema
4 Tabela
5 Nume cale de legãturã
Capitolul 5 153

6 Cale completã (cu numele cãii de legãturã)


7 Cale obiect bazã de date (fãrã numele cãii de legãturã)
8 Cale Tabelã SQL

Release 13 ase_dopathmake
(ase_dopathmake <nume_med> [<nume_cat> [<nume_sch> [<nume_tbl> [<nume_cl>]]]])
Compune o cale de obiect bazã de date din nume atomice
Toate argumentele sunt ºiruri. Returneazã o cale completã de obiect bazã
de date ca ºir dacã reuºeºte ºi nil altfel.

Release 13 ase_dopathname
(ase_dopathname <cale_ob> <cod>)
Returneazã numele specificat din calea de obiect bazã de date
Argumentul <cale_ob> este un ºir care dã nivelul ierarhic al obiectului
bazã de date. Argumentul <cod> este un ºir care dã ierarhia numelui de
retur conform tabelei ce urmeazã.
Cod Articol cale
0 Necunoscut
1 Mediu (environment)
2 Catalog
3 Schema
4 Tabela
5 Nume cale de legãturã
6 Cale completã (cu numele cãii de legãturã)
7 Cale obiect bazã de date (fãrã numele cãii de legãturã)
8 Cale Tabelã SQL
Returneazã numele specificat, dacã reuºeºte, ºi nil altfel.
154 Funcþii AutoLISP

Release 13 ase_dostatus
(ase_dostatus [<cale_ob>])
Returneazã statutul pentru obiectul specificat
Argumentul <cale_ob> este un ºir care dã calea spre obiectul bazã de date.
Dacã lipseºte sau este un ºir vid, aceastã funcþie poate fi folositã pentru a
verifica dacã existã setãrile curente sau numele cãii de legãturã. Returneazã
o valoare întreagã dacã reuºeºte ºi nil altfel. Valoarea returnatã este totalul

Val Descriere
numerelor din tabela ce urmeazã.

1 Obiectul este cel curent


2 Obiectul este unul înregistrat
4 Obiectul este accesibil (existã în mediul ASI)
8 Obiectul aparþine mediului conectat (dat cu ajutorul interfeþei
utilizator ASE)
16 Este imposibil sã se detecteze dacã obiectul existã în baza de date
32 Unele din coloanele cheie nu existã în tabela bazã de date (numai
pentru tabele cu nume de cale de legãturã)
64 Definiþia coloanei cheie de date din desen diferã de cea din tabela
realã (numai pentru tabele cu nume de cale de legãturã)

Release 13 ase_errcode
(ase_errcode <nr_er>)
Regãseºte codul de eroare ASE
Argumentul <nr_er> este un întreg ce specificã numãrul descriptorului de
eroare. Aceastã funcþie returneazã un numãr de eroare corespunzãtor listei
specifice de erori ASE datã în manualele însoþitoare ale pachetului
AutoCAD-13 (prea amplã pentru a fi reprodusã aici).
Capitolul 5 155

Release 13 ase_errdsc
(ase_errdsc <nr_er>)
Regãseºte codul care specificã eroarea ASE
Argumentul <nr_er> este un întreg ce specificã numãrul descriptorului de

<nr_er> este invalid, atunci ase_errdsc returneazã nil.


eroare. Aceastã funcþie returneazã un ºir care descrie eroarea. Dacã

Release 13 ase_errmsg
(ase_errmsg <nr_er>)
Returneazã un ºir care descrie eroarea ASE
Argumentul <nr_er> este un întreg ce specificã numãrul descriptorului de

<nr_er> este invalid, atunci ase_errmsg returneazã nil.


eroare. Aceastã funcþie returneazã un ºir care descrie eroarea. Dacã

Release 13 ase_errqty
(ase_errqty)
Returneazã numãrul de descriptori de eroare
Dacã nu sunt erori, atunci funcþia ase_errqty returneazã 0.

Release 13 ase_linkcreate
(ase_linkcreate <date_leg>)
Creeazã o nouã legãturã (link)
Argumentul <date_leg> este un ºir cu formatul:
atr_leg1.atr_val1 atr_leg2.atr_val2 ...

de atribute. Partea atr_leg este o valoare întreagã ce specificã tipul atribu-


O legãturã (link) înseamnã perechi conþinând atribute de legãturã ºi valori

tului. Valorile întregi valide sunt date mai jos.


156 Funcþii AutoLISP

Val Descriere
1 Identificator legãturã (valabil pentru o aceeaºi sesiune de
desenare)
2 Cod tip legãturã
3 Statut legãturã
4 Nume entitate
5 Nume cale legãturã
6 Valoare cheie
7 Nume coloanã atribut afiºabil (pentru legãturã cu atribute afiºa-
bile)
8 Parametri entitate atribut afiºabil (numai pentru creare legãturã
cu atribute afiºabile)
9 Valori coloanã atribut afiºabil (numai pentru creare legãturã cu
atribute afiºabile)
10 Nume xref sau bloc
11 Atribut rezervat intern (este ignorat la crearea sau modificarea
legãturii)
Interfaþa ASE suportã douã tipuri de legãturi: legãturi de entitate ºi
atribute afiºabile. Tipul de legãturã trebuie sã fie specificat în momentul
creãrii legãturii.
Codul de tip de legãturã al entitãþii este 1. Codul de tip de legãturã cu
atribut afiºabil este 2. Fiecare legãturã are un statut care aratã dacã legãtu-
ra este actualizabilã. Dacã atributul de legãturã este 0 sau impar, atunci
legãtura nu este actualizabilã. Fiecare legãturã existentã are un identifica-
tor care este atribuit în momentul încãrcãrii legãturii din desen sau dupã
crearea acesteia. Identificatorii de legãturã sunt unici pentru o aceeaºi
sesiune de desenare. Aceºtia se reatribuie în totalitate pentru urmãtoarea
sesiune. Identificatorul legãturii actualizate nu este schimbat, iar valoarea
sa este pãstratã aºa cum ar fi fost dacã legãtura ar fi fost restauratã dupã
executarea comenzii UNDO.
Pentru a crea o legãturã de entitate vor fi specificate atributele: numele cãii
de legãturã, valoarea cheii ºi numele entitãþii.
Pentru a crea o legãturã de atribute afiºabile vor fi specificate urmãtoarele
atribute: numele cãii de legãturã, valoarea cheii ºi numele coloanei atribu-
tului afiºabil. Reprezentarea parametrilor atributului afiºabil trebuie sã
Capitolul 5 157

întruneascã cerinþele obiectului text. Punctul de inserþie ºi unghiul de


rotaþie sunt cerute la crearea legãturii cu atribut afiºabil. Dupã crearea cu
succes a acestui tip de legãturã, ASE atribuie valoarea corespunzãtoare
atributului nume de entitate. În cursul creãrii legãturii cu atribut afiºabil
este posibil sã se specifice atributul valorilor coloanei atributului afiºabil.
Dacã nu este specificat acest atribut, atunci este afiºat un simbol asterisc.
Nu existã oportunitatea obþinerii valorii parametrilor atributului afiºabil
atributelor coloanei atributului afiºabil pentru legãtura existentã.
Interfaþa ASE vã permite sã creaþi ºi sã modificaþi legãturile cu entitãþile
din blocuri. În acest caz atributul nume xref sau bloc conþine numele blocu-
lui. În momentul creãrii legãturii, interfaþa ASE detecteazã automat dacã
este specificat numele entitãþii din bloc ºi atribuie numele corespunzãtor
de bloc atributului. Interfaþa ASE vã permite sã actualizaþi legãturile prin
înlocuirea numelui entitãþii legate.
Dacã reuºeºte, funcþia returneazã identificatorul legãturii nou create ºi va-
loarea -1 altfel.
NOTA:
Din cauzã cã aceastã funcþie poate modifica date din desen, este
recomandabil sã n-o utilizaþi atunci când este activã o casetã de
dialog.

Release 13 ase_linkget
(ase_linkget <date_leg>)
Regãseºte datele pentru legãtura specificatã de identificator
Argumentul <date_leg> este descris la funcþia ase_linkcreate (vezi).
Dacã legãtura nu existã sau este ceva în neregulã, atunci ase_getlink
returneazã nil.

Release 13 ase_linkremove
(ase_linkremove <link_io>)
Retrage legãtura specificatã de identificatorul de legãturã
158 Funcþii AutoLISP

Argumentul <link_io> este o valoare realã care specificã legãtura din xref.
Entitatea de legãturã trebuie sã existe ºi sã fie actualizabilã. Returneazã T
dacã reuºeºte ºi nil altfel.
NOTA:
Din cauzã cã aceastã funcþie poate modifica date din desen, este
recomandabil sã n-o utilizaþi atunci când este activã o casetã de
dialog.

Release 13 ase_linkupdate
(ase_linkupdate <date_leg>)
Actualizeazã legãtura existentã
Argumentul <date_leg> este descris la funcþia ase_linkcreate (vezi).
Pentru legãtura de entitate vor fi actualizate numai numele entitãþii ºi/sau
valoarea cheii ºi numele cãii de legãturã. Pentru legãtura cu atribute afiºa-
bile vor fi actualizate numai valoarea cheii sau valorile coloanei atrubutu-
lui afiºabil. Alte atribute de legãturã sunt ignorate. Entitatea de legãturã a
legãturii existente ºi noua entitate specificatã trebuie sã existe ºi sã fie actu-
alizabilã.
Returneazã T dacã reuºeºte ºi nil altfel.
NOTA:
Din cauzã cã aceastã funcþie poate modifica date din desen, este
recomandabil sã n-o utilizaþi atunci când este activã o casetã de
dialog.

Release 13 ase_lpcreate
(ase_lpcreate <cale_tbl> <nume_cl> <cheie>)
Creeazã o nouã cale de legãturã
Argumentul <cale_tbl> specificã tabela de bazã de date, iar <nume_cl>
specificã numele cãii de legãturã. Argumentul <cheie> este o listã care dã
lista numelor de colanã cheie. Numele de coloanã având tipul de datã BIT,
Capitolul 5 159

BIT VARYING sau un tip definit de implementare nu pot fi specificate.


Mediul corespunzãtor va trebui sã fie conectat, tabela va trebui sã existe ºi
sã fie accesibilã.
Returneazã T dacã reuºeºte ºi nil altfel. Funcþia returneazã nil ºi dacã
numele cãii de legãturã existã deja.
NOTA:
Din cauzã cã aceastã funcþie poate modifica date din desen, este
recomandabil sã n-o utilizaþi atunci când este activã o casetã de
dialog.

Release 13 ase_lperase
(ase_lperase <nume_cl>)
ªterge calea de legãturã specificatã de numele dat
Argumentul <nume_cl> este un ºir care specificã numele cãii de legãturã.
Aceastã funcþie poate afecta setãrile curente, ºtergând numele cãii de legã-
turã sau fãcând neînregistrat obiectul bazã de date curent.
Returneazã T dacã reuºeºte ºi nil dacã nu este actualizabilã calea de legã-
turã sau este ceva în neregulã.
NOTA:
Din cauzã cã aceastã funcþie poate modifica date din desen, este
recomandabil sã n-o utilizaþi atunci când este activã o casetã de
dialog.

Release 13 ase_lpisupdatable
(ase_lpisupdatable <nume_cl>)
Verificã dacã este actualizabilã calea de legãturã ca ansamblu
Calea de legãturã nu este actualizabilã în douã cazuri: 1/ dacã numele cãii
de legãturã are un nume de xref ca prefix, 2/ dacã oricare dintre legãturi se
referã la un obiect neactualizabil (fiind pe un layer blocat sau într-o xref).
Returneazã T dacã este actualizabilã calea de legãturã ºi nil altfel.
160 Funcþii AutoLISP

Release 13 ase_lpkey
(ase_lpkey <nume_cl>)
Regãseºte numele coloanei cheie pentru tabela de legãturã datã
Argumentul <nume_cl> este un ºir care specificã numele cãii de legãturã.
Returneazã o listã de ºiruri conþinând numele de legãturã dacã are succes.
Altfel, returneazã nil.

Release 13 ase_lplist
(ase_lplist [<cale_ob>])
Regãseºte o listã a numelor cãilor de legãturã
Argumentul <cale_ob> specificã nivelul ierarhic al obiectului bazã de
date. Aceastã funcþie returneazã o listã a numelor de cãi de legãturã privind
referinþa la obiectul bazã de date specificat. Dacã argumentul <cale_ob>
nu este dat sau este un ºir vid, aceastã funcþie va returna toate numele de
cãi de legãturã. Returneazã o listã de ºiruri dacã reuºeºte ºi nil altfel.

Release 13 ase_lppath
(ase_lppath <nume_cl>)
Regãseºte calea de tabelã pentru numele de cale de legãturã specificat
Returneazã calea de tabelã dacã reuºeºte ºi nil dacã numele de cale de legã-
turã specificat nu existã sau este ceva în neregulã.

Release 13 ase_lprename
(ase_lprename <numevec_cl> <numenou_cl>)
Schimbã numele cãii de legãturã
Argumentul <numevec_lp> este un ºir care specificã numele vechi al cãii
de legãturã, iar <numenou_cl> pe cel nou. Aceastã funcþie poate afecta
Capitolul 5 161

setãrile curente, schimbând numele cãii de legãturã al obiectului bazã de


date curent.
Returneazã T dacã reuºeºte ºi nil dacã nu este actualizabilã calea de legã-
turã sau ceva este în neregulã. Aceastã funcþie returneazã nil ºi dacã numele
cãii de legãturã specificate existã deja.
NOTA:
Din cauzã cã aceastã funcþie poate modifica date din desen, este
recomandabil sã n-o utilizaþi atunci când este activã o casetã de
dialog.

Release 13 ase_lsadd
(ase_lsadd <link_sel> <link_io>)
Adaugã identificatorul de legãturã la selecþia de legãturã
Returneazã T dacã reuºeºte ºi nil altfel.

Release 13 ase_lscmp
(ase_lscmp <link_sel1> <link_sel2>)
Comparã identificatorii selecþiilor de legãturi
Returneazã T dacã sunt similare ºi nil altfel

Release 13 ase_lscopy
(ase_lscopy <link_sel>)
Copiazã selecþia de legãturã într-una nouã
Returneazã T dacã reuºeºte ºi nil altfel.
162 Funcþii AutoLISP

Release 13 ase_lscreate
(ase_lscreate <filtru_leg>)
Creeazã selecþia de legãturã prin filtrul de legãturã specificat
Argumentul <filtru_leg> este reprezentat în formatul:
atr_leg1.atr_val1 atr_leg2.atr_val2 ...
El conþine perechi de atribute de legãturã ºi valorile lor. Toate aceste

atributelor de legãturã vezi funcþia ase_linkcreate. Dacã nu este specifi-


perechi sunt asociate prin operatorul logic AND. Pentru descrierea

catã nici mãcar o pereche de atribute de legãturã, atunci selecþia de legãturã


returnatã conþine referinþe la toate legãturile existente. Într-un filtru de
legãturi pot fi specificate atributele de legãturã: identificatorul legãturii,
codul tipului de legãturã, numele entitãþii, numele cãii de legãturã ºi
numele xref/bloc. În plus faþã de atributele de legãturã standard, mai pot fi

Val Descriere
specificate ºi valorile date mai jos.

-1 Condiþie text (criteriu textual)


-2 Nume mulþime selecþie (criteriu grafic)
-3 Cale obiect bazã de date
Selecþia de legãturã conþine identificatorii de legãturã care satisfac condiþia
WHERE SQL specificatã, dacã a fost dat atributul extins al condiþiei text.
Dacã este specificat numele mulþimii de selecþie, selecþia de legãturã va fi
iniþializatã de legãturã, asociatã cu entitãþile ºi conþinutã în mulþimea de
selecþie specificatã. Calea obiectului bazã de date serveºte la selectarea legã-
turilor cãii de legãturã care privesc obiectul bazã de date specificat ºi la
selectarea tuturor legãturilor care privesc întreaga linie de tabelã.
Condiþia text ºi atributele valorii cheii trebuie sã urmeze dupã numele cãii
de legãturã sau calea obiectului bazã de date. În acest caz atributul obiec-
tului bazã de date trebuie sã conþinã referinþa la tabelã. Dacã este folosit fil-
trul de legãturã pentru a obþine selecþia de legãturi pentru rândul specifi-
cat (cu orice nume de cale de legãturã, dacã numele cãii de legãturã nu este
specificat în referinþa de tabelã), valoarea cheii trebuie sã conþinã toate va-
lorile rând. Pentru a specifica toate legãturile, atributul cãii de obiect bazã
de date trebuie sã fie un ºir vid. Toate selecþiile de legãturi trebuie sã fie
Capitolul 5 163

eliberate cu ajutorul funcþiei ase_lsfree (vezi), atunci când ele devin


nefolositoare. Identificatorul selecþiei de legãturã este unic în cadrul unei
sesiuni de desenare.
Funcþia returneazã identificatorul selecþiei de legãturã dacã reuºeºte ºi nil
altfel.

Release 13 ase_lsdel
(ase_lsdel <link_sel> <link_nr>)
ªterge poziþia legãturii în selecþia de legãturã
Returneazã T dacã reuºeºte ºi nil altfel.

Release 13 ase_lsentsel
(ase_lsentsel <link_sel>)
Regãseºte mulþimea de selecþie a entitãþilor asociate legãturilor din selecþie
Aceastã funcþie nu prelucreazã ierarhia xref/bloc. Toate legãturile referite
trebuie sã existe. Funcþia returneazã numele selecþiei de legãturã dacã
reuºeºte ºi nil altfel.

Release 13 ase_lserase
(ase_lserase <link_sel>)
ªterge legãturile ºi eliminã selecþia de legãturã
Toate legãturile referite trebuie sã existe ºi sã fie actualizabile. Returneazã
T dacã reuºeºte ºi nil altfel.
NOTA:
Din cauzã cã aceastã funcþie poate modifica date din desen, este
recomandabil sã n-o utilizaþi atunci când este activã o casetã de
dialog.
164 Funcþii AutoLISP

Release 13 ase_lsfree
(ase_lsfree <link_sel>)
Elibereazã selecþia de legãturã
Returneazã nil dacã a apãrut vreo eroare.

Release 13 ase_lsget
(ase_lsget <link_sel> <link_nr>)
Returneazã identificatorul de legãturã pentru poziþia specificatã în selecþie
Returneazã nil dacã a apãrut vreo eroare.

Release 13 ase_lsintersect
(ase_lsintersect <link_sel> <link_sel_intersect>)
ªterge toþi identificatorii dintr-o selecþie de legãturã cu excepþia celor specificaþi
ªterge din selecþia de legãturã specificatã de argumentul <link_sel> toþi
identificatorii care nu sunt conþinuþi în selecþia de legãturã specificatã de
argumentul <link_sel_intersect>.
Returneazã T dacã reuºeºte ºi nil altfel.

Release 13 ase_lsintersectfilter
(ase_lsintersectfilter <filtru_leg>)
Retrage din selecþia de legãturã acei identificatori care nu corespund cu filtrul

lor (vezi funcþia ase_lscreate). Dacã nu este specificatã nici mãcar o sin-
Argumentul <filtru_leg> conþine perechi de atribute de legãturã ºi valorile

gurã pereche de atribute de legãturã, atunci selecþia de legãturã returnatã


conþine referinþe la toate legãturile existente.
Returneazã T dacã reuºeºte ºi nil altfel.
Capitolul 5 165

Release 13 ase_lsisupdatable
(ase_lsisupdatable <link_sel>)
Verificã dacã toate legãturile din selecþia de legãturã sunt actualizabile
O selecþie de legãturã nu poate fi actualizabilã dacã entitatea referitã
aparþine unui layer blocat sau unei xref (referinþe externe).
Returneazã T dacã selecþia de legãturã este actualizabilã ºi nil altfel.

Release 13 ase_lslpnames
(ase_lslpnames <link_sel>)
Regãseºte o listã a numelor de cãi de legãturã asociate din selecþia de legãturã
Toate legãturile referite trebuie sã existe. Returneazã lista de ºiruri dacã
reuºeºte ºi nil altfel.

Release 13 ase_lsmemb
(ase_lsmemb <link_sel> <link_io>)
Verificã dacã identificatorul de legãturã aparþine selecþiei de legãturã
Returneazã numãrul de articol al legãturii cerute dacã reuºeºte ºi -1 altfel.

Release 13 ase_lsqty
(ase_lsqty <link_sel>)
Returneazã numãrul de legãturi din selecþia de legãturã
Returneazã nil dacã intervine vreo eroare.

Release 13 ase_lssubtract
(ase_lssubtract <link_sel> <link_sel_subtract>)
ªterge identificatorii de legãturã specificaþi dintr-o selecþie de legãturã
166 Funcþii AutoLISP

ªterge din selecþia de legãturã specificatã prin <link_sel> toþi identifica-


torii de legãturã conþinuþi în selecþia de legãturã specificatã de
<link_sel_subtract>. Returneazã T dacã reuºeºte ºi nil altfel.

Release 13 ase_lsunite
(ase_lsunite <link_sel> <link_sel_union>)
Adaugã o selecþie de legãturã la alta
Adaugã selecþia de legãturã specificatã de argumentul <link_sel_union>
la selecþia de legãturã specificatã de <link_sel>. Returneazã T dacã
reuºeºte ºi nil altfel.

Release 13 ase_lsxnames
(ase_lsxnames <link_sel>)
Regãseºte o listã a numelor xref sau bloc asociate din selecþia de legãturã
Aceastã funcþie nu prelucreazã ierarhia xref/bloc. Toate legãturile referite
trebuie sã existe. Funcþia returneazã lista de ºiruri dacã reuºeºte ºi nil alt-
fel.

Release 13 ase_version
(ase_version)
Raporteazã versiunea ASE curentã
Returneazã un ºir indicând versiunea ASE dacã reuºeºte ºi nil altfel.

Release 10 assoc
(assoc <articol> <alist>)
Returneazã intrarea într-o listã corespunzãtoare cheii date
Aceastã funcþie cautã <articol> în lista_asociatã <alist>, ca element cheie
Capitolul 5 167

în <alist>, assoc returneazã nil. De exemplu, presupunând cã lista ”al”


ºi returneazã intrarea din <alist>. Dacã <articol> nu este gãsit ca o cheie

este definitã ca:


((nume cutie) (latime 3) (marime 4.7263) (adancime 5))

(assoc ‘marime al)


atunci

(assoc ‘greutate al)


returneazã (MARIME 4.7263)
returneazã nil
Listele_asociate sunt folosite frecvent pentru stocarea de date care pot fi

structurilor din alte limbaje de programare. Funcþia subst, descrisã mai jos
regãsite printr-o ”cheie”. Aceasta este similarã tablourilor/vectorilor sau

în acest capitol, oferã un mijloc comod de înlocuire a valorii asociate unei


chei din lista_asociatã.

Release 10 atan
(atan <num1> [<num2>])
Returneazã arctangenta unui unghi dat în radiani
Dacã <num2> nu este dat, ATAN returneazã arctangenta lui <num1>, în
radiani. <Num1> poate fi negativ; gama valorilor unghiurilor returnate

(atan 0.5)
este de la -π la +π radiani. De exemplu:

(atan 1.0)
returneazã 0.463648

(atan -1.0)
returneazã 0.785398

(angtos (atan -1.0) 0 4)


returneazã -0.785398
returneazã ”315.0000”
Dacã se dã atât <num1>, cât ºi <num2>, se returneazã arctangenta lui
<num1>/<num2>, în radiani. Dacã <num2> este zero, se returneazã un
unghi de plus sau minus 1.570796 radiani (+90 sau -90 grade), depinzând

(atan 2.0 3.0)


de semnul lui <num1>. De exemplu:

(angtos (atan 2.0 3.0) 0 4)


returneazã 0.588003
returneazã ”33.6901”
168 Funcþii AutoLISP

(atan 2.0 -3.0)


(angtos (atan 2.0 -3.0) 0 4)
returneazã 2.55359

(atan -2.0 3.0)


returneazã ”146.3099”

(atan -2.0 -3.0)


returneazã -0.588003

(atan 1.0 0.0)


returneazã -2.55359

(angtos (atan 1.0 0.0) 0 4)


returneazã 1.5708

(atan -0.5 0.0)


returneazã ”90.0000”

(angtos (atan -0.5 0.0) 0 2) returneazã ”270.00”


returneazã -1.5708

Release 10 atof
(atof <ºir>)
Returneazã valoarea convertitã la real a unui ºir

(atof ”97.1”)
De exemplu:

(atof ”3”)
returneazã 97.1
returneazã 3.0

Release 10 atoi
(atoi <ºir>)
Returneazã valoarea convertitã la întreg a unui ºir

(atoi ”97”)
De exemplu:

(atoi ”-3”)
returneazã 97

(atoi ”3.9”)
returneazã -3

(atoi ”-3.9”)
returneazã 3
returneazã -3
Capitolul 5 169

Release 10 atom
(atom <articol>)
Verificã dacã un articol este un atom
Aceastã funcþie returneazã nil dacã <articol> este o listã ºi T altfel. Aºadar,
funcþia lucreazã prin negare: orice nu este o listã este considerat un atom.
De exemplu, dându-se atribuirile:
(setq a ‘(x y z))
(setq b ‘a)

(atom ‘a)
atunci:

(atom a)
returneazã T

(atom ‘b)
returneazã nil

(atom b)
returneazã T

(atom ‘(a b c))


returneazã T
returneazã nil

pretare a atom-ilor, aºa cã fiþi atenþi atunci când folosiþi codul convertit.
Unele implementãri de LISP diferã în ceea ce priveºte modul de inter-

Release 12 atoms-family
(atoms-family <format> [<listsimb>])
Returneazã o listã a simbolurilor curent definite

0, atunci atoms-family returneazã numele de simboluri ca listã. Dacã


Argumentul <format> este o valoare întreagã 0 sau 1. Dacã valoarea este

ºiruri. Funcþia atoms-family cautã lista de simboluri precizatã prin argu-


<format> este 1, atunci se returneazã numele de simboluri ca listã de

listã de ºiruri care dã numele de simboluri. Funcþia atoms-family


mentul opþional <listsimb> (dacã e dat). Argumentul <listsimb> este o

returneazã o listã de tipul specificat prin argumentul <format> (simboluri


sau ºiruri), listã care conþine nume de simboluri definite.
(atoms-family 0) returneazã o listã a simbolurilor curent
170 Funcþii AutoLISP

definite

(C:REPLAY C:AI_SPHERE ALERT DEFUN C:DDSOLPRM AI_ASEGREY C:SOLHPAT C:SOLINT C:DDRENAME


De curiozitate, iatã aceastã listã pentru AutoCAD-12 (no-prototype):
AI_ALOADAME GETDIST /= CAAR MIN GET_TILE CADAR C:DDSOLMASSP AI_FFILE LOG C:SOLAXCOL RTOS CADADR
C:SOLHSIZE C:MVSETUP ENTLAST TEXTBOX APPEND C:SOLVOLUME INITGET CADDAR TRACE C:SOLAMEVER
C:SOLWIRE C:TIFFIN START_IMAGE CDDR ACAD_HELPDLG C:RIEDGE REDRAW PRIN1 MAX LISTP ALLOC GRCLEAR
OR XLOAD C:RMMENU TRANS PRINT REM GC SIN CDAADR SETQ SSDEL ANGLE NOT C:SOLSOLIDIFY AI_TAB1 ENT-
DEL CDAR BOUNDP SET MEM AI_TAB2 HANDENT MENUCMD GETVAR EXP START_LIST EQUAL _VER REPEAT AI_NOFILE
AI_TAB3 GETCORNER AI_TAB4 NUMBERP ACTION_TILE CADDDR UNTRACE C:DDCHPROP C:DLINE SSMEMB GETINT
CDAAAR QUIT IF ACAD_COLORDLG *MERRMSG* MODE_TILE C:MIRROR3D C:DDPTYPE SUBSTR AUTOLOAD EXPAND
C:SOLIN C:PCXIN GRDRAW PROMPT ATOF START_DIALOG C:SOLOUT C:RECTANG READ-LINE DONE_DIALOG C:PSIN
C:SOLWEDGE C:SOLIDIFY REPORT SSNAME TYPE EQ C:SOLUPGRADE _AUTOLOAD C:DDSOLMAT C:SOLAREAU MINUSP
LOAD_DIALOG C:SOLSERVMSG C:SOLDELENT GRREAD FILL_IMAGE DIMY_TILE C:SAVEIMG C:3DARRAY INTERS ~
CAAADR AI_AMEGREY NENTSEL END_LIST C:SOLAMECOMP C:SOLTORUS XDROOM C:DDSOLVAR C:STATS TEXTPAGE
C:BHATCH C:RIBACKG C:SOLWDENS CONS C:SOLLIST C:SOLCHP C:FILTER TBLSEARCH READ-CHAR ATOM
AI_UPGVAR GETORIENT FINDFILE CAAAAR C:SOLBOX C:LIGHT STRLEN SQRT AI_SELECT BOOLE MAPCAR EXIT
C:DDINSERT GETSTRING ATOI END_IMAGE NEW_DIALOG NULL C:AI_DOME POLAR WRITE-LINE PI C:AI_WEDGE
ENTUPD C:SOLSECT C:SOLMOVE CAADDR C:SOLSECTYPE C:ALIGN C:APPLOAD GRTEXT * C:3D TABLET ATAN +
ASCII C:RENDER - LAST C:AI_TORUS LOGAND BHERRS C:ASCTEXT AUTOXLOAD ENTMAKE CAADAR / CDAAR C:BPOLY
C:GIFIN TEXTSCR XUNLOAD LOAD OPEN COND WRITE-CHAR LAMBDA C:SOLRENDER C:RPREF SETVAR C:SOLAREA
C:AI_MESH _AUTOXLOAD CDDDAR C:SOLMATCURR AI_LOADAVERENDR *MERR* REGAPP AI_LOADAME C:AI_PEDITM
DISTOF GETANGLE C:DDIM C:SOLMASSP C:SOLSUB C:DDVPOINT LOGIOR CDADR READ AI_ROOTMENUS ATOMS-FAM-
ILY C:SOLDISPLAY TBLNEXT < DIMX_TILE CDDAR ANGTOS COS = REVERSE C:SOLMESH C:RITHRESH C:DDSELECT
> SET_TILE C:SOLSPHERE C:SOLFEAT C:RIGAMUT C:AI_UNLOADAVE APPLY C:AI_PYRAMID C:AI_CONE >= CDDDDR
AI_TILEDVP ENTSEL CLIENT_DATA_TILE MEMBER C:SOLCHAM C:SOLMASS C:SOLPAGELEN AI_UNLOADAME GETENV
<= C:SOLINTERF _AUTOQLOAD CDDDR C:SOLEXT AI_TILEDVP_CHK ENTMOD SLIDE_IMAGE ASSOC C:PLUD
C:DDATTDEF ANGTOF C:SOLCUT C:SOLCYL TERPRI 1+ C:SOLREV C:SOLCONE C:SOLLENGTH AI_ASEINIT_CHK CHR
STRCAT VECTOR_IMAGE C:SOLUNION AI_SETUP GRVECS CDDAAR C:SOLSEP C:DDMODIFY VPORTS TERM_DIALOG
VMON ACAD_HELDLG C:SOLFILL C:RIASPECT C:DDGRIPS NENTSELP GETKWORD LIST C:AI_DISH AI_SCRCOMP
XDSIZE PAUSE FIX C:SOLDECOMP C:DL GETFILED OSNAP GETPOINT 1- ABS GET_ATTR SSADD ACAD_STRLSORT
C:SOLHANGLE C:AI_BOX ENTNEXT CVUNIT C:PSFILL SUBST CAADR CDR FOREACH C:DDUNITS EXPT C:FINISH
C:DDVIEW DISTANCE NTH T AI_ASEINIT COMMAND UNLOAD_DIALOG CDDADR EVAL C:RCONFIG C:ROTATE3D
SSLENGTH FLOAT C:SOLUCS AI_UPGPREC LENGTH C:SCENE C:CAL GETREAL AND CAAAR CAR *ERROR* WHILE
C:SOLMAT C:RIGREY CDADDR QUOTE C:DDOSNAP SSGET GCD LSH C:SOLPROF AI_ASETERM ENTGET PRINC ADS
C:DDATTEXT CLOSE CADAAR PROGN C:DDUCSP CADR VER C:SOLSUBDIV C:SOLVAR ITOA CADDR STRCASE ZEROP
CDADAR C:PSDRAG C:SOLPURGE WCMATCH GRAPHSCR ADD_LIST)
Urmãtorul cod verificã dacã simbolurile CAR, CDR ºi XYZ au fost definite

(atoms-family 1 ‘(”CAR” ”CDR” ”XYZ”)) returneazã (”CAR” ”CDR” nil)


ºi returneazã lista ca ºiruri:

Valoarea de retur obþinutã aratã cã simbolul XYZ nu a fost definit.


Capitolul 5 171

Release 13 autoarxload
(autoarxload <numefis> <listacmd>)
Predefineºte nume de comenzi pentru a încãrca un fiºier ARX asociat
Argumentul <numefis> este un ºir care specificã un fiºier .arx ce va fi
încãrcat atunci când una dintre comenzile definite de argumentul <lis-

tacmd> trebuie sã fie o listã de ºiruri. Funcþia autoarxload returneazã nil.


tacmd> va fi introdusã pe prompterul „Command:”. Argumentul <lis-

Codul ce urmeazã defineºte funcþiile C:APP1, C:APP2 ºi C:APP3 pentru a


încãrca fiºierul bonusapp.arx. Imediat ce este introdusã una dintre comen-
zile APP1, APP2 sau APP3 pe prompterul „Command:”, aplicaþia ARX este
încãrcatã ºi comanda continuã.
(autoarxload ”BONUSAPP” ‘(”APP1” ”APP2” ”APP3”))

Release 13 autoload
(autoload <numefis> <listacmd>)
Predefineºte nume de comenzi pentru a încãrca un fiºier AutoLISP asociat
Argumentul <numefis> este un ºir care specificã fiºierul .lsp ce va fi încãr-
cat atunci când una dintre comenzile definite de argumentul <listacmd>

buie sã fie o listã de ºiruri. Funcþia autoload returneazã nil.


va fi introdusã pe prompterul „Command:”. Argumentul <listacmd> tre-

Codul ce urmeazã defineºte funcþiile C:APP1, C:APP2 ºi C:APP3 pentru a


încãrca fiºierul bonusapp.lsp. Imediat ce este introdusã una dintre comen-
zile APP1, APP2 sau APP3 pe prompterul „Command:”, aplicaþia
AutoLISP este încãrcatã ºi comanda continuã.
(autoload ”BONUSAPP” ‘(”APP1” ”APP2” ”APP3”))
172 Funcþii AutoLISP

Release 13 autoxload
(autoxload <numefis> <listacmd>)
Predefineºte nume de comenzi pentru a încãrca o aplicaþie ADS asociatã
Argumentul <numefis> este un ºir care specificã aplicaþia ADS ce va fi
încãrcatã atunci când una dintre comenzile definite de argumentul <lis-

tacmd> trebuie sã fie o listã de ºiruri. Funcþia autoxload returneazã nil.


tacmd> va fi introdusã pe prompterul „Command:”. Argumentul <lis-

Codul ce urmeazã defineºte funcþiile C:APP1, C:APP2 ºi C:APP3 pentru a


încãrca aplicaþia bonusapp. Imediat ce este introdusã una dintre comenzile
APP1, APP2 sau APP3 pe prompterul „Command:”, aplicaþia ADS este
încãrcatã ºi comanda continuã.
(autoxload ”BONUSAPP” ‘(”APP1” ”APP2” ”APP3”))

Release 10 Boole
(Boole <func> <int1> <int2>...)
Funcþie booleeanã generalã
Aceasta este o funcþie booleanã la nivel de bit generalã. Aici <func> este
un întreg între 0 ºi 15 reprezentând una din cele 16 funcþii booleene posi-
bile în douã variabile. Argumentele întregi succesive sunt bazate pe combi-
naþii la nivel de bit (logice) ale acestei funcþii cu tabela de adevãr:
Int1 Int2 bit_func
0 0 8
0 1 4
1 0 2
1 1 1
Fiecare bit din <int1> este împerecheat cu bitul corespunzãtor din
<int2>, selectând un rând orizontal al tabelei de adevãr. Bitul rezultant
este fie zero, fie 1, depinzând de setarea bitului <func> corespunzãtor
acelui rând al tabelei de adevãr. Dacã bitul corespunzãtor este setat în
<func>, bitul rezultant este 1, altfel bitul rezultant este 0.
Unele valori pentru <func> sunt echivalente operaþiilor booleene standard
Capitolul 5 173

AND, OR, XOR ºi NOT. Acestea sunt prezentate mai jos:.


Fnc Operaþie Bitul rezultant este 1 dacã...
1 AND ambii biþi de intrare sunt 1
6 XOR numai unul din cei doi biþi de intrare este 1
7 OR fie unul, fie ambii biþi de intrare sunt 1
8 NOT ambii biþi de intrare sunt 1 (complement de unu)

De exemplu:
(boole 1 12 5)
specificã un AND logic pe valorile 12 ºi 5. Rezultatul este 4 (scrieþi 12 ºi 5
în binar, aplicaþi AND pe biþi ºi vã veþi convinge). Similar:
(boole 6 6 5)
specificã un XOR logic pe valorile 6 ºi 5, returnând 3.
Puteþi folosi alte valori pentru <func> ca sã efectuaþi alte operaþii booleene
pentru care nu existã nume standard. De exemplu, dacã <func> este 4,
biþii rezultanþi sunt setaþi dacã biþii corespunzãtori sunt setaþi în <int2>

(boole 4 3 14)
dar nu ºi în <int1>. Astfel:
returneazã 12.

Release 10 boundp
(boundp <atom>)
Verificã dacã unui nume simbolic îi este atribuitã o valoare
Aceastã funcþie returneazã T dacã <atom> are o valoare atribuitã (cores-
punzãtoare domeniului). Dacã lui <atom> nu i s-a destinat nici o valoare (sau
i s-a destinat nil), atunci este returnat nil. De exemplu, dându-se atribuirile:
(setq a 2)
(setq b nil)

(boundp ‘a)
atunci:

(boundp ‘b)
returneazã T
returneazã nil
174 Funcþii AutoLISP

Release 10 car, cdr, ...


(car <list>) (cdr <list>) etc.
Returneazã pãrþi ale unei liste
CAR returneazã primul element al unei liste, iar CDR returneazã lista
întreagã din care lipseºte primul element.
Prima implementare a limbajului LISP s-a realizat pe un calculator IBM
704 prin 1960 (adicã în preistorie, potrivit curgerii timpului în era infor-
maticii!). Douã dintre registrele acestui calculator se numeau CAR ºi CDR;
ele au fost folosite pentru preluarea din memorie a celor douã câmpuri ale
structurilor CONS din memorie. La rândul lor, ”structurile” CONS sunt
produsul funcþiei CONS (mnemonic de la CONStructor). Iatã deci istoria
nostalgicã ºi etimologia noþiunilor exprimate prin siglele CAR, CDR ºi
CONS, larg folosite în context LISP. Îndemnãm cititorul sã caute totdeau-
na astfel de reazeme etimologice, pentru a elucida permanent resorturile ce
au dus la realizãrile recente. Aici nu e o istorie a oamenilor, plinã de subiec-
tivism, ci o istorie ferm ancoratã în cea mai purã logicã, totul fiind meticu-
los consemnat în lucrãrile de specialitate.
AutoLISP suportã concatenarea CAR ºi CDR pânã la patru nivele în
adâncime. De exemplu, dându-se atribuirea:
(setq x ‘((a b) c d))
atunci:
(caar x) este echivalent cu (car (car x)) returnând A
(cdar x) este echivalent cu (cdr (car x)) returnând (B)
(cadar x) este echivalent cu (car (cdr (car x))) returnând B
(cadr x) este echivalent cu (car (cdr x)) returnând C
(cddr x) este echivalent cu (cdr (cdr x)) returnând (D)
(caddr x) este echivalent cu (car (cdr (cdr x))) returnând D
În AutoLISP, cadr este folosit frecvent pentru a obþine coordonata Y a unui

asemenea, caddr poate fi folosit pentru obþinerea coordonatei Z a unui


punct 2D sau 3D (al doilea element al unei liste de douã sau trei reale). De

punct 3D. De exemplu, dându-se atribuirile:


Capitolul 5 175

(setq pt2 ‘(5.25 1.0)) ;(punct 2D)


(setq pt3 ‘(5.25 1.0 3.0)) ;(punct 3D)

(car pt2)
atunci:

(cadr pt2)
returneazã 5.25

(caddr pt2)
returneazã 1.0

(car pt3)
returneazã nil

(cadr pt3)
returneazã 5.25

(caddr pt3)
returneazã 1.0
returneazã 3.0
Cazuri particulare: car ºi cdr
(car <list>)
Aceastã funcþie returneazã primul element al <list>. Dacã <list> este

(car ‘(a b c))


goalã se returneazã nil. De exemplu:

(car ‘((a b) c))


returneazã A

(car ‘())
returneazã (A B)
returneazã nil
(cdr <list>)
Aceastã funcþie returneazã o listã conþinând toate elementele din <list>,
cu excepþia primului. Dacã <list> este goalã, se returneazã nil. De exem-

(cdr ‘(a b c))


plu:

(cdr ‘((a b) c))


returneazã (B C)

(cdr ‘())
returneazã (C)
returneazã nil
Când argumentul <list> este o pereche cu punct (vezi cons), cdr

(cdr ‘(a . b))


returneazã elementul al doilea, fãrã a-l include într-o listã. De exemplu:

(cdr ‘(l . ”Text”))


returneazã B
returneazã ”Text”
176 Funcþii AutoLISP

Release 10 chr
(chr <numãr>)
Returneazã un caracter corespunzãtor codului ASCII dat ca argument
Aceastã funcþie returneazã conversia unui întreg reprezentând un cod
ASCII într-un ºir de un singur caracter (similarã funcþiei CHR$ din lim-

(chr 65)
bajul BASIC). De exemplu:

(chr 66)
returneazã ”A”

(chr 97)
returneazã ”B”
returneazã ”a”

Release 12 client_data_tile
(client_data_tile <cheie> <dateclient>)
Asociazã date gestionate de aplicaþie cu o zonã de casetã de dialog
Argumentul <cheie> este un ºir care specificã o zonã („tile”). Argumentul
<cheie> este sensibil la tipul de literã (micã, MAJUSCULţ). Datele sunt

de acþiune sau un apel de funcþie poate referi ºirul ca $data.


transmise printr-un ºir specificat de argumentul <dateclient>. O expresie

Release 10 close
(close <filespec>)
Închide un fiºier deschis

specificator valid obþinut din funcþia open (vezi). Dupã un close, specifi-
Aceastã funcþie închide un fiºier ºi returneazã nil. Aici, <filespec> este un

catorul de fiºier este neschimbat, dar nu mai este valid.


De exemplu, presupunând cã FIS este un specificator valid de fiºier,
(close fis)
va închide fiºierul asociat ºi va returna nil.
Capitolul 5 177

Release 10 command
(command <args>...)
Executã o comandã AutoCAD
Aceastã funcþie executã comenzi AutoCAD din interiorul AutoLISP ºi
întotdeauna returneazã nil. Argumentele reprezintã comenzi AutoCAD ºi
subcomenzile lor; fiecare argument este evaluat ºi transmis lui AutoCAD ca
rãspuns la promptere succesive. Numele de comenzi ºi opþiunile sunt trans-
mise ca ºiruri, punctele 2D ca liste de douã reale, iar punctele 3D ca liste
de trei reale. Numele de comenzi sunt recunoscute de AutoCAD numai
când s-a emis prompterul ”Command:”. De exemplu:
(setq pt1 ‘(1.45 3.23))
(setq pt2 (getpoint ”\nIntroduceti un punct: ”))
(command ”line” pt1 pt2 ””)
Presupunând cã prompterul AutoCAD-ului este în aºteptare, aceastã suc-
cesiune de expresii seteazã o valoare pentru punctul ”pt1”, vã cere Dvs. va-

puncte ca intrare. Argumentele funcþiei command (prezentatã aici) pot fi


loare pentru ”pt2” ºi executã comanda LINE a AutoCAD-ului cu cele douã

ºiruri, reale, întregi sau puncte, dupã cum sunt aºteptate de comanda

cerea unui spaþiu (blanc) de la tastaturã. Apelul lui command fãrã argu-
AutoCAD în curs de execuþie. Un ºir nul (””) este echivalent cu introdu-

mente este echivalent cu introducerea unui CTRL/C de la tastaturã,


ducând la abandonarea celor mai multe dintre comenzile AutoCAD.

cunoscut în AutoCAD: *cancel*).


(CTRL/C înseamnã apãsarea simultanã a tastelor CTRL ºi C, cu efectul

Comenzile executate prin funcþia command nu sunt afiºate pe ecran dacã


variabila AutoCAD de sistem CMDECHO (accesibilã din setvar ºi getvar)
este fixatã pe zero. Funcþia command este metoda fundamentalã de acces
la comenzi AutoCAD din AutoLISP.
Funcþiile de introducere utilizator ”getxxx” (getangle, getint, getstring,
getpoint etc.) nu pot fi folosite în interiorul funcþiei command. O încer-
care de a face acest lucru va conduce la mesajul ”error: AutoCAD
rejected function” (”eroare: funcþie AutoCAD respinsã”) ºi la
178 Funcþii AutoLISP

lizator, emiteþi funcþia getxxx întâi, cum s-a ilustrat mai sus, sau plasaþi-o
încheierea cu eroare a funcþiei în curs. Dacã este necesarã o introducere uti-

între apeluri succesive ale funcþiei command.


Comenzile AutoCAD DTEXT ºi SKETCH citesc direct tastatura ºi digiti-

command. De asemenea, funcþia command nu va fi folositã pentru exe-


zorul (mouse-ul, de exemplu), deci nu pot fi folosite cu funcþia AutoLISP

cuþia comenzilor PLOT, PRPLOT sau SCRIPT.

predefinit PAUSE ca argument al funcþiei command, funcþia command


Dacã o comandã AutoCAD este în curs de execuþie ºi este întâlnit simbolul

va fi suspendatã pentru a se permite introducerea utilizator directã (sau


deplasare graficã interactivã - ”dragging”) Aceasta este similarã mecanis-
mului de pauzã ”backslash” de la menu-uri.

command, funcþia command va rãmâne suspendatã. Astfel, utilizatorul


Dacã emiteþi o comandã transparentã în timp ce este suspendatã o funcþie

doreºte în timpul unei pauze command. Pauza are efect pânã ce AutoCAD
poate face ‘ZOOM sau ‘PAN (observaþi prefixul apostrof) pe orice zonã

primeºte o intrare validã ºi nu mai este în execuþie nici o comandã trans-


parentã. De exemplu:
(command ”circle” ”5.5” pause ”line” ”5.5” ”7.5” ””)
începe comanda CIRCLE, fixeazã centrul la 5.5 ºi apoi aºteaptã introdu-
cerea interactivã (dragging) a razei cercului pe ecran. Când utilizatorul a
marcat punctul dorit (sau a introdus valoarea razei dorite de la tastaturã),
funcþia este reluatã, desenând o linie de la 5.5 la 7.5.

articol de menu este activ atunci când funcþia command se aflã în pauzã
Introducerea prin menu nu este suspendatã de o pauzã AutoLISP. Dacã un

pentru introducere, acea cerere de introducere poate fi satisfãcutã de menu.


Dacã doriþi sã fie suspendat ºi articolul de menu, puteþi pune un backslash

command cât ºi articolul de menu sunt reluate.


(”\”) în articolul de menu. Când este gãsitã o intrare validã, atât funcþia

Se impune sã remarcãm câteva lucruri:


 Simbolul PAUSE este în mod curent un ºir, constând dintr-un singur

bolul PAUSE, dar dacã funcþia command este invocatã dintr-un


backslash. Puteþi folosi un backslash direct, în loc de a folosi sim-
Capitolul 5 179

articol de menu, backslash-ul va suspenda nu funcþia command,


ci articolul de menu ce este citit. De asemenea, mecanismul de
pauzã poate cere o valoare diferitã de oprire în viitoarele versiuni
AutoLISP, astfel cã vã recomandãm folosirea simbolului PAUSE
în locul unui backslash explicit.
 Dacã PAUSE este întâlnit atunci când o comandã aºteaptã introducerea
unui ºir text sau o valoare Attribute, AutoCAD va aºtepta pentru
introducere numai dacã variabila sistem TEXTEVAL este setatã
non-zero. Altfel, valoarea simbolului PAUSE (un singur back-
slash) va fi luatã ca text ºi nu va produce o pauzã de introducere.
 Când funcþia command este în pauzã pentru introducere utilizator,
funcþia este consideratã încã ”activã”, astfel cã utilizatorul nu
poate introduce o altã expresie AutoLISP pentru evaluare.

Release 10 cond
(cond (<test1> <result1>...)...)
Serveºte ca funcþie condiþionalã primarã în AutoLISP
Aceastã funcþie acceptã orice numãr de liste ca argumente. Ea evalueazã
primul articol din fiecare listã (în ordinea datã) pânã ce unul dintre aceste
articole returneazã altã valoare decât nil. Atunci ea evalueazã acele expre-
sii care urmeazã ca sublistã dupã testul trecut cu succes ºi returneazã va-
loarea ultimei expresii din sublistã. Dacã existã numai o expresie în sub-

fapt, cond este funcþia condiþionalã principalã din AutoLISP, corespun-


listã (adicã <result> lipseºte), se returneazã valoarea expresiei <test>. De

zând funcþiei „case” din alte limbaje de programare.


De exemplu, aici se foloseºte cond pentru a efectua calculul unei valori
absolute:
(cond ((minusp a) (- a))
(t a)
)
Funcþia minusp (vezi) returneazã T dacã argumentul este un real sau un
întreg negativ, ºi nil în orice alt caz.
180 Funcþii AutoLISP

Dacã a a fost setat pe valoarea -10, va fi returnat 10. Cum s-a arãtat, cond
poate fi folositã ca o funcþie tip ”case”. E comunã utilizarea lui T ca ultima
expresie <test> (implicitã).

simbolul s, aceastã funcþie testeazã rãspunsul ºi returneazã 1 dacã el este


ªi acum, un alt exemplu simplu. Dându-se un ºir ca ”rãspuns utilizator” în

”Y” sau ”y”, 0 dacã este ”N” sau ”n” ºi nil în orice alt caz.
(cond ((= s ”Y”) 1)
((= s ”y”) 1)
((= s ”N”) 0)
((= s ”n”) 0)
(t nil)
)

Release 10 cons
(cons <noul_prim_element> <list>)
Constructor fundamental de listã
Funcþia preia un element (<noul_prim_element>) ºi o listã (<list>) ºi

(cons ‘a ‘(b c d))


returneazã lista, adãugând acel element la începutul ei. De exemplu:

(cons ‘(a) ‘(b c d))


returneazã (A B C D)
returneazã ((A) B C D)
De notat cã primul element poate fi un atom sau o listã.
Funcþia cons acceptã, de asemenea, un atom în locul argumentului <list>,
construind o structurã cunoscutã ca pereche cu punct (dacã vã place, s-ar
putea nota aceastã sintagmã prin ”pereche_cu_punct”). Când afiºeazã o

ment ale acesteia. Se poate folosi funcþia cdr pentru a returna al doilea
pereche cu punct, AutoLISP tipãreºte un punct între primul ºi al doilea ele-

(cons ‘a 2)
atom al perechii cu punct. Astfel:

(car (cons ‘a 2))


returneazã (A . 2)

(cdr (cons ‘a 2))


returneazã A
returneazã 2
Capitolul 5 181

O pereche cu punct este un tip special de listã; nu este acceptatã ca argu-

tipicã în funcþia ssget (vezi).


ment de cãtre unele funcþii care opereazã cu liste ordinare. Are utilizare

Release 10 cos
(cos <unghi>)
Returneazã cosinusul unui unghi dat în radiani
Aceastã funcþie returneazã cosinusul lui <unghi>, unde <unghi> este

(cos 0.0)
exprimat în radiani. De exemplu:

(cos pi)
returneazã 1.0
returneazã -1.0

Release 11 cvunit
(cvunit <valoare> <din> <în>)
Converteºte o valoare dintr-o unitate de mãsurã în alta
Argumentul <valoare> este numãrul de convertit. Poate fi, de asemenea, o
listã conþinând douã sau trei numere de convertit (punct 2D sau 3D).
Argumentul <din> este unitatea din care se face conversia iar <în> este
unitatea în care se face conversia. Argumentele <din> ºi <în> pot fi ori-
care dintre numele de unitãþi aflate în fiºierul ACAD.UNT.
Dacã totul este în regulã, atunci cvunit returneazã valoarea convertitã.

conversie este incompatibilã (de exemplu metri în grame), atunci cvunit


Dacã numele unitãþilor nu se aflã în fiºierul ACAD.UNT, sau dacã acea

(cvunit 2 ”minute” ”second”)


returneazã nil.

(cvunit 1 ”gallon” ”furlong”) returneazã 120.0


returneazã 120.0

(cvunit 1.0 ”inch” ”mm”)


(cvunit 1.0 ”acre” ”sq yard”) returneazã 4840.0
returneazã 25.4
182 Funcþii AutoLISP

(cvunit ‘(1.0 2.5) ”ft” ”in”) returneazã (12.0 30.0)


(cvunit ‘(1 2 3) ”ft” ”in”) returneazã (12.0 24.0 36.0)
NOTA:
Dacã aveþi câteva valori de convertit în aceastã manierã, este mai
eficient sã convertiþi 1.0 o datã ºi apoi sã folosiþi valoarea rezultatã
ca factor de scalare în calculele Dvs. Asta funcþioneazã bine pen-
tru orice conversie cu excepþia temperaturii, unde mai apare ºi o
valoare fixã ce se adunã.

Release 10 defun
(defun <simb> <lista argumente> (<expr>...)
Defineºte o funcþie
Funcþia defun defineºte o funcþie cu numele <simb> (de notat cã numele
funcþiei este quot-at ºi nu trebuie sã fie quot-at în mod explicit. (Cuvântul
quote este intraductibil în context LISP, ce sã vã fac! Din punct de vedere
literar, quote înseamnã ”citat”. Aici se pune un apostrof care precede un

într-adevãr un citat! A se vedea, bineînþeles, funcþia quote). Dupã numele


simbol ºi face ca simbolul sã fie luat ca atare ºi sã nu fie evaluat, deci, este

funcþiei urmeazã lista de argumente (posibil vidã), urmatã opþional de un


slash (”/”) ºi de numele unuia sau mai multor simboluri locale ale funcþiei.
Slash-ul trebuie sã fie separat de primul simbol local ºi de ultimul argu-
ment, dacã existã, prin cel puþin un spaþiu. Dacã nu sunt de declarat argu-
mente sau simboluri locale, trebuie dat câte set gol de paranteze dupã

(defun gogu (x y)...)


numele funcþiei. De exemplu:

(defun gogu (/ a b)...)


(funcþia preia douã argumente)

(defun gogu (x / temp)...)


(douã simboluri locale)

(defun gogu ()...)


(un argument ºi un simbol local)
(fãrã argument sau simbol local)
Dupã lista de argumente ºi simboluri locale se dau una sau mai multe
expresii de evaluat la execuþia funcþiei.
Capitolul 5 183

Când funcþia definitã este invocatã, argumentele sale vor fi evaluate ºi aso-
ciate simbolurilor argument. Simbolurile locale pot fi folosite în cadrul
funcþiei fãrã a schimba corelaþiile acestora la nivele exterioare. Funcþia va

funcþie au numai efecte laterale. Funcþia defun însãºi returneazã numele


returna rezultatul ultimei expresii evaluate. Toate expresiile anterioare din

funcþiei definite. De exemplu:


(defun adun10 (x)
(+ 10 x)
) ;returneazã ADUN10
(adun10 5) ;returneazã 15
(adun10 -7.4) ;returneazã 2.6
ºi:
(defun puncte (x y / temp)
(setq temp (strcat x ”...”))
(strcat temp y)
) ;returneazã PUNCTE
(puncte ”a” ”b”) ;returneazã ”a...b”
(puncte ”from” ”to”) ;returneazã ”from...to”
Vã atragem atenþia sã nu folosiþi niciodatã numele unei funcþii sau simbol
înglobat (”build-in”) ca <simb> deoarece aceasta va face inaccesibilã acea
entitate înglobatã.

Release 13 dictnext
(dictnext <nument> <simbol> [<reluare>])
Gãseºte urmãtorul articol într-un dicþionar
Argumentul <nument> este un nume de entitate care specificã un obiect
de dicþionar de cãutat. Argumentul <simbol> este un ºir care specificã
articolul din dicþionar. Nume valabile de simboluri sunt
ACAD_MLINESTYLE ºi ACAD_GROUP.
Când dictnext este utilizat repetat, el returneazã de fiecare datã urmã-
toarea intrare în dicþionarul specificat. Funcþia dictsearch (vezi) specificã
o intrare de cãutat. Dacã argumentul <reluare> este prezent ºi este
184 Funcþii AutoLISP

non–nil, dicþionarul este adus la primul articol ºi este gãsitã prima intrare.
Când nu mai sunt intrãri în dicþionar se returneazã nil. Intrãrile de
dicþionar ºterse nu sunt gãsite niciodatã.
Vezi funcþia namedobjdict pentru numele entitãþii master de dicþionar.
NOTA:
Odatã începutã traversarea unui dicþionar, specificarea unui alt
dicþionar face sã se piardã poziþia din dicþionarul original. Cu alte
cuvinte, este menþinut un singur iterator global pentru utilizarea
cu aceastã funcþie. Dacã este gãsitã o intrare, ea este returnatã ca
listã de pereche cu punct de tip cod DXF ºi valoare.

Release 13 dictsearch
(dictsearch <nument> <simbol> [<fixurm>])
Cautã un articol într-un dicþionar
Argumentul <nument> este un nume de entitate care specificã un obiect
de dicþionar de cãutat. Argumentul <simbol> este un ºir care specificã
articolul din dicþionar. Nume valabile de simboluri sunt
ACAD_MLINESTYLE ºi ACAD_GROUP.
Dacã dictsearch gãseºte o intrare pentru articolul dat, ea returneazã acea
intrare în formatul descris la dictnext (vezi). Dacã nu e gãsitã o astfel de
intrare, ea returneazã nil.
În mod normal, dictsearch nu are nici un efect asupra ordinii intrãrilor
gãsite de dictnext. Totuºi, dacã dictsearch reuºeºte, iar <fixurm> existã
ºi este non-nil, contorul dictnext al intrãrii este corectat astfel încât urmã-
torul apel la dictnext va returna intrarea de dupã cea returnatã de acest
apel la dictsearch.
Vezi funcþia namedobjdict pentru numele entitãþii master de dicþionar.
Capitolul 5 185

Release 12 dimx_tile ºi dimy_tile


(dimx_tile <cheie>) ºi (dimy_tile <cheie>)
Regãseºte dimensiunile unei zone (dale) în unitãþi de casetã de dialog
Funcþia dimx_tile returneazã lãþimea zonei (dalei), iar dimy_tile
înãlþimea ei. Pentru ambele funcþii argumentul <cheie> este un ºir care
specificã zona (dala). Argumentul <cheie> este sensibil la tipul de literã
(micã, MAJUSCULţ).
Coordonatele returnate sunt maximum permis de zonã; datoritã faptului cã
aceste coordonate pleacã de la zero, aceste funcþii returneazã cu unu mai

dimx_tile ºi dimy_tile sunt aranjate astfel încât sã poatã fi folosite cu


puþin decât dimensiunea totalã pe X sau pe Y (X-1 ºi Y-1). Funcþiile

funcþiile vector_image, fill_image ºi slide_image, care vã cer sã daþi


coordonate absolute de zone.

Release 10 distance
(distance <pt1> <pt2>)
Returneazã distanþa 3D între douã puncte
Aceastã funcþie returneazã distanþa 3D între punctele <pt1> ºi <pt2>. De

(distance ‘(1.0 2.5 3.0) ‘(7.7 2.5 3.0)) returneazã 6.7


exemplu:

(distance ‘(1.0 2.0 0.5) ‘(3.0 4.0 0.5)) returneazã 2.82843


Dacã unul sau ambele puncte sunt 2D, atunci distance ignorã coordonata
Z a oricãrui punct 3D furnizat ºi returneazã distanþa 2D dintre puncte, aºa
cum se proiecteazã aceasta pe planul de construcþie curent.

Release 12 distof
(distof <ºir> [<mod>])
Converteºte un ºir care reprezintã o valoare realã într-o valoare realã
186 Funcþii AutoLISP

Argumentul <mod> specificã unitãþile în care este formatat ºirul.


Valoarea trebuie sã corespundã valorilor admise de variabila AutoCAD de

omis, atunci distof foloseºte valoarea curentã a lui LUNITS.


sistem LUNITS, aºa cum se aratã în lista ce urmeazã. Dacã <mod> este

<mod> Format <ºir>


1 ªtiinþific
2 Zecimal
3 Ingineresc (în picioare ºi þoli zecimali)
4 Arhitectural (în picioare ºi þoli fracþionari)

Argumentul <ºir> trebuie sã fie un ºir interpretabil de cãtre distof prin


5 Fracþionar

argumentul <mod>. El poate fi exact de forma returnatã de funcþia rtos,

distof ºi rtos sunt complementare. Dacã-i daþi lui distof un ºir creat cu
sau într-o formã admisã de AutoCAD ca intrare de la tastaturã. Funcþiile

rtos, atunci se garanteazã cã distof va returna o valoare corectã, ºi reciproc


(presupunând cã valorile pentru <mod> sunt identice).
NOTA:
Funcþia distof trateazã modurile 3 ºi 4 ca identice. Mai exact,

care dintre aceste formate, atunci distof returneazã valoarea realã


dacã <mod> specificã unitãþi tip 3 sau 4, iar <ºir> este în ori-

corectã.

Release 12 done_dialog
(done_dialog [<statut>])
Finalizeazã o casetã de dialog
Trebuie sã apelaþi done_dialog dintr-o expresie de acþiune sau o funcþie
de apel (vezi action_tile). Dacã specificaþi argumentul opþional <statut>,
el trebuie sã fie un întreg pozitiv; acesta va fi returnat de cãtre start_dialog
în loc de a returna 1 pentru OK ºi 0 pentru Cancel. Înþelesul oricãrei valori
a lui <statut> mai mare de 1 depinde de aplicaþia Dvs.
Funcþia done_dialog returneazã o listã de punct 2D care exprimã poziþia
(X, Y) a casetei de dialog pãrãsite. Puteþi transfera acest punct unei funcþii
Capitolul 5 187

new_dialog pentru a redeschide caseta în poziþia selectatã de utilizator.


NOTA:
Dacã faceþi un apel al butonului a cãrui cheie este ”accept” sau

explicit done_dialog. Dacã nu se face asta, utilizatorul poate sã


”cancel” (uzual butoanele OK ºi Cancel), atunci trebuie sã apelaþi

se piardã în caseta de dialog. Dacã folosiþi butoanele standard de


ieºire, AutoCAD le manipuleazã automat. O acþiune AutoLISP

(sau definit de aplicaþie); altfel start_dialog returneazã valoarea


explicitã pentru butonul ”accept” trebuie sã specifice <statut>=1

implicitã, 0, care apare ca abandon.

Release 12 end_image
(end_image)
Încheie crearea imaginii casetei de dialog curente
Aceastã funcþie este complementara funcþiei start_image.

Release 12 end_list
(end_list)
Încheie procesarea listei casetei de dialog curente
Aceastã funcþie este complementara funcþiei start_list.

Release 10 entdel
(entdel <nument>)
ªterge entitãþi sau reface entitãþi ºterse anterior
Entitatea specificatã de <nument> este ºtearsã dacã se aflã în desenul
curent, ºi recuperatã (”undeleted”), reapãrând în desen, dacã ea a fost

jate din desen când este pãrãsit Editorul de Desene, astfel cã entdel le
ºtearsã anterior, în sesiunea curentã de desenare. Entitãþile ºterse sunt pur-
188 Funcþii AutoLISP

poate recupera numai în timpul sesiunii în care au fost ºterse. Funcþia ent-
del opereazã numai cu entitãþi principale; atributele ºi vertex-urile de

(pentru asta puteþi folosi funcþia command care poate activa comenzile
polilinii nu pot fi ºterse independent de entitãþile lor mamã principale

(setq e1 (entnext))
ATTEDIT sau PEDIT). De exemplu:

(entdel e1)
;E1 este numele primei entitãþi din desen

(entdel e1)
;ºterge entitatea E1
;recupereazã entitatea E1

Release 10 entget
(entget <nument> [<list_apl>])
Regãseºte datele de definiþie ale unei entitãþi
Entitatea cu numele <nument> este regãsitã în baza de date a
AutoCAD–ului ºi este returnatã sub forma unei liste conþinând datele sale
de definiþie (”forma canonicã”, dacã vreþi). Datele sunt codificate ca ”listã

assoc. Obiectelor din listã le sunt atribuite codurile de grup DXF ale
asociatã” LISP, din care puteþi extrage articole prin intermediul funcþiei

AutoCAD-ului pentru fiecare categorie a datelor de entitate (vezi anexa D).


Dacã adãugaþi argumentul <list_apl> (valabil de la Release-11), ca o listã
opþionalã de nume de aplicaþii înregistrate, este returnatã ºi lista cu datele
de entitate extinse asociate cu aplicaþiile specificate.
Pentru exemplul care urmeazã vom presupune cã:
- layerul curent este ”0”,
- tipul curent de linie este ”CONTINUOUS” (implicit),
- elevaþia curentã este zero (implicit),
- ”handle”-urile de entitãþi sunt dezactivate
Sã presupunem cã am desenat o linie prin secvenþa:
Command: LINE
From point: 1,2
To point: 6,6
To point: RETURN
Capitolul 5 189

Acum putem regãsi datele entitãþii Linie introducând:


Command: (setq a (entget (entlast)))
care va seta A ca egalã cu lista:
((-1 . <Entity name: 60000014>)
(0 . ”LINE”) ;Tip entitate
(8 . ”0”) ;Layer
(10 1.0 2.0 0.0) ;Punct start
(11 6.0 6.0 0.0) ;Punct final
)
NOTÃ:
Vã sfãtuim sã încercaþi efectiv aceastã secvenþã pe sistemul Dvs.
deoarece, depinzând de (sub)versiunea de AutoCAD cu care
lucraþi, puteþi obþine ºi alte coduri suplimentare, utile pentru
folosirea efectivã a listei.

zintã aceastã listã. Funcþia entmod descrisã mai jos o foloseºte pentru a
Articolul -1 de la începutul listei conþine numele entitãþii pe care o repre-

identifica ENTitatea de MODificat.


Perechile cu punct (vezi funcþia cons) individuale care reprezintã valorile
pot fi uºor extrase prin funcþia assoc, folosind cdr pentru evidenþierea lor
efectivã. Codurile pentru componentele unei entitãþi sunt cele folosite de
DXF ºi descrise în anexa D. Ca ºi cu DXF, articolele antet (header) de enti-
tate (culoare, tip de linie, adâncime (”thickness”), indicatorul de ”urmeazã-
atribute” ºi ”handle”-ul de entitate) sunt extrase numai dacã au valori non-
implicite. Spre deosebire de DXF, însã, câmpurile opþionale de definire a
entitãþilor sunt extrase ºi dacã sunt egale cu cele implicite ºi dacã nu sunt.
Intenþia cu care s-au adoptat aceste mijloace este de a uºura prelucrarea
datelor; programele pot asuma întotdeauna aceste câmpuri ca fiind
prezente, astfel cã algoritmii generali pot opera cu ele. Tot spre deosebire
de DXF, coordonatele X, Y ºi Z asociate sunt grupate împreunã într-o sin-
gurã listã de punct geometric, ca în (10 1.0 2.0 3.0), în loc de a apãrea ca
grupe separate 10, 20 ºi 30.

acestora. Convenþia este cã cdr-ul sublistei este valoarea grupului (pentru


De notat cã sublistele de puncte nu sunt perechi cu punct, cum sunt restul

detalii privind cdr, vezi funcþiile car ºi cdr). Din moment ce un punct este
190 Funcþii AutoLISP

listã de trei (sau patru) elemente. Cdr-ul grupului este lista ce reprezintã
o listã de douã (sau trei) numere reale, aceasta compune întregul grup ca

punctul, deci convenþia potrivit cãreia cdr returneazã întotdeauna valoarea


este pãstratã. Într-adevãr, (cdr (10 1.0 2.0 3.0)) returneazã (1.0 2.0 3.0).

sibile la subliste. Utilizarea lui assoc va garanta aceasta. Grupul -1 ce


Când scrieþi funcþii care prelucreazã aceste liste de entitãþi, faceþi-le insen-

conþine numele entitãþii, permite operaþiilor ce fac modificãri sã accepte


pur ºi simplu lista entitate ºi sã evite necesitatea de a pãstra numele

polilinii sau un set de atribute conþin un grup al cãrui cdr este numele de
entitãþii într-o structurã paralelã. O entitate SEQEND de la sfârºitul unei

subentitate, mergând înainte pânã la SEQEND ºi apoi folosind cdr-ul


entitate al antetului entitãþii. Aceasta permite ca antetul sã fie gãsit dintr-o

grupului -2 ca nume de entitate pentru gãsirea entitãþii principale asociate.


Urmãtorul exemplu ilustreazã o reprezentare mai complicatã a unei
entitãþi printr-o listã. Pentru acest exemplu vom presupune cã UCS-ul
curent este rotit cu 40 de grade în sens trigonometric în raport cu axa X a

legãturã cu UCS/WCS gãsiþi la funcþia trans).


WCS ºi cã sunt activate ”handle”-urile de entitãþi. (Explicaþii pertinente în

Command: LINETYPE
?/Create/Load/Set: SET
New entity linetype <BYLAYER>: DASHED
?/Create/Load/Set: RETURN
Command: COLOUR
New entity colour <BYLAYER>: BLUE
Command: LAYER
?/Make/Set/New/ON/OFF/Colour/Ltype/Freeze/Thaw: MAKE
New current layer <0>: ANNOTATION
?/Make/Set/New/ON/OFF/Colour/Ltype/Freeze/Thaw: RETURN
Command: TEXT
Start point or Align/Center/Fit/Middle/Right/Style: 2,2
Height <0.2000>: .3
Rotation angle <0>: 30
Text: La revedere!
Command: (setq ed (entget (setq e (entlast))))
Capitolul 5 191

În acest caz, E va fi setatã pe numele entitãþii Text iar ED pe lista care


urmeazã.
((-1 <Entity name: 6000053C>)
(0 . ”TEXT”) ;Tip entitate
(8 . ”ANNOTATION”) ;Layer
(6 . ”DASHED”) ;Tip linie
(62 . 5) ;Culoare
(5 . ”7E”) ;Handle
(10 2.0 2.0 0.0) ;Punct start
(40 . 0.3) ;Inaltime
(1 . ”La revedere!”)
(50 . 0.523599) ;Unghi rotatie (radiani)
(41 . 1.0) ;Factor ”width” text
(51 . 0.0) ;Unghi oblicitate text
(7 . ”STANDARD”) ;Stil text
(71 . 0) ;Indicator generare
(72 . 0) ;Aliniere text
(11 0.0 0.0 0.0) ;Punct aliniere
(210 0.0 -0.642788 0.766044) ;Vector direcþie extruziune
)

(Entity Coordinate System, vezi funcþia trans) acelei entitãþi. Pentru


Toate punctele asociate cu o entitate sunt exprimate relativ la ECS-ul

Punct, Linie, Linie 3D, Faþã 3D, Polilinie 3D, Reþea 3D ºi entitãþile de
Cotare, ECS-ul este echivalent cu WCS (punctele entitãþii sunt puncte
World). Pentru toate celelalte entitãþi, ECS-ul poate deriva din WCS ºi
direcþia de extruziune a entitãþii (grupul sãu 210). Când se lucreazã cu
entitãþi care au fost desenate folosind alte sisteme de coordonate decât WCS

punctele în WCS sau în UCS-ul curent folosind funcþia trans. Folosind


(ca Text-ul din exemplul de mai sus), puteþi avea nevoie sã convertiþi

(setq p (cdr (assoc 10 ed)))


entitatea Text din exemplul de mai sus:
va returna (2.0 2.0 3.5)
setând P pe punctul de start al textului, relativ la ECS-ul entitãþii Text. (De

din momentul folosirii lui entget). Acum:


notat cã punctul este returnat în aceastã manierã potrivit setãrii UCS-ului
192 Funcþii AutoLISP

(trans p e 0) va returna (2.0 -0.717668 3.96673)


Aceasta foloseºte E (numele entitãþii Text) drept cod de conversie ”din”
(”from”) ºi translateazã punctul de start al textului din ECS-ul Text-ului în
coordonate World.

Release 10 entlast
(entlast)
Returneazã numele ultimei entitãþi principale neºterse din desen
Aceastã funcþie returneazã numele ultimei entitãþi principale neºterse din

numele unei noi entitãþi care tocmai a fost adãugatã prin funcþia com-
baza de date a AutoCAD-ului. Ea este frecvent utilizatã pentru a obþine

mand. Entitatea nu trebuie neapãrat sã se afle pe ecran ºi nici într-un layer


”dezgheþat” (thawed) pentru a putea fi selectatã.

(setq e1 (entlast))
De exemplu:
;seteazã E1 pe numele ultimei entitãþi

(setq e2 (entnext e1)) ;seteazã E2 pe nil (sau pe un nume de


principale din desen

subentitate, atribut sau vertex)


Dacã în aplicaþia Dvs. doriþi sã obþineþi numele ultimei entitãþi principale

ºi apelaþi-o în locul lui entlast.


sau a ultimei subentitãþi neºterse, definiþi o funcþie cum este cea de mai jos

(defun lastend (/ a b)
(if (setq a (entlast)) ;obþine ultima entitate..
;..principalã
(while (setq b (entnext a)) ;dacã..
;..urmeazã subentitãþi,..
(setq a b) ;..cicleazã pânã nu mai sunt
)
)
a ;returneazã ultima (sub)entitate
)
Capitolul 5 193

Release 11 entmake
(entmake [<elist>])
Creeazã o nouã entitate în desen
Argumentul <elist> trebuie sã fie o listã de date de definiþie a unei entitãþi

conþinã toate informaþiile necesare pentru definirea entitãþii. Funcþia ent-


într-un format similar celui returnat de funcþia entget, adicã trebuie sã

make poate sã defineascã atât entitãþi grafice cât ºi negrafice. Dacã este
omisã vreuna din datele necesare, atunci entmake returneazã nil ºi enti-

layerul), entmake foloseºte datele implicite. Dacã entmake reuºeºte sã


tatea este respinsã. Dacã omiteþi anumite informaþii opþionale (cum ar fi

creeze noua entitate, ea returneazã lista de definiþie a entitãþii, altfel nil.

definiþie cu entget, de a le modifica ºi de a transfera datele schimbate


O metodã de creare a unei noi entitãþi este de a obþine datele sale de

funcþiei entmake. Înainte de a crea o nouã entitate, entmake verificã dacã

este propus un nume nou de layer, atunci entmake creeazã automat acest
sunt furnizate niºte nume valide de layer, de tip de linie ºi de culoare. Dacã

layer. Funcþia entmake verificã, de asemenea, numele de blocuri, numele


de stiluri de cotare ºi numele de shape-uri, dacã tipul entitãþii le solicitã.
Tipul de entitate (de exemplu CIRCLE sau LINE) trebuie sã fie primul sau

numai de numele entitãþii. Acesta este formatul returnat de entget. În ast-


al doilea câmp din <elist>. Dacã este al doilea câmp, el poate fi precedat

fel de cazuri, el ignorã numele de entitate, atunci când este creatã noua
entitate. Dacã <elist> conþine un handle de entitate, ºi acesta este ignorat.
Urmãtorul cod creeazã un cerc roºu centrat în (50,50) cu raza de 25:
(entmake
‘((0 . ”CIRCLE”) ;tip entitate
(62 . 1) ;culoare
(10 50.0 50.0) ;centru
(40 . 25.0) ;raza
)
)
Câmpurile opþionale pentru layer ºi tip de linie au fost omise, deci vor avea
194 Funcþii AutoLISP

valori implicite.
NOTA:
Obiectele create pe un layer îngheþat nu sunt regenerate pânã ce
layerul nu e dezgheþat.
Entitãþi complexe

conþinând atribute) poate fi creatã prin câteva apeluri entmake pentru a


O entitate complexã (o definiþie de bloc, o polilinie sau o referinþã de bloc

defini subentitãþile sale (atribute sau vertex-uri). Atunci când entmake

tru a obþine datele de definiþie. La fiecare apel al lui entmake se verificã


vede cã are de fãcut o entitate complexã, ea creeazã un fiºier temporar pen-

dacã existã fiºierul temporar: dacã existã, noile date sunt adãugate la fiºier.
Când definirea noii entitãþi este încheiatã (prin adãugarea entitãþii seqend
sau endblk), datele sunt reverificate, iar noua entitate este adãugatã la
desen. Încheierea unei definiþii de bloc (entmake pe un endblk) returneazã
numele blocului în loc de lista de date a entitãþii, aºa cum se face normal.
NOTA:
Cu entmake nu se pot crea obiecte de tip viewport.
Dacã datele primite sunt invalide pentru acel tip de entitate, entitatea este
respinsã, la fel ca ºi întreaga entitate complexã. O definiþie de bloc nu poate
fi imbricatã ºi nici nu poate sã se auto-refere. Totuºi, ea poate sã conþinã
referinþe la alte blocuri. Toate subentitãþile unei entitãþi complexe pot
exista atât în Model space cât ºi în Paper space, dar nu în ambele.
Un cod 66 de grup poate fi aplicat numai pentru obiecte inserate (însem-
nând ”atributele urmeazã”). Pentru entitãþile polilinii, codul 66 de grup
este forþat sã ia o valoare de 1 (însemnând ”vertex-urile urmeazã”), iar pen-
tru toate celelalte entitãþi ia valoarea implicitã 0. Singura entitate care
poate urma dupã o entitate polilinie este o entitate vertex.
Nici o porþiune de entitate complexã nu este afiºatã pe desen pânã ce nu i

plexe prin introducerea lui entmake fãrã argumente. Asta ºterge fiºierul
se încheie complet definirea. Puteþi abandona crearea unei entitãþi com-

temporar ºi returneazã nil.


Entitãþile block ºi endblk pot fi folosite pentru a crea o nouã definiþie de
Capitolul 5 195

bloc. Noile blocuri create sunt introduse automat în tabela de simboluri de


unde pot fi referite.
Aplicaþiile pot reprezenta poligoane cu un numãr mare arbitrar de laturi în
reþele (mesh) cu poli-feþe. Totuºi, structura de entitãþi a AutoCAD-ului
impune o limitã asupra numãrului de vertex-uri pe care le poate avea o
entitate cu feþe. Puteþi reprezenta mai multe poligoane complexe prin
divizare în elemente triunghiulare. AutoCAD reprezintã elementele tri-
unghiulare ca feþe cu patru vertex-uri ale cãror douã vertex-uri adiacente au
aceeaºi valoare. Muchiile acestora pot fi fãcute invizibile pentru a ascunde
elementele introduse artificial. Comanda PFACE executã automat aceastã
subdivizare, dar când aplicaþiile genereazã direct reþele cu poli-feþe, acele
aplicaþii trebuie sã le facã singure.
Numãrul de vertex-uri de pe fiecare faþã este parametrul cheie în acest pro-
ces de subdivizare. Variabila de sistem PFACEVMAX oferã aplicaþiei acest
numãr. Aceastã valoare poate fi numai cititã ºi este 4.
Atenþie! Când entmake creeazã un bloc, ea poate sã-l suprapunã peste un
bloc existent. Funcþia entmake nu verificã deloc conflictele de nume în

rificarea cu funcþia tblsearch pentru a vã asigura cã numele noului bloc


tabela de definiþie a blocurilor, astfel cã înainte de a o folosi, efectuaþi ve-

este unic. Totuºi, folosind entmake pentru a redefini blocuri anonime, aºa
cum se descrie mai jos, poate fi util.

Blocuri anonime
Tabela de definiþie a blocurilor dintr-un desen poate sã conþinã blocuri

cotare asociativã. Ele pot fi create ºi de entmake pentru scopurile proprii


anonime. Acestea sunt create ca suport pentru pattern-uri de haºurare ºi

aplicaþiei, pentru a conþine entitãþi pe care utilizatorul sã nu le poatã acce-


sa direct. Deºi de la Caragiale încoace am tot râs de anonimele semnate, în
cele ce urmeazã vom vedea cã blocurile anonime au totuºi un nume atribuit
de AutoCAD ºi instabil de la o sesiune de desenare la alta.
Numele (grupul 2) al unui bloc anonim este ”*Unnn.” unde nnn este un
numãr generat de AutoCAD. De asemenea, bitul de ordin inferior al ”Block

entmake creeazã un bloc anonim al cãrui nume începe cu * ºi al cãrui bit


type flag” (grupul 60) corespunzãtor unui bloc anonim este setat pe 1. Când
196 Funcþii AutoLISP

un nume. Caracterele ce urmeazã dupã * în ºirul nume transmis lui ent-


de bloc anonim este setat, AutoCAD îl trateazã ca bloc anonim ºi-i atribuie

make sunt ignorate. Dupã ce este creat blocul, entmake returneazã

entmake, ea returneazã numele dupã un apel reuºit al lui:


numele acestuia. Dacã se creeazã blocul prin apeluri multiple ale funcþiei

(entmake ”endblk”)
Ori de câte ori este deschis un desen, toate blocurile anonime nereferite

blocuri anonime nu sunt purjate. Puteþi folosi entmake pentru a crea o


(neinserate) sunt purjate din tabela de definiþie a blocurilor. Inserþiile de

anonim unei comenzi INSERT). Puteþi folosi entmake ºi pentru a redefi-


referinþã (inserþie) de bloc a unui bloc anonim (nu puteþi transfera un bloc

entmod.
ni blocul. Entitãþile dintr-un bloc (dar nu blocul însuºi) pot fi modificate cu

NOTA:
Deºi un bloc anonim referit (inserat) devine permanent, partea
numericã a numelui sãu poate sã se schimbe de la o sesiune de
desenare la alta. Aplicaþiile nu se pot baza pe faptul cã numele
blocurilor anonime ar rãmâne neschimbat.

Release 10 entmod
(entmod <elist>)
Modificã datele de definiþie ale unei entitãþi
Lui entmod i se transmite o listã <elist> în formatul returnat de entget
ºi actualizeazã informaþiile din baza de date a AutoCAD-ului privitoare la
entitatea al cãrei nume este specificat de grupul -1 din <elist>. Aºadar,

din regãsirea entitãþilor cu entget, modificarea listei definind o entitate (de


mecanismul prin care AutoLISP actualizeazã baza de date este constituit

notat cã funcþia subst este extrem de utilã pentru asta) ºi actualizând efec-
tiv baza de date cu entmod. De exemplu:
(setq en (entnext)) ;seteazã EN pe numele..
;..primei entitãþi din desen
(setq ed (entget en)) ;seteazã ED pe datele entitãþii EN
Capitolul 5 197

(setq ed
(subst (cons 8 ”0”)
(assoc 8 ed) ;schimbã grupul layer din ED..
ed ;..pe layerul ”0”
)
)
(entmod ed) ;modificã layerul entitãþii EN
;în desen
Funcþia entmod impune unele restricþii schimbãrilor pe care le va efectua.

(dacã doriþi asta, folosiþi entdel ºi ºtergeþi-o iar apoi creaþi alta cu funcþia
Mai întâi, un tip de entitate sau ”handle”-ul acesteia nu pot fi schimbate

command). Toate obiectele referite de lista entitãþii trebuie sã-i fie fãcute
cunoscute AutoCAD-ului înainte ca entmod sã fie executatã. Astfel,
numele stilului de text, al tipului de linie, Shape-ului, sau Block-ului tre-

tate cu entmod. O excepþie de la asta o constituie numele de layere - ent-


buie sã fi fost anterior definite, pentru a putea fi folosite într-o listã de enti-

mod creeazã un nou layer cu implicitãrile standard folosite de comanda


”LAYER New”, dacã într-o listã este numit un layer nedefinit anterior.

ness”), entmod acceptã valori întregi, convertindu-le la reale. Similar,


Pentru câmpurile de entitate care au valori date în numere reale (ca ”thick-

numãrul unei culori), entmod o trunchiazã ºi o converteºte la întreg.


dacã daþi o valoare întreagã în loc de realã pentru un câmp de entitate (ca

Funcþia entmod manifestã aceeaºi rigurozitate în verificarea corectitudinii


unei liste care i se remite, ca ºi comanda DXFIN în analiza datelor
dintr–un fiºier DXF. Dacã este detectatã o eroare serioasã, într-atât de

entmod returneazã lista care i s-a remis ca argument. Funcþia entmod nu


serioasã încât baza de date sã nu fie actualizatã, este returnat nil. Altfel,

poate schimba câmpuri interne cum sunt cele ale numelor de entitãþi din
grupul -2 al unei entitãþi seqend; încercãrile de a face astfel de schimbãri
sunt pur ºi simplu ignorate.
Când este actualizatã o entitate principalã, entmod modificã entitatea ºi–i
schimbã imaginea pe ecran (incluzând subentitãþile). Când entmod este
folositã pentru actualizarea unei subentitãþi (vertex-ul unei Polilinii sau
atributul unui Block), subentitatea este actualizatã în baza de date dar ea
198 Funcþii AutoLISP

nu este reafiºatã pe ecran. Dupã ce au fost fãcute toate modificãrile asupra

poate fi folositã funcþia entupd descrisã mai jos.


subentitãþilor unei entitãþi date, pentru actualizarea imaginii de pe ecran

NOTA (Release 11):


Nu puteþi folosi funcþia entmod pentru a modifica o entitate viewport.

(cu excepþia obiectelor viewport). Dacã folosiþi entmod pentru a modifica


Puteþi sã schimbaþi câmpul de vizibilitate al spaþiului entitãþii pe 0 sau 1

o entitate dintr-o definiþie de bloc, modificãrile afecteazã toate apariþiile


blocului în desen.
Înainte de a efectua un entmod pe entitãþi vertex, veþi citi sau veþi scrie
antetul entitãþii. Dacã cea mai recent prelucratã entitate polilinie diferã de
cea cãreia îi aparþine vertex-ul, poate sã se piardã informaþia de lãþime
(grupurile 40 ºi 41).
Atenþie! Puteþi folosi entmod pentru a modifica entitãþile dintr-o definiþie
de bloc, dar fãcând asta creaþi un bloc ce se auto-referã, fapt ce va produce
oprirea AutoCAD-ului.

Release 10 entnext
(entnext [<nument>])
Returneazã numele urmãtoarei entitãþi din desen

entitate al primei entitãþi neeliminate din baza de date. Dacã entnext este
Dacã este apelatã fãrã argumente, aceastã funcþie returneazã numele de

apelatã cu un argument nume de entitate, <nument>, ea returneazã


numele primei entitãþi neºterse care urmeazã dupã <nument> în baza de

de date, se returneazã nil. Funcþia entnext returneazã atât entitãþi princi-


date a AutoCAD-ului. Dacã nu mai existã nici o entitate urmãtoare în baza

pale cât ºi subentitãþi. Entitãþile selectate cu ssget sunt entitãþi principale;

acces ºi la aceste subentitãþi folosind entnext , care umblã simplu prin ele,
ele nu pot fi atribute de Block ºi nici vertex-uri de polilinie. Puteþi avea

pas cu pas. Când aþi obþinut un nume de subentitate, puteþi s-o prelucraþi

subentitate via entnext, puteþi gãsi ºi entitatea principalã ”mamã” (avan-


liber, ca ºi pe orice altã entitate (principalã). Dacã aþi obþinut un nume de
Capitolul 5 199

sând mai întâi) în aceasta cu entnext pânã la gãsirea primei (sub)entitãþi


cu numele seqend, ºi apoi extrãgând grupul -2 din acea entitate, care este

(setq e1 (entnext))
numele entitãþii principale. De exemplu:

(setq e2 (entnext e1)) ;E2 este numele entitãþii ce urmeazã dupã E1


;E1 este numele primei entitãþi din desen

Release 10 entsel
(entsel [<prompt>])
Cere utilizatorului sã selecteze o singurã entitate prin specificarea unui punct
Uneori, atunci când se lucreazã cu entitãþi, se doreºte selectarea unei
entitãþi simultan cu specificarea punctului prin care a fost selectatã. Astfel
de exemple se întâlnesc în AutoCAD la ”Object Snap” ºi la comenzile

selecþie. Funcþia entsel permite ºi programelor AutoLISP sã efectueze


BREAK, TRIM ºi EXTEND, când entitãþile sunt marcate în punctele de

aceste operaþii. Ea permite selectarea unei singure entitãþi, cerând pre-


cizarea unui punct cu ajutorul sistemului de ”pointing” (de exemplu cu
mouse-ul). Ea returneazã o listã al cãrei prim element este numele entitãþii
selectate, al doilea fiind coordonatele punctului folosit pentru indicarea
acesteia. Dacã se dã ºi un ºir pentru <prompt>, atunci acest ºir este afiºat
pentru a se cere efectiv utilizatorului selectarea entitãþii. Altfel, prompterul

ilustreazã utilizarea funcþiei entsel ºi lista returnatã:


folosit va fi, în mod implicit, ”Select objects:”. Urmãtorul dialog AutoCAD

Command: LINE
From point: 1,1
To point: 6,6
To point: RETURN
Command: (setq e (entsel ”\nAlegeti o entitate: ”))
Alegeti o entitate: 3,3
(<Entity name: 60000014> (3.0 3.0 0.0))
O listã în forma returnatã de ENTSEL poate fi transmisã ca atare AutoCAD-
ului ca rãspuns la orice cerere de selectare a unui obiect. Ea este tratatã de
AutoCAD ca ºi când i-ar fi fost indicatã prin pointing în punctul specificat.
200 Funcþii AutoLISP

Release 10 entupd
(entupd <nument>)
Actualizeazã imaginea unei entitãþi pe ecran

atribut al unui Block cu entmod, întreaga entitate complexã nu este actu-


Cum s-a spus mai sus, când este modificat un vertex al unei Polilinii sau un

alizatã pe ecran. Dacã, de exemplu, trebuie modificate 100 de vertex-uri ale


unei polilinii complexe, recalcularea ºi reafiºarea poliliniei pe mãsurã ce
este schimbat fiecare vertex s-ar face inacceptabil de lent.
Funcþia entupd poate fi folositã pentru a produce reafiºarea pe ecran a
unei Polilinii sau a unui Block modificate. Funcþia entupd este apelatã cu

ca ea sã fie numele generic - acesta va fi gãsit de entupd. Deºi entupd este


numele de entitate al oricãrei pãrþi a poliliniei sau blocului. Nu este nevoie

conceputã pentru polilinii ºi blocuri, ea poate fi folositã pentru orice enti-


tate. Ea regenereazã întotdeauna acea entitate pe ecran, inclusiv even-
tualele sale subentitãþi.
De exemplu, presupunând cã prima entitate din desen este o polilinie cu
câteva vertex-uri, atunci:
(setq e1 (entnext)) ;Seteazã E1 pe numele..
;..de entitate al poliliniei
(setq e2 (entnext e1)) ;Seteazã E2 pe primul vertex
(setq ed (entget e2)) ;Seteazã ED pe datele vertex-ului
(setq ed
(subst ‘(10 1.0 2.0)
(assoc 10 ed) ;schimbã poziþia vertex-ului din ED...
ed ;...pe punctul 1,2
)
)
(entmod ed) ;mutã vertex-ul în desen
(entupd e1) ;regenereazã entitatea polilinie E1
Capitolul 5 201

Release 10 eq
(eq <expr1> <expr2>)
Determinã dacã douã expresii sunt identice

tice, adicã dacã ele sunt asociate aceluiaºi obiect (prin setq, de exemplu).
Aceastã funcþie determinã dacã expresiile <expr1> ºi <expr2> sunt iden-

Funcþia eq returneazã T dacã cele douã expresii sunt identice ºi nil altfel.
Este folositã în mod tipic pentru a determina dacã douã liste sunt într-ade-
vãr identice. De exemplu, dându-se urmãtoarele atribuiri:
(setq f1 ‘(a b c))
(setq f2 ‘(a b c))
(setq f3 f2)

(eq f1 f3) returneazã nil (f1 ºi f3 nu sunt aceeaºi listã!)


atunci:

(eq f3 f2) returneazã T (f3 ºi f2 sunt exact aceeaºi listã)


De vãzut ºi funcþia equal mai jos.

Release 10 equal
(equal <expr1> <expr2> [<fuzz>])
Determinã dacã douã expresii sunt egale
Aceastã funcþie determinã dacã <expr1> ºi <expr2> sunt egale, mai pre-
cis, dacã ele sunt evaluate prin acelaºi lucru. De exemplu, dându-se urmã-
toarele atribuiri:
(setq f1 ‘(a b c))
(setq f2 ‘(a b c))
(setq f3 f2)

(eq f1 f3) returneazã T (f1 ºi f3 evaluate prin acelaºi lucru)


atunci:

(eq f3 f2) returneazã T (f3 ºi f2 sunt exact aceeaºi listã)


202 Funcþii AutoLISP

În timp ce douã liste care sunt equal pot sã nu fie eq, atomii care sunt
equal sunt întotdeauna eq. În plus, orice douã liste sau atomi care sunt eq
sunt întotdeauna equal.
Când se comparã douã numere reale (sau douã liste de numere reale, ca la
puncte), este important sã se realizeze cã cele douã numere ”identice” pot
diferi uºor dacã s-au folosit metode diferite de calcul al acestora. Aceasta
este o problemã obiºnuitã în Programare: mici diferenþe, la nivelul zeci-
malei a ”n”-a, fac ca douã numere exprimate în virgulã mobilã sã nu fie,
totuºi, identice! Se defineºte, în acest scop, un argument numeric opþional,

pot diferi ºi sã fie considerate încã equal. De exemplu, dându–se:


<fuzz>, care permite specificarea mãrimii prin care <expr1> ºi <expr2>

(setq a 1.123456)
(setq b 1.123457)

(equal a b)
atunci:

(equal a b 0.000001)
va returna nil
va returna T

Release 10 *error*
(*error* <ºir>)
O funcþie de manipulare a erorilor definibilã de utilizator
Dacã nu este nil, funcþia *error* este executatã ca funcþie ori de câte ori
apare o condiþie de eroare AutoLISP. Ei i se transmite unicul argument: un
ºir conþinând descrierea erorii. De exemplu:
(defun *error* (msg)
(princ ”eroare: ”)
(princ msg)
(terpri)
)

tipãri cuvântul ”eroare:” ºi descrierea erorii (datã în msg).


Aceastã funcþie va face exact ce face ºi analizorul AutoLISP de erori: va
Capitolul 5 203

Release 10 eval
(eval <expr>)
Returneazã rezultatul evaluãrii unei expresii AutoLISP
Returneazã rezultatul evaluãrii <expr>, unde <expr> este orice expresie
LISP. De exemplu, dându-se atribuirile:
(setq a 123)
(setq b ‘a)

(eval 4.0)
atunci:

(eval (abs -10))


returneazã 4.0

(eval a)
returneazã 10

(eval b)
returneazã 123
returneazã 123
De notat cã funcþia eval poate fi înlocuitã cu un simplu ”!”, cu acelaºi efect.
De exemplu, cu ”!(abs -10)” se obþine tot 10, ca mai sus)

Release 12 exit
(exit)
Forþeazã abandonarea aplicaþiei curente
Dacã este apelatã funcþia exit, ea returneazã mesajul de abandon quit/exit
ºi revine la prompterul AutoCAD.
Vezi ºi funcþia quit.

Release 10 exp
(exp <numãr>)
Returneazã valoarea lui e ridicatã la o putere
Aceastã funcþie returneazã e (baza logaritmilor naturali, provenitã din
iniþiala numelui marelui matematician Leonhard EULER (1707-1783); are
204 Funcþii AutoLISP

valoarea 2.71828182...) ridicat la puterea <numãr> (antilogaritm natural).

(exp 1.0)
Ea returneazã un real. De exemplu:

(exp 2.2)
returneazã 2.71828

(exp -0.4)
returneazã 9.02501
returneazã 0.67032

Release 12 expand
(expand <int>)
Alocã spaþiu de noduri prin cererea unui numãr specificat de segmente
Explicaþii despre gestionarea memoriei sunt date în secþiunea 3.8.

Release 10 expt
(expt <bazã> <putere>)
Returneazã un numãr ridicat la o putere specificatã
Aceastã funcþie returneazã argumentul <bazã> ridicat la argumentul
<putere>. Dacã ambele argumente sunt întregi, rezultatul este un întreg.

(expt 2 4)
Altfel rezultatul este un real. Exemplele sunt:

(expt 3.0 2.0)


returneazã 16
returneazã 9.0

Release 12 fill_image
(fill_image <x1> <y1> <wid> <hgt> <color>)
Deseneazã un dreptunghi umplut în zona de imagine a casetei de dialog
Funcþia fill_image trebuie sã fie folositã între apelurile start_image ºi
end_image. Parametrul <color> este un numãr de culoare AutoCAD sau
un numãr de culoare logicã din tabelul ce urmeazã.
Capitolul 5 205

Nr.culoare Mnemonicã ADI Descriere


-2 BGLCOLOR Culoarea de fundal curentã a ecranului
AutoCAD
-15 DBGLCOLOR Culoarea de fundal a casetei de dialog curente
-16 DFGLCOLOR Culoarea textului din caseta de dialog curentã
-18 LINELCOLOR Culoarea liniilor din caseta de dialog curentã
Primul colþ (stânga sus) al dreptunghiului este plasat în (x1,y1) iar al doilea
colþ (dreapta jos) este plasat la distanþa relativã (wid,hgt) de primul colþ
(<wid> ºi <hgt> trebuie sã aibã valori pozitive). Originea (0,0) este în

prin apelarea funcþiilor dimx_tile ºi dimy_tile.


colþul stânga sus al imaginii. Puteþi obþine coordonatele colþului stânga jos

Release 10 findfile
(findfile <numefiº>)
Cautã fiºierul specificat pe calea de bibliotecã AutoCAD
Aceastã funcþie permite programului utilizator sã caute un fiºier specificat
pe calea (”path”) de bibliotecã AutoCAD. (Calea de bibliotecã AutoCAD
este compusã din directorul curent, urmat de directorul ce conþine fiºierul
desen curent, urmat de directorul numit prin variabila ambientalã de sis-
tem ACAD).
Funcþia findfile nu face nici o prezumþie legatã de tipul sau extensia lui
<numefiº>; dacã doriþi una, puteþi s-o precizaþi. Dacã numele nu este ca-
lificat (adicã dacã nu are un prefix drive/director), AutoCAD îl cautã ºi
returneazã numele deplin calificat, sau nil dacã fiºierul nu este gãsit. Dacã
este furnizat un prefix drive/director, AutoCAD cautã numai în acel direc-

nat de findfile este potrivit pentru a fi folosit în funcþia open. (În exem-
tor (fãrã a cãuta pe vreo cale de bibliotecã). Numele deplin calificat retur-

plul de mai jos, folosim ”/” ca separator de prefix; pe sisteme PC-DOS/MS-


DOS, puteþi folosi fie ”/”, fie ”\\”).
De exemplu, sã presupunem cã:
- directorul curent este ”/acad” ºi conþine fiºierul ”abc.lsp”,
- editãm un desen în directorul ”/acad/drawings”,
206 Funcþii AutoLISP

- variabila ambientalã de sistem ACAD este setatã ca ”/acad/support”,


- fiºierul ”xyz.lsp” existã numai în directorul ”/acad/support”, ºi
- fiºierul ”nosuch” nu existã în nici unul dintre aceºti directori

(findfile ”abc.lsp”)
Atunci:

(findfile ”xyz.txt”)
va returna ”/acad/abc.lsp”

(findfile ”nosuch”)
va returna ”/acad/support/xyz.txt”
va returna nil

Release 10 fix
(fix <numãr>)
Returneazã conversia unui real în cel mai apropiat întreg mai mic
Aceastã funcþie returneazã conversia lui <numãr> într-un întreg. Aici
<numãr> poate fi fie un întreg, fie un real. Dacã este un real, acesta este
trunchiat la cel mai apropiat întreg prin eliminarea pãrþii fracþionare. De

(fix 3)
exemplu:

(fix 3.7)
returneazã 3

(fix -3.1)
returneazã 3

(fix -12.99)
returneazã -3

(fix (+ 0.5 aaa))


returneazã -12
returneazã valoarea rotunjitã a variabilei AAA

Release 10 float
(float <numãr>)
Returneazã conversia unui numãr într-un real

(float 3)
Argumentul <numãr> poate fi fie un întreg, fie un real. De exemplu:

(float 3.75)
returneazã 3.0
returneazã 3.75
Capitolul 5 207

Release 10 foreach
(foreach <nume> <list> <expr>...)
Evalueazã expresia pentru toþi membrii unei liste
Aceastã funcþie traverseazã lista <list>, atribuind fiecare element lui

fi specificat orice numãr de <expr>-esii. Funcþia foreach returneazã


<nume> ºi evalueazã fiecare <expr> pe fiecare element din listã. Poate

rezultatul ultimei <expr> evaluate. De exemplu:


(foreach n ‘(a b c) (print n))
este echivalentã cu:
(print a)
(print b)
(print c)
doar cã foreach returneazã rezultatul ultimei expresii evaluate.

Release 10 gc
(gc)
Forþeazã colectarea de resturi, care elibereazã nodurile nefolosite
Pentru alte detalii privind gestionarea memoriei, vezi secþiunea 3.8.

Release 10 gcd
(gcd <num1> <num2>)
Returneazã cel mai mare divizor comun a doi întregi
Aceastã funcþie returneazã cel mai mare divizor comun (engl: ”greatest
common denominator”) al numerelor <num1> ºi <num2>. <num1> ºi
<num2> trebuie sã fie întregi. Dacã AutoLISP-ul ar fi fost creat de un

(gcd 81 57) returneazã 3


român, aceastã funcþie s-ar fi numit ”cmmdc”. De exemplu:

(gcd 12 20) returneazã 4


208 Funcþii AutoLISP

Release 12 get_attr
(get_attr <cheie> (atribut>)
Regãseºte valoarea DCL a unui atribut de casetã de dialog
Argumentul <cheie> este un ºir care specificã zona (tile) ºi este sensibil la
tipul de literã (micã, MAJUSCULţ). Argumentul <atribut> specificã
numele atributului aºa cum este acesta specificat în descrierea sa DCL; el

utilizator sau a apelurilor funcþiei set_tile. Returneazã valoarea atributului


nu reflectã schimbãrile survenite în statutul zonei datoritã intrãrilor de la

ca ºir.

Release 12 get_tile
(get_tile <cheie>)
Regãseºte valoarea curentã de rulare a unei zone de casetã de dialog
Argumentul <cheie> este un ºir care specificã zona (tile) ºi este sensibil la
tipul de literã (micã, MAJUSCULţ). Returneazã valoarea zonei ca ºir.

Release 10 getangle
(getangle [<pt>] [<prompt>])
Aºteaptã introducerea unui unghi de cãtre utilizator ºi-l returneazã în radiani
Aceastã funcþie opreºte aplicaþia ºi aºteaptã introducerea de cãtre utilizator
a unui unghi. Argumentul <prompt> este un ºir opþional de afiºat ca
prompter iar <pt> este un punct opþional 2D în UCS-ul curent. Unghiul
returnat este exprimat în radiani, cu respectarea planului curent de con-
strucþie (planul XY al UCS curent, la ”elevaþia” curentã).
Puteþi specifica un unghi introducând un numãr în formatul curent de unghi-
uri al AutoCAD-ului. De notat cã, deºi unghiul poate fi specificat în grade sex-
agesimale, centesimale etc., aceastã funcþie returneazã unghiul în radiani.
Puteþi, de asemenea, ”arãta” AutoLISP-ului unghiul dorit pe cale graficã,
Capitolul 5 209

prin indicarea a douã puncte cu dispozitivul pointing (mouse), astfel încât


AutoCAD sã prezinte o linie elasticã de la primul punct la punctul curent
indicat, pentru a vã asista în vizualizarea unghiului (în maniera obiºnuitã,

al getangle, dacã este specificat, va fi considerat primul dintre cele douã


cum ar fi la comanda AutoCAD ”ROTATE”). Argumentul opþional <pt>

puncte, permiþându-vã sã ”arãtaþi” AutoLISP-ului unghiul, prin indicarea


graficã a celuilalt punct. (Puteþi da un punct 3D ca bazã, dar asta poate crea
confuzii, deoarece unghiul este mãsurat întotdeauna în planul curent de
construcþie - adicã laturile sale sunt proiectate, oricum, pe acest plan).
Iatã exemple de apeluri ale funcþiei getangle:
(setq ung (getangle))
(setq ung (getangle ‘(1.0 3.5)))
(setq ung (getangle ”\nCe orientare? ”))
(setq ung (getangle ‘(1.0 3.5) ”\nCe orientare? ”))
Nu poate fi introdusã o altã expresie LISP ca rãspuns la cererea getangle.
O încercare de acest gen se soldeazã cu mesajul Can’t reenter AutoLISP.
(Nu pot relansa AutoLISP). Vezi, de asemenea, getorient ºi initget.

Release 13 getcfg
(getcfg <numecfg>)
Returneazã datele aplicaþiei din secþiunea AppData a fiºierului ACAD.CFG

parametrului de gãsit. Dacã <numecfg> nu e valid, atunci getcfg


Argumentul <numecfg> este un ºir care denumeºte secþiunea ºi valoarea

returneazã nil. Argumentul <cfgnume> trebuie sã fie un ºir de forma:


”AppData/nume_apl/nume_sect/.../nume_param”
De exemplu, presupunând cã parametrul GrosPerete din secþiunea

(getcfg ”AppData/DateConstr/GrosPerete”)
AppData/DateConstr are valoarea 8, atunci:
returneazã 8
Vezi ºi funcþia setcfg.
210 Funcþii AutoLISP

Release 10 getcorner
(getcorner <pt> [<prompt>])
Aºteaptã introducerea celui de-al doilea colþ al unui dreptunghi
Funcþia getcorner returneazã un punct în UCS-ul curent, ca ºi getpoint.
În plus, getcorner stopeazã aplicaþia ºi cere ca argument un punct de bazã

ce utilizatorul mutã cursorul grafic pe ecran. De vãzut getpoint ºi initget


<pt>, desenând un dreptunghi elastic începând din acel punct, pe mãsurã

pentru detalii. Punctul de bazã este exprimat în raport cu UCS-ul curent.


Dacã daþi un punct 3D de bazã, coordonata sa Z este ignoratã, deoarece este
folositã altitudinea curentã drept coordonatã Z.
Ca rãspuns la cererea getcorner nu se permite introducerea altei expresii
AutoLISP.

Release 10 getdist
(getdist [<pt>] [<prompt>])
Aºteaptã introducerea unei distanþe de cãtre utilizator
Aceastã comandã stopeazã aplicaþia ºi aºteaptã introducerea unei distanþe
de cãtre utilizator. Parametrul <prompt> este un ºir opþional ce va fi afiºat
ca prompter iar <pt> este un punct de bazã 2D sau 3D opþional din
UCS–ul curent. Se poate specifica o distanþã introducând orice numãr care
se aliniazã la standardul curent de unitãþi al AutoCAD-ului. De notat cã, ºi
dacã sistemul curent este cel arhitectural anglo-saxon (cu unitãþi date în
picioare ºi þoli), funcþia returneazã totdeauna distanþa ca numãr real.
Se pot da, de asemenea, douã puncte, iar AutoCAD va returna distanþa din-
tre ele, desenând o linie elasticã de la primul punct la poziþia curentã a cur-

opþional <pt> al lui getdist, dacã este dat, este tratat ca primul punct din-
sorului grafic pentru a vã asista în vizualizarea distanþei. Argumentul

tre acestea douã. Iatã exemple cu getdist:


(setq dist (getdist))
(setq dist (getdist ‘(1.0 3.5)))
Capitolul 5 211

(setq dist (getdist ”Pana unde? ”))


(setq dist (getdist ‘(1.0 3.5) ”Pana unde? ”))

rerea getdist. Vezi ºi initget.


Nu e permisã introducerea unei alte expresii AutoLISP ca rãspuns la ce-

Release 10 getenv
(getenv <nume_var>)
Returneazã valoarea ºir atribuitã unei variabile ambientale de sistem
Argumentul <nume_var> este un ºir ce specificã numele unei variabile de
citit. Dacã aceastã variabilã nu existã, se returneazã nil.
De exemplu, dacã variabila de sistem ACAD este setatã ca ”c:\acad\work”
ºi dacã nu existã nici o variabilã cu numele NOSUCH, atunci:
(getenv ”ACAD”) va returna ”c:\acad\work”
(getenv ”NOSUCH”) va returna nil
De notat cã pe calculatoare care lucreazã sub sistemul de operare UNIX,
”ACAD” ºi ”acad” se referã la douã variabile ambientale diferite, deoarece
UNIX este sensibil la tipul de literã (engl: case-sensitive).

Release 12 getfiled
(getfiled <titlu> <implicit> <ext> <flags>)
Cere utilizatorului un nume de fiºier prin caseta standard ºi-l returneazã
Argumentul <titlu> dã eticheta casetei de dialog, <implicit> dã un nume
implicit de fiºier de folosit (care poate fi un ºir nul ””), iar <ext> este
extensia implicitã. Dacã <ext> este datã ca ºir nul (””), ea devine * (toate

funcþia getfiled va afiºa o imagine ”preview” în casetã. Argumentul


tipurile de fiºiere). Dacã este inclus tipul dwg în argumentul <ext>,

<flags> este un întreg (codificat pe biþi) care controleazã comportamentul


casetei de dialog. Pentru a seta mai mult de o condiþie odatã, însumaþi va-
lorile pentru a crea un argument <flags> cu valori între 0 ºi 15.
212 Funcþii AutoLISP

Valoare
”flag”
1 (bit 0) Fixaþi acest bit atunci când doriþi sã cereþi numele unui nou fiºier

(pentru open). În ultimul caz, dacã utilizatorul introduce numele


de creat. Nu-l setaþi atunci când cereþi un nume de fiºier existent

unui fiºier care nu existã, în partea de jos a casetei de dialog apare


un mesaj de eroare. Dacã bitul este setat, iar utilizatorul alege un
fiºier care existã, AutoCAD afiºeazã o casetã de alertã ºi oferã

2 (bit 1) Dezactiveazã butonul ”Type it”. Acest bit trebuie setat dacã get-
posibilitatea alegerii continuãrii sau abandonãrii operaþiei.

filed este apelatã în timp ce altã casetã de dialog este activã (altfel
forþeazã cealaltã casetã de dialog sã disparã). Dacã bitul nu este

acest buton, atunci caseta de dialog dispare, iar getfiled


setat, este activat butonul ”Type it”. Dacã utilizatorul selecteazã

returneazã 1.

sau nici una. Dacã acest bit nu e setat, getfiled acceptã numai
4 (bit 3) Lasã libertatea utilizatorului sã introducã o extensie arbitrarã,

extensia specificatã în argumentul <ext> ºi adaugã aceastã exten-

8 (bit 4) Dacã acest bit este setat iar bitul 0 nu e setat, getfiled executã o
sie la numele fiºierului, dacã utilizatorul nu o introduce în casetã.

cãutare de bibliotecã (vezi explicaþii la findfile) pentru numele de


fiºier introdus. Dacã gãseºte fiºierul ºi directorul pe calea de bi-
bliotecã, funcþia ignorã calea ºi returneazã numai numele de fiºier

într-un director diferit). Dacã acest bit nu e setat, getfiled


(ea nu ignorã calea dacã aflã cã un fiºier cu acelaºi nume se aflã

returneazã întregul nume de fiºier, incluzând numele cãii. Setaþi


acest bit dacã folosiþi o casetã de dialog pentru a deschide un fiºi-
er existent al cãrui nume doriþi sã-l includeþi în desen (sau în altã
bazã de date).

ci getfiled returneazã un ºir care specificã acel nume, iar dacã nu,
Dacã prin caseta de dialog se obþine un nume de fiºier de la utilizator, atun-

returneazã nil.
De exemplu, urmãtorul apel la getfiled afiºeazã o casetã de dialog
”Selectare Fisier Lisp” (probaþi-l!):
(getfiled ”Selectare Fisier Lisp” ”/acad/support/” ”lsp” 8)
Capitolul 5 213

Funcþia getfiled afiºeazã o casetã de dialog conþinând o listã de fiºiere


disponibile cu extensia specificatã. Puteþi folosi aceastã funcþie pentru a
cerceta diverse directoare ºi a selecta un fiºier existent sau unul nou.

Release 10 getint
(getint [<prompt>])
Aºteaptã introducerea unui întreg ºi returneazã acel întreg
Valoarea poate varia de la -32768 la +32767, iar <prompt> este un ºir
opþional de afiºat ca prompter. De exemplu:
(setq nr (getint))
(setq nr (getint ”Introduceþi un numãr: ”))

rerea getint. Vezi ºi initget.


Nu e permisã introducerea unei alte expresii AutoLISP ca rãspuns la ce-

Release 10 getkword
(getkword [<prompt>])
Cere un cuvânt cheie de la utilizator ºi-l returneazã
Lista cuvintelor cheie valabile este stabilitã prin funcþia initget. Funcþia
getkword returneazã cuvântul cheie care se potriveºte cu rãspunsul uti-
lizatorului, ca ºir. AutoCAD va repeta cererea dacã rãspunsul nu este un
cuvânt cheie corect. Introducerea nulã (ca Enter, de exemplu) returneazã
nil (dacã a fost prevãzutã introducere nulã). Se returneazã, de asemenea, nil
dacã nu a fost stabilit nici un cuvânt cheie. De exemplu:
(initget 1 ”Da Nu”)
(setq x (getkword ”Sigur? (Da sau Nu) ”))
va aºtepta rãspunsul utilizatorului ºi va seta simbolul X pe ”Da” sau ”Nu”,
potrivit rãspunsului dat. Dacã rãspunsul nu corespunde cu nici unul dintre

va repeta cererea. Citind ceeace se aratã la initget, veþi vedea cã rãspunsul


cuvintele cheie Da/Nu, sau dacã utilizatorul dã un rãspun nul, AutoCAD

Dvs. trebuie sã asigure furnizarea literei/literelor majuscule din cuvântul


214 Funcþii AutoLISP

cheie ales, în spiritul opþiunilor AutoCAD obiºnuite. Astfel, la cererea de


mai sus, rãspunsuri valide sunt ”d”, ”n”, ”D”, ”N”, ca ºi ”da”, ”nu”, dar nu
”dada” (!). Dacã se dã un rãspuns invalid, se primeºte mesajul (de eroare)
”Invalid option keyword.” ºi se aºteaptã altul, emiþându-se prompterul
(dacã existã).

rerea getkword. Vezi ºi initget.


Nu e permisã introducerea unei alte expresii AutoLISP ca rãspuns la ce-

Release 10 getorient
(getorient [<pt>] [<prompt>])
Aºteaptã introducerea unui unghi ºi returneazã acel unghi în radiani
În AutoLISP unghiurile sunt exprimate întotdeauna în radiani, cu direcþia
zero-radiani orientatã spre dreapta (est) ºi valoarea unghiului crescând în
sens trigonometric (anti-orar). Astfel, unele conversii pot sã nu convinã
dacã utilizatorul a selectat o bazã diferitã pentru zero-grade sau o direcþie
diferitã pentru creºterea unghiurilor, prin intermediul comenzii UNITS
sau a variabilelor de sistem ANGBASE sau ANGDIR.
Funcþia getorient este similarã cu funcþia getangle, decât cã va fi afectatã

getangle. Funcþia getangle va fi folositã atunci când trebuie datã o


de baza zero-grade sau de direcþia de creºtere a unghiurilor altfel decât

mãrime (cantitativã) de unghi de rotaþie (unghi relativ), în timp ce getori-


ent atunci când se cere obþinerea unei orientãri (unghi absolut).
Sã presupunem cã a fost folositã comanda UNITS a AutoCAD-ului pentru

creºterea unghiurilor. Tabela de mai jos aratã ce vor returna getangle ºi


a selecta o bazã zero-grade la 90 de grade (nord) ºi direcþia orarã pentru

getorient (în radiani) pentru valori reprezentative de unghiuri.


Introducere (grade) GETANGLE GETORIENT
0 0.0 1.5708
-90 1.5708 3.14159
180 3.14159 4.71239

getangle onoreazã direcþia de creºtere a unghiu-


90 4.71239 0.0
Cum se vede din tabelã,
Capitolul 5 215

rilor, dar ignorã baza zero-grade. Astfel, puteþi folosi getangle pentru a
obþine o mãrime de rotaþie pentru inserarea unui bloc, din moment ce

parte, getorient onoreazã ambele cerinþe, atât baza zero-grade, cât ºi


introducerea lui zero-grade returneazã întotdeauna zero radiani. Pe de altã

direcþia de creºtere a unghiurilor. De aceea, puteþi folosi getorient pentru


a obþine unghiul ce defineºte linia de bazã a unui articol Text. De exemplu,
reluând setarea UNITS de mai sus, orientarea liniei orizontale de bazã a
unui text va fi 90 de grade.
Ca ºi la getangle, unghiul returnat este exprimat în radiani, cu respectarea
planului curent de construcþie (vezi).

rerea getorient. Vezi ºi initget.


Nu e permisã introducerea unei alte expresii AutoLISP ca rãspuns la ce-

Release 10 getpoint
(getpoint [<pt>] [<prompt>])
Aºteaptã introducerea unui punct ºi-l returneazã
Parametrul <pt> este un punct de bazã 2D sau 3D opþional în UCS-ul
curent, iar <prompt> este un ºir opþional de afiºat ca prompter. Se poate
rãspunde, specificând un punct prin indicare cu cursorul grafic, sau dându-
i coordonatele în formatul UNITS curent. Dacã este prezent argumentul
opþional <pt>, atunci AutoCAD traseazã o linie elasticã de la acel punct la
poziþia curentã a cursorului grafic. De exemplu:
(setq p (getpoint))
(setq p (getpoint ”Unde? ”))
(setq p (getpoint ‘(1.5 2.0) ”Al doilea punct: ”))
Punctul returnat este exprimat potrivit UCS-ului curent.

rerea getpoint. Vezi ºi getcorner ºi initget.


Nu e permisã introducerea unei alte expresii AutoLISP ca rãspuns la ce-
216 Funcþii AutoLISP

Release 10 getreal
(getreal [<prompt>])
Aºteaptã introducerea unui numãr real ºi returneazã acel numãr real
Parametrul <prompt> este un ºir opþional de afiºat ca prompter. De exem-
plu:
(setq val (getreal))
(setq val (getreal ”Factor de scala: ”))

rerea getreal. Vezi ºi initget.


Nu e permisã introducerea unei alte expresii AutoLISP ca rãspuns la ce-

Release 10 getstring
(getstring [<cr>] [<prompt>])
Aºteaptã introducerea unui ºir ºi returneazã acel ºir
Dacã ºirul e mai lung decât 132 de caractere, se returneazã primele 132 de
caractere. Dacã se adaugã ºi parametrul boolean opþional <cr>, care nu
este nil (deci este orice afarã de nil), ºirul introdus poate conþine ºi blancuri
(trebuind astfel sã fie încheiat cu RETURN). Altfel, ºirul de intrare este
încheiat cu blanc sau RETURN. Parametrul <prompt> este un ºir opþio-
nal de afiºat ca prompter. De exemplu:
(setq s (getstring))
(setq s (getstring ”Care e numele mic al Dvs.? ”))
(setq s (getstring T ”Care e numele Dvs. intreg? ”))

uni (cuvinte cheie), se va folosi funcþia getkword (vezi).


Dacã ceea ce doreºte sã introducã utilizatorul este una sau mai multe opþi-

rerea getstring.
Nu e permisã introducerea unei alte expresii AutoLISP ca rãspuns la ce-
Capitolul 5 217

Release 10 getvar
(getvar <nume_var>)
Regãseºte valoarea unei variabile AutoCAD de sistem
Numele variabilei trebuie sã fie inclus între ghilimele. De exemplu, pre-
supunând cã raza de racordare (pentru FILLET) cel mai recent specificatã
a fost 0.25 unitãþi:
(getvar ”FILLETRAD”)
Dacã folosiþi getvar pentru a regãsi o variabilã de sistem necunoscutã pen-
va returna 0.25

curente poate fi gãsitã în manualele AutoCAD. Vezi ºi funcþia setvar.


tru AutoCAD, se va returna nil. Lista variabilelor de sistem AutoCAD

Release 10 graphscr
(graphscr)
Comutã ecranul în mod grafic

screen). Funcþia graphscr returneazã întotdeauna nil. Vezi ºi funcþia


Executã aceastã acþiune printr-o singurã acþiune (ca tasta <F1>, flip

textscr, care face comutarea inversã (grafic -> text).

Release 10 grclear
(grclear)
ªterge ecranul/viewport-ul curent
Aceastã funcþie ºterge ”viewport”-ul curent. Pe sistemele cu un singur mo-
nitor, ea comutã mai întâi din mod text în mod grafic. Zonele de
comandã/prompter, stare (informaþii, ca layer, etc.) ºi menu rãmân

funcþia redraw.
neschimbate. Conþinutul original al ecranul grafic poate fi restaurat cu
218 Funcþii AutoLISP

Release 10 grdraw
(grdraw <din> <în> <color> [<highlight>])
Traseazã un vector între douã puncte în ”viewport”-ul curent
Argumentele <din> ºi <în> sunt puncte 2D sau 3D (liste de douã sau trei

UCS-ul curent (explicaþii în legãturã cu UCS gãsiþi la funcþia trans).


numere reale) care specificã punctele de capãt ale vectorului relativ la

AutoCAD ajusteazã vectorul astfel încât sã încapã pe ecran. Vectorul este


desenat cu culoarea specificatã de argumentul întreg <color>, unde ”-1”
semnificã ”cernealã XOR”, care complementeazã orice este deja desenat ºi
intersectat de vector, auto-ºtergându-se dacã este suprapus în totalitate
peste el însuºi. Dacã întregul opþional <highlight> este dat ºi este non-nil,
vectorul este trasat la fel cum sunt trasate pe acel monitor obiectele selec-
tate (de obicei cu linie întreruptã). Dacã <highlight> este omis, sau e dat,
dar e zero, atunci se foloseºte modul obiºnuit de afiºare.

Release 10 grread
(grread [<track>] [<allkeys> [<tipcurs>]])
Citeºte valori de la orice dispozitiv de introducere AutoCAD
Funcþia grread vã permite sã citiþi direct (în timp real) de la dispozitivele
de intrare AutoCAD, urmãrind opþional dispozitivul indicator (de ex.
mouse-ul) pe mãsurã ce acesta este mutat. Numai comenzi foarte specia-

buie sã fie fãcute prin diversele funcþii „GETxxx”, ca getstring, getreal,


lizate pot impune astfel de lucruri - cele mai multe intrãri AutoLISP tre-

etc. Argumentul <track>, dacã e dat ºi este non-nil, autorizeazã returnarea


coordonatelor de la dispozitivul indicator potrivit miºcãrilor la care este
supus, fãrã a impune apãsarea vreunui buton în acest scop. Acesta este
mecanismul utilizat de AutoCAD pentru prezentarea deplasãrilor (”drag-
ging”).
Odatã cu Release-12 au mai fost adãugate douã argumente opþionale:
<allkeys> ºi <tipcurs>.
Capitolul 5 219

Semnificaþia lor este:


<allkeys> Biþii pot fi însumaþi pentru efecte combinate
1 (bit 0) Returneazã coordonatele modului ”drag”. Dacã acest bit este setat

buton sau a apãsa o tastã, atunci grread returneazã o listã unde


iar utilizatorul mutã dispozitivul indicator în loc de a selecta un

primul membru este un tip 5, iar al doilea este dat de coordo-


natele (x,y) ale dispozitivului indicator curent (mouse sau digiti-
zor). Aºa implementeazã ºi AutoCAD prezentarea deplasãrilor.
2 (bit 1) Returneazã valorile tuturor tastelor, inclusiv ale tastelor de
funcþii ºi sãgeþi, ºi nu mutã cursorul atunci când utilizatorul
apasã o tastã cu sãgeatã.
4 (bit 2) Utilizeazã valoarea transmisã în argumentul <tipcurs> pentru a

8 (bit 3) Nu afiºeazã mesajul ”error: console break” atunci când utiliza-


controla afiºarea cursorului.

<tipcurs> Trebuie ca <allkeys> sã fie 2 pentru a avea efect


torul apasã CTRL/C.

0 Afiºeazã cursorul normal


1 Nu afiºeazã nici un cursor (sau colimator)
NOTA:

apelului curent al fucþiei grread . În viitoarele versiuni AutoCAD


Argumentul <tipcurs> afecteazã tipul de cursor numai pe durata

Funcþia grread returneazã o listã al cãrei prim element este un cod care
pot fi adãugaþi ºi alþi biþi de control.

specificã tipul de intrare. Al doilea element al listei este un întreg sau un


punct, depinzând de tipul de intrare. Codurile pentru primul ºi al doilea
element din listã sunt urmãtoarele:
Primul element Al doilea
Valoare Tip intrare Valoare Descriere
2 Caracter tastaturã variabil cod caracter
3 Punct selectat punct 3D coordonatele ca punct
4 Articol menu ecran 0-999 nr. ”box” menu ecran
(din disp. ”pointing”) 1001-1999 nr. ”box” menu POP1
2001-2999 nr. ”box” menu POP2
3001-3999 nr. ”box” menu POP3
...ºamd, pânã la ...
16001-16999 nr. ”box” menu POP16
220 Funcþii AutoLISP

5 Dispozitiv ”pointing” punct 3D coordonate mod ”drag”


(returnate numai dacã al
doilea argument a fost dat ºi e non-nil)
6 Articol menu BUTTONS 0-999 nr. buton menu BUTTONS1
1001-1999 nr. buton menu BUTTONS2
2001-2999 nr. buton menu BUTTONS3
3001-3999 nr. buton menu BUTTONS4
7 Articol menu TABLET1 0 la 32767 nr. ”box” digitizat
8 Articol menu TABLET2 0 la 32767 nr. ”box” digitizat
9 Articol menu TABLET3 0 la 32767 nr. ”box” digitizat
10 Articol menu TABLET4 0 la 32767 nr. ”box” digitizat
11 Articol menu AUX 0-999 nr. buton menu AUX1
1001-1999 nr. buton menu AUX2
2001-2999 nr. buton menu AUX3
3001-3999 nr. buton menu AUX4
12 Buton pointer (urmeazã punct 3D coordonate punct
un cod retur tip 6 sau 11)

ce grread este în curs de execuþie abandoneazã programul AutoLISP


Introducerea unui CTRL/D (sau ESC începând cu AutoCAD-12) în timp

Orice altã intrare este transferatã direct lui grread, permiþându-i controlul
printr-o întrerupere de tastaturã (dacã <allkeys> nu a dezactivat aceasta).

complet asupra dispozitivelor de intrare.

ta de menu desfãºurabil, grread returneazã un cod tip 6 sau 11, dar într–un
Dacã utilizatorul apasã butonul de mouse din menu-ul ecran sau din case-

apel ulterior ea nu returneazã un cod tip 12: codul tip 12 urmeazã dupã
codul tip 6 sau tip 11 numai când butonul pointer este apãsat în timp ce se
aflã în zona graficã a ecranului. Este important sã fie ºtearsã data cod 12 din

buton auxiliar. Pentru a realiza aceasta, executaþi un grread imbricat ca în:


buffer înainte de a încerca o altã operaþie cu un buton pointer sau cu un

(setq code_12 (grread (setq code (grread))))


Aceastã secvenþã captureazã valoarea listei cod 12 ca intrare ce vine dina-
mic de la dispozitiv.
NOTA:

tate de AutoCAD, funcþia grread poate returna uneori rezultate


Întrucât intrãrile sunt tratate diferit pe diferite platforme supor-

neaºteptate. Dispozitivul ”pointing” pe platforme care folosesc un


mouse de sistem returneazã un cod 11, în loc de un cod 6.
Capitolul 5 221

Release 10 grtext
(grtext [<box> <text> [<highlight>]])
Scrie text pe linia de informaþii sau zonele de menu ecran
Funcþia grtext permite lui AutoLISP sã scrie în zonele text ale ecranului
grafic AutoCAD. Dacã este apelatã cu un numãr <box> cuprins între 0 ºi
cel mai mare numãr al unei casete (cuvânt) din zona menu minus 1, atun-
ci ea afiºeazã argumentul ºir <text> în acea poziþie din zona de menu
ecran (zona din dreapta a ecranului). Argumentul <text> este trunchiat

dacã e prea scurt. Dacã e dat ºi argumentul opþional <highlight>, grtext


dacã este prea lung pentru a încãpea în aceastã zonã ºi i se adaugã blancuri

prezintã video invers (când <highlight> este nenul) sau prezintã video
normal (când <highlight> este nul) textul din caseta desemnatã (de notat
cã inversarea video a unei casete produce revenirea la video normal a
casetei care, eventual, era prezentatã video invers). Când e scris în zona
menu, textul trebuie sã fie mai întâi scris normal ºi abia dupã aceea inver-
sat video. Acelaºi text care a fost scris iniþial video normal trebuie dat ºi
când se adaugã argumentul <highlight>, deci comanda trebuie datã de
douã ori, practic. Dacã nu se dã atenþie acestui lucru, chiar dacã acþiunea
va merge pe un monitor, poate sã nu meargã pe un altul.
De notat cã aceastã funcþie pur ºi simplu afiºeazã textul furnizat în zona
menu de pe ecran; ea nu schimbã articolul de menu existent (adicã cel de
dedesubt). Mai mult, pe anumite monitoare, articolul normal de menu

menu, astfel cã textul grtext poate sã revinã la textul articolului de menu


prezentat video invers funcþioneazã prin reafiºarea textului articolului de

atunci când utilizatorul selecteazã acea celulã din menu-ul ecran. Pe alte
monitoare, articolul de menu este rescris ori de câte ori se comutã ecranul
din mod grafic în mod text (cu tasta F1, de exemplu), sau atunci când

totuºi, textul grtext din zona de menu ecran rãmâne neschimbat pânã ce o
ecranul este ºters de un REDRAW sau REGEN, etc. Pe multe monitoare,

nouã paginã de menu o înlocuieºte pe cea anterioarã.


Dacã grtext este apelatã cu un numãr de ”box” -1, ea scrie textul în zona de
informaþii (linia de sus) de pe ecran. Lungimea acestei linii poate sã difere
de la monitor la monitor (cele mai multe permit minimum 40 de caractere,
222 Funcþii AutoLISP

grtext trunchiazã textul pentru a încãpea în spaþiul disponibil.


cu excepþia notabilã a vechiului IBM Colour Graphics Adaptor). Funcþia

Dacã se foloseºte un numãr de ”box” -2, grtext scrie textul în zona coordo-
natelor de pe linia de sus. De notat cã, dacã ele sunt puse în stare de actu-
alizare permanentã (cu CTRL/D, de exemplu), valorile scrise în acest
spaþiu vor fi înlocuite imediat ce pointerul transmite alt set de coordonate.
Pentru oricare dintre numerele ”box” -1 sau -2, eventualul argument
<highlight> este ignorat.
În sfârºit, grtext poate fi apelatã fãrã argumente pentru a restaura toate
zonele de text de pe ecran la starea standard.

Release 12 grvecs
(grvecs <vlist> [<trans>])
Deseneazã vectori multipli pe ecranul grafic

necesitatea folosirii lui grdraw care este mai greoaie atunci când este nece-
Aceastã funcþie a fost introdusã odatã cu AutoCAD-12 pentru a elimina

sarã trasarea a mai mult de o singurã linie. Argumentul <vlist> este o listã
de vectori care conþine o serie de întregi opþionali pentru culoare ºi liste de
câte douã puncte. Argumentul opþional <trans> este o matrice de trans-
formare pe care o puteþi folosi pentru a schimba amplasarea sau proporþia
vectorilor pe care îi definiþi în listã. Aceasta este o matrice de patru liste a
patru reali fiecare.
Formatul pentru <vlist> este:
([<culoare>] <din1> <în1> <din2> <în2> ...)
Valoarea culorii se aplicã pe toþi vectorii ce urmeazã pânã ce <vlist> speci-
ficã altã culoare. Culorile AutoCAD sunt în gama 0-255. Dacã valoarea
culorii este mai mare de 255, vectorii ce urmeazã sunt trasaþi cu culoare
XOR, adicã ei vor complementa tot ceea ce acoperã, sau vor ºterge pãrþile
din ei înºiºi pe care le reacoperã. Opþiunea de highlight depinde de dispo-
zitivul de afiºare. Cele mai multe dintre driverele de ecran prezintã ele-
mentele highlight prin linie întreruptã, dar unele folosesc pentru asta o
culoare distinctã.
Capitolul 5 223

O pereche de liste punct geometric <din> ºi <în> dã capetele vectorilor,


exprimate în UCS-ul curent. Acestea pot fi puncte bidimensionale sau

fel apelul lui grvecs eºueazã.


tridimensionale. Trebuie sã transferaþi aceste puncte perechi, perechi, alt-

apelul lui grvecs reuºeºte, se returneazã nil.


AutoCAD reteazã vectorii astfel încât sã se potriveascã cu ecranul. Dacã

Urmãtorul cod traseazã cinci linii verticale pe ecranul grafic, fiecare cu


culoare diferitã:
(grvecs ‘(1 (1 2) (1 5) ;trage linie rosie intre (1,2) si 1,5)
2 (2 2) (2 5) ;trage linie galbena intre (2,2) si (2,5)
3 (3 2) (3 5) ;trage linie verde intre (3,2) si (3,5)
4 (4 2) (4 5) ;trage linie bleu intre (4,2) si (4,5)
5 (5 2) (5 5) ;trage linie albastra intre (5,2) si (5,5)
)
)
Urmãtoarea matrice reprezintã o scarã uniformã de 1.0 ºi o translaþie de 5.0,
5.0, 0.0. Dacã aceastã matrice este aplicatã pe lista de vectori precedentã, ei
vor deplasaþi cu 5.0, 5.0, 0.0.
‘((1.0 0.0 0.0 5.0)
(0.0 1.0 0.0 5.0)
(0.0 0.0 1.0 0.0)
(1.0 0.0 0.0 1.0)
)
Vezi ºi funcþia nentselp pentru informaþii suplimentare privind matricele
de transformare.

Release 10 handent
(handent <handle>)
Returneazã un nume de entitate pe baza handle-ului sãu
Un nume de entitate se poate schimba de la o sesiune de editare la alta.
Acest lucru se întâmplã deoarece, practic, noi nu le acordãm vreun nume,
ci lãsãm AutoCAD-ul s-o facã, deci nu putem avea nici pretenþii... Dacã,
224 Funcþii AutoLISP

însã, hotãrâm sã le acordãm nume fiecãreia, vom folosi comanda HAN-


DLES. Numele de ”handle” al entitãþilor rãmâne acelaºi pe toatã durata de

ment <handle>, funcþia handent va returna numele entitãþii, asociat cu


existenþã a acelei entitãþi. Dându-se un ºir ”handle” de entitate ca argu-

acel ”handle” în sesiunea curentã de editare. (Când vedeþi ”handle”, citiþi


”mâner” ºi totul va fi clar). Odatã ce numele entitãþii a fost obþinut, el poate
fi folosit pentru orice manipulare a entitãþii bazatã pe funcþiile orientate pe
entitãþi. De exemplu:

poate returna: <Entity name: 60004722> într-o sesiune particularã de


(handent ”5A2”)

editare. Utilizat cu aceeaºi entitate, dar în altã sesiune, acelaºi apel poate
returna un nume diferit de entitate. În fiecare caz este referitã aceeaºi enti-
tate; ”handle”-ul sãu rãmâne acelaºi, în timp ce numele entitãþii poate sã
difere de la o sesiune la alta. (De observat ”numele” hexazecimal al ”han-
dle”-ului).
Dacã nu se folosesc ”handle”-uri în desen, sau dacã handent este folositã

tate din desenul curent, se returneazã nil. Funcþia handent va returna ºi


cu un nume invalid de ”handle”, sau cu un ”handle” nefolosit de nici o enti-

(”undelete”), dacã doriþi, folosind funcþia entdel (vezi).


entitãþile care au fost ºterse în sesiunea curentã; le puteþi astfel recupera

Release 13 help
(help [<fishelp> [<topicã> [<comandã>]]])
Invocã facilitatea de HELP pe orice platformã
Argumentul <fishelp> este un ºir care dã un fiºier help. Dacã daþi un fiºi-
er Help AutoCAD (.AHP), funcþia help foloseºte vizualizatorul Help
AutoCAD pentru a afiºa conþinutul acelui fiºier. Dacã daþi un fiºier Help
Windows (.HLP), funcþia help va folosi programul WinHelp pentru a-l
afiºa. Dacã argumentul <fishelp> este un ºir vid (””) sau e omis, AutoCAD
foloseºte fiºierul implicit Help AutoCAD. Argumentul <topicã> este un
cuvânt cheie care dã topica afiºatã iniþial de facilitatea HELP. Dacã argu-
mentul <topicã> este un ºir vid (””), facilitatea HELP afiºeazã partea
Capitolul 5 225

introductivã a fiºierului help. Argumentul <comandã> este un ºir care dã


starea iniþialã a ferestrei Help, aºa cum este descrisã în tabela de mai jos.
ªir Descriere
HELP_CONTENTS Afiºeazã prima topicã din fiºierul Help
HELP_HELPONHELP Afiºeazã indicaþii privind utilizarea lui Help
HELP_PARTIALKEY Afiºeazã dialogul ”Search” folosind ºirul trans-
mis ca topicã a cãutãrii iniþiale
Dacã specificaþi un fiºier Help Windows, argumentul <comandã> poate fi
ºi un ºir folosind argumentul Command al funcþiei WinHelp() aºa cum este
definitã de WinHelp API în kit-ul de dezvoltare a sistemului Microsoft
Windows.
Singura condiþie de eroare pe care o returneazã funcþia help cãtre aplicaþie

eroare sunt raportate utilizatorului printr-o casetã de dialog. Funcþia help


este existenþa fiºierului specificat de <fishelp>. Toate celelalte condiþii de

help fãrã nici un argument, ea returneazã un ºir vid (””) dacã reuºeºte ºi
returneazã ºirul <fishelp> dacã reuºeºte ºi nil altfel. Dacã folosiþi funcþia

nil altfel.
Urmãtorul cod apeleazã help pentru a afiºa informaþii pentru topica
COMANDA_MEA din fiºierul ACHELP.AHP:
(help ”achelp.ahp” ”comanda_mea”)
Vezi ºi funcþia setfunhelp.

Release 10 if
(if <expr_test> <expr_atunci> [<expr_altfel>])
Evalueazã expresii în mod condiþional
Aceastã funcþie evalueazã expresii în mod condiþional. Dacã <expr_test>
nu este nil, atunci este evaluatã expresia <expr_atunci>, altfel este evalu-

nalã. Funcþia if returneazã valoarea expresiei selectate; dacã <expr_altfel>


atã expresia <expr_altfel>. Ultima expresie (<expr_altfel>) este opþio-

lipseºte ºi <expr_test> este nil, atunci if returneazã nil. De exemplu:


(if (- 1 3) ”YES!!” ”no.”) returneazã ”no.”
226 Funcþii AutoLISP

(if (- 2 (+ 1 1)) ”YES!!”)


(if (- 2 (+ 1 4)) ”YES!!”)
returneazã ”YES!!”
returneazã nil

Release 10 initget
(initget [<biþi>] [<ºir>])
Stabileºte cuvintele cheie valabile la urmãtorul apel de funcþie de introducere date

funcþie GETxxx. Practic, funcþiile asupra cãrora are efect sunt: getint, get-
Aceastã funcþie stabileºte felurite opþiuni pentru a fi folosite de urmãtoarea

dist, getangle, getorient, getpoint, getcorner, getkword, entsel,


nentsel ºi nentselp (ultimele douã începând cu Release 11).
Arbumentul <biþi> este un întreg codificat pe biþi care permite sau inter-
zice anumite tipuri de introduceri aºteptate din partea utilizatorului.
Argumentul <ºir> defineºte o listã de cuvinte cheie. Acestea sunt verifi-
cate la urmãtorul apel de funcþie de introducere date atunci când utiliza-
torul nu introduce tipul aºteptat de date (de exemplu, un punct pentru get-
point) Dacã utilizatorul introduce un cuvânt cheie din listã, funcþia
returneazã acel cuvânt cheie ca rezultat ºir. Aplicaþia poate testa acel
cuvânt cheie ºi poate executa acþiuni asociate cu fiecare dintre acestea.
Dacã introducerea efectuatã de utilizator nu este de tipul cerut ºi nu cores-

cerea. Valorile de bit ale lui initget ºi cuvintele cheie se aplicã numai apelu-
punde unui cuvânt cheie, AutoCAD cere utilizatorului sã repete introdu-

lui imediat urmãtor al unei funcþii de introducere dintre cele enumerate.


Funcþia initget returneazã întotdeauna nil. Dacã initget seteazã un bit de
control iar aplicaþia apeleazã o funcþie de introducere utilizator pentru care
bitul nu are nici o semnificaþie, bitul este ignorat. Biþii pot fi însumaþi în
orice combinaþie pentru a forma o valoare cuprinsã între 0 ºi 255. Dacã nu
este furnizat nici un argument <biþi>, este consideratã valoarea zero (nici
o condiþie). Dacã introducerea din partea utilizatorului eºueazã în privinþa
uneia sau mai multor condiþii (ca în cazul introducerii lui zero atunci când
nu sunt acceptate valori zero), AutoCAD afiºeazã un mesaj ºi cere utiliza-
torului sã încerce din nou.
Capitolul 5 227

Argumentul opþional <biþi> este un întreg cu valorile:


<biþi> Efect
1 (bit 0) Dezactiveazã intrare nulã
2 (bit 1) Dezactiveazã valori zero
4 (bit 2) Dezactiveazã valori negative
8 (bit 3) Nu verificã limitele, chiar dacã e activã LIMCHECK
16 (bit 4) Returneazã puncte 3D în loc de puncte 2D
32 (bit 5) Foloseºte linie întreruptã pentru linia sau caseta elasticã.

Interzice introducerea coordonatei Z pentru funcþia get-


Dacã variabila de sistem POPUPS este 0, AutoCAD ignorã acest bit

dist; permite aplicaþiei sã se asigure cã aceastã funcþie returneazã


64 (bit 6)

o distanþã 2D (Release-12)
128 (bit 7) Permite introduceri arbitrare, ca ºi când ar fi cuvinte
cheie, onorând în primul rând orice alt bit de control ºi cuvânt
cheie listat. Acest bit preia întâietatea asupra bitului 0; dacã sunt
setaþi biþii 7 ºi 0 iar utilizatorul apasã <Enter>, atunci se
returneazã un ºir nul (Release-12)
Dacã vã gândiþi cã un numãr în baza 2 are ordinele de mãrime legate de
puterile lui 2 (adicã 2 este 10, 8 este 1000, etc.), veþi înþelege de ce primul
argument se cheamã <biþi>. Practic, fiecare setare a acestui parametru pe
una din valorile de mai sus duce la setarea corespunzãtoare a unui singur
bit pe 1 (de exemplu, 8 seteazã pe 1 bitul al patrulea dinspre dreapta).

tru a exprima combinaþii de opþiuni ale lui initget, cãpãtând (prin


Pornind de aici, vom adãuga cã se pot combina dupã voie aceste setãri pen-

însumare) valori de la 0 la 255. Se precizeazã în documentaþia originalã


AutoLISP cã se preconizeazã utilizarea viitoare ºi a altor biþi, aºa încât se
recomandã evitarea folosirii lor la întâmplare. De fapt, odatã cu versiunea
11 s-a introdus folosirea biþilor 6 ºi 7.
Exemplu:
(initget (+ 1 2 4))
(setq varsta (getint ”Ce varsta aveti? ”))
va obþine vârsta utilizatorului, repetând cererea în mod automat dacã uti-
lizatorul introduce o valoare nulã, o valoare zero, sau un rãspuns nul
(Enter).
228 Funcþii AutoLISP

Dacã nu se furnizeazã nici un argument <biþi>, se presupune valabilã va-


loarea zero (nici o condiþie). Valorile de control speciale sunt onorate
numai de acele funcþii „GETxxx” pentru care au sens, cum se aratã în
tabela de mai jos.
Valoarea de control 32 este onoratã de funcþiile getpoint, getcorner, get-
dist, getangle ºi getorient când s-a furnizat un punct de bazã, ºi le
impune trasarea de linii elastice sau dreptunghiuri de selecþie întrerupte
(sau altfel scoase în evidenþã) de la punctul de bazã. Dacã variabila de sis-

utilizator avansatã (AUI, în englezã), AutoCAD va ignora acest bit initget.


tem POPUPS este zero, indicând cã driverul de display nu suportã interfaþa

Onoreazã
cuvinte
Funcþie cheie Valori biþi de control .

Non Non Non Fãrã Foloseºte Distanþã Intrare


nul zero negativ limite liniuþe 2D arbitrarã

getint
(1) (2) (4) (8) (32) (64) (128)

getreal +•
+• +• +• +• +•

getdist +•
+• +• +• +•

getangle +•
+• +• +• +• +• +•

getorient +•
+• +• +• +•

getpoint +•
+• +• +• +•

getcorner+•
+• +• +• +•

getkword +•
+• +• +• +•

entsel
+• +•

nentsel +•
+•

nentselp +• .

Specificarea cuvintelor cheie


Argumentul <ºir> este interpretat potrivit urmãtoarelor reguli:

”Lungime Grosime Inaltime” defineºte trei cuvinte cheie.


- Cuvintele cheie individuale sunt separate cu blancuri. De exemplu,

- Fiecare cuvânt cheie poate sã conþinã numai litere, cifre ºi semnul


minus (-)
- Abrevierile sunt opþionale, fiind prevãzute douã moduri de specificare a lor:
- Porþiunea cerutã este scrisã cu majuscule ºi restul cu literã micã.
Caracterele majuscule se pot afla oriunde în cuprinsul cuvântului
(de exemplu ”LAtime”, ”eXit”, sau ”toP”)
Capitolul 5 229

- Întregul cuvânt este scris cu majuscule, urmat de o virgulã ºi repetarea


porþiunii cerute (de exemplu ”LAtime,LA”). Caracterele cuvântu-
lui cheie trebuie sã includã în acest caz prima literã a cuvântului
cheie, ceea ce înseamnã cã ”EXIT,X” nu este admis.
A doua metodã de abreviere este introdusã în scopul dezvoltãrii aplicaþiilor
în limbi strãine (de englezã!) în care transpunerea literã mare/micã poate fi
dificilã sau imposibilã (oare cum ar fi în chinezã?). În oricare dintre
metode, lungimea porþiunii cerute este datã de numãrul de caractere care
trebuie sã se potriveascã exact cu ceea ce se introduce ca rãspuns, pentru a
fi recunoscut ca opþiune exprimatã de cuvântul cheie. Lucrurile sunt mai
simple decât par. Filozofia chestiunii este exact cea pe care o întâlnim când
lucrãm cu AutoCAD: identificarea opþiunilor dintr-un ºir oferit de opþiuni
(gândiþi-vã la cele ale comenzii ZOOM) printr-un minim de caractere nece-
sar a fi introduse, care sã permitã recunoaºterea fãrã echivoc a opþiunii
dorite. De exemplu:
”LTYPE,LT” ºi ”LType”
sunt specificaþii echivalente. Fiecare aratã cã se pot introduce ca valabile
rãspunsurile ”LTYPE”, ”LTYP”, LTY”, sau ”LT” (ca ºi ”ltype”, ”ltyp”,
”lty”, sau ”lt”), ºi cã nu sunt acceptate ”L” sau ”l” (ca insuficiente) sau
”LTSCALE” sau ”LTYPEX” (ca nepotrivite).
Dacã <ºir> aratã întregul cuvânt cheie în caractere majuscule sau mici
fãrã nici o virgulã dupã partea cerutã, atunci AutoCAD recunoaºte cuvân-
tul cheie numai la introducerea sa integralã.
Fie funcþia getnum definitã pe loc de cãtre utilizator:
(defun getnum (/ x)
(initget 1 ”Pi Doi-pi”)
(setq x (getreal ”Pi/Doi-pi/<numar> ”))
(cond ((eq x ”Pi”) pi)
((eq x ”Doi-pi”) (* 2.0 pi))
(T x)
))
Aici, initget inhibã rãspunsul nul (Enter sau RETURN) ºi stabileºte o listã
de douã cuvinte cheie, ”Pi” ºi ”Doi-pi”. Este folosit apoi getreal pentru a
obþine un numãr real, emiþându-se prompterul ”Pi/Doi-pi/<numar>:”,
230 Funcþii AutoLISP

numãr, acel numãr este returnat de cãtre getnum. Dacã, însã, utilizatorul
rezultatul fiind plasat în simbolul local X. Dacã utilizatorul introduce un

apreciazã cã numãrul de introdus trebuie sã fie PI sau 2*PI, va alege sã


rãspundã printr-unul dintre cuvintele cheie, decât sã ºtie el pe dinafarã cât

Dacã rãspunde ”Pi” sau doar ”P” sau ”p”, atunci getreal returneazã cuvân-
sunt acestea pentru a le introduce, mai ales cã, ºi dacã le ºtie, poate greºi.

tul cheie ”Pi”. Funcþia cond detecteazã acest cuvânt cheie valid pentru ea
ºi returneazã valoarea potrivitã acestui caz, adicã PI. La fel, introducerea
lui ”D” sau ”d” sau chiar ”doi-p”, va fi tratatã asemãnãtor.

Release 10 inters
(inters <pt1> <pt2> <pt3> <pt4> [<pe_segm>])
Gãseºte intersecþia a douã drepte
Funcþia inters analizeazã douã linii (drepte) ºi returneazã punctul lor de
intersecþie sau nil dacã ele nu se intersecteazã. Parametrii <pt1> ºi <pt2)
sunt capetele primei linii iar <pt3> ºi <pt4> ale celei de-a doua. Toate

de coordonate UCS vezi la funcþia trans).


punctele sunt exprimate reletiv la UCS-ul curent (detalii despre sistemul

Dacã este prezent argumentul opþional <pe_segm> ºi este nil, atunci li-

infinitã iar inters returneazã punctul lor de intersecþie, chiar dacã acesta
niile definite de cele patru argumente <pt> sunt considerate de lungime

nu se aflã pe nici unul dintre segmentele determinate de acele puncte. Dacã


argumentul <pe_segm> lipseºte sau nu este nil, atunci punctul de inter-

inters, altfel se returneazã nil. De exemplu, dându-se:


secþie trebuie sã se afle strict între limitele de segment pentru a fi gãsit de

(setq a ‘(1.0 1.0) b ‘(9.0 9.0))


(setq c ‘(4.0 1.0) d ‘(4.0 4.0))

(inters a b c d)
atunci:

(inters a b c d T)
returneazã nil

(inters a b c d nil) returneazã (4.0 4.0)


returneazã nil
Capitolul 5 231

Release 10 itoa
(itoa <int>)
Returneazã conversia unui întreg într-un ºir
Etimologic, numele ei vine de la ”Integer TO ASCII”, adicã transformare
din întreg în ºir de caractere ASCII. De exemplu:
(itoa 33) returneazã ”33”
(itoa -17) returneazã ”-17”

Release 10 lambda
(lambda <argumente> <expr>...)
Defineºte o funcþie anonimã
Este folositã în mod tipic atunci când definirea generalã a unei funcþii noi

exact acolo unde trebuie folositã. Funcþia lambda returneazã valoarea


nu se justificã. Ea face evidentã intenþia programatorului de a plasa funcþia

ultimei sale <expr> ºi este adesea folositã împreunã cu apply sau mapcar
pentru a executa o funcþie pe o listã. De exemplu:
(apply ‘(lambda (x y z)
(* x (- y z))
)
‘(5 20 14)

returneazã 30 deoarece (* 5 (- 20 14)) fac 30, iar


)

(setq contor 0)
(mapcar ‘(lambda (x)
(setq contor (1+ contor))
(* x 5)
)
‘(2 4 -6 10.2)
)
returneazã (10 20 -30 51.0)
232 Funcþii AutoLISP

Release 10 last
(last <listã>)
Returneazã ultimul element dintr-o listã
Parametrul <listã> trebuie sã nu fie nil. De exemplu:
(last ‘(a b c d e)) returneazã E
(last ‘(a b c (d e)) returneazã (D E)
Aºadar, last poate returna fie un atom, fie o listã.
NOTA:
La prima vedere, last poate pãrea calea idealã pentru obþinerea

numere reale) acest lucru este adevãrat, last va returna coordona-


coordonatei Y. În timp ce, pentru puncte 2D (liste de douã

pe ambele categorii de puncte, se recomandã folosirea lui cadr


ta Z pentru puncte 3D. Pentru a vã asigura funcþionarea corectã

pentru obþinerea coordonatelor Y ºi a lui caddr pentru coordo-


natele Z.

Release 10 length
(length <listã>)
Returneazã un întreg indicând numãrul de elemente dintr-o listã
De exemplu:
(length ‘(a b c d)) returneazã 4
(length ‘(a b (c d))) returneazã 3
(length ‘()) returneazã 0

Release 10 list
(list <expr>...)
Combinã orice numãr de expresii într-o singurã listã
Aceastã funcþie primeºte orice numãr de expresii (<expr>) ºi le compune
Capitolul 5 233

împreunã, returnând o listã. De exemplu:


(list ‘a ‘b ‘c) returneazã (A B C)
(list ‘a ‘(b c) ‘d) returneazã (A (B C) D)
(list 3.9 6.7) returneazã (3.9 6.7)
În AutoLISP aceastã funcþie este frecvent folositã pentru a defini o va-
riabilã-punct 2D sau 3D (o listã de douã sau trei numere reale).

Release 10 listp
(listp <articol>)
Verificã dacã un articol este o listã
Aceastã funcþie returneazã T dacã <articol> este o listã ºi nil în orice alt
caz. De exemplu:
(listp ‘(a b c)) returneazã T
(listp ‘a) returneazã nil
(listp 4.343) returneazã nil

Release 10 load
(load <numefis> [<la_esec>])
Încarcã ºi evalueazã expresiile AutoLISP dintr-un fiºier
Argumentul <numefis> este un ºir care reprezintã numele fiºierului fãrã
extensie, aceasta fiind presupusã implicit ca ”.lsp”. În <numefis> poate fi
inclus un prefix care sã precizeze un ”director” ºi/sau un ”drive”, ca în
”a:\prog\test1”, unde ”a:” exprimã drive-ul A:, ”\prog” reprezintã direc-
torul, iar ”test1” fiºierul TEST1.LSP.
NOTA:
Din cauzã cã backslash-ul (”\”) are un scop anume în AutoLISP
(marcând includerea unui caracter de control), pentru a-l putea
include pe el însuºi într-un ºir literal, trebuie sã-l dublãm. Ca
urmare, ºirul din exemplu va fi ”a:\\prog\\test1”. Pentru specifi-
carea cãilor (path) sub MS-DOS se poate folosi ca alternativã uti-
234 Funcþii AutoLISP

lizarea unui ”slash” obiºnuit, deci exemplul poate fi dat ºi ca


”a:/prog/test1”.

(”path”), funcþia load cerceteazã calea de bibliotecã a AutoCAD-ului


Revenind, dacã ºirul <numefis> nu conþine o specificaþie de ”cale”

într–o manierã similarã cu funcþia findfile. Dacã fiºierul este gãsit oriunde
pe aceastã cale atunci el va fi încãrcat de cãtre load.
Dacã operaþia se încheie cu succes, load returneazã valoarea ultimei expre-

operaþia load eºueazã, atunci ea produce în mod normal un mesaj de eroare


sii din fiºier, care este adesea numele ultimei funcþii definite în fiºier. Dacã

load returneazã valoarea acestui argument în loc de mesajul de eroare stan-


AutoLISP. Dacã, însã, este furnizatã o valoare argumentului <la_esec>,

dard. Prin aceasta se oferã posibilitatea tratãrii dupã dorinþã a erorii, în


sensul cã aplicaþia Dvs. va efectua o anumitã acþiune ca urmare a eºecului
înregistrat. Desigur cã va trebui sã vã asiguraþi cã argumentul <la_esec>
este diferit de ultima expresie din fiºier, altfel înþelesul sãu devine
ambiguu. De exemplu, presupunând cã fiºierul ”a:\prog\test1.lsp” conþine:
(defun MY_FUNC1 (x)
...corpul funcþiei...
)
(defun MY_FUNC2 (x)
...corpul funcþiei...
)
ºi cã fiºierul ”test2.lsp” nu existã, atunci:
(load ”a:\\prog\\test1”) returneazã MY_FUNC2
(load ”a:\\prog\\test1” ”gresit”) returneazã MY_FUNC2
(load ”test2” ”gresit”) returneazã ”gresit”
(load ”test2”) produce eroare AutoLISP
Funcþia LOAD poate fi folositã dintr-o altã funcþie AutoLISP, sau chiar
recursiv (adicã din fiºierul care tocmai se încarcã).
* IMPORTANT! *
De fiecare datã când se începe o sesiune cu Editorul de Desen AutoCAD,
AutoLISP încarcã în mod automat fiºierul ”acad.lsp”, dacã acesta existã în
directorul curent sau în cel indicat de variabila ”acad” setatã, eventual, în
Capitolul 5 235

AUTOEXEC.BAT. Puteþi plasa definiþii de funcþii în acest fiºier, funcþii


care vor fi evaluate (definite) de fiecare datã când începeþi un desen. Dacã

AutoLISP ori de câte ori începeþi o sesiune de desenare, plasaþi o defun a


doriþi sã vi se execute automat o serie de comenzi AutoCAD sau de funcþii

funcþiei speciale ”S::STARTUP” în fiºierul ”acad.lsp”; ca urmare,

un exemplu la defun).
AutoCAD o va executa automat la începutul sesiunii de editare desen (vezi

Release 12 load_dialog
(load_dialog <fis_dcl>)
Încarcã un fiºier DCL
Argumentul <fis_dcl> este un ºir care specificã fiºierul DCL de încãrcat.
Dacã argumentul <fis_dcl> nu specificã o extensie, atunci este presupusã
extensia .DCL. Returneazã valoarea întreagã pozitivã (dcl_id) dacã se

fiºierul. Variabila dcl_id este folositã ca handle în apelurile ulterioare ale


încheie cu succes ºi returneazã un întreg negativ dacã nu poate deschide

funcþiilor new_dialog ºi unload_dialog.


Funcþia load_dialog cautã fiºiere potrivit cãii de cãutare de bibliotecã.
Aceastã funcþie are complementara unload_dialog. O aplicaþie poate
încãrca mai multe fiºiere DCL folosind tot atâtea apeluri load_dialog.

Release 10 log
(log <numãr>)
Returneazã logaritmul natural al unui numãr
Aceastã funcþie returneazã logaritmul natural (în baza e = 2.71828182) al
lui <numãr> ca o valoare realã. De exemplu:
(log 4.5) returneazã 1.50408
(log 1.22) returneazã 0.198851
236 Funcþii AutoLISP

Release 10 logand
(logand <numãr> <numãr>...)
Returneazã rezultatul unui AND pe bit aplicat asupra unei liste de întregi
Aceastã funcþie returneazã rezultatul aplicãrii lui AND (ªI) logic la nivel
de biþi pe o listã de <numere>. Argumentele <numãr> trebuie sã fie
numere întregi iar rezultatul va fi tot un întreg. Prin aplicarea lui AND la
nivel de biþi pe numerele 7 = 000001112, 15 = 000011112 ºi 3 = 000000112
rezultatul va fi 000000112 = 3, nu-i aºa? Iatã exemple:
(logand 7 15 3) returneazã 3
(logand 2 3 15) returneazã 2
(logand 8 3 4) returneazã 0

Release 10 logior
(logior <numãr> <numãr>...)
Returneazã rezultatul unui OR pe bit aplicat asupra unei liste de întregi
Aceastã funcþie returneazã rezultatul aplicãrii lui OR (SAU) INCLUSIV pe
o listã de <numere>. Numerele trebuie sã fie întregi iar rezultatul va fi tot
întreg. De exemplu:
(logior 1 2 4) returneazã 7
(logior 9 3) returneazã 11

Release 10 lsh
(lsh <num1> <numbits>)
Returneazã deplasarea cu un numãr dat de poziþii pe biþi a unui întreg
Aceastã funcþie returneazã <num1> deplasat la nivel de biþi cu
<numbits> biþi. Atât <num1> cât ºi <numbits> trebuie sã fie numere
întregi, cum va fi ºi rezultatul.
Dacã <numbits> este pozitiv, deplasarea lui <num1> se va face la stânga,
Capitolul 5 237

iar dacã este negativ - la dreapta. În ambele cazuri vor fi aduºi din afarã biþi
”zero” dinspre partea opusã deplasãrii, iar cei care vor ieºi în afara numãru-
lui ca urmare a acestei operaþii (în partea în care se face deplasarea) vor fi
pierduþi. Dacã în poziþia a 16-a (de la dreapta la stânga, deci prima) este
adus sau scos un bit setat pe ”unu” în locul unuia ”zero”, atunci semnul
numãrului se va schimba, deoarece acest bit exprimã tocmai semnul între-
gului (prin convenþie). Ca idee, pe lângã alte interpretãri posibile, o
deplasare cu un bit la stânga înmulþeºte numãrul cu 2 iar o deplasare la
dreapta îl împarte la 2, tot aºa cum în baza 10 aceleaºi deplasãri
înmulþesc/împart cu 10. De exemplu:
(lsh 2 1) returneazã 4
(lsh 2 -1) returneazã 1
(lsh 40 2) returneazã 160
(lsh 16384 1) returneazã -32768
NOTA:
Pentru calculatoarele pe care AutoCAD este instalat pe 32 de biþi
(adicã 386/486, spre deosebire de 286 organizat pe 16 biþi), poziþia

(lsh 16384 1) returneazã 32768.


bitului de semn este a 32-a ºi nu a 16-a, iar ultimul exemplu va fi:

Release 10 mapcar
(mapcar <funcþie> <list1>...<listn>)
Returneazã rezultatul aplicãrii unei funcþii pe fiecare element al unei liste
Funcþia mapcar returneazã rezultatul aplicãrii funcþiei <funcþie> pe ele-
mentele individuale exprimate de <list1> pânã la <listn>, date ca argu-
mente ale lui <funcþie>. De exemplu:
(setq a 10 b 20 c 30)
(mapcar ‘1+ (list a b c)) returneazã (11 21 31)
Aceasta este echivalentã cu:
(1+ a)
(1+ b)
(1+ c)
238 Funcþii AutoLISP

cu excepþia faptului cã mapcar returneazã o listã de rezultate. Tot aºa:


(mapcar ‘+ ‘(10 20 30) ‘(4 3 2)) returneazã (14 23 32)
Aceasta este echivalentã cu:
(+ 10 4)
(+ 20 3)
(+ 30 2)
Funcþia lambda (vezi) poate specifica o funcþie ”anonimã” spre a fi execu-
tatã de mapcar. Acest lucru este util atunci când unele dintre argumentele
funcþiei sunt constante sau sunt furnizate pe alte cãi. De exemplu:
(mapcar ‘(lambda (x) (+ x 3)) ‘(10 20 30)) returneazã (13 23 33)
iar:
(mapcar ‘(lambda (x y z)
(* x (- y z))
)
‘(5 6) ‘(20 30) ‘(14 5.0)
) returneazã (30 150.0)

Release 10 max
(max <numãr> <numãr>...)
Returneazã cel mai mare dintre numerele date ca argumente
Fiecare numãr poate fi întreg sau real. De exemplu:
(max 4.07 -144) returneazã 4.07
(max -88 19 5 2) returneazã 19

Release 10 mem
(mem)
Afiºeazã starea curentã a memoriei AutoLISP
Funcþia afiºeazã urmãtoarele informaþii:
Nodes = numãrul total de noduri deja alocate, acesta trebuind
Capitolul 5 239

sã egaleze mãrimea segmentului node


multiplicat prin numãrul de segmente
- Free nodes = numãrul de noduri aflate curent pe lista free ca
rezultat al colectãrii de resturi (”garbage
collection”).
- Segments = numãrul de segmente node alocate
- Allocate = mãrimea curentã de segment
- Collections = numãrul de colectãri de resturi, indiferent dacã sunt

Funcþia mem returneazã nil.


fãcute automat sau forþat

Explicaþii despre gestionarea memoriei sunt date în secþiunea 3.8.

Release 10 member
(member <expr> <list>)
Returneazã partea dintr-o listã începând cu valoarea unei expresii date
Aceastã funcþie cerceteazã lista <list> pentru a gãsi expresia <expr> ºi
returneazã partea din <list> rãmasã dupã prima întâlnire a lui <expr>,
începând cu aceasta. De exemplu:
(member ‘c ‘(a b c d c d e)) returneazã (C D C D E)
(member ‘q ‘(a b c d e)) returneazã nil

Release 10 menucmd
(menucmd <ºir>)
Emite comenzi menu, sau seteazã ºi regãseºte stãri de articole de menu
Funcþia menucmd oferã un mijloc prin care programele LISP sã comute
subpagini dintr-un menu AutoCAD. Astfel, un program LISP poate lucra
în combinaþie cu un fiºier menu asociat, afiºând un submenu corespunzã-

partea utilizatorului. Funcþia menucmd returneazã întotdeauna nil.


tor de alternative ori de câte ori este necesarã o introducere de date din

Argumentul <ºir> este de forma:


secþiune=submenu
240 Funcþii AutoLISP

unde
- secþiune = specificã secþiunea de menu; nume valide sunt:
S pentru menu SCREEN
B1-B4 pentru menu BUTTON de la 1 la 4
I pentru menu ICON sau zonã (tile - Release 12)
P0-P16 pentru menu-uri pull-down (POP-UP) de la 1 la 10
T1-T4 pentru menu-uri TABLET de la 1 la 4
A1-A4 pentru menu AUX de la 1 la 4
M pentru expresii ºir DIESEL (Release 12)
- submenu = specificã ce submenu sã fie activat. Numele trebuie sã fie
ori una dintre etichetele de submenu (fãrã ”**”) din menu-ul fi-
ºier curent încãrcat (cu comanda MENU din AutoCAD, implicitã
sau explicitã), ori un nume de secþiune al unui menu principal.
De notat cã prefixul ”$” care marca apelul unui submenu în fiºierul menu
nu este folosit aici. De exemplu:
(menucmd ”S=OSNAP”)
va face sã aparã pe ecran submenu-ul ”OSNAP” (presupunând cã acesta
existã în fiºierul menu curent). La fel:
(menucmd ”B=MY-BUTTONS”)
va atribui submenu-ul ”MY-BUTTONS” menu-ului ”button”.
Pentru menu-urile icon ºi pull-down(sau POP-UP), ”*” este un nume valid
de submenu; acesta face sã fie afiºat submenu-ul atribuit momentan secþi-
unii de menu specificate. De exemplu, secvenþa:
(menucmd ”P1=NUMERIC”)
(menucmd ”P1=*”)
va atribui submenu-ul ”NUMERIC” menu-ului pull-down nr. 1 ºi-l va des-
fãºura efectiv apoi pe ecran.

Release 10 min
(min <numãr> <numãr>...)
Returneazã cel mai mic dintre numerele date ca argumente
Capitolul 5 241

Orice numãr dintre cele date poate fi real sau întreg. De exemplu:
(min 683 -10.0) returneazã -10.0
(min 73 2 48 5) returneazã 2

Release 10 minusp
(minusp <articol>)
Verificã dacã un numãr este negativ
Aceastã funcþie returneazã T dacã <articol> este un numãr real sau întreg
ºi este evaluat ca o valoare negativã, altfel dând nil. Funcþia nu este definitã
dacã <articol> este de alt tip decât cel numeric menþionat. De exemplu:
(minusp -1) returneazã T
(minusp -4.293) returneazã T
(minusp 830.2) returneazã nil

Release 12 mode_tile
(mode_tile <cheie> <mod>)
Fixeazã modul pentru o zonã (tile) de casetã de dialog
Argumentul <cheie> este un ºir care dã zona de casetã ºi este sensibil la
tipul de literã (micã, MAJUSCULţ). Valorile argumentului <mod> sunt
descrise în tabela ce urmeazã.
Val Descriere
0 Autorizeazã zona
1 Dezafecteazã zona
2 Activeazã zona ca obiectiv
3 Selecteazã conþinutul casetei de editare
4 Comutã imaginea pe highlight sau normal
242 Funcþii AutoLISP

Release 13 namedobjdict
(namedobjdict)
Returneazã numele de entitate al dicþionarului obiect numit din desenul curent
De reþinut cã numele returnat este rãdãcina tuturor obiectelor negrafice din
desen. Folosind numele returnat de aceastã funcþie ºi de funcþiile de acces
la dicþionar, aplicaþia poate accede obiectele negrafice din desen.

Release 11 nentsel
(nentsel [<prompt>])
Cere utilizatorului sã selecteze o entitate ºi asigurã accesul la date complexe
De reþinut cã funcþia nentsel cere utilizatorului sã selecteze entitatea prin
indicarea unui punct ºi asigurã accesul la datele de definiþie ale acesteia
consideratã ca obiect complex.
Argumentul opþional <prompter> este un ºir de afiºat ca prompter. Dacã
lipseºte, se emite prompterul ”Select objects”.
Funcþia nentsel cere utilizatorului sã selecteze un obiect (entitate). Modul
OSNAP curent este ignorat, cu excepþia cazului când utilizatorul îl cere

nentsel onoreazã cuvintele cheie definite de apelul anterior al lui initget.


explicit. Pentru a oferi suport suplimentar pe prompterul ”Command”,

nentsel oferã aceleaºi date ca entsel (vezi). În schimb, dacã obiectul selec-
Când obiectul selectat nu este complex (bloc sau polilinie, de exemplu),

tat este o polilinie, atunci nentsel returneazã o listã conþinând numele

returnate de entsel, decât cã este returnat numele vertex-ului în loc de


subentitãþii (vertex) ºi punctul de indicare. Aceasta este similarã listei

antetul poliliniei. Funcþia nentsel returneazã vertex-ul de start al segmen-

polilinii, funcþia returneazã al treilea vertex. Niciodatã nentsel nu


tului de polilinie selectat. Indicând, de exemplu, al treilea segment al unei

returneazã subentitatea Seqend a unei polilinii.


Selectarea unui atribut al unei referinþe de bloc returneazã numele atribu-
tului ºi punctul de indicare. Când obiectul selectat este o altã componentã
Capitolul 5 243

a referinþei de bloc decât un atribut, nentsel returneazã o listã conþinând


patru elemente:
1/ Numele entitãþii
2/ Listã conþinând coordonatele punctului folosit pentru a indica obiectul
3/ Matricea de Transformare Model - World. Aceasta este o listã de patru
subliste conþinând fiecare câte un set de coordonate. Matricea
poate fi folositã pentru a transforma punctele de definiþie ale
entitãþii dintr-un sisteme de coordonate intern numit Model
Coordinate System (MCS) în sistemul World Coordinate System
(WCS). Punctul de inserþie al blocului care conþine entitatea
selectatã defineºte originea lui MCS. Direcþia axelor MCS este
determinatã de orientarea UCS-ului din momentul creãrii blocu-
lui.
4/ Listã conþinând numele de entitate al blocului care conþine obiectul
selectat. Dacã obiectul selectat este un obiect inclus în alt bloc,
odatã sau de mai multe ori, lista adiþionalã conþine numele de
entitate ale tuturor blocurilor în care obiectul selectat este inclus,
începând cu cel mai interior ºi continuând spre exterior pânã la
numele blocului care a fost inserat în desen.
Exemplu:
(<Entity Name: nume_ent1> ;numele entitãþii
(Px Py Pz) ;Punct de indicare
((X0 Y0 Z0) ;Matrice Transf Model -> World
(X1 Y1 Z1)
(X2 Y2 Z2)
(X3 Y3 Z3)
)
(<Entity Name: nume_ent2> ;Numele blocului cel mai adânc
;imbricat care conþine entitatea
;selectatã
...
<Entity Name: nume_entn>) ;Numele blocului exterior
;conþinând entitatea selectatã
)

punctele de definiþie ale entitãþii din MCS în WCS. Utilizaþi entget ºi


Odatã obþinute numele entitãþii ºi matricea menþionatã, puteþi transforma

assoc pe numele entitãþii pentru a obþine punctele de definiþie exprimate


244 Funcþii AutoLISP

de nentsel are acelaºi scop ca ºi cea returnatã de nentselp, dar este o


în coordonate MCS. Matricea de Transformare Model -> World returnatã

matrice de 4x3 - transmisã ca tablou de patru puncte - care foloseºte con-


venþia cã un punct este o linie ºi nu o coloanã. Transformarea este descrisã
de urmãtorul produs matriceal:

În acest fel, ecuaþiile pentru derivarea noilor coordonate sunt astfel:


X’ = XM00 + YM10 + ZM20 + M30
Y””’ = XM01 + YM11 + ZM21 + M31
Z’ = XM02 + YM12 + ZM22 + M30
Elementele Mi j , unde 0 ≥ i,j ≥ 2, sunt coordonatele Matricei de
Transformare Model -> World; X, Y, Z sunt punctele de definiþie ale
entitãþii exprimate în coordonate MCS, iar X’, Y’, Z’ sunt punctele rezul-
tante de definiþie ale entitãþii exprimate în coordonate WCS.
NOTA:

acest tip; funcþia nentselp returneazã o matrice similarã celor


Aceasta este singura funcþie AutoLISP care foloseºte o matrice de

Vezi ºi funcþiile entsel ºi initget.


folosite de celelalte funcþii AutoLISP ºi ADS.

Release 11 nentselp
(nentselp [<prompt>] [<pct>])
Idem cu nentsel, doar cã nu se cere obligatoriu ºi o introducere utilizator
Suplimentar faþã de argumentul opþional <prompt>, nentselp acceptã un

fãrã intervenþia utilizatorului. Funcþia nentselp returneazã o matrice de


punct de selecþie ca argument opþional. Aceasta asigurã selecþia obiectului
Capitolul 5 245

transformare 4x4, definitã astfel:

Primele trei coloane ale matricei specificã scalarea ºi rotaþia. A patra


coloanã este un vector de translaþie.
Funcþiile care folosesc o matrice de acest tip trateazã un punct ca un vector
coloanã de lungime 4. Punctul este exprimat în coordonate omogene, unde
al patrulea element al vectorului punct este un factor de scalã care este setat
normal pe 1.0. Rândul final al matricii, vectorul [M30 M31 M32 M33], are va-
loarea nominalã [0 0 0 1]; el este curent ignorat de funcþiile care folosesc
acest format de matrice. În aceastã convenþie, aplicarea unei transformãri
unui punct este un produs matriceal care aratã aºa:

Acest produs ne dã coordonatele individuale ale punctului astfel:


X’ = XM00 + YM01 + ZM02 + M03(1.0)
Y””’ = XM10 + YM11 + ZM12 + M13(1.0)
Z’ = XM20 + YM21 + ZM22 + M23(1.0)
Aºa cum aratã aceste ecuaþii, factorul de scalã ºi ultimul rând al matricii nu
au nici un efect ºi sunt ignorate.
246 Funcþii AutoLISP

Release 12 new_dialog
(new_dialog <nume_dlg> <id_dcl> [actiune [<pct_ecran>]])
Începe o nouã casetã de dialog ºi o lanseazã, putând sã dea ºi acþiunea implicitã
Argumentul <nume_dlg> este un ºir care dã caseta de dialog, iar

apelul funcþiei load_dialog).


<id_dcl> identificã fiºierul DCL (trebuie sã se fi obþinut valoarea sa prin

Argumentul <actiune> - care trebuie sã fie dat dacã specificaþi argumen-


tul <pct_ecran> - este un ºir care conþine o expresie AutoLISP ce se va
folosi ca acþiune implicitã. Dacã nu doriþi sã specificaþi o acþiune implicitã,
transferaþi <actiune> ca ºir vid (””). Argumentul <pct_ecran> este o listã
de punct 2D care dã poziþia X, Y a casetei de dialog pe ecran. Uzual, acest
punct dã poziþia colþului stânga sus al casetei, dar el depinde de platformã,
aºa cum este sistemul de unitãþi în care este datã poziþia. Dacã transmiteþi
punctul ca ‘(-1 -1), caseta de dialog este deschisã în poziþia implicitã (cen-
tratã în ecranul grafic AutoCAD).
Dacã funcþia new_dialog reuºeºte, ea transmite T, altfel returneazã nil.
Aplicaþia Dvs. trebuie sã apeleze funcþia new_dialog înainte de a apela
funcþia start_dialog. Toate iniþializãrile casetei de dialog - precum setarea
valorilor zonelor (tiles), crearea imaginilor sau a listelor pentru casetele de

action_tile) - trebuie sã aibã loc dupã apelul lui new_dialog ºi înainte de


listare, ºi asocierea acþiunilor cu zonele corespunzãtoare (folosind funcþia

apelul lui start_dialog.


Acþiunea implicitã este evaluatã atunci când utilizatorul puncteazã (cu
mouse-ul) pe o zonã activã care nu are o acþiune sau un apel de retur
atribuit explicit acesteia prin fucþia action_tile sau prin DCL.
NOTA:
Verificaþi totdeauna starea returnatã de new_dialog. Apelarea lui
start_dialog atunci când a eºuat apelul lui new_dialog poate
conduce la rezultate imprevizibile.
Capitolul 5 247

Release 10 not
(not <articol>)
Verificã dacã un articol este evaluat ca nil

În mod tipic, funcþia null este folositã pentru liste, iar not pentru alte
Aceastã funcþie returneazã T dacã <articol> este nil ºi nil în orice alt caz.

tipuri de datã în combinaþie cu unele tipuri de funcþii de control. De exem-


plu, dându-se atribuirile:
(setq a 123)
(setq b ”string”)
(setq c nil)
atunci:
(not a) returneazã nil
(not b) returneazã nil
(not c) returneazã T
(not ‘()) returneazã T

Release 10 nth
(nth <n> <listã>)
Returneazã al n-lea element al unei liste
Aceastã funcþie returneazã al ”n-lea” element din <listã>, unde <n> este
numãrul elementului de returnat, începând cu zero pentru primul element
(ºi nu cu 1). Dacã <n> este mai mare decât numãrul maxim corespunzã-
tor listei, se returneazã nil. De exemplu:
(nth 3 ‘(a b c d e)) returneazã D
(nth 0 ‘(a b c d e)) returneazã A
(nth 5 ‘(a b c d e)) returneazã nil

Release 10 null
(null <articol>)
Verificã dacã un articol este asociat cu nil
248 Funcþii AutoLISP

Aceastã funcþie returneazã T dacã <articol> este asociat cu nil ºi nil altfel.
De exemplu, dându-se atribuirile:
(setq a 123)
(setq b ‘”string”)
(setq c nil)
atunci:
(null a) returneazã nil
(null b) returneazã nil
(null c) returneazã T
(null ‘()) returneazã T

Release 10 numberp
(numberp <articol>)
Verificã dacã un articol este numãr real sau întreg
Aceastã funcþie returneazã T dacã <articol> este un numãr real sau întreg
ºi nil altfel. De exemplu, dându-se atribuirile:
(setq a 123)
(setq b ‘a)
atunci:
(numberp 4) returneazã T
(numberp 3.8348) returneazã T
(numberp ”Howdy”) returneazã nil
(numberp ‘a) returneazã nil
(numberp a) returneazã T
(numberp b) returneazã nil
(numberp (eval b)) returneazã T

Release 10 open
(open <numefis> <mod>)
Deschide un fiºier pentru acces prin funcþii AutoLISP
Aceastã funcþie returneazã un descriptor de fiºier care poate fi folosit de
Capitolul 5 249

alte funcþii de intrare/ieºire; de aceea, el trebuie sã fie atribuit (prin setq)


unui simbol. De exemplu:
(setq a (open ”file.ext” ”r”))
Aici, simbolul a va primi valoarea descriptorului de fiºier returnatã de
funcþia open. Acesta are forma ”#nnnn”, unde ”nnnn” este un numãr

bolul a).
hexazecimal intern (care nu ne intereseazã; noi vom lucra numai cu sim-

Argumentul <numefis> este un ºir care specificã numele ºi extensia


fiºierului ce trebuie deschis. Argumentul <mod> este un semnalizator de
citire/scriere. El trebuie sã fie un ºir conþinând o singurã literã micã.
Literele valide de moduri sunt date în tabelã:
Mod
OPEN Descriere
”r” Deschidere pentru citire (read). Dacã fiºierul <numefis> nu
existã, se returneazã nil
”w” Deschidere pentru scriere (write). Dacã fiºierul <numefis> nu
existã, este creat un nou fiºier ºi este deschis. Dacã <numefis>
existã deja, datele din el vor fi înlocuite cu cele noi (supra-scriere)
”a” Deschidere pentru adãugare (append). Dacã <numefis> nu
existã, este creat ºi deschis un nou fiºier. Dacã el deja existã, va fi
deschis ºi poziþionat la sfârºitul datelor existente, astfel cã noile
date ce se vor scrie în fiºier vor fi adãugate la cele existente.
NOTA:
Unele programe ºi editoare de text scriu fiºierele punând un cod
”end-of-file” (EOF = sfârºit-de-fiºier, cod ASCII 26, adicã
CTRL/Z) la sfârºitul fiºierului. Asta face ca ºi dacã se adaugã text
în urma acestui cod, sistemele DOS sã semnaleze EOF la întâl-
nirea codului cu pricina, ignorând restul textului. Dacã doriþi sã
folosiþi opþiunea ”a” a lui OPEN, asiguraþi-vã cã alte programe nu
insereazã codul CTRL/Z la sfârºitul fiºierelor text.
Presupunând cã fiºierele din exemplele urmãtoare nu existã:
<File:
#nnnn>
(setq f (open ”new.tst” ”w”)) returneazã

(setq f (open ”nosuch.fil” ”r”)) returneazã nil


250 Funcþii AutoLISP

(setq f (open ”logfile” ”a”)) returneazã < F i l e : # n n n n >


Parametrul <numefis> poate include un prefix care sã specifice directorul,
ca în ”c:\acad\user”. Atenþie, însã, cã pentru a putea include un back-
slash (”\”) trebuie puse douã, adicã ºirul de mai sus trebuie scris
”c:\\acad\\user”. De exemplu:
(setq f (open ”c:\\user\\new.tst” ”w”)) returneazã < F i l e : # n n n n >
Operaþia opusã lui open este close (vezi). Alte operaþii de intrare/ieºire

prin1, princ, print, read-char, read-line, write-char, write-line (vezi).


care folosesc descriptorul de fiºier sunt accesibile prin funcþiile AutoLISP:

Un exemplu util este dat la funcþia prin1.

Release 10 or
(or <expr>...)
Returneazã valoarea SAU (OR) logic a unei liste de expresii
Funcþia or evalueazã expresiile de la stânga la dreapta, cãutând o expresie
non-nil. Dacã este gãsitã o astfel de expresie, or înceteazã alte evaluãri ºi
returneazã T. Dacã toate expresiile din listã sunt nil, atunci funcþia or
returneazã nil. De exemplu:
(or nil 45 ‘()) returneazã T
(or nil ‘()) returneazã nil

Release 10 osnap
(osnap <pt> <ºir-mod>)
Returneazã un punct 3D ca rezultat al aplicãrii OSNAP pe un punct dat
Aceastã funcþie returneazã un punct care este rezultatul aplicãrii modurilor
de ”salt obiecte” (”object snap”) descrise de <ºir-mod> pe punctul <pt>.
Parametrul <ºir-mod> este un ºir constând din unul sau mai mulþi identi-
ficatori valizi de ”salt obiecte”, ca ”MIDpoint”, ”CENtre”, etc., separaþi
prin virgule. De exemplu:
(setq pt2 (osnap pt1 ”midp”))
Capitolul 5 251

(setq pt2 (osnap pt1 ”midp,endp,centre”))


Dacã argumentul <pt> este un punct 2D (o listã de douã numere reale),
atunci este returnat un punct 2D. Dacã argumentul <pt> este un punct 3D
(o listã de trei numere reale), atunci este returnat un punct 3D. Dacã nu
este gãsit nici un punct care sã întruneascã acele condiþii ”object snap”
exprimate de <ºir-mod> pentru punctul <pt>, atunci se returneazã nil.

Release 10 pi
pi
Singura constantã din AutoLISP (π)
Aceasta nu este o funcþie, ci constanta π. Ea este evaluatã la limita exac-
titãþii AutoCAD-ului. Pentru a vedea valoarea returnatã folosiþi:
(pi) sau, dacã vreþi exact, (rtos pi 2 20)

Release 10 polar
(polar <pt> <unghi> <distanþã>)
Returneazã punctul 3D UCS aflat la un unghi ºi o distanþã de alt punct
Aceastã funcþie returneazã punctul UCS aflat la unghiul <unghi> ºi dis-

trans). Parametrul <unghi> este exprimat în radiani faþã de direcþia po-


tanþa <distanþã> de punctul UCS <pt>. (pentru UCS vezi ºi funcþia

zitivã a axei X, în sens trigonometric. Deºi <pt> poate fi un punct 3D,


<unghi> este întotdeauna raportat la (proiectat pe) planul curent de cons-
trucþie. De exemplu:
(polar ‘(1.0 1.0 3.5) 0.785398 1.414214) returneazã (2.0 2.0 3.5)

Release 10 prin1
(prin1 <expr> [<descr-fis>])
Imprimã o expresie pe linia de comandã sau o scrie într-un fiºier deschis
252 Funcþii AutoLISP

(Cred cã se vede bine cã numele funcþiei este PRIN1 ºi nu PRINL).


Aceastã funcþie tipãreºte pe ecran expresia <expr> ºi returneazã <expr>.

Parametrul <expr> poate fi orice fel de expresie, nu numai un ºir. Dacã

er deschis - cu open - pentru scriere), atunci <expr> este scrisã în fiºier


este prezent <descr-fis> (ºi este un descriptor de fiºier valid pentru un fiºi-

exact în forma în care ar apãrea pe ecran. Este tipãritã numai expresia

sau avans de linie - vezi detalii la read-char) sau ”blanc”. De exemplu,


<expr> specificatã, fãrã a se include vreun ”newline” (adicã LINE FEED

dându-se atribuirile:
(setq a 123)
(setq b ‘(a))
atunci:
(prin1 ‘a) tipãreºte A ºi returneazã A
(prin1 a) tipãreºte 123 ºi returneazã 123
(prin1 b) tipãreºte (A) ºi returneazã (A)
(prin1 ”Hello”) tipãreºte ”Hello” ºi returneazã ”Hello”
De remarcat cã, a ”tipãri pe ecran” înseamnã a tipãri în spaþiul de jos, adicã
în zona de comenzi. Cum ”returneazã” înseamnã a afiºa o valoare de retur
tot în acest spaþiu, vom constata cã ºirul în cauzã va fi repetat pe aceeaºi
linie în aceastã zonã.
Fiecare dintre exemplele precedente ”tipãreºte” pe ecran deoarece nu a fost
adãugat un descriptor de fiºier <descr-fis>. Presupunând cã a fost deschis
un fiºier cu numele arbitrar ”new.new” folosind:
(setq f (open ”new.new” ”w”))

open), atunci:
deci având descriptorul ”f” ºi fiind deschis pentru scriere (vezi funcþia

(prin1 ”Hello” f)
va scrie ”Hello” (inclusiv ghilimelele) în fiºierul ”new.new” ºi va returna
(pe ecran) ºirul ”Hello” (inclusiv ghilimelele).
Dacã expresia <expr> este un ºir conþinând ºi caractere de control, prin1
va edita aceste caractere punându-le un caracter-prefix ”\”, ca în:
\e pentru ESCAPE
\n pentru NEWLINE
Capitolul 5 253

\r pentru RETURN
\t pentru TAB
\nnn pentru caracterul al cãrui cod octal este ”nnn”
Astfel:
(prin1 (chr 2)) tipãreºte ”\002” ºi returneazã ”\002”
(prin1 (chr 10))
Funcþia prin1 poate fi folositã fãrã argumente ºi va returna (ºi tipãri) un
tipãreºte ”\n” ºi returneazã ”\n”

simbol al cãrui nume este ”ºirul nul”. Dacã folosiþi prin1 (fãrã argumente)
ca ultimã expresie într-o funcþie definitã de utilizator, atunci tot ce se va
tipãri la încheierea funcþiei va fi o linie albã, asigurându-se astfel un mijloc
de ieºire ”discretã” a acelei funcþii. De exemplu, dându-se:
(defun C:SETARE ()
(setvar ”LUNITS” 4)
(setvar ”BLIPMODE” 0)
(prin1)
)
atunci:
Command: SETARE
va executa comanda SETARE definitã de utilizator, executând setãrile
funcþiilor SETVAR ºi va reveni la prompterul ”Command:” fãrã a mai afiºa
vreun mesaj suplimentar (fie ºi numai nil).

Release 10 princ
(princ <expr> [<descr-fis>])
Idem cu prin1, dar caracterele de control nu sunt expandate
Aceastã funcþie este la fel cu prin1, decât cã eventualele caractere de con-
trol din <expr> sunt tipãrite neexpandat. În general, prin1 este destinatã
pentru a tipãri expresii într-o formã compatibilã cu load, în timp ce princ
le va tipãri într-o formã ”citibilã” prin funcþii ca read-line.
254 Funcþii AutoLISP

Release 10 print
(print <expr> [<descr-fis>])
Idem cu prin1, dar imprimã un caracter \n înainte ºi un blanc dupã
Aceastã funcþie este la fel cu prin1, decât cã înainte de <expr> este

detalii la read-char), iar dupã <expr> este pus un blanc.


”tipãrit” un caracter ”newline” (adicã LINE FEED, avans de linie - vezi

Release 10 progn
(progn <expr>...)
Evalueazã secvenþial expresiile ºi returneazã valoarea ultimei expresii

ultimei expresii. Puteþi folosi progn pentru a evalua o seamã de expresii


Aceastã funcþie evalueazã fiecare <expr> secvenþial ºi returneazã valoarea

dintre care doar ultima este aºteptatã. De exemplu:


(if (= a b)
(progn
(setq a (+ a 10))
(setq b (- b 10))
)
)
Funcþia if evalueazã în mod normal o singurã expresie ”then” dacã expre-

progn pentru a face sã fie evaluate douã expresii ºi nu una singurã.


sia de test este evaluatã la orice afarã de nil. În acest exemplu am folosit

În ciclurile while ºi în defun se pot înºira liber secvenþe de instrucþiuni

funcþiei), în rest este necesarã aproape peste tot funcþia progn pentru a
(funcþii) care vor fi executate succesiv (corpul ciclului, respectiv al

desemna secvenþe de funcþii. Aceasta poate fi consideratã ca o ”umbrelã” a

cere o expresie. Cel mai frecvent este folositã cu funcþia if (vezi).


expresiilor pe care le face sã parã una singurã ºi poate fi folositã oriunde se
Capitolul 5 255

Release 10 prompt
(prompt <msg>)
Afiºeazã un mesaj în zona de dialog
Aceastã funcþie afiºeazã <msg> în zona prompter din josul ecranului ºi
returneazã nil. Pe configuraþii AutoCAD cu douã ecrane (unul grafic ºi

princ. De exemplu:
unul text) afiºeazã <msg> pe ambele ecrane, fiind astfel preferabil faþã de

afiºeazã ”Introduceti o valoare: ” pe ecran(e) ºi returneazã nil.


(prompt ”Introduceti o valoare: ”)

Release 12 quit
(quit)
Forþeazã abandonarea aplicaþiei curente
La apelul lui quit este returnat mesajul obiºnuit quit/exit ºi se revine la
prompterul „Command:” al AutoCAD-ului.
Vezi ºi funcþia exit.

Release 10 quote
(quote <expr>)
Returneazã o expresie fãrã s-o evalueze
Returneazã <expr> neevaluatã. Pentru simplificare, aceasta poate fi scrisã
ºi astfel:
‘expr
De exemplu:
(quote a) returneazã A
(quote cat) returneazã CAT
(quote (a b)) returneazã (A B)
256 Funcþii AutoLISP

‘a returneazã A
‘cat returneazã CAT
‘(a b) returneazã (A B)
Ultimele trei exemple nu vor funcþiona dacã sunt introduse direct de la tastaturã
în zona de comenzi ca rãspuns la prompterul AutoCAD. Amintiþi-vã cã o astfel
de introducere trebuie sã înceapã cu un ”(” sau”!” pentru a fi recunoscutã ca
expresie LISP ºi mai amintiþi-vã cã existã comenzi ”transparente” în AutoCAD
(cum ar fi ‘HELP), caracterizate tocmai prin prefixul apostrof.

Release 10 read
(read <ºir>)
Returneazã prima listã sau atom obþinut dintr-un ºir
Aceastã funcþie returneazã prima listã sau primul atom obþinut din <ºir>.
Parametrul <ºir> trebuie sã nu conþinã blancuri. De exemplu:
(read ”Hello”) returneazã HELLO
(read ”(a)”) returneazã (A)

Release 10 read-char
(read-char [<descr-fis>])
Returneazã codul ASCII al primului caracter primit

taturã sau din fiºierul deschis (cu open) descris prin descriptorul
Aceastã funcþie citeºte un singur caracter din bufferul de intrare de la tas-

<descr–fis>. (Prin ”buffer” se înþelege ”memorie tampon”; asociind-o cu


tastatura, ne gândim la caracterele care se acumuleazã undeva pe mãsurã ce
sunt introduse - se acumuleazã în acest buffer, termenul fiind consacrat; la
încheierea liniei, cã veni vorba de tastaturã, bufferul este golit, aºteptân-

tere în bufferul de intrare, read-char vã va aºtepta sã introduceþi ceva de


du–se altã introducere). Dacã nu se dã un <descr-fis> ºi nu existã carac-

la tastaturã (încheiat cu RETURN). De exemplu, presupunând cã bufferul


de intrare este gol:
Capitolul 5 257

(read-char)

RETURN, read-char va returna 65 (codul ASCII pentru litera ”A”).


va aºtepta sã se introducã ceva. Dacã introduceþi ”ABC” urmat de

Eventualele trei apeluri succesive ale lui read-char vor returna 66, 67 ºi 10
(”newline”), respectiv. Dacã dupã asta se mai face un apel read-char, se va
aºtepta iar o introducere de la tastaturã.
Diferitele sisteme de operare sub care poate fi rulat AutoCAD (ºi implicit
AutoLISP) folosesc diferite convenþii pentru a semnala sfârºitul de linie
într-un fiºier text ASCII. UNIX, de exemplu, foloseºte un singur caracter
(LF, 10 în codul ASCII), în timp ce MS-DOS ºi PC-DOS (cele pe care le
subînþelegem noi mereu) folosesc o pereche de caractere în acest scop
(CR/LF, cu codurile ASCII 13 ºi 10 - ”CR” vine de la Carriage Return,
adicã întoarcerea carului maºinii de scris, iar ”LF” de la Line Feed, adicã
avansul cu o linie al ”hârtiei”; dactilografa, când trage de cunoscuta manetã
a maºinii de scris, face ambele operaþii simultan în mod automat, dacã vã

care sã fie portabile (fãrã a depinde de maºinã), read-char acceptã toate


uitaþi cu atenþie...). Pentru a facilita dezvoltarea de programe AutoLISP

aceste convenþii, returnând un singur caracter ”newline” (cod 10 ASCII) ori


de câte ori este întâlnit un caracter (sau o secvenþã de caractere) cu sensul
de ”end-of-line” (”sfârºit-de-linie”).

Release 10 read-line
(read-line [<descr-fis>])
Citeºte un ºir de la tastaturã sau dintr-un fiºier deschis

open) descris prin descriptorul <descr-fis>. Dacã este întâlnit sfârºitul de


Aceastã funcþie citeºte un ºir de la tastaturã sau din fiºierul deschis (cu

fiºier (EOF), read-line returneazã nil, altfel returneazã ºirul care a fost
citit. De exemplu, presupunând cã F este un simbol asociat (cu open) unui
descriptor de fiºier valid:
(read-line f)
va returna urmãtoarea linie de intrare din fiºier, sau nil atunci când va fi
întâlnit sfârºitul de fiºier.
258 Funcþii AutoLISP

Release 10 redraw
(redraw [<nument> [<mod>]])
Redeseneazã viewport/entitate
Efectul funcþiei depinde de numãrul de argumente furnizate. Dacã este
apelatã fãrã argumente:
(redraw)
va reface imaginea curentã, exact ca ºi comanda REDRAW din AutoCAD.

port se dau la vports). Dacã este apelatã cu un argument nume de entitate:


(mai exact, refacerea opereazã pe ”viewport”-ul curent; detalii despre view-

(redraw <nument>)

entitate pe ecran dupã folosirea lui grclear (care ºterge ecranul). Controlul
va fi redesenatã entitatea selectatã. Aceasta este utilã pentru a identifica o

complet al redesenãrii unei entitãþi este asigurat de apelarea lui redraw cu


douã argumente:
(redraw <nument> <mod>)
unde <nument> este numele entitãþii de redesenat, iar <mod> este un
întreg cu una dintre urmãtoarele valori:
Mod REDRAW Acþiune
1 Redesenare entitate pe ecran
2 Retragere (eliminare) entitate
3 Subliniere (highlight) entitate (dacã ecranul permite)
4 Eliminare subliniere entitate (dacã ecranul permite)
Dacã <nument> este antetul unei entitãþi complexe (polilinie sau bloc cu
atribute), vor fi procesate atât entitatea principalã, cât ºi sub-entitãþile sale,

gativ, redraw va lua în seamã numai antetul entitãþii.


dacã argumentul <mod> este pozitiv. Dacã argumentul <mod> este ne-

Funcþia redraw returneazã întotdeauna nil.


Capitolul 5 259

Release 11 regapp
(regapp <aplicatie>)
Înregistreazã un nume de aplicaþie asociat cu desenul AutoCAD curent
De reþinut cã înregistrarea se face în vederea utilizãrii datelor extinse de
obiect.
Argumentul <aplicatie> este un ºir de pânã la 31 de caractere lungime
care respectã convenþia de denumiri simbol. Un nume de aplicaþie poate sã
conþinã litere, cifre ºi caracterele speciale $, - (minus), ºi _ (subliniere, sau
„underscore”). Nu poate sã conþinã blancuri. Indiferent cum sunt date,
literele din nume sunt convertite la majuscule.
Dacã este înregistratã o aplicaþie cu acelaºi nume, aceastã funcþie
returneazã nil, altfel returneazã numele aplicaþiei.
Dacã înregistrarea reuºeºte, numele aplicaþiei este inclus în tabela de sim-
boluri APID. Aceastã tabelã conþine o listã a aplicaþiilor care folosesc date
extinse în desen.
(regapp ”ADESK_4153322344”)
(regapp ”DESIGNER-v2.1-124753”)
NOTA:
Se recomandã sã alegeþi un nume unic de aplicaþie. O cale de a vã
asigura în aceastã privinþã, este de a adopta o schemã de denumiri
care includ numele companiei sau al produsului ºi un numãr unic
(ca numãrul Dvs. de telefon sau data/ora curentã). Numãrul de
versiune al produsului poate fi inclus în numele aplicaþiei sau sto-
cat de cãtre aplicaþie într-un câmp numeric întreg sau real sepa-
rat; de exemplu, (1040 2.1).

Release 10 rem
(rem <num1> <num2>)
Returneazã restul împãrþirii primului argument la al doilea
Aceastã funcþie divide (împarte aritmetic) <num1> la <num2> ºi
260 Funcþii AutoLISP

returneazã restul împãrþirii (adicã <num1> mod <num2>, unde ”mod”


are sens de ”modulo”, cum se dã în manualele noastre de liceu). Vã atragem
atenþia cã puteþi fi tentaþi/tentate sã credeþi cã abrevierea ”rem” provine de
la englezescul ”remark”, cu sens de ”comentariu”, cum este prin multe
locuri în folclorul informatic (BASIC). Nu este aºa, vine de la ”remainder”,
care înseamnã ”rest” matematic. (În englezã, ”rest” înseamnã ºi rest - cu
sens de rãmãºiþã, deci nu matematic - dar ºi odihnã! Aþi auzit, nu-i aºa, de
expresia ”take a rest” adicã ”odihneºte-te”!?). ªi fiindcã tot a venit vorba de
comentariu, se ºtie cã în AutoLISP comentariile sunt reprezentate de ca-
racterele ce urmeazã într-o linie dupã caracterul ”;”. Sigur cã dacã acest ca-
racter este primul din linie, întreaga linie va fi consideratã comentariu.
Funcþia rem poate fi folositã atât cu numere întregi cât ºi reale, pe baza
regulei standard a avansãrii de la întreg la real. De exemplu:
(rem 42 12) returneazã 6
(rem 12.0 16) returneazã 12.0
(rem 60 3) returneazã 0 (împãrþire exactã)

Release 10 repeat
(repeat <numãr> <expr>...)
Evalueazã repetat expresiile furnizate
În aceastã funcþie, <numãr> este reprezentat de orice numãr întreg pozi-
tiv. Funcþia evalueazã fiecare <expr> de <numãr> ori ºi returneazã va-
loarea ultimei expresii. De exemplu, dându-se atribuirile:
(setq a 10)
(setq b 100)
atunci:
(repeat 4
(setq a (+ a 10))
(setq b (+ b 10))
) returneazã 140
Capitolul 5 261

Release 10 reverse
(reverse <list>)
Returneazã o listã cu elementele ordonate invers
Aceastã funcþie returneazã <list> cu elementele puse în ordine inversã. De
exemplu:
(reverse ‘((a) b c)) returneazã (C B (A))

Release 10 rtos
(rtos (numãr> [<mod> [<precizie>]])
Converteºte un numãr într-un ºir
Aceastã funcþie returneazã un ºir care este reprezentarea lui <numãr> (un
numãr real) potrivit setãrii lui <mod>, <precizie> ºi variabilei DIMZIN
de cotare din AutoCAD. Argumentele <mod> ºi <precizie> sunt numere
întregi care selecteazã unitãþile liniare mod ºi precizie. Valorile acceptate
pentru <mod> sunt:
Mod RTOS Formate de editare
1 ªtiinþific
2 Zecimal
3 Engineering (cu picioare ºi þoli zecimali)
4 Arhitectural (cu picioare ºi þoli fracþionali)
5 Unitãþi fracþionale arbitrare
NOTÃ:
Se ºtie cã piciorul englezesc (foot) are mãrimea unei tãlpi
(30,479947 cm, deci talpa lui Robin Hood sau a lui Little John,
deoarece corespunde numãrului la pantof cam 44, 45!) egalând 12
þoli, iar þolul (inch) are mãrimea unui deget (2,5399956 cm, adicã

Pe de altã parte, etimologic, rtos provine de la ”Real TO String”,


grosimea degetului policar - gros - al legendarului Robin Hood).

adicã o conversie de la numãr real la ºir ASCII, cum era ºi la atof


sau atoi, nu-i aºa?
262 Funcþii AutoLISP

Argumentele <mod> ºi <precizie> corespund variabilelor AutoCAD de


sistem LUNITS ºi LUPREC. Dacã omiteþi aceste argumente, ele vor fi
luate din valorile curente ale variabilelor LUNITS ºi LUPREC.
De exemplu, dându-se DIMZIN = 0:
(rtos 17.5 1 4) returneazã ”1.7500E+01”
(rtos 17.5 2 2) returneazã ”17.50”
(rtos 17.5 3 2) returneazã ”1’-5.50””
(rtos 17.5 4 2) returneazã ”1’-5 1/2””
(rtos 17.5 5 2) returneazã ”17 1/2”

Release 10 set
(set <simbol> <expr>)
Fixeazã valoarea unui nume de simbol pe o expresie

este un nume de simbol quot-at (acest termen este explicat la defun)) eva-
Aceastã funcþie seteazã (fixeazã) valoarea lui <simbol> (unde <simbol>

luând <expr> ºi returnând acea valoare. De exemplu:


(set ‘a 5.0) returneazã 5.0 ºi seteazã simbolul A
(set (quote b) ‘a)
Dacã set este folositã cu un nume de simbol ne-quot-at (pardon...), ea poate
returneazã A ºi seteazã simbolul B

atribui o nouã valoare unui alt simbol în mod indirect. De exemplu, recon-
siderând atribuirile de mai sus:
(set b 640)
va returna 640 ºi va atribui valoarea 640 simbolului A (deoarece asta
conþine simbolul B).

Release 12 set_tile
(set_tile <cheie> <valoare>)
Seteazã valoarea unei zone (tile) de casetã de dialog
Argumentul <cheie> este un ºir care dã zona, iar <valoare> este un ºir care dã
noua valoare de atribuit zonei (iniþial atribuitã prin atributul <valoare>)
Capitolul 5 263

Release 13 setcfg
(setcfg <numecfg> <valcfg>)
Scrie datele aplicaþiei în secþiunea AppData a fiºierului ACAD.CFG
Argumentul <numecfg> este un ºir care specificã secþiunea ºi parametrul

setcfg returneazã nil. Arguumentul <cfgval> trebuie sã fie un ºir de


de setat pe valoarea lui <cfgval>. Dacã <numecfg> nu este valid, atunci

forma:
”AppData/nume_aplicatie/nume_sectiune/.../nume_param”
Codul dat mai jos seteazã parametrul GrosPerete din secþiunea
AppData/Constr pe valoarea 8 ºi returneazã ºirul ”8”:
(setcfg ”AppData/Constr/GrosPerete” ”8”)
Vezi ºi funcþia getcfg.

Release 13 setfunhelp
(setfunhelp <c:numefc> [<fishelp> [<topicã> [<comandã>]]])
Înregistreazã comanda utilizator pentru a fi regãsitã topica la HELP
Argumentul <c:numefc> este un ºir care dã comanda definitã de utilizator

transmis funcþiei defun, argumentul <c:numefc> pentru setfunhelp tre-


(funcþia c:xxx) ºi trebuie sã includã prefixul „c:”. Faþã de numele funcþiei

buie sã fie un ºir quot-at (vezi funcþia defun). Celelalte trei argumente

mis ca argumente funcþiei help. Funcþia setfunhelp returneazã ºirul


opþionale rãmase descriu apelul help de fãcut. Ele sunt tot ºiruri de trans-

transmis ca <c:numefc> dacã reuºeºte ºi nil altfel.


De notat cã aceastã funcþie verificã doar dacã argumentul <c:numefc> are

argumente sunt corecte. Când folosiþi funcþia defun pentru a defini funcþia
prefixul c:. Ea nu verificã dacã numele c:numefc existã sau dacã celelalte

c:xxx, ea retrage acel nume dintre cele înregistrate de setfunhelp (dacã


mai sunt ºi altele). Astfel, setfunhelp va fi chematã numai dupã apelul lui
defun, care defineºte comanda creatã de utilizator.
Urmãtorul exemplu foloseºte defun pentru a defini comanda utilizator
264 Funcþii AutoLISP

MYFUN. Funcþia setfunhelp înregistreazã numele funcþiei C:MYFUN ºi


asociazã numele cu topica myfun din fiºierul MYHELP.AHP.
(defun c:myfun()
...
(getint ”Introduceti..: ”)
...
)
(setfunhelp ”c:myfun” ”myhelp.ahp” ”myfun”)

Release 10 setq
(setq <sim1> <expr1> [<sim2> <expr2>]...)
Seteazã valoarea unui simbol sau mai multora pe expresiile asociate
Aceastã funcþie seteazã (fixeazã) valoarea lui <sim1> din <expr1>, a lui
<sim2> din <expr2> º.a.m.d. Este funcþia de atribuire de bazã în
AutoLISP. Ea returneazã ultima <expr>. De exemplu:
(setq a 5.0) returneazã 5.0
ºi seteazã simbolul A pe 5.0. Ori de câte ori este evaluat A, el va fi evaluat
prin numãrul real 5.0. Alte exemple:
(setq abc 123 x 4.7) returneazã 4.7
(setq s ”it”) returneazã ”it”
(setq x ‘(a b)) returneazã (A B)
Pentru a ”arãta bine”, primul exemplu de mai sus se va scrie:
(setq abc 123
c 4.7)
Aºa se vede mult mai bine cã, deºi se returneazã doar ultima valoare
atribuitã, de fapt s-au fãcut douã atribuiri, abc=123 ºi x=4.7. A se observa
alinierea blancurilor pe verticalã.
Funcþiile set ºi setq creeazã sau modificã simboluri globale, în afara cazu-
lui când sunt folosite într-un defun pentru a atribui valori unor argumente
de funcþii sau unor simboluri declarate locale în contextul acelui defun. De
exemplu:
(setq glo1 123) ;Creeaza un simbol global
(defun demo (arg1 arg2 / loc1 loc2)
Capitolul 5 265

(setq arg1 234) ;Atribuie local o nouã valoare


(setq loc1 345) ;Atribuie local o nouã valoare
(setq glo1 456) ;Atribuie global o nouã valoare
(setq glo2 56) ;Creeazã un nou simbol global
)
Simbolurile globale pot fi gãsite sau modificate de orice funcþie, sau folosite
în orice expresie. Simbolurile locale ºi argumentele de funcþie sunt
recunoscute doar în timpul evaluãrii funcþiei care le defineºte (ºi al eva-
luãrii funcþiilor apelate de aceasta). De notat cã argumentele de funcþii pot
fi folosite ca simboluri locale; funcþia îºi poate încãrca propriile valori, dar
astfel de schimbãri sunt descãrcate (pãrãsite) la încheierea evaluãrii
funcþiei.
Funcþiile set ºi setq sunt capabile sã atribuie noi valori simbolurilor
interne (”built-in”) ºi numelor de funcþii ale AutoLISP-ului, descãrcând
atribuirile lor originale sau fãcându-le inaccesibile. Din pãcate, unii uti-
lizatori fac o groazã de nãzdrãvãnii, încercând lucruri de genul:
(setq angle (...)) ; GRESIT!
(setq length (...)) ; GRESIT!
(setq max (...)) ; GRESIT!
(setq t (...)) ; GRESIT!
(setq pi 3.0) ; GRESIT!!!
Nu e permis sã se atribuie valori numelor de funcþii interne (angle, length,
max), lui T (care înseamnã TRUE) sau constantei π, nu credeþi? Unde am
ajunge? Pentru a evita toate aceste erori stranii ar trebui sã dispunem de

simplu, listându-le cu ”comanda” !atomlist (sau funcþia atoms-family - vezi).


TOATE numele de funcþii ºi simboluri folosite de AutoCAD. Acest lucru este

Release 10 setvar
(setvar <numevar> <valoare>)
Seteazã o variabilã de sistem AutoCAD
Aceastã funcþie seteazã (fixeazã) o variabilã de sistem AutoCAD pe va-
loarea <valoare> ºi returneazã acea valoare. Numele variabilei trebuie sã
266 Funcþii AutoLISP

fie încadrat cu ghilimele. De exemplu:


(setvar ”FILLETRAD” 0.50) returneazã 0.5
setând raza de racordare (FILLET) a AutoCAD-ului pe 0.5 unitãþi. Pentru
variabilele de sistem cu valori întregi, valoarea <valoare> trebuie sã fie
cuprinsã între -32768 ºi +32767.

emite vreun prompter. Dacã folosiþi setvar pentru a seta o nouã valoare în
Unele comenzi AutoCAD preiau valorile variabilelor de sistem înainte de a

timp ce o comandã este în curs, noua valoare poate sã nu devinã efectivã


decât la urmãtoarea comandã AutoCAD.

Release 10 sin
(sin <unghi>)
Returneazã sinusul unui unghi dat ca expresie realã în radiani
Aceastã funcþie returneazã sinusul lui <unghi> ca un numãr real, unde

(sin 1.0)
<unghi> este exprimat în radiani. De exemplu:

(sin 0.0)
returneazã 0.841471
returneazã 0.0

Release 12 slide_image
(slide_image <x1> <y1> <wid> <hgt> <nume_sld>)
Afiºeazã un slide AutoCAD în zona imagine din caseta de dialog activã
Slide-ul poate fi un fiºier slide (.SLD) sau un slide dintr-o bibliotecã de
slide-uri (.SLB): argumentul <nume_sld> îl specificã exact în felul cerut
de comanda VSLIDE pentru un fiºier menu:
nume_sld_sau_nume_bib(nume_sld)
Primul colþ (stânga-sus) al slide-ului - punctul sãu de inserþie - este
amplasat în (x1,y1) iar al doilea (dreapta-jos) este amplasat la distanþa re-
lativã (wid,hgt) de primul (wid ºi hgt trebuie sã fie valori pozitive).

colþului dreapta-jos folosind funcþiile dimx_tile ºi dimy_tile (vezi).


Originea (0,0) este colþul stânga-sus al imaginii. Obþineþi coordonatele
Capitolul 5 267

Release 13 snvalid
(snvalid <nume_simb> [<flag>])
Verificã numele tabelei de simboluri pentru caractere valide
Argumentul <nume_simb> este un ºir care dã numele tabelei de sim-

snvalid returneazã T dacã <nume_simb> este un nume valid de tabelã de


boluri. Argumentul opþional <flag> poate fi 1 sau 0 (implicit 0). Funcþia

simboluri ºi nil altfel.


Numele de tabelã de simboluri constã din caractere alfanumerice ºi carac-
terele speciale $, - (minus) ºi _ (subliniere). Un ºir nul nu este un nume
valid.

Release 10 sqrt
(sqrt <numãr>)
Returneazã radicalul dintr-un numãr real
Aceastã funcþie returneazã rãdãcina pãtratã a lui <numãr> ca un numãr
real. De exemplu:
(sqrt 4) returneazã 2.0
(sqrt 2.0) returneazã 1.41421

Release 10 ssadd
(ssadd [<nument> [<ss>]])
Adaugã o entitate la o mulþime de selecþie, sau creeazã una nouã
Dacã este apelatã fãrã argumente, ssadd construieºte o nouã mulþime de

de entitate, ssadd construieºte o nouã mulþime de selecþie conþinând acel


selecþie fãrã membri (vidã). Dacã este apelatã cu un singur argument nume

singur nume de entitate. Dacã este apelatã cu un nume de entitate ºi o

selecþie. Funcþia ssadd returneazã întotdeauna mulþimea nouã sau modi-


mulþime de selecþie, ea adaugã numele de entitate la acea mulþime de
268 Funcþii AutoLISP

ficatã. De notat cã, atunci când se adaugã o entitate unei mulþimi, noua
entitate este într-adevãr adãugatã mulþimii de selecþie existente iar
mulþimea transmisã ca <ss> este returnatã ca rezultat. În acest fel, dacã
mulþimea este atribuitã altei variabile, ea va reflecta de asemenea adãu-

ssadd este ignoratã; nu se emite nici un mesaj de eroare.


garea efectuatã. Dacã entitatea numitã se aflã deja în mulþime, operaþia

Iatã exemple:
(setq e1 (entnext)) ;atribuie numele E1 primei entitãþi din
desen
(setq ss (ssadd)) ;atribuie numele SS unei mulþimi de
selecþie vide
(ssadd e1 ss) ;returneazã mulþimea de selecþie SS cu
numele de entitate E1 adãugat
(setq e2 (entnext e1)) ;preia entitatea de dupã E1
(ssadd e2 ss) ;returneazã mulþimea de selecþie SS cu
numele de entitate E2 adãugat

Release 10 ssdel
(ssdel <nument> <ss>)
Eliminã o entitate din mulþimea de selecþie
Funcþia ssdel eliminã numele de entitate <nument> din mulþimea de
selecþie <ss> ºi returneazã numele mulþimii de selecþie <ss>. De notat cã
entitatea este într-adevãr ºtearsã din mulþimea de selecþie datã, în loc de a
se returna o altã mulþime de selecþie cu elementul ºters. Dacã entitatea nu
se aflã în mulþime, se returneazã nil.
De exemplu, cunoscând cã numele de entitate E1 este membru al mulþimii
de selecþie SS ºi cã E2 nu este, atunci:
(ssdel e1 ss) ;returneazã mulþimea de selecþie SS cu
entitatea E1 eliminatã
(ssdel e2 ss) ;returneazã nil (nu modificã SS)
Capitolul 5 269

Release 10 ssget
(ssget [<mod>] [<pt1> [<pt2>]] [<lista_pt>] [<lista_flt>])
Aºteaptã utilizatorul sã selecteze obiecte ºi returneazã mulþimea de selecþie
Funcþia ssget returneazã o mulþime de selecþie. Argumentul opþional
<mod> este un ºir care specificã metoda de selecþie a entitãþilor. Acesta
poate fi ”W”, ”C”, ”L” sau ”P”, corespunzând binecunoscutelor mijloace de
selecþie ”window”, ”crossing”, ”last” ºi ”previous” din AutoCAD. Potrivit
ultimelor versiuni de AutoCAD (de dupã Release 10) la acestea se adaugã
”WP”, ”CP”, ”I” ºi ”F”, corespunzând noilor mijloace ”WPolygon”,
”CPolygon”, ”Implied” ºi ”Fence”. Ele vor folosi, eventual, argumentul
<lista_pt>. În plus, <mod> poate fi ºi ”X”, permiþând crearea de mulþimi
de selecþie prin filtrarea de entitãþi (vezi mai jos). Argumentele <pt1> ºi
<pt2> specificã puncte relevante pentru selecþie (cum sunt colþurile opuse
ale unei ferestre). Furnizarea unui astfel de punct, fãrã a se menþiona un
<mod>, este echivalentã cu selecþia unei singure entitãþi prin ”ochirea” ei,
folosind acel punct. Argumentul <lista_flt> (introdus odatã cu Release 12)
este o listã asociatã care dã proprietãþile obiectului, adãugând la mulþimea

omise toate argumentele, atunci ssget cere utilizatorului sã indice interac-


de selecþie pe cele care întrunesc condiþiile din aceastã listã. Dacã sunt

tiv entitãþi pe ecran prin mecanismul ”Select objects:” al AutoCAD-ului.


Ca efect, va fi creatã mulþimea de selecþie. Aceasta va conþine numai
entitãþile principale (fãrã atribute sau vertex-uri de polilinie). Exemple:
(ssget) Cere utilizatorului sã facã selectare de entitãþi
(ssget ”P”) Selecteazã cele mai recent selectate obiecte
(ssget ”L”) Selecteazã ultima entitate adãugatã în baza de date
implicitã
(ssget ‘(2 2)) Selecteazã entitatea care trece prin punctul 2,2
(ssget ”W” ‘(0 0) ‘(5 5)) Selecteazã entitãþile din
interiorul ferestrei de la 0,0 la 5,5
(ssget ”C” ‘(0 0) ‘(1 1)) Selecteazã entitãþile ce taie
caseta de la 0,0 la 1,1
(ssget ”X” <list-flt>) Selecteazã entitãþile ce
corespund listei ”list-flt”
270 Funcþii AutoLISP

punctate, de exemplu) numai dacã ssget este folositã fãrã argumente. Nu


Obiectele selectate sunt marcate pe ecran în maniera cunoscutã (devenind

totuºi, funcþia entsel, ca o alternativã). Mulþimile de selecþie consumã din


se reþine nici o informaþie privind modul de selecþie al entitãþilor (vezi,

conexiunile temporare ale AutoCAD-ului cu sistemul de fiºiere. AutoLISP


nu poate avea deschise mai mult de 128 fiºiere pentru AutoCAD 386 (ºi
doar 6 pentru AutoCAD 286). Dacã se atinge acestã limitã, AutoLISP

apelurile de ssget. Pentru a închide o variabilã ”mulþime de selecþie”,


refuzã sã mai creeze alte mulþimi de selecþie ºi returneazã nil la toate

buie sã apelaþi ºi funcþia gc - vezi detalii în secþiunea 3.8 - înainte de


setaþi-o pe nil. (Dacã s-a atins limita de 128 (sau 6) mulþimi deschise, tre-

apelarea altei ssget.)


O variabilã ”mulþime de selecþie” astfel creatã poate fi transferatã
AutoCAD-ului ca rãspuns la orice prompter ”Select objects:” pentru care
selecþia ”Last” este validã. Prin aceasta vor fi selectate toate obiectele din
variabila ”mulþime de selecþie”.
NOTÃ:
De reþinut cã, din moment ce se indicã selecþia ”Last” drept eºan-
tion valabil, este necesar ca, dupã începerea sesiunii cu Editorul
de Desene AutoCAD sã se fi creat mãcar o singurã entitate pentru
ca mecanismul de selecþie sã funcþioneze. Adesea, începãtorii (ºi
eu am fãcut asta, nu vã temeþi...) creeazã o funcþie AutoLISP care
începe prin a selecta o mulþime asupra cãreia se vor face niºte pre-
lucrãri. Pentru a o proba, novicele lanseazã AutoCAD-ul ºi încar-
cã funcþia, dupã care o activeazã. Cum însã, pe ecran nu a fost cre-
atã nici mãcar o singurã entitate, încercarea eºueazã. Trasaþi o
simplã linie undeva ºi activaþi iar funcþia: acum va merge...
Filtre SSGET - (ssget ”X”)
Modul ”X” al ssget exploreazã întregul desen ºi creeazã o mulþime de
selecþie conþinând numele tuturor entitãþilor (principale) care rãspund
unui anumit criteriu. De exemplu, utilizând acest mecanism, puteþi obþine
o mulþime de selecþie conþinând toate entitãþile de un anume tip, dintr-un
anume layer sau de o anume culoare.
Capitolul 5 271

Aceastã formã a ssget este folositã astfel:


(ssget ”X” <lista-filtru>)

de funcþia entget (vezi). Lista-filtru specificã ce proprietate (proprietãþi) a


unde <lista-filtru> este o listã asociatã, similarã tipului de listã furnizatã

(ale) entitãþilor trebuie cercetatã ºi care valoare a acesteia (acestora) consti-


tuie o potrivire. De exemplu:
(ssget ”X” (list (cons 0 ”CIRCLE”)))
va returna o mulþime de selecþie constând din toate cercurile din desen
(codul de grup 0 este tipul de entitate - vezi tabela de mai jos). Similar:
(ssget ”X” (list (cons 8 ”ETAJ3”)))
va returna o mulþime de selecþie conþinând toate entitãþile principale din
layerul ”ETAJ3” (codul de grup 8 este numele layerului). Dacã în <lista-

funcþia cons), atunci trebuie ca toate condiþiile specificate sã se potriveascã


filtru> se specificã mai mult de o pereche cu punct (vezi explicaþii la

pentru o entitate pentru ca aceasta sã fie inclusã în mulþimea de selecþie. De


exemplu:
(ssget ”X” (list (cons 0 ”CIRCLE”) (cons 8 ”ETAJ3”) (cons 62 1)))
va returna o mulþime de selecþie conþinând toate cercurile roºii (grup 62,
culoare 1) din layerul ”ETAJ3”.
Deºi lista de filtrare a entitãþilor are acelaºi format ca ºi cel returnat de ent-
get, numai o submulþime a codurilor de grup ale entitãþilor este recunos-
cutã de ssget ”X” (vezi tabela de mai jos). Funcþia ssget ”X” lucreazã prin
explorarea întregului desen ºi compararea câmpurilor fiecãrei entitãþi prin-
cipale cu lista de filtrare specificatã. Dacã proprietãþile unei entitãþi se
potrivesc în totalitate cu câmpurile specificate în lista filtru, aceasta este

inclusã în mulþimea de selecþie. Funcþia ssget returneazã nil dacã nici o


inclusã în mulþimea de selecþie returnatã. Altfel, desigur, entitatea nu va fi

entitate din baza de date nu rãspunde criteriilor din lista filtru.


Cod Descriere
0 Tip entitate
2 Nume Block pentru referinþe Block (INSERT)
6 Nume tip de linie
7 Nume stil text pentru Text ºi Definiþie Atribute
272 Funcþii AutoLISP

8 Nume layer
38 Elevaþie (real) (va fi folositã într-un viitor Release AutoCAD)
39 Grosime (thickness) (real)
62 Numãr culoare (0 = BYBLOCK, 256 = BYLAYER)
66 Indicator de ”urmeazã atribute” pentru referinþe Block (INSERT)

În tabela de mai sus se dau codurile de grup acceptate de ssget ”X”.


210 Direcþie vector extruziune 3D (listã de trei reale)

O listã filtru goalã sau absentã face ca ssget sã selecteze toate entitãþile din
baza de date.
Pentru a utiliza în comparaþii codurile de grup notate ca (real), trebuie dat
un numãr real drept valoare test. Astfel, pentru a identifica entitãþi cu
thickness de 2.0:
(ssget ”X” (list (cons 39 2))) ;va fi incorect, dar
(ssget ”X” (list (cons 39 2.0))) ;va merge
Funcþia ssget ”X” returneazã nil dacã lista-filtru include coduri de grup

care folosesc ssget ”X” sã funcþioneze ºi dacã se vor adãuga alte coduri în
care nu apar în tabela de mai sus. Aceasta ajutã ca programele AutoLISP

viitor.
NOTA:
Ceea ce a fost scris pânã aici corespunde - cu mici excepþii sem-

noutãþile introduse la funcþia ssget odatã cu Release-12.


nalate - AutoLISP-ului Release-10. De aici în jos sunt date

Teste relaþionale
Dacã nu se specificã altfel, un test ”egal cu” este implicat pentru orice arti-
col din <lista_flt>. Pentru grupurile numerice (întregi, reale, puncte ºi
vectori) puteþi da alte relaþii incluzând grupul de cod special -4, care este
un ºir ce indicã operatorul de test ce se va aplica urmãtorului grup din lista
filtru. De exemplu:
(ssget ”X” ‘((0 . ”CIRCLE”) (-4 . ”>=”) (40 . 2.0)))
selecteazã toate cercurile ale cãror raze (cod de grup 40) sunt mai mari sau
egale cu 2.0.
Urmãtoarea listã dã operatorii posibili.
Capitolul 5 273

Operator Descriere
”*” Merge orice (mereu adevãrat)
”=” Egal cu
”!=”, ”/=” sau ”<>” Neegal cu
”<” Mai mic decât
”<=” Mai mic sau egal cu
”>” Mai mare decât
”>=” Mai mare sau egal cu
”&” ªI logic pe biþi (numai pe grup de întregi)
”&=” „Egal cu” mascat pe biþi (numai pe grup de
întregi)
Utilizarea operatorilor relaþionali depinde numai de felul grupului de tes-
tat, astfel:
- Toþi operatorii relaþionali cu excepþia celor pe biþi (”&” ºi ”&=”) sunt
valizi atât pentru grupuri de valori întregi sau reale.
- Operatorii la nivel de bit ”&” ºi ”&=” sunt valabili numai pe grupuri de

((grup_întreg & filtru) /= 0) - adicã dacã orice bit setat în


valori întregi. Operatorul AND pe biþi, ”&”, este adevãrat dacã

”&=”, este adevãrat dacã ((grup_întreg & filtru) = filtru)


mascã este setat ºi în grupul de întregi. Egalul mascat pe biþi,

- adicã dacã toþi biþii setaþi în mascã sunt setaþi ºi în grup_întreg


(ceilalþi biþi pot fi setaþi în grup_întreg dar nu sunt verificaþi).
- Pentru grupurile de puncte, testele lui X, Y ºi Z pot fi combinate într-un
singur ºir, cu operatorii separaþi prin virgule (de ex. ”>,>,*”).
Dacã din ºir este omis un operator (de ex. ”=,<>” omite pe Z),
este asumat operatorul ”Merge orice”, adicã ”*”.
- Vectorii de direcþie (tip de grup 210) pot fi comparaþi numai cu opera-
torii ”*”, ”=” ºi ”!=” (sau alt ºir echivalent pentru ”neegal cu”).
- Nu puteþi folosi operatori relaþionali cu grupurile de ºiruri; folosiþi în
schimb teste ”wild-card”.
Grupuri Logice de Teste Filtru
Operatorii relaþionali descriºi mai sus sunt operatori binari. Puteþi testa
grupurile ºi creând expresii de test booleene imbricate care folosesc opera-
torii de grupare listaþi mai jos. Operatorii de grupare sunt specificaþi prin
274 Funcþii AutoLISP

combine corect în listele de filtrare pentru ca funcþia ssget sã nu eºueze.


grupuri -4, ca ºi operatorii relaþionali. Ei sunt împerecheaþi ºi trebuie sã se

Numãrul de operanzi pe care îi pot implica aceºti operatori depinde de


operaþie.
În tabelul de mai jos se dau aceste dependenþe.

Operator
de start Include Operator final
”<AND” Unul sau mai mulþi operanzi ”AND>”
”<OR” Unul sau mai mulþi operanzi ”OR>”
”<XOR” Doi operanzi ”XOR>”
”<NOT” Un operand ”NOT>”
Legat de operatorii de grupare, un operand este un grup de câmp-entitate,
un operator relaþional urmat de un grup câmp-entitate, sau o expresie
imbricatã creatã de aceºti operatori. Iatã un exemplu de grupare a operato-
rilor într-o listã de filtrare:
(ssget ”X” ‘((-4 . ”<OR”)
(-4 . ”<AND”)
(0 . ”CIRCLE”)
(40 . 1.0)
(-4 . ”AND>”)
(-4 . ”<AND”)
(0 . ”LINE”)
(8 . ”ABC”)
(-4 . ”AND>”)
(-4 . ”OR>”)
)
)
Aceasta selecteazã toate cercurile cu raza 1.0 ºi toate liniile din layerul
”ABC”.
Din cauzã cã operatorii de grup nu depind de tipul de literã (micã,
MAJUSCULţ), acestea pot fi date ºi cu literã micã (de exemplu ”<and” ºi
Capitolul 5 275

”and>”).

Release 10 sslength
(sslength <ss>)
Returneazã un întreg conþinând numãrul de entitãþi dintr-o mulþime de selecþie
Aceastã funcþie returneazã un întreg ce conþine numãrul de entitãþi din
mulþimea de selecþie <ss>. Numãrul returnat este real dacã e mai mare de
32767 (deoarece întregii sunt stocaþi pe 16 biþi, adicã au valori între -32768
ºi 32767). Mulþimile de selecþie nu conþin niciodatã duplicate ale unei
aceleiaºi entitãþi.
Exemplu:
(setq sset (ssget ”L”)) ;pune ultimul obiect în SSET
(sslength sset) ;returneazã 1

Release 10 ssmemb
(ssmemb <nument> <ss>)
Verificã dacã o entitate este membru al unei mulþimi de selecþie

al mulþimii de selecþie <ss>. Dacã este, atunci funcþia ssmemb returneazã


Aceastã funcþie verificã dacã numele de entitate <nument> este membru

numele entitãþii (<nument>); dacã nu, returneazã nil.


De exemplu, cunoscând cã numele de entitate E1 este membru al mulþimii
de selecþie SS ºi cã E2 nu este, atunci:
(ssmemb e1 ss) ;returneazã numele entitãþii E1
(ssmemb e2 ss) ;returneazã nil

Release 10 ssname
(ssname <ss> <index>)
Returneazã numele de entitate al elementului indexat al unei mulþimi de selecþie
276 Funcþii AutoLISP

Aceastã funcþie returneazã numele de entitate care figureazã în poziþia


<index> în mulþimea de selecþie <ss>. Dacã <index> este negativ sau
mai mare decât numãrul ultimei entitãþi din <ss>, atunci se returneazã

cu ssget vor fi întotdeauna nume de entitãþi principale. Subentitãþile


nil. Primul element din <ss> are indexul zero. Numele de entitãþi obþinute

entnext, care asigurã accesul ºi la ele).


(atributele de bloc ºi vertex-urile de polilinii) nu sunt returnate (dar vezi

Exemple:
(setq sset (ssget)) ;creeazã o mulþime de selecþie numitã SSET
(setq ent1 (ssname sset 0)) ;preia numele primei entitãþi din
SSET
(setq ent4 (ssname sset 3)) ;preia numele entitãþii a IV-a din
SSET
Pentru a avea acces dincolo de cea de-a a 32767-a entitate din mulþimea de
selecþie, argumentul <index> trebuie dat ca real. De exemplu:
(setq entx (ssname sset 50843.0)) ;preia numele entitãþii
50844 din SSET

Release 13 startapp
(startapp <cmdapp> <fisier>)
Lanseazã o aplicaþie Windows
Argumentul <cmdapp> este un ºir care dã aplicaþia de executat. Dacã
<cmdapp> nu include un nume complet de cale, ea cautã aplicaþia
folosind variabila ambientalã PATH. Argumentul <fisier> este un ºir care
dã numele fiºierului de deschis. Funcþia returneazã un întreg mai mare ca
0 dacã reuºeºte, altfel returneazã 0.
Urmãtorul cod lanseazã aplicaþia Notepad din Windows ºi deschide fiºierul
ACAD.LSP:
(startapp ”notepad” ”acad.lsp”)
NOTA:
Funcþia este admisã numai de AutoCAD-13 pentru Windows.
Capitolul 5 277

Release 12 start_dialog
(start_dialog)
Afiºeazã o casetã de dialog ºi începe, acceptând o introducere utilizator

lui new_dialog (vezi). Caseta de dialog rãmâne activã pânã ce o expresie


Mai întâi trebuie sã iniþializaþi caseta de dialog printr-un apel anterior al

de acþiune sau o funcþie apel de retur apeleazã done_dialog (vezi). În mod


uzual, done_dialog este asociat cu acea zonã (tile) a cãrei cheie este
”accept” (tipic, butonul ”OK”) ºi zona a cãrei cheie este ”cancel” (tipic,
butonul ”Cancel”).
Funcþia start_dialog nu are argumente. Ea returneazã opþional întregul
status transmis lui done_dialog. valoarea implicitã este 1 dacã utilizatorul

minate cu term_dialog. Dacã, însã, lui done_dialog i se transmite un


apasã OK, 0 dacã apasã Cancel ºi -1 dacã toate casetele de dialog au fost ter-

întreg status mai mare ca 1, start_dialog returneazã aceastã valoare, al


cãrei înþeles depinde de aplicaþie.

Release 12 start_image
(start_image <cheie>)
Lanseazã crearea unei imagini în zona casetei de dialog
Urmãtoarele apeluri ale lui fill_image, slide_image ºi vector_image
afecteazã aceastã imagine pânã ce aplicaþia apeleazã end_image.
Argumentul <cheie> este un ºir care specificã zona de casetã de dialog.
Acesta este sensibil la tipul de literã (micã, MAJUSCULţ).

Release 12 start_list
(start_list <cheie> [<operaþie> [<index>]])
Începe procesarea unei liste în zona de listare a casetei de dialog
Argumentul <cheie> este un ºir care dã zona (tile) a casetei de dialog.
278 Funcþii AutoLISP

Acesta este sensibil la tipul de literã (micã, MAJUSCULţ). Argumentul


<operaþie> este un întreg care specificã zona casetei de dialog.
Argumentul <cheie> este un întreg ale cãrui valori sunt listate mai jos.
Val Descriere
1 Schimbã conþinutul listei selectate
2 Adaugã noua intrare de listã

Argumentul <index> este ignorat dacã apelul lui start_list începe cu o


3 ªterge lista veche ºi creeazã o nouã listã (implicit)

schimbat prin urmãtorul apel al lui add_list. Argumentul <index> începe


operaþie de schimbare (1), caz în care <index> indicã articolul de listã de

de la zero. Dacã nu specificaþi <operaþie>, ea se ia implicit 3, iar dacã daþi


<operaþie> dar nu ºi <index>, atunci <index> ia valoarea implicitã 0.
Apelurile urmãtoare ale lui add_list afecteazã lista lansatã de start_list
pânã ce aplicaþia apeleazã end_list.

Release 10 strcase
(strcase <ºir> [<case>])
Returneazã un ºir ale cãrui caractere alfabetice au fost convertite ca tip de literã
Funcþia strcase preia ºirul specificat prin argumentul <ºir> ºi returneazã
o copie a sa cu toate caracterele alfabetice convertite la literã mare sau micã,
dupã cum se indicã prin argumentul <case>. Dacã argumentul <case>
este omis sau este nil, atunci toate caracterele amintite sunt convertite la
literã mare. Dacã acest <case> este inclus ºi nu este nil, conversia se face
la literã micã. De exemplu:
(strcase ”Exemplu”) returneazã ”EXEMPLU”
(strcase ”Exemplu” T) returneazã ”exemplu”

Release 10 strcat
(strcat <ºir1> <ºir2>...)
Returneazã un ºir obþinut prin concatenarea mai multor ºiruri
Capitolul 5 279

Aceastã funcþie returneazã un ºir obþinut prin concatenarea (alãturarea) lui


<ºir1>, <ºir2> etc. De exemplu:
(strcat ”a” ”mic”) returneazã ”amic”
(strcat ”a” ”b” ”c”) returneazã ”abc”
(strcat ”a” ”” ”c”) returneazã ”ac”

Release 10 strlen
(strlen <ºir>)
Returneazã un întreg care este numãrul de caractere din ºir
Aceastã funcþie returneazã lungimea în caractere a ºirului <ºir> ca un
întreg. De exemplu:
(strlen ”abcd”) returneazã 4
(strlen ”ab”) returneazã 2
(strlen ””) returneazã 0

Release 10 subst
(subst <art_nou> <art_vechi> <list>)
Înlocuieºte un articol într-o listã peste tot pe unde apare
Aceastã funcþie cautã <art_vechi> în <list> ºi returneazã o copie a <list>
în care toate <art_vechi> sunt substituite cu <art_nou>. Dacã
<art_vechi> nu apare în <list> atunci <list> este returnatã neschimbatã.
De exemplu, dându-se:
(setq exemplu ‘(a b (c d) b))
atunci:
(subst ‘qq ‘b exemplu) returneazã (A QQ (C D) QQ)
(subst ‘qq ‘z exemplu) returneazã (A B (C D) B)
(subst ‘qq ‘(c d) exemplu) returneazã (A B QQ B)
(subst ‘(qq rr) ‘(c d) exemplu) returneazã (A B (QQ RR) B)
(subst ‘(qq rr) ‘z exemplu)
Când este folositã în combinaþie cu assoc (vezi), funcþia subst asigurã un
returneazã (A B (C D) B)
280 Funcþii AutoLISP

mijloc util de substituire a valorii asociate unei chei din lista asociatã. De
exemplu, dându-se:
(setq who ‘(first john) (mid q) (last public)))
atunci:
(setq old

returneazã (FIRST JOHN)


(assoc ‘first who)

returneazã (FIRST J)
)

returneazã ((FIRST J) (MID Q) (LAST


(setq new ‘(first j))

PUBLIC)
(subst new old who)

Release 10 substr
(substr <ºir> <start> [<length>])
Returneazã un subºir al unui ºir
Aceastã funcþie returneazã un subºir al ºirului <ºir>, începând cu poziþia
caracterului <start> din <ºir> ºi continuând cu <length> caractere.
Dacã <length> nu este specificat, atunci subºirul continuã pânã la sfârºi-
tul lui <ºir>. Argumentul <start> (ºi <length>, dacã e dat) trebuie sã fie
numere întregi pozitive. Primul caracter din <ºir> este caracterul numãrul
1. De exemplu:
(substr ”abcde” 2) returneazã ”bcde”
(substr ”abcde” 2 1) returneazã ”b”
(substr ”abcde” 3 2) returneazã ”cd”

Release 12 tablet
(tablet <cod> [<rând1> <rând2> <rând3> <direcþie>])
Regãseºte ºi seteazã calibrãrile tabletei grafice
Depinzând de întregul dat prin argumentul <cod>, funcþia tablet fie

Dacã argumentul <cod> este 0, funcþia tablet returneazã calibrarea


regãseºte setarea curentã a calibrãrii tabletei, fie seteazã o calibrare nouã.
Capitolul 5 281

curentã. Dacã este 1, atunci trebuie sã aparã ºi celelalte argumente pentru


a realiza o setare nouã: <rând1> <rând2> <rând3> ºi <direcþie>.
<cod> Un întreg. Dacã transmiteþi un cod egal cu 0, funcþia returneazã
calibrarea curentã; în acest caz, argumentele rãmase trebuie
omise. Dacã transmiteþi un cod egal cu 1, funcþia seteazã cali-
brarea potrivit argumentelor care urmeazã, ºi pe care va trebui sã
le precizaþi.
<rând1, 2 ºi 3> Trei puncte 3D. Acestea dau cele trei rânduri ale matri-
cei de transformare a tabletei
<direcþie> Un punct 3D. Acesta este vectorul (exprimat în coordo-
nate WCS), care este normal pe planul care reprezintã suprafaþa
tabletei.
NOTA:
Dacã <direcþia> specificatã nu este normalizatã, funcþia tablet o
corecteazã, astfel cã <direcþia> pe care aceasta o returneazã când
setaþi calibrarea poate sã difere de valoarea pe care aþi transmis-o.

fie întotdeauna egal cu 1: funcþia tablet îl returneazã ca 1 chiar


Într-un fel similar, al treilea element din <rând3> (Z) trebuie sã

Dacã funcþia tablet eºueazã, ea returneazã nil ºi seteazã variabila de sistem


dacã <rând3> din listã dã altceva.

ERRNO pe o valoare care indicã motivul cãderii. Asta se poate întâmpla


dacã digitizorul nu este o tabletã.
O transformare foarte simplã care poate fi stabilitã cu funcþia tablet este
identitatea transformãrii:
(tablet 1 ‘(1 0 0) ‘(0 1 0) ‘(0 0 1) ‘(0 0 1))
Cu aceastã transformare aplicatã, AutoCAD va primi efectiv coordonatele
de digitizare brute de la tabletã. De exemplu, dacã indicaþi punctul cu coor-
donatele de digitizare (5000,15000), AutoCAD îl va vedea ca punctul din
desenul Dvs. cu aceste coordonate.
Variabila de sistem TABMODE permite rutinelor AutoLISP sã comute
tableta On ºi OFF.
282 Funcþii AutoLISP

Release 10 tblnext
(tblnext <nume_tabela> [<reluare>])
Gãseºte urmãtorul articol într-o tabelã de simboluri
Aceastã funcþie este folositã la explorarea întregii tabele de simboluri.
Primul argument este un ºir care identificã tabela de simboluri doritã.
Numele valide de tabele sunt: ”LAYER”, ”LTYPE”, ”VIEW”, ”STYLE”,

cule. Când tblnext este folositã repetat, ea returneazã în mod normal de


”BLOCK”, ”UCS” ºi ”VPORT”. ªirul nu trebuie dat neapãrat cu majus-

tblsearch (vezi) poate seta ”urmãtoarea” intrare de regãsit. Totuºi, dacã


fiecare datã urmãtoarea intrare în tabela de simboluri specificatã. Funcþia

este prezent argumentul <reluare> ºi dacã este evaluat ca valoare non-nil,


tabela de simboluri este resetatã, fiind gãsitã prima intrare în ea. Dacã nu

ºterse nu sunt niciodatã returnate (în sensul funcþiei entdel - vezi).


mai existã alte intrãri în aceastã tabelã, se returneazã nil. Intrãrile de tabelã

(vezi explicaþii la funcþia cons), cu coduri ºi valori tip DXF (vezi anexa D),
Dacã este gãsitã o intrare, ea este returnatã ca listã de perechi cu punct

foarte apropiate de cele returnate de funcþia entget (vezi). De exemplu:


(tblnext ”layer” T) ;regãseºte primul layer
poate returna:
((0 . ”LAYER”) ;tip simbol
(2 . ”0”) ;nume simbol
(70 . 0) ;indicatori
(62 . 7) ;numãr culoare, negativ dacã e ”off”
(6 . ”CONTIGUOUS”) ;nume tip linie
)
De notat cã nu existã nici un grup ”-1”. AutoCAD reþine fiecare intrare

pe urmãtoarea la fiecare apel al lui tblnext pentru acea tabelã. Când


returnatã pentru toate tabelele de simboluri ºi o returneazã pur ºi simplu

începeþi explorarea unei tabele, asiguraþi-vã cã aþi dat un argument secund


non-nil pentru a relua tabela de la început ºi a primi prima intrare.
Intrãrile gãsite în tabela ”BLOCK” includ un grup ”-2” cu numele de enti-
tate al primei entitãþi din definiþia blocului (dacã existã). Astfel, dându-se
un bloc numit ”BOX”,
Capitolul 5 283

(tblnext ”block”) ;gãseºte definiþia blocului


poate returna:
((0 . ”BLOCK”) ;tip simbol
(2 . ”BOX”) ;nume simbol
(70 . 0) ;indicatori
(10 9.0 2.0 0.0) ;originea X, Y, Z
(-2 . <Entity name: 40000126>) ;prima entitate
Numele de entitate din grupul ”-2” este acceptat de entget ºi entnext, dar
)

ca o astfel de entitate cu entmod, sau sã folosiþi ssadd sau entsel pentru


nu ºi de orice altã funcþie de acces la entitãþi. Mai exact, nu puteþi modifi-

lui ”-2” lui entnext, puteþi explora entitãþile conþinute de o definiþie de


a o plasa într-o mulþime de selecþie. Oferindu-i numele de entitate al grupu-

bloc; entnext va returna nil dupã ultima entitate din definiþia blocului.

Release 13 tblobjname
(tblobjname <nume_tabela> <simbol>)
Returneazã numele de entitate al intrãrii date în tabela de simboluri
Funcþia cerceteazã tabela de simboluri <nume_tabela>, cãutând numele

tabela de simboluri. Numele returnat de tblobjname poate fi utilizat în


de simbol <simbol> ºi returneazã numele de entitate al acelei intrãri în

operaþii entget ºi entmod (vezi).

Release 10 tblsearch
(tblsearch <nume_tabelã> <simbol> [<setnext>])
Cautã un nume simbolic într-o tabelã de simboluri

<nume_tabelã> (la fel ca la tblnext - vezi), cãutând numele de simbol dat


Aceastã funcþie cerceteazã tabela de simboluri identificatã prin

de <simbol>. Ambele nume sunt convertite la majuscule automat. Dacã

în formatul descris de tblnext. Dacã nu e gãsitã nici o astfel de intrare, se


este gãsitã intrarea pentru numele de simbol dat, acea intrare este returnatã
284 Funcþii AutoLISP

returneazã nil. De exemplu:


(tblsearch ”style” ”standard”) ;gãseºte stil text
poate returna:
((0 . ”STYLE”) ;tip simbol
(2 . ”STANDARD”) ;nume simbol
(70 . 0) ;indicatori
(40 . 0.0) ;înãlþime fixã
(41 . 1.0) ;factor lãþime (”width”)
(50 . 0.0) ;unghi de oblicitate
(71 . 0) ;indicatori de generare
(3 . ”txt”) ;fiºier font primar
(4 . ””) ;fiºier ”bigfont”
)
În mod normal tblsearch nu are efect asupra ordinii intrãrilor gãsite de
tblnext. Totuºi, dacã tblsearch îºi încheie acþiunea cu succes ºi este

al lui tblnext este ajustat, astfel încât urmãtorul apel al lui tblnext va
prezent <setnext> care este evaluat ca non-nil, atunci contorul de intrãri

returna intrarea ce urmeazã celei returnate de acest apel al lui tblsearch.


Opþiunea <setnext> este cel mai utilã atunci când se ocupã cu tabela de
simboluri VPORT, deoarece toate ”viewport”-urile dintr-o configuraþie
poartã acelaºi nume. Pentru a gãsi ºi prelucra fiecare ”viewport” din con-
figuraþia numitã ”4VIEW”, de exemplu, puteþi folosi urmãtorul cod:
(setq v (tblsearch ”VPORT” ”4VIEW” T)) ;cautã prima intrare
(while (and v (- (cdr (assoc 2 v)) ”4VIEW”))
... prelucreazã intrarea ...
(setq v (tblnext ”VPORT”)) ;preia urmãtoarea intrare
)

Release 12 term_dialog
(term_dialog)
Abandoneazã toate casetele de dialog curente
Dacã o aplicaþie este încheiatã în timp ce vreun fiºier DCL este deschis,
Capitolul 5 285

AutoCAD apeleazã automat funcþia term_dialog. Aceastã funcþie este


folositã în principal pentru abandonarea casetelor de dialog imbricate. Ea
returneazã întotdeauna nil.

Release 10 terpri
(terpri)
Tipãreºte o linie nouã pe linia de comandã

despre ”newline” vezi la read-char). Funcþia terpri nu este folositã pentru


Aceastã funcþie tipãreºte o ”newline” pe ecran ºi returneazã nil (detalii

print sau princ.


intrare/ieºire de fiºiere. Pentru a scrie un ”newline” într-un fiºier, folosiþi

Etimologic, puteþi considera cã denumirea ”TERPRI” provine de la


”TERminarea PRIntãrii”...

Release 12 textbox
(textbox <elist>)
Mãsoarã obiectul text dat ºi returneazã coordonatele diagonale ale casetei de text

de entget (vezi). Lista trebuie sã defineascã o entitate text. Dacã sunt omise
Argumentul <elist> este o listã de definiþie a entitãþii în forma returnatã

din <elist> câmpurile care definesc parametrii textului (afarã de textul

textbox reuºeºte, ea returneazã o listã de douã puncte, altfel nil.


însuºi), atunci sunt folosite setãrile curente (sau implicite). Dacã funcþia

Lista minimalã acceptatã de textbox este cea cu textul însuºi. De exemplu:


(textbox ‘((1 . ”Hello CAD FANS”)))
poate returna:
((0.0 0.0 0.0) (0.8 0.2 0.0))
În acest caz, textbox foloseºte setãrile implicite pentru text ca sã aibã
datele necesare.
Punctele returnate de textbox descriu caseta ce mãrgineºte entitatea text
286 Funcþii AutoLISP

ca ºi cum punctul sãu de inserþie ar fi amplasat în (0,0,0) iar unghiul de


rotaþie ar fi 0. Prima listã returnatã este în general punctul (0,0,0), cu
excepþia cazului când entitatea text este oblicã sau conþine litere cu codiþe
(ca g ºi p). Valoarea primei liste de punct dã deplasarea colþului stânga-jos
a celui mai mic dreptunghi care încadreazã textul faþã de punctul de
inserþie al acestuia. A doua listã de punct dã poziþia colþului dreapta-sus al
aceluiaºi dreptunghi. Corespunzãtor orientãrii textului de mãsurat, lista de
puncte returnatã descrie întotdeauna colþurile stânga-jos ºi dreapta-sus ale
casetei de text, în aceastã ordine.

Release 11 textpage
(textpage)
ªterge ecranul text AutoCAD
Aceastã funcþie este similarã cu funcþia textscr (vezi), decât cã ºterge mai
întâi orice text existent pe ecran. Aceastã funcþie returneazã întotdeauna
nil.

Release 10 textscr
(textscr)
Comutã ecranul în mod text
Funcþia textscr comutã ecranul din mod grafic în mod text la sistemele cu

<F1>, de regulã). Funcþia textscr returneazã întotdeauna nil. Este funcþia


un singur ecran (la fel ca tasta ”FLIP SCREEN” a AutoCAD-ului, adicã

complementarã a funcþiei graphscr (vezi).

Release 10 trace
(trace <funcþie>...)
Ajutã la depanarea programelor AutoLISP
Capitolul 5 287

Aceastã funcþie este o unealtã de depanare a programelor AutoLISP. Ea


seteazã semnalizatorul (”flag”-ul) ”trace” pentru funcþia/funcþiile specifi-
cate ºi returneazã numele ultimei funcþii. Ori de câte ori funcþia/funcþiile
sunt evaluate, se afiºeazã traseul parcurs de acestea, arãtându-se faptul cã
sunt apelate ºi prezentându-se prin decalare (”indentare”) nivelul de apel
în adâncime, împreunã cu rezultatul fiecãreia. De exemplu:
(trace my-func)
ºi seteazã ”flag”-ul ”trace” pentru funcþia MY-FUNC. Vezi ºi untrace.
returneazã MY-FUNC

Release 10 trans
(trans <pt> <din> <în> [<disp>])
Translateazã un punct (sau o deplasare) dintr-un sistem de coordonate în altul.
Argumentul <pt> este o listã de trei numere reale, care pot fi interpretate
fie ca un punct 3D, fie ca o deplasare 3D (un vector). Argumentul <din>
este un cod care indicã sistemul de coordonate în care este exprimat <pt>,
iar <în> este un cod care specificã sistemul de coordonate dorit pentru
punctul returnat. Argumentul opþional <disp>, dacã este prezent ºi nu e
nil, aratã cã <pt> trebuie sã fie tratat ca o deplasare (vector) 3D în loc de
a fi tratat ca punct. Argumentele <din> ºi <în> pot fi un cod întreg (vezi
tabel), un nume de entitate, sau un vector de extrudere 3D.

Cod Sistemul de coordonate


0 World (WCS)
1 User (UCS-ul curent)
2 Display
- DCS pentru viewport-ul curent când e folosit cu codul 0 sau 1
- DCS pentru viewport-ul spaþiului model curent când e folosit cu
codul 3
3 DCS Paper Space (folosit numai cu codul 2)

nat de funcþiile entnext, entlast, entsel, nentsel ºi ssname (vezi).


Dacã se foloseºte un nume de entitate, acesta trebuie dat aºa cum este retur-

Aceasta va translata un punct la, ºi de la, Sistemul de Coordonate al


288 Funcþii AutoLISP

Obiectului (OCS = „Object Coordinate System”) al unei entitãþi particu-


lare. Pentru unele entitãþi, OCS este echivalent cu WCS; pentru acestea
conversia între OCS ºi WCS este o operaþie nulã. De notat cã OCS este
echivalentul lui ECS („Entity Coordinate System”), de la versiunile ante-
rioare lui Release 13.
Dacã se foloseºte un vector 3D de „extruziune” („extrusion”), acesta trebuie
dat ca o listã de trei numere reale. Aceasta este o altã metodã de conversie
la ºi de la OCS-ul unei entitãþi. Ea nu funcþioneazã însã pentru acele
entitãþi al cãror OCS este echivalent cu WCS.
Funcþia trans returneazã un punct 3D (sau o deplasare) în sistemul de
coordonate cerut de argumentul <în>. De exemplu, dându-se un UCS care
este rotit cu 90 de grade în sens trigonometric în jurul axei Z a sistemului
„World”:
(trans ‘(1.0 2.0 3.0) 0 1) va returna (2.0 -1.0 3.0)
(trans ‘(1.0 2.0 3.0) 1 0) va returna (-2.0 1.0 3.0)
Se descriu în continuare sistemele de coordonate suportate de trans (dar ºi
de AutoCAD).
WCS („World Coordinate System”) Acesta este sistemul de coordonate
fundamental. Toate celelalte sisteme de coordonate se definesc
raportat la acesta. WCS este singurul sistem de coordonate care
nu se schimbã. Utilitatea sa principalã este legatã de faptul cã
WCS este stabil, indiferent de schimbãrile aduse altor sisteme de

UCS („User Coordinate System”) Acesta este sistemul de coordonate ”de


coordonate.

lucru” specificat de utilizator pentru a-ºi uºura sarcina de editare


a desenelor (iar uneori chiar a o face posibilã). Toate punctele de
intrare (inclusiv punctele returnate de expresiile AutoLISP, cu
excepþia celor precedate de ”*”) sunt interpretate raportat la acest
sistem. Din acest motiv, dacã doriþi sã transmiteþi valori de coor-

tiþi mai întâi în coordonate UCS folosind funcþia trans.


donate altor sisteme (WCS, OCS sau DCS), trebuie sã le conver-

OCS („Object Coordinate System”) Valorile de coordonate punctuale


returnate de entget (vezi) sunt mãsurate relativ la acest sistem de
coordonate. Aceste puncte sunt aproape inutile dacã n-au fost con-
Capitolul 5 289

vertite la sistemul de coordonate asociat cu cerinþele de utilizare.


De exemplu, dacã doriþi sã trasaþi o dreaptã din punctul de
inserþie al unui obiect Text (fãrã a folosi OSNAP), va trebui sã
convertiþi punctul de inserþie al acelui obiect din OCS-ul obiectu-
lui Text în UCS:
(trans <pct_insertie_text> <nument_text> 1)
ºi sã transferaþi rezultatul pe prompterul „From point:”.

OCS-ul lor de destinaþie înainte de a le transfera lui entmod


Invers, trebuie sã convertiþi valorile punctuale (sau deplasãrile) la

(vezi). De exemplu, dacã doriþi sã mutaþi un Cerc (fãrã a folosi


comanda MOVE) cu mãrimea relativã 1,2,3 raportatã la UCS, va
trebui sã convertiþi aceastã deplasare de la UCS la OCS-ul
entitãþii Cerc corespunzãtoare:
(trans ‘(1 2 3) 1 <nument_cerc> 1)
Apoi va trebui sã adãugaþi deplasarea rezultantã la coordonatele

DCS („Display Coordinate System”) Acesta este sistemul de coordonate în


centrului cercului.

care se transformã (se prelucreazã) imaginile înainte de a fi


afiºate. Origina sa este punctul TARGET (ÞINTţ) iar axa sa Z
este direcþia de privire. Dvs. vedeþi totdeauna DCS de sus (adicã
axa X spre dreapta ºi axa Y în sus, axa Z vãzându-se ca un punct
suprapus peste originã). Acest sistem este folosit pentru a deter-
mina cum îi apare utilizatorului un desen. De exemplu, dacã aveþi
un punct introdus de utilizator ºi doriþi sã aflaþi care capãt al unei
entitãþi Line pare a fi mai apropiat de acesta, trebuie sã convertiþi
punctul din UCS în DCS:
(trans <pct_utiliz> 1 2)
cât ºi fiecare dintre capetele lui Line din OCS-ul acesteia în DCS:
(trans <pct_capat> <nument-line> 2)
Acum puteþi calcula distanþa între punctul utilizator ºi fiecare
dintre capetele liniei (ignorând componentele Z) pentru a stabili

Funcþia trans poate transforma de asemenea puncte 2D. Ea face asta prin
care capãt pare mai apropiat.

completarea coordonatelor Z în mod convenþional cu valori corespunzã-


toare. Componenta Z folositã depinde de sistemul de coordonate „from”
290 Funcþii AutoLISP

care a fost specificat ºi dacã valoarea trebuie convertitã ca punct sau ca


deplasare. „Completarea” lui Z se determinã astfel:
Din Completare Z
WCS 0.0
UCS Elevaþie curentã
OCS 0.0
DCS Proiectare pe planul curent de construcþie (planul XY UCS +
elevaþia curentã)
DCS PS Proiectare pe planul curent de construcþie (planul XY
UCS + elevaþia curentã)
NOTA:
DCS pentru Paper Space (DCS PS) a fost introdusã odatã cu
Release 11.

Release 10 type
(type <articol>)
Returneazã tipul articolului specificat
Aceastã funcþie returneazã TIPUL (TYPE) corespunzãtor lui <articol>
unde TYPE este unul dintre (ca atom):
REAL numere în virgulã mobilã
FILE descriptori de fiºiere
STR ºiruri
INT întregi
SYM simboluri
LIST liste (ºi funcþii utilizator)
SUBR funcþii interne AutoLISP
EXSUBR Funcþii externe (ADS) - Release 11
PICKSET mulþimi de selecþie AutoCAD
ENAME nume de entitãþi AutoCAD
PAGETB tabela de paginare funcþie
Articolele care sunt evaluate la nil (cum sunt simbolurile neatribuite),
Capitolul 5 291

returneazã nil.
De exemplu, dându-se atribuirile:
(setq a 123 r 3.45 s ”Hello!” x ‘(a b c))
(setq f (open ”nume” ”r”))
atunci:
(type ‘a) returneazã SYM
(type a) returneazã INT
(type f) returneazã FILE
(type r) returneazã REAL
(type s) returneazã STR
(type x) returneazã LIST
(type +) returneazã SUBR
Urmãtorul exemplu ilustreazã modul cum puteþi folosi funcþia TYPE:
(defun isint (a)
(if (= (type a) ‘INT) ;e tip intreg?
T ;DA, returneazã T
nil ;NU, returneazã nil
)
)

Release 12 unload_dialog
(unload_dialog <id_dcl>)
Descarcã un fiºier DCL

apel anterior al lui new_dialog).


Descarcã fiºierul DCL asociat cu <id_dcl> (care a fost obþinut printr-un

Întotdeauna returneazã nil.

Release 10 untrace
(untrace <funcþie>...)
Anuleazã flag-ul „trace” pentru funcþiile specificate.
292 Funcþii AutoLISP

Aceastã funcþie anuleazã semnalizatorul („flag”-ul) „trace” pentru

fel se eliminã mijlocul de depanare introdus prin funcþia trace. De exem-


funcþia/funcþiile specificate ºi returneazã numele ultimei funcþii. În acest

plu:
(untrace my-func) returneazã MY-FUNC
ºi anuleazã indicatorul ”trace” pentru funcþia MY-FUNC.
Vezi ºi funcþia trace.

Release 12 vector_image
(vector_image <x1> <y1> <x2> <y2> <culoare>)
Deseneazã un vector în imaginea din caseta de dialog curentã

cu start_image) din punctul <x1,y1> în <x2,y2>. Parametrul <culoare>


Aceastã funcþie deseneazã un vector în imaginea casetei de dialog (deschisã

este un numãr de culoare AutoCAD sau unul dintre numerele de culoare


logicã din lista datã aici.
Nr. Mnemonicã
cul. ADI Descriere
-2 BGLCOLOR Fundalul curent al ecranului grafic AutoCAD
-15 DBGLCOLOR Culoare fundal casetã dialog curentã
-16 DFGLCOLOR Culoare text casetã dialog curentã
-18 LINELCOLOR Culoare linii casetã dialog curentã

natele colþului din dreapta-jos apelând funcþiile dimx_tile ºi dimy_tile.


Originea (0,0) se aflã în colþul stânga-sus al imaginii. Puteþi obþine coordo-

Release 10 ver
(ver)
Returneazã un ºir care dã versiunea curentã AutoLISP

AutoLISP. Ea poate fi folositã (cu equal) pentru a verifica eventuala com-


Aceastã funcþie returneazã un ºir care conþine numãrul versiunii curente de

patibilitate a programelor AutoLISP. ªirul este de forma:


Capitolul 5 293

”AutoLISP Release X.X”


unde X.X este numãrul versiunii curente. De exemplu:
(ver) poate returna ”AutoLISP Release 10.0”
În Extended AutoLISP, funcþia ver returneazã un ºir de forma:
”Extended AutoLISP Release X.X”

sau Extended AutoLISP examinând ºirul de rãspuns oferit de ver.


astfel cã aplicaþia vã poate informa dacã se ruleazã sub Regular AutoLISP

La versiuni mai recente ºirul tipic va fi de forma:


”AutoLISP Release X.X (nn)”
unde nn este o descriere în douã litere a limbii folosite.
Astfel, se poate returna:
”AutoLISP Release 13.0 (en)”
Cele douã litere de descriere a limbii pot fi:
(en) Engleza UK/US (es) Spaniolã (fr) Francezã
(de) Germanã (it) Italianã

Release 10 vmon
(vmon)
Asigurã paginarea virtualã a memoriei (învechitã)
Aceastã funcþie nu mai este necesarã, dar rãmâne validã pentru a menþine
compatibilitatea cu versiunile mai vechi.
Explicaþii despre gestionarea memoriei sunt date în secþiunea 3.8.

Release 10 vports
(vports)
Returneazã o listã a descriptorilor de ferestre (viewport)
Aceastã funcþie returneazã o listã a descriptorilor de viewport-uri pentru
viewport-urile curent active. Fiecare descriptor de viewport este o listã con-
294 Funcþii AutoLISP

stând din numãrul de identificare al viewport-ului ºi poziþia colþurilor stân-


ga-jos ºi dreapta-sus ale acestuia.
Dacã variabila TILEMODE (introdusã odatã cu Release 11) este setatã pe
1 (on), lista returnatã descrie configuraþia de viewport-uri creatã cu coman-
da VPORTS. Colþurile viewport-urilor sunt exprimate folosind valori
cuprinse între 0.0 ºi 1.0, unde (0.0 0.0) reprezintã colþul stânga-jos general
al zonei grafice a ecranului, iar (1.0 1.0) colþul opus al acesteia.
Dacã TILEMODE este 0 (off), lista returnatã descrie obiectele viewport
create cu comanda MVIEW. Colþurile obiectelor viewport sunt exprimate
în coordonate Paper Space. Viewport-ul nr. 1 este întotdeauna Paper Space
atunci când TILEMODE este off.

pusã pe valoarea 1, atunci funcþia vports poate returna:


De exemplu, dându-se o configuraþie cu un singur viewport ºi TILEMODE

((1 (0.0 0.0) (1.0 1.0)))

patru colþuri ale ecranului atunci când TILEMODE este on, vports poate
Similar, dându-se patru viewport-uri de mãrimi egale amplasate în cele

returna:
( (5 (0.5 0.0) (1.0 0.5))
(2 (0.5 0.5) (1.0 1.0))
(3 (0.0 0.5) (0.5 1.0))
(4 (0.0 0.0) (0.5 0.5))
)
Descriptorul viewport-ului curent este totdeauna primul din listã. În exem-
plul de mai sus, viewport-ul numãrul 5 ar fi viewport-ul curent.
NOTA:
Pentru versiuni anterioare lui Release 11, variabila TILEMODE
nu era definitã, dar în termenii de acum poate fi consideratã ca
având valoarea 1 (on), pentru cã într-adevãr ecranul putea fi
împãrþit (cu comanda VPORTS) doar în zone lipite una de alta
(mod DALţ) ºi nu distanþate sau suprapuse, cum pot fi puse cu
MVIEW în Paper Space.
Capitolul 5 295

Release 11 wcmatch
(wcmatch <ºir> <pattern>)
Executã o potrivire de pattern ”wild-card” pe un ºir
Funcþia wcmatch îºi trage numele de la ”Wild-Card MATCH”, care
înseamnã potrivire de caractere ”wild-card” (cum sunt binecunoscutele *, ?
etc.). Ea comparã ºirul <ºir> cu configuraþia de caractere <pattern> pen-
tru a vedea dacã acestea se potrivesc. Dacã da, se returneazã T, altfel nil.
Atât <ºir> cât ºi <pattern> pot fi fie un ºir de caractere între ghilimele,
fie variabile ºir. Argumentul <pattern> poate sã conþinã caracterele
”wild-card” din lista ce urmeazã. Sunt comparate numai primele cca. 500
de caractere din <ºir> ºi <pattern>; restul sunt ignorate.
Caracter Definiþie
# (diez) Potriveºte orice singurã cifrã
@ (at) Potriveºte orice singurã literã
. (punct) Potriveºte orice singur caracter nealfanumeric
* (asterisc) Potriveºte orice secvenþã de carcatere, inclusiv una vidã,
ºi poate fi folosit oriunde în pattern-ul de
cãutare: la început, în interior, la sfârºit
? (semn. întreb.) Potriveºte orice singur caracter
~ (tilda) Dacã e pusã prima în <pattern>, potriveºte orice cu
excepþia pattern-ului
[...] Potriveºte orice caracter inclus
[~...] Potriveºte orice caracter neinclus
- (minus) Folosit în interiorul parantezelor (drepte) pentru a speci
fica o serie de caractere singulare
, (virgulã) Separã douã pattern-uri
` (apostrof invers) Mascheazã caracterele speciale (face ca urmã
torul caracter sã fie citit literal)
Iatã câteva exemple:
(wcmatch ”Nume” ”N*”) returneazã T
Aici se testeazã ºirul ”Nume” pentru a se vedea dacã începe cu caracterul
”N”. În cadrul pattern-urilor puteþi folosi virgule pentru a introduce mai
mult de o singurã condiþie. De exemplu, se pot face trei comparaþii:
296 Funcþii AutoLISP

(wcmatch ”Nume” ”???,~*m*,N*”) returneazã T


Dacã este îndeplinitã oricare dintre condiþiile separate prin virgulã, atunci
este returnat T. În acest caz sunt trei teste: ”Nume” are trei caractere (fals),
”Nume” nu conþine un ”m” în interior (fals) ºi ”Nume” începe cu ”N” (ade-
vãrat). Cel puþin o condiþie a fost îndeplinitã, deci se returneazã T.
Comparaþia este sensibilã la tipul de literã (micã, MAJUSCULţ), astfel
încât trebuie sã se specifice exact tipul dorit. Ca valori pentru <ºir> ºi
<pattern> se pot folosi variabile ºi valori returnate de funcþii AutoLISP.
Pentru a testa un caracter care altfel ar fi considerat ”wild-card” într-un ºir,
este necesar sã faceþi uz de caracterul apostrof inversat (`) pentru a-l masca.
”Mascarea” înseamnã tratarea ca atare a caracterului care altfel ar fi con-
siderat un ”wild-card”. De exemplu, pentru a cãuta o virgulã (care altfel
este consideratã separator de pattern-uri) oriunde în ºirul
”Nume,Prenume”, folosiþi:
(wcmatch ”Nume,Prenume” ”*`,*”) returneazã T
NOTA:
Întrucât pot fi adãugate ºi alte caractere pe post de caractere
”wild-card” în viitoarele versiuni de AutoLISP, este o idee bunã
aceea de a masca toate caracterele nonalfanumerice pentru a
asigura compatibilitatea viitoare.
Atât limbajul de programare C cât ºi AutoLISP folosesc backslash-ul (\)
drept caracer de mascare, astfel cã sunt necesare douã backslash-uri (\\)
pentru a produce unul singur într-un ºir. Pentru a testa dacã existã un car-
acter backslash oriunde în ºirul ”C:\\ACAD”, introduceþi:
(wcmatch ”C:\\ACAD” ”*`\\*’) returneazã T
De notat cã ºi în ºirul ”C:\\ACAD” au fost necesare douã backslash-uri,
deoarece unul singur ar fi mascat caracterul A (primul din ”ACAD”).
Toate caracterele cuprinse între paranteze drepte [ ] sunt citite literal, ast-
fel cã nu este nevoie sã fie mascate, cu urmãtoarele excepþii:
- caracterul tilda (~) este citit literal numai atunci când nu este primul

drept caracter de negare, însemnând cã wcmatch va trebui sã


dintre cele puse între paranteze (ca în [A~BC]); altfel este luat

potriveascã toate caracterele cu excepþia celor ce urmeazã dupã


Capitolul 5 297

tildã (ca în [~ABC]).


- caracterul minus (-) este citit literal numai dacã este primul sau ultimul
dintre cele puse între paranteze (ca în ”[-ABC]” sau ”[ABC-]”),
sau atunci când urmeazã dupã tildã (ca în ”[~-ABC]”). Altfel, car-
acterul minus pus între caracterele din parantezã specificã o serie
de valori pentru un anumit caracter. Seria funcþioneazã numai
pentru un singur caracter, astfel cã ”STR[1-38]” se potriveºte doar
cu STR1, STR2, STR3 ºi STR8, iar ”[A-Z]” potriveºte orice literã
majusculã (dintre cele 26 ale alfabetului englez).
Caracterul parantezã dreaptã închisã ”]” este citit tot literal dacã este
primul caracter pus între paranteze (tot drepte) sau dacã urmeazã dupã
prefixul tildã (ca în ”[ ]ABC]” sau ”[~]ABC]”).

Release 10 while
(while <expr_test> <expr>...)
Evalueazã o expresie test ºi, dacã nu e nil, le evalueazã ºi pe urmãtoarele
Aceastã funcþie evalueazã <expr_test> ºi, dacã nu e nil, evalueazã celelalte
expresii dupã care evalueazã din nou <expr_test>. Aceasta continuã pânã
ce <expr_test> devine nil (deci trebuie ca evaluãrile sã modifice cu timpul
ceva din <expr_test>, altfel ciclarea nu se terminã niciodatã...). De exem-
plu, dându-se:
(setq a 1)
atunci:
(while (<= a 10)
(vreo_functie a)
(setq a (1+ a))
)
va face sã fie apelatã funcþia utilizator vreo_functie de zece ori, cu A setat
de la 1 la 10. Ea va returna în final 11, valoarea ultimã evaluatã (care n-a

anume variabila a) pentru a se putea încheia ciclul.


mai permis ciclarea). Iatã deci cã s-a schimbat ceva în <expr_test> (ºi
298 Funcþii AutoLISP

Release 10 write-char
(write-char <num> [<descr-fis>])
Scrie un caracter pe ecran sau într-un fiºier deschis
Aceastã funcþie scrie un caracter pe ecran sau în fiºierul specificat prin
<descr-fis> (vezi ºi OPEN, cât ºi READ-CHAR). Argumentul <num>
este codul ASCII al caracterului de scris, acesta reprezentând ºi valoarea
returnatã de funcþie. De exemplu:
(write-char 67) returneazã 67
ºi scrie litera C pe ecran. Presupunând cã F este un descriptor valid al unui
fiºier deschis (cu OPEN):
(write-char 67) returneazã 67
ºi scrie C în acel fiºier.
Diferitele sisteme de operare sub care poate fi rulat AutoCAD (ºi implicit
AutoLISP) folosesc diferite convenþii pentru a semnala sfârºitul de linie
într-un fiºier text ASCII. Sistemul UNIX, de exemplu, foloseºte un singur
caracter (LF, 10 în codul ASCII), în timp ce MS-DOS ºi PC-DOS (cele pe
care le subînþelegem noi mereu) folosesc o pereche de caractere în acest
scop (CR/LF, cu codurile ASCII 13 ºi 10). Pentru a facilita dezvoltarea de

write-char acceptã toate aceste convenþii, returnând un singur caracter


programe AutoLISP care sã fie portabile (fãrã a depinde de maºinã),

”newline” (cod 10 ASCII) ori de câte ori este întâlnit un caracter (sau o
secvenþã de caractere) cu sensul de ”end-of-line” (”sfârºit-de-linie”). Astfel,
pe un sistem PC-DOS/MS-DOS:
(write-char 10 f) returneazã 10

Funcþia write-char nu poate sã scrie un caracter ”null” (cod ASCII 0)


dar scrie secvenþa de caractere CR/LF (codurile ASCII 13 ºi 10) în fiºier.

într-un fiºier.
Capitolul 5 299

Release 10 write-line
(write-line <ºir> [<descr-fis>])
Scrie un ºir pe ecran sau într-un fiºier deschis

(vezi ºi open, cât ºi read-line). Ea returneazã <ºir> quot-at în maniera


Aceastã funcþie scrie <ºir> pe ecran sau în fiºierul descris de <descr-fis>

cunoscutã (termenul de ”quot-at” este explicat la defun), dar omiþând

descriptor valid de fiºier deschis (cu open):


ghilimelele la scrierea în fiºier. De exemplu, presupunând cã F este un

(write-line ”Test” f) scrie Test în fiºier ºi returneazã ”Test”

Release 11 xdroom
(xdroom <ename>)
Returneazã mãrimea în octeþi a spaþiului disponibil pentru date extinse
Dacã eºueazã, funcþia xdroom returneazã nil. Din cauzã cã existã o limitã
(de obicei 16 kiloocteþi) a mãrimii de date extinse care pot fi atribuite unei
definiþii de entitate, ºi deoarece mai multe aplicaþii pot adãuga date extinse
la aceeaºi entitate, aceastã funcþie a fost introdusã pentru ca aplicaþia sã

aceasta. Ea poate fi apelatã în conjuncþie cu funcþia xdsize (vezi), care


poatã verifica dacã existã spaþiu pentru datele extinse pe care le va adãuga

returneazã mãrimea unei liste de date extinse.

ale unui obiect viewport. Presupunând cã variabila numevp conþine numele


Aici este un exemplu de cãutare a spaþiului disponibil pentru date extinse

obiectului viewport:
(xdroom numevp) returneazã 16142
unde valoarea 16142 (din disponibilul iniþial de 16383) exprimã spaþiul
liber pentru date extinse, însemnând cã 221 octeþi sunt ocupaþi.
300 Funcþii AutoLISP

Release 11 xdsize
(xdsize <lista>)
Returneazã mãrimea în octeþi a listei de date extinse

obiect (entitate) ca date extinse. Dacã eºueazã, xdsize returneazã nil.


Altfel spus, aceastã funcþie returneazã mãrimea unei liste legate de un

un nume de aplicaþie înregistratã anterior folosind funcþia regapp.


Argumentul <lista> trebuie sã fie o listã validã de date extinse care conþine

Câmpurile acoladã (cod de grup 1002) trebuie sã fie împerecheate. Un


argument <lista> invalid genereazã o eroare ºi plaseazã codul de eroare
corespunzãtor în variabila ERRNO. Dacã datele extinse conþin un nume de
aplicaþie neînregistrat, mesajul afiºat (dacã variabila CMDECHO este 1) va
fi:
Invalid application name in 1001 group
Argumentul <lista> poate începe cu un cod de grup -3 (”santinela” datelor
extinse), dar nu neapãrat. Din cauzã cã datele extinse pot sã conþinã infor-
maþii din aplicaþii multiple, lista trebuie sã aibã un set de paranteze exte-
rioare.

(-3 (”MYAPP” (1000 . ”CAPACE”)


(1002 . ”{”)
(1040 . 0.0)
(1040 . 1.0)
(1002 . ”}”)
)
)

cdr-ul primului exemplu, dar este important sã fie incluse parantezele


Iatã acelaºi exemplu, dar fãrã codul de grup -3. Aceastã listã este chiar

exterioare:
( (”MYAPP” (1000 . ”CAPACE”)
(1002 . ”{”)
(1040 . 0.0)
(1040 . 1.0)
(1002 . ”}”)
Capitolul 5 301

)
)

Release 11 xload
(xload <aplicatie> [<la_esec>])
Încarcã o aplicaþie ADS
Argumentul <aplicatie> este introdus ca ºir pus între ghilimele sau ca
variabilã care conþine numele unui fiºier executabil. La momentul încãr-
cãrii fiºierului, acesta este verificat sã fie o aplicaþie valabilã ADS. De

ADS, a ADS-ului însuºi ºi a AutoLISP-ului. Dacã operaþia xload eºueazã,


asemenea, sunt verificate pentru compatibilitate versiunile programului

mentul <la_esec>, atunci xload returneazã valoarea acestui argument în


în mod normal se produce o eroare AutoLISP. Totuºi, dacã este dat ºi argu-

caz de eºec, în loc de un mesaj de eroare. Dacã aplicaþia este încãrcatã cu


succes, atunci este returnat numele acesteia ca în:
(xload ”/propriu/abc”)
Dacã încercaþi sã încãrcaþi o aplicaþie deja încãrcatã, funcþia xload emite:
returneazã ”/propriu/abc”

Application ”nume” already loaded

catã cu funcþia ads înainte de a folosi xload.


ºi returneazã numele aplicaþiei. Puteþi verifica aplicaþia ADS curent încãr-

Release 11 xunload
(xunload <aplicatie> [<la_esec>])
Descarcã o aplicaþie ADS
Dacã aplicaþia este descãrcatã cu succes, se returneazã numele aplicaþiei,
altfel se returneazã un mesaj de eroare. Introduceþi argumentul <apli-

caþii care a fost încãrcatã cu funcþia xload. Numele aplicaþiei trebuie intro-
catie> ca ºir între ghilimele sau ca variabilã ce conþine numele unei apli-

dus exact ca cel încãrcat cu funcþia xload. Dacã a fost introdusã o cale
(director) pentru aplicaþie cu xload, ea poate fi omisã la xunload.
302 Funcþii AutoLISP

De exemplu, pentru a descãrca aplicaþia încãrcatã mai sus cu xload puneþi:


(xunload ”abc”)
Dacã reuºeºte, aceasta returneazã ”abc”. Dacã operaþia xunload eºueazã,

ºi argumentul <la_esec>, atunci xunload returneazã valoarea acestui


în mod normal ea produce o eroare AutoLISP. Totuºi, dacã este menþionat

teristicã a lui xunload este similarã celei de la funcþia xload.


argument în caz de eºec, în loc de a da un mesaj de eroare. Aceastã carac-

Release 10 zerop
(zerop <articol>)
Verificã dacã un numãr este evaluat zero
Aceastã funcþie returneazã T dacã <articol> este real sau întreg ºi este
evaluat ca zero, altfel returneazã nil. Ea nu este definitã pentru altfel de
tipuri de <articol>. De exemplu:
(zerop 0) returneazã T
(zerop 0.0) returneazã T
(zerop 0.0001) returneazã nil.

A
;/ #%'#34= #/'7= 35/4 12'8'/4#4' 35%%+/4 40#4' (5/%?++-' 540 02)#/+
8#4' 1' %#4')02++ +'%#2' &+/42' '-' '34' &'3%2+3@ >/ &'4#-+5 >/ %#1+40-5-
#$'-'-' >/ %#2' #5 (034 153' &#4'-' #5 1#425 %0-0#/' &51= .0&'-5-

5/&'
9 '23 '23+5/'# &' 540 &+/ %#2' (5/%?+# # &'6'/+4
&+310/+$+-= &#2 /5 .#+ 6'%*' &' '-'#3'
9 5/%?+' 5.'-' )'/'2+% #- (5/%?+'+
9 +/4#7= +/4#7# 2+)520#3= # (5/%?+'+ '-'.'/4'-' 01?+0/#-' 35/4
153' >/42' 1#2#/4'8' &2'14' ! "
9 '3%2+'2' (2#8= &' &'3%2+'2' # (5/%?+'+
#4')02++-' 12+/%+1#-' &' 3425%452#2' # (5/%?++-02 540 35/4
5/%?++ &' $#8=
5/%?++ 54+-+4#2'
5/%?++ &' +/4'2(#?= %5
5/%?++ &' -5%25 %5 .5-?+.+ &' 3'-'%?+' 0$+'%4' :+ 4#$'-' &' 3+.$0-52+
5/%?++ 1'/425 %#3'4' &' &+#-0) 120)2#.#$+-'
5/%?++ 1'/425 )'34+0/#2'# .'.02+'+
;/ %#&25- (+'%=2'+ %#4')02++ (5/%?++-' 35/4 02&0/#4' #-(#$'4+%
5.#2 &' (5/%?++ 540

# "
5/%?++-' &' $#8= 35/4 >.1=2?+4' 1' (5/%?++ #2+4.'4+%' &' .#/+15-#2' #
:+252+-02 &' %#2#%4'2' &' ')#-+4#4' :+ %0/&+?+0/#-' &' .#/+15-#2' # -+3
4'-02 3+.$0-52+-02 (5/%?++-02 :+ #1-+%#?++-02
/'7#
5.#2 &' (5/%?++ 540
/'7#
5.#2 &' (5/%?++ 540
/'7#

#
+/ %#4')02+# (5/%?++-02 54+-+4#2' #.1-#3#4' #+%+ >/%'1</& &+/ 1#)+/# #/4'
2+0#2= (#% 1#24' (5/%?++-' &' +/4'20)#2' :+ %0.#/&= %'-' &' %0/420- #-
#(+:=2++ &' +/420&5%'2' 54+-+8#402 )'0.'42+%' &' %0/6'23+' &' .#/+15-#2'
# (+:+'2'-02 :+ &' #%%'3 -# &+3108+4+6'-' 1'2+('2+%'
5.#2 &' (5/%?++ 540
/'7#

# #
+/ %#4')02+# #%'3402 (5/%?++ /05 +/420&53' 0&#4= %5 540
'-'#3' (#% 1#24' (5/%?++-' #&.+/+342#4+6' %'-' &' #%%'3 -# -')=452+
-+/, &' 3'-'%4#2' # -')=452+-02 54+-+4#2' :+ &' .#/+15-#2' # '202+-02
5.#2 &' (5/%?++ 540
/'7#

# # # !
+/ #%'#34= %#4')02+' (#% 1#24' (5/%?++-' &' .#/+15-#2' # .5-?+.+-02 &'
3'-'%?+' # 0$+'%4'-02 # &#4'-02 '74+/3' :+ #-' 4#$'-'-02 &' 3+.$0-52+ :+
&+%?+0/#2'-02
5.#2 &' (5/%?++ 540

#
+/ #%'#34= %#4')02+' (#% 1#24' (5/%?++-' &' &'3%*+&'2' :+ >/%*+&'2' #
%#3'4'-02 &' &+#-0) &' .#/+15-#2' # 80/'-02 :+ #42+$54'-02 # %#3'4'-02 :+
.'/5 52+-02 1'/425 -+34' # 80/'-02 &' +.#)+/+ :+ # &#4'-02 31'%+(+%' #1-+
%#?++-02
/'7#

#
%'34' (5/%?++ (++/& >/ /5.=2 .#+ .+% /5 #5 .#+ (034 35$ >.1=2?+4' 1' #-4'
3425%452+ &' %-#3+(+%#2'
5.#2 &' (5/%?++ 540
Codul ASCII
B
Codul ASCII (American Standard Code for Information Interchange)
cuprinde caracterele tipãribile ºi netipãribile care se produc la fiecare
apãsare de tastã, sau combinaþie de taste. Codul are douã pãrþi: standard ºi
extins. În tabelele date în paginile urmãtoare sunt prezentate cele douã
pãrþi, însoþite de valorile în bazele 10, 8 ºi 16. Tabelele vã pot servi ºi pen-
tru conversia între aceste baze de numeraþie (de exemplu, 21110 = 3238 =
D316; ultima se mai scrie D3h, sau 00D3h). Oricare cod poate fi dat în
AutoLISP în baza 8 (prin secvenþa \nnn unde nnn este codul octal, ca de
exemplu \203 pentru â sau \214 pentru î). De observat cã la codul 32 este
scris simbolul „Sp” care corespunde lui blank (space).
Câteva coduri netipãribile meritã sã fie detaliate:
7 = BEL (Bell, clopot) = produce semnal sonor la difuzor
8 = BS (Back space) = deplaseazã cursorul înapoi cu un caracter
9 = HT (Horizontal Tab, sau TAB) = salt pe urmãtorul stop de tabulare
10 = LF (line Feed) = avans de linie
11 = VT (Vertical Tab) = avans cu un numãr de linii în jos (depinde de
dispozitivul de imprimare)
12 = FF (Form Feed) = avans cu o paginã (salt la urmãtorul început
de paginã)
13 = CR (Carriage Return = întoarcerea carului de imprimare la
sau RETURN) începutul liniei curente (de
obicei este însoþitã automat de
LF)
27 = ESC (Escape, evadare) = prefixeazã o secvenþã Escape

Pentru sistemele DOS existã un artificiu interesant bazat pe secvenþe


Escape. Dacã aþi activat driver-ul ANSI.SYS (prin introducerea liniei
318 Codul ASCII
Anexa B 319
320 Codul ASCII

DEVICE=C:\DOS\ANSI.SYS /x în fiºierul CONFIG.SYS), puteþi introduce

exemplu, pentru a redefini tasta F2 ca sã execute comanda LAYER S 0 ↵


direct din AutoLISP secvenþe Escape pentru a redefini diferite taste. De

(încheiatã cu blanc ºi <Enter>), care vã transferã direct în layerul „0” daþi:


Tasta Cod .

0;59 0;84 0;94 0;104


Simplã +Shift +Ctrl +Alt

0;60 0;85 0;95 0;105


F1

0;61 0;86 0;96 0;106


F2

0;62 0;87 0;97 0;107


F3

0;63 0;88 0;98 0;108


F4

0;64 0;89 0;99 0;109


F5 Notã:

0;65 0;90 0;100 0;110


F6

0;66 0;91 0;101 0;111


F7 Existã coduri ºi pentru

0;67 0;92 0;102 0;112


F8 tastele de litere sau cifre

0;68 0;93 0;103 0;113


F9 combinate cu tasta

0;133 0;135 0;137 0;139


F10 <ALT>. De exemplu,

0;134 0;136 0;138 0;140


F11 codul pentru <ALT/A>

0;71 55 0;119 -
F12 este 0;30, pentru

0;72 56 - -
Home <ALT/B> este 0;48

0;73 57 0;132 -
º.a.m.d., iar pentru

0;75 52 0;115 -
PageUp <ALT/=> codul este

0;77 54 0;116 -
0;131.

0;79 49 0;117 -
0;81 51 0;118 -
End

0;82 48 - -
PageDn

0;83 46 - -
Ins

- - 0;114 -
Del

9 0;15 - -
PrtSc
Tab .

(prompt ”\e[0;60;’layer s 0 ’;13p”)


Aici deosebim porþiunile \e[ care este secvenþa Escape propriu-zisã, 0;60
care este codul tastei F2, ‘layer s 0 ’ care este comanda AutoCAD ºi
Anexa B 321

13p care corespunde codului Newline (CR). Cele patru segmente sunt se-
parate prin „;”. Dacã doriþi sã cunoaºteþi codurile celorlalte taste, aveþi în
tabel corespondenþa acestora. De observat cã se obþin noi coduri prin com-
binarea unei taste cu SHIFT, CTRL ºi/sau ALT. De exemplu, F2 simplã
este 0;60, combinatã cu SHIFT este 0;85, cu CTRL este 0;95, iar cu ALT
este 0;105.
Dacã doriþi sã aplicaþi acelaºi mecanism direct din sistemul de operare
DOS, conferind astfel tastelor abilitatea de executare a unor macro-uri, veþi
folosi comanda PROMPT a sistemului de operare. Astfel, cu driver-ul

PROMPT $e[0;60;”ACAD12”p
ANSI.SYS încãrcat, dacã daþi pe prompterul DOS comanda:

urmatã de <Enter>. Aþi remarcat desigur sintaxa PROMPT $e[ cod ;


atunci orice apãsare a tastei F2 va conduce la emiterea comenzii ACAD12

ºir” p, unde cod este codul din tabela de mai sus, iar ºir este textul
„º
comenzii DOS (de la $ la p nu este nici un blanc, decât dacã se aflã în
secvenþa de caractere din ºir). Folosind cu atenþie aceste coduri puteþi

bând eventual definiþiile (stocate în fiºiere LSP ce vor fi încãrcate cu load)


mãri considerabil viteza de lucru, pe durata unei sesiuni de lucru schim-

potrivit lucrãrii pe care o executaþi la un moment dat... 


322 Note
Erori AutoLISP
C
Odatã cu versiunea 13, în AutoCAD a fost introdusã noua variabilã de sis-
tem ERRNO care este setatã automat pe valoarea numãrului de ordine al
ultimei erori AutoLISP (numãr dat în lista ce urmeazã). De notat cã aceastã
variabilã este resetatã (automat) doar la reintrarea în editorul de desen
AutoCAD, deci poate prezenta la un moment dat o valoare rãmasã de la o
rulare anterioarã. Valorile ERRNO pot sã fie schimbate la o versiune
viitoare de AutoCAD, deci lista ce urmeazã asociazã în principiu numerele
cu mesajele pentru AutoCAD Release-13.
Valoare Descriere
1 Invalid symbol table name
Nume incorect de tabelã de simboluri
2 Invalid entity or selection set name
Nume incorect de entitate sau mulþime de selecþie
3 Exceeded maximum number of selection sets
Depãºire numãr maxim de mulþimi de selecþie
4 Invalid selection set
Mulþime de selecþie incorectã
5 Improper use of block definition
Utilizare greºitã a definiþiei de bloc
6 Improper use of xref
Utilizare greºitã a lui xref
7 Object selection: pick failed
Selecþie obiecte: indicare nereuºitã
8 End of entity file
Sfârºit fiºier entitãþi

9 End of block definition file


324 Erori AutoLISP

Sfârºit fiºier definiþie block


10 Failed to find last entity
Eºec la gãsirea ultimei entitãþi
11 Illegal attempt to delete viewport object
Încercare ilegalã de ºtergere a obiectului viewport
12 Operation not allowed during PLINE
Operaþie nepermisã în timpul lui PLINE
13 Invalid handle
Handle incorect
14 Handles not enabled
Handle-uri inactive
15 Invalid arguments in coordinate transform request
Argumente incorecte la cerere transformare coordonate
16 Invalid space in coordinate transform request
Spaþiu incorect la cerere transformare coordonate
17 Invalid use of deleted entity
Utilizare incorectã a entitãþii ºterse
18 Invalid table name
Nume incorect de tabelã
19 Invalid table function argument
Argument incorect de funcþie tabelã
20 Attempt to set a read-only variable
Încercare de setare a unei variabile read-only
21 Zero value not allowed
Valoare zero nepermisã
22 Value out of range
Valoare în afara gamei
23 Complex REGEN in progress
REGEN complex în curs de desfãºurare
24 Attempt to change entity type
Încercare de schimbare a tipului entitãþii
25 Bad layer name
Nume eronat de layer

26 Bad linetype name


Anexa C 325

Nume eronat de tip de linie


27 Bad color name
Nume eronat de culoare
28 Bad text style name
Nume eronat de stil de text
29 Bad shape name
Nume eronat de shape
30 Bad field for entity type
Câmp eronat pentru tipul entitãþii
31 Attempt to modify deleted entity
Încercare de modificare a unei entitãþi ºterse
32 Attempt to modify seqend subentity
Încercare de modificare a subentitãþii seqend
33 Attempt to change handle
Încercare de schimbare a handle-ului
34 Attempt to modify viewport visibility
Încercare de schimbare a vizibilitãþii viewport-ului
35 Entity on locked layer
Entitate pe layer blocat
36 Bad entity type
Tip eronat de entitate
37 Bad polyline entity
Entitate polilinie eronatã
38 Incomplete complex entity in block
Entitate complexã incompletã în bloc
39 Invalid block name field
Câmp nume bloc incorect
40 Duplicate block flag fields
Câmpuri flag bloc duplicate
41 Duplicate block name fields
Câmpuri nume bloc duplicate
42 Bad normal vector
Vector normal eronat

43 Missing block name


326 Erori AutoLISP

Nume bloc lipsã


44 Missing block flags
Flag-uri bloc lipsã
45 Invalid anonymous block
Bloc anonim incorect
46 Invalid block definition
Definiþie de bloc incorectã
47 Mandatory field missing
Lipsã câmp obligatoriu
48 Unrecognized extended data (XDATA) type
Tip nerecunoscut de date extinse (XDATA)
49 Improper nesting of list in XDATA
Imbricare eronatã de liste în XDATA
50 Improper location of APPID field
Amplasare eronatã a câmpului APPID
51 Exceeded maximum XDATA size
Depãºire mãrime maximã XDATA
52 Entity selection: null response
Selectare entitate: rãspuns nul
53 Duplicate APPID
APPID duplicat
54 Attempt to make or modify viewport entity
Încercare de creare sau modificare entitate viewport
55 Attempt to make or modify an xref, xdef, or xdep

ssget filter: unexpected end of list


Încercare de creare sau modificare xref, xdef, sau xdep

Filtru ssget: sfârºit de listã neaºteptat


56

ssget filter: missing test operand


Filtru ssget: lipsã operand test
57

ssget filter: invalid opcode (-4) string


Filtru ssget: ºir de cod operaþie (-4) incorect
58

ssget filter: improper nesting or empty conditional clause


Filtru ssget: imbricare incorectã sau clauzã
59

ssget filter: mismatched begin and end of conditional clause


condiþionalã goalã
60
Anexa C 327

Filtru ssget: început ºi sfârºit de clauzã condiþionalã

ssget filter: wrong number of arguments in conditional clause


neîmperecheate
61

Filtru ssget: numãr greºit de argumente în clauzã


(for NOT or XOR)

ssget filter: exceeded maximum nesting limit


condiþionalã (pentru NOT sau XOR)

Filtru ssget: depãºire limitã maximã de imbricare


62

ssget filter: invalid group code


Filtru ssget: cod de grup incorect
63

ssget filter: invalid string test


Filtru ssget: test ºir incorect
64

ssget filter: invalid vector test


Filtru ssget: test vector incorect
65

ssget filter: invalid real test


Filtru ssget: test real incorect
66

ssget filter: invalid integer test


Filtru ssget: test întreg incorect
67

68 Digitizer isn't a tablet


Digitizorul nu este tabletã
69 Tablet is not calibrated
Tableta nu este calibratã
70 Invalid arguments
Argumente invalide
71 ADS error: Unable to allocate new result buffer
Eroare ADS: Incapabil de a aloca noul buffer rezultat
72 ADS error: Null pointer detected
Eroare ADS: Detectare pointer nul
73 Can't open executable file
Nu pot deschide fiºier executabil
74 Application is already loaded
Aplicaþia este deja încãrcatã
75 Maximum number of applications already loaded
Numãr maxim de aplicaþii deja încãrcate
76 Unable to execute application
328 Erori AutoLISP

Incapabil de a executa aplicaþia


77 Incompatible version number
Numãr de versiune incompatibil
78 Unable to unload nested application
Incapabil de a încãrca aplicaþie imbricatã
79 Application refused to unload
Aplicaþie refuzatã la descãrcare
80 Application is not currently loaded
Aplicaþia nu este curent încãrcatã
81 Not enough memory to load application
Memorie insuficientã pentru a încãrca aplicaþia
82 ADS error: Invalid transformation matrix
Eroare ADS: Matrice de transformare incorectã
83 ADS error: Invalid symbol name
Eroare ADS: Nume incorect de simbol
84 ADS error: Invalid symbol value
Eroare ADS: Valoare de simbol incorectã
85 AutoLISP/ADS operation prohibited while a dialog box was
displayed
Operaþie AutoLISP/ADS interzisã în timp ce este afiºatã
o casetã de dialog

C.1 Erori program utilizator

Unele erori sunt produse datoritã greºelior de programare cum sunt: paran-
tezele sau ghilimelele neîmperecheate, numele eronate de funcþii etc.

arguments of a defun can't have the same name


(argumentele unui defun nu pot purta nume identice)
Nu este permisã folosirea de argumente cu nume identice la
definirea unei funcþii
AutoCAD rejected function
Anexa C 329

(funcþie AutoCAD respinsã)

(cum ar fi variabile de sistem read-only folosite cu setvar, sau


Argumentele transmise unei funcþii AutoLISP sunt incorecte

tblnext cu nume incorect de tabelã), sau chiar folosirea funcþiei

funcþie GETxxx în interiorul unei funcþii command.


este incorectã în contextul curent. De exemplu, nu puteþi folosi o

AutoLISP stack overflow


(depãºire stivã AutoLISP)
Spaþiul de stocare de tip stivã AutoLISP a fost depãºit. Asta se
întâmplã datoritã unei recursivitãþi excesive sau unei liste prea
mari de argumente de funcþie.

bad argument type


(tip de argument eronat)

plu, nu este permisã aplicarea funcþiei strlen pe un întreg, sau a


Unei funcþii i s-a transmis un tip incorect de argument (de exem-

funcþiei sin pe un ºir).

bad association list

Lista furnizatã funcþiei assoc nu constã din liste de valori cheie


(listã asociativã eronatã)

bad conversion code

Funcþiei trans i s-a transmis un identificator incorect de spaþiu


(cod de conversie eronat)

bad ENTMOD list

Argumentul transmis lui entmod nu este o listã de date de enti-


(listã ENTMOD eronatã)

tate corectã (aºa cum este returnatã de entget).

bad ENTMOD list value


330 Erori AutoLISP

Una dintre sublistele unei liste asociative transmise lui entmod


(valoare listã ENTMOD eronatã)

conþine o valoare necorespunzãtoare.

bad formal argument list


(listã de argumente formale eronatã)
La evaluarea acestei funcþii, AutoLISP a detectat o listã de argu-
mente formale incorectã. Probabil cã funcþia nu este funcþie, ci
mai degrabã o listã de date.

bad function
(funcþie eronatã)
Primul element din listã nu este un nume de funcþie validã.
Probabil cã este un nume de variabilã sau un numãr. Acest mesaj
poate arãta, de asemenea, cã funcþia nominalizatã este o funcþie
definitã impropriu. (Nu uitaþi lista cerutã de argumente formale.)

bad function code

S-a transmis un identificator eronat de funcþie comenzii tablet.


(cod de funcþie eronat)

(valoare listã grvecs eronatã)


bad grvecs list value

Ceva transmis printr-o listã grvecs nu este un punct 2D sau 3D.

(valoare matrice grvecs eronatã)


bad grvecs matrix value

O matrice transmisã lui grvecs este rãu construitã sau conþine un


tip de datã greºit (de exemplu str, sym etc.).

bad list
(listã eronatã)
O listã incorect formatã a fost transmisã unei funcþii. Poate apãrea
dacã un numãr real începe cu un punct, în loc de zero ºi punct.
bad list of points
Anexa C 331

(listã de puncte eronatã)

cerere de tip F, CP sau WP. Folositã de ssget ºi grvecs.


S-a trimis o listã nulã sau conþinând altceva decât puncte la o

bad node

Tip de articol incorect, întâlnit de funcþia type.


(nod eronat)

bad node type in list

Tip de articol eronat, întâlnit de funcþia foreach.


(tip eronat de nod în listã)

bad point argument


bad point value
(argument punct eronat)
(valoare punct eronatã)
Un punct definit impropriu (o listã de douã reale) a fost transmis
unei funcþii care aºteaptã un punct. Aveþi grijã sã nu începeþi un
numãr real cu punct zecimal, ci zero ºi punct.

bad real number detected


(detectare numãr real eronat)
S-a încercat transmiterea unui numãr real incorect din AutoLISP
în AutoCAD.

(listã ssget eronatã)


bad ssget list

Argumentul transmis lui (ssget ”X”) nu este o listã de entitate


corectã (aºa cum este transmisã de entget).

(valoare listã ssget eronatã)


bad ssget list value

Una dintre sublistele din lista asociativã transmisã lui (ssget


”X”) conþine o valoare improprie.
bad ssget mode string
332 Erori AutoLISP

(ºir de mod ssget eronat)


Apãrutã atunci când lui ssget i s-a transmis un ºir incorect ca
argument mod.

(listã xdata eronatã)


bad xdata list

Apare atunci când uneia dintre funcþiile xdsize, ssget, entmod,


entmake, sau txtbox i s-a transmis o listã de date extinse de enti-
tate rãu construitã.

base point is required

Funcþia getcorner a fost apaelatã fãrã argumentul punct de bazã


(este cerut punct de bazã)

obligatoriu.

Boole arg1 0 or 15
(argumentul arg1 pentru Boole între 0 ºi 15)
Primul argument pentru funcþia Boole trebuie sã fie un întreg
cuprins între 0 ºi 15.

can't evaluate expression


(expresia nu poate fi evaluatã)
Un punct zecimal a fost rãu plasat, sau o altã expresie este con-
struitã greºit.

can't open (file) for input -- LOAD failed

Fiºierul nominalizat în funcþia open nu poate fi gãsit sau utiliza-


(fiºierul nu poate fi deschis pentru intrare - eºec LOAD)

torul nu are acces la acesta.

can't reenter AutoLISP


(AutoLISP nu poate fi reinvocat)
Bufferul (memoria tampon) de comunicaþie AutoCAD/AutoLISP
este utilizat de cãtre o funcþie activã. Nici o altã funcþie nouã nu
poate fi apelatã pânã ce cea activã nu este finalizatã.
Anexa C 333

console break
(întrerupere consolã)
Utilizatorul a introdus CTRL/C în timp ce o funcþie era în des-
fãºurare.

divide by zero
(împãrþire la zero)
Împãrþirea la zero nu este permisã.

divide overflow
(depãºire la împãrþire)
Împãrþirea printr-o valoare prea micã a dus la un cât incorect.

exceeded maximum string length


(depãºire lungime maximã ºir)
Un ºir transmis unei funcþii este mai lung de 132 caractere.

extra right paren


(parantezã închisã excedentarã)
Au fost întâlnite una sau mai multe paranteze închise (dreapta)
excedentare. Atunci când cercetând motivele acestei erori, cons-
tataþi cã, totuºi, parantezele sunt bine împerecheate, verificaþi ºi
împerecherea ghilimelelor...

file not open


(fiºier nedeschis)
Descriptorul de fiºier pentru operaþia de intrare/ieºire nu este al
unui fiºier deschis.

file read - insufficient string space


(fiºier deschis - spaþiu ºir insuficient)

AutoLISP citea un fiºier. Vezi funcþia extend în capitolul 5.


Spaþiul pentru ºiruri de caractere a fost epuizat în timp ce

file size limit exceeded


334 Erori AutoLISP

(depãºire limitã mãrime fiºier)


Un fiºier a depãºit mãrimea limitã admisã de sistemul de operare.

floating-point exception
(excepþie virgulã mobilã)
(numai pentru sisteme UNIX) Sistemul de operare a detectat o
eroare la un calcul în virgulã mobilã.

function canceled
(funcþie abandonatã)
Utilizatorul a introdus CTRL/C sau Esc (cancel) ca rãspuns la un
prompter de intrare.

function undefined for argument

Argumentul transmis lui log sau sqrt este în afara domeniului permis.
(funcþie nedefinitã pentru valoare argument)

function undefined for real


(funcþie nedefinitã pentru valoare realã)

argument întreg - de exemplu (lsh val 1.2).


A fost transmis un numãr real ca argument unei funcþii care cere

(punct final pentru grvecs absent)


grvecs missing endpoint

Listei vector transmisã lui grvecs îi lipseºte punctul final.

illegal type in left


(caractere ilegale rãmase)
Fiºierul .LSP nu este ASCII pur, ci a fost salvat cu un program de
procesare text, astfel cã fiºierul conþine ºi caractere de formatare a
textului.

improper argument

Argumentul pentru gcd este negativ sau zero.


(argument impropriu)
Anexa C 335

inappropriate object in function


(argument necorespunzãtor în funcþie)

torul de funcþii vmon.


A fost detectatã o funcþie construitã impropriu de cãtre pagina-

incorrect number of arguments

Funcþia quote aºteaptã exact un singur argument ºi i-au fost


(numãr incorect de argumente)

transmise un alt numãr de argumente.

incorrect number of arguments to a function


(numãr incorect de argumente pentru o funcþie)
Numãrul de argumente pentru o funcþie definitã de utilizator nu

defun.
se potriveºte cu numãrul de argumente formale specificat prin

incorrect request for command list data

A fost întâlnitã o funcþie command, dar nu a putut fi executatã


(cerere incorectã pentru lista de date command)

deoarece o altã funcþie era activã, sau interpretorul de comenzi nu

funcþiei command dintr-un fiºier acad.lsp, acadr13.lsp sau .mnl


era complet iniþializat. Aceasta poate apãrea datoritã unui apel al

input aborted
(intrare abandonatã)
A fost detectatã o condiþie de eroare sau un end-of-file prematur,
cauzând încheierea preluãrii de date din fiºier.

insufficient node space


(spaþiu insuficient pentru noduri)
Nu este suficient spaþiu stivã (heap) pentru a încãpea acþiunea
cerutã. Vezi secþiunea 3.8.

insufficient string space


336 Erori AutoLISP

(spaþiu insuficient pentru ºir)


Nu este spaþiu suficient pentru a încãpea ºirul de text specificat.
Vezi secþiunea 3.8.

invalid argument
(argument incorect)
Tip de argument impropriu, sau argument în afara gamei admise.

invalid argument list


(listã de argumente incorectã)
A fost transmisã o listã de argumente denaturatã unei funcþii.

invalid character
(caracter incorect)
O expresie conþine un caracter impropriu.

invalid dotted pair


(pereche cu punct incorectã)
Perechile cu punct sunt liste care conþin douã elemente separate
printr-o construcþie blanc-punct-blanc. Puteþi întâlni aceastã

punct zecimal (ºi nu cu zero). Vezi funcþia cons în capitolul 5.


eroare ºi în cazul în care aþi introdus numere reale începute cu

invalid integer value


(valoare întreagã incorectã)
A fost întâlnit un numãr mai mic decât cel mai mic întreg, sau
mai mare decât cel mai mare întreg.

LISPSTACK overflow
(depãºire stivã LISP)
Spaþiul de stocare stivã al AutoLISP-ului a fost depãºit. Aceasta
poate sã aparã atunci când s-a folosit excesiv recursivitatea sau
când lista de argumente a funcþiei a fost prea mare.

malformed list
Anexa C 337

(listã denaturatã)
O listã cititã dintr-un fiºier s-a încheiat prematur. Cea mai
comunã cauzã este neîmperecherea parantezelor sau a
ghilimelelor.

malformed string
(ºir denaturat)
Un ºir citit dintr-un fiºier a fost încheiat prematur.

misplaced dot
(punct plasat greºit)
Un numãr real începe cu punct zecimal în loc sã înceapã cu zero,
urmat de punct zecimal.

null function
(funcþie nulã)
A fost fãcutã o încercare de evaluare a unei funcþii care are
definiþie nulã (nil).

(abandon quit/exit)
quit/exit abort

A fost apelatã o funcþie quit sau exit. Nu este un mesaj de eroare


propriu-zis.

string too long

Un ºir transmis lui setvar este prea lung.


(ºir prea lung)

too few arguments


(prea puþine argumente)
Au fost transmise prea puþine argumente unei funcþii intrinseci.

(prea puþine argumente pentru grvecs)


too few arguments to grvecs

Lui grvecs i s-au transmis argumente insuficiente.


338 Erori AutoLISP

too many arguments


(prea multe argumente)
Au fost transmise prea multe argumente unei funcþii intrinseci. 
Coduri de grup DXF
D
În continuare sunt date codurile de grup ASCII corespunzãtoare lui

simplu cu funcþia ssget, incluzându-le în lista asociativã.


AutoCAD Release-13 (cele mai complete). Acestea pot fi folosite cel mai

D.1 Coduri de grup în ordine numericã

Codurile de grup negative listate mai jos nu apar într-un fiºier dar apar în
aplicaþii. Prin „(fixat)” se indicã faptul cã acel cod de grup are întotdeauna
acelaºi scop (spre deosebire de cele nemarcate, care pot varia funcþie de
context).

Cod
grup Descriere
-5 Lanþ reactiv menþinut
-4 Operator condiþional (folosit numai cu ssget ºi ads_ssget())
-3 Semnalizator de date extinse (XDATA) (fixat)
-2 Referinþã nume entitate (fixat)
-1 Nume entitate. Se schimbã la fiecare deschidere a desenului. Nu este salvat nicio-
datã. (fixat)
0 ªir de text care dã tipul entitãþii (fixat)
1 Valoare primarã de text pentru o entitate
2 Un nume: tag de atribut, nume de bloc etc.
3-4 Alte valori textuale sau nume
5 Handle de entitate. ªir text de maximum 16 cifre hexazecimale. (fixat)
6 Nume de tip de linie (fixat)

Cod
7 Nume stil text (fixat)
340 Coduri de grup DXF

grup Descriere
8 Nume layer (fixat)
10 Punct primar (listã de trei reale). Acesta este punctul de start a unei entitãþi linie
sau text, centrul unui cerc etc. În fiºiere DXF acest cod apare ca cod de grup 10, 20
sau 30, fiecare fiind real.
11-18 Alte puncte. Acestea sunt singurele coduri de grup de coordonate pe care le poate
vedea o aplicaþie. Coordonatele (20-28) ºi Z (30-38), care apar într-un fiºier DXF
sunt transmise unei aplicaþii ca parte dintr-o listã punct AutoLISP.
39 Adâncimea (thickness-ul) acestei entitãþi (dacã este nenul) (fixat)
40-48 Valori în virgulã mobilã (înãlþime text, factori de scalã etc.)
49 Valori în virgulã mobilã repetate. Într-o entitate pot sã aparã grupuri 49 multiple
pentru tabele de lungime variabilã (ca lungimile liniuþelor într-o tabelã LTYPE).
Apare un grup 7x înaintea primului grup 49 pentru a arãta lungimea tabelei.
50-58 Unghiuri
62 Numãr culoare (fixat)
66 Semnalizator „Urmeazã entitate” (fixat)
67 Spaþiu (Model sau Paper) (fixat)
70-78 Valori întregi cum ar fi contori de repetiþie, biþi de semnalizare (flags) sau moduri.
90-99 Valori întregi pe 32 de biþi.
100 Marcaj subclasã date (cu numele clasei derivate ca ºir).
102 ªir de control urmat de „{nume arbitrar” sau „}”
105 Handle-ul de obiect al intrãrii în tabela de simboluri DIMVAR
210 Direcþia de extrudere (fixat). Ca ºi la coordonatele de puncte, o aplicaþie
recunoaºte numai grupul 210. Componentele (220) ºi Z (230) ale unui vector de
extrudere sunt transmise unei aplicaþii ca parte a unei liste de punct AutoLISP.
280-289 Valori întregi pe 8 biþi
300-309 ªiruri de text arbitrare
310-319 Porþiuni binare arbitrare
320-329 Handle-uri arbitrare de obiecte
330-339 Handle de pointer soft (specificã un pointer cãtre alte obiecte din desen)
340-349 Handle de pointer hard (specificã un pointer cãtre alte obiecte din desen)
350-359 Handle de proprietar soft (specificã proprietatea asupra altor obiecte din desen).
360-369 Handle de proprietar hard (specificã proprietatea asupra altor obiecte din desen).
999 Comentarii
1000 Un ºir ASCII (de maximum 255 caractere) în XDATA
1001 Nume aplicaþie înregistratã (ºir ASCII de pânã la 31 de octeþi) pentru XDATA
(fixat)
1002 ªir de control XDATA („{" sau „}") (fixat)
1003 Nume layer în XDATA
1004 Porþiune de octeþi (lungã de maximum 128 de octeþi) în XDATA
1005 Handle de entitate în XDATA. ªir text de pânã la 16 cifre hexazecimale.

Cod
1010 Un punct în XDATA (X, Y ºi Z)
Anexa D 341

grup Descriere
1011 O poziþie 3D în spaþiul world în XDATA (X, Y ºi Z)
1012 Un deplasament 3D în spaþiul world
1013 O direcþie 3D în spaþiul world în XDATA. Acesta este singurul cod de grup de
coordonate pe care îl poate recunoaºte o aplicaþie. Coordonatele Y (1020, 1021,
1022 sau 1023) ºi Z (1030, 1031, 1032 sau 1033) care apar într-un fiºier DXF ce
este transmis ca parte a unei liste de puncte AutoLISP.
1040 Valoare în virgulã mobilã în XDATA.
1041 Valoare distanþã în XDATA.
1042 Factor de scalã în XDATA
1070 Întreg pe 16 biþi în XDATA
1071 Întreg lung cu semn pe 32 de biþi în XDATA

D.2 Entitãþi grafice

D.2.1 Coduri de grup comune


Tabela ce urmeazã conþine codurile de grup aplicabile tuturor entitãþilor
grafice. Codurile opþionale sunt prezentate cu caractere cursive subliniate.
Cod Dacã e omis,
grup Descriere implicit va fi...
-1 Nume entitate (Se schimbã la fiecare deschidere a desenului Nu poate fi omis
0 Tip entitate Nu poate fi omis
8 Nume layer Nu poate fi omis
5 Handle Nu poate fi omis
6 Nume tip linie (prezent dacã nu este BYLAYER). Numele BYLAYER
special BYBLOCK indicã un tip de linie variabil.
48 Scara tipului de linie 1.0
62 Numãrul culorii (prezent dacã nu este BYLAYER). Zero BYLAYER
aratã culoarea (variabilã) BYBLOCK, iar 256 aratã
BYLAYER. O valoare negativã aratã cã layerul este OFF.
67 Absent sau zero aratã cã entitatea este în spaþiul Model. 0
Unu aratã cã entitatea este în spaþiul Paper.
90 Blocare ADE

D.2.2 Coduri de grup pe tipuri de entitãþi


Tabela ce urmeazã dã codurile de grup pentru entitãþi într-un format si-
342 Coduri de grup DXF

milar secþiunii ENTITIES dintr-un fiºier DXF. Codurile opþionale sunt


prezentate cu caractere cursive subliniate.
Tip Cod
entitate Grup Descriere
3DFACE 10 Primul colþ
11 Al doilea colþ
12 Al treilea colþ
13 Al patrulea colþ (Dacã s-au introdus numai primele trei
colþuri, atunci acesta este identic cu colþul al treilea)
70 Indicatoare de muchii invizibile (opþional; implicit: 0)
1 Prima muchie este invizibilã
2 A doua muchie este invizibilã
4 A treia muchie este invizibilã
8 A patra muchie este invizibilã

3DSOLID 1 Prima linie a structurii fiºier


1 Linii adiþionale ale structurii fiºier
3 Prima linie a structurii fiºier (dacã primul ºir de grup 1 este
> 255 caractere)
3 Linii adiþionale (dacã primul ºir de grup 1 este
> 255 caractere)
1 Ultima linie a structurii fiºier

ARC 10 Centru
40 Razã
50 Unghi start
51 Unghi final
39 Thickness (opþional; implicit: 0)
210 Direcþie de extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

ATTDEF 10 Punct start text


40 Înãlþime text
1 Valoare implicitã (ºir)
3 ªir prompter
2 ªir tag
70 Semnalizatoare atribute
1 Atributul este invizibil (nu apare)
Anexa D 343

Tip Cod
entitate Grup Descriere
2 Acesta este un atribut constant
4 Se cere verificare la introducerea acestui atribut
8 Atributul este prestabilit (fãrã prompter în timpul
inserãrii).
73 Lungime câmp (opþional; implicit: 0)
50 Rotire text (opþional; implicit: 0)
41 Factor de scalã X relativ pentru text de tip fit
(opþional; implicit: 1)
51 Unghi oblicitate (opþional; implicit: 0)
7 Nume stil text (opþional; implicit: STANDARD)
71 Semnalizatoare generare text (opþional; implicit: 0) - vezi
TEXT
72 Tip aliniere text orizontal (opþional; implicit: 0) - vezi TEXT
74 Tip aliniere text vertical (opþional; implicit: 0) - vezi TEXT
11 Punct aliniere (opþional; prezent numai dacã este prezent
grupul 72 sau 74 ºi este nonzero)
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

ATTRIB 10 Punct start text


40 Înãlþime text
1 Valoare (ºir)
2 Tag atribut (ºir)
70 Semnalizatoare atribute
1 Atributul este invizibil (nu apare)
2 Acesta este un atribut constant
4 Se cere verificare la introducerea acestui atribut
8 Atributul este prestabilit (fãrã prompter în timpul
inserãrii).
73 Lungime câmp (opþional; implicit: 0)
50 Rotire text (opþional; implicit: 0)
41 Factor de scalã X relativ pentru text de tip fit
(opþional; implicit: 1)
51 Unghi oblicitate (opþional; implicit: 0)
7 Nume stil text (opþional; implicit: STANDARD)
71 Semnalizatoare generare text (opþional; implicit: 0) - vezi
TEXT
72 Tip aliniere text orizontal (opþional; implicit: 0) - vezi TEXT
74 Tip aliniere text vertical (opþional; implicit: 0) - vezi TEXT
344 Coduri de grup DXF

Tip Cod
entitate Grup Descriere
11 Punct aliniere (opþional; prezent numai dacã este prezent
grupul 72 sau 74 ºi este nonzero)
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

BODY 1 Prima linie a structurii fiºier


1 Linii adiþionale ale structurii fiºier
3 Prima linie a structurii fiºier (dacã primul ºir de grup 1 este
> 255 caractere)
3 Linii adiþionale (dacã primul ºir de grup 1 este
> 255 caractere)
1 Ultima linie a structurii fiºier

CIRCLE 10 Centru
40 Razã
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

DIMENSION 2 Numele blocului care conþine entitãþile care formeazã


imaginea cotei
3 Nume stil cotare
10 Punct definiþie
11 Punct mijloc text cotã
12 Punct inserþie pentru baza cotei (Baseline ºi Continue)
70 Tip cotã. Codurile de la 0 la 70 sunt coduri întregi; ele nu
sunt combinate. Codul 128 este combinat cu codurile 0 la 70
dacã textul cotei nu se aflã în poziþia implicitã
0 Rotit, orizontal sau vertical
1 Aliniat
2 Unghiular
3 Diametru
4 Razã
5 Unghiular 3 puncte
6 Ordonatã tip Y
70 Ordonatã tip X
128 Adãugat la alte coduri dacã textul nu se aflã în poziþia
implicitã
Anexa D 345

Tip Cod
entitate Grup Descriere
1 Text cotã introdus de utilizator (opþional; implicit: valoarea
mãsuratã)
13 Definiþie pentru cotele liniare ºi unghiulare
14 Punct de definiþie pentru cotele liniare ºi unghiulare
15 Punct de definiþie pentru diametru, razã ºi cotã unghiularã
16 Punct de definire a arcului cotei pentru cotã unghiularã
40 Lungime leader pentru cote de tip razã sau diametru
50 Unghi pentru cotã liniarã rotitã, verticalã sau orizontalã
51 Direcþie orizontalã (opþional)
52 Unghi linie ajutãtoare pentru cote liniare oblice (opþional)
53 Unghiul de rotire al textului cotei (opþional)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))
-3 Identificatorul „ACAD” de aplicaþie. Acesta începe secþiunea
XDATA care descrie orice forþare (override) a cotei care a
fost aplicatã acestei entitãþi.

ELLIPSE 10 Centru
11 Capãtul axei mari (relative la centru)
40 Lungimea axei mici (procent din lungimea axei mari)
41 Parametru de start
42 Parametru de sfârºit

INSERT 66 Semnalizatorul de „urmeazã-variabilã” (opþional; implicit: 0)


2 Nume bloc
10 Punct inserþie
41 Factor scarã X (opþional; implicit: 1)
42 Factor scarã Y (opþional; implicit: 1)
43 Factor scarã Z (opþional; implicit: 1)
50 Unghi rotire (opþional; implicit: 0)
70 Contor coloanã (opþional; implicit: 1)
71 Contor rând (opþional; implicit: 1)
44 Spaþiere coloane (opþional; implicit: 0)
45 Spaþiere rânduri (opþional; implicit: 0)
-3 Identificatorul „ACAD” de aplicaþie. Acesta începe secþiunea
XDATA care conþine proprietãþile haºurii.

LEADER 2 Nume stil cotare


72 Tip traseu leader
0 Segmente de dreaptã
346 Coduri de grup DXF

Tip Cod
entitate Grup Descriere
1 Spline
73 Numãr de vertex-uri traseu
10 Coordonate vertex (intrãri multiple)
11 Vector direcþie axã X (WCS)
12 Vector direcþie axã Z (WCS)
340 Referinþã hard la entitatea text asociat
-3 Identificatorul „ACAD” de aplicaþie. Acesta începe secþiunea
XDATA care descrie orice forþare (override) a cotei care a
fost aplicatã acestei entitãþi.

LINE 10 Punct start


11 Punct final
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

MLINE 7 Nume stil (ºir, max 32 caractere; numele stilului folosit pen
tru aceastã linie multiplã; trebuie sã se gãseascã în
dicþionarul ACAD_MLINESTYLE)
41 Factor scarã (real)
73 Numãr vertex-uri (întreg)
10 Coordonate vertex (intrãri multiple - câte o intrare pentru
fiecare vertex). Fiecare segment de vertex este urmat de
datele de parametrizare a segmenutului de MLINE.

MTEXT 1 ªir text. Dacã ºirul de text este mai scurt de 255 caractere,
toate caracterele apar în grupul 1. Dacã textul este mai lung
de 255 caractere, ºirul va fi împãrþit în bucãþi de 255 carac
tere, care vor apãrea într-unul sau mai multe grupuri cod 3.
Dacã sunt folosite coduri de grup 3, atunci restul textului
este plasat în grupul cod 1.
3 Text adiþional (în porþiuni de câte 255 caractere, opþional)
7 Nume stil text (STANDARD, dacã lipseºte)
10 Punct de inserþie
11 Vector direcþie axã X (WCS)
12 Vector direcþie axã Z (WCS)
41 Lãþime dreptunghi de referinþã
71 Punct ataºare
1 Sus stânga 6 Mijloc dreapta
2 Sus centru 7 Jos stânga
Anexa D 347

Tip Cod
entitate Grup Descriere
3 Sus dreapta 8 Jos centru
4 Mijloc stânga 9 Jos dreapta
5 Mijloc centru
72 Direcþie de desenare
1 Stânga la dreapta
2 Dreapta la stânga
3 De sus în jos
4 De jos în sus

OLEFRAME (fãrã grupe) Entitãþile OLEFRAME nu au coduri de grup DXF


speciale

POINT 10 Punct
50 Unghiul axei X pentru UCS-ul care era activ atunci când a
fost creat punctul (opþional; implicit: 0). Folosit când
PDMODE este nenul.
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

POLYLINE 66 Semnalizator „urmeazã vertex-uri” (totdeauna 1 pentru


polilinie)
10 Un punct fictiv. Coordonatele X ºi Y sunt întotdeauna 0, iar
coordonata Z dã elevaþia poliliniei.
70 Semnalizator polilinie (codificat pe biþi, astfel cã poate fi
combinat) (opþional; implicit: 0):
1 Polininie închisã (sau un mesh poligonal închis pe
direcþia M).
2 Au fost adãugate vertex-uri potrivite pe curbã.
4 Au fost adãugate vertex-uri potrivite pe spline.
8 Polinie 3D.
16 Mesh poligonal 3D.
32 Mesh poligonal închis pe direcþia N.
64 Polilinie care este un mesh polifaþetat.
128 Patternul tipului de linie este generat continuu în jurul
vertex-urilor acestei polinii.
40 Lãþime de start implicitã (opþional; implicit: 0)
41 Lãþime finalã implicitã (opþional; implicit: 0)
71 Contor M de mesh poligonal (opþional; implicit: 0)
72 Contor N de mesh poligonal (opþional; implicit: 0)
348 Coduri de grup DXF

Tip Cod
entitate Grup Descriere
73 Densitate M de suprafaþã smooth (opþional; implicit: 0)
74 Densitate N de suprafaþã smooth (opþional; implicit: 0)
75 Curbe ºi suprafeþe tip smooth (opþional; implicit: 0) - acestea
sunt coduri întregi; nu sunt codificate pe biþi:
0 Nu este potrivitã pe suprafaþã smooth
5 Suprafaþã quadraticã B-spline
6 Suprafaþã cubicã B-spline
8 Suprafaþã Bezier
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

RAY 10 Punct de bazã


11 Vector direcþie

REGION 1 Linii ale structurii fiºier


1 Linii adiþionale ale structurii fiºier
3 Prima linie a structurii fiºier (dacã primul ºir de grup 1 este
> 255 caractere)
3 Linii adiþionale (dacã primul ºir de grup 1 este
> 255 caractere)
1 Ultima linie a structurii fiºier

SEQEND -2 Numele entitãþii care a început secvenþa

SHAPE 10 Punct de inserþie


40 Mãrime
2 Nume shape
50 Unghi de rotire (opþional; implicit: 0)
41 Factor de scarã X relativ (opþional; implicit: 1)
51 Unghi de oblicitate (opþional; implicit: 0)
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

SOLID 10 Primul colþ


11 Al doilea colþ
12 Al treilea colþ
Anexa D 349

Tip Cod
entitate Grup Descriere
13 Al patrulea colþ (dacã sunt introduse numai trei colþuri, atun
ci acesta este identic cu al treilea colþ)
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

SPLINE 70 Gradul curbei spline


71 Flag spline (valori bit):
1 Spline închisã
2 Spline periodicã
4 Spline raþionalã
8 Planã
16 Linearã (bitul plan este de asemenea setat)
72 Numãr de noduri (knots)
73 Numãr de puncte de control
74 Numãr de puncte de potrivire (dacã sunt)
42 Toleranþã de potrivire
43 Toleranþã punct control
44 Toleranþã de potrivire (dacã este o spline potrivitã)
12 Tangentã de start (opþional)
13 Tangentã finalã (opþional)
40 Valoare/valori nod (pot exista intrãri grup 40 multiple)
10 Punct/puncte de control (pot exista intrãri grup 10 multiple)
11 Punct/puncte potrivire (pot exista intrãri grup 11 multiple)

TEXT 10 Punct inserþie


40 Înãlþime
1 Valoare text (ºirul însuºi)
50 Unghi rotire (opþional; implicit: 0)
41 Factor scarã X relativ. Pentru text fit (opþional; implicit: 1.0)
51 Unghi oblicitate (opþional; implicit: 0)
7 Nume stil text (opþional; implicit: STANDARD)
71 Semnalizatoare generare text (opþional; implicit: 0):
2 Textul este inversat (oglindit dupã X)
4 Textul este oglindit (dupã Y)
72 Aliniere orizontalã (opþional; implicit: 0) - acestea sunt
coduri întregi; nu sunt codificate pe biþi:
0 Stânga
1 Centrat
2 Dreapta
350 Coduri de grup DXF

Tip Cod
entitate Grup Descriere
3 Aliniat (la aliniere verticalã = 0)
4 Mijloc (la aliniere verticalã = 0)
5 Fit (la aliniere verticalã = 0)
73 Aliniere verticalã (opþional; implicit: 0) - acestea sunt
coduri întregi; nu sunt codificate pe biþi:
0 Linie de bazã
1 Bazã
2 Mijloc
3 Sus
11 Punct aliniere (opþional; prezent numai dacã este prezent
grupul 72 sau 73 ºi este nenul)
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

TOLERANCE 10 Punct inserþie


11 Vector direcþie axã X (WCS)
12 Vector direcþie axã Z (WCS)
1 Valoare text primarã
3 Nume stil text
-3 Identificatorul „ACAD” de aplicaþie. Acesta începe secþiunea
XDATA care descrie orice forþare (override) a cotei care a
fost aplicatã acestei entitãþi.

TRACE 10 Primul colþ


11 Al doilea colþ
12 Al treilea colþ
13 Al patrulea colþ
39 Thickness (opþional; implicit: 0)
210 Direcþie extrudere. Prezent dacã direcþia de extrudere a
entitãþii nu este paralelã cu axa Z a WCS
(opþional; implicit: (0,0,1))

VERTEX 10 Poziþie
40 Lãþime de start (opþional; implicit: 0)
41 Lãþime finalã (opþional; implicit: 0)
42 Umflãturã „Bulge” (opþional; implicit: 0)
70 Semnalizatoare vertex (opþional; implicit: 0):
1 Vertex suplimentar creat la potrivirea pe curbã
Anexa D 351

Tip Cod
entitate Grup Descriere
2 Tangentã potrivitã pe curbã pentru acest vertex. O tan
gentã potrivitã pe curbã cu direcþie 0 poate fi
omisã de la ieºirea DXF dar este semnificativã
dacã acest bit este setat
4 Nefolosit
8 Vertex spline creat la potrivirea pe spline
16 Punct control cadru spline
32 Vertex polilinie 3D
64 Vertex mesh poligonal 3D
128 Vertex mesh polifaþetat
50 Direcþie tangentã potrivire curbã (opþional)

VIEWPORT 10 Centru
40 Lãþime în unitãþi paper space
41 Înãlþime în unitãþi paper space
69 Identificatorul ferestrei (se schimbã ori de câte ori este
deschis desenul, niciodatã nu e salvat, cu excepþia ferestrei
paper space care este întotdeauna 1)
68 Câmp statut fereastrã
-3 Identificatorul „ACAD” al aplicaþiei. Acesta începe secþiunea
XDATA care descrie fereastra.

XLINE 10 Punct de bazã


11 Vector direcþie

D.2.3 Forþãri ale stilului de cotare


Forþãrile (overrides) stilului de cotare pot fi aplicate entitãþilor cotã, leader ºi toleranþã. Orice
forþãri aplicate acestor entitãþi sunt stocate în entitate ca XDATA. Codurile de grup ale varia-
bilelor cotelor forþate ºi valorile corespunzãtoare sunt împerecheate în ºirurile de control ale
grupurilor 1002. Urmãtorul exemplu aratã XDATA unei entitãþi cotã la care variabilele DIM-

(setq diment (car (entsel)))


TOL ºi DIMCLRE au fost forþate.

(setq elst (entget diment '(”ACAD”)))


Selecteazã entitatea cotã

(assoc -3 elst)
Obþine lista de definiþie a entitãþii
Extrge numai XDATA

(-3 (”ACAD” (1000 . ”DSTYLE”)


Acest cod returneazã:

(1002 . ”{”)(1070 . 177)(1070 . 3)(1002 . ”}”)


(1002 . ”{”)(1070 . 71)(1070 . 1)(1002 . ”}”)
))
352 Coduri de grup DXF

D.3 Entitãþi negrafice

D.3.1 Coduri de grup comune


Codurile opþionale sunt prezentate cu litere cursive subliniate.
Cod Dacã e omis,
grup Descriere implicit va fi...
-1 Nume entitate (se schimbã la redeschiderea desenului) Nu poate fi omis
0 Tip entitate Nu poate fi omis
5 Handle Nu poate fi omis
70 Valori semnalizatoare
16 intrarea în tabelã este dependentã extern de un XREF
32 XREF-ul dependent extern a fost rezolvat cu succes
64 intrarea în tabelã a fost referitã cel puþin de cãtre o entitate din desen ultima
datã când acesta a fost editat (acest semnalizator este în folosul comen
zilor AutoCAD; el poate fi ignorat de cãtre cele mai multe programe
care citesc fiºiere DXF ºi nu impune sã fie setat de programe care scriu
fiºiere DXF)
90 Blocaj ADE

D.3.2 Coduri de grup dicþionar


Tabela ce urmeazã prezintã codurile de grup pentru intrãrile în dicþionar. Ele sunt similare
celor din secþiunea OBJECTS a unui fiºier DXF. Codurile opþionale sunt prezentate cu litere
cursive subliniate.
Tip Cod
entitate Grup Descriere
DICTIONARY 90 Numãr maxim de intrãri ce pot apãrea în acest obiect înre
gistrare
300 Nume intrare (repetãri pentru aceeaºi entitate)
360 Handle-ul obiectului introdus (repetãri pentru aceeaºi enti
tate)

ACAD_GROUP 2 Nume grup


3 Descriere grup
70 Semnalizator selectabilitate
240 Contorul index al entitãþilor din grup
5 Handle-urile entitãþilor din grup (intrãri multiple; câte una
pentru fiecare entitate din grup)

ACAD_ 3 Descriere stil (ºir de sub 255 caractere)


MLINESTYLE 51 Unghi start (real, radiani, implicit: 90o)
Anexa D 353

52 Unghi final (real, radiani, implicit: 90o)


70 Semnalizatoare (codificate pe biþi):
1 = umplut
2 = prezintã joncþiunile
62 Culoare umplere
71 Atribut capãt de start (codificare pe biþi)
1 = deseneazã linie
2 = deseneazã arc interior
4 = deseneazã arc exterior
72 Atribut capãt final (codificare pe biþi)
1 = deseneazã linie
2 = deseneazã arc interior
4 = deseneazã arc exterior
73 Numãr de elemente în acest stil (întreg)
49 Offset element (real, nu implicit). Pot exista entitãþi multiple
- câte o intrare pentru fiecare element
62 Culoare element (întreg, implicit: 0). Pot exista entitãþi mul
tiple - câte o intrare pentru fiecare element
6 Tip de linie element (ºir, implicit: CONTINOUS). Pot exista
entitãþi multiple - câte o intrare pentru fiecare element

D.3.3 Coduri de grup pentru definiþii de bloc ºi


tabele de simboluri
Aceste coduri sunt similare celor gãsite în secþiunile TABLES ºi BLOCKS ale unui fiºier
DXF. Codurile opþionale sunt prezentate cu litere cursive subliniate.
Tip Cod
entitate Grup Descriere
APPID 2 Nume aplicaþie înregistratã de utilizator (pentru XDATA)
70 Valori standard semnalizatoare

BLOCK Descrierile de bloc conþin de asemenea ºi grupurile de entitãþi comune


ale entitãþilor grafice.
2 Nume bloc
70 Semnalizator de tip (valori codificate pe biþi, pot fi combi
nate):
1 Bloc anonim (generat prin hahaºurare, cotare asociativã,
alte operaþii interne sau aplicaþii)
2 Urmeazã atribute variabile
4 Acest bloc este o referinþã externã (XREF)
8 Nefolosit
16 Acest bloc este dependent extern
32 Aceasta este o referinþã externã rezolvatã, sau o depen
354 Coduri de grup DXF

denþã de o referinþã externã


64 Aceastã definiþie este referitã
10 Punct de bazã
1 Nume cale XREF (opþional; prezent doar dacã blocul este un
XREF)

DIMSTYLE 2 Nume stil cotare


70 Valori semnalizatoare standard
170 DIMALT 45 DIMRND
171 DIMALTD 173 DIMSAH
143 DIMALTF 40 DIMSCALE
274 DIMALTTD 281 DIMSD1
286 DIMALTTZ 282 DIMSD2
273 DIMALTU 75 DIMSE1
285 DIMALTZ 76 DIMSE2
4 DIMAPOST 175 DIMSOXD
41 DIMASZ 77 DIMTAD
275 DIMAUNIT 272 DIMTDEC
5 DIMBLK 146 DIMTFAC
6 DIMBLK1 73 DIMTIH
7 DIMBLK2 174 DIMTIX
141 DIMCEN 48 DIMTM
176 DIMCLRD 172 DIMTOFL
177 DIMCLRE 74 DIMTOH
178 DIMCLRT 71 DIMTOL
271 DIMDEC 283 DIMTOLJ
46 DIMDLE 47 DIMTP
43 DIMDLI 142 DIMTSZ
44 DIMEXE 145 DIMTVP
42 DIMEXO 340 DIMTXSTY
287 DIMFIT 140 DIMTXT
147 DIMGAP 284 DIMTZIN
280 DIMJUST 270 DIMUNIT
144 DIMLFAC 288 DIMUPT
72 DIMLIM 78 DIMZIN
3 DIMPOST

ENDBLK (fãrã grupuri) Definiþie de sfârºit de bloc (apare numai în tabela


BLOCK)

LAYER 2 Nume layer


70 Semnalizatoare layer
1 Dacã e setat, layerul e îngheþat, altfel e dezgheþat
2 Dacã e setat, layerul e îngheþat implicit în noile viewport-uri
Anexa D 355

4 Dacã e setat, layerul este blocat


62 Numãr culoare (dacã e negativ, layerul e OFF)
6 Tip linie

LTYPE 2 Nume tip linie


70 Valori semnalizator standard
3 Text descriptiv pentru tip de linie
72 Cod de aliniere
73 Numãr de articole lungimi de linie
40 Lungime totalã pattern
49 Lungime linie (opþional; poate fi repetat)

STYLE 2 Nume stil


70 Valori semnalizator standard
40 Înãlþime fixatã text
41 Factor de lãþime
50 Unghi de oblicitate
71 Semnalizatoare generare text (valori codificate pe biþi; pot fi
combinate):
2 Textul este inversat (oglindit dupã X)
4 Textul este oglindit (dupã Y)
42 Ultima înãlþime folositã
3 Nume fiºier font primar
4 Nume fiºier font mare (ºir vid dacã lipseºte)

UCS 2 Nume UCS


70 Valori semnalizator standard
10 Origine (în WCS)
11 Direcþie axã X (în WCS)
12 Direcþie axã Y (în WCS)

VIEW 2 Nume view


70 Semnalizator view:
1 Dacã e setat, acest view este un view de paper space
40 Înãlþime
41 Lãþime
10 Centru (un punct 2D) (în DCS)
11 Direcþie view din þintã („target”), în WCS
12 Punct þintã („target point”), în WCS
42 Lungime lentile („lens length”)
43 Plan de tãiere frontal („front clipping plane”)
44 Plan tãiere spate („back clipping plane”)
50 Unghi rotire („twist angle”)
71 Mod view - aceleaºi valori ca variabila de sistem VIEWMODE
356 Coduri de grup DXF

VPORT 2 Nume Vport (Poate sã nu fie unic. Toate viewport-urile din


configuraþia curentã sunt numite *ACTIVE, iar primul
vport *ACTIVE din tabelã este cel curent afiºat)
70 Valori semnalizator standard
10 Colþ stânga jos (un punct 2D)
11 Colþ dreapta sus (un punct 2D)
12 Centru (un punct 2D)
13 Punct de bazã snap (un punct 2D)
14 Spaþiere snap (X ºi Y)
15 Spaþiere grid (X ºi Y)
16 Direcþie din punctul þintã („target”)
17 Punct þintã („target point”)
40 Înãlþime
41 Ratã aspect („aspect ratio”)
42 Lungime lentile („lens length”)
43 Plan tãiere frontal („front clipping plane”)
44 Plan tãiere spate („back clipping plane”)
50 Unghi de rotire snap
51 Unghi „twist”
68 Câmp de stare („status field”)
69 Identificator („ID”)
71 Mod view - aceleaºi valori ca variabila de sistem VIEWMODE
72 Procent zoom cerc
73 Setare zoom rapid
74 Setare UCSICON
75 Snap on/off
76 Grid on/off
77 Stil snap
78 Pereche iso snap („Snap isopair”)


Funcþii AutoLISP (partea I-a)
+ (adunare) 136 ase_errqty 155 „car, cdr, cadr...” 174
- (scãdere) 136 ase_linkcreate 155 chr 176
* (înmulþire) 137 ase_linkget 157 client_data_tile 176
/ (împãrþire) 137 ase_linkremove 157 close 176
= (egal cu) 138 ase_linkupdate 158 command 177
/= (neegal cu) 138 ase_lpcreate 158 cond 179
< (mai mic decât) 139 ase_lperase 159 cons 180
<= (mai mic sau egal) 139 ase_lpisupdatable 159 cos 181
> (mai mare decât) 140 ase_lpkey 160 cvunit 181
>= (mai mare sau egal) 140 ase_lplist 160 defun 182
~ (NU la nivel de bit) 141 ase_lppath 160 dictnext 183
1+ (incrementare) 141 ase_lprename 160 dictsearch 184
1- (decrementare) 142 ase_lsadd 161 dimx_tile ºi dimy_tile 185
abs 142 ase_lscmp 161 distance 185
acad_colordg 142 ase_lscopy 161 distof 185
acad_helpdlg 143 ase_lscreate 162 done_dialog 186
acad_strlsort 143 ase_lsdel 163 end_image 187
action_tile 143 ase_lsentsel 163 end_list 187
add_list 144 ase_lserase 163 entdel 187
ads 145 ase_lsfree 164 entget 188
alert 145 ase_lsget 164 entlast 192
alloc 145 ase_lsintersect 164 entmake 193
and 146 ase_lsintersectfilter 164 entmod 196
angle 146 ase_lsisupdatable 165 entnext 198
angtof 147 ase_lslpnames 165 entsel 199
angtos 147 ase_lsmemb 165 entupd 200
append 149 ase_lsqty 165 eq 201
apply 149 ase_lssubtract 165 equal 201
arx 149 ase_lsunite 166 *error* 202
arxload 150 ase_lsxnames 166 eval 203
arxunload 150 ase_version 166 exit 203
ascii 151 assoc 166 exp 203
ase_docmp 151 atan 167 expand 204
ase_docurrent 151 atof 168 expt 204
ase_dolist 151 atoi 168 fill_image 204
ase_dopathcode 152 atom 169 findfile 205
ase_dopathmake 153 atoms-family 169 fix 206
ase_dopathname 153 autoarxload 171 float 206
ase_dostatus 154 autoload 171 foreach 207
ase_errcode 154 autoxload 172 gc 207
ase_errdsc 155 Boole 172 gcd 207
ase_errmsg 155 boundp 173 get_attr 208
Funcþii AutoLISP (partea a II-a)
get_tile 208 min 240 ssadd 267
getangle 208 minusp 241 ssdel 268
getcfg 209 mode_tile 241 ssget 269
getcorner 210 namedobjdict 242 sslength 275
getdist 210 nentsel 242 ssmemb 275
getenv 211 nentselp 244 ssname 276
getfiled 211 new_dialog 246 startapp 276
getint 213 not 247 start_dialog 277
getkword 213 nth 247 start_image 277
getorient 214 null 247 start_list 278
getpoint 215 numberp 248 strcase 278
getreal 216 open 248 strcat 279
getstring 216 or 250 strlen 279
getvar 217 osnap 250 subst 279
graphscr 217 pi 251 substr 280
grclear 217 polar 251 tablet 281
grdraw 218 prin1 251 tblnext 282
grread 218 princ 253 tblobjname 283
grtext 221 print 254 tblsearch 284
grvecs 222 progn 254 term_dialog 285
handent 223 prompt 255 terpri 285
help 224 quit 255 textbox 285
if 225 quote 255 textpage 286
initget 226 read 256 textscr 286
inters 230 read-char 256 trace 287
itoa 231 read-line 257 trans 287
lambda 231 redraw 258 type 290
last 232 regapp 259 unload_dialog 292
length 232 rem 259 untrace 292
list 232 repeat 260 vector_image 292
listp 233 reverse 261 ver 293
load 233 rtos 261 vmon 294
load_dialog 235 set 262 vports 294
log 235 set_tile 262 wcmatch 295
logand 236 setcfg 263 while 298
logior 236 setfunhelp 263 write-char 298
lsh 236 setq 264 write-line 299
mapcar 237 setvar 265 xdroom 299
max 238 sin 266 xdsize 300
mem 238 slide_image 266 xload 301
member 239 snvalid 267 xunload 302
menucmd 239 sqrt 267 zerop 302
Bibliografie
1. GIUMALE, Cristian, LISP, Editura Tehnicã, 1987
PREOÞESCU, Dan,
ªERBţNAÞI, Luca Dan,
TUFIª, Dan,
TECUCI, Gheorghe,
CRISTEA, Dan
2. HEAD, O. George AutoLISP in plain English, Ventana
Press, Chapel Hill, North Carolina, USA, 1988
3. KNUTH, E. Donald The Art of Computer Programming,
Addison Wesley Publishing Company, Inc.,
Phillipines, 1973
4. STţNCESCU, Constantin AutoCAD - Manual de iniþiere, Editura
FAST, Bucureºti, 1993
5. STţNCESCU, Constantin Revista „Hello CAD Fans”,
nr. 1 - 45, iunie 1991 - februarie 1996
6. STţNCESCU, Constantin, Utilizarea minicalculatorului
NECULA, Maria Ana CORAL - 4011 sub sistemul de operare
RSX - 11M, Plan local, Institutul
Politehnic Bucureºti, 1982, 1983, 1984
7. *** AutoLISP Programmers Reference,
Autodesk, Inc., Sausalito,
California, USA, 1989, 1992, 1993, 1994
8. *** Dicþionar de informaticã,
Editura ªtiinþificã ºi enciclopedicã,
Bucureºti, 1981

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