Sunteți pe pagina 1din 319

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Cuvnt nainte

Aceast carte nu ar fi putut fi scris fr existena minunatului


colectiv de Inginerie Asistat de Calculator din cadrul Universitii
POLITEHNICA din Bucureti, dezvoltat n jurul Centrului de Calcul al
Catedrei T.C.M. nc din anul 1980.
AutoCAD a fost introdus ntre obiectivele strategice ale
Laboratorului de Inginerie Asistat de Calculator prin strdaniile
Prof.dr.Ing. Constantin Stncescu nc din 1991 i constituie n
continuare baza logistic de implementare a noiunilor de Proiectare
Asistat de Calculator.
De-a lungul anilor, dezvoltarea aptitudinilor absolvenilor n
acest domeniu de activitate a fost permanent n atenia celor ce
direcioneaz coninutul planurilor de nvmnt, n special a D-lui
Prof.dr.Ing. Marian Gheorghe.
AutoLISP a venit firesc, odat cu AutoCAD, i a constituit un
domeniu de fireasc curiozitate la nceput, de investigare atent i mare
satisfacie, ulterior.
Cu toii ne-am aplecat asupra tainelor sale i ncetul cu ncetul
am reuit s obinem primele rezultate i de ce nu, o consacrare
ulterioar.
Mulumesc pe aceast cale profesorilor mei:
prof.dr.Ing Constantin Stncescu i
ef lucrri dr.Ing. Corneliu Prvu,
crora le sunt acum coleg, sper de ndejde,
dar i studenilor notri ,
ef lucrri Cristian Doicin,
Ing. Nicolae Bioaic i
Drnd. Ing. Mircea Matei
care ne-au devenit pe rnd colaboratori apropiai i colegi.

0-1

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Fr ei AutoLISP i AutoCAD n Romnia nu ar fi fost acelai
lucru.
Cursul este dedicat studenilor notri, cu sperana s devin
pentru noi ceea ce am devenit noi pentru profesorii notri.
Calea ctre profesionalism este ntotdeauna dificil, dar este
att de frumoas atunci cnd o parcurgem mpreun, profesori i
discipoli.
Programarea este un domeniu de activitate unde spiritul de
echip poate conduce la realizri deosebite, dar unde iniiativa
personal i ideile originale sunt flori rare ce trebuie cultivate cu grij.
ncerc de mai muli ani s imprim studenilor care urmeaz
acest curs de programare sub AutoLISP principiile de baz ale
programrii cu acest limbaj, dar i marea bucurie i plcere a
programrii n sine.
Am avut experiene bune i rele, sentimentul cel mai
important pe care pot ns s l mprtesc este acela de satisfacie,
pentru atingerea unui prag care mi-a permis o real independen.
Nu este vorba de a tri ntr-o realitate virtual ci de a reui n
cruda realitate nconjurtoare.
Pentru a programa n AutoLISP nu este nevoie de multe
resurse ci de timp, ambiie i putere de munc.
Sunt attea probleme care ateapt s fie rezolvate, iar
rezolvrile nu trebuie s fie sofisticate.
Chiar cu costuri mici, problemele sunt att de numeroase
nct merit s ne apucm odat s le rezolvm.
Ce este interesant, problemele sunt pentru toi.
Nu rmne dect s ne apucm de treab.
Mulumesc deasemenea prietenului meu, Ing. tefan Gingirof
pentru sufletul su tnr i profunda aplecare ctre munc i
performan n inginerie.

0-2

Ovidiu Alupei-Cojocariu

1
1.1

AutoLISP - Manual de programare

Introducere

Programarea n mediul AutoCAD?

Orice program CAD care se respect are asociat un limbaj de


dezvoltare a unor aplicaii sau funcii noi ce completeaz setul de
comenzi native cu comenzi noi scrise de utilizatori.
Aceste program se scrie de obicei "pe genunchi", este mic i
aglutineaz mai multe comenzi, care sunt rulate consecutiv pentru
ndeplinirea unui anumit scop.
AutoCAD are disponibil procedura SCRIPT tocmai pentru a
realiza aceste macro-comenzi. Scrii ntr-un fiier cu extensie .scr o
succesiune de comenzi AutoCAD cu o anumit regul sintactic , iar cu
comanda SCRIPT poate fi rulat acest macrou.
Comenzile sunt executate n ordinea programat i se obin
rezultatele grafice concrete.
Ce nu poate ns un astfel de mod de lucru este de a calcula
nite parametri care s dea o deschidere ntregii maniere de lucru.
Ingineria este plin de desene, dar aceste sunt n cea mai mare
majoritate expresia final a unui concept concretizat prin calcule.
Fiecare problem are un mod specific de rezolvare, uneori necesitnd
un calcul laborios, care poate fi fcut doar de un program.
Principiile programrii calculatoarelor implic existena unui
fiier, a ncrcrii unui program coninut acolo i a rulrii sale.
Rezultatele intermediare sunt stocate n variabile, utilizabile
pe tot parcursul rulrii, rezultatele finale fiind afiate pe ecran sau
transpuse n fiiere de date.
Important este n acest moment ct de accesibil este de a scrie
un program? Cine l poate scrie i mai ales ct timp este necesar pentru
a avea aceste abiliti?
Un lucru este clar: AutoLISP este cea mai scurt cale prin
care se poate scrie un program care s satisfac nevoile imediate ale
unui utilizator de AutoCAD.
1-1

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Acest fapt este n primul rnd posibil datorit faptului c
AutoLISP este mereu aproape de AutoCAD, "semper fidelis", deoarece
este trup comun cu acesta.
Cum putem percepe acest lucru?
Deschidei o parantez "(" n zona de comand i tastai
aceast secven:
Command: (+ 1 2)
3
Ai apelat interpretorul de AutoLISP i i-ai comandat s
execute un calcul pe care el l-a i efectuat.

1.2

Ce este un interpretor?

Un program sau o parte a unui program capabil s primeasc


comenzi ale utilizatorului i s le execute.
Aceast abilitate nu este absolut ci se desfoar n condiiile
unei sintaxe i a unei ortografii stricte. Cu alte cuvinte nu poate fi
interpretat dect mesajul scris strict n condiiile pe care interpretorul le
cunoate.
Limitrile sunt natural a fi impuse datorit faptului c nu
exist un program care s neleag orice comenzi.
Avem prin urmare de nvat nite reguli fr de care
AutoLISP nu ne va nelege i deci nu ne va executa ordinele.

1.3

Ce este LISP?

Acest acronim provine de la List Processing (procesare de


liste) sau poate de la List Programming (programere de liste).
Lista este structura fundamental utilizat n programarea cu
LISP.
Lisp este un limbaj de programare la nivel nalt, cel mai bun
limbaj cunoscut pentru aplicaii n domeniile inteligenei artificiale,
sisteme expert i AutoCAD.
Lisp este unul din cele mai vechi limbaje de programare. A
aprut ca i FORTRAN n anul 1960. Exist n prezent multe dialecte
de Lisp, cum sunt: Common Lisp, Franz Lisp, Mu Lisp, X Lisp.
1-2

Ovidiu Alupei-Cojocariu

1.4

AutoLISP - Manual de programare

Ce este AutoLISP?

AutoLISP este un dialect de lisp, implementat sub AutoCAD,


cu urmtoarele disponibiliti:

Sintaxa este foarte simpl i riguroas. Este uor de nvat


modul de evaluare precum i modul de construire a unei
expresii.

Este un interpretor, deci rezultatele calculelor pot fi vizualizate


direct n editorul de desenare AutoCAD;

Interaciunea cu AutoCAD este direct, fr a fi absolut


necesar utilizarea unui compilator;

Este posibil scrierea unor funcii simple, structurate care pot


fi combinate n programe complexe;

Dispune de toate instrumentele necesare programrii


structurate i are acces la informaiile coninute n baza de date
asociate entitilor AutoCAD.

1.5

Ce face AutoLISP ?

Datorit facilitilor oferite n programare, AutoLISP poate fi


folosit, n contextul AutoCAD, la dezvoltarea de noi aplicaii,
exploatnd editorul grafic puternic al AutoCAD personaliznd i
completnd ori de cte ori este nevoie mediul de lucru cu comenzi noi.
Programele care pot fi dezvoltate pot fi foarte extinse,
combinnd comenzi AutoCAD n subrutine extrem de puternice i
complexe.
Adugarea de noi comenzi AutoCAD duce la generarea unor
medii speciale CAD care pot s constituie dezvoltri importante ale
programului n domenii noi de activitate.

1.6

Cum acioneaz AutoLISP ?

Prezena AutoLISP este element standard al AutoCAD,


valabil pe oricare din platformele de lucru.
Interpretorul este ncrcat automat la nceputul sesiunii de
editare i este disponibil din acest prim moment.

1-3

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcionarea interpretorului este nepretenioas. Dac s-a
instalat AutoCAD i merge, atunci merge i AutoLISP.
Apelurile AutoLISP sunt posibile doar din cadrul editorului de
desenare, accesul fiind disponibil permanent att pe promptul
Command: ct i n cadrul unei comenzi.

1.7

Cunotine preliminare
Trebuie ca utilizatorul s satisfac urmtoarele cerine :

s posede cunotine temeinice de AutoCAD;

s posede cunotine legate de programare n general;

s aib experien n utilizarea fiierelor script i a celor menu;

s aib abilitatea de a utiliza un editor de texte tip ASCII


neformatate ( NE sau EDIT sub DOS, NOTEPAD sub Windows)

1-4

Ovidiu Alupei-Cojocariu

2
2.1

AutoLISP - Manual de programare

AutoLISP i listele

Procesarea de liste

Activitatea central a interpretorului AutoLISP


procesarea de liste, sau altfel spus evaluarea acestor informaii.

este

Faptul c ne aflm n editorul de desenare i deschidem o


parantez "(" reprezint un eveniment ateptat. AutoCAD cedeaz
controlul interpretorului AutoLISP odat cu identificarea acestui
simbol. Evenimentul trebuie completat n mod necesar cu "nchiderea"
")". ntre cele dou momente, caracterele scrise pot s mai fie
consecutiv i "(" sau ")", cu condiia ca ele s fie "echilibrate" adic
fiecrui semn "(" s i fie asociat perechea sa ")".
Ceea ce se gsete n interiorul acestui cuplu este din punct de
vedere informaional o list.
Parantezele deschise sau nchise i necesitatea echilibrrii lor,
constituie o regul de baz n scrierea expresiilor AutoLISP i este
totodat de obicei prima regul clcat de utilizator.
Neechilibrarea parantezelor va duce n mod necesar la apariia
unui mesaj care s indice gradul de neechilibrare sau s indice o
construcie greit a listei introduse.
n aceast faz a devenirii sale, programatorul nceptor nu
obine rezultatele scontate pn nu depete acest obstacol al
mperecherii corecte a parantezelor.
Pn la procesarea de liste mai este cale lung, utilizatorul
este tentat deocamdat s denumeasc LISP ca fiind "Lot of Idiotic Silly
Parenthesis" (" o mulime de paranteze idioate i prosteti").
S avem rbdarea i credina c se va depi aceast perioad.
Problema neechilibrrii poate fi "salvat" dac folosim un
editor "detept" care s introduc automat i paranteza corespunztoare
de nchidere sau mcar s ne ofere posibilitatea de a putea verifica
aceast coresponden.
Exerciii:
2-1

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Pe promptul "Command : " al AutoCAD introducei
urmtoarele expresii simple:

2.2

Expresie

Rezultat

(+ 1 2)

(- 3 5)

-2

(/ 4 2)

(* 3 5)

15

Utilizarea expresiei n cadrul unei comenzi


AutoCAD:

Comenzile AutoCAD poart adeseori un dialog cu utilizatorul,


dialog ce urmrete introducerea unei valori. Momentul introducerii
poate s nu fie favorabil utilizatorului, valoare ape care urmeaz a fi
utilizat nefiind nc calculat.
Utilizarea unei expresii AutoLISP prin care se poate calcula
ad-hoc acea valoare are darul s-l "salveze" pe utilizator de la o
pierdere important de timp care se materializeaz printr-o
productivitate diminuat.
Este permis invocarea AutoLISP prin introducerea n acel
moment a unei expresii.
De exemplu, dorim s desenm un cerc a crui raz este 135
15. Vom proceda astfel:
Command: CIRCLE Specify center point for circle or [3P
2PTtr (tan tan radius)]: 100,100
Specify radius of circle or [Diameter]:(/ 135 15)
9
Cercul a fost desenat, i am obinut i rezultatul evalurii
expresiei "9".
Ori de cte ori avem un calcul de fcut, putem invoca
AutoLISP , iar acesta ne va ajuta.
2-2

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Salvarea rezultatelor intermediare n variabile cu ajutorul
crora s regsim aceste rezultate este accesibil n urma procedurii de
atribuire pe care o vom dezbate ceva mai trziu.
Interogarea valorii unei variabile sau a unei constante anterior
definite este posibil datorit unui al doilea semn ateptat de
interpretorul AutoLISP i anume semnul "!".
Apariia acestui semn pe promptul "Command:" urmat de un
nume al unei constante sau al unei variabile utilizate dar chiar i al unei
expresii conduce al afiarea consecutiv a coninutului acelei informaii
interogate.
De exemplu constanta pi:
Command: !pi
3.14159
sau
Command: !(+ 1 4)
5
Acest semn poate fi folosit chiar i ntr-o comand AutoCAD
atunci cnd valoarea dorit este stocat ntr-o variabil anterior
calculat.

2.3

Structura listelor

Listele sunt informaii complexe, structurate linear sau


radicular, mpachetate ntre dou paranteze, una de deschidere, alta de
nchidere.
Elementul cel mai simplu al unei liste, care nu mai poate fi
mprit, poart numele de atom.
Atomii stau ntr-o list ca boabele de ntr-o pstaie, fiecare n
alveola sa, fiind ntotdeauna desprite.
O list poate avea o structur mai complicat, "radicular",
dac elementele sale componente sunt la rndul lor liste (subliste).
O alt imagine asociat unei liste este aceea a unui irag de
mrgele n care fiecare mrgic este un atom.

2-3

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

a. list simpl

b. list complex

2.4

Separatori

Elementele unei liste sunt ntotdeauna distincte iar acest fapt


este realizat cu ajutorul separatorilor. Se consider separatori
urmtoarele :

spaiul (blancul) < >;

<"> (ghilimele) ;

<(>,<)> - parantezele care indic nceputul i sfritul


unei liste.

Scrierea consecutiv a doi separatori cnd unul dintre ei este


blanc nu este necesar, blancul putnd fi omis.
Separatorul ghilimele <"> indic nceputul i sfritul unui ir
de caractere, deci trebuie s avem grij i cu mperecherea acestora.
Omiterea unui semn va altera sensul frazei scrise, tot ceea ce se afl
ntre dou astfel de semne fiind interpretat ca ir chiar dac continuarea
se face pe cteva rnduri. Eroarea este semnalat fie de funcionarea
"ciudat" a programului, fie de depirea lungimii maxime pe care un
ir o poate avea (256 de caractere).
Din punct de vedere informatic, pentru cei familiarizai cu
noiunea de pointer, lista poate fi explicat ca o secven de pointeri
(adrese de memorie). Acetia sunt grupai perechi, primul fiind ctre o
locaie de memorie care conine valoarea cutat, cel de-al doilea
fiind pointer ctre elementul urmtor. Cutarea are aadar loc din
atom n atom, ultimul element din list avnd un pointer nil, indicnd
terminarea listei.

2-4

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Parcurgerea unei liste este deci ntrerupt la gsirea unui
pointer ctre nil.
Aceast structur asigur o utilizare eficient a memoriei i
n acela i timp o citire rapid a informaiei. Totul este de a genera
aceste "iraguri de perle" i a le manevra ct mai eficient.

2.5

Evaluarea listelor

Evaluarea unei liste ncepe cu primul element care urmeaz


parantezei de deschidere i se desfoar progresiv element dup
element. Odat deschis o nou sublist, dac aceasta exist, se iniiaz
un proces paralel de evaluare care ia sfrit odat cu epuizarea
respectivei structuri. Rezultatul evalurii este un atom de substituie
care va fi amplasat n locul sublistei, evaluarea continund pe ramura
principal.
Evaluarea este deci un proces complex, care poate s fie
ntrerupt de orice eroare descoperit fie pe ramura principal, fie pe
oricare din subliste.
Mesajul de ntrerupere a evalurii cuprinde n el i locul unde
s-a descoperit anomalia, precum i toate listele ce cuprind acel atom.
O structur complex va genera ntotdeauna un mesaj foarte
mare datorit prezenei tuturor listelor ierarhice n care se gsete
eroarea.
n cazul unor versiuni mai vechi de AutoCAD aa cum sunt
cele pentru DOS, limitarea afirii mesajului de eroare din cauza
efectului ireversibil de scroll va duce la ascunderea nceputului
mesajului de eroare ceea ce va face extrem de dificil determinarea
exact a tipului de eroare i apoziiei precise a acesteia.
n aceste cazuri doar o scriere structurat a programelor
permite rularea unei anumite poriuni mai reduse din acesta, astfel nct
mesajul de eroare s ncap pe ecranul text.
Oricum nu uitai c vizualizarea ecranului text AutoCAD se
poate face cu comanda TEXTSCREEN sau cu apsarea tastei F1
(DOS) sau F2 (Windows).

2.6

Atomi
Atomul este tipul cel mai simplu de dat n LISP.
2-5

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Pentru a afla dac obiectul este list sau atom, putem s
verificm dac este sau nu cuprins ntre paranteze. Dac da, el este o
list.
Se prezint n continuare principalele tipuri de atomi din
AutoCAD
Tip Atom

Exemple

Tip data
AutoLISP

Simbol

pi x mid_pt

SYM

ir de caractere

"Viata este frumoas!"

STR

ntreg

1, 2 ,32456, -4567,

INT

Real

1.0, 43.234, -12.345

REAL

Descriptor de fiier

<File:#b28>

FILE

Nume
de
AutoCAD

<Entity
name:55683d4>

ENAME

Set de selecie AutoCAD

<Selection set:1>

PICKSET

Funcie intern
AutoLISP

<Subr:#123>

SUBR

Funcie extern

<Ext.Subr.:1
#3e870654>

EXSUBR

entitate

Un tip special de dat este "nil". El este singurul care este


simultan i atom i list.
Formularea sa poate fi fcut fie ca o list vid (), fie ca nil.
Nil este echivalentul AutoLISP pentru FALSE (fals). Are deci
o valoare logic i este testat apariia sa de diferite funcii care
opereaz cu valori logice.
Orice nil nu exist deci este FALSE.
Este interesant c n AutoLISP nu exist valoarea TRUE.
Orice atom sau list care exist, are aceast proprietate (se returneaz
T).
T este o valoare de adevr care nu trebuie alterat.
2-6

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Nu folosii niciodat numele formal t pentru o variabil de-a
Dvs. Se va altera T i chiar sub unele versiuni de AutoLISP programul
nu va putea fi rulat.

2.7

Funcii

2.7.1 Structura general a unei funcii


Scrierea unei funcii la modul general se poate face astfel:
(nume_functie [[argument1] argument2 argumentN]])
Semnele "[" i "]" le folosim pentru a semnala faptul c
elementele respective sunt opionale, adic funcia poate s aib sau nu
argumente iar numrul lor este variabil.
Putem scrie de exemplu:
(fct1 arg1 [arg2]) - Funcia poate s aib unul sau dou
argumente
(fct1 [arg]) - Funcia poate s aib un argument sau nici un
argument.
Ordinea argumentelor nu este opional deoarece funciile nu
pot fi toate comutative (vezi cazul diferenei sau a mpririi).
Primul element are o importan crucial n procesul de
evaluare. Aceasta deoarece primul element al listei este primul evaluat.
Procesul de evaluare caut o coresponden ntre primul element al
listei i numele unei funcii AutoLISP.
Scrierea atomilor n ordinea aceasta are o logic aparte fiind
strns legat de procesul de evaluare, deci de logica interpretorului.
Deoarece interpretorul "ronie " lista bob cu bob, el poate s
se atepte la ceva atunci cnd a nghiit numele funciei.
E ca i cum interlocutorul i "ia vorba din gur" , ceea ce
indiscutabil este dovada unui grad de inteligen. Dac vorba urmtoare
nu se potrivete, interpretorul i-o reteaz repede. (Asta este chiar
obrznicie!)
Compilatorul este mai politicos, ateapt tot programul,
trateaz toate erorile i le servete pe toate.

2-7

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Aceast ordine de scriere numit i scriere prefixat a fost
inventat de coala polonez de logic (1925 J. Lukasiewicz) i de
aceea poart numele de "scriere polonez invers".
Dei difer de scrierea natural, din punct de vedere logic este
mult mai facil a fi folosit n domeniul computerelor i a fost adoptat
de prinii Lisp ca regul fundamental.
Dei noi scriem a + b , n AutoLISP se scrie (+ a b) "aduna pe
a cu b"
Omiterea separatorului ntre primul element i al doilea va
conduce la alterarea numelui funciei i implicit la negsirea
corespondenei cu tabela de funcii.
ntr-o prim situaie, avem doar funciile interne SUBR
standard. Pe msur ce dezvoltm funcii noi (aceasta este permis n
AutoLISP) setul standard este extins cu funciile interne dezvoltate de
utilizator, sau ncrcate de acesta din fiiere. Dac numele primului
atom nu face parte din setul de funcii prezent iniial sau dezvoltat pe
parcurs, mesajul este unul de eroare "bad function" i procesul de
evaluare se oprete.
n cazuri speciale , cnd se dorete ca procesul de evaluare a
unei liste s fie "srit" i lista s fie luat ca atare, se poate folosi o
scriere special i anume amplasarea n faa listei ce nu trebuie evaluate
a semnului "'" (apostrof) ceea ce corespunde unei aa numite "quoted
list" sau "list quotat". Acelai efect se poate obine i mbrcnd lista
respectiv cu o funcie numit quote.
Funciile sunt destinate operrii rapide i structurate cu diferite
tipuri de informaie, atomi sau liste.
Clasificarea lor se poate face ntr-o prim faz n funcii
standard i funcii ale utilizatorului.
O a doua clasificare este aceea legat de obiectivul funciei i
anume de tipul de operaiune pe care l execut.
Elementele consecutive primului element sunt argumentele
actuale ale funciei. Asupra lor se exercit operaia programat, iar
numrul i tipul lor este dictat de definiia funciei. Utilizarea unui
numr diferit de argumente sau fiind de tip nepotrivit conduce la
apariia unor erori care ntrerup evaluarea funciei. Mesajele de eroare
sunt clare n aceste cazuri:
"too many arguments" sau "too few arguments"
2-8

Ovidiu Alupei-Cojocariu
"bad argument type"

AutoLISP - Manual de programare

Exist funcii definite astfel nct pot s aib un numr


variabil de argumente, procesul de evaluare fcnd distincie ntre
utilizrile diferite.
De exemplu funcia care calculeaz arctangenta poate fi scris
cu unul sau dou argumente. Exemplele urmtoare sunt echivalente:
Command: (atan 0.5)
0.463648
Command: (atan 1 2)
0.463648
n al doilea caz se va efectua automat mprirea primului
argument la al doilea, arctangenta fiind calculat rezultatului.
Alt exemplu:
Command: (+ 1 2 3 4 5)
15
Command: (+ 1 2)
3
Funcia de tiprire princ poate avea dou argumente, unul sau
niciunul, ea funcionnd n toate aceste cazuri.
Cunoaterea amnunit a sintaxei i ortografiei funciilor este
absolut necesar atunci cnd dorim s scriem programe corecte i s
avem productivitate. Erorile fiind ntotdeauna semnalate i urmate de
ntreruperea programului, vor duce la prelungirea timpului de testare i
deci la productivitate sczut.
Pe de-alt parte, procesul de nvare este natural presrat cu
greeli. Rolul acestor greeli este benefic pentru utilizatorul nceptor,
oprirea fiind o bun oportunitate pentru a se nelege cauza apariiei
greelii i evitarea comiterii ei pe viitor.
Se poate spune c toi utilizatorii fac aceleai greeli n acelai
moment al devenirii lor.
Diferena ntre experi i nceptori este msurat pe mai
multe coordonate:
2-9

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare

timp i anume de timpul scurs ntre momentele n care cei doi


s-au apucat de programare,

intensitate a lucrului,

atenie,

ambiia de a rezolva problemele.

Acest handicap de profesionalizare poate fi atenuat doar dac


programatorul posed ultimele trei abiliti
Exerciii
1.

Determinai care din obiectele AutoLISP urmtoare este


atom sau list:
Obiect

Atom

List

123.1
"Bun ziua!"
"0.0"
("0.0")
0
2.

Testai n AutoCAD (prompterul "Command:", utiliznd


interogarea "!"):
Atom

Valoare

23
"text"
Pi
Setq
x1
Nil
3.

Cte elemente ar fiecare list?


2-10

Ovidiu Alupei-Cojocariu
Lista

AutoLISP - Manual de programare


Numr de elemente

(1.0 2.0 3.0)


(+ 1 2)
(+ 2 (+ 3 5))
(+ 1 2 (+ 3 4) 5)
(+ 1 (+ 2 (+ 3 4) 5))
()

2.7.2 Valorile returnate de funcii


Este important a se aminti mecanismul prin care funciile
cedeaz informaiile procesate.
Odat un apel iniiat el este natural urmat de evaluare.
Rezultatul evalurii este un fel de "ecou" care ntoarce valoarea
calculat. Orice funcie AutoLISP are un ecou, iar cunoaterea tipului
de dat returnat este vital pentru o expresie compus.
Ultima operaie executat genereaz un rezultat care este
automat repetat ca valoare de retur. De pot construi astfel secvene de
apeluri care s preia direct rezultate fr a fi necesar a fi stocate
intermediar n variabile dac nu vor mai fi utilizate n cursul
programului.

2-11

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Ce este un program AutoLISP?

Un program AutoLISP este o funcie special descris utiliznd


structuri de programare, capabil a fi apelat din AutoCAD.
Caracteristic unui program este fie faptul c se execut
automat la ncrcarea sa, fie c este apelat prin numele su , i este
astfel executat ca o nou comand AutoCAD.
Programul poate s apeleze la rndul su o serie de funcii
(subprograme) fie standard fie dezvoltate de programator.
Apelul succesiv al diferitelor funcii sau a altor programe este
coninut de regul n corpul unei funcii principale numite program
principal sau apelant.

3.1

Cum poate fi definit o nou funcie sau un


program?

Printre funciile AutoLISP exist o funcie special de definire


a unor noi funcii. Aceast funcie poart numele de defun.
Defun
Sintaxa funciei:
(defun [C: | S::]nume_fun ( [[arg1] [arg2][argn] / [par1]
[par2] [parn]]) .expr1 .exprn)
Numele este sugestiv, defun , i este evident amplasat pe
primul loc
Prefixele c: sau s:: sunt opionale, dar ele fac diferena:
Lipsa oricrui prefix va face ca funcia s poat fi apelat doar
ca o expresie AutoLISP.
Command: (nume_fun)
Prefixul C: semnific posibilitatea de apel direct din
AutoCAD ca orice command a acestuia.
3-1

Ovidiu Alupei-Cojocariu
Command: nume_fun

AutoLISP - Manual de programare

Adugarea unei noi comenzi reprezint o deschidere


formidabil ctre personalizarea AutoCAD, noile funcii fiind apte s
creeze o interfa cu utilizatorul, specific fiecrui domeniu de
activitate, fiecrei aplicaii.
Se contureaz n acest moment una din marile disponibiliti
ale AutoCAD, aceea de a fi un sistem deschis, deschis ideilor, deschis
evoluiei, deschis dezvoltrii.
Prefixul S:: conduce la un comportament inedit, i anume,
funcia va fi automat executat la ncrcare. Trebuie menionat c acest
comportament poate fi asociat tuturor expresiilor AutoLISP scrise
negrupate ntr-o funcie, expresii care vor fi evaluate imediat ce sunt
ncrcate. Diferena este bineneles dat de faptul c funcia cu s::
poate fi apelat consecutiv de un program , pe cnd expresiile izolate
rmn "rzlee", nu constituie macrofuncii reapelabile.
Urmeaz o list ( [[arg1] [arg2][argn] / [par1] [par2]
[parn]])
Evident coninutul acesteia poate fi vid sau n diferte
combinaii: Astfel avem urmtoarele posibiliti:
Varianta

Semnificaie

Apel

(arg1 arg2 argn)

Funcie de n argumente

(nume_fun
arg2 argn)

()

Funcie fr argumente

(nume_fun)

( / par1 par2 parn)

Funcie fr argumente
cu variabile locale

(nume_fun)

(arg1 arg2 argn /


par1 par2 parn)

Funcie de n argumente
cu n variabile locale

(nume_fun
arg2 argn)

arg1

arg1

Variabilele locale sunt "volatile", adic vor fi descrise ntr-o


alt zon de memorie, care va fi permanent tears dup terminarea
funciei.
Pot fi deci descrise cu acelai nume formal dou tipuri de
variabile, cele globale sau permanente, al cror coninut poate fi pstrat
i utilizate de programe succesive, i variabile locale descrise n cadrul
unei funcii care mor odat cu executarea ei.

3-2

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Este o inspirat alegere, deoarece prin variabilele globale se
pot transmite date ntre programe rulate succesiv, iar pe de-alt parte nu
este neaprat necesar s folosim un nume de variabil o singur dat ci
el poate fi multiplu utilizat prin acest mecanism de variabil volatil.
Funciile definite de utilizator au n general un numr fixat de
argumente. Modul de utilizare al acestora este specific expresiilor
interne i de aceea trebuie ca n apelarea funciilor s se respecte att
numrul de argumente ct i tipul i poziia lor n apel.
Interesant este i modul n care se termin o funcie. Valoarea
returnat de aceasta este rezultatul ultimei evaluri (a ultimei operaii
din cadrul funciei). Rezultatul poate fi nil ceea ce conduce la o valoare
logic de false. Multe funcii ns returneaz nil chiar dac au executat
ceva. Acest aspect , precum i acela al ecoului ultimei operaii poate fi
anihilat prin utilizarea unei funcii care s nu returneze nimic. De
exemplu funcia princ de tiprire a rezultatelor, dac este apelat fr
argumente produce tocmai acest efect i se recomand a fi utilizat n
cazul programelor.
Pe de-alt parte funciile sunt create pentru a returna valori
calculate. Pentru ca aceste valori s fie cu siguran returnate este util
ca ultimul atom scris ntr-o list s fie chiar variabila unde a fost
stocat valoarea calculat. Aceast indicaie trebuie s se transforme
ntr-un automatism de programare.
Evaluarea funciei este consecutiv apelrii sale, mesajele
eventuale de eroare aprnd imediat ce evaluarea este ntrerupt.

3.2

Ce este atribuirea?

Atribuirea este unul din mecanismele de baz ale unui limbaj


de programare.
Prin ea se realizeaz memorarea unei informaii.
Primele calculatoare aveau un numr fix de celule de memorie
asociate unui numr i care odat epuizate limitau evaluarea corect a
programelor. Trebuiau fcute diferite "jonglerii" pentru a nu se depi
numrul fix de memorii.
Calculatoarele moderne pot s creeze n memorie adevrate
impresionante mulimi de date. Acestor date, pentru a putea fi
identificate li se asociaz de obicei nite nume. Datele, constante sau

3-3

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
variabile sunt astfel asociate acestor nume care pot fi utilizate n
expresii formale sau formule de calcul.
Numrul lor este evident limitat, ns practica a artat c,
odat cu dezvoltarea programelor i a computerelor, capacitatea de
stocare a acestor variabile crete mult i practic, n acest moment, cel
puin pentru AutoLISP, aceste limitri nu pot constitui grave
impedimente, mai ales datorit anvergurii specific limitate a acestor
programe.
AutoLISP este un interpretor, deci este mai lent n procesul de
evaluare dect programele compilate, iar lucrul cu multe variabile i cu
volum de date extrem de mare va conduce la programe "lenee".
Alegerea corect a domeniului aplicaiei va conduce la rezolvarea cu
AutoLISP a unor probleme mici, dar extrem de diverse, fr a se atinge
o limit din punct de vedere al utilizrii memoriei.
Un simplu mod de scriere
a=12
are semnificaia de a pstra n variabila a valoarea 12.
Aceasta este o atribuire simpl a unei valori constante 12 care
poate fi ns oricnd nlocuit cu rezultatul unei formule mai
complicate sau cu o structur de date.
n AutoLISP exist dou funcii speciale care permit
atribuirea:
Funciile setq i set
Setq
Sintaxa :
(setq var1 val1 var2 val2 var n valn)
Funciile de atribuire admit ntotdeauna un numr par de
argumente. Ele formeaz perechi constituite de nume de variabile i
valori de atribuit acelei variabile. Valoarea poate fi nlocuit de o
expresie formal care s conduc prin evaluare la valoarea de atribuit.
Neconstituirea integral a unei perechi va conduce la un
numr impar de argumente ceea ce va fi semnalat ca eroare. Evident o
omisiune dubl poate s nu fie considerat eroare de numr de
argumente, dar poate s conduc la o alt eroare.
3-4

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

set
Sintaxa :
(set var2 var1)
Funcia set este mai special, ea fcnd doar o referire la o
alt variabil var1, fr a mai rezerva memorie pentru coninutul lui
var2. Este ca un alias (nume substitut) al lui var1.
n momentul n care exist astfel de legtur stabilit ntre
dou variabile, setarea ulterioar a uneia va fi automat perceput i de
cealalt.
Funcia set admite doar dou argumente. Procesul de evaluare
fiind omniprezent, pentru anihilarea sa este utilizat de obicei funcia
quote sau prefixul '.
Pentru o atribuire simpl, fr alias, se folosete funcia setq ,
adic "set quote".
n acest context sunt echivalente urmtoarele sintaxe:
(set 'a 23) i (setq a 23)
Pentru utilizarea setrii prin alias se folosete urmtoarea
Sintaxa:(setq a 6)(set b a) rezult atribuirea valorii 6 i pentru a.
n marea majoritate a cazurilor se folosete setq i din cauza
posibilitii atribuirilor mai multor perechi ntr-un singur apel al
funciei.
Funciile set i setq creeaz i modific variabilele globale
sau, dac sunt apelate ntr-o funcie unde sunt declarate variabile locale
le creeaz i le modific local.
Este esenial a se aminti c atribuirea este una din uneltele de
baz n orice program i c pstrarea i valorificarea rezultatelor
intermediare nu este posibil fr acest proces.

3.3

Structuri de programare

Programarea are o serie de principii care se regsesc n cadrul


oricrui limbaj de programare. Ele pot fi simbolizate distinct, formnd
schema logic a programului.
Vom enumera n continuare aceste elemente:
3-5

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Secvena este o structur format din una sau mai multe
instruciuni care se execut una dup cealalt fr a fi necesar oprirea.
De exemplu citirea de date cu iniializare a variabilelor
utiliznd procedee diverse de obinere a acestora : prin dialog , din
fiiere , din blocuri de date.
Decizia este o structur prin care se execut o secven sau
alta n urma unui test logic.
Alte structuri de programare sunt derivate din acestea.
AutoLISP nu are n vedere structuri de tipul salt condiionat
sau necondiionat, datorit specificitii procesului de evaluare.
Evaluarea unui program se face top-down, cu ocolirea unor
instruciuni n cazul apariiei unor decizii sau cu iterare n cazul unor
cicluri.
Orice program poate fi exprimat printr-o schem logic bazat
pe structuri de programare.
Organizarea unei aplicaii complexe impune o abordare
sistematizat, o divizare a programului pentru o mai uoar scriere i
depanare.
S nu excludem posibilitatea ca anumite pri ale unui
program sunt repetabile de la o aplicaie la alta sau constituie chiar un
"nucleu" al oricrei aplicaii.
Modularizarea aplicaiilor conduce aadar la o minimizare a
efortului global de programare i la poteniale economii substaniale de
timp i alte resurse.
Un modul gata testat este utilizabil integral n contextul altei
aplicaii i elimin necesitatea testrii ulterioare a acestuia.
Sunt astfel excluse apariia unor erori altele dect cele legate
de utilizarea unor tipuri inadecvate de date sau liste cu structuri diferite
de cele acceptate de program.
Structurile oricrui limbaj de programare sunt completate cu
funcii sau subprograme care prin abilitatea programatorului de a le
apela conform algoritmului conduc la rezolvarea problemei propuse.
n tabelul urmtor sunt prezentate principalele structuri de
programare, prezentate sub forma de scheme logice (flow chart).

3-6

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Agregarea acestor simboluri de baz permite generarea
schemelor logice complexe care pot ilustra seciuni importante de
programare.

Secvena

Decizia

Iteraia

3.3.1 Secvena
Am vzut c expresiile AutoLISP pot fi lansate ntr-o
succesiune , constituindu-se ntr-o secven.
Gruparea acestora ntr-o singur expresie complex se face
utiliznd funcia de agregare progn.
Progn
Sintaxa:(progn expr1 expr2 exprn)
Aceasta conduce la considerare expresiilor componente ca
fcnd un corp unic, indivizibil.

3.3.2 Decizia
Decizia sau testul este o structur de programare care produce
ramificarea unui algoritm.
O variabil testat poate conduce la un rspuns T (adevrat)
sau nil (fals)
Tratarea rspunsului poate conduce la executarea unei
secvene sau a alteia.
AutoLISP folosete ca funcie test de baz funcia if
3-7

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

If
Sintaxa:(if test expr1 expr2)
dac rezultatul testului este T se execut secvena 1 altfel (nil)
secvena 2.
n cazul n care expresiile 1 i 2 sunt formate din mai multe
instruciuni, acestea se agreg cu ajutorul funciei progn.
Numele funciei decizie n AutoLISP, if, este n general
consacrat n limbajele de programare i deci se consider ca fiind uor
de reinut.

3.3.3 Decizia multipl (case)


Exist momente cnd ramificarea programului este multipl.
Evident putem efectua aceste ramificri folosind decizii simple n
cascad, ns o structur specializat de ramificare multipl parc este
necesar.
n alte limbaje de programare exist un tip de structur botezat
case. Acest tip va produce o serie de teste consecutive care ndeplinite
vor conduce aplicaia pe ramura respectiv.
Fiind vorba de primul test gsit adevrat, celelalte teste,
consecutive acestuia nu vor mai fi evaluate, ceea ce conduce la unele
probleme. Este vorba de existena unei probabiliti ca unele ramuri de
program s nu fie parcurse niciodat datorit existenei unei expresii
test, s le zicem "banale", care este validat sistematic i conduce
executarea cu precdere a unei ramuri.
Greeala nu este de sintax ci de logic a programului, fiind
de tipul erorilor sistematice produse de un automatism de gndire.
Programatorul poate s evite aceste capcane prin experien
sau prin analiza rezultatelor programului n procesul final de testare a
aplicaiei.
Deoarece AutoLISP este i un bun limbaj de dezvoltarea
sistemelor expert, cunoaterea acestei particulariti de programare este
benefic.
Structura case este reprezentat n AutoLISP de funcia cond.
Cond
3-8

Ovidiu Alupei-Cojocariu
Sintaxa:(cond ((test1
secvenan)))

AutoLISP - Manual de programare


secventa1)(test2 secventa2)(testn

Se observ c argumentul funciei este o list compus din


subliste ce conin perechi test-secven.
Secvenele parcurse fiind posibile apeluri de subprograme , se
produce acea ramificare car poate s fie temporar pentru a trata
diferite formule de calcul sau definitiv, fr a se mai unifica ramurile.
Structura este deosebit de interesant i de eficient , avei
ns grij cu testele banale.

3.3.4 Cicluri
Puterea deosebit a unei aplicaii este de a repeta fr s
oboseasc un volum mare de operaii.
n limbajul programatorilor acestea se numesc iteraii sau
bucle sau cicluri.
Aceast ciclare, asemntoare unui vrtej care local n
program ncepe a se nvrti i repeta o secven poate avea scopuri
multiple.
Cteodat ciclul este doar o metod de a se ntrzia
programul.
De exemplu scriem un program care s cronometreze ceva.
Evident c trebuie s crem o legtur ntre ceasul intern al
computerului i contorul intern al programului. Dac facem apel la
funcii ce pot accesa ceasul computerului este ok. n AutoLISP ns nu
avem sunt aceste funcii. Putem crea un ciclu cu un numr fixat de
iteraii unde s repetm o secven de operaii benigne de un numr de
ori, s vedem ct timp ocup aceste iteraii i ulterior s potrivim acest
numr de iteraii ca s produc un efect de ntrziere similar cu un
interval de timp.
Alteori avem de repetat o secven n vederea minimizrii
unei erori de calcul.
n acest caz, este posibil s efectum o rezolvare iterativ a
unei ecuaii, validarea soluiei fiind testarea erorii prin nlocuirea n
ecuaie. Condiia fiind ca eroarea s fie mai mic dect eroarea
acceptat, dup un numr de iteraii se produce ntreruperea ciclului.

3-9

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Ceste dou tipuri de probleme conduc la dou structuri de tip
ciclu diferite.
Prima, cu repetarea strict a unui numr de iteraii este de tip
REPEAT. Ieirea din acest ciclu se face la epuizarea iteraiilor
programate.
A doua, cu efectuarea unui test de prsire a ciclului este de
tip WHILE dac testul este iniial, sau de tip UNTIL, dac testul este
final.
AutoLISP are cicluri pentru ambele tipuri de probleme,
structuri materializate prin funciile repeat i while.
O problem crucial n cazul ciclului de tip while este aceea a
ntreruperii ciclului. Condiia testat cuprinde o variabil care este de
dorit a fi modificat n corpul ciclului pentru a se modifica valoarea de
adevr a testului.
Dac rezultatul este T sistematic, ciclul devine infinit,
programul executnd la nesfrit secvena programat.
Prsirea ciclului se poate face n acest caz doar cu
ntreruperea de la consol cu ESC sau cu CTRL
C, ceea ce conduce la ntreruperea rulrii ntregului program.
n general ciclurile infinite nu sunt urmrite a fi programate,
dar cine tie ce idee v vine aa c ai aflat cum se fac. Uneori o mod
eronat de programare (cel cu ciclu infinit) poate fi un comportament
cutat.
De exemplu putem s amplasm un ciclu capcan n
programul nostru care dorim s fie utilizat doar de un numr fixa de ori
sau doar pn la o anumit dat, aa nct dup expirare s funcioneze
extrem de lent, suficient de enervant pentru a se plti urmtoarea rat
(asta dac nu dorim s se ntrerup brusc cu un mesaj de avertisment).
Repeat
Sintaxa:(repeat nr secventa)
While
Sintaxa:(while test secventa)

3-10

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Cum se scrie , se ncarc i se


execut un program

Am vzut c pe promptul Command: se poate introduce i


evalua o expresie AutoLISP. Procedeul este accesibil, dar se rezum la
scrierea unui numr limitat de expresii, iar acestea nu pot fi repetate
dect prin rescrierea lor. Exist posibilitatea apelului unei instruciuni
anterioare prin apsarea sgeii n sus, dar acest lucru este valabil doar
la versiuni de AutoCAD mai noi dect R14 inclusiv.
Cu alte cuvinte, scrierea unei ntregi aplicaii n acest mod este
nu numai neplcut dar i practic imposibil de realizat.
Trebuie fcut apel la utilizarea unui editor de texte care s ne
permit tehnoredactarea programului.
Principala caracteristic a editoarelor de texte destinate scrierii
programelor este faptul c genereaz un cod ASCII care s poat fi
preluat de interpretor fr a fi presrat cu semne speciale care s-l
dezorienteze.
Pentru accesibilitatea sa, prezint n continuare principalele
caracteristici ale editorului NE.com , utilizat n special pe
calculatoarele care lucreaz sub DOS.

4.1

Editorul de texte NE

Acest editor de texte foarte compact (aprox 30 Kb) care se


gsete n pachetul Norton Utility este foarte potrivit pentru utilizare
sub AutoCAD (versiunile de DOS)
Deschiderea unui fiier la iniializare se face cu comanda DOS
>NE nume.ext
Apare imediat un ecran de info care poate fi depit prin
apsarea oricrei teste, sau prin care se poate apela direct Help-ul cu
tasta F1.
Odat intrai n editor, cursorul se amplaseaz stnga-sus de
unde putei ncepe scrierea programului.
4-1

Ovidiu Alupei-Cojocariu
Deplasarea cursorului

AutoLISP - Manual de programare

La baza ecranului se prezint o linie de informaii privind


poziia cursorului, numele fiierului n care se lucreaz, modul de
lucru (insert sau replace) lungimea maxim a liniei (wrap) de la care
textul va avansa automat pe rndul urmtor cu pstrarea cuvintelor
ntregi.
Cursorul este prezent i poate fi deplasat odat ce textul capt
consisten folosind tastele cu sgei. Apsnd simultan tastele stngadreapta avansul se face cuvnt cu cuvnt.
Tastele Home i End permit deplasarea cursorului la
nceputul, respectiv sfritul liniei curente. Combinarea acestora cu
tasta Ctrl va produce deplasarea la nceputul sau sfritul fiierului.
tergerea
Orice nceptor face greeli, deci trebuie nvat cum poate
face corecturi.
Pentru tergerea caracterului anterior se apas backspace iar
pentru cel curent Delete.
tergerea cuvntului :

anterior CTRL-W ;

urmtor ALT-W.
tergerea ntregii linii ALT-K sau pe buci

cea dinainte de cursor CTRL-L ;

cea dup cursor ALT-L.


tergerea unui bloc marcat, apel succesiv F4 - D
Readucerea ultimului lucru ters se poate face cu CTRL-U

Avem de nsuit o serie de comenzi importante necesare


utilizri eficiente a editorului de texte.
Apelul acestora se face n succesiune (consecutiv) i sunt
expresia lucrului n diferite moduri setate de prima tast din
combinaie.
Modul file activat cu prefixul F3:

4-2

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

F3

salveaz fiierul curent i prsete editorul

F3

salveaz fiierul curent i rmne n editor(salvare


intermediar)

F3

deschide o nou fereastr n care poate fi afiat coninutul


unui alt fiier

F3

transcrie n poziia curent coninutul unui bloc marcat


Modul bloc activat cu prefixul F4

F4

Marcheaz nceputul i sfritul unui bloc printr-un ptrat


situat n poziia curent a cursorului

F4

marcheaz lina curent ca bloc

F4

marcheaz ca bloc poriunea din linia curent pn la


sfritul ei

F4

elimin marcajele de bloc

F4

terge blocul curent

F4

copiaz blocul curent n poziia curent a cursorului

F4

copiaz blocul curent n alt fereastr deschis anterior n


poziia cursorului

F4

mut blocul marcat n poziia indicat de cursor

F4

gsete urmtorul marcaj de bloc

De observat c la un moment dat nu poate fi definit mai mult


de un bloc
Marcajele pot fi terse ca orice caracter, dac poziia lor a fost
greit aleas.
Controlul afirii pe ecran
Trecerea la rndul urmtor de text scris se poate face automat
atunci cnd se depete n scris lungimea setat a rndului, cu
pstrarea integritii ultimului cuvnt (de obicei separatorul spaiu este
cel care este recunoscut ca separator de cuvinte).
4-3

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Cnd dorim s trecem voit la alt linie de text se apas Enter
Setri ale afirii se fac cu urmtoarele comenzi:
F5

seteaz lungimea liniei pentru WrapWord (WW)

F5

Dezactiveaz/activeaz WW

F5

Formateaz un paragraf conform setrii curente WW

F5

fixeaz saltul de tabulare Tab

F5

comut cursorul din mare/mic clipitor/static

F5

seteaz succesiv culorile ecranului

F5

comut pe modul indent on/off (amplasarea cursorului


dup Enter pe poziia primului caracter nonblanc din linia
anterioar

F5

seteaz funcionarea tastelor tab i INS

F5

salveaz starea curent a editorului


Controlul tipririi
Setri ale tipriri se fac prin urmtoarele comenzi:

F7

tiprete la imprimant tot textul

F7

tiprete la imprimant blocul curent marcat

F7

salt la pagina urmtoare (FormFeed)

F7

fixeaz mrimea paginii tiprite

F7

fixeaz marginea din stnga


Comenzi suplimentare

F1

help

F2

afiare stare curent a editorului

F9

shell (comutare temporar n sistemul de operare; revenire cu


EXIT)

4-4

Ovidiu Alupei-Cojocariu
Comenzi cursor

AutoLISP - Manual de programare

F6

INS

seteaz mod nlocuire dac a fost nlocuit cu F5 K INS

F6

cere numrul linei de repoziionare a cursorului

F6

testeaz mperecherea parantezei pe care se gsete


cursorul (semnele pereche testate sunt ( ) { } [ ] < >)

F6

testeaz diferenele ntre dou texte situate n ferestre


diferite ncepnd cu poziiile curente ale cursorului
Comenzi cu CTRL i ALT

Acestea trebuie descrise prin apsarea simultan a tastelor


respective
CTRL

comut caracterele de la nceputul linie pn la cursor


n
majuscule
minuscule

CTRL

prefix care permite introducerea imediat a unui


caracter special

ALT

comut caracterele de la cursor pn la sfritul liniei


n
majuscule
minuscule

CTRL

readuce ultimul lucru ters

ALT

cere un text ce va fi cutat n jos

CTRL

cere un text ce va fi cutat n sus

ALT

continuarea cutrii n jos a textului

CTRL

continuarea cutrii n sus

ALT

Cutare i nlocuire n jos se apas ALT


F de dou ori o dat pentru introducerea textului de
cutat a doua pentru textul nlocuitor

CTRL

Cutare i nlocuire n jos se apas ALT


F de dou ori o dat pentru introducerea textului de
cutat a doua pentru textul nlocuitor

ncheierea comenzilor de cutare i cutare cu tergere


4-5

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare

ncheierea cu Enter va produce cutarea exact a caracterelor


introduse,

ncheierea cu ESC va cuta textul care conine combinaia de


text modificat prin majuscule sau minuscule

La gsirea irului
nlocuirii

se ateapt rspunsul privind validarea

Y- execut nlocuirea

N - nu execut nlocuirea

* - execut toate nlocuirile n sensul ales (ALT sau CTRL)

blanc - abandon comand

Sunt destul de multe comenzi dar nu trebuie s ne sperie acest


lucru. Toate aceste faciliti exprimate prin comenzi ne vor fi utile mai
devreme sau mai trziu.
Nu trebuie memorate pe dinafar ci scrise pe o hrtiu sau
mai bine ntr-o agend de lucru de unde le putem consulta cnd avem
nevoie de o anumit comand pn cnd le vei utiliza suficient de mult
ca s nu mai fie nevoie de consultarea lor.
Editoarele sub Windows posibile a fi utilizate trebuie setate pe
non-document astfel nct salvarea textelor s fie de tip ASCII.
Un editor foarte simplu este Notepad, el satisface condiiile
nondocument i n plus tehnica ferestrelor ne permite s nu prsim
editorul, salvarea intermediar a corecturilor fiind suficient pentru a
putea rencrca fiierul modificat.
Activarea ferestrei editorului poate fi fcut consecutiv testrii
programului pentru corectarea eventualelor erori.

4.2

Elementele unui program AutoLISP

Structura programului este constituit din blocuri i trebuie s


fie cea mai simplu posibil rezolvare a problemei de programare.
Trebuie avute n vedere urmtoarele aspecte:
Problema complex trebuie spart n module mai mici, dar nu
trebuie depit o anumit limit de la care problema nu mai este uor
de cuprins.
4-6

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Aceste module numite n continuare funcii pot fi apelate n
ordinea cerut de algoritm, dar constituie nite crmizi eseniale i n
rezolvarea altor probleme ulterioare. Identificarea posibilitii ca o
funcie s mai poat fi utilizat ulterior i confer programatorului un
cmp lrgit de manevr n abordarea altor probleme de programare.
Aceste funcii pot fi scrise oriunde n corpul fiierului
programului, ns este de preferat ca ele s precead programul
principal.
Sunt de identificat mai multe pri ale programelor:

Header-ul programului

Declaraii

Funcii (proceduri)

Programul principal

n header-ul programului sunt scrise titlul , eventualele


explicaii, data scrierii lui, informaii depre autor.
n zona de declaraii se nscriu pe rnd numele variabilelor
folosite precum i semnificaiile acestora i tipul de dat pe care l au n
utilizare.
Informaiile din aceste dou zone vor fi precedate la nceputul
fiecrui rnd de semnul ; (punct i virgul), acesta desemnnd ca tot
ceea urmeaz s fie considerat ca un comentariu.
Comentariile iniiale n aceste dou zone ale programului sunt
deci opionale, dar semnificative din punct de vedere al ordonrii
activitii programatorului.
Variantele de program vor putea fi astfel identificate
cronologic i utilizate ulterior.
Evident c nu ntotdeauna vom putea s furnizm toate aceste
informaii aa nct ele pot s lipseasc.
n zona de funcii vor fi descrise procedurile create special
pentru programul conceput.
Fiecare funcie este n fapt un subprogram i vor fi necesare o
serie de comentarii care s ne readuc aminte ce tip au i ce fac
diferitele variabile folosite.

4-7

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Programul principal cuprinde o apelare logic a funciilor
descrise anterior. n acest moment sunt folosite de obicei i instruciuni
de tiprire a rezultatelor.
Spre deosebire de limbajul BASIC de exemplu, unde ordinea
de evaluare este dat de numerotarea fiecrei fraze scrise, aici ordinea
este dat de succesiunea n care aceste fraze au fost scrise.
Un program bun trebuie s satisfac anumite cerine
suplimentare:

Funciile s nu dea erori chiar i pentru valori extreme

Programul s fie bine documentat,

S fie construit cu atenie astfel nct funcionarea s fie lin i


rapid

Utilizatorul programului s aib o interfa de lucru simpl i


eficient.

4.3

Scrierea indentat

Utilizarea unui editor de texte permite scrierea unor programe


lungi i complicate.
Am vzut anterior c partajarea unui program are efecte
benefice prin modularizarea aplicaiilor, respectiv posibilitatea de a
refolosi funcii n cadrul diferitelor aplicaii.
Chiar n cazul scrierii unei funcii simple, scurte, posibilitatea
de a grei este prezent. Nu faptul n sine al greelii este suprtor ct
timpul consumat pentru corectarea ei.
Refolosirea unui modul deja corectat i validat anterior duce
la scurtarea considerabil a timpului de elaborare a unei aplicaii.
Termenele nu sunt niciodat prea ndeprtate i de aceea trebuie s fim
foarte "vioi" cnd scriem un program.
Un modul nou nu este niciodat o "piatr uoar". Trebuie s
avem o metod de a-l scrie astfel nct s ne fie uor de depanat.
Scrierea codului programului este un moment prezent
permanent n activitatea programatorului
Suntem nevoii a apela la metode speciale de scriere pentru a
asigura o citire rapid i logic a codului, o metod de evaluare vizual
4-8

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
care s ne permit distingerea unor eventuale erori de sintax sau de
ortografie.
Timpul necesar corectrii greelilor de acest tip este
neproductiv i de aceea trebuie eliminat.
Un program AutoLISP este o list, deci teoretic el poate fi
scris la rnd, atom cu atom pe un singur rnd att ct ne permite
editorul
Economia de spaiu pe care o facem este copios anihilat de
ilizibilitatea programului.
Textul pe care l scriem este o secven de instruciuni care au
fiecare niveluri diferite de semnificaii.
Scrierea cap la cap duce inevitabil la uniformitate i denot o
lips de organizare.
Se propune n ceea ce urmeaz o pledoarie pentru nuanarea
codului scris prin poziia difereniat a semnelor utilizate astfel nct
codul scris s fie mult mai citibil.
Elementul central al acestei maniere de scriere este indentarea.
Indentarea
Noiunea este frecvent folosit n tehnoredactarea
computerizat, ea desemnnd o anumit distan setat fa de
marginea zonei de scriere, asociat de obicei paragrafelor, zon care
are menirea de a sublinia prioritatea unui paragraf fa de altul prin
faptul c este mai apropiat de marginea de scriere.
n scrierea unui program AutoLISP, primul element din
program este o parantez care deschide lista i natural ea va avea
poziia prioritar cea mai aproape de margine.
Consecutiv acesteia este primul atom care am vzut, este
decisiv n procesul de evaluare. Dac definim o funcie nou am vzut
c cuvntul cheie defun este acest atom prioritar i va fi urmat de
numele funciei i de eventuala list de argumente i variabile locale.
Acesta trebuie s formeze primul rnd al codului unei funcii,
ceea ce urmeaz fiind o secven ce va trebui parcurs.
S ncercm s dm o structur de funcie-program care s
exemplifice diferite moduri de scriere indentat utilizabil ca model n
programele dvs.
4-9

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
; descriere a structurii generale a unei funcii AutoLISP
; Autor : ***

Data: *****

;
; Variabile locale
; a1

INTEGER

; a2

STRing

; a3

REAL

.
(defun functie_noua ( a b c / a1 a2 a3)
(setq a1 5
a2 "bebe"
a3 123.5
); end setq
(if (= x a1)
(progn
.
); end progn
(progn

); end progn
);end if
(while (<= a1 x)

(setq a (1+ a))


) ; end while
); end defun
n exemplul anterior am schiat evenimentele din program prin
indentarea specific funciei utilizate.
4-10

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Scrierea comentariului ";" la sfritul fiecrei liste
semnificative are o conotaie organizatoric prin faptul c ne ateptm
a structura folosit s se ncheie n acea poziie.
Verificarea mperecherii parantezelor, aa cum am vzut
anterior c este posibil, ne va confirma sau nu aceste ateptri.
Programatorul versat nu are nevoie de aceste comentarii, mai
ales dac nu are timp de pierdut.
Este totui de dorit ca programele s fie mpnate cu astfel de
comentarii pentru a le face uor de citit i de depanat.
Alinierea parantezelor este i ea semnificativ, lista care
urmeaz logic pe rndul urmtor, component a unei structuri fiind
indentat cu dou spaii.
nchiderea parantezelor se face fie pe poziia parantezei
omoloage deschise, fie imediat sub ultima structur.
Jocul acesta de expresii cu evidenierea semantic va conduce
la o redactare util a programului.
Seciunile auxiliare ale programului, referitoare la header,
informaii despre variabilele utilizate, prezentate anterior au importana
lor n construcia unui program citibil i reutilizabil.
n general, programatorii uit odat cu trecerea timpului s
respecte o parte din aceste indicaii, poate din comoditate, dei cer
programatorilor nceptori s-i pstreze zelul de ordonare a codului.
Nu uitai c o vorb popular spune "S faci ce zice popa, nu
ce face popa!".

4.4

ncrcarea unui program

Un program rezident ntr-un fiier trebuie ncrcat pentru a


putea fi rulat.
ncrcarea se poate face n mai multe moduri:

Cu ajutorul funciei AutoLISP load

Din meniu cu ajutorul comenzii meniu "Applications"

Automat la pornirea editorului grafic AutoCAD

4-11

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Load
Funcia de ncrcare load
Se poate apela din editorul grafic folosind urmtoarea sintax:
Command: (load "Fiier")
"Fiier" esute un ir care poate avea urmtoarele ipostaze:
Sir

Semnificaie

"nume_fisier"

Fiierul este cutat n directorul curent avnd


asumat prezena extensiei .lsp

"nume_fisier.ext"

Permite ncrcarea unui fiier avnd orice extensie

"cale\\nume_fisier"

se poate ncrca calea de ncrcare atunci cnd


fiierul este rezident altundeva dect n directorul de
lucru sau n afara cilor cunoscute de AutoCAD

4-12

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Prezentarea principalelor clase de


funcii AutoLISP

Funciile AutoLISP, extrem de numeroase, sunt n general


prezentate n manualele de programare ntr-o dispunere ordonat
alfabetic.
Acest mod de prezentare este foarte util n ideea prezentrii
sub forma de index, regsirea unei funcii fiind rapid i eficient.
Analiznd din punct de vedere al utilizrii acestor funcii, al
tipului de date utilizate, putem avea surpriza ca funcii foarte strns
legate n utilizare s le gsim la mare distan i s nu putem face o
legtur mental n utilizarea lor.
Am ales calea de loc uoar de a prezenta clase de funcii
AutoLISP, ordonndu-le firesc dup gradul lor de utilizare.
S nu uitm c funciile se "nmulesc" de la o versiune la alta
de AutoCAD, fie prin dezvoltrile funciilor standard, fie prin funcii
definite de utilizator.
Este necesar a alege funciile eseniale, perene, ce se vor
regsi n toate variantele de program, astfel nct s putem concepe
programe care s funcioneze n toate situaiile.
Este vorba de a explica faptul c funciile standard AutoLISP
se constituie ntr-un nucleu ce va putea susine elaborarea oricrei
aplicaii.
n cele ce urmeaz vor fi prezentate funcii specifice nucleului
de programare sub AutoCAD R13, funcii care se regsesc prezente i
n versiunile ulterioare.

5.1

Funcii care opereaz cu numere

Calculele numerice sunt permanent prezente ntr-un program


de proiectare asistat. Formulele inginereti abund de calcule i
nlocuiri dintr-o formul n alta.
Asamblarea funciilor ntr-o formul complex reprezint o
piatr de ncercare pentru programatorul nceptor.
5-1

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Cunoaterea facilitilor oferite de atribuirea rezultatelor unei
variabile intermediare fac s se simplifice efortul de generare a unei
formule complicate.
Tipurile de date numerice acceptate sunt REAL i INTEGER,
diferena dintre ele fiind dat n principal de mrimea spaiului de
memorie alocat pentru fiecare tip.
Numerele ntregi necesit pentru reprezentarea lor 32 de bii
Intervalul de reprezentare este deci ngrdit pentru numere ntre 2147483648 i 2147483647.O depire a acestor limite nu conduce la
un mesaj de eroare ci la un rezultat eronat.
Un real reprezentat n dubl precizie ocup un spaiu mai mare
dect un ntreg i sunt de aceea mai dificil i mai lent de manipulat.
Numerele reale sunt adeseori utilizate ca valori aproximative i nu ca
numere exacte, aceasta datorit reprezentrii lor. Sunt dou moduri de
reprezentare:

cu virgul fix : 3.456212


zecimale)

cu virgul mobil: 10.5678E8 (E8 = 108)

(AutoLISP afieaz primele 6

Punctul zecimal trebuie folosit ntre cifre pentru a fi corect


interpretat (punctul mai are i alt semnificaie aceea de separator ntr-o
pereche cu punct)
Numerele sunt folosite sub forma de constante utilizate n
calcul, dar i ca argumente ale funciilor care opereaz cu ele.
Funciile accept argumente numerice ntregi sau reale ,
rezultatul fiind ns o consecin a tipului de dat introdus.
Cnd apar argumente de tipuri diferite, reale i ntregi,
rezultatul este convertit ntotdeauna la un real.
Cnd utilizm o funcie cum este extragerea rdcinii ptrate,
rezultatul este automat un numr real i acest lucru este caracteristic
mai multor funcii numerice care au un singur argument, chiar dac
argumentul folosit este un ntreg.
Principalele funcii numerice.
Funcii operatori aritmetici:
+
5-2

Ovidiu Alupei-Cojocariu
Funcia de adunare

AutoLISP - Manual de programare

Sintaxa:(+ arg1 arg2 [arg3 argn])


Exemplu: (+ 1 2 4) -> 7
Funcia de scdere sau schimbare de semn
Sintaxa:(- arg1 [arg2 .argn])
Exemple:
(- 3 1) -> 2
(- 3) -> -3

*
Funcia multiplicativ (nmulire)
Sintaxa:(* arg1 arg2 [arg3 .argn])
Exemplu: (* 2 2) -> 4
/
Funcia mprire
Sintaxa:(/ arg1 arg2 [arg3 argn])
echivalent cu (/ arg1 (* arg2 arg3 argn))
Se observ c admit un numr indefinit de variabile, nu mai
puin dect dou, cu excepia funciei de scdere, unde un singur
argument semnific schimbarea semnului sau scderea argumentului
din 0.
Se practic convertirea automat a rezultatului dac cel puin
un argument este numr real. Dac toate argumentele sunt ntregi,
rezultatul este un ntreg.
Rezultatul mpririi a dou numere ntregi este deci un
ntreg, i anume partea ntreag a rezultatului exprimat n numere reale.
Acest fapt conduce la propagarea unei erori de calcul practic
dificil de evitat dac este vorba de un rezultat intermediar.

5-3

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Evitarea pentru mprire a folosirii numerelor exclusiv ntregi
duce la anihilarea acestui comportament. Dac mprim ns dou
variabile, este dificil de tiut dac sunt ambele ntregi.
Disciplinarea scrierii programului prin afectarea spaiului de
declarare a variabilelor i a tipului lor, precum i folosirea unui nume o
singur dat ntr-un program, fr a-l reutiliza pentru atribuiri
consecutive cu tipuri diferite de date, poate s duc la evitarea
propagrii unor asemenea erori de calcul practic dificil de depistat,
numai n prezena unor seturi de rezultate de referin.
Pentru convertirea unui numr ntr-un numr real, mai ales
atunci cnd este vorba de valori ntregi ascunse n apatele unor
variabile se utilizeaz funcia float.
Float
Funcie de conversie ntreg-real.
Sintaxa: (float a)
Exemplu: (setq a 1) -> 1
(float a) -> 1.0
Funcii trigonometrice
Aceste funcii sunt extrem de utilizate n calculele inginereti.
Avem precum se tie de a face cu funcii trigonometrice directe i
funcii trigonometrice inverse.
Diversitatea funciilor trigonometrice utilizate n calculele
practice este mare, ns ele au o caracteristic , sunt unele funcii care
pot fi deduce din funcii trigonometrice simple prin formule
trigonometrice.
Funciile trigonometrice directe de baz sunt sinus i cosinus.
Ele admit ca argumente unghiuri exprimate n radiani. n AutoLISP
acest fapt este axiomatic, aa nct utilizatorul este avertizat.
sin
Sintaxa: (sin x)
(sin 0.0) -> 0.0
cos
5-4

Ovidiu Alupei-Cojocariu
Sintaxa: (cos x)

AutoLISP - Manual de programare

(cos 0.0)-> 1.0


AutoLISP pune la dispoziia utilizatorului o constant
trigonometric pi.
Cu ajutorul ei vor putea fi reprezentate orice unghiuri pentru a
fi transformate n radiani i utilizate n calcule trigonometrice.
Atenie la variabilele dvs.! Nu
valoare lui pi cci v vei ci!.

atribuii niciodat o nou

Pentru utilizarea eficient a funciilor trigonometrice folosim


o serie de funcii de conversie pentru mrimi numerice care exprim
unghiurile.
(defun dtr(x) ; convertete pe x din grade sexagesimale n
radiani pi= 3.1415926
(* x (/ pi 180))
)
Utilizare: (dtr 180) ->3.1415926
(defun rtd(x) ; convertete pe x din radiani n grade
sexagesimale pi= 3.1415926
(* x (/ 180 pi))
)
Utilizare: (rtd pi) ->180.0
Aceast ultim funcie returneaz rezultatul n grade
sexagesimale exprimate n scriere zecimal, cea mai frecvent utilizat
uniate de msur n lucrul cu AutoCAD.
Folosirea acestor funcii de conversie unghiular scutete n
general folosirea unor alte funcii de conversie speciale pentru unghiuri
disponibile n AutoLISP, dar mai greu de neplcut de utilizat.
Celelalte funcii trigonometrice pot fi scrise cu ajutorul
formulelor trigonometrice:
Funcia tangent:
(defun tan(x)
5-5

Ovidiu Alupei-Cojocariu
(/ (sin x)(cos x))

AutoLISP - Manual de programare

)
Utilizare:
(tan pi) ->0
Dac dorim s pasm argumente exprimate direct n grade,
putem scrie o combinaie:
(defun tang(x)
(setq x (* x (/ pi 180)))
(/ (sin x)(cos x))
)
Utilizare:
(tang 45)-> 1
Orice alt funcie trigonometric poate fi introdus ntr-un
mod asemntor.
Funcii trigonometrice inverse
Aceste funcii permite obinerea unghiului exprimat n radiani
asociat unei funcii trigonometrice directe.
n AutoLISP este implementat o singur astfel de funcie,
corespunztoare arctangentei.
Utilizare sa este posibil n dou moduri, corespunztoare
numrului de argumente introduse de utilizator n apelul funciei.
Sintaxa general:
(atan arg1 [arg2])
Utilizare:
(atan 1) -> 0.707 (exprimarea lui pi/4)
(atan a b) scriere echivalent (atan (/ a b))
Celelalte funcii trigonometrice inverse pot fi exprimate prin
intermediul funciei arctangent.

5-6

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
S nu uitm c rezultatul returnat de atan este un numr
exprimat n radiani, aa nct utilizarea sa ulterioar trebuie s fie
fcut cu grija exprimrii sale adecvate.
Funcii de ridicare la putere, radicali i logaritmi
Expt
Puterea unei baze arbitrare
Sintaxa: (expt a b) -> ab
Exp
Puterea lui e (exponeniala)
Sintaxa: (exp a) -> ea
Log
Logaritmul natural al unui numr
Sintaxa: (log a) -> ln(a)
Sqrt
Rdcina ptrat
Sintaxa: (sqrt a) ->

Alte funcii cu argumente numerice


Fix
Partea ntreag a unui numr
Sintaxa:(fix a),
(fix 3.2)-> 3, (fix (+ 0.5 a)) -> rotunjirea lui a
Float
conversia ntreg-real
Sintaxa: (float 2)->2.0

Rem
restul mpririi a dou numere:
5-7

Ovidiu Alupei-Cojocariu
Sintaxa: (rem a b),

AutoLISP - Manual de programare

Exemplu: (rem 13 3) -> 1


Gcd
cel mai mare divizor comun (cmmdc), doar pentru numere
ntregi
Sintaxa: (gcd a b),
Exemplu: (gcd 45 35) -> 5
Abs
modulul unui numr |a|
Sintaxa: (abs a),
Exemplu: (abs -5) -> 5
Max
numrul maxim dintr-un ir de argumente
Sintaxa: (max a b c d n) ,
Exemplu: (max -1 4 34 123) -> 123
Min
numrul minim dintr-un ir de argumente
Sintaxa: (min a b c d n) ,
Exemplu: (min -1 4 34 123) -> -1
1+
incrementare cu o unitate (pentru contori)
Sintaxa: (1+ a) ,
Exemplu: (1+ 5)->6
1decrementare cu o unitate (pentru contori)
Sintaxa: (1- a),
Exemplu: (1- 5) ->4
5-8

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Minusp
semnul unui numr
Sintaxa: (minusp a),
Exemplu: (minusp 1) ->nil,(minusp -1)->T

5.2

Funcii relaionale

Aceste funcii returneaz o valoare logic T


satisfacerii expresiei sau nil n caz contrar.
=
Egalitate aritmetic
Sintaxa: (= arg1 arg2 [arg3 .argn])
=
neegalitate aritmetic "diferit"
Sintaxa: (= arg1 arg2 [arg3argn])
<
inegalitate "mai mic"
Sintaxa: (< arg1 arg2 [arg3 argn])
>
inegalitate "mai mare"
Sintaxa: (> arg1 arg2 [arg3 argn])
<=
inegalitate "mai mic sau egal"
Sintaxa: (<= arg1 arg2 [arg3 argn])
>=
inegalitate "mai mare sau egal"
Sintaxa: (>= arg1 arg2 [arg3 argn])
Equal
5-9

n cazul

Ovidiu Alupei-Cojocariu
egalitate cu toleran

AutoLISP - Manual de programare

Sintaxa: (equal arg1 arg2 [toleranta])


Eq
echivalen
Sintaxa: (eq arg1 arg2)
Aceste funcii sunt de obicei utilizate pentru teste n cadrul
funciilor decizie i de buclare.
Compunerea lor se poate face cu ajutorul funciilor operatori
logici.

5.3

Funcii logice

Aceste funcii returneaz valori logice T sau nil sau compun


atomi logici
And
Operator logic "i"
Sintaxa: (and arg1 arg2 argn),
Exemple:
(setq a T b nil c T)
(and a b)->nil;
(and a b c)->nil;
(and a c)->T
Or
Operator logic "sau"
Sintaxa: (or arg1 arg2 argn),
Exemple: (setq a T b nil c T)
(or a b)->T;
(or a c)->T
Not
Operator logic "not" (negare)
5-10

Ovidiu Alupei-Cojocariu
Sintaxa: (not arg),

AutoLISP - Manual de programare

Exemplu:
(setq a T);
(non a)->nil
compunerea lor poate fi multipl, pe mai multe niveluri
logice.
Atenie la funciile logice, condiiile pe care acestea le
exprim sunt importante n logica programului care se scrie!
Funcii booleene
Boole
Sintaxa: (boole func-bit num1 num2 [num3 numn])
Funciile booleene exprimate prin funcia boole sunt folosite
n exprimarea orientat pe bii.
Pentru fiecare funcie-bit (func-bit) exist o tabel de adevr
cu care se calculeaz rspunsul 0 sau 1.
Aceste funcii operator booleeni standard AND, OR, XOR,
NOT pot fi exprimai prin urmtorii bii:
Funcie-bit

Operaie

Rezultat 1 cnd comparm doi bii

AND

amndoi biii sunt 1

XOR

numai un bit este 1

OR

unul sau cellalt este 1

NOT

ambii sunt 0

S parcurgem urmtoarele exemple:


a->adevrat
f->fals
Apel

Rezul.
Zec.

Rezult.
Bin.
5-11

Ovidiu Alupei-Cojocariu
(boole 1 14 7)
6

(boole 7 4 13 8)

13

(boole 6 15 11)

AutoLISP - Manual de programare


110
8
4
2
1
14
1
1
1
0
7
1
1
1
f
a
a
f
1101
8
4
2
1
4
1
1
0
13
1
1
0
1
8
1
0
0
1
a
a
f
a
100

8
1
1
f
8

15
11
(boole 4 6 15)

1001
6
15

4
1
0
a
4
1
1
f

1
a

2
1
1
F
2
1
1
f

1
1
1
f
1
0
1
a

O abordare extins poate s conduc la o funcie-bit nou: un


bit s fie setat n al doilea numr iar bitul corespunztor din primul nu.
logand
Sintaxa: (logand num1 num2 [num3numn]) i
logior
Sintaxa: (logior num1 num2 [num3numn]) sunt funcii
logice de comparare orientate pe bii.
Acestea returneaz 0 sau 1 dup cum biii comparai formeaz
o tabel de adevr:
(logand 4 9 2)
0
0000
8
4
2
1
4
1
0
0
9
1
0
0
1
2
1
0
0
0
0
0
(logand 15 13 5)

101
15
13
5

8
1
1
5-12

4
1
1
1

2
1
0
0

1
1
1
1

Ovidiu Alupei-Cojocariu

(logior 1 2 3)

AutoLISP - Manual de programare


0
1
0
1

11

1
2
3

(logior 19 7 11 4)

31

2
1
1
1

11111
19
7
11
4

16
1

1
1
0
1
1
8
0
1

4
0
1
0
1
1

2
1
1
1
0
1

1
1
1
1
0
1

~
Complement al lui 1
Sintaxa: (~ 12)->-13
(~ -7)-> 6
(~ 0) -> -1
funcia ~ reprezint complementul fa de 1
Lsh
Funcia se folosete pentru deplasarea numrului exprimat binar "ctre
stnga"(left shift) dac numrul (ntreg ) este pozitiv, sau spre dreapta
dac este negativ
Aceasta se traduce prin aducerea din exterior de bii 0 dinspre partea
opus deplasrii, iar n partea deplasrii biii vor fi pierdui.
Dac deplasarea este prea mare numrul este alterat la o deplasare
invers fcut cu acelai numr de bii.
Sintaxa: (lsh numar nr-deplas)
Schimbarea semnului numrului
reprezentarea numrului pe 16 sau 32 de bii.

5-13

este

dependent

de

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
O posibil utilizare este aceea de a cifra o informaie
deplasnd fiecare caracter ctre stnga cu un bit i apoi citind
informaia cifrat prin deplasare ctre dreapta cu un bit.
Caracterele fiind reprezentate n tabela ASCII prin coduri
exprimate numeric, deplasrile cu un bit genereaz alte caractere, care
sunt apoi decifrate cu un program care deplaseaz fiecare caracter cu
un bit n sensul opus.
(lsh 7 1)
14
1110
16
8
4
2
1
7
1
1
1
1bit
1
1
1
0
(lsh 7 -1)

11

16

7
1bit
(lsh 15 3)

120

11
15
3biti

4
1

2
1
1

64

32

16

1
1
1
8
1
1

4
1
0

2
1
0

1
1
0

(lsh 16383 1) -> 32766


(lsh 16384 1) ->-32768 pe maini 16-bii
32768 pe maini 32-bii

5.4

Funcii de introducere de date

Aceast clas de funcii sunt deosebit de importante prin


faptul c stabilesc ntre program i utilizator un dialog de introducere a
datelor.
ntr-o aplicaie acurateea dialogului face parte din obiectivele
principale ale programatorului. Introducerea greit a datelor,
nevalidarea lor prin calculele efectuate poate duce la generarea unei
erori care stopeaz programul sau mai ru programul funcioneaz i
genereaz rezultate greite. Dac rezultatele sunt aberante mai avem
ansa s le putem depista i s corectm programul, dac sunt doar
"puin" eronate este mai grav.
Crearea unui dialog program-utilizator urmrete ntreaga
istorie a programrii calculatoarelor.

5-14

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Interfaa om-computer creat definete gradul de complexitate
a programulu i pe programator.
Se definesc mai multe niveluri de dialog, dup cum urmeaz:
a.

Non-dialogul - programul st i ateapt introducerea unei date,


utilizatorul nu tie ce s fac

b.

Dialogul arid - Programul cere o dat, utilizatorul nu tie ce


mrime s introduc i caut printr-o carte

c.

Dialogul sugestiv - Programul cere o dat, sugereaz ce tip are i


d o list de valori posibil de ales, utilizatorul alege o valoare din
acest ir

d.

Dialogul restrictiv - Programul nu l las pe utilizator s dea dect


o dat din irul indicat

e.

Dialogul vizual - Programul deschide o fereastr de dialog cu tot


felul de butoane i cursoare i l las pe utilizator s-i fac de cap

f.

Dialogul vizual sugestiv - fereastra de dialog este completat cu


apelul ctre un help care indic intervalele de valori, modul de
alegere etc.

g.

Dialogul vizual sugestiv restrictiv - Totul ceea ce am enunat


anterior plus utilizatorul este controlat la snge

Evident a scrie programe care s respecte aceste tipuri de


dialog este la ndemna diferitelor categorii de programatori.
AutoLISP ofer soluii pentru toate aceste tipuri de dialog.
n cadrul acestui capitol ne vom ocupa de funcii care pot
genera tipurile a-d de dialog.
Modelul de dialog pe care l recomandm la acest nivel ca
fiind cel mai performant este fr ndoial modelul d.
S nu uitm c programele sunt ns "orientate ctre client" i
eventual sunt pltite de acesta, aa nct un program bine pltit nu
trebuie s fac rabat la interfaa client-program. Dac a pltit bani,
trebuie s-l satisfacem, dac se codete i se zgrcete, i face
programul minimal i-l invitm s cumpere i varianta urmtoare mult
mbuntit.
Initget Funcia care "iniiaz cererea"
5-15

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Este vorba de o funcie care poate fi apelat naintea funciilor
de dialog i care seteaz modul de validare a datelor introduse de
utilizator.
Sintaxa: (initget bit-control ["Sir de cuvinte cheie"])
bit-control este un numr ntreg ntre 1 i 255 reprezentat pe 8 bii.
Setarea unui bit din cei opt are o semnificaie privind modul n care se
restricioneaz dialogul.
Numr

Bit

Semnificaie

Rspuns nul interzis (ENTER)

Valoare zero interzis

Valoare negativ interzis

Nu se testeaz limitele desenului AutoCAD chiar cu


LIMCHECK activat

16

Neutilizat

32

Linie ntrerupt pentru reprezentarea liniei elastice


sau box-ului elastic

64

Ignorarea coordonatei Z la utilizarea lui GETDIST

128

Preia orice introducem i returneaz valoarea

Utilizarea bitului de control este posibil i prin combinarea


de bii, formulnd astfel o restricionare combinat.
De exemplu utilizarea numrului 7 care poate fi scris i ca (+
1 2 4) seteaz primii trei bii ai numrului de control ceea ce semnific
c este interzis introducerea unui rspuns nul, a valorii 0 sau de
numere negative.
Decodificarea cuvntului de control este mult mai simpl
atunci cnd este scris aditiv
"irul de cuvinte cheie" conine cuvinte care au efect n
special pentru a introduce valori-cheie cunoscute de program, dar care
trebuie introduse prin dialog.
Cuvintele-cheie sunt scrise unul dup cellalt, separate prin
blancuri i avnd sau nu caractere scrise cu majuscule.
5-16

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Aceste majuscule sunt destinate a fi recunoscute cu prioritate ,
introducerea lor fiind suficient pentru recunoaterea ntregului cuvntcheie. Evident o parol trebuie s fie scris doar cu majuscule.
Cuvintele car ncep cu aceeai majuscule pot fi difereniate
prin folosirea unui numr mai mare de litere majuscule, sau prin
alegerea uneia din corpul cuvntului-cheie.
Command: (initget 1 "MIhai Vasile MArius")
Nil
Command: (getkword "Numele utilizatorului:")
Numele utilizatorului:petre
Invalid option keyword.
Command: (getkword "Numele utilizatorului:")
Numele utilizatorului:marius
"MArius"
Efectul restriciilor se face diferit pentru diversele funcii de
dialog.
Acestea sunt n general purttoare ale prefixului GET sau cu
alte cuvinte fac parte din familia GETxxx.
S vedem cum rspund aceste funcii la restriciile formulate
de initget.
Ne vom ocupa n cele ce urmeaz de familia de funcii
GETxxx.
Aceste funcii constituie principalul mod i totodat cel mai
accesibil n conceperea unui dialog de introducere de date.
Folosirea funciei de iniializare a cererii initget constituie un
avantaj i de aceea vom da ca exemple structuri AutoLISP care
cupleaz aceste funcii.

5-17

Ovidiu Alupei-Cojocariu

Funcie

AutoLISP - Manual de programare

Cuv.

Nu

Nu

Nu

Fr

Linii

Dist.

Introd.

Cheie

Nul

zero

<0

limite

elastice

2D

arbitrar

32

64

128

Getint

Getreal

Getdist

Getangle

Getorient

Getpoint

Getcorner

Getkword

Entsel

Nentsel

Nentselp

Toate funciile GETxxx au n corpul lor ca argument opional


un mesaj care nsoete cererea introducerii unei anumite mrimi.
Trebuie reamintit c acest mesaj este deosebit de important pentru
orientarea utilizatorului i aadar nu va fi niciodat doar opional.
Getint
Sintaxa: (getint ["Mesaj"])
De exemplu:
Command: (initget (+ 1 2 4))
nil
Command: (getint "Introduceti varsta Dvs.")
Introduceti varsta Dvs.-1
Value must be positive and nonzero.
Introduceti varsta Dvs.0
5-18

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Value must be positive and nonzero.
Introduceti varsta Dvs.
Requires a positive nonzero integer.
Introduceti varsta Dvs.12.5
Requires a positive nonzero integer.
Introduceti varsta Dvs.22
22
getdist
Sintaxa: (getreal ["Mesaj"])
Exemplu:
Command: (initget (+ 1 2 4))
nil
Command: (getreal "Lungimea laturii:")
Lungimea laturii:
Requires numeric value.
Lungimea laturii:-25
Value must be positive and nonzero.
Lungimea laturii:45.5
45.5
Valoarea ateptat va fi un numr real pozitiv nenul (+ 1 2 4)
Dac dorim introducerea numai a unor valori restricionate se va folosi
urmtoarea secven:
(defun c:qq()
(setq restrictii "Implicite Vechi")
(initget restrictii)
(setq raspuns (getreal (strcat "Valori " restrictii " :")))
)
Command: qq
5-19

Ovidiu Alupei-Cojocariu
Valori
Implicite Vechi
:i

AutoLISP - Manual de programare

"Implicite"
Command: qq
Valori
Implicite Vechi
:v
"Vechi"
Command: qq
Valori
Implicite Vechi
:23
23.0
Funcia qq apelat succesiv permite obinerea rspunsului din
partea utilizatorului, spre a indica valori implicite, valorile vechi sau o
valoare real.
Rspunsul este n acest caz un atom care poate avea tip diferit
de dat, ceea ce necesit precauii n utilizarea acestuia n program.
Prin acest tip de iniializare i conducere a dialogului se pot
introduce informaii ce pot direciona parcursul ulterior al programului.
Getdist
Se urmrete introducerea unei distane care poate fi
exprimat ca un numr real pozitiv, sau a unui punct grafic care s fie
evaluat comparativ cu un punct considerat baz local de referin.
Sintaxa: (getdist pct_baz ["Mesaj"])
Setarea bitului 32 conduce la reprezentarea unei linii elestice
desenate cu linie punctat.
Exemplu: (initget (+ 1 2 4 32))
(getdist '(0 0) "Distanta fat de origine:")
Punctul grafic este echivalent n AutoLISP cu list de trei
numere considerate drept coordonate 3D (x y z) sau de dou numere
considerate coordonate 2D (x y) .
5-20

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Punctele introduse n acest mod trebuiesc scrise ntr-o list
quotat precedat de '.
Getangle
Funcia permite introducerea unui unghi exprimat n unitile
curente AutoCAD ca valoare ce va fi convertit automat n radiani, sau
n stabilirea unui punct care va fi evaluat n comparaie cu un punct de
baz considerat ca referin local.
Unghiul astfel introdus este exprimat n radiani i se msoar
relativ la direcia axei curente x , deci este dependent de setarea
unghiului zero cu comanda UNITS .
Sintaxa: (getangle pct_baz ["Mesaj"])
Utilizare:
(initget (+ 1 2 4 32))
(getangle '(0 0) "Unghi fat de origine:")
Command: (getangle '(0 0)"Unghi fata de origine:")
Unghi fata de origine:180
3.14159
Getorient
Funcia este asemntoare cu getangle, cu excepia faptului c
unghiul rezultant va fi calculat cu ignorarea unei setri a direciei de
msurare a unghiurilor alta dect ctre axa x a UCS-ul curent .
Getpoint
Funcia permite introducerea unui punct grafic din AutoCAD
prin coordonate sau cu dispozitivul de digitizare. Folosirea opional a
unui punct de baz poate fi combinat cu introducerea dinamic a unui
punct cu dispozitivul de digitizare provocnd apariia unei linii elastice.
Sintaxa: (getpoint [pct_baz] ["Mesaj"])
Utilizare n program:
(initget (+ 1 2 4 32))
(getpoint '(0 0) "Punct fat de origine:")
5-21

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Utilizare pe prompt AutoCAD:
Command: (getpoint '(0 0) "Punct fata de origine:")
Punct fata de origine:(246.898 200.475 0.0)
Command: (getpoint '(0 0) "Punct fata de origine:")
Punct fata de origine:100,100
(100.0 100.0 0.0)
Rezultatul returnat este ntotdeauna o list cu trei componente,
ultima fiind pus automat 0.0 dac prin dialog am indicat doar dou
coordonate
Getcorner
Funcia permite indicarea unui punct situat n colul opus al
unui dreptunghi virtual bazat n punctul de baz.
Indicarea poate fi fcut prin coordonate sau cu dispozitivul
de digitizare, caz n care apare un dreptunghi elastic.
Sintaxa: (getcorner [pct_baz] ["Mesaj"])
Utilizare n program:
(initget (+ 1 2 4 32))
(getcorner '(0 0) "Colt opus fat de origine:")

Utilizare pe prompt AutoCAD:


Command: (getcorner '(0 0) "Colt opus fat de origine:")
Punct fata de origine:(246.898 200.475 0.0)
Command: (getcorner '(0 0) "Colt opus fat de origine:")
Punct fata de origine:100,100
(100.0 100.0 0.0)

Getstring

5-22

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia permite introducerea unui ir de caractere inndu-se
cont i de iniializrile fcute initget. Numrul maxim de caractere
posibil de introdus ntr-un singur apel este 256.
Sintaxa: (getstring ["Mesaj"])
Funcia returneaz irul introdus care poate fi chiar i un ir
gol "".
Uneori poate fi folosit ca moment de stop n program pentru
a se evidenia pn unde am ajuns cu rularea acestuia. Aceast oprire
programat este util n procesul de depanare pentru a depista cu
aproximaie seciunea de program care ne d bti de cap. Se tiprete
o valoare intermediar i se cere un ir. Programul ateapt
introducerea unui ir i avem astfel un stop al programului. Dup
depanare se terge secvena respectiv i programul va curge fr
opriri.
Getkword
Funcia permite introducerea unui cuvnt-cheie care va fi
obligatoriu testat cu valorile admise n iniializarea cu initget. Orice alt
cuvnt introdus va fi considerat incorect i va produce o buclare a
cererii.
Cuvintele cheie pot fi valori exprimate prin iruri de caractere
. Valoarea returnat este ntotdeauna un ir, aa nct utilizarea n
funcii care opereaz cu numere va fi condiionat de conversia acestor
valori n valori numerice.
n cazul n care dorim s punem o parol, cuvntul-cheie
trebuie scris integral cu majuscule sau cu minuscule pentru a nu putea
fi ocolit prin introducerea doar unuia sau mai multe caractere care au
fost subliniate.
Sintaxa:(getkword ["Mesaj"])
Exemplu de programare: Valori restricionate
(defun c:qq()
(setq restrictii "10 20 25 45")
(initget restrictii)
(getkword (strcat "Valori permise/" restrictii "/'; :"))
)
5-23

Ovidiu Alupei-Cojocariu
Command: qq

AutoLISP - Manual de programare

Valori permise/10 20 25 45/ :13


Invalid option keyword.
Valori permise/10 20 25 45/ :120
Invalid option keyword.
Valori permise/10 20 25 45/ :20
"20"
Getfiled
Funcia permite indicarea unui fiier prin alegerea poziiei
acestuia n urma parcurgerii unei ferestre de dialog.
Returneaz un ir care exprim calea ctre acel fiier.
Sintaxa: (getfiled "Sir info" "Nume implicit" "ext" flag)

"Sir info" este un mesaj care va boteza aceast cutare fiind


nscris ca titlu sus n marginea ferestrei de dialog.

"Nume implicit " care poate fi i un ir gol "" indic setarea


iniial a numelui fiierului.

"ext" indic extensia cutat

flag este un cod orientat pe bii care n funcie de modul n care


este setat are diferite semnificaii.

5.5

Funcii geometrice

Aceste funcii sunt extrem de utile n calculul unor informaii


geometrice.
Pot fi calculate unghiuri, distane, puncte exprimate n coordonate
polare, puncte de intersecie.
Angle
Funcia permite calcularea unui unghi exprimat n radiani
corespunztor unui vector definit de dou puncte . Ambele puncte sunt
situate n UCS-ul curent, iar unghiul este cel fcut de vector cu direcia
5-24

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
axei X, exprimat n radiani cu sensul implicit . ^n cazul punctelor 3D,
se calculeaz proiecia acestuia pe UCS-ul curent.
Sintaxa: (angle pct1 pct2)
Distance
Funcia permite calculul distanei 3D ntre dou puncte. Dac unul sau
ambel puncte sunt definite 2D, se calculeaz proiecia distanei pe
UCS-ul curent (se ignor coordonatele Z)
Sintaxa: (distance pct1 pct2)
Inters
Funcia permite aflarea punctului de intersecie a doi vectori definii
prin patru puncte.
Dac toate punctele sunt 3D, punctul de intersecie este generat ca un
punct 3D, altfel este generat ca proiecie a acestui punct pe planul de
construcie curent (UCS).
Rezultatul poate fi nil dac vectorii nu se intersecteaz .
Sintaxa: (inters p11 p12 p21 p22 [mod])
p11 i p12 sunt punctele care definesc primul vector;
p21 i p22 sunt punctele care definesc al doilea vector
Toate punctele sunt exprimate n funcie de UCS-ul curent.
Mod poate fi T sau nil
n cazul n care vectorii nu se intersecteaz pe traseul lor, poate fi
forat calcularea interseciei obinut prin prelungirea acestora pn la
intersecia lor comun. Dac se seteaz mod cu nil.
Exemplu:
(setq p11 '(2 1) p12 '(6 3)
p21 '(5 0) p22 '(7 3))
(inters p11 p12 p21 p22) -> nil
(inters p11 p12 p21 p22 T) -> nil
(inters p11 p12 p21 p22 nil) -> (7.5 3.75)
Polar
5-25

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia permite calcularea unui punct raportat fa de un punct de baz
6n coordonate polare , cunoscndu-se unghiul polar i raza
(distana)polar.
Unghiul polar trebuie exprimat n radiani, aa nct este binevenit
utilizarea funciei de conversie dtr pe care a amintit-o anterior.
Punctul de baz este exprimat n UCS-ul curent, punctul calculat este
exprimat ca 3D.
Sintaxa: (polar pct_baza unghi distanta)
Exemple:
(polar '(1.01.0 6) 0.785398 1.414214) ->(2.0 2.0 6)
(polar '(4 2 5) 1.570796 2) -> (4.0 4.0 5.0)
(polar '(2 6) 0 3) -> (5.0 6.0 0.0)
Atenie la direcia X fa de care se msoar unghiurile, pentru a nu
calcula alte puncte.
Textbox
Funcia permite calcului a dou puncte ce reprezint colurile unui
dreptunghi care ar cuprinde n el un text a crui list asociat este
pasat ca argument funciei.
n cazul n care textul nu exist se poate da ca argument o list
minimal care s conin irul care formeaz textul.
Dimensiunile vor fi calculate n acest caz funcie de stilul curent de
descriere a textelor.
Sintax: (textbox elist)
unde elist este lista asociat unui text
sau '((1 . "Sirul care va fi scris ca text"))
Observai faptul c ntre 1 i . exist un spaiu suplimentar care
transform lista tr-o pereche cu punct.
Exemplu:
Presupunem c nlimea textului este 12 i stilul STANDARD.
(textbox '((1 . "Calin are un dop murdar")))
((0.0 -4.0 0.0)(260.0 12.0 0.0))
5-26

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Coordonata -4 este dat de codia de la litere p
Punctul de start este raportat ntotdeauna fa de (0 0 0).
Al doilea punct este ntotdeauna punctul dreapta-sus, bazndu-ne pe
primul, care este cel stnga-jos
Unghiul de orientare al unui text nu poate fi apreciat dect prin
existena listei asociate a textului deja desenat (codul DXF 50)
Tem:
ncercai s scriei un program care s v ncercuiasc textul selectat cu
un dreptunghi, sau cu un dreptunghi cu coluri racordate.
Trans
Funcia transform punctul dat ca argument exprimndu-l n funcie de
alt sistem de coordonate (UCS)
Sintaxa: (trans pct cod1 cod2 mod)
pct punctul sau direcia de deplasare
transformarea

asupra cruia se aplic

cod1 i cod2 sunt sistemele de coordonate din care i n care se


realizeaz transformarea.
Cod

Sistem de coordonate

World (WCS)

UCS-ul curent

Display (DCS pentru viewportul curent cnd este folosit cu


codul 0 sau 1
DCS pentru viewportul spaiului model cnd este folosit cu
codul 3)

DCS Paper Space (folosit numai cu codul 2)

Mod, dac este prezent i nu este nil, indic considerarea pct ca vector
de deplasare.
Utilizare:
Fie UCS-ul rotit cu 90 grade n jurul axei Z, atunci:
(setq p2 ' (4.0 -2.0 -1.5))
(trans '(1.0 0.5 2.0) 0 1) -> (1.0 0.5 2.0)
5-27

Ovidiu Alupei-Cojocariu
(trans p2 1 0) -> (4.0 -2.0 -1.5)

AutoLISP - Manual de programare

(trans '(1.0 0.5 2.0) 0 1 T) ->(1.0 0.5 2.0)


Dac folosim n comenzi AutoCAD curente puncte definite n alte
sisteme de coordonate, netransformate, rezultatele desenrii sunt
eronate.

5.6

Funcii AutoCAD

Aceste funcii sunt special legate de AutoCAD pentru obinerea sau


setarea variabilelor de lucru, sau pentru a se crea macrocomenzi.
Acad_colordg
Funcia invoc o caset de dialog standard AutoCAD pentru
selectarea culorii.
Sintaxa: (acad_colordg culoare [flag])
Culoare este un numr ntreg 0256(inclusiv) conform cu
codificarea numeric a culorilor n AutoCAD. Valoarea 0 indic
BYBLOCK, valoarea 256 indic BYLAYER.
Flag, setat pe nil dezactiveaz butoanele BYBLOCK i
BYLAYER, setat non-nil le activeaz.
Returneaz numrul culorii setate de utilizator.
Command
Funcia emuleaz orice comand AutoCAD standard prin
apelul dintr-un progra AutoLISP. Ea returneaz ntotdeauna nil deci nu
poate s fie folosit n atribuirea direct.
Sintaxa: (command "comanda_autocad" [param1
paramn])

param2

Numrul de parametri introdui i tipul acestora este cel


ateptat de comand n acel moment.
Diferitele ramuri ale comenzii pot fi parcurse foarte exact
numai ntr-o deplin cunoatere a dialogului comenzii.
Deoarece este posibil ca de la o versiune la alta dialogul s se
modifice, funcionarea programului poate fi afectat.
Parametrii pot fi numere reale, iruri, numere ntregi,
variabile, puncte 2D sau 3D ca liste de numere.
5-28

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Comenzi ca DTEXT sau SKETCH nu pot fi emulate datorit
interaciunii directe cu un dispozitiv de introducere a informaiilor.
Introducerea direct , interactiv a utilizatorului poate fi
obinut prin rezervarea acestei introduceri prin folosirea argumentului
"pause".
Pentru ca programe AutoLISP s poat fi utilizate n diferite
variante lingvistice de AutoCAD, numele comenzii trebuie scris
precedat de semnul de subliniere "_".
Exemplu:
n versiunea german:
(command "LINIE" pa pb pc "S")
ntr-o versiune independent de limbaj:
(command "_LINE" pa pb pc "_C")
Funcia command este cea mai facil metod de a introduce
ntr-un program AutoLISP comenzi AutoCAD. Introducerea unui ir
gol "" este echivalent cu ENTER de la tastatur.
Dac o folosim fr argumente, funcia command
echivalent cu CTRL-C (ntrerupe execuia unei comenzi)

este

Funcia command poate fi lsat "agat" adic cu comanda


n curs de executare neterminat (suspendat), pentru efectuarea unor
secvene de calcul, ea putnd fi reluat n seciunea urmtoare a
programului prin apelul care nu mai conine numele funciei AutoCAD.
n acest mod funcia poate fi iniiat n afara unui ciclu, poate primi
parametri calculai iterativ n interiorul ciclului i poate fi ncheiat
dup parcurgerea integral a ciclului.
Este de remarcat c n interiorul funciei command nu mai pot
fi utilizate funcii de interogare de tip GETxxx.
Dac folosim variabila CMDECHO cu valoarea 0, nu se va
mai afia dialogul intern AutoLISP-AutoCAD.
Getvar
Funcia permite aflarea coninutului unei variabile AutoCAD
i setarea din AutoLISP a unei variabile AutoCAD
Sinaxa: (getvar "nume_variabil")
5-29

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Setvar
Funcia setarea din AutoLISP a unei variabile AutoCAD.
Sinaxa: (setvar "nume_variabila" valoare)
Valorile variabilelor pot fi setate i cu ajutorul funciei
command deoarece ele pot fi apelate ca orice comand AutoCAD (de la
versiunea R11).
Graphscr
Funcia graphscr comut din ecranul text n ecranul grafic.
Sintaxa: (graphscr)
textscr
Funcia textscr comut din ecranul grafic n ecranul text.
Similar cu apsarea tastei F1(sub DOS) sau F2 (Windows).
Sintaxa: (textscr)
Menucmd
Funcia comut meniul curent afiat n dreapta ecranului. Este
valabil doar n contextul configurrii AutoCAD cu meniu ecran
lateral. Mai puin utilizat sub Wndows.
Sintaxa: (menucmd "Sir")
"Sir" reprezint cuvinte-cheie utilizate n descrierea diferitelor
submeniuri AutoCAD.
Osnap
Funcia permite setarea modurilor de cutare OSNAP (Object
Snap). Pot fi stabilite i mai multe moduri de cutare separate prin
virgul n irul argument.
Sintaxa:(osnap pct "Sir mod")
Utilizare: (setq pct1 (osnap pct2 "endp,midp,centre"))
Funcia returneaz un punct 2D dac punctul apelant este 2D
i un punct 3D dac punctul apelant este 3D.

5-30

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Dac nu este gsit un punct cu indicaia respectiv , funcia
returneaz nil.
Pause
Simbolul pause este utilizat n cadrul funciei command ca
ntrerupere a executrii comenzii i permiterea introducerii directe a
informaiilor de ctre utilizator.
Redraw
Funcia redraw are ca efect redesenarea tuturor obiectelor
desenate pe ecranul curent sau doar a unuia singur specificat, ntr-un
mod stabilit. Returneaz ntotdeauna nil.
Sintaxa: (redraw [nume_element] [mod])
nume_element este un tip de dat special care identific
codificat un obiect desenat.
Mod

Semnificaie

Redesenare obiect

tergere obiect

Subliniere obiect (dependent de echipament; de obicei


desenare cu linie ntrerupt)

Redesenare normal

grclear
funcia terge viewport-ul curent (cur).
Entitile aparent terse pot fi redesenate cu redraw.
Utilizat mai ales n contextul utilizrii unor funciii de
desenare direct pe ecran, fr a se constitui n obiecte AutoCAD.
Sintaxa: (grclr)

5.7

Funcii care opereaz cu iruri

irurile de caractere sunt un tip de dat care poate fi obinut


fie prin introducerea de la tastatur a caracterelor n momentul

5-31

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
interogrilor cu getstring sau getkword, fie sunt rezidente ca date n
program, fie sunt citite dintr-un fiier de date extern.
Procedura de citire a informaiilor din fiiere externe este
finalizat ntotdeauna cu generarea unui ir pentru fiecare operaie de
citire.
Informaia este procesat de program, care o poate utiliza ca
atare sau o poate interpreta n urma aplicrii unor proceduri speciale
prestabilite.
Operarea cu iruri este un capitol important n activitile de
programare citirea i exprimare datelor fiind de multe ori probleme
care implic procesarea irurilor.
Caractere speciale
Unele caractere au semnificaie deosebit. Unele permit
avansarea la o linie nou, sau avansare la urmtorul stop de tabulare
(TAB). n AutoLISP, aceste caractere trebuie introduse conform unei
combinaii de semne, din care unul este folosit permanent, caracterul
"\" - backslash.
Combinaia

Semnificaia

\e

ESCAPE

\n

NEWLINE

\r

RETURN

\t

TAB

\\

BACKSLASH

\nnn

caracterul cu codul octal nnn

Acad_strlsort
Funcia permite ordonarea unei liste de iruri n ordine
alfabetic.
Sintaxa: (acad_strlsort lista)
Exemplu:
(acad_strlsort '("an" "zi" "luna")) -> ("an" "luna" "zi")
5-32

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
dac lista este invalid, sau memoria este insuficient, funcia
returneaz nil.

Strcase
Funcia permite transformarea caracterelor care reprezint
literele alfabetului din minuscule n majuscule i invers.
Sintaxa: (strcase "Sir" mod)
Exemplu:
(strcase "eXEmplU")->"EXEMPLU"
(strcase "eXEmplU" T) -> "exemplu"
Command: (setq raspuns (strcase (getstring "Sirul Dvs.:")))
Sirul Dvs.:eXEmplU
"EXEMPLU"
Utilizarea sa n momentul introducerii unui ir conduce la
unicitatea reprezentrii acelui ir , ceea ce face ca modul de
introducere, cu litere mari sau mici sau amestecate s nu aib
importan.
Se evit astfel un efort de programare menit a testa
autenticitatea irului introdus.
Strcat
Funcia permite concatenarea mai multor iruri sau variabileir folosite ca argumente. Prin concatenare pot fi construite i iruri
care depesc 256 caractere ct sunt permise la o introducere cu
getstring.
Sintaxa:(strcat "sir1" "sir2""sirn")
Exemplu:
Command: (setq nume "Mihai")
"Mihai"
Command: (strcat "Buna ziua, " nume "!")
"Buna ziua, Mihai!"
5-33

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Strlen
Funcia permite calcularea lungimii unui ir de caractere.
Rezultatul returnat este un numr ntreg. irul gol "" are lungimea 0.
Sinatxa: (strlen "ir")
Exemplu:
(strlen "mihai") -> 5
(strlen "") -> 0
Substr
Funcia permite extragerea unui subir de un numr fixat de
caractere dintr-un ir mai mare, ncepnd din poziia indicat .
Sintaxa: (substr "sir" poz_start [lungime])
"sir" - irul complex de "operat"
poz_start - reprezint un numr ntreg folosit ca pointer n sir.
Lungime - cte caractere se vor decupa; dac lipsete
nseamn c se vor lua toate pn la sfritul irului.
Funcia substr reprezint un mijloc foarte important pentru
bucirea informaiilor complexe n vederea interpretrii lor.
Pot fi introduse astfel date externe scrise n fiiere de un
anumit format cunoscut, interpretate, sau utilizate de programe
AutoLISP.

5.8

Funcii care opereaz cu liste

Append
Funcia permite adugarea unui numr dorit de liste unei alte
liste. Ultima list scris n apelul funciei este cea la care se adaug
celelelte.
Sintaxa: (append qlista11 qlista2 .qlistan)
qlistan este cea la cere sa adaug celelalte.
Listele trebuie s fie quotate sau s fie reprezentate prin
variabile pentru a nu fi evaluate.

5-34

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Dac nu sunt liste va apare mesajul de eroare "bad argument
type" - "tipul argumentului incorect".
Apply
Funcia permite aplicarea unei funcii folosind ca argumente
elementele unei liste:
Sintaxa: (apply 'functie qlista)
Exemplu:
(apply '* '(2 4 8)) -> 64
(apply 'strcat '("ce" " " "simplu" " " "este" "!")) -> "ce simplu
este!"
Utilizarea numelui funciei nequotat duce la o eroare de tip
"bad argument type".
Se poate utiliza i o funcie definit ad-hoc lambda (volatil):
(apply '(lambda (x y z) (+ (* x y) z)) '(2 3 5)) -> 11
Assoc
Funcia caut ntr-o list de associere ce const din mai multe
sublise care conin dup primul argument subliste de informaii,
argument identic cu argumentul de apel .
Este principala funcie utilizat n extragerea de informaii din
listele asociate obiectelor AutoCAD.
Sintaxa: (assoc 'arg qlista)
Exemplu:
(setq lista '((0 . "CIRCLE") ( 10 12.0 15.0 0.0)))
(assoc 10 lista) -> ( 10 12.0 15.0 0.0)
(assoc 0 lista) -> (0 . "CIRCLE")
Car
Funcia returneaz primul argument al listei apelate.
Sintaxa: (car qlista)
Exemple:
(car '(23.8 36.3 "Mama")) -> 23.8
5-35

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(car '((34.5 22.1)("mama" "tata"))) -> (34.5 22.1)
(car '()) -> nil
Cdr
Funcia returneaz restul rmas dintr-o list dup ndeprtarea
primului argument.
Sintaxa: (cdr qlista)
Exemple:
(cdr '(23.8 36.3 "Mama")) ->( 36.3 "Mama")
(cdr '((34.5 22.1)("mama" "tata"))) -> (("mama" "tata"))
(cdr '(23.5)) -> nil
(cdr '()) -> nil
Cxr
Este o funcie generic de extragere de informaii dintr-o list.
Permit concatenarea de funcii elementare car i cdr la un nivel de
maxim patru funcii simple (specific pentru AutoLISP).
Sintaxa: (cxr qlista)
Pot fi utilizate urmtoarele 28 de combinaii pentru x:
AA AD AAA AAD ADA ADDD AAAA AAAD AADA
AADD ADAA ADAD ADDA ADDD
DD DA DDD DDA DAD DAA DDDD DDDA DDAD
DDAA DADD DADA DAAD DAAA
Exemple:
(car '(x y z)) -> x
(cadr '(x y z)) -> y
(caddr '(x y z) -> z
Utilizarea funciilor car, cadr i caddr reprezint instrumente
"consacrate" pentru extragerea coordonatelor unui punct grafic 3D.
(cdaddr '((a b)(c d)(e f g)(h))) -> (f g)
(cadddr '((a b)(c d)(e f g)(h))) -> (h)
5-36

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Cons
Funcia permite construirea structurilor de date utilizate n
descrierea informaiilor asociate obiectelor AutoCAD.
Prin utilizarea sa pot fi generate att perechi cu punct (dotted
paires) ct i liste.
Ea este o funcie primordial cu ajutorul creia se poate ataa
un nou argument n faa unei liste.
Sintaxa:
(cons arg_nou lista)
(cons atom atom)
Utilizarea unui atom n locul unei liste conduce la crearea unei
perechi cu punct. Aceast list special necesit un spaiu de memorare
diminuat dect o list normal.
Utilizare:
Liste normale
(cons 'x '(y z)) -> (x y z)
(cons '(a b) '((c d)(e f)))-> ((a b)(c d )(e f))
Perechi cu punct
(cons 'a 'b) -> (a . b)
(cdr (cons 'a 'b)) -> b
Foreach
Funcia permite aplicarea unei secvene de operaii asupra
tuturor elementelor unei liste. Elementele capt pe parcursul funciei
un nume formal care ia succesiv toate valorile din list.
Sintaxa: (foreach n qlista secventa)
n este numele formal care va conine succesiv toate
elelmentele din list.
Exemplu:
(setq sum 0)
(foreach n '( 2 4 6) (setq sum (+ sum n))) -> 12
5-37

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia are un comportament specific ciclurilor cu numr fixat
de iteraii, parcurgnd ntreaga list folosit ca argument.
Este un
instrument foarte productiv de parcurgere i
transformare a listelor. Combinat cu un contor poate fi folosit la
tratarea listelor (vectorilor) paraleli de date.
Last
Funcia determin ultimul element al unei liste argument.
Sintaxa: (last qlista)
Exemple
(last '1 2 3))-> 3
(last '( x y z ( 1 2 3))) -> (1 2 3)
Length
Funcia permite aflarea lungimii (numrul de elemente) unei
liste.
Sintaxa:(length qlista)
Exemplu:
(length '( 1 2 3))) -> 3
(length '((1 2)(3 4))) -> 2
(length '()) -> 0
Funcia nu testeaz dac componentele listei argument sunt
sau nu la rndul lor liste.
Dac argumentul nu este o list se produce o eroare de tip
"bad argument type".
List
Funcia este utilizat pentru crearea unei liste cu un numr de
elemente i cu o structur dorite de utilizator .
Sintaxa:(list arg1 arg2 argn)
Exemplu:
(list 'a 'b 'c) -> (a b c)
(list 'a 'b 'c '(d e f))->(a b c (d e f ))
5-38

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Poate fi utilizat la crearea unor puncte grafice (x y z) sau (x
y).
Argumentele trebuie s fie quotate (atribuiri cu setq), n caz
contrar vor fi evaluate.
Listp
Funcia cerceteaz dac argumentul este o list i returneaz T
dac este sau nil dac nu.
Sintaxa: (listp arg)
Exemple:
(listp '(a b c))-> T
(listp 2) ->nil
(listp '())-> T
Mapcar
Funcia aplic mai multor liste paralele o operaie formal.
Rezultatul este o list de aceeai lungime cu listele apelante.
Sintaxa:(mapcar 'functie qlista1 qlista2 qlistan)
Listele argument au aceeai lungime i aceleai tipuri de
elemente pentru a se putea aplica formula apelat.
Se poate utiliza i o opereie ad-hoc definit prin intermediul
funciei volatile lambda.
Exemple:
(mapcar '+ '(1 3 5) '(2 4 6)) -> (3 7 11)
(mapcar '(lambda(x)(+ x 25)) '(10 20)) -> (35 45)
(mapcar '* '(-1 1 0) '(x y z)) -> ( (- x) y z)
Funcia este deosebit de productiv, liste foarte mari de date
fiind posibil a fi rapid transformate.
Se pot defini clase complexe de operatori care s manipuleze
rapid mase mari de informaii stocate n liste.
Member

5-39

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia testeaz dac argumentul este sau nu membru n lista
apelat. n caz afirmativ returneaz o list care conine elementul testat
i toate elementele aflate consecutiv acestuia. n caz contrar, returneaz
nil.
Sintaxa:(member 'argument qlista)
Exemplu:
(member 'x '(u v x y z )) -> (x y z)
(member 'r '(u v x y z )) -> nil
(member 1 '(12 23 (1 2 3)))->nil
Dac argumentul nu este quotat rezultatul este nil.
Nu este testat dect primul nivel de organizare, deci nu sunt
depistate argumentele care sunt elemente ale unor subliste.
Nth
Funcia extrage al "n"- lea elemnt al unei liste.
Sintaxa:(nth n qlista)
Exemplu:
(nth 2 '((a b)(c d)(e f g) (h))) -> (e f g)
(nth 5 '((a b)(c d)(e f g) (h))) -> nil
Elementele au numrul de ordine al poziiei ncepnd cu 0.
Dac argumentul nu este o list se genereaz o eroare "bad
argument type".
Exerciiu:
Fiind dat lista
(setq lista '((a b)(c d)(e f g)(I k l m n))
s se extrag elementele c, g, h, l, n.
S se ncerce a se determina cnd este mai bine s utilizm
funciile cxr i cnd utilizm funcia nth.
Reverse
Funcia inverseaz ordinea elementelor din lista apelant.
Sintaxa:(reverse qlista)
5-40

Ovidiu Alupei-Cojocariu
Exemplu:

AutoLISP - Manual de programare

(reverse '(1 2 3)) -> (3 2 1)


Exerciiu:
Fiind dat lista
(setq lista '((a b)(c d)(e f g)(I k l m n))
s se inverseze ultimul element al listei; s se inverseze toat
lista.
Subst
Funcia este destinat substituirii unui element al unei liste cu
altul.
Sintaxa:(subst nou_element vechi_element qlista)
Exemplu:
(subst 'xx 'a '(a b (c d)(a f g) a)) -> (xx b (c d)(a f g) xx)
(subst 'xx 'e '(a b (c d)(a f g) a)) ->(a b (c d)(a f g) a)
Dac elementul vechi nu este component al listei, aceasta
rmne nemodificat.
nlocuirea se face pentru toate elementele replicate, aflate pe
nivelul 0.

5.9

Funcii de informare

Boundp
Funcia testeaz dac simbolul apelat este sau nu folosit.
Sintaxa:(boundp variabila)
Exemplu:
(setq a 123)
(boundp a) -> T
Minusp
Funcia testeaz dac elementul apelat este negativ.
5-41

Ovidiu Alupei-Cojocariu
Sintaxa:minusp numr)

AutoLISP - Manual de programare

Exemplu:
(setq a 123)
(minusp a ) -> nil
(minusp -1234) -> T
Null
Funcia returneaz T dac argumentul este nil.
Sintaxa: (null atom)
Exemple:
(setq a nil)
(null a) -> T
(setq b 123)
(null b) -> nil
Listp
Funcia testeaz dac argumentul este o list
Sintaxa:(listp arg)
Exemplu:
(setq a 12 b '(2 3 4))
(listp a ) -> nil
(listp b) -> T
Numberp
Funcia testeaz dac argumentul este un numr.
Sintaxa:(numberp arg)
Exemplu:
(setq a "12" b 12)
(numberp a) -> nil
(numberp b) -> T
5-42

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Zerop
Funcia testeaz dac argumentul este zero.
Sintaxa: (zerop arg)
Exemplu:
(setq a 23 b 0.)
(zerop a) -> nil
(zerop b) -> T
Getvar
Funcia preia valoarea unei variabile AutoCAD.
Sintaxa:(getvar "nume variabila AutoCAD")
Exemplu:
(setvar "CMDECHO" 0)
(getvar "CMDECHO")-> 0
Getenv
Funcia returneaz valoarea asociat unei variabile-sistem.
Sintaxa:(getenv "Nume variabila")
Exemplu:
(getenv "acad") -> c:\\acad
Este echivalent cu apelul funciei DOS SET. Dac variabila
nu este definit rspunsul este nil.
Regapp
Funcia nregistreaz o aplicaie a utilizatorului n desenul
curent. O aplicaie este un mod de baz de a stoca informaii
suplimentare ataate de obiectele AutoCAD, de a le manipula i a le
grupa.
Sintaxa:(regapp "nume aplicatie")
Exemplu:
(regapp "DEMO") -> "DEMO"
(regapp "DEMO")-> nil
5-43

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Un apel succesiv al lui regapp cu aceeai aplicaie de
nregistrat returneaz nil, semn c aplicaia a fost deja nregistrat.
Un obiect poate s conin informaii nregistrate sub mai
multe aplicaii.
Obiectul poate fi interogat asupra aplicaiilor sale prin
secvena:
(entget el (list "DEMO"))->
(( -1 . <Entity name: 60000118>)
(0 . "LINE")
(8 . "SUBTIRE")
(10 20.0 50.0)
(11 120.0 90.0)
(-3 ("DEMO" (1000 . "EXEMPLU")))
)
1000 este un cod DXF corespondent unui ir care poate avea
maxim 256 caractere.
Alte informaii pot fi stocate sub coduri cuprinse ntre 1000 i
1071.
Numele aplicaiei poate avea 31 caractere. Acestea pot fi
litere, numere sau caractere speciale ca $, -, _.
Dup nregistrarea unei aplicaii, aceasta se va stoca n tabela
de simboluri sub APPID.
Type
Funcia returneaz tipul argumentului apelant.
Sintaxa:(type argument)
Sunt posibile urmtoarele tipuri de argumente:

Tip

Semnificaie

INT

Numr ntreg
5-44

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

REAL

Numr real

STR

ir de caractere

LIST

List

SYM

Simbol

SUBR

Funcie intern AutoLISP

ENAME

Nume intern entitate AutoCAD

EXSUBR

Funcie extern ADS sau ARX

FILE

Descriptor de fiier

PICKSET

Set de selecie

PAGTAB

Pagin de tabelare simboluri

Exemplu:
(setq z 54 f 78.5 h "acum" y '(100 9) k (open "cucu.txt" "r")
(type z) -> INT
(type f)-> REAL
(type h) -> STR
(type y) ->LIST
(type k) -> FILE
(type (entlast))-> ENAME
Ver
Funcia returneaz un ir care exprim versiunea curent de
AutoLISP.
Sintaxa:(ver)
Exemplu:
(ver)-> "AutoLISP Release 12.0" sau "Extended AutoLISP
Release 10" sau "Visual LISP 2000 (en)"
Vports
Funcia returneaz o list cu configuraia momentan a
mpririi ecranului la vizualizarea multipl.
5-45

Ovidiu Alupei-Cojocariu
Sintaxa:(vports)

AutoLISP - Manual de programare

Exemple:
La pornirea unui nou desen sunt 2 viewporturi active 1 pentru
Paper Space, 2 pentru Model Space.
(vports) -> ((2 (0.0 0.0)(1.0 1.0)))

5.10 Funcii de conversie


Aceste funcii sunt deosebit de importante prin facilitile pe
care le ofer n a transforma informaiile dint-un tip n altul sau dintr-o
unitate de msur n alta.
Angtof
Funcia convertete un ir care exprim un unghi ntr-un
numr real conform unui mod de exprimare ales.
Sintaxa:(angtof "Sir"0 [mod])
Modul corespunde variabilei de sistem AutoCAD AUNITS:
Mod

Format

Grade zecimale

Grad
min
sec

Centigrade

Radiani

Azimut (unghi fa de direcia N)

Fiind setat AUNITS cu valoare 0,


(angtof "180") -> 3.14159
(angtof "3.14159" 3) -> 3.14159
(angtof "200" 2) -> 3.14159
Angtof este funcia invers asociat lui angtos.
Angtos

5-46

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia returneaz un ir care conine valoarea unui unghi
exprimat identic cu valorile fixate de variabilele de cotare ale
unghiurilor.
Sintaxa:(angtos unghi [Mod Precizie])
Tolerana exprim numrul de zecimale exacte obinute, i
este confom cu variabila AUPREC atunci cnd nu este apelat
Modul este compatibil cu unitile de msur pentru unghiuri
setate cu comanda UNITS sau cu variabila AUNITS dac nu este
apelat.
Mod

Format

Grade zecimale

Grad
min
sec

Centigrade

Radiani

Azimut (unghi fa de direcia N)

Exemplu:
(angtos pi 0 3) ->"180.000"
(setq

pi 15))
(angtos a 1 4) -> "12d0'0"""
(angtos a 2 3) -> "13.333g"
(angtos a 3 6) -> "0.209440r"
(angtos a 4 3) -> "N 78d0'0""
Rtos
Funcia returneaz un ir care exprim o valoarea real
folosit n tabel. Formatul irului este dependent de modul i precizia
folosit n apel.
Sintaxa:(rtos numar [Mod Precizie])

5-47

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Modul utilizat este compatibil cu formatele exprimate de
variabila LUNITS iar precizia (numrul de cifre afiate dup punctul
zecimal) cu variabila LUPREC.
Mod

Semnificaie

Stiinific (Mantis i exponent)

Zecimal

Ingineresc (inch )

Arhitectural (inch)

Fractional (inch i fractiuni de inch)

Exemplu:
(setq b 123.12345678)
(rtos b 1 4) ->"1.2312E+02"
(rtos b 2 4) -> "123.1235")
Ascii
Funcia returneaz valoarea ntreag corespunztoare primului
caracter din irul apelant, conform tabelei ASCII.
Sintaxa:(ascii "Sir")
Exemplu:
(ascii "(AutoCAD)") -> 40
(ascii "(") -> 40
(ascii "a") -> 70
Atof
Funcia convertete un ir care exprim un numr real n acel
numr.
Sintaxa:(atof "sir")
Exemplu:
(atof "123.4") -> 123.4
Funcia se comport similar cu funcia read. Dac irul nu
exprim un numr, funcia returneaz valoarea 0.0
5-48

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Atoi
Funcia este similar cu atof, valoarea returnat fiind ns un
numr ntreg.
Sintaxa:(atoi "sir")
Exemplu:
(atoi "12") -> 12
(atoi "19.8") -> 19
Read
Funcia furnizeaz prima list sau primul atom al unei liste
exprimate printr-un ir .
Sintaxa:(read "sir")
Exemplu:
(read "(a b)")->(A B)
(read "(a b) (c d)")->(A B)
(read "12 (a b) (c d)")->12
Distof
Funcia returneaz un numr real care exprim o distan
exprimat ca un numr real, utilizndu-se un mode de conversie a
unitilor de msur utililizate".
Sintaxa:(distof "sir" Mod)
Exemple:
(distof (rtos 2.5 3 2) 3)-> 2.5
Mod reprezint exprimarea irului utilizat, rezultatul fiin n
acord cu LUNITS.
Mod

Semnificaie

Stiinific (Mantis i exponent)

Zecimal

Ingineresc (inch )
5-49

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Arhitectural (inch)

Fractional (inch i fractiuni de inch)

Cvunit
Funcia calculeaz conversia ntre unitile de msur
specificate i prezente n descrierea din fiierul acad.unt.
Lista posibilitilor de conversie este foarte bogat i se poate
aplica feluritelor uniti de msurat timpul, spaiul, proprieti de mas.
Sintaxa:(cvunit numar unitate_veche unitate_noua)
(cvunit lista unitate_veche unitate_noua)
Exemplu:
(cvunit 5 "minute" "second" -> 300.0
(setq a 25.4)
(cvunit a "mm" "cm") -> 2.54
(cvunit a "mm" "inch") -> 1.0
(cvunit a "mm" "sq inch") -> nil
(cvunit 1.0 "gallon" "liter") -> 3.78541
Dac avei de fcut mai multe convertiri de acelai tip salvai
valoarea unitar a conversiei i folosii-o ulterior prin nmulire cu
numrul de uniti.
(cvunit '(1 2 3 ) "inch" "mm")->(25.4 50.8 76.2)
Lista de date utilizat este restricionat la 3 elemente (ca i
cum ar exprima un punct 3D).
Dac unitile sunt incompatibile, rezultatul este nil.
Itoa
Funcia returneaz un ir care conine exprimarea unui numr
ntreg.
Sintaxa:(itoa numar)
Exemplu:
(itoa 5) -> "5"
5-50

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(itoa 12.3)-> "bad argument type"
Chr
Funcia chr returneaz un caracter cu codul ASCII al
numrului ntreg apelant.
Sintaxa:(chr numar)
Exemple:
(chr 40) -> "("
(chr 67) -> "C"

5.11 Funcii care trateaz erori


Alert
Funcia alert afieaz ntr-o fereastr de dialog un mesaj dorit
de programator, acesta fiind un mijloc de semnalizare cu un impact
deosebit.
Sintaxa:(alert "mesaj")
Cu OK programul va avansa mai departe.
*Error*
Funcia este un mijloc definit de utilizator pentru dezvoltarea
de rutine de tratare a erorilor.
Sintaxa:
(defun *error* (mesaj)
(princ (strcat "Eroare, " mesaj))
(princ)
)
Utilizarea unei funcii de acest tip va conduce la anihilarea
afirii mesajelor standard de eroare care pot s umple ecranul prin
apelul consecutiv din fiecare funcie.
Nu este ns semnalat i poziia acestei erori ceea ce conduce
la o depanare mai greoaie.
Exit
5-51

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia exit ca i quit, produce o ntrerupere programat a
rulrii unui program. ntreruperea este semnalat de un mesaj de
eroare.
Sintaxa:(exit) sau (quit)
Exemplu:
(exit) -> quit/ exit abort
Trace
Funcia este util pentru depanarea programelor AutoLISP. Ea
seteaz un indicator ctre un nume de funcie pe care l va urmri i va
afia apelurile succesive ale acestei rutine.
Desetarea unui astfel de simbol se face cu funcia pereche
untrace.
Sintaxa:(trace functie)
Untrace
Funcia deseteaz cutarea i afiarea n caz de eroare a
simbolului apelat.
Sintaxa:(untrace functie)
Funcii I/O
Aceste funcii servesc introducerii sau exportului de date n i
din programele AutoLISP.
Ele lucreaz n general cu fiiere pe care le deschid la operaii
de citire sau scriere, dar i cu dispozitivul curent de afiare.
Close
Funcia permite nchiderea unui fiier deschis n prealabil cu
open.
Sintaxa:(close descriptor)
Descriptor indic utilizarea unui descriptor de fiier, tip
special de dat ce se iniializeaz utiliznd funcia open.
Exemplu:
(setq fis (open "test.ddd" "r"))-> <File;#.
(close fis) -. Nil
5-52

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Prin nchidere, descriptorul de fiier este setat ca nil. La un al
doilea aplel de nchidere a aceluiai fiier se obine un mesaj "fiierul
nu este deschis" ("File not open").
Findfile
Funcia permite cutarea unui fiier cu ajutorul cilor
cunoscute i returneaz la gsire numele fiierului mpreun cu calea
spre el.
Sintaxa:(findfile "fisier")
Numele returnat poate fi imediat utilizat de funcia open.
Load
Funcia ncarc un fiier AutoLISP i l evalueaz.
Sintaxa:(load "nume fisier" "mesaj")
mesajul este afiat atunci cnd fiierul nu poate fi ncrcat din
cauza apariiei unei erori.
Se pot ncrca n mod automat la iniializarea editorului grafic
AutoCAD, programe AutoLISP prin intermediul fiierului acad.lsp
care este cutat i ncrcat automat.
Prin completarea acestui fiier se pot iniializa secvene de
ncrcare automat a unor aplicaii rezidente.
n cazul n care ntre funciile definite n fiierul rcat exist
funcii cu prefixul "S::" acestea sunt imediat executate.
Instruciunile "rzlee" necuprinse n corpul nici unei definiii
de funcii vor fi i ele executate imediat ce au fost evaluate.
Erorile posibile la ncrcare sunt de obicei legate de descrierea
incorect a numelui fiierului sau neindicarea complet a cii ctre
acesta i este de tip "file not found" "fiier de negsit". Calea se
constituie ca un prefix ataat numelui fiierului, n care separatorul "
" trebuie dublat pentru a fi interpretat corect i nu ca element de
control.
Erorile de sintax n codul programului sunt consecutiv
depistate i afiate, nu ns n aceeai sesiune de ncrcare. Corectarea
primei greeli va conduce la afiarea mesajului de eroare pentru cea dea doua .a.m.d..

5-53

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
nceptorii s se atepte la un lung lan de erori afiate la
ncrcare, ceea ce este educativ pentru a se deprinde foarte bine erorile
de sintax.
Open
Funcia deschide un fiier indicat crend un canal de
comunicaie dedicat denumit decriptor de fiier.
Ctre un fiier pot fi deschise simultan mai multe canale de
comunicaie.
Sintaxa:(open "nume fisier" Mod)
Numele fiierului trebuie s conin ca prefix i calea ctre
acesta. Omiterea ei va duce la cutarea fiierului stric prin intermediul
cilor implicite. Aceste sunt legate de instalarea particular a
AutoCAD, sau este vorba de directorul de unde s-a deschis editorul de
desenare (poziia desenului curent).
Modul definete tipul de canal de comunicaie i poate fi:
Mod

Semnificaie

"w"

scriere

"r"

citire

"a"

adugare

Se vor folosi ntotdeauna litere minuscule, aa cum sunt


nscrise n tabel.
n cazul n care fiierul nu exist, utilizarea "a" va deschide un
nou fiier, altfel va poziiona pointerul n acesta dup ultima linie,
pentru adugare.
Variabila care conine descriptorul de fiier nu va putea fi
refolosit pn cnd fiierul deschis iniial nu va fi nchis cu close.
Deoarece numele intern al descriptorului de fiier este dificil
de utilizat i mai ales este temporar valabil doar pe perioada editrii
grafice, se va utiliza ntotdeauna atribuirea pentru a se putea reveni n
final i ase nchide respectivul fiier. O nenchidere a unui fiier poate
cauza uneori o blocare a lui pn la prsirea editorului de desenare.
Prin1

5-54

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia este destinat afirii coninutului unei variabile sau a
rezultatului evalurii unei expresii AutoLISP. Ea returneaz de
asemenea valoarea expresiei ca un ecou. Scrierea se va face nsoit de
semnele care preced i sfresc un ir ("") i va evidenia i caracterele
netipribile descrise cu "\nnn".
Sintaxa:(prin1 expresie [fisier])
Fisier indic posibilitatea scrierii rezultatului evalurii direct
ntr-un fiier deschis anterior la scriere sau adugare, n care caz se va
afia pe ecran n zona de dialog doar ecoul scrierii n fiier fr a se
scrie efectiv nimic. Lipsa sa produce comportamentul descris anterior.
Ecoul poate fi anihilat prin utilizarea funciei prin1 ntr-un
apel fr argumente:(prin1)
Exemplu:
(setq mesaj "Buna ziua")
(prin1 (strcat mesaj " " "Mihai" "!")) -> "Buna ziua
Mihai!""Buna ziua Mihai!"
(prin1)
Princ
Funcia are un comportament asemntori cu prin1, ceea ce se
scrie ns nefiind flancat ghilimele.
Sintaxa:(princ expresie [fisier])
Exemplu:
(setq mesaj "Buna ziua")
(princ (strcat mesaj " " "Mihai" "!"))(princ) -> Buna ziua
Mihai!
Princ returneaz n cazul caracterelor de control exact grafia
acestuia.
Faptul c scrierea se face fr ghilimele face ca funcia s fie
cea mai potrivit pentru scrierea n fiiere externe.
Utilizarea lui princ fr argumente anihileaz tiprirea ecoului
funciei chiar nil fiind.
Print
5-55

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia este destinat a scrie o expresie pe un rnd nou, fr a
fi nevoie de utilizarea caracterelor de control.
Incrementarea rndului este fcut automat, funcia tiprind
mereu pe un nou rnd.
Ca efect al tipririi se aseamn cu prin1, irul generat fiind
scris cu tot cu ghilimele.
Prompt
Funcia este destinat tipririi unui mesaj n zona de dialog a
comenzilor. Ea returneaz ntotdeauna nil. Trebuie nsoit de (princ)
pentru a anula acest efect.
Sintaxa:(prompt "Mesaj")
Caracterele de control pot influena poziia mesajului pe linia
de comand.
Terpri
Funcia avanseaz cu un rnd textul afiat pe ecran n zona de
dialog. De folosit doar n mod ecran.
De obicei se folosete pentru acelai efect caracterul de
control "\n". acesta, alipit textului care trebuie tiprit, produce newline
naintea tipririi acestuia sau dup tiprirea lui.
Read-char
Funcia permite citirea unui caracter i returneaz codul su
ASCII.
Sintaxa:(read-char [fisier])
Exemplu:
(read-char) e 101
Read-line
Funcia permite citirea unui rnd ntreg, rnd care se ncheie
de obicei cu ENTER.
Sintaxa:(read-line [fisier])
Este cea mai utilizat metod de citire din fiiere, fiind cea
mai productiv.
5-56

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Interpretarea liniilor complexe este fcut prin aplicarea unor
metode de segmentare a informaiilor.
La ntlnirea sfritului de fiier funcia returneaz nil.
Exemplu:
Secvena urmtoare este des utilizat pentru citirea datelor
externe din fiiere i stocarea lor ntr-o list de date:
(setq fis (open "fisier.dat" "r"))
(setq ldate '() lcit (read-line fis))
(while lcit
(setq ldate (append ldate (list lcit)))
(setq lcit (read-line fis))
)
(close fis)
ntre deschiderea i nchiderea fiierului de date au loc
iniializrile pentru lista de date i pentru rndul curent citit.
Cu ajutorul unui ciclu while care are ca test existena unui
rnd diferit de nil, se adaug rndul citit curent i se citete unul nou.
Apariia sfritului de fiiere va ntrerupe ciclul i implicit citirea.
Write-char
Funcia permite scrierea unui caracter ASCII.
Sintaxa:(write-char Cod-ASCII [fisier])
Caracterul null (0 ASCII) nu poate fi scris cu write-char.
Write-line
Funcia permite scrierea unui ntreg rnd (mesaj) fr
ghilimele. Argumentul de scris este ntotdeauna testat s fie STR.
Sintaxa:(write-line "mesaj" [fisier])
"mesaj" poate fi un ir de caractere sau o expresie care
returneaz acest tip de data.

5-57

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

5.12 Funcii care opereaz cu nume de elemente


Entnext
Funcia caut i returneaz numele entitii consecutive unei
entiti folosite ca argument.
Sintaxa:(entnext [ename])
Ename este numele unei entiti AutoCAD, atribuit temporar
pe durata sesiunii curente de desenare.
Cu ajutorul ei se poate avea acces la lista asociat entitii.
Formatul acestui nume este :<Entity name: 60000014>
n cazul n care numele entitii din apel lipsete funcia
returneaz numele primei entiti din desen.
Elementele complexe ca de exemplu POLYLINE, sau
BLOCK conin elemente simple consecutive elementului principal.
Dac n cazul polyliniilor este vorba de entiti de tip VERTEX i
SEQEND, n cazul BLOCK sunt chiar elementele constituente ale
acestora. Cutarea decurge n ambele cazuri din element n element, ele
fiind nirate una dup cealalt i coninnd fiecare un pointer ctre
numele entitii urmtoare.
Exemple:
(entnext)-> primul element din desen
(entnext (entlast)) -> nil
(entlast)-> ultimul element din desen
Entlast
Funcia returneaz numele ultimei entiti desnate.
Sintaxa: (entlast)
Dac nu s-a desenat nimic. (entlast) returneaz nil
Exemplu:
(command "MOVE" (entlast) "" (list 0 0)(list 100 0))
Mutarea ultimului obiect cu 100 uniti pe axa x.
Entsel
5-58

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia returneaz numele intern al entitii selectate. Ea are
acces doar la entitile principale, cele secundare putnd fi selectate i
identificate fie prin lanuri de entnext, fie cu funcia nentsel
Sintaxa:(entsel ["mesaj"])
Mesajul poate conduce spre o selectare mai bine orientat (de
ex. "Selectati un obiect rosu")
Rezultatul returnat este o list compus din 2 elemente:
Numele entitii principale selectate - se extrage cu car
Punctul n care a fost fcut selectarea - se extrage cu cadr
Handent
Funcia determin numele intern al entitii pentru care
cunoatem handle-ul.
Handle-ul este un identificator unic al unei entiti AutoCAD
exprimat printr-un ir ce reprezint un numr scris n format
hexazecimal.
Ataarea acestor handle-uri are loc numai dup activarea
atribuirii acestora cu comand HANDLES. Acest moment este salvat n
regitri i va fi respecat ca mod de lucru.
Existena handle-urilor face ca grupurile de entiti realizate
de aplicaii s fie rezistente n sesiuni de editare succesive.
Sintaxa:(handent handle)
Exemplu:
(handent "2CA")-> Entity name: 60001281
Nentsel
Funcia permite aflarea prin selectarea unei subentiti
numelui acesteia, trecnd de bariera definiiei de block.

Sintaxa:(nentsel ["mesaj"])
Mesaj este un ir care ndrum pe utilizator n selectare.
Rezultatul returnat este o list care conine numele subentitii
selectate i punctul prin care aceasta a fost atins.
Xdroom
5-59

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia returneaz mrimea spaiului de memorie rmas
pentru scrierea datelor extinse (Extended Entity Data). Corespunztor
elementului apelant.
La un moment dat pot fi memorate 16kB (16383 B) memorai
pentru fiecare element. Acest spaiu poate fi utilizat de aplicaii
nregistrate de utilizator cu regapp.
Sintaxa:(xdroom ename)
Exemplu:
(xdroom (entlast)) -> 16383
Acest rexultat nseamn c elementul are utilizai 261 byte de
informaie.
Xdsize
Funcia calculeaz spaiul necesar pentru datele extinse ale
listei apelante.
Sintaxa:(xdsize qlista)
Exemplu:
(regapp "DEMO")
(xdsize '(-3 ("DEMO" (1000 . "EXEMPLU")))) ->12
Valoara returnat implic corecta nregistrare a aplicaiei .
n exemplul de mai sus, codul DXF 1000 este asociat unui ir
care are o lungime maxim de 255 caractere.
Entdel
Funcia terge/redeseneaz elementul cu numele apelant.
Sintaxa:(entdel ename)
Repetarea operaiei entdel pentru un obiect ters produce
reactivarea i redesenarea acestuia (valabil doar pentru sesiunea curent
de editare).
Entget
Funcia returneaz lista asociat a unei entiti AutoCAD.

5-60

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Pe baza acestei liste se pot investiga informaii despre acel
obiect, se pot aduga date extinse sau sw pot identifica subelemente
associate entitii principale.
Sintaxa:(entget ename [aplicatia])
aplicaia reprezint numele unei aplicaii nregistrate ataate
entitii respective.
Apelul fr acest nume nu va dezvlui datele extinse ataate
conform acestei aplicaii.
Exemplu:
(setq elist (entget(car(entsel))) selectarea unei entiti cerc
((-1 . <Entity name: 148c9b0>) (0 . "CIRCLE")
(330 . <Entity name: 148c8f8>) (5 . "36")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(100 . "AcDbCircle")(10 166.294 157.488 0.0)(40 . 34.4508)
(210 0.0 0.0 1.0))
Se observ structura listei compus din perechi de forma
(cod_DXF . valoare) sau (cod_DXF v1 v2 v3)
Codurile DXF sunt valori numerice crora li se asociaz date
specifice.
Perechile cu punct sau listele se pot construi omogen cu
aceeai funcie cons.
Extragerea informaiei dintr-o sublist se poate face cu
expresia:
(setq val (cdr(assoc cod_DXF elist)))
Exemplu de extragere a tipului de entitate:
(setq tip (cdr (assoc 0 elist))) -> "CIRCLE"
Codurile DXF sunt mprite n mai multe grupe, o serie dintre
ele sunt comune tuturor tipurilor de entiti, altele sunt specifice numai
unora, altele au semnificaii diferite de la o entitate la alta.
Consultnd tabela de coduri specifice fiecrei entiti se pot
obine codurile necesare investigrii obiectelor.
5-61

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Entmake
Funcia creaz un nou element AutoCAd, direct prin
exprimarea listei sale asociate.
Sintaxa:(entmake elist)
Dac lista asociat este bine construit, elementul va fi
acceptat iar funcia returneaz lista asociat acceptat i completat de
AutoCAD. n caz contrar se returneaz nil.
Exemplu:
Pentru un obiect de tip cerc, cu modificarea poziiei centrului
fa de cercul de la exemplul anterior (cod 10)cu 100 de uniti pe axa
X i cu raza fixat la valoarea 25 (codul 40), scriem urmtoarea
secven de programare:
(setq elist1 (subst (cons 10 (mapcar '+ '(100 0 0) (cdr(assoc 10
elist))))(assoc 10 elist)elist))
((-1 . <Entity name: 148c9b0>) (0 . "CIRCLE") (330 . <Entity
name: 148c8f8>) (5 . "36") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (100 . "AcDbCircle") (10 266.294 157.488 0.0) (40 .
34.4508) (210 0.0 0.0 1.0))
Am obinut substituirea n lista asociat a sublistei (10
166.294 157.488 0.0) cu (10 266.294 157.488 0.0)
(setq elist2 (subst (cons 40 25.)(assoc 40 elist1)elist1))
((-1 . <Entity name: 148c9b0>) (0 . "CIRCLE") (330 . <Entity
name: 148c8f8>) (5 . "36") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (100 ."AcDbCircle") (10 266.294 157.488 0.0) (40 .
25.0) (210 0.0 0.0 1.0))
Am obinut substituirea n lista asociat modificat anterior a
sublistei (40 . 34.4508) cu ) (40 . 25.0).
(entmake (cdr elist2))
((0 . "CIRCLE") (330 . <Entity name: 148c8f8>) (5 . "36")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDbCircle") (10 266.294 157.488 0.0) (40 . 25.0) (210 0.0 0.0 1.0))
Am reuit desenarea direct a unui nou cerc respectnd
condiiile impuse.
5-62

Ovidiu Alupei-Cojocariu
(entget(entlast))

AutoLISP - Manual de programare

((-1 . <Entity name: 148c9b8>) (0 . "CIRCLE") (330 . <Entity


name: 148c8f8>) (5 . "37") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (100 . "AcDbCircle") (10 266.294 157.488 0.0) (40 .
25.0) (210 0.0 0.0 1.0))
Am comparat listele asociate, cea utilizat cu entmake i cea
rezultat ulterior cu entget i se observ c AutoCAD a acceptat
formatul, dar I-a nlocuit o serie de informaii cum sunt:
Numele noii entiti

cod_DXF -1

Handle-ul noii entiti

cod_DXF 5

Entmod
Funcia modific o entitate AutoCAD pe baza reactualizrii
informaiilor coninute n lista sa asociat.
Sintaxa: (entmod elista)
Lista asociat poate fi modificat cu ajutorul funciilor subs
pentru nlocuirea unui segment de list sau cu funcia append pentru
adugarea de informaii noi.
Exemplu:
Pentru cercul desenat anterior s modificm lista sa asociat
prin adugarea unui grup nou (cod_DXF valoare) i anume cel rezervat
unui tip de culoare.
Acest grup este folosit numai dac obiectul are o culoare
diferit de BYLAYER.
Codul DXF de culoare este 62.
S scriem urmtoarea secven de programare:
(setq elist4(append elist3 (list(cons 62 1))))
((-1 . <Entity name: 148c9b8>) (0 . "CIRCLE") (330 . <Entity
name: 148c8f8>) (5 . "37") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (100 . "AcDbCircle") (10 266.294 157.488 0.0) (40 .
25.0) (210 0.0 0.0 1.0) (62 . 1))
(entmod elist4)

5-63

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
((-1 . <Entity name: 148c9b8>) (0 . "CIRCLE") (330 . <Entity
name: 148c8f8>) (5 . "37") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (100 ."AcDbCircle") (10 266.294 157.488 0.0) (40 .
25.0) (210 0.0 0.0 1.0) (62 . 1))
efectul este realizat, cercul i-a schimbat culoarea n rou
(valoare 1) prin adugarea cu funcia append a noului grup (62 . 1)
Exist o serie de limitri i anume:
Tipul elementului nu poate fi modificat;
Trebuie
codurilor DXF;

cunoscute

toate

modificrile

corespunztoare

Sub elementele unui block nu vor fi modificate imediat ci n


urma apelului funciei entupd.
Fiecare greeal n lista asociat se sancioneaz cu nil i nu se
ntmpl nimic.
Entupd
Funcia folosete la reactualizarea unui sub element n vederea
redesenrii sale n raport cu ultimele modificri survenite prin
procedura entmod.
Sintaxa:(entupd ename)
Reactualizarea va implica doar subelemntul vizat, nu ca la
regenerare unde toate elementele sunt reactualizate.
Funcia a fost conceput special pentru subelemnte , dar
funcioneaz perfect i pentru elementele principale.

5.13 Funcii care opereaz cu seturi de selecie


Seturile de selecie sunt tipuri de date AutoLISP care
identific grupuri de obiecte obinute de obicei prin aplicarea unor
funcii sau comenzi de selectare.
Ssget
Funcia permite obinerea unui set de selecie.
Sintaxa:
1.

(ssget mod_sel punct1 punct2 [qlista_filtrare])


5-64

Ovidiu Alupei-Cojocariu
2. (ssget punct [qlista_filtrare])
3.

(ssget)

4.

(ssget "x" [qlista_filtrare])

AutoLISP - Manual de programare

Posibilitile de selectare sunt explicitate n tabelul urmtor :


Mod_sel

Semnificaie

Puncte

selectare standard

da

punct

selectare obiect care


trece prin acel punct

da

"L"

ultimul
desenat

da

"P"

setul anterior

"W"

ferastr de selectare
"Window"

P1 i P2

da

"C"

fereastr de selectare
"Crossing"

P1 i P2

da

"WP"

fereastr de selectare
"WindowPolygon"

qlist de puncte

da

"CP"

fereastr de selectare
"CrossingPolygon"

qlist de puncte

da

"F"

selectare cu "Fence"

qlist de puncte

da

"X"

selectare cu filtrare

obiect

Qlist filtrare

da

Da

Qlista de filtrare este un element care servete la limitarea


obiectelor admise n setul de selecie prin impunerea unor restricii
folosite n filtrarea lor.
Selectarea utiliznd mijloace geometrice de selectare, puncte,
qliste de puncte trebuie precedat de mrirea ferestrei curente de
vizualizare, astfel nct toate punctele utilizate s se gseasc vizibile
pe ecran, n caz contrar selectarea poate s eueze.
O selectare euat este semnalat prin nil.
Sublinierea obiectelor se face doar la utilizarea ssget fr
argumente.
5-65

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Lista de filtrare reprezint un mijloc util , construcia acesteia
necesitnd cunotine speciale privind sintaxa acesteia.
S-a introdus un cod DXF -4 , nou, cu rol de operator, care
poate s combine diferite criterii de filtrare ntr-o singur list
criterial.
Ca exemplu, pentru alegerea direct cu ajutorul unei ferestre
doar a arcelor care au o raz maimic sau egal cu 5, se folosete
expresia:
(ssget "W" '(20 50)'(190 70) (list (cons 0 "ARC")(cons -4 "<=")(cons
40 5)))
Se folosesc operatori aritmetici grupai n tabelul urmtor:
Operator

Semnificaie

"*"

Toate (ntotdeauna T)

"="

Egal

"!="

Diferit

"
="

Diferit

"<>"

Diferit

"<"

Mai mic

">"

Mai mare

"<="

Mai mic sau egal

">="

Mai mare sau egal

"&"

AND pe bii (doar pentru numere ntregi)

"&="

Egalitate cu masc (doar pentru numere ntregi)

Toi operatorii sunt pentru numere reale sau ntregi, cu


excepia celor orientai pe bii care sunt doar pentru numere ntregi.
Operatorii logici sunt grupai dup cum urmeaz:
Op1

Op2

Semnificaie

"<AND"

"AND>"

Cuplare "I" pentru unul sau mai muli


5-66

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare


operanzi

"<OR"

"OR>"

Cuplare "SAU" pentru unul sau mai muli


operanzi

"<XOR"

"XOR>"

Cuplare "XOR" pentru doi operanzi

"<NOT"

"NOT>"

Cuplare "NOT" pentru un operand

Ca exemplu extins se d u expresie care s filtreze cu o


fereastr "Window" toate arcele ce au raza mai mic sau egal cu 5 sau
mai mari dect 10, dar nu sunt din layerul TEMP.
(setq x (ssget "W" '(20 50) '(190 70)
(list
(cons -4 "<OR")
(cons 0 "ARC")
(cons -4 "<=")
(cons 40 5.0)
(cons -4 "<NOT")
(cons 8 "TEMP")
(cons -4 "NOT>")
(cons -4 "AND>")
(cons -4 "<AND")
(cons 0 "ARC")
(cons -4 ">")
(cons 40 10.0)
(cons -4 "<NOT")
(cons 8 "TEMP")
(cons -4 "NOT>")
(cons -4 "AND>")
(cons -4 "OR>")
)))
5-67

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Pot fi deschise simultan maxim 6 seturi de selecie, la
ncercarea de a deschide pe al aptelea se returneaz nil. Seturile de
selecie pot fi terse prin atribuirea unui set nil.
Utilizarea listei de filtrare poate fi orientat pe coduri DXF.
Pentru cteva dintre acestea se dau urmtoarele semnificaii:
Cod

Semnificaie

Tip element

Nume block din referina blocului

Nume tip linie

Nume stil text TEXT ATTDEF

Nume layer

62

Numr culoare 0=BYBLOCK 256=BYLAYER

66

Flag pentru atributele blocului

210

Vector 3D

- sunt valabile wildcardurile (caracterele care pot nlocui)


La utilizarea de wild-carduri, pentru blocurile anonime, ale cror nume
chiar ncepe cu caracterul "*" se va scrie suplimentar caracterul Escape
"`".
De exemplu, pentru selectarea tuturor haurilor:
(setq hatc (ssget "X" (list (cons 2 "`*X*"))))
Sslength
Funcia returneaz lungimea unui set de selecie, cu alte
cuvinte din cte entiti este compus.
Sintaxa:(sslength ssel)
Exemplu:
(setq lung (sslength ssel))
Fiecrei entiti i corespunde cte un index (numr) de ordine
n setul respectiv. Numerotarea indexurilor ncepe cu 0, ultimul fiind
sslength minus unu.
5-68

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Indexul este un numr ntreg atta timp ct este mai mic de
32767, dup care este real.
Un set de selecie nu conine niciodat de dou ori acelai
element.
Exerciiu:
Scriei un program care s listeze toate elementele dintr-un set
de selecie.
Ssname
Funcia returneaz numele elementului care se regsete sub
un anumit index n setul de selecie.
Sintaxa:(ssname ssel index)
Exemplu:
(setq ssel (ssget "W" '(0 0) '(100 100)))
(setq ename (ssname ssel 2))
Se va obine elementul al treilea din setul ssel.
Dac setul de selecie nu este bine definit, se obine un mesaj
de eroare "bad argument type".
Ssadd
Funcia ataeaz o entitate la un set de selecie.
Sintaxa:(ssadd [ename ssel])
n cazul n care nu sunt utilizate argumente, funcia creeaz un
nou set de selecie gol (vid). Ea poate fi folosit n acest caz la
iniializarea unui set de selecie sau la resetarea unui simbol care
desemneaz seturi de selecie utilizate frecvent n programare.
Utilizarea cu doar primul argument va produce un nou set de
selecie care conine doar acel element.
Exemplu:
(setq ssel (ssadd)) ; iniializare set de selecie vid
(setq ssel (ssadd elem ssel)); adugare a unui element.
Dac ncercm s adugm un element existent deja nu se
produce nici o eroare, dar nici nu suntem avertizai.
5-69

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Selectarea cu entsel i adugarea elementelor unul cte unul
va produce respectarea acestei ordini n setul de selecie. Nu acelai
lucru se ntmpl cu selectarea cu ssget care, la utilizare selectrii de
mas cu ferestre va produce o ordine pe care nu o putem controla.
Ssdel
Funcia este util pentru tergerea unui element dintr-un set de
selecie.
Nu este necesar cunoaterea indexului elementului.
Sintaxa:(ssdel ename ssel)
Exemplu:
(setq ssel (ssadd e1)) -> <Selection set: 2>
(ssdel el ssel)) -> <Selection set: 2>
(ssdel ex ssel) -> nil
Ssmemb
Funcia raporteaz dac elementul apelant face sau nu parte
din setul de selecie cercetat.
Sintaxa:(ssmemb ename ssel)
Existena elementului este raportat prin returnarea numelui
entitii. Inexistena sa produce nil.
Exemplu:
(setq ssel (ssadd el)) -> <Selection set: 2>
(setq chk (ssmemb el ssel)) -> <Entity name :>
(setq chk (ssmemb ell ssel)) -> nil

5.14 Funcii care au acces la tabelele de simboluri


Tabelele de simboluri sunt modaliti de memorare globale ale
unui desen AutoCAD. n ele sunt cuprinse informaiile despre stilurile
de texte, blocuri, layere, tipuri de linie, nume de view-uri, UCS-uri,
stiluri de cotare, viewporturi, sau aplicaii extinse nregistrate (appid).
Tblnext
5-70

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia permite investigarea tabelelor de simboluri, prin
indicarea tipului de tabel cutat.
Sintaxa:(tblnext numetabel [rewind])
Exemplu:
(tblnext "STYLE")
((0 . "STYLE")(2 . "STANDARD")(70 . 0)(40 . 0.0)(41 . 1.0)
(50 . 0.0)(71 . 0)(42 . 3.5)(3 . "TXT8")(4 . ""))
(tblnext "STYLE") -> nil
(tblnext "STYLE" T)
((0 . "STYLE")(2 . "STANDARD")(70 . 0)(40 . 0.0)(41 . 1.0)
(50 . 0.0)(71 . 0)(42 . 3.5)(3 . "TXT8")(4 . ""))
Dup primul apel, utilizarea prin repetare a comenzii nu are
rezultat.
Utilizarea opiunii rewind prin scrierea unui argument diferit
de nil, produce readucerea indexului n tabel la 0 i cutarea va avea
efect.
Nume de tabele sunt: BLOCK, LAYER, LTYPE, VIEW,
STYLE, UCS, DIMSTYLE, APPID, VPORT.
Se observ similitudinea organizrii unei tabele cu acea a
listelor asociate obiectelor. Cu o excepie: nu exist codul -1. Pentru
blocuri codul este -2.
Exemplu:
((0 . "BLOCK")(2 . "MASA")(70 . 0)(10 120.0 70.0 0.0)(-2 .
<Entity name: 60000014>))
Codul -2 desemneaz existena subelementelor, deci cu
entnext i entget pot fi investigate aceste subelemente. Cnd s-au
terminat subelementele, entnext returneaz nil.
Tblsearch
Funcia permite cutarea direct n tabela de simboluri a unui
anume simbol.
Sintaxa:(tblsearch Nume_tabel [Pagina_urmatoare])
5-71

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Cutarea numelui n tabela indicat este posibil i prin
paginarea cutrii (/= nil).
Indicarea paginei va avea efect asupra nceputului cutrii cu
tblnext, n sensul c se va ncepe de la pagina repectiv.
Exemplu:
(tblsearch "STYLE" "STANDARD")
((0 . "STYLE")(2 . "STANDAD")(70 . 0)(40 . 0.0)(41 . 1.0)
(50 . 0.0)(71 . 0)(42 . 3.5)(3 . "TXT8")(4 . ""))
Informaia este gsit indiferent de poziia sa n tabela de
simboluri.

5.15 Funcii de introducere direct grafic i de la


alte dispozitive
Funciile permit desenare direct pe ecran fr a crea
elemente noi n baza de date. Sunt utile de exemplu pentru crearea de
obiecte elastice care s urmreasc cursorul grafic.
Grclear
Funcia terge fereastra curent de vizualizare de pe monitor.
Sintaxa:(grclear)
tergerea afecteaz tot ecranul dar nu sunt distruse elementele
din baza de date. Prin apelare funciei (redraw) se vor redesena
obiectele din baza de date.
Grdraw
Funcia deseneaz un vector ntre dou puncte, de culoarea
indicat i tipul de linie indicat.
Sintaxa:(grdraw pct1 pct2 culoare [mod])
Argumentul mod, dac este prezent i este mai mare dect 0
produce desenarea ntrerupt (subliniat) a vectorului.
Utilizare numrului -1 pentru culoare produce desenarea
culorii complementare, n caz contrar se respect codurile culorilor
AutoCAD.
Prin regenerare vectorii sunt teri.
5-72

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Cu comanda grvecs pot fi desenai vectori mai rapid.
Grread
Funcia permite citirea unui punct grafic ce determin poziia
momentan a cursorului grafic (citire ON LINE).
Sintaxa:(grread [Mod])
Returul este o list care conine dispozitivul folosit i valoarea
Modul are urmtoarele posibiliti de interpretare:
Mod

Echipament

Al doilea element

Tastatur

Cod ASCII

Selectare punct

List de coordonate

Meniu ecran

Numr cmp 0-999 Meniu ecran


10001-16999 POP 1-16

Dragmode

Coordonate actuale

Meniu Button

Numr buton

Tablet1

Numr cmp

Tablet2

Numr cmp

Tablet3

Numr cmp

10

Tablet4

Numr cmp

11

AUX1-Meniu

Numr cmp

12

List TYP 6

Creion electric.

Dac argumentul nu este nil, folosind modul 5 vom putea


culege coordonatele momentane ale cursorului.
Cunoaterea acestor metode de trasare-culegere poziie
temporar a cursorului poate fi util n anumite aplicaii pentru a
imprima deplasri impuse, a anticipa poziii succesive, etc.
Argumentul de tip de informaie, codificat pe bii, este
prezentat n tabelul urmtor:
Cod

Semnificaie

Retur coordonate temporare


5-73

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Coduri taste (chiar funcionale sau sgei)

Activare cursor cross-hair

Nu se ia considerare nteruperea

Cursorul este activat doar n cazul utilizrii codului 4, altfel nu


este afiat.
Mod cursor

Semnificaie

Afiare cursor normal

Nu se afieaz cursorul

Afiare cursor de selectare

CTRL-C ntrerupe programul AutoLISP cu excepia cazului


folosirii codului 8.
Exemplu:
(grread nil 4 2)
nil indic ateptarea introducerii, 4 activeaz funcia desenrii
cursorului, 2 indic tip de cursor de selectare (ptrat).
Datorit evoluiei AutoCAD, opiunile legate de meniuri sau
zone tablet sunt n general evitate deoarece rezultatele sunt
neconcludente.
Grtext
Funcia permite tiprirea unui text direct pe ecran n zona
meniului lateral (valabil n configurarea cu meniu lateral).
Sintaxa:(grtext Pozitie "Text" [Mod])
Exemplu:
(grtext 3 "Menu")
scrie pe cmpul 3 al meniului-ecran cuvntul "Meniu".
Grvecs
Funcia este o alternativ la grdraw, mult mai productiv
deoarece permite trasarea unei ntregi liste de vectori definii n
prealabil.
Sintaxa:(grvecs qlista [vector])
5-74

Ovidiu Alupei-Cojocariu
qlista este de forma:

AutoLISP - Manual de programare

'(2 (10 0)(30 70) 257 (0 0)(10 0))


unde 2 i 257 sunt coduri de culori (2 galben, 256 complement
de galben adic albastru)
Vectorul, introdus opional permite o transformare de
coordonate conform unei matrici de transformare.
Exemplu:
(grvecs '(2 (10 0)(30 70))
'(( 1 0 0 30)(0 1 0 50)(0 0 1 0)(0 0 0 1)))
Expresia traseaz un vector galben paralel cu cel descris de
prima list, deplasare fiind dat de matricea de transformare, cu (30,50)
fiind trasat din punctul (40 50) n punctul (60 120).
Culoarea setat iniial este valabil pentru toi vectorii pn
cnd este setat alta. Dac nu este specificat se seteaz ca 0 (negru)
ceea ce pe fond negru (obinuit) nu se observ. Culorile peste 255 sunt
culori complementare pentru culorile ale cror numr este rezultatul
scderii lui 255 din codul utilizat. Punctele pot fi date 2D sau 3D, iar cu
ajutorul unei matrici de transformare pot fi recalculate (ca n exemplu).
Tablet
Funcia folosete la calibrarea tabletei grafice.
Sintaxa:(tablet cod [pct1 pct2 pct3 Directie])
Codul 0 permite memorarea calibrrii curente.
Codul 1 permite calibrarea conform punctelor indicate.

5.16 Funcii care


memorie

monitorizeaz

spaiul

de

Aceste funcii au un impact mai mare atunci cn programele


AutoLISP sunt rulate pe platforme slabe i necesit o alocare
optimizat.
Alloc
Funcia aloc mrimea segmentelor ntr-un numr limitat de
noduri.
5-75

Ovidiu Alupei-Cojocariu
Sintaxa:(alloc intreg)

AutoLISP - Manual de programare

Expand
Funcia ncearc s ncarce numrul indicat de segmente
(realizate cu alloc). Returneaz cte a ncrcat.
Sintaxa:(expand numar)
Gc
Funcia gc (Garbage Collection) descarc nodurile HEAP.
Sintaxa:(gc)
Funcia necesit timp i nu va fi apelat dect n cazuri
speciale.
Mem
Funcia afieaz un mesaj conform cu starea memoriei.
Sintaxa:(mem)
Mesajul poate fi :
Nodes: 1542
Free nodes: 94
Segments: 3
Allocate: 514
Collection: 4
Nil
Unde
Nodes - noduri rezervate = segment*alocate
Free nodes - numrul nodurilor libere
Segments - numrul segmentelor alocate
Allocate - mrimea spaiului alocat
Collection - mrimea Garbage Collection
Vmon
Funcia monitorizeaz i activeaz spaiul memoriei virtuale.
5-76

Ovidiu Alupei-Cojocariu
Sintaxa:(vmon)

AutoLISP - Manual de programare

Aceast funcie nu mai este necesar, a fost ns pstrat din


motive de compatibilitate.

5.17 Funcii legate de apelul de aplicaii externe


Funciile externe EXSUBR sunt generate n medii
independente de programare i sunt compilate mpreun cu bibliotecile
de funcii de dezvoltare puse la dispoziie dezvoltatorilor de programe
sub AutoCAD de ctre AutoDesk.
Fuciile externe sunt de tip ADS sau ARX
Pentru acestea n AutoLISP sunt puse la dispoziie cte un set
de funcii care ncarc sau descarc funcii externe.
Pn la R13 sunt utilizate funcii externe ADS, ulterior cele
tip ARX
Ads
Funcia returneaz lista aplicaiilor ADS ncrcate.
Sintaxa:(ads)
Arx
Funcia returneaz lista aplicaiilor ARX ncrcate.
Sintaxa:(ads)
Xload
Funcia ncarc o aplicaie ADS.
Sintaxa:(xload "nume_aplicatie")
Funcionare asemntoare cu load.
Arxload
Funcia ncarc o aplicaie ADS.
Sintaxa:(arxload "nume_aplicatie")
Funcionare asemntoare cu load.
Xunload
5-77

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia ncarc o aplicaie ADS.
Sintaxa:(xunload "nume_aplicatie")
n cazul n care funcia nu a fost ncrcat se genereaz un
mesaj de eroare "Aplicaia xxx nu a fost ncrcat".
Este permis descrcarea unei singure funcii externe la un
apel.

Arxunload
Funcia ncarc o aplicaie ADS.
Sintaxa:(arxunload "nume_aplicatie")
n cazul n care funcia nu a fost ncrcat se genereaz un
mesaj de eroare "Aplicaia xxx nu a fost ncrcat".
Este permis descrcarea unei singure funcii externe la un
apel.

5.18 Funcii care controleaz ferestrele de dialog


Ferestrele de dialog permit depirea barierei de exprimare
reprezentat de limitarea la zona de comand.
ngustimea acestei zone i dezvantajul lipsei unei atenii
distributive conduc la aplicaii deficitare din acest punct de vedere. Nu
este de ajuns dac privim i prin prisma volumului de date posibil afi
transmise i validate.
Dialogul vizual permite o personalizare deosebit a aplicaiei
i i confer chiar o "fa comercial".
Posibilitile de realizare a dialogului au fost pn la
versiunile sub Windows legate strict de utilizare sistemului DCL
(Dialogue Control Language). Acest limbaj permite implementarea
independent de platforma de lucru (AT, MAC, Staii grafice) a unor
proceduri care descriu serie de elemente vizuale de introducere de
date: butoane, cursoare, liste , imagini.
Apariia sa odat cu R12 a constituit o adevrat emulaie n
rndul programatorilor dezvoltatori, necesitatea promovrii unui dialog
de calitate fiind imperios necesar.
5-78

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Fiierul scris n acest cod este interpretat de AutoCAD i
create legturi soft cu aplicaiile pentru care au fost proiectate.
AutoLISP permite prin intermediul acestei clase de funcii
controlul acestor ferestre de dialog i a dialogului n general, colectarea
de informaii i procesarea acestora.

Funciile sunt mprite la rndul lor dup obiectivele lor:

Funcii de deschidere i nchidere a ferestrelor de dialog

Funcii de manipulare a zonelor i atributelor

Funcii de manipulare a casetelor i menu-urilor de listare

Funcii de manipulare a zonelor cu imagini

Funcii de manipularea datelor specifice aplicaiei

Done_dialog
Funcia nchide dialogul ntr-o fereastr de dialog.
Sintaxa:(done_dialog [mod])
Done_dialog trebuie apelat n cadrul unei funcii de aciune
tip action_tile.
Modul apelat este un numr ntreg pozitiv i este returnat ctre
funcia start_dialog ca alternativ la 1 ->OK sau 0 ->Cancel.
Semnificaia acestui numr este setat de dvs. n aplicaie.
Funcia returneaz o list ce exprim un punct 2D ca poziie a
casetei de dialog prsite. Se poate utiliza acest punct spre a fi cedat
unei funcii start_dialog ulterioare pentru a se deschide n acest punct o
nou fereastr de dialog.
Valoarea explicit a lui mod pentru prsirea cu acceptare a
dialogului desfurat este 1 (implicit este 0).
Folosirea butoanelor de tip "accept "(OK) sau "cancel"
(Cancel) impune utilizare lui done_dialog. n caz contrar, fereastra
rmne "agat" i programul se blocheaz (bucl infinit de dialog).
Load_dialog
Funcia ncarc un fiier DCL.
Sintaxa:(load_dialog "fisier_dcl")
5-79

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
"fisier_dcl" reprezint un nume de fiier complet definit,
inclusiv prin calea ctre el. Extensia .dcl este considerat ca fiind
implicit.
Funcia returneaz o valoare ntreag, pozitiv care identific
fiierul DCL deschis. Dac valoarea este negativ, deschiderea
fiierului a euat.
Valoarea este de dorit a fi pstrat ntr-o variabil pentru a fi
folosit ca handle la descrcarea dialogului cu unload_dialog sau la
comutarea pe un subdialog cu new_dialog.
Complementara ei este unload_dialog.
Este permis ncrcarea mai multor fiiere DCL folosind
apeluri multiple ale funciei.
New_dialog
Funcia deschide o nou fereastr de dialog i o lanseaz
dndu-i i aciunea implicit.
Sintaxa:(new_dialog nume dcl_id [actiune [punct_ecran]])
Nume reprezint o etichet DCL care identific un dialog.
Actiune este o expresie AutoLISP ce trebuie aplicat automat
la deschidere dac folosim argumentul punct_ecran. Poate fi i "" ca
aciune nil.
Punct_ecran reprezint pozionarea casetei de dialog. Uzual se
d punctul stnga-sus al casetei, dar ele este dependent de platform
(inclusiv rezoluia setat a ecranului).
Dac deschiderea reuete se returneaz T, altfel nil.
Apelul funciei trebuie fcut nainte de start_dialog, ntre ele
fiind concentrate toate funciile care seteaz valorile zonelor (tiles),
iniiaz seturile de valori i le asociaz cu zonele corespunztoare.
Trebuie verificat ntotdeauna ce s-a returnat de ctre
new_dialog pentru a nu bloca aplicaia.
Este de dorit prsirea cu exit n caz c nu s-a produs o
ncrcare corect.
Exemplu:
(setq dcl_id (load_dialog "c:\\TowerCAD\\tower.dcl"))
5-80

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(if (not (new_dialog "tges_info" dcl_id)) (exit))
Start_dialog
Funcia afieaz fereastra de dialog i pornete dialogul.
Sintaxa:(start_dialog)
Este un apel consecutiv lui new_dialog , ntre ele fiind
prezente toate funciile care seteaz, atribuie valorile zonelor de dialog.
Caseta de dialog rmne afiat pn cnd o funcie de retur
apeleaz done_dialog.
Funcia nu are argumente i returneaz numrul transmis ei de
done_dialog , 1 pentru OK, 0 pentru Cancel i -1 dac toate casetele de
dialog au fost terminate cu term_dialog.
Term_dialog
Funcia abandoneaz toate casetele de dialog curente.
Sintaxa:(term_dialog)
este folosit n primul rnd pentru abandonarea casetelor de
dialog imbricate (una din cealalt).
n mod normal, AutoCAD nchide toate casetele de dialog la
ntreruperea sau ncheierea programului.
Casetele imbricate trebuie nchise ns pe rnd n ordinea
cerut de utilizator.
Unload_dialog
Funcia descarc un fiier DCL.
Sintaxa:(unload_dialog dcl_id)
dcl_id este un identificator de fiier DCL dechis anterior cu
load_dialog
Action_tile
Funcia seteaz modul de aciune al unei zone de dialog.
Sintaxa:(action_tile "nume_zona" "actiune")
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon.
5-81

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
"actiune" reprezint un ir care va fi preluat n cazul
exploatrii acelei zone , va fi interpretat i va fi executat.
Exemplu:
(action_tile "tlist2" "(setq fl1 (nth (read $value) lmes))")
Expresia se refer de obicei la valori speciale posibil a fi
transmise prin aciunea voit sau implicit.
Acestea sunt:
Variabil

Semnificaie

$value

valoare curent a zonei

$key

numele su

$data

date specifice setate prin client_data_tile

$reason

motivul de apel

$x sau $y

coordonatele de buton a imaginei

Get_attr
Funcia preia valoarea DCL a unui atribut al unei ferestre de
dialog.
Sintaxa:(get_attr "nume_zona" "atribut")
"nume_zona" este numele DCL al zonei
"atribut" este numele atributului din fiierul DCL
irul returnat este chiar ce setat n fiierul DCL i nu se ine
seama de setrile ulterioare survenite prin dialog sau apleul funciei
set_tile.
Get_tile
Funcia returneaz valoarea curent setat unei zone prin
rularea dialogului.
Sintaxa:(get_tile "nume_zona" )
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon.
5-82

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
Mode_tile
Funcia seteaz modul de reprezentare pentru o zon de
dialog.
Sintaxa:(mode_tile "nume_zona" Mod)
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon.
Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
Modul este descris n urmtorul tabel:
Mod

Descriere

Autorizeaz zona

Dezactivare zon

Focalizare zon

Selectare coninut zon

Comut imaginea pe subliniere sau normal

Set_tile
Funcia seteaz valoare unei zone de dialog.
Sintaxa:(set_tile "nume_zona" "valoare")
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon.
Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
Valoarea este aplicat succesiv, peste valoarea implicit
atribuit iniial.
Valoarea este specific tipului de zon de dialog i este un ir.
Add_list
5-83

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Funcia adaug un ir la o list ce este afiat ntr-o zon de
tip list_box sau popup_list.
Sintaxa:(add_list "sir")
Lista trebuie iniializat anterior cu start_list.
Exemplu:
(setq lista '("ianuarie" "februarie" "martie"))
(start_list "Luni")
(mapcar 'add_list lista)
(end_list)
sau
(start_list "Luni" 1 1)
(add_list "Faurar")
(end_list)
Al doilea exemplu seteaz al doilea simbol din list
nlocuindu-l cu o nou valoare.
End_list
Funcia ncheie atribuirea valorilor ntr-o zon list .
Sintaxa:(end_list)
Start_list
Funcia iniiaz secvena de atribuire a valorilor dintr-o zon
list.
Sintaxa:(start_list "nume_zona" [ Operatie [index]])
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon.
Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
Operatie

Semnificaie

Schimb coninutul zonei

Adaug noua valoare la list


5-84

Ovidiu Alupei-Cojocariu
3

AutoLISP - Manual de programare

terge lista veche i creaz o list nou (implicit)

Indexul este ignorat cu excepia operaiei 1 de nlocuire.


Valorile indexului ncep cu 0 (poziia 0, valoare implicit).
Dimx_tile
Funcia returneaz valoarea dimensiunii x a ferestrei de
dialog, exprimate n uniti specifice.
Sintaxa: (dimx_tile "nume_zona")
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon. Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
Coordonatele sunt folosite pentru a putea utiliza funcii de
desenare n zonele specifice imaginilor: vector_image, fill_image i
slide_image.
Valorile returnate sunt decrementete cu 1 fa de valorile
maxim ocupate de zona investigat.

Dimy_tile
Funcia returneaz valoarea dimensiunii y a ferestrei de
dialog, exprimate n uniti specifice.
Sintaxa: (dimy_tile "nume_zona")
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon.
Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
Coordonatele sunt folosite pentru a putea utiliza funcii de
desenare n zonele specifice imaginilor: vector_image, fill_image i
slide_image.
Valorile returnate sunt decrementete cu 1 fa de valorile
maxim ocupate de zona investigat.
End_image
Funcia nchide descrierea zonei imagine.
5-85

Ovidiu Alupei-Cojocariu
Sintaxa:(end_image)

AutoLISP - Manual de programare

Funcia este complementara lui start_image


Exemplu:
(setq v1 (dimx_tile "imag1")
v2 (dimy_tile "imag1")
)
(start_image "imag1")
(slide_image 0 0 v1 v2 "c:\\TowerCAD\\master")
(end_image)
Fill_image
Funcia deseneaz ntr-o zon de dialog de tip imagine un
dreptunghi colorat, umplut.
Sintaxa:(fill_image x1 y1 x2 y2 culoare)
x1,y1 - colul stnga sus; x2,y2 - colul dreapta jos
culoare - numr ntreg care descrie culoarea n AutoCAD
Alte culori:
-2

Culoarea de fundal curent a ecranului

-15

Culoarea de fundal a casetei de dialog curente

-16

Culoarea textului din caseta de dialog

-18

Culoarea liniilor din caseta de dialog curent

Pentru obinerea coordonatelor punctelor se pot utiliza


funciile dimx_tile, dimy_tile.
Slide_image
Funcia permite afiarea n zona imagine a unui SLIDE.
Sintaxa:(slide_image x1 y1 x2 y2 "nume_slide")
"nume_slide" - este un ir care descrie complet poziia
fiierului .sld
x1,y1 - colul stnga sus
5-86

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
x2,y2 - colul dreapta jos
Pentru obinerea coordonatelor punctelor se pot utiliza
funciile dimx_tile, dimy_tile.
Start_image
Funcia lanseaz o secven de descriere a unei zone tip
imagine.
Sintaxa:(start_image)
Vector_image
Funcia deseneaz un vector ntre dou puncte descrise n
coordonatele unei zone de dialog de tip imagine.
Sintaxa:(vector_image x1 y1 x2 y2 culoare)
Culoarea respect codificarea AutoCAD sau o culoare logic:
-2

Culoarea de fundal curent a ecranului

-15

Culoarea de fundal a casetei de dialog curente

-16

Culoarea textului din caseta de dialog

-18

Culoarea liniilor din caseta de dialog curent

x1,y1 - colul stnga sus


x2,y2 - colul dreapta jos
Pentru obinerea coordonatelor punctelor se pot utiliza
funciile dimx_tile, dimy_tile.
Client_data_tile
Funcia seteaz valoarea unei zone de dialog cu date dorite.
Sintaxa:(client_data_tile "nume"zona" "valoare")
"nume_zona" reprezint un cuvnt-cheie care identific acea
zon.
Acesta este prezent n fiierul DCL i trebuie s fie identic cu
argumentul apelant (inclusiv majuscule sau minuscule).
O expresie de aciune sau un apel de funcie poate referi irul
ca $data.
5-87

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Programarea ferestrelor de dialog

Limbajul DCL (Dialogue Control Language) a fost introdus


pentru a da posibilitatea dezvoltatorilor de programe s elaboreze
ferestre de dialog independente de platforma pe care se lucreaz (DOS,
Windows, Mac, UNIX).
Dialogul are loc prin interaciunea utilizatorului cu informaii
rezidente n diferite zone de dialog (tiles), oferindu-se posibilitatea
alegerii unor informaii preexistente sau a introducerii unora noi.
Valorile introduse sunt acceptate i interpretate ca iruri, tratarea lor
ulterioar fiind n acord cu acest tip.
Descrierea unui dialog are la baz scrierea unui fiier de
definiii unde sunt prezente toate informaiile necesare construirii i
exploatrii ferestrelor de dialog.
Limbajul DCL folosete o descriere structural a casetelor de
dialog, elementele componente putnd fi grupate n clustere,
dimensionate, aliniate, etc..
Fiecare zon de dialog are n componen atribute ce vor fi
setate n conformitate cu dorinele utilizatorului. Nu toate aceste
atribute sunt absolut necesare descrierii i funcionrii unei zone de
dialog, multe dintre ele fiind implicite sau corelate ntre ele.
Experiena programatorului l va conduce al dezvoltarea
abilitii conceperii i exploatrii performante a casetelor de dialog.

6.1

Prezentarea sintaxei

Se prezint n continuare sintaxa DCL pentru zonele de


dialog, atributele acestor zone i valorile acestor atribute.
Noile zone sunt create prin definiii. Dac definiia unei zone
apare n afara unei definiii de zon de dialog, ea este un prototip sau
un subansamblu. Prototipurile sau subansamblurile pot fi utilizate n
definiiile zonelor de dialog ca referine. Fiecare referin motenete
atributele zonei originale. Cnd referim un prototip, putei schimba
valorile atributelor motenite sau s adugai atribute noi. Cnd referii
subansambluri, nu putei schimba sau aduga atribute .
6-1

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Dac avei nevoie de mai multe zone cu atribute comune, este
cel mai uor s definii i denumii un prototip care s conin doar
atributele comune. Apoi, n fiecare referire la prototip, putei schimba
atributele sau s adugai altele noi, dar nu trebuie s listai toate
atributele comune de fiecare dat.
Fiierele acad.dcl i base.dcl conin definiii de zone de dialog
ce se utilizeaz n programare. Nu modificai aceste definiii pentru a u
da peste cap funcionarea casetelor de dialog n AutoCAD. Dac ai
fcut deja acest lucru, procurai-v o copie original a acestui fiier i
nlocuii-l pe cel deteriorat.
Definirea de zone de dialog
Definirea zonelor are urmtoarea form general:
nume : item1 [ : item2 : item3 ... ] {
atribut = valoare;
...
}
unde fiecare item este o zon definit anterior. Noua zon
(nume) va moteni atributele tuturor zonelor specificate (item1, item2,
item3,...). Definiiile de atribute situate ntre acolade ({}) fie vor
suplimenta, fie, dac numele atributelor sunt identice, vor nlocui
definiiile motenite. Dac definiia are paranteze multiple, atributele
vor avea preceden n ordine de la stnga la dreapta. Cu alte cuvinte,
dac una sau mai multe itemuri specific aceleai atribute, va fi preluat
i utilizat primul ntlnit.
Dac o definiie nou nu conine copii ("childrens"), este un
prototip i putei s-I modificai sau s-I sporii atributele cnd l
referii. Dac este un subansamblu cu copii, atributele sale nu pot fi
modificate.
Numele unei zone sau al unui prototip poate conine doar
litere, numere, sau caracterul "_" i trebuie s nceap cu o liter.
Atenie: numele zonelor sunt testate i sunt "CASE-Sensitive".
Numele scris cu majuscule i minuscule trebuie s fie identice att n
definiie ct i n funciile de control apelante.
Aceasta este o definiie a unui button:
6-2

Ovidiu Alupei-Cojocariu
button : tile {

AutoLISP - Manual de programare

fixed_height = true;
is_tab_stop = true;
}
Fiierul base.dcl descrie un buton implicit implicit_button)
astfel:
implicit_button : button {
is_implicit = true;
}
"Implicit_button" motenete valorile de la zona "button"
pentru atributele "fixed_heigth" (nlime fixat) i "is_tab_stop"
(activat prin navigarea cu tab). Va aduga un nou atribut "is_implicit"
(este implicit) i l seteaz cu "true" (adevrat).
Zonele referite
Zonele de dialog referite au una din formele urmtoare:
nume;
sau
: nume {
attribute = value;
...
}
unde numele este acelai cu al unei zone definite anterior.
ntr-o prim faz toate atributele definite n "nume" sunt incorporate
ntr-o referin. n faza urmtoare, definiiile de atribute ntre acolade
fie suplimenteaz , fie nlocuiesc definiiile furnizate de "nume".
Deoarece aceasta este o zon referin, modificrile sunt valabile doar
definiiei zonei curente.
Atenie: Formatul unei zone urmtoare se poate referi doar la
prototipuri, nu la subansambluri

6-3

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Zona "spacer" este utilizat pentru a realiza o zon liber n
definiia unei zone de dialog. Ea nu are atribute unice aa nct
referirea la ea este direct prin numele su:
spacer;
zona "ok_cancel" definit n base.dcl este un subansamblu,
aa nct poate fi referit doar prin numele su:
ok_cancel;
Pe de-alt parte, avei opiunea redefinirii atributelor unei
zone individuale. De exemplu, declaraia urmtoare creeaz un buton
cu aceleai proprieti cu cel definit anterior, dar cu un text diferit:
: retirement_button {
label = "Goodbye";
}
Sintaxa descrierii atributelor i a valorilor acestora
ntre acoladele ({}) unei definiii de zone sau referine, putei
specifica atribute i asocia valori acestora utiliznd formularea
urmtoare:
atribut = valoare ;
unde, "atribut" este un cuvnt-cheie valid i "valoare" este
valoarea asociat atributului. Semnul egal (=) separ numele atributului
de valoare, iar ";" finalizeaz declaraia. Cuvntul "atribut" trebuie s
fie identic cu cel utilizat n programul care controleaz dialogul, iar
atributul "label" definete textul care va fi nscris n zona de dialog.
Scrierea de comentarii
O instruciune precedat de grupul de semne "//" este tratat n
DCL ca un comentariu. Tot ceea ce este cuprins ntre acest grup i
sfritul liniei este ignorat. DCL accept ca i C stilul de comentare cu
"*/". Aceste comentarii au forma "/* text comentariu */" .
Comentariul poate continua n acest caz pe mai multe rnduri.

6.2

Componentele unei ferestre de dialog

Figura urmtoare prezint o caset de dialog AutoCAD


standard, unele din componentele sale fiind evideniate.
6-4

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Se observ organizarea pe 3 coloane (columns) , fiecare din


primele dou fiind ncadrat (boxed_column). Coloana a treia este
divizat n 2 boxed_rows.
n prima coloan avem o coloan de elemente numite "toggle"
, zone ce pot fi marcate logic .
Coloana a doua are n componen un "toggle" i mai multe
"edit_box".
Coloana a treia compus din dou "boxed_row" , fiecare
subdivizat . Partea de jos are de exemplu un "toggle" i un
"radio_buttons".
n sfrit, n
ok_cancel_help_errtile "

partea

de

jos

este

un

prototip

"

Labelul dialogului este "Drawing Aids".


Iat cum arat un extras din fiierul acad.dcl care conine
descrierea acestei ferestre de dialog.
acad_snap : dialog {
label = "Drawing Aids";
: row {
: column {
: boxed_column {
label = "Modes";
6-5

Ovidiu Alupei-Cojocariu
: toggle {

AutoLISP - Manual de programare

label = "&Ortho";
key = "ortho";
}
: toggle {
label = "Solid &Fill";
key = "fill";
}
: toggle {
label = "&Quick Text";
key = "qtext";
}
: toggle {
label = "&Blips";
key = "blips";
}
: toggle {
label = "Hi&ghlight";
key = "hilite";
}
: toggle {
label = "Gro&ups";
key = "group";
}
: toggle {
label = "Hat&ch";
key = "hatch";
}
6-6

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

}
}
: boxed_column {
label = "&Snap";
: toggle {
label = "On";
key = "snap";
}
: edit12_box {
label = "&X Spacing";
key = "s_xsp";
errmsg = "Snap X Spacing";
}
: edit12_box {
label = "&Y Spacing";
key = "s_ysp";
errmsg = "Snap Y Spacing";
}
: edit12_box {
label = "Snap A&ngle";
key = "s_ang";
errmsg = "Snap Angle";
}
: edit12_box {
label = "X B&ase";
key = "xbase";
errmsg = "Snap X Base";
6-7

Ovidiu Alupei-Cojocariu
}

AutoLISP - Manual de programare

: edit12_box {
label = "Y Bas&e";
key = "ybase";
errmsg = "Snap Y Base";
}
}
: column {
: boxed_column {
label = "Gri&d";
fixed_height = true;
: toggle {
label = "On";
key = "grid";
}
: edit12_box {
label = "X S&pacing";
key = "g_xsp";
errmsg = "Grid X Spacing";
}
: edit12_box {
label = "Y Spac&ing";
key = "g_ysp";
errmsg = "Grid Y Spacing";
}
}
: boxed_column {

6-8

Ovidiu Alupei-Cojocariu
label
Grid";

AutoLISP - Manual de programare


=
"Iso&metric
Snap

: toggle {
label = "On";
key = "iso";
}
: radio_row {
key = "isorad";
: radio_button {
label = "&Left";
key = "ileft";
}
: radio_button {
label = "&Top";
key = "itop";
}
: radio_button {
label = "&Right";
key = "iright";
}
}
}
}
}
ok_cancel_help_errtile;
}
Scrierea indentat uureaz citirea definiiei zonelor de dialog.

6-9

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Exemplul ales este complex i necesit ceva efort n
descifrare. Dup un timp vei reui chiar s concepei astfel de ferestre
de dialog.
O fereastr de dialog este constituit din caset i zonele
(tiles) din ea. Principalele tipuri de zone au fost prezentate n figur i
sunt predefinite prin facilitatea casetelor de dialog programabile
(Programmable Dialog Box PDB).
Putei crea casete de dialog complexe, numite subansambluri,
grupnd zonele n rnduri i coloane, bordndu-le sau nu. Un rnd sau
o coloan este referit ca un cluster. Subansamblurile definesc grupuri
de zone sau clustere care pot fi utilizate n multe casete de dialog. De
exemplu, butoanele "OK", "Cancel" i "Help" sunt grupate ntr-un
subansamblu descris ca un cluster rnd (row)de trei butoane cu o serie
de spaii ntre ele i cu o zon sub ele pentru scrierea unui mesaj de
eroare.
Subansamblurile sunt tratate ca o singur zon. Zonele
cuprinse n ele sunt numite copii ("children"). Fiierele DCL sunt
organizate n trei structuri. La nceput este o zon de dialog care
descrie caseta de dialog nsi. Diagrama urmtoare arat structura unui
fiier DCL.

Subansamblul
Ok_Cancel

Poziia, aparena i comportamentul unei zone


subansamblu sunt specificate n DCL prin atributele zonelor.

6-10

sau

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
De exemplu, caseta de dialog are o zon numit "label" prin
care se personalizeaz denumirea casetei, fiecare zon avnd astfel de
informaii prin care se poate "reboteza" zona respectiv.
DCL v permite s definii noi zone, numite prototipuri care
nu sunt neaprat asociate cu o anumit fereastr de dialog. Acest lucru
este util cnd dorii s utilizai aceeai component n mai multe casete
de dialog. Putei referi zonele prototip din alte fiiere DCL i s le
schimbai atributele n acelai mod n care schimbai zonele predefinite.
nainte de a programa o caset de dialog, planificai n detaliu
att caseta de dialog ct i programul care o conduce, nainte de a o
scrie i a o testa. Necesitatea de a anticipa modul preferat de lucru al
utilizatorului impune adesea un efort de programare, dar efectul se va
vedea printr-o utilizare foarte eficient i ergonomic.

6.3

Fiierele acad.dcl i base.dcl

Fiierele base.dcl i acad.dcl sunt incluse n AutoCAD i sunt


distribuite n directorul AutoCAD Support.
Fiierul base.dcl prezint definiiile DCL pentru zonele de
dialog predefinite i tipuri de zone de dialog. Conine de asemenea
definiii pentru cele mai uzuale prototipuri de zone de dialog.
Facilitatea PDB nu v permite s redefinii zonele de dialog
predefinite. Fiierul acad.dcl conine definiiile standard pentru toate
casetele de dialog utilizate de AutoCAD.
Atenie: Orice erori n base.dcl poate afecta modul de lucru al
casetelor de dialog standard din AutoCAD sau din aplicaiile dvs.

6.4

Referirea fiierelor DCL

Cnd creai casete de dialog, trebuie s creai la nceput un


fiier DCL nou al aplicaiei dvs. Toate fiierele DCL pot utiliza zonele
definite n base.dcl . Un fiier DCL poate utiliza zone definite n alt
fiier DCL prin invocarea acestuia ntr-o directiv de includere. V
putei crea propria dvs. ierarhie de includere aa cum se poate vedea n
figur.

6-11

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

n aceast figur, user1.dcl i user2.dcl sunt independente


ntre ele, ns user3.dcl utilizeaz zone de dialog definite n user1.dcl.
Directiva include are forma:
@include "nume_fiier"
De exemplu:
@include "usercore.dcl"
dac e specific doar numele fiierului ruinele PDB caut nti
n directorul curent, apoi n directorul fiierului DCL. Dac specificai
calea PDB o va folosi pe aceasta.
Atenie: fiierele DCL create de Dvs. nu pot utiliza casetele de
dialog definite n acad.dcl. Nu putei scrie @include "acad.dcl".
Oricum, dac dorii s creai casete de dialog similare putei
copia definiii din acest fiier n al Dvs..

6.5

Principii de proiectare a casetelor de dialog

Estetic i ergonomie
Aspectul casetei de dialog este important. Dac caseta este
prea ncrcat, este ineficient i greu de utilizat. Aadar. Zonele
trebuie s aranjate astfel nct s fie uor de utilizat. Vedei care zone
sunt cel mai des utilizate, facei-le proeminente prin aspect i aranjaile astfel nct s se poat face uor deplasarea ntre ele, mai ales dac
se utilizeaz n tandem.
Proiectare consecvent i limbaj adecvat
Interfaa cu utilizatorul trebuie s fie asociat aplicaiei creia
a fost destinat. O caset de dialog inedit este mai uor de neles dac
proiectarea sa este firesc legat de domeniul aplicaiei de contextul
general al casetelor asociate. Un exemplu l constituie plasarea
6-12

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
butoanelor "OK" i "Cancel". Conform cu obinuina din AutoCAD ele
sunt plasate central n partea de jos, sunt accesibile i mai mult, ne
ateptm s fie acolo. Pentru a atinge aceste automatisme este de dorit
de aceea s reutilizm definiii de zone asigurnd astfel coerena n
utilizarea lor.
Standardizarea contribuie i ea la cptarea omogenitii.
Utilizai definiii standard pentru casete de dialog. Aceasta v reduce
munca i constituie un ajutor pentru programatorii nceptori.
Utilizai un limbaj clar. Casetele de dialog sunt literare dei
fac parte dintr-un mediu grafic. Alegerea titlurilor zonelor, denumirea
butoanelor, formularea mesajelor trebuie s fie directe nu ambigue.
Evitai jargonul i termenii tehnici pe care utilizatorul s-ar putea s nu
i neleag.
Libertate de aciune utilizatorului
Dai utilizatorului posibilitate de manevr cnd acceseaz o
caset de dialog i introduce valori. Un avantaj fa de dialogul pe linia
de comand este faptul c utilizatorul nu trebuie s respecte strict o
anumit ordine de rspunsuri. Dai-I posibilitatea s introduc valori n
orice ordine. Unele constrngeri sunt necesare atunci cnd selectarea
unei opiune le face pe celelalte imposibil de urmat. Nu exagerai n
constrngeri altele dect cele cerute imperios de aplicaie.
Casetele de dialog multiple trebuiesc parcurse astfel nct s
permit utilizatorului s se ntoarc sau s prseasc la dorin ntregul
dialog. Nu uitai c o secven de mai mult de trei casete deschise
consecutiv este dificil de controlat de utilizator (unii uit ce comand
folosesc).
Oricnd utilizatorul poate s fac schimbri n starea casetei
de dialog asiguraii o reacie corespunztoare, aducnd toate
modificrile asociate acesteia.
Iertai greelile
Facei casetele dvs. de dialog s ierte greelile pentru a fi mai
uor de explorat fr a se face greeli ireversibile. Raportai erorile
minore prin mesaje ntr-o zon de dialog text la baza ferestrei.
Raportai mai multe erori serioase ntr-o caset de alert (alert box). Ea
are doar un simplu buton "OK" i nu va produce prsirea dialogului.
La revenire setai din nou zonele eronat alimentate cu setul de date
implicit pentru ca utilizatorul s reia introducerea, de data asta corect.
6-13

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Dac utilizatorul selecteaz un drum periculos sau posibil
generator de mari ntrzieri, dai utilizatorului un mesaj "alert" n care
s i explicai ce are de fcut sau s i dai posibilitatea s anuleze
operaia.
Ferestrele de dialog care semnaleaz probleme trebuie s se
ntoarc n dialogul precedent. Terminai automat dialogul respectiv
doar n cazul unor greeli fatale.
Asigurai "Help"
Trebuie s asigurai utilizatorul ajutorul necesar. Nivelul
informaiei de ajutor pe care o putei asigura depinde de ct de
complex este aplicaia i ct de sugestive sunt casetele dvs.. Cel puin,
este recomandat ca fereastra de dialog principal s aib un buton
"Help" care afieaz o caset simpl de dialog cu informaii de baz.
Dac aplicaia este mai sofisticat dezvoltai un "Help"
complet senzitiv cu mai multe casete de dialog, fiecare asociat cu
casetele dvs..
Utilizatori cu probleme
Dac avei n vedere posibilitatea existenei unor utilizatori
mai puin abili, putei scrie o caset pe care o poate utiliza oricine.
Considerai urmtoarele aspecte:
Culoarea
Muli oameni nu pot distinge diferena ntre anumite culori.
Dac folosii un mijloc vizual de informare (o poz ), asigurai i o
informare alternativ printr-un text.
De exemplu dialogul de stabilire a culorii curente este nsoit
de obicei de explicitarea codului culorii stabilite.
Help Online
Muli utilizatori au dificulti n citirea textelor de mici
dimensiuni n cri sau manual. Chiar i un simplu buton de help poate
fi de folos.
Acces de la tastatur
Unii utilizatori au dificulti sau chiar nu pot folosi un mouse
sau o tablet. ncercai s specificai o mnemonic astfel nct casetele
de dialog s fie utilizate i doar cu tastatura.
Claritate i simplitate
6-14

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Un limbaj clar i accesibil poate fi de folos utilizatorilor cu
probleme de nelegere sau cu dificulti n exprimare. Nu forai
utilizatorul s-i aminteasc felurite lucruri. Utilizai o terminologie
precis i accesibil.
Utilizarea literelor mari
Titluri
Subliniai cu litere mari primul , ultimul cuvnt i orice alt
cuvnt cu excepia articolelor, prepoziiilor i a conjunciilor
coordonative. Dac fereastra de dialog este chemat dintr-un meniu,
potrivii titlul cu eticheta de meniu apelant.
Etichete de control
Utilizai cuvinte care ncep cu litere mari pentru etichete de
butoane. ncheiai cuvntul cu":" pentru a-I da un sens imperativ
Mesaje i ntrebri
Utilizai litere mari doar la nceputul frazelor.
Evitai abrevierile
Abrevierile pot fi ambigue i pot fi dificil de tradus. Dac
spaiul este mic i nu putei fr a abrevia termeni, abreviai n cazul
unui grup la fel. Nu abreviai unii termeni i pe alii nu.
Poziia zonelor
Aranjai logic seciunile n rnduri i coloane aa nct
utilizatorul s le poat parcurge de la stnga la dreapta sau de sus n
jos. Aliniai cmpurile orizontal i vertical astfel navigarea cu TAB s
se fac n linie dreapt , fr erpuire.
Cmpurile omoloage aranjai-le similar. Aliniai cmpurile cu
chenar att orizontal ct i vertical. Nu lsai mult spaiu gol n jurul
sau ntre aceste chenare. Extindei limea lor ctre dreapta dac este
necesar.
Mrime i plasament
Pentru afiarea clar a informaiilor nu facei caseta de dialog
mai mare dect este necesar.
Nu uitai: Utilizatorii pot avea o rezoluie a ecranului mai
mic (640x480). Dac realizai o fereastr de dialog utiliznd o
6-15

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
rezoluie mai mare, nu uitai s verificai funcionarea ei i pe rezoluii
mai slabe.
Implicit AutoCAD afieaz casetele de dialog centrate pe
ecran. Putei specifica o poziie diferit prin intermediul funciilor de
control al dialogului new_dialog i done_dialog.
Dezactivarea zonelor de dialog
Dac o zon sau mai multe devin irelevante n contextul
setrilor curente, dezactivai-le imediat astfel nct utilizatorul s nu le
poat folosi. Avei ns grij s nu exagerai. Prea multe zone
dezactivate pot zpci utilizatorul.
Dac o zon afieaz o valoare, dezactivarea zonei nu trebuie
s afecteze valoarea. Ea trebuie s afieze aceeai valoare la reactivare.
Valorile care se modific prin farmec sunt foarte uluitoare pentru
utilizator , l pot plictisi sau dezorienta.
Cuplarea casetelor de dialog
AutoCAD limiteaz numrul de casete de dialog apelate
consecutiv la opt.
Introducei grupul "" n eticheta-titlu a unei casete de dialog
atta timp ct caseta apelat nu e de tip alert. Nu chemai mai mult de
trei casete consecutive. Patru niveluri de imbricare sunt suficiente atta
timp ct ultimul nivel este constituit din casete de alert. Facei casetele
de dialog consecutive din ce n ce mai mici aa nct s nu le acopere
complet pe celelalte.
Ascunderea casetelor de dialog
Dac utilizatorul trebuie s fac selecii de pe ecran nainte de
nchiderea casetei de dialog putei s nchidei momentan caseta de
dialog pentru a permite utilizatorului s fac acea selecie. Odat
selecia fcut, va trebui s afiai din nou caseta de dialog. Acest lucru
nsemn ascunderea casetei de dialog.
Eticheta care va provoca ascunderea trebuie s aib cuprins
semnul "<" care s indice prsirea casetei.
n multe cazuri putei primi informaii cu funcii tip getxxx.
Aceste funcii au un argument pe care l putei folosi ca ntrebare de
conducere a dialogului.
Cnd caseta de dialog reapare, trebuie s conin modificrile
produse dup procesul de selectare. Acestea pot fi informaii noi n
6-16

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
zonele de editare, o zon list reactualizat, un mesaj text care indic
starea, sau o combinaie de acestea.
Asigurarea valorilor implicite
Asigurai seturile de valori iniiale pentru toate zonele de
dialog. Alegerea acestor valori trebuie fcut dintre cele mai des
utilizate aa nct utilizatorul s seteze la fiecare dialog ct mai puine.
Dac datele sunt corelate se poate ajunge ca utiliznd un minimum de
setri s obinem rapid configuraia de date necesare aplicaiei.
Salvai dou seturi de iniializri: unul care seteaz ca implicit
toate valorile, altul care pstreaz ultimul set de parametri configurai
de utilizator. Unele aplicaii refolosesc seturi de date personalizate de
ctre clieni. Salvarea acestora cu nume de identificare i accesul rapid
la ele (eventual cu cmpuri memo asociate) va fi o realizare deosebit.
Folosirea altor limbaje naturale n dialog
Cuvintele au n diferite limbi diferite lungimi ceea ce face ca o
caset de dialog s fie reanalizat ca poziie i aspect. Lsai ct mai
mult loc posibil ca, dup traducerea etichetelor s nu fii nevoii s
refacei substanial alinierea.

6.6

Utilizarea zonelor predefinite

Butoane "button"
Aciunea asociat cu un buton s fie vizibil utilizatorului i s
fie executat imediat. Eticheta unui buton trebuie s fie clar. Uzual,
trebuie s fie un verb care c descrie efectul apsrii sau alt cuvnt care
s explice cu claritate efectul. Pentru butoane care cheam alte casete
de dialog sau provoac ascunderea, procedai aa cum ai citit anterior.
Asocierea n "clustere"
Butoanele aflate ntr-o coloan s aib aceeai lime. n alte
cazuri butoanele s aib "fixed_width" (lime fix) (fie fixed_width
=true; sau children_fixed_width = true;) n clusterul lor comun.
Un cluster cu chenar (boxed_row sau boxed_column) este
numit grup sau arie. Aceast subliniere grupeaz n general zone de
dialog care sunt similare sau lucreaz mpreun. Pot fi utilizate cte
zone sunt necesare. Titlul trebuie s indice clar destinaia.
Dac zonele sunt legate ntre ele punei-le ntr-un chenar. Nu
abuzai de aceste grupri deoarece spaiile sunt uneori suficiente pentru
6-17

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
a despri semantic caseta de dialog. Nu punei un chenar peste o list
de tip box. Dou chenare sunt chiar prea mult.
Zonele de editare "edit_box"
Lungimea zonei de editare edit_box trebuie s fie aproximativ
egal cu lungimea unui rspuns mediu. Dac avei dubii, utilizai o
lungime de 10 caractere pentru numere reale i 20 pentru zonele de
text.
Eticheta unei zone de editare trebuie s se ncheie cu ":"
Dac exist restricii n ceea ce utilizatorul poate s introduc,
plasai o zon text la dreapta a unde putei explica pe scurt ce anume
restricii sunt. De exemplu dac utilizatorul trebuie s introduc
numele unui fiier trebuie informat s fac aceasta.
Pentru date de tip punct, asigurai dou sau trei zone de editare
n loc s forai utilizatorul s utilizeze formatul de introducere
consacrat cu ",".
Zone de tip "image" sau "image_button"
Dac utilizai o zon "image_button" sau "image" ca icon
pentru a alerta utilizatorul de exemplu , o imagine potrivit cum ar fi de
exemplu STOP este util pentru a atrage atenia.
Cnd utilizai aceste zone pentru a reprezenta selecii,
suplimentai imaginea cu un text care s le descrie pe scurt n special
cnd aciunea ulterioar este explicat prin culorile butoanelor.
Listele "List_box"
Deoarece listele DCL nu se expandeaz orizontal, limea
acestora trebuie aleas comparativ cu cel mai lung membru al listei
afiate. Asigurai un titlu potrivit sau o zon text pentru a explica
coninutul listei cu excepia momentului cnd lista este singura
component, n acest caz titlul casetei fiind suficient.
Aranjai elementele listei alfabetic cu excepia cazului cnd
aranjamentul dvs. are o logic special. Dac lungimea listei este fix
i scurt, utilizai mai bine un grup "radio_column".
Grupurile "radio_row" i "radio_column"
"Radio_column" arat mai bine i sunt mai uor de utilizat
dect "radio_rows". "Radio_row" sunt mai potrivite doar cnd conin
un numr mic de butoane (2..4) sau cnd etichetele lor sunt scurte.
6-18

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Dac o opiune n alt zon face ca modificri n grupurile
radio s fie irelevante , atunci dezactivai ntregul rnd sau coloan.
Exist ns situaii cnd trebuie dezactivate doar unele dintre butoane.
Cursoarele tip "slider"
Fineea rspunsului unui "slider" trebuie s fie nici prea mare
nici prea mic. Dac avem de setate de exemplu doar patru valori
incrementale dar cursorul este prea lung, utilizatorul trebuie s-l
deplaseze foarte mult nainte de a vedea o schimbare. Scalai lungimea
unui "slider" la dimensiuni rezonabile.
Dac utilizatorul trebuie s cunoasc valorile setate prin
cursor fereastra dvs. trebuie s afieze valoarea corespunztoare
poziiei curente a cursorului. Punei i o zon de editare unde
utilizatorul s poat scrie direct valoare pe care poate o anticipeaz.
Zonele tip "text"
Cnd atributele "label" nu sunt suficiente, utilizai zone "text"
pentru identificarea scopului zonelor individuale de dialog sau a
clusterelor. Putei utiliza de asemenea un text pentru a afia mesaje de
stare, mesaje de aducere aminte, inclusiv mesaje de eroare i
avertismente.
Textul trebuie s fie direct i fr ambiguiti. Descriei
opiunile i cmpurile de intrare n termenii pe care I-ar folosi
utilizatorii programului.
Aliniai mesajele cu titlurile zonelor de control descrise.
Plasai textul care identific un grup de zone de dialog sau o
seciune deasupra acestei zone.
Zonele de tip "toggles"
Cnd opiunile reprezentate de "toggles" au semnificaie
nrudit, grupai-le.
Utilizai un singur "toggle" care controleaz alte zone de
dialog , de obicei ntr-un grup cu ele. n acest caz, dezactivare produs
de acesta este imediat vizibil.
Tratarea erorilor
Casetele de dialog pot afia mesaje de eroare sau avertisment
cu ajutorul unei zone "text" numite "errtile", sau printr-o caset de tip
"alert".
6-19

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Mesajele de eroare trebuie s fie declaraii complete, s
nceap cu liter mare i s se sfreasc cu punct.
Mesajele de eroare trebuie s explice clar problema sau
potenialele probleme.
Dup raportarea erorii, comutai dac este posibil focalizarea
dialogului pe zona unde s-a produs eroarea.
Utilizai zona "errtile" pentru erori minore sau avertismente,
n special pentru tastri incorecte sau alte erori de introducere.
Nu afiai erorile n zone n care de obicei afiai informaii
privind starea. Acestea sunt de obicei trecute cu vederea.
Putei afia o caset standard "alert" cu un singur buton "ok"
utiliznd funcia (alert "Mesaj").
Utilizai aceste afiri pentru erori grave, potenial fatale, dar
nu facei exces. Castele "alert" necesit ca utilizatorul s fac o operaie
ca s le poat folosi ceea ce le poate face plictisitoare, mai ales cnd
raporteaz erori obscure, minore sau ascund ceea ce trebuie s facem ca
s le corectm.
Utilizai casete de tip "alert" pentru a avertiza utilizatorul c
operaia n curs de desfurare poate s distrug date sau c va
consuma mult timp. Castele de dialog de acest tip trebuie s confere
utilizatorului posibilitatea de a valida continuarea sau anularea aciunii.
O asemenea caset trebuie s o facei singur deoarece nu este un
prototip pentru ea.
Dac caseta de avertizare trebuie s cear utilizatorului s
aleag o opiune sau alta, zonele de selectare trebuie s fie amplasate
sub zonele n care se explic decizia ce trebuie s o ia acesta.
Evitai de exemplu botezarea benign, inexpresiv a
butoanelor.
Cu excepia cazului cnd eroarea este fatal, dai posibilitatea
utilizatorului s se ntoarc n caseta de dialog generatoare de eroare i
s corecteze sursa erorii.
De obicei butonul implicit ntr-o caset de avertizare este "ok"
care valideaz ceva. Poate c uneori este necesar s se genereze un
rspuns implicit diferit, de exemplu "cancel". Setai atributul operaiei
implicite "implicit_action" n conformitate cu contextul.

6-20

Ovidiu Alupei-Cojocariu

6.7

AutoLISP - Manual de programare

Atributele zonelor de dialog

Tipurile de date ale atributelor


Valorile unui atribut trebuie s aib unul din urmtoarele
tipuri de date:
ntreg
Valori numerice care reprezint distane, cum sunt limea i
nlimea unei zone sunt exprimate n limi-caracter i nlimicaracter.
Numr real
Un numr real trebuie exprimat avnd cel puin un digit
ntreg: 0.1 nu .1.
ir
Un ir const dintr-un text cuprins ntre ghilimele ("text").
Atributele sunt testate la coincidena irurilor care le descriu (case
sensitive), deci trebuie inut seama de scrierea cu litere mari i mici.
Dac irul trebuie s conin caracterul " acestea trebuie precedat de
caracterul "\" ("\).
Caractere de control admise n irurile DCL
Caracter Control

Semnificaie

\"

ghilimea

\\

backslash

\n

newline

\t

tab

Cuvinte rezervate
Un cuvnt rezervat este un identificator alfanumeric care
ncepe cu o liter. Acestea sunt case sensitive.
Nu utilizai urmtoarele atribut n fiierele dvs. DCL:

horizontal_margin

vertical_margin

type
6-21

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Tabelul atributelor predefinite


Nume atribut

Asociat cu zona

Semnificaia

action

toate

Expresie de
aciune AutoLISP

alignment

toate

Poziia hor sau ver


n cluster

allow_accept

edit_box
image_button

Activeaz
is_implicit

butonul

list_box
aspect_ratio

image
image_button

Raport L/H

big_increment

slider

Distana incremental

children_alignment

row
column
radio_row
radio_column
boxed_row
boxed_column
boxed_radio_row
boxed_radio_column

Alinierea clusterelor

children_fixed_height

row
column
radio_row
radio_column
boxed_row
boxed_column
boxed_radio_row
boxed_radio_column

nime fixat

children_fixed_width

row
column
radio_row

Lime fixat

6-22

pt. imagine

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
radio_column
boxed_row
boxed_column
boxed_radio_row
boxed_radio_column
color_image

image_button

Culoare de umplere

edit_limit

edit_box

Lungime maxim
de editare

edit_width

edit_box
popup_list

Lime de editare

fixed_height

Toate

nlime fixat

fixed_width

Toate

Lime fixat

fixed_width_font

list_box
popup_list

Font de lime fix

height

Toate

nlime

initial_focus

Dialog

Zon focalizat iniial

is_bold

Text

Afiare bold

is_cancel

Button

Buton activat cancel

is_implicit

Button

Buton activat implicit

is_enabled

Toate zonele active

Zon activat iniial

is_tab_stop

Toate zonele active

Zon tab stop

key

Toate zonele active

Nume utilizat
n aplicaie

label

boxed_row
boxed_column
boxed_radio_row
boxed_radio_column
button
dialog
edit_box
list_box
popup_list
6-23

Etichet afiat

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
radio_button
text
toggle
layout

slider

Slider hor sau ver

list

list_box
popup_list

Valori iniiale

max_value

slider

Valoare
slider

maxim

min_value

slider

Valoare
slider

minim

mnemonic

toate zonele active

Caracter mnemonic

multiple_select

list_box

Permite multipl

ale listei

selectare n list
password_char

edit_box

Mascheaz
caracterele

small_increment

slider

Distan incremental

tabs

list_box
popup_list

Tab-stop pentru

list_box
popup_list

Trunchiere text ce

Text
zonele active

Valoare iniial

tab_truncate
value

afiare liste
depete limitele

Excepie buttons i
image
width

Toate

lime

Sintaxa DCL pentru atribute


action
action = "(function)";
Specific o expresie AutoLISP ce va fi executat cnd zona
este selectat. Poart denumirea de callback . Pentru anumite zone,
6-24

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
poate avea loc o aciune atunci cnd utilizatorul focalizeaz o alt zon
de dialog.
O zon poate avea doar un singul callback. Dac aplicaia
asociaz alt callback (prin funcia action_tile) aceasta va fi cea
executat.
NOT: Nu se poate apela o funcie de tip command din acest
atribut.
alignment
alignment = position;
Specific poziionarea vertical i orizontal (alinierea) unei
zone de dialog ntr-un cluster.
Pentru o zon care este un child al unei column valorile
posibile sunt left, right, sau centered (implicit left).
Pentru o zon care este un child al unui row, valorile posibile
sunt top, bottom, or centered (implicit centered).
Nu se poate specifica alinierea pe axa lung a clusterului
deoarece prima i ultima zon se aliniaz singure la capetele rndului
sau coloanei. Celelalte zone din cluster sunt distribuite uniform cu
excepia cazului n care se utilizeaz zone de spaiere de tip spacer.
allow_accept
allow_accept = true-false;
Specific dac zona este activat cnd utilizatorul apas tasta
accept (de obicei ENTER). Dac este true i utilizatorul apas ENTER,
este activat butonul sau zona implicit. Acesta este butonul pentru care
is_implicit este true. Atributul implicit al atributului este false.
aspect_ratio
aspect_ratio = real;
Specific raportul dintre lime i nlime (L/H). dac este
zero (0.0) imaginea este scalat s ncap imaginea.
Valori reale (implicit nici una)
big_increment
big_increment = ntreg;
6-25

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Specific valoarea utilizat de deplasare a cursorului unui
slider. Valoarea implicit este de o zecime din lungimea sa. Valoarea
trebuie s se afle n intervalul dintre valoarea minim min_value i cea
maxim max_value.
children_alignment
children_alignment = position;
Specific alinierea implicit (similar cu alinierea) pentru
toate zonele dintr-un cluster. Nu nlocuiete alinierea unui child, dac
alinierea este scris explicit.
Pentru o coloan valorile posibile sunt left, right, sau centered
(implicit left).
Pentru un, valorile posibile sunt top, bottom, or centered
(implicit centered).
children_fixed_height
children_fixed_height = true-false;
Specific nlimea implicit (similar cu height) pentru toate
zonele dintr-un cluster. Nu nlocuiete nlimea unui child, dac
nlimea este scris explicit.
Valori posibile true sau false (implicit: false).
NOT: Utilizai atributele fixed_ cu discreie. Declaraiile
inconsistente vor altera apectul casetei.
children_fixed_width
children_fixed_width = true-false;
Specific limea implicit (similar cu width) pentru toate
zonele din cluster. Nu nlocuiete limea unui child, dac limea este
scris explicit.
Valori posibile true sau false (implicit: false).
NOT: Utilizai atributele fixed_ cu discreie. Declaraiile
inconsistente vor altera apectul casetei.
color
color = colorname;

6-26

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Specific culoarea de fundal cu care se va umple zona
rezervat imaginii (ntreg implicit 7) sub forma unui numr de culoare
AutoCAD sau a unui nume simbolic de culoare.
Nume simbolic

Semnificaie

dialog_line

Culoare curent linie dialog

dialog_foreground

Culoare curent fond (pentru text)

dialog_background

Culoare fond imagine

graphics_background

Fond curent AutoCAD

black

AutoCAD color = 0 (black)

red

AutoCAD color = 1 (red)

yellow

AutoCAD color = 2 (yellow)

green

AutoCAD color = 3 (green)

cyan

AutoCAD color = 4 (cyan)

blue

AutoCAD color = 5 (blue)

magenta

AutoCAD color = 6 (magenta)

White graphics_foreground

AutoCAD color = 7 (white)

edit_limit
edit_limit = ntreg;
Specific numrul maxim de caractere pe care utilizatorul este
autorizat a fi introdus ntr-un edit_box. Valoare posibil un ntreg
(implicit: 132). Valoara maxim 256. Cnd se atinge valorea setat nu
mai sunt acceptate caractere suplimentare cu excepia lui DEL i
BACKSPACE.
edit_width
edit_width = number;
Specific limea n uniti lime-caracter a spaiului de
editare. Valori posibile sunte numere reale sau ntregi. Dac edit_width
nu este specificat sau este 0.0 , iar limea zonei nu este fixat, zona
de editare se expandeaz pentru a umple spaiul disponibil dac
edit_width nu este zero zona de editare se aliniaz la dreapta n spaiul
6-27

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
ocupat de zona de dialog. Dac este necesar e extinde aceast zon se
poate aela la inserarea unor zone de spaiere.
fixed_height
fixed_height = true-false;
Specific dac nlimea zonei de dialog are permisiunea de a
se extinde la nimea total afectat ei. Dac atributul este true, zona
de dialog nu se poate extinde, spaiul suplimentar devenind disponibil
n procesul de aliniere.
Valori posibile sunt true sau false (implicit: false).
fixed_width
fixed_width = true-false;
Specific dac limea zonei de dialog are permisiunea de a se
extinde la limea total afectat ei. Dac atributul este true, zona de
dialog nu se poate extinde, spaiul suplimentar devenind disponibil n
procesul de aliniere.
Valori posibile sunt true sau false (implicit: false).
fixed_width_font
fixed_width_font= true-false;
Specific dac afiarea caracterelor unei list_box sau
popup_list va fi fcut cu restricionarea reprezentrii cu un anume
font. Acest fapt poate ajuta la alinierea zonelor de dialog pe coloane.
Valori posibile sunt true sau false (implicit: false).
height
height = number;
Specific nlimea zonei de dialog. Valori posibile sunt
numere reale sau ntregi exprimnd nlimi-caracter. Nu o specificai
dect n cazul n care nu suntei mulumii cu aspectul furnizat de
setrile implicite. Pentru zonele tip image sau image_button trebuie s
o specificai n orice caz.
Atributul nlime specific nlimea minim a zonei de
dialog. Aceast dimensiune poate fi expandat la nlimea total
afectat dac ea nu este fixat de unul din atributele fixed_xxx.
6-28

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
nlimea-caracter este definit ca nlimea maxim a
caracterelor-ecran (inclusiv spaierea ntre linii).
initial_focus
initial_focus = "string";
Specific numele zonei de dialog care este activat
(focalizat) la deschiderea casetei de dialog. Valoare posibil este un
ir ntre ghilimele (nu exist valoare implicit).
is_bold
is_bold = true-false;
Specific dac textul este reprezentat cu caractere ngroate
(bold).
Valori posibile sunt true sau false (implicit: false). Dac este
true, textul este reprezentat bold.
is_cancel
is_cancel = true-false;
Specific dac butonul este considerat selectat atunci cnd
utilizatorul apas tasta ESC. Valori posibile sunt true sau false
(implicit: false).
Dac expresia de actiune a butonului cu atributul is_cancel
setat true nu produce prsirea casetei de dialog (nu apeleaz
done_dialog), caseta de dialog este prsit automat dup aciunea
expresiei, iar variabila DIASTAT este setat 0.
Doar un singur buton ntr-o caset de dialog poate avea setat
atributul is_cancel ca true.
is_implicit
is_implicit = true-false;
Specific dac butonul este butonul selectat implicit (apsat)
cnd utilizatorul apas tasta accept. Valori posibile sunt true sau false
(implicit: false). Dac utilizatorul este ntr-un edit_box, list_box sau
image_button, butonul implicit este deasemenea apsat dac
utilizatorul apas tasta accept (sau dublu click pentru liste i butoane
imagine). Butonul implicit nu este considerat selectat de tasta accept

6-29

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
dac alt buton este focalizat n acel monent. In acest caz este selectat
butonul focalizat.
Un singur buton poate avea atributul is_implicit setat true.
is_enabled
is_enabled = true-false;
Specific dac zona de dialog este sau nu dezactivat la apelul
casetei de dialog. Valori posibile sunt true sau false (implicit: true).
Dac este stat false zona este dezactivat i apare estompat.
is_tab_stop
is_tab_stop = true-false;
Specific dac zona primete dreptul de a fi activat de la
tastatur prin navigare n caset cu TAB. Valori posibile sunt true sau
false (implicit: true). Dac zona este dezactivat ea nu este tab_stop
chiar dac atributul este setat true. Dac este setat false zona nu este
tab_stop.
key
key = "ir";
Specific numele zonei de dialog ce va fi disponibil
utilizatorului programului s refere aceast zon. Valoare posibil este
un ir ntre ghilimele ( nu exist valoare implicit). ntr-o caset de
dialog, fiecare key trebuie s fie unic. Acest ir este case-sensitive.
Deoarece valoarea lui key nu este vizibil utilizatorului,
numele ei poate fi oricare atta timp ct este unic n caseta de dialog.
Pentru acelai moriv atributele key nu necesit a fi traduse pentru
aplicaiile oferite n mai multe variante lingvistice.
label
label = "ir";
Specific textul afiat n zona de dialog. Valoare posibil este
un ir ntre ghilimele (implicit un ir gol ""). Plasarea textului etichetei
depinde de tipul zonei de dialog.
Atributul poate s exprime o subliniere mnemonic pentru
zona de dialog. Caracterul mnemonic este reprezentat subliniat. Dac
un caracter este precedat de semnul"&", acel caracter devine
6-30

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
mnemonic. Caracterul nu trebuie s fie unic n caseta de dialog. Dac
sunt mai multe mnemonici identice, prin apsarea succesiv a acelei
taste utilizatorul poate alege ntre zonele de dialog cu aceeai
mnemonic.
Mnemonicele schimb focalizarea zonelor de dialog, nu i
selecteaz acele zone. Dac utilizatorul specific o mnemonic pentru
un grup de zone de dialog, focalizarea se mut pe acel grup asupra
primei zone definite ca is_tab_stop. Orice zon este is_tab_stop cu
excepia celor setate cu false.
NOT: Atributul mnemonic specific de asemenea caracterul
mnemonic.
layout
layout = pozitie;
Specific orientarea unui slider. Valori posibile sunt
horizontal sau vertical (implicit: horizontal). Pentru slidere orizontale,
valorile cresc de la stnga la dreapta. Pentru slidere verticale, valorile
cresc de jos n sus.
list
list = "ir";
Specific setarea iniial a coninutului unei liste de date
amplasate ntr-o list_box sau popup_list. Valoare posibil un ir ntre
ghilimele (fr valoare implicit). Liniile sunt separate printr-un simbol
new_line (\n). Caractere TAB (\t) pot fi prezente n oricare linie.
max_value
max_value = ntreg;
Specific valoarea maxim pe care o poate returna un cursor
slider. Valoarea maxim implicit este10000. Aceast valoare trebuie
s fie un ntreg cu semn pe 16 bii nu mai mare de 32767.
min_value
min_value = ntreg;
Specific valoarea minim pe care o poate returna un cursor
slider. Valoarea minim implicit este 0. Aceast valoare trebuie s fie
un ntreg cu semn pe 16 bii nu mai mic de -32767. Ca valoare,
min_value poate fi mai mare dect max_value.
6-31

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

mnemonic
mnemonic = "caracter";
Specific o mnemonic pentru o zon de dialog. Mnemonica
este subliniat n textul etichetei label a zonei. Valoare posibil este un
ir de un caracter ntre ghilimele. Nu are valoare implicit. Caracterul
trebuie s fie unul din textul asociat pentru label.
Caracterul nu trebuie s fie unic n caseta de dialog. Dac sunt
mai multe mnemonici identice, prin apsarea succesiv a acelei taste
utilizatorul poate alege ntre zonele de dialog cu aceeai mnemonic.
Mnemonicele schimb focalizarea zonelor de dialog, nu i
selecteaz acele zone. Dac utilizatorul specific o mnemonic pentru
un grup de zone de dialog, focalizarea se mut pe acel grup asupra
primei zone definite ca is_tab_stop. Orice zon este is_tab_stop cu
excepia celor setate cu false.
NOT: Atributul label specific de asemenea caracterul
mnemonic dac este precedat de "&".
multiple_select
multiple_select = true-false;
Specific dac pot fi selectate (subliniate) mai multe linii din
list_box simultan. Valori posibile sunt true sau false (implicit: false).
Dac este true, pot fi selectate mai multe odat.
password_char
password_char = "caracter";
Specific caracterul care va fi utilizat pentru a masca
introducerea. Dac password_char este specificat i nu este nul (""),
acel caracter este afiat n locul celor introduse de utilizator . Folosirea
acestui atribut nu are efect asupra recunoaterii i utilizrii irului
mascat introdus, doar modific afiarea caracterelor n edit-box.
small_increment
small_increment = ntreg;
Specific valoarea incremental utilizat de cursor. Valoarea
implicit este o sutime din intervalul total. Valoarea trebuie s fie n
intervalul dinte max_value i min_value. Atributul este opional.
6-32

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

tabs
tabs = "ir";
Specific plasamentul tab-urilor exprimat n uniti limecaracter. Valorile posibile sunt cuprinse ntre ghilimele i reprezint
ntregi sau numere reale separate prin spaii (fr valoare implicit).
Aceste valori sunt folosite pentru alinierea vertical a coloanelor de
text n popup_list i box_list.
De exemplu, codul urmtor indic stopuri de tabulare la
fiecare 8 caractere.
tabs = "8 16 24 32";
tab_truncate
tab_truncate = true-false;
Specific dac textul ntr-o popup_list sau box_list este
trunchiat dac este mai mare dect tab_stop-ul asociat. Valori posibile
sunt true sau false (implicit: false).
value
value = " ir ";
Specific valoarea iniial a zonei de dialog. Valoare posibil
este un ir ntre ghilimele. Semnificaia acestei valori este dependent
de tipul zonei de dialog. Valoarea unei zone poate fi schimbat pe
parcursul rulrii prin introducerea fcut de utilizator sau prin set_tile.
Atributul value al unei zone nu este luat n consideraie cnd
caseta de dialog este abandonat. Dup afiarea casetei, new_dialog
utilizeaz atributele value pentru iniializarea fiecrei zone de dialog.
Atributul value nu are efect asupra mrimii sau sapierii zonelor de
dialog n caseta de dialog.
width
width = numr;
Specific limea unei zone de dialog. Valori posibile sunt
numere ntregi sau reale, exprimate n uniti lime-caracter. Nu
specificai aceast valoare , cu excepia cazului cnd setrile implicite
nu produc un aspect acceptabil. Pentru image sau image_button vei
specifica width n orice situaie.
6-33

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Atributul width specific limea minim a zonei de dialog.
Aceast dimensiune poate fi expandat la limea total afectat dac
ea nu este fixat de unul din atributele fixed_xxx.
Unitatea lime-caracter este definit ca o medie a limilor
tuturor caracterelor majuscule i minuscule, sau limea ecranului
divizat cu 80, care dintre acestea dou este mai mic (media limilor
este ((limi(AZ)+ limi(az)): 52).

6.8

Principalele zone de dialog PDB

AutoCAD ofer prin PDB (Programming Dialogue Box) un


set de zone de dialog predefinite zone care pot fi folosite ele nseleca
atare, sau reprezint baza pentru zone de dialog mai complexe.
Definiiile lor sunt cuprinse n fiierul base.dcl.
Cnd utilizatorul alege o zon de dialog activ , de exemplu
un buton, caseta de dialog rspunde transmind valoarea introdus
programului AutoLISP sau ARX care monitorizeaz caseta de dialog.
Oricrei zone de dialog active i se poate asocia un eveniment,
o aciune. Efectul ei poate fi vizibil utilizatorului sau poate fi pur i
simplu o reactualizare intern a unor date.
Aciunile sunt acompaniate de un cod de motiv, reason, care
indic ce a modificat aciunea.
Semnificaia acestui motiv depinde de ce tip de zon de dialog
a fost activat.
Zone active predefinite
Urmtoarele zone de dialog sunt selectabile n procesulul de
dialog:
button

popup_list

edit_box

radio_button

image_button

slider

list_box

toggle

Zone cluster
Putei grupa zone de dialog pe rnduri , rows, sau coloane,
columns denumite colectiv clustere.
6-34

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Clusterul este tratat ca o singur entitate n procesul de
aliniere. Rndul sau coloana pot fi cuprinse n chenare care subliniaz
coninutul i poate fi nsoit de un label (etichet). Un cluster fr
chenar nu poate avea label.
Utilizatorul nu poate selecta un cluster ci doar zonele de
dialog individuale componente. Clusterele nu pot avea asociate actiuni,
cu excepia celor radio_row i radio_column. Urmtoarele zone de
dialog definesc clustere:
dialog

row

boxed_row

column

boxed_column

radio_row

boxed_radio_row

radio_column

boxed_radio_column

Zone decorative i informative


Zonele de mai jos nu pot cauza aciuni i nu pot fi selectate.
Ele sunt disponibile pentru afiarea informaiilor sau pentru a asigura
alinierea zonelor de dialog n caseta de dialog.
image

spacer_0

text

spacer_1

spacer

Clustere text
O zon text este nconjurat de o margine care poate induce
probleme la combinarea unui text. Textul integral poate fi generat dac
este realizat prin concatenare.
Urmtoarele clustere pentru texte sunt furnizate de base.dcl ca
prototip.
concatenation

text_part

paragraph

Zone de prsire caset i de afiare erori


Fiierul base.dcl ofer subansamble standard de butoane pentr
u prsirea casetei de dialog. Utilizai aceste definiii standard spre a
conserva stilul casetelor de dialog.
6-35

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

errtile

ok_cancel_help

ok_only

ok_cancel_help_errtile

ok_cancel

ok_cancel_help_info

Fiierul dvs. DCL nu trebuie s utilizeze zonele de dialog


cluster i tile. Deasemenea nu utilizai butoanele standard de prsire a
casetei de dialog types (cancel_button, help_button, info_button, i
ok_button).
Descrierea sintaxei descrierii zonelor de dialog
boxed_column
: boxed_column {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
Un boxed_column are un chenar n jurul su. O caset de
dialog arat asemntor cu acesta. Dac avem asignat un label , textul
s apare afiat n partea de sus. Dac label este absent, blank (" ") sau
null (""), se afieaz numai chenarul.
label
Apare ca o zon de dialog. Spaierea cu un label blanc sau
null poate s apar ca fiind diferit.

boxed_radio_column
: boxed_radio_column {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
Un boxed_radio_column are un chenar n jurul su. Label este
considereat identic cu cel de la boxed_column.
6-36

Ovidiu Alupei-Cojocariu
label

AutoLISP - Manual de programare

Apare ca o zon de dialog. Spaierea cu un label blanc sau


null poate s apar ca fiind diferit.
value
specific care din butoane a fost selectat (acea valoare este
"1")
boxed_radio_row
: boxed_radio_row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
Un boxed_radio_ row are un chenar n jurul su. Label este
considereat identic cu cel de la boxed_ row.
Label
Apare ca o zon de dialog. Spaierea cu un label blanc sau
null poate s apar ca fiind diferit.
value
specific care din butoane a fost selectat (acea valoare este
"1")
boxed_row
: boxed_row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
Un boxed_ row are un chenar n jurul su. Label este
considereat identic cu cel de la boxed_ radio _row.
label
6-37

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Apare ca o zon de dialog. Spaierea cu un label blanc sau
null poate s apar ca fiind diferit.
value
specific care din butoane a fost selectat (acea valoare este
"1")
button
: button {
action alignment fixed_height fixed_width
height is_cancel is_implicit is_enabled
is_tab_stop key label mnemonic width
}
Un button seamn cu un buton de apsat. Label-ul su indic
textul care va fi nscris pe buton. Butoanele sunt potrivite s indice
aciuni care sunt imediat vizibile cum ar fi prsirea unui dialog. Sau
trecerea la un subdialog.
Castele de dialog trebuie s includ butonul "OK" (sau
echivalentul su) pantru a fi apsat de utilizator dup ce a folosit sau
acitit caseta. Multe casete de dialog include deasemenea un buton
"Cancel" care permite utilizatorul prsirea casetei de dialog fr a face
modificri.
Casetele de dialog trebuie s utilizeze butoanele standard de
descrise anterior ca subansamble. Aceste subansamble garanteaz c
atributele nscrise sunt corect asignate.
NOT: dac facei butonul cancel ca fiind cel implicit, trebuie
s v asigurai c ai declarat cel puin un altul cu aciunea done_dialo .
Atfel, caseta de dialog va fi permanent anulat i nu obinei rezultatele
dorite.
label : specific textul care aparescris pe buton.
column
: column {
alignment children_alignment
children_fixed_height children_fixed_width
6-38

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
fixed_height fixed_width height label width
}
Zonele de dialog ntr-o coloan sunt orientate vertical n
ordinea n care sunt declarate n fiierul DCL. O coloan poate conine
orice tip de zone de dialog (cu excepia butoaneler radio solitare),
inclusiv subclustere ca row sau column.
O coloan fr chenar nu are atribute suplimentare n afara
celor standard.
concatenation
: concatenation {
}
Este o zon linie de text creat pentru a concatena mai multe
pri ale unui mesaj text_part. Aceasta este de folos cnd dorii
inserarea unui text care se poate modifica ntr-un mesaj standard. Este
definit n base.dcl.
dialog
: dialog {
initial_focus label value
}
Este o zon de dialog care definete global dialogul. Nu
trebuie s specificai i label i value, deoarece atributul value l
nlocuiete pe cel label.
label
specific titlul opional nscris n titlul casetei de dialog.
value
specific titlul opional nscris n titlul casetei de dialog.
Pentru a le seta n timpul rulrii utilizai set_tile
initial_focus :Specific key ce va fi activat iniial.
edit_box
: edit_box {
6-39

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
action alignment allow_accept edit_limit
edit_width fixed_height fixed_width height
is_enabled is_tab_stop key label mnemonic
value width password_char
}
Este un cmp care i permite utilizatorului s introduc un
singur rnd de text. Poate aprea un label opional la stnga cmpului.
Dac textul introdus este mai mare dect caseta, textul defileaz
orizontal.
Alinierea la stnga pentru etichet i la dreapta pentru caset
face alinierea pe vertical mai simpl.
label
Apare ca un titlu.
value
Valoare ASCII iniial plasat n caset. Setermin mereu cu
un caracter null. Dac utilizatorul introduce mai multe caractere dect
i permite edit_limit i irul este trunchiat, caracterul null este
adugateautomat.
errtile
errtile;
Este o zon text care apare la baza casetei de dialog. Implicit
este goal, dar programele pot afia mesaje n ea setnd atributul value
alcrui nume este "error".
De exemplu;
(set_tile "error" "Putei selecta o singur opiune!")
Este definit n base.dcl.
image
: image {
action alignment aspect_ratio color
fixed_height fixed_width height is_enabled
is_tab_stop key mnemonic value width
6-40

Ovidiu Alupei-Cojocariu
}

AutoLISP - Manual de programare

O zon image este undreptunghi n care se afieaz o imagine


slide, sau se poate desena. Poate fi utilizat pentru a se afia imaginea
unui tip de linie, a unui font, a unui slide.
Trebuie s i asignai o lime i o nlime explicit, sau una
dintre ele i aspect_ratio.
image_button
: image_button {
action alignment allow_accept aspect_ratio
color fixed_height fixed_width height
is_enabled is_tab_stop key mnemonic width
}
Zona image-button este un buton care afieaz o imagine
grafic n locul numelui su.
Cnd utilizatorul selecteaz un astfel de buton, programul
obine coordonatele punctului care a fost selectat. Aceasta foate folosi
dac dorii s afiai un desemn miniatural i s asignai diferite
semnificaii selectrii n diferite zone ale acestuia.
Trebuie s i asignai o lime i o nlime explicit, sau una
dintre ele i aspect_ratio.
list_box
: list_box {
action alignment allow_accept fixed_height
fixed_width height is_enabled is_tab_stop
key label list mnemonic multiple_select tabs
value width
}
O zon list_box conine o list de iruri, aranjate pe rnduri.
Uzual, lista are o lungime variabil, ns pot fi setate pentru
lungimi fixe, mai ales cnd ar ocupa o zon prea mare. Cnd
utilizatorul selecteaz un rnd, acesta este subliniat. O zon list_box
6-41

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
poate conine mai multe rnduri dect cele atribuite , n acest caz lista
este dotat cu un cursor lateral pentru defilarea ei (acesta apare doar
dac numrul de elemente depete lungimea setat). Unele aplicaii
poat permite selecii multiple.
label
Apare ca un titlu deasupra.
value
Un ir ntre ghilimele care conine mai muli ntregi sau
niciunul (""), separai prin spaii (fr valare implicit). Fiecare ntreg
este un index care ncepe cu valoarea 0, care indic o valoare care
trebuie selectat iniial. Dac selecia multipl nu este setat, acesta nu
poate avea mai mult de un ntreg.
Dac valoarea irului este goal (""), atunci nu sunt elemente
ale listei ce trebuie subliniate. n acest caz, nu trebuie specificat
valarea atributului.
ok_only
ok_only;
Butonul ok_only este un buton solitar OK, ce tipul celui din
casetele "alert". Numele su este "accept".
Este definit n base.dcl.
ok_cancel
ok_cancel;
Zona de dialog ok_cancel este o combinaie de butoane OK i
Cancel, i este o combinaie standard de casete de dialog care pot
genera schimbri de date. Numele butonului cancel este "cancel".
Este definit n base.dcl.
ok_cancel_help
ok_cancel_help;
Acesta este clusterul ok_cancel cominat cu butonul Help.
Numele butonul Help este "help". Butoanele Help sunt recomandate
pentru caseta de dialog principal a unei aplicaii i pentru casetele de
dialog complexe. Funciile care trateaz butonul help pot afia Help-ul
standard AutoCAD, invocnd funcia AutoLISP help.
6-42

Ovidiu Alupei-Cojocariu
Este definit n base.dcl.

AutoLISP - Manual de programare

ok_cancel_help_errtile
ok_cancel_help_errtile;
Zona de dialog ok_cancel_help_errtile permite un mod
convenabil de a explicita butoanele de ieire i zona de eroare nt-una
singur.
Este definit n base.dcl.
ok_cancel_help_info
ok_cancel_help_info;
Este perfect asemntoare cu ok_cancel_help, doar c are un
buton n plus pentru afiarea unui material adiional. Poate afia
numele aplicaiei dvs., logo-ul firmei dvs. numrul de versiune al
aplicaiei, cum putei fi contactat, etc.. numele butonului este "info".
Este definit n base.dcl.
paragraph
: paragraph {
}
Un paragraf este un cluster compus din mai multe text_part
sau zone de dialog concatenate aranjate vertical. Putei construi
paragrafe de text interactiv sau static. Marginea ste comun ntregului
paragraf.
Este definit n base.dcl.

popup_list
: popup_list {
action alignment edit_width fixed_height
fixed_width height is_enabled is_tab_stop
key label list mnemonic tabs value width
}

6-43

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
O zon popup_list este echivalent funcional cu una list_box.
Cnd este afiat un dialog, popup_list este ntr-o stare restrns i
seamn cu un buton cu excepia marginii sale din dreapta, unde are o
sgeat ndreptat n jos. Dac selectm textul sau sgeata, ea se
desfoar afind mai multe date. Ea are un buton de defilare n partea
dreapt care lucreaz ca la list_box. Cnd zona se restrnge, valoarea
selectat este afiat. Nu accept selecii multiple.
label
Apare ca un titlu la stnga listei. Dac este specificat poate s
apar aliniat n interiorul limii listei.
edit_width
Specific limea poriunii de text . Aceasta nu include limea
pentru label sau pentru sgeata de desfurare din dreapta. Dac
edit_width nu este specificat sau este 0, ea se extinde att c este
spaiul disponibil. Valori posibile sunt ntregi sau reale
value
Un ir ntre ghilimele ce conine un nterg (implicit "0").
ntregul este un index ce pornete de la 0 care indic elementul curent
setat din list (acela afiat cnd lista nu este desfurat).
radio_button
: radio_button {
action alignment fixed_height fixed_width
height is_enabled is_tab_stop key label
mnemonic value width
}
Este o zon buton care poate compune o coloan sau un rnd.
Acestea lucreaz ca butoanele unui aparat de radio: doar unul poate fi
apsat la un moment dat, iar cnd este apsat altul, orice alt buton se
deselecteaz. O etichet opional poate s apar la dreapta butonului.
Apare un mesaj de eroare dac se ncearc s se plaseze un buton radio
n afara unui rnd sau a unei coloane radio.
label
Textul afiat la dreapta butonului.
6-44

Ovidiu Alupei-Cojocariu
value

AutoLISP - Manual de programare

Un ir (nu este implicit). Dac valoarea este "1", butonul este


apsat; dac este "0" butonul este deselectat; alte valori sunt automat
echivalente cu "0".
Dac din ntmplare, mai multe butoane sunt setate cu "1",
doar ultimul din cluster este considerat apsat.
radio_column
: radio_column {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
O coloan radio_column conine butoane radio, care nu pot fi
selectate dect unul singur la un moment dat. Acestor butoane li se
poate asocia cte o aciune mutual exclusiv prin program.
value
Un ir care conine numele butonului setat curent cu valoare
"1".
radio_row
: radio_row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
Un rnd radio, ca i o coloan radio, conine butoane radio,
unul singur din cluster fiind posibil a fi activat la un moment dat.
Acestor butoane li se pot asigna actiuni mutual exclusive.
value
Un ir care conine numele butonului setat curent cu valoare
"1".
6-45

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
NOT: Butoanele radio_row sunt mai dificil de manipulat,
deoarece mouse-ul trebuie s fac curse mai lungi din cauza textului
butonului care este afiat pe acelai rnd cu butonul. De aceea nu poate
avea mai mult de dou-patru butoane, i atunci doar dac textul
fiecruia este scurt.
row
: row {
alignment children_alignment
children_fixed_height children_fixed_width
fixed_height fixed_width height label width
}
Este un tip de cluster ca i coloana dar este orientat orizontal.
Zonele apar n ordinea descirerii lor n fiierul DCL, de la stnga la
dreapta. Un rnd fr chenar nu are alte atribute n afara celor standard.
slider
: slider {
action alignment big_increment fixed_height
fixed_width height key label layout
max_value min_value mnemonic small_increment
value width
}
Un cursor slider obine o valoare numeric. Utilizatorul poate
deplasa cursorul ctre dreapta sau ctre stnga ( n sus sau n jos)
pentru a obine valori care pot depinde de aplicaie. Aceast valoare
returnat ca un ir coninnd un numr ntreg cuprins ntr-un interval
precizat (ntregul este un numr pe 16 bii cu semn, deci cuprins ntre 32768 i 32767). Programul poate scala aceast valoare dup cum are
nevoie.
value
Un ir care conine valoarea curent (ntreag) a sliderului.
text
6-46

Ovidiu Alupei-Cojocariu
: text {

AutoLISP - Manual de programare

alignment fixed_height fixed_width height


is_bold key label value width
}
O zon de dialog text afieaz un ir text utilizabil ca un titlu
sau ca o zon informativ.
Deoarece cele mai multe zone de dialog au propria etichet
label, nu este absolut necesar s utilizai zone text. O zon text inut
neutilizat (alb) poate fi utilizat la un moment dat pentru a afia un
eveniment sau o stare.
text_part
: text_part {
label
}
O zon text_part este o pies a unui cluster ce include un text.
Marginile sale sunt suprimate, aa nct poate fi combinat cu alte zone
similare ntr-o concatenation sau paragraph.
Este definit n base.dcl.
toggle
: toggle {
action alignment fixed_height fixed_width
height is_enabled is_tab_stop label width
}
Un toggle controleaz o valoare boolean ("0" sau "1"). Un
toggle apare ca un mic dreptunghi cu o etichet opional sitat la
dreapta sa. Un marcaj (sau X) poate fi amplasat sau scos din
dreptunghi atunci cnd utilizatorul selecteaz zona de dialog. Aceste
marcaje permit utilizatorului s vad sau s schimbe starea ca o opiune
on/off. Sunt cunoscute i ca zone de control.
label
Textul afiat n dreapta dreptunghiului.
6-47

Ovidiu Alupei-Cojocariu
value

AutoLISP - Manual de programare

Un ir care exprim o valoare ntreag (implicit: "0")


exprimnd valoarea iniial a toggle. Dac irul este "0", dreptunghiul
este nemarcat. Dac este "1", dreptunghiul este marcat (sau aru un X).
spacer
: spacer {
alignment fixed_height fixed_width
height width
}
Un spacer este o zon vid. Este utilizat doar din raiuni de
aliniere pentru a afecta poziia zonelor adiacente. Utilizai-le doar n
cazuri speciale cnd alinierea obinut prin setri implicite nu v place.
Nu are atribute adiionale fa de cel standard.
spacer_0
spacer_0;
Un spacer_0 este o zon care normal nu are lime. El indic
unpunct ntr-un cluster unde dorii s inserai un spaiu, dac grupul va
fi extrins. Dac spacer_0 este asignat la o valoare pozitiv, tuturor
membrilor grupului li se distribuie o parte egal din acea spaiere.
Este descris n fiierul base.dcl.
spacer_1
spacer_1;
Este un spacer a crui lime i nlime sunt egale cu
unitatea. Este utilizat pentru a defini cel mai mic spaiu care va putea fi
utilizat pentru aliniere.
Este descris n fiierul base.dcl.

6.9

Exemple de dialoguri conduse prin ferestre


de dialog

Exemplul 1

6-48

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Am ales pentru nceput un exemplu de dialog unde se folosesc
doar butoanele.
Fereastra de dialog principal este compus numai din
butoane crora le sunt asociate activiti distincte.
Iat cum arat fereastra :

Primul buton este focalizat, fiecare buton avnd asociat o


funcionalitate precis nu a fost nevoie de butonul OK.
Utilizatorul poate prsi rularea curent cu Cancel fr s se
ntmple nimic ru.
S vedem cum arat dialogul n fiierul DCL:
dcl_settings : default_dcl_settings { audit_level = 3 ; }
OPER : dialog {
key = "ACTION" ;
label = "Activitati stalpi" ;
: boxed_column {
alignment = centered ;
label = "Operatii stalpi:" ;
6-49

Ovidiu Alupei-Cojocariu
: row {

AutoLISP - Manual de programare

: button {
alignment = centered ;
key = "nou" ;
label = "Nou " ;
mnemonic = /*Stalp nou*/"N" ;
width = 20 ;
}
: button {
alignment = centered ;
key = "Editeaza" ;
label = "Editez" ;
mnemonic = /*Editeaza stalp*/"E" ;
width = 20 ;
}
}
: row {
: button {
alignment = centered ;
key = "Muta" ;
label = "Mut" ;
mnemonic = /*Muta stalpul*/"M" ;
width = 20 ;
}
: button {
alignment = centered ;
key = "Sterge" ;
label = "Sterg" ;
6-50

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
mnemonic = /*Sterge stalp*/"S" ;
width = 20 ;
}
}
}
: boxed_row {
label = "Reactualizare fire:" ;
: button {
key = "update" ;
label = "Redesenare fire" ;
mnemonic = "R" ;
}
}
: boxed_column {
label = "Informatii stalpi:" ;
: row {
: button {
key = "Infost" ;
label = "Vizualizare" ;
mnemonic = "V" ;
}
: button {
key = "tiparire" ;
label = "Tiparire" ;
mnemonic = "T" ;
}
}
}
6-51

Ovidiu Alupei-Cojocariu
cancel_button ;

AutoLISP - Manual de programare

}
Conducerea dialogului este realizat cu ajutorul funciilor
AutoLISP. S vedem pentru acest exemplu cum arat seciunea de
conducere a dialogului:
(defun C:act ( / kw)
(setq dcl_id (load_dialog "C:\\ovidiu\\FIRE.DCL"))
(IF (not (new_dialog "OPER" dcl_id)) (exit))
(action_tile "nou" "(setq kw 1)(done_dialog)")
(action_tile "Editeaza" "(setq kw 2)(done_dialog)")
(action_tile "Muta" "(setq kw 3)(done_dialog)")
(action_tile "Sterge" "(setq kw 4)(done_dialog)")
(action_tile "update" "(setq kw 7)(done_dialog)")
(action_tile "Infost" "(setq kw 5)(done_dialog)")
(action_tile "tiparire" "(setq kw 6)(done_dialog)")
(action_tile "ExportDATE" "(setq kw 8)(done_dialog)")
(action_tile "cancel" "(setq kw 0)(done_dialog)")
(start_dialog)
(unload_dialog dcl_id)
(cond ((= kw 0)(prompt "\nNu v-ati hotarat ce vreti?"))
((= kw 1)(c:date_stalp))
((= kw 2)(c:sedit))
((= kw 3)(c:smove))
((= kw 4)(c:stelm))
((= kw 5)(c:shd))
((= kw 6)(c:txt))
((= kw 7)(c:stlp1))
((= kw 8)(c:texport))
6-52

Ovidiu Alupei-Cojocariu
)

AutoLISP - Manual de programare

(princ)
)
Observm mai multe zone de interes:

Iniializare dialog prin load_dialog i new_dialog;

Atribuire cuvnt_cheie kw pentru aciuni n urma apelului


fiecrui buton prin action_tile;

Declanarea dialogului cu start_dialog;

Dialogul este descrcat cu unload_dialog

Executarea aciunilor funcie de cuvntul_cheie setat.

Se poate observa omogenitatea codului scris, faptul c fiecare


buton are drept aciune doar setarea unui cuvnt_cheie dup care se
execut done_dialog i dialogul se ncheie.
Acest tip de dialog se potrivete atunci cnd operaiile de
efectuat sunt i ele omogene. Dac ar fi trebuit ca fiecrui tip de
operaie s-I descriem seturi de date, funciile apelante ale aciunilor ar
fi trebuit s cheme la rndul lor ferestre de dialog specifice fiecrei
aciuni. Acest lucru este disponibil n structura pe care am prezentat-o ,
acest dialog fiind complet independent, dezvoltrile ulterioare
neafectndu-l.
Exemplul 2
Exemplul urmtor este o caset de dialog destinat a prelua o
serie de date pe care utilizatorul le va completa n mai multe edit_box.
Prsirea casetei se face cu tradiionalul ok_cancel un cluster
prefabricat.
S vedem cum arat caseta de dialog:

6-53

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Codul DCL este prezentat n continuare:


date_stalp : dialog {
key = "Date stalp" ;
label = "Date referitoare la stalp" ;
: edit_box {
key = "Cod_stalp" ;
label = "Codificare stalp

";

mnemonic = /*Codificare stalp*/"C" ;


value = "DL" ;
width = 20 ;
}
: edit_box {
key = "Hclema" ;
label = "Inaltime la clema [m]" ;
mnemonic = /*Inaltime clema*/"I" ;
value = "19.4" ;
width = 20 ;
}
6-54

Ovidiu Alupei-Cojocariu
: edit_box {

AutoLISP - Manual de programare

key = "Sink" ;
label = "Sinkage [m]

";

mnemonic = /*Sinkage*/"S" ;
value = "0.3" ;
width = 20 ;
}
: edit_box {
key = "Suprainaltare" ;
label = "Suprainaltare [m] " ;
mnemonic = /*Suprainaltare*/"S" ;
value = "0" ;
width = 21 ;
}
ok_cancel ;
}
Conducerea dialogului este realizat cu funcia urmtoare:
(defun C:date_stalp ()
(setq cancel nil)
(if dlm(setq dl0 dlm)(setq dlm "19.4"))
(if ingm(setq ing0 ingm)(setq ingm "0.3"))
(if supm(setq sup0 supm)(setq supm "0."))
(if cods (setq cod0 cods)(setq cods "Fara_cod"))
(if lant (setq lant0 lant)(setq lant "Fara_lant"))
(setq dcl_id (load_dialog "C:\\ovidiu\\FIRE.DCL"))
(IF (not (new_dialog "date_stalp" dcl_id)) (exit))
(set_tile "Date_stalp" "Creare informatii nou stalp")
6-55

Ovidiu Alupei-Cojocariu
(set_tile "Hclema"
(set_tile "Sink"
(set_tile "Suprainaltare"

AutoLISP - Manual de programare


dlm)
ingm)
supm)

(set_tile "Cod_stalp" (strcase cods))


(set_tile "Lanturi" (strcase lant))
(action_tile "Cod_stalp" "(setq cods $value)")
(action_tile "Hclema" "(setq dlm $value)")
(action_tile "Sink" "(setq ingm $value)")
(action_tile "Suprainaltare" "(setq supm $value)")
(action_tile "Lanturi" "(setq lant $value)")
(action_tile "accept" "(setq cancel nil)(done_dialog)")
(action_tile "cancel" "(setq cancel T)(done_dialog)")
(start_dialog)
(unload_dialog dcl_id)
(setq ldates (list (strcase cods) dlm ingm supm lant))
(if cancel
(prompt "\nData viitoare sa fi mai hotarat!")
(c:dl1)
)
(setq cancel nil)
(princ)
)
Avem i aici de urmrit o serie de seciuni ale programului:

Atribuire valori implicite

Iniializare dialog prin load_dialog i new_dialog;

Setarea csuelor de editare cu valorile implicite cu funcii


set_tile

6-56

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare

Atribuirea valorilor completate n casete variabilelor n urma


apelului fiecrui buton prin action_tile;

Declanarea dialogului cu start_dialog;

Dialogul este descrcat cu unload_dialog

Observm c fiecare edit_box poate fi completat cu valorile


dorite, dar nu se produce prsirea dialogului dect prin intermediul
butoanelor Ok cu validarea tuturor informaiilor sau cu Cancel dac
dorim s abandonm editarea.
Exemplul 3
S vedem un dialog care produce doar o afiare a unor
informaii ntr-o list_box.

Este vorba de o afiare ntr-o list_box, cu o list care depete


nlimea setat, ceea ce a condus la afiarea cursorului lateral. Mai
este prezent un edit_box i butonul clasic ok_only.
S vedem caseta de dialog exprimat n limbaj DCL:
tges_info:dialog
{
label = "PAC3 : Info";
:column
6-57

Ovidiu Alupei-Cojocariu
{

AutoLISP - Manual de programare

:list_box
{
alignment = centered;
width = 40;
key = "tlist2";
allow_accept = true;
}
:edit_box {
key = "comment";
label = "Comentariu";
width = 40;
}
ok_only;
:text {
key = "mess";
width = 30;
}
}
}
Conducerea dialogului este realizat de programul AutoLISP
urmtor:
(defun mesajl(lista / lmes)
(setq dcl_id (load_dialog "d:\\lisp\\pac3\\pac3.dcl"))
(if (not (new_dialog "tges_info" dcl_id)) (exit))
(start_list "tlist2")
(setq lmes lista)
(mapcar 'add_list lmes)
6-58

Ovidiu Alupei-Cojocariu
(end_list)

AutoLISP - Manual de programare

(action_tile "tlist2" "(setq fl $value)")


(action_tile "accept" "(done_dialog )")
(start_dialog)
(done_dialog )
(unload_dialog dcl_id)
(princ)
)
Aa cum se vede este vorba de o funcie specializat de
afiare. Ea are ca argument o list de iruri care va forma lista afiat n
fereastra de dialog.
Etapele distincte sunt:

Iniiere dialog cu load_dialog i new_dialog

Formare lista mesaj cu start_list, add_list i end_list

Setare aciuni cu action_tile

Pornire dialog cu start_dialog

Descrcare dialog cu unload_dialog


Prsirea casetei de dialog se face cu butonul Ok.

Exemplul 4
Un exemplu care mbin list_box cu image i evident
ok_cancel.

6-59

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Prototipul DCL al dialogului l avei expus n continuare:


select : dialog {
label = "Alegere elemente dispozitiv";
:boxed_row {
: list_box {
key="description";
label="Elemente:";
width= 50;
}
:image{
key="poza_elem";
width= 40;
color= 5;
aspect_ratio= 1;
}
}
ok_cancel;
6-60

Ovidiu Alupei-Cojocariu
}

AutoLISP - Manual de programare

s vedem i programul care conduce dialogul:


(defun c:dial()
(setq f_dialog "d:\\lisp\\pac3\\3ddisp.dcl")
(setq dcl_id (load_dialog f_dialog))
(if (not (new_dialog "select" dcl_id)) (exit))
(start_list "description")
(setq lmes (list
'("bolturi de rezemare DIN 6321" "bolt")
'("cep de sprijin reglabil cu cap hexagonal bombat STAS 8880-71"
"cep")
'("cep de sprijin reglabil STAS 8883-71" "cepsr")
'("picior cu cep filetat STAS 8771-70" "picior")
'("cep de sprijin reglabil pentru bride" "8882-71")
'("prisma de reazem cu gauri de fixare nefiletate STAS 888171""8881-71")
'("canale T pentru masini-unelte STAS 1385-95" "canal_t")
'("placa T Tsem-64" "placat")
'("cep de sprijin cu cap sferic STAS 8885-71" "cscs")
'("cep de sprijin cu cap cilindric plat STAS 8768-70""cep8768-70")
'("cep de sprijin cu cap cilindric bombat STAS 8767-70""cep876770")
'("placa de sprijin cu suprafata plana STAS 8769-70""8769-70")
'("placa de sprijin cu suprafata canelata STAS 8745-70""8745-70")
'("ax de orientare STAS 8783-71""8783-71")
'("bucsa pentru ax de orientare STAS 9499-74""9499-74")
))
(setq lmm '())
6-61

Ovidiu Alupei-Cojocariu
(foreach n lmes

AutoLISP - Manual de programare

(setq lmm (append lmm (list (car n))))


)
(mapcar 'add_list lmm)
(end_list)
(action_tile "description""(setq cntf $value)(img cntf)")
(action_tile "poza_elem" "(princ)")
(start_dialog)
(done_dialog)
(unload_dialog dcl_id)
(princ)
)
(defun img(nume)
(setq v1 (dimx_tile "poza_elem")
v2 (dimy_tile "poza_elem")
)
(start_image "poza_elem")
(fill_image 0 0 v1 v2 -16)
(slide_image 0 0 v1 v2 (strcat"d:\\lisp\\pac3\\"nume))
(end_image)
)
Dialogul este condus similar cu exemplele anterioare:
Etapele sunt:
Iniiere dialog cu load_dialog i new_dialog;
Stabilire coninut lista pentru popup_list cu start_list, add_list
i end_list;
Stabilire operaii ci action_tile;
Pornire dialog cu start_dialog;
6-62

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Prsire dialog cu done_dialog, Ok sau cancel.
O particularitate o reprezint facptul c selectarea unui rnd
din lista afiat produce afiarea imaginei corespunztoare itemului
selectat.
Acest lucru este posibil prin apelarea funciei de afiare n
zona image numit img.
Ea primete ca argument un nume de fiier SLD care conine
salvat n el imaginea apelat.
Lista de date pregtit n faza iniial are pentru fiecare
sublist dou componente de tip ir: primul exprim textul de afiat n
popup_list, cellalt numele fiierului .SLD fr specificarea extensiei.
Funcia img este i ea special dezvoltat.
Ea efectueaz urmtoarele operaii:

Preia dimensiunile imaginii cu dimx_tile i dimy_tile;

Iniiaz imaginea cu start_image;

Umple zona cu fill_image cu culoarea -16 ;

Afieaz fiierul SLD cu slide_image;

nchide descrierea imaginii cu end_image.

6-63

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Exemple de programe AutoLISP

Programele AutoLISP urmtoare sunt destinate creterii


progresive a aptitudinilor de programare i proiectare asistat.
Temele abordate au fost alese pentru a se putea face tranziia
de la utilizatorul AutoCAD ctre programarea n AutoCAD prin
intermediul AutoLISP.
Funciile utilizate sunt parte din nucleul de funcii standard,
parte au fost dezvoltate pentru rezolvarea problemelor propuse.

7.1

Problema 1:Desenarea unui dreptunghi

S se scrie un program AutoLISP care s asiste utilizatorul la


desenarea unui dreptunghi.
S explicitm grafic problema:

; Program desenare dreptunghi


; p1,p2 p3 p4 ->LIST (puncte)
(defun c:drpt()
(setvar "cmdecho" 0)
(setq p1 (getpoint "\nPrimul colt al dreptunghiului:"))
(setq p3 (getcorner p1 "\nColtul opus:"))
(setq p2 (list (car p3)(cadr p1)0))
(setq p4 (list (car p1)(cadr p3)0))
7-1

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(command "pline" p1 p2 p3 p4 "c")
(princ)
)
Utilizarea funciei getcorner va produce trasarea unui
dreptunghi elastic care nsoete deplasarea cursorului grafic.

7.2

Problema 2:Desenarea unui chenar pentru


un text

S se scrie un program care s deseneze un dreptunghi


racordat, n jurul unui text selectat. nlimea chenarului s fie dublul
nlimii textului, iar chenarul s fie echidistant textului. Raza de
racordare s fie egal cu nlimea textului.

Text de control
td
tex

l
tro
n
o
ec

; Program care deseneaza un chenar dreptunghiular


; de inaltime dubla cu textului, echidistant,
; racordat cu raza egala cu inaltimea sa
; in jurul unui text selectat (entitate TEXT)
;ename ENAME
;lpct LIST (doua puncte)
;lung REAL (lungimea textului)
;inalt REAL (inaltimea textului)
;depl REAL (deplasarea echidistanta)
; p1,p2 p3 p4 ->LIST (puncte)
7-2

Ovidiu Alupei-Cojocariu
(defun c:chenar()

AutoLISP - Manual de programare

(setvar "cmdecho" 0)
(setvar "osmode" 0)
(prompt "\nSelectati textul dorit:")
(setq ename (car(entsel)))
(setq lpct (textbox(entget ename)))
(setq lung (abs (car(mapcar '- (car lpct)(cadr lpct)))))
(setq inalt (abs (cadr(mapcar '- (car lpct)(cadr lpct)))))
(setq depl (* 0.5 inalt))
(command "ucs" "e" ename)
(setq p1 (mapcar '+ (car lpct) (list (- depl)(- depl) 0)))
(setq p3 (mapcar '+ (cadr lpct)(list depl depl 0)))
(setq p2 (list (car p3)(cadr p1)0))
(setq p4 (list (car p1)(cadr p3)0))
(command "pline" p1 p2 p3 p4 "c")
(command "fillet" "r" inalt)
(command "fillet" "p" (entlast))
(command "ucs" "P")
(princ)
)
Programul a luat informaiile despre dreptunghiul de ncadrare
a textului utiliznd funcia textbox. S-au calculat lungimea respectiv
nlimea textului prin simpla scdere a vectorilor ce indic cele dou
puncte de ncadrare diagonal opuse. ntruct valorile puncteor de
ncadrare sunt calculate ca i cum textul s-ar gsi n punctul '(0 0), prin
modificarea sistemului de coordonate bazat be textul selectat s-a
obinut materializarea acestei condiii. Punctelor p1 i p3 le-a fost
aplicat cte o transformare de translaie astfel nct s fie calculate
punctele cutate care descriu dreptunghiul de ncadrare echidistant.

7-3

Ovidiu Alupei-Cojocariu

7.3

Problema
segment

AutoLISP - Manual de programare

3:

Lungirea/scurtarea

unui

S se scrie un program care s preia de la utilizator un


segment "LINE" pe care s-l prelungeasc (scurteze) pn n dreptul
unui punct introdus de utilizator.
; Program de lungire a unei linii
;ename ENAME
;pct,pctn LIST (puncte)
;elist LIST (lista asociata segmentului)
(defun c:ll()
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq ename nil elist nil)
(while (not ename)
(prompt "\nSelectati segmentul:")
(setq ename (car(entsel)))
(if ename
(setq elist(entget ename))
)
(if (/= (cdr(assoc 0 elist))"LINE")
(progn
(prompt "\nNu ati selectat un segment!!")
(setq ename nil)
);end progn
);end if
);end while
(command "ucs" "e" ename)
(initget 1)
7-4

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq pct (getpoint "\nPunct catre care se lungeste(scurteaza):"))
(setq pctn(list (car pct) 0 0))
(cond ((and(equal (cdr(assoc 10 elist)) (trans '(0 0 0) 1 0)0.1)
(not(minusp (car pctn))))
(setq elist (subst (cons 11 (trans pctn 1 0))
(assoc 11 elist) elist))
)
((and(equal (cdr(assoc 10 elist))(trans '(0 0 0) 1 0)0.1)
(minusp (car pctn)))
(setq elist (subst (cons 10 (trans pctn 1 0))
(assoc 10 elist) elist))
)
);end cond
(entmod elist)
(command "ucs" "p")
(princ)
)
Prima parte a programului are drept obiectiv acceptarea
segmentului "LINE". Deoarece selectarea poate s fie defectuoas,
adic utilizatorul poate s apese ENTER fr s selecteze nimic, sau s
selecteze alt obiect dect un "LINE" este necesar o tratare a erorii de
selectare i o buclare a selectrii ntr-un ciclu while.
Odat acceptat, se comut UCS-ul pe entitatea "LINE" i se
cere punctul ctre care se va prelungi (scurta) segmentul. Utilizarea
funciei initget interzice utilizatorului s dea un rspuns nul.
Se testeaz apoi semnul X-ului punctului astfel introdus n
corpul funciei cond pentru a vedea care dintre capetele segmentului
trebuie modificate. Lista asociat este refcut prin intermediul funciei
subst.
Se modific n final lista asociat i implicit obiectul cu
entmod.
7-5

Ovidiu Alupei-Cojocariu

7.4

AutoLISP - Manual de programare

Problema 4: Dreptunghi cu cerc tanget la


laturi

S se scrie un program care s deseneze un dreptunghi i un


cerc nscris n acesta, tangent la dou laturi ale sale, centrat n
mijlocul su.

Problema este n esen determinarea centrului cercului i a


diametrului acestuia.
Urmtorul program rezolv problema dat:
; Program desenare dreptunghi
; cu cerc inscris, tangent
; p1,p2 p3 p4 ->LIST (puncte)
; dia REAL (diametrul cercului)
; llun LIST (list marimi laturi)
; lx REAL (lungime latura paralela X)
; ly REAL (lungime latura paralela Y)
; cen LIST (centrul cercului)
(defun c:drc()
(setvar "cmdecho" 0)
(setq p1 (getpoint "\nPrimul colt al dreptunghiului:"))
(setq p3 (getcorner p1 "\nColtul opus:"))
(setq p2 (list (car p3)(cadr p1)0))
7-6

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq p4 (list (car p1)(cadr p3)0))
(command "pline" p1 p2 p3 p4 "c")
(setq llun (mapcar '- p1 p3))
(setq lx (abs (car llun)))
(setq ly (abs (cadr llun)))
(setq dia (min lx ly))
(setq cen (mapcar '(lambda (x y)(/ (+ x y) 2.)) p1 p3))
(command "circle" cen "d" dia)
(princ)
)
Observai folosirea funciei mapcar pentru a face operaii cu
vectori (liste).
Scderea celor dou puncte duce la determinara distanelor pe
x i pe y.
Utilizarea funciei lambda, definit ad-hoc permite aflarea
semisumei coordonatelor ceea ce nseamn mijlocul distanei ntre cele
dou puncte, adic exact centrul cutat al cercului.
Puin geometrie clasic i analitic nu stric s revedei, n
caz c nu ai neles cum vine rezolvarea.

7.5

Problema
polilinii

5:Extragerea

vertexurilor

unei

S se scrie un program care s permit obinerea


informaiilor referitoare la vertexurile unei polilinii i s le tipreasc
ntr-o fereastr de dialog.
Obiectele desenate n AutoCAD sunt uneori necesare unor
aplicaii care utilizeaz informaii grafice care odat desenate aici s
poat fi imediat utilizate. Aplicaiile care realizeaz programe de
comand numeric pot fi scrise n mediul AutoCAD fcnd apel la
disponibilitile de programare ale AutoLISP.
Fiind obiecte complexe, datele geometrice coninute sunt de
obicei sursa pentru generarea codurilor NC n programarea n 2 axe sau
2 axe.
7-7

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Descrierea poliliniei n baza de date AutoCAD.
Orice obiect AutoCAD are ataat o list complex de
informaii care poate fi oricnd investigat i exploatat.
Lista asociat unui obiect este bazat pe existena unor coduri
DXF care se asociaz cu informaiile conexe necesare.
Obinerea listei asociate este uor de obinut utiliznd expresia
AutoLISP:
Command: (entget(car(entsel)))
S facem un prim exerciiu:
Desenai un segment de dreapt pornind din punctul (0,0)
ctre punctul (100,100).
Aplicai metoda anterioar pentru extragerea listei asociate
segmentului:
Obinei urmtorul mesaj:
Command: (entget(car(entsel)))
Select object: :

selectai segmentul

((-1 . <Entity name: 148d318>) (0 . "LINE") (330 . <Entity


name: 148ccf8>) (5 . "DB") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "0") (100 . "AcDbLine") (10 0.0 0.0 0.0) (11 100.0 100.0
0.0) (210 0.0 0.0 1.0))
Destul de complex informaie nu-i aa?
S refacem acelai drum pentru o polilinie;
Presupunem c ne aflm n R14 sau R2000
Dac dorim s reinem coninutul listei putem utiliza o
variabil:
Command: (setq lasoc(entget(car(entsel))))
Select object: selectai polilinia
((-1 . <Entity name: 148d320>) (0 . "LWPOLYLINE") (330 .
<Entity name: 148ccf8>) (5 . "DC") (100 . "AcDbEntity") (67 . 0) (410
. "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0)
(38 . 0.0) (39 . 0.0) (10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 100.0
100.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))
7-8

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Codurile DXF sunt pe primul loc n fiecare sublist.
De exemplu fie sublista (0 . "LWPOLYLINE") .
Aici codul 0 indic faptul c urmeaz numele tipului de obiect
investigat care este "LWPOLYLINE.
Din versiunea R14 acesta este un nou tip de entitate care
modeleaz poliliniilie, pe lng POLYLINE din versiunile
anterioare.
Vom da n continuare semnificaia ctorva coduri DXF ce
apar n cazul poliliniilor:
-1
0
90
70
43
38
39
10

210
5
8
6
62
48

Semnificaiile Codurilor DXF din listele asociate poliliniilor


Numele intern al entitii
Tipul entitii
Numr de vertexuri
Polyline flag; implicit e 0: 1 = Closed; 128 = Plinegen
Laime constant (opional; implicit = 0). Nu se utilizeaz cnd
codurile 40 i/sau 41 sunt setate
Elevaie (opional; implicit = 0)
Thickness (opional; implicit = 0)
Coordonate vertex (in OCS) multiple valori una pentru fiecare
vertex
Laime de start (multiple valori una pentru fiecare vertex)
(opional; implicit = 0);Nu se utilizeaz cnd codul 43 este setat
Lime final start (multiple valori una pentru fiecare vertex)
(opional; implicit = 0) Nu se utilizeaz cnd codul 43 este setat
Bulge (multiple valori una pentru fiecare vertex) (opional;
implicit = 0)
Direcie de extrudare (opional; implicit = 0,0, 1) vector 3D
Handle
Nume Layer
Nume tip linie (prezent dac nu e BYLAYER).
Numr Culoare (prezent dac nu e BYLAYER).; zero indic
BYBLOCK ; 256 indic BYLAYER;
Scara tip linie (optional)
Putem citi acum informaiile din lista asociat.

Faptul c poliliniile au mai multe vertexuri va fi identificat


prin apariia multipl a unui grup de informaii repetate i actualizate
pentru fiecare vertex.
7-9

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Pentru polilinia precedent avem:
(10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0)
(10 100.0 100.0) (40 . 0.0) (41 . 0.0) (42 . 0.0)
Se observ c se repet codurile pentru coordonatele
vertexului (10), laime de start (40), lime final (41), bulge(42).
Presupunem c ne aflm n R12 sau R13
Entitatea se numete acum POLYLINE i are o structur
diferit.
Apelul
Command: (setq lasoc(entget(car(entsel))))
D urmtorul rezultat:
Select object: ((-1 . <Entity name: 14a21c8>) (0 .
"POLYLINE") (330 . <Entity name: 14a14f0>) (5 . "1A1") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDb2dPolyline") (66 . 1) (10 0.0 0.0 0.0) (70 . 0) (40 . 0.0) (41 . 0.0)
(210 0.0 0.0 1.0) (71 . 0) (72 . 0) (73 . 0) (74 . 0) (75 . 0))
Ni se d astfel numele entitii principale (cod 1) i punctul
de start (10 0.0 0.0 0.0)
Nimic despre cellalt vertex sau despre bulge!
Este necesar cunoaterea modului particular n care este
reinut orice polilinie de acest tip.
Putem face o comparaie cu nite mrgele nirate pe o sfoar,
prima mrgic fiind entitatea principal (POLYLINE), ultima fiind
entitatea de nchidere a secvenei (SEQEND), celelalte fiind n
ordine vertexurile (VERTEX). Sugestiv nu-i aa?
Pentru a avea acces la listele asociate fiecrei mrgele
trebuie s le cutm succesiv, cunoscnd faptul c urmtoarea entitate
n AutoLISP se gsete cu funcia (entnext).
Prima informaie "VERTEX va fi deci:
Command: (setq v1 (entget (entnext (cdr(assoc 1 lasoc)))))
((-1 . <Entity name: 14a21d0>) (0 . "VERTEX") (330 .
<Entity name: 14a21c8>) (5 . "1A2") (100 . "AcDbEntity") (67 . 0)
7-10

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(410 . "Model") (8 . "0") (100 . "AcDbVertex") (100 . AcDb2dVertex")
(10 100.0 100.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (70 . 0) (50 . 0.0))
Observm c apare exact punctul geometric (10 100.0 100.0
0.0) care are i coordonata z=0.
Apare de asemenea i factorul bulge (42 . 0.0)
Continum cutarea:
Command: (setq v2 (entget (entnext (cdr(assoc 1 v1)))))
((-1 . <Entity name: 14a21d8>) (0 . "VERTEX") (330 .
<Entity name: 14a21c8>) (5 . "1A3") (100 . "AcDbEntity") (67 . 0)
(410 . "Model") (8 . "0") (100 . "AcDbVertex") (100 . AcDb2dVertex")
(10 0.0 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (70 . 0) (50 . 0.0))
Continum cutarea:
Command: (setq seq (entget (entnext (cdr(assoc 1 v2)))))
((-1 . <Entity name: 14a21e0>) (0 . "SEQEND") (330 .
<Entity name: 14a21c8>) (5 . "1A4") (100 . "AcDbEntity") (67 . 0)
(410 . "Model") (8 . "0") (-2 . <Entity name: 14a21c8>))
Am ajuns la ultima mrgic. Se observ c ultimul la cod (2 . <Entity name: 14a21c8>) este regsit entitatea principal.
Cu observaia c aceste informaii au fost generate nu cu R13,
este posibul ca unele informaii din listele asociate s fie diferite. Nu
este cazul ns pentru structura poliliniei.
Programele AutoLISP scrise pentru extragerea geometriei
poliliniilor trebuie s in seama de aceste particulariti ale diferitelor
versiuni de AutoCAD.
n caz contrar rezultatele sunt limitate strict la anumite
variante de descriere a poliliniilor.
Extragerea informaiilor geometrice
Pentru extragerea informaiilor se folosesc programe
AutoLISP care pot opera cu liste complexe aa cum sunt cele asociate
poliliniilor.
Avei la dispoziie o o funcie de extragere a geometriei unei
polilinii:
(defun c:ex_geom( / mesaj mesl)
7-11

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq mesl (list"Coordonate extrase:""X Y Z"))
(setq lpoly (extmnc (ENTGET(car(entsel)))10))
(foreach n lpoly
(if (caddr n)
(setq lscris (strcat (rtos (car n)) " "(rtos (cadr n)) " " (rtos
(caddr n))))
(setq lscris (strcat (rtos (car n)) " "(rtos (cadr n)) " " "0."))
)
(setq mesl (append mesl (list lscris )))
)
(mesajl mesl)
(princ)
)
(defun extmNC(lent cod)
(setq lex '())
(setq tiplent(cdr(assoc 0 lent)))
(cond ((= tiplent "LWPOLYLINE")
(progn
(while (member(assoc cod lent)lent)
(setq lex (append lex (append(list(cdar(member(assoc
cod lent)lent))))))
(setq lent (cdr(member(assoc cod lent)lent)))
)
))
((= tiplent "POLYLINE")
(progn
(setq i 0
e1 (cdr(assoc -1 lent))
7-12

Ovidiu Alupei-Cojocariu
e (entnext e1)

AutoLISP - Manual de programare

lista '()
lbulg '()
seq (cdr (assoc 0 (entget e)))
)
(while (and e (/= seq "SEQEND"))
(setq pk1 (cdr (assoc 10 (entget e)))
bulg (cdr (assoc 42 (entget e)))
x1 (car pk1)
y1 (cadr pk1)
pkk (list x1 y1 0)
e (entnext e)
seq (cdr (assoc 0 (entget e)))
)
(setq lbulg (append lbulg (list bulg)))
(setq lista (append lista (list pk1)))
)
(cond ((= cod 10) (setq lex lista))
((= cod 42) (setq lex lbulg))
)
))
)
(if (not lex)
(progn
(princ "\Entitatea nu este agreeata (LWPOLYLINE sau
POLYLINE)!...")
(exit)
)
7-13

Ovidiu Alupei-Cojocariu
lex

AutoLISP - Manual de programare

)
)
Command: ex_geom
Select object:

selectai o polilinie

Apare o caset de dialog care v indic coordonatele


vertexurilor extrase:

S facem un exemplu mai complex:


Desenai un hexagon (POLYGON) cu centrul n punctul (0,0)
, nscris ntr-un cerc de raz 75.

Afiarea n fereastra de dialog este posibil prin utilizarea


prototipului DCL al casetei de dialog i a funciei de control a acesteia
descrise n cadrul capitolului 6 unde s-au dat cteva exepmle de acest
tip.

7-14

Ovidiu Alupei-Cojocariu

7.6

AutoLISP - Manual de programare

Problema 6: Scrierea n fiier a datelor


extrase

S ncercm s scriem extern rezultatele extragerii


informaiilor dintr-o polilinie, utiliznd funcia faex1 (dai un numr
exerciiului creat)
(defun c:faex1()
(initget 7)
(setq nrex(getint "\Numarul exercitiului:"))
(setq file (strcat "c:\\ex" (itoa nrex) ".txt"))
(setq ff (open file "w"))
(setq lpoly (extmnc (ENTGET(car(entsel)))10))
(foreach n lpoly
(if (caddr n)
(setq lscris (strcat (rtos (car n)) " "(rtos (cadr n)) " " (rtos
(caddr n))))
(setq lscris (strcat (rtos (car n)) " "(rtos (cadr n)) " " "0."))
)
(write-line lscris ff)
)
(close ff)
(princ)
)
Command: faex1
Numarul exercitiului:13
Select object: ( selectati polilinia)
Editai fiierul c:\ex13.txt nou creat ca s vedei punctele
create dup extragerea informaiilor geometrice. Dac v deranjeaz s
creai fiiere n acel loc, v rog s modificai calea nscris n apelul
funciei open de deschidere la scriere a fiierului.
7-15

Ovidiu Alupei-Cojocariu

7.7

AutoLISP - Manual de programare

Problema 7: Importul de date vectoriale

Scriei un program care s v asiste la extragerea unor


informaii geometrice, organizate pe coloane, din fiierele externe.
Importul de date vectoriale generate de aplicaii ale
utilizatorilor
Dac se genereaz informaii geometrice n alte programe, de
exemplu cele scrise n TurboPascal sau C++ sau Basic singura
posibilitate de a le transfera n AutoCAD de exemplu sunt fiierele de
date.
Dac se stpnete tehnica formatrii datelor n diferite
standarde de transfer, se pot scrie aceste date astfel nct s poat fi
transferate direct.
O modalitate mai direct, valabil n special cnd datele
generate sunt omogene, adic sunt de acelai tip, o constituie transferul
simplificat, care nu ine seama de formate speciale de transfer ci de
formate bilateral recunoscute.
n cazul AutoCAD, importul acestor date se poate face fie cu
aplicaii furnizate de dezvoltatori externi, fie cu aplicaii scrise de
utilizator ntr-unul din mediile de programare agreate de AutoCAD:
AutoLisp, ARX (C++), sau VisualBasic.
Deoarece formatele sunt n acest caz o convenie bilateral,
programele livrate de dezvoltatori sunt deobicei practic inutilizabile, de
cele mai multe ori ele nerecunoscnd formatul bilateral acceptat.
Formatul cu lungimi fixe de date
Sunt utilizate de obicei formate fixe i/sau formate cu
delimitatori.
Formatele fixe au la baz o convenie de reprezentare care
stipuleaz concret cte poziie ocup fiecare informaie n irul de
caractere reprezentat de fiecare nregistrare (rnd).
Noiunea de nregistrare (rnd de date) este important a fi
cunoscut, deoarece citirea datelor se face de obicei pe rnduri, sau
caracter cu caracter.
Citirea pe rnduri se face mult mai rapid i conduce la o
exploatare mult mai dinamic a datelor citite.

7-16

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
S lum de exemplu cazul transferului unor puncte grafice.
Fiecare rnd va conine dou coordonate x i y(2D) sau trei coordonate
x, y i z (3D).
Fiecare informaie n format fix va ocupa aceeai lungime,
adic va avea acelai numr de caractere.
Acest lucru este dificil de realizat, necesitnd ca programul
care le genereaz s le scrie pe toate ntr-un format fix.
Iat cum poate s arate un astfel de fiier: (ex1.txt)
10.125,15.1545,0
35.125,15.1545,0
35.125,40.1545,0
10.125,40.1545,0
Fiecare rnd are 27 de caractere, primele dou informaii
avnd cte 9 caractere iar ultima avnd 7 caractere. Celelalte dou sunt
separatori de tip virgul (utili pentru citirea vizual a textului.
Un program AutoLisp care poate s citeasc datele rnd cu
rnd, este urmtorul:
(defun c:citdat()
(setq ldat '())
(setq nrex(getint "\Numarul exercitiului:"))
(setq file (strcat "d:\\lisp\\pac3\\ex" (itoa nrex) ".txt"))
(setq f (open file "r"))
(setq sdat (read-line f))
(while sdat
(setq ldat (append ldat (list sdat)))
(setq sdat (read-line f))
)
ldat
)
Odat rulat, rezultatul coninut n lista ldat este de forma:
7-17

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
("10.125,15.1545,0" "35.125,15.1545,0" "35.125,40.1545,0"
"10.125,40.1545,0")
Pentru a obine separarea coordonatelor fiecrui punct grafic
trebuie s spargem fiecare ir.
Iat o funcie car poate s fac acest lucru;
(defun sparge(sir)

;pentru format 6+1+7+1+1 = 16

(setq x (substr sir 1 6))


(setq y (substr sir 8 7))
(setq z (substr sir 16 1))
(list x y z)
)
Putem aplica aceast linie primului element al listei ldat
Command: (sparge (nth 0 ldat))
Rezultatul este: ("10.125" "15.1545" "0")
am obinut o list de coordonate tip ir. Avem ns nevoie de
ele ca numere. Vom scrie o nou funcie de conversie a listei:
(defun ls2ln(lista)
(mapcar 'read lista)
)
Este o funcie elegant de conversie multipl ce face apel la
funcia Autolisp mapcar
O variant mai accesibil este:
(defun ls2lna(lista)
(setq x (read(nth 0 lista)))
(setq y (read(nth 1 lista)))
(setq z (read(nth 2 lista)))
(list x y z)
)

7-18

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
apelurile funciei avnd ca argument primul element al liniei
ldat sunt:
Command: (ls2ln (sparge (nth 0 ldat)))

sau

Command: (ls2lna (sparge (nth 0 ldat)))


Ele conduc la acelai rezultat: (10.125 15.1545 0) o list
format din trei numere , structur compatibil noiunii de punct grafic
n AutoCAD.
S scriem acum o funcie care s uneasc cu o polylinie 2D
(nchis) aceste puncte citite:
(defun drum(lista)
(command "pline" )
(foreach n lista
(command (ls2ln (sparge n)))
)
(command "c")
(princ)
)
Apelul noii funcii:
Command: (drum ldat)
Rezultatul grafic al acestei operaii este prezentat n Figura 1:
l putei vedea cu succesiunea de comenzi
Command: zoom
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window]

<real

time>: e
Command: zoom
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window]
time>: 0.8x

7-19

<real

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
S modificm puin programul astfel nct s listeze i un
numr de ordine al fiecrui punct parcurs, n ordinea desenrii:
(defun drum(lista)
(command "erase" "all" "")
(setq cnt 1)
(command "pline" )
(foreach n lista
(command (ls2ln (sparge n)))
)
(command "c")
(foreach n lista
(command "text" (ls2ln (sparge n)) "3" "0" (itoa cnt))
(setq cnt (1+ cnt))
)
(command "zoom" "e")
(command "zoom" "0.8x")
(princ)
)
Atenie!!
Noua funcie debutez cu tergerea tuturor obiectelor desenate
anterior i faciliteaz vizualizarea traseului generat.
Avem acum o funcie de vizualizare a unui traseu, dar acesta
este dependent de formatul 6+1+7+1+1
Pentru alt format trebuie intervenit n funcia sparge , care
trebuie adaptat.
Formatul variabil cu delimitator fixat
n caz c datele nu mai sunt omogene, citirea cu format fix nu
mai este operant.
Trebuie intervenit i fixat un delimitator care s fie cercetat
atunci cnd spargem rndul citit.
7-20

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Apelai funcia c:citdat astfel nct s efectuai exerciiul 2.
Coninutul acestui fiier este:
61.3604,88.6396,0

181.5685,95.7107,0

132.0711,46.2132,0

57.8249,99.2462,0

188.6396,88.6396,0

125,39.1421,0

68.4315,95.7107,0

181.5685,81.5685,0

132.0711,32.0711,0

75.5025,102.7817,0

174.4975,88.6396,0

125,25,0

71.967,113.3883,0

167.4264,81.5685,0

117.9289,32.0711,0

82.5736,109.8528,0

174.4975,74.4975,0

89.6447,116.9239,0

167.4264,67.4264,0

86.1091,127.5305,0

160.3553,74.4975,0

96.7157,123.9949,0

153.2843,67.4264,0

103.7868,131.066,0

160.3553,60.3553,0

100.2513,141.6726,0

153.2843,53.2843,0

110.8579,138.1371,0

146.2132,60.3553,0

117.9289,145.2082,0

139.1421,53.2843,0

114.3934,155.8148,0

146.2132,46.2132,0

125,152.2792,0

139.1421,39.1421,0

se observ c formatul nu mai este fix, doar separatorul de tip


virgul este prezent i face distincia ntre coordonate.
ncercai s refacei secvena de comenzi
Command: citdat
i
Command: (drum ldat)
Mesajul pe care l primii indic eecul operaiunii. Cauza este
formatul total diferit.
Dac ne uitm bine, nu exist o formul valabil universal
pentru fiecare rnd.

7-21

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Virgulele sunt singurele care ne ajut s nelegem ceva din
textul respectiv. Vom ncerca s gsim o funcie nou de spargere
bazat pe acest caracter.
Pentru operativitate, scriei urmtoarea funcie:
(defun sparge(str1 / lista index sk str)
(setq index 1)
(setq sk 1)
(while (<= index (strlen str1))
(setq str (substr str1 index 1))
(if (= str ",")
(progn
(setq lista (append lista (list (substr str1 sk (- index sk)))))
(setq sk (1+ index))
)
)
(setq index (1+ index))
)
(if (/= (substr str1 sk) "")
(setq lista (append lista (list (substr str1 sk))))
)
lista
)
ncrcai-o i rulai din nou :
Command: (drum ldat)

Ai obinut traseul urmtor :

7-22

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Funcia de spargere utilizat acum funcioneaz i pentru


exerciiul 1, deci este independent de lungimea numerele x, y sau z,
singura condiie fiind ca separatorul s fie ,.
Pentru a testa n continuare i alte exerciii vom crea o funcie
care s permit desenarea imediat ce datele sunt citite:
(defun c:zz()
(c:citdat) (drum ldat)
(princ (strcat "\n...Rezultatul exercitiului" (itoa nrex))) (princ))

7.8

Problema 8: Extragerea informaiilor unor


cercuri

S se scrie un program care s permit extragerea


informaiilor geometrice care caracterizeaz mrimea i poziia unor
cercuri selectate de utilizator.
Geometria particular a cercurilor face ca acestea s marcheze
univoc pozitia unui punct n spaiu, cercul pstrnd pe lng poziia
centrului i mrimea razei informaii privind orientarea UCS-ului
iniial, n care a fost acesta construit.
Datele coninute pot constitui sursa pentru generarea
codurilor NC de prelucrare a gurilor n programarea n 2 axe sau 2
axe cu comutare ntre planurile de fabricare.
7-23

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Descrierea cercului n baza de date AutoCAD.
Orice obiect AutoCAD are ataat o list complex de
informaii care poate fi oricnd investigat i exploatat.
Lista asociat unui obiect este bazat pe existena unor coduri
DXF care se asociaz cu informaiile conexe necesare.
Obinerea listei asociate este uor de obinut utiliznd expresia
AutoLISP:
Command: (entget(car(entsel)))
S facem un prim exerciiu:
Desenai un cerc n punctul (100,100), avnd raza de 25

Aplicai metoda anterioar pentru extragerea listei asociate


segmentului:
Obinei urmtorul mesaj:
Command: (entget(car(entsel)))
Select object: :

selectai cercul

((-1 . <Entity name: 148cd58>) (0 . "CIRCLE") (330 .


<Entity name: 148ccf8>) (5 . "2B") (100 . "AcDbEntity") (67 . 0) (410
. "Model") (8 . "0") (100 . "AcDbCircle") (10 100.0 100.0 0.0) (40 .
25.0) (210 0.0 0.0 1.0))
Am obinut lista de informaii asociate obiectului de tip cerc.
Codurile DXF sunt pe primul loc n fiecare sublist.
7-24

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Vom da n continuare semnificaia ctorva coduri DXF ce
apar n cazul cercurilor:
Semnificaiile Codurilor DXF din listele asociate cercurilor
-1

Numele intern al entitii

Tipul entitii

38

Elevaie (opional; implicit = 0)

39

Thickness (opional; implicit = 0)

10

Centru cerc
Raza cerc

210

Direcie de extrudare (opional; implicit = 0,0, 1) vector 3D

Handle

Nume Layer

Nume tip linie (prezent dac nu e BYLAYER).

62

Numr Culoare (prezent dac nu e BYLAYER).; zero indic


BYBLOCK ; 256 indic BYLAYER;

48

Scara tip linie (opional)


Putem citi acum informaiile din lista asociat.
Centrul cercului: (10 100.0 100.0 0.0); Raza cercului: (40 .

25.0) ;
Direcie de extrudare : (210 0.0 0.0 1.0)
Extragerea informaiei din fiecare sublist se face fcnd apel
la structura formal:
(cdr (assoc cod_dxf lista))
ceea ce pentru informaiile anterioare reprezint:
Command: (setq elist (entget(car(entsel))))
Select object: ((-1 . <Entity name: 148cd58>) (0 . "CIRCLE")
(330 . <Entity name: 148ccf8>) (5 . "2B") (100 . "AcDbEntity") (67 .
0) (410 . "Model") (8 . "0") (100 . "AcDbCircle") (10 100.0 100.0 0.0)
(40 . 25.0) (210 0.0 0.0 1.0))
Command: (setq centru (cdr(assoc 10 elist)))
7-25

Ovidiu Alupei-Cojocariu
(100.0 100.0 0.0)

AutoLISP - Manual de programare

Command: (setq raza (cdr(assoc 40 elist)))


25.0
Observaie: Toate informaiile geometrice referitoare la puncte
sunt pstrate n baza de date a AutoCAD ca fiind exprimate n sistemul
de coordonate global WCS.
Dac dorim s le exprimm n sistemul de coordonate actual
suntem nevoii s aplicm o transformare de coordonate utiliznd
funcia trans.
Ca exemplu, mutai originea UCS n centrul cercului. Tastai
apoi secvena:
Command: (setq centru (trans(cdr(assoc 10 elist))0 1))
Ati obinut rezultatul translatrii informaiei referitoare la
centrul cercului n noul sistem de coordonate (0.0 0.0 0.0)
S trecem s scriem un program care s ne extrag
coordonatele centrului i razele pentru cercurile selectate informaiile
fiind scrise n desenul curent ntr-un tabel.
Pentru operativitate , editai un fiier cu numele cc.lsp , avnd
urmtorul coninut:
(defun c:ed()
(command "edit" "cc.lsp")
)
(defun c:cc()
(load"cc")
)
(defun c:iac()
(prompt "\nSelectati cercurile dorite:")
(setq scerc(ssget))
(setq lcrc '()ldatc'())
(setq cnt 0)
(repeat(sslength scerc)
7-26

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq lcrc(append lcrc (list (ssname scerc cnt))))
(setq cnt(1+ cnt))
)
(foreach n lcrc
(setq linfo (entget n))
(if (= (cdr(assoc 0 linfo)) "CIRCLE")
(progn
(setq raz (cdr(assoc 40 linfo)))
(setq pct (trans(cdr(assoc 10 linfo))0 1))
(setq lcnt (list raz (car pct)(cadr pct)))
(setq ldatc (append ldatc (list lcnt)))
)
)
)
(command ucs w)
(setq pins (getpoint "\nPunct de inserare tabel:"))
(setq cnt 1)
(command "insert" "d:\\lisp\\pac3\\tab" pins 1 1 0 "Nr." "Raza" "X"
"Y")
(foreach n ldatc
(setq pins (mapcar '+ pins (list 0 -6 0)))
(command "insert" "d:\\lisp\\pac3\\tab" pins 1 1 0 cnt
(rtos(car n)2 2) (rtos(cadr n)2 2)(rtos(caddr n)2 2))
(setq cnt (1+ cnt))
)
(command ucs p)
(princ)
)
7-27

Ovidiu Alupei-Cojocariu
(defun c:scrie_fis()

AutoLISP - Manual de programare

(prompt "\nNume fisier extragere cercuri:")


(setq fis (getstring))
(setq ff (open fis "w"))
(setq cnt 1)
(write-line (strcat "Nr.""\t""Raza""\t" "X""\t""Y") ff)
(foreach n ldatc
(write-line (strcat (itoa cnt)"\t"(rtos(car n)2 2)"\t"(rtos(cadr n)2
2)"\t"(rtos(caddr n)2 2)) ff)
(setq cnt (1+ cnt))
)
(close ff)
(princ)
)
Vom explica pas cu pas ce face acest program:
(defun c:ed()
(command "edit" "cc.lsp")
)
Funcia ed va permite editarea rapid a fiierului cc.lsp n
cazul n care ai fcut greeli la transcrierea fiierului.
(defun c:cc()
(load"cc")
)
Funcia cc va ncrca rapid fiierul cc.lsp la sfritul fiecrei
editri
Pentru funcia iac vom explica cele mai importante momente:
(prompt "\nSelectati cercurile dorite:")
(setq scerc(ssget))
7-28

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Formarea setului de selecie care conine cercurile vizate.
Selectarea fcndu-se probabil i cu crossing sau window este posibil
ca n acest set s se gseasc i alte obiecte dect cercuri.
(setq lcrc '()ldatc'())
Iniializare a unor liste interne
(setq cnt 0)
(repeat(sslength scerc)
(setq lcrc(append lcrc (list (ssname scerc cnt))))
(setq cnt(1+ cnt))
)
Transformare a setului de obiecte ntr-o list de obiecte (listele
sunt mai uor de manipulat n AutoLISP)
(foreach n lcrc
(setq linfo (entget n))
(if (= (cdr(assoc 0 linfo)) "CIRCLE")
(progn
(setq raz (cdr(assoc 40 linfo)))
(setq pct (trans(cdr(assoc 10 linfo))0 1))
(setq lcnt (list raz (car pct)(cadr pct)))
(setq ldatc (append ldatc (list lcnt)))
)
)
)
Crearea listei de date pentru cercuri, pornind de la lista de
entiti selectate . (cu filtrarea numai a cercurilor)
(command ucs w)
(setq pins (getpoint "\nPunct de inserare tabel:"))
(setq cnt 1)
7-29

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(command "insert" "tab" pins 1 1 0 "Nr." "Raza" "X" "Y")
(foreach n ldatc
(setq pins (mapcar '+ pins (list 0 -6 0)))
(command "insert" "d:\\lisp\\pac3\\tab" pins 1 1 0 cnt
(rtos(car n)2 2) (rtos(cadr n)2 2)(rtos(caddr n)2 2))
(setq cnt (1+ cnt))
)
(command ucs p)
Inserarea informaiilor n tabelul TAB care este un bloc cu
atribute, creat n mod special.
Capul de tabel va fi inserat primul, urmat de inserarea fiecrei
liste de informaii pentru cercuri din ldatc.
Alinierea rndurilor este asigurat de incrementarea punctului
de inserare pins cu ajutorul funciei mapcar.
Numerotarea fiecrui rnd este asigurat de contorul cnt.
Transcrierea informaiei n tabel este formatat prin reinerea a
doar dou zecimale prin secvena (rtos numar 2 2) .
Tabelul va fi inserat ntotdeauna vertical datorit comutrilor
de UCS n prealabil WCS i la final Previous
(defun c:scrie_fis()
(prompt "\nNume fisier extragere cercuri:")
(setq fis (getstring))
(setq ff (open fis "w"))
(setq cnt 1)
(write-line (strcat "Nr.""\t""Raza""\t" "X""\t""Y") ff)
(foreach n ldatc
(write-line (strcat (itoa cnt)"\t"(rtos(car n)2 2)"\t"(rtos(cadr n)2
2)"\t"(rtos(caddr n)2 2)) ff)
(setq cnt (1+ cnt))
7-30

Ovidiu Alupei-Cojocariu
)

AutoLISP - Manual de programare

(close ff)
(princ)
)
Funcia scrie_fis permite scrierea informaiilor din lista ldatc
ntr-un fiier cu numele dorit de utilizator.
Blocul TAB poate fi generat dac utilizm urmtoarele
indicaii:

Exemplu de utilizare
S desenm urmtoarele :

7-31

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Vom aplica funcia iac pentru mai multe poziii succesive ale
UCS
Prima dat va fi WCS, apoi cu UCS-ul amplasat n punctul A,
apoi cu el amplasat n mijlocul B al figurii. Rezultatul este:

Se observ c datele nscrise pentru cercuri sunt diferite n


cele trei cazuri, chiar dac selectarea lor a fost fcut n aceeai ordine.
Cercurile nu ar fi fost ordonate dac selectarea ar fi fost fcut
cu crossing sau cu window.
Pentru a obine astfel de efecte de ordonare dup raz sau
dup coordonatele X respectiv Y, lista de date ldat ar trebui ordonat
cu funcii AutoLISP scrise special.

7.9

Problema 9: Parametrizare desene 2D

Parametrizarea desenelor prin AutoLISP


Un mobil important al utilizrii AutoCAD este realizarea
rapid a proiectelor care implic folosirea de elemente prefabricate,
predimensionate. Aceste desene sunt menite a fi introduse n proiectul
curent ca module a cror validare a fost fcut n urma analizei
specifice metodei de proiectare aplicate.

7-32

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Posibilitile de utilizare a desenelor prefabricatre depind de
capacitatea de versatilitate dimensional a acestora.
Este posibil de exemplu utilizarea blocurilor predesenate i
salvate pe disc. Aceste desene, la inserarea lor au posibilitatea de a fi
adaptate prin utilizarea factorilor de scar independeni pe direciile
X,Y,Z precum i utilizarea unei rotiri n momentul inserrii. Aceast
scalare pur geometric este ns nsoit de deformarea obiectelor
componente ceea ce nu satisface ca utilizare.
Desenele reprezentnd piese tipizate nu sunt ntotdeauna
expresia unor transformri de scalare pur i simplu, ci o generare
difereniat n funcie de tipodimensiunea aleas.
De aceea este necesar ca descrierea acestui desen s fie fcut
prin evidenierea unor parametri care s fie expresia unor cote formale
care descriu topologic poziia relativ a diferitelor elemente geometrice
ce l compun.
AutoLISP permite elaborarea unor funcii complexe de
desenare care s satisfac acest mod particular de desenare.
Se disting urmtoarele etape importante n funcionarea
acestor programe:

Primirea informaiilor referitoare la valorile actuale ale


parametrilor ce descriu piesa;

Calculul punctelor
conducerii desenrii;

Construcia geometric (desenarea) propriu-zis.

geometrice

caracteristice,

necesare

Actualizarea parametrilor este posibil a fi realizat prin


intermediul unei funcii de dialog i generare de date.
Am vzut c dialogul poate fi realizat prin mai multe metode,
introducerea datelor avnd o fluen mai mare sau mai mic.
Utilizarea unui numr mare de parametri (expresie a cotelor
considerate variabile) conduce la diferenierea diferitelor tipuri de
dialog , din punct de vedere al productivitii fluenei de execuie a
programului.
La un numr mic de parametri 1-2, dialogul direct utiliznd
funciile de tip getxxx este de preferat. Numrul mare de parametri va
duce la o lungire important timpului de introducere a datelor,
7-33

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
programul devenind plicticos. Faptul c fiecare introducere manual a
unei date d posibilitatea introduceri incorecte a informaiilor va
conduce la introducerea unor funcii amnunite de evitare a acestor
introduceri eronate, deci la un timp substanial de programare.
Simplificarea introducerii datelor poate surveni prin
codificarea seturilor de date, introducerea fiind de tip bloc de date.
Piesele parametrizate sunt n general piese cu reprezentare
tabelar (matriceal) a cotelor-parametri. Diferenele dintere piese sunt
evideniate de poziia diferit pe rnduri a diferitelor tipodimensiuni.
Alegerea se va putea face n consecin prin indicarea unei poziii
(pointer) de rnd n tabelul (matricea) care descrie toate piesele din
acea familie.
Unii productori de piese tipizate furnizeaz i un cod de
catalog, cod care poate fi utilizat fie n cadrul dialogului pentru a indica
efectiv piesa dorit, fie ca informaie auxiliar n vederea stabilirii
listelor de componen a desenelor, liste ce pot fi utilizate chiar n
cadrul emiterii unei note de comand generat automat.
Indiferent c desenul parametrizat este 2D sau 3D, cele
enunate anterior rmn valabile.
Aspectul general al unui program, am vzut, depinde
substanial de tipul dialogului utilizat. Cea mai atractiv form de
dialog rmne fr ndoial utilizarea ferestrelor de dialog. Acset mod
de dialog este ns accesibil unor programatori evoluai. Petru
programatorii nceptori se propune tranziia, ncepnd cu dialoguri
simple de tip getxxx ctre acest din urm model evoluat de dialog.
Calculul informaiilor geometrice (puncte grafice) poate fi
fcut independent de funcia de comand efectiv a desenrii, i este
bine s se fac astfel, deoarece testarea fiecrui modul independent este
mult mai uoar. Un programator nceptor nu poate face rabat de la o
structurare exagerat a programelor , orice rabat la aceast metod fiind
permis doar programatorilor experimentai care vor fi n stare s fac
un compromis ntre o depanare mai dificil (dac l scrii bine ce mai ai
de depanat?) i timpul necesar scrierii programului.
Ultima parte, conducerea desenrii, este omogen, fiind o
succesiune de apeluri ale funciei command. n aceast funcie,
parametri introdui prin funcia de dialog mpreun cu punct
geometrice, parametrizate i ele, sunt utilizai pentru descrierea
argumentelor funciilor command apelate succesiv.
7-34

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Iat o prezentare general a structurii unui astfel de program
pentru desenarea unei obiect deschis parametric.
; Functie de dialog introducere parametri
(defun date()
(setq A(getreal "\nDai parametrul A:")
(setq B(getreal "\nDai parametrul B:")

(setq Z(getreal "\nDai parametrul Z:")


(setq p0 (getpoint "\nPunct de inserare:"))
(setq un0(getorient p0"\nOrientarea desenului:"))
);end date
; Functie de calcul puncte geometrice
(defun puncte()
(setq p1 (list (/ A 2.) B D))
(setq p2 (polar p1 pi 120))
.
(setq pn (list A B C))
);end puncte
; Functie de desenare
(defun desen()
(command "UCS" "o" p0)
(command "UCS" "Z" un0)
(command "LINE" p1 p2 "")
..
(command "CIRCLE" p 34 "D" B)
);end desen
; Program principal
(defun c:piesa_test()
7-35

Ovidiu Alupei-Cojocariu
(date)

AutoLISP - Manual de programare

(puncte)
(desen)
(prompt "\nAm terminat de desenat!:")
)
Funciile astfel construite sunt omogene fiecare att n ceea ce
privete destinaia lor, ct i al funciilor AutoLISP pe care le conin.
Funcia date conine preponderent funcii din familia getxxx
cu ajutorul crora se realizeaz dialogul de introducere al dateleor.
Funcia puncte este axat pe constrirea punctelor geometrice
2D sau 3D i va folosi preponderent funcii care au ca efect generarea
de list (list) sau funcii care n urma evalurii lor genereaz informaii
geometrice (polar, trans, inters, etc.). Evident, o serie de calcule
intermediare nu sunt excluse a fi efectuate n cadrul acestei funcii.
Funcia desen conine apeluri succesive ale funciei command
prin intermediul crora se deseneaz, dar nu trebuie s nu evideniem
importana orientrii sistemelor de coordonate succesive care
concureaz la o descriere eficient a desenului. De altfel funcia
debuteaz cu crearea unor noi UCS-uri prin deplasarea originii celui
vechi n punctul indicat ca punct de inserare, urmat de o rotire cu
unghiul indicat n dialog.
Modularizarea ajut mult dac privim prin prisma evoluiei
programatorului.
Funciile independente pot fi uor nlocuite cu echivalentul lor
evoluat, ceea ce am artat, este valabil mai ales n cazul funcei de
introducere a datelor prin dialog.
Simpla adugare a unei funcii noi de dialog, urmat de un
apel adecvat denumirii sale n programul principal, va conduce la o
modernizare efectiv a programului de desenare a piesei parametrizate.
S prezentm un prim exemplu de desenare parametrizat 2D:

7-36

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare


P2

P3
P4

P5

P1

P6

P7

P8

Este vorba de o buc, prezentat n seciune axial, haurat.


Cotele sunt nscrise literal, ele constituie parametri ai
desenului.
Se observ orientarea piesei, dat de unghiul u0 fa de
direcia original a axei X n WCS.
Pe baza acestei reprezentri se alege un punct reprezentativ
care s exprime o origine local a piesei.
ntr-un astfel de UCS local, prezentat de altfel n figur, se
vor calcula tate punctele caracteristice necesare descrierii geometrice a
piesei. n figura urmtoare am indicat toate aceste puncte:
Dac privim ambele figuri, se pot exprima toate cele opt
puncte n coordonate fa de sistemul propriu al piesei.
Punctele astfel descrise sunt dependente de parametrii care
descriu piesa:
Punct

P1

B/2

P2

A/2

P3

E-D

A/2

P4

E-D

C/2

P5

C/2

P6

B/2

P7

-A/2
7-37

Ovidiu Alupei-Cojocariu
P8

AutoLISP - Manual de programare


E

-B/2

Se observ c punctele P7 i P8 sunt exprimri n oglind fa


de axa X ale punctelor P1 i P6.
Se poate trece la scrierea programului, care va arta cam aa:
; Progrma de desenare a unei piese parametrizate
; BUCSA
; autor : A.O. 1998
(defun date()
(setq A (getreal "\nDati parametrul A:"))
(setq B (getreal "\nDati parametrul B:"))
(setq C (getreal "\nDati parametrul C:"))
(setq D (getreal "\nDati parametrul D:"))
(setq E (getreal "\nDati parametrul E:"))
(setq p0 (getpoint "\nPunctul de inserare:"))
(setq u0 (* (getorient p0 "\nOrientare:")(/ 180 pi)))
)
(defun puncte()
(setq p1 (list 0 (/ B 2)0))
(setq p2 (list 0 (/ A 2)0))
(setq p3 (list (- E D) (/ A 2)0))
(setq p4 (list (- E D) (/ C 2)0))
(setq p5 (list E (/ C 2) 0))
(setq p6 (list E (/ B 2) 0))
(setq p7 (mapcar '* '(1 -1 1) p1))
(setq p8 (mapcar '* '(1 -1 1) p6))
)
(defun desen()
(command "UCS" "o" p0)
7-38

Ovidiu Alupei-Cojocariu
(command "UCS" "Z" u0)

AutoLISP - Manual de programare

(command "pline" p1 p2 p3 p4 p5 p6 "c")


(setq pl1 (entlast))
(command "MIRROR" pl1 "" (list 0 0) (list 1 0) "N")
(setq pl2 (entlast))
(command "LINE" p1 p7 "")
(command "LINE" p6 p8 "")
(command "HATCH" "U" 45 (/ E 10.) "N" pl1 pl2 "")
(command "UCS" "W")
)
(defun c:piesa_test()
(date)
(puncte)
(desen)
)
O prim mbuntire a dialogului este prezentarea unei
imagini a piesei cotate, imagine care s apar la momentul n care sunt
cerui parametrii i care s dispar n momentul n care sunt cerute
informaiile de orientare.
Am ales ca exemplu posibilitatea apelrii unui slide care s
indice piesa cotat i orientarea sa:
(defun date_slide()
(command "VSLIDE" "D:\\Lisp\\Work\\Curs\\bucsa")
(setq A (getreal "\nDati parametrul A:"))
(setq B (getreal "\nDati parametrul B:"))
(setq C (getreal "\nDati parametrul C:"))
(setq D (getreal "\nDati parametrul D:"))
(setq E (getreal "\nDati parametrul E:"))
(redraw)
7-39

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq p0 (getpoint "\nPunctul de inserare:"))
(setq u0 (* (getorient p0 "\nOrientare:")(/ 180 pi)))
)
Se observ apariia a dou noi rnduri, unui corespunztoe
apelului comenzii VSLIDE, cellalt, al forrii redesenrii cu funcia
redraw.
(defun date_f()
(setq f (open "d:\\Lisp\\Work\\Curs\\bucsa.dat" "r"))
(setq lista '())
(setq lis_t '())
(setq line (read-line f))
(while line
(setq lin_t line)
(setq line (read line))
(setq lis_t (append lis_t (list lin_t)))
(setq lista (append lista (list line)))
(setq line (read-line f))
)
(close f)
(if (not (nth 0 lista))
(progn (prompt "\nDate inexistente!")(datej))
)
)
(defun interp ()
(setq a (nth 0 date))
(setq b (nth 1 date))
(setq c (nth 2 date))
(setq d (nth 3 date))
7-40

Ovidiu Alupei-Cojocariu
(setq e (nth 4 date))

AutoLISP - Manual de programare

(setq f (nth 5 date))


)
(defun poza (tile slide)
(setq x (dimx_tile tile)
y (dimy_tile tile)
)
(start_image tile)
(fill_image 0 0 x y -16)
(slide_image 0 0 x y slide)
(end_image)
)
(defun ddat()
(setq dd (read (nth 0 lis_t)))
(setq len (length dd))
(setq cnt 0)
(while (<= cnt (1- len))
(set (nth cnt dd) (nth cnt date))
(setq cnt (1+ cnt))
)
)
(defun datej ()
(command "vslide" "d:\\Lisp\\Work\\Curs\\bucsa")
(setq a (getreal "\nCota A:"))
(setq b (getreal "\nCota B:"))
(setq c (getreal "\nCota C:"))
(setq d (getreal "\nCota D:"))
(setq e (getreal "\nCota E:"))
7-41

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq f (getreal "\nCota F:"))
(command "redraw")
)
(defun orientare ()
(setq PS (getpoint "\nPunct amplasare:"))
(setq ang (getorient PS "\nOrientare:"))
(setq ang (* ang (/ 180 pi)))
(command "UCS" "O" PS)
(command "UCS" "Z" ang)
)
(defun diag()
(date_f)
(setq dcl_id (load_dialog "d:\\Lisp\\Work\\Curs\\dialog.DCL"))
(if (not (new_dialog "caseta" dcl_id)) (exit))
(poza "poza" "d:\\Lisp\\Work\\Curs\\bucsa")
(start_list "lista_cote")
(mapcar 'add_list lis_t)
(end_list)
(action_tile "lista_cote" "(setq date (read (nth (atoi $value)
lis_t)))(done_dialog)")
(action_tile "accept" "(done_dialog)")
(action_tile "cancel" "(done_dialog)")
(start_dialog)
(unload_dialog dcl_id)
(ddat)
)
(defun c:bucsa ()
(setq ans (getstring "\nDate manual sau automat?[M/A]:"))
7-42

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(if (or (= ans "M")(= ans "m"))
(datej)
(diag)
)
(orientare)
(puncte)
(desen)
)
Programul astfel rescris va avea posibilitatea s funcioneze cu
dou funcii diferite de date.
S-au separat informaiile referitoare la obinerea orientrii
pentru a avea o singur funcie, consecutiv dialogului, care s
realizeze orientarea desenrii.
Pentru exemplificare, iat cum arat dialogul automat:

Evident, butoanele din ok_cancel sunt acoperite de


expandarea momentan a listei care conine inforaniile din fiierul
bucsa.dat.
Fiierul DCL corespunztor i cel de date sunt prezentate n
continuare:
7-43

Ovidiu Alupei-Cojocariu
Dialog.dcl

AutoLISP - Manual de programare

dcl_settings : default_dcl_settings { audit_level = 3 ; }


caseta : dialog {
key = "cor" ;
label = "bucsa" ;
: image {
key = "poza" ;
color = 5 ;
width = 50;
height = 20;
}
: popup_list {
key = "lista_cote" ;
width = 50;
}
ok_cancel;
}
bucsa.dat
(A B C D E )
(85 40 70 100 120)
(160 120 140 75 100)
(100 50 65 75 90)
Iat cum, penru aceeai pies pot fi scrise mai multe
programe, toate fiind corespunztoare unui anumit moment n evoluia
programatorului.

7.10 Problema 10: Parametrizare desene 3D


Modelarea solid cu AutoLISP
7-44

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Desenele 3D, modelele solide sunt utilizate mai ales n
aplicaiile de proiectare a ansamblurilor ce conin multiple obiecte ce
compun dispozitive de prelucrare sau maini.
Aceste obiecte sunt n general tipizate, proiectarea unei astfel
de instalaii fiind mult uurat prin prezena unei biblioteci complete de
componente.
Principiile moderne de proiectare combin abilitile de
modelare cu cele de valorificare a obiectelor deja desenate. Viteza de
lucru este mult mrit, deci productivitatea este crescut.
Amplasarea obiectelor 3D n cmpul geometric permite o
modelare geometric complet, oferind posibilitatea unor investigaii
topologice care s exclud calcule complicate. Prezena obiectelor
solide, disponibilitatea unei aplicaii care s le poat gestiona, duce la
rezolvri importante n domeniul logisticii sistemelor de fabricaie
pentru instalaii de tip unicat sau serie mic.
Piesele modelate prin AutoLISp au un excepional avantaj fa
de modelarea clasic prin desenare propriu-zis: acela al spaiului de
stocare extrem de redus.
Toate programele AutoLISP sunt ASCII i conin n esen
acelai lucru: o seciune generatoare de date de modelare i o seciune
de comand propriu-zis a modelrii. Obiectul astfel descris , odat ce
va fi desenat va ocupa un spaiu de memorie mult mai mare dect
programul care l-a generat. Dac intervine i parametrizarea,
posibilitatea de a modela cu acelai program a mai multor piese,
confer acestei economii de spaiu o i mai mare amploare.
Modelarea solid are o serie de particulariti, cea mai
important dintre ele fiind necesitatea manipulrii precise a sistemelor
de coordonate succesive, menite s creeze coniiile de reprezentare a
elementelor solide componente. n plus, modelarea are o serie de
particulariti izvorte din unele probleme specifice modelrii cu
AutoCAD.
Dei AutoCAD ofer o serie de faciliti importante, cum sunt
teiturile, racordrile, utilizarea lor direct, aa cum ar fi posibil ntr-o
modelare on-line produce o serie de efecte inconsecvente.
Deoarece selectarea elementelor geometrice , muchii, puncte
este influenat de punctul de vizualizare, funcionarea programelor fa f
influenat de contextul geometric n care este utilizat, ceea ce nu este
de dorit.
7-45

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Trebuie de aceea intervenit i modelat pe ct posibil prin
comenzi care s nu fac necesar o selectare on-line chiar dac
programul o face automat.
S lum un prim exemplu, acela al unei prisme de aezare
utilizate n sprijinul unor piese de tip arbore.

Piesa este descris de o sumedenie de parametri (19)


reprezentai de cote asociate n desenul prezentatn STAS 8881-71.
Pentru reprezentarea acestei piese s-a folosit urmtorul
program AutoLISP:
(defun g2t(d h c ung / c1 c2 c3)
(command "cylinder" (list 0 0 (- c)) (/ d 2.) (-(- h (* 2 c))))
(setq c1 (entlast))
(command "circle" (list 0 0 (- c)) (/ d 2.))
(command "extrude" (entlast) "" c (- ung))
(setq c2 (entlast))
(command "circle" (list 0 0 (-(- h c))) (/ d 2.))
(command "extrude" (entlast) "" (- c) (- ung))
(setq c3 (entlast))
(command "union" c1 c2 c3 "")
c1
)
(defun g1t(d c h ung / c1 c2 ct1)
(command "cylinder" (list 0 0 (- c)) (/ d 2.) (-(- h (* 2 c))))
7-46

Ovidiu Alupei-Cojocariu
(setq c1 (entlast))

AutoLISP - Manual de programare

(command "circle" (list 0 0 (- c)) (/ d 2.))


(command "extrude" (entlast) "" c (- ung))
(setq c2 (entlast))
(command "union" c1 c2 "")
c1
)
(defun gtsci (d1 h d2 t1 / c1 c2 c3)
(command "cylinder" (list 0 0 0) (/ d1 2.) (- h))
(setq c1 (entlast))
(command "cylinder" (list 0 0 0) (/ d2 2.) (- t1))
(setq c2 (entlast))
(command "union" c1 c2 "")
c1
)
(defun pris (poly B / c1)
(command "extrude" poly (- b))
(setq c1 (entlast))
)
(defun pris2t (poly b c ung / c1 c2 c3 ct1)
(command "copy" poly "" (list 0 0 0)(list 0 0 (- c)))
(command "extrude" (entlast) "" (- (- b (* 2 c))) 0)
(setq c1 (entlast))
(if (/= c 0)
(progn
(command "copy" poly "" (list 0 0 0)(list 0 0 (- (- b c))))
(command "extrude" (entlast)"" (- c) (- ung))
(setq c2 (entlast))
7-47

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(command "copy" poly "" (list 0 0 0)(list 0 0 (- c)))
(command "extrude" (entlast) "" c (- ung))
(setq c3 (entlast))
(command "union" c1 c2 c3 "")
)
)
c1
)
(defun date8881-71()
(setq date (list
'(d1 l b h n d k m p f b1 s c d11 d12 t1 h1 r ms)
'(20 45 22 16 18 5 9 6 30 7 8 5 12 6.6 11 6.8 31 1 0.089)
'(25 55 22 20 24 5 11 8 40 7 8 5 12 6.6 11 6.8 38 1 0.139)
'(32 70 28 25 30 6 14 12 50 10 8 6 16 9 14 9 48 1 0.280)
'(40 85 28 32 37 6 18 16 65 10 8 6 16 9 14 9 58 1.6 0.457)
'(63 100 36 40 57 8 22 20 85 12 12 7 22 11 17.5 11 87 1.6 0.8)
'(80 120 36 45 65 8 28 32 90 12 12 7 22 11 17.5 11 109 1.6 1.125)
'(100 140 45 50 85 10 32 40 110 14 17 8 29 14 20 14 128 1.6 1.625)
'(125 190 45 65 120 10 45 50 150 14 17 8 29 14 20 14 154.5 1.6 2.730)
))
(setq pins (getpoint "\Punct de amplasare:"))
(setq lm '())
(foreach n date
(setq lm (append lm (list (nth 0 n))))
)
(setq lm (cdr lm))
(princ "\nDiametrul de lucru <= ")(princ lm)(princ ":")
(initget 7)
7-48

Ovidiu Alupei-Cojocariu
(setq d1(getint))

AutoLISP - Manual de programare

(setq llu (assoc d1 datl))


(setq ldate (assoc d1 date))
(setq l (nth 1 ldate))
(setq b (nth 2 ldate))
(setq h (nth 3 ldate))
(setq n (nth 4 ldate))
(setq d (nth 5 ldate))
(setq k (nth 6 ldate))
(setq m (nth 7 ldate))
(setq p (nth 8 ldate))
(setq f (nth 9 ldate))
(setq b1 (nth 10 ldate))
(setq s (nth 11 ldate))
(setq c (nth 12 ldate))
(setq d11 (nth 13 ldate))
(setq d12 (nth 14 ldate))
(setq t1 (nth 15 ldate))
(setq h1 (nth 16 ldate))
(setq r (nth 17 ldate))
(setq ms (nth 18 ldate))
(princ)
)
(defun placa(a b c)
(command"box" (list 0 0 0) "l" a b c)
(entlast)
)
(defun movucs(punct)
7-49

Ovidiu Alupei-Cojocariu
(command "ucs" "o" punct)

AutoLISP - Manual de programare

)
(defun c:8881-71()
(setvar "cmdecho" 0)
(date8881-71)
(setq pinsw (trans pins 1 0))
(command "ucs" "o" pins)
(setq c1 (placa l b h))
(setq nucs (list (- (/ l 2.)(/ p 2.)) f h))
(movucs nucs)
(setq c2(gtsci d11 h d12 t1))
(command "ucs" "p")
(setq nucs (list (+ (/ l 2.)(/ p 2.)) (- b f) h))
(movucs nucs)
(setq c3 (gtsci d11 h d12 t1))
(command "ucs" "p")
(setq nucs (list (+ (/ l 2.)(/ p 2.)) s h))
(movucs nucs)
(setq c4 (g2t d h 1 45))
(command "ucs" "p")
(setq nucs (list (- (/ l 2.)(/ p 2.)) (- b s) h))
(movucs nucs)
(setq c5 (g2t d h 1 45))
(command "ucs" "p")
(command "ucs" "o" (list (/ l 2.) 0 h))
(command "ucs" "x" 90)
(command "pline" (list (-(/ n 2.)) 0 0)
(list (/ n 2.) 0 0)
7-50

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(list 0 (- (/ n 2.)) 0)
"c"
)
(setq pl1 (entlast))
(setq c6(pris2t pl1 b 1.5 45))
(command "pline" (list (-(/ m 2.))(- k)0)
(list (/ m 2.)(- k)0)
(list (/ m 2.) 0 0)
(list (-(/ m 2.))0 0)
"c"
)
(setq pl2 (entlast))
(setq c7(pris2t pl2 b 0 0))
(command "pline" (list (-(/ m 2.))(- n)0)
(list (/ m 2.)(- n)0)
(list (/ m 2.) 0 0)
(list (-(/ m 2.))0 0)
"c"
)
(setq pl3 (entlast))
(setq c8(pris2t pl3 b 0 0))
(command "subtract" c6 "" c8 "")
(command "union" c6 c7 "")
(command "subtract" c1 "" c2 c3 c4 c5 c6 "")
(entdel pl1)(entdel pl2)(entdel pl3)
(command "ucs" "p")(command "ucs" "p")
(princ)
)
7-51

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Pe lng funcia generatoare de date date8881-71 i programul
principal c:8881-71, s-au utilizat i o serie de funcii auxiliare care
uureaz modelarea 3D. Acestea sunt scrise pentru desenarea unor
prisme teite, a unor guri.
Pentru desenarea 3D, parametrizat a unor boluri de aezare
descrise conform DIN 6321, se propune urmtorul program:
(defun date6321()
(setq date (list
'(d1 l1a l1bcs l1bcl b d2 l2 l3 l4 t)
'(6 5 7

12 1 4 6 1.2 4 0.02)

'(8 5 10

16 1.6 6 9 1.6 6 0.02)

'(10 6 10

18 2.5 6 9 1.6 6 0.02)

'(12 6 10

18 2.5 6 9 1.6 6 0.02)

'(16 8 13

22 3.5 8 12 2 8 0.04)

'(20 8 15

25 5 12 18 2.5 9 0.04)

'(25 10 15

25 5 12 18 2.5 9 0.04)

))
(setq lm '())
(foreach n date
(setq lm (append lm (list (nth 0 n))))
)
(setq lm (cdr lm))
(setq forma (strcase(getstring "\nForma boltului [A/B/C]:")))
(if (or(= forma "B")(= forma "C"))
(setq ll (strcase(getstring "\nLung/Scurt:")))
)
(princ "\nDiametrul D1")(princ lm)(princ ":")
(setq d1 (getreal))
(setq ldate (assoc d1 date))
7-52

Ovidiu Alupei-Cojocariu
(setq d2 (nth 5 ldate))

AutoLISP - Manual de programare

(cond ((= forma "A")(setq l1 (nth 1 ldate)))


((and(= forma "B")(= ll "S"))(setq l1 (nth 2 ldate)))
((and(= forma "B")(= ll "L"))(setq l1 (nth 3 ldate)))
((and(= forma "C")(= ll "S"))(setq l1 (nth 2 ldate)))
((and(= forma "C")(= ll "L"))(setq l1 (nth 3 ldate)))
)
(setq b (nth 4 ldate))
(setq d2(nth 5 ldate))
(setq l2(nth 6 ldate))
(setq l3(nth 7 ldate))
(setq l4(nth 8 ldate))
)
(defun c:bolt()
(setvar "cmdecho" 0)
(date6321)
(if (not ldate)
(alert "Date inexistente pentru diametrul cerut")
(progn
(cond ((= forma "A")(desen_a))
((= forma "B")(desen_b))
((= forma "C")(desen_c))
)
)
)
(princ)
)
(defun desen_a( )
7-53

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq pamp (getpoint "\nPunct amplasare:"))
(command "ucs" "o" pamp)
(fabaza)
(command "cylinder" (list 0 0 0) (/ d1 2.) (- l1 1))
(setq c1 (entlast))
(command "cylinder" (list 0 0 0) (/ d2 2.) (- (- l2 l3)) )
(setq c2 (entlast))
(command "ucs" "o" (list 0 0 (- l1 1)) )
(command "circle" (list 0 0 0) (/ d1 2.))
(command "extrude" (entlast) "" 1 15)
(setq cc1 (entlast))
(command "ucs" "r" "baza")
(command "ucs" "o" (list 0 0 (- (- l2 l3))))
(command "circle" (list 0 0 0) (/ d2 2.))
(command "extrude" (entlast) "" (- l3) 15)
(setq cc2 (entlast))
(command "union" c1 c2 cc1 cc2 "")
(princ)
)
(defun desen_b()
(setq pamp (getpoint "\nPunct amplasare:"))
(command "ucs" "o" pamp)
(command "cylinder" (list 0 0) (/ d1 2.) (- l1 l4) "")
(setq c1 (entlast))
(command "cylinder" (list 0 0) (/ d2 2.) (- (- l2 l3)) "")
(setq c2 (entlast))
(command "circle" (list 0 0 (- l1 l4)) (/ d1 2.))
(command "extrude" (entlast) "" l4 15)
7-54

Ovidiu Alupei-Cojocariu
(setq cc1 (entlast))

AutoLISP - Manual de programare

(command "circle" (list 0 0 (- (- l2 l3))) (/ d2 2.))


(command "extrude" (entlast) "" (- l3) 15)
(setq cc2 (entlast))
(command "union" c1 c2 cc1 cc2 "")
(princ)
)
(defun desen_c()
(setq pamp (getpoint "\nPunct amplasare:"))
(command "ucs" "o" pamp)
(command "cylinder" (list 0 0) (/ d1 2.) (- l1 l4) "")
(setq c1 (entlast))
(command "cylinder" (list 0 0) (/ d2 2.) (- (- l2 l3)) "")
(setq c2 (entlast))
(command "circle" (list 0 0 (- l1 l4)) (/ d1 2.))
(command "extrude" (entlast) "" l4 15)
(setq cc1 (entlast))
(command "circle" (list 0 0 (- (- l2 l3))) (/ d2 2.))
(command "extrude" (entlast) "" (- l3) 15)
(setq cc2 (entlast))
(command "union" c1 c2 cc1 cc2 "")
(setq c1t (entlast))
(tes)
(command "subtract" c1t "" mrr "")
(princ)
)
(defun tes()
(setq t1 (/ b 2.))
7-55

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
(setq dia1 (/ (+ (sqrt (- (* d1 d1)(* t1 t1)))
(* t1 (/ (cos (/ pi 6))(sin (/ pi 6))))
)2
)
)
(setq dia2 (/ dia1 (/ (cos (/ pi 6))(sin (/ pi 6)))))
(command "pline" (list dia1 0) (list 0 dia2)
(list (- dia1) 0)(list 0 (- dia2)) "c")
(command "extrude" (entlast) "" l1 0)
(setq prr (entlast))
(command "cylinder" (list 0 0) (* 0.75 d1) l1)
(setq crr (entlast))
(command "subtract" crr "" prr "")
(setq mrr (entlast))
)
Pot fi generate trei tipuri de boluri de orientare, formele A, B
i C, alegerea lor i a parametrilor lor geometrici fiind fcut printr-un
dialog.

7-56

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Un ultim exemplu este desenarea 3D model solid a unui urub


cu cap hexagonal necat.
Am ales s fac un program care s fie utilizat ca o funcie
AutoLISP, cu parametrii introdui ca argumente ale funciei.
Acest tip de funcie, care poate fi intern unui program mai
dezvoltat are o mare versatilitate, evident datorit posibilitii de a se
introduce ca argumente de apel a unor valori nerestricionate
dimensional.

Evident, descrierea cu ajutorul a doar doi parametri este


uoar, dar impune o descriere a celorlalte informaii geometrice
7-57

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
funcie de ei. Aceste descrieri nu pot fi fcute pentru orice clase de
piese ceea ce va conduce uneori la utilizarea unor foarte muli
parametri. Dialogul cu funcii getxxx nu este n acest caz o
ntreprindere fructuoas, ci se recomand trecerea la utilizarea unor
metode mai productive de descriere a seturilor de parametri.
(defun imbus(m l / @1 @2 @3)
(fabazan "imbus")
(setq @2(ciltes (* 1.5 m) m 0 0 0.5 90))
(command "ucs" "o" (list 0 0 (* m -0.66)))
(command "polygon" "6" (list 0 0 0)"i" (* 0.5 m))
(command "extrude" (entlast) "" (* m 0.66) 0)
(setq @3 (entlast))
(command "ucs" "r" "imbus")
(command "ucs" "o" (list 0 0 (- m)))
(setq @1(ciltes m l 1 90 0 0))
(command "union" @1 @2 "")
(command "subtract" @1 "" @3"")
(command "ucs" "r" "imbus")
@1
)
(defun ciltes (d h c11 ung1 c12 ung2 / h1 c1)
(command "cylinder" (list 0 0 (- c12)) (/ d 2.) (- (- h c11 c12)))
(setq c1 (entlast))
(if (/= c12 0)
(progn
(command "circle" (list 0 0 (- c12)) (/ d 2.))
(command "extrude" (entlast) "" c12 (/ ung2 2.))
(command "union" c1 (entlast) "")
)
7-58

Ovidiu Alupei-Cojocariu
)

AutoLISP - Manual de programare

(if (/= c11 0)


(progn
(command "circle" (list 0 0 (- (- h c11))) (/ d 2.))
(command "extrude" (entlast) "" (- c11) (/ ung1 2.))
(command "union" c1 (entlast) "")
)
)
c1
)
(defun fabazan(baza)
(if (tblsearch "ucs" baza)
(progn
(command "ucs" "d" baza)
(command "ucs" "s" baza)
)
(command "ucs" "s" baza)
)
)
Funciile auxiliare fabazan i ciltes servesc la stabilirea unei
baze locare (UCS) de reprezentare, respectiv de desnare a unui cilindru
teit la ambele capete cu unghiuri potenial diferite.
Pe parcursul dezvoltrii de modele 3D se desprind ntotdeauna
unele cazuri de programare care sunt posibil a fi ntlnite cu mare
probabilitate ceea ce conduce la crearea unor funcii noi, cuprinse de
obicei ntr-o colecie ce poate diferi de la programator la programator.
Aceste sunt armele personale ale programatorului, arme care l
deosebesc de ali programatori i i ofer avantaje concureniale.

7-59

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Erori AutoLISP

Tabelul umtor preint valorile codurilor de eroare generate


de AutoLISP. Variabila ERRNO este setat pe una din aceste valori
atunci cnd AutoCAD sesizeaz apariia unei erori. Generate de un
apel al unei funcii AutoLIS. Aplicaiile AutoLISP pot investiga acest
cod de eroare cu ajutorul funciei (getvar "ERRNO")
Variabila ERRNO nu este ntotdeauna anulat la zero. Dac
nu este inspectat imediat dup un apel ce a generat eroare, eroarea
inscris s-ar putea s nu fie cea pe care o cutm. Aceast variabil este
ntotdeauna resetat cnd pornim editorul grafic sau cnd deschidem un
nou desen

8.1
Cod
0
1
2
3
4
5
6

Coduri de eroare
Semnificaie
No error
Nici o eroare
Invalid symbol table name
Nume simbol tabel invalid
Invalid entity or selection set name
Nume entitate sau set selecie invalid
Exceeded maximum number of selection sets
Depire a numrului maxim de seturi de selecie
Invalid selection set
Set de selecie invalid
Improper use of block definition
Utilizare incorect a definiiei de bloc
Improper use of xref
Utilizare incorect a xref
8-1

Ovidiu Alupei-Cojocariu
7
8
9
10
11
12
13
14
15
16
17
18
19
20

AutoLISP - Manual de programare

Object selection: pick failed


Selectare de obiect euat
End of entity file
Sfrit de fiier entitate
End of block definition file
Sfrit de fiier definiie bloc
Failed to find last entity
Eec n gsirea ultimei entiti
Illegal attempt to delete viewport object
Tentativ ilegal de tergere obiect viewport
Operation not allowed during PLINE
Operaie nepermis pe parcursul comenzii PLINE
Invalid handle
Handle invalid
Handles not enabled
Handle-uri neactivate
Invalid arguments in coordinate transform request
Argumente invalide n apelul de transformare de coordonate
Invalid space in coordinate transform request
Spaiu invalid n apelul de transformare de coordonate
Invalid use of deleted entity
Utilizare invaid a entitii terse
Invalid table name
Nume de tabel invalid
Invalid table function argument
Argument invalid de funcie tabel
Attempt to set a read-only variable
8-2

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

ncercare de setare a unei variabile read-only


21
22
23
24
25
26
27
28
29
30
31
32
33

Zero value not allowed


Valoare zero nepermis
Value out of range
Valoare n afara limitelor
Complex REGEN in progress
Regenerare complex n desfurare
Attempt to change entity type
ncercare de schimbare a tipului de entitate
Bad layer name
Nume incorect de layer
Bad linetype name
Nume incorect de tip de linie
Bad color name
Nume incorect de culoare
Bad text style name
Nume incorect de styl
Bad shape name
Nume incorect de shape
Bad field for entity type
Cmp incorect pentru tipul de entitate
Attempt to modify deleted entity
ncercare de modificare a unei entiti terse
Attempt to modify seqend subentity
ncercare de modificare a subentitii seqend
Attempt to change handle
ncercare de modificare de handle
8-3

Ovidiu Alupei-Cojocariu
34
35
36
37
38
39
40
41
42
43
44
45
46
47

AutoLISP - Manual de programare

Attempt to modify viewport visibility


ncercare de modificare a vizibilitii viewportului
Entity on locked layer
Entitate situat pe un layer nchis
Bad entity type
Tip de entitate incorect
Bad polyline entity
Entitate polilinie incorect
Incomplete complex entity in block
Entitate complex incomplet n bloc
Invalid block name field
Cmp de nume de bloc invalid
Duplicate block flag fields
Cmp duplicat de flag pentru bloc
Duplicate block name fields
Cmp duplicat al numelui blocului
Bad normal vector
Vector normal incorect
Missing block name
Lips nume bloc
Missing block flags
Lips flaguri bloc
Invalid anonymous block
Bloc anonim invalid
Invalid block definition
Definiie de bloc invalid
Mandatory field missing
8-4

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Cmp obligatoriu lips


48
49
50
51
52
53
54
55
56
57
58

Unrecognized extended data (XDATA) type


Tip XDATA(date extinse) nerecunoscut
Improper nesting of list in XDATA
Construcie incorect a listei n XDATA
Improper location of APPID field
Localizare incorect a cmpului APPID
Exceeded maximum XDATA size
Depire a mrimii maxime XDATA
Entity selection: null response
Selectare obiect: rspuns null
Duplicate APPID
APPID duplicat
Attempt to make or modify viewport entity
ncercare de creare sau modificare de entitate viewport
Attempt to make or modify an xref, xdef, or xdep
ncercare de creare sau modificare a unui xref, xdef sau xdep
ssget filter: unexpected end of list
ssget filtrare: sfrit neateptat al listei
ssget filter: missing test operand
ssget filtrare: lips operand test
ssget filter: invalid opcode (4) string
ssget filtrare: ir pentru cod operand (-4) invalid
ssget filter: improper nesting or empty conditional clause

59

ssget filtrare: constricie incorect sau expresie condiional


vid

60

Ssget filter: mismatched begin and end of conditional clause


8-5

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Ssget Filtrare: nepotrivire a startului i sfritului expresiei


condiionale

61

62
63
64
65
66
67
68
69
70
71
72

ssget filter: wrong number of arguments in conditional clause


(for NOT or XOR)
ssget filtrare: numr incorect de argumente n expresia
condiional (pentru NOT sau XOR)
ssget filter: exceeded maximum nesting limit
ssget filtrare: depsire numr maxim de imbricri
ssget filter: invalid group code
ssget filtrare : cod grup incorect
ssget filter: invalid string test
ssget filtrare : test ir incorect
ssget filter: invalid vector test
ssget filtrare : test vector incorect
ssget filter: invalid real test
ssget filtrare : test real incorect
ssget filter: invalid integer test
ssget filtrare : test ntreg incorect
Digitizer is not a tablet
Digitizorul nu este o tablet
Tablet is not calibrated
Tableta nu este calibrat
Invalid tablet arguments
Argumente tabet incorecte
ADS error: Unable to allocate new result buffer
Eroare ADS: nu se poate aloca bufferul noilor rezultate
ADS error: Null pointer detected
Eroare ADS: detectare pointer null
8-6

Ovidiu Alupei-Cojocariu
73
74
75
76
77
78
79
80
81
82
83
84

85

AutoLISP - Manual de programare

Cannot open executable file


Nu se poate deschide fiierul executabil
Application is already loaded
Aplicaia este deja ncrcat
Maximum number of applications already loaded
Numrul maxim de aplicaii deja ncrcat
Unable to execute application
Execuia aplicaiei imposibil
Incompatible version number
Numr de versiune incompatibil
Unable to unload nested application
Nu se poate descrca aplicaia imbricat
Application refused to unload
Aplicaie refuzat la descrcare
Application is not currently loaded
Aplicaia nu este curent ncrcat
Not enough memory to load application
Insuficient memorie pentru ncrcarea aplicaiei
ADS error: Invalid transformation matrix
Eroare ADS: matrice de transformare invalid
ADS error: Invalid symbol name
Eroare ADS: nume simbol incorect
ADS error: Invalid symbol value
Eroare ADS: valoare simbol incorect
AutoLISP/ADS operation prohibited while a dialog box was
displayed
Operaie AutoLISP/ADS interzis ct este deschis caseta de
dialog
8-7

Ovidiu Alupei-Cojocariu

8.2

AutoLISP - Manual de programare

Mesaje de eroare

Vom ataa n continuare mesajele de eroare pe care le putei


obine atunci cnd scriei sau depanai funcii AutoLISP. Multe dintre
aceste mesaje indic erori de programare , cum sunt acestea:

Nume de funcii sau simboluri scrise greit

Numr incorect de argumente n apelul unei funcii

Paranteze neechilibrate

Ghilimele neechilibrate

Neverificare a completrii definiiei funciei nainte de testare

Dei aceste mesaje indic n mod obinuit programatorului


erori, ele pot fi cauzate de asemenea de erori interne de programare
(bug-uri) ale AutoLISP.

arguments of a defun can't have the same name


argumentele unui defun nu pot avea acelai nume
O funcie cu mai multe argumente care poart acelai nume va
genera acest mesaj.
AutoCAD rejected function
Funcie AutoCAD respins
Argumentele pasate unei funcii AutoLISP au fost incorecte
(ca setarea cu setvar a unei variabile read-only, sau tblnext cu un nume
incorect de tabel), sau funcia respectiv este incorect utilizat n
context. De exemplu nu putei folosi o funcie getxxx ntr-un apel de
funcie command.
AutoLISP stack overflow
Depire de stiv AutoLISP
S-a depit spaiul alocat stivei. Aceasta poate fi urmarea
utilizrii excesive a apelului recursiv al unei funcii sau unui numr
prea mare de argumente ale funciei.
bad argument type
8-8

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
tip incorect de argument
funciei I-a fost pasat o valoare argument de un tip incorect(
de exemplu nu putei afla lungimea strlen pentru un numr ntreg)
bad association list
list de asociere incorect
lista pasat funciei assoc nu este o list cu format adecvat
extragerii informaiilor pe baz de valori-cheie.
bad conversion code
code de conversie incorect
a fost pasat un cod de UCS incorect funciei trans.
bad ENTMOD list
list ENTMOD incorect
argumentul pasat funciei entmod nu constitie o list de
asociere corect (aa cum este returnat de entget.
bad ENTMOD list value
valoare list ENTMOD incorect
una din sublistele din lista asociat pasat funciei entmod
conine o valoare incorect.
bad formal argument list
list de argumente formale incorect
cnd este evaluat funcia, AutoLISP detecteaz o list de
argumente incorect. Probabil c funcia nu este deloc o funcie, ci mau
degrab o list de date.
bad function
funcie incorect.
Primul element al listei nu este un nume corect de funcie.
Probabil este un numr de variabil sau un numr. Acest mesaj poate
indica deasemenea c funcia respectiv nu a fost corect
definit.(reinei lista de argumente formale necesar)
bad function code
8-9

Ovidiu Alupei-Cojocariu
cod de funcie incorect.

AutoLISP - Manual de programare

A fost pasat un identificator de funcie incorect comenzii


tablet.
bad grvecs list value
list de vectori grafici incorect
Ceva din ceea ce a fost pasat n lista de vectori nu este un
punct 2D sau 3d.
bad grvecs matrix value
valoare de vector matrice incorect
O matrice pasat funciei grvecs este greit construit sau
conine tipuri incorecte de date (de ex STR, SYM, sau altele)
bad list
list incorect
A fost pasat unei funcii o list incorect construit. Aceasta
poate s apar dac un numr real ncepe cu un punct zecimal (.0 n loc
de 0.0). trbuie s scriri zeroul de nceput pentru numerele reale
subunitare.
bad list of points
list de puncte incorect
s-a trimis ca r spuns la o cerere de tip F, CP sau WP o list
vid sau coninnd informaii altele dect puncte. Utilizat de ssget sau
grvecs.
bad node
node incorect
funcia type a ntlnit un element de tip incorect.
bad node type in list
node incorect n list
tip incorect de element gsit de funcia foreach
bad point argument
8-10

Ovidiu Alupei-Cojocariu
argument punct incorect

AutoLISP - Manual de programare

un punct definit insuficient (o list de doi reali) a fost pasat


unei funcii care ateapt un punct. Fii ateni s nu ncepei un numr
real cu punctul zecimal; trebuie s trecei cifra zero n fa n asemenea
cazuri.
bad point value
valoare punct incorect
un punct definit insuficient (o list de doi reali) a fost pasat
unei funcii care ateapt un punct. Fii ateni s nu ncepei un numr
real cu punctul zecimal; trebuie s trecei cifra zero n fa n asemenea
cazuri.
bad real number detected
s-a detectat un n umr real incorect
s-a fcut ncercarea de a se pasa un numr real invalid din
AutoLISP n AutoCAD.
bad ssget list
list ssget incorect
argumentul pasat lui (ssget "X") nu este o list corect (ca cea
returnat de entget)
bad ssget list value
valoare n lista ssget incorect
una din sublistele listei asociate pasate lui (ssget "X") conine
o valoare incorect.
bad ssget mode string
ir mod n ssget incorect
cauzat cnd ssget a primit un ir incorect ca argument pentru
mod.
bad xdata list
list xdata incorect
cauzat cnd pentru xdsize, ssget, entmod, entmake sau txtbox
8-11

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
au fost pasate liste de date extinse (xdata) prost construite.
base point is required
este cerut punctul de baz
funcia getcorner a fost apelat fr a I se scrie argumentul de
punct de baz.
Boole arg1 0 or 15
Arg1 Boole 0 sau 15
Primul argument al funciei Boole trebuie s fie un ntreg ntre
0 i 15.
can't evaluate expression
nu pot evalua expresia
un punct zecimal a fost incorect plasat, sau alt expresie a fost
formulat incomplet.
can't open (file) for input -- LOAD failed
nu pot deschide(fiierul) pentru introducere.
Fiierul apelat n funcia load mu poate fi gsit, sau
utilizatorul nu are acces la acest fiier.
can't reenter AutoLISP
nu pot reintra n AutoLISP
Bufferul de comunicaie AutoCAD/AutoLISP este utilizat de
o funcie activ. Nici o funcie nou nu poate fi apelat ct timp este
alta activ.
console break
ntrerupere de la consol (tastatur)
utilizatorul a introdus CTRL+C n timpul procesrii funciei.
divide by zero
mprire la zero
mpririle la zero nu sunt admise.
divide overflow
8-12

Ovidiu Alupei-Cojocariu
depire la mprire

AutoLISP - Manual de programare

mprirea la numere foarte mici a dus la un rezultat mai mare


dect cel care poate fi reprezentat.
exceeded maximum string length
se depete lungimea maxim a unui ir
Un ir pasat unei funcii e mai mare dect 132 caractere.
extra right paren
parantez dreapta n plus
una sau mai multe paranteze dreapta ")" au fost ntlnute
file not open
Fiierul nu este deschis
Descriptorul de fiier pentru operaia de I/O nu este acela al
unui fiier deschis.
file read--insufficient string space
citire din fiier -- insuficient spaiu string.
s-a consumat spaiul string n timp ce AutoLISP citea dintr-un
fiier.
file size limit exceeded
dimensiunea fiierului depete limita de mrime
Un fiier a depit limita de mrime a sistemului de operare.
floating-point exception
excepie virgul mobil.
(doar sub UNIX) Sistemul de operare a detectat o eroare n
aritmetica n virgul mobil.
function canceled
funcie anulat
Utilizatorul a introdus CTRL+C sau ESC (cancel) ca rspuns
la o ntrebare.
8-13

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

function undefined for argument


funcie nedefinit pentru argument
argumentul pasat funciilor log sau sqrt este n afara valorilor
admise (ex (log 0) sau (sqrt -1))
function undefined for real
Funcia nedefinit pentru un real
A fost pasat un numr real ca argument al unei funcii ce
solicit un ntreg.
grvecs missing endpoint
lipsete un capt al vectorului
listei de vectori pasat lui grvecs i lipsete un capt.
illegal type in left
tip ilegal n stnga
fiierul .lsp nu este pur ASCII, a fost salvat cu un procesor de
texte i include coduri speciale de formatare.
improper argument
argument nepotrivit
argumentul funciei gcd este negativ sau zero.
inappropriate object in function
obiect nepotrivit n funcie
o funcie incorect construit a fost detectat de vmon
incorrect number of arguments
numr incorect de argumente
funcia ateapt exact un argument dar s-a furnizat alt numr
de argumente.
incorrect number of arguments to a function
numr de argumente incorect pentru o funcie

8-14

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
numrul de argumente ale funciei definite de utilizator nu se
potrivete cu numrul de argumente formale specificate n definiia ei
cu defun.
incorrect request for command list data
cerere incorect pentru lista finciei command
O funcie command a fost ntlnit dar nu poate fi executat,
sau interpretorul de comenzi nu este complet iniializat. Se poate
ntmpla pentru o funcie apelat automat de acad.lsp sau un meniu.
input aborted
introducere abandonat
s-a descoperit o condiie de sfrit de fiier (end-of-file), ceea
ce a determinat abandonarea introducerii.
insufficient node space
spaiul nodurilor insuficient
nu este suficient spaiu heap pentru realizarea aciunii cerute.
insufficient string space
spaiul string este insuficient
nu este suficient spaiu heap pentru irul respectiv.
invalid argument
argument incorect
argument nepotrivit ca tip sau n afara limitelor
invalid argument list
lista argument incorect
o list incorect a fost pasat unei funcii
invalid character
caracter invalid
o expresie conine un caracter incorect.
invalid dotted pair
8-15

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
pereche cu punct incorect
perechile cu punct sunt liste coninnd dou elemente separate
printr-o structur spaiu-punct-spaiu " . " . Putei primi un astfel de
mesaj dac ncepei un numr real cu punctul zecimal; tebuie s
utilizai zero-ul din faa punctului zecimal .
invalid integer value
valoare ntreag incorect
a fost folosit un numr mai mic dect cel mai mic ntreg sau
mai mare dect cel mai mare ntreg
LISPSTACK overflow
Depire LISPSTACK
Capacitatea memoriei stiv a AutoLISP a fost depit.
Aceasta poate fi datorit folosirea excesiv recursiv a funciei, sau a
unui numr foarte mare de argumente ale funciei.
malformed list
list prost construit
o list citit dintr-un fiier s-a sfrit prematul. Cea mai
comun cauz este o nemperechere de paranteze stnga-dreapta. Sau a
marcajelor de quotare "'".
malformed string
string ru construit
unir ce se citete dintr-un fiier s-a sfrit prematur.
misplaced dot
punct plasat incorect
un numr real ncepe cu un punct zecimal
null function
funcie vid
s-a ncercat evaluarea unei funcii nedefinite
quit/exit abort
8-16

Ovidiu Alupei-Cojocariu
Abandonare quit/exit

AutoLISP - Manual de programare

A fost apelat funcia quit sau funcia exit.


string too long
ir prea lung
un ir pasat ctre setvar este prea lung.
too few arguments
prea puine argumente
au fost utilizate prea puine argumente pentru o funcie
intern.
too few arguments to grvecs
prea puine argumente pentru grvecs
au fost utilizate prea puine argumente n apelul lui grvecs.
too many arguments
prea multe argumente
au fost utilizate prea multe argumente n apelul unei funcii
interne.

8-17

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Prezentarea codurilor de grup DXF

Utilitatea cunoaterii acestor coduri am ntrevzut-o la


prezentarea unor funcii care lucreaz cu nume de entiti, seturi de
selecie i constituie calea de investigare a informaiilor coninute n
baza de date a desenului. Posibilitatea de modificare direct a
obiectelor prin intermediul listei asociate prezint interes n special
pentru programatorii avansai.
Cea mai important i direct utilizare este aceea de a putea
construi liste de filtrare complexe pentru comanda ssget, obinnd asfel
informaii statistice, dar i posibilitatea de a accesa direct clase de
obiecte legate prin aplicaii comune, date comune. Combinarea
desenelor cu informaii suplimentare clasate i organizate, uor de
manipulat prin intermediul aplicaiilor conduce la o unificare a
informaiilor, modificrile survenind ntr-un singur fiier.
Formatul DXF este o form de reprezentare a tuturor
informaiilor prezente n fiierele desen AutoCAD. Catele sunt
precedate printr-un cod, numr ntreg, denumit cod grup. Valoarea unui
cod indic ce tip de dat urmeaz. Aceast valoare indic totodat
semnificaia datei pentru obiectul respectiv. Astfel, virtual, toate
informaiile specificate de utilizator pot fi reprezentate n format DXF.
Cu fiecare versiune de AutoCAD apar obiecte noi, astfel nct
informaiile legate de codurile DXF devin tot mai multe.
n cadrul acestui capitol am realizat o selecie a celor mai
utilizate grupuri de coduri DXF, cu specifiacarea semnificaiei pe care
acestea le au pentru diferite obiecte. Aceste coduri selectate formeaz
un nucleu stabil care este valabil n orice versiune de AutoCAD.
Modificri ulterioare ale AutoCAD nu vor afecta aceste grupuri de
coduri pentru a se menine compatibilitatea utilizrii informaiilor
generate cu versiuni anterioare.
Extragerea informaiilor asociate diferitelor coduri DXF din
lista asociat unei entiti se face cu structrura AutoLISP urmtoare:
(setq elista (entget(ename)))
(setq valoare (cdr(assoc cod elista)))
9-1

Ovidiu Alupei-Cojocariu

9.1

AutoLISP - Manual de programare

Coduri generale pentru toate tipurile de


entiti

Cod

Semnificaie

Exemplu

-1

Nume element

<Entity name:60000012>

Tip element

"LINE"

Handle

"23FE"

Tip de linie

"DASHDOT"

Nume layer

"AXE"

39

Thickness (nlime)de obicei 0.0

15.6

62

Numr culoare

67

Element n PaperSpace

"1"

67

Element n ModelSpace

"0"

210

Vector al planului propriu

'(0.0 0.0 1.0)

(doar pentru obiecte plane)


nformaiile referitoare la tipul de linie (cod 6), culoare (cod
62) pot s lipseasc din lista asociat atunci cnd ele sunt setate cu
valoare BYLAYER.
Orice modificare a acestor proprieti implicite face ca
informaia respectiv s apar explicit.
Tabelul urmtor conine codurile specifice fiecrui tip de
entitate (dintre cele mai uzuale).
Unele coduri, dei sunt numeric aceleai pentru mai multe
entiti grafice, au semnificaii diferite.

9.2

Coduri specifice obiectelor

Toate informaiile referitoare la puncte grafice sunt exprimate


n coordonate WCS.
Codurile cu asterisc (*) sunt opionale n descrierea minimal.

9-2

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Element

Cod

Semnificaie

LINE

10

Punct de start

11

Punct final

10

Centru

40

Raza

10

Centru

40

Raza

50

Unghi de start

51

Unghi final

10

Poziie

CIRCLE
ARC

POINT

* 50

Unghiul axei X
n UCS-ul
generare

TEXT

Valoare implicit

0.0
de

irul coninut

""

* 7

Nume stil text

"STANDARD"

10
* 11

Punct de inserare
Punct de aliniere
suplimentar
(doar pentru 72 i
73 diferite de 0)

40

nlime text

0.0

* 41

Factor de lime

1.0

* 50

Unghi de inserare

0.0

(rotire text)
* 51

Unghi
oblicitate

de

* 71

Mod de generare

0.0
2=napoi (oglindit X)
4=rsturnat(oglindit
Y)

9-3

Ovidiu Alupei-Cojocariu
* 72

AutoLISP - Manual de programare


Aliniere
orizontal

0 = Left;
1= Center;
2 = Right
3 = Aligned (73 = 0)
4 = Middle (73 = 0)
5 = Fit (73 = 0)

* 73

Aliniere vertical

0 = Baseline;
1 = Bottom;
2 = Middle;
3 = Top

POLYLINE

10

Punct fictiv

'(0.0 0.0 0.0)


(ntotdeauna)

* 40

Lime de start

0.0

* 41

Lime final

0.0

66
* 70

Flag
(urmeaz
puncte de control)
Proprieti
polylinie
coded

0=deschis;
Bit

1= nchis;
2= segmente curbe
4=segmente Bspline
8 = Polylinie 3D
16=3D-PolygonMesh
32 = polygon mesh
nchis pe direcia N.
64 = polyface mesh.
128=Modelul
linetype pattern este
generat continuu n

9-4

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare


jurul vertex-urilor

* 71

Numr
pe M

divizare

* 72

Numr
pe N

divizare

* 73

Factor de desime

M (smooth)
* 74

Factor de desime

N (smooth)
* 75

Tip de netezire
(smooth)
coded

0 = Nici un tip
bit

5 = Quadratic
B-spline
6 = Cubic B-spline
8 = Bezier

VERTEX

10

Punct de generare

* 40

Lime de start

0.0

* 41

Lime final

0.0

* 41

Bulge factor

(-) sens orar;


(+) sens antiorar

* 70
SEQEND

DIMENSION

-2

Flag - Punct de
control

v. cod 70 polylinie

Numele
elementului
principal

* 1

Text introdus de
utilizator

Nume bloc aspect

Nume stil cotare

10

Punct definiie
9-5

"STANDARD"

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

11

Punct mijloc text

12

Punct de inserare
baza cot
Baseline
Continue

* 13

Punct de definiie
pt.
Linear
i
Angular

* 14

v. 13

* 15

Punct de definiie
pt.
Diameter,Radius,
Angular

* 16

Punct definiie arc


pt Angular

* 40

Lungime leader la
radius i Diameter

* 50

Unghi de rotire
Rotate

* 51

Direcie
orizontal

* 52

Unghiul
nclinare
Oblique

* 53

Unghi de rotire
text

70

Opional
de
la

Tip cot

0 = Rotated,
horizontal,
sau vertical;
1 = Aligned;
2 = Angular;
9-6

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare


3 = Diameter;
4 = Radius;
5 = Angular 3 pcte.;
6 = Ordinate;

INSERT

ATTRIB

Nume bloc

10

Punct de inserare

* 41

Factor-X

* 42

Factor-Y

* 43

Factor-Z

* 44

Spaiere coloan

* 45

Spaiere rnduri

* 50

Unghi rotire

* 66

Flag-urmeaz
artibute

* 70

Contor coloan

* 71

Contor rnd

Valoare atribut

Tag atribut

Stil de text

10

Punct start text

"STANDARD"

* 11

Punct de aliniere

* 41

Factor-X

* 50

Unghi de rotire

* 51

Unghi
oblicitate

* 70

Flag atribut

de

0
1 = invizibil;
2 = constant;

9-7

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare


3 = se verific;
4 = presetat

* 71

Tip definire text

2=napoi (oglindit X)
4=rsturnat(oglindit
Y)

* 72

Tip aliniere text


orizontal

0 = Left;
1= Center;
2 = Right
3 = Aligned (73 = 0)
4 = Middle (73 = 0)
5 = Fit (73 = 0)

* 73

Lungime
atribut

cmp

* 74

Tip aliniere text


vertical

0 = Baseline;
1 = Bottom;
2 = Middle;
3 = Top

ATTDEF

Valoare implicit

ir Tag

Prompt atribut

Stil de text

10

Punct start text

* 11
40

"STANDARD"

Punct de aliniere
nlime text

* 41

Factor-X

* 50

Unghi de rotire

* 51

Unghi
oblicitate

de

9-8

Ovidiu Alupei-Cojocariu
70

AutoLISP - Manual de programare


Flag atribut

1 = invizibil;
2 = constant;
3 = se verific;
4 = presetat

* 71

Tip definire text

2=napoi (oglindit X)
4=rsturnat(oglindit
Y)

* 72

Tip aliniere text


orizontal

0 = Left;
1= Center;
2 = Right
3 = Aligned (73 = 0)
4 = Middle (73 = 0)
5 = Fit (73 = 0)

* 73

Lungime
atribut

cmp

* 74

Tip aliniere text


vertical

0 = Baseline;
1 = Bottom;
2 = Middle;
3 = Top

SHAPE

SOLID

Nume simbol

10

Punct de inserare

40

Mrime

* 41

Factor-X

* 50

Unghi de rotire

* 51

Unghi
oblicitate

de

10

Primul punct

11

Al doilea punct
9-9

Ovidiu Alupei-Cojocariu

TRACE

3DFACE

AutoLISP - Manual de programare

12

Al treilea punct

13

Al patrulea punct

10

Primul punct

11

Al doilea punct

12

Al treilea punct

13

Al patrulea punct

10

Prima latur

11

A doua latur

12

A treia latur

13

A patra latur

* 70

Flag
invizibile

laturi

1 = prima latur;
2 = a doua latur;
3 = a treia latur;
4 = a patra latur.

VIEWPORT

3DSOLID

BODY

10

Punct central

40

Lime
PaperSpace

41

nlime
PaperSpace

68

Cmp status

69

Indicator fereastr

-3

Indicator nceput
XDATA

Prima
linie
structur de fiier

(< =256 caractere)

* 3

Linii
adiionale
structur de fiier

(cnd 1>256 carctere)

Prima
linie
structur de fiier

(< =256 caractere)

9-10

Ovidiu Alupei-Cojocariu
* 3
ELLIPSE

LEADER

AutoLISP - Manual de programare


Linii
adiionale
structur de fiier

(cnd 1>256 carctere)

10

Centru

11

Captul axei mari


(fa de centru)

40

Lungimea
axei
mici (% 11)

41

Parametru de start

0 elips plin

42

Paramteru sfrit

2*pi pentru 41 = 0

Nume stil cotare

72

Tip traseu leader

0= Segmente dreapt;
1= Spline.

73

Numr vertexuri
pe traseu

10

Coordonate vertex

11

Vector
axa X

direcie

12

Vector
axa Z

direcie

330

Referin
asociat

* -3
MLINE

MTEXT

Intrri multiple

text

Indicator aplicaie
XDATA

Nume stil (max


32 caractere)

41

Factor scar (real)

73

Numr Vertex-uri

10

Coordonate vertex

Intrri multiple

ir text

<=255 caractere

Text adiional

Doar

* 3

9-11

dac

1>255

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare


caractere

Nume stil text

"STANDARD"

10

Punct inserie

11

Vector
axa X

direcie

12

Vector
axa Z

direcie

41

Lime
dereptunghi
ncadrare

71

Punct ataare

1= Top Left;
2=TopCenter;
3= Top Right;
4= Middle Left;
5= Middle Center;
6=Middle Right;
7= Bottom Left;
8= Bottom Center;
9= Bottom Right.

72

Direcie
desenare

de

1= stnga dreapta;
2= dreapta stnga;
3= sus jos;
4= jos sus

RAY
SPLINE

10

Punct de baz

11

Vector direcie

10

Puncte de control

Intrri multiple

11

Puncte
potrivire

Intrri multiple

* 12

de

Tangent de start
9-12

Ovidiu Alupei-Cojocariu
* 13

AutoLISP - Manual de programare


Tangent final

40

Valoare nod

42

Toleran
potrivire

43

Toleran
control

44

Toleran
potrivire

Intrri multiple

punct

( pt. Spline fit)


70

Gradul
spline

curbei

71

Flag spline

1= nchis;
2= periodic;
3= raional;
4= plan.

TOLERANCE

72

Numr de noduri

73

Numr de puncte
control

74

Numr
potrivire
sunt)

10

Punct inserie

11

Vector
axa X

direcie

12

Vector
axa Z

direcie

Valoare
primar

Nume stil text

* -3

puncte
(dac

text

Indicator aplicaie
XDATA
9-13

Ovidiu Alupei-Cojocariu
XLINE

9.3

AutoLISP - Manual de programare

10

Punct de baz

11

Vector direcie

Entiti negrafice - coduri de grup DXF

Cod

Descriere

Observaii

-1

Nume entitate

Nu poate fi omis

(pe durata desenului)


0

Tip entitate

Nu poate fi omis

Handle

Nu poate fi omis

Valori semnalizare

16= intrare
XREF;

70

dependent

de

32= XREF dependent rezolvat


cu succes;
64= intrare n tabel referit
90

9.4

Blocaj ADE

Coduri de grup dicionar

Se prezint n continuare codurile de grup pentru intrrile de


tip Dicionar. Ele sunt similare celor din seciunea OBJECTS a unui
fiier DXF. Codurile opionale sunt precedate de astrerisc (*).
Entitate

Cod

Descriere

DICTIONARY

90

Numr maxim de intrri


n acest obiect nregistrare

300

Nume intrare
(repetri pentru aceeai entitate)

600

Handle-ul obiectului introdus


(repetri pentru aceeai entitate)

ACAD_GROUP

Nume grup
9-14

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Descriere grup

70

Semnalizator selectivitate

240

Contorul index al entitilor din grup

Handle-ul entitilor din grup


(cte una pentru fiecare entitate din grup)

ACAD_

Descriere stil ( ir <255 caractere)

51

Unghi de start (real, radiani, implicit pi/2)

52

Unghi final (real, radiani, implicit pi/2)

70

Semnalizatoare (codificat bii)

MLINESTYLE

1=umplut;
2=prezint jonciunile
62

Culoare umplere

71

Atribut capt de start (codificat bii)


1= deseneaz linie;
2=deseneaz arc interior;
4= deseneaz arc exterior.

72

Atribut capt final (codificat bii)


1= deseneaz linie;
2=deseneaz arc interior;
4= deseneaz arc exterior.

73

Numr de elemente n acest stil

49

Offset element (real, nu implicit)


Intrri multiple

62

Culoare element; Intrri multiple

Tip linie element; Intrri multiple

9-15

Ovidiu Alupei-Cojocariu

9.5

AutoLISP - Manual de programare

Coduri de grup DXF pentru definiii de bloc


i tabele de simboluri

Entitate

Cod

Descriere

APPID

Nume aplicaie nregistrat de utilizator

70

Valori standard de semnalizare

BLOCK

Descrierile de bloc conin i grupurile de


coduri cmune cu entitile grafice.
2

Nume bloc

70

Semnalizator de tip (codificatpe bii)


1 = Bloc anonim (haur, cot asociativ
sau aplicaii)
2 =Urmeaz atribute variabile;
4 = Referin extern;
8 = Neutilizat;
16 = Bloc dependent extern;
32 = Referin extern rezolvat;
64 =Definiie referit.

* -1

Nume cale XREF


(doar dac blocul este XEF)

DIMSTYLE

Nume stil de cotare

70

Valori semnalizare standard

DIMPOST

DIMAPOST

DIMBLK

DIMBLK1

DIMBLK2

40

DIMSCALE

41

DIMASZ
9-16

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

42

DIMEXO

43

DIMDLI

44

DIMEXE

45

DIMRND

46

DIMDLE

47

DIMTP

48

DIMTM

140

DIMTXT

141

DIMCEN

142

DIMTSZ

143

DIMALTF

144

DIMLFAC

145

DIMTVP

146

DIMTFAC

147

DIMGAP

148

DIMALTRND

71

DIMTOL

72

DIMLIM

73

DIMTIH

74

DIMTOH

75

DIMSE1

76

DIMSE2

77

DIMTAD

78

DIMZIN

79

DIMAZIN

170

DIMALT

171

DIMALTD
9-17

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

172

DIMTOFL

173

DIMSAH

174

DIMTIX

175

DIMSOXD

176

DIMDLRD

177

DIMCLRE

178

DIMCLRT

179

DIMADEC

270

DIMUNIT

271

DIMDEC

272

DIMTDEC

273

DIMALTU

274

DIMALTTD

275

DIMAUNIT

276

DIMKFRAC

277

DIMLUNIT

278

DIMDSEP

279

DIMTMOVE

280

DIMJUST

281

DIMSD1

282

DIMSD2

283

DIMTOLJ

284

DIMTZIN

285

DIMALTZ

286

DIMALTTZ

287

DIMFIT

288

DIMUPT
9-18

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

340

DIMTXSTY

341

DIMLDRBLK

342

DIMBLK

343

DIMBLK1

344

DIMBLK2

371

DIMLWD

372

DIMLWE

ENDBLOCK

fr

Sfrit de block (apare doar n tabela


block)

LAYER

Nume Layer

70

Semnalizare Layer (codificare bii)


1 = layer ngheat;
2 = layer ngheat implicit n noile
viewport-uri;
4 = layerul este blocat.

LTYPE

62

Numr culoare

Tip linie

Nume tip linie

70

Valori semnalizator standard

Text descriptiv tip linie

72

Cod de aliniere

73

Numr de articole lungimi linie

40

Lungime total pattern

* 49
STYLE

Lungime linie (poate fi repetat)

Nume stil

70

Valori semnalizator standard

40

nlime fixat text


9-19

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

41

Factor de lime

50

Unghi de oblicitate

71

Semnalizare generare text


2 = text inversat (oglindit X);
4 = textul este oglindit (oglindit Y)

UCS

VIEW

VPORT

42

Ultima nlime folosit

Nume fiier font

Nume fiier font mare

Nume UCS

70

Valori semnalizator standard

10

Origine (WCS)

11

Direcie axa X (WCS)

12

Direcie axa Y (WCS)

Nume view

70

Semnalizator view 1 = view PaperSpace

40

nlime

41

Lime

10

Centru (punct 2D), (n DCS)

11

Direcie view din "target" (WCS)

12

Punct "target" (WCS)

42

Lungime "lens"

43

Plan de "clip" frontal

44

Plan de "clip" spate

50

Unghi rotire "twist"

71

Mod view (VIEWMODE)

Nume vport (poate s nu fie unic)

70

Valori semnalizator standard


9-20

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

10

Col stnga jos (2D)

11

Col dreapte sus (2D)

12

Centru (2D)

13

Punct de baz SNAP (2D)

14

Spaiere SNAP (X i Y)

15

Spaiere GRID (X i Y)

16

Direcie din "target"

17

Punct int ("target")

40

nlime

41

Rat aspect ("aspect ratio")

42

Lungime "lens" ("lentil")

43

Plan de "clip" frontal

44

Plan de "clip" spate

50

Unghi rotire SNAP

51

Unghi rotire "twist"

68

Cmp de stare ("status field")

69

Identificator "ID"

71

Mod view

72

Procent zoom cerc

73

Setare zoom rapid

74

Setare UCSICON

75

Snap on/off

76

Grid on/off

77

Stil snap

78

Pereche isosnap "isosnap pair"

9-21

Ovidiu Alupei-Cojocariu

10

AutoLISP - Manual de programare

Codul ASCII

Caracterele sunt reprezentate intern n computer sub forma


irurilor de coduri.
Alipirea mai multor caractere formeaz un ir de caractere.
Funciile AutoLISP ascii i chr pot fi utilizate n determinarea codului
zecimal al unui caracter, respectiv a determina caracterul al crui cod
zecimal este introdus.
Tabelul urmtor prezint primele 128 de caractere ale tabelei
ASCII care sunt practic standard.
Tabela extins la 256 de caractere este n general utilizat cu
modificri ce in de platforma pe care se lucreaz. Caracterele tipribile
standard se afl ns ntre primele 128.
Se dau n acest context valorile exprimate n sistem zecimal,
octal i hexazecimal.
Numerele octale sunt importante prin posibilitatea exprimrii
caracterelor speciale prin structura "\nnn" , unde nnn este numrul octal
asociat caracterului.
Unele coduri netipribile au semnificaie special:
Cod

Nume

Semnificaie

BEL (bell)

semnal sonor

BS (backspace)

deplasare cursor napoi cu un caracter

HT sau TAB

salt pe urmtorul stop de tabulare

10

LF (line feed)

avans de linie

11

VT (vertical tab)

avans cu un numr de linii

12

FF (form feed)

avans cu o pagin

13

CR sau RETURN

repoziionare la nceput de rnd

27

ESC (Escape)

prefaeaz o secven Escape

10-1

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Dec

Oct

Hex

Caracter

Dec

Oct

Hex

Caracter

000

00

NUL

27

033

1B

ESC

001

01

SOH

28

034

1C

FS

002

02

STX

29

035

1D

GS

003

03

ETX

30

036

1E

RS

004

04

EOT

31

037

1F

US

005

05

ENQ

32

040

20

(space)

006

06

ACK

33

041

21

007

07

BEL

34

042

22

"

010

08

BS

35

043

23

011

09

HT

36

044

24

10

012

0A

LF

37

045

25

11

013

0B

VT

38

046

26

&

12

014

0C

FF

39

047

27

'

13

015

0D

CR

40

050

28

14

016

0E

SO

41

051

29

15

017

0F

SI

42

052

2A

16

020

10

DLE

43

053

2B

17

021

11

DC1

44

054

2C

18

022

12

DC2

45

055

2D

19

023

13

DC3

46

056

2E

20

024

14

DC4

47

057

2F

21

025

15

NAK

48

060

30

22

026

16

SYN

49

061

31

23

027

17

ETB

50

062

32

24

030

18

CAN

51

063

33

25

031

19

EM

52

064

34

26

032

1A

SUB

53

065

35

10-2

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Dec

Oct

Hex

Caracter

Dec

Oct

Hex

Caracter

54

066

36

104

150

68

55

067

37

105

151

69

56

070

38

106

152

6A

57

071

39

107

153

6B

58

072

3A

108

154

6C

59

073

3B

109

155

6D

60

074

3C

<

110

156

6E

61

075

3D

111

157

6F

62

076

3E

>

112

160

70

63

077

3F

113

161

71

64

100

40

114

162

72

65

101

41

115

163

73

66

102

42

116

164

74

67

103

43

117

165

75

68

104

44

118

166

76

91

133

5B

119

167

77

92

134

5C

120

170

78

93

135

5D

121

171

79

94

136

5E

122

172

7A

95

137

5F

123

173

7B

96

140

60

'

124

174

7C

97

141

61

125

175

7D

98

142

62

126

176

7E

99

143

63

127

177

7F

DEL

100

144

64

101

145

65

102

146

66

103

147

67

10-3

Ovidiu Alupei-Cojocariu

11

AutoLISP - Manual de programare

Sumar de funcii AutoLISP

Functii aritmetice
Functie
+ (adunare)

Sintaxa
(+ numr numr )

- (scadere)

(- numr numr )

* (nmultire)

(* numr numr )

/ (mpartire)

(/ numr numr )

~ (NU la nivel
de bit)

(~ int )

1+
(incrementare)
1(decrementare)

(1+ numr )

abs

(abs numr )

atan

(atan num1 [ num2 ])

cos

(cos unghi )

exp

(exp numr )

expt

(expt baza putere )

fix

(fix numr )

float

(float numr )

gcd

(gcd num1 num2 )

(1- numr )

11-1

Descriere
Returneaz suma
argumentelor
Returneaz diferenta
dintre primul argument i
urmtorul/ urmtoarele
Returneaz produsul
argumentelor
Returneaz rezultatul
mpartirii primului
argument la urmtorul/
urmtoarele
Returneaz NU la nivel
de bit (complementul de 1)
al argumentului
Returneaz argumentul
majorat (incrementat) cu 1
Returneaz argumentul
micsorat (decrementat) cu
1
Returneaz valoarea
absoluta a argumentului
Returneaz arctangenta
unui unghi dat n radiani
Returneaz cosinusul
unui unghi dat n radiani
Returneaz valoarea lui e
ridicata la o putere
Returneaz un numr
ridicat la o putere
specificat
Returneaz conversia
unui real la cel mai
apropiat ntreg mai mic
Returneaz conversia
unui numr ntr-un real
Returneaz cel mai mare
divizor comun a doi

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

log

(log numr )

logand

(logand numr numr )

logior

(logior numr numr )

lsh

(lsh num1 numbits )

max

(max numr numr )

min

(min numr numr )

minusp

(minusp articol )

pi

pi

rem

(rem num1 num2 )

sin

(sin unghi )

sqrt

(sqrt numr )

zerop

(zerop articol )

ntregi
Returneaz logaritmul
natural al unui numr
Returneaz rezultatul
unui AND pe bit aplicat
asupra unei liste de ntregi
Returneaz rezultatul
unui OR pe bit aplicat
asupra unei liste de ntregi
Returneaz deplasarea cu
un numr dat de poziii pe
bii a unui ntreg
Returneaz cel mai mare
dintre numerele date ca
argumente
Returneaz cel mai mic
dintre numerele date ca
argumente
Verific daca un numr
este negativ
Singura constanta din
AutoLISP
Returneaz restul
mpartirii primului
argument la al doilea
Returneaz i nusul unui
unghi dat ca expresie real
n radiani
Returneaz radicalul
dintr-un numr real
Verific daca un numr
este evaluat zero

Functii de manipulare i ruri de caractere


Functie
strcase

Sintaxa
(strcase ir [ case ])

strcat

(strcat i r1 i r2 ...)

strlen

(strlen ir )

substr
wcmatch

(substr ir start [ length ])


(wcmatch ir pattern )

Descriere
Returneaz un ir ale carui
caractere alfabetice au fost
convertite ca tip de litera
Returneaz un ir obtinut prin
concatenarea mai multor i ruri
Returneaz un ntreg care este
numrul de caractere din i r
Returneaz un subir al unui ir
Executa o potrivire de pattern
wild-card pe un ir

11-2

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Functii de egalitate i conditionale
Functie
=
(egal cu)

Sintaxa
(= num_ir num_ir ...)

/=
(neegal cu)

(/= num_sir1 num_sir2 )

<
(mai mic dect)

( num_ir num_ir ...)

<=
(mai mic sau
egal cu)

( = num_ir num_ir ...)

> (mai mare


dect)

( num_ir num_ir ...)

>=
(mai mare sau
egal)

( = num_ir num_ir ...)

And

(and expr ...)

Boole

(Boole func int1 int2 ...)

Cond

(cond ( test1 result1 ...)...)

Eq

(eq expr1 expr2 )

Equal

(equal expr1 expr2 [ fuzz ])

If
Or

(if expr_test expr_atunci


[ expr_altfel ])
(or expr ...)

repeat

(repeat numr expr ...)

while

(while expr_test expr ...)

11-3

Descriere
Returneaz T daca
argumentele sunt egale i
nil altfel
Returneaz T daca
argumentele nu sunt egale
i nil altfel
Returneaz T daca
fiecare argument e mai
mic dect cel din dreapta
lui nil altfel
Returneaz T daca
fiecare argument e mai
mic sau egal cu urmtorul
nil altfel
Returneaz T daca
fiecare argument este mai
mare dect urmtorul nil
altfel
Returneaz T daca
fiecare argument e mai
mare sau egal cu
urmtorul nil altfel
Returneaz valoarea aI
(AND) logic a unei liste
de expresii
Functie booleeana
generala
Serveste ca functie
conditionala primara n
AutoLISP
Determin daca doua
expresii sunt identice
Determin daca doua
expresii sunt egale
Evalueaz expresii n mod
conditional
Returneaz valoarea
SAU (OR) logic a unei
liste de expresii
Evalueaz repetat
expresiile furnizate
Evalueaz o expresie test
i daca nu e nil se itereaz

Ovidiu Alupei-Cojocariu
Functii de manipulare liste

AutoLISP - Manual de programare

Functie
acad_strls
ort
append

(append expr ...)

assoc

(assoc articol alist )

car cdr
cons

last

(car lista )(cdr lista ) etc.


(cons noul_prim_element
lista )
(foreach nume lista expr
...)
(last lista )

length

(length lista )

list

(list expr ...)

listp

(listp articol )

mapcar

(mapcar functie list1 ... listn


)

member

(member expr lista )

nth

(nth n lista )

reverse

(reverse lista )

subst

(subst art_nou art_vechi


lista )

foreach

Sintaxa
(acad_strlsort lista )

Descriere
Sorteaza o lista de i ruri de
caractere n ordine alfabetica
Returneaz lista obtinuta prin
alaturarea listelor argument
Returneaz intrarea ntr-o lista
corespunzatoare cheii date
Returneaz parti ale unei liste
Constructor fundamental de lista
Evalueaz expresia pentru toti
membrii unei liste
Returneaz ultimul element
dintr-o lista
Returneaz un ntreg indicnd
numrul de elemente dintr-o
lista
Combin orice numr de
expresii ntr-o singura lista
Verifica daca un articol este o
lista
Returneaz rezultatul aplicarii
unei functii pe fiecare element al
unei liste
Returneaz partea dintr-o lista
ncepnd cu valoarea unei
expresii date
Returneaz al n-lea element al
unei liste
Returneaz o lista cu
elementele ordonate invers
nlocuieste un articol ntr-o lista
peste tot pe unde apare

Functii de manipulare simboluri


Functie
atom
atomsfamily
boundp

Sintaxa
(atom articol )
(atoms-family format
[ listsimb ])
(boundp atom )

not

(not articol )

Descriere
Verifica daca un articol este un atom
Returneaz o lista a i mbolurilor
curent definite
Verifica daca unui nume si mbolic i
este atribuita o valoare
Verifica daca un articol este evaluat

11-4

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

null

(null articol )

numberp

(numberp articol )

quote

(quote expr )

read

(read ir )

set

(set simbol expr )

setq

(setq si m1 expr1
[ si m2 expr2 ]...)
(type articol )

type

ca nil
Verifica daca un articol este asociat
cu nil
Verifica daca un articol este numr
real sau ntreg
Returneaz o expresie fara s-o
evalueze
Returneaz prima lista sau atom
obtinut dintr-un ir
Fixeaza valoarea unui nume de
simbol pe o expresie
Seteaza valoarea unui simbol sau mai
multora pe expresiile asociate
Returneaz tipul articolului
specificat

Functii de manipulare functii


Functie
apply

Sintaxa
(apply functie lista )

defun

(defun i mb lista
argumente ( expr ...)
(eval expr )

eval
lambda
progn

(lambda argumente
expr ...)
(progn expr ...)

trace

(trace functie ...)

untrace

(untrace functie ...)

Descriere
Transfera o lista de argumente unei
functii specificate
Defineste o functie
Returneaz rezultatul evaluarii unei
expresii AutoLISP
Defineste o functie anonima
Evalueaz secvential expresiile i
Returneaz valoarea ultimei expresii
Ajut la depanarea programelor
AutoLISP
Anuleaz flag-ul trace pentru functiile
specificate.

Functii de manipulare erori


Functie
alert

Sintaxa
(alert ir )

*error*

(*error* ir )

exit
quit

(exit)
(quit)

Descriere
Afiseaz o caseta de alerta cu un mesaj de eroare
sau avertiment transmis ca ir
O functie de manipulare a erorilor definibila de
utilizator
Forteaz abandonarea aplicatiei curente
Forteaz abandonarea aplicatiei curente

Functii de manipulare aplicatii


Functie
ads

Sintaxa
(ads)

Descriere
Returneaz o lista a aplicatiilor ADS
curent ncarcate

11-5

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

arx

(arx)

arxload

(arxload aplicatie
[ esec ])
(arxunload aplicatie
[ esec ])
(autoarxload numefis
listacmd )
(autoload numefis
listacmd )
(autoxload numefis
listacmd )
(load numefis
[ la_esec ])
(startapp cmdapp
fisier )
(xload aplicatie
[ la_esec ])
(xunload aplicatie
[ la_esec ])

Returneaz o lista a aplicatiilor ARX


curent ncarcate
ncarca o aplicatie ARX

arxunload
autoarxload
autoload
autoxload
load
startapp
xload
xunload

Descarca o aplicatie ARX


Predefineste nume de comenzi pentru
a ncarca un fisier ARX asociat
Predefineste nume de comenzi pentru
a ncarca un fisier AutoLISP asociat
Predefineste nume de comenzi pentru
a ncarca o aplicatie ADS asociata
ncarca i evalueaza expresiile
AutoLISP dintr-un fisier
Lanseaza o aplicatie Windows
ncarca o aplicatie ADS
Descarca o aplicatie ADS

Functii de interogare i comanda


Functie
acad_colordg
acad_helpdlg
command
getcfg
getenv
getvar
help
setcfg
setfunhelp

Sintaxa
(acad_colordg
nr_culoare [
flag ])
(acad_helpdlg
fis_help
topica )
(command
args ...)
(getcfg
numecfg )
(getenv
nume_var )
(getvar
nume_var )
(help [ fishelp
[ topica [
comanda ]]])
(setcfg
numecfg
valcfg )
(setfunhelp
c:numefc [
fishelp [

Descriere
Afiseaza caseta standard de dialog
AutoCAD pentru selectarea culorii
Invoca facilitatea de HELP
Executa o comanda AutoCAD
Returneaz datele aplicatiei din sectiunea
AppData a fisierului ACAD.CFG
Returneaz valoarea ir atribuita unei
variabile ambientale de i stem
Regaseste valoarea unei variabile
AutoCAD de i stem
Invoca facilitatea de HELP pe orice
platforma
Scrie datele aplicatiei n sectiunea
AppData a fisierului ACAD.CFG
nregistreaza comanda utilizator pentru a
fi regasita topica la HELP

11-6

Ovidiu Alupei-Cojocariu
setvar
ver

topica
comanda ]]])
(setvar
numevar
valoare )
(ver)

AutoLISP - Manual de programare


Seteaza o variabila de i stem AutoCAD
Returneaz un ir care da versiunea
curenta AutoLISP

Functii pentru controlul afisarii


Functie
graphscr
grclear
grdraw

grvecs

Sintaxa
(graphscr)
(grclear)
(grdraw din n color [
highlight ])
(grtext [ box text [
highlight ]])
(grvecs vlist [ trans ])

menucmd

(menucmd ir )

prin1

(prin1 expr [ descr_fis ])

princ

(princ expr [ descr_fis ])

print

(print expr [ descr_fis ])

prompt

(prompt msg )

redraw
terpri

(redraw [ nument [ mod ]])


(terpri)

textpage
textscr
vports

(textpage)
(textscr)
(vports)

grtext

Descriere
Comuta ecranul n mod grafic
aterge ecranul/viwport-ul curent
Traseaza un vector ntre doua
puncte n viewport-ul curent
Scrie text pe linia de informatii
sau zonele de menu ecran
Deseneaza vectori multipli pe
ecranul grafic
Emite comenzi menu sau seteaza
i regaseste stari de articole de
menu
Imprima o expresie pe linia de
comanda sau o scrie ntr-un fisier
deschis
Idem cu prin1 dar caracterele de
control nu sunt expandate
Idem cu prin1 dar imprima un
caracter \n nainte i un blanc
dupa
Afiseaza un mesaj n zona de
dialog
Redeseneaza viewport/entitate
Tipareste o linie noua pe linia de
comanda
aterge ecranul text AutoCAD
Comuta ecranul n mod text
Returneaz o lista a
descriptorilor de ferestre
(viewport)

Functii de introducere utilizator


Functie
entsel

Sintaxa
(entsel [ prompt ])

getangle

(getangle [ pt ] [ prompt ])

Descriere
Cere selectarea a o singura
entitate prin specificarea unui
punct
Asteapta introducerea unui unghi

11-7

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

getcorner

(getcorner pt [ prompt ])

getdist

(getdist [ pt ] [ prompt ])

getfiled

(getfiled titlu implicit ext


flags )

getint

(getint [ prompt ])

getkword

(getkword [ prompt ])

getorient

(getorient [ pt ] [ prompt ])

getpoint

(getpoint [ pt ] [ prompt ])

getreal

(getreal [ prompt ])

getstring

(getstring [ cr ] [ prompt ])

initget

(initget [ bii ] [ ir ])

nentsel

(nentsel [ prompt ])

nentselp

(nentselp [ prompt ] [ pct ])

de catre utilizator ( radiani)


Asteapta introducerea celui de-al
doilea colt al unui dreptunghi
Asteapta introducerea unei
distante de catre utilizator
Cere utilizatorului un nume de
fisier prin caseta standard i -l
Returneaz
Asteapta introducerea unui ntreg
i Returneaz acel ntreg
Cere un cuvnt cheie de la
utilizator i -l Returneaz
Asteapta introducerea unui unghi
i Returneaz acel unghi n
radiani
Asteapta introducerea unui punct
i -l Returneaz
Asteapta introducerea unui numr
real i Returneaz acel numr
real
Asteapta introducerea unui ir i
Returneaz acel i r
Stabileste cuvintele cheie valabile
la urmtorul apel de functie de
introducere date
Cere utilizatorului sa selecteze o
entitate i asigura accesul la date
complexe
Idem cu nentsel doar ca nu se cere
obligatoriu i o introducere
utilizator

Functii geometrice
Functie
angle

Sintaxa
(angle pt1 pt2 )

distance

(distance pt1 pt2 )

inters

(inters pt1 pt2 pt3


pt4 [ pe_segm ])
(osnap pt i r-mod )

osnap
polar
textbox

(polar pt unghi
distanta )
(textbox elist )

Descriere
Returneaz unghiul n radiani al
dreptei definite de punctele argument
Returneaz distanta 3D ntre doua
puncte
Gaseste intersectia a doua drepte
Returneaz un punct 3D ca rezultat al
aplicarii OSNAP pe un punct dat
Returneaz punctul 3D UCS aflat la
un unghi i o distanta de alt punct
Masoara obiectul text dat i
Returneaz coordonatele casetei de text

11-8

Ovidiu Alupei-Cojocariu
Functii de conversie
Functie
angtof

Sintaxa
(angtos ir [ mod ])

angtos
ascii

(angtos unghi [ mod [


precizie ]])
(ascii ir )

atof

(atof ir )

atoi

(atoi ir )

chr

(chr numr )

cvunit
distof

(cvunit valoare din n


)
(distof ir [ mod ])

itoa

(itoa int )

rtos
trans

(rtos
(trans pt din n [ disp
])

AutoLISP - Manual de programare


Descriere
Returneaz un unghi ca numr real (n
radiani) convertind argumentul i r
Returneaz o valoare unghiulara data
n radiani convertita ntr-un i r
Returneaz codul ASCII al primului
caracter dintr-un i r
Returneaz valoarea convertita la real
a unui i r
Returneaz valoarea convertita la
ntreg a unui i r
Returneaz un caracter corespunzator
codului ASCII dat ca argument
Converteste o valoare dintr-o unitate de
masura n alta
Converteste un ir care reprezinta o
valoare reala ntr-o valoare reala
Returneaz conversia unui ntreg ntrun i r
Converteste un numr ntr-un i r
Translateaza un punct (sau o deplasare)
dintr-un i stem de coordonate n altul.

Functii de manipulare fisiere


Functie
close
findfile

Sintaxa
(close filespec )
(findfile numefis )

open

(open numefis mod )

read-char

(read-char [ descr_fis ])

read-line

(read-line [ descr_fis ])

writechar
writeline

(write-char num [
descr_fis ])
(write-line ir [
descr_fis ])

Descriere
nchide un fisier deschis
Cauta fisierul specificat pe calea de
biblioteca AutoCAD
Deschide un fisier pentru acces prin
functii AutoLISP
Returneaz codul ASCII al primului
caracter primit
Citeste un ir de la tastatura sau dintrun fisier deschis
Scrie un caracter pe ecran sau ntr-un
fisier deschis
Scrie un ir pe ecran sau ntr-un fisier
deschis

Functii de acces la dispozitive periferice


Functie
grread
tablet

Sintaxa
(grread [ track ] [ allkeys
[ tipcurs ]])
(tablet cod [ rnd1
rnd2 rnd3 directie ])

Descriere
Citeste valori de la orice dispozitiv de
introducere AutoCAD
Regaseste i seteaza calibrarile tabletei
grafice

11-9

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Functii de manipulare a multimilor de selectie
Functie
ssadd

Sintaxa
(ssadd [ nument [ ss ]])

ssdel

(ssdel nument ss )

ssget

(ssget [ mod ] [ pt1 [ pt2


]] [ lista_pt ] [ lista_flt ])

sslength

(sslength ss )

ssmemb

(ssmemb nument ss )

ssname

(ssname ss index )

Descriere
Adauga o entitate la o multime de
selectie sau creeaza una noua
Elimina o entitate din multimea de
selectie
Asteapta utilizatorul sa selecteze
obiecte i Returneaz multimea de
selectie
Returneaz un ntreg continnd
numrul de entitati dintr-o multime
de selectie
Verifica daca o entitate este membru
al unei multimi de selectie
Returneaz numele de entitate al
elementului indexat al unei multimi
de selectie

Functii de manipulare a obiectelor


Functie
entdel

Sintaxa
(entdel nument )

entget
entlast

(entget nument
[ list_apl ])
(entlast)

entmake
entmod

(entmake [ elist ])
(entmod elist )

entnext

(entnext [ nument ])

entupd

(entupd nument )

handent

(handent handle )

Descriere
aterge entitati sau reface entitati sterse
anterior
Regaseste datele de definitie ale unei
entitati
Returneaz numele ultimei entitati
principale nesterse din desen
Creeaza o noua entitate n desen
Modifica datele de definitie ale unei
entitati
Returneaz numele urmtoarei entitati
din desen
Actualizeaza imaginea unei entitati pe
ecran
Returneaz un nume de entitate pe
baza handle-ului sau

Functii de manipulare a datelor extinse


Functie
regapp

Sintaxa
(regapp aplicatie )

xdroom

(xdroom ename )

xdsize

(xdsize lista )

Descriere
nregistreaza un nume de aplicatie asociat cu
desenul AutoCAD curent
Returneaz marimea n octeti a spatiului
disponibil pentru date extinse
Returneaz marimea n octeti a listei de date
extinse

11-10

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
Functii de manipulare a tabelelor de simboluri i
a
dictionarelor
Functie
dictnext
dictsearch
namedobjdict
snvalid
tblnext
tblobjname
tblsearch

Sintaxa
(dictnext nument
simbol [ reluare ])
(dictsearch nument
simbol [ fixurm ])
(namedobjdict)
(snvalid nume_simb
[ flag ])
(tblnext
nume_tabela [
reluare ])
(tblobjname
nume_tabela simbol
)
(tblsearch
nume_tabela simbol
[ setnext ])

Descriere
Gaseste urmtorul articol ntr-un
dictionar
Cauta un articol ntr-un dictionar
Returneaz numele de entitate al
dictionarului obiect numit din
desenul curent
Verifica numele tabelei de i mboluri
pentru caractere valide
Gaseste urmtorul articol ntr-o
tabela de i mboluri
Returneaz numele de entitate al
intrarii date n tabela de i mboluri
Cauta un nume i mbolic ntr-o tabela
de i mboluri

Functii de deschidere i nchidere a casetelor de dialog


Functie
done_dialog
load_dialog
new_dialog
start_dialog

Sintaxa
(done_dialog [ statut ])
(load_dialog fis_dcl )
(new_dialog nume_dlg
id_dcl [actiune [
pct_ecran ]])
(start_dialog)

term_dialog

(term_dialog)

unload_dialog

(unload_dialog id_dcl )

Descriere
Finalizeaza o caseta de dialog
ncarca un fisier DCL
ncepe o noua caseta de dialog i
o lanseaza putnd sa dea i
actiunea implicita
Afiseaza o caseta de dialog i
ncepe acceptnd o introducere
utilizator
Abandoneaza toate casetele de
dialog curente
Descarca un fisier DCL

Functii de manipulare a zonelor i atributelor


Functie
action_tile

Sintaxa
(action_tile cheie
expr_act )

get_attr
get_tile

(get_attr cheie
(atribut )
(get_tile cheie )

mode_tile

(mode_tile cheie

Descriere
Atribuie o actiune de evaluare la
selectarea de catre utilizator a zonei n
caseta
Regaseste valoarea DCL a unui atribut
de caseta de dialog
Regaseste valoarea curenta de rulare a
unei zone de caseta de dialog
Fixeaza modul pentru o zona (tile) de

11-11

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

mod )
(set_tile cheie
valoare )

set_tile

caseta de dialog
Seteaza valoarea unei zone (tile)

Functii de manipulare a casetelor i menu-urilor de listare


Functie
add_list

Sintaxa
(add_list ir )

end_list

(end_list)

start_list

(start_list cheie [
operatie [ index ]])

Descriere
Adauga sau modifica un ir de
caractere n lista casetei de dialog
curent active
ncheie procesarea listei casetei de
dialog curente
ncepe procesarea unei liste n zona de
listare a casetei de dialog

Functii de manipulare a zonelor cu imagini


Functie
dimx_tile si
dimy_tile

Sintaxa
(dimx_tile cheie
)(dimy_tile cheie )

end_image

(end_image)

fill_image

(fill_image x1 y1
wid hgt color )
(slide_image x1 y1
wid hgt nume_sld )

slide_image
start_image

(start_image cheie )

vector_image

(vector_image x1
y1 x2 y2 culoare )

Descriere
Regaseste dimensiunile unei n
unitati de caseta de dialog
zone(dale)
ncheie crearea imaginii casetei de
dialog curente
Deseneaza un dreptunghi n zona
de imagine a casetei de dialog
Afiseaza un slide AutoCAD n
zona imagine din caseta de dialog
activa
Lanseaza crearea unei imagini n
zona casetei de dialog
Deseneaza un vector n imaginea
din caseta de dialog curenta

Functii de manipulare a datelor specifice aplicatiei


Functie
client_data_tile

Sintaxa
(client_data_tile
cheie dateclient )

Descriere
Asociaza date gestionate de aplicatie
cu o zona de caseta de dialog

Functii de management al memoriei


Functie
alloc

Sintaxa
(alloc int )

expand

(expand int )

gc

(gc)

mem
vmon

(mem)
(vmon)

Descriere
Fixeaza marimea segmentului de memorie pe un
numr dat de noduri
Aloca spatiu de noduri prin cererea unui numr
specificat de segmente
Forteaza colectarea de resturi care elibereaza
nodurile nefolosite
Afiseaza starea curenta a memoriei AutoLISP
Asigura paginarea virtuala a memoriei (nvechita)

11-12

Ovidiu Alupei-Cojocariu

12

AutoLISP - Manual de programare

Bibliografie

HEAD, O.George - AutoLISP in plain english, Ventana Press,


Chapel Hill, North Carolina, USA, 1988

STNCESCU Constantin - AutoCAD - Manual de iniiere,


Editura Fast, Bucureti, 1993

STNCESCU Constantin - AutoLISP - Manual de programare,


Editura Fast, Bucureti, 1996

STNCESCU Constantin - Revista "Hello - CAD FANS" nr.1-45,


iunie 1991 - februarie 1996

*** - AutoLISP Programmers reference, Autodesk,Inc., Sausalito,


Caallifornia, USA, 1989,1992, 1993, 1994, 1999

12-1

Ovidiu Alupei-Cojocariu

13

AutoLISP - Manual de programare

Cuprins

0 CUVNT NAINTE....................................................................0-1
1 INTRODUCERE .........................................................................1-1
1.1
PROGRAMAREA N MEDIUL AUTOCAD? .............................1-1
1.2
CE ESTE UN INTERPRETOR? .................................................1-2
1.3
CE ESTE LISP? ....................................................................1-2
1.4
CE ESTE AUTOLISP?...........................................................1-3
1.5
CE FACE AUTOLISP ? .........................................................1-3
1.6
CUM ACIONEAZ AUTOLISP ?..........................................1-3
1.7
CUNOTINE PRELIMINARE .................................................1-4
2 AUTOLISP I LISTELE............................................................2-1
2.1
PROCESAREA DE LISTE ........................................................2-1
2.2
UTILIZAREA EXPRESIEI N CADRUL UNEI COMENZI AUTOCAD:
2-2
2.3
STRUCTURA LISTELOR .........................................................2-3
2.4
SEPARATORI ........................................................................2-4
2.5
EVALUAREA LISTELOR ........................................................2-5
2.6
ATOMI .................................................................................2-5
2.7
FUNCII ...............................................................................2-7
2.7.1
Structura general a unei funcii................................2-7
2.7.2
Valorile returnate de funcii .....................................2-11
3 CE ESTE UN PROGRAM AUTOLISP? ..................................3-1
3.1
CUM POATE FI DEFINIT O NOU FUNCIE SAU UN PROGRAM?
3-1
Defun ..............................................................................................................3-1

3.2

CE ESTE ATRIBUIREA? .........................................................3-3

Setq.................................................................................................................3-4
set ...................................................................................................................3-5

3.3
3.3.1

STRUCTURI DE PROGRAMARE ..............................................3-5


Secvena......................................................................3-7

Progn ..............................................................................................................3-7

3.3.2

Decizia........................................................................3-7

If .....................................................................................................................3-8

3.3.3

Decizia multipl (case)...............................................3-8

Cond ...............................................................................................................3-8

3.3.4

Cicluri.........................................................................3-9

Repeat...........................................................................................................3-10
While ............................................................................................................3-10

13-2

Ovidiu Alupei-Cojocariu
AutoLISP - Manual de programare
4 CUM SE SCRIE , SE NCARC I SE EXECUT UN
PROGRAM.......................................................................................4-1
4.1
EDITORUL DE TEXTE NE......................................................4-1
4.2
ELEMENTELE UNUI PROGRAM AUTOLISP ...........................4-6
4.3
SCRIEREA INDENTAT .........................................................4-8
4.4
NCRCAREA UNUI PROGRAM ............................................4-11
Load ............................................................................................................. 4-12

5 PREZENTAREA PRINCIPALELOR CLASE DE FUNCII


AUTOLISP........................................................................................5-1
5.1
FUNCII CARE OPEREAZ CU NUMERE .................................5-1
+..................................................................................................................... 5-2
-...................................................................................................................... 5-3
* ..................................................................................................................... 5-3
/ ...................................................................................................................... 5-3
Float ............................................................................................................... 5-4
sin .................................................................................................................. 5-4
cos.................................................................................................................. 5-4
Expt................................................................................................................ 5-7
Exp................................................................................................................. 5-7
Log................................................................................................................. 5-7
Sqrt................................................................................................................. 5-7
Fix.................................................................................................................. 5-7
Float ............................................................................................................... 5-7
Rem................................................................................................................ 5-7
Gcd................................................................................................................. 5-8
Abs................................................................................................................. 5-8
Max................................................................................................................ 5-8
Min................................................................................................................. 5-8
1+................................................................................................................... 5-8
1-.................................................................................................................... 5-8
Minusp ........................................................................................................... 5-9

5.2

FUNCII RELAIONALE ........................................................5-9

=..................................................................................................................... 5-9
=..................................................................................................................... 5-9
<..................................................................................................................... 5-9
>..................................................................................................................... 5-9
<=................................................................................................................... 5-9
>=................................................................................................................... 5-9
Equal.............................................................................................................. 5-9
Eq................................................................................................................. 5-10

5.3

FUNCII LOGICE.................................................................5-10

And .............................................................................................................. 5-10


Or ................................................................................................................. 5-10
Not ............................................................................................................... 5-10
Boole............................................................................................................ 5-11

13-3

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

logand ...........................................................................................................5-12
logior ............................................................................................................5-12
~....................................................................................................................5-13
Lsh ................................................................................................................5-13

5.4

FUNCII DE INTRODUCERE DE DATE ..................................5-14

Initget - ........................................................................................................5-15
Getint ............................................................................................................5-18
getdist ...........................................................................................................5-19
Getdist ..........................................................................................................5-20
Getangle........................................................................................................5-21
Getorient .......................................................................................................5-21
Getpoint ........................................................................................................5-21
Getcorner ......................................................................................................5-22
Getstring .......................................................................................................5-22
Getkword ......................................................................................................5-23
Getfiled.........................................................................................................5-24

5.5

FUNCII GEOMETRICE........................................................5-24

Angle ............................................................................................................5-24
Distance ........................................................................................................5-25
Inters.............................................................................................................5-25
Polar..............................................................................................................5-25
Textbox.........................................................................................................5-26
Trans.............................................................................................................5-27

5.6

FUNCII AUTOCAD ..........................................................5-28

Acad_colordg ...............................................................................................5-28
Command .....................................................................................................5-28
Getvar ...........................................................................................................5-29
Setvar............................................................................................................5-30
Graphscr .......................................................................................................5-30
textscr ...........................................................................................................5-30
Menucmd......................................................................................................5-30
Osnap............................................................................................................5-30
Pause.............................................................................................................5-31
Redraw..........................................................................................................5-31
grclear...........................................................................................................5-31

5.7

FUNCII CARE OPEREAZ CU IRURI ..................................5-31

Acad_strlsort.................................................................................................5-32
Strcase ..........................................................................................................5-33
Strcat.............................................................................................................5-33
Strlen ............................................................................................................5-34
Substr............................................................................................................5-34

5.8

FUNCII CARE OPEREAZ CU LISTE....................................5-34

Append .........................................................................................................5-34
Apply ............................................................................................................5-35
Assoc ............................................................................................................5-35
Car ................................................................................................................5-35

13-4

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Cdr ............................................................................................................... 5-36


Cxr ............................................................................................................... 5-36
Cons ............................................................................................................. 5-37
Foreach ........................................................................................................ 5-37
Last .............................................................................................................. 5-38
Length.......................................................................................................... 5-38
List ............................................................................................................... 5-38
Listp ............................................................................................................. 5-39
Mapcar ......................................................................................................... 5-39
Member........................................................................................................ 5-39
Nth ............................................................................................................... 5-40
Reverse ........................................................................................................ 5-40
Subst ............................................................................................................ 5-41

5.9

FUNCII DE INFORMARE ....................................................5-41

Boundp......................................................................................................... 5-41
Minusp ......................................................................................................... 5-41
Null .............................................................................................................. 5-42
Listp ............................................................................................................. 5-42
Numberp ...................................................................................................... 5-42
Zerop............................................................................................................ 5-43
Getvar .......................................................................................................... 5-43
Getenv.......................................................................................................... 5-43
Regapp ......................................................................................................... 5-43
Type ............................................................................................................. 5-44
Ver ............................................................................................................... 5-45
Vports .......................................................................................................... 5-45

5.10

FUNCII DE CONVERSIE .....................................................5-46

Angtof .......................................................................................................... 5-46


Angtos.......................................................................................................... 5-46
Rtos.............................................................................................................. 5-47
Ascii............................................................................................................. 5-48
Atoi .............................................................................................................. 5-49
Read ............................................................................................................. 5-49
Distof ........................................................................................................... 5-49
Cvunit .......................................................................................................... 5-50
Itoa ............................................................................................................... 5-50
Chr ............................................................................................................... 5-51

5.11

FUNCII CARE TRATEAZ ERORI ........................................5-51

Alert ............................................................................................................. 5-51


*Error*......................................................................................................... 5-51
Exit............................................................................................................... 5-51
Trace ............................................................................................................ 5-52
Untrace......................................................................................................... 5-52
Close ............................................................................................................ 5-52
Findfile......................................................................................................... 5-53
Load ............................................................................................................. 5-53

13-5

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Open .............................................................................................................5-54
Prin1 .............................................................................................................5-54
Princ..............................................................................................................5-55
Print ..............................................................................................................5-55
Prompt ..........................................................................................................5-56
Terpri ............................................................................................................5-56
Read-char......................................................................................................5-56
Read-line.......................................................................................................5-56
Write-char.....................................................................................................5-57
Write-line......................................................................................................5-57

5.12

FUNCII CARE OPEREAZ CU NUME DE ELEMENTE ............5-58

Entnext..........................................................................................................5-58
Entlast...........................................................................................................5-58
Entsel ............................................................................................................5-58
Handent ........................................................................................................5-59
Nentsel..........................................................................................................5-59
Xdroom.........................................................................................................5-59
Xdsize...........................................................................................................5-60
Entdel............................................................................................................5-60
Entget............................................................................................................5-60
Entmake........................................................................................................5-62
Entmod .........................................................................................................5-63
Entupd ..........................................................................................................5-64

5.13

FUNCII CARE OPEREAZ CU SETURI DE SELECIE.............5-64

Ssget .............................................................................................................5-64
Sslength ........................................................................................................5-68
Ssname..........................................................................................................5-69
Ssadd ............................................................................................................5-69
Ssdel .............................................................................................................5-70
Ssmemb ........................................................................................................5-70

5.14

FUNCII CARE AU ACCES LA TABELELE DE SIMBOLURI ......5-70

Tblnext..........................................................................................................5-70
Tblsearch ......................................................................................................5-71

5.15
FUNCII DE INTRODUCERE DIRECT GRAFIC I DE LA ALTE
DISPOZITIVE ......................................................................................5-72
Grclear ..........................................................................................................5-72
Grdraw..........................................................................................................5-72
Grread...........................................................................................................5-73
Grtext............................................................................................................5-74
Grvecs...........................................................................................................5-74
Tablet............................................................................................................5-75

5.16

FUNCII CARE MONITORIZEAZ SPAIUL DE MEMORIE ......5-75

Alloc .............................................................................................................5-75
Expand..........................................................................................................5-76
Gc .................................................................................................................5-76
Mem..............................................................................................................5-76

13-6

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

Vmon ........................................................................................................... 5-76

5.17

FUNCII LEGATE DE APELUL DE APLICAII EXTERNE .........5-77

Ads............................................................................................................... 5-77
Arx ............................................................................................................... 5-77
Xload ........................................................................................................... 5-77
Arxload ........................................................................................................ 5-77
Xunload ....................................................................................................... 5-77
Arxunload .................................................................................................... 5-78

5.18

FUNCII CARE CONTROLEAZ FERESTRELE DE DIALOG .....5-78

Done_dialog................................................................................................. 5-79
Load_dialog ................................................................................................. 5-79
New_dialog.................................................................................................. 5-80
Start_dialog.................................................................................................. 5-81
Term_dialog................................................................................................. 5-81
Unload_dialog.............................................................................................. 5-81
Action_tile ................................................................................................... 5-81
Get_attr ........................................................................................................ 5-82
Get_tile ........................................................................................................ 5-82
Mode_tile..................................................................................................... 5-83
Set_tile ......................................................................................................... 5-83
Add_list ....................................................................................................... 5-83
End_list ........................................................................................................ 5-84
Start_list....................................................................................................... 5-84
Dimx_tile ..................................................................................................... 5-85
Dimy_tile ..................................................................................................... 5-85
End_image ................................................................................................... 5-85
Fill_image .................................................................................................... 5-86
Slide_image ................................................................................................. 5-86
Start_image .................................................................................................. 5-87
Vector_image............................................................................................... 5-87
Client_data_tile............................................................................................ 5-87

6PROGRAMAREA FERESTRELOR DE DIALOG...................6-1


6.1
PREZENTAREA SINTAXEI......................................................6-1
6.2
COMPONENTELE UNEI FERESTRE DE DIALOG .......................6-4
6.3
FIIERELE ACAD.DCL I BASE.DCL .....................................6-11
6.4
REFERIREA FIIERELOR DCL.............................................6-11
6.5
PRINCIPII DE PROIECTARE A CASETELOR DE DIALOG ..........6-12
6.6
UTILIZAREA ZONELOR PREDEFINITE ..................................6-17
6.7
ATRIBUTELE ZONELOR DE DIALOG ....................................6-21
action ........................................................................................................... 6-24
alignment ..................................................................................................... 6-25
allow_accept ................................................................................................ 6-25
aspect_ratio .................................................................................................. 6-25
big_increment .............................................................................................. 6-25
children_alignment ...................................................................................... 6-26
children_fixed_height .................................................................................. 6-26

13-7

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

children_fixed_width....................................................................................6-26
color..............................................................................................................6-26
edit_limit.......................................................................................................6-27
edit_width .....................................................................................................6-27
fixed_height..................................................................................................6-28
fixed_width...................................................................................................6-28
fixed_width_font ..........................................................................................6-28
height ............................................................................................................6-28
initial_focus ..................................................................................................6-29
is_bold ..........................................................................................................6-29
is_cancel .......................................................................................................6-29
is_implicit .....................................................................................................6-29
is_enabled .....................................................................................................6-30
is_tab_stop....................................................................................................6-30
key ................................................................................................................6-30
label ..............................................................................................................6-30
layout ............................................................................................................6-31
list .................................................................................................................6-31
max_value.....................................................................................................6-31
min_value .....................................................................................................6-31
mnemonic .....................................................................................................6-32
multiple_select..............................................................................................6-32
password_char ..............................................................................................6-32
small_increment............................................................................................6-32
tabs ...............................................................................................................6-33
tab_truncate ..................................................................................................6-33
value .............................................................................................................6-33
width.............................................................................................................6-33

6.8

PRINCIPALELE ZONE DE DIALOG PDB ...............................6-34

boxed_column ..............................................................................................6-36
boxed_radio_column ....................................................................................6-36
boxed_radio_row ..........................................................................................6-37
boxed_row ....................................................................................................6-37
button............................................................................................................6-38
column ..........................................................................................................6-38
concatenation................................................................................................6-39
dialog ............................................................................................................6-39
edit_box ........................................................................................................6-39
errtile ............................................................................................................6-40
image ............................................................................................................6-40
image_button ................................................................................................6-41
list_box .........................................................................................................6-41
ok_only .........................................................................................................6-42
ok_cancel......................................................................................................6-42
ok_cancel_help .............................................................................................6-42
ok_cancel_help_errtile..................................................................................6-43
ok_cancel_help_info.....................................................................................6-43

13-8

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

paragraph ..................................................................................................... 6-43


popup_list .................................................................................................... 6-43
radio_button................................................................................................. 6-44
radio_column ............................................................................................... 6-45
radio_row..................................................................................................... 6-45
row ............................................................................................................... 6-46
slider ............................................................................................................ 6-46
text ............................................................................................................... 6-46
text_part ....................................................................................................... 6-47
toggle ........................................................................................................... 6-47
spacer ........................................................................................................... 6-48
spacer_0 ....................................................................................................... 6-48
spacer_1 ....................................................................................................... 6-48

6.9

EXEMPLE DE DIALOGURI CONDUSE PRIN FERESTRE DE DIALOG


6-48
7EXEMPLE DE PROGRAME AUTOLISP .................................7-1
7.1
PROBLEMA 1:DESENAREA UNUI DREPTUNGHI .....................7-1
7.2
PROBLEMA 2:DESENAREA UNUI CHENAR PENTRU UN TEXT .7-2
7.3
PROBLEMA 3: LUNGIREA/SCURTAREA UNUI SEGMENT ........7-4
7.4
PROBLEMA 4: DREPTUNGHI CU CERC TANGET LA LATURI ...7-6
7.5
PROBLEMA 5:EXTRAGEREA VERTEXURILOR UNEI POLILINII 7-7
7.6
PROBLEMA 6: SCRIEREA N FIIER A DATELOR EXTRASE ...7-15
7.7
PROBLEMA 7: IMPORTUL DE DATE VECTORIALE ................7-16
7.8
PROBLEMA 8: EXTRAGEREA INFORMAIILOR UNOR CERCURI 723
7.9
PROBLEMA 9: PARAMETRIZARE DESENE 2D......................7-32
7.10
PROBLEMA 10: PARAMETRIZARE DESENE 3D....................7-44
8ERORI AUTOLISP.......................................................................8-1
8.1
CODURI DE EROARE .............................................................8-1
8.2
MESAJE DE EROARE .............................................................8-8
arguments of a defun can't have the same name ............................................ 8-8
AutoCAD rejected function ........................................................................... 8-8
AutoLISP stack overflow............................................................................... 8-8
bad argument type.......................................................................................... 8-8
bad association list ......................................................................................... 8-9
bad conversion code....................................................................................... 8-9
bad ENTMOD list.......................................................................................... 8-9
bad ENTMOD list value ................................................................................ 8-9
bad formal argument list ................................................................................ 8-9
bad function ................................................................................................... 8-9
bad function code........................................................................................... 8-9
bad grvecs list value..................................................................................... 8-10
bad grvecs matrix value ............................................................................... 8-10
bad list.......................................................................................................... 8-10
bad list of points........................................................................................... 8-10

13-9

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

bad node .......................................................................................................8-10


bad node type in list......................................................................................8-10
bad point argument .......................................................................................8-10
bad point value..............................................................................................8-11
bad real number detected ..............................................................................8-11
bad ssget list .................................................................................................8-11
bad ssget list value ........................................................................................8-11
bad ssget mode string....................................................................................8-11
bad xdata list.................................................................................................8-11
base point is required ....................................................................................8-12
Boole arg1 0 or 15 ........................................................................................8-12
can't evaluate expression...............................................................................8-12
can't open (file) for input -- LOAD failed.....................................................8-12
can't reenter AutoLISP..................................................................................8-12
console break ................................................................................................8-12
divide by zero ...............................................................................................8-12
divide overflow.............................................................................................8-12
exceeded maximum string length .................................................................8-13
extra right paren............................................................................................8-13
file not open..................................................................................................8-13
file read--insufficient string space ................................................................8-13
file size limit exceeded .................................................................................8-13
floating-point exception................................................................................8-13
function canceled..........................................................................................8-13
function undefined for argument ..................................................................8-14
function undefined for real ...........................................................................8-14
grvecs missing endpoint ...............................................................................8-14
illegal type in left ..........................................................................................8-14
improper argument........................................................................................8-14
inappropriate object in function ....................................................................8-14
incorrect number of arguments .....................................................................8-14
incorrect number of arguments to a function ................................................8-14
incorrect request for command list data........................................................8-15
input aborted.................................................................................................8-15
insufficient node space .................................................................................8-15
insufficient string space ................................................................................8-15
invalid argument ...........................................................................................8-15
invalid argument list .....................................................................................8-15
invalid character ...........................................................................................8-15
invalid dotted pair .........................................................................................8-15
invalid integer value .....................................................................................8-16
LISPSTACK overflow..................................................................................8-16
malformed list...............................................................................................8-16
malformed string...........................................................................................8-16
misplaced dot................................................................................................8-16
null function..................................................................................................8-16
quit/exit abort................................................................................................8-16

13-10

Ovidiu Alupei-Cojocariu

AutoLISP - Manual de programare

string too long .............................................................................................. 8-17


too few arguments........................................................................................ 8-17
too few arguments to grvecs ........................................................................ 8-17
too many arguments..................................................................................... 8-17

9PREZENTAREA CODURILOR DE GRUP DXF .....................9-1


9.1
CODURI GENERALE PENTRU TOATE TIPURILE DE ENTITI ..9-2
9.2
CODURI SPECIFICE OBIECTELOR..........................................9-2
9.3
ENTITI NEGRAFICE - CODURI DE GRUP DXF ..................9-14
9.4
CODURI DE GRUP DICIONAR .............................................9-14
9.5
CODURI DE GRUP DXF PENTRU DEFINIII DE BLOC I TABELE
DE SIMBOLURI ...................................................................................9-16
10CODUL ASCII ........................................................................10-11
11SUMAR DE FUNCII AUTOLISP.........................................11-1
12BIBLIOGRAFIE .......................................................................12-1
13CUPRINS...................................................................................13-2

13-11