Documente Academic
Documente Profesional
Documente Cultură
Lectii LISP Romana
Lectii LISP Romana
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:
Crearea de noi funcii AutoLISP. Crearea de noi funcii AutoCAD pe baza limbajului
AutoLISP.
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
Crearea entitilor cu funcia entmake.......................................................225 Crearea poliliniilor i a definitiilor de bloc cu funcia entmake ...............227 Tratarea irurilor........................................................................................231 Tratarea entitilor......................................................................................243
AUTODESK, INC.
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.
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.
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.
AUTODESK, INC.
ACAD). Orice editor profesional de programare este o unealt bun cu care se pot scrie fiiere program AutoLISP.
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.
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.
AUTODESK, INC.
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
AutoCAD-ul tiprete rezultatul intrrii s-expresiilor pe linia de comand. AutoCAD-ul folosete rezultatul unei s-expresii introduse, drept intrare la comanda curent.
Command:array last polar 5,5 (/ 360 15)
AutoCAD
(/ 360 15) 24
AutoLISP
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
10
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.
11
AUTODESK, INC.
12
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.
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> SYM STR INT
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 )
Exemplu
Aceast list are trei elemente: numerele reale 1.0, 1.0 i 0.0 14
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 ))
Exemplu
Aceast list are trei elemente: funcia de adunare +, lista (+ 1(+ 2 3)) i lista (+ 4 5).
(+ (+ 1 (+ 2 3)) (+ 4 5))
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.
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>
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.
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
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"
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
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
19
AUTODESK, INC.
20
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
21
AUTODESK, INC.
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
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.
22
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. Dac o list urmeaz a fi evaluat de AutoLISP, atunci trebuie respectat regula sintactic.
23
AUTODESK, INC.
24
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?
(.. .. (+ ..
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.
62181814.doc R.2.1 7/4/2011
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
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.
n cazul scderii, valoarea celui de al doilea argument este sczut din valoarea primului argument i rezultatul returnat este valoarea listei.
n cazul mpririi, valoarea celui de al doilea argument este divizorul valorii primului argument.
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))
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.
28
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)
S-expresii
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
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)
Exemplu
Aceast expresie leag simbolul x de valoarea 4.5.
Command: (setq x 4.5) 4.5 Command: !x 4.5
31
AUTODESK, INC.
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
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))
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
35
AUTODESK, INC.
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
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
36
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.
37
AUTODESK, INC.
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
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)
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
40
41
AUTODESK, INC.
Obiective
n acest capitol vei studia: Diferenele dintre cele dou tipuri de date numerice Cum s determinai tipul de date al unui obiect
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
42
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
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.
43
AUTODESK, INC.
Exemplu
Introducei expresiile care urmeaz. Legai simbolul x de un numr ntreg cu valoarea de 65535.
Command: (setq x 64435) 65535
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"
Exemplu
Aceast expresie returneaz un numr ntreg.
44
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.
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
46
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
47
AUTODESK, INC.
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.
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.
48
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)
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
50
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:
51
AUTODESK, INC.
Atunci expresia (list x y z) va returna aceeai valoare ca i expresia (list 1.0 2.0 3.0)
52
53
AUTODESK, INC.
Recapitulare
AutoCAD-ul folosete sistemul de coordonate carteziene 3D 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
EXERCITIUL
6: UTILIZAREA LISTELOR DE
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
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
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.
58
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.
De exemplu prima ramificaie a listei (1.0 2.0 3.0) ar putea fi reprezentat astfel.
(1.0 2.0 3.0)
1.0
(2.0 3.0)
Figura 21. Nodul radacina si primul set de ramificatii pentru lista (1.0 2.0 3.0)
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.
60
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).
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
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
8.0
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
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)
? ?
? ?
? ?
? ?
? ?
64
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)
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.
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)
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)
66
67
AUTODESK, INC.
X1,Y1
X2,Y1
X1,Y2 0,0
X2,Y2
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))) pt2 (car pt2) (car (cdr pt2)) (car (cdr (cdr pt2)))
68
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
pt2
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)
Folosii funciile car i cdr pentru a extrage valorile X i Y ale punctelor cunoscute.
Command: (car pt1) 1.0
Command: (setq pt2 (list (car pt1) (car (cdr pt3)))) (1.0 1.0)
70
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
pt3 10,1
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.
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.
Valorile X i Y ale lui mpt pot fi exprimate aritmetic dup cum urmeaz.
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
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.
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)
5,5
1,1
Figura 32. Linie de la 1.1 la 5.5
74
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)
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)
76
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.
77
AUTODESK, INC.
EXERCITIUL
10: TRANSFORMAREA COMENZILOR IN AUTOLISP n acest exerciiu vei: 1. 2. 3. Transforma AutoLISP. comenzile AutoCAD script n expresii
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>: 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
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.
79
AUTODESK, INC.
80
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.
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
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
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
83
AUTODESK, INC.
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
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.
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.
86
87
AUTODESK, INC.
88
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.
(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.
89
AUTODESK, INC.
cere obligatoriu dou argumente i un numr variabil de argumente care urmeaz dup primele dou.
defun
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.
90
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: (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: (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
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.
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)
92
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:
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: DTR Command: 3.14159 Command: 6.28319 Command: 1.5708 (defun dtr (d) (* pi (/ d 180.0))) (dtr 180) (dtr 360) (dtr 90)
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
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.
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.
96
97
AUTODESK, INC.
98
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.
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.
99
AUTODESK, INC.
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).
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
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
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
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.
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.
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.
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..
malformed list
104
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.
105
AUTODESK, INC.
EXERCITIUL
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
106
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.
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) )
108
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)
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
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.
110
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:.
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
111
AUTODESK, INC.
Command: line .- line From point: pick a point To point pick a point To point: Command: nil
112
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.
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.
114
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.
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
62181814.doc R.2.1 7/4/2011
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
EXERCITIUL NR
17: OBIECTELE
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
117
AUTODESK, INC.
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
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
118
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
119
AUTODESK, INC.
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
120
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
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
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
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
Exemplu
Command: (or 1 2 3) T
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
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 .
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
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.
125
AUTODESK, INC.
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: !y 1
Command: !y 0
126
EXERCITIUL
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")) (if (= 1 snapval) (setvar "SNAPMODE" 0) (setvar "SNAPMODE" 1) ) (prin1) ) ;get current SNAPMODE
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 .
127
AUTODESK, INC.
Exemplu
Command: (setq x 1) 1
Command: !y 2
Command: !z 3
128
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.
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
Funcia cond poate testa mai multe expresii i poate executa orice numr de s-expresii ntr-o ramificaie dat.
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.
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
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.
134
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
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
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
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
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
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.
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.
138
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
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
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.
141
AUTODESK, INC.
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 AutoLISPul legate la iruri text. Diferenele dintre cele ase funcii de tiprire n AutoLISP. Cum s folosii funciile de tiprire.
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
Semnificatie
caracter escape caracter newline caracter return caracter tab Caracter al carui cod octal este nnn
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"
143
AUTODESK, INC.
144
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: text Justify/Style/<Start point>: 1,5 Height: 0.5 Rotation: 0 Text: !txt1
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 Argumente 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.
princ print
prompt write-char
write-line
string file-desc
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
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.
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 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
148
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.
150
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>
Exemplu
Introducei expresiile i comenzile care urmeaz. Expresia AutoLISP va terge entitatea Line. Comanda U o va restabili.
Command: (command "erase" ename "") nil
151
AUTODESK, INC.
Command: U GROUP
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
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
153
AUTODESK, INC.
5,5
1,1
Figura 23. Situatia dupa miscarea cercului cu o unitate in directia X pozitiva
sau
Command: (setq ename1 (entnext)) <Entity name: 60000022> Command: (setq ename2 (entnext ename1)) <Entity name: 60000028>
154
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.
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
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
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.
157
AUTODESK, INC.
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
(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")
159
AUTODESK, INC.
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"
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.
160
Command: (cdr '(8 . "0")) "0" Command: (cdr '(10 1.0 1.0 0.0)) (1.0 1.0 0.0)
161
AUTODESK, INC.
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))
162
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)
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
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
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
167
AUTODESK, INC.
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.
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
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)
169
AUTODESK, INC.
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
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
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.
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 )
172
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.
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.
173
AUTODESK, INC.
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
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>
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.
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
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
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.
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.
178
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.
179
AUTODESK, INC.
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) ) (prin1) ;restore default error handler ;if command is successful
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 180
definit de utilizator old_emdecho a fost facut global aa nct valoarea ei este accesibil noii funcii *error*.
181
AUTODESK, INC.
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.
182
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)
183
AUTODESK, INC.
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
184
(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
185
AUTODESK, INC.
(setq *error* old_error) (prin1) ) ;restore default error handler ;if command is successful ;quiet exit
186
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.
"a"
187
AUTODESK, INC.
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>
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>
188
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
189
AUTODESK, INC.
190
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>
nchidei fiierul.
Command: (setq fp (close fp)) nil Command: !fp nil
191
AUTODESK, INC.
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.
192
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.
193
AUTODESK, INC.
(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
(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) ) )
194
195
AUTODESK, INC.
(setq *error* old_error) (prin1) ;quiet exit
196
197
AUTODESK, INC.
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.
198
(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
199
AUTODESK, INC.
200
(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 )
201
AUTODESK, INC.
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.
202
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
(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.
203
AUTODESK, INC.
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>
Folosii setul de selecie pentru care variabila ss1 este legat n cadrul comenzii AutoCAD.
Command: erase Select objects: !ss1 Select objects: Enter
204
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>
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>
205
AUTODESK, INC.
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>
Setai variabila ss1 pe nil i eliberai resursele folosite curent de setul de selecie.
Command: (setq ss1 nil) nil
206
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
207
AUTODESK, INC.
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>
Setai variabila ss1 pe nil i eliberai resursele folosite curent de setul de selecie.
Command: (setq ss1 nil) nil
208
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.
209
AUTODESK, INC.
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.
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 ) ) ) )
210
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.
211
AUTODESK, INC.
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.
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.
Exemplu
Aceast expresie returneaz lista asociat pentru prima intrare n tabelul layer. 212
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"))
213
AUTODESK, INC.
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")) )
214
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
(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.
215
AUTODESK, INC.
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.
216
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.
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.
217
AUTODESK, INC.
EXERCITIUL
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.
218
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.
219
AUTODESK, INC.
(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
(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.
220
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 .
221
AUTODESK, INC.
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:
222
(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) )
223
AUTODESK, INC.
(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.
224
(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").
225
AUTODESK, INC.
"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.
;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 ) fp ) (setq count (1+ count)) ;Next block name. ) (setq fp (close fp)) ;Close dwgname.rpt file. ) ) (prin1) ;Quiet exit.
226
227
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.
228
(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
229
AUTODESK, INC.
(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 " ")
230
(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) (prin1) ) ;restore old error handler ;quiet exit
231
AUTODESK, INC.
232
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.
233
AUTODESK, INC.
(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) )
234
(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) ) ) (setq bname (cdr (assoc 2 elist))) ;if not an Insert, exit
(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 (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) (prin1) ) ;restore old error handler ;quiet exit
235
AUTODESK, INC.
236
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) ) )
237
AUTODESK, INC.
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
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.
238
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:
239
AUTODESK, INC.
240
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.
241
AUTODESK, INC.
242
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
243
AUTODESK, INC.
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"
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 x z y y)) "one one one two two two"
244
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".
245
AUTODESK, INC.
(substr "123456" 4 1)
Recapitulare
strlen
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.
246
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.
247
AUTODESK, INC.
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 dintr-un 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 ntrun 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.
248
249
AUTODESK, INC.
(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
250
251
AUTODESK, INC.
(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
252
253
AUTODESK, INC.
254
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.
255
AUTODESK, INC.
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.
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
256
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.
257
AUTODESK, INC.
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.
258
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.
259