Sunteți pe pagina 1din 256

AutoLISP

Introducere
AutoLISP-ul este un limbaj de programare pentru AutoCAD. Acest curs ofer cursantului posibilitatea de a-i nsui cunotine practice de lucru n AutoLISP prin cursuri i texte care explic structura i sintaxa limbajului i relaia acestuia cu AutoCAD-ul. Prin exerciii aplicative la teoria de programare i exemple concrete cursantul i completeaz aceste cunotine. Acest curs reprezint o culegere de texte i un ghid pentru un curs AutoLISP pe o perioada de 3 zile, oferit de Autodesk, Inc. Training Department. La exerciiile de proiectare se adaug lecii suplimentare i discuii la obiect. Acest curs poate fi folosit individual atunci cnd este n combinaie cu o dischet ce conine fiierele necesare pentru rezolvarea exerciiilor. Acest curs este bazat pe o versiune AutoLISP ce poate fi gsit pe toate platformele pe care este implementat AutoCAD R12.

Obiective
La sfritul acestui curs, cursantul va fi capabil s neleag sintaxa AutoLISP, o varietate de funcii standard i procesul de evaluare Lisp. Cursantul va putea folosi AutoLISP-ul pentru:

Utilizarea comenzilor AutoCAD prin intermediul funciilor


de baz AutoLISP.

Crearea de noi funcii AutoLISP. Crearea de noi funcii AutoCAD pe baza limbajului
AutoLISP.

Corectarea i modificarea entitilor din baza de date a


AutoCAD-ului.

Citirea i scrierea n fiiere cu texte ASCII cu ajutorul


limbajului AutoLISP.

Combinarea programelor de tip AutoLISP cu fiierele


AutoCAD de tip script.

97106266.doc R.2.1 5/16/2012 ATC. Iasi

AUTODESK, INC.

Cuprins
Acest material cuprinde subiectele prezentate mai jos. Explicarea acestor subiecte reprezint coninutul principal al capitolelor de mai jos. Introducere.........................................................................................................1 Generaliti........................................................................................................3 Expresii simbolice.............................................................................................7 Atomi i liste....................................................................................................13 Evaluri ...........................................................................................................21 Expresii simbol AutoLISP far comenzi AutoCAD......................................35 Tipuri de date numerice..................................................................................41 Puncte AutoCAD i liste AutoLISP...............................................................47 Prelucrare de liste............................................................................................57 Comenzi AutoCAD i liste AutoLISP............................................................71 Selecie interactiv de puncte.........................................................................79 Funcii..............................................................................................................87 Funcii care acioneaz ca i comenzi AutoCAD..........................................97 Fiiere de programare AutoLISP..................................................................101 Funcia C........................................................................................................105 Teste logice i condiionale...........................................................................113 Bucle de program..........................................................................................123 Operaii cu iruri...........................................................................................131 Acces la entiti.............................................................................................139 Liste asociate entitilor................................................................................147 Modificarea unei entiti...............................................................................155 Selectarea grafic a unei entiti...................................................................165 Tratarea erorilor............................................................................................171 Operaii cu fiiere..........................................................................................175 .............................................................................................................................. Seturi de selecie............................................................................................193 Tabele i nume de obiecte.............................................................................203 Fiiere script i AutoLISP.............................................................................211 Accesul la entiti simple i la polilinii........................................................217 Accesul la entiti simple i la blocuri..........................................................221 2

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Crearea entitilor cu funcia entmake.........................................................225 Crearea poliliniilor i a definitiilor de bloc cu funcia entmake ................227 Tratarea irurilor...........................................................................................231 Tratarea entitilor.........................................................................................243

97106266.doc R.2.1 5/16/2012

AUTODESK, INC.

Generaliti despre AutoLISP


