Documente Academic
Documente Profesional
Documente Cultură
Constantin STţNCESCU
AutoLISP
Manual de programare
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
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.
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
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
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...
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
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
1.8 Volatilitate
º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
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
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
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.
Î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.
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ã
}
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
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.
(nume-funct [argumente]...)
cutã: 3.141593.
Cum facem sã creãm o nouã variabilã?
Capitolul 2 31
Atribuire
Numele variabilei (liber ales)
Funcþia SETQ
de atribuire Valoare atribuitã
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
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-
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
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:
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
(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)
(distance p1 p2)
UNITS (de obicei trigonometric)
(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
IF
executã1 executã2
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
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-
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-
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
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
(getint [<prompt>])
afiºeazã ºirul Raza: în zona de dialog din josul ecranului ºi aºteaptã. Dacã
(getint ”Raza: ”)
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!
\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:
Probaþi!
44 Programare simplã în AutoLISP
(getreal [<prompt>])
<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
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.: “))
cu <Enter>.
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
(command [<args>])
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
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
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:
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“)
)
(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))
)
(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
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-
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
(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
(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
C:GRAFIC
Command: GRAFIC
OK grafic!
Command:
Ceea ce apare pe ecran este:
<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;
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
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:
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.
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.
(princ <expr>)
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.
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:
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>])
ABC
abcde
123456
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-
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
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
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
un ºir vid ““. Scopul este numai acela de a o crea ca variabilã ºir, pentru a
Capitolul 2 71
Î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:
unde:
<ºir> = ºirul de cercetat
<start> = numãrul de ordine (începând cu 1) al caracterului de unde
(strlen <ºir>)
unde:
<ºir> = ºirul a cãrui lungime dorim s-o aflãm.
***
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
(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>)
(itoa 33)
ASCII. De exemplu:
(itoa 17)
returneazã „33“
returneazã „17“
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...).
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.
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))
)
)
(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))
)
)
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-
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)
(entnext [<nument>])
primei entitãþi din desen. Dacã <nument> este prezent ºi conþine numele
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.
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
<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
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
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
; 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
<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
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
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
\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-
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
(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>])
(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
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.
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-
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
...definiþia Dvs....
)
(defun C:END()
...definiþia Dvs....
)
(defun S::STARTUP()
(command ”undefine” ”quit”)
(command ”undefine” ”end”)
)
î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
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
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.
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
tolul 5).
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 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.
(expand 1)
(alloc 10000) ; fixeazã o mãrime mare de segment pentru a se evita
; obþine 3000 noduri libere (un segment)
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
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
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.
(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
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
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
4.1 Recursivitate
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
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
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
din acest numãr sã obþineþi valoarea aleatoare a unui zar, faceþi un apel î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?
Prin (type pct) cereþi sã vi se returneze tipul variabilei pct. Dacã tipul este
)
º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
sunt valori numerice întregi (2 ºi 4), altele valori reale (3.7), altele ºiruri de
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ã:
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ã.
tmp ()
)
(foreach elem1 lst
(if (/= elem1 mini) (setq tmp (append (list elem1) tmp))
(setq lord (append lord (list elem1)))
)
)
(setq lst tmp)
)
lord
)
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-
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
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
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ã
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
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
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))
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.
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):
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))
entget
Command: (car fff)
<Entity name: 60000018>
Command: (cdr fff)
((139.0 126.0 0.0))
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
)
)
)
(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
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
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
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
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
viþi polilinia pe spline dupã aceea, veþi muta probabil doar vertex-urile
puncte de control.
(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
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:
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
(= 14 14.0)
valabilã atât pentru numere cât ºi pentru ºiruri. Iatã exemple:
(= 123 321)
returneazã T
(= 49 49 50)
returneazã T
(= ”HCF” ”HCF”)
returneazã nil
(= ”HCF” ”HCF ”)
returneazã T
(= ”HCF” ”COS”)
returneazã nil
returneazã nil
(/= 10 20)
De exemplu:
(< 10 20)
strict crescãtor). De exemplu:
(< 11 1.1)
(< 1 8 99)
returneazã nil
(<= 10 20)
ºirul de valori este crescãtor sau staþionar, sau amestecat). De exemplu:
(<= 22 5.4)
returneazã T (staþionar)
(> 11 2 1)
returneazã nil
(> 33 14 14)
returneazã T
returneazã nil
(~ 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
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
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
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ţ).
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
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
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
(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
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
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
(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ã
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
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
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.
(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.
catã cu arxload:
descãrcare. De exemplu, codul de mai jos descarcã aplicaþia b i b d u e încãr-
(arxunload ”bibdue”)
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-
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
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
0 Necunoscut
1 Mediu (environment)
2 Catalog
3 Schema
4 Tabela
5 Nume cale de legãturã
Capitolul 5 153
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ã.
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
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
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 ...
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
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
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
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
Val Descriere
specificate ºi valorile date mai jos.
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
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
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
structurilor din alte limbaje de programare. Funcþia subst, descrisã mai jos
regãsite printr-o ”cheie”. Aceasta este similarã tablourilor/vectorilor sau
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
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
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
definite
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-
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>
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-
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
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
(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 ‘())
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 ‘())
returneazã (C)
returneazã nil
Când argumentul <list> este o pereche cu punct (vezi cons), cdr
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
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
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-
º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-
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-
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ã
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
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-
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ã).
”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
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:
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ã.
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
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
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 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
Release 12 distof
(distof <ºir> [<mod>])
Converteºte un ºir care reprezintã o valoare realã într-o valoare realã
186 Funcþii AutoLISP
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
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
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
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-
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
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
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
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
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
(setq e1 (entlast))
De exemplu:
;seteazã E1 pe numele ultimei entitãþi
(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
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-
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ã
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
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-
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
(entmake ”endblk”)
Ori de câte ori este deschis un desen, toate blocurile anonime nereferite
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,
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-
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
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
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
(setq e1 (entnext))
numele entitãþii principale. De exemplu:
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
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
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)
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)
Î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,
(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)
)
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 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
(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:
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
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-
(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
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
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
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
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
Release 13 getcfg
(getcfg <numecfg>)
Returneazã datele aplicaþiei din secþiunea AppData a fiºierului ACAD.CFG
(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ã
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
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
Valoare
”flag”
1 (bit 0) Fixaþi acest bit atunci când doriþi sã cereþi numele unui nou fiºier
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
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ã,
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ã.
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
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: ”))
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
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ã
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
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.
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: ”))
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? ”))
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
Release 10 graphscr
(graphscr)
Comutã ecranul în mod grafic
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
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-
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.
Orice altã intrare este transferatã direct lui grread, permiþându-i controlul
printr-o întrerupere de tastaturã (dacã <allkeys> nu a dezactivat aceasta).
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
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
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
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,
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
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
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ã
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
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-
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
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-
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).
Onoreazã
cuvinte
Funcþie cheie Valori biþi de control .
getint
(1) (2) (4) (8) (32) (64) (128)
getreal +•
+• +• +• +• +•
getdist +•
+• +• +• +•
getangle +•
+• +• +• +• +• +•
getorient +•
+• +• +• +•
getpoint +•
+• +• +• +•
getcorner+•
+• +• +• +•
getkword +•
+• +• +• +•
entsel
+• +•
nentsel +•
+•
nentselp +• .
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
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
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
(inters a b c d)
atunci:
(inters a b c d T)
returneazã nil
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
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)
(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
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
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
î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-
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
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
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
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
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ã-
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 oferã aceleaºi date ca entsel (vezi). În schimb, dacã obiectul selec-
Când obiectul selectat nu este complex (bloc sau polilinie, de exemplu),
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
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
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.
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
bolul a).
hexazecimal intern (care nu ne intereseazã; noi vom lucra numai cu sim-
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
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-
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
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
Release 10 progn
(progn <expr>...)
Evalueazã secvenþial expresiile ºi returneazã valoarea ultimei expresii
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
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
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-
(read-char)
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ã
Release 10 read-line
(read-line [<descr-fis>])
Citeºte un ºir de la tastaturã sau dintr-un fiºier deschis
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.
(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
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
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ã
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>
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
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
buie sã fie un ºir quot-at (vezi funcþia defun). Celelalte trei argumente
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
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
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
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
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).
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-
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
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-
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
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)
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-
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
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
Release 10 ssname
(ssname <ss> <index>)
Returneazã numele de entitate al elementului indexat al unei mulþimi de selecþie
276 Funcþii AutoLISP
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
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
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
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 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
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”,
(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
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
Release 10 tblsearch
(tblsearch <nume_tabelã> <simbol> [<setnext>])
Cautã un nume simbolic într-o tabelã de simboluri
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
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
Release 10 terpri
(terpri)
Tipãreºte o linie nouã pe linia de comandã
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ã
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
Release 10 trace
(trace <funcþie>...)
Ajutã la depanarea programelor AutoLISP
Capitolul 5 287
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.
Funcþia trans poate transforma de asemenea puncte 2D. Ea face asta prin
care capãt pare mai apropiat.
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
Release 10 untrace
(untrace <funcþie>...)
Anuleazã flag-ul „trace” pentru funcþiile specificate.
292 Funcþii AutoLISP
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ã
Release 10 ver
(ver)
Returneazã un ºir care dã versiunea curentã AutoLISP
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
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
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
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
”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
î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
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ã
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
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
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
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' '-' #5 1#425 %0-0#/' &51= .0&'-5-
5/&'
9 '23 '23+5/'# &' 540 &+/ %#2' (5/%?+# # &'6'/+4
&+310/+$+-=  /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= %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 # '-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 &' +.#)+/+ :+ # '-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
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 .
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:
º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
Unele erori sunt produse datoritã greºelior de programare cum sunt: paran-
tezele sau ghilimelele neîmperecheate, numele eronate de funcþii etc.
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 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
bad node
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.
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.
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.
Argumentul transmis lui log sau sqrt este în afara domeniului permis.
(funcþie nedefinitã pentru valoare argument)
improper argument
defun.
se potriveºte cu numãrul de argumente formale specificat prin
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.
invalid argument
(argument incorect)
Tip de argument impropriu, sau argument în afara gamei admise.
invalid character
(caracter incorect)
O expresie conþine un caracter impropriu.
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
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
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))
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))
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))
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))
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
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.
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
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))
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))
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))
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))
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.
(assoc -3 elst)
Obþine lista de definiþie a entitãþii
Extrge numai XDATA
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