Ce este AutoLISP-ul ?
AutoLISP-ul este un dialect al limbajului de programare Lisp utilizat pentru completarea posibilitilor de proiectare n AutoCAD. Lisp este un acronim pentru list processing (in alte texte, list programming. Este un limbaj de programare superior foarte cunoscut pentru aplicaiile lui n domeniul sistemelor specializate, inteligen artificial, programare pe baz de reguli i AutoCAD. Lisp este unul dintre limbajele de programare cele mai vechi. Ca i FORTRAN, primele implementri ale limbajului Lisp dateaz din anii 60. Multe sublimbaje ale limbajului Lisp exist n prezent, incluznd Common Lisp, Franz Lisp, Mu Lisp i X Lisp. Limbajul Lisp are multe caracteristici care se adreseaz att profesionitilor ct i amatorilor. AutoLISP are o sintax simpl, precis. Procesul de evaluare i sintaxa folosit pentru crearea expresiilor Lisp sunt uor de nvat. Este un interpretor aa nct rezultatele obinute din calcule pot fi vizualizate interactiv ntr-o sesiune AutoCAD. AutoLISP interacioneaz direct cu AutoCAD fr s necesite programe de sprijin extern, cum ar fi compilatorul. Programele AutoLISP snt uor de neles i modificat. AutoLISP-ul este capabil de iteraie i recursivitate. Funciile pot utiliza instruciuni condiionale i de start standard i pot fi definite n aa fel nct o funcie apeleaza la recursiune . AutoLISP-ul ncurajeaz programatorul s scrie funcii simple,structurate i s combine aceste funcii cu scopul de a crea programe complexe dar uor de neles.

Pentru cei ce snt interesai s lucreze cu programe AutoLISP le recomandm urmtoarele cri: Common LISP: A Gentle Introduction to Symbolic Computing de David S. Touretzky; LISP de Winston & Horn Looking at LISP de Tony Hasemer Common LispCraft de Robert Wilensky AutoLISP Programmer's Reference Manual.

Ce poate face AutoLISP-ul ?


AutoLISP-ul este o scul puternic. Poate fi folosit pentru a adapta AutoCAD-ul la orice fel de aplicaii, fcnd astfel AutoCAD-ul mai sensibil la modul de lucru. Multe dintre cele mai complicate aplicaii proiectate pentru AutoCAD folosesc pe scar larg limbajul de programare AutoLISP.

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

AutoLISP poate crea subrutine i macrouri puternice. Subrutinele AutoLISP pot fi alctuite din comenzi AutoCAD i funcii AutoLISP i pot automatiza operaii complexe n cadrul AutoCAD-ului. Subrutinele AutoLISP pot crea noi funcii AutoLISP i noi comenzi AutoCAD care pot fi folosite n linia de comand sau n cadrul fiierelor script i menu-urilor AutoLISP.

Cum ncrcm AutoLISP-ul ?


AutoLISP-ul este o component standard a AutoCAD-ului, portabil pe toate mainile de calcul. Interpretorul AutoLISP se ncarc automat la fiecare sesiune AutoCAD. AutoLISP opereaz n cadrul editorului grafic AutoCAD. Interpretorul st n "umbr" n timpul unei sesiuni de interpretare grafic ateptnd s evalueze o expresie simbolic introdus n linia de comand a AutoCAD-lui. AutoLISP-ul este disponibil numai n cadrul editorului grafic.

Ce trebuie s tim pentru a folosi AutoLISP-ul ?


Cunotinte temeinice de lucru cu AutoCAD. Trebuie de asemenea s avei cunotine despre: Fiiere script. Menu-uri utilizator.

n unele cazuri este mai simplu i mai uor s optimizai o secvent de desenare cu un fiier script sau cu un menu de baz dect s folosii un program AutoLISP.

Ce editor de text ar trebui folosit ?


Este nevoie de un editor de text ASCII pentru a crea fiiere program AutoLISP pe baza acestui manual. Fiierele de text ASCII pot fi ntlnite sub denumirea de fiiere "programmer", "non-document" sau "unformatted". Versiunea MS-DOS 5.0 a aprut cu un editor de text simplu numit EDIT. Dac folosii versiunea DOS 386 a AutoCAD-ului din acest manual este posibil s dorii s folosii acest editor. Aplicaia NOTEPAD din Microsoft WindowsTM este un editor de text ASCII aa cum este aplicaia Text Editor din Sun Mycrosystems SPARCTM din Open WindowsTM. Exist o varietate de editoare de text gratuite i care circul liber pentru AutoCAD i AutoLISP n cadrul Forumului CompuServe AutoCAD (GO ACAD). Orice editor profesional de programare este o unealt bun cu care se pot scrie fiiere program AutoLISP.
97106266.doc R.2.1 5/16/2012

AUTODESK, INC.

Hardware pentru AutoLISP i necesarul de memorie


Computerul dumneavoastr trebuie s aib hardware-ul i memoria cerut de AutoCAD pentru a putea folosi AutoLISP-ul. Manualele AutoCAD Interface i Installation And Performance Guide prezint cerinele specifice fiecrei platforme.

Lansarea n execuie
Lansai editorul grafic AutoCAD nainte de a lansa orice alt comanda. Va trebui s introducei s-expresiile AutoLISP din linia de comand. V sugerm s lansai sesiunea de editare grafic ori de cte ori utilizai acest manual.

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Expresii simbolice
Expresiile simbolice snt instruciuni de baz ale limbajului AutoLISP.

Obiective
n acest capitol vei nva: Cum s creai o expresie simbolic Cum recunoate AutoCAD-ul expresiile simbolice Cum s folosii expresiile simbolice n cadrul comenzilor AutoCAD Cum s aflai valoarea unei expresii simbolice

Instruciuni n AutoLISP
n principal LISP-ul proceseaz listele: el proceseaz i evalueaz listele de obiecte. AutoLISP-ul proceseaz liste cunoscute ca expresii simbolice, n cadrul AutoCAD-ului. Listele snt principalul mijloc de construire a expresiilor simbolice n AutoLISP. O expresie simbolic din AutoLISP poate fi comparat cu o propoziie n limba englez. O expresie simbolic sau o s-expresie are ntotdeauna o anumit valoare. Funcia principal a LISP-ului este s determine valoarea unei s-expresii. De fiecare dat cnd lansm o s-expresie interpretorului LISP (de obicei sub forma unei liste, el va evalua acea expresie i ne va da rezultatul. Acest rezultat se numete valoarea expresiei. O expresie simbolic sau o s-expresie reprezint pur i simplu o instruciune n LISP. S-expresiile n AutoLISP snt construite prin ncadrarea unei secvene valide de caractere ntre paranteze. Caracterul parantez stnga sau ( se numete parantez deschis i caracterul parantez dreapta sau ) se numete parantez nchis. n mod obinuit aceste caractere snt denumite deschis i nchis. Parantezele dintr-o s-expresie trebuie s fie echilibrate. Oricrei paranteze deschise trebuie sa-i corespund una nchis. Obs. Cea mai frecvent greeal n AutoLISP este nenchiderea parantezelor. Editoarele de text profesionale au aceast caracteristic de a gsi parantezele corespondente cu un minim de efort.

97106266.doc R.2.1 5/16/2012

AUTODESK, INC.

Cum recunoate AutoCAD-ul o s-expresie


AutoCAD-ul recunoate o s-expresie AutoLISP printr-o parantez deschis. Dac gsete o astfel de parantez, AutoCAD-ul transfer intrarea utilizatorului ctre interpretorul AutoLISP i ateapt rezultatul. AutoCAD afieaz rezultatul s-expresiei.

Command: (+ 1 2)

AutoCAD

(+ 1 2) 3

AutoLISP

3 Command:
Figura 1. Diagrama de comunicatie dintre AutoCAD si AutoLISP

Exemplu
Pe linia de comand a AutoCAD-ului nscriei s-expresiile n coloana din stnga a tabelului care urmeaz. Comparai rezultatele date de AutoCAD cu rezultatele care se afl n coloana din dreapta a tabelului.
Command:(+12) 3 Command:

S-expresii (+ 1 2) (- 2 1) (/ 4 2) (* 4 2)

Rezultate 3 1 2 8

Tabelul 1. Rezultatele expresiilor simbolice

S-expresiile i comenzile AutoCAD


S-expresiile pot fi introduse ca intrare la comenzi AutoCAD. AutoCAD-ul va recunoate parantezele deschise, va transfera intrarea interpretorului AutoLISP i va atepta rezultatul. 8

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

AutoCAD-ul tiprete rezultatul intrrii s-expresiilor pe linia de comand. AutoCAD-ul folosete rezultatul unei s-expresii introduse, drept intrare la comanda curent.

Figura 2. Cum AutoCAD-ul si AutoLISP-ul comunica intr-o comanda AutoCAD

97106266.doc R.2.1 5/16/2012

AUTODESK, INC.

Exemplu
n comanda "polar array" care urmeaz, mprind 360 de grade la 15 se determin numrul de obiecte de creat, de exemplu se creaz un obiect la fiecare 15 grade de rotaie. Introducei comenzile.
Command: line From point: 5,5 To point: 5,8 To point: Enter Command: array Select objects: last 1 found Select objects: Enter Rectangular or Polar array (R/P): p Center point of array: 5,5 Number of items: (/ 360 15) Angle to fill (+=ccw, -=cw) <360>:Enter Rotate objects as they are copied? <Y>Enter

Figura 3. Expresia (/360 15) genereaza un array de 24 linii

Caracterul semnul exclamrii


AutoCAD-ul analizeaz intrarea utilizatorului n linia de comand cautnd un alt caracter AutoLISP asociat: semnul exclamarii sau !. Acest caracter este denumit n mod frecvent bang. Dac semnul exclamarii este primul caracter, AutoCAD-ul transfer intrarea ctre interpretorul AutoLISP i ateapt rezultatul. Orice s-expresie valid poate urma dup semnul exclamrii.
Command: !(+ 12)

10

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Caracterul "bang" este deseori folosit pentru a cere AutoLISP-ului valoarea unui simbol. n acest caz, simbolul nu trebuie s se afle ntre paranteze.
Command: !pi

Exemplu
este un simbol predefinit n AutoLISP. Extragei valoarea simbolului pi pe linia de comand AutoCAD.
pi Command: !pi 3.14159 Command:

Recapitulare
S-expresiile snt expresii AutoLISP valide aflate ntre paranteze. AutoCAD-ul caut dou caractere speciale: parantezele deschise sau open i semnul exclamrii sau bang. Open indic AutoCAD-ului c urmeaz o s-expresie. Bang indic AutoCAD-ului c urmeaz o s-expresie sau un simbol. S-expresiile i caracterul bang pot fi folosite n linia de comand sau n cadrul comenzilor AutoCAD. Caracterul bang poate precede S-expresiile sau simbolurile.

97106266.doc R.2.1 5/16/2012

11

AUTODESK, INC.

Aceast pagin a fost lsat liber n mod intenionat.

12

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Atomi i liste
Exist dou mari categorii de tipuri de date n AutoLISP: atomi i liste. Atomii snt obiecte simple. Listele snt obiecte complexe. Acest capitol definete atomii i listele.

Obiective
n acest capitol se va studia: Diferena dintre atomi i liste Componentele unei liste Cum s recunoatem un raport de erori AutoLISP Natura obiectului AutoLISP nil

Atomi
Un atom este cel mai simplu tip de date din Lisp. Un atom poate fi un numr ntreg 1 un numr real 4587.993401 un ir de caractere ''A String Of Pearls'' o funcie AutoLISP predefinit + un simbol XYZ sau oricare alt tip de obiecte existente n tabelul 3-1.

97106266.doc R.2.1 5/16/2012

13

AUTODESK, INC.

Tipuri de atomi simbol sir intreg numar real descriptor de fisier nume entitate AutoCAD set de selectie AutoCAD subr (functie interna) subr externa (Functia ADS)

Exemple pi,x,mid_pt "Hello, world." 1,32767,-32768 1.0,45.678,-876543.21 <File: #a82> <Entity name: 6000001a> <Selection set: 1> <Subr: #1e32> <Ext. Subr: 1 #3a970498>

Tip de data AutoLISP SYM STR INT REAL FILE ENAME PICKSET SUBR EXSUBR

Tabelul 2. Exemple de atomi din AutoLISP si tipul de date al acestora

Exist o regul simpl pentru a afla dac un obiect este un atom sau o list. Dac obiectul nu se afl ntre paranteze atunci este un atom; dac da, atunci este o list.

Liste
Listele snt s- expresii complexe formate din atomi i/sau alte liste. Listele necesit sintaxe simple dar riguroase. O list trebuie s se afle ntre paranteze. Pentru orice list care poate fi evaluat, primul termen din cadrul listei respective trebuie s fie o funcie. Obiectele din cadrul listei trebuie separate prin cel puin un spaiu.

Iat cteva exemple de liste. Observai c fiecare obiect este separat printrun spaiu de celelalte obiecte din cadrul listei.
(+ 1 2 ) (- 4 2 ) (x y z ) (1.0 1.0 0.0 )

Despre evaluarea listelor vom vorbi puin mai trziu.

Elementele unei liste


Atomii i listele pot fi combinate sub form de liste. n urmtoarele patru exemple am introdus trei atomi ntr-o list. Fiecare atom este un element al listei.

Exemplu
Aceast list are trei elemente: numerele reale 1.0, 1.0 i 0.0

14

AUTODESK, INC. TRAINING


(1.0 1.0 0.0)

LECTII DE BAZA AUTOLISP

Aceast list are trei elemente: funcia de adunare + (funcie intern), nr. ntreg 1 i nr. ntreg 3.
(+ 1 3)

Aceast list are trei elemente: funcia de adunare +, nr. ntreg 1 i list (+ 2 3)
(+ 1 (+ 2 3 ))

Figura 4. Lista de trei elemente: doi atomi si o lista

Exemplu
Aceast list are trei elemente: funcia de adunare +, lista (+ 1(+ 2 3)) i lista (+ 4 5).
(+ (+ 1 (+ 2 3)) (+ 4 5))

Figura 5. Lista de trei elemente: un atom si doua liste.

Ceea ce este ncadrat ntre paranteze reprezint o list. O list se compune dintr-o parantez de deschidere urmat de zero sau de mai multe obiecte care pot fi atomi sau liste dup care urmeaz o parantez de nchidere.

97106266.doc R.2.1 5/16/2012

15

AUTODESK, INC.

Condiii de eroare
Cnd introducei s-expresii n linia de comand AutoCAD, interpretorul AutoLISP v va spune dac ai introdus o expresie neechilibrat. O expresie neechilibrat are mai multe paranteze deschise dect nchise. Iat o expresie neechilibrat. i lipsete o parantez nchis.
Command: (+ 1 (+ 2 3) 1>

AutoLISP-ul semnalizeaz o expresie neechilibrat printr-un mesaj special.


n>

unde n este numrul de paranteze nchise care lipsesc. Snt dou modaliti de rezolvare n cazul condiiilor de eroare: completai numrul corect de paranteze nchise sau apsai Ctrl-C pentru a anula expresia i a ne rentoarce n linia de comand. Not Este de asemenea posibil s vedei acest mesaj cnd un ir este neechilibrat. Un ir neechilibrat are ghilimele duble la un capt i simple la cellalt.

Particularitile obiectului nil


Toate obiectele din AutoLISP snt atomi sau liste. Atomii i listele se exclud mutual. Un atom nu este niciodat list i o list nu este niciodat atom. Excepia o face obiectul nil. Obiectul nil este "lista goal". Prin convenie nil este i atom i list. nil poate fi exprimat n dou moduri: 0 sau nil;. este echivalentul AutoLISP pentru fals. Multe funcii n AutoLISP testeaz dac o condiie este adevarat sau fals, de exemplu dac valoarea unui numr este mai mare dect 0. De cte ori un test de condiie este fals, AutoLISP-ul va returna obiectul nil ca fiind valoarea testului.
nil

este singurul obiect din AutoLISP corespunzator lui "fals"; de aceea orice alt valoare returnat de un test de condiie trebuie s corespund lui "adevrat".
nil

16

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Recapitulare
Cele dou mari clase de obiecte din AutoLISP snt atomii i listele. Exist cteva tipuri diferite de atomi. Atomii snt obiecte care nu snt ncadrate ntre paranteze. Listele snt ntodeauna ncadrate ntre paranteze Obiectele coninute ntr-o list constituie elementele unei liste Elementele unei liste pot fi atomi sau liste Elementele unei liste snt separate ntre ele de cel puin un spaiu AutoLISP detecteaz expresiile neechilibrate nil este i atom i list
nil nil

este lista goal este returnat de testele de condiie pentru a indica "fals"

97106266.doc R.2.1 5/16/2012

17

AUTODESK, INC.

EXERCITIUL

1: ATOMI SI LISTE n acest exerciiu vei: Recapitula ce ai neles despre atomi i liste Determina dac un obiect este atom sau list Folosi AutoLISP pentru a afla valoarea diferitelor obiecte

Partea I
1. 2. Determinai dac obiectul este atom sau list. Completai rezultatul evalurii n csua corespunzatoare.

Tabelul 3. Determinarea naturii obiectului Obiecte 73.5 "0,0" (1.0 2.0 3.0) "String" ("String") () Atomi Liste

18

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Partea a II-a
1. 2. 3. Gsii valoarea acestui atom n linia de comand AutoCAD Tiprii "!" urmat de un atom Scriei rspunsul n coloana din dreapta:
Command: !4.5 Atomi 4.5 "text" 17 setq xyz nil Tabelul 4. Determinarea valorii atomului Valori

Exemplu

Partea a III-a
1. 2. Determinai numrul de elemente coninut de fiecare list. Scriei rspunsul n coloana din dreapta.
Numar de elemente (1.0 2.0 3.0) (+ 1 2) (+ 1 (+ 2 3)) (+ 1 2 (+ 3 4) 5) (+ 1 (+ 2 (+ 3 4)) 5) () Tabelul 5. Determinarea numarului de elemente din lista

Lista

97106266.doc R.2.1 5/16/2012

19

AUTODESK, INC.

Aceast pagin este lsat liber n mod intenionat.

20

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Evaluarea
Evaluarea este procesul prin care AutoLISP-ul determin valoarea unui obiect. Evaluarea se aplic i la atomi i la liste. Fiecare obiect din AutoLISP are o valoare. Prin evaluarea unui obiect, AutoLISP-ul determin valoarea acestuia.

Obiective
n acest capitol vei studia: Procesul evalurii Cum returneaz AutoLISP-ul o valoare Cum evalueaz AutoLISP-ul atomi i liste Cum se folosesc funciile aritmetice de baz n AutoLISP Cum se anuleaz evaluarea unui obiect Cum leag AutoLISP-ul o valoare de o variabil

Returnarea valorii
Cnd transmitei un obiect spre evaluare AutoLISP-ului, acesta i determin valoarea i o returneaz. ntr-un exemplu anterior, folosind caracterul "!", AutoLISP-ul a evaluat obiectul pi i a returnat valoarea AutoCAD-ului. AutoCAD-ul a tiprit valoarea returnat n zona liniei de comand.
Command: !pi 3.14159 <- valoare returnata

ntr-un exemplu anterior folosind comanda ARRAY, AutoLISP-ul a evaluat lista (/ 360 15) i a returnat valoarea 24 AutoCAD-ului. AutoCAD-ul a folosit valoarea returnat la intrare n comanda ARRAY.
Center point of array: 5,5 Number of items: (/ 360 15) Angle to fill (+=ccw, -=cw) <360>:Enter

97106266.doc R.2.1 5/16/2012

21

AUTODESK, INC.

Figura 6. AutoLISP returneaza valoarea expresiei in linia de comanda AutoCAD.

Evaluarea atomilor
Atomii snt obiecte simple i snt evaluai folosind reguli simple potrivit tipului lor de date. Majoritatea atomilor se autoevalueaz. Numerele ntregi, numerele reale, irurile, se autoevalueaz la valoarea pe care o au. Modul n care se evalueaz un simbol nu poate fi discutat dect dup ce nvam cum se leag o list.
Tip de atom Intreg Real Sir Simbol Exemplu 1 4.5 "text" x Regula de evaluare Valoarea este nr. insusi Valoarea este nr. insusi Valoarea este nr. insusi Legarea curenta 1 4.5 "text" Ultima asignare Valoare

Tabelul 6. Reguli de evaluare a atomilor

Evaluarea listelor
Evaluarea unei liste poate fi facut ntr-unul din aceste dou moduri: se ia lista ca atare sau se evalueaz. n funcie de natura listei, metodele dau rezultate diferite,de exemplu, valori diferite. Dac o list este luat ca atare, atunci valoarea ei este lista nsi. Acest lucru va fi mai clar dup explicarea funciei quote mai trziu n aceast lecie. 22

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Dac o list urmeaz a fi evaluat de AutoLISP, atunci trebuie respectat regula sintactic.

Pentru orice list care poate fi evaluat, primul element din


cadrul listei trebuie s fie o funcie. Listele snt evaluate potrivit instruciunilor referitoare la primul element al listei. Dac primul element este numele unei subrutine interne AutoLISP sau funcii, restul de elemente ale listei snt transferate funciei ca argumente formale i snt evaluate de ctre funcie. Funciile snt fie funcii interne AutoLISP, fie subrutine, aa cum snt cele prezentate n capitolul 4 al manualului AutoLISP Programmers Reference Manual, fie funcii externe definite de utilizator sau exsubr definite de aplicaii ADS, sau funcii AutoLISP definite de utilizator.

Cum evalueaz AutoLISP-ul o list


Vom folosi o list simpl pentru a ilustra procesul de evaluare a unei liste. Aceasta este o list format din trei elemente: funcia + numerele ntregi 1 i 2.
(+ 1 2)

Etapa I: Analiza primului element


Primul element al unei liste pe care AutoLISP-ul o poate evalua trebuie s fie o funcie. AutoLISP-ul verific primul element al listei unde se ateapt s gseasc o funcie. Dac primul element al listei pe care AutoLISP-ul ncearc s o evalueze nu este o funcie, acesta va da natere unei erori. Elementele care urmeaz dup o funcie n cadrul unei liste snt argumentele funciei; adic ele reprezint datele asupra crora funcia opereaz.

Etapa a II-a: Evaluarea funciei


AutoLISP evalueaz funcia. O funcie evalueaz un set de instruciuni care sugereaz AutoCAD-ului cum s acioneze mai departe. Funcia + evalueaz un set de instruciuni pentru AutoLISP. Dac ar fi s exprimm n cuvinte aceste instruciuni, am putea spune: gsii valoarea fiecrui element din aceast list. Care snt argumentele funciei? Punei toate valorile la un loc i returnai rezultatul ca fiind valoarea ntregii liste.

97106266.doc R.2.1 5/16/2012

23

AUTODESK, INC.

Etapa a III-a: Continuarea instruciunilor funciei


(.. 1 ..) Urmrind instruciunile din funcia +, AutoLISP-ul gsete valoarea urmtorului element din list: numrul ntreg 1. Numerele ntregi se evalueaz pe sine. Astfel AutoLISP-ul memoreaz valoarea 1 n stiva programului, de exemplu o introduce ntr-o locaie de memorie temporar. (.. .. 2) Coninnd cu instruciunile de la funcia +, AutoLISP-ul verific dac mai snt i alte elemente n list. Mai exist un element: numrul ntreg 2. AutoLISP-ul i pastreaz valoarea n stiv.

Etapa a IV-a: Returnarea valorii funciei


Nemaigsind alte elemente n list, de exemplu argumente la funcie, AutoLISP-ul i termin instruciunile de la funcia + prin adugarea valorilor argumentelor 1 i 2 i prin returnarea numrului ntreg 3 ca fiind valoarea listei.
Command: (+ 1 2) 3 Command:

Un exemplu mai complex


AutoLISP evalueaz elementele dintr-o list de la stnga la dreapta. n multe cazuri ar fi convenabil pentru noi s urmm procesul de evaluare din interior spre exterior dect de la dreapta spre stnga. Rezultatele snt de obicei aceleai i adesea este mai uor pentru noi s citim coduri AutoLISP cu un grad de imbricare mai mare, lucrnd din interior n exterior. Dar nu acesta este modul n care AutoLISP-ul evalueaz o list. ntotdeauna lucreaz de la stnga la dreapta. Considerai aceast list format din trei elemente: (+ 1 (+ 2 3)) Funcia + Atomul 1 Lista (+ 2 3)

24

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Figura 7. Evaluarea unei liste complexe

AutoLISP-ul evalueaz aceast list folosind exact aceeai metod ca n exemplul anterior.
(+ ..

AutoLISP-ul caut primul element al listei ateptnd s gseasc o funcie i apoi o evalueaz. Funcia returneaz valoarea ei ca un set de instruciuni pentru AutoLISP.
(.. 1 ..

Urmnd instruciunile funciei +, AutoLISP-ul afl valoarea celui de al doilea element al listei, de ex. primul argument la funcia +: atomul 1. Apoi i memoreaz valoarea i continu.
(.. .. (+ 2 3) ..

AutoLISP-ul gsete valoarea celui de al treilea element al listei, cum ar fi al doilea argument la funcia +. Al treilea element este el nsui o list. Cum afl AutoLISP-ul valoarea unei liste? Prin evaluare. Cum evalueaz AutoLISP-ul o list?
(.. .. (+ ..

Mai nti evalueaz funcia + i i primete instruciunile


( .. .. (.. 2 .. (.. .. (.. .. 3) ..

Apoi gsete valoarea argumentelor 2 i 3. Terminndu-i instruciunile de la funcia + din cadrul listei (+ 2 3), AutoLISP-ul adaug valorile i returneaz rezultatul care n acest caz este nr. ntreg 5. Nemaigsind alte elemente n list, AutoLISP-ul termin instruciunile de la funcia + n lista principal prin adugarea valorii celor dou elemente la un loc i returnnd valoarea 6.
97106266.doc R.2.1 5/16/2012

25

AUTODESK, INC.

Funcii aritmetice
AutoLISP-ul include funcii interne pentru operaii aritmetice ca: adunarea, scderea, nmulirea i mprirea + funcia de adunare - funcia de scdere * funcia de nmulire / funcia de mprire

26

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemple
Expresii aritmetice 1+2 2-1 2*4 4/2 Tabelul 7. Aritmetica AutoLISP S-expresii AutoLISP (+ 1 2) (- 2 1) (* 2 4) (/ 4 2)

Ordinea argumentelor n funciile de adunare i de nmulire nu are importan. Este ns important pentru scdere i mprire.

Fig. 8 Ordinea argumentelor in functia de scadere

n cazul scderii, valoarea celui de al doilea argument este sczut din valoarea primului argument i rezultatul returnat este valoarea listei.

Fig. 9 Ordinea argumentelor in functia de impartire

n cazul mpririi, valoarea celui de al doilea argument este divizorul valorii primului argument.

Iat cteva exemple complexe.

97106266.doc R.2.1 5/16/2012

27

AUTODESK, INC.

Exemple
Expresii aritmetice 1 + (2 - 3) (4 + 2) - 1 4*4/2 4/2*3 S-expresii AutoLISP (+ 1 (- 2 3)) (- (+ 4 2) 1) (/ (* 4 4) 2) (* 3 (/ 4 2))

Tabelul 8. Exemple complexe de expresii aritmetice

Recapitulare
AutoLISP-ul determin valoarea unui obiect prin evaluare. AutoLISP-ul returneaz valoarea fiecrui obiect pe care il evalueaz. Majoritatea atomilor se evalueaz pe sine. Simbolurile se evalueaz prin legare sau atribuire. Listele snt evaluate printr-un proces standard. Primul element al oricarei liste ce poate fi evaluat trebuie s fie o funcie.

AutoLISP-ul are funcii standard pentru operaii aritmetice.

28

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

2: LISTE SI ARITMETICA LISTELOR n acest exerciiu vei: Consolida cunotinele despre procesul de evaluare ncepe scrierea expresiilor AutoLISP folosind listele Transforma expresiile aritmetice n expresii AutoLISP Transforma expresiile AutoLISP n expresii aritmetice

Partea I
1. 2. 3. Folosii funcia +, -, /, i *. Transformai expresiile aritmetice n expresii AutoLISP. Scriei rspunsurile n coloana din dreapta.

Exemplu
Expresia n notaia aritmetic standard:
1+2

Expresia n AutoLISP:
(+12)

Expresii aritmetice 3 + 10 + 5 20 * 15 16 - 10 15 / 3 5 + (10 * 2) (5 + 10) * 2

S-expresii

Tabelul 9. Traducerea expresiilor aritmetice

97106266.doc R.2.1 5/16/2012

29

AUTODESK, INC.

Partea a II-a
1. 2. Transformai s-expresiile n expresii aritmetice Scriei rspunsurile n coloana din dreapta

Exemplu
Expresia n notaia aritmetic standard
(2 * 5) / (7 - 2)

Expresia n AutoLISP
(/ (* 2 5) (- 7 2)) s-expresii (+ 2 (+ 5 4) (- 4 2)) (- 5 (+ 4 (- 3 2))) (/ 8 (- (/ 6 2) 1)) (* 2 (/ (+ 2 4) 3)) (- 5 (/ 6 (+ 1 2))) (+ (/ (* 2 3) (- 4 2)) 1) Tabelul 10. Traducerea expresiilor AutoLISP expresii aritmerice

30

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Liste neevaluate
Valoarea unei liste poate fi determinat n unul din aceste dou moduri: se evalueaz lista sau se consider lista ca atare. Funcia AutoLISP quote este folosit pentru a returna o list sau un atom neevaluat, adic la valoarea ca list. Folosii quote ca fiind primul element ntr-o list i adugai un singur argument. Valoarea listei va fi valoarea neevaluat a celui de al doilea element al listei, adic argumentul la quote.

Exemplu
Aceast expresie returneaz lista (1.0 2.0 3.0) neevaluat.
Command: (quote (1.0 2.0 3.0)) (1.0 2.0 3.0)

Ce s-ar ntmpla dac AutoLISP-ului i s-ar cere s evalueze lista? De ce?


Command: (1.0 2.0 3.0) ?

Operaia de legare a dou obiecte


Legarea este procesul prin care o valoare este atribuit unui simbol definit de utilizator sau unei variabile. n AutoLISP, spunem c la un simbol sau la o variabil se leag o valoare. Aceasta nseamn n limbajul BASIC c o valoare este egal de o variabil sau c o valoare este atribuit unei variabile. Funcia AutoLISP setq se folosete pentru a lega un simbol sau o variabil de o valoare.

Exemplu
Aceast expresie leag simbolul x de valoarea 4.5.
Command: (setq x 4.5) 4.5 Command: !x 4.5

97106266.doc R.2.1 5/16/2012

31

AUTODESK, INC.

n BASIC, aceeai operaie ar putea fi exprimat astfel: LET x = 4.5

Cum funcioneaz funcia setq


Valoarea funciei setq este un set de instruciuni pentru AutoLISP. Aceste instruciuni ar putea fi exprimate astfel: Luai primul argument ca atare. Nu-l evaluai. Gsii valoarea celui de al doilea argument. Legai primul argument de valoarea celui de al doilea argument. Returnai valoarea legrii ca fiind valoarea listei.

Exemplu
Notai returnarea valorii acestei expresii. Valoarea listei este valoarea legturii stabilite pentru simbolul x de ctre funcia setq.
Command: (setq x 4.5) 4.5

Recapitulare
Funcia quote suprim procesul de evaluare. Legarea este procesul de atribuire a unei valori la o variabil. Functia setq este folosit pentru a lega o variabil de o valoare.

32

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

3: EVALUAREA LISTELOR SI LEGAREA VARIABILELOR n acest exerciiu vei: Consolida cunotinele despre procesul de evaluare Determina dac o list poate fi evaluat fr erori Consolida cunotinele despre procesul de legare Folosi funcia setq pentru a lega variabile de valori, adic vei atribui valori variabilelor

Partea I
1. 2. Determinai dac o list poate fi evaluat sau trebuie considerat ca atare. Punei un semn n coloana corespunztoare
Evaluari? Numai fata valorii?

Tabelul 11. Determinarea situatiei in care o lista poate fi evaluata s-expresii (+ 1 2) (+ 1 (+ 2 3)) (1.0 2.0 3.0) (quote (1.0 2.0 3.0)) (setq x 4.5) (setq y (1.0 2.0 3.0)) (y (1 2))

97106266.doc R.2.1 5/16/2012

33

AUTODESK, INC.

Partea a II-a
1. 2. 3. Legai variabila x de valorile din tabel Folosii funcia setq i funcia quote dac este necesar Verificai valoarea variabilei folosind "bang" pentru a-i afla legarea curent.

Exemplu
Command: (setq x 1) 1 Command: !x 1 Command:(setq x (+ 1 2 3)) 6 Command: !x 6 Command: (setq x (quote (4 (+ 5 6))) (4 (+ 5 6)) Command:!x (4 (+ 5 6)) Valoare pentru x 1 4.5 "text" (1.0 2.0 3.0) (+ 1 2 3) (1 (+ 2 3)) Tabelul 12. Legarea lui x unor valori diferite

34

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin este lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

35

AUTODESK, INC.

S-expresii AutoLISP n cadrul comenzilor AutoCAD


S-expresiile AutoLISP pot fi folosite n cadrul comenzilor AutoCAD.

Obiective
n acest capitol vei studia: Cum s folosii AutoLISP-ul n cadrul comenzilor AutoCAD Cum s returnai o valoare din AutoLISP ctre o comand AutoCAD

Returnarea unei valori n linia de comand


Valoarea unei expresii AutoLISP este trecut din AutoLISP n AutoCAD ca rspuns la linia AutoCAD n aciune. Dac linia de comand este n aciune, valoarea unei expresii este pur i simplu tiparit n zona liniei de comand.
Command: (setq x (+ 4 6)) 10 Command: !x 10

Aceast expresie returneaz valoarea divizrii rdcinii ptrate numrului 50 prin numrul real 9.
Command: (/ (sqrt 50.0) 9.0) 0.78567

Aceast expresie returneaz valoarea multiplicrii rezultatului obinut prin adunarea lui 2.5 cu 6.3 de 24.0.
Command: (* (+ 2.5 6.3) 24.0) 211.2

Returnarea unei valori la o comand AutoCAD


Dac o comand AutoCAD este n aciune, atunci evaluarea unei expresii AutoLISP returneaz valoarea expresiei n AutoCAD. Valoarea devine rspunsul la linia curent a comenzii AutoCAD. n acest exemplu, comanda ARRAY recepioneaz ca numr de repetiii ale funciei, rezultatul unei expresii AutoLISP pentru care 6.0 se divide la 0.35; cu alte cuvinte, nu tim dinainte cte repetiii cuprinde unitatea 0.35 la o distant de 6.0 unitai, deci rugm AutoLISP-ul s calculeze valoarea pentru noi i s returneze rspunsul AutoCAD-ului.Deoarece comanda din ARRAY accept numai numere ntregi i nu numere reale, vom folosi funcia AutoLISP fix pentru a rotunji cel mai apropiat numr ntreg.

36

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
ncepei un desen nou. Tiprii comenzile i expresiile care urmeaz.
Command: (/ 6.0 0.35) 17.1429 Command: (fix 17.1429) 17 Command: (fix (/ 6.0 0.35)) 17 Command: line From point: 1,1 To point: 5,5 To point: Enter Command: array Select objects: I Select objects: Enter Rectangular or Polar array (R/P): r Number of rows (-) <1>: 1 Number of columns (III) <1>: (fix (/ 6.0 0.35)) Distance between columns: 0.35

AutoCAD creaz 17 elemente n array. Trebuie avut n vedere faptul c o expresie AutoLISP a fost folosit interactiv, n mijlocul unei comenzi AutoCAD, pentru a calcula o valoare (n acest caz un numr ntreg) care ulterior este dat automat comenzii n acel punct special la secvena de cerere a comenzii.

97106266.doc R.2.1 5/16/2012

37

AUTODESK, INC.

n exemplul urmator, AutoLISP-ul calculeaz mrimea razei unei racordri.

Exemplu
ncepei un desen nou. Tiprii expresiile i comenzile care urmeaz. Mrimea razei unei racordri este stabilit la 2.24.
Command: line From point: 1,1 To point: 5,5 To point: Enter Command: line From point: 10,1 To point: 6,5 To point: Enter Command: fillet Polyline/Radius/<Select two lines>: r Enter fillet radius <1.0>: (/ 28.0 12.5) Command: fillet Polyline/Radius/<Select two lines>: pick first line Select second object: pick second line

Figura 10. Doua linii cu o racordare la o raza de (/28.0 12.5) sau 2.24

Recapitulare
S-expresiile pot fi folosite ca rspunsuri la cererile de comand AutoCAD. AutoLISP returneaz valoarea unei s-expresii folosite n cadrul unei comenzi AutoCAD la cererea comenzii.

38

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

4: EXPRESII AUTOLISP IN CADRUL COMENZILOR AUTOCAD n acest exerciiu vei: Folosi funcii aritmetice i funcia setq pentru a crea valori i legturi simbol Folosi valorile i simbolurile ca rspunsuri la cererile de comand AutoCAD

Instruciuni
1. 2. 3. 4. 5. ncepei un desen nou. Desenai un arc cu un unghi inclus de 1 radian. Desenai dou cercuri concentrice: unul cu o raz de dou treimi pi i unul cu o raz la jumtate din aceast valoare. Amplasai arcul n jurul centrului cercurilor. Fixai cte o copie la fiecare 15 grade de rotaie.
Command: arc Center/<Start point>: 5,5 Center/End/<Second point>: c Center: 3,5 Angle/Length of chord/<End point>: a Included angle: (/ 180 pi) Command: (setq x (* pi (/ 2.0 3.0))) 2.0944 Command: circle 3P/2P/TTR/<Center point>: 5,5 Diameter/<Radius>: !x Command: circle 3P/2P/TTR/<Center point>: 5,5 Diameter/<Radius>: (/ x 2)

97106266.doc R.2.1 5/16/2012

39

AUTODESK, INC.
Command: (setq x (/ 360 15)) 24 Command: array Select objects: pick the arc 1 found Select objects: Enter Rectangular or Polar array (R/P): p Center point of array: 5,5 Number of items: !x Angle to fill (+=ccw, -=cw) <360>:Enter Rotate objects as they are copied? <Y>Enter

Figura 11. Array completat

40

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin este lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

41

AUTODESK, INC.

Tipuri de date numerice


AutoLISP-ul are dou tipuri de date numerice: numere ntregi i numere reale. Funcia type returneaz tipurile de date ale unui obiect.

Obiective
n acest capitol vei studia: Diferenele dintre cele dou tipuri de date numerice Cum s determinai tipul de date al unui obiect

Determinarea tipului de date ale unui obiect


Funcia AutoLISP type se folosete pentru a determina tipul de date al unui obiect. type cere un argument i returneaz un simbol care indic tipul de date al argumentului. De exemplu, aceast expresie returneaz tipul de date al numrului real 1.0
Command: (type 1.0) REAL

Numere reale
AutoLISP-ul reprezint numerele reale n virgul mobil, dubl precizie cu cel puin 14 zecimale. Nu exist tipuri de date care s reprezinte numere cu simpl precizie n AutoLISP. Toate numerele reale snt cu dubl precizie i ele snt reprezentate n AutoLISP n aceeai manier ca n AutoCAD. Numerele reale snt numere introduse cu punct zecimal, de exemplu 4.5 sau 123.456.
Command: (setq x 4.5) 4.5

Pentru valori cuprinse ntre 1.0 i -1.0, zero trebuie s precead punctul zecimal, de exemplu, 0.45 sau 0.123 sau -0.876.
Command: (setq x 0.123) 0.123

Precizia afirii si precizia intern


Precizia implicit a afirii unui numr real n AutoLISP este de 5 zecimale. Reprezentarea intern este ntotdeauna meninut cu cel puin 14 zecimale semnificative de precizie.

42

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Dac este necesar afiarea sau tiprirea valorii unui numr real cu o precizie mai mare dect precizia de afiare a AutoLISP-ului, numrul real poate fi transformat ntr-un ir cu ajutorul funciei AutoLISP rtos i apoi afiat sau tiprit cu precizia de afiare dorit. cere pn la 3 argumente: un numr real, un numr ntreg care reprezint unul dintre sistemele de unitai AutoCAD i numrul de zecimale pentru irul care va fi returnat.
rtos

Exemplu
Introducei expresiile care urmeaz. Legai simbolul x de numrul real 4.5
Command: (setq x 4.5) 4.5

Verificai-i valoarea i tipul de date


Command: !x 4.5 Command: (type x)

Folosii funcia rtos pentru a vizualiza valoarea lui x ca numr zecimal cu o precizie de 8 zecimale.
Command: (rtos x 2 8) "4.50000000"

Numere ntregi
Numerele ntregi snt numere introduse fr punct zecimal. Numerele ntregi n AutoLISP snt numere ntregi cu semn pe 32 bii cuprinse ntre 2.147.483.648 i +2.147.483.647. Dei AutoLISP-ul folosete valori de 32 bii, cele transferate ntre AutoLISP i AutoCAD snt limitate la valori de 16 bii, de exemplu nu se poate transfera o valoare mai mic de -32.768 sau mai mare de +32.767 n AutoCAD. Dac folosii o valoare care depeste aceste limite, putei folosi funcia float pentru a o transforma ntr-un numr real nainte de a o transfera n AutoCAD.

97106266.doc R.2.1 5/16/2012

43

AUTODESK, INC.

Exemplu
Introducei expresiile care urmeaz. Legai simbolul x de un numr ntreg cu valoarea de 65535.
Command: (setq x 64435) 65535

Verificai-i valoarea i tipul de date.


Command: !x 65535 Command: (float x) 65535.0 Command: (fix (float x)) 65535 Command: (type x) INT

Folosii funciile float i fix pentru a returna valoarea lui x cu tipuri de date diferite i folosii funcia rtos pentru a imprima valoarea cu un format de zece zecimale.
Command: (type (float x)) REAL Command: (type (fix (float x))) INT Command: (rtos (float x) 2 10) "65535.0000000000"

Conversia automat a numerelor ntregi


AutoLISP-ul va converti numerele ntregi n numere reale ori de cte ori va ntlni ambele tipuri de date ca argumente la funcie. Dac dou numere ntregi snt folosite ca argumente la funcia de adunare +, valoarea returnat a expresiei este un numr ntreg; totui, dac argumentele snt un numr real i un numr ntreg, valoarea returnat este exprimat printr-un numr real.

Exemplu
Aceast expresie returneaz un numr ntreg.

44

AUTODESK, INC. TRAINING


Command: (+ 1 2) 3 Command: (type (+ 1 2)) INT

LECTII DE BAZA AUTOLISP

Aceast expresie returneaz un numr real.


Command: (+ 1.0 2) 3.0 Command: (type (+ 1.0 2) REAL

Recapitulare
AutoLISP-ul are dou tipuri de date numerice: numere ntregi i numere reale. Numerele ntregi au valori de 32 bii n AutoLISP. Numai numerele ntregi cu valori de 16 bii pot fi transferate ntre AutoLISP i AutoCAD. Numerele reale snt numere zecimale cu dubl precizie. Numerele reale snt reinute cu cel puin 14 zecimale de precizie. AutoLISP-ul va converti un numr ntreg ntr-un numr real cnd le ntlnete pe amndou n cadrul aceleiai expresii. Un numr real trebuie ntotdeauna s aib o cifr care precede punctul zecimal. Funcia type returneaz tipul de date al unui obiect. Funcia fix transform un numr real ntr-un numr ntreg. Funcia float transform un numr ntreg ntr-un numr real.

97106266.doc R.2.1 5/16/2012

45

AUTODESK, INC.

EXERCITIUL

5: FOLOSIREA NUMERELOR INTREGI SI REALE n acest exerciiu vei: Consolida cunotinele despre tipurile de date ale numerelor ntregi i reale. Folosi funcia setq pentru a lega variabile de valori cu tipuri de date numerice diferite. Determina valoarea returnat i tipul de date numerice ale unei expresii AutoLISP

Partea I
1.Legai simbolurile de valori diferite. 2.Introducei s-expresia corespunzatoare n linia de comand AutoCAD.

simbol a b c x y z

valoare 1 2 3 1.0 2.0 4.5

Tabelul 13. Legarea variabilelor de valori numerice.

46

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Partea aII-a
1.Determinai valoarea returnat i tipul de date pentru fiecare expresie. 2.Scriei rspunsurile n coloanele corespunzatoare 3.Trebuie mai nti s efectuai prima parte a acestui exerciiu.
expresia-s (+ 1 2) (+ 1 2.0) (+ 1.0 2.0) (+ a b) (+ a y) (+ y z) (fix x) (float a) (fix z) (float (fix z)) (fix (+ (float a) (float b))) (/ x y) (fix (/ x y)) (float (fix (/ x y))) (+ (fix (/ a y)) (fix (float a))) Tabelul 14. Valorile returnate si tipurile de date numerice ale expresiilor. returnarea valorii tip de data pentru valoarea returnata

97106266.doc R.2.1 5/16/2012

47

AUTODESK, INC.

Puncte AutoCAD i liste AutoLISP


AutoCAD-ul folosete coordonatele carteziene pentru a descrie punctele 2i 3-dimensionale. AutoLISP-ul reprezint un punct sub forma unei liste de numere reale.

Obiective
n acest capitol vei studia: Cum reprezint AutoLISP-ul puncte Cum s construii o list care reprezint un punct folosind att constante ct i variabile.

Puncte AutoCAD
Un punct 3-dimensional este format din trei numere, fiecare avnd o valoare independent care corespunde unei distane de la originea sistemului de coordonate de-a lungul axelor X, Y i Z. Imaginai-v punctul 3-D sub forma a trei cutii, fiecare coninnd un numr real.

Figura 12. Punct 3-d reprezentat prin trei coordonate

Luai, de exemplu, punctul 3-D 1,2,3. AutoCAD-ul are o gam larg de operatori pentru a descrie acest punct: Introducerea n coordonate absolute, relative i polare, agarea de obiecte, filtre de coordonate etc. Dar reprezentarea intern a punctului se reduce la o asociere ntre trei numere reale.

Figura 13. Valori de-a lungul axelor de coordonate.

48

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

AutoLISP-ul reprezint un punct AutoCAD 3-D sub forma unei liste formate din trei numere reale, unde primul element este valoarea coordonatei X, al doilea valoarea Y i al treilea valoarea Z. Punctul 1,2,3 exprimat sub forma unui obiect AutoLISP este (1.0 2.0 3.0)

Figura 14. Lsta AutoLISP sub forma unui punct AutoCAD

Construirea listelor de coordonate ale punctelor


Rezultatul unei ncercri de a crea un obiect AutoLISP, recunoscut de AutoCAD ca punct 3-D, este clar: o list format din trei numere reale. Cum se poate construi o astfel de list? Exist dou funcii pentru construirea acestor obiecte: quote i list.

Construirea punctelor cu funcia quote


Aa cum ai observat mai devreme, funcia quote impiedic procesul de evaluare pentru singurul ei argument i returneaz acest argument neevaluat. Construirea unei liste format din trei numere reale este un proces simplu cu ajutorul funciei quote. De exemplu, expresia (quote (1.0 2.0 3.0) returneaz valoarea (1.0 2.0 3.0), o reprezentare AutoLISP valid a unui punct AutoCAD.

97106266.doc R.2.1 5/16/2012

49

AUTODESK, INC.

Exemplu
Introducei expresiile care urmeaz. Creai dou liste formate din cte trei numere reale i folosii listele n linia de comand AutoCAD.
Command: (setq pt1 (quote (1.0 1.0 1.0))) (1.0 1.0 0.0) Command: !pt1 (1.0 1.0 0.0) Command: (setq pt2 (quote (5.0 5.0 0.0))) (5.0 5.0 0.0) Command: !pt2 (5.0 5.0 0.0) Command: line From point: !pt1 To point: !pt2 To point: Enter

pt2 (5.0 5.0 0.0)

pt1 (1.0 1.0 0.0)


Figura 15. Linie de la pt1 la pt2

Construirea punctelor cu funcia list


Valoarea returnat a funciei list este o list format din valorile argumentelor funciei. Funcia poate primi oricte argumente dorii. evalueaz fiecare argument, unul dup altul i le memoreaz valoarea temporar. Cnd funcia list i epuizeaz argumentele i compune valorile argumentelor din elemente n cadrul unei liste i returneaz lista.
list

50

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
Introducei expresiile care urmeaz. n timp ce lucrai, nu uitai c numerele reale se evalueaz pe sine, de exemplu, Command: !4.5 returneaz 4.5. Folosii funcia list pentru a returna o list format din trei numere reale.
Command: (list 1.0 2.0 3.0) (1.0 2.0 3.0)

Folosii funcia setq pentru a lega simbolul pt la o list cu trei numere reale.
Command: (setq pt (list 1.0 2.0 3.0)) (1.0 2.0 3.0) Command: !pt (1.0 2.0 3.0)

Folosii simbolul pt ca intrare la comanda AutoCAD ID i verificai dac AutoCAD-ul recunoate valoarea simbolului ca punct valid 3-D.
Command: id Point: !pt X=1.0000 Y=2.0000 Z=3.0000 Command:

Figura 16. Valoare returnata de functia list

97106266.doc R.2.1 5/16/2012

51

AUTODESK, INC.

Construirea punctelor din variabile cu funcia list


Deoarece funcia list i evalueaz argumentele, putei folosi simboluri sau variabile ca argumente ale funciei list pe/sau n loc de numere reale. S admitem c avei trei variabile x, y i z care snt legate de numerele reale 1.0, 2.0 i 3.0.

Figura 17.Legarea variabilelor de numere reale cu functia setq

Atunci expresia (list x y z) va returna aceeai valoare ca i expresia (list 1.0 2.0 3.0)

Figura 18. Valoare returnata de functia list

52

AUTODESK, INC. TRAINING


Exemplu

LECTII DE BAZA AUTOLISP

Introducei expresiile care urmeaz. Legai simbolurile x, y i z de trei numere reale


Command: (setq x 1.0) 1.0 Command !x: 1.0 Command: (setq y 2.0) 2.0 Command: !y 2.0 Command: (setq z 3.0) 3.0 Command: !z 3.0

Folosii variabilele ca argumente la funcia list.


Command: (list x y z) (1.0 2.0 3.0)

Memorai lista ntr-o variabil numit pt i folosii-o n cadrul comenzii AutoCAD.


Command: (setq pt (list x y z)) (1.0 2.0 3.0)

Command: !pt (1.0 2.0 3.0)

Command: id Point: !pt X=1.0000 Y=2.0000 Z=3.0000 Command:

97106266.doc R.2.1 5/16/2012

53

AUTODESK, INC.

Recapitulare
AutoCAD-ul folosete sistemul de coordonate carteziene 3-D pentru a specifica punctele. Un punct AutoCAD este reprezentat n AutoLISP sub forma unei liste de numere reale. AutoLISP-ul reprezint un punct AutoCAD 2-D sub forma unei liste format din dou numere reale. Un punct AutoCAD 3-D este reprezentat sub forma unei liste cu trei numere reale. Funcia quote poate construi o list de numere din constante. Funcia list poate construi o list de numere din constante sau din variabile.

54

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

6: UTILIZAREA LISTELOR DE

NUMERE CA PUNCTE AUTOCAD

n acest exerciiu vei: Consolida cunotinele despre relaia dintre listele AutoLISP formate din dou sau trei numere reale i punctele AutoCAD. Lega variabile pentru a reprezenta coordonatele unui punct. Crea liste ale variabilelor coordonatelor pentru a reprezenta puncte. Folosi liste ca rspunsuri la cererile de comand AutoCAD.

Partea I
1. 2. 3. Introducei expresiile n coloana din stnga. Scriei valoarea returnat a fiecarei expresii n coloana din mijloc. Dac o legatur simbol apare n cadrul expresiei, scriei-i valoarea n coloana din dreapta.

Expresia (setq x 1.0) (setq y 2.0) (setq z 0.0) (list 1.0 2.0 0.0) (list x y z) (setq pt1 (list x y z)) !pt1 (quote (5.0 6.0 0.0)) (setq pt2 (quote (5.0 6.0 0.0))) !pt2 (quote (x y z)) (setq notapoint (quote (x y z))) !notapoint 1.0

Valoarea expresiei

Simbol de atribuire x = 1.0

Tabelul 15. Crearea punctelor din liste de numere

97106266.doc R.2.1 5/16/2012

55

AUTODESK, INC.

Partea a II-a
1. 2. n acelai desen din partea I introducei expresiile care urmeaz. Creai o Linie i un Cerc folosind variabilele legate de liste formate din numere reale aa cum snt punctele pentru comenzile AutoCAD. Legaturile simbol se bazeaz pe partea I a acestui exerciiu.
Command: line From point: !pt1 To point: !pt2 To point: Enter

3.

Command: circle 3P/2P/TTR/<center point>: 2p First point on diameter: !pt1 Second point on diameter: !pt2

5,6,0

1,2,0
Figura 19. Linie si cerc folosind variabilele pt1 si pt2

56

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin este lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

57

AUTODESK, INC.

Separarea listelor
Avnd instruciuni pentru construirea listelor - funciile list i quote - ne-ar fi de folos s avem i cteva instruciuni pentru separarea listelor. Dac am avea un set instruciuni pentru extragerea fiecrui element dintr-o list, atunci am putea realiza mult mai uor programe AutoLISP. Desenai un dreptunghi cunoscnd numai coordonatele colurilor opuse. Gsii punctul de mijloc dintre oricare ar fi dou puncte ( nu numai punctele finale ) ale unei linii sau ale unui cerc. Determinai dac un punct se afl ntr-o anumit regiune 2-D sau 3-D a unui sistem de coordonate carteziane.

De vreme ce acest lucru necesit mai mult dect abilitatea de a separa liste, separarea listelor este o cerin fundamental n aceast operaie.

Obiective
n acest capitol vei studia: Cum snt reprezentate listele n memoria computerului sub forma unui arbore binar. Cum snt listele reprezentate grafic. Cum s folosii funciile car i edr pentru separarea listelor. Cum s separai liste care reprezint puncte n AutoCAD i cum s specificai puncte prin crearea unor liste noi bazate pe punctele existente.

Structura intern a unei liste


O list AutoLISP este reprezentat n memoria computerului sub forma unui arbore binar. Orice punct de pe arborele binar unde poate aprea o ramificaie se numete nod. Nodul este una din unitile fundamentale pentru stocarea memoriei n AutoLISP. Primul nod de sus al unui arbore binar se numete nodul radacin.

58

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Structura unei liste AutoLISP este desfcut nod cu nod, ncepnd de la nodul rdcin. Fiecare nod se desface n dou ramificaii reprezentnd diferite pri ale listei: primul element al listei i lista cu primul element ndeprtat.

Figura 20. Nodul radacina si primul set de ramificatii pentru o lista.

De exemplu prima ramificaie a listei (1.0 2.0 3.0) ar putea fi reprezentat astfel.
(111111 . . . )

11 .

(1111 . . )

Figura 21. Nodul radacina si primul set de ramificatii pentru lista (1.0 2.0 3.0)

97106266.doc R.2.1 5/16/2012

59

AUTODESK, INC.

Subdivizarea de-a lungul ramificaiei arborelui continu pn ce partea dreapt a ramificaiei se termin cu lista goal sau nil.
(1.0 2.0 3.0)

1.0

(2.0 3.0)

2.0

(3.0)

3.0 Figura 22. Arbore binar complet pentru lista (1.0 2.0 3.0)

()

AutoLISP-ul are apelative speciale pentru cele dou pari ale ramificaiei listei. Primul element al listei se numete car -ul listei. Lista fr primul ei element se numete cdr -ul listei. Ramificaia stng este partea car a listei iar ramificaia dreapt este partea cdr .

Figura 23. Partile car si cdr de la nodul radacina al listei.

60

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Reprezentarea unei liste cu trei elemente atomice prin car i cdr, creia i este atribuit simbolul x, ar arta dup cum urmeaz. Dac o list format din unul sau mai multe elemente se afl la oricare din nodurile arborelui, este urmat de o ramificaie. Partea stng a ramificaiei este car-ul listei la care se refer nodul iar partea dreapt este cdr-ul listei la care se refer nodul.

Figura 24. Reprezentarea completa a unei liste cu trei atomi ca elemente cu car si cdr.

S combinm graficul care reprezint arborele binar pentru valorile simbolului pt, care este legat de lista (1.0 2.0 3.0) cu ramificaiile car i cdr ale arborelui.

Figura 25. Grafic combinat pentru simbolul pt, legat de lista (1.0 2.0 3.0).

97106266.doc R.2.1 5/16/2012

61

AUTODESK, INC.

Recapitulare
Listele snt reprezentate n memorie sub forma unui arbore binar. Primul element al listei este car -ul listei. Lista dup ce primul element este ndeprtat reprezint cdrul listei. Funciile car i cdr formeaz ramificaiile car i cdr ale listei. O ramificaie cdr a unui arbore binar se termin n nil sau lista goal.

62

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

7: GRAFUL VALORILOR INTR-UN ARBORE BINAR n acest exerciiu vei: Consolida cunotinele despre reprezentarea listelor n memorie. Completa un grafic a valorilor unei liste, reprezentat sub forma unui arbore binar.

Instruciuni
1. 2. 3. Terminai graful complet al unui arbore binar pentru variabila alst.
alst

este legat de lista (8.0 3.0 0.0).

Artai valoarea fiecarui nod din grafic.


(8.0 3.0 0.0)

8.0

? Figura 26. Completarea grafului binar

97106266.doc R.2.1 5/16/2012

63

AUTODESK, INC.

EXERCITIUL

8: GRAFUL EXPRESIILOR INTR-UN ARBORE BINAR n acest exerciiu vei: Consolida cunotinele despre separarea restabilirea elementelor lor individuale. listelor i

Completa un grafic al expresiilor care restabilesc elementele unei liste, grafic reprezentat sub forma unui arbore binar.

Instruciuni
1. 2. 3. 4. 5. Terminai graficul complet al unui arbore binar pentru variabila xlst.
xlst

este legat de lista (1.0 (2.0 3.0) 4.0).

Artai valoarea fiecrui nod din grafic Artai expresia care restabilete fiecare valoare din grafic.

Marcai ramificaiile car i cdr ale unui arbore. 6. Observai c elementele acestei liste snt formate din doi atomi i o list.
xlst (1.0 (2.0 3.0) 4.0)

1.0 (car xlst)

((2.0 3.0) 4.0) (cdr xlst)

(2.0 3.0) (car (cdr xlst))

? (cdr (cdr xlst))

? (car (car (cdr xlst)))

? ?

? ?

? ?

? ?

? ?

Figura 27. Completarea graficul binar

64

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Funciile car si cdr


Funciile car i cdr snt funcii non-destructive. Nici una dintre ele nu afecteaz legarea argumentului ei ceea ce este un mod curios de a spune despre (car x) c poate returna o valoare diferit de x dar nu va schimba valoarea lui x.

car
Funcia car returneaz primul element al listei. Singurul argument al funciei car trebuie s fie o list, iar lista trebuie s aib unul sau mai multe elemente.

Exemplu
Introducei expresia care urmeaz. Legai variabila pt la o list cu trei numere reale. Folosii funcia car pentru a returna coordonata x n list (primul element) i legai variabila x de acea valoare.
Command: (setq pt (list 1.0 2.0 0.0)) (1.0 2.0 0.0) Command: !pt (1.0 2.0 0.0)

Command: (car pt) 1.0

Command: (setq x (car pt)) 1.0 Command: !x 1.0

Command: !pt (1.0 2.0 0.0)

cdr
Funcia cdr returneaz o list i elementele ei cu excepia primului element; cu alte cuvinte ndeprteaz primul element al listei n afara valorii lui returnate.

97106266.doc R.2.1 5/16/2012

65

AUTODESK, INC.

Exemplu
Introducei expresiile care urmeaz. Legai variabila pt de o list cu trei numere reale.
Command: (setq pt (list 1.0 2.0 0.0)) (1.0 2.0 0.0)

Command: !pt (1.0 2.0 0.0)

Folosii funcia cdr pentru a returna o list fr primul element i legai variabila yzlst de acea valoare.
Command: (cdr pt) (2.0 0.0) Command: (setq yzlst (cdr pt)) (2.0 0.0) Command: !lyzlst (2.0 0.0) Command: !pt (1.0 2.0 0.0)

Construirea unui dreptunghi cunoscnd colurile opuse


n figurile care urmeaz cunoatem dou puncte din colurile unui dreptunghi. Celelalte dou puncte se calculeaz prin combinarea cordonatelor X i Y ale punctelor cunoscute n diverse moduri pentru a forma noi perechi de coordonate.

Figura 28. Valorile X si Y pentru colturile unui dreptunghi.

66

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin este lsat liber n mod intenionat

97106266.doc R.2.1 5/16/2012

67

AUTODESK, INC.

Figura care urmeaz reprezint coordonatele punctelor n funcie de variabilele X i Y.

X1,Y1

X2,Y1

X1,Y2 0,0

X2,Y2

Figura 29. Valorile X,Y pentru colturile dreptunghiului

Considerai c dou variabile snt legate de cele dou liste formate din numere reale.
(setq pt1 (list 1.0 5.0 0.0)) (setq pt2 (list 10.0 1.0 0.0))

Acest tabel arat funciile necesare pentru returnarea valorilor X, Y i Z din fiecare punct.
coordinate X Y Z pt1 (car pt1) (car (cdr pt1)) (car (cdr (cdr pt1))) (car pt2) (car (cdr pt2)) (car (cdr (cdr pt2))) pt2

Tabelul 16. Expresiile folosite pentru returnarea coordonatelor X, Y si Z.

68

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Figura urmtoare exprim punctele de coordonate sub forma de expresii AutopLISP, bazate pe cunoaterea a dou puncte pt1 i pt2. Pentru a simplifica lucrurile, acestea snt tratate ca puncte 2-dimensionale.

pt1

(list (car pt2) (car (cdr pt1)))

(list (car pt1) (car (cdr pt2))) 0,0

pt2

Figura 30. Calcularea colturilor unui dreptunghi

97106266.doc R.2.1 5/16/2012

69

AUTODESK, INC.

Exemplu
Introducei expresiile care urmeaz. Folosii funcia list pentru a le combina n alte dou puncte ale dreptunghiului.
Command: (setq pt1 (list 1.0 5.0)) (1.0 5.0)

Command: !pt1 (1.0 5.0)

Command: (setq pt3 (list 10.0 1.0)) (10.0 1.0)

Command: !pt3 (10.0 1.0)

Folosii funciile car i cdr pentru a extrage valorile X i Y ale punctelor cunoscute.
Command: (car pt1) 1.0

Command: (car (cdr pt3)) 1.0

Command: (list (car pt1) (car (cdr pt3))) (1.0 1.0)

Command: (setq pt2 (list (car pt1) (car (cdr pt3)))) (1.0 1.0)

Command: !pt2 (1.0 1.0)

Command: (car pt3) 10.0

Command: (car (cdr pt1)) 5.0

Command: (list (car pt3) (car (cdr pt1))) (10.0 5.0)

70

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP


Command: (setq pt4 (list (car pt3) (car (cdr pt1)))) (10.0 5.0)

Command: !pt4 (10.0 5.0)

Desenai dreptunghiul folosind linia de comand AutoCAD. Punctele snt 2-dimensionale. Linia de comand AutoCAD va completa automat valoarea Z a punctului bazat pe valoarea curent a inlimii (elevation).
Command: line From point: !pt1 To point: !pt2 To point: !pt3 To point: !pt4 To point: close
pt1 1,5 pt4 10,5

pt2 1,1 0,0

pt3 10,1

Figura 31. Localizarea colturilor unui dreptunghi

Recapitulare
Funcia car returneaz primul element al unei listei. Funcia cdr returneaz o list cu excepia primului element. Exist funcii standard la care se face apel pentru stabilirea componentelor X, Y i Z ale unui punct reprezentat printr-o list.

97106266.doc R.2.1 5/16/2012

71

AUTODESK, INC.

EXERCITIUL

9: LUCRUL CU LISTE DE PUNCTE n acest exerciiu vei: Consolida cunotinele despre funcii care separ liste i funcii care creaz liste. Crea puncte formate din liste i le vei lega de variabile. Crea puncte formate din liste bazate pe valorile X i Y din alte puncte formate din liste.

Matematica problemei
Dou puncte 2-dimensionale i punctul care se afl la mijlocul distanei dintre ele pot fi exprimate logic n funcie de X i Y dup cum urmeaz.

pt1 = pt1x, pt1y pt2 = pt2x, pt2y midpt = mptx, mpty

Valorile X i Y ale lui mpt pot fi exprimate aritmetic dup cum urmeaz.

mptx = (pt1x + pt2x)/2 mpty = (pt1y + pt2y)/2

Instruciuni
Scriei un set de expresii AutoLISP care execut urmatoarele comenzi n ordine 1. Legai o variabil pt1 de lista format din dou numere reale 1.5 i 8.9. 2. Legai o variabil pt2 de o list format din dou numere reale 7.8 i 3.2. 3. Scriei un set de expresii care leag variabila midpt de punctul care se afl la mijlocul distanei dintre punctele pt1 i pt2. Dup ce ai verificat expresiile n editorul AutoCAD scriei-le mai jos.

72

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Comenzi AutoCAD si AutoLISP


Comenzile AutoCAD pot fi chemate direct din AutoLISP, s-expresiile AutoLISP pot fi folosite ca rspunsuri la cererile de comand.

Obiective
n acest capitol vei studia: Cum s chemai o comand AutoCAD direct din AutoLISP. Cum s folosii irul AutoLISP, s-expresiile constante i variabile ca rspunsuri la cererile de comand. Sintaxa funciei AutoLISP command . Cum s evitai lucrul cnd traducei un program folosind comenzile n limba englez indiferent de versiunea AutoCAD.

Funcia command
Funcia command apeleaz funciile AutoCAD din AutoLISP. Funcia command accept un argument de tip ir care trebuie s fie numele unei comenzi AutoCAD i oricare alte argumente opionale care ar fi n mod normal introduse n linia de comand. n cazurile n care este nevoie de un return ca rspuns la o comand, irul "" este folosit ca argument. Aceasta este reprezentarea AutoLISP a irului nul pe care AutoCAD-ul o interpreteaz ca un return n cadrul funciei apelative command. Funcia command accept iruri i variabile AutoLISP ca argumente. De exemplu aceste trei seturi de expresii traseaz aceeai entitate Line.

Folosirea argumentelor de tip ir


Command: (command "line" "1,1" "5,5" "") nil

Folosirea argumentelor constante


Command: (command "line (quote (1.0 1.0)) (quote (5.0 5.0)) "") nil

Folosirea argumentelor variabile


Command: (setq pt1 (list 1.0 1.0) pt2 (list 5.0 5.0)) (5.0 5.0)

Command: (command "line" pt1 pt2"") nil

97106266.doc R.2.1 5/16/2012

73

AUTODESK, INC.

Efecte secundare
Funcia command returneaz ntotdeauna nil. Efectul secundar al unei expresii command este mult mai interesant dect valoarea returnat. Un efect secundar al unei expresii AutoLISP reprezint o schimbare n starea programului care se produce datorit unei funcii de apelare. Efectul secundar al apelrii unei funcii setq este pentru a crea un nou simbol de legatur sau pentru a atribui o valoare la o variabil. Efectul secundar al apelrii unei funcii command este de a realiza o comand AutoCAD care modific fiierul grafic ntr-un anume fel.

Exemplu
ncepei un desen nou. Introducei expresiile care urmeaz. Legai dou variabile de dou puncte 2-dimensionale.
Command: (setq pt1 (list 1.0 1.0)) (1.0 1.0) Command: (setq pt2 (list 5.0 5.0)) (5.0 5.0)

Apelai la comanda LINE i folosii variabilele ca argumente.


Command: (command "line" pt1 pt2 "") nil

5,5

1,1
Figura 32. Linie de la 1.1 la 5.5

74

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
Introducei expresiile care urmeaz. Folosii variabilele pt1 i pt2 de la exerciiul anterior ca puncte reprezentnd centrele a dou cercuri i ca puncte finale ale diametrului unui cerc.
Command: circle 3P/2P/TTR/<center point>: !pt1 Diameter/<Radius>: 0.5 Command: (command "circle" pt2 0.5) Command: (command "circle" "2p" pt1 pt2)

Figura 33. Cercuri definite de pt1 si pt2

97106266.doc R.2.1 5/16/2012

75

AUTODESK, INC.

Exemplu
Folosii valorile lui pt1 i pt2 de la exerciiul anterior. Introducei expresiile care urmeaz. Desenai dou arce folosind pt1 i pt2 ca puncte finale i o valoare a razei de 3.5.
Command: arc Center/<Start point>: !pt1 Center/End/<Second point>: e End point: !pt2 Angle/Direction/Radius/<Center point>: r Radius: 3.5 Command:(comandarc pt2 e pt1 r 3.5)

Figura 34. Arce definite de pt1 si pt2

76

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Globalizarea comenzilor
Toate versiunile AutoCAD-ului vor accepta comenzile i opiunile din limbajul american i englezesc indiferent de versiunea limbii surs. Acest lucru permite utilizatorului s scrie o aplicaie AutoLISP care poate fi folosit n toate versiunile de limbaj ale AutoCAD-ului fr a traduce funciile command n limba surs. Fiecare versiune AutoCAD tradus ntr-o anumit limb pastreaz un menu de opiuni i comenzi din limba surs. De exemplu versiunea german AutoCAD pastreaz un menu de opiuni i comenzi n limba german astfel ncit cei care o folosesc i pot introduce comenzile n german. Toate versiunile AutoCAD indiferent de limba surs pstrez un menu de opiuni i comenzi n engleza american mpreun cu un menu n limba surs. Pentru a folosi versiunea englezeasc a comenzilor i opiunilor AutoCAD, prefaati irul cu un caracter subliniere sau cu "_". De exemplu acesta este modul n care se apeleaz la linia de comand n toate versiunile AutoCAD.
Command: (command "_line" "1.1" "5.1" "1.5" "_c")

Recapitulare
Functia command permite apelarea comenzilor AutoCAD din AutoLISP. irul nul sau "" este tratat ca un return de ctre funcia command.

Expresiile AutoLISP snt acceptate ca rspunsuri la cererile de comand AutoCAD n cadrul funciei command. Argumentele funciei command snt numele comenzii AutoCAD urmate de rspunsurile la cererile de comand. Caracterul subliniere poate fi prefaat n cadrul unei instruciuni de tip command n engleza american i va funciona n toate versiunile de limbaj ale AutoCAD-ului.

97106266.doc R.2.1 5/16/2012

77

AUTODESK, INC.

EXERCITIUL

10: TRANSFORMAREA COMENZILOR IN AUTOLISP n acest exerciiu vei: 1. 2. 3. Transforma AutoLISP. comenzile AutoCAD script n expresii

Scrie expresiile. Testa expresiile n editorul AutoCAD.

Instruciuni
ncepei un desen nou. Transformai comenzile i cererile AutoCAD n expresii ale funciei command. Scriei rspunsurile n coloana din dreapta. Testai expresiile n editorul AutoCAD.

Comenzi si cereri
Command: line From point: 1,1 To point: 5,5 To point: ENTER

Expresii AutoLISP
(command "line" "1,1" "5,5" "") or (command "line" '(1.0 1.0) '(5.0 5.0) "")

Command: circle 3P/2P/TTR/<Center point>: 3,3 Diameter/<Radius>: 0.5

Command: circle 3P/2P/TTR/<Center point>: 2p First point on diameter: 1,1 Second point on diameter: 5,5

Command: arc Center/<Start point>: 2,1 Center/End/<Second point>: c Center: 1,1 Angle/Length of chord/<End point>: l Length of chord: 1.414 Tabelul 17. Traducerea comenzilor in AutoLISP

78

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

11: APELUL COMENZII POLYLINE DIN AUTOLISP n acest exerciiu: Vei folosi AutoLISP-ul pentru a executa o comand AutoCAD i pentru a desena o nou entitate. Vei apela comanda AutoCAD PLINE din AutoLISP. Vei scrie un set de expresii AutoLISP pentru a desena o polilinie rectangular.

Instruciuni
1. 2. ncepei un desen nou. Creai urmatoarele legaturi de variabile n AutoCAD:

(setq pt1 (list 1.0 1.0 0.0)) (setq pt3 (list 11.0 8.0 0.0))

3. 4.

Folosii variabilele pt1 i pt3. Scriei un set de expresii ce vor desena un dreptunghi, folosind comanda "Polyline" opiunea 2-D nchis de la punctul 1,1 la 11,1 la 11,8 la 1,8, folosind variabilele pt1 i pt3. Folosii funciile car, cdr, list i command dac este nevoie. Testai expresiile n AutoCAD. Scriei-le mai jos.

5. 6. 7.

97106266.doc R.2.1 5/16/2012

79

AUTODESK, INC.

Aceast pagin a fost lsat liber n mod intenionat.

80

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Selecia interactiv a punctelor


AutoLISP-ul dispune de funcii care opresc evaluarea unei expresii i permit utilizatorului s stocheze puncte i distane folosind metodele standard AutoCAD de specificare a acestor valori. Punctul sau distana devine valoarea returnat a expresiei.

Obiective
n acest capitol vei studia: Cum s cerei informaii utilizatorului n cadrul unui program AutoLISP. Cum s cerei coordonatele unui punct utilizatorului. Cum s cerei o distan utilizatorului. Cum s cerei utilizatorului valoarea pe care o dorii. Cum s folosii puncte i distane de la utilizator n cadrul funciilor AutoLISP command i comenzilor AutoCAD.

Puncte si distane
Funcia getpoint permite utilizatorului s selecteze un punct folosind orice metode standard AutoCAD de selectare a punctelor: selectare grafic, coordonate absolute, relative sau relative polare, agarea obiectelor, filtre de coordonate sau accesarea ultimului punct. Funcia getdist permite utilizatorului s specifice o distant prin introducerea valorii sau seleciond dou puncte. Este acelai mecanism folosit de fiecare comand AutoCAD care cere utilizatorului o distan.

getpoint
Funcia getpoint folosete serviciile AutoCAD pentru a permite utilizatorului s introduc un punct. Punctul selectat de utilizator reprezint valoarea returnat a expresiei. AutoLISP-ul returneaz punctul sub forma unei liste format din trei numere reale: valorile coordonatelor X, Y i Z.
Command:(getpoint) 1,1,0 (1.01.00.0)

Funcia getpoint este folosit pentru a obine un punct de la utilizator n cadrul unei expresii AutoLISP. De exemplu ar putea fi nevoie s cerei utilizatorului din cadrul unui program AutoLISP, puncte care vor fi folosite apoi ca puncte finale ale unei linii.

97106266.doc R.2.1 5/16/2012

81

AUTODESK, INC.
Command: (setq pt1 (getpoint)) 1,1 (1.0 1.0 0.0) Command: (setq pt2 (getpoint)) 5,5 (5.0 5.0 0.0) Command: (command line pt1 pt2 )

Deoarece toate serviciile AutoCAD de specificare a punctelor snt disponibile n timpul apelrii funciei getpoint, nu sntei constrns s introducei coordonatele exacte ale punctului.
Command: (setq pt1 (getpoint)) <pick a point with the mouse> <list of three reals returned> Command: (setq pt2 (getpoint)) <pick a point with the mouse> <list of three reals returned> Command: (command line pt1 pt2 )

Exemplu
Introducei expresiile care urmeaz. Legai variabilele pt1 i pt2 de puncte pe care le selectai cu mouse-ul n cadrul unei funcii de apelare getpoint i folosii variabilele ntr-o comanda LINE.
Command: ( setq pt1 (getpoint)) pick a point Command: (setq pt2 (getpoint)) pick a point Command: (command line pt1 pt2)

Exemplu
Introducei expresiile care urmeaz. Legai variabila pt1 de un punct pe care l selectai cu mouse-ul i variabila pt2 de un punct descris de coordonatele polare relative. Folosii variabilele n linia de comand.
Command: (setq pt1 (getpoint )) pick a point Command: (setq pt2 (getpoint)) @2<45

82

AUTODESK, INC. TRAINING


Command: (command line pt1 pt2 )

LECTII DE BAZA AUTOLISP

Exemplu
Introducei expresiile care urmeaz. Legai variabila pt1 de un punct pe care l selectai cu mouse-ul n cadrul unei funcii de apelare getpoint i folosii variabila ntr-o comand CIRCLE.
Command: (setq pt1 (getpoint)) pick a point

Command: (command circle pt1 0.5)

getdist
Funcia getdist cere utilizatorului dou puncte. Valoarea returnat este un numr real: distana 3-D ntre dou puncte.
Command: (setq dst1 (getdist)) Second point: 2,2 1.41421 Command: !dst1 1. 41421

Funcia getdist primete un argument opional, punctul de baz de la care se msoar distana. n acest caz funcia cere utilizatorului un singur punct.

Command: (setq pt1 (list 1.0 1.0 0.0)) (1.0 1.0 0.0) Command: (setq dst1 (getdist pt1)) 2,2 1.41421 Command: !dst1 1.41421

97106266.doc R.2.1 5/16/2012

83

AUTODESK, INC.

Figura 35. Functia getdist drag din punctul initial 1,1,0

Exemplu
Introducei expresiile care urmeaz. Legai variabila pt1 de un punct folosind coordonatele absolute i variabila rad de distana dintre dou puncte pe care o selectai cu mouse-ul. Folosii variabila n comanda CIRCLE.
Command: (setq pt1 (getpoint)) 5,5 (5.0 5.0 0.0) Command: (setq rad (getdist)) pick two points Command: (command circle pt1 rad)

Exemplu
Introducei expresiile care urmeaz. Legai variabila cen de un punct pe care l selectai cu mouse-ul. Legai variabila rad de distana dintre cen i un punct pe care l selectai cu mouse-ul. Folosii variabilele n comanda CIRCLE.
Command: (setq cen (getpoint)) pick a point Command: (setq rad (getdist cen)) pick a point Command: (command circle cen rad)

84

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Dialog cu utilizatorul
Funciile getpoint i getdist primesc i argumente opionale: un ir de text care este afiat n zona liniei de comand ca o cerere pentru utilizator.
Command: (getpoint Point:) Point: 1,1 (1.0 1.0 0.0)

Dac getdist cere dou puncte, se cere automat al doilea punct "Second point:".

Command: (getdist From point:) From poin: 1,1 (1.0 1.0 0.0) Second point: 2,2 1.41421

Deoarece getdist primete dou cereri opionale, ordinea i tipul de date n acest caz snt importante. Dac primul argument al funciei getdist este un ir, acesta reprezint o cerere. Dac primul argument este un punct, atunci se poate proceda la cererea celui de-al doilea argument.

Command: (getdist (quote (1.0 1.0 0.0)) To point:) To point: 2,2 1.41421

Recapitulare
Funcia getpoint returneaz un punct de la utilizator. Funcia getdist returneaz o distan dat sub forma unui numr real de la utilizator. Ambele funcii utilizator. primesc argumente opionale pentru

Utilizatorul poate aplica oricare dintre metodele AutoCAD de specificare a punctelor i distanelor la o cerere AutoLISP pentru un punct sau o distan.

97106266.doc R.2.1 5/16/2012

85

AUTODESK, INC.

EXERCITIUL

12: CEREREA SI FOLOSIREA PUNCTELOR DE LA UTILIZATOR n acest exerciiu vei: Scrie expresiile care cer utilizatorului puncte i distane. Scrie comenzile de desenare n AutoCAD.

Partea I Instruciuni
Scriei un set de expresii. Testai-le n editorul AutoCAD apoi scriei-le mai jos. 1. 2. 3. Cerei utilizatorului patru puncte. Atribuii-le variabilelor pt1 prin pt4. Trasai o polilinie 2-D nchis ntre cele patru puncte.

Partea a II-a Instruciuni


Scriei un set de expresii. Testai-le n editorul AutoCAD apoi scriei-le mai jos. 1. 2. 3. Cerei utilizatorului un punct centru i atribuii valoarea unei variabile numite cen. Cerei utilizatorului distana de la variabila cen i atribuii valoarea unei variabile numite rad. Desenai un cerc cu centrul cen i raza rad.

86

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Partea a III-a Instruciuni


Scriei un set de expresii. Testai-le n editorul AutoCAD apoi scriei-le mai jos. 1. 2. 3. 4. 5. Cerei utilizatorului dou puncte. Atribuii-le variabilelor pt1 i pt2. Desenai o polilinie 2-D nchis. Folosii pt1 i pt2 pentru colurile opuse ale poliliniei. Calculai celelalte dou puncte din pt1 i pt2 folosind funciile car, cdr i list.

97106266.doc R.2.1 5/16/2012

87

AUTODESK, INC.

Aceast pagin a fost lsat liber n mod intenionat.

88

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Funcii
Pe lng funciile interne, AutoLISP-ul permite crearea funciilor definite de utilizator, adic funcii ale caror seturi de instruciuni i nume au fost definite.

Obiective
n acest capitol vei studia: Definiia funciei AutoLISP. Cum s creai propriile funcii AutoLISP. Sintaxa funciei defun. Cum s trimitei argumente unei funcii. Cum returneaz funcia o valoare.

Funciile si evaluarea listelor


Considerai procesul de evaluare al unei expresii tipice care folosete o funcie intern AutoLISP.

(setq x 10)

AutoLISP-ul evalueaz primul element unde se ateapt s gasesc o funcie. Aici gsete subprogramul setq i reface legtura. Legarea lui setq reprezint un set de instruciuni care arat cum trebuie facut procesarea. AutoLISP-ul evalueaz argumentele lui setq n ordine i termin prin aplicarea instruciunilor de procesare la valoarea argumentelor. Rezultatul n acest caz este o valoare returnat, 10, pentru expresie i un efect secundar al variabilei x care este legat de 10. este un subprogram i instruciunile lui au fost predefinite n AutoLISP. Utilizatorul nu le poate schimba. Totui este posibil crearea unor noi funcii care s execute orice instruciuni de procesare dorite de utilizator.
setq

Legturi noi se creaz prin folosirea subprogramului defun care este funcia de definire.

97106266.doc R.2.1 5/16/2012

89

AUTODESK, INC.

Sintaxa funciei defun


Sintaxa funciei defun este puin diferit de cea a celorlalte funcii folosite pn acum.

(defun <sym name> (<arg list> / <local var>) <expr> ...)

cere obligatoriu dou argumente i un numr variabil de argumente care urmeaz dup primele dou.
defun

Argumentele funciei defun


Primul argument al funciei este numele noii funcii de definit. Folosii un nume nou pe care l-ai creat, de preferin unul care descrie aciunile funciei. ATEN}IE Nu folosii niciodat numele unei funcii sau a unui simbol construite intern deoarece acesta se va suprapune peste definiia original i l va face inaccesibil pn lansai AutoLISP-ul n cadrul unei noi sesiuni AutoCAD. n acest exemplu, primul argument al funciei defun este numele simbol myfun care devine numele funciei definite de utilizator.

(defun myfun (<arg list> / <local var>) <expr> ...)

Al doilea argument cerut de defun este o list de argumente cerute i variabile locale. Cele dou tipuri de argumente snt separate de o linie. Acum este suficient s folosii o list goal. Exemplul este extins pentru a include lista argumentelor cerute i a variabilelor locale.
(defun MYFUN ( ) <expr> ... )

Argumentele care urmeaz dup argumentele cerute snt expresii de evaluat cnd se execut funcia definit de utilizator. Ele reprezint instruciunile de procesare care vor fi executate cnd funcia va fi apelat.

Returnarea valorii unei funcii


Valoarea returnat a funciei definite de utilizator este valoarea ultimei expresii din corpul definiiei funciei.

90

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

n urmtoarele exemple, expresiile vor fi adugate corpului funciei myfun. Seturi diferite de expresii vor da nelesuri diferite funciei myfun precum i valori returnate diferite. n acest exemplu myfun adaug dou numere i returneaz rspunsul.
(defun myfun ( ) (+ 1 2 ) )

Exemplu
Introducei expresiile care urmeaz. Definii funcia myfun apoi apelai-o.

Command: (defun myfun () (+1 2 )) MYFUN

Command: (myfun) 3

Exemplu
Introducei expresiile care urmeaz. Definii funcia myfun apoi apelai-o. myfun va returna radacina patrat a lui 624, rotunjit pna la cel mai apropiat numr ntreg.

Command: (defun myfun () (fix (sqrt 624.0)) MYFUN

Command: (myfun) 24

Exemplu
Introducei expresiile care urmeaz. Definii funcia myfun apoi apelai-o. myfun va returna distana dintre dou puncte alese de utilizator.
Command: (defun myfun () (getdist From point: )) MYFUN

Command: (myfun) From point: pick a point Second point: pick a point

97106266.doc R.2.1 5/16/2012

91

AUTODESK, INC.

n cele trei exemple pe care le-ai parcurs, valoarea returnat a funciei myfun este valoarea returnat a ultimei expresii din corpul definiiei.

Figura 36.Corp de expresii pentru o definitie a functiei

Expresii multiple pot fi introduse n corpul definiiei funciei. Valoarea returnat a funciei este valoarea returnat a ultimei expresii din corpul definiiei. n acest exemplu valoarea returnat a funciei myfun este valoarea expresiei (+3 4)
Command: (defun myfun () (+1 2) (+3 4)) MYFUN Command: (myfun)

Figura 37.Ultima expresie din corp este valoarea returnata a functiei.

92

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Argumentele unei funcii


(defun myfun (<arg list> / <local var>) <expr>... )

Lista argumentelor cerute dintr-o expresie defun v permite s adugai argumente la funciile de apelare. n acest exemplu funcia myfun este definit cu un singur argument solicitat: simbolul x. x este folosit n cadrul expresiei din corpul definiiei funciei myfun: (* x 10). Orice valoare se utilizeaz ca argument la myfun, aceasta va deveni automat valoarea lui x din corpul expresiei (* x 10).

Command: (defun myfun (x) (* x 10)) MYFUN 10 Command: (myfun 1) 20 Command: (myfun 2) Command:

Figura 38. Valoarea argumentului se afla in corpul de expresii al functiei.

97106266.doc R.2.1 5/16/2012

93

AUTODESK, INC.

Exemplu
Introducei expresiile care urmeaz. Creai o funcie numit add-one care solicit un argument. Adugai unu la valoarea lui i returnai. Folosii funcia cu dou valori diferite .
Command: (defun add-one (x) (+ x 1)) ADD-ONE Command: (add-one 1) 2 Command: (add-one 4) 5

Exemplu
Introducei expresiile care urmeaz. Creai o funcie numit dtr care cere un argument exprimat n grade i returneaz valoarea transformat n radiani. Folosii funcia cu trei valori diferite. Formula aritmetic pentru transformarea gradelor n radiani pentru valoarea d este:
(d / 180) * pi Command: (defun dtr (d) (* pi (/ d 180.0))) DTR Command: (dtr 180) 3.14159 Command: (dtr 360) 6.28319 Command: (dtr 90) 1.5708

Exemplu
Introducei expresiile care urmeaz. Creai o funcie care se numete add-two care cere dou argumente, adaug valorile lor i returneaz. Folosii funcia cu dou seturi de valori diferite.

Command: (defun add-two (x y) (+x y)) ADD-TWO Command: (add-two 1 2) 3 Command: (add-two 4 5) 9

94

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Recapitulare
Noile funcii externe snt create cu ajutorul funciei defun. Toate funciile returneaz o valoare . Funciile snt definite fr argumente sau cu un numr fix de argumente solicitate . Argumentele unei funcii snt evaluate oriunde s-ar afla n corpul definiiei funciei.

97106266.doc R.2.1 5/16/2012

95

AUTODESK, INC.

EXERCITIUL

13: DEFINREA UNOR NOI FUNCTII Trebuie s completai partea a III-a a acestui exerciiu. Se vor face referiri la aceast parte n exerciiile care urmeaz. n acest exerciiu vei: Consolida cunotinele despre cum snt create funciile definite de utilizator. Scrie funcii cu argumente solicitate. Scrie o funcie care apeleaz o comand AutoCAD.

Partea I Instruciuni
1. 2. 3. 4. 5. Creai o funcie numit times-two. Funcia solicit dou argumente. Funcia multiplic cele dou argumente i returneaz valoarea. Testai-o n AutoCAD. Scriei-o mai jos.

Partea a II-a Instruciuni


1. 2. 3. 4. 5. Creai o funcie numit rtd. Funcia solicit un argument. Funcia transform valoarea argumentului din radiani n grade i returneaz valoarea. Testai-o n AutoCAD. Scriei-o mai jos.

Formula aritmetic de transformare din radiani n grade pentru valoarea r este:


(r / pi) * 180

96

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Partea a III-a Instruciuni


1. 2. 3. 4. 5. 6. 7. Creai o funcie numit rectangle. Funcia nu cere argumente. Cerei utilizatorului dou puncte i memorai-le sub form de variabile. Trasai o polilinie 2-D nchisa folosind punctele pentru colurile opuse. Calculai celelalte dou puncte cu ajutorul funciilor car, cdr i list. Testai-o n AutoCAD. Scriei-o mai jos.

97106266.doc R.2.1 5/16/2012

97

AUTODESK, INC.

Aceast pagin a fost lsat liber intenionat.

98

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Funcii care acioneaz sub form de comenzi AutoCAD


O funcie definit de utilizator poate apela o funcie AutoLISP command n cadrul corpului definiiei ei. Apelarea ei apare utilizatorului sub forma unei comenzi AutoCAD, o comand ce poate fi apelat fr ca aceasta s se afle ntre paranteze.

Obiective
n acest capitol vei studia: Cum s transformai o funcie AutoLISP definit de utilizator ntr-o nou comand AutoCAD. Cum s folosii simbolul pause n cadrul funciilor de tip command. Cum s obinei valoarea unei variabile de sistem n AutoLISP.

O noua comand ZOOM


Pentru a ilustra unele puncte sensibile ale definirii funciilor i comenzilor AutoCAD vom crea o funcie simpl i util care combin comanda ZOOM cu opiunea Center, schimbnd factorul de afiare cu 2. Considerai cererile pentru o operaie ZOOM CENTER.
Command: zoom All/Center/Dynamic/Extens/Left/Previous/Vmax/Window/<Scale(X/XP>: Center point: Magnification or Heigh<current>:

Avem nevoie de dou valori pentru aceast funcie: noul punct centru i factorul curent de afiare multiplicat cu 2. Vom obine cele dou puncte de la utilizator prin suspendarea evoluiei funciei i vom obine factorul de afiare prin setarea variabilei de sistem VIEWSIZE .

Simbolul "pause"
Putem obine un punct de la utilizator prin legarea unei variabile cu setq i getpoint i transferarea variabilei ctre comanda ZOOM.
(setq pt (getpoint Center point: )) (command zoom c pt ...)

Putem suspenda cererile de comand care vin din AutoCAD pentru a permite utilizatorului s rspund direct.

97106266.doc R.2.1 5/16/2012

99

AUTODESK, INC.

(command zoom c pause ...)

Simbolul special AutoLISP pause este folosit ca argument pentru funciile tip command . pause suspend evaluarea expresiei i permite utilizatorului s raspund n linia de comand unde este introdus (n cazul ilustrat mai sus, cererea pentru un nou punct de centru pentru afiare).

Variabile de sistem AutoCAD


Funcia AutoLISP getvar are un singur argument: numele unei variabile de sistem exprimat sub forma unui ir, adic ntre ghilimele. Funcia returneaz valoarea variabilei de sistem. n acest exemplu funcia getvar returneaz valoarea variabilei de sistem VIEWSIZE .
Command: (getvar viewsize)

Funcia ZPLUS
Avem toate instruciunile necesare pentru definirea funciei noastre. O modalitate de a suspenda comanda ZOOM i de a permite utilizatorului s selecteze un nou punct de centru. O modalitate de a obine factorul de afiare curent zoom.

Exemplu
Introducei expresiile care urmeaz. Creai o nou funcie numit zplus i folosii-o. zplus va afia noul punct de centru pe care l selectai cu factorul 2.
defun zp Command: (defun zplus() ) 1> (setq zplus-height (*0.5 (getvar viewsize))) 1> (command zoom c pause zplus-height)) ZPLUS Command: (zplus) All/Center/Dynamic/Extens/Left/Previous/Vmax/Windows/<Scale(X/XP)>: Center point: pick a point 4. Magnification or Heigh<9.0000>:4.5.000000000 Command: nil Command:

Funcia C:ZPLUS
O sintax special pentru numele funciei definite de utilizator ne permite s apelm funcia sub o form prescurtat fr s folosim paranteze. Aceast funcie apare mai curnd sub forma unei comenzi AutoCAD dect sub forma unei funcii.

100

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Dac numele unei funcii ncepe cu litera C:, atunci funcia poate fi apelat fie sub forma unei funcii sau sub forma unei comenzi. Dac numele unei funcii ncepe cu caracterul C:, funcia poate fi apelat pe linia de comand fie ca o funcie, fie ca o comand. n acest exemplu, funcia c:zplus este apelat ca o funcie i ca o comand.

Exemplu
Introducei expresiile care urmeaz. Definii funcia c:zplus i apelai-o n ambele moduri, ca o funcie i ca o comand.
Command: (defunc: zplus () 1> (setq zplus-height (* 0.5 (getvar "viewsize"))) 1> (command "zoom" "c" pause zplus-height)) C:ZPLUS Command: (c:zplus) All/Center/Dynamic/Extents/Left/Previous/Vmax/Window/<Scale(X/XP)>:c Center point: pick a point Magnification or Height <2.250000>: 1125000000000 Command: nil Command:zplus

All/Center/Dynamic/Extents/Left/Previous/Vmax/Window/<Scale(X/XP)>:c Center point: pick a point Magnification or Height <9.0000>: 4.5000000000 Command:nil Command:

Recapitulare
Simbolul pause permite utilizatorului s rspund la o cerere dintr-o comand AutoCAD apelat de funcia AutoLISP de tip command . Funcia getvar stabilete valoarea variabilei de sistem. Prefand numele unei funcii definit de utilizator cu C: se creaz o nou comand AutoCAD

97106266.doc R.2.1 5/16/2012

101

AUTODESK, INC.

EXERCITIUL

14: CREAREA DE NOI COMENZI AUTOCAD Trebuie s completai partea I a acestui exerciiu, deoarece se vor face referiri la aceast parte i n alte exerciii. n acest exerciiu vei: Crea comenzi noi n AutoCAD din funcii AutoLISP. Modifica o funcie existent dintr-un exerciiu anterior i o vei transforma ntr-o comand.

Partea I
1. 2. 3. 4. Modificai funcia rectangle din partea a III-a a exerciiului 11-1. Definii funcia ca c:rectangle. Scriei funcia mai jos. Testai-o n AutoCAD.

Partea a II-a
1. 2. 3. 4. Definii o funcie numit c:zminus. Aceasta trebuie s fac aceleai lucruri ca i funcia c:zplus, dar schimbai factorul de afiare de la 2 la 1/2. Scriei funcia mai jos. Testai-o n AutoCAD.

102

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Fiierele program AutoLISP


Putei crea funcii definite de utilizator introducnd codul corespunztor n linia de comand. Pentru definirea funciilor i pentru succesiuni complexe de s-expresii este adesea mult mai eficient s folosii un editor de text i s scriei funciile sau expresiile ntr-un fiier de tip text cu o extensie .lsp. Codul din fiier poate fi ncrcat n editorul grafic cu ajutorul funciei AutoLISP load.

Obiective
n acest capitol vei studia: Cum s scrieti fiiere text care conin programe AutoLISP. Cum s ncarcai fiierele program AutoLISP n editorul grafic AutoCAD. Cum lucreaz funcia AutoLISP load. Cum s recunoatei cele mai frecvente mesaje de erori n timpul incrcrii.

Evaluarea la ncrcarea fiierului


Funcia load citete pe rnd expresiile dintr-un fiier i evalueaz fiecare expresie n parte. Valoarea returnat de funcia load este valoarea ultimei expresii care a fost evaluat. Funcia load cere un singur argument de tip ir: numele fiierului .lsp de ncrcat.
(load filename).

Dac adugai codul pentru funcia c:rectangle la numele unui fiier rectang.lsp putei ncrca fiierul ntr-o sesiune de editare grafic fr s reintroducei ntreaga definiie a funciei NOT Funcia AutoLISP load este diferit de comanda AutoCAD LOAD.

97106266.doc R.2.1 5/16/2012

103

AUTODESK, INC.

Cutarea fiierului
AutoLISP-ul va cuta fiierul rectang.lsp n directorul curent mpreun cu alte directoare menionate n specificarea de cale a bibliotecii AutoCADului. Dac gsete fiierul, l va ncrca n editor. Pentru lista de directoare aflate n specificarea de cale a bibliotecii AutoCAD consultai descrierea funciei findfile n capitolul 4 din AutoLISP Programmer's Reference Manual.

Mesaje de eroare la ncrcare


Dac AutoLISP-ul afieaz un mesaj de eroare la ncrcarea fiierului, trebuie s editai fiierul i s corectai eroarea. Lista erorilor AutoLISP i a cauzelor acestora se afl n Appendix D din AutoLISP Programmer's Reference Manual. O list succint a erorilor pe care este posibil s le ntlnii la ncrcare este dat mai jos. Majoritatea mesajelor indic erori tipice de programare AutoLISP cum ar fi: Ortografierea greit a funciilor sau a numelor simbol Tipuri greite de argumente la funcie Paranteze nemperecheate Ghilimele nemperecheate

Mesaje de eroare can't open file for input -- LOAD failed

Explicatii Fisierul numit in Functia load nu poate fi gasit., sau utilizatorul nu are acces sa citeasca fisierul. S-a detectat una sau mai multe paranteze dreapta in plus. Nu exista spatiu suficient pentru a aranja sirul text specificat, de obicei datorita ghilimelelor neimperecheate. O lista citita dintr-un fisier s-a terminat prematur. Cea mai frecventa cauza este imperecherea gresita a parantezelor sau a ghilimeleor..

extra right paren insufficient string space

malformed list

Tabelul 18. Mesaje de eroare la incarcare

104

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Recapitulare
Programele AutoLISP pot fi stocate n fiiere text externe. Fiierele AutoLISP au extensia .lsp. Funcia load ncarc un program AutoLISP n AutoCAD. AutoLISP-ul v atrage atenia printr-un mesaj de eroare dac are o problem la ncrcarea fiierului.

97106266.doc R.2.1 5/16/2012

105

AUTODESK, INC.

EXERCITIUL

15: INCARCAREA UNUI FISIER SURSA n acest exerciiu vei:

AUTOLISP

Crea un fiier program AutoLISP. ncrca fiierul n editorul grafic . Folosi comanda definit de fiier.

Instruciuni
1. 2. 3. 4. 5. Folosii editorul text pe staia dvs. de lucru. Rugai instructorul s v ajute s configurai editorul de text n sistemul dvs. Creai un fiier de text numit rectang.lsp. Salvai fiierul n directorul de lucru. ncrcai fiierul n editorul grafic. Folosii comanda RECTANGLE.

(defun c:rectangle () (setq pt1 (getpoint "nFirst corner: ")) (setq pt3 (getpoint "nOther corner: ")) (command "_.pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) ) Command: (load "rectang") C:RECTANGLE

Command: rectangle First corner:

106

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Sugestii de programare optim a funciilor C:


Acest capitol trateaz o serie de aspecte referitoare la interfaa i operaiile interne ale funciilor C:, dar aceste rezultate pot fi aplicate la orice definiie a unei funcii nu numai la cele a cror nume ncepe cu C:.

Obiective
n acest capitol vei studia: Cum se ntrerupe execuia unei funcii definite de utilizator. Cum s anulai afiarea cererilor de comand AutoCAD n timpul executrii unei comenzi AutoLISP. Conceptul de alocare i de variabile locale i globale. Diferena dintre variabilele locale i globale. Cum s declarai i s folosii variabilele locale n cadrul definiiei funciei.

Returnarea irului vid de la o funcie C:


Valoarea ultimei expresii din corpul de expresii care urmeaz dup argumentele cerute i variabilele locale din definiia unei funcii este ntotdeauna returnat ca valoarea funciei. Cred c ai observat c funcia c:rectangle returneaz nil. Acest lucru este evident deoarece o funcie de apelare de tip command este ultima expresie din corpul definiiei funciei c:rectangle i funcia de tip command returneaz ntotdeauna nil. Funcia AutoLISP prin1 va vizualiza un ir vid pe ecran dac prin1 este ultima expresie din definiia funciei. De exemplu, aceast versiune modificat a comenzii RECTANGLE nu vizualizeaz nil la cererea de comand dup ce aceasta a fost executat.

97106266.doc R.2.1 5/16/2012

107

AUTODESK, INC.
( defun c:rectangle () (setq pt1 (getpoint "nFirst corner: ")) (setq pt3 (getpoint "nOther corner: ")) (command "_.pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) (prin1) )

Anularea afirii cererilor de comand AutoCAD


Implicit AutoCAD-ul dubleaz toate comenzile i opiunile n zona liniei de comand, incluzind i pe cele emise de un program AutoLISP. Variabila de sistem CMDECHO poate suprima aceast "comand dubl". n aceast versiune modificat a funciei c:rectangle, CMDECHO este setat pe off la startul rutinei iar la ieire este setat pe on.
(defun c:rectangle () (setq old_cmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) (setq pt1 (getpoint "nFirst corner: ")) (setq pt3 (getpoint "nOther corner: ")) (command "pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) (setvar "CMDECHO" old_cmdecho) (prin1) )

Alocarea: Moduri de legare a unei variabile


AutoLISP-ul folosete o schem dinamic de alocare. Alocarea unei variabile este determinat n timpul funcionrii de ordinea apelrii funciei i de declaraiile de variabil. Variabilele snt legate n dou moduri: global i local O variabil global este o variabil a crei legare (sau atribuire a unei valori) a fost fcut cu ajutorul funciilor set i setq i nedeclarat local n funcie. Variabilele globale pot fi vizualizate sub forma de liste pe ecran folosind funcia de apelare (familia de atomi 0).

108

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Variabilele globale snt accesibile tuturor funciilor definite de utilizator att pentru citire ct i pentru scriere.Variabilele globale snt adesea folosite pentru "comunicare" ntre programele AutoLISP. De exemplu Programul 1 va seta o condiie ntr-o variabil global pe care Programul o va verifica nainte de a aciona. O variabil local este o variabil a crei legare a fost facut cu ajutorul funciilor set i setq n cadrul unei funcii a crei variabil a fost declarat local sau cu ajutorul declaraiei sub forma unui argument cerut la o funcie. Variabilele locale i menin legtura numai n contextul unei funcii n care au fost declarate ca fiind locale. Ele i pierd legtura odat cu ieirea funciei. Legarea unei variabile globale se poate schimba n cazul alocrii unei funcii n care o variabil cu acelai nume a fost declarat local. La ieirea funciei, variabila este legat din nou de valoarea global original. Un set de s-expresii ilustreaz aceste concepte.

Exemplu
Citii explicaiile i introducei s-expresiile adecvate. Mai nti vei lega global variabila x de valoarea 1.
Command: (setq x 1) 1 Command: !x 1

Apoi vei defini o funcie local_arg care l declar pe x ca argument. Legarea lui x se poate schimba local n cadrul alocrii funciei local_arg i legarea global va fi restabilit la ieirea funciei local_arg .
Command: (defun local_arg (x) (print x) (* x x)) LOCAL_ARG Command: (local_arg 2) 2 4 Command: !x 1

Apoi vei defini o funcie local_var care l declar pe x ca variabil local. Legarea lui x se poate schimba local n cadrul alocrii funciei local_var i legarea global va fi restabilit la ieirea funciei local_var.
Command: (defun local_var (/ x) (setq x 3) (print x)) LOCAL_VAR Command: (local_var)

97106266.doc R.2.1 5/16/2012

109

AUTODESK, INC.
3 Command: !x 1

Vei defini apoi o funcie global_var unde variabila x nu a fost definit nici ca argument nici ca variabil local; de aceea schimbarea n interiorul legturii se va face global, n afara alocarii funciei global_var.
Command: (defun global_var () (setq x 4) (print x)) GLOBAL_VAR Command: (global_var) 4 Command: !x 4

Folosirea variabilelor locale


Funcia c:rectangle a fost pe deplin clarificat. n acest exemplu, variabilele old_emdecho, pt1 i pt2 snt declarate ca fiind locale la funcie; deci ele nu pot intra n conflict cu variabilele globale care au acelai nume i nici cu variabilele cu acelai nume care pot fi gsite n cadrul altor funcii.
(defun c:rectangle (/ old_cmdecho pt1 pt3) (setq old_cmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) (setq pt1 (getpoint "nFirst corner: ")) (setq pt2 (getpoint "nOther corner: ")) (command "pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) (setvar "CMDECHO" old_cmdecho) (prin1) )

Declaraia variabilelor locale se face de obicei dup un program care a fost verificat i pus la punct ntruct declaraia face dificil sau chiar imposibil examinarea valorilor lor n cazul n care funcia aborteaz sau face ceva neateptat din cauza unei erori n cod.

Globalizarea variabilelor de sistem


Variabilele de sistem apelate de funcia AutoLISP setvar nu se traduc niciodat din limba englez n limba utilizatorului. Cererile de apelare a funciei setvar funcioneaz n toate versiunile AutoCAD-ului fr s necesite traducerea numelui variabilei de sistem din limba englez n limba utilizatorului.

110

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Variabilele de dimensiune se traduc numai n linia de comand pentru dimensionare.

Redefinirea comenzii
Putei nlocui comenzile AutoCAD existente cu comenzi AutoLISP care au acelai nume. Utilizatorul poate apela o comand AutoCAD prin prefaarea numelui comenzii prin caracterul punct (.), de exemplu, .LINE, indiferent dac comanda a fost nedefinit. Este bine s prefaai numele unei comenzi apelate de funcia AutoLISP de tip command printr-un punct (.) sau prin subliniere (pentru a v asigura c funcioneaza n toate limbile). Snt dou etape de parcurs pentru nlocuirea comenzii AutoCAD cu o comand AutoLISP care are acelai nume. Folosii comanda UNDEFINE pentru a anihila o comand AutoCAD pentru sesiunea de editare curent. Creai o funcie AutoLISP care are acelai nume ca i comanda AutoCAD i prefaai-o cu c:.

Putei redefini o comand AutoCAD folosind comanda REDEFINE.

Exemplu
Introducei expresiile care urmeaz. Anihilai comanda AutoCAD LINE.
Command: undefine Command name: line

nlocuii-o cu o comand AutoLISP cu acelai nume care deseneaz o linie segment. Apelai versiunea englezeasc a comenzii AutoCAD LINE din cadrul funciei AutoLISP.
Command: (defun c: line () (command ._ line pause pause )) C: LINE

Apelai comanda LINE.

97106266.doc R.2.1 5/16/2012

111

AUTODESK, INC.
Command: line .- line From point: pick a point To point pick a point To point: Command: nil

Redefinii comanda AutoCAD.


Command: redefine Command name: line

112

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Recapitulare
Putei iei dintr-o funcie apelnd prin1 sau princ care reprezint ultima expresie n corpul definitiei funciei. Variabila de sistem CMDECHO poate suprima afiarea cererilor de comand AutoCAD. AutoLISP-ul utilizeaz o schem dinamic de alocare. Variabilele globale snt accesibile pentru toate funciile. Variabilele locale snt accesibile numai n contextul funciilor n care au fost declarate. Putei folosi variabile locale n cadrul funciilor pentru a evita posibilitatea unor conflicte ntre variabile cu aceleai nume din alte funcii. Variabilele de sistem apelate de funcia setvar nu se traduc niciodat din englez. Comenzile AutoCAD pot fi nlocuite cu comenzi AutoLISP care au acelai nume, folosind comanda UNDEFINE. Comanda AutoCAD va fi ntotdeauna apelat cnd numele comenzii este prefaat printr-un punct; de exemplu .LINE, indiferent dac comanda a fost anihilat. Prefaai ntotdeauna numele unei comenzi cu un punct (.) sau prin caracterul subliniere ( _ ) n cazul funciei de tip command. Prefaai ntotdeauna opiunea de comand prin caracterul subliniere ( _ ) n cazul funciei de tip command .

97106266.doc R.2.1 5/16/2012

113

AUTODESK, INC.

EXERCITIUL

16:

FUNCTIA DE PROGRAMARE OPTIMA

n acest exerciiu: Vei consolida cunotinele cu privire la ordonarea funciilor C:, incluznd ieirea funciilor, dublarea cererii de comand i declaraia variabilei locale. Vei modifica fiierul rectang.lsp pentru a introduce noi concepte din acest capitol. Vei crea un nou fiier text cu o funcie modificat.

Partea I Etape de lucru


1. 2. 3. 4. 5. Modificai fiierul rectang.lsp Adugai funcia de ieire imediat. Anulai ecoul cererii de comand. Declarai variabilele corespunztoare ca variabile locale. ncrcai, lansai i testai programul dup ce ai fcut modificrile.

Partea a II-a Etape de lucru


1. Rescriei funcia c:zplus de la sfritul capitolul 12 ntr-un fiier numit zplus.lsp. 2. Folosii funcia getpoint pentru a obine noul punct de centru a ecranului. 3. Anulai ecoul din opiunile i cererile de comand ZOOM. 4. Declarai toate variabilele local. 5. Introducei funcia de ieire. 6. ncrcai, demarai i testai programul dup ce ai fcut modificrile. NOTA Funciile GETxxx nu pot fi folosite n cadrul expresiilor funciilor command ; de exemplu, (command "line" (getpoint)) nu este permis.

Aceast pagin a fost lsat liber n mod intenionat.

114

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Teste logice i de egalitate


Programele AutoLISP pot face un salt pe baza valorii unei expresii test.

Obiective
n acest capitol vei studia: Cum se poate schimba controlul desfurarii unui program pe baza unei expresii test. Cum s folosii testele de egalitate i testele logice ca expresii test. Diferena dintre simbolul t i simbolul nil. Cum s determinai tipul de date al unui obiect.

Ramificarea programului
Aceasta diagrama simpl ilustreaz principiul ramificrii programului.

Figura 39. Ramificarea programului bazata pe testul de conditie

n aceast diagram, dac valoarea variabilei x este egal cu irul de tip text "Hello, world", atunci programul se va ramifica n expresia y i va continua; dac nu , se va ramifica n expresia z i va continua. Funciile care realizeaz testele condiionale snt folosite pentru ramificaii n interiorul programelor AutoLISP. Cele dou funcii de baz pentru testele condiionale snt:
if cond

Unele valori sau seturi de valori snt testate cu if sau cond iar programul se ramific conform rezultatelor testului. AutoLISP-ul dispune de o varietate de funcii care testeaz valorile pe baza anumitor criterii sau unele valori pe
97106266.doc R.2.1 5/16/2012

115

AUTODESK, INC.

baza celorlalte. n acest capitol ne concentrm atenia asupra unora dintre cele mai utilizate funcii de acest tip. =, >, <
equal and or not logand

t si nil
n AutoLISP, simbolul t este echivalentul pentru "adevrat" n orice test condiional. Simbolul nil este echivalentul lui "fals". Dac o expresie AutoLISP nu se evalueaz, atunci expresia este nil sau fals. Dac o expresie nil este folosit ntr-un test condiional, atunci va fi executat o ramificaie pentru o condiie fals. Dac o expresie AutoLISP evalueaz orice altceva dect nil, atunci expresia este t sau adevrat. Dac o expresie t este folosit ntr-un test condiional, atunci va fi executat ramificaia pentru o condiie adevarat. i nil se exclud mutual. Dac o expresie este t, atunci nu poate fi nil. Dac o expresie este nil, atunci nu poate fi t.
t

116

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL NR

17: OBIECTELE

SI EXPRESIILE POT FI T SAU NIL

n acest exerciiu: Vei nva s determinai dac valoarea returnat a unei funcii este t sau nil.

Instruciuni
1. 2. 3. 4. ntr-un desen nou, desenai o entitate de tip linie. Introducei expresiile n coloana din stnga a tabelului. Determinai dac expresiile snt t sau nil. Verificai csua adecvat din tabel.
Expresie (setq ename (entnext)) !ename (setq ename (entnext ename)) !ename (+ 1 2) (- 1 1) () (command "erase" "last" "") (command "u") Tabelul 19. Expresiile pot fi t sau nil t nil

97106266.doc R.2.1 5/16/2012

117

AUTODESK, INC.

Funcii care testeaz egalitatea


Funcia = are dou sau mai multe argumente cu orice tip de date. Aceast funcie verific dac toate argumentele au valori echivalente. Dac da, funcia returneaz t; dac nu, returneaz nil. De exemplu, aceast expresie verific dac valorile numrului real 4.0 i expresia (+ 2.0 2.0) snt echivalente
Command: (= 4.0 (+ 2.0 2.0)) T

Aceast expresie verific dac 4.0 este echivalent cu expresia (+ 1.5 2.0)
Command: (= 4.0 (+ 1.5 2.0)) nil

Funcia < verific dac primul ei argument este numeric mai mic dect al doilea argument.
Command: (< 45 50) T

Funcia equal este n esen aceeai cu funcia =.

Exerciiu
Introducei expresiile care urmeaz. Legai dou variabile de valori numerice. Folosii variabilele ca argumente la cteva funcii i verificai rezultatele.
Command: (setq x 1) 1

Command: (setq y 1.5) 1.5

Verificai dac x este mai mic dect y.


Command: (< x y) T

Verificai dac x este mai mare dect y.


Command: (> x y) nil

118

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Verificai dac y este mai mare sau egal cu 1,5.


Command: (>= y 1.5) T

Verificai dac x este mai mic sau egal cu y. Command: (<= x y) T Verificai dac x nu este egal cu y.
Command: (/= x y) T

Acest tabel arat funciile care verific egalitatea n AutoLISP.


Functie = /= < <= > >= minusp zerop equal eq Egal cu Nu este egal cu Mai mic decit Mai mic sau egal cu Mai mare decit Mai mare sau egal cu Mai mic decit zero Egal cu zero Egal cu Au aceeasi legatura Test

Tabelul 20. Functii de egalitate

97106266.doc R.2.1 5/16/2012

119

AUTODESK, INC.

Funcii care verific tipul de date


AutoLISP-ul dispune de cteva funcii care verific tipul de date ale unui simbol sau expresii.
Functie ATOM LISTP BOUNDP NULL NUMBERP Test Este argumentul un atom? Este argumentul o lista? Este argumentul legat de o valoare? Este argumentul nil? Este argumentul un numr?

Tabelul 21. Functii care testeaza tipul de date

Exemplu
Introducei expresiile care urmeaz. Legai trei variabile de trei tipuri de date diferite: un simbol, un numr real i o list.
Command: (setq x 'abc) ABC Command: (setq y 1.0) 1.0 Command: (setq z '(1 2 3)) (1 2 3)

Folosii variabilele ca argumente la funcii care testeaz tipul de date. Examinai rezultatele funciilor. Snt aceste variabile atomi?
Command: (atom x) T Command: (atom y) T Command: (atom z) nil

Snt aceste variabile liste?


Command: (listp x) nil Command: (listp y) nil Command: (listp z) T

120

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Combinarea funciilor type cu funciile "="


Putei verifica tipul de date al unui obiect n AutoLISP folosind fie funcia =, fie funcia equal cu funcia type.

Exemplu
Introducei expresiile care urmeaz. Legai dou variabile cu tipuri de date diferite: un numr ntreg i un numr real.
Command: (setq x 1) 1

Command: (setq y 1.5) 1.5

Folosii funciile type i = pentru a verifica tipul lor de date.


Command: (= (type x) 'INT) T

Command: (equal (type x) 'REAL) nil

Command: (equal (type y) 'REAL) T

97106266.doc R.2.1 5/16/2012

121

AUTODESK, INC.

Funcii logice
Exist cteva funcii de test logic n AutoLISP. n acest capitol vom studia patru dintre cele mai importante funcii: not, and, or i logand.

Funcia not
Funcia not solicit un argument. Dac argumentul este nil, atunci expresia returneaz t; dac nu, aceasta returneaz nil.

Funcia not este o funcie a crei valoare returnat este opusul argumentului ei. Dai-i nil i va returna t. Dai-i t i va returna nil. Exemplu
Command: (not nil) T

Command: (not t) nil

Funcia and
Funcia and solicit unul sau mai multe argumente. Dac unul dintre argumente este nil, ea returneaz nil. Dac toate argumentele snt t , atunci returneaz t. Funcia and oprete procesarea de ndat ce gsete un argument nil. Unele programe snt scrise n acord cu acest comportament. De exemplu, putei fi siguri c programul nu va gsi o instruciune ntr-o list de argumente ale funciei and dac nici unul dintre argumentele anterioare nu este nil.

Exemplu
Command: (and 1 2 3) T

Command: (and 1 2 nil) nil

Funcia or
Funcia or solicit unul sau mai multe argumente. Dac unul dintre argumente este t, funcia returneaz t. Dac toate argumentele snt nil, atunci funcia returneaz nil. Funcia or oprete procesarea de ndat ce gsete un argument t. Unele programe snt scrise n conformitate cu acest comportament. De exemplu, putei fi siguri c programul nu va gsi o instruciune ntr-o list de argumente ale funciei or dac nici unul dintre argumentele anterioare nu este t.

122

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
Command: (or 1 2 3) T

Command: (or 1 2 nil) T

Command: (or nil nil nil) nil

Funcia logand
Funcia logand are dou sau mai multe argumente care ar trebui s fie numere ntregi. Funcia returneaz un numr ntreg. Funcia logand realizeaz o comparaie AND bit cu bit a biilor din argumentele care snt numere ntregi. Dac un bit este setat la valoarea "adevrat" n toate argumentele funciei logand, atunci acel bit este setat la valoarea "adevrat" i n valoarea returnat. Numerele ntregi 7, 3 i 15 snt reprezentate n bii n tabelul de mai jos.
Intreg 7 3 15 1 bit X X X 2 bit X X X X X 4 bit X 8 bit 16 bit

Tabelul 22. Biti setati la valoarea "adevarat" in trei numere intregi.

Aceast expresie va returna un numr ntreg n care toi biii care snt setai la valoarea "adevrat" n toate cele trei argumente vor fi setai la valoarea "adevrat. n acest caz, biii pentru valorile 1 i 2 vor fi returnai ca "adevrat" de ctre expresie, deoarece snt singurii bii setai "adevrat" n toate cele trei argumente.
Command: (logand 7 15 3) 3

Funcia logand va fi de folos atunci cnd va fi folosit mpreun cu funciile "entity access" mai trziu n acest curs, n special cu valorile binare cum ar fi codurile grupului 70 DXF pentru Polylines i Block Definitions .

97106266.doc R.2.1 5/16/2012

123

AUTODESK, INC.

Recapitulare

Ramificarea unui program depinde de valoarea unui test condiional. Toate obiectele i expresiile din AutoLISP snt t sau nil. AutoLISP dispune de o varietate de funcii care testeaz tipul de egalitate i tipul de date ale obiectelor i expresiilor. Putei testa tipul exact de date al unui obiect combinnd funciile type i =. Funciile logice not, and i or verific dac una sau mai multe expresii snt t sau nil. Funcia logand realizeaz o comparaie AND bit cu bit a unei liste de numere; aceasta funcie va fi de ajutor n combinaie cu funciile de tip entity access mai trziu.

124

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Expresii test i expresii condiionale


Funciile de egalitate i funciile logice snt folosite n expresii test. Expresiile test snt folosite n expresii condiionale i iterative formate din funcii ca if i while. Ele verific dac exist o anumit condiie i arat AutoLISPului ce funcie s execute care depinde de condiie, sau de rezultatul testului. NOT Orice atom, simbol sau expresie poate fi folosit ca expresie test deoarece orice obiect n LISP are o valoare: fie nil, fie altceva.

Obiective
n acest capitol vei studia: Cum s folosii expresiile condiionale pentru a face salt la diferite seturi de expresii n cadrul programului AutoLISP Sintaxa funciilor if i cond. Cum s folosii funcia progn pentru a executa multiple sexpresii n cadrul funciei if.

Expresii condiionale
Expresiile condiionale controleaz desfurarea unui program AutoLISP. Folosim expresiile test pentru a verifica dac o anumit condiie exist, iar rezultatul expresiei test este folosit pentru a comuta expresia condiional. Expresia condiional poate opta pentru execuia programului n oricare din cele cteva direcii posibile. Fiecare direcie va avea un set de expresii de evaluat n AutoLISP. Cele mai folosite expresii condiionale n AutoLISP snt funciile if i cond.

Funcia if
Funcia if are dou argumente obligatorii i un al treilea argument care este opional. Dac valoarea primului argument este t, adic oricare n afar de nil, AutoLISP-ul evalueaz al doilea argument. Dac valoarea primului argument este nil, AutoLISP-ul sare peste al doilea argument. Dac exist cel de-al treilea argument opional, AutoLISP-ul il evalueaz.

97106266.doc R.2.1 5/16/2012

125

AUTODESK, INC.

Simplificnd puin lucrurile, funcia if ar arta cam aa:


(if (I_return_true) (do_this) (else_do_this) )

Exemplu
Introducei expresiile care urmeaz: Legai variabila x de o valoare a lui 1. Legai valoarea lui y bazat pe valoarea lui x.
Command: (setq x 1) 1

Command: (if (= x 1) (setq y 1) (setq y 0)) 1

Command: !y 1

Legai variabila x de o valoare a lui 0. Legai variabila y bazat pe valoarea x.


Command: (setq x 0) 0

Command: (if (= x 1) (setq y 1) (setq y 0)) 0

Command: !y 0

126

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

18: RAMIFICAREA PROGRAMULUI FOLOSIND

FUNCTIA IF

n acest exerciiu : Vei folosi funcia if. Vei scrie o funcie pentru a comuta SNAP pe on sau off n funcie de setarea curent.

Etape de lucru
1. ntr-un fiier nou, folosii editorul de text pentru a crea o funcie numit c:snaptog. 2. Introducei codul de mai jos. 3. Funcia ar trebui s comute modul SNAP n funcie de valoarea curent.
(defun c:snaptog (/ snapval) (setq snapval (getvar "SNAPMODE")) ;get current SNAPMODE (if (= 1 snapval) ;if it's on... (setvar "SNAPMODE" 0) ;turn it off... (setvar "SNAPMODE" 1) ;otherwise, turn it on ) (prin1) ) ;quiet exit

4. 5. 6. 7.

Salvai funcia ntr-un fiier numit snaptog.lsp din directorul student. ncrcai fiierul n AutoCAD. Desenai cteva entiti tip Line i Circle. Folosii SNAPTOG pentru a comuta SNAP pe on sau off cnd desenai entitile.

NOT ncercai s apelai SNAPTOG n cadrul unei comenzi LINE sau CIRCLE.

97106266.doc R.2.1 5/16/2012

127

AUTODESK, INC.

Expresii multiple n cadrul funciei if.


Funcia if permite execuia unei singure expresii dup ce a fost evaluat expresia test. Putei face ca expresii multiple s apar ca o singur expresie la funcia if prin amplasarea acestora n cadrul expresiei progn. Funcia progn evalueaz pe fiecare dintre argumentele sale, pe rnd i returneaz valoarea ultimului argument. Expresii multiple aflate n cadrul funciei progn apar sub forma unei simple expresii la o funcie de apelare. n acest exemplu, dac variabila x este egala cu 1, atunci valorile vor fi atribuite ambelor variabile y i z. Asignarea este realizat de dou s-expresii.

Exemplu
Command: (setq x 1) 1

Command: (if (= x 1) (progn (setq y 2) (setq z 3)) (setq y 0)) 3

Command: !y 2

Command: !z 3

128

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

19: EXPRESII MULTIPLE IN CADRUL FUNCTIEI IF Vei modifica funcia existent de la exerciiul 18. Vei folosi funcia progn. Vei executa s-expresii multiple prin apelarea unei funcii if.

n acest exerciiu:

Etape de lucru
1. n editorul de text, deschidei fiierul snaptog.lsp din directorul student. 2. Redenumii funcia c:modetog. 3. Cu ajutorul funciei progn, adugai codul care comut SNAPMODE i GRIDMODE pe baza valorii curente a lui SNAPMODE. 4. Salvai fiierul pe disc ca modetog.lsp. 5. ncrcai programul modificat n AutoCAD. 6. Testai comanda MODETOG.

97106266.doc R.2.1 5/16/2012

129

AUTODESK, INC.

Funcia cond
Funcia cond cere un argument obligatoriu i un numr oarecare de argumente opionale. Fiecare argument al funciei cond poate fi un set de expresii incluse ntr-o list extern. Funcia cond evalueaz prima expresie n fiecare din listele de argumente, pe rnd, pn ce o expresie evalueaz "adevrat". Atunci funcia cond evalueaz expresiile care urmeaz primei expresii din cadrul argumentului i returneaz. Funcia cond este de preferat funciei if ori de cte ori exist mai mult de dou cazuri de testat, adic mai mult de dou ramificri n orice punct din program.

Exemplu
Aceast definiie a funciei va introduce valori diferite n zona liniei de comand, n funcie de valoarea numeric a variabilei x. Fii ateni n mod special la modul n care pot fi construite argumentele la funcia cond. Prima expresie dintr-un argument este expresia test i expresiile care urmeaz dup test vor fi evaluate dac argumentul test este adevrat. Funcia cond oprete testarea argumentelor de ndat ce gsete un argument a crui expresie test este adevarat, adic nu este nil.
(defun testx (x) (cond ( (= x 0) (prompt "nX equals 0.") ) ( (< x 0) (prompt "nX is less than 0.") ) ( (> x 0) (prompt "nX is greater than 0.") ) ) (prin1) )

Recapitulare
Funcia if testeaz o expresie i se ramific spre oricare dintre cele dou sexpresii. Funcia progn este folosit pentru a executa s-expresii multiple n cadrul funciei if.

130

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Funcia cond poate testa mai multe expresii i poate executa orice numr de s-expresii ntr-o ramificaie dat.

97106266.doc R.2.1 5/16/2012

131

AUTODESK, INC.

EXERCITIUL

20: UTILIZAREA FUNCTIEI COND PENTRU RAMIFICAREA PROGRAMULUI n acest exerciiu: Vei folosi funcia cond n cadrul unei funcii noi. Vei testa o variabil pentru egalitate numeric. Vei executa toate trei ramificaiile expresiei cond.

Etape de lucru
1. 2. 3. 4. Creai o nou funcie ntr-un nou fiier cu ajutorul editorului de text. Numii aceast funcie testx. Funcia cere un argument obligatoriu. ntr-o instruciune cond, folosii testele de egalitate pentru a vedea dac valoarea argumentului este egal, mai mic sau mai mare dect 0. Dac este satisfacut un test de egalitate, folosii funcia prompt pentru a semnaliza utilizatorul.

5.

(prompt "nX equals 0.")

6. 7. 8.

Salvai fiierul ca testx.lsp n directorul student. ncrcai fiierul n AutoCAD. Folosii funcia testx cu valorile argumentelor 0, 1 i -1.

132

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

133

AUTODESK, INC.

Bucle de program
Buclele de program reprezint un concept important pentru orice limbaj de programare. Buclele permit instruciunilor programului s fie executate de nenumrate ori pe baza valorii unei espresii test.

Obiective
n acest capitol vei studia: Cum s folosii buclele pentru a repeta un set de expresii. Sintaxa funciilor repeat i while.

Explicarea modului de funcionare a buclelor


O bucl se explic astfel: " Testai o expresie. Dac expresia este adevrat, atunci executai un set de instruciuni ale programului, pe rnd, apoi testai expresia din nou. Dac este tot adevrat, executai toate instruciunile programului apoi testai din nou expresia la infini. Aa lucreaz funcia while. Funcia repeat execut un set de expresii de un numr de ori prestabilit. Ca exemplu s presupunem c avem un set de expresii pe care vrem s-l executm de 5 ori. Este mai nelept s scriei setul de expresii o singur dat n program i s folosii unele funcii care s cear AutoLISP-ului s repete expresiile de 5 ori dect s scriei setul de expresii de 5 ori. Ca exemplu (si nu unul strlucit) vom construi o funcie simpl de numrare folosind funcia repeat. Funcia va aduga numrul ntreg 1 la valoarea unei variabile ori de cte ori funcia este apelat i apoi va tipri valoarea variabilei n zona liniei de comand.

134

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Funcia repeat
Funcia repeat cere dou argumente i un numr oarecare de argumente opionale. Primul argument trebuie s fie un numr ntreg (sau evaluat ntr-un numr ntreg). Acesta spune funciei repeat de cte ori s execute al doilea argument pn la al n -lea argument.

Exemplu
Command: (repeat 3 (prompt "nHello")) Hello Hello Hellonil nil

de la sfrit este valoarea returnat de funcia repeat.

Exemplu
Introducei expresiile care urmeaz. Expresiile definesc funcia count. n funcia count, dup ce variabila num este legat de 0, valoarea lui num este vizualizat pe monitor i incrementat cu 1 pn la un total de 10 ori.
Command: (defun count () 1> (setq num 0) 1> (repeat 10 (print num) (setq num (1+ num))) 1> (prin1)) COUNT

Folosii funcia count. Aceasta va introduce numerele de la 0 la 9 n zona liniei de comand.


Command: (count) 0 1 2 3 4 5 6 7 8 9

97106266.doc R.2.1 5/16/2012

135

AUTODESK, INC.

O versiune ceva mai interesant a funciei count va TERGE ultimele trei entitai desenate i care snt vizibile pe monitor.

Exemplu
ntr-un desen nou, desenai cel puin trei (3) entiti de orice fel. Introducei expresiile care urmeaz.
Command: (defun count () (repeat 3 (command "erase" "l" ""))) COUNT

Folosii funcia count pentru a terge ultimele entiti din desen.


Command: (count)

Mai multe despre intrrile utilizatorului


Funcia initget poate reface valorile permise pentru intrarea utilizatorului n timpul oricrei apelri a funciilor de tip GETXXX, de exemplu funciile getpoint i getdist. Apelai initget care are un numr ntreg ca argument i/sau o list de cuvinte cheie acceptabile, imediat dup apelarea unei funcii GETXXX. Acest exemplu admite numai numere ntregi cu excepia lui 0, ca rspuns la getint.
(initget (+ 1 2 4)) (setq response (getint "nEnter an integer: "))

Funcia getkword reface un cuvnt cheie de la utilizator bazat pe un ir de cuvinte cheie stabilite de funcia initget. Acest exemplu permite utilizatorului s raspund cu YES sau NO la cererea de comand. Un rspuns nul sau un return nu snt admise.
(initget 1 "Yes No") (getkword "nContinue? Yes/No: ")

136

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

21: BUCLARE

IN PROGRAM

n acest exerciiu: Vei consolida cunotinele despre bucle de program. Vei consolida cunotinele despre funcia cond. Vei folosi funcia repeat pentru a executa un set de s-expresii de un numr stabilit de ori. Vei scrie o funcie care cere utilizatorului numrul de buclri de program. Vei folosi instruciunea cond n cadrul buclei.

Etape de lucru
1. 2. 3. 4. 5. ncepei un desen nou n AutoCAD. Desenai un Cerc cu centrul n punctul 5,5 I o raz de o unitate. n editorul text, deschidei fiierul numit displace.lsp din directorul student. Creai funcia c:displace. Folosii codul n displace.lsp ca baz pentru funcie.
DISPLACE ar

trebui s execute urmtoarele:

S cear utilizatorului o incrementare a deplasrii. S cear utilizatorului de cte ori s execute deplasarea. S cear utilizatorului direcia de deplasare. S repete codul care restabilete ultima entitate desenat i care este vizualizat pe monitor i s o deplaseze cu un increment adecvat de un numr de ori.

continuare pe pagina urmatoare

97106266.doc R.2.1 5/16/2012

137

AUTODESK, INC.
;No null, zero or negative response allowed (initget (+ 1 2 4)) (setq increment (getdist "nIncrement for movement: ")) ;No null, zero or negative response allowed (initget (+ 1 2 4)) (setq number_of_times (getint "nNumber of times to displace: ")) ;No null response allowed, setup keywords for response (initget 1 "Up Down Right Left") (setq direction (getkword "nUp/Down/Left/Right: ")) (repeat number of times (command MOVE (entlast) (list 0.0 0.0 0.0) (cond ;match direction of movement... ((= direction "Up") ;based on keyword supplied by user (command (list 0.0 increment)) ) ((= direction "Down") (command (list 0.0 (- 0.0 increment))) ) ((= direction "Right") (command (list increment 0.0)) ) ((= direction "Left") (command (list (- 0.0 increment) 0.0)) ) ) (command "") ;second point of displacement... ;for MOVE command prompt

6. 7. 8.

Salvai fiierul text. ncrcati fiierul n AutoCAD. Activai comanda DISPLACE.

138

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Funcia while
Funcia repeat este cea mai simpl funcie de buclare util dac tii exact de cte ori trebuie s repetai evaluarea grupului de expresii anterioare intrrii buclei. Totui vei ntlni ocazii cnd vei dori s repetai ceva de un numr nedefinit de ori; adic numrul de repetiii nu poate fi determinat naintea intrrii n bucl. ntr-un astfel de caz, funcia while v d posibilitatea s repetai un set de expresii de cte ori este necesar pn ce valoarea unei expresii test se schimb.

Exemplu
(setq x 0) ;set initial value for test

(while (< x 10) ;while x is less than 10... (print x) ;print value of x... (setq x (+ 1 x)) ;add 1 to x and then... ) ;go back to test expression

Figura 40. Diagrama buclei functiei while

97106266.doc R.2.1 5/16/2012

139

AUTODESK, INC.

Pentru a iei dintr-o bucl while, valoarea expresiei test trebuie s fie egal cu nil. De aceea, dac expresia test este iniial t, valoarea expresiei test trebuie s se schimbe ca rezultat al unei atribuiri din cadrul corpului buclei.

Recapitulare
Buclele repet un set de expresii. Buclele pot repeta de un numr de ori prestabilit sau pn ce valoarea expresiei test este nil. Funcia repeat repet un set de expresii de un numr de ori stabilit. Funcia while repet un set de s-expresii pn ce expresia test este egal cu nil.

140

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

21: UTILIZAREA FUNCTIEI WHILE PENTRU BUCLARE IN PROGAM n acest exerciiu: Vei consolida cunotinele despre buclele de program din AutoLISP. Vei modifica o funcie existent de la exerciiul anterior. Vei crea un program care deseneaz dreptunghiuri multiple. Vei folosi funcia while.

Etape de lucru
1. n editorul de text, ncrcai fiierul rectangle.lsp. 2. Salvai fiierul ca mrectang.lsp n directorul student. 3. Facei modificri n fiier. 4. Modificai funcia c:rectangle pentru a cere utilizatorului s deseneze dreptunghiuri multiple n timpul unei singure secvene de funcionare. 5. Plasai corpul codului care cere colurile i deseneaz polilinia n cadrul unei funcii while. 6. Un rspuns nul, adic un return la cererea "first corner" va termina funcia. 7. Numii noua funcie c:mrectangle pentru "dreptunghiuri multiple". 8. Salvai fiierul. 9. ncrcai fiierul n AutoCAD. 10. Activai comanda MRECTANGLE.

97106266.doc R.2.1 5/16/2012

141

AUTODESK, INC.

iruri i tiprirea lor


n AutoLISP, orice serie de caractere alfanumerice aflate ntre ghilimele duble reprezint un ir text. irul poate include caractere speciale cum ar fi *, &, , % i .

Obiective
n acest capitol vei studia: Despre irurile text i valorile lor Cum s folosii caracterele de control n irurile text. Cum s luai iruri text de la utilizator. Cum s folosii comanda AutoCAD TEXT cu variabile AutoLISP-ul legate la iruri text. Diferenele dintre cele ase funcii de tiprire n AutoLISP. Cum s folosii funciile de tiprire.

Valorile irurilor text


irurile text se evalueaz pe sine, adic valoarea unui ir text este irul n sine.
Command: !"This is a string" "This is a string." Command: (setq x "This is a string.") "This is a string." Command: !x "This is a string."

Caractere de control
Caracterul "" precede un caracter de control n cadrul unui ir text. Caracterul care urmeaz imediat are o semnificaie special. n urmtorul tabel gsii caracterele de control cunoscute de asemenea i ca "escape codes" care snt recunoscute n cadrul irurilor AutoLISP.

142

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Cod " e n r t nnn caracter " caracter

Semnificatie

caracter escape caracter newline caracter return caracter tab Caracter al carui cod octal este nnn

Tabelul 2. Caractere de control n iruri

Funcia getstring
Funcia getstring ateapt ca utilizatorul s introduc un ir text. Are dou argumente opionale: suprim caracterul spaiu ca i return i un ir de la utilizator. Dac primul argument opional este furnizat i acesta nu este nil, atunci este posibil ca irul s conin spaii; primul spaiu din ir este tratat ca "return".

Exemplu
Introducei expresiile care urmeaz. Legai variabila txt de irul text "single".
Command: (setq txt (getstring "nEnter text: ")) Enter text: single "single"

Command: !txt "single"

Legai variabila txt de irul text n care s-au introdus spaii.


Command: (setq txt (getstring T "nEnter text: ")) Enter text: embedded spaces "embedded spaces"

Command: !txt "embedded spaces"

97106266.doc R.2.1 5/16/2012

143

AUTODESK, INC.

Variabila de sistem TEXTEVAL


Dac variabila de sistem TEXTEVAL este mai mare dect 0, putei rspunde la o cerere de comand TEXT sau DTEXT cu o variabil AutoLISP i comanda va tipri valoarea asignat variabilei; dac nu, comanda va tipri semnul exclamarii i numele variabilei. Comanda TEXT va tipri ntotdeauna valoarea unei variabile ir atunci cnd este apelat n cadrul unei funcii AutoLISP de tip command indiferent de setarea TEXTVAL. Comanda DTEXT nu poate fi apelat de funcia AutoLISP de tip command .

144

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
ntr-un desen nou introducei expresiile care urmeaz. Prima comand TEXT va tipri !txt1. A dou comand TEXT va tipri Second line. Vezi figura 18-1.
Command: (setq txt1 "First line.") "First line."

Command: (setq txt2 "Second line.") "Second line."

Command: text Justify/Style/<Start point>: 1,5 Height: 0.5 Rotation: 0 Text: !txt1

Command: (setvar "texteval" 1) 1

Command: text Justify/Style/<Start point>: Enter Text: !txt2

Figura 41. entitati tip text

97106266.doc R.2.1 5/16/2012

145

AUTODESK, INC.

Funciile de tiprire
Exist ase funcii de tiprire n AutoLISP. Cinci dintre ele tipresc iruri text iar una tiprete caractere text. Trei dintre aceste funcii tipresc orice fel de expresii indiferent dac acestea snt de tipul ir text. Funcia pentru caractere i patru dintre funciile de tip ir pot tipri nu numai ntr-un fiier dar i pe un monitor.
Functia prin1 princ print Argumente expr file-desc expr file-desc expr file-desc Descriere Tipareste expr si returneaza expr. Nu interpreteaza caracterele de control. Tipareste expr si returneaza expr. Interpreteaza caracterele de control La fel ca prin1, si in plus tipareste un newline inainte de expr si un spatiu dupa expr. Tipareste msg pe display si returneaza nil. Tipareste un caracter ASCII conform cu argumentul num pentru codul zecimal ASCII si returneaza numarul. Tipareste string fara quotes si returneaza string cu quotes. Asemanator cu princ.

prompt write-char

msg num file-desc

write-line

string file-desc

Table 3. Functii de tiparire

Intrarea i ieirea n/i dintr-un fiier incluznd i tiprirea ntr-un fiier vor fi discutate mai trziu n acest curs. Funcia prompt este folosit utilizatorului, pe afiaj. pentru tiprirea mesajelor destinate

Funcia print tiprete expresii ntr-o manier compatibil cu funcia load, n timp ce funcia princ le tiprete ntr-o manier compatibil cu funcia readline. Vei studia funcia read-line n capitolul destinat intrrii i ieirii ntr-un fiier mai trziu n acest curs. Funciile prin1, princ i print accept orice expresie ca argument i i va tipri valoarea. Funciile prompt i write-line accept numai argumente de tip ir.

146

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Recapitulare
irurile text snt caractere alfanumerice aflate ntre ghilimele duble. Caracterele de control din cadrul unui ir de tip text ncep cu un caracter "a". Funcia getstring primeste iruri interactiv de la utilizator. Variabila de sistem TEXTEVAL demonstreaz cum comanda AutoCAD TEXT va tipri o variabil AutoLISP. AutoLISP-ul dispune de o varietate de funcii de tiprire pentru diferite ntrebuinri.

97106266.doc R.2.1 5/16/2012

147

AUTODESK, INC.

EXERCITIUL

22: SIRURI DE TEXT SI FUNCTII DE TIPARIRE n acest exerciiu: Vei consolida cunotinele despre iruri de tip text i funcii de tiprire. Vei obine dou iruri text interactiv de la utilizator. Vei folosi irurile de tip text cu patru dintre funciile de tiprire.

Etape de lucru
1. 2. Intoducei expresiile care urmeaz. Legai cinci variabile de la a la d de diferite tipuri de date: numr ntreg, list, ir i ir care conine caractere de control.
Command: (setq a 1)

Command:(setq b '(1.0 1.0 0.0))

Command: (setq c (getstring "nString: ")) String: xyz "xyz"

Command: (setq d (getstring "nFile name: ")) File name: studentx.dwg "studentx.dwg"

3.

Folosii variabilele ca argumente la diferite funcii de tiprire. 4. Scriei valorile n casuele corespunzatoare din tabelul care urmeaz.
prin1 princ print prompt

Variabila a b c d

Tabelul 25. Variabile si functii de tiparire

148

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber in mod intenionat.

97106266.doc R.2.1 5/16/2012

149

AUTODESK, INC.

Accesul la entiti
Fiecrei entiti dintr-o sesiune de editare i este atribuit un nume de entitate de ctre AutoCAD. Numele unei entiti este un identificator unic al fiecrei entiti dintr-un desen. Numele unei entiti se poate schimba de la o sesiune de editare la alta, dar fiecare nume de entitate este unic determinat n timpul unei sesiuni de editare.

Obiective
n acest capitol vei studia: Cum s folosii numele de entiti pentru a stabili i modifica entitile individuale. Cum s aflai numele ultimei entiti adugate la desen. Cum s aflai numele primei entiti adugate la desen. Cum se pot trece n revist numele entitilor din desen. Cum s creai noi comenzi AutoCAD care acioneaz asupra numelor de entiti.

Funcii de acces la entiti


Numele de entiti pot fi stabilite de AutoLISP i entitile la care se refer pot fi modificate de AutoLISP. n acest capitol vei folosi funciile de acces la entiti din AutoLISP pentru a lucra cu entiti i grupuri de entiti. Aflai o entitate sau un grup de entiti. Activai o entitate cu o comand AutoCAD. Examinai proprietile unei entiti. Modificai proprietile unei entiti.
Descriere returneaza numele ultimei entitai adaugata in baza de date returneaza lista formata din numele entitaii si punctul in care a fost selectata entitatea returneaza prima entitate din baza de date returneaza numele entitaii in baza de date dupa argumentul ename

Functii de acces la entitati entlast entsel entnext entnext ename

Tabelul 26.Functii de acces a entitatilor

150

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Cum se afl numele ultimei entiti


Introducei comenzile i expresiile care urmeaz. ntr-un desen nou creai o entitate Line.
Command: line From point: 1,1 To point: 5,5 To point: Enter

Folosii funcia entlast pentru a stabili numele ultimei entiti adugate la desen, adic entitatea Line. (Numrul din numele entitii poate fi diferit pe computerul dumneavoastra).
Command: (entlast) <Entity name: 60000022>

Funcia entlast stabilete numele ultimei entiti principale netears din desen. Legai variabla numit ename de valoarea returnat de funcia entlast. Verificai legarea lui ename.
Command: (setq ename (entlast)) <Entity name: 60000022> Command: !ename <Entity name: 60000022>

Folosirea numelui unei entiti intr-o comand AutoCAD


Numele entitilor pot fi folosite ca argumente la funcia de tip command ori de cte ori o comand AutoCAD cere un set de selecie. n acest exemplu, numele entitii Line este furnizat ca argument la comanda AutoCAD ERASE.Aceasta expresie va terge entitatea Line.
Command: (command "erase" ename "")

Exemplu
Introducei expresiile i comenzile care urmeaz. Expresia AutoLISP va terge entitatea Line. Comanda U o va restabili.
Command: (command "erase" ename "") nil

97106266.doc R.2.1 5/16/2012

151

AUTODESK, INC.
Command: U GROUP

Aflarea numelui primei entiti Exemplu


Citii instruciunile i tiprii expresiile cu caractere aldine. n acelai desen, cu ajutorul entitii Line, creai o entitate Circle.
Command: circle 3P/2P/TTR/<Center point>: 5,5 Diameter/<Radius>: 1

5,5

1,1
Figura 42.Entitati tip linie si cerc

Folosii funcia entlast pentru a stabili numele ultimei entiti adugat la desen, entitatea Circle. (Numrul din numele entitaii poate fi diferit pe computerul dvs.).
Command: (entlast) <Entity name: 60000028>

Funcia entlast stabilete ultima entitate principal netears din desen; n acest caz entitatea Circle. Folosii funcia entnext pentru a extrage numele primei entiti din baza de date, adic, entitatea Line.

152

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Legai o variabil numit entname de valoarea returnat de entnext . Verificai legarea lui ename.
Command: (setq ename (entnext)) <Entity name: 60000022> Command: !ename <Entity name: 60000022>

Exemplu
Introducei expresiile care urmeaz. Aflai numele primei entiti din desen, entitatea Linie. Stergei-o. Restabilii-o cu comanda U.
Command: (setq ename (entnext)) <Entity name: 60000022> Command: (command "erase" ename "") nil Command: U ERASE

Aflai numele ultimei entiti din desen: entitatea Circle. Deplasai-o cu o unitate n directia X pozitiv din poziia iniial.
Command: (setq ename (entlast)) <Entity name: 60000028> Command: (command "move" ename "" "1,0" "") nil

97106266.doc R.2.1 5/16/2012

153

AUTODESK, INC.

5,5

1,1
Figura 23. Situatia dupa miscarea cercului cu o unitate in directia X pozitiva

Aducei cercul n poziia iniial.


Command: U MOVE

Baleierea bazei de date entitate cu entitate


Funcia entlast stabilete numele ultimei entiti din baza de date. Funcia entnext stabilete numele primei entiti din baza de date. Funcia entnext are un argument opional: numele unei entiti. n acest caz funcia entnext returneaz numele entitii care urmeaz dup argument n baza de date. Dac nu exist nici o entitate care se urmeze dup cea din numele argumentului entitaii, entnext returneaz nil. De exemplu acest set de expresii vor returna numele celei de a doua entiti din baza de date.

Command: (entnext (entnext)) <Entity name: 60000028>

sau
Command: (setq ename1 (entnext)) <Entity name: 60000022> Command: (setq ename2 (entnext ename1)) <Entity name: 60000028>

154

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Expresia care urmeaz ar terge atunci a doua entitate din baza de date.
Command: (command "erase" ename2 "")

Ar fi bine s se poat stabili numele tuturor entitilor din baza de date, pe rnd, pentru a le procesa una cte una. Funcia entnext poate face acest lucru cnd este plasat ntr-o bucl while mpreun cu instruciunile de procesare pentru entiti.

Recapitulare
Fiecare entitate dintr-un desen are un nume unic de entitate. Numele entitilor nu se schimb niciodat n timpul unei sesiuni de editare grafic, dar se pot schimba pe parcursul sesiunilor de editare grafic. AutoLISP dispune de funcii care returneaz entitii. numele

Funcia entlast returneaz numele ultimei entiti adugat la desen. Funcia entnext returneaz numele primei entiti adugat la desen sau numele entitii care urmeaz dup argumentul opional. Putei folosi entnext i o bucl while pentru a accesa fiecare entitate din desen. Numele entitilor pot fi folosite cu comenzi AutoCAD.

97106266.doc R.2.1 5/16/2012

155

AUTODESK, INC.

EXERCITIUL

23: ACCESAREA NUMELOR DE ENTITATI n acest exerciiu: Vei aprofunda cunotinele despre accesarea numelor de entiti. Vei crea o comanda MOVEALL care afl numele fiecrei entiti din baza de date, pe rnd, i deplaseaz fiecare entitate cu o unitate n X pozitiv. Vei folosi funciile entnext i while. Vei folosi numele entitilor i comanda AutoCAD MOVE.

Etape de lucru
1. Folosii editorul de texte pentru a salva urmtorul cod n fiierul numit moveall.lsp.

(defun c:moveall () (setq ename (entnext)) ;get first entity (while ename ;we have an entity? (command "._MOVE" ename "" "1,0" "") ;move it (setq ename (entnext ename)) ;get the next entity ) (prin1) ;quiet exit )

2. 3. 4. 5.

Desenai cteva entiti n desenul dvs. ncrcai fiierul moveall.lsp. Activai comanda MOVEALL. Urmrii deplasarea entitilor, cte una pe rnd.
Command: (load "moveall") C:MOVEALL Command: moveall

156

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

24: SCALAREA TUTUROR ENTITATILOR ACCESATE PRIN NUME n acest exerciiu: Vei aprofunda cunotinele despre accesarea numelor de entiti. Vei modifica funcia de la exerciiul 24. Vei folosi funciile entnext i while. Vei crea o comand care scaleaz fiecare entitate din desen. Vei tipri numrul de entitai scalate folosind un contor n cadrul unei bucle. Scaling entity 1. n zona liniei de

Aceste expresii vor tipri irul comand.


(setq counter 1)

(prompt (strcat "nScaling entity " (itoa counter) "."))

Etape de lucru
1. Deschidei fiierul text moveall.lsp. 2. Salvai textul ntr-un nou fiier numit scaleall.lsp. 3. Folosii codul din funcia c:moveall.lsp. 4. Modificai c:moveall. Numii noua funcie c:scaleall. Scalai fiecare entitate cu un factor (0.5) relativ fa de punctul origine 0,0. Adugai codul care tiprete n zona liniei de comand numrul de entiti modificate.
Command: scaleall Scaling entity 1. Scaling entity 2. Scaling entity 3.

5. ncrcai fiierul scaleall.lsp. 6. Activai comanda SCALEALL.

97106266.doc R.2.1 5/16/2012

157

AUTODESK, INC.

Liste asociate entitilor


Putei folosi numele unei entiti pentru a extrage toate elementele unei entiti. n AutoLISP un astfel de document este reprezentat print-o list asociat. Listele asociate cuprind subliste ale listelor obinuite sau perechi cu punct.

Obiective
n acest capitol vei studia: Formatul unei perechi cu punct sau cum s creai o astfel de pereche. Formatul unei liste asociate. Cum s extragei o list asociat unei entiti. Cum s examinai o lista asociat. Cum s determinai tipul entitii din lista asociat.

Perechi cu punct
O pereche cu punct este o form special a unei liste. O pereche cu punct este o list format din dou elemente a crei parte cdr din arborele binar se termin cu ultimul element al listei i nu cu nil. Att listele obinuite ct i perechile cu punct snt folosite n listele asociate entitilor pentru a reprezenta grupul de coduri DXF i valorile asociate acestora. Perechile cu punct conin ntotdeauna dou elemente. Primul element al unei perechi cu punct poate fi stabilit la fel ca i primul element al unei liste obinuite: cu funcia car. Al doilea element al perechii cu punct poate fi stabilit direct cu funcia cdr i acest lucru difer de modul n care se stabilete al doilea element dintr-o list obinuit.

Exemplu
Perechea cu punct care conine cele dou elemente 0 i "Line" arat astfel.
(0 . "LINE")

Ilustraia care urmeaz prezint arborii binari pentru dou obiecte similare: o list i o pereche cu punct, ambele coninnd aceleai elemente.

158

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

(0 "LINE") car cdr car

(0 . "LINE") cdr

0 car

("LINE") cdr

"LINE"

"LINE"

()

Figura 44. Arbori binari pentru lista obisnuita si pereche cu punct avind elemente identice.

Funcia cons
Funcia cons cere dou argumente obligatorii: o valoare care se adaug i o valoare la care se adaug. Dac valoarea care se adaug este un atom, atunci funcia cons returneaz o pereche cu punct a celor dou elemente. Dac valoarea la care se adaug este o lista, atunci funcia cons returneaz lista cu primul argument adugat n capul listei.

Exemplu
Introducei expresiile care urmeaz. Formai o list obinuit din elementele 0 i "Line".
Command: (setq xlist (list 0 "LINE")) (0 "LINE")

Formai o pereche cu punct din elementele 0 i "Line".


Command: (setq xdot (cons 0 "LINE")) (0 . "LINE")

Extragei primul element din list i din perechea punct cu car.


Command: (car xlist) 0

97106266.doc R.2.1 5/16/2012

159

AUTODESK, INC.

Command: (car xdot) 0

Extragei cel de-al doilea element din lista normal cu car i cdr.
Command: (car (cdr xlist)) "LINE"

Extragei cel de-al doilea element din list i din perechea punct cu car.
Command: (cdr xdot) "LINE"

Entiti nregistrate n baza de date i liste asociate


Modul n care AutoLISP-ul reprezint o entitate nregistrat n baza de date pentru o entitate desenat de tip Line de la 1,1 la 5,5 pe Layerul 0 este prezentat n continuare.
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0)

Entitatea nregistrat n baza de date este pstrat sub forma unei liste asociate. O list asociat este o list de liste. Primul element al fiecrei subliste este tipul acelei liste. Celelalte elemente reprezint datele asociate cu codul. De exemplu, codul din prima sublist este numrul ntreg -1. Data asociat este numele entitii. Codul din a dou sublist este numrul ntreg 0. Data asociat este tipul entitii; n acest caz, o entitate Line. Semnificaia codurilor 8,10 i 11 si datele lor snt uor de imaginat ce reprezint. Datele codului 210 snt reprezentate de sensul pozitiv al axei Z din sistemul de coordonate care conine entitatea.

Memorarea si extragerea formatelor


Prin convenie, datele dintr-o list asociat entitii pot fi extrase prin scoaterea cdr-ului unei subliste. Pentru aceasta, AutoLISP-ul folosete perechi cu punct n cazul sublistelor cu dou elemente i forme normale de liste n cazul sublistelor cu mai mult de dou elemente.

160

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

De exemplu, aceste expresii returneaz Layerul entitii Line i punctul de start.

Command: (cdr '(8 . "0")) "0" Command: (cdr '(10 1.0 1.0 0.0)) (1.0 1.0 0.0)

Coduri de Grup DXF


Codul fiecrei subliste dintr-o list asociat unei entiti corespunde unui cod de grup DXF. Documentaia despre aceste coduri exist n AutoCAD Release 12 AutoLISP Programmers Reference Manual, Appendix B. Exist mici diferene ntre codurile de grup dintr-un fiier DXF i codurile de grup returnate ntr-o list asociat unei entiti. n anexa din AutoLISP Programmers Reference Manual gsii lista corect a codurilor de grup pentru liste asociate entitilor. Acestea snt codurile listelor asociate entitilor (sau coduri de grup DXF) pentru entitatea Line.
Cod de group -1 0 8 10 11 210 Semnificatie Numele entitatii Tipul (Line, Circle, Arc, etc.) Layer Punct de start Punct final Directia pozitiva a axei Z de extruziune

Tabelul 27. Coduri de grup DXF si proprietatile entitailor

97106266.doc R.2.1 5/16/2012

161

AUTODESK, INC.

Extragerea unei entiti din baza de date cu funcia entget


Funcia entget cere un singur argument: numele unei entiti. Funcia va returna nregistrarea entitii sub forma unei liste asociate.

Exemplu
ncepei un desen nou i desenai o linie de la 1,1 la 5,5; tiprii expresiile care urmeaz.
Command: (setq ename (entnext)) <Entity name: xxxxxxxx> Command: (setq elist (entget ename)) ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0)) Command: !elist ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))

Extragerea datelor dintr-o list asociat


Funcia assoc cere dou argumente: valoarea unui cod i o list asociat. Dac funcia gsete o pereche pentru cod n lista asociat, atunci returneaz sublista corespunzatoare; dac nu, returneaz nil. Presupunei c variabila elist este legat de lista asociat n cazul entitii Line.
Command: (setq elist (entget (entnext))) ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0)) Command: !elist ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))

Aceast expresie va returna sublista care descrie layerul entitii.


Command: (assoc 8 elist) (8 . "0")

n aceast expresie, apelm cdr care returneaz layerul entitii.


Command: (cdr (assoc 8 elist)) "0"

162

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
Introducei expresiile care urmeaz. Asigurai-v c variabila elist este legat de lista asociat n cazul entitii Line.
Command: (setq ename (entnext)) <Entity name: xxxxxxxx> Command: !ename <Entity name: xxxxxxxx> Command: (setq elist (entget ename)) ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0)) Command: !elist ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))

Extragei tipul entitii, Layerul i punctul de start al sublistei din lista asociat.
Command: (assoc 0 elist) (0 . "LINE") Command: (assoc 8 elist) (8 . "0") Command: (assoc 10 elist) (10 1.0 1.0 0.0)

Apelai cdr pentru a extrage tipul entitii, Layerul i punctul de start din subliste.
Command: (cdr (assoc 0 elist)) "LINE" Command: (cdr (assoc 8 elist)) "0" Command: (cdr (assoc 10 elist)) (1.0 1.0 0.0)

97106266.doc R.2.1 5/16/2012

163

AUTODESK, INC.

Recapitulare
Perechile cu punct au dou elemente i snt forme speciale de liste. Al doilea element al perechii cu punct este returnat de cdr. Perechile cu punct snt folosite ca liste obinuite n listele asociate entitilor. Entitile nregistrate n baza de date snt reprezentate n AutoLISP sub forma de liste asociate. O lista asociat este o list de liste. Fiecare sublist dintr-o list asociat are dou pri: car i cdr. Partea car a unei liste asociate entitii este un cod de grup DXF care desemneaz o proprietate a entitii car este de asemenea denumit codul sublistei. Partea cdr a unei liste asociate entitii reprezint valoarea codului de grup DXF. Funcia assoc returneaz o sublista prin cutarea unui cod.

164

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

25: UTILIZAREA LISTELOR ASOCIATE ENTITATLOR n acest exerciiu : Vei consolida cunotinele despre listele asociate entitilor. Vei folosi funcia entget. Vei modifica funcia de la exerciiul 25. Vei crea o funcie care scaleaz numai entitile de tip Line din desen.

Etape de lucru
1. 2. 3. 4. 5. 6. 7. Deschidei fiierul text scaleall.lsp. Salvai textul ntr-un nou fiier scline.lsp. Schimbai numele funciei din c:scaleall n c:scline. Modificai funcia ca s scaleze numai entitile de tip Line din desen. Salvai fiierul. Desenai cteva tipuri de entiti n desen:.Lines, Circles and Arcs. Incrcai fiierul scline.lsp i activai comanda de tip Line vor fi scalate cu aceasta comand.
SCLINE.

Numai entitile

97106266.doc R.2.1 5/16/2012

165

AUTODESK, INC.

C:SCALEALL
(defun c:scaleall () (setq ename (entnext)) ;get first entity (setq counter 1) ;initialize counter (while ename ;we have an entity? (command "._SCALE" ename "" "0,0" "0.5");scale it (prompt ;tell user which one (strcat "nScaling entity " (itoa counter) ".n" ) ) (setq counter (1+ counter)) ;increment the counter (setq ename (entnext ename)) ;get the next entity ) (prin1) ;quiet exit )

C:SCLINE
(defun c:scline () (setq ename (entnext)) ;get first entity (setq counter 1) ;initialize counter (while ename ;we have an entity? (if ;if it's a Line... (= "LINE" (cdr (assoc 0 (entget ename))) ) (progn (command "._SCALE" ename "" "0,0" "0.5");scale it and... (prompt ;tell user which one (strcat "nScaling entity " (itoa counter) ".n" ) ) ) ) (setq counter (1+ counter)) ;increment the counter (setq ename (entnext ename)) ;get the next entity ) (prin1) ;quiet exit )

166

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

167

AUTODESK, INC.

Modificarea unei entiti


Modificarea unei entiti cu AutoLISP-ul are loc n dou etape. Modificai lista asociat unei entiti cu funcia subst. Actualizai entitatea prin aplicarea funciei entmod la noua list asociat.

Obiective
n acest capitol vei studia: Cum s modificai o list asociat unei entiti. Cum s actualizai nregistrarea unei entiti ntr-un desen pe baza schimbrilor din lista asociat.

Substituirea valorilor intr-o list asociat


Funcia subst nlocuiete un element dintr-o list. Funcia cere trei argumente: valoarea de substituire, valoarea de substituit ntr-o list i o list care conine valoarea de substituit. Putei folosi funcia subst pentru a nlocui o valoare ntr-o list asociat unei entiti. Iat un exemplu care ilustreaz modul cum funcioneaz funcia subst. Vom nlocui numrul 15 cu numrul 16 n lista noastr de ptrate de numere ntregi.
Command: (setq mylist (list 4 9 15)) (4 9 15) Command: !mylist (4 9 15) Command: (subst 16 15 mylist) (4 9 16) Command: !mylist (4 9 15)

Deoarece funcia subst este non-destructiv, ea nu va afecta legarea variabilei mylist. n acest exemplu funcia setq este adugat expresiei pentru a schimba legarea.
Command: (setq mylist (subst 16 15 mylist)) (4 9 16) Command: !mylist (4 9 16)

168

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
Introducei comenzile i expresiile care urmeaz. ntr-un desen nou, desenai o entitate Line de la 1,1 la 5,5.
Command: line From point: 1,1 To point: 5,5 To point: Enter

Folosii funcia subst pentru a schimba punctul de start al listei asociate entitii Line. Extragei sublista pentru punctul de start i pstrai-o sub forma unei variabile.
Command: (setq ename (entnext)) <Entity name: xxxxxxxx>) Command: (setq elist (entget ename)) ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0)) Command: (setq old_start (assoc 10 elist)) (10 1.0 1.0 0.0)

nlocuii vechiul punct de start cu unul nou de 7.5,2.5,0 i schimbai legarea variabilei elist.
Command: (setq new_start (list 10 7.5 2.5 0.0)) (10 7.5 2.5 0.0) Command: (setq elist (subst new_start old_start elist)) ( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 7.5 2.5 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0)) Command: (assoc 10 elist) (10 7.5 2.5 0.0)

97106266.doc R.2.1 5/16/2012

169

AUTODESK, INC.

Actualizarea unei entiti


Funcia entmod modific proprietile unei entiti cernd AutoCAD-ului s actualizeze entitatea pe baza modificrilor fcute n lista asociat entitii. Funcia entmod solicit un singur argument : o list valabil asociat entitii.

Exemplu
Folosii funcia entmod pentru a aplica modificrile la entitatea Line pe baza modificrilor fcute n copia listei asociate. Introducei expresiile care urmeaz.
Command: !elist ((-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 7.5 2.5 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0)) Command: (entmod elist) ((-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 7.5 2.5 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))

Punctul de start al entitii Line ar trebui s se deplaseze de la 1.0, 1.0, 0.0 la 7.5, 2.5, 0.0.
5,5,0

5,5,0

1,1,0

7.5,2.5,0

Figura 45. Linie inainte si dupa apelarea functiei entmod.

Recapitulare
O sublist dintr-o list asociat poate fi nlocuit cu funcia subst. Funcia entmod va actualiza nregistrarea unei entiti n baza de date pe baza modificrilor din lista asociat.

170

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

26: ACTUALIZAREA INREGISTRARII UNEI ENTITATI n acest exerciiu: Vei aprofunda cunotinele despre modificarea entitailor i despre listele asociate. Vei folosi funcia entmod. Vei modifica funcia de la exerciiul 26. Vei modifica listele asociate tuturor entitilor Line. Vei actualiza nregistrarea entitilor acestora.

Etape de lucru
Deschideti fiierul text scline.lsp. Salvai textul ntr-un fiier nou numit modline.lsp. Schimbai numele funciei din c:scline n c:modline. Modificai funcia. Dac entitatea este de tip Line, modificai-i punctul de capt din valoarea curent n punctul 5.0, 5.0, 0.0. Salvai fiierul. ntr-un desen nou, desenai cteva linii i cercuri n diferite poziii. ncrcai fiierul modline.lsp. Activai comanda MODLINE.

97106266.doc R.2.1 5/16/2012

171

AUTODESK, INC.

C:SCLINE
(defun c:scline () (setq ename (entnext)) ;get first entity (setq counter 1) ;initialize counter (while ename ;we have an entity? (if ;if it's a Line... (= "LINE" (cdr (assoc 0 (entget ename))) ) (progn (command "._SCALE" ename "" "0,0" "0.5");scale it and... (prompt ;tell user which one (strcat "nScaling entity " (itoa counter) ".n" ) ) ) ) (setq counter (1+ counter)) ;increment the counter (setq ename (entnext ename)) ;get the next entity ) (prin1) ;quiet exit )

C:MODLINE
(defun c:modline () (setq ename (entnext)) ;get first entity (setq counter 1) ;initialize counter (while ename ;we have an entity? (setq elist (entget ename)) ;get its assoc list (if ;if it's a Line... (= "LINE" (cdr (assoc 0 elist))) (progn (entmod ;change its end point (subst '(11 5.0 5.0 0.0) (assoc 11 elist) elist) ) (prompt ;tell user which one (strcat "nModifying entity " (itoa counter) ".n" ) ) ) ) (setq counter (1+ counter)) ;increment the counter (setq ename (entnext ename)) ;get the next entity ) (prin1) ;quiet exit )

Aceast pagin a fost lsat liber n mod intenionat.

172

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

27: ACTUALIZAREA TUTUROR ENTITATILOR DIMENSION INTR-UN DESEN Acesta este un exerciiu opional. n acest exerciiu: Vei aprofunda cunotinele despre modificarea entitilor i listele asociate. Vei scrie o funcie care s modifice toate entitaile de tip Dimmension din desen.

Etape de lucru
1. Deschidei fiierul grafic moddim.dwg n directorul student.

Figura 46. Desenul moddim.dwg.

2.

Dimensiunile din acest desen au fost amplasate pe cteva nivele diferite. Sarcina dvs. este s scriei un program AutoLISP care s caute toate entitile Dimension din acest desen i s le amplasai pe nivelul DIM . Fiierul program AutpLISP moddim.lsp din directorul student conine schia programului. Deschidei acest fiier cu editorul de text i adugai codul necesar pentru a completa programul.

3.

97106266.doc R.2.1 5/16/2012

173

AUTODESK, INC.

Selectarea numelui unei entiti prin selecie grafic cu cursorul


Un program AutoLISP poate extrage numele unei entiti cernd utilizatorului s selecteze o entitate.

Obiective
n acest capitol vei studia: Cum s extragei numele unei entiti interactiv cu utilizatorul. Cum s folosii funcia entsel. Cum s deplasai centrul cercului selectat de utilizator.

Funcia entsel
Funcia entsel v cere s selectai un singur obiect. Funcia returneaz o list cu dou obiecte: numele entitii i punctul n care a fost selectat; dac nu se selecteaz nimic atunci funcia returneaz nil. Putei extrage numele entitii din lista returnat de funcia entsel cu ajutorul funciei car.

Exemplu
Introducei expresiile care urmeaz. ntr-un desen nou , desenai o linie i un cerc.
Command: line From point: 1,1 To point: 5,5 To point: Enter Command: circle 3P/2P/TTR/<Center point>: 5,5 Diameter/<Radius>: 1

Selectai cercul n punctul 5,6,0 ca rspuns la cererea funciei entsel i legai valoarea returnat de variabila epick.
Command: (setq epick (entsel)) Select object: pick circle at 5,6,0 (<Entity name: xxxxxxxx> (5.0 6.0 0.0)) Command: !epick (<Entity name: xxxxxxxx> (5.0 6.0 0.0))

174

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Extragei numele entitii din lista returnat de funcia entsel i pstrai-l n variabila ename.
Command: (setq ename (car epick)) <Entity name: xxxxxxxx> Command: !ename <Entity name: xxxxxxxx>

tergei entitatea Circle.


Command: (command "._erase" ename "")

Recapitulare
Funcia entsel extrage o list a proprietilor unui obiect selectat de utilizator: numele entitii i punctul n care a fost selectat. Partea car a unei liste selectate de entsel reprezint numele unei entiti.

97106266.doc R.2.1 5/16/2012

175

AUTODESK, INC.

EXERCITIUL

28: SELECTAREA SI MODIFICAREA UNUI CERC n acest exerciiu: Vei consolida cunotinele despre selecia interactiv a entitilor. Vei crea un program care cere utilizatorului s selecteze o entitate Circle i un nou punct de centru care deplaseaz centrul cercului

Etape de lucru
1. n editorul de texte, deschidei fiierul text numit circen.lsp din directorul student. 2. Adugai codul care face urmatoarele: Definete funcia c:circen. Cere utilizatorului o entitate cu funcia entsel. Dac utilizatorul selecteaz o entitate, codul trimite lista asociat entitii ca argument la funcia circen_mod.

3. Salvai fiierul. 4. ncrcai programul n AutoCAD. 5. Verificai comanda CIRCEN ntr-un desen care conine cel puin un cerc.
(defun circen_mod (elist) (if (/= "CIRCLE" (cdr (assoc 0 elist))) ;is it a circle? (prompt "nNot a circle.") ;if not, exit (progn (setq old_cen (cdr (assoc 10 elist))) ;get current center (initget 1) ;no null reponse... ;for getpoint ;get new center (setq new_cen (getpoint old_cen "nCenter point: ")) (entmod ;modify the circle (subst (cons 10 new_cen) (assoc 10 elist) elist) ) ) ) )

176

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

29: PROBLEME OPTIONALE DE ACCES LA ENTITATI Acestea snt exerciii opionale pe care le putei completa n clas sau n afara clasei. Scriei un set de definiii de funcii.

c:movelast
Deplasai ultima entitate n baza de date. Cerei operatorului punctul de baz i al doilea punct al deplasrii.. Selectai fiecare entitate din desen, una dup alta. Tiprii fiecare tip i layer ale entitii n zona liniei de comand. Cerei operatorului s selecteze o entitate. Schimbai culoarea entitii n RED (reprezentat ntr-o list asociat de codul de grup 62 i numrul ntreg 1). Observai c putei aduga o nou sublist la lista asociat n loc s nlocuii o list existent folosind funcia entmod. O sublist de grup 62 nu este prezent ntr-o list asociat unei entiti dac culoarea entitii este BYLAYER. Cerei operatorului s selecteze o entitate. Cerei operatorului numele unui nivel. Schimbai nivelul entitii.

c:printent

c:red

c:chglayer

97106266.doc R.2.1 5/16/2012

177

AUTODESK, INC.

Tratarea erorilor
AutoLISP dispune de o metod pentru tratarea erorilor de program i de utilizare.

Obiective
n acest capitol vei studia: Cum s folosii funciile exit i quit pentru a fora o eroare AutoLISP. Cum s nlocuii rutina implicit AutoLISP de tratare a erorilor. Cum s utilizai rutina de tratare a erorilor pentru "a terge" un program dup ce a fost abortat din cauza unei erori sau pentru c utilizatorul a anulat programul. Cum s folosii comanda UNDO n rutina de tratare a erorilor.

Forarea unei erori


Funciile exit i quit realizeaz aceeai operaie, fr argumente. Funciile exit i quit foreaz aplicaia curent s se termine prin forarea unei erori AutoLISP. Ele returneaz irul "quit/exit abort" i transfer irul funciei de tratare a erorilor *error*. Dup executarea funciei de tratare a erorilor, AutoCAD-ul se ntoarce la linia de comand. O aplicaie poate folosi funciile exit i quit n combinaie cu o funcie de tratare a erorilor definit de utilizator pentru a opri propria-i execuie, pentru a reface orice valori necesare n AutoCAD i pentru a prezenta utilizatorului un mesaj adecvat.

Funcia *error*
Putei fi siguri c poziionarea unei variabile de sistem sau o anumit condiie AutoCAD pot fi restabilite dup apariia unei erori neateptate folosind funcia *error*. n cadrul acestei funcii care poate fi definit de utilizator putei evalua condiiile de eroare, putei returna un mesaj adecvat utilizatorului i puteti restabili setarea variabilelor AutoCAD. Parcurgei aceste etape pentru a implementa o subrutin de tratare a erorilor definit de utilizator pentru o comand. Salvai definiia curent a funciei *error*.

Definii o nou funcie *error* pentru comand sau funcie. Redefinii subrutina veche de tratare a erorilor prin comanda exit sau prin exit dintr-o nou subrutin de tratare a erorilor. Redefinirea rutinei de tratare a erorilor ar trebui fcut n contextul unei comenzi sau a unei funcii; plasai codul pentru a defini o rutin de tratare a erorilor n cadrul codului pentru comand. 178

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
Acest cod implementeaz comanda c:rectangle i propria-i rutin de tratare a erorilor.
(defun c:rectangle (/ pt1 pt2) (setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler (setvar "CMDECHO" old_cmdecho) ;restore system variable (if (/= "Function cancelled" msg) ;no message if user cancels (if (= msg "quit / exit abort") ;no message if program (princ) ;deliberately aborts (princ (strcat "nError: " msg));otherwise, print error for user ) (princ) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit )

(setq old_cmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) (setq pt1 (getpoint "nFirst corner: ")) (setq pt3 (getpoint "nOther corner: ")) (command "pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) (setvar "CMDECHO" old_cmdecho) (setq *error* old_error) ;restore default error handler ;if command is successful (prin1)

Dup cum vedei, AutoLISP-ul v permite s definii o funcie (adic s apelai funcia defun) n timpul executrii unei comenzi sau funcii definite de utilizator. Deci rutina de tratare a erorilor pentru funcia c:rectangle este definit de ndat ce utilizatorul apeleaz comanda RECTANGLE dar nu nainte de asta. Rutina AutoLISP, implicit de tratare a erorilor este refacut n toate cazurile: cnd comanda ajunge s fie ndeplinit cu succes sau la captul rutinei de tratare a erorilor cu comanda specific. Aceast tehnic v permite s adaptai rutina AutoLISP de tratare a erorilor pentru orice situaie. Rutina noastr de tratare a erorilor cu comand specific reface poziionarea original a variabilei de sistem CMDECHO n cazul n care Comanda RECTANGLE ntlnete o eroare n timpul execuiei. Variabila definit de
97106266.doc R.2.1 5/16/2012

179

AUTODESK, INC.

utilizator old_emdecho a fost facut global aa nct valoarea ei este accesibil noii funcii *error*.

180

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

30: DEFINIREA SI UTILIZAREA UNEI NOI SUBRUTINE DE TRATARE A ERORILOR n acest exerciiu: Vei aprofunda cunotinele despre modul cum se folosete o rutin de tratare a erorilor. Vei modifica funcia de la exerciiul 29.

Etape de lucru
1. 2. 3. 4. Adugai o rutin de tratare a erorilor pentru comanda CIRCEN n fiierul circen.lsp. Folosii exemplul de la c:rectangle ca o baz de la care s pornii. ncrcai programul n AutoCAD. Activai comanda CIRCEN i anulai-o cu Ctrl-C pentru a verifica rutina de tratare a erorilor.

97106266.doc R.2.1 5/16/2012

181

AUTODESK, INC.

UNDO i tratarea erorilor


Pentru a permite utilizatorului s anuleze ntr-o singur etap rezultatul unei comenzi pe baz de AutoLISP, amplasai un UNDO MARK la nceputul rutinei. Putei folosi rutina de tratare a erorilor pentru a anula automat rezultatele unei comenzi pe baz de AutoLISP pn la punctul unde a intervenit eroarea, admiind faptul ca UNDO CONTROL este setat pentru ONE sau ALL. Variabilele de sistem UNDOCTRL i UNDOMARKS pot fi examinate de un program AutoLISP pentru a determina ce aciune de anulare, dac exist vreouna, este adecvat pentru sesiunea curent AutoCAD.

Exemplu
Aceast definiie a comenzii RECTANGLE permite utilizatorului s anuleze rezultatele comenzii ntr-o singur etap. Instruciunea if testeaz dac UNDO este activat. Dac da, atunci d o comand UNDO MARK la nceputul rutinei. Dup ce utilizatorul introduce o comand RECTANGLE, utilizatorul poate anula rezultatul comenzii cu comenzile U sau UNDO BACK.
(defun c:rectangle (/ pt1 pt2) (setq old_cmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) (if (= 1 (logand 1 (getvar "UNDOCTL"))) (command "._UNDO" "_MARK") ) (setq pt1 (getpoint "nFirst corner: ")) (setq pt3 (getpoint "nOther corner: ")) (command "._PLINE" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "_C" ) (setvar "CMDECHO" old_cmdecho) ) (prin1)

182

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Exemplu
Extindem codul UNDO pentru a include rutina de tratare a erorilor. Dac rutina este anulat dintr-un motiv oarecare i UNDO este disponibil, rezultatul comenzii pn la punctul de eroare este anulat automat. Se seteaz o variabila de condiie pentru a fi examinat n rutina de tratare a erorilor. Un UNDO GROUP este activat n comand i corelat cu un UNDO END. NOTA Fiierul ai_utils.lsp, versiunea 12 din directorul support conine cteva rutine pentru folosirea codului UNDO ntr-un program AutoLISP. continuare pe pagina urmatoare

97106266.doc R.2.1 5/16/2012

183

AUTODESK, INC.
(defun c:rectangle (/ pt1 pt2) (setq old_cmdecho (getvar "CMDECHO")) ;store orignal command echo (setvar "CMDECHO" 0) ;turn off command echo (setq old_error *error*) (defun *error* (msg) (command) ;save default error handler ;define new error handler ;cancel any command n progress

(if rect_undo_flag ;if the undo flag is t... (progn (command "._UNDO" "_END") ;end the group... (command "._U") ;undo the command... (setq rect_undo_flag nil) ;and clear the flag ) ) (setvar "CMDECHO" old_cmdecho) ;restore system variable (if (/= "Function cancelled" msg) ;no message if user cancels (if (= msg "quit / exit abort") ;no message if program (princ) ;deliberately aborts (princ (strcat "nError: " msg));otherwise, print error for user ) (princ) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit

(if (= 1 (logand 1 (getvar "UNDOCTL")));if UNDO is on... (progn (command "._UNDO" "_GROUP") ;start an UNDO GROUP... (setq rect_undo_flag t) ;and set a flag ) (setq rect_undo_flag nil) ;else, clear the flag ) (setq pt1 (getpoint "nFirst corner: ")) (setq pt3 (getpoint "nOther corner: ")) (command "pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) (if rect_undo_flag ;if the flag is set... (progn (command "._UNDO" "_END") ;end the UNDO GROUP... (setq rect_undo_flag nil) ;and clear the flag ) ) (setvar "CMDECHO" old_cmdecho) ;reset original command echo

184

AUTODESK, INC. TRAINING


(setq *error* old_error) ;restore default error handler ;if command is successful (prin1) ;quiet exit )

LECTII DE BAZA AUTOLISP

97106266.doc R.2.1 5/16/2012

185

AUTODESK, INC.

Operaii cu fiiere
AutoLISP poate citi i scrie fiiere text de tip ASCII.

Obiective
n acest capitol vei studia: Ce este un descriptor de fiier i cum este folosit. Cum s deschidei un fiier pentru operaii de citire sau scriere. Cum s scriei linii de text ntr-un fiier deschis. Cum s citii linii de text dintr-un fiier deschis. Cum s descoperii sfritul unui fiier text. Cum s nchidei un fiier.

Funciile fiier I/O


Operaiile de citire i scriere ntr-un fiier sau operaii I/O ntr-un fiier se realizeaz cu ajutorul a dou funcii: read-line i write-line. Deschiderea i nchiderea fiierelor se realizeaz de asemenea prin dou funcii: open i close.

Deschiderea unui fiier


Funcia open cere dou argumente: numele unui fiier ce urmeaz a fi deschis i modul de deschidere a acestuia. Ambele argumente trebuie s fie iruri. Dac funcia open reuete, returneaz un descriptor de fiier. Dac eueaz, returneaz nil. Programul dvs. trebuie s pstreze descriptorul de fiier ntr-o variabil! Dac nu-l pstrai, nu vei putea citi, scrie sau nchide fiierul. Descriptorul de fiier este un argument obligatoriu pentru funciile care scriu n, citesc din/sau nchid fiierul. Exist trei tipuri valide de moduri de deschidere a unui fiier. Fiecare trebuie s fie reprezentat de o liter mic desparit prin semne de punctuaie.
Open mode "r" "w" Descriere Deschiderea fisierului pentru citire. Deschiderea fisierului pentru scriere. daca exista un fisier cu acelasi nume se va produce o suprascriere. Deschiderea fisierului pentru adaugare. daca exista un fisier cu acelasi nume, va fi adaugat la sfirsitul acestuia.

"a"

Tabelul 28. Moduri de a deschide un fiier.

186

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

De exemplu, aceast expresie deschide un fiier numit test.txt. pentru o operaie de scriere.
Command: (setq fp (open "test.txt" "w")) <File: #xxxxx> Command: !fp <File: #xxxxx>

Scrierea ntr-un fiier


Funcia write-line va scrie un ir de text ntr-un fiier deschis. Aceast funcie cere dou argumente: un ir de tip text i un descriptor de fiier. Al doilea argument este opional; dac nu este introdus, funcia write-line va scrie irul pe display. Presupunei c variabila fp este legat de un descriptor de fiier valid returnat prin deschiderea unui fiier pentru o operaie de scriere. Aceste expresii scriu dou linii de text ntr-un fiier.
Command: (write-line "First line." fp) "First line." Command: (write-line "Second line." fp) "Second line."

nchiderea unui fiier


Trebuie s nchidei fiierul imediat dup operaii de scriere, citire sau adugare. Dac nu-l inchidei, resursele sistemului dvs. vor fi limitate, n particular numrul de handlere de fiiere disponibil. Funcia close va nchide un fiier deschis. Funcia cere un argument: un descriptor de fiier valid. Funcia returneaz nil. Aceast expresie va nchide fiierul deschis i n care s-a scris n cele dou exemple anterioare.
Command: (setq fp (close fp))

Deoarece descriptorul de fiier fp nu mai este valid dup ce fiierul la care se refer este nchis, de exemplu dac se seteaza fp la nil este echivalent cu a nchide fiierul. Se elibereaz astfel memoria i se obine asigurarea c fp nu poate fi folosit n afara contextului.

Exemplu
Introducei expresiile care urmeaz. Deschidei un fiier, scriei cteva linii de text n fiier i nchidei fiierul. Examinai fiierul cu editorul de text dup ce a fost nchis. Deschidei un fiier numit test.txt pentru o operaie de scriere.
Command: (setq fp (open "test.txt" "w")) <File: #xxxxx>

97106266.doc R.2.1 5/16/2012

187

AUTODESK, INC.
Command: !fp <File: #xxxxx>

Scriei cteva linii de text ntr-un fiier.


Command: (write-line "Coders" fp) "Coders" Command: (write-line "of the" fp) "of the" Command: (write-line "Lost Spark" fp) "Lost Spark"

nchidei fiierul.
Command: (setq fp (close fp)) nil Command: !fp nil

Deschidei fiierul test.txt n editorul text i examinai-l. Ar trebui s conin trei linii de text.
Coders of the Lost Spark

188

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Deschiderea unui fiier pentru o operaie de citire


Cnd deschidei un fiier pentru o operaie de citire, putei citi datele din fiier, linie cu linie. Nu putei modifica sau scrie ntr-un fiier care a fost deschis pentru o operaie de citire. (Dac vrei s introducei date n fiier, nchidei-l i redeschidei-l pentru o operaie de scriere.) Funcia open apelat cu un argumenr "r" returneaz un descriptor de fiier dac fiierul specificat exist; dac nu, returneaz nil. Funcia read-line citete o linie de text dintr-un fiier. Cere un argument opional: un descriptor de fiier valid pentru un fiier care a fost deschis pentru o operaie de citire. Dac argumentul nu este adugat, funcia read-line citete intrarea de pe tastatur. Funcia read-line returneaz o linie de text pe care o citete dintr-un fiier. Funcia read-line returneaz nil dac ajunge la captul fiierului. Funcia read-line ncepe cu prima linie de text dintr-un fiier. O apelare ulterioar a funciei read-line va face ca funcia s citeasc urmtoarea linie de text din fiier i aa mai departe.

97106266.doc R.2.1 5/16/2012

189

AUTODESK, INC.

Exemplu
Introducei expresiile care urmeaz. n acest exemplu se presupune c ai creat cu succes fiierul text.txt din exerciiul anterior. Deschidei fiierul test.txt pentru o operaie de citire.
Command: (setq fp (open "test.txt" "r")) <File: #XXXX>

Command: !fp <File: #XXXX>

Citii prima, a dou i a treia linie din fiier.


Command: (read-line fp) Coders Command: (read-line fp) "of the"

Command: (read-line fp) "Lost Spark"

ncercai s citii pn la sfritul fiierului. Funcia read-line va returna nil.


Command: (read-line fp) nil

nchidei fiierul.
Command: (setq fp (close fp)) nil Command: !fp nil

190

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Recapitulare
Un descriptor de fiier este un pointer al unui fiier returnat de funcia open. Un program trebuie s pstreze un descriptor de fiier pentru a avea acces la fiierul pe care l-a deschis. Fiierele pot fi deschise pentru operaii de citire, scriere i adugare. Argumentele pentru modul de deschidere a fiierelor la funcia open trebuie s fie litere mici. Un fiier poate fi deschis numai pentru o singur operaie. Funciile write-line i read-line scriu i citesc din fiiere. Funcia read-line returneaz nil cnd ajunge la captul fiierului.

97106266.doc R.2.1 5/16/2012

191

AUTODESK, INC.

EXERCITIUL

31: COPIEREA UNUI FISIER TEXT Avei 30 de minute la dispoziie s terminai acest exerciiu; este un program vast. Avei nevoie de timp ca s revizuii i s nelegeti codul i de asemenea s introducei textul surs.

n acest exerciiu: Vei aprofunda cunotinele despre fiiere I/O n AutoLISP. Vei crea un program AutoLISP pentru citit fiiere text de tip ASCII i pentru copiat fiiere ntr-un fiier cu nume diferit. Vei deschide fiiere att pentru citit ct i pentru scris.

Instruciuni
1. Introducei codul care urmeaz ntr-un document nou din editorul text. 2. Salvai fiierul n directorul student sub numele de copyfile.lsp. 3. Aceast funcie folosete o rutin de tratare a erorilor cu apelare asemntoare cu cea din exerciiul precedent. Varibilele legate de descriptoarele de fiier au fost definite global aa nct rutina de tratare a erorilor le poate nchide dac este necesar. 4. ncrcai copyfile.lsp n AutoCAD. 5. Activai comanda COPYFILE. 6. ncercai s copiai dou fiiere text. 7. Depanai programul dac este necesar.

continuare pe pagina urmatoare

192

AUTODESK, INC. TRAINING


(defun c:copyfile (/ r_fp_name w_fp_name r_fp_line) ; r_fp source file descriptor ; w_fp destination file descriptor ; r_fp_name source file name ; w_fp_name destination file name ; r_fp_line source file text line (setq old_error *error*) ;save default error handler

LECTII DE BAZA AUTOLISP

(defun *error* (msg) ;define new error handler (if ;close source file if open r_fp (setq r_fp (close r_fp)) ) (if ;close destination file if open w_fp (setq w_fp (close w_fp)) ) (if (/= "Function cancelled" msg) ;no message if user cancels (if (= msg "quit / exit abort") ;no message if program deliberately (princ) ;aborts (princ (strcat "nError: " msg));otherwise, print error for user ) (princ) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit ) ;get source file from user with dialogue (setq r_fp_name (getfiled "Select Source File" "" "txt" 0)) ;if source file returned, get destination file from user (if r_fp_name (setq w_fp_name (getfiled "Destination File" "" "txt" 1)) ) ;check that we got good values for both file names ;exit if not (if (or (not r_fp_name) (not w_fp_name) ) (progn (prompt "nMust specify both source and destination file.") (exit) ) )

continuare pe pagina urmatoare

97106266.doc R.2.1 5/16/2012

193

AUTODESK, INC.
;check that file names are different ;exit if not (if (= r_fp_name w_fp_name) (progn (prompt "nSource same name as destination file.") (exit) ) ) ;open source file for read ;exit if it fails (if (not (setq r_fp (open r_fp_name "r"))) (progn (prompt "nCould not open source file.") (exit) ) ) ;open destination file for read ;close source file and exit if it fails (if (not (setq w_fp (open w_fp_name "w"))) (progn (setq r_fp (close r_fp)) (prompt "nCould not open destination file.") (exit) ) ) ;get first line from source file (setq r_fp_line (read-line r_fp)) ;write source line to destination file and get next... ;source line until end of file is reached (while r_fp_line (write-line r_fp_line w_fp) (setq r_fp_line (read-line r_fp)) ) ;close the source and destination files (setq r_fp (close r_fp)) (setq w_fp (close w_fp)) ;restore original error handler

194

AUTODESK, INC. TRAINING


(setq *error* old_error) (prin1) ;quiet exit

LECTII DE BAZA AUTOLISP

97106266.doc R.2.1 5/16/2012

195

AUTODESK, INC.

Aceast pagin a fost lsat liber n mod intenionat.

196

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL32: CITIREA UNUI FISIER TEXT SI CREAREA ENTITATII

TEXT

Acesta este un exerciiu opional. Dac terminai cu comanda COPYFILE putei continua cu acest exerciiu opional. Funcia c:iotext v arat cum s citii un fiier text de pe disc i s scriei textul sub form de entitai text AutoCAD. Acesta este un subset de faciliti inclus n ACAD R 12 din cadrul fiierului asctext.lsp.

Etape de lucru
1. Deschidei un nou fiier n editorul text. 2. Introducei codul care urmeaz i salvai-l ntr-un fiier numit iotext.lsp. 3. ncrcai fiierul n AutoCAD. 4. Activai comanda IOTEXT.

Un singur lucru trebuie s schimbai: cerei utilizatorului s pun spaii ntre linii n loc s scaleze mereu nlimea textului cu 1.5.

continuare pe pagina urmatoare

97106266.doc R.2.1 5/16/2012

197

AUTODESK, INC.
; Iotext.lsp ; ; Command function IOTEXT prompts for the name of a text file. ; It reads each line of the file and draws the corresponding Text ; entities n AutoCAD. ; ; It prompts for the height, rotation angle and insertion point ; of the text. Text is always drawn left-justified. (defun dtr (d) (/ (* d pi) 180.0) ) (defun rtd (r) (/ (* r 180.0) pi) ) (defun C:IOTEXT() (setq old_cmdecho (getvar "CMDECHO")) ;save old command echo (setvar "CMDECHO" 0) ;turn off command echo (setq old_error *error*) ;save default error handler ;convert degrees to radians

;convert radians to degrees

(defun *error* (msg) ;define new error handler (if ;close source file if open io_fp (setq io_fp (close io_fp)) ) (setvar "CMDECHO" old_cmdecho) ;restore command echo (if (/= "Function cancelled" msg) ;no message if user cancels (if (= msg "quit / exit abort") ;no message if program deliberately (princ) ;aborts (princ (strcat "nError: " msg));otherwise, print error for user ) (princ) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit ) (setq io_fp_name ;name of text file to read (getfiled "Select Text File" "" "txt" 0) ) (if (= io_fp_name nil) (exit) ) ;if the file dialogue is canceled ;then exit

198

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

continuare pe pagina urmatoare

97106266.doc R.2.1 5/16/2012

199

AUTODESK, INC.
(if ;if we can't open file then exit (not (setq io_fp (open io_fp_name "r"))) (progn (prompt "nCan't open file for input.") (exit) ) ) (initget 1) ;no null (setq ;text insertion point io_ins_pt (getpoint "nInsertion point: ") ) (initget (+ 1 2 4)) ;no null, zero, negative # (setq ;text height io_txt_ht (getdist io_ins_pt "nHeight: ") ) (setq io_txt_rot ;text rotation angle (getangle io_ins_pt "nRotation: ") ) (if ;if null response to rotation (not io_txt_rot) ;prompt, set it to 0.0 (setq io_txt_rot 0.0) ) (setq ;set line spacing distance io_line_spacing (* io_txt_ht 1.5) ) (setq ;set line spacing angle io_spacing_rot (- (dtr io_txt_rot) (/ pi 2)) ) (setq io_fp_line (read-line io_fp)) ;read line from file ;while we have a line of text from the file, draw a Text entity ;in AutoCAD. Set the next Text entity insertion point. Get the ;next line of text from the file. (while io_fp_line (command "text" io_ins_pt io_txt_ht io_txt_rot io_fp_line) (setq io_ins_pt (polar io_ins_pt io_spacing_rot io_line_spacing)) (setq io_fp_line (read-line io_fp)) ) (setq io_fp (close io_fp)) ;close file

(setvar "CMDECHO" old_cmdecho) ;restore command echo (setq *error* old_error) ;restore default error handler (prin1) ;quiet exit )

200

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Seturi de selecie
AutoCAD-ul poate aeza grupuri de entiti n seturi de selecie. Comenzile AutoCAD i funciile AutoLISP pot aciona asupra unui set de selecie i facnd aceasta, poate aciona global asupra grupului de entiti din setul de selecie.

Obiective
n acest capitol vei nva: Cum s creai un set de selecie. Cum s folosii un set de selecie cu comenzi AutoCAD. Cum s creai un set de selecie interactiv, cu fereastr, cu filtru i prin selectarea tuturor componentelor dintr-un desen. Cum s aflai lungimea numrului de entiti ntr-un set de selecie. Cum s lucrai cu nume de entiti ntr-un set de selecie.

Note n legtur cu seturile de selecie


Un set de selecie n AutoLISP reprezint un tip unic de date numit PICKSET, alctuit dintr-o colecie de nume de entiti. Setul de selecie nu este o list. AutoLISP poate pstra maximum 128 de seturi de selecie deschise odat (numrul ar putea fi mai mic pentru un sistem dat). Legai ntotdeauna o variabil de un set de selecie pe care l creai sau modificai; altfel nu avei acces la setul de selecie i nici o cale de a elibera resursele sistemului consumate de setul de selecie pn ce nu ieiti din AutoCAD. Cnd ai terminat cu o variabil atribuit setului de selecie, este bine s setai variabila pe nil pentru a elibera resursele folosite de setul de selecie.

97106266.doc R.2.1 5/16/2012

201

AUTODESK, INC.

AutoLISP dispune de o varietate de funcii pentru a crea i manipula seturile de selecie. Acest capitol descrie funcionalitatea i arat exemple de funcii ssget, sslength i ssname.
Functia ssget ssadd ssdel sslength ssmemb ssname Creaza un set de selectie Adauga o entitate la un set de selectie Sterge o entitate dintr-un set de selectie Determina numarul de entitati dintr-un set de selectie Verifica daca fiecare entitate este parte a setului de selectie Extrage numele entitatilor din setul de selectie Operatia

Tabelul 29. Functii pentru seturi de selectie

Crearea unui set de selecie


Funcia ssget include virtual toate seturile de selecie interactive, cuprinznd metode care snt disponibile n AutoCAD la mesajul Select objects:. Sintaxa complet i numrul de aplicaii ale funciei snt prea complicate pentru a fi descrise aici n ntregime. De aceea ne vom concentra atenia asupra ctorva dintre formele de sintax cele mai folosite i vom lsa descrierea complet n seama manualului AutoLISP Programmers Reference Manual.
Sintaxa functiei (ssget) Operatia Select objects standard:cererea permite utilizatorului selecia interactiva " Selecteaza toate entitaile din desen Selecteaza toate entitaile din fereastra de la 1,1,0 la 11,8,0 Selecteaza toate entitaile Line din desen

(ssget "X") (ssget "W" '(1.0 1.0 0.0) '(11.0 8.0 0.0)) (ssget "X" '((0 . "LINE"))) Tabelul 30.Sintaxa si operaiile functiei ssget.

Exemple de lucru
Deschidei desenul ssget.dwg n directorul student. Vei folosi acest desen pentru urmtoarele patru exemple care arat cum s folosii ssget.

202

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Selecia interactiv
Funcia ssget apelat fr argumente va genera cererea standard "select objects:" n zona liniei de comand i va permite utilizatorului s selecteze obiecte interactiv. Cnd utilizatorul termin procesul de selecie cu tasta Return sau Space, funcia ssget returneaz valoarea ei sub forma unui nou set de selecie.

Exemplu
Cnd v aflai n desenul ssget.dwg, introducei expresiile care urmeaz. Folosii ssget pentru a cere utilizatorului s selecteze obiecte.
Command: (setq ss1 (ssget)) Select objects: pick several objects Select objects: Enter <Selection set: 1>

Verificai tipul de date ale variabilei ss1.


Command: !ss1 <Selection-set: 1> Command: (type ss1) PICKSET

Folosii setul de selecie pentru care variabila ss1 este legat n cadrul comenzii AutoCAD.
Command: erase Select objects: !ss1 Select objects: Enter

Refacei obiectele terse.


Command: oops

97106266.doc R.2.1 5/16/2012

203

AUTODESK, INC.

Selectarea componentelor dintr-un desen


Funcia ssget apelat cu un singur argument, irul "X", va returna un set de selecie compus din entitile componente din desen. Aceast funcie include entitile care nu snt afiate pe monitor i entitaile de pe layere care snt ngheate i/sau nchise.

Exemplu
Cnd sntei n desenul ssget.dwg, introducei expresiile care urmeaz. Folosii funcia ssget pentru a crea un set de selecie format din toate entitile din desen.
Command: (setq ss1 (ssget "X")) <Selection set: 2>

tergei toate obiectele din desen.


Command: (command ".erase" ss1 "")

Refacei obiectele terse.


Command: oops

Selectarea componentelor dintr- o fereastr


Putei apela funcia ssget cu un argument de tip ir care corespunde oricrei opiuni standard la cererea "select objects:", opiuni cum ar fi "W" pentru entitile incluse n fereastr, "C" pentru entitaile care traverseaz sau snt incluse n fereastr i "F" pentru entiti care intersecteaz o polilinie de selecie.

Exemplu
Cnd sntei n desenul ssget.dwg, introducei expresiile care urmeaz. Creai un set de selecie din entiti care aparin unei ferestre definit de punctele 6,3,0 i 11,8,,0.
Command: (setq ss1 (ssget "W" '(6 3 0) '(11 8 0))) <Selection set: 3>

tergei toate entitile care se afl n interiorul ferestrei.


Command: (command ".erase" ss1 "")

Refacei toate entitile terse.

204

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Selectarea cu filtru
Funcia ssget v permite s selectai entitile prin filtru. Putei filtra n acord cu oricare dintre proprietile entitilor care snt pstrate n coduri de grup DXF n cadrul listelor asociate entitilor. O list filtru este asemntoare cu o list asociat entitii. Implicit, o entitate trebuie s corespund fiecrei proprieti din filtru pentru a putea fi adugat la setul de selecie. Exist i alte metode de creare a listelor de tip filtru. Comanda AutoCAD FILTER definit de fiierele filter.lsp i filter.dcl este n general o interfa bazat pe dialog la funcia ssget i listele de tip filtru.

Exemplu
Cnd v aflai n desenul ssget.dwg, introducei expresiile care urmeaz. Creai un set de selecie format din entitile de tip Line din desen.
Command: (setq ss1 (ssget "X" '((0 . "LINE")))) <Selection set: 4>

tergei toate entitile de tip Line din desen.


Command: (command ".erase" ss1 "")

Refacei obiectele terse.


Command: oops

Setai variabila ss1 pe nil i eliberai resursele folosite curent de setul de selecie.
Command: (setq ss1 nil) nil

97106266.doc R.2.1 5/16/2012

205

AUTODESK, INC.

Lungimea unui set de selecie


Funcia sslength cere un singur argument: un set de selecie valid. Funcia returneaz numrul de nume al entitilor din setul de selecie.

Exemplu
Cnd v aflai n desenul ssget.dwg, introducei expresiile care urmeaz. Creai un set de selecie din trei (3) entiti.
Command: (setq ss1 (ssget)) Select objects: pick three objects Select objects: Enter <Selection set: 5>

Folosii funcia sslength pentru a verifica numrul de entiti din setul de selecie.
Command: (sslength ss1) 3

Setai variabila ss1 pe nil i eliberai resursele folosite curent de setul de selecie.
Command: (setq ss1 nil) nil

206

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Numele entitilor dintr-un set de selecie


Un set de selecie este un grup format din nume de entiti AutoCAD. Funcia ssname poate stabili numele oricrei entiti dintr-un set de selecie. Funcia ssname cere dou argumente: un set de selecie valid i un numr ntreg. Numrul ntreg corespunde unui index 0 al numelui entitii din setul de selecie.

Exemplu
Cnd v aflai n desenul ssget.dwg, introducei expresiile care urmeaz. Creai un set de selecie din trei entiti.
Command: (setq ss1 (ssget)) Select objects: pick three objects Select objects: Enter <Selection set: 6>

Folosii ssname pentru a returna numele fiecrei entiti din setul de selecie. Folosii entget pentru a returna lista asociat fiecrei entiti.
Command: (setq ename (ssname ss1 0)) <Entity name: xxxxxxxx>

Command: (entget ename)

Command: (setq ename (ssname ss1 1)) <Entity name: xxxxxxxx>

Command: (entget ename)

Command: (setq ename (ssname ss1 2)) <Entity name: xxxxxxxx>

Command: (entget ename)

Setai variabila ss1 pe nil i eliberai resursele folosite curent de setul de selecie.
Command: (setq ss1 nil) nil

97106266.doc R.2.1 5/16/2012

207

AUTODESK, INC.

Recapitulare
Grupurile de entiti pot fi plasate n seturi de selecie. Un set de selecie n AutoLISP are un tip de date PICKSET. Setul de selecie nu este o list. AutoLISP poate menine 128 de seturi de selecie deschise n acelai timp. Legai o variabil ori de cte ori creai un set de selecie.

Eliberai ntotdeauna resursele folosite de un set de selecie dup ce ai terminat de lucrat cu acesta. Funcia ssget poate crea un set de selecie n diferite moduri. Funcia sslength returneaz numrul de entiti din setul de selecie. Funcia ssname returneaz numele entitii din setul de selecie.

208

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL33: CREAREA INTERACTIVA A SETURILOR DE SELECTIE

n acest exerciiu: Vei aprofunda cunotinele despre seturile de selecie din AutoLISP. Vei folosi funcia ssget. Vei obine un set de selecie interactiv de la utilizator.

Vei accesa entitile dintr-un set de selecie.

Etape de lucru
1. Deschidei fiierul grafic moddim.dwg din directorul student. 2. n editorul de text deschidei fiierul numit chdim.lsp din directorul student. 3. Adugai codul care realizeaz urmtoarele: Creai o funcie numit c:chdim. Cerei utilizatorului un set de selecie. Explorai fiecare entitate din setul de selecie. Transferai ficare list asociat entitii ca argument la funcia chdim_mod.

1. 2. 3. 4.

Eliberai setul de selecie. Salvai fiierul chdim.lsp. ncrcai fiierul n AutoCAD i ncercai comanda CHDIM. Ieii din desen moddim fr a salva modificrile. Dac avei timp v putei modifica programul astfel: Adugai o rutin de tratare a erorilor. Adugai un dicionar de date. Transformai variabilele corespunztoare mai degrab n variabile locale dect n variabile globale.

(defun chdim_mod (elist) (if ;if entity is a dimension... (= "DIMENSION" (cdr (assoc 0 elist))) (entmod ;modify it based on... (subst (cons 8 "DIM") ;substituting layer DIM... (assoc 8 elist) ;for its current layer. elist ) ) ) )

97106266.doc R.2.1 5/16/2012

209

AUTODESK, INC.

EXERCITIUL

34: SETURI DE SELECTIE CU FILTRU Acesta este un exerciiu opional. Rezolvai acest exerciiu numai dac avei timp n clas. Codul care urmeaz, implementeaz o versiune a CHDIM care este din punct de vedere funcional echivalent cu versiunea anterioar. Aceast versiune folosete un filtru pentru set de selecie n combinaie cu o selecie interactiv de entiti cu scopul de a amplasa numai entitile de tip dimension n setul de selecie.

Etape de lucru
1. Deschidei fiierul grafic moddim.dwg din directorul student. 2. Creai un nou fiier n editorul text numit chdim2.lsp. 3. Introducei codul care urmeaz. Acest cod creaz funcia c:chdim2. CHDIM2 va cere utilizatorului un set de selecie, va filtra toate entitile cu excepia entitilor de tip dimension i va schimba entitile pe layerul DIM.

(defun c:chdim2 () ;get a selecion-set from user and filter out all but dimensions (setq ss (ssget X((0 . "DIMENSION")))) (if (not ss) (exit) ) ;if no selecion-set, exit

;change the layer (command "._chprop" ss "" "LA" "DIM" "") (setq ss nil) (prin1) ) ;free selecion-set ;quiet exit

4. Salvai fiierul chdim2.lsp. 5. ncrcai fiierul n AutoCAD. 6. Activai comanda CHDIM2. 7. Prsii desenul moddim fr s facei modificri.

Tabele i nume de simboluri


210

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Tabelele pstrez lista AutoCAD-ului cu nume de simboluri cum ar fi : layere, definiii Block i tipuri de linii.

Obiective
n acest capitol vei studia: Tipuri diferite de tabele ntr-un fiier grafic AutoCAD. Cum s citii fiecare intrare ntr-un tabel AutoCAD. Cum s cutai o intrare anume ntr-un tabel AutoCAD.

Tabele ntr-un desen


AutoCAD are 8 tabele diferite care pot fi accesate de AutoLISP.

Block Dimstyle Layer Ltype Style UCS View Vport

Fiecare tabel poate fi citit direct din AutoLISP. Fiecare n parte poate fi accesat secvenial sau accesat pentru un nume de simbol dat. Funciile AutoLISP care acceseaz tabelele AutoCAD pot extrage datele asociate cu o tabel dar nu pot modifica o tabel sau datele sale.

Cutarea secvenial a tabelului layer


Funcia tblnext scaneaz un tabel i returneaz o list asociat care conine datele unui obiect denumit din tabel sau returneaz nil dac ultima instruciune din tabel a fost atins. Funcia tblnext are o sintax ciudat. Funcia cere un argument: un ir care corespunde unuia dintre numele de tabele AutoCAD. Dac se adaug al doilea argument opional i acesta nu este nil, atunci funcia tblnext returneaz primul nume de simbol din tabel; dac nu se adaug argumentul, funcia returneaz simbolul cerut care l urmeaz pe cel returnat prin apelarea anterioar a funciei tblnext .

Exemplu
Aceast expresie returneaz lista asociat pentru prima intrare n tabelul layer.
Command: (tblnext "LAYER" t) ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))
97106266.doc R.2.1 5/16/2012

211

AUTODESK, INC.

Lista asociat este o list cu perechi cu punct, a crei cod este realizat n acelai mod n care snt realizate codurile pentru liste asociate entitilor. Deoarece nu lucrm cu entiti individuale, este clar c aceast list asociat nu are un grup -1 reprezentnd un nume de entitate. Vezi anexa B din AutoLISP Programmers Reference Manual, "Block and Table Group Codes", pentru o descriere complet a codurilor din lista asociat layerelor.

Exemplu
Dac un desen ar conine layerele din tabelul de mai jos, atunci s-expresiile care urmeaz ar returna listele asociate artate mai jos.
Layer 0 DIM HIDDEN OBJECT Stare Dezghetat, On Dezghetat, Off Inghetat, Off Dezghetat, On Culoare 7 sau alb 2 sau galben 5 sau albastru 1 sau rosu Tipul de linie continuu continuu ascuns continuu

Tabelul 31. Lista de layere si proprietati care ilustreaza valorile returnate de functia tblnext Command: (tblnext "LAYER" t) ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

Command: (tblnext "LAYER") ((0 . "LAYER") (2 . "DIM") (70 . 0) (62 . -2) (6 . "CONTINUOUS"))

Command: (tblnext "LAYER") ((0 . "LAYER") (2 . "HIDDEN") (70 . 1) (62 . -5) (6 . "HIDDEN"))

Command: (tblnext "LAYER") ((0 . "LAYER") (2 . "OBJECT") (70 . 0) (62 . 1) (6 . "CONTINUOUS"))

Command: (tblnext "LAYER") nil

212

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

O bucl care returneaz listele asociate pentru toate numele de simboluri dintr-un tabel este uor de implementat. Acest fragment de cod tiprete lista asociat pentru fiecare nume de simbol din tabelul layer.
(setq tlist (tblnext "LAYER" t)) (while tlist (print tlist) (setq tlist (tblnext "LAYER")) )

97106266.doc R.2.1 5/16/2012

213

AUTODESK, INC.

EXERCITIUL

35: CAUTAREA INTR-O TABELA n acest exerciiu : Vei consolida cunotinele despre tabele. Vei crea o nou funcie care scaneaz fiecare intrare din tabel. Vei tipri numele fiecrui simbol n tabel.

Etape de lucru
1. Deschidei desenul moddim.dwg n directorul student. 2. ntr-un fiier nou din editorul text, introducei codul care urmeaz. Acesta implementeaz funcia c:tlist. cere utilizatorului un cod care corespunde unuia dintre tabelele AutoCAD iar apoi scaneaz tabelul secvenial folosind funcia tblnext i tiprete numele fiecrui simbol n tabel.
TLIST (defun c:tlist () ;set up list of keywords for user prompt (initget "Block Dimstyle LAyer LType Style Ucs View VPort") (setq ttype ;get table type from user (getkword "nBlock/Dimstyle/LAyer/LType/Style/Ucs/View/VPort: ") ) (if (not ttype) (exit) ) ;if user pressed return, exit

(setq tlist (tblnext ttype t))

;get first entry n table

(while ;while we have a valid entry... tlist ;in the table... (print (cdr (assoc 2 tlist))) ;print its name... (setq tlist (tblnext ttype)) ;get the next entry... ) (prin1) ) ;quiet exit

3. Salvai fiierul ca tlist.lsp n directorul student. 4. ncrcai programul n AutoCAD. 5. Activai comanda TLIST.

214

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Cutarea unui nume de simbol


Funcia tblsearch va cuta un nume de simbol ntr-un tabel. Funcia cere dou argumente: un ir care corespunde unui tabel AutoCAD i un ir care corespunde numelui unui simbol cerut. Dac numele cerut nu exist, funcia tblsearch returneaz nil.

Exemplu
Aceast expresie caut layerul 0 i-i returneaz lista asociat.
Command: (tblsearch "LAYER" "0") ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

Recapitulare
AutoCAd pstreaz simbolurile cum ar fi layer-ele i Block Definitions n tabele. Exist 8 tabele n AutoCAD. Funcia tblnext poate scana fiecare simbol din tabel. Funcia tblsearch poate cuta un anume simbol ntr-un tabel. Tabelele nu pot fi modificate direct de AutoLISP.

97106266.doc R.2.1 5/16/2012

215

AUTODESK, INC.

EXERCITIUL

36: CAUTAREA IN TABELA DE LAYER-E n acest exerciiu: Vei folosi funcia tblsearch. Vei cuta n tabela Layer numele layerului dat de utilizator.

Vei determina dac layerul exist i vei informa utilizatorul n consecin.

Instruciuni
1. Deschidei desenul moddim.dwg din directorul student. 2. ntr-un fiier nou din editorul de text introducei codul care urmeaz. Acesta implementeaz funcia c:chklayer. cere utilizatorului numele layerului i determin dac layerul exist n desenul respectiv iar apoi tiprete un mesaj adecvat pentru utilizator.
CHKLAYER (defun c:chklayer () (setq lname ;get layer name from user (getstring "nName of layer: ") ) (if (tblsearch "LAYER" lname) ;layer exists? (prompt (strcat "nLayer " lname " exists. ")) ;yes (prompt (strcat "nLayer " lname " does not exist. ")) ;no ) (prin1) ) ;quiet exit

3. Salvai fiierul text ca chklayer:lsp n directorul student. 4. ncrcai programul n AutoCAD. 5. Activai comanda CHKLAYER.

216

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

37: EXERCITII SUPLIMENTARE CU TABELE Acesta este un exerciiu opional.

Etape de lucru
1. Deschidei fiierul grafic moddim.dwg n directorul student. 2. ntr-un fiier nou din directorul student scriei dou funcii: c:chktable i c:layerset. 3. Salvai totul ntr-un fiier. ncrcai funciile n AutoCAD i testai-le n desenul moddim.

c:chktable
1. ntreab utilizatorul ce tabel s caute. 2. ntreab utilizatorul care este simbolul cautat. 3. Caut tabelul pentru simbolul cutat. 4. Spune utilizatorului dac simbolul cutat exist.

c:layerset
1. ntreab utilizatorul care este numele layerului. 2. Dac layerul exist, funcia spune operatorului tipul de linie i culoarea atribuite layerului. 3. Dac layerul exist, legai o variabil global de un set de selecie format din toate entitaile de pe layerul respectiv.

97106266.doc R.2.1 5/16/2012

217

AUTODESK, INC.

EXERCITIUL

14: UN EXECITIU MAI COMPLEX DE CAUTARE IN TABELE Acesta este un exerciiu opional

Etape de lucru
1. Deschidei fiierul grafic moddim.dwg din directorul student. 2. ntr-un fiier nou din editorul de text, introducei codul care urmeaz. Acesta implementeaz funcia c:tsearch. 3. TSEARCH caut simbolul ntr-un tabel i dac simbolul exist tiprete fiecare cod de grup i valoare din lista asociat simbolului.

218

AUTODESK, INC. TRAINING


(defun c:tsearch () ;set up list of keywords for user prompt (initget "Block Dimstyle LAyer LType Style Ucs View VPort") (setq ttype ;get table type from user (getkword "nBlock/Dimstyle/LAyer/LType/Style/Ucs/View/VPort: ") ) (if (not ttype) (exit) ) ;if user pressed return, exit

LECTII DE BAZA AUTOLISP

(setq ttarget ;get target search name (getstring (strcat "n" ttype " table entry: ")) ) (if (not ttarget) (exit) ) ;if user pressed return, exit

(setq tlist (tblsearch ttype ttarget));get list for target... ;from its table. (if (not tlist) ;if no list, then target... (progn ;was not found, so exit. (prompt "nNo such entry.") (exit) ) ) (while tlist ;while we still have a list... (print (car (car tlist))) ;print first group code... (print (cdr (car tlist))) ;and value from assoc list... (setq tlist (cdr tlist)) ;then truncate assoc list. ) ) (prin1) ;quiet exit

4. Salvai fiierul text ca tsearch.lsp n directorul student. 5. ncrcai programul n AutoCAD i testai comanda TSEARCH .

97106266.doc R.2.1 5/16/2012

219

AUTODESK, INC.

Fiiere script i AutoLISP


Dac vrei s folosii un program AutoLISP pentru a procesa cteva desene n editor, pe rnd, probabil vei combina un program AutoLISP cu un fiier script pentru o procesare automat. AutoLISP se iniializeaz la fiecare nou sesiune de editare, adic ori de cte ori ncepei un nou desen sau editai unul deja existent. Iniializarea elibereaz zona de memorie destinat AutoLISP-ului tergnd toate funciile definite de utilizator i de aplicaii, i variabilele din proces. S presupunem c avem o funcie AutoLISP definit dup cum urmeaz. Ce se ntmpl cnd aceast funcie este n aciune?
Command: (defun c:my_new () (command "._new" "")) C:MY_NEW Command: my_new Command: ._new File name: Command: !c:my_new nil

apeleaz comanda AutoCAD NEW i ncepe un nou desen. Dup ce editorul grafic a fost iniializat, verificm setarea funiei C:MY_NEW... i vedem c este nil. Acest lucru se datoreaz faptului c AutoLISP este ntotdeauna iniializat mpreun cu editorul grafic.
C:MY_NEW

Cu alte cuvinte, orice funcie AutoLISP care recicleaz editorul grafic se autodistruge. Pentru a rezolva aceast problem, putei folosi fiiere script n combinaie cu programe AutoLISP pentru a procesa mai multe desene cu acelai cod AutoLISP. Fiierul script rencarc i apeleaz programul AutoLISP la fiecare nou desen. Codul AutoLISP scrie fiierul script, definete funcia pentru a fi apelat din fiierul script i apeleaz fiierul script.

Iat un exemplu tipic. Dorim s procesm toate fiierele grafice din directorul student/batchdwg cu un program AutoLISP care tiprete un raport ce cuprinde numrul de Block Definitions din desen i numele lor. (Acest exerciiu presupune c un astfel de director cu fiiere grafice exist deja n computer.) Fiierul program run.lsp definete dou funcii AutoLISP: C:RUN i C:RUN_REPORT.

220

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

C:RUN execut

urmtoarele activiti n ordine.

V asigur c aplicaia ADS XDOS este ncrcat. Cere un nume de director de la utilizator. Cere o list cu toate fiierele grafice din director.

Scrie un fiier script care deschide fiecare desen, rencarc run.lsp i apeleaz funcia C:RUN_REPORT pentru fiecare desen. Apeleaz fiierul script.

Funcia C:RUN_REPORT scrie un fiier raport pentru fiecare desen care conine Block Definitions. Fiierul raport are acelai nume ca i desenul cu o extensie .rpt i se afl n acelai director ca i desenul. Funcia listeaz numele fiecrui Block n desen i de cte ori Block a fost inserat. folosete funcia dosdir din fiierul xdos.exe, o aplicaie ADS real mode pentru ACAD R12 care se afl n CompuServe ACAD Forum n Library 2. xdos este n directorul student din computerul dvs. Instruciunile de folosire a acestei funcii se afl n fiierul xdos.txt.
c:run

ntr-un desen nou, folosii comanda definit n run.lsp. Urmai instruciunile de mai jos.
Command: (load "run") C:RUN_REPORT Command: run

Dup ce ultimul desen a fost procesat, examinai coninutul urmtoarelor trei fiiere:

d:studentrun.scr d:studentbatchdwgblock5.rpt d:studentbatchdwgblock10.rpt

97106266.doc R.2.1 5/16/2012

221

AUTODESK, INC.
(defun C:RUN () (if (not (member "DOSDIR" (atoms-family 1))) ;Check for dosdir function. (if ;If not there, attempt to (= "bad" (xload "XDOS.EXE" "bad")) ;load XDOS program; exit (progn ;if attempt fails. (prompt "nCan't load XDOS.EXE.") (exit) ) ) ) (setq dwgdir (getstring "nDirectory: ")) ;Get directory from user.

(setq dwgnames ;Get list of drawings. (dosdir (strcat dwgdir "" "*.dwg") 0) ) (setq fp (open "run.scr" "w")) ;Open file run.scr for ;writing n current dir. ;The script commands will open each drawing n turn, load the ;file run.lsp and apply the run_report command to each file. (foreach a dwgnames ;Write script file. (progn (princ "(if (= 0 (getvar "DBMOD")) (command "._OPEN")" fp) (princ "(command "._OPEN" "N"))n" fp) (princ (strcat dwgdir "" a "n") fp) (princ "(load "run.lsp")n" fp) (princ "run_reportn" fp) ) ) (setq fp (close fp)) ;Close run.scr file.

(command "._SCRIPT" "run") ;Call script as last ; expression. ) (defun C:RUN_REPORT () (setq block_name_list nil) ;Initialize list of Block names. (if (setq block_table_list (tblnext "BLOCK" t)) ;We have a Block? (progn (prompt "nFinding Block names.") ;Keep the customer happy. (while ;Add its name to the list and block_table_list ;get the next one. (setq block_name (cdr (assoc 2 block_table_list))) (setq block_name_list (cons block_name block_name_list)) (setq block_table_list (tblnext "BLOCK")) ) ;Sort the list of Block names. (setq block_name_list (acad_strlsort block_name_list)) ;Get the number of Insert entities for each Block. ;Create a list of dotted pairs. Each dotted pair consists ;of a Block name and the number of Insert entities.

222

AUTODESK, INC. TRAINING


(prompt "nFinding INSERT entities.") ;Keep the customer happy. (setq report_list nil count 0) ;Initialize the list and counter. (repeat ;For all the Block names... (length block_name_list) ;find how many INSERT entities. (setq block_name (nth count block_name_list)) (setq s_set ;Returns selecion-set of all (ssget "X" ;the INSERT entities of the (list ;current block_name. (cons 0 "INSERT") (cons 2 block_name) ) ) ) (setq ;Add a dotted pair of the form report_list ;("BLOCK_NAME" . "NUMBER") to (cons ;the report_list. (cons block_name (if ;If, for example, the Block "DOOR" s_set ;is not inserted n this drawing, (itoa (sslength s_set)) ;add the dotted pair ("DOOR" . "0"). "0" ) ) report_list ) ) (setq count (1+ count)) ;Next Block name. (princ ".") ;Keep the customer happy. ) (setq report_list (reverse report_list)) ;Reverse report list. (setq s_set nil) ;Free selecion-set.

LECTII DE BAZA AUTOLISP

;Print report to disk file dwgname.rpt. (prompt "nWriting report to disk.") (setq fp (open (strcat (getvar "DWGNAME") ".rpt") "w")) (write-line (strcat "Drawing " (getvar "DWGNAME") "n") fp) (write-line "Block names # of insertions" fp) (write-line "=========== ===============" fp) (setq count 0) ;First Block name. (repeat (length report_list) ;Get 'em all... (setq block_name (car (nth count report_list)) insert_number (cdr (nth count report_list)) ) (setq spacer "") ;Calculate number of spaces to 36th (repeat ;character from end of Block name. (- 36 (strlen block_name)) (setq spacer (strcat " " spacer)) ) (write-line ;Write Block name, spaces to the (strcat ;36th character, and the number of block_name ;INSERT entities for that Block. spacer insert_number )
97106266.doc R.2.1 5/16/2012

223

AUTODESK, INC.
fp ) (setq count (1+ count)) ;Next block name. ) (setq fp (close fp)) ) (prin1) ) ;Close dwgname.rpt file. ;Quiet exit.

224

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

225

AUTODESK, INC.

Accesul la Polilinii
Poliliniile snt entiti complexe. Ele snt formate dintr-o entitate principal de tip "POYLINE" urmat de una sau mai multe entiti de tip "VERTEX" terminate de o entitate de tip "SEQUEND". Aceast diagram ilustreaz lanul de entiti i numele lor.
POLYLINE Main entity Next entity name: VERTEX SEQEND Sub entity Next entity name: Next main entity in database VERTEX Sub entity Next entity name: VERTEX or SEQEND
Figura 47.Relatia dintre polyline ca entitate principala si subentitati

n afara accesrii entitilor principale neterse din baza de date, funcia entnext va accesa subentitile unei Polilinii i atributele entitilor Insert. Acest capitol ilustreaz acest principiu cu ajutorul unei funcii care: Cere utilizatorului s selecteze o polilinie. Acceseaz subentitaile unei polilinii. Vizualizeaz un raport despre fiecare entitate pe display. Iese atunci cnd a ajuns la captul poliliniei.

226

AUTODESK, INC. TRAINING


(defun c:polylist () (setq old_error *error*) ;save default error handler

LECTII DE BAZA AUTOLISP

(defun *error* (msg) ;define new error handler (if (/= "Function cancelled" msg) ;no message if user cancels (if (= msg "quit / exit abort") ;no message if program deliberately (princ) ;aborts (princ (strcat "nError: " msg));otherwise, print error for user ) (princ) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit ) (setq epick (entsel "nSelect polyline: ")) ;select an entity (if (not epick) ;if no entity selected, exit (exit) ) (setq ename (car epick)) ;get entity name (setq elist (entget ename)) ;get association list (setq etype (cdr (assoc 0 elist))) ;store entity type (if (/= "POLYLINE" etype) (progn (prompt "nNot a polyline.") (exit) ) ) ;if not a Polyline, exit

(while ;while we have an entity name (and ;and it's not the end of the ename ;Polyline... (/= "SEQEND" etype) ) (princ "nEntity type: ") ;print the entity type (princ etype) (if ;if it's a Vertex entity... (= "VERTEX" etype) ;get its group 70 flags and (progn ;location, and print location (setq vflags (cdr (assoc 70 elist))) (setq pt (cdr (assoc 10 elist))) (princ "nLocation: ") (princ (car pt)) (princ " ") (princ (car (cdr pt))) (princ " ") (princ (car (cdr (cdr pt)))) (if ;check each flag and print (= 1 (logand 1 vflags)) ;each if true (princ "nVertex inserted by curve-fitting.") ) (if (= 2 (logand 2 vflags)) (princ "nCurve-fit tangent defined for this vertex.")
97106266.doc R.2.1 5/16/2012

227

AUTODESK, INC.
) (if (= 8 (logand 8 vflags)) (princ "nSpline vertex created by spline-fitting.") ) (if (= 16 (logand 16 vflags)) (princ "nSpline frame control point.") ) (if (= 32 (logand 32 vflags)) (princ "n3D Polyline vertex.") ) (if (= 64 (logand 64 vflags)) (princ "n3D Polyline mesh vertex.") ) (if (= 128 (logand 128 vflags)) (princ "nPolyface mesh vertex.") ) ) ) ;stop screen from scrolling (getstring "nnPress RETURN to continue...") (setq ename (entnext ename)) ;get next entity n Polyline

(if ;if we have an entity name... ename ;get its assocation list and (progn ;entity type (setq elist (entget ename)) (setq etype (cdr (assoc 0 elist))) ) ) ) (setq *error* old_error) ;restore old error handler (prin1) ;quiet exit )

228

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

229

AUTODESK, INC.

Accesul la Block Definitions


Block Definitions snt entiti complexe. O entitate principal de tip "BLOCK" cu un nume unic este pstrat n tabela AutoCAD Block. Aceast entitate este urmat de una sau mai multe entiti de orice tip, terminat cu o entitate de tip "ENDBLK". Aceast diagram ilustreaz lanul de entiti i numele entitilor.
Block Table Named object Next entity name: Any type ENDBLK Sub entity Next entity name: None

Next sub entity Any type Next entity name: Any type
Figura 48. Relatia dintre intrarea in tabela Block si subentitatile acestuia.

Funcia entnext acceseaz subentitile din definiiile Block. Acest capitol ilustreaz acest principiu printr-o funcie care: Cere utilizatorului s selecteze o entitate Insert care se refer la Block Definition. Acceseaz Block Definition n cadrul tabelei Block. Acceseaz subentitile din Block Definition Tiprete lista asociat fiecrei subentiti pe display. Iese cnd ajunge la captul entitii Block Definition.

230

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

(defun c:blklist (/ blist bname elist ename epick etype) ;blist Association list from Block table ;bname Name of Block Definition ;elist Entity association list ;ename Entity name ;epick List returned by entsel ;etype Entity type as string ;old_error Default error handler (setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler (if (/= "Function cancelled" msg) ;no message if user cancels (if (= msg "quit / exit abort") ;no message if program deliberately (princ) ;aborts (princ (strcat "nError: " msg));otherwise, print error for user ) (princ) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit ) (setq epick (entsel "nSelect block: ")) ;select an entity (if (not epick) ;if no entity selected, exit (exit) ) (setq ename (car epick)) ;get entity name (setq elist (entget ename)) ;get association list (setq etype (cdr (assoc 0 elist))) ;store entity type (if (/= "INSERT" etype) (progn (prompt "nNot a block.") (exit) ) ) ;if not an Insert, exit

(setq bname (cdr (assoc 2 elist))) ;get name of Block Definition (setq blist (tblsearch "BLOCK" bname));get its assoc list (setq ename (cdr (assoc -2 blist))) ;get first entity n Block (setq elist (entget ename)) ;get its assoc list (setq etype (cdr (assoc 0 elist))) ;store entity type (while ;while we have an entity name (and ;and it's not the end of the ename ;Block Definition... (/= "ENDBLK" etype) ) (print elist) ;print entity's assoc list ;stop screen from scrolling
97106266.doc R.2.1 5/16/2012

231

AUTODESK, INC.
(getstring "nnPress RETURN to continue...") (setq ename (entnext ename)) ;get next entity n Block

(if ;if we have an entity name... ename ;get its assocation list and (progn ;entity type (setq elist (entget ename)) (setq etype (cdr (assoc 0 elist))) ) ) ) (setq *error* old_error) ;restore old error handler (prin1) ;quiet exit )

232

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

233

AUTODESK, INC.

Crearea entitilor Line cu funcia entmake


Funcia entmake creaz noi entiti AutoCAD fr s foloseasc comenzi AutoCAD de tip LINE, ARC, CIRCLE. Funcia entmake adaug entiti noi direct n baza de date. Funcia entmake cere un argument: o list asociat entitii. Funcia returneaz lista asociat entitii n ntregime dac reuete s creeze o entitate, altfel returneaz nil. Lista asociat folosit ca argument trebuie s conin toate informaiile necesare pentru a defini entitatea. Definiii opionale, cum ar fi layerul implicit, snt omise din lista asociat. De exemplu, fiecare dintre aceste expresii creaz o entitate Line n WCS pe Layerul 0 de la 1,1,0 la 5,5,0.

Exemplul 1
(entmake '( (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0) ) )

Exemplul 2
(entmake (list (cons 0 "LINE") (cons 8 "0") (list 10 1.0 1.0 0.0) (list 11 5.0 5.0 0.0) (list 210 0.0 0.0 1.0) ) )

234

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

39: CREAREA UNEI LINII

CU ENTMAKE

Creai o funcie numit c:xline ntr-un fiier text numit xline.lsp n directorul student Comanda
XLINE

ar trebui s fac urmtoarele:

S cear utilizatorului un punct de start. S cear utilizatorului un punct de sfrit. S creeze o entitate de tip Line n baza de date prin apelarea funciei entmake. S deseneze linia ntre cele dou puncte pe layerul curent.

97106266.doc R.2.1 5/16/2012

235

AUTODESK, INC.

Crearea entitilor Polylines si Block Definitions cu funcia entmake


Entiti complexe cum snt poliliniile, definiiile de Block i entitile Insert atribute pot fi definite prin apelarea de cteva ori a funciei entmake care s le defineasc subentitile. De ndat ce AutoCAD vede c funcia entmake creaz o entitate complex, acesta creaz un fiier temporar n care pastreaz toate datele definiiilor. Dup definirea entitii prin apelarea funciei entmake), AutoCAD creaz i adaug o entitate de capt (o entitate SEQEND pentru o polilinie sau o entitate BLKEND pentru o definiie Block), desfiineaz fiierul temporar i, n cazul definiiei Block, returneaz numele Blockului care a fost definit i nu lista asociat entitaii definite.

Polylines
Expresiile care urmeaz creaz o entitate de tip polilinie pe layerul curent i UCS cu o elevaie 0 i dou vertexuri la 1,1,0 i 5,5,0.
(entmake (list (cons 0 "POLYLINE") (cons 66 1) (list 10 0.0 0.0 0.0) ) ) (entmake (list (cons 0 "VERTEX") (list 10 1.0 1.0 0.0) ) ) (entmake (list (cons 0 "VERTEX") (list 10 5.0 5.0 0.0) ) ) (entmake (list (cons 0 "SEQEND") ) )

Blocks
Expresiile care urmeaz creaz o definiie Block numit myblock n tabelul Block. Definiia are un punct de baz de 5,5,0 i este format din urmtoarele entiti:

236

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

O entitate de tip Line pe layerul curent i UCS de la 5,5,0 la 10,1,0.

O entitate de tip Circle pe layerul curent i UCS la 5,5,0 cu o raz de 1.0.


(entmake (list (cons 0 "BLOCK") (cons 2 "MYBLOCK") (cons 70 0) (list 10 0.0 0.0 0.0) ) ) (entmake (list (cons 0 "LINE") (list 10 5.0 5.0 0.0) (list 11 10.0 1.0 0.0) ) ) (entmake (list (cons 0 "CIRCLE") (list 10 5.0 5.0 0.0) (cons 40 1.0) ) ) (entmake (list (cons 0 "ENDBLK") ) )

97106266.doc R.2.1 5/16/2012

237

AUTODESK, INC.

EXERCITIUL

40: CREAREA UNEI POLILINII CU FUNCTIA ENTMAKE 1. Creai o funcie numit c:polymake ntr-un nou fiier text numit polymake.lsp n directorul student. Funcia trebuie s fac urmtoarele: 2. 3. S fac o nou entitate de tip Polyline cu funcia entmake. S introduc o bucl. S cear utilizatorului un vertex. S apeleze funcia entmake atta timp ct utilizatorul selecteaz un punct. S ias din bucla cnd utilizatorul introduce o valoare nul. S termine de fcut polilinia prin apelarea funciei entmake pentru inserarea entitii SEQUEND.

Salvai fiierul text. ncrcai programul n AutoCAD i ncercai comanda POLYMAKE.

238

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

239

AUTODESK, INC.

Tratarea irurilor
AutoLISP dispune de un set redus de funcii care realizeaz operaii de baz pe iruri: lungimea irului, modificarea caracterelor, concatenarea i analiza.

Obiective
n acest capitol vei studia: Cum s determinai numrul de caractere dintr-un ir. Cum s modificai caracterele dintr-un ir. Cum s concatenai dou sau mai multe iruri. Cum s analizai un ir, fiecare caracter pe rnd.

Funcia strlen
irurile de tip text snt formate din 0 sau mai multe caractere aflate ntre semnele citrii duble (). Un ir cu nici un caracter este reprezentat ca "", sau cu null string. Funcia strlen cere un singur ir ca argument. Funcia returneaz lungimea unui ir n caractere ca un ntreg. Un spaiu valoreaz ct un caracter, caracterul escape este echivalent cu "an".

Exemplu
Introducei expresiile care urmeaz. Aflai lungimea ctorva iruri de text.
.Command: (strlen "") 0

Command: (strlen "123456789") 9

Command: (strlen "1 3 5 7 9") 9

Command: (strlen "nPoint:") 7

240

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Funcia strcase
Funcia strcase cere un argument i un argument opional. Primul argument trebuie s fie un ir de tip text. Dac al doilea argument este omis sau este nil, irul cu toate caracterele transformate n litere mari este returnat; sau dac al doilea argument este t, adic nu este nil, atunci se returneaz irul cu caracterele transformate n litere mici.

Exemplu
Introducei expresiile care urmeaz. Transformai caracterele celor trei iruri de tip text.
Command: (strcase "to upper") "TO UPPER"

Command: (strcase "To Upper") "TO UPPER"

Command: (strcase "to upper" nil) "TO UPPER"

Command: (strcase "TO LOWER" t) "to lower"

Funcia strcat
Funcia strcat cere unul sau mai multe argumente i fiecare dintre ele trebuie s fie un ir de tip text. Funcia returneaz un singur ir text: rezultatul concatenrii argumentelor. Funcia strcat, printre altele, este folositoare pentru a formula cereri la utilizator. De exemplu, este posibil s fie nevoie s cerei utilizatorului ca a n-a instruciune dintr-un grup de instruciuni s fie procesat. Pentru aceasta trebuie s luai numrul n, sa-l transformai ntr-un ir, apoi s-l concatenai cu restul.

Exemplu
Introducei expresiile care urmeaz. Concatenai cele dou iruri.
Command: (setq x "one" y "two") "two"

Command: (setq z (strcat x y)) "one two"

Command: (setq z (strcat x x z y y)) "one one one two two two"

97106266.doc R.2.1 5/16/2012

241

AUTODESK, INC.

Exemplu
Introducei expresiile care urmeaz. Formulai o cerere dintr-un ir i un numr ntreg.
Command: (setq index 1) 1 Command: (setq a "Processing object " b "...") "..." Command: (strcat a (itoa 1) b) "Processing object 1..."

Analiza irurilor
Puine texte n Lisp acord subiectului despre analiza irurilor importana cuvenit. Dei pare ciudat, probabil v este mai comod s cutai un text despre limbajul C cu explicaii i exemple de analiz a irului. Manualele The C Programming Language de Brian Kernighan i Dennis Ritchiei, Programming n C de Stephen G. Kochan i Advanced Turbo C de Herbert Schildt snt manuale care acord cel puin un capitol irurilor i analizei irurilor. Analiza irurilor simple, adic citirea pe rnd a caracterelor dintr-un ir i compararea acestora cu valori, este discutat n urmtorul capitol destinat funciei substr.

Funcia substr
Funcia substr cere trei argumente: un ir de tip text, un numr ntreg de indexare a caracterelor din ir de la stnga la dreapta, i un pas de incrementare a numrului de caractere spre dreapta i inclusiv a caracterului indexat. Funcia substr returneaz un ir care ncepe cu caracterul indexat din ir i se continu cu numrul de caractere din dreapta indexului indicat de al treilea argument. Argumentul index ncepe cu 1; adic primul caracter din ir are indexul 1. De exemplu aceast expresie returneaz irul "4".

242

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

(substr "123456" 4 1)

Aceast expresie returneaz irul "456".


(substr "123456" 4 3)

Formarea buclelor de program cu funcia substr


Pentru a analiza caracterele unui ir pe rnd, ar trebui s apelai funcia substr aflat ntr-o bucl. Un index al unui caracter dintr-un ir este iniializat cu 1. Bucla ncepe i se repet pentru fiecare caracter din ir. Fiecare caracter este returnat i tiprit separat i indexul incrementat cu 1 n bucl.
(setq index 1) (setq string "Hello, world.") (repeat (strlen string) (print (substr string index 1)) (setq index (1+ index)) )

Recapitulare

strlen

returneaz lungimea unui ir n caractere.

Funcia strcase poate returna un ir de tip text a crui caractere snt transformate n litere mari sau mici. Funcia strcat concateneaz dou sau mai multe iruri. Analiza irului n AutoLISP se face cu funcia substr.

97106266.doc R.2.1 5/16/2012

243

AUTODESK, INC.

EXERCITIUL

41: SIRURI SI ANALIZA LOR n acest exerciiu: Vei concatena iruri pentru a crea cereri la utilizator. Vei folosi lungimea irului pentru a determina de cte ori trebuie repetat o bucl. Vei analiza toate caracterele dintr-un ir, pe rnd, i vei elimina toate spaiile din ir.

Etape de lucru
n editorul de text creai un fiier nou numit nospace.lsp n directorul student.n acest fiier creai o funcie numit nospace. Aceast funcie ar trebui s fac urmatoarele operaii n ordine. 1. S cear un argument: un ir. 2. S seteze o variabil de indexare la 1. 3. S seteze o variabil de ieire la irul nul "". 4. S nceap o bucl care s se repete conform numrului de caractere din ir. 5. S extrag un caracter din ir de la poziia curent. 6. n cazul n care caracterul este un spaiu, acesta se ignor; dac nu, adaug caracterul la valoarea concatenat. 7. S incrementeze indexul cu 1. 8. S returneze variabila cu spaiile eliminate.

244

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

41: ANALIZA SIRURILOR CU CARACTERE DE DELIMITARE Putei rezolva acest exerciiu dac Lotus 1-2-3 i Microsoft Excel snt instalate n computerul dvs.

Generaliti
Programele de calcul tabelar cum snt programele Lotus 1-2-3 i Microsoft Excel pot scrie date ntr-un fiier de tip text. Fiecare linie din calculul tabelar reprezint un singur rnd de text n fiierul de ieire. Coloanele dintrun ir snt separate unele de altele printr-un caracter delimitator. Delimitatorul este selectabil de ctre utilizator i de obicei lipsit de TAB sau virgul. Programul prezentat mai jos implementeaz o funcie numit parse. Funcia parse citete un singur rnd de text creat dup formatul descris mai sus. Funcia returneaz o lista de iruri unde fiecare coloan dintr-un rnd este tratat ca un ir individual. Funcia parse cere trei argumente: irul de analizat, caracterul folosit ca delimitator n interiorul irului i un indicator de condiie care dac nu este nil va returna toate poziiile unde apare delimitatorul care separ irul n lista returnat. mpreun cu funcia parse este definit i funcia c:test_parse. Funcia TEST_PARSE citete o list de iruri, le analizeaz pe fiecare i scrie rezultatul ntr-un fiier asociat numit testpars.txt n directorul curent. Fiecare valoare returnat de parse este testat; dac apare o eroare, se scrie un mesaj n fiierul asociat.

Etape de lucru
1. Lansai programul de calcul tabelar. 2. n acest program deschidei fiierul testpars.xls n directorul student. 3. Folosii comanda SAVE AS pentru a salva datele ca un format text ntr-un fiier. n programul Excel caracterul TAB este delimitator. 4. nchidei programul de calcul tabelar. 5. n editorul de text, examinai formatul Text din fiier. 6. ncrcai programul parse.lsp n AutoCAD. 7. Activai comanda PARSETEXT i urmrii cererile. 8. PARSETEXT va analiza fiecare ir din fiierul text i va afia pe display lista de iruri returnat pentru fiecare rnd de ctre funcia parse.

97106266.doc R.2.1 5/16/2012

245

AUTODESK, INC.
; PARSE.LSP ; Version 1.0 3/29/93 ; ; (parse str str expr) ; ; Parse a delimited text string and return a list of strings. Adds a ; null string between two sequential delimiters. ; ; Arguments: ; ; str (required) Text string to parse. ; str (required) Character used to delimit the string. ; expr (required) If t, return delimiter as a separate string. ; ; Local variables: ; ; char STR Current character from string. ; index INT Current location of character from string. ; rl LIST Return list of strings. ; sstr STR Current string to add to return list. ; strl INT Length of string. (defun parse (str delim rd / char index rl sstr strl) (setq ;initialize... sstr "" ;string to place n list rl nil ;list to return index 1 ;character index n string strl (strlen str) ;length of string )

continuare pe pagina urmatoare

246

AUTODESK, INC. TRAINING


(if ;if string length is zero (zerop strl) ;return list with null string '("") (progn (repeat ;repeat for the length of string strl (setq char (substr str index 1)) ;get a character (cond ( (= char delim) ;if it's a delimiter (if ;and the string is null, it's (= str "") ;line start or last was delim so (setq rl (cons "" rl)) ;add null string to return list (progn ;else (setq rl (cons sstr rl)) ;add string to return list (setq sstr "") ;then reinitialize string ) ) (if ;if flag is true... rd (setq rl (cons char rl)) ;add delimiter to return list ) (if ;if it's the last char n string (= index strl) (setq rl (cons "" rl)) ;add null string to return list ) ) ( t ;if we're here, just append the (setq sstr (strcat sstr char)) ;current string to the char (if (= index strl) ;if it's the last char n string (progn (setq rl (cons sstr rl)) ;add string to return list ) ) ) );end cond (setq index (1+ index)) );end repeat (reverse rl) );end progn );end if ) ;reverse the list to return so the ;strings are n original order ;increment the char index

LECTII DE BAZA AUTOLISP

continuare pe pagina urmatoare

97106266.doc R.2.1 5/16/2012

247

AUTODESK, INC.
; TEST_PARSE.LSP ; Version 1.0 3/30/93 ; ; test_parse ; ; Test the function (parse). Use two lists of strings with different ; delimiter characters: "t" and ",". Test for both nil and t delimiter ; flag. Write test results to the log file TESTPARS.TXT n the current ; directory. Write an error message with index every time (parse) fails ; to match a value n a result list. ; ; ; Local variables: ; ; fp FILE Pointer to log file ; string STR Current string argument to parse ; t1 LIST List of strings to test ; t2 LIST List of strings to test ; t1_r1 LIST List of t1 results for nil delim flag ; t1_r2 LIST List of t1 results for t delim flag ; t2_r1 LIST List of t2 results for nil delim flag ; t2_r2 LIST List of t2 results for t delim flag (defun c:test_parse (/ fp string t1 t1_r1 t1_r2 t2 t2_r1 t2_r2) (setq t1 '("" "t" "a" "ab" "at" "ta" "atb" "atbt" "tat" "tt") t1_r1 '(("") ("" "") ("a") ("ab") ("a" "") ("" "a") ("a" "b") ("a" "b" "") ("" "a" "") ("" "" "") ) t1_r2 '(("") ("" "t" "") ("a") ("ab") ("a" "t" "") ("" "t" "a") ("a" "t" "b") ("a" "t" "b" "t" "") ("" "t" "a" "t" "") ("" "t" "" "t" "") ) t2 '("" "," "a" "ab" "a," ",a" "a,b" "a,b," ",a," ",,") t2_r1 '(("") ("" "") ("a") ("ab") ("a" "") ("" "a") ("a" "b") ("a" "b" "") ("" "a" "") ("" "" "") ) t2_r2 '(("") ("" "," "") ("a") ("ab") ("a" "," "") ("" "," "a") ("a" "," "b") ("a" "," "b" "," "") ("" "," "a" "," "") ("" "," "" "," "") ) ) (setq fp (open "testpars.txt" "w"))

continuare pe pagina urmatoare

248

AUTODESK, INC. TRAINING


(setq index 0) (repeat (length t1) (setq string (nth index t1)) (print string fp) (print (parse string "t" nil) fp) (print (parse string "t" t) fp) (if (not (equal (setq x (parse string "t" nil)) (setq y (nth index t1_r1)) ) ) (print (strcat "Test t1_r1 failed n index " (itoa index) "." ) fp ) );end if (if (not (equal (parse string "t" t) (nth index t1_r2) ) ) (print (strcat "Test t1_r2 failed n index " (itoa index) "." ) fp ) );end if (setq index (1+ index)) );end repeat

LECTII DE BAZA AUTOLISP

continuare pe pagina urmatoare

97106266.doc R.2.1 5/16/2012

249

AUTODESK, INC.
(setq index 0) (repeat (length t2) (setq string (nth index t2)) (print string fp) (print (parse string "," nil) fp) (print (parse string "," t) fp) (if (not (equal (parse string "," nil) (nth index t2_r1) ) ) (print (strcat "Test t2_r1 failed n index " (itoa index) "." ) fp ) );end if (if (not (equal (parse string "," t) (nth index t2_r2) ) ) (print (strcat "Test t2_r2 failed n index " (itoa index) "." ) fp ) );end if (setq index (1+ index)) );end repeat (setq fp (close fp)) (prin1) )

250

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Aceast pagin a fost lsat liber n mod intenionat.

97106266.doc R.2.1 5/16/2012

251

AUTODESK, INC.

Pointere de entiti
Un pointer de entitate este un identificator unic i permanent pentru o entitate dintr-un desen AutoCAD. Aplicaiile pot folosi pointere de entiti pentru a menine legturi asociative ntre entitai sau ntre entiti i seturi arbitrare de date n timpul sesiunii de editare grafic.

Obiective
n acest capitol vei studia: Cum s activai sau s distrugei pointerele de entiti. Cum s extragei un pointer dintr-o list asociat entitii. Cum s gsii o entitate cu ajutorul pointerului.

Formatul unui pointer de entitate


Pointerele de entitai snt pstrate ca numere hexadecimale exprimate sub forma unui ir. De exemplu, primul pointer atribuit entitii ntr-un desen poate fi "1" iar pointerul treizeci i unu poate fi "1F". Pointerul unei entiti nu poate fi schimbat: poate fi numai distrus. Cnd se terge o entitate dintr-un desen, pointerul ei este retras i niciodat refolosit n acel desen. Lungimea maxim a unui ir este de 16 caractere, ceea ce nseamn c numrul maxim de pointere pentru un singur desen este 264-1. Pointerele snt pstrate n codul de grup DXF cimpul 5 al unei liste asociat entitii.

Atribuirea de pointere entitilor


Spunem c al 31-lea pointer atribuit entitii ar putea fi "1F" deoarece atribuirea pointerelor nu este ntotdeauna secvenial, dei ntotdeauna progreseaz de la mai mic la mai mare. Este imposibil de prevzut n toate cazurile care va fi urmtoarea atribuire pe care o va face AutoCAD-ul; de aceea este necesar de stabilit n mod explicit pointerul unei entiti din lista asociat entitii, dect s ncercm s ghicim ce pointer va atribui AutoCAD-ul entitii.

Activarea si dezactivarea pointerelor


Aciunea de atribuire a pointerelor este dezactivat n momentul n care pointerele lipsesc. Comanda HANDLE ON va activa pointerele permanent n desenul curent. Pointerele pot fi dezactivate. Deoarece prin aceasta se poate dezactiva orice legatur ntre entitile AutoCAD i de bazele de date externe (de exemplu pointerele snt folosite extensiv de ctre AutoCAD SQL Extension), pointerele pot fi distruse printr-un act deliberat din partea utilizatorului.

252

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

Comanda HANDLES DESTROY <CONFIRMATION-STRING> va dezactiva toate activitile de atribuire a pointerelor n sesiunea curent. <CONFIRMATIONSTRING> este unul din cele ase iruri posibile pe care le poate introduce utilizatorul. AutoCAD genereaz unul dintre iruri la ntmplare n timpul execuiei comenzii; de aceea este imposibil de prezis de care ir este nevoie ca s confirme comanda.

Verificarea atribuirii pointerelor


Variabila de sistem HANDLES este setat la 1 cnd pointerele snt activate n sesiunea curent.

Gsirea unei entiti cu ajutorul pointerului


Funcia handent cere un argument de tip ir: pointerul unei entiti. Dac unei entiti din sesiunea curent i se atribuie un pointer, funcia handent va returna numele entitii; dac nu, va returna nil.

Exemplu
ntr-o nou sesiune, introducei comenzile i expresiile care urmeaz. Extragei un pointer de entitate i stabilii numele entitii folosind pointerul. Activai pointerele n sesiunea curent.
Command: handles Handles are disabled. ON/DESTROY: on

Desenai cteva entiti Line.


Command: line etc...

Extragei un pointer cu una din entitile Line.


Command: (setq elist (entget (car (entsel)))) Select object: pick a line Command: (setq ehand (cdr (assoc 5 elist))) Command: !ehand "1B" (sau un ir similar)

97106266.doc R.2.1 5/16/2012

253

AUTODESK, INC.

Extragei numele entitii folosindu-i pointerul.


Command: (setq ename (handent ehand)) <Entity name: xxxxxxxx>

Recapitulare
Pointerele de entiti snt pstrate ca numere hexazecimale exprimate sub form de iruri. Pointerul nu poate fi schimbat niciodat. El poate fi numai distrus. Pointerele snt pstrate n coduri DXF de grup 5 ntr-o list asociat entitii. Atribuirea de valori nu este ntotdeauna secvenial. Comanda HANDLES activeaz sau dezactiveaz pointerele. Funcia handent va returna numele entitii prin pointerul entitii.

254

AUTODESK, INC. TRAINING

LECTII DE BAZA AUTOLISP

EXERCITIUL

43: SALVAREA SETURILOR DE SELECTIE n acest exerciiu: Vei folosi un program pentru a citi pointerele entitilor. Vei pstra pointerele ntr-un fiier extern. Vei citi fiierul extern i vei crea un set de selecie din pointerele entitilor.

Programul savset.lsp din directorul student implementeaz dou comenzi pentru AutoCAD: SAVESET i GETSET. pstreaz pn la ase seturi de selecie diferite dintr-un desen i permite ca acestea s fie folosite n timpul sesiunii de editare grafic. SAVESET salveaz pointerele dintr-un set de selecie ntr-un fiier extern a crui nume este <dwgname>.st<n>, unde <dwgname> este numele desenului respectiv i <n> este un numr cuprins ntre 1 i 6.
SAVESET

citete pointerele entitilor dintr-un fiier creat de SAVESET i construiete setul de selecie anterior din entitile asociate cu pointerele.
GETSET

Etape de lucru
Pstrai seturile de selecie n timpul sesiunii de editare prin scrierea i cititrea pointerelor n/i din fiierul extern. Deschidei desenul ssget.lsp din directorul student. ncrcai programul savset.lsp n AutoCAD. Folosii comanda SAVESET i salvai dou sau mai multe seturi de selecie. Deschidei o nou sesiune de editare grafic cu ssget. ncrcai programul saveset.lsp. Folosii comanda GETSET pentru a extrage unul dintre seturile de selecie pstrate. Folosii comanda MOVE cu setul de selecie anterior. Deschidei fiierul savset.lsp n editorul de text i examinai codul.

97106266.doc R.2.1 5/16/2012

255

AUTODESK, INC.

EXECITIUL

44: UN MANAGER SIMPLU PENTRU FISIERELE TIP DWG Acesta este un exerciiu opional Fiierul drawman.lsp din directorul student implementeaz un sistem de management pentru fiiere tip dwg, foarte simplu pentru a ilustra modul cum pot fi folosite pointerele. Putei folosi comenzile din acest fiier urmnd aceste etape: 1. ncrcai fiierul drawman.lsp n AutoCAD. 2. Folosii comanda LOGIN. 3. Desenai cteva entiti. 4. Folosii comanda LOGOUT. 5. Folosii oricare dintre aceste comenzi pentru a afla informaii despre entitile pe care le-ai desenat prin legturi ntre pointere i atribute ntr-un bloc inserat aplicaiei.
FINGER RLIST SELUSER SELECO

Aducei fiierul n editorul de text i studiai-l. Codul este scurt, uor de neles i bine comentat.

256

S-ar putea să vă placă și