Lectii Auto CAD

268
141246430.doc R.2.1 4/22/2013 ATC. Iasi 1 AutoLISP Introducere AutoLISP-ul este un limbaj de programare pentru AutoCAD. Acest curs ofer\ cursantului posibilitatea de a-[i `nsu[i cuno[tin]e practice de lucru `n AutoLISP prin cursuri [i texte care explic\ structura [i sintaxa limbajului [i rela]ia acestuia cu AutoCAD-ul. Prin exerci]ii aplicative la teoria de programare [i exemple concrete cursantul `[i completeaz\ aceste cuno[tin]e. 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 exerci]iile de proiectare se adaug\ lec]ii suplimentare [i discu]ii la obiect. Acest curs poate fi folosit individual atunci c`nd este `n combina]ie cu o dischet\ ce con]ine fi[ierele necesare pentru rezolvarea exerci]iilor. Acest curs este bazat pe o versiune AutoLISP ce poate fi g\sit\ pe toate platformele pe care este implementat AutoCAD R12. Obiective La sf`r[itul acestui curs, cursantul va fi capabil s\ `n]eleag\ sintaxa AutoLISP, o varietate de func]ii standard [i procesul de evaluare Lisp. Cursantul va putea folosi AutoLISP-ul pentru: Utilizarea comenzilor AutoCAD prin intermediul func]iilor de baz\ AutoLISP. Crearea de noi func]ii AutoLISP. Crearea de noi func]ii AutoCAD pe baza limbajului AutoLISP. Corectarea [i modificarea entit\]ilor din baza de date a AutoCAD-ului. Citirea [i scrierea `n fi[iere cu texte ASCII cu ajutorul limbajului AutoLISP. Combinarea programelor de tip AutoLISP cu fi[ierele AutoCAD de tip script. 141246430.doc R.2.1 4/22/2013 ATC. Iasi 1

description

Lectii Auto CAD

Transcript of Lectii Auto CAD

Page 1: Lectii Auto CAD

141246430.doc R.2.1 4/22/2013 ATC. Iasi •1

AutoLISP

IntroducereAutoLISP-ul este un limbaj de programare pentru AutoCAD. Acest curs ofer\ cursantului posibilitatea de a-[i `nsu[i cuno[tin]e practice de lucru `n AutoLISP prin cursuri [i texte care explic\ structura [i sintaxa limbajului [i rela]ia acestuia cu AutoCAD-ul. Prin exerci]ii aplicative la teoria de programare [i exemple concrete cursantul `[i completeaz\ aceste cuno[tin]e.

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 exerci]iile de proiectare se adaug\ lec]ii suplimentare [i discu]ii la obiect. Acest curs poate fi folosit individual atunci c`nd este `n combina]ie cu o dischet\ ce con]ine fi[ierele necesare pentru rezolvarea exerci]iilor.

Acest curs este bazat pe o versiune AutoLISP ce poate fi g\sit\ pe toate platformele pe care este implementat AutoCAD R12.

Obiective

La sf`r[itul acestui curs, cursantul va fi capabil s\ `n]eleag\ sintaxa AutoLISP, o varietate de func]ii standard [i procesul de evaluare Lisp. Cursantul va putea folosi AutoLISP-ul pentru:

• Utilizarea comenzilor AutoCAD prin intermediul func]iilor de baz\ AutoLISP.

• Crearea de noi func]ii AutoLISP.

• Crearea de noi func]ii AutoCAD pe baza limbajului AutoLISP.

• Corectarea [i modificarea entit\]ilor din baza de date a AutoCAD-ului.

• Citirea [i scrierea `n fi[iere cu texte ASCII cu ajutorul limbajului AutoLISP.

• Combinarea programelor de tip AutoLISP cu fi[ierele AutoCAD de tip script.

141246430.doc R.2.1 4/22/2013 ATC. Iasi •1

Page 2: Lectii Auto CAD

AUTODESK, INC.

Cuprins

Acest material cuprinde subiectele prezentate mai jos. Explicarea acestor subiecte reprezint\ con]inutul principal al capitolelor de mai jos.

Introducere...........................................................................1

Generalit\]i............................................................................3

Expresii simbolice.................................................................7

Atomi [i liste........................................................................13

Evalu\ri ...............................................................................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

Selec]ie interactiv\ de puncte.............................................79

Func]ii.................................................................................87

Func]ii care ac]ioneaz\ ca [i comenzi AutoCAD...................97

Fi[iere de programare AutoLISP........................................101

Func]ia C...........................................................................105

Teste logice [i condi]ionale...............................................113

Bucle de program.............................................................123

Opera]ii cu [iruri................................................................131

Acces la entit\]i.................................................................139

Liste asociate entit\]ilor....................................................147

Modificarea unei entit\]i....................................................155

Selectarea grafic\ a unei entit\]i.......................................165

Tratarea erorilor...............................................................171

Opera]ii cu fi[iere..............................................................175................................................................................................

Seturi de selec]ie..............................................................193

Tabele [i nume de obiecte................................................203

Fi[iere script [i AutoLISP....................................................211

•2

Page 3: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la entit\]i simple [i la polilinii...............................217

Accesul la entit\]i simple [i la blocuri................................221

Crearea entit\]ilor cu func]ia entmake..............................225

Crearea poliliniilor [i a definitiilor de bloc cu func]ia entmake ...........................................................................227

Tratarea [irurilor...............................................................231

Tratarea entit\]ilor............................................................243

141246430.doc R.2.1 4/22/2013 •3

Page 4: Lectii Auto CAD

AUTODESK, INC.

Generalit\]i despre AutoLISP

Ce este AutoLISP-ul ?

AutoLISP-ul este un dialect al limbajului de programare Lisp utilizat pentru completarea posibilit\]ilor de proiectare `n AutoCAD.

Lisp este un acronim pentru list processing (in alte texte, list programming. Este un limbaj de programare superior foarte cunoscut pentru aplica]iile lui `n domeniul sistemelor specializate, inteligen]\ artificial\, programare pe baz\ de reguli [i AutoCAD.

Lisp este unul dintre limbajele de programare cele mai vechi. Ca [i FORTRAN, primele implement\ri ale limbajului Lisp dateaz\ din anii 60. Multe sublimbaje ale limbajului Lisp exist\ `n prezent, incluz`nd Common Lisp, Franz Lisp, Mu Lisp [i X Lisp.

Limbajul Lisp are multe caracteristici care se adreseaz\ at`t profesioni[tilor c`t [i amatorilor.

• AutoLISP are o sintax\ simpl\, precis\. Procesul de evaluare [i sintaxa folosit\ pentru crearea expresiilor Lisp sunt u[or de `nv\]at.

• Este un interpretor a[a `nc`t rezultatele ob]inute din calcule pot fi vizualizate interactiv `ntr-o sesiune AutoCAD.

• AutoLISP interac]ioneaz\ direct cu AutoCAD f\r\ s\ necesite programe de sprijin extern, cum ar fi compilatorul.

• Programele AutoLISP s`nt u[or de `n]eles [i modificat.

• AutoLISP-ul este capabil de itera]ie [i recursivitate. Func]iile pot utiliza instruc]iuni condi]ionale [i de start standard [i pot fi definite `n a[a fel `nc`t o func]ie apeleaza la recursiune .

• AutoLISP-ul `ncurajeaz\ programatorul s\ scrie func]ii simple,structurate [i s\ combine aceste func]ii cu scopul de a crea programe complexe dar u[or de `n]eles.

Pentru cei ce s`nt interesa]i s\ lucreze cu programe AutoLISP le recomand\m urm\toarele c\r]i:

•4

Page 5: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Common LISP: A Gentle Introduction to Symbolic Computing de David S. Touretzky; LISP de Winston & Horn Looking at LISP de Tony Hasemer Common LispCraft de Robert Wilensky AutoLISP Programmer's Reference Manual.

Ce poate face AutoLISP-ul ?

AutoLISP-ul este o scul\ puternic\. Poate fi folosit pentru a adapta AutoCAD-ul la orice fel de aplica]ii, f\c`nd astfel AutoCAD-ul mai sensibil la modul de lucru. Multe dintre cele mai complicate aplica]ii proiectate pentru AutoCAD folosesc pe scar\ larg\ limbajul de programare AutoLISP.

AutoLISP poate crea subrutine [i macrouri puternice. Subrutinele AutoLISP pot fi alc\tuite din comenzi AutoCAD [i func]ii AutoLISP [i pot automatiza opera]ii complexe `n cadrul AutoCAD-ului.

Subrutinele AutoLISP pot crea noi func]ii AutoLISP [i noi comenzi AutoCAD care pot fi folosite `n linia de comand\ sau `n cadrul fi[ierelor script [i menu-urilor AutoLISP.

Cum `nc\rc\m AutoLISP-ul ?

AutoLISP-ul este o component\ standard a AutoCAD-ului, portabil\ pe toate ma[inile de calcul. Interpretorul AutoLISP se `ncarc\ automat la fiecare sesiune AutoCAD.

AutoLISP opereaz\ `n cadrul editorului grafic AutoCAD. Interpretorul st\ `n "umbr\" `n timpul unei sesiuni de interpretare grafic\ a[tept`nd s\ evalueze o expresie simbolic\ introdus\ `n linia de comand\ a AutoCAD-lui.

AutoLISP-ul este disponibil numai `n cadrul editorului grafic.

Ce trebuie s\ [tim pentru a folosi AutoLISP-ul ?• Cuno[tinte temeinice de lucru cu AutoCAD.

Trebuie de asemenea s\ ave]i cuno[tin]e despre:

• Fi[iere script.

• Menu-uri utilizator.

~n unele cazuri este mai simplu [i mai u[or s\ optimiza]i o secvent\ de desenare cu un fi[ier script sau cu un menu de baz\ dec`t s\ folosi]i un program AutoLISP.

141246430.doc R.2.1 4/22/2013 •5

Page 6: Lectii Auto CAD

AUTODESK, INC.

Ce editor de text ar trebui folosit ?

Este nevoie de un editor de text ASCII pentru a crea fi[iere program AutoLISP pe baza acestui manual.

Fi[ierele de text ASCII pot fi `nt`lnite sub denumirea de fi[iere "programmer", "non-document" sau "unformatted".

Versiunea MS-DOS® 5.0 a ap\rut cu un editor de text simplu numit EDIT. Dac\ folosi]i versiunea DOS 386 a AutoCAD-ului din acest manual este posibil s\ dori]i s\ folosi]i acest editor.

Aplica]ia NOTEPAD din Microsoft® WindowsTM este un editor de text ASCII a[a cum este aplica]ia Text Editor din Sun Mycrosystems® SPARCTM din Open WindowsTM.

Exist\ o varietate de editoare de text gratuite [i care circul\ liber pentru AutoCAD [i AutoLISP `n cadrul Forumului CompuServe AutoCAD (GO ACAD). Orice editor profesional de programare este o unealt\ bun\ cu care se pot scrie fi[iere program AutoLISP.

Hardware pentru AutoLISP [i necesarul de memorie

Computerul dumneavoastr\ trebuie s\ aib\ hardware-ul [i memoria cerut\ de AutoCAD pentru a putea folosi AutoLISP-ul. Manualele AutoCAD Interface [i Installation And Performance Guide prezint\ cerin]ele specifice fiec\rei platforme.

Lansarea `n execu]ie

Lansa]i editorul grafic AutoCAD `nainte de a lansa orice alt\ comanda. Va trebui s\ introduce]i s-expresiile AutoLISP din linia de comand\.

V\ suger\m s\ lansa]i sesiunea de editare grafic\ ori de c`te ori utiliza]i acest manual.

•6

Page 7: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Expresii simbolice

Expresiile simbolice s`nt instruc]iuni de baz\ ale limbajului AutoLISP.

Obiective

~n acest capitol ve]i `nv\]a:

• Cum s\ crea]i o expresie simbolic\

• Cum recunoa[te AutoCAD-ul expresiile simbolice

• Cum s\ folosi]i expresiile simbolice `n cadrul comenzilor AutoCAD

• Cum s\ afla]i valoarea unei expresii simbolice

Instruc]iuni `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 s`nt principalul mijloc de construire a expresiilor simbolice `n AutoLISP. O expresie simbolic\ din AutoLISP poate fi comparat\ cu o propozi]ie `n limba englez\.

O expresie simbolic\ sau o s-expresie are `ntotdeauna o anumit\ valoare. Func]ia principal\ a LISP-ului este s\ determine valoarea unei s-expresii. De fiecare dat\ c`nd lans\m o s-expresie interpretorului LISP (de obicei sub forma unei liste, el va evalua acea expresie [i ne va da rezultatul. Acest rezultat se nume[te valoarea expresiei.

O expresie simbolic\ sau o s-expresie reprezint\ pur [i simplu o instruc]iune `n LISP.

S-expresiile `n AutoLISP s`nt construite prin `ncadrarea unei secven]e valide de caractere `ntre paranteze. Caracterul parantez\ st`nga sau ( se nume[te parantez\ deschis\ [i caracterul parantez\ dreapta sau ) se nume[te parantez\ `nchis\. ~n mod obi[nuit aceste caractere s`nt denumite deschis [i `nchis.

Parantezele dintr-o s-expresie trebuie s\ fie echilibrate. Oric\rei paranteze deschise trebuie sa-i corespund\ una `nchis\.

141246430.doc R.2.1 4/22/2013 •7

Page 8: Lectii Auto CAD

AUTODESK, INC.

Obs. Cea mai frecvent\ gre[eal\ `n AutoLISP este ne`nchiderea parantezelor. Editoarele de text profesionale au aceast\ caracteristic\ de a g\si parantezele corespondente cu un minim de efort.

Cum recunoa[te AutoCAD-ul o s-expresie

AutoCAD-ul recunoa[te o s-expresie AutoLISP printr-o parantez\ deschis\. Dac\ g\se[te o astfel de parantez\, AutoCAD-ul transfer\ intrarea utilizatorului c\tre interpretorul AutoLISP [i a[teapt\ rezultatul. AutoCAD afi[eaz\ rezultatul s-expresiei.

Command: (+ 1 2)

3Command:

AutoCAD AutoLISP(+ 1 2)

3

Figura 1. Diagrama de comunicatie dintre AutoCAD si AutoLISP

Exemplu

Pe linia de comand\ a AutoCAD-ului `nscrie]i s-expresiile `n coloana din st`nga a tabelului care urmeaz\. Compara]i rezultatele date de AutoCAD cu rezultatele care se afl\ `n coloana din dreapta a tabelului.

Command:(+12)3Command:

S-expresii Rezultate(+ 1 2) 3(- 2 1) 1(/ 4 2) 2

•8

Page 9: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(* 4 2) 8

Tabelul 1. Rezultatele expresiilor simbolice

S-expresiile [i comenzile AutoCAD

S-expresiile pot fi introduse ca intrare la comenzi AutoCAD. AutoCAD-ul va recunoa[te parantezele deschise, va transfera intrarea interpretorului AutoLISP [i va a[tepta rezultatul.

AutoCAD-ul tip\re[te rezultatul intr\rii s-expresiilor pe linia de comand\. AutoCAD-ul folose[te rezultatul unei s-expresii introduse, drept intrare la comanda curent\.

AutoCAD AutoLISP(/ 360 15)

24

Command:array

polarlast

5,5(/ 360 15)

Command:array

polarlast

5,520

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

141246430.doc R.2.1 4/22/2013 •9

Page 10: Lectii Auto CAD

AUTODESK, INC.

Exemplu

~n comanda "polar array" care urmeaz\, `mp\r]ind 360 de grade la 15 se determin\ num\rul de obiecte de creat, de exemplu se creaz\ un obiect la fiecare 15 grade de rota]ie.

Introduce]i comenzile.

Command: lineFrom point: 5,5To point: 5,8To point: Enter

Command: arraySelect objects: last1 foundSelect objects: EnterRectangular or Polar array (R/P): pCenter point of array: 5,5Number of items: (/ 360 15)Angle to fill (+=ccw, -=cw) <360>:Enter Rotate objects as they are copied? <Y>Enter

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

Caracterul semnul exclam\rii

AutoCAD-ul analizeaz\ intrarea utilizatorului `n linia de comand\ caut`nd un alt caracter AutoLISP asociat: semnul exclamarii sau !. Acest caracter este denumit `n mod frecvent bang. Dac\ semnul exclamarii este primul caracter, AutoCAD-ul transfer\ intrarea c\tre interpretorul AutoLISP [i a[teapt\ rezultatul.

Orice s-expresie valid\ poate urma dup\ semnul exclam\rii.

Command: !(+ 12)

•10

Page 11: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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

Command: !pi

Exemplu

pi este un simbol predefinit `n AutoLISP. Extrage]i valoarea simbolului pi pe linia de comand\ AutoCAD.

Command: !pi 3.14159 Command:

Recapitulare

• S-expresiile s`nt expresii AutoLISP valide aflate `ntre paranteze.

• AutoCAD-ul caut\ dou\ caractere speciale: parantezele deschise sau open [i semnul exclam\rii 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.

141246430.doc R.2.1 4/22/2013 •11

Page 12: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•12

Page 13: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Atomi [i liste

Exist\ dou\ mari categorii de tipuri de date `n AutoLISP: atomi [i liste. Atomii s`nt obiecte simple. Listele s`nt obiecte complexe. Acest capitol define[te atomii [i listele.

Obiective

~n acest capitol se va studia:

• Diferen]a dintre atomi [i liste

• Componentele unei liste

• Cum s\ recunoa[tem 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 num\r `ntreg

• 1

• un num\r real

• 4587.993401

• un [ir de caractere

• “A String Of Pearls “

• o func]ie AutoLISP predefinit\

• +

• un simbol

• XYZ

• sau oricare alt tip de obiecte existente `n tabelul 3-1.

141246430.doc R.2.1 4/22/2013 •13

Page 14: Lectii Auto CAD

AUTODESK, INC.

Tipuri de atomi Exemple Tip de data AutoLISP

simbol pi,x,mid_pt SYM

sir "Hello, world." STR

intreg 1,32767,-32768 INT

numar real 1.0,45.678,-876543.21 REAL

descriptor de fi[ier <File: #a82> FILE

nume entitate AutoCAD <Entity name: 6000001a> ENAME

set de selectie AutoCAD <Selection set: 1> PICKSET

subr (functie interna) <Subr: #1e32> SUBR

subr externa (Functia ADS) <Ext. Subr: 1 #3a970498> EXSUBR

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

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

Liste

Listele s`nt 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 func]ie.

• Obiectele din cadrul listei trebuie separate prin cel pu]in un spa]iu.

Iat\ c`teva exemple de liste. Observa]i c\ fiecare obiect este separat printr-un spa]iu de celelalte obiecte din cadrul listei.(+ 1 2 )(- 4 2 )(x y z )(1.0 1.0 0.0 )

Despre evaluarea listelor vom vorbi pu]in mai t`rziu.

Elementele unei liste

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

•14

Page 15: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Aceast\ list\ are trei elemente: numerele reale 1.0, 1.0 [i 0.0(1.0 1.0 0.0)

Aceast\ list\ are trei elemente: func]ia de adunare + (func]ie intern\), nr. `ntreg 1 [i nr. `ntreg 3.(+ 1 3)

Aceast\ list\ are trei elemente: func]ia de adunare +, nr. `ntreg 1 [i list\ (+ 2 3)(+ 1 (+ 2 3 ))

(+ 1 (+ 2 3))

First element: +

Second element: 1

Third element: (+ 2 3)Figura 4. Lista de trei elemente: doi atomi si o lista

Exemplu

Aceast\ list\ are trei elemente: func]ia de adunare +, lista (+ 1(+ 2 3)) [i lista (+ 4 5).

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

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

First element: +

Second element: (+ 1 (+ 2 3))

Third element: (+ 4 5)Figura 5. Lista de trei elemente: un atom si doua liste.

Ceea ce este `ncadrat `ntre paranteze reprezint\ o list\.

O list\ se compune dintr-o parantez\ de deschidere urmat\ de zero sau de mai multe obiecte care pot fi atomi sau liste dup\ care urmeaz\ o parantez\ de `nchidere.

141246430.doc R.2.1 4/22/2013 •15

Page 16: Lectii Auto CAD

AUTODESK, INC.

Condi]ii de eroare

C`nd introduce]i s-expresii `n linia de comand\ AutoCAD, interpretorul AutoLISP v\ va spune dac\ a]i introdus o expresie neechilibrat\. O expresie neechilibrat\ are mai multe paranteze deschise dec`t `nchise.

Iat\ o expresie neechilibrat\. ~i lipse[te o parantez\ `nchis\.

Command: (+ 1 (+ 2 3) 1>

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

n>

unde n este num\rul de paranteze `nchise care lipsesc.

S`nt dou\ modalit\]i de rezolvare `n cazul condi]iilor de eroare: completa]i num\rul corect de paranteze `nchise sau ap\sa]i Ctrl-C pentru a anula expresia [i a ne re`ntoarce `n linia de comand\.

Not\ Este de asemenea posibil s\ vede]i acest mesaj c`nd un [ir este neechilibrat. Un [ir neechilibrat are ghilimele duble la un cap\t [i simple la cel\lalt.

Particularit\]ile obiectului nil

Toate obiectele din AutoLISP s`nt atomi sau liste. Atomii [i listele se exclud mutual. Un atom nu este niciodat\ list\ [i o list\ nu este niciodat\ atom.

Excep]ia o face obiectul nil.

Obiectul nil este "lista goal\". Prin conven]ie nil este [i atom [i list\. nil poate fi exprimat `n dou\ moduri: 0 sau nil;.

nil este echivalentul AutoLISP pentru fals. Multe func]ii `n AutoLISP testeaz\ dac\ o condi]ie este adevarat\ sau fals\, de exemplu dac\ valoarea unui num\r este mai mare dec`t 0. De c`te ori un test de condi]ie este fals, AutoLISP-ul va returna obiectul nil ca fiind valoarea testului.

nil este singurul obiect din AutoLISP corespunzator lui "fals"; de aceea orice alt\ valoare returnat\ de un test de condi]ie trebuie s\ corespund\ lui "adev\rat".

•16

Page 17: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare• Cele dou\ mari clase de obiecte din AutoLISP s`nt

atomii [i listele.

• Exist\ c`teva tipuri diferite de atomi.

• Atomii s`nt obiecte care nu s`nt `ncadrate `ntre paranteze.

• Listele s`nt `ntodeauna `ncadrate `ntre paranteze

• Obiectele con]inute `ntr-o list\ constituie elementele unei liste

• Elementele unei liste pot fi atomi sau liste

• Elementele unei liste s`nt separate `ntre ele de cel pu]in un spa]iu

• AutoLISP detecteaz\ expresiile neechilibrate

• nil este [i atom [i list\

• nil este lista goal\

• nil este returnat de testele de condi]ie pentru a indica "fals"

141246430.doc R.2.1 4/22/2013 •17

Page 18: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 1: ATOMI SI LISTE

• ~n acest exerci]iu ve]i:

• Recapitula ce a]i `n]eles despre atomi [i liste

• Determina dac\ un obiect este atom sau list\

• Folosi AutoLISP pentru a afla valoarea diferitelor obiecte

Partea I1. Determina]i dac\ obiectul este atom sau list\.

2. Completa]i rezultatul evalu\rii `n c\su]a corespunzatoare.

Tabelul 3. Determinarea naturii obiectului

•18

Obiecte Atomi Liste

73.5

"0,0"

(1.0 2.0 3.0)

"String"

("String")

()

Page 19: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a1. Gasi]i valoarea acestui atom `n linia de comand\

AutoCAD

2. Tip\ri]i "!" urmat de un atom

3. Scrie]i r\spunsul `n coloana din dreapta:

ExempluCommand: !4.5

Tabelul 4. Determinarea valorii atomului

Partea a III-a1. Determina]i num\rul de elemente con]inut de fiecare

list\.

2. Scrie]i r\spunsul `n coloana din dreapta.

Lista 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

141246430.doc R.2.1 4/22/2013 •19

Atomi Valori

4.5

"text"

17

setq

xyz

nil

Page 20: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat

•20

Page 21: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EvaluareaEvaluarea 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 ve]i studia:

• Procesul evalu\rii

• Cum returneaz\ AutoLISP-ul o valoare

• Cum evalueaz\ AutoLISP-ul atomi [i liste

• Cum se folosesc func]iile aritmetice de baz\ `n AutoLISP

• Cum se anuleaz\ evaluarea unui obiect

• Cum leag\ AutoLISP-ul o valoare de o variabil\

Returnarea valorii

C`nd transmite]i 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 tip\rit valoarea returnat\ `n zona liniei de comand\.

Command: !pi3.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,5Number of items: (/ 360 15)Angle to fill (+=ccw, -=cw) <360>:Enter

141246430.doc R.2.1 4/22/2013 •21

Page 22: Lectii Auto CAD

AUTODESK, INC.

Number of items: (/ 360 15)

(/ 360 15)

24

AutoCAD prompt User enters

AutoLISP

receives

returns

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

Evaluarea atomilor

Atomii s`nt obiecte simple [i s`nt evalua]i 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 dec`t dup\ ce `nv\]am cum se leag\ o list\.

Tip de atom Exemplu Regula de evaluare

Valoare

Intreg 1 Valoarea este nr. insusi

1

Real 4.5 Valoarea este nr. insusi

4.5

Sir "text" Valoarea este nr. insusi

"text"

Simbol x Legarea curenta Ultima asignare

Tabelul 6. Reguli de evaluare a atomilor

Evaluarea listelor

Evaluarea unei liste poate fi facut\ `ntr-unul din aceste dou\ moduri: se ia lista ca atare sau se evalueaz\. ~n func]ie de natura listei, metodele dau rezultate diferite,de exemplu, valori diferite.

•22

Page 23: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Dac\ o list\ este luat\ ca atare, atunci valoarea ei este lista `ns\[i. Acest lucru va fi mai clar dup\ explicarea func]iei quote mai t`rziu `n aceast\ lec]ie.

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

• Pentru orice list\ care poate fi evaluat\, primul element din cadrul listei trebuie s\ fie o func]ie.

Listele s`nt evaluate potrivit instruc]iunilor referitoare la primul element al listei. Dac\ primul element este numele unei subrutine interne AutoLISP sau func]ii, restul de elemente ale listei s`nt transferate func]iei ca argumente formale [i s`nt evaluate de c\tre func]ie.

Func]iile s`nt fie func]ii interne AutoLISP, fie subrutine, a[a cum s`nt cele prezentate `n capitolul 4 al manualului AutoLISP Programmer’s Reference Manual, fie func]ii externe definite de utilizator sau exsubr definite de aplica]ii ADS, sau func]ii AutoLISP definite de utilizator.

Cum evalueaz\ AutoLISP-ul o list\

Vom folosi o list\ simpl\ pentru a ilustra procesul de evaluare a unei liste.

Aceasta este o list\ format\ din trei elemente: func]ia + numerele `ntregi 1 [i 2.(+ 1 2)

Etapa I: Analiza primului element

Primul element al unei liste pe care AutoLISP-ul o poate evalua trebuie s\ fie o func]ie.

AutoLISP-ul verific\ primul element al listei unde se a[teapt\ s\ g\seasc\ o func]ie. Dac\ primul element al listei pe care AutoLISP-ul `ncearc\ s\ o evalueze nu este o func]ie, acesta va da na[tere unei erori.

Elementele care urmeaz\ dup\ o func]ie `n cadrul unei liste s`nt argumentele func]iei; adic\ ele reprezint\ datele asupra c\rora func]ia opereaz\.

Etapa a II-a: Evaluarea func]iei

AutoLISP evalueaz\ func]ia. O func]ie evalueaz\ un set de instruc]iuni care sugereaz\ AutoCAD-ului cum s\ ac]ioneze mai departe.

Func]ia + evalueaz\ un set de instruc]iuni pentru AutoLISP. Dac\ ar fi s\ exprim\m `n cuvinte aceste instruc]iuni, am

141246430.doc R.2.1 4/22/2013 •23

Page 24: Lectii Auto CAD

AUTODESK, INC.

putea spune: g\si]i valoarea fiec\rui element din aceast\ list\. Care s`nt argumentele func]iei? Pune]i toate valorile la un loc [i returna]i rezultatul ca fiind valoarea `ntregii liste.

•24

Page 25: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Etapa a III-a: Continuarea instruc]iunilor func]iei

(.. 1 ..)

Urm\rind instruc]iunile din func]ia +, AutoLISP-ul g\se[te valoarea urm\torului element din list\: num\rul `ntreg 1. Numerele `ntregi se evalueaz\ pe sine. Astfel AutoLISP-ul memoreaz\ valoarea 1 `n stiva programului, de exemplu o introduce `ntr-o loca]ie de memorie temporar\.

(.. .. 2)

Con]in`nd cu instruc]iunile de la func]ia +, AutoLISP-ul verific\ dac\ mai s`nt [i alte elemente `n list\. Mai exist\ un element: num\rul `ntreg 2. AutoLISP-ul `i pastreaz\ valoarea `n stiv\.

Etapa a IV-a: Returnarea valorii func]iei

Nemaig\sind alte elemente `n list\, de exemplu argumente la func]ie, AutoLISP-ul `[i termin\ instruc]iunile de la func]ia + prin ad\ugarea valorilor argumentelor 1 [i 2 [i prin returnarea num\rului `ntreg 3 ca fiind valoarea listei.

Command: (+ 1 2) 3 Command:

Un exemplu mai complex

AutoLISP evalueaz\ elementele dintr-o list\ de la st`nga la dreapta.

~n multe cazuri ar fi convenabil pentru noi s\ urm\m procesul de evaluare din interior spre exterior dec`t de la dreapta spre st`nga. Rezultatele s`nt de obicei acelea[i [i adesea este mai u[or pentru noi s\ citim coduri AutoLISP cu un grad de imbricare mai mare, lucr`nd din interior `n exterior. Dar nu acesta este modul `n care AutoLISP-ul evalueaz\ o list\. ~ntotdeauna lucreaz\ de la st`nga la dreapta.

Considera]i aceast\ list\ format\ din trei elemente: (+ 1 (+ 2 3))

• Func]ia +

• Atomul 1

• Lista (+ 2 3)

141246430.doc R.2.1 4/22/2013 •25

Page 26: Lectii Auto CAD

AUTODESK, INC.

(+ 1 (+ 2 3))

value is 1 value is 5

value is 6

Figura 7. Evaluarea unei liste complexe

AutoLISP-ul evalueaz\ aceast\ list\ folosind exact aceea[i metod\ ca `n exemplul anterior.

(+ ..

AutoLISP-ul caut\ primul element al listei a[tept`nd s\ g\seasc\ o func]ie [i apoi o evalueaz\. Func]ia returneaz\ valoarea ei ca un set de instruc]iuni pentru AutoLISP.

(.. 1 ..

Urm`nd instruc]iunile func]iei +, AutoLISP-ul afl\ valoarea celui de al doilea element al listei, de ex. primul argument la func]ia +: atomul 1. Apoi `i memoreaz\ valoarea [i continu\.

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

AutoLISP-ul g\se[te valoarea celui de al treilea element al listei, cum ar fi al doilea argument la func]ia +.

Al treilea element este el `nsu[i o list\. Cum afl\ AutoLISP-ul valoarea unei liste? Prin evaluare. Cum evalueaz\ AutoLISP-ul o list\?

(.. .. (+ ..

Mai `nt`i evalueaz\ func]ia + [i `i prime[te instruc]iunile

( .. .. (.. 2 ..

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

Apoi g\se[te valoarea argumentelor 2 [i 3. Termin`ndu-i instruc]iunile de la func]ia + din cadrul listei (+ 2 3), AutoLISP-ul adaug\ valorile [i returneaz\ rezultatul care `n acest caz este nr. `ntreg 5.

•26

Page 27: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Nemaig\sind alte elemente `n list\, AutoLISP-ul termin\ instruc]iunile de la func]ia + `n lista principal\ prin ad\ugarea valorii celor dou\ elemente la un loc [i return`nd valoarea 6.

Func]ii aritmetice

AutoLISP-ul include func]ii interne pentru opera]ii aritmetice ca: adunarea, sc\derea, `nmul]irea [i `mp\r]irea

• + func]ia de adunare

• - func]ia de sc\dere

• * func]ia de `nmul]ire

• / func]ia de `mp\r]ire

141246430.doc R.2.1 4/22/2013 •27

Page 28: Lectii Auto CAD

AUTODESK, INC.

Exemple

Expresii aritmetice S-expresii AutoLISP

1 + 2 (+ 1 2)

2 - 1 (- 2 1)

2 * 4 (* 2 4)

4 / 2 (/ 4 2)

Tabelul 7. Aritmetica AutoLISP

Ordinea argumentelor `n func]iile de adunare [i de `nmul]ire nu are importan]\. Este `ns\ important\ pentru sc\dere [i `mp\r]ire.

(- 2 1)

Subtract this...

... from this.

Fig. 8 Ordinea argumentelor in functia de scadere

~n cazul sc\derii, valoarea celui de al doilea argument este sc\zut\ din valoarea primului argument [i rezultatul returnat este valoarea listei.

(/ 4 2)

Divide this...

... by this.

Fig. 9 Ordinea argumentelor in functia de impartire

~n cazul `mp\r]irii, valoarea celui de al doilea argument este divizorul valorii primului argument.

Iat\ c`teva exemple complexe.

•28

Page 29: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemple

Expresii aritmetice S-expresii AutoLISP

1 + (2 - 3) (+ 1 (- 2 3))

(4 + 2) - 1 (- (+ 4 2) 1)

4 * 4 / 2 (/ (* 4 4) 2)

4 / 2 * 3 (* 3 (/ 4 2))

Tabelul 8. Exemple complexe de expresii aritmetice

Recapitulare• AutoLISP-ul determin\ valoarea unui obiect prin

evaluare.

• AutoLISP-ul returneaz\ valoarea fiec\rui obiect pe care il evalueaz\.

• Majoritatea atomilor se evalueaz\ pe sine.

• Simbolurile se evalueaz\ prin legare sau atribuire.

• Listele s`nt evaluate printr-un proces standard.

• Primul element al oricarei liste ce poate fi evaluat\ trebuie s\ fie o func]ie.

• AutoLISP-ul are func]ii standard pentru opera]ii aritmetice.

141246430.doc R.2.1 4/22/2013 •29

Page 30: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 2: LISTE SI ARITMETICA LISTELOR

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre procesul de evaluare

• ~ncepe scrierea expresiilor AutoLISP folosind listele

• Transforma expresiile aritmetice `n expresii AutoLISP

• Transforma expresiile AutoLISP `n expresii aritmetice

Partea I1. Folosi]i func]ia +, -, /, [i *.

2. Transforma]i expresiile aritmetice `n expresii AutoLISP.

3. Scrie]i r\spunsurile `n coloana din dreapta.

Exemplu

Expresia `n nota]ia aritmetic\ standard:1 + 2

Expresia `n AutoLISP:( + 1 2 )

Expresii aritmetice S-expresii

3 + 10 + 5

20 * 15

16 - 10

15 / 3

5 + (10 * 2)

(5 + 10) * 2

Tabelul 9. Traducerea expresiilor aritmetice

•30

Page 31: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a1. Transforma]i s-expresiile `n expresii aritmetice

2. Scrie]i r\spunsurile `n coloana din dreapta

Exemplu

Expresia `n nota]ia aritmetic\ standard

(2 * 5) / (7 - 2)

Expresia `n AutoLISP(/ (* 2 5) (- 7 2))

Tabelul 10. Traducerea expresiilor AutoLISP

141246430.doc R.2.1 4/22/2013 •31

s-expresii expresii aritmerice

(+ 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)

Page 32: Lectii Auto CAD

AUTODESK, INC.

Liste neevaluate

Valoarea unei liste poate fi determinat\ `n unul din aceste dou\ moduri: se evalueaz\ lista sau se consider\ lista ca atare.

Func]ia AutoLISP quote este folosit\ pentru a returna o list\ sau un atom neevaluat, adic\ la valoarea ca list\.

Folosi]i quote ca fiind primul element `ntr-o list\ [i ad\uga]i un singur argument. Valoarea listei va fi valoarea neevaluat\ a celui de al doilea element al listei, adic\ argumentul la quote.

Exemplu

Aceast\ expresie returneaz\ lista (1.0 2.0 3.0) neevaluat\.

Command: (quote (1.0 2.0 3.0))(1.0 2.0 3.0)

Ce s-ar `nt`mpla dac\ AutoLISP-ului i s-ar cere s\ evalueze lista?

De ce?

Command: (1.0 2.0 3.0)?

Opera]ia de legare a dou\ obiecte

Legarea este procesul prin care o valoare este atribuit\ unui simbol definit de utilizator sau unei variabile. ~n AutoLISP, spunem c\ la un simbol sau la o variabil\ se leag\ o valoare. Aceasta `nseamn\ `n limbajul BASIC c\ o valoare este egal\ de o variabil\ sau c\ o valoare este atribuit\ unei variabile.

Func]ia AutoLISP setq se folose[te pentru a lega un simbol sau o variabil\ de o valoare.

Exemplu

Aceast\ expresie leag\ simbolul x de valoarea 4.5.

Command: (setq x 4.5)4.5Command: !x4.5

•32

Page 33: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

~n BASIC, aceea[i opera]ie ar putea fi exprimat\ astfel:

LET x = 4.5

Cum func]ioneaz\ func]ia setq

Valoarea func]iei setq este un set de instruc]iuni pentru AutoLISP.

Aceste instruc]iuni ar putea fi exprimate astfel: Lua]i primul argument ca atare. Nu-l evalua]i. G\si]i valoarea celui de al doilea argument. Lega]i primul argument de valoarea celui de al doilea argument. Returna]i valoarea leg\rii ca fiind valoarea listei.

Exemplu

Nota]i returnarea valorii acestei expresii. Valoarea listei este valoarea leg\turii stabilite pentru simbolul x de c\tre func]ia setq.

Command: (setq x 4.5)4.5

Recapitulare• Func]ia 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.

141246430.doc R.2.1 4/22/2013 •33

Page 34: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 3: EVALUAREA LISTELOR SI LEGAREA VARIABILELOR

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre procesul de evaluare

• Determina dac\ o list\ poate fi evaluat\ f\r\ erori

• Consolida cuno[tin]ele despre procesul de legare

• Folosi func]ia setq pentru a lega variabile de valori, adic\ ve]i atribui valori variabilelor

Partea I1. Determina]i dac\ o list\ poate fi evaluat\ sau trebuie

considerat\ ca atare.

2. Pune]i un semn `n coloana corespunz\toare

Tabelul 11. Determinarea situatiei in care o lista poate fi evaluata

•34

s-expresii Evaluari? Numai fata valorii?

(+ 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))

Page 35: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a

1. Lega]i variabila x de valorile din tabel

2. Folosi]i func]ia setq [i func]ia quote dac\ este necesar

3. Verifica]i valoarea variabilei folosind "bang" pentru a-i afla legarea curent\.

Exemplu

Command: (setq x 1)1Command: !x1

Command:(setq x (+ 1 2 3))6 Command: !x6

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

141246430.doc R.2.1 4/22/2013 •35

Page 36: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat.

•36

Page 37: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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

Obiective

~n acest capitol ve]i studia:

• Cum s\ folosi]i AutoLISP-ul `n cadrul comenzilor AutoCAD

• Cum s\ returna]i o valoare din AutoLISP c\tre o comand\ AutoCAD

Returnarea unei valori `n linia de comand\

Valoarea unei expresii AutoLISP este trecut\ din AutoLISP `n AutoCAD ca r\spuns la linia AutoCAD `n ac]iune.

Dac\ linia de comand\ este `n ac]iune, valoarea unei expresii este pur [i simplu tiparit\ `n zona liniei de comand\.

Command: (setq x (+ 4 6))10Command: !x10

Aceast\ expresie returneaz\ valoarea diviz\rii r\d\cinii p\trate num\rului 50 prin num\rul real 9.

Command: (/ (sqrt 50.0) 9.0)0.78567

Aceast\ expresie returneaz\ valoarea multiplic\rii rezultatului ob]inut prin adunarea lui 2.5 cu 6.3 de 24.0.

Command: (* (+ 2.5 6.3) 24.0)211.2

Returnarea unei valori la o comand\ AutoCAD

Dac\ o comand\ AutoCAD este `n ac]iune, atunci evaluarea unei expresii AutoLISP returneaz\ valoarea expresiei `n AutoCAD. Valoarea devine r\spunsul la linia curent\ a comenzii AutoCAD.

~n acest exemplu, comanda ARRAY recep]ioneaz\ ca num\r de repeti]ii ale func]iei, rezultatul unei expresii AutoLISP pentru care 6.0 se divide la 0.35; cu alte cuvinte, nu [tim dinainte c`te repeti]ii cuprinde unitatea 0.35 la o distant\ de 6.0 unita]i, deci rug\m AutoLISP-ul s\ calculeze valoarea pentru noi [i s\ returneze r\spunsul AutoCAD-ului.Deoarece comanda din ARRAY accept\ numai numere `ntregi [i nu numere reale, vom folosi func]ia AutoLISP fix pentru a rotunji cel mai apropiat num\r `ntreg.

141246430.doc R.2.1 4/22/2013 •37

Page 38: Lectii Auto CAD

AUTODESK, INC.

Exemplu

~ncepe]i un desen nou.

Tip\ri]i comenzile [i expresiile care urmeaz\.

Command: (/ 6.0 0.35)17.1429Command: (fix 17.1429)17Command: (fix (/ 6.0 0.35))17

Command: lineFrom point: 1,1To point: 5,5To point: Enter

Command: arraySelect objects: ISelect objects: EnterRectangular or Polar array (R/P): rNumber of rows (-) <1>: 1Number 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 num\r `ntreg) care ulterior este dat\ automat comenzii `n acel punct special la secven]a de cerere a comenzii.

•38

Page 39: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

~n exemplul urmator, AutoLISP-ul calculeaz\ m\rimea razei unei racord\ri.

Exemplu

~ncepe]i un desen nou.

Tip\ri]i expresiile [i comenzile care urmeaz\.

M\rimea razei unei racord\ri este stabilit\ la 2.24.

Command: lineFrom point: 1,1To point: 5,5To point: Enter

Command: lineFrom point: 10,1To point: 6,5To point: Enter

Command: filletPolyline/Radius/<Select two lines>: rEnter fillet radius <1.0>: (/ 28.0 12.5)

Command: filletPolyline/Radius/<Select two lines>: pick first lineSelect 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 r\spunsuri la cererile

de comand\ AutoCAD.

• AutoLISP returneaz\ valoarea unei s-expresii folosite `n cadrul unei comenzi AutoCAD la cererea comenzii.

141246430.doc R.2.1 4/22/2013 •39

Page 40: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 4: EXPRESII AUTOLISP IN CADRUL COMENZILOR AUTOCAD

~n acest exerci]iu ve]i:

• Folosi func]ii aritmetice [i func]ia setq pentru a crea valori [i leg\turi simbol

• Folosi valorile [i simbolurile ca r\spunsuri la cererile de comand\ AutoCAD

Instruc]iuni1. ~ncepe]i un desen nou.

2. Desena]i un arc cu un unghi inclus de 1 radian.

3. Desena]i dou\ cercuri concentrice: unul cu o raz\ de dou\ treimi pi [i unul cu o raz\ la jum\tate din aceast\ valoare.

4. Amplasa]i arcul `n jurul centrului cercurilor.

5. Fixa]i c`te o copie la fiecare 15 grade de rota]ie.Command: arcCenter/<Start point>: 5,5Center/End/<Second point>: cCenter: 3,5Angle/Length of chord/<End point>: aIncluded angle: (/ 180 pi)Command: (setq x (* pi (/ 2.0 3.0)))2.0944

Command: circle3P/2P/TTR/<Center point>: 5,5Diameter/<Radius>: !x

Command: circle3P/2P/TTR/<Center point>: 5,5Diameter/<Radius>: (/ x 2)

•40

Page 41: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (setq x (/ 360 15))24

Command: arraySelect objects: pick the arc1 foundSelect objects: EnterRectangular or Polar array (R/P): pCenter point of array: 5,5Number of items: !xAngle to fill (+=ccw, -=cw) <360>:Enter Rotate objects as they are copied? <Y>Enter

Figura 11. Array completat

141246430.doc R.2.1 4/22/2013 •41

Page 42: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat.

•42

Page 43: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Tipuri de date numericeAutoLISP-ul are dou\ tipuri de date numerice: numere `ntregi [i numere reale. Func]ia type returneaz\ tipurile de date ale unui obiect.

Obiective

~n acest capitol ve]i studia:

• Diferen]ele dintre cele dou\ tipuri de date numerice

• Cum s\ determina]i tipul de date al unui obiect

Determinarea tipului de date ale unui obiect

Func]ia AutoLISP type se folose[te pentru a determina tipul de date al unui obiect. type cere un argument [i returneaz\ un simbol care indic\ tipul de date al argumentului.

De exemplu, aceast\ expresie returneaz\ tipul de date al num\rului real 1.0

Command: (type 1.0)REAL

Numere reale

AutoLISP-ul reprezint\ numerele reale `n virgul\ mobil\, dubl\ precizie cu cel pu]in 14 zecimale. Nu exist\ tipuri de date care s\ reprezinte numere cu simpl\ precizie `n AutoLISP. Toate numerele reale s`nt cu dubl\ precizie [i ele s`nt reprezentate `n AutoLISP `n aceea[i manier\ ca `n AutoCAD.

Numerele reale s`nt numere introduse cu punct zecimal, de exemplu 4.5 sau 123.456.

Command: (setq x 4.5)4.5

Pentru valori cuprinse `ntre 1.0 [i -1.0, zero trebuie s\ precead\ punctul zecimal, de exemplu, 0.45 sau 0.123 sau -0.876.

Command: (setq x 0.123)0.123

Precizia afi[\rii si precizia intern\

Precizia implicit\ a afi[\rii unui num\r real `n AutoLISP este de 5 zecimale. Reprezentarea intern\ este `ntotdeauna men]inut\ cu cel pu]in 14 zecimale semnificative de precizie.

141246430.doc R.2.1 4/22/2013 •43

Page 44: Lectii Auto CAD

AUTODESK, INC.

Dac\ este necesar\ afi[area sau tip\rirea valorii unui num\r real cu o precizie mai mare dec`t precizia de afi[are a AutoLISP-ului, num\rul real poate fi transformat `ntr-un [ir cu ajutorul func]iei AutoLISP rtos [i apoi afi[at sau tip\rit cu precizia de afi[are dorit\.

rtos cere p`n\ la 3 argumente: un num\r real, un num\r `ntreg care reprezint\ unul dintre sistemele de unita]i AutoCAD [i num\rul de zecimale pentru [irul care va fi returnat.

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i simbolul x de num\rul real 4.5

Command: (setq x 4.5)4.5

Verifica]i-i valoarea [i tipul de date

Command: !x4.5Command: (type x)

Folosi]i func]ia rtos pentru a vizualiza valoarea lui x ca num\r zecimal cu o precizie de 8 zecimale.

Command: (rtos x 2 8)"4.50000000"

Numere `ntregi

Numerele `ntregi s`nt numere introduse f\r\ punct zecimal. Numerele `ntregi `n AutoLISP s`nt numere `ntregi cu semn pe 32 bi]i cuprinse `ntre 2.147.483.648 [i +2.147.483.647. De[i AutoLISP-ul folose[te valori de 32 bi]i, cele transferate `ntre AutoLISP [i AutoCAD s`nt limitate la valori de 16 bi]i, de exemplu nu se poate transfera o valoare mai mic\ de -32.768 sau mai mare de +32.767 `n AutoCAD. Dac\ folosi]i o valoare care dep\[este aceste limite, pute]i folosi func]ia float pentru a o transforma `ntr-un num\r real `nainte de a o transfera `n AutoCAD.

•44

Page 45: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i simbolul x de un num\r `ntreg cu valoarea de 65535.

Command: (setq x 64435)65535

Verifica]i-i valoarea [i tipul de date.

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

Folosi]i func]iile float [i fix pentru a returna valoarea lui x cu tipuri de date diferite [i folosi]i func]ia rtos pentru a imprima valoarea cu un format de zece zecimale.

Command: (type (float x))REALCommand: (type (fix (float x)))INTCommand: (rtos (float x) 2 10)"65535.0000000000"

Conversia automat\ a numerelor `ntregi

AutoLISP-ul va converti numerele `ntregi `n numere reale ori de c`te ori va `nt`lni ambele tipuri de date ca argumente la func]ie.

Dac\ dou\ numere `ntregi s`nt folosite ca argumente la func]ia de adunare +, valoarea returnat\ a expresiei este un num\r `ntreg; totu[i, dac\ argumentele s`nt un num\r real [i un num\r `ntreg, valoarea returnat\ este exprimat\ printr-un num\r real.

Exemplu

Aceast\ expresie returneaz\ un num\r `ntreg.

141246430.doc R.2.1 4/22/2013 •45

Page 46: Lectii Auto CAD

AUTODESK, INC.

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

Aceast\ expresie returneaz\ un num\r real.

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

Recapitulare

• AutoLISP-ul are dou\ tipuri de date numerice: numere `ntregi [i numere reale.

• Numerele `ntregi au valori de 32 bi]i `n AutoLISP.

• Numai numerele `ntregi cu valori de 16 bi]i pot fi transferate `ntre AutoLISP [i AutoCAD.

• Numerele reale s`nt numere zecimale cu dubl\ precizie.

• Numerele reale s`nt re]inute cu cel pu]in 14 zecimale de precizie.

• AutoLISP-ul va converti un num\r `ntreg `ntr-un num\r real c`nd le `nt`lne[te pe am`ndou\ `n cadrul aceleia[i expresii.

• Un num\r real trebuie `ntotdeauna s\ aib\ o cifr\ care precede punctul zecimal.

• Func]ia type returneaz\ tipul de date al unui obiect.

• Func]ia fix transform\ un num\r real `ntr-un num\r `ntreg.

• Func]ia float transform\ un num\r `ntreg `ntr-un num\r real.

•46

Page 47: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 5: FOLOSIREA NUMERELOR INTREGI SI REALE

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre tipurile de date ale numerelor `ntregi [i reale.

• Folosi func]ia 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 I1.Lega]i simbolurile de valori diferite.

2.Introduce]i s-expresia corespunzatoare `n linia de comand\ AutoCAD.

simbol valoare

a 1

b 2

c 3

x 1.0

y 2.0

z 4.5

Tabelul 13. Legarea variabilelor de valori numerice.

141246430.doc R.2.1 4/22/2013 •47

Page 48: Lectii Auto CAD

AUTODESK, INC.

Partea aII-a1.Determina]i valoarea returnat\ [i tipul de date pentru

fiecare expresie.

2.Scrie]i r\spunsurile `n coloanele corespunzatoare

3.Trebuie mai `nt`i s\ efectua]i prima parte a acestui exerci]iu.

expresia-s returnarea valorii tip de data pentru valoarea returnata

(+ 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.

•48

Page 49: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Puncte AutoCAD [i liste AutoLISP

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

Obiective

~n acest capitol ve]i studia:

• Cum reprezint\ AutoLISP-ul puncte

• Cum s\ construi]i o list\ care reprezint\ un punct folosind at`t constante c`t [i variabile.

Puncte AutoCAD

Un punct 3-dimensional este format din trei numere, fiecare av`nd o valoare independent\ care corespunde unei distan]e de la originea sistemului de coordonate de-a lungul axelor X, Y [i Z. Imagina]i-v\ punctul 3-D sub forma a trei cutii, fiecare con]in`nd un num\r real.

Distance from origin

axisX Y Zaxis axis

Figura 12. Punct 3-d reprezentat prin trei coordonate

Lua]i, 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, ag\]area de obiecte, filtre de coordonate etc. Dar reprezentarea intern\ a punctului se reduce la o asociere `ntre trei numere reale.

3-dimensional point 1,2,3

= 1.0 = 2.0 = 3.0X Y Z

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

AutoLISP-ul reprezint\ un punct AutoCAD 3-D sub forma unei liste formate din trei numere reale, unde primul

141246430.doc R.2.1 4/22/2013 •49

Page 50: Lectii Auto CAD

AUTODESK, INC.

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)

3-dimensional point 1,2,3 as an AutoLISP object

(1.0 2.0 3.0)

Figura 14. Lsta AutoLISP sub forma unui punct AutoCAD

Construirea listelor de coordonate ale punctelor

Rezultatul unei `ncerc\ri de a crea un obiect AutoLISP, recunoscut de AutoCAD ca punct 3-D, este clar: o list\ format\ din trei numere reale. Cum se poate construi o astfel de list\?

Exist\ dou\ func]ii pentru construirea acestor obiecte: quote [i list.

Construirea punctelor cu func]ia quote

A[a cum a]i observat mai devreme, func]ia quote impiedic\ procesul de evaluare pentru singurul ei argument [i returneaz\ acest argument neevaluat.

Construirea unei liste format\ din trei numere reale este un proces simplu cu ajutorul func]iei quote. De exemplu, expresia (quote (1.0 2.0 3.0) returneaz\ valoarea (1.0 2.0 3.0), o reprezentare AutoLISP valid\ a unui punct AutoCAD.

•50

Page 51: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Introduce]i expresiile care urmeaz\. Crea]i dou\ liste formate din c`te trei numere reale [i folosi]i 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: lineFrom point: !pt1To point: !pt2To point: Enter

pt1 (1.0 1.0 0.0)

pt2 (5.0 5.0 0.0)

Figura 15. Linie de la pt1 la pt2

Construirea punctelor cu func]ia list

Valoarea returnat\ a func]iei list este o list\ format\ din valorile argumentelor func]iei. Func]ia poate primi oric`te argumente dori]i.

list evalueaz\ fiecare argument, unul dup\ altul [i le memoreaz\ valoarea temporar. C`nd func]ia list `[i epuizeaz\ argumentele `[i compune valorile argumentelor din elemente `n cadrul unei liste [i returneaz\ lista.

141246430.doc R.2.1 4/22/2013 •51

Page 52: Lectii Auto CAD

AUTODESK, INC.

Exemplu

Introduce]i expresiile care urmeaz\.

~n timp ce lucra]i, nu uita]i c\ numerele reale se evalueaz\ pe sine, de exemplu, Command: !4.5 returneaz\ 4.5.

Folosi]i func]ia 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)

Folosi]i func]ia 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)

Folosi]i simbolul pt ca intrare la comanda AutoCAD ID [i verifica]i dac\ AutoCAD-ul recunoa[te valoarea simbolului ca punct valid 3-D.

Command: idPoint: !ptX=1.0000 Y=2.0000 Z=3.0000Command:

(list 1.0 2.0 3.0)

return value

(1.0 2.0 3.0)

evaluates to 1.0

evaluates to 2.0

evaluates to 3.0

evaluate all argumentsand return a list of values

Figura 16. Valoare returnata de functia list

•52

Page 53: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Construirea punctelor din variabile cu func]ia list

Deoarece func]ia list `[i evalueaz\ argumentele, pute]i folosi simboluri sau variabile ca argumente ale func]iei list pe/sau `n loc de numere reale.

S\ admitem c\ ave]i trei variabile x, y [i z care s`nt legate de numerele reale 1.0, 2.0 [i 3.0.

Value of x is 1.0, or x = 1.0

Value of y is 2.0, or y = 2.0

Value of z is 3.0, or z = 3.0

Bind x to 1.0

Bind y to 2.0

Bind z to 3.0

(setq x 1.0)

(setq y 2.0)

(setq z 3.0)

Figura 17.Legarea variabilelor de numere reale cu functia setq

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

(list x y z )

return value

(1.0 2.0 3.0)

evaluates to 1.0

evaluates to 2.0

evaluates to 3.0

evaluate all argumentsand return a list of values

Figura 18. Valoare returnata de functia list

141246430.doc R.2.1 4/22/2013 •53

Page 54: Lectii Auto CAD

AUTODESK, INC.

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i simbolurile x, y [i z de trei numere reale

Command: (setq x 1.0)1.0Command !x:1.0Command: (setq y 2.0)2.0Command: !y2.0Command: (setq z 3.0)3.0Command: !z3.0

Folosi]i variabilele ca argumente la func]ia list.

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

Memora]i lista `ntr-o variabil\ numit\ pt [i folosi]i-o `n cadrul comenzii AutoCAD.

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

Command: !pt(1.0 2.0 3.0)

Command: idPoint: !ptX=1.0000 Y=2.0000 Z=3.0000Command:

•54

Page 55: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare• AutoCAD-ul folose[te sistemul de coordonate

carteziene 3-D pentru a specifica punctele.

• Un punct AutoCAD este reprezentat `n AutoLISP sub forma unei liste de numere reale.

• AutoLISP-ul reprezint\ un punct AutoCAD 2-D sub forma unei liste format\ din dou\ numere reale.

• Un punct AutoCAD 3-D este reprezentat sub forma unei liste cu trei numere reale.

• Func]ia quote poate construi o list\ de numere din constante.

• Func]ia list poate construi o list\ de numere din constante sau din variabile.

141246430.doc R.2.1 4/22/2013 •55

Page 56: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 6: UTILIZAREA LISTELOR DE NUMERE CA PUNCTE AUTOCAD

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre rela]ia 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 r\spunsuri la cererile de comand\ AutoCAD.

Partea I1. Introduce]i expresiile `n coloana din st`nga.

2. Scrie]i valoarea returnat\ a fiecarei expresii `n coloana din mijloc.

3. Dac\ o legatur\ simbol apare `n cadrul expresiei, scrie]i-i valoarea `n coloana din dreapta.

Tabelul 15. Crearea punctelor din liste de numere

•56

Expresia Valoarea expresiei Simbol de atribuire

(setq x 1.0) 1.0 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

Page 57: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a1. ~n acela[i desen din partea I introduce]i expresiile care

urmeaz\.

2. Crea]i o Linie [i un Cerc folosind variabilele legate de liste formate din numere reale a[a cum s`nt punctele pentru comenzile AutoCAD.

3. Legaturile simbol se bazeaz\ pe partea I a acestui exerci]iu.

Command: lineFrom point: !pt1To point: !pt2To point: Enter

Command: circle3P/2P/TTR/<center point>: 2pFirst point on diameter: !pt1Second point on diameter: !pt2

5,6,0

1,2,0

Figura 19. Linie si cerc folosind variabilele pt1 si pt2

141246430.doc R.2.1 4/22/2013 •57

Page 58: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat.

•58

Page 59: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Separarea listelorAv`nd instruc]iuni pentru construirea listelor - func]iile list [i quote - ne-ar fi de folos s\ avem [i c`teva instruc]iuni pentru separarea listelor.

Dac\ am avea un set instruc]iuni pentru extragerea fiec\rui element dintr-o list\, atunci am putea realiza mult mai u[or programe AutoLISP.

• Desena]i un dreptunghi cunosc`nd numai coordonatele col]urilor opuse.

• G\si]i punctul de mijloc dintre oricare ar fi dou\ puncte ( nu numai punctele finale ) ale unei linii sau ale unui cerc.

• Determina]i 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 dec`t abilitatea de a separa liste, separarea listelor este o cerin]\ fundamental\ `n aceast\ opera]ie.

Obiective

~n acest capitol ve]i studia:

• Cum s`nt reprezentate listele `n memoria computerului sub forma unui arbore binar.

• Cum s`nt listele reprezentate grafic.

• Cum s\ folosi]i func]iile car [i edr pentru separarea listelor.

• Cum s\ separa]i liste care reprezint\ puncte `n AutoCAD [i cum s\ specifica]i puncte prin crearea unor liste noi bazate pe punctele existente.

Structura intern\ a unei liste

O list\ AutoLISP este reprezentat\ `n memoria computerului sub forma unui arbore binar. Orice punct de pe arborele binar unde poate ap\rea o ramifica]ie se nume[te nod. Nodul este una din unit\]ile fundamentale pentru stocarea memoriei `n AutoLISP.

Primul nod de sus al unui arbore binar se nume[te nodul radacin\.

141246430.doc R.2.1 4/22/2013 •59

Page 60: Lectii Auto CAD

AUTODESK, INC.

Structura unei liste AutoLISP este desf\cut\ nod cu nod, `ncep`nd de la nodul r\d\cin\. Fiecare nod se desface `n dou\ ramifica]ii reprezent`nd diferite p\r]i ale listei: primul element al listei [i lista cu primul element `ndep\rtat.

root of list

first element list without first element

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

De exemplu prima ramifica]ie 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)

•60

Page 61: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Subdivizarea de-a lungul ramifica]iei arborelui continu\ p`n\ ce partea dreapt\ a ramifica]iei 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\ par]i ale ramifica]iei listei. Primul element al listei se nume[te car-ul listei. Lista f\r\ primul ei element se nume[te cdr-ul listei. Ramifica]ia st`ng\ este partea car a listei iar ramifica]ia dreapt\ este partea cdr.

root of list

car cdr

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

141246430.doc R.2.1 4/22/2013 •61

Page 62: Lectii Auto CAD

AUTODESK, INC.

Reprezentarea unei liste cu trei elemente atomice prin car [i cdr, c\reia `i este atribuit simbolul x, ar ar\ta dup\ cum urmeaz\. Dac\ o list\ format\ din unul sau mai multe elemente se afl\ la oricare din nodurile arborelui, este urmat\ de o ramifica]ie. Partea st`ng\ a ramifica]iei este car-ul listei la care se refer\ nodul iar partea dreapt\ este cdr-ul listei la care se refer\ nodul.

root of x

(car x) (cdr x)

(car (cdr x)) (cdr (cdr x))

(car (cdr (cdr x))) (cdr (cdr (cdr x))) or ()

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

S\ combin\m graficul care reprezint\ arborele binar pentru valorile simbolului pt, care este legat de lista (1.0 2.0 3.0) cu ramifica]iile car [i cdr ale arborelui.

root of list

(car of list) (cdr of list)

(car (cdr of list)) (cdr (cdr of list))

(car (cdr (cdr of list))) (cdr (cdr (cdr of list)))

(1.0 2.0 3.0)

1.0 (2.0 3.0)

2.0 (3.0)

3.0 ()

(car pt)

pt

(cdr pt)

(car (cdr pt)) (cdr (cdr pt))

(car (cdr (cdr pt))) (cdr (cdr (cdr pt)))

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

•62

Page 63: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare• Listele s`nt reprezentate `n memorie sub forma

unui arbore binar.

• Primul element al listei este car-ul listei.

• Lista dup\ ce primul element este `ndep\rtat reprezint\ cdr-ul listei.

• Func]iile car [i cdr formeaz\ ramifica]iile car [i cdr

ale listei.

• O ramifica]ie cdr a unui arbore binar se termin\ `n nil sau lista goal\.

141246430.doc R.2.1 4/22/2013 •63

Page 64: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 7: GRAFUL VALORILOR INTR-UN ARBORE BINAR

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre reprezentarea listelor `n memorie.

• Completa un grafic a valorilor unei liste, reprezentat sub forma unui arbore binar.

Instruc]iuni1. Termina]i graful complet al unui arbore binar pentru

variabila alst.

2. alst este legat\ de lista (8.0 3.0 0.0).

3. Ar\ta]i valoarea fiecarui nod din grafic.

(8.0 3.0 0.0)

8.0 ?

? ?

? ?

Figura 26. Completarea grafului binar

•64

Page 65: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 8: GRAFUL EXPRESIILOR INTR-UN ARBORE BINAR

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre separarea listelor [i restabilirea elementelor lor individuale.

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

Instruc]iuni1. Termina]i graficul complet al unui arbore binar pentru

variabila xlst.

2. xlst este legat\ de lista (1.0 (2.0 3.0) 4.0).

3. Ar\ta]i valoarea fiec\rui nod din grafic

4. Ar\ta]i expresia care restabile[te fiecare valoare din grafic.

5. Marca]i ramifica]iile car [i cdr ale unui arbore.

6. Observa]i c\ elementele acestei liste s`nt formate din doi atomi [i o list\.

141246430.doc R.2.1 4/22/2013 •65

Page 66: Lectii Auto CAD

AUTODESK, INC.

(1.0 (2.0 3.0) 4.0)

1.0 ((2.0 3.0) 4.0)

(2.0 3.0) ?

? ?

(car xlst) (cdr xlst)

(car (cdr xlst))

(car (car (cdr xlst)))

(cdr (cdr xlst))

xlst

? ?

? ? ?

? ?

? ?

Figura 27. Completarea graficul binar

•66

Page 67: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]iile car si cdr

Func]iile car [i cdr s`nt func]ii non-destructive. Nici una dintre ele nu afecteaz\ legarea argumentului ei ceea ce este un mod curios de a spune despre (car x) c\ poate returna o valoare diferit\ de x dar nu va schimba valoarea lui x.

car

Func]ia car returneaz\ primul element al listei. Singurul argument al func]iei car trebuie s\ fie o list\, iar lista trebuie s\ aib\ unul sau mai multe elemente.

Exemplu

Introduce]i expresia care urmeaz\. Lega]i variabila pt la o list\ cu trei numere reale. Folosi]i func]ia car pentru a returna coordonata x `n list\ (primul element) [i lega]i variabila x de acea valoare.

Command: (setq pt (list 1.0 2.0 0.0))(1.0 2.0 0.0)Command: !pt(1.0 2.0 0.0)

Command: (car pt)1.0

Command: (setq x (car pt))1.0Command: !x1.0

Command: !pt(1.0 2.0 0.0)

cdr

Func]ia cdr returneaz\ o list\ [i elementele ei cu excep]ia primului element; cu alte cuvinte `ndep\rteaz\ primul element al listei `n afara valorii lui returnate.

141246430.doc R.2.1 4/22/2013 •67

Page 68: Lectii Auto CAD

AUTODESK, INC.

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i variabila pt de o list\ cu trei numere reale.

Command: (setq pt (list 1.0 2.0 0.0))(1.0 2.0 0.0)

Command: !pt(1.0 2.0 0.0)

Folosi]i func]ia cdr pentru a returna o list\ f\r\ primul element [i lega]i variabila yzlst de acea valoare.

Command: (cdr pt)(2.0 0.0)

Command: (setq yzlst (cdr pt))(2.0 0.0)

Command: !lyzlst(2.0 0.0)

Command: !pt(1.0 2.0 0.0)

Construirea unui dreptunghi cunosc`nd col]urile opuse

~n figurile care urmeaz\ cunoa[tem dou\ puncte din col]urile unui dreptunghi. Celelalte dou\ puncte se calculeaz\ prin combinarea cordonatelor X [i Y ale punctelor cunoscute `n diverse moduri pentru a forma noi perechi de coordonate.

known point

known point

calculated point

calculated point

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

•68

Page 69: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Aceast\ pagin\ este l\sat\ liber\ `n mod inten]ionat

141246430.doc R.2.1 4/22/2013 •69

Page 70: Lectii Auto CAD

AUTODESK, INC.

Figura care urmeaz\ reprezint\ coordonatele punctelor `n func]ie de variabilele X [i Y.

X1,Y1

X1,Y2

X2,Y1

X2,Y2

0,0

Figura 29. Valorile X,Y pentru colturile dreptunghiului

Considera]i c\ dou\ variabile s`nt 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\ func]iile necesare pentru returnarea valorilor X, Y [i Z din fiecare punct.

coordinate pt1 pt2

X (car pt1) (car pt2)

Y (car (cdr pt1)) (car (cdr pt2))

Z (car (cdr (cdr pt1))) (car (cdr (cdr pt2)))

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

•70

Page 71: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Figura urm\toare exprim\ punctele de coordonate sub forma de expresii AutopLISP, bazate pe cunoa[terea a dou\ puncte pt1 [i pt2. Pentru a simplifica lucrurile, acestea s`nt tratate ca puncte 2-dimensionale.

pt1

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

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

pt2

0,0

Figura 30. Calcularea colturilor unui dreptunghi

141246430.doc R.2.1 4/22/2013 •71

Page 72: Lectii Auto CAD

AUTODESK, INC.

Exemplu

Introduce]i expresiile care urmeaz\.

Folosi]i func]ia list pentru a le combina `n alte dou\ puncte ale dreptunghiului.

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

Command: !pt1(1.0 5.0)

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

Command: !pt3(10.0 1.0)

Folosi]i func]iile car [i cdr pentru a extrage valorile X [i Y ale punctelor cunoscute.

Command: (car pt1)1.0

Command: (car (cdr pt3))1.0

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

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

Command: !pt2(1.0 1.0)

Command: (car pt3)10.0

Command: (car (cdr pt1))5.0

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

•72

Page 73: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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

Command: !pt4(10.0 5.0)

Desena]i dreptunghiul folosind linia de comand\ AutoCAD.

Punctele s`nt 2-dimensionale. Linia de comand\ AutoCAD va completa automat valoarea Z a punctului bazat\ pe valoarea curent\ a in\l]imii (elevation).

Command: lineFrom point: !pt1To point: !pt2To point: !pt3To point: !pt4To point: close

1,5

1,1

10,5

10,1

0,0

pt1

pt2 pt3

pt4

Figura 31. Localizarea colturilor unui dreptunghi

Recapitulare• Func]ia car returneaz\ primul element al unei

listei.

• Func]ia cdr returneaz\ o list\ cu excep]ia primului element.

• Exist\ func]ii standard la care se face apel pentru stabilirea componentelor X, Y [i Z ale unui punct reprezentat printr-o list\.

141246430.doc R.2.1 4/22/2013 •73

Page 74: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 9: LUCRUL CU LISTE DE PUNCTE

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre func]ii care separ\ liste [i func]ii care creaz\ liste.

• Crea puncte formate din liste [i le ve]i 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 distan]ei dintre ele pot fi exprimate logic `n func]ie de X [i Y dup\ cum urmeaz\.

pt1 = pt1x, pt1ypt2 = pt2x, pt2ymidpt = mptx, mpty

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

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

Instruc]iuni

Scrie]i un set de expresii AutoLISP care execut\ urmatoarele comenzi `n ordine

1. Lega]i o variabil\ pt1 de lista format\ din dou\ numere reale 1.5 [i 8.9.

2. Lega]i o variabil\ pt2 de o list\ format\ din dou\ numere reale 7.8 [i 3.2.

3. Scrie]i un set de expresii care leag\ variabila midpt de punctul care se afl\ la mijlocul distan]ei dintre punctele pt1 [i pt2.

Dupa ce a]i verificat expresiile `n editorul AutoCAD scrie]i-le mai jos.

•74

Page 75: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Comenzi AutoCAD si AutoLISPComenzile AutoCAD pot fi chemate direct din AutoLISP, s-expresiile AutoLISP pot fi folosite ca r\spunsuri la cererile de comand\.

Obiective

~n acest capitol ve]i studia:

• Cum s\ chema]i o comand\ AutoCAD direct din AutoLISP.

• Cum s\ folosi]i [irul AutoLISP, s-expresiile constante [i variabile ca r\spunsuri la cererile de comand\.

• Sintaxa func]iei AutoLISP command.

• Cum s\ evita]i lucrul c`nd traduce]i un program folosind comenzile `n limba englez\ indiferent de versiunea AutoCAD.

Func]ia command

Func]ia command apeleaz\ func]iile AutoCAD din AutoLISP. Func]ia command accept\ un argument de tip [ir care trebuie s\ fie numele unei comenzi AutoCAD [i oricare alte argumente op]ionale care ar fi `n mod normal introduse `n linia de comand\.

~n cazurile `n care este nevoie de un return ca r\spuns 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 func]iei apelative command.

Func]ia command accept\ [iruri [i variabile AutoLISP ca argumente. De exemplu aceste trei seturi de expresii traseaz\ aceea[i entitate Line.

Folosirea argumentelor de tip [ir

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

Folosirea argumentelor constante

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

Folosirea argumentelor variabile

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

141246430.doc R.2.1 4/22/2013 •75

Page 76: Lectii Auto CAD

AUTODESK, INC.

(5.0 5.0)

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

Efecte secundare

Func]ia command returneaz\ `ntotdeauna nil. Efectul secundar al unei expresii command este mult mai interesant dec`t valoarea returnat\. Un efect secundar al unei expresii AutoLISP reprezint\ o schimbare `n starea programului care se produce datorit\ unei func]ii de apelare. Efectul secundar al apel\rii unei func]ii setq este pentru a crea un nou simbol de legatur\ sau pentru a atribui o valoare la o variabil\. Efectul secundar al apel\rii unei func]ii command este de a realiza o comand\ AutoCAD care modific\ fi[ierul grafic `ntr-un anume fel.

Exemplu

~ncepe]i un desen nou.

Introduce]i expresiile care urmeaz\.

Lega]i 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)

Apela]i la comanda LINE [i folosi]i variabilele ca argumente.

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

1,1

5,5

Figura 32. Linie de la 1.1 la 5.5

•76

Page 77: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Introduce]i expresiile care urmeaz\.

Folosi]i variabilele pt1 [i pt2 de la exerci]iul anterior ca puncte reprezent`nd centrele a dou\ cercuri [i ca puncte finale ale diametrului unui cerc.

Command: circle3P/2P/TTR/<center point>: !pt1Diameter/<Radius>: 0.5Command: (command "circle" pt2 0.5)Command: (command "circle" "2p" pt1 pt2)

Figura 33. Cercuri definite de pt1 si pt2

141246430.doc R.2.1 4/22/2013 •77

Page 78: Lectii Auto CAD

AUTODESK, INC.

Exemplu

Folosi]i valorile lui pt1 [i pt2 de la exerci]iul anterior.

Introduce]i expresiile care urmeaz\.

Desena]i dou\ arce folosind pt1 [i pt2 ca puncte finale [i o valoare a razei de 3.5.

Command: arcCenter/<Start point>: !pt1Center/End/<Second point>: eEnd point: !pt2Angle/Direction/Radius/<Center point>: rRadius: 3.5

Command:(comand”arc” pt2 ”e” pt1 ”r” 3.5)

Figura 34. Arce definite de pt1 si pt2

•78

Page 79: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Globalizarea comenzilor

Toate versiunile AutoCAD-ului vor accepta comenzile [i op]iunile din limbajul american [i englezesc indiferent de versiunea limbii surs\. Acest lucru permite utilizatorului s\ scrie o aplica]ie AutoLISP care poate fi folosit\ `n toate versiunile de limbaj ale AutoCAD-ului f\r\ a traduce func]iile command `n limba surs\.

Fiecare versiune AutoCAD tradus\ `ntr-o anumit\ limb\ pastreaz\ un menu de op]iuni [i comenzi din limba surs\. De exemplu versiunea german\ AutoCAD pastreaz\ un menu de op]iuni [i comenzi `n limba german\ astfel `ncit cei care o folosesc `[i pot introduce comenzile `n german\. Toate versiunile AutoCAD indiferent de limba surs\ p\strez\ un menu de op]iuni [i comenzi `n engleza american\ `mpreun\ cu un menu `n limba surs\.

Pentru a folosi versiunea englezeasc\ a comenzilor [i op]iunilor AutoCAD, prefa]ati [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 c\tre func]ia command.

• Expresiile AutoLISP s`nt acceptate ca r\spunsuri la cererile de comand\ AutoCAD `n cadrul func]iei command.

• Argumentele func]iei command s`nt numele comenzii AutoCAD urmate de r\spunsurile la cererile de comand\.

• Caracterul subliniere poate fi prefa]at `n cadrul unei instruc]iuni de tip command `n engleza american\ [i va func]iona `n toate versiunile de limbaj ale AutoCAD-ului.

141246430.doc R.2.1 4/22/2013 •79

Page 80: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 10: TRANSFORMAREA COMENZILOR IN AUTOLISP

~n acest exerci]iu ve]i:

• Transforma comenzile AutoCAD script `n expresii AutoLISP.

• Scrie expresiile.

• Testa expresiile `n editorul AutoCAD.

Instruc]iuni1. ~ncepe]i un desen nou.

2. Transforma]i comenzile [i cererile AutoCAD `n expresii ale func]iei command. Scrie]i r\spunsurile `n coloana din dreapta.

3. Testa]i expresiile `n editorul AutoCAD.

Comenzi si cereri

Command: lineFrom point: 1,1To point: 5,5To point: ENTER

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

Command: circle3P/2P/TTR/<Center point>: 2pFirst point on diameter: 1,1Second point on diameter: 5,5

Command: arcCenter/<Start point>: 2,1Center/End/<Second point>: cCenter: 1,1Angle/Length of chord/<End point>: lLength of chord: 1.414

Expresii AutoLISP

(command "line" "1,1" "5,5" "")

or

(command "line" '(1.0 1.0) '(5.0 5.0) "")

Tabelul 17. Traducerea comenzilor in AutoLISP

•80

Page 81: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 11: APELUL COMENZII POLYLINE DIN AUTOLISP

~n acest exerci]iu:

• Ve]i folosi AutoLISP-ul pentru a executa o comand\ AutoCAD [i pentru a desena o nou\ entitate.

• Ve]i apela comanda AutoCAD PLINE din AutoLISP.

• Ve]i scrie un set de expresii AutoLISP pentru a desena o polilinie rectangular\.

Instruc]iuni1. ~ncepe]i un desen nou.

2. Crea]i 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. Folosi]i variabilele pt1 [i pt3.

4. Scrie]i un set de expresii ce vor desena un dreptunghi, folosind comanda "Polyline" op]iunea 2-D `nchis\ de la punctul 1,1 la 11,1 la 11,8 la 1,8, folosind variabilele pt1 [i pt3.

5. Folosi]i func]iile car, cdr, list [i command dac\ este nevoie.

6. Testa]i expresiile `n AutoCAD.

7. Scrie]i-le mai jos.

141246430.doc R.2.1 4/22/2013 •81

Page 82: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•82

Page 83: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Selec]ia interactiv\ a punctelorAutoLISP-ul dispune de func]ii care opresc evaluarea unei expresii [i permit utilizatorului s\ stocheze puncte [i distan]e folosind metodele standard AutoCAD de specificare a acestor valori. Punctul sau distan]a devine valoarea returnat\ a expresiei.

Obiective

~n acest capitol ve]i studia:

• Cum s\ cere]i informa]ii utilizatorului `n cadrul unui program AutoLISP.

• Cum s\ cere]i coordonatele unui punct utilizatorului.

• Cum s\ cere]i o distan]\ utilizatorului.

• Cum s\ cere]i utilizatorului valoarea pe care o dori]i.

• Cum s\ folosi]i puncte [i distan]e de la utilizator `n cadrul func]iilor AutoLISP command [i comenzilor AutoCAD.

Puncte si distan]e

Func]ia getpoint permite utilizatorului s\ selecteze un punct folosind orice metode standard AutoCAD de selectare a punctelor: selectare grafic\, coordonate absolute, relative sau relative polare, ag\]area obiectelor, filtre de coordonate sau accesarea ultimului punct.

Func]ia getdist permite utilizatorului s\ specifice o distant\ prin introducerea valorii sau selec]iond dou\ puncte. Este acela[i mecanism folosit de fiecare comand\ AutoCAD care cere utilizatorului o distan]\.

getpoint

Func]ia getpoint folose[te 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)

Func]ia getpoint este folosit\ pentru a ob]ine un punct de la utilizator `n cadrul unei expresii AutoLISP. De exemplu ar putea fi nevoie s\ cere]i utilizatorului din cadrul unui

141246430.doc R.2.1 4/22/2013 •83

Page 84: Lectii Auto CAD

AUTODESK, INC.

program AutoLISP, puncte care vor fi folosite apoi ca puncte finale ale unei linii.

•84

Page 85: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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 s`nt disponibile `n timpul apel\rii func]iei getpoint, nu s`nte]i constr`ns s\ introduce]i 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

Introduce]i expresiile care urmeaz\. Lega]i variabilele pt1 [i pt2 de puncte pe care le selecta]i cu mouse-ul `n cadrul unei func]ii de apelare getpoint [i folosi]i 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

Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de un punct pe care `l selecta]i cu mouse-ul [i variabila pt2 de un punct descris de coordonatele polare relative. Folosi]i variabilele `n linia de comand\.

Command: (setq pt1 (getpoint ))pick a point

Command: (setq pt2 (getpoint))@2<45

141246430.doc R.2.1 4/22/2013 •85

Page 86: Lectii Auto CAD

AUTODESK, INC.

Command: (command “line” pt1 pt2” “)

Exemplu

Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de un punct pe care `l selecta]i cu mouse-ul `n cadrul unei func]ii de apelare getpoint [i folosi]i variabila `ntr-o comand\ CIRCLE.

Command: (setq pt1 (getpoint))pick a point

Command: (command “circle” pt1 0.5)

getdist

Func]ia getdist cere utilizatorului dou\ puncte. Valoarea returnat\ este un num\r real: distan]a 3-D `ntre dou\ puncte.

Command: (setq dst1 (getdist))Second point: 2,21.41421Command: !dst11. 41421

Func]ia getdist prime[te un argument op]ional, punctul de baz\ de la care se m\soar\ distan]a. ~n acest caz func]ia 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,21.41421Command: !dst11.41421

•86

Page 87: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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

Exemplu

Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de un punct folosind coordonatele absolute [i variabila rad de distan]a dintre dou\ puncte pe care o selecta]i cu mouse-ul. Folosi]i 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

Introduce]i expresiile care urmeaz\. Lega]i variabila cen de un punct pe care `l selecta]i cu mouse-ul. Lega]i variabila rad de distan]a dintre cen [i un punct pe care `l selecta]i cu mouse-ul. Folosi]i variabilele `n comanda CIRCLE.

Command: (setq cen (getpoint))pick a point

Command: (setq rad (getdist cen))pick a point

Command: (command “circle” cen rad)

141246430.doc R.2.1 4/22/2013 •87

Page 88: Lectii Auto CAD

AUTODESK, INC.

Dialog cu utilizatorul

Func]iile getpoint [i getdist primesc [i argumente op]ionale: un [ir de text care este afi[at `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,21.41421

Deoarece getdist prime[te dou\ cereri op]ionale, ordinea [i tipul de date `n acest caz s`nt importante. Dac\ primul argument al func]iei 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,21.41421

Recapitulare•

• Func]ia getpoint returneaz\ un punct de la utilizator.

• Func]ia getdist returneaz\ o distan]\ dat\ sub forma unui num\r real de la utilizator.

• Ambele func]ii primesc argumente op]ionale pentru utilizator.

• Utilizatorul poate aplica oricare dintre metodele AutoCAD de specificare a punctelor [i distan]elor la o cerere AutoLISP pentru un punct sau o distan]\.

•88

Page 89: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

141246430.doc R.2.1 4/22/2013 •89

Page 90: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 12: CEREREA SI FOLOSIREA PUNCTELOR DE LA UTILIZATOR

~n acest exerci]iu ve]i:

• Scrie expresiile care cer utilizatorului puncte [i distan]e.

• Scrie comenzile de desenare `n AutoCAD.

Partea I

Instruc]iuni

Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD apoi scrie]i-le mai jos.

1. Cere]i utilizatorului patru puncte.

2. Atribui]i-le variabilelor pt1 prin pt4.

3. Trasa]i o polilinie 2-D `nchis\ `ntre cele patru puncte.

Partea a II-a

Instruc]iuni

Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD apoi scrie]i-le mai jos.

1. Cere]i utilizatorului un punct centru [i atribui]i valoarea unei variabile numite cen.

2. Cere]i utilizatorului distan]a de la variabila cen [i atribui]i valoarea unei variabile numite rad.

3. Desena]i un cerc cu centrul cen [i raza rad.

•90

Page 91: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a III-a

Instruc]iuni

Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD apoi scrie]i-le mai jos.

1. Cere]i utilizatorului dou\ puncte.

2. Atribui]i-le variabilelor pt1 [i pt2.

3. Desena]i o polilinie 2-D `nchis\.

4. Folosi]i pt1 [i pt2 pentru col]urile opuse ale poliliniei.

5. Calcula]i celelalte dou\ puncte din pt1 [i pt2 folosind func]iile car, cdr [i list.

141246430.doc R.2.1 4/22/2013 •91

Page 92: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•92

Page 93: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]iiPe l`ng\ func]iile interne, AutoLISP-ul permite crearea func]iilor definite de utilizator, adic\ func]ii ale caror seturi de instruc]iuni [i nume au fost definite.

Obiective

~n acest capitol ve]i studia:

• Defini]ia func]iei AutoLISP.

• Cum s\ crea]i propriile func]ii AutoLISP.

• Sintaxa func]iei defun.

• Cum s\ trimite]i argumente unei func]ii.

• Cum returneaz\ func]ia o valoare.

Func]iile si evaluarea listelor

Considera]i procesul de evaluare al unei expresii tipice care folose[te o func]ie intern\ AutoLISP.

(setq x 10)

AutoLISP-ul evalueaz\ primul element unde se a[teapt\ s\ gasesc\ o func]ie. Aici g\se[te subprogramul setq [i reface leg\tura. Legarea lui setq reprezint\ un set de instruc]iuni care arat\ cum trebuie facut\ procesarea. AutoLISP-ul evalueaz\ argumentele lui setq `n ordine [i termin\ prin aplicarea instruc]iunilor 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.

setq este un subprogram [i instruc]iunile lui au fost predefinite `n AutoLISP. Utilizatorul nu le poate schimba. Totu[i este posibil\ crearea unor noi func]ii care s\ execute orice instruc]iuni de procesare dorite de utilizator.

Leg\turi noi se creaz\ prin folosirea subprogramului defun care este func]ia de definire.

141246430.doc R.2.1 4/22/2013 •93

Page 94: Lectii Auto CAD

AUTODESK, INC.

Sintaxa func]iei defun

Sintaxa func]iei defun este pu]in diferit\ de cea a celorlalte func]ii folosite p`n\ acum.

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

defun cere obligatoriu dou\ argumente [i un num\r variabil de argumente care urmeaz\ dup\ primele dou\.

Argumentele func]iei defun

Primul argument al func]iei este numele noii func]ii de definit. Folosi]i un nume nou pe care l-a]i creat, de preferin]\ unul care descrie ac]iunile func]iei.

ATEN}IE Nu folosi]i niciodat\ numele unei func]ii sau a unui simbol construite intern deoarece acesta se va suprapune peste defini]ia original\ [i `l va face inaccesibil p`n\ lansa]i AutoLISP-ul `n cadrul unei noi sesiuni AutoCAD.

~n acest exemplu, primul argument al func]iei defun este numele simbol myfun care devine numele func]iei definite de utilizator.

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

Al doilea argument cerut de defun este o list\ de argumente cerute [i variabile locale. Cele dou\ tipuri de argumente s`nt separate de o linie. Acum este suficient s\ folosi]i 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 s`nt expresii de evaluat c`nd se execut\ func]ia definit\ de utilizator. Ele reprezint\ instruc]iunile de procesare care vor fi executate c`nd func]ia va fi apelat\.

Returnarea valorii unei func]ii

Valoarea returnat\ a func]iei definite de utilizator este valoarea ultimei expresii din corpul defini]iei func]iei.

•94

Page 95: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

~n urm\toarele exemple, expresiile vor fi ad\ugate corpului func]iei myfun. Seturi diferite de expresii vor da `n]elesuri diferite func]iei myfun precum [i valori returnate diferite.

~n acest exemplu myfun adaug\ dou\ numere [i returneaz\ r\spunsul.(defun myfun ( ) (+ 1 2 ))

Exemplu

Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun apoi apela]i-o.

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

Command: (myfun)3

Exemplu

Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun apoi apela]i-o. myfun va returna radacina patrat\ a lui 624, rotunjit\ p`na la cel mai apropiat num\r `ntreg.

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

Command: (myfun)24

Exemplu

Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun apoi apela]i-o. myfun va returna distan]a dintre dou\ puncte alese de utilizator.

Command: (defun myfun () (getdist “From point: “))MYFUN

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

141246430.doc R.2.1 4/22/2013 •95

Page 96: Lectii Auto CAD

AUTODESK, INC.

~n cele trei exemple pe care le-a]i parcurs, valoarea returnat\ a func]iei myfun este valoarea returnat\ a ultimei expresii din corpul defini]iei.

(defun myfun ()

(+ 1 2)

)

function name

list of required arguments and local variables

body of definition

Figura 36.Corp de expresii pentru o definitie a functiei

Expresii multiple pot fi introduse `n corpul defini]iei func]iei. Valoarea returnat\ a func]iei este valoarea returnat\ a ultimei expresii din corpul defini]iei.

~n acest exemplu valoarea returnat\ a func]iei myfun este valoarea expresiei (+3 4)

Command: (defun myfun () (+1 2) (+3 4))MYFUNCommand: (myfun)7

(defun myfun ()

(+ 1 2)

)

function name

list of required arguments and local variables

body of definition

(+ 3 4)return value of function

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

•96

Page 97: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Argumentele unei func]ii(defun myfun (<arg list> / <local var>) <expr>... )

Lista argumentelor cerute dintr-o expresie defun v\ permite s\ ad\uga]i argumente la func]iile de apelare.

~n acest exemplu func]ia myfun este definit\ cu un singur argument solicitat: simbolul x. x este folosit `n cadrul expresiei din corpul defini]iei func]iei 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))MYFUN10Command: (myfun 1)20Command: (myfun 2)Command:

(myfun 1)

(defun myfun (x)(* x 10)

)

user calls myfun with argument of 1

1 is mapped into argument x

value of x becomes 1 in body of expressions

(defun myfun (1)

(* x 10))

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

141246430.doc R.2.1 4/22/2013 •97

Page 98: Lectii Auto CAD

AUTODESK, INC.

Exemplu

Introduce]i expresiile care urmeaz\. Crea]i o func]ie numit\ add-one care solicit\ un argument. Ad\uga]i unu la valoarea lui [i returna]i. Folosi]i func]ia cu dou\ valori diferite

.

Command: (defun add-one (x) (+ x 1))ADD-ONECommand: (add-one 1)2Command: (add-one 4)5

Exemplu

Introduce]i expresiile care urmeaz\. Crea]i o func]ie numit\ dtr care cere un argument exprimat `n grade [i returneaz\ valoarea transformat\ `n radiani. Folosi]i func]ia cu trei valori diferite.

Formula aritmetic\ pentru transformarea gradelor `n radiani pentru valoarea d este:(d / 180) * pi

Command: (defun dtr (d) (* pi (/ d 180.0)))DTRCommand: (dtr 180)3.14159Command: (dtr 360)6.28319Command: (dtr 90)1.5708

Exemplu

Introduce]i expresiile care urmeaz\. Crea]i o func]ie care se nume[te add-two care cere dou\ argumente, adaug\ valorile lor [i returneaz\. Folosi]i func]ia cu dou\ seturi de valori diferite.

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

•98

Page 99: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare•

• Noile func]ii externe s`nt create cu ajutorul func]iei defun.

• Toate func]iile returneaz\ o valoare.

• Func]iile s`nt definite f\r\ argumente sau cu un num\r fix de argumente solicitate.

• Argumentele unei func]ii s`nt evaluate oriunde s-ar afla `n corpul defini]iei func]iei.

141246430.doc R.2.1 4/22/2013 •99

Page 100: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 13: DEFINREA UNOR NOI FUNCTII

Trebuie s\ completa]i partea a III-a a acestui exerci]iu. Se vor face referiri la aceast\ parte `n exerci]iile care urmeaz\.

~n acest exerci]iu ve]i:

• Consolida cuno[tin]ele despre cum s`nt create func]iile definite de utilizator.

• Scrie func]ii cu argumente solicitate.

• Scrie o func]ie care apeleaz\ o comand\ AutoCAD.

Partea I

Instruc]iuni

1. Crea]i o func]ie numit\ times-two.

2. Func]ia solicit\ dou\ argumente.

3. Func]ia multiplic\ cele dou\ argumente [i returneaz\ valoarea.

4. Testa]i-o `n AutoCAD.

5. Scrie]i-o mai jos.

Partea a II-a

Instruc]iuni1. Crea]i o func]ie numit\ rtd.

2. Func]ia solicit\ un argument.

3. Func]ia transform\ valoarea argumentului din radiani `n grade [i returneaz\ valoarea.

4. Testa]i-o `n AutoCAD.

5. Scrie]i-o mai jos.

Formula aritmetic\ de transformare din radiani `n grade pentru valoarea r este:(r / pi) * 180

•100

Page 101: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a III-a

Instruc]iuni1. Crea]i o func]ie numit\ rectangle.

2. Func]ia nu cere argumente.

3. Cere]i utilizatorului dou\ puncte [i memora]i-le sub form\ de variabile.

4. Trasa]i o polilinie 2-D `nchisa folosind punctele pentru col]urile opuse.

5. Calcula]i celelalte dou\ puncte cu ajutorul func]iilor car, cdr [i list.

6. Testa]i-o `n AutoCAD.

7. Scrie]i-o mai jos.

141246430.doc R.2.1 4/22/2013 •101

Page 102: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ inten]ionat.

•102

Page 103: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ii care ac]ioneaz\ sub form\ de comenzi AutoCAD

O func]ie definit\ de utilizator poate apela o func]ie AutoLISP command `n cadrul corpului defini]iei ei. Apelarea ei apare utilizatorului sub forma unei comenzi AutoCAD, o comand\ ce poate fi apelat\ f\r\ ca aceasta s\ se afle `ntre paranteze.

Obiective

~n acest capitol ve]i studia:

• Cum s\ transforma]i o func]ie AutoLISP definit\ de utilizator `ntr-o nou\ comand\ AutoCAD.

• Cum s\ folosi]i simbolul pause `n cadrul func]iilor de tip command.

• Cum s\ ob]ine]i valoarea unei variabile de sistem `n AutoLISP.

O noua comand\ ZOOM

Pentru a ilustra unele puncte sensibile ale definirii func]iilor [i comenzilor AutoCAD vom crea o func]ie simpl\ [i util\ care combin\ comanda ZOOM cu op]iunea Center, schimb`nd factorul de afi[are cu 2.

Considera]i cererile pentru o opera]ie ZOOM CENTER.

Command: zoomAll/Center/Dynamic/Extens/Left/Previous/Vmax/Window/<Scale(X/XP>:Center point:Magnification or Heigh<current>:

Avem nevoie de dou\ valori pentru aceast\ func]ie: noul punct centru [i factorul curent de afi[are multiplicat cu 2. Vom ob]ine cele dou\ puncte de la utilizator prin suspendarea evolu]iei func]iei [i vom ob]ine factorul de afi[are prin setarea variabilei de sistem VIEWSIZE.

Simbolul "pause"

Putem ob]ine un punct de la utilizator prin legarea unei variabile cu setq [i getpoint [i transferarea variabilei c\tre 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\ r\spund\ direct.

141246430.doc R.2.1 4/22/2013 •103

Page 104: Lectii Auto CAD

AUTODESK, INC.

(command “zoom” “c” pause ...)

Simbolul special AutoLISP pause este folosit ca argument pentru func]iile 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 afi[are).

Variabile de sistem AutoCAD

Func]ia AutoLISP getvar are un singur argument: numele unei variabile de sistem exprimat\ sub forma unui [ir, adic\ `ntre ghilimele. Func]ia returneaz\ valoarea variabilei de sistem.

~n acest exemplu func]ia getvar returneaz\ valoarea variabilei de sistem VIEWSIZE.

Command: (getvar “viewsize”)

Func]ia ZPLUS

Avem toate instruc]iunile necesare pentru definirea func]iei noastre.

• O modalitate de a suspenda comanda ZOOM [i de a permite utilizatorului s\ selecteze un nou punct de centru.

• O modalitate de a ob]ine factorul de afi[are curent zoom.

Exemplu

Introduce]i expresiile care urmeaz\. Crea]i o nou\ func]ie numit\ zplus [i folosi]i-o. zplus va afi[a noul punct de centru pe care `l selecta]i cu factorul 2. defun zp

Command: (defun zplus() )1> (setq zplus-height (*0.5 (getvar “viewsize”)))1> (command “zoom” “c” pause zplus-height))ZPLUSCommand: (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.000000000Command: nilCommand:

Func]ia C:ZPLUS

O sintax\ special\ pentru numele func]iei definite de utilizator ne permite s\ apel\m func]ia sub o form\ prescurtat\ f\r\ s\ folosim paranteze. Aceast\ func]ie apare mai cur`nd sub forma unei comenzi AutoCAD dec`t sub forma unei func]ii.

•104

Page 105: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Dac\ numele unei func]ii `ncepe cu litera C:, atunci func]ia poate fi apelat\ fie sub forma unei func]ii sau sub forma unei comenzi.

Dac\ numele unei func]ii `ncepe cu caracterul C:, func]ia poate fi apelat\ pe linia de comand\ fie ca o func]ie, fie ca o comand\.

~n acest exemplu, func]ia c:zplus este apelat\ ca o func]ie [i ca o comand\.

Exemplu

Introduce]i expresiile care urmeaz\. Defini]i func]ia c:zplus [i apela]i-o `n ambele moduri, ca o func]ie [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 pointMagnification or Height <2.250000>: 1125000000000Command: 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.5000000000Command:nilCommand:

Recapitulare•

• Simbolul pause permite utilizatorului s\ r\spund\ la o cerere dintr-o comand\ AutoCAD apelat\ de func]ia AutoLISP de tip command.

• Func]ia getvar stabile[te valoarea variabilei de sistem.

• Prefa]`nd numele unei func]ii definit\ de utilizator cu C: se creaz\ o nou\ comand\ AutoCAD

141246430.doc R.2.1 4/22/2013 •105

Page 106: Lectii Auto CAD

AUTODESK, INC.

•106

Page 107: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 14: CREAREA DE NOI COMENZI AUTOCAD

Trebuie s\ completa]i partea I a acestui exerci]iu, deoarece se vor face referiri la aceast\ parte [i `n alte exerci]ii.

~n acest exerci]iu ve]i:

• Crea comenzi noi `n AutoCAD din func]ii AutoLISP.

• Modifica o func]ie existent\ dintr-un exerci]iu anterior [i o ve]i transforma `ntr-o comand\.

Partea I

1. Modifica]i func]ia rectangle din partea a III-a a exerci]iului 11-1.

2. Defini]i func]ia ca c:rectangle.

3. Scrie]i func]ia mai jos.

4. Testa]i-o `n AutoCAD.

Partea a II-a1. Defini]i o func]ie numit\ c:zminus.

2. Aceasta trebuie s\ fac\ acelea[i lucruri ca [i func]ia c:zplus, dar schimba]i factorul de afi[are de la 2 la 1/2.

3. Scrie]i func]ia mai jos.

4. Testa]i-o `n AutoCAD.

141246430.doc R.2.1 4/22/2013 •107

Page 108: Lectii Auto CAD

AUTODESK, INC.

Fi[ierele program AutoLISP

Pute]i crea func]ii definite de utilizator introduc`nd codul corespunz\tor `n linia de comand\. Pentru definirea func]iilor [i pentru succesiuni complexe de s-expresii este adesea mult mai eficient s\ folosi]i un editor de text [i s\ scrie]i func]iile sau expresiile `ntr-un fi[ier de tip text cu o extensie .lsp. Codul din fi[ier poate fi `nc\rcat `n editorul grafic cu ajutorul func]iei AutoLISP load.

Obiective

~n acest capitol ve]i studia:

• Cum s\ scrieti fi[iere text care con]in programe AutoLISP.

• Cum s\ `ncarca]i fi[ierele program AutoLISP `n editorul grafic AutoCAD.

• Cum lucreaz\ func]ia AutoLISP load.

• Cum s\ recunoa[te]i cele mai frecvente mesaje de erori `n timpul inc\rc\rii.

Evaluarea la `nc\rcarea fi[ierului

Func]ia load cite[te pe r`nd expresiile dintr-un fi[ier [i evalueaz\ fiecare expresie `n parte. Valoarea returnat\ de func]ia load este valoarea ultimei expresii care a fost evaluat\.

Func]ia load cere un singur argument de tip [ir: numele fi[ierului .lsp de `nc\rcat.

(load “filename”).

Dac\ ad\uga]i codul pentru func]ia c:rectangle la numele unui fi[ier rectang.lsp pute]i `nc\rca fi[ierul `ntr-o sesiune de editare grafic\ f\r\ s\reintroduce]i `ntreaga defini]ie a func]iei

NOT| • Func]ia AutoLISP load este diferit\ de comanda AutoCAD LOAD.

•108

Page 109: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

C\utarea fi[ierului

AutoLISP-ul va c\uta fi[ierul rectang.lsp `n directorul curent `mpreun\ cu alte directoare men]ionate `n specificarea de cale a bibliotecii AutoCAD-ului. Dac\ g\se[te fi[ierul, `l va `nc\rca `n editor.

Pentru lista de directoare aflate `n specificarea de cale a bibliotecii AutoCAD consulta]i descrierea func]iei findfile `n capitolul 4 din AutoLISP Programmer's Reference Manual.

Mesaje de eroare la `nc\rcare

Dac\ AutoLISP-ul afi[eaz\ un mesaj de eroare la `nc\rcarea fi[ierului, trebuie s\ edita]i fi[ierul [i s\ corecta]i eroarea.

Lista erorilor AutoLISP [i a cauzelor acestora se afl\ `n Appendix D din AutoLISP Programmer's Reference Manual.. O list\ succint\ a erorilor pe care este posibil s\ le `nt`lni]i la `nc\rcare este dat\ mai jos. Majoritatea mesajelor indic\ erori tipice de programare AutoLISP cum ar fi:

• Ortografierea gre[it\ a func]iilor sau a numelor simbol

• Tipuri gre[ite de argumente la func]ie

• Paranteze ne`mperecheate

• Ghilimele ne`mperecheate

141246430.doc R.2.1 4/22/2013 •109

Page 110: Lectii Auto CAD

AUTODESK, INC.

Mesaje de eroare Explicatii

can't open file for input -- LOAD failed Fisierul numit in Functia load nu poate fi gasit., sau utilizatorul nu are acces sa citeasca fisierul.

extra right paren S-a detectat una sau mai multe paranteze dreapta in plus.

insufficient string space Nu exista spatiu suficient pentru a aranja sirul text specificat, de obicei datorita ghilimelelor neimperecheate.

malformed list O lista citita dintr-un fisier s-a terminat prematur. Cea mai frecventa cauza este imperecherea gresita a parantezelor sau a ghilimeleor..

Tabelul 18. Mesaje de eroare la incarcare

Recapitulare

• Programele AutoLISP pot fi stocate `n fi[iere text externe.

• Fi[ierele AutoLISP au extensia .lsp.

• Func]ia load `ncarc\ un program AutoLISP `n AutoCAD.

• AutoLISP-ul v\ atrage aten]ia printr-un mesaj de eroare dac\ are o problem\ la `nc\rcarea fi[ierului.

•110

Page 111: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 15: INCARCAREA UNUI FISIER SURSA AUTOLISP

~n acest exerci]iu ve]i:

• Crea un fi[ier program AutoLISP.

• ~nc\rca fi[ierul `n editorul grafic .

• Folosi comanda definit\ de fi[ier.

Instruc]iuni

1. Folosi]i editorul text pe sta]ia dvs. de lucru. Ruga]i instructorul s\ v\ ajute s\ configura]i editorul de text `n sistemul dvs.

2. Crea]i un fi[ier de text numit rectang.lsp.

3. Salva]i fi[ierul `n directorul de lucru.

4. ~nc\rca]i fi[ierul `n editorul grafic.

5. Folosi]i comanda RECTANGLE.

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

Command: (load "rectang")C:RECTANGLE

Command: rectangleFirst corner:

141246430.doc R.2.1 4/22/2013 •111

Page 112: Lectii Auto CAD

AUTODESK, INC.

Sugestii de programare optim\ a func]iilor C:

Acest capitol trateaz\ o serie de aspecte referitoare la interfa]a [i opera]iile interne ale func]iilor C:, dar aceste rezultate pot fi aplicate la orice defini]ie a unei func]ii nu numai la cele a c\ror nume `ncepe cu C:.

Obiective

~n acest capitol ve]i studia:

• Cum se `ntrerupe execu]ia unei func]ii definite de utilizator.

• Cum s\ anula]i afi[area cererilor de comand\ AutoCAD `n timpul execut\rii unei comenzi AutoLISP.

• Conceptul de alocare [i de variabile locale [i globale.

• Diferen]a dintre variabilele locale [i globale.

• Cum s\ declara]i [i s\ folosi]i variabilele locale `n cadrul defini]iei func]iei.

Returnarea [irului vid de la o func]ie C:

Valoarea ultimei expresii din corpul de expresii care urmeaz\ dup\ argumentele cerute [i variabilele locale din defini]ia unei func]ii este `ntotdeauna returnat\ ca valoarea func]iei. Cred c\ a]i observat c\ func]ia c:rectangle returneaz\ nil. Acest lucru este evident deoarece o func]ie de apelare de tip command este ultima expresie din corpul defini]iei func]iei c:rectangle [i func]ia de tip command returneaz\ `ntotdeauna nil.

Func]ia AutoLISP prin1 va vizualiza un [ir vid pe ecran dac\ prin1 este ultima expresie din defini]ia func]iei. De exemplu, aceast\ versiune modificat\ a comenzii RECTANGLE nu vizualizeaz\ nil la cererea de comand\ dup\ ce aceasta a fost executat\.

•112

Page 113: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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

Anularea afi[\rii cererilor de comand\ AutoCAD

Implicit AutoCAD-ul dubleaz\ toate comenzile [i op]iunile `n zona liniei de comand\, incluzind [i pe cele emise de un program AutoLISP.

Variabila de sistem CMDECHO poate suprima aceast\ "comand\ dubl\".

~n aceast\ versiune modificat\ a func]iei c:rectangle, CMDECHO este setat\ pe off la startul rutinei iar la ie[ire este setat\ pe on.(defun c:rectangle () (setq old_cmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) (setq pt1 (getpoint "\nFirst corner: ")) (setq pt3 (getpoint "\nOther corner: ")) (command "pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) (setvar "CMDECHO" old_cmdecho) (prin1))

Alocarea: Moduri de legare a unei variabile

AutoLISP-ul folose[te o schem\ dinamic\ de alocare. Alocarea unei variabile este determinat\ `n timpul func]ion\rii de ordinea apel\rii func]iei [i de declara]iile de variabil\.

Variabilele s`nt legate `n dou\ moduri: global [i local

O variabil\ global\ este o variabil\ a c\rei legare (sau atribuire a unei valori) a fost f\cut\ cu ajutorul func]iilor set [i setq [i nedeclarat\ local\ `n func]ie. Variabilele globale pot fi vizualizate sub forma de liste pe ecran folosind func]ia de apelare (familia de atomi 0).

141246430.doc R.2.1 4/22/2013 •113

Page 114: Lectii Auto CAD

AUTODESK, INC.

Variabilele globale s`nt accesibile tuturor func]iilor definite de utilizator at`t pentru citire c`t [i pentru scriere.Variabilele globale s`nt adesea folosite pentru "comunicare" `ntre programele AutoLISP. De exemplu Programul 1 va seta o condi]ie `ntr-o variabil\ global\ pe care Programul o va verifica `nainte de a ac]iona.

O variabil\ local\ este o variabil\ a c\rei legare a fost facut\ cu ajutorul func]iilor set [i setq `n cadrul unei func]ii a c\rei variabil\ a fost declarat\ local\ sau cu ajutorul declara]iei sub forma unui argument cerut la o func]ie.

Variabilele locale `[i men]in leg\tura numai `n contextul unei func]ii `n care au fost declarate ca fiind locale. Ele `[i pierd leg\tura odat\ cu ie[irea func]iei.

Legarea unei variabile globale se poate schimba `n cazul aloc\rii unei func]ii `n care o variabil\ cu acela[i nume a fost declarat\ local. La ie[irea func]iei, variabila este legat\ din nou de valoarea global\ original\.

Un set de s-expresii ilustreaz\ aceste concepte.

Exemplu

Citi]i explica]iile [i introduce]i s-expresiile adecvate.

Mai `nt`i ve]i lega global variabila x de valoarea 1.

Command: (setq x 1)1Command: !x1

Apoi ve]i defini o func]ie local_arg care `l declar\ pe x ca argument. Legarea lui x se poate schimba local `n cadrul aloc\rii func]iei local_arg [i legarea global\ va fi restabilit\ la ie[irea func]iei local_arg .

Command: (defun local_arg (x) (print x) (* x x))LOCAL_ARGCommand: (local_arg 2)24Command: !x1

Apoi ve]i defini o func]ie local_var care `l declar\ pe x ca variabil\ local\. Legarea lui x se poate schimba local `n cadrul aloc\rii func]iei local_var [i legarea global\ va fi restabilit\ la ie[irea func]iei local_var.

Command: (defun local_var (/ x) (setq x 3) (print x))LOCAL_VARCommand: (local_var)

•114

Page 115: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

3Command: !x1

Ve]i defini apoi o func]ie global_var unde variabila x nu a fost definit\ nici ca argument nici ca variabil\ local\; de aceea schimbarea `n interiorul leg\turii se va face global, `n afara alocarii func]iei global_var.

Command: (defun global_var () (setq x 4) (print x))GLOBAL_VARCommand: (global_var)4Command: !x4

Folosirea variabilelor locale

Func]ia c:rectangle a fost pe deplin clarificat\. ~n acest exemplu, variabilele old_emdecho, pt1 [i pt2 s`nt declarate ca fiind locale la func]ie; deci ele nu pot intra `n conflict cu variabilele globale care au acela[i nume [i nici cu variabilele cu acela[i nume care pot fi g\site `n cadrul altor func]ii.

(defun c:rectangle (/ old_cmdecho pt1 pt3) (setq old_cmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) (setq pt1 (getpoint "\nFirst corner: ")) (setq pt2 (getpoint "\nOther corner: ")) (command "pline" pt1 (list (car pt1) (car (cdr pt3))) pt3 (list (car pt3) (car (cdr pt1))) "c" ) (setvar "CMDECHO" old_cmdecho) (prin1))

Declara]ia variabilelor locale se face de obicei dup\ un program care a fost verificat [i pus la punct `ntruc`t declara]ia face dificil\ sau chiar imposibil\ examinarea valorilor lor `n cazul `n care func]ia aborteaz\ sau face ceva nea[teptat din cauza unei erori `n cod.

Globalizarea variabilelor de sistem

Variabilele de sistem apelate de func]ia AutoLISP setvar nu se traduc niciodat\ din limba englez\ `n limba utilizatorului. Cererile de apelare a func]iei setvar func]ioneaz\ `n toate versiunile AutoCAD-ului f\r\ s\ necesite traducerea numelui variabilei de sistem din limba englez\ `n limba utilizatorului.

141246430.doc R.2.1 4/22/2013 •115

Page 116: Lectii Auto CAD

AUTODESK, INC.

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

Redefinirea comenzii

Pute]i `nlocui comenzile AutoCAD existente cu comenzi AutoLISP care au acela[i nume.

Utilizatorul poate apela o comand\ AutoCAD prin prefa]area numelui comenzii prin caracterul punct (.), de exemplu, .LINE, indiferent dac\ comanda a fost nedefinit\.

Este bine s\ prefa]a]i numele unei comenzi apelate de func]ia AutoLISP de tip command printr-un punct (.) sau prin subliniere (pentru a v\ asigura c\ func]ioneaza `n toate limbile).

S`nt dou\ etape de parcurs pentru `nlocuirea comenzii AutoCAD cu o comand\ AutoLISP care are acela[i nume.

• Folosi]i comanda UNDEFINE pentru a anihila o comand\ AutoCAD pentru sesiunea de editare curent\.

• Crea]i o func]ie AutoLISP care are acela[i nume ca [i comanda AutoCAD [i prefa]a]i-o cu c:.

Pute]i redefini o comand\ AutoCAD folosind comanda REDEFINE.

Exemplu

Introduce]i expresiile care urmeaz\.

Anihila]i comanda AutoCAD LINE.

Command: undefineCommand name: line

~nlocui]i-o cu o comand\ AutoLISP cu acela[i nume care deseneaz\ o linie segment. Apela]i versiunea englezeasc\ a comenzii AutoCAD LINE din cadrul func]iei AutoLISP.

Command: (defun c: line () (command “._ line “ pause pause “”))C: LINE

Apela]i comanda LINE.

•116

Page 117: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: line.- line From point: pick a pointTo point pick a point To point:Command: nil

Redefini]i comanda AutoCAD.

Command: redefine Command name: line

141246430.doc R.2.1 4/22/2013 •117

Page 118: Lectii Auto CAD

AUTODESK, INC.

Recapitulare

• Pute]i ie[i dintr-o func]ie apel`nd prin1 sau princ

care reprezint\ ultima expresie `n corpul definitiei func]iei.

• Variabila de sistem CMDECHO poate suprima afi[area cererilor de comand\ AutoCAD.

• AutoLISP-ul utilizeaz\ o schem\ dinamic\ de alocare.

• Variabilele globale s`nt accesibile pentru toate func]iile.

• Variabilele locale s`nt accesibile numai `n contextul func]iilor `n care au fost declarate.

• Pute]i folosi variabile locale `n cadrul func]iilor pentru a evita posibilitatea unor conflicte `ntre variabile cu acelea[i nume din alte func]ii.

• Variabilele de sistem apelate de func]ia setvar nu se traduc niciodat\ din englez\.

• Comenzile AutoCAD pot fi `nlocuite cu comenzi AutoLISP care au acela[i nume, folosind comanda UNDEFINE.

• Comanda AutoCAD va fi `ntotdeauna apelat\ c`nd numele comenzii este prefa]at printr-un punct; de exemplu .LINE, indiferent dac\ comanda a fost anihilat\.

• Prefa]a]i `ntotdeauna numele unei comenzi cu un punct (.) sau prin caracterul subliniere ( _ ) `n cazul func]iei de tip command.

• Prefa]a]i `ntotdeauna op]iunea de comand\ prin caracterul subliniere ( _ ) `n cazul func]iei de tip command.

•118

Page 119: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 16: FUNCTIA DE PROGRAMARE OPTIMA

~n acest exerci]iu:

• Ve]i consolida cuno[tin]ele cu privire la ordonarea func]iilor C:, incluz`nd ie[irea func]iilor, dublarea cererii de comand\ [i declara]ia variabilei locale.

• Ve]i modifica fi[ierul rectang.lsp pentru a introduce noi concepte din acest capitol.

• Ve]i crea un nou fi[ier text cu o func]ie modificat\.

Partea I

Etape de lucru1. Modifica]i fi[ierul rectang.lsp

2. Ad\uga]i func]ia de ie[ire imediat\.

3. Anula]i ecoul cererii de comand\.

4. Declara]i variabilele corespunz\toare ca variabile locale.

5. ~nc\rca]i, lansa]i [i testa]i programul dup\ ce a]i f\cut modific\rile.

Partea a II-a

Etape de lucru• Rescrie]i func]ia c:zplus de la sf`r[itul capitolul 12

`ntr-un fi[ier numit zplus.lsp.

• Folosi]i func]ia getpoint pentru a ob]ine noul punct de centru a ecranului.

• Anula]i ecoul din op]iunile [i cererile de comand\ ZOOM.

• Declara]i toate variabilele local.

• Introduce]i func]ia de ie[ire.

• ~nc\rca]i, demara]i [i testa]i programul dup\ ce a]i f\cut modific\rile.

NOTA • Func]iile GETxxx nu pot fi folosite `n cadrul expresiilor func]iilor command; de exemplu, (command "line" (getpoint)) nu este permis\.

141246430.doc R.2.1 4/22/2013 •119

Page 120: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•120

Page 121: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Teste logice [i de egalitateProgramele AutoLISP pot face un salt pe baza valorii unei expresii test.

Obiective

~n acest capitol ve]i studia:

• Cum se poate schimba controlul desf\[urarii unui program pe baza unei expresii test.

• Cum s\ folosi]i testele de egalitate [i testele logice ca expresii test.

• Diferen]a dintre simbolul t [i simbolul nil.

• Cum s\ determina]i tipul de date al unui obiect.

Ramificarea programului

Aceasta diagrama simpl\ ilustreaz\ principiul ramific\rii programului.

Set value of x

x = "Hello, world."?

Branch to function (y) Branch to function (z)

t or true nil or false

Figura 2. Ramificarea programului bazata pe testul de conditie

~n aceast\ diagram\, dac\ valoarea variabilei x este egal\ cu [irul de tip text "Hello, world", atunci programul se va ramifica `n expresia y [i va continua; dac\ nu , se va ramifica `n expresia z [i va continua.

Func]iile care realizeaz\ testele condi]ionale s`nt folosite pentru ramifica]ii `n interiorul programelor AutoLISP. Cele dou\ func]ii de baz\ pentru testele condi]ionale s`nt:

• if

• cond

141246430.doc R.2.1 4/22/2013 •121

Page 122: Lectii Auto CAD

AUTODESK, INC.

Unele valori sau seturi de valori s`nt testate cu if sau cond iar programul se ramific\ conform rezultatelor testului. AutoLISP-ul dispune de o varietate de func]ii care testeaz\ valorile pe baza anumitor criterii sau unele valori pe baza celorlalte. ~n acest capitol ne concentr\m aten]ia asupra unora dintre cele mai utilizate func]ii de acest tip.

• =, >, <

• equal

• and

• or

• not

• logand

t si nil

~n AutoLISP, simbolul t este echivalentul pentru "adev\rat" `n orice test condi]ional. 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 condi]ional, atunci va fi executat\ o ramifica]ie pentru o condi]ie fals\.

Dac\ o expresie AutoLISP evalueaz\ orice altceva dec`t nil, atunci expresia este t sau adev\rat\. Dac\ o expresie t este folosit\ `ntr-un test condi]ional, atunci va fi executat\ ramifica]ia pentru o condi]ie adevarat\.

t [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.

•122

Page 123: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL NR 17: OBIECTELE SI EXPRESIILE POT FI T SAU NIL

~n acest exerci]iu:

• Ve]i `nv\]a s\ determina]i dac\ valoarea returnat\ a unei func]ii este t sau nil.

Instruc]iuni1. ~ntr-un desen nou, desena]i o entitate de tip linie.

2. Introduce]i expresiile `n coloana din st`nga a tabelului.

3. Determina]i dac\ expresiile s`nt t sau nil.

4. Verifica]i c\su]a adecvat\ din tabel.

Expresie t nil

(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

141246430.doc R.2.1 4/22/2013 •123

Page 124: Lectii Auto CAD

AUTODESK, INC.

Func]ii care testeaz\ egalitatea

Func]ia = are dou\ sau mai multe argumente cu orice tip de date. Aceast\ func]ie verific\ dac\ toate argumentele au valori echivalente. Dac\ da, func]ia returneaz\ t; dac\ nu, returneaz\ nil.

De exemplu, aceast\ expresie verific\ dac\ valorile num\rului real 4.0 [i expresia (+ 2.0 2.0) s`nt echivalente

Command: (= 4.0 (+ 2.0 2.0))T

Aceast\ expresie verific\ dac\ 4.0 este echivalent cu expresia (+ 1.5 2.0)

Command: (= 4.0 (+ 1.5 2.0))nil

Func]ia < verific\ dac\ primul ei argument este numeric mai mic dec`t al doilea argument.

Command: (< 45 50)T

Func]ia equal este `n esen]\ aceea[i cu func]ia =.

Exerci]iu

Introduce]i expresiile care urmeaz\.

Lega]i dou\ variabile de valori numerice. Folosi]i variabilele ca argumente la c`teva func]ii [i verifica]i rezultatele.

Command: (setq x 1)1

Command: (setq y 1.5)1.5

Verifica]i dac\ x este mai mic dec`t y.

Command: (< x y)T

Verifica]i dac\ x este mai mare dec`t y.

Command: (> x y)nil

•124

Page 125: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Verifica]i dac\ y este mai mare sau egal cu 1,5.

Command: (>= y 1.5)T

Verifica]i dac\ x este mai mic sau egal cu y.

Command: (<= x y)T

Verifica]i dac\ x nu este egal cu y.

Command: (/= x y)T

Acest tabel arat\ func]iile care verific\ egalitatea `n AutoLISP.

Functie Test

= Egal cu

/= Nu este egal cu

< Mai mic decit

<= Mai mic sau egal cu

> Mai mare decit

>= Mai mare sau egal cu

minusp Mai mic decit zero

zerop Egal cu zero

equal Egal cu

eq Au aceeasi legatura

Tabelul 20. Functii de egalitate

141246430.doc R.2.1 4/22/2013 •125

Page 126: Lectii Auto CAD

AUTODESK, INC.

Func]ii care verific\ tipul de date

AutoLISP-ul dispune de c`teva func]ii care verific\ tipul de date ale unui simbol sau expresii.

Functie Test

ATOM Este argumentul un atom?

LISTP Este argumentul o lista?

BOUNDP Este argumentul legat de o valoare?

NULL Este argumentul nil?

NUMBERP Este argumentul un num\r?

Tabelul 21. Functii care testeaza tipul de date

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i trei variabile de trei tipuri de date diferite: un simbol, un num\r 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)

Folosi]i variabilele ca argumente la func]ii care testeaz\ tipul de date. Examina]i rezultatele func]iilor.

S`nt aceste variabile atomi?

Command: (atom x)T

Command: (atom y)T

Command: (atom z)nil

S`nt aceste variabile liste?

Command: (listp x)nil

Command: (listp y)nil

•126

Page 127: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (listp z)T

Combinarea func]iilor type cu func]iile "="

Pute]i verifica tipul de date al unui obiect `n AutoLISP folosind fie func]ia =, fie func]ia equal cu func]ia type.

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i dou\ variabile cu tipuri de date diferite: un num\r `ntreg [i un num\r real.

Command: (setq x 1)1

Command: (setq y 1.5)1.5

Folosi]i func]iile type [i = pentru a verifica tipul lor de date.

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

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

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

141246430.doc R.2.1 4/22/2013 •127

Page 128: Lectii Auto CAD

AUTODESK, INC.

Func]ii logice

Exist\ c`teva func]ii de test logic `n AutoLISP. ~n acest capitol vom studia patru dintre cele mai importante func]ii: not, and, or [i logand.

Func]ia notFunc]ia not solicit\ un argument. Dac\ argumentul este nil, atunci expresia returneaz\ t; dac\ nu, aceasta returneaz\ nil.

Func]ia not este o func]ie a c\rei valoare returnat\ este opusul argumentului ei. Da]i-i nil [i va returna t. Da]i-i t [i va returna nil.

Exemplu

Command: (not nil)T

Command: (not t)nil

Func]ia and

Func]ia and solicit\ unul sau mai multe argumente. Dac\ unul dintre argumente este nil, ea returneaz\ nil. Dac\ toate argumentele s`nt t , atunci returneaz\ t.

Func]ia and opre[te procesarea de `ndat\ ce g\se[te un argument nil. Unele programe s`nt scrise `n acord cu acest comportament. De exemplu, pute]i fi siguri c\ programul nu va g\si o instruc]iune `ntr-o list\ de argumente ale func]iei and dac\ nici unul dintre argumentele anterioare nu este nil.

Exemplu Command: (and 1 2 3)T

Command: (and 1 2 nil)nil

Func]ia or

Func]ia or solicit\ unul sau mai multe argumente. Dac\ unul dintre argumente este t, func]ia returneaz\ t. Dac\ toate argumentele s`nt nil, atunci func]ia returneaz\ nil.

Func]ia or opre[te procesarea de `ndat\ ce g\se[te un argument t. Unele programe s`nt scrise `n conformitate cu

•128

Page 129: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

acest comportament. De exemplu, pute]i fi siguri c\ programul nu va g\si o instruc]iune `ntr-o list\ de argumente ale func]iei or dac\ nici unul dintre argumentele anterioare nu este t.

ExempluCommand: (or 1 2 3)T

Command: (or 1 2 nil)T

Command: (or nil nil nil)nil

Func]ia logand

Func]ia logand are dou\ sau mai multe argumente care ar trebui s\ fie numere `ntregi. Func]ia returneaz\ un num\r `ntreg.

Func]ia logand realizeaz\ o compara]ie AND bit cu bit a bi]ilor din argumentele care s`nt numere `ntregi. Dac\ un bit este setat la valoarea "adev\rat" `n toate argumentele func]iei logand, atunci acel bit este setat la valoarea "adev\rat" [i `n valoarea returnat\.

Numerele `ntregi 7, 3 [i 15 s`nt reprezentate `n bi]i `n tabelul de mai jos.

Intreg 1 bit 2 bit 4 bit 8 bit 16 bit

7 X X X

3 X X

15 X X X X

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

Aceast\ expresie va returna un num\r `ntreg `n care to]i bi]ii care s`nt seta]i la valoarea "adev\rat" `n toate cele trei argumente vor fi seta]i la valoarea "adev\rat”. ~n acest caz, bi]ii pentru valorile 1 [i 2 vor fi returna]i ca "adev\rat" de c\tre expresie, deoarece s`nt singurii bi]i seta]i "adev\rat" `n toate cele trei argumente.

Command: (logand 7 15 3)3

141246430.doc R.2.1 4/22/2013 •129

Page 130: Lectii Auto CAD

AUTODESK, INC.

Func]ia logand va fi de folos atunci c`nd va fi folosit\ `mpreun\ cu func]iile "entity access" mai t`rziu `n acest curs, `n special cu valorile binare cum ar fi codurile grupului 70 DXF pentru Polylines [i Block Definitions .

•130

Page 131: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare• Ramificarea unui program depinde de valoarea unui

test condi]ional.• Toate obiectele [i expresiile din AutoLISP s`nt t sau nil.• AutoLISP dispune de o varietate de func]ii care

testeaz\ tipul de egalitate [i tipul de date ale obiectelor [i expresiilor.

• Pute]i testa tipul exact de date al unui obiect combin`nd func]iile type [i =.

• Func]iile logice not, and [i or verific\ dac\ una sau mai multe expresii s`nt t sau nil.

• Func]ia logand realizeaz\ o compara]ie AND bit cu bit a unei liste de numere; aceasta func]ie va fi de ajutor `n combina]ie cu func]iile de tip entity access mai t`rziu.

141246430.doc R.2.1 4/22/2013 •131

Page 132: Lectii Auto CAD

AUTODESK, INC.

Expresii test [i expresii condi]ionale

• Func]iile de egalitate [i func]iile logice s`nt folosite `n expresii test. Expresiile test s`nt folosite `n expresii condi]ionale [i iterative formate din func]ii ca if [i while. Ele verific\ dac\ exist\ o anumit\ condi]ie [i arat\ AutoLISP-ului ce func]ie s\ execute care depinde de condi]ie, sau de rezultatul testului.

NOT| • Orice atom, simbol sau expresie poate fi folosit\ ca expresie test deoarece orice obiect `n LISP are o valoare: fie nil, fie altceva.

Obiective~n acest capitol ve]i studia:

• Cum s\ folosi]i expresiile condi]ionale pentru a face salt la diferite seturi de expresii `n cadrul programului AutoLISP

• Sintaxa func]iilor if [i cond.• Cum s\ folosi]i func]ia progn pentru a executa

multiple s- expresii `n cadrul func]iei if.

Expresii condi]ionale

Expresiile condi]ionale controleaz\ desf\[urarea unui program AutoLISP. Folosim expresiile test pentru a verifica dac\ o anumit\ condi]ie exist\, iar rezultatul expresiei test este folosit pentru a comuta expresia condi]ional\. Expresia condi]ional\ poate opta pentru execu]ia programului `n oricare din cele c`teva direc]ii posibile. Fiecare direc]ie va avea un set de expresii de evaluat `n AutoLISP.

Cele mai folosite expresii condi]ionale `n AutoLISP s`nt func]iile if [i cond.

Func]ia ifFunc]ia if are dou\ argumente obligatorii [i un al treilea argument care este op]ional.

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 op]ional, AutoLISP-ul il evalueaz\.

•132

Page 133: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Simplific`nd pu]in lucrurile, func]ia if ar ar\ta cam a[a:

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

Exemplu

Introduce]i expresiile care urmeaz\:

Lega]i variabila x de o valoare a lui 1. Lega]i valoarea lui y bazat\ pe valoarea lui x.

Command: (setq x 1)1

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

Command: !y1

Lega]i variabila x de o valoare a lui 0. Lega]i variabila y bazat\ pe valoarea x.

Command: (setq x 0)0

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

Command: !y0

141246430.doc R.2.1 4/22/2013 •133

Page 134: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 18: RAMIFICAREA PROGRAMULUI FOLOSIND FUNCTIA IF

~n acest exerci]iu :

• Ve]i folosi func]ia if.

• Ve]i scrie o func]ie pentru a comuta SNAP pe on sau off `n func]ie de setarea curent\.

Etape de lucru1. ~ntr-un fi[ier nou, folosi]i editorul de text pentru a

crea o func]ie numit\ c:snaptog.2. Introduce]i codul de mai jos.3. Func]ia ar trebui s\ comute modul SNAP `n func]ie

de valoarea curent\.

(defun c:snaptog (/ snapval)

(setq snapval (getvar "SNAPMODE")) ;get current SNAPMODE (if (= 1 snapval) ;if it's on... (setvar "SNAPMODE" 0) ;turn it off... (setvar "SNAPMODE" 1) ;otherwise, turn it on ) (prin1) ;quiet exit )

4. Salva]i func]ia `ntr-un fi[ier numit snaptog.lsp din directorul student.

5. ~nc\rca]i fi[ierul `n AutoCAD.6. Desena]i c`teva entit\]i tip Line [i Circle.7. Folosi]i SNAPTOG pentru a comuta SNAP pe on sau off

c`nd desena]i entit\]ile.

NOT| • ~ncerca]i s\ apela]i SNAPTOG `n cadrul unei comenzi LINE sau CIRCLE.

•134

Page 135: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Expresii multiple `n cadrul func]iei if.

Func]ia if permite execu]ia unei singure expresii dup\ ce a fost evaluat\ expresia test.

Pute]i face ca expresii multiple s\ apar\ ca o singur\ expresie la func]ia if prin amplasarea acestora `n cadrul expresiei progn.

Func]ia progn evalueaz\ pe fiecare dintre argumentele sale, pe r`nd [i returneaz\ valoarea ultimului argument. Expresii multiple aflate `n cadrul func]iei progn apar sub forma unei simple expresii la o func]ie de apelare.

~n acest exemplu, dac\ variabila x este egala cu 1, atunci valorile vor fi atribuite ambelor variabile y [i z. Asignarea este realizat\ de dou\ s-expresii.

ExempluCommand: (setq x 1)1

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

Command: !y2

Command: !z3

141246430.doc R.2.1 4/22/2013 •135

Page 136: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 19: EXPRESII MULTIPLE IN CADRUL FUNCTIEI IF

~n acest exerci]iu:• Ve]i modifica func]ia existent\ de la exerci]iul 18.

• Ve]i folosi func]ia progn.

• Ve]i executa s-expresii multiple prin apelarea unei func]ii if.

Etape de lucru1. ~n editorul de text, deschide]i fi[ierul snaptog.lsp din

directorul student.

2. Redenumi]i func]ia c:modetog.

3. Cu ajutorul func]iei progn, ad\uga]i codul care comut\ SNAPMODE [i GRIDMODE pe baza valorii curente a lui SNAPMODE.

4. Salva]i fi[ierul pe disc ca modetog.lsp.

5. ~nc\rca]i programul modificat `n AutoCAD.

6. Testa]i comanda MODETOG.

•136

Page 137: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ia cond

Func]ia cond cere un argument obligatoriu [i un num\r oarecare de argumente op]ionale.

Fiecare argument al func]iei cond poate fi un set de expresii incluse `ntr-o list\ extern\.

Func]ia cond evalueaz\ prima expresie `n fiecare din listele de argumente, pe r`nd, p`n\ ce o expresie evalueaz\ "adev\rat". Atunci func]ia cond evalueaz\ expresiile care urmeaz\ primei expresii din cadrul argumentului [i returneaz\.

Func]ia cond este de preferat func]iei if ori de c`te ori exist\ mai mult de dou\ cazuri de testat, adic\ mai mult de dou\ ramific\ri `n orice punct din program.

Exemplu

Aceast\ defini]ie a func]iei va introduce valori diferite `n zona liniei de comand\, `n func]ie de valoarea numeric\ a variabilei x.

Fi]i aten]i `n mod special la modul `n care pot fi construite argumentele la func]ia cond. Prima expresie dintr-un argument este expresia test [i expresiile care urmeaz\ dup\ test vor fi evaluate dac\ argumentul test este adev\rat.

Func]ia cond opre[te testarea argumentelor de `ndat\ ce g\se[te un argument a c\rui 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

Func]ia if testeaz\ o expresie [i se ramific\ spre oricare dintre cele dou\ s-expresii.

141246430.doc R.2.1 4/22/2013 •137

Page 138: Lectii Auto CAD

AUTODESK, INC.

Func]ia progn este folosit\ pentru a executa s-expresii multiple `n cadrul func]iei if.

•138

Page 139: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ia cond poate testa mai multe expresii [i poate executa orice num\r de s-expresii `ntr-o ramifica]ie dat\.

141246430.doc R.2.1 4/22/2013 •139

Page 140: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 20: UTILIZAREA FUNCTIEI COND PENTRU RAMIFICAREA PROGRAMULUI

~n acest exerci]iu:

• Ve]i folosi func]ia cond `n cadrul unei func]ii noi.

• Ve]i testa o variabil\ pentru egalitate numeric\.

• Ve]i executa toate trei ramifica]iile expresiei cond.

Etape de lucru1. Crea]i o nou\ func]ie `ntr-un nou fi[ier cu ajutorul

editorului de text.

2. Numi]i aceast\ func]ie testx.

3. Func]ia cere un argument obligatoriu.

4. ~ntr-o instruc]iune cond, folosi]i testele de egalitate pentru a vedea dac\ valoarea argumentului este egal\, mai mic\ sau mai mare dec`t 0.

5. Dac\ este satisfacut un test de egalitate, folosi]i func]ia prompt pentru a semnaliza utilizatorul.

(prompt "\nX equals 0.")

6. Salva]i fi[ierul ca testx.lsp `n directorul student.

7. ~nc\rca]i fi[ierul `n AutoCAD.

8. Folosi]i func]ia testx cu valorile argumentelor 0, 1 [i -1.

•140

Page 141: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

141246430.doc R.2.1 4/22/2013 •141

Page 142: Lectii Auto CAD

AUTODESK, INC.

Bucle de programBuclele de program reprezint\ un concept important pentru orice limbaj de programare. Buclele permit instruc]iunilor programului s\ fie executate de nenum\rate ori pe baza valorii unei espresii test.

Obiective~n acest capitol ve]i studia:

• Cum s\ folosi]i buclele pentru a repeta un set de expresii.

• Sintaxa func]iilor repeat [i while.

Explicarea modului de func]ionare a buclelor

O bucl\ se explic\ astfel:

" Testa]i o expresie. Dac\ expresia este adev\rat\, atunci executa]i un set de instruc]iuni ale programului, pe r`nd, apoi testa]i expresia din nou. Dac\ este tot adev\rat\, executa]i toate instruc]iunile programului apoi testa]i din nou expresia la infini.

A[a lucreaz\ func]ia while. Func]ia repeat execut\ un set de expresii de un num\r de ori prestabilit.

Ca exemplu s\ presupunem c\ avem un set de expresii pe care vrem s\-l execut\m de 5 ori. Este mai `n]elept s\ scrie]i setul de expresii o singur\ dat\ `n program [i s\ folosi]i unele func]ii care s\ cear\ AutoLISP-ului s\ repete expresiile de 5 ori dec`t s\ scrie]i setul de expresii de 5 ori.

Ca exemplu (si nu unul str\lucit) vom construi o func]ie simpl\ de num\rare folosind func]ia repeat. Func]ia va ad\uga num\rul `ntreg 1 la valoarea unei variabile ori de c`te ori func]ia este apelat\ [i apoi va tip\ri valoarea variabilei `n zona liniei de comand\.

•142

Page 143: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ia repeat

Func]ia repeat cere dou\ argumente [i un num\r oarecare de argumente op]ionale.

Primul argument trebuie s\ fie un num\r `ntreg (sau evaluat `ntr-un num\r `ntreg). Acesta spune func]iei repeat de c`te ori s\ execute al doilea argument p`n\ la al n -lea argument.

ExempluCommand: (repeat 3 (prompt "\nHello"))HelloHelloHellonil

nil de la sf`r[it este valoarea returnat\ de func]ia repeat.

Exemplu

Introduce]i expresiile care urmeaz\.

Expresiile definesc func]ia count.

~n func]ia count, dup\ ce variabila num este legat\ de 0, valoarea lui num este vizualizat\ pe monitor [i incrementat\ cu 1 p`n\ 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

Folosi]i func]ia count. Aceasta va introduce numerele de la 0 la 9 `n zona liniei de comand\.

Command: (count)0123456789

141246430.doc R.2.1 4/22/2013 •143

Page 144: Lectii Auto CAD

AUTODESK, INC.

O versiune ceva mai interesant\ a func]iei count va {TERGE ultimele trei entita]i desenate [i care s`nt vizibile pe monitor.

Exemplu

~ntr-un desen nou, desena]i cel pu]in trei (3) entit\]i de orice fel.

Introduce]i expresiile care urmeaz\.

Command: (defun count () (repeat 3 (command "erase" "l" "")))COUNT

Folosi]i func]ia count pentru a [terge ultimele entit\]i din desen.

Command: (count)

Mai multe despre intr\rile utilizatorului

Func]ia initget poate reface valorile permise pentru intrarea utilizatorului `n timpul oric\rei apel\ri a func]iilor de tip GETXXX, de exemplu func]iile getpoint [i getdist.

Apela]i initget care are un num\r `ntreg ca argument [i/sau o list\ de cuvinte cheie acceptabile, imediat dup\ apelarea unei func]ii GETXXX.

Acest exemplu admite numai numere `ntregi cu excep]ia lui 0, ca r\spuns la getint.(initget (+ 1 2 4))(setq response (getint "\nEnter an integer: "))

Func]ia getkword reface un cuv`nt cheie de la utilizator bazat pe un [ir de cuvinte cheie stabilite de func]ia initget.

Acest exemplu permite utilizatorului s\ raspund\ cu YES sau NO la cererea de comand\. Un r\spuns nul sau un return nu s`nt admise.(initget 1 "Yes No")(getkword "\nContinue? Yes/No: ")

•144

Page 145: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 21: BUCLARE IN PROGRAM

~n acest exerci]iu:

• Ve]i consolida cuno[tin]ele despre bucle de program.

• Ve]i consolida cuno[tin]ele despre func]ia cond.

• Ve]i folosi func]ia repeat pentru a executa un set de s-expresii de un num\r stabilit de ori.

• Ve]i scrie o func]ie care cere utilizatorului num\rul de bucl\ri de program.

• Ve]i folosi instruc]iunea cond `n cadrul buclei.

Etape de lucru1. ~ncepe]i un desen nou `n AutoCAD.

2. Desena]i un Cerc cu centrul `n punctul 5,5 [I o raz\ de o unitate.

3. ~n editorul text, deschide]i fi[ierul numit displace.lsp din directorul student.

4. Crea]i func]ia c:displace. Folosi]i codul `n displace.lsp ca baz\ pentru func]ie.

5. DISPLACE ar trebui s\ execute urm\toarele:

• S\ cear\ utilizatorului o incrementare a deplas\rii.

• S\ cear\ utilizatorului de c`te ori s\ execute deplasarea.

• S\ cear\ utilizatorului direc]ia de deplasare.

• S\ repete codul care restabile[te ultima entitate desenat\ [i care este vizualizat\ pe monitor [i s\ o deplaseze cu un increment adecvat de un num\r de ori.

continuare pe pagina urmatoare

141246430.doc R.2.1 4/22/2013 •145

Page 146: Lectii Auto CAD

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. Salva]i fi[ierul text.

7. ~nc\rcati fi[ierul `n AutoCAD.

8. Activa]i comanda DISPLACE.

•146

Page 147: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ia while

Func]ia repeat este cea mai simpl\ func]ie de buclare util\ dac\ [ti]i exact de c`te ori trebuie s\ repeta]i evaluarea grupului de expresii anterioare intr\rii buclei.

Totu[i ve]i `nt`lni ocazii c`nd ve]i dori s\ repeta]i ceva de un num\r nedefinit de ori; adic\ num\rul de repeti]ii nu poate fi determinat `naintea intr\rii `n bucl\.

~ntr-un astfel de caz, func]ia while v\ d\ posibilitatea s\ repeta]i un set de expresii de c`te ori este necesar p`n\ 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

x is less than 10?

print the value of x

add 1 to x

(setq x 10)

(while

(< x 10)

(print x)

(setq x (+ 1 x))

)

initialize x

go back to test

YESNO

Figuae 3. Diagrama buclei functiei while

141246430.doc R.2.1 4/22/2013 •147

Page 148: Lectii Auto CAD

AUTODESK, INC.

Pentru a ie[i dintr-o bucl\ while, valoarea expresiei test trebuie s\ fie egal\ cu nil. De aceea, dac\ expresia test este ini]ial 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 num\r de ori prestabilit sau p`n\ ce valoarea expresiei test este nil.

• Func]ia repeat repet\ un set de expresii de un num\r de ori stabilit.

• Func]ia while repet\ un set de s-expresii p`n\ ce expresia test este egal\ cu nil.

•148

Page 149: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 21: UTILIZAREA FUNCTIEI WHILE PENTRU BUCLARE IN PROGAM

~n acest exerci]iu:

• Ve]i consolida cuno[tin]ele despre buclele de program din AutoLISP.

• Ve]i modifica o func]ie existent\ de la exerci]iul anterior.

• Ve]i crea un program care deseneaz\ dreptunghiuri multiple.

• Ve]i folosi func]ia while.

Etape de lucru

1. ~n editorul de text, `nc\rca]i fi[ierul rectangle.lsp.

2. Salva]i fi[ierul ca mrectang.lsp `n directorul student.

3. Face]i modific\ri `n fi[ier.

4. Modifica]i func]ia c:rectangle pentru a cere utilizatorului s\ deseneze dreptunghiuri multiple `n timpul unei singure secven]e de func]ionare.

5. Plasa]i corpul codului care cere col]urile [i deseneaz\ polilinia `n cadrul unei func]ii while.

6. Un r\spuns nul, adic\ un return la cererea "first corner" va termina func]ia.

7. Numi]i noua func]ie c:mrectangle pentru "dreptunghiuri multiple".

8. Salva]i fi[ierul.

9. ~nc\rca]i fi[ierul `n AutoCAD.

10.Activa]i comanda MRECTANGLE.

141246430.doc R.2.1 4/22/2013 •149

Page 150: Lectii Auto CAD

AUTODESK, INC.

{iruri [i tip\rirea lor~n AutoLISP, orice serie de caractere alfanumerice aflate `ntre ghilimele duble reprezint\ un [ir text. {irul poate include caractere speciale cum ar fi *, &, , % [i .

Obiective

~n acest capitol ve]i studia:

• Despre [irurile text [i valorile lor• Cum s\ folosi]i caracterele de control `n [irurile text.• Cum s\ lua]i [iruri text de la utilizator.• Cum s\ folosi]i comanda AutoCAD TEXT cu variabile

AutoLISP-ul legate la [iruri text.• Diferen]ele dintre cele [ase func]ii de tip\rire `n

AutoLISP.• Cum s\ folosi]i func]iile de tip\rire.

Valorile [irurilor text

{irurile text se evalueaz\ pe sine, adic\ valoarea unui [ir text este [irul `n sine.

Command: !"This is a string""This is a string."

Command: (setq x "This is a string.") "This is a string." Command: !x "This is a string."

Caractere de control

Caracterul "\" precede un caracter de control `n cadrul unui [ir text. Caracterul care urmeaz\ imediat are o semnifica]ie special\.

~n urm\torul tabel g\si]i caracterele de control cunoscute de asemenea [i ca "escape codes" care s`nt recunoscute `n cadrul [irurilor AutoLISP.

•150

Page 151: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Cod Semnificatie

\\ \ caracter

\" " caracter

\e caracter escape

\n caracter newline

\r caracter return

\t caracter tab

\nnn Caracter al carui cod octal este nnn

Tabelul 2. Caractere de control `n [iruri

Func]ia getstring

Func]ia getstring a[teapt\ ca utilizatorul s\ introduc\ un [ir text. Are dou\ argumente op]ionale: suprim\ caracterul spa]iu ca [i return [i un [ir de la utilizator.

Dac\ primul argument op]ional este furnizat [i acesta nu este nil, atunci este posibil ca [irul s\ con]in\ spa]ii; primul spa]iu din [ir este tratat ca "return".

Exemplu

Introduce]i expresiile care urmeaz\.

Lega]i variabila txt de [irul text "single".

Command: (setq txt (getstring "\nEnter text: "))Enter text: single"single"

Command: !txt"single"

Lega]i variabila txt de [irul text `n care s-au introdus spa]ii.

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

Command: !txt"embedded spaces"

141246430.doc R.2.1 4/22/2013 •151

Page 152: Lectii Auto CAD

AUTODESK, INC.

Variabila de sistem TEXTEVAL

Dac\ variabila de sistem TEXTEVAL este mai mare dec`t 0, pute]i r\spunde la o cerere de comand\ TEXT sau DTEXT cu o variabil\ AutoLISP [i comanda va tip\ri valoarea asignat\ variabilei; dac\ nu, comanda va tip\ri semnul exclamarii [i numele variabilei.

Comanda TEXT va tip\ri `ntotdeauna valoarea unei variabile [ir atunci c`nd este apelat\ `n cadrul unei func]ii AutoLISP de tip command indiferent de setarea TEXTVAL.

Comanda DTEXT nu poate fi apelat\ de func]ia AutoLISP de tip command.

•152

Page 153: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

~ntr-un desen nou introduce]i expresiile care urmeaz\.

Prima comand\ TEXT va tip\ri !txt1. A dou\ comand\ TEXT va tip\ri Second line. Vezi figura 18-1.

Command: (setq txt1 "First line.")"First line."

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

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

Command: (setvar "texteval" 1)1

Command: textJustify/Style/<Start point>: EnterText: !txt2

Figura 41. entitati tip text

141246430.doc R.2.1 4/22/2013 •153

Page 154: Lectii Auto CAD

AUTODESK, INC.

Func]iile de tip\rire

Exist\ [ase func]ii de tip\rire `n AutoLISP. Cinci dintre ele tip\resc [iruri text iar una tip\re[te caractere text. Trei dintre aceste func]ii tip\resc orice fel de expresii indiferent dac\ acestea s`nt de tipul [ir text. Func]ia pentru caractere [i patru dintre func]iile de tip [ir pot tip\ri nu numai `ntr-un fi[ier dar [i pe un monitor.

Functia Argumente Descriere

prin1 [expr [file-desc]] Tipareste expr si returneaza expr. Expandeaza caracterele de control.

princ [expr [file-desc]] Tipareste expr si returneaza expr. Nu expandeaza caracterele de control

print [expr [file-desc]] La fel ca prin1, si in plus tipareste un newline inainte de expr si un spatiu dupa expr.

prompt [msg] Tipareste msg pe display si returneaza nil.

write-char num [file-desc] Tipareste un caracter ASCII conform cu argumentul num pentru codul zecimal ASCII si returneaza num\rul.

write-line string [file-desc] Tipareste string f\r\ quotes si returneaz\ string cu quotes. Asemanator cu princ.

Table 3. Functii de tiparire

Intrarea [i ie[irea `n/[i dintr-un fi[ier incluz`nd [i tip\rirea `ntr-un fi[ier vor fi discutate mai t`rziu `n acest curs.

Func]ia prompt este folosit\ pentru tip\rirea mesajelor destinate utilizatorului, pe afi[aj.

Func]ia print tip\re[te expresii `ntr-o manier\ compatibil\ cu func]ia load, `n timp ce func]ia princ le tip\re[te `ntr-o manier\ compatibil\ cu func]ia read-line. Ve]i studia func]ia read-line `n capitolul destinat intr\rii [i ie[irii `ntr-un fi[ier mai t`rziu `n acest curs.

Func]iile prin1, princ [i print accept\ orice expresie ca argument [i `i va tip\ri valoarea.

Func]iile prompt [i write-line accept\ numai argumente de tip [ir.

•154

Page 155: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare• {irurile text s`nt caractere alfanumerice aflate

`ntre ghilimele duble.

• Caracterele de control din cadrul unui [ir de tip text `ncep cu un caracter "a".

• Func]ia getstring primeste [iruri interactiv de la utilizator.

• Variabila de sistem TEXTEVAL demonstreaz\ cum comanda AutoCAD TEXT va tip\ri o variabil\ AutoLISP.

• AutoLISP-ul dispune de o varietate de func]ii de tip\rire pentru diferite `ntrebuin]\ri.

141246430.doc R.2.1 4/22/2013 •155

Page 156: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 22: SIRURI DE TEXT SI FUNCTII DE TIPARIRE

~n acest exerci]iu:

• Ve]i consolida cuno[tin]ele despre [iruri de tip text [i func]ii de tip\rire.

• Ve]i ob]ine dou\ [iruri text interactiv de la utilizator.

• Ve]i folosi [irurile de tip text cu patru dintre func]iile de tip\rire.

Etape de lucru1. Intoduce]i expresiile care urmeaz\.

2. Lega]i cinci variabile de la a la d de diferite tipuri de date: num\r `ntreg, list\, [ir [i [ir care con]ine caractere de control.

Command: (setq a 1)

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

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

Command: (setq d (getstring "\nFile name: "))File name: \student\x.dwg"\\student\\x.dwg"

3. Folosi]i variabilele ca argumente la diferite func]ii de tip\rire.

4. Scrie]i valorile `n casu]ele corespunzatoare din tabelul care urmeaz\.

Variabila prin1 princ print prompt

a

b

c

d

Tabelul 25. Variabile si functii de tiparire

•156

Page 157: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Aceast\ pagin\ a fost l\sat\ liber\ in mod inten]ionat.

141246430.doc R.2.1 4/22/2013 •157

Page 158: Lectii Auto CAD

AUTODESK, INC.

Accesul la entit\]i

Fiec\rei entit\]i dintr-o sesiune de editare `i este atribuit un nume de entitate de c\tre AutoCAD. Numele unei entit\]i este un identificator unic al fiec\rei entit\]i dintr-un desen. Numele unei entit\]i 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 ve]i studia:

• Cum s\ folosi]i numele de entit\]i pentru a stabili [i modifica entit\]ile individuale.

• Cum s\ afla]i numele ultimei entit\]i ad\ugate la desen.• Cum s\ afla]i numele primei entit\]i ad\ugate la desen.• Cum se pot trece `n revist\ numele entit\]ilor din desen.• Cum s\ crea]i noi comenzi AutoCAD care ac]ioneaz\ asupra

numelor de entit\]i.

Func]ii de acces la entit\]i

Numele de entit\]i pot fi stabilite de AutoLISP [i entit\]ile la care se refer\ pot fi modificate de AutoLISP.

~n acest capitol ve]i folosi func]iile de acces la entit\]i din AutoLISP pentru a lucra cu entit\]i [i grupuri de entit\]i.

• Afla]i o entitate sau un grup de entit\]i.

• Activa]i o entitate cu o comand\ AutoCAD.

• Examina]i propriet\]ile unei entit\]i.

• Modifica]i propriet\]ile unei entit\]i.

Functii de acces la entitati

Descriere

entlast returneaza numele ultimei entita]i adaugata in baza de date

entsel returneaza lista formata din numele entita]ii si punctul in care a fost selectata entitatea

entnext returneaza prima entitate din baza de date

entnext ename returneaza numele entita]ii in baza de date dupa argumentul ename

Tabelul 26.Functii de acces a entitatilor

•158

Page 159: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Cum se afl\ numele ultimei entit\]i

Introduce]i comenzile [i expresiile care urmeaz\.

~ntr-un desen nou crea]i o entitate Line.

Command: lineFrom point: 1,1To point: 5,5To point: Enter

Folosi]i func]ia entlast pentru a stabili numele ultimei entit\]i ad\ugate la desen, adic\ entitatea Line. (Num\rul din numele entit\]ii poate fi diferit pe computerul dumneavoastra).

Command: (entlast)<Entity name: 60000022>

Func]ia entlast stabile[te numele ultimei entit\]i principale ne[tears\ din desen.

Lega]i variabla numit\ ename de valoarea returnat\ de func]ia entlast. Verifica]i legarea lui ename.

Command: (setq ename (entlast))<Entity name: 60000022>

Command: !ename<Entity name: 60000022>

Folosirea numelui unei entit\]i intr-o comand\ AutoCAD

Numele entit\]ilor pot fi folosite ca argumente la func]ia de tip command ori de c`te ori o comand\ AutoCAD cere un set de selec]ie.

~n acest exemplu, numele entit\]ii Line este furnizat ca argument la comanda AutoCAD ERASE.Aceasta expresie va [terge entitatea Line.

Command: (command "erase" ename "")

Exemplu

Introduce]i expresiile [i comenzile care urmeaz\. Expresia AutoLISP va [terge entitatea Line. Comanda U o va restabili.

Command: (command "erase" ename "")nil

141246430.doc R.2.1 4/22/2013 •159

Page 160: Lectii Auto CAD

AUTODESK, INC.

Command: UGROUP

Aflarea numelui primei entit\]i

Exemplu

Citi]i instruc]iunile [i tip\ri]i expresiile cu caractere aldine.

~n acela]i desen, cu ajutorul entit\]ii Line, crea]i o entitate Circle.

Command: circle3P/2P/TTR/<Center point>: 5,5Diameter/<Radius>: 1

5,5

1,1

Figura 42.Entitati tip linie si cerc

Folosi]i func]ia entlast pentru a stabili numele ultimei entit\]i ad\ugat\ la desen, entitatea Circle. (Num\rul din numele entita]ii poate fi diferit pe computerul dvs.).

Command: (entlast)<Entity name: 60000028>

Func]ia entlast stabile[te ultima entitate principal\ ne[tears\ din desen; `n acest caz entitatea Circle.

Folosi]i func]ia entnext pentru a extrage numele primei entit\]i din baza de date, adic\, entitatea Line.

•160

Page 161: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Lega]i o variabil\ numit\ entname de valoarea returnat\ de entnext. Verifica]i legarea lui ename.

Command: (setq ename (entnext))<Entity name: 60000022>Command: !ename<Entity name: 60000022>

Exemplu

Introduce]i expresiile care urmeaz\.

Afla]i numele primei entit\]i din desen, entitatea Linie. Sterge]i-o. Restabili]i-o cu comanda U.

Command: (setq ename (entnext))<Entity name: 60000022>

Command: (command "erase" ename "")nil

Command: UERASE

Afla]i numele ultimei entit\]i din desen: entitatea Circle. Deplasa]i-o cu o unitate `n directia X pozitiv\ din pozi]ia ini]ial\.

Command: (setq ename (entlast))<Entity name: 60000028>

Command: (command "move" ename "" "1,0" "")nil

141246430.doc R.2.1 4/22/2013 •161

Page 162: Lectii Auto CAD

AUTODESK, INC.

5,5

1,1

Figura 43. Situatia dupa miscarea cercului cu o unitate in directia X pozitiva

Aduce]i cercul `n pozi]ia ini]ial\.

Command: UMOVE

Baleierea bazei de date entitate cu entitate

Func]ia entlast stabile[te numele ultimei entit\]i din baza de date. Func]ia entnext stabile[te numele primei entit\]i din baza de date.

Func]ia entnext are un argument op]ional: numele unei entit\]i. ~n acest caz func]ia entnext returneaz\ numele entit\]ii care urmeaz\ dup\ argument `n baza de date.

Dac\ nu exist\ nici o entitate care se urmeze dup\ cea din numele argumentului entita]ii, entnext returneaz\ nil.

De exemplu acest set de expresii vor returna numele celei de a doua entit\]i din baza de date.

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

sau

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

•162

Page 163: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Expresia care urmeaz\ ar [terge atunci a doua entitate din baza de date.

Command: (command "erase" ename2 "")

Ar fi bine s\ se poat\ stabili numele tuturor entit\]ilor din baza de date, pe r`nd, pentru a le procesa una c`te una. Func]ia entnext poate face acest lucru c`nd este plasat\ `ntr-o bucl\ while `mpreun\ cu instruc]iunile de procesare pentru entit\]i.

Recapitulare• Fiecare entitate dintr-un desen are un nume unic

de entitate.

• Numele entit\]ilor nu se schimb\ niciodat\ `n timpul unei sesiuni de editare grafic\, dar se pot schimba pe parcursul sesiunilor de editare grafic\.

• AutoLISP dispune de func]ii care returneaz\ numele entit\]ii.

• Func]ia entlast returneaz\ numele ultimei entit\]i ad\ugat\ la desen.

• Func]ia entnext returneaz\ numele primei entit\]i ad\ugat\ la desen sau numele entit\]ii care urmeaz\ dup\ argumentul op]ional.

• Pute]i folosi entnext [i o bucl\ while pentru a accesa fiecare entitate din desen.

• Numele entit\]ilor pot fi folosite cu comenzi AutoCAD.

141246430.doc R.2.1 4/22/2013 •163

Page 164: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 23: ACCESAREA NUMELOR DE ENTITATI

~n acest exerci]iu:

• Ve]i aprofunda cuno[tin]ele despre accesarea numelor de entit\]i.

• Ve]i crea o comanda MOVEALL care afl\ numele fiec\rei entit\]i din baza de date, pe r`nd, [i deplaseaz\ fiecare entitate cu o unitate `n X pozitiv.

• Ve]i folosi func]iile entnext [i while.

• Ve]i folosi numele entit\]ilor [i comanda AutoCAD MOVE.

Etape de lucru1. Folosi]i editorul de texte pentru a salva urm\torul cod `n

fi[ierul 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. Desena]i c`teva entit\]i `n desenul dvs.

3. ~nc\rca]i fi[ierul moveall.lsp.

4. Activa]i comanda MOVEALL.

5. Urm\ri]i deplasarea entit\]ilor, c`te una pe r`nd.

Command: (load "moveall")C:MOVEALL

Command: moveall

•164

Page 165: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 24: SCALAREA TUTUROR ENTITATILOR ACCESATE PRIN NUME

~n acest exerci]iu:

• Ve]i aprofunda cuno[tin]ele despre accesarea numelor de entit\]i.

• Ve]i modifica func]ia de la exerci]iul 24.

• Ve]i folosi func]iile entnext [i while.

• Ve]i crea o comand\ care scaleaz\ fiecare entitate din desen.

• Ve]i tip\ri num\rul de entita]i scalate folosind un contor `n cadrul unei bucle.

Aceste expresii vor tip\ri [irul “Scaling entity 1.” `n zona liniei de comand\.

(setq counter 1)

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

Etape de lucru

1. Deschide]i fi[ierul text moveall.lsp.

2. Salva]i textul `ntr-un nou fi[ier numit scaleall.lsp.

3. Folosi]i codul din func]ia c:moveall.lsp.

4. Modifica]i c:moveall.

• Numi]i noua func]ie c:scaleall.

• Scala]i fiecare entitate cu un factor (0.5) relativ fa]\ de punctul origine 0,0.

• Ad\uga]i codul care tip\re[te `n zona liniei de comand\ num\rul de entit\]i modificate.

Command: scaleallScaling entity 1.Scaling entity 2.Scaling entity 3.

5. ~nc\rca]i fi[ierul scaleall.lsp.

6. Activa]i comanda SCALEALL.

141246430.doc R.2.1 4/22/2013 •165

Page 166: Lectii Auto CAD

AUTODESK, INC.

Liste asociate entit\]ilorPute]i folosi numele unei entit\]i pentru a extrage toate elementele unei entit\]i. ~n AutoLISP un astfel de document este reprezentat print-o list\ asociat\. Listele asociate cuprind subliste ale listelor obi[nuite sau perechi cu punct.

Obiective

~n acest capitol ve]i studia:

• Formatul unei perechi cu punct sau cum s\ crea]i o astfel de pereche.

• Formatul unei liste asociate.

• Cum s\ extrage]i o list\ asociat\ unei entit\]i.

• Cum s\ examina]i o lista asociat\.

• Cum s\ determina]i tipul entit\]ii din lista asociat\.

Perechi cu punctO pereche cu punct este o form\ special\ a unei liste. O pereche cu punct este o list\ format\ din dou\ elemente a c\rei parte cdr din arborele binar se termin\ cu ultimul element al listei [i nu cu nil.At`t listele obi[nuite c`t [i perechile cu punct s`nt folosite `n listele asociate entit\]ilor pentru a reprezenta grupul de coduri DXF [i valorile asociate acestora.

Perechile cu punct con]in `ntotdeauna dou\ elemente. Primul element al unei perechi cu punct poate fi stabilit la fel ca [i primul element al unei liste obi[nuite: cu func]ia car. Al doilea element al perechii cu punct poate fi stabilit direct cu func]ia cdr [i acest lucru difer\ de modul `n care se stabile[te al doilea element dintr-o list\ obi[nuit\.

Exemplu

Perechea cu punct care con]ine cele dou\ elemente 0 [i "Line" arat\ astfel.

(0 . "LINE")

Ilustra]ia care urmeaz\ prezint\ arborii binari pentru dou\ obiecte similare: o list\ [i o pereche cu punct, ambele con]in`nd acelea[i elemente.

•166

Page 167: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(0 "LINE")

0 ("LINE")

"LINE" ()

(0 . "LINE")

0 "LINE"

car cdr car cdr

car cdr

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

Func]ia cons

Func]ia 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 func]ia cons returneaz\ o pereche cu punct a celor dou\ elemente.

Dac\ valoarea la care se adaug\ este o lista, atunci func]ia cons returneaz\ lista cu primul argument ad\ugat `n capul listei.

Exemplu

Introduce]i expresiile care urmeaz\.

Forma]i o list\ obi[nuit\ din elementele 0 [i "Line".

Command: (setq xlist (list 0 "LINE"))(0 "LINE")

Forma]i o pereche cu punct din elementele 0 [i "Line".

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

Extrage]i primul element din list\ [i din perechea punct cu car.

Command: (car xlist)0

141246430.doc R.2.1 4/22/2013 •167

Page 168: Lectii Auto CAD

AUTODESK, INC.

Command: (car xdot)0

Extrage]i cel de-al doilea element din lista normal\ cu car [i cdr.

Command: (car (cdr xlist))"LINE"

Extrage]i cel de-al doilea element din list\ [i din perechea punct cu car.

Command: (cdr xdot)"LINE"

Entit\]i `nregistrate `n baza de date [i liste asociate

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

Entitatea `nregistrat\ `n baza de date este p\strat\ sub forma unei liste asociate.

O list\ asociat\ este o list\ de liste.

Primul element al fiec\rei subliste este tipul acelei liste. Celelalte elemente reprezint\ datele asociate cu codul.

De exemplu, codul din prima sublist\ este num\rul `ntreg -1. Data asociat\ este numele entit\]ii. Codul din a dou\ sublist\ este num\rul `ntreg 0. Data asociat\ este tipul entit\]ii; `n acest caz, o entitate Line.

Semnifica]ia codurilor 8,10 [i 11 si datele lor s`nt u[or de imaginat ce reprezint\.

Datele codului 210 s`nt reprezentate de sensul pozitiv al axei Z din sistemul de coordonate care con]ine entitatea.

Memorarea si extragerea formatelor

Prin conven]ie, datele dintr-o list\ asociat\ entit\]ii pot fi extrase prin scoaterea cdr-ului unei subliste. Pentru aceasta, AutoLISP-ul folose[te perechi cu punct `n cazul sublistelor cu dou\ elemente [i forme normale de liste `n cazul sublistelor cu mai mult de dou\ elemente.

•168

Page 169: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

De exemplu, aceste expresii returneaz\ Layerul entit\]ii Line [i punctul de start.

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

Coduri de Grup DXF

Codul fiec\rei subliste dintr-o list\ asociat\ unei entit\]i corespunde unui cod de grup DXF. Documenta]ia despre aceste coduri exist\ `n AutoCAD Release 12 AutoLISP Programmer’s Reference Manual, Appendix B.

Exist\ mici diferen]e `ntre codurile de grup dintr-un fi[ier DXF [i codurile de grup returnate `ntr-o list\ asociat\ unei entit\]i. ~n anexa din AutoLISP Programmer’s Reference Manual g\si]i lista corect\ a codurilor de grup pentru liste asociate entit\]ilor.

Acestea s`nt codurile listelor asociate entit\]ilor (sau coduri de grup DXF) pentru entitatea Line.

Cod de group Semnificatie

-1 Numele entitatii

0 Tipul (Line, Circle, Arc, etc.)

8 Layer

10 Punct de start

11 Punct final

210 Directia pozitiva a axei Z de extruziune

Tabelul 27. Coduri de grup DXF si proprietatile entita]ilor

141246430.doc R.2.1 4/22/2013 •169

Page 170: Lectii Auto CAD

AUTODESK, INC.

Extragerea unei entit\]i din baza de date cu func]ia entget

Func]ia entget cere un singur argument: numele unei entit\]i. Func]ia va returna `nregistrarea entit\]ii sub forma unei liste asociate.

Exemplu

~ncepe]i un desen nou [i desena]i o linie de la 1,1 la 5,5; tip\ri]i expresiile care urmeaz\.

Command: (setq ename (entnext))<Entity name: xxxxxxxx>Command: (setq elist (entget ename))( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))Command: !elist( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))

Extragerea datelor dintr-o list\ asociat\

Func]ia assoc cere dou\ argumente: valoarea unui cod [i o list\ asociat\. Dac\ func]ia g\se[te o pereche pentru cod `n lista asociat\, atunci returneaz\ sublista corespunzatoare; dac\ nu, returneaz\ nil.

Presupune]i c\ variabila elist este legat\ de lista asociat\ `n cazul entit\]ii Line.

Command: (setq elist (entget (entnext)))( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))

Command: !elist( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11 5.0 5.0 0.0) (210 0.0 0.0 1.0))

Aceast\ expresie va returna sublista care descrie layerul entit\]ii.

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

~n aceast\ expresie, apel\m cdr care returneaz\ layerul entit\]ii.

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

•170

Page 171: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Introduce]i expresiile care urmeaz\.

Asigura]i-v\ c\ variabila elist este legat\ de lista asociat\ `n cazul entit\]ii 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))

Extrage]i tipul entit\]ii, 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)

Apela]i cdr pentru a extrage tipul entit\]ii, 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)

141246430.doc R.2.1 4/22/2013 •171

Page 172: Lectii Auto CAD

AUTODESK, INC.

Recapitulare• Perechile cu punct au dou\ elemente [i s`nt

forme speciale de liste.

• Al doilea element al perechii cu punct este returnat de cdr.

• Perechile cu punct s`nt folosite ca liste obi[nuite `n listele asociate entit\]ilor.

• Entit\]ile `nregistrate `n baza de date s`nt reprezentate `n AutoLISP sub forma de liste asociate.

• O lista asociat\ este o list\ de liste.

• Fiecare sublist\ dintr-o list\ asociat\ are dou\ p\r]i: car [i cdr.

• Partea car a unei liste asociate entit\]ii este un cod de grup DXF care desemneaz\ o proprietate a entit\]ii car este de asemenea denumit codul sublistei.

• Partea cdr a unei liste asociate entit\]ii reprezint\ valoarea codului de grup DXF.

• Func]ia assoc returneaz\ o sublista prin c\utarea unui cod.

•172

Page 173: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 25: UTILIZAREA LISTELOR ASOCIATE ENTITATLOR

~n acest exerci]iu :

• Ve]i consolida cuno[tin]ele despre listele asociate entit\]ilor.

• Ve]i folosi func]ia entget.

• Ve]i modifica func]ia de la exerci]iul 25.

• Ve]i crea o func]ie care scaleaz\ numai entit\]ile de tip Line din desen.

Etape de lucru1. Deschide]i fi[ierul text scaleall.lsp.

2. Salva]i textul `ntr-un nou fi[ier scline.lsp.

3. Schimba]i numele func]iei din c:scaleall `n c:scline.

4. Modifica]i func]ia ca s\ scaleze numai entit\]ile de tip Line din desen.

5. Salva]i fi[ierul.

6. Desena]i c`teva tipuri de entit\]i `n desen:.Lines, Circles and Arcs.

7. Inc\rca]i fi[ierul scline.lsp [i activa]i comanda SCLINE. Numai entit\]ile de tip Line vor fi scalate cu aceasta comand\.

141246430.doc R.2.1 4/22/2013 •173

Page 174: Lectii Auto CAD

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)

•174

Page 175: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

141246430.doc R.2.1 4/22/2013 •175

Page 176: Lectii Auto CAD

AUTODESK, INC.

Modificarea unei entit\]iModificarea unei entit\]i cu AutoLISP-ul are loc `n dou\ etape.

• Modifica]i lista asociat\ unei entit\]i cu func]ia subst.

• Actualiza]i entitatea prin aplicarea func]iei entmod

la noua list\ asociat\.

Obiective

~n acest capitol ve]i studia:

• Cum s\ modifica]i o list\ asociat\ unei entit\]i.

• Cum s\ actualiza]i `nregistrarea unei entit\]i `ntr-un desen pe baza schimb\rilor din lista asociat\.

Substituirea valorilor intr-o list\ asociat\

Func]ia subst `nlocuie[te un element dintr-o list\. Func]ia cere trei argumente: valoarea de substituire, valoarea de substituit `ntr-o list\ [i o list\ care con]ine valoarea de substituit.

Pute]i folosi func]ia subst pentru a `nlocui o valoare `ntr-o list\ asociat\ unei entit\]i.

Iat\ un exemplu care ilustreaz\ modul cum func]ioneaz\ func]ia subst. Vom `nlocui num\rul 15 cu num\rul 16 `n lista noastr\ de p\trate de numere `ntregi.

Command: (setq mylist (list 4 9 15))(4 9 15)Command: !mylist(4 9 15)

Command: (subst 16 15 mylist)(4 9 16)Command: !mylist(4 9 15)

Deoarece func]ia subst este non-destructiv\, ea nu va afecta legarea variabilei mylist. ~n acest exemplu func]ia setq este ad\ugat\ expresiei pentru a schimba legarea.

Command: (setq mylist (subst 16 15 mylist))(4 9 16)Command: !mylist(4 9 16)

•176

Page 177: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Introduce]i comenzile [i expresiile care urmeaz\.

~ntr-un desen nou, desena]i o entitate Line de la 1,1 la 5,5.

Command: lineFrom point: 1,1To point: 5,5To point: Enter

Folosi]i func]ia subst pentru a schimba punctul de start al listei asociate entit\]ii Line.

Extrage]i sublista pentru punctul de start [i p\stra]i-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)

~nlocui]i vechiul punct de start cu unul nou de 7.5,2.5,0 [i schimba]i 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)

141246430.doc R.2.1 4/22/2013 •177

Page 178: Lectii Auto CAD

AUTODESK, INC.

Actualizarea unei entit\]i

Func]ia entmod modific\ propriet\]ile unei entit\]i cer`nd AutoCAD-ului s\ actualizeze entitatea pe baza modific\rilor f\cute `n lista asociat\ entit\]ii.

Func]ia entmod solicit\ un singur argument : o list\ valabil\ asociat\ entit\]ii.

Exemplu

Folosi]i func]ia entmod pentru a aplica modific\rile la entitatea Line pe baza modific\rilor f\cute `n copia listei asociate.

Introduce]i 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 entit\]ii Line ar trebui s\ se deplaseze de la 1.0, 1.0, 0.0 la 7.5, 2.5, 0.0.

1,1,0

5,5,0

5,5,0

7.5,2.5,0

Figura 45. Linie inainte si dupa apelarea functiei entmod.

Recapitulare• O sublist\ dintr-o list\ asociat\ poate fi `nlocuit\ cu

func]ia subst.

• Func]ia entmod va actualiza `nregistrarea unei entit\]i `n baza de date pe baza modific\rilor din lista asociat\.

•178

Page 179: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 26: ACTUALIZAREA INREGISTRARII UNEI ENTITATI

~n acest exerci]iu:

• Ve]i aprofunda cuno[tin]ele despre modificarea entita]ilor [i despre listele asociate.

• Ve]i folosi func]ia entmod.

• Ve]i modifica func]ia de la exerci]iul 26.

• Ve]i modifica listele asociate tuturor entit\]ilor Line.

• Ve]i actualiza `nregistrarea entit\]ilor acestora.

Etape de lucru• Deschideti fi[ierul text scline.lsp.

• Salva]i textul `ntr-un fi[ier nou numit modline.lsp.

• Schimba]i numele func]iei din c:scline `n c:modline.

• Modifica]i func]ia.

• Dac\ entitatea este de tip Line, modifica]i-i punctul de cap\t din valoarea curent\ `n punctul 5.0, 5.0, 0.0.

• Salva]i fi[ierul.

• ~ntr-un desen nou, desena]i c`teva linii [i cercuri `n diferite pozi]ii.

• ~nc\rca]i fi[ierul modline.lsp.

• Activa]i comanda MODLINE.

141246430.doc R.2.1 4/22/2013 •179

Page 180: Lectii Auto CAD

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

•180

Page 181: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

) (prin1) ;quiet exit)

141246430.doc R.2.1 4/22/2013 •181

Page 182: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 27: ACTUALIZAREA TUTUROR ENTITATILOR “DIMENSION” INTR-UN DESEN

Acesta este un exerci]iu op]ional.

~n acest exerci]iu:

• Ve]i aprofunda cuno[tin]ele despre modificarea entit\]ilor [i listele asociate.

• Ve]i scrie o func]ie care s\ modifice toate entita]ile de tip Dimmension din desen.

Etape de lucru1. Deschide]i fi[ierul grafic moddim.dwg `n directorul

student.

Figure 5. Desenul moddim.dwg.

2. Dimensiunile din acest desen au fost amplasate pe c`teva nivele diferite. Sarcina dvs. este s\ scrie]i un program AutoLISP care s\ caute toate entit\]ile Dimension din acest desen [i s\ le amplasa]i pe nivelul DIM.

3. Fi[ierul program AutpLISP moddim.lsp din directorul student con]ine schi]a programului. Deschide]i acest fi[ier cu editorul de text [i ad\uga]i codul necesar pentru a completa programul.

•182

Page 183: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Selectarea numelui unei entit\]i prin selec]ie grafic\ cu cursorul

Un program AutoLISP poate extrage numele unei entit\]i cer`nd utilizatorului s\ selecteze o entitate.

Obiective

~n acest capitol ve]i studia:

• Cum s\ extrage]i numele unei entit\]i interactiv cu utilizatorul.

• Cum s\ folosi]i func]ia entsel.

• Cum s\ deplasa]i centrul cercului selectat de utilizator.

Func]ia entsel

Func]ia entsel v\ cere s\ selecta]i un singur obiect. Func]ia returneaz\ o list\ cu dou\ obiecte: numele entit\]ii [i punctul `n care a fost selectat; dac\ nu se selecteaz\ nimic atunci func]ia returneaz\ nil.

Pute]i extrage numele entit\]ii din lista returnat\ de func]ia entsel cu ajutorul func]iei car.

Exemplu

Introduce]i expresiile care urmeaz\.

~ntr-un desen nou , desena]i o linie [i un cerc.

Command: lineFrom point: 1,1To point: 5,5To point: Enter

Command: circle3P/2P/TTR/<Center point>: 5,5Diameter/<Radius>: 1

Selecta]i cercul `n punctul 5,6,0 ca r\spuns la cererea func]iei entsel [i lega]i 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))

141246430.doc R.2.1 4/22/2013 •183

Page 184: Lectii Auto CAD

AUTODESK, INC.

Extrage]i numele entit\]ii din lista returnat\ de func]ia entsel [i p\stra]i-l `n variabila ename.

Command: (setq ename (car epick))<Entity name: xxxxxxxx>

Command: !ename<Entity name: xxxxxxxx>

{terge]i entitatea Circle.

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

Recapitulare• Func]ia entsel extrage o list\ a propriet\]ilor unui

obiect selectat de utilizator: numele entit\]ii [i punctul `n care a fost selectat.

• Partea car a unei liste selectate de entsel reprezint\ numele unei entit\]i.

•184

Page 185: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 28: SELECTAREA SI MODIFICAREA UNUI CERC

~n acest exerci]iu:

• Ve]i consolida cuno[tin]ele despre selec]ia interactiv\ a entit\]ilor.

• Ve]i crea un program care cere utilizatorului s\ selecteze o entitate Circle [i un nou punct de centru care deplaseaz\ centrul cercului

Etape de lucru1. ~n editorul de texte, deschide]i fi[ierul text numit

circen.lsp din directorul student.

2. Ad\uga]i codul care face urmatoarele:

• Define[te func]ia c:circen.

• Cere utilizatorului o entitate cu func]ia entsel.

• Dac\ utilizatorul selecteaz\ o entitate, codul trimite lista asociat\ entit\]ii ca argument la func]ia circen_mod.

3. Salva]i fi[ierul.

4. ~nc\rca]i programul `n AutoCAD.

5. Verifica]i comanda CIRCEN `ntr-un desen care con]ine cel pu]in 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) ) ) ))

141246430.doc R.2.1 4/22/2013 •185

Page 186: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 29: PROBLEME OPTIONALE DE ACCES LA ENTITATI

Acestea s`nt exerci]ii op]ionale pe care le pute]i completa `n clas\ sau `n afara clasei.

Scrie]i un set de defini]ii de func]ii.

c:movelast• Deplasa]i ultima entitate `n baza de date.

• Cere]i operatorului punctul de baz\ [i al doilea punct al deplas\rii..

c:printent• Selecta]i fiecare entitate din desen, una dup\ alta.

• Tip\ri]i fiecare tip [i layer ale entit\]ii `n zona liniei de comand\.

c:red• Cere]i operatorului s\ selecteze o entitate.

• Schimba]i culoarea entit\]ii `n RED (reprezentat\ `ntr-o list\ asociat\ de codul de grup 62 [i num\rul `ntreg 1).

• Observa]i c\ pute]i ad\uga o nou\ sublist\ la lista asociat\ `n loc s\ `nlocui]i o list\ existent\ folosind func]ia entmod. O sublist\ de grup 62 nu este prezent\ `ntr-o list\ asociat\ unei entit\]i dac\ culoarea entit\]ii este BYLAYER.

c:chglayer• Cere]i operatorului s\ selecteze o entitate.

• Cere]i operatorului numele unui nivel.

• Schimba]i nivelul entit\]ii.

•186

Page 187: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Tratarea erorilorAutoLISP dispune de o metod\ pentru tratarea erorilor de program [i de utilizare.

Obiective

~n acest capitol ve]i studia:

• Cum s\ folosi]i func]iile exit [i quit pentru a for]a o eroare AutoLISP.

• Cum s\ `nlocui]i rutina implicit\ AutoLISP de tratare a erorilor.

• Cum s\ utiliza]i 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\ folosi]i comanda UNDO `n rutina de tratare a erorilor.

For]area unei erori

Func]iile exit [i quit realizeaz\ aceea[i opera]ie, f\r\ argumente.

Func]iile exit [i quit for]eaz\ aplica]ia curent\ s\ se termine prin for]area unei erori AutoLISP. Ele returneaz\ [irul "quit/exit abort" [i transfer\ [irul func]iei de tratare a erorilor *error*. Dup\ executarea func]iei de tratare a erorilor, AutoCAD-ul se `ntoarce la linia de comand\.

O aplica]ie poate folosi func]iile exit [i quit `n combina]ie cu o func]ie de tratare a erorilor definit\ de utilizator pentru a opri propria-i execu]ie, pentru a reface orice valori necesare `n AutoCAD [i pentru a prezenta utilizatorului un mesaj adecvat.

Func]ia *error*

Pute]i fi siguri c\ pozi]ionarea unei variabile de sistem sau o anumit\ condi]ie AutoCAD pot fi restabilite dup\ apari]ia unei erori nea[teptate folosind func]ia *error*. ~n cadrul acestei func]ii care poate fi definit\ de utilizator pute]i evalua condi]iile de eroare, pute]i returna un mesaj adecvat utilizatorului [i puteti restabili setarea variabilelor AutoCAD.

Parcurge]i aceste etape pentru a implementa o subrutin\ de tratare a erorilor definit\ de utilizator pentru o comand\.

• Salva]i defini]ia curent\ a func]iei *error*.

141246430.doc R.2.1 4/22/2013 •187

Page 188: Lectii Auto CAD

AUTODESK, INC.

Defini]i o nou\ func]ie *error* pentru comand\ sau func]ie.

Redefini]i subrutina veche de tratare a erorilor prin comanda exit sau prin exit dintr-o nou\ subrutin\ de tratare a erorilor.

Redefinirea rutinei de tratare a erorilor ar trebui f\cut\ `n contextul unei comenzi sau a unei func]ii; plasa]i codul pentru a defini o rutin\ de tratare a erorilor `n cadrul codului pentru comand\.

•188

Page 189: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Acest cod implementeaz\ comanda c:rectangle [i propria-i rutin\ de tratare a erorilor.

(defun c:rectangle (/ pt1 pt2)

(setq old_error *error*) ;save default error handler

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

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

Dup\ cum vede]i, AutoLISP-ul v\ permite s\ defini]i o func]ie (adic\ s\ apela]i func]ia defun) `n timpul execut\rii unei comenzi sau func]ii definite de utilizator. Deci rutina de tratare a erorilor pentru func]ia 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: c`nd comanda ajunge s\ fie `ndeplinit\ cu succes sau la cap\tul rutinei de tratare a erorilor cu comanda specific\.

Aceast\ tehnic\ v\ permite s\ adapta]i rutina AutoLISP de tratare a erorilor pentru orice situa]ie.

Rutina noastr\ de tratare a erorilor cu comand\ specific\ reface pozi]ionarea original\ a variabilei de sistem CMDECHO

141246430.doc R.2.1 4/22/2013 •189

Page 190: Lectii Auto CAD

AUTODESK, INC.

`n cazul `n care Comanda RECTANGLE `nt`lne[te o eroare `n timpul execu]iei. Variabila definit\ de utilizator old_emdecho a fost facut\ global a[a `nc`t valoarea ei este accesibil\ noii func]ii *error*.

•190

Page 191: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 30: DEFINIREA SI UTILIZAREA UNEI NOI SUBRUTINE DE TRATARE A ERORILOR

~n acest exerci]iu:

• Ve]i aprofunda cuno[tin]ele despre modul cum se folose[te o rutin\ de tratare a erorilor.

• Ve]i modifica func]ia de la exerci]iul 29.

Etape de lucru1. Ad\uga]i o rutin\ de tratare a erorilor pentru comanda

CIRCEN `n fi[ierul circen.lsp.

2. Folosi]i exemplul de la c:rectangle ca o baz\ de la care s\ porni]i.

3. ~nc\rca]i programul `n AutoCAD.

4. Activa]i comanda CIRCEN [i anula]i-o cu Ctrl-C pentru a verifica rutina de tratare a erorilor.

141246430.doc R.2.1 4/22/2013 •191

Page 192: Lectii Auto CAD

AUTODESK, INC.

UNDO [i tratarea erorilor

Pentru a permite utilizatorului s\ anuleze `ntr-o singur\ etap\ rezultatul unei comenzi pe baz\ de AutoLISP, amplasa]i un UNDO MARK la `nceputul rutinei.

Pute]i folosi rutina de tratare a erorilor pentru a anula automat rezultatele unei comenzi pe baz\ de AutoLISP p`n\ la punctul unde a intervenit eroarea, admi]ind faptul ca UNDO CONTROL este setat pentru ONE sau ALL.

Variabilele de sistem UNDOCTRL [i UNDOMARKS pot fi examinate de un program AutoLISP pentru a determina ce ac]iune de anulare, dac\ exist\ vreouna, este adecvat\ pentru sesiunea curent\ AutoCAD.

Exemplu

Aceast\ defini]ie a comenzii RECTANGLE permite utilizatorului s\ anuleze rezultatele comenzii `ntr-o singur\ etap\.

Instruc]iunea 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))

•192

Page 193: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Extindem codul UNDO pentru a include rutina de tratare a erorilor. Dac\ rutina este anulat\ dintr-un motiv oarecare [i UNDO este disponibil, rezultatul comenzii p`n\ la punctul de eroare este anulat automat. Se seteaz\ o variabila de condi]ie pentru a fi examinat\ `n rutina de tratare a erorilor. Un UNDO GROUP este activat `n comand\ [i corelat cu un UNDO END.

NOTA • Fi[ierul ai_utils.lsp, versiunea 12 din directorul support con]ine c`teva rutine pentru folosirea codului UNDO `ntr-un program AutoLISP.

continuare pe pagina urmatoare

141246430.doc R.2.1 4/22/2013 •193

Page 194: Lectii Auto CAD

AUTODESK, INC.

(defun c:rectangle (/ pt1 pt2)

(setq old_cmdecho (getvar "CMDECHO")) ;store orignal command echo (setvar "CMDECHO" 0) ;turn off command echo

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler

(command) ;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 ) )

•194

Page 195: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(setvar "CMDECHO" old_cmdecho) ;reset original command echo (setq *error* old_error) ;restore default error handler ;if command is successful (prin1) ;quiet exit)

141246430.doc R.2.1 4/22/2013 •195

Page 196: Lectii Auto CAD

AUTODESK, INC.

Opera]ii cu fi[iereAutoLISP poate citi [i scrie fi[iere text de tip ASCII.

Obiective

~n acest capitol ve]i studia:

• Ce este un descriptor de fi[ier [i cum este folosit.

• Cum s\ deschide]i un fi[ier pentru opera]ii de citire sau scriere.

• Cum s\ scrie]i linii de text `ntr-un fi[ier deschis.

• Cum s\ citi]i linii de text dintr-un fi[ier deschis.

• Cum s\ descoperi]i sf`r[itul unui fi[ier text.

• Cum s\ `nchide]i un fi[ier.

Func]iile fi[ier I/O

Opera]iile de citire [i scriere `ntr-un fi[ier sau opera]ii I/O `ntr-un fi[ier se realizeaz\ cu ajutorul a dou\ func]ii: read-line [i write-line. Deschiderea [i `nchiderea fi[ierelor se realizeaz\ de asemenea prin dou\ func]ii: open [i close.

Deschiderea unui fi[ier

Func]ia open cere dou\ argumente: numele unui fi[ier ce urmeaz\ a fi deschis [i modul de deschidere a acestuia. Ambele argumente trebuie s\ fie [iruri.

Dac\ func]ia open reu[e[te, returneaz\ un descriptor de fi[ier. Dac\ e[ueaz\, returneaz\ nil.

Programul dvs. trebuie s\ p\streze descriptorul de fi[ier `ntr-o variabil\! Dac\ nu-l p\stra]i, nu ve]i putea citi, scrie sau `nchide fi[ierul.

Descriptorul de fi[ier este un argument obligatoriu pentru func]iile care scriu `n, citesc din/sau `nchid fi[ierul.

Exist\ trei tipuri valide de moduri de deschidere a unui fi[ier. Fiecare trebuie s\ fie reprezentat de o liter\ mic\ despar]it\ prin semne de punctua]ie.

•196

Page 197: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Open mode Descriere

"r" Deschiderea fisierului pentru citire.

"w" Deschiderea fisierului pentru scriere. daca exista un fisier cu acelasi nume se va produce o suprascriere.

"a" Deschiderea fisierului pentru adaugare. daca exista un fisier cu acelasi nume, va fi adaugat la sfirsitul acestuia.

Tabelul 28. Moduri de a deschide un fi[ier.

De exemplu, aceast\ expresie deschide un fi[ier numit test.txt. pentru o opera]ie de scriere.

Command: (setq fp (open "test.txt" "w"))<File: #xxxxx>

Command: !fp<File: #xxxxx>

Scrierea `ntr-un fi[ier

Func]ia write-line va scrie un [ir de text `ntr-un fi[ier deschis. Aceast\ func]ie cere dou\ argumente: un [ir de tip text [i un descriptor de fi[ier. Al doilea argument este op]ional; dac\ nu este introdus, func]ia write-line va scrie [irul pe display.

Presupune]i c\ variabila fp este legat\ de un descriptor de fi[ier valid returnat prin deschiderea unui fi[ier pentru o opera]ie de scriere.

Aceste expresii scriu dou\ linii de text `ntr-un fi[ier.

Command: (write-line "First line." fp)"First line."

Command: (write-line "Second line." fp)"Second line."

~nchiderea unui fi[ier

Trebuie s\ `nchide]i fi[ierul imediat dup\ opera]ii de scriere, citire sau ad\ugare. Dac\ nu-l inchide]i, resursele sistemului dvs. vor fi limitate, `n particular num\rul de handlere de fi[iere disponibil.

Func]ia close va `nchide un fi[ier deschis. Func]ia cere un argument: un descriptor de fi[ier valid. Func]ia returneaz\ nil.

Aceast\ expresie va `nchide fi[ierul deschis [i `n care s-a scris `n cele dou\ exemple anterioare.

Command: (setq fp (close fp))

141246430.doc R.2.1 4/22/2013 •197

Page 198: Lectii Auto CAD

AUTODESK, INC.

Deoarece descriptorul de fi[ier fp nu mai este valid dup\ ce fi[ierul la care se refer\ este `nchis, de exemplu dac\ se seteaza fp la nil este echivalent cu a `nchide fi[ierul. Se elibereaz\ astfel memoria [i se ob]ine asigurarea c\ fp nu poate fi folosit `n afara contextului.

Exemplu

Introduce]i expresiile care urmeaz\.

Deschide]i un fi[ier, scrie]i c`teva linii de text `n fi[ier [i `nchide]i fi[ierul. Examina]i fi[ierul cu editorul de text dup\ ce a fost `nchis.

Deschide]i un fi[ier numit test.txt pentru o opera]ie de scriere.

Command: (setq fp (open "test.txt" "w"))<File: #xxxxx>Command: !fp<File: #xxxxx>

Scrie]i c`teva linii de text `ntr-un fi[ier.

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

~nchide]i fi[ierul.

Command: (setq fp (close fp))nilCommand: !fpnil

Deschide]i fi[ierul test.txt `n editorul text [i examina]i-l. Ar trebui s\ con]in\ trei linii de text.Codersof theLost Spark

•198

Page 199: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Deschiderea unui fi[ier pentru o opera]ie de citire

C`nd deschide]i un fi[ier pentru o opera]ie de citire, pute]i citi datele din fi[ier, linie cu linie. Nu pute]i modifica sau scrie `ntr-un fi[ier care a fost deschis pentru o opera]ie de citire. (Dac\ vre]i s\ introduce]i date `n fi[ier, `nchide]i-l [i redeschide]i-l pentru o opera]ie de scriere.)

Func]ia open apelat\ cu un argumenr "r" returneaz\ un descriptor de fi[ier dac\ fi[ierul specificat exist\; dac\ nu, returneaz\ nil.

Func]ia read-line cite[te o linie de text dintr-un fi[ier. Cere un argument op]ional: un descriptor de fi[ier valid pentru un fi[ier care a fost deschis pentru o opera]ie de citire. Dac\ argumentul nu este ad\ugat, func]ia read-line cite[te intrarea de pe tastatur\.

Func]ia read-line returneaz\ o linie de text pe care o cite[te dintr-un fi[ier. Func]ia read-line returneaz\ nil dac\ ajunge la cap\tul fi[ierului.

Func]ia read-line `ncepe cu prima linie de text dintr-un fi[ier. O apelare ulterioar\ a func]iei read-line va face ca func]ia s\ citeasc\ urm\toarea linie de text din fi[ier [i a[a mai departe.

141246430.doc R.2.1 4/22/2013 •199

Page 200: Lectii Auto CAD

AUTODESK, INC.

Exemplu

Introduce]i expresiile care urmeaz\.

~n acest exemplu se presupune c\ a]i creat cu succes fi[ierul text.txt din exerci]iul anterior.

Deschide]i fi[ierul test.txt pentru o opera]ie de citire.

Command: (setq fp (open "test.txt" "r"))<File: #XXXX>

Command: !fp<File: #XXXX>

Citi]i prima, a dou\ [i a treia linie din fi[ier.

Command: (read-line fp)

“Coders”

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

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

~ncerca]i s\ citi]i p`n\ la sf`r[itul fi[ierului. Func]ia read-line va returna nil.

Command: (read-line fp)nil

~nchide]i fi[ierul.

Command: (setq fp (close fp))

nilCommand: !fpnil

•200

Page 201: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Recapitulare• Un descriptor de fi[ier este un pointer al unui

fi[ier returnat de func]ia open.

• Un program trebuie s\ p\streze un descriptor de fi[ier pentru a avea acces la fi[ierul pe care l-a deschis.

• Fi[ierele pot fi deschise pentru opera]ii de citire, scriere [i ad\ugare.

• Argumentele pentru modul de deschidere a fi[ierelor la func]ia open trebuie s\ fie litere mici.

• Un fi[ier poate fi deschis numai pentru o singur\ opera]ie.

• Func]iile write-line [i read-line scriu [i citesc din fi[iere.

• Func]ia read-line returneaz\ nil c`nd ajunge la cap\tul fi[ierului.

141246430.doc R.2.1 4/22/2013 •201

Page 202: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 31: COPIEREA UNUI FISIER TEXT

Ave]i 30 de minute la dispozi]ie s\ termina]i acest exerci]iu; este un program vast. Ave]i nevoie de timp ca s\ revizui]i [i s\ `n]elegeti codul [i de asemenea s\ introduce]i textul surs\.

~n acest exerci]iu:• Ve]i aprofunda cuno[tin]ele despre fi[iere I/O `n

AutoLISP.

• Ve]i crea un program AutoLISP pentru citit fi[iere text de tip ASCII [i pentru copiat fi[iere `ntr-un fi[ier cu nume diferit.

• Ve]i deschide fi[iere at`t pentru citit c`t [i pentru scris.

• Instruc]iuni

1. Introduce]i codul care urmeaz\ `ntr-un document nou din editorul text.

2. Salva]i fi[ierul `n directorul student sub numele de copyfile.lsp.

3. Aceast\ func]ie folose]te o rutin\ de tratare a erorilor cu apelare asem\n\toare cu cea din exerci]iul precedent. Varibilele legate de descriptoarele de fi[ier au fost definite global a[a `nc`t rutina de tratare a erorilor le poate `nchide dac\ este necesar.

4. ~nc\rca]i copyfile.lsp `n AutoCAD.

5. Activa]i comanda COPYFILE.

6. ~ncerca]i s\ copia]i dou\ fi[iere text.

7. Depana]i programul dac\ este necesar.

continuare pe pagina urmatoare

•202

Page 203: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(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) )

141246430.doc R.2.1 4/22/2013 •203

Page 204: Lectii Auto CAD

AUTODESK, INC.

)

continuare pe pagina urmatoare

•204

Page 205: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

;check that file names are different ;exit if not

(if (= r_fp_name w_fp_name) (progn (prompt "\nSource same name as destination file.") (exit) ) )

;open source file for read ;exit if it fails

(if (not (setq r_fp (open r_fp_name "r"))) (progn (prompt "\nCould not open source file.") (exit) ) )

;open destination file for read ;close source file and exit if it fails

(if (not (setq w_fp (open w_fp_name "w"))) (progn (setq r_fp (close r_fp)) (prompt "\nCould not open destination file.") (exit) ) )

;get first line from source file

(setq r_fp_line (read-line r_fp))

;write source line to destination file and get next... ;source line until end of file is reached

(while r_fp_line (write-line r_fp_line w_fp) (setq r_fp_line (read-line r_fp)) )

;close the source and destination files

(setq r_fp (close r_fp)) (setq w_fp (close w_fp))

;restore original error handler

141246430.doc R.2.1 4/22/2013 •205

Page 206: Lectii Auto CAD

AUTODESK, INC.

(setq *error* old_error)

(prin1) ;quiet exit)

•206

Page 207: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL32: CITIREA UNUI FISIER TEXT SI CREAREA ENTITATII “TEXT”

Acesta este un exerci]iu op]ional.

Dac\ termina]i cu comanda COPYFILE pute]i continua cu acest exerci]iu op]ional.

Func]ia c:iotext v\ arat\ cum s\ citi]i un fi[ier text de pe disc [i s\ scrie]i textul sub form\ de entita]i text AutoCAD. Acesta este un subset de facilit\]i inclus `n ACAD R 12 din cadrul fi[ierului asctext.lsp.

Etape de lucru

1. Deschide]i un nou fi[ier `n editorul text.

2. Introduce]i codul care urmeaz\ [i salva]i-l `ntr-un fi[ier numit iotext.lsp.

3. ~nc\rca]i fi[ierul `n AutoCAD.

4. Activa]i comanda IOTEXT.

Un singur lucru trebuie s\ schimba]i: cere]i utilizatorului s\ pun\ spa]ii `ntre linii `n loc s\ scaleze mereu `n\l]imea textului cu 1.5.

continuare pe pagina urmatoare

141246430.doc R.2.1 4/22/2013 •207

Page 208: Lectii Auto CAD

AUTODESK, INC.

; Iotext.lsp;; Command function IOTEXT prompts for the name of a text file.; It reads each line of the file and draws the corresponding Text; entities `n AutoCAD.;; It prompts for the height, rotation angle and insertion point; of the text. Text is always drawn left-justified.

(defun dtr (d) ;convert degrees to radians (/ (* d pi) 180.0))

(defun rtd (r) ;convert radians to degrees (/ (* r 180.0) pi))

(defun C:IOTEXT()

(setq old_cmdecho (getvar "CMDECHO")) ;save old command echo (setvar "CMDECHO" 0) ;turn off command echo (setq old_error *error*) ;save default error handler

(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 ;if the file dialogue is canceled (= io_fp_name nil) ;then exit (exit) )

•208

Page 209: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

continuare pe pagina urmatoare

141246430.doc R.2.1 4/22/2013 •209

Page 210: Lectii Auto CAD

AUTODESK, INC.

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

•210

Page 211: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Seturi de selec]ieAutoCAD-ul poate a[eza grupuri de entit\]i `n seturi de selec]ie. Comenzile AutoCAD [i func]iile AutoLISP pot ac]iona asupra unui set de selec]ie [i fac`nd aceasta, poate ac]iona global asupra grupului de entit\]i din setul de selec]ie.

Obiective

~n acest capitol ve]i `nv\]a:

• Cum s\ crea]i un set de selec]ie.

• Cum s\ folosi]i un set de selec]ie cu comenzi AutoCAD.

• Cum s\ crea]i un set de selec]ie interactiv, cu fereastr\, cu filtru [i prin selectarea tuturor componentelor dintr-un desen.

• Cum s\ afla]i lungimea num\rului de entit\]i `ntr-un set de selec]ie.

• Cum s\ lucra]i cu nume de entit\]i `ntr-un set de selec]ie.

Note `n leg\tur\ cu seturile de selec]ie

Un set de selec]ie `n AutoLISP reprezint\ un tip unic de date numit PICKSET, alc\tuit dintr-o colec]ie de nume de entit\]i. Setul de selec]ie nu este o list\.

AutoLISP poate p\stra maximum 128 de seturi de selec]ie deschise odat\ (num\rul ar putea fi mai mic pentru un sistem dat).

Lega]i `ntotdeauna o variabil\ de un set de selec]ie pe care `l crea]i sau modifica]i; altfel nu ave]i acces la setul de selec]ie [i nici o cale de a elibera resursele sistemului consumate de setul de selec]ie p`n\ ce nu ie[iti din AutoCAD.

C`nd a]i terminat cu o variabil\ atribuit\ setului de selec]ie, este bine s\ seta]i variabila pe nil pentru a elibera resursele folosite de setul de selec]ie.

141246430.doc R.2.1 4/22/2013 •211

Page 212: Lectii Auto CAD

AUTODESK, INC.

AutoLISP dispune de o varietate de func]ii pentru a crea [i manipula seturile de selec]ie. Acest capitol descrie func]ionalitatea [i arat\ exemple de func]ii ssget, sslength [i ssname.

Functia Operatia

ssget Creaza un set de selectie

ssadd Adauga o entitate la un set de selectie

ssdel Sterge o entitate dintr-un set de selectie

sslength Determina numarul de entitati dintr-un set de selectie

ssmemb Verifica daca fiecare entitate este parte a setului de selectie

ssname Extrage numele entitatilor din setul de selectie

Tabelul 29. Functii pentru seturi de selectie

Crearea unui set de selec]ie

Func]ia ssget include virtual toate seturile de selec]ie interactive, cuprinz`nd metode care s`nt disponibile `n AutoCAD la mesajul “Select objects:”. Sintaxa complet\ [i num\rul de aplica]ii ale func]iei s`nt prea complicate pentru a fi descrise aici `n `ntregime. De aceea ne vom concentra aten]ia asupra c`torva dintre formele de sintax\ cele mai folosite [i vom l\sa descrierea complet\ `n seama manualului AutoLISP Programmer’s Reference Manual.

Sintaxa functiei Operatia

(ssget) “Select objects ´standard:cererea permite utilizatorului selec]ia interactiva "

(ssget "X") Selecteaza toate entita]ile din desen

(ssget "W" '(1.0 1.0 0.0) '(11.0 8.0 0.0)) Selecteaza toate entita]ile din fereastra de la 1,1,0 la 11,8,0

(ssget "X" '((0 . "LINE"))) Selecteaza toate entita]ile Line din desen

Tabelul 30.Sintaxa si opera]iile functiei ssget.

Exemple de lucru

Deschide]i desenul ssget.dwg `n directorul student. Ve]i folosi acest desen pentru urm\toarele patru exemple care arat\ cum s\ folosi]i ssget.

•212

Page 213: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Selec]ia interactiv\

Func]ia ssget apelat\ f\r\ argumente va genera cererea standard "select objects:" `n zona liniei de comand\ [i va permite utilizatorului s\ selecteze obiecte interactiv. C`nd utilizatorul termin\ procesul de selec]ie cu tasta Return sau Space, func]ia ssget returneaz\ valoarea ei sub forma unui nou set de selec]ie.

Exemplu

C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.

Folosi]i ssget pentru a cere utilizatorului s\ selecteze obiecte.

Command: (setq ss1 (ssget))Select objects: pick several objectsSelect objects: Enter<Selection set: 1>

Verifica]i tipul de date ale variabilei ss1.

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

Folosi]i setul de selec]ie pentru care variabila ss1 este legat\ `n cadrul comenzii AutoCAD.

Command: eraseSelect objects: !ss1Select objects: Enter

Reface]i obiectele [terse.

Command: oops

141246430.doc R.2.1 4/22/2013 •213

Page 214: Lectii Auto CAD

AUTODESK, INC.

Selectarea componentelor dintr-un desen

Func]ia ssget apelat\ cu un singur argument, [irul "X", va returna un set de selec]ie compus din entit\]ile componente din desen. Aceast\ func]ie include entit\]ile care nu s`nt afi[ate pe monitor [i entita]ile de pe layere care s`nt `nghe]ate [i/sau `nchise.

Exemplu

C`nd s`nte]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.

Folosi]i func]ia ssget pentru a crea un set de selec]ie format din toate entit\]ile din desen.

Command: (setq ss1 (ssget "X"))<Selection set: 2>

{terge]i toate obiectele din desen.

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

Reface]i obiectele [terse.

Command: oops

Selectarea componentelor dintr- o fereastr\

Pute]i apela func]ia ssget cu un argument de tip [ir care corespunde oric\rei op]iuni standard la cererea "select objects:", op]iuni cum ar fi "W" pentru entit\]ile incluse `n fereastr\, "C" pentru entita]ile care traverseaz\ sau s`nt incluse `n fereastr\ [i "F" pentru entit\]i care intersecteaz\ o polilinie de selec]ie.

Exemplu

C`nd s`nte]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.

Crea]i un set de selec]ie din entit\]i care apar]in 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>

{terge]i toate entit\]ile care se afl\ `n interiorul ferestrei.

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

Reface]i toate entit\]ile [terse.

•214

Page 215: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Selectarea cu filtru

Func]ia ssget v\ permite s\ selecta]i entit\]ile prin filtru. Pute]i filtra `n acord cu oricare dintre propriet\]ile entit\]ilor care s`nt p\strate `n coduri de grup DXF `n cadrul listelor asociate entit\]ilor.

O list\ filtru este asem\n\toare cu o list\ asociat\ entit\]ii. Implicit, o entitate trebuie s\ corespund\ fiec\rei propriet\]i din filtru pentru a putea fi ad\ugat\ la setul de selec]ie. Exist\ [i alte metode de creare a listelor de tip filtru.

Comanda AutoCAD FILTER definit\ de fi[ierele filter.lsp [i filter.dcl este `n general o interfa]\ bazat\ pe dialog la func]ia ssget [i listele de tip filtru.

Exemplu

C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.

Crea]i un set de selec]ie format din entit\]ile de tip Line din desen.

Command: (setq ss1 (ssget "X" '((0 . "LINE"))))<Selection set: 4>

{terge]i toate entit\]ile de tip Line din desen.

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

Reface]i obiectele [terse.

Command: oops

Seta]i variabila ss1 pe nil [i elibera]i resursele folosite curent de setul de selec]ie.

Command: (setq ss1 nil)nil

141246430.doc R.2.1 4/22/2013 •215

Page 216: Lectii Auto CAD

AUTODESK, INC.

Lungimea unui set de selec]ie

Func]ia sslength cere un singur argument: un set de selec]ie valid. Func]ia returneaz\ num\rul de nume al entit\]ilor din setul de selec]ie.

Exemplu

C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.

Crea]i un set de selec]ie din trei (3) entit\]i.

Command: (setq ss1 (ssget))Select objects: pick three objectsSelect objects: Enter<Selection set: 5>

Folosi]i func]ia sslength pentru a verifica num\rul de entit\]i din setul de selec]ie.

Command: (sslength ss1)3

Seta]i variabila ss1 pe nil [i elibera]i resursele folosite curent de setul de selec]ie.

Command: (setq ss1 nil)nil

•216

Page 217: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Numele entit\]ilor dintr-un set de selec]ie

Un set de selec]ie este un grup format din nume de entit\]i AutoCAD. Func]ia ssname poate stabili numele oric\rei entit\]i dintr-un set de selec]ie.

Func]ia ssname cere dou\ argumente: un set de selec]ie valid [i un num\r `ntreg. Num\rul `ntreg corespunde unui index 0 al numelui entit\]ii din setul de selec]ie.

Exemplu

C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.

Crea]i un set de selec]ie din trei entit\]i.

Command: (setq ss1 (ssget))Select objects: pick three objectsSelect objects: Enter<Selection set: 6>

Folosi]i ssname pentru a returna numele fiec\rei entit\]i din setul de selec]ie.

Folosi]i entget pentru a returna lista asociat\ fiec\rei entit\]i.

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

Command: (entget ename)

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

Command: (entget ename)

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

Command: (entget ename)

Seta]i variabila ss1 pe nil [i elibera]i resursele folosite curent de setul de selec]ie.

Command: (setq ss1 nil)nil

141246430.doc R.2.1 4/22/2013 •217

Page 218: Lectii Auto CAD

AUTODESK, INC.

Recapitulare

• Grupurile de entit\]i pot fi plasate `n seturi de selec]ie.

• Un set de selec]ie `n AutoLISP are un tip de date PICKSET. Setul de selec]ie nu este o list\.

• AutoLISP poate men]ine 128 de seturi de selec]ie deschise `n acela[i timp.

• Lega]i o variabil\ ori de c`te ori crea]i un set de selec]ie.

• Elibera]i `ntotdeauna resursele folosite de un set de selec]ie dup\ ce a]i terminat de lucrat cu acesta.

• Func]ia ssget poate crea un set de selec]ie `n diferite moduri.

• Func]ia sslength returneaz\ num\rul de entit\]i din setul de selec]ie.

• Func]ia ssname returneaz\ numele entit\]ii din setul de selec]ie.

•218

Page 219: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL33: CREAREA INTERACTIVA A SETURILOR DE SELECTIE

~n acest exerci]iu:

• Ve]i aprofunda cuno[tin]ele despre seturile de selec]ie din AutoLISP.

• Ve]i folosi func]ia ssget.

• Ve]i ob]ine un set de selec]ie interactiv de la utilizator.

• Ve]i accesa entit\]ile dintr-un set de selec]ie.

Etape de lucru1. Deschide]i fi[ierul grafic moddim.dwg din directorul student.2. ~n editorul de text deschide]i fi[ierul numit chdim.lsp din directorul

student.3. Ad\uga]i codul care realizeaz\ urm\toarele:

• Crea]i o func]ie numit\ c:chdim.

• Cere]i utilizatorului un set de selec]ie.

• Explora]i fiecare entitate din setul de selec]ie.

• Transfera]i ficare list\ asociat\ entit\]ii ca argument la func]ia chdim_mod.

• Elibera]i setul de selec]ie.

4. Salva]i fi[ierul chdim.lsp.5. ~nc\rca]i fi[ierul `n AutoCAD [i `ncerca]i comanda CHDIM.6. Ie[i]i din desen moddim f\r\ a salva modific\rile.7. Dac\ ave]i timp v\ pute]i modifica programul astfel:

• Ad\uga]i o rutin\ de tratare a erorilor.

• Ad\uga]i un dic]ionar de date.

• Transforma]i variabilele corespunz\toare mai degrab\ `n variabile locale dec`t `n variabile globale.

141246430.doc R.2.1 4/22/2013 •219

Page 220: Lectii Auto CAD

AUTODESK, INC.

(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 ) ) ))

•220

Page 221: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 34: SETURI DE SELECTIE CU FILTRU

Acesta este un exerci]iu op]ional.

Rezolva]i acest exerci]iu numai dac\ ave]i timp `n clas\.

Codul care urmeaz\, implementeaz\ o versiune a CHDIM care este din punct de vedere func]ional echivalent\ cu versiunea anterioar\. Aceast\ versiune folose[te un filtru pentru set de selec]ie `n combina]ie cu o selec]ie interactiv\ de entit\]i cu scopul de a amplasa numai entit\]ile de tip dimension `n setul de selec]ie.

Etape de lucru

1. Deschide]i fi[ierul grafic moddim.dwg din directorul student.

2. Crea]i un nou fi[ier `n editorul text numit chdim2.lsp.

3. Introduce]i codul care urmeaz\.

Acest cod creaz\ func]ia c:chdim2. CHDIM2 va cere utilizatorului un set de selec]ie, va filtra toate entit\]ile cu excep]ia entit\]ilor de tip dimension [i va schimba entit\]ile pe layerul DIM.

(defun c:chdim2 ()

;get a selec]ion-set from user and filter out all but dimensions (setq ss (ssget “X”((0 . "DIMENSION")))) (if ;if no selec]ion-set, exit (not ss) (exit) ) ;change the layer (command "._chprop" ss "" "LA" "DIM" "") (setq ss nil) ;free selec]ion-set (prin1) ;quiet exit)

4. Salva]i fi[ierul chdim2.lsp.

5. ~nc\rca]i fi[ierul `n AutoCAD.

6. Activa]i comanda CHDIM2.

7. P\r\si]i desenul moddim f\r\ s\ face]i modific\ri.

141246430.doc R.2.1 4/22/2013 •221

Page 222: Lectii Auto CAD

AUTODESK, INC.

Tabele [i nume de simboluriTabelele p\strez\ lista AutoCAD-ului cu nume de simboluri cum ar fi : layere, defini]ii Block [i tipuri de linii.

Obiective

~n acest capitol ve]i studia:

• Tipuri diferite de tabele `ntr-un fi[ier grafic AutoCAD.

• Cum s\ citi]i fiecare intrare `ntr-un tabel AutoCAD.

• Cum s\ c\uta]i o intrare anume `ntr-un tabel AutoCAD.

Tabele `ntr-un desen

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

• • Block

• • Dimstyle

• • Layer

• • Ltype

• • Style

• • UCS

• • View

• • Vport

Fiecare tabel\ poate fi citit\ direct din AutoLISP. Fiecare `n parte poate fi accesat\ secven]ial sau accesat\ pentru un nume de simbol dat.

Func]iile AutoLISP care acceseaz\ tabelele AutoCAD pot extrage datele asociate cu o tabel\ dar nu pot modifica o tabel\ sau datele sale.

C\utarea secven]ial\ a tabelului layer

Func]ia tblnext scaneaz\ un tabel [i returneaz\ o list\ asociat\ care con]ine datele unui obiect denumit din tabel sau returneaz\ nil dac\ ultima instruc]iune din tabel a fost atins\.

Func]ia tblnext are o sintax\ ciudat\. Func]ia cere un argument: un [ir care corespunde unuia dintre numele de tabele AutoCAD. Dac\ se adaug\ al doilea argument op]ional [i acesta nu este nil, atunci func]ia tblnext returneaz\ primul nume de simbol din tabel; dac\ nu se adaug\ argumentul, func]ia returneaz\ simbolul cerut care

•222

Page 223: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

`l urmeaz\ pe cel returnat prin apelarea anterioar\ a func]iei tblnext.

Exemplu

Aceast\ expresie returneaz\ lista asociat\ pentru prima intrare `n tabelul layer.

Command: (tblnext "LAYER" t)((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

Lista asociat\ este o list\ cu perechi cu punct, a c\rei cod este realizat `n acela[i mod `n care s`nt realizate codurile pentru liste asociate entit\]ilor. Deoarece nu lucr\m cu entit\]i individuale, este clar c\ aceast\ list\ asociat\ nu are un grup -1 reprezent`nd un nume de entitate.

Vezi anexa B din AutoLISP Programmer’s Reference Manual, "Block and Table Group Codes", pentru o descriere complet\ a codurilor din lista asociat\ layerelor.

Exemplu

Dac\ un desen ar con]ine layerele din tabelul de mai jos, atunci s-expresiile care urmeaz\ ar returna listele asociate ar\tate mai jos.

Layer Stare Culoare Tipul de linie

0 Dezghetat, On 7 sau alb continuu

DIM Dezghetat, Off 2 sau galben continuu

HIDDEN Inghetat, Off 5 sau albastru ascuns

OBJECT Dezghetat, On 1 sau rosu continuu

Tabelul 31. Lista de layere si proprietati care ilustreaza valorile returnate de functia tblnext

Command: (tblnext "LAYER" t)((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

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

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

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

Command: (tblnext "LAYER")nil

141246430.doc R.2.1 4/22/2013 •223

Page 224: Lectii Auto CAD

AUTODESK, INC.

O bucl\ care returneaz\ listele asociate pentru toate numele de simboluri dintr-un tabel este u[or de implementat. Acest fragment de cod tip\re[te lista asociat\ pentru fiecare nume de simbol din tabelul layer.

(setq tlist (tblnext "LAYER" t))

(while tlist (print tlist) (setq tlist (tblnext "LAYER")))

•224

Page 225: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 35: CAUTAREA INTR-O TABELA

~n acest exerci]iu :

• Ve]i consolida cuno[tin]ele despre tabele.

• Ve]i crea o nou\ func]ie care scaneaz\ fiecare intrare din tabel.

• Ve]i tip\ri numele fiec\rui simbol `n tabel.

Etape de lucru

1. Deschide]i desenul moddim.dwg `n directorul student.

2. ~ntr-un fi[ier nou din editorul text, introduce]i codul care urmeaz\. Acesta implementeaz\ func]ia c:tlist.

TLIST cere utilizatorului un cod care corespunde unuia dintre tabelele AutoCAD iar apoi scaneaz\ tabelul secven]ial folosind func]ia tblnext [i tip\re[te numele fiec\rui simbol `n tabel.

(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 ;if user pressed return, exit (not ttype) (exit) ) (setq tlist (tblnext ttype t)) ;get first entry `n table (while ;while we have a valid entry... tlist ;in the table... (print (cdr (assoc 2 tlist))) ;print its name... (setq tlist (tblnext ttype)) ;get the next entry...

)

(prin1) ;quiet exit)

3. Salva]i fi[ierul ca tlist.lsp `n directorul student.

4. ~nc\rca]i programul `n AutoCAD.

5. Activa]i comanda TLIST.

141246430.doc R.2.1 4/22/2013 •225

Page 226: Lectii Auto CAD

AUTODESK, INC.

C\utarea unui nume de simbol

Func]ia tblsearch va c\uta un nume de simbol `ntr-un tabel. Func]ia cere dou\ argumente: un [ir care corespunde unui tabel AutoCAD [i un [ir care corespunde numelui unui simbol cerut.

Dac\ numele cerut nu exist\, func]ia tblsearch returneaz\ nil.

Exemplu

Aceast\ expresie caut\ layerul 0 [i-i returneaz\ lista asociat\.

Command: (tblsearch "LAYER" "0")((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))

Recapitulare

• AutoCAd p\streaz\ simbolurile cum ar fi layer-ele [i Block Definitions `n tabele.

• Exist\ 8 tabele `n AutoCAD.

• Func]ia tblnext poate scana fiecare simbol din tabel.

• Func]ia tblsearch poate c\uta un anume simbol `ntr-un tabel.

• Tabelele nu pot fi modificate direct de AutoLISP.

•226

Page 227: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 36: CAUTAREA IN TABELA DE LAYER-E

~n acest exerci]iu:

• Ve]i folosi func]ia tblsearch.

• Ve]i c\uta `n tabela Layer numele layerului dat de utilizator.

• Ve]i determina dac\ layerul exist\ [i ve]i informa utilizatorul `n consecin]\.

Instruc]iuni

1. Deschide]i desenul moddim.dwg din directorul student.

2. ~ntr-un fi[ier nou din editorul de text introduce]i codul care urmeaz\. Acesta implementeaz\ func]ia c:chklayer.

CHKLAYER cere utilizatorului numele layerului [i determin\ dac\ layerul exist\ `n desenul respectiv iar apoi tip\re[te un mesaj adecvat pentru utilizator.

(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. Salva]i fi[ierul text ca chklayer:lsp `n directorul student.

4. ~nc\rca]i programul `n AutoCAD.

5. Activa]i comanda CHKLAYER.

141246430.doc R.2.1 4/22/2013 •227

Page 228: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 37: EXERCITII SUPLIMENTARE CU TABELE

Acesta este un exerci]iu op]ional.

Etape de lucru

1. Deschide]i fi[ierul grafic moddim.dwg `n directorul student.

2. ~ntr-un fi[ier nou din directorul student scrie]i dou\ func]ii: c:chktable [i c:layerset.

3. Salva]i totul `ntr-un fi[ier. ~nc\rca]i func]iile `n AutoCAD [i testa]i-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 c\utat.

4. Spune utilizatorului dac\ simbolul c\utat exist\.

c:layerset

1. ~ntreab\ utilizatorul care este numele layerului.

2. Dac\ layerul exist\, func]ia spune operatorului tipul de linie [i culoarea atribuite layerului.

3. Dac\ layerul exist\, lega]i o variabil\ global\ de un set de selec]ie format din toate entita]ile de pe layerul respectiv.

•228

Page 229: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 14: UN EXECITIU MAI COMPLEX DE CAUTARE IN TABELE

Acesta este un exerci]iu op]ional

Etape de lucru

1. Deschide]i fi[ierul grafic moddim.dwg din directorul student.

2. ~ntr-un fi[ier nou din editorul de text, introduce]i codul care urmeaz\. Acesta implementeaz\ func]ia c:tsearch.

3. TSEARCH caut\ simbolul `ntr-un tabel [i dac\ simbolul exist\ tip\re[te fiecare cod de grup [i valoare din lista asociat\ simbolului.

141246430.doc R.2.1 4/22/2013 •229

Page 230: Lectii Auto CAD

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 ;if user pressed return, exit (not ttype) (exit) ) (setq ttarget ;get target search name (getstring (strcat "\n" ttype " table entry: ")) ) (if ;if user pressed return, exit (not ttarget) (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. Salva]i fi[ierul text ca tsearch.lsp `n directorul student.

5. ~nc\rca]i programul `n AutoCAD [i testa]i comanda TSEARCH.

•230

Page 231: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Fi[iere script [i AutoLISPDac\ vre]i s\ folosi]i un program AutoLISP pentru a procesa c`teva desene `n editor, pe r`nd, probabil ve]i combina un program AutoLISP cu un fi[ier script pentru o procesare automat\.

AutoLISP se ini]ializeaz\ la fiecare nou\ sesiune de editare, adic\ ori de c`te ori `ncepe]i un nou desen sau edita]i unul deja existent. Ini]ializarea elibereaz\ zona de memorie destinat\ AutoLISP-ului [terg`nd toate func]iile definite de utilizator [i de aplica]ii, [i variabilele din proces.

S\ presupunem c\ avem o func]ie AutoLISP definit\ dup\ cum urmeaz\. Ce se `nt`mpl\ c`nd aceast\ func]ie este `n ac]iune?

Command: (defun c:my_new () (command "._new" ""))C:MY_NEWCommand: my_newCommand: ._new File name:Command: !c:my_newnil

C:MY_NEW apeleaz\ comanda AutoCAD NEW [i `ncepe un nou desen. Dup\ ce editorul grafic a fost ini]ializat, verific\m setarea fun]iei C:MY_NEW... [i vedem c\ este nil. Acest lucru se datoreaz\ faptului c\ AutoLISP este `ntotdeauna ini]ializat `mpreun\ cu editorul grafic.

Cu alte cuvinte, orice func]ie AutoLISP care recicleaz\ editorul grafic se autodistruge.

Pentru a rezolva aceast\ problem\, pute]i folosi fi[iere script `n combina]ie cu programe AutoLISP pentru a procesa mai multe desene cu acela[i cod AutoLISP. Fi[ierul script re`ncarc\ [i apeleaz\ programul AutoLISP la fiecare nou desen. Codul AutoLISP scrie fi[ierul script, define[te func]ia pentru a fi apelat\ din fi[ierul script [i apeleaz\ fi[ierul script.

Iat\ un exemplu tipic.

Dorim s\ proces\m toate fi[ierele grafice din directorul student/batchdwg cu un program AutoLISP care tip\re[te un raport ce cuprinde num\rul de Block Definitions din desen [i numele lor. (Acest exerci]iu presupune c\ un astfel de director cu fi[iere grafice exist\ deja `n computer.)

Fi[ierul program run.lsp define[te dou\ func]ii AutoLISP: C:RUN [i C:RUN_REPORT.

141246430.doc R.2.1 4/22/2013 •231

Page 232: Lectii Auto CAD

AUTODESK, INC.

C:RUN execut\ urm\toarele activit\]i `n ordine.

• V\ asigur\ c\ aplica]ia ADS XDOS este `nc\rcat\.

• Cere un nume de director de la utilizator.

• Cere o list\ cu toate fi[ierele grafice din director.

• Scrie un fi[ier script care deschide fiecare desen, re`ncarc\ run.lsp [i apeleaz\ func]ia C:RUN_REPORT pentru fiecare desen.

• Apeleaz\ fi[ierul script.

Func]ia C:RUN_REPORT scrie un fi[ier raport pentru fiecare desen care con]ine Block Definitions. Fi[ierul raport are acela[i nume ca [i desenul cu o extensie .rpt [i se afl\ `n acela[i director ca [i desenul. Func]ia listeaz\ numele fiec\rui Block `n desen [i de c`te ori Block a fost inserat.

c:run folose[te func]ia dosdir din fi[ierul xdos.exe, o aplica]ie ADS real mode pentru ACAD R12 care se afl\ `n CompuServe ACAD Forum `n Library 2. xdos este `n directorul student din computerul dvs. Instruc]iunile de folosire a acestei func]ii se afl\ `n fi[ierul xdos.txt.

~ntr-un desen nou, folosi]i comanda definit\ `n run.lsp. Urma]i instruc]iunile de mai jos.

Command: (load "run")C:RUN_REPORTCommand: run

Dup\ ce ultimul desen a fost procesat, examina]i con]inutul urm\toarelor trei fi[iere:

• • d:\student\run.scr

• • d:\student\batchdwg\block5.rpt

• • d:\student\batchdwg\block10.rpt

•232

Page 233: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(defun C:RUN ()

(if (not (member "DOSDIR" (atoms-family 1))) ;Check for dosdir function. (if ;If not there, attempt to (= "bad" (xload "XDOS.EXE" "bad")) ;load XDOS program; exit (progn ;if attempt fails. (prompt "\nCan't load XDOS.EXE.") (exit) ) ) )

(setq dwgdir (getstring "\nDirectory: ")) ;Get directory from user.

(setq dwgnames ;Get list of drawings. (dosdir (strcat dwgdir "\\" "*.dwg") 0) )

(setq fp (open "run.scr" "w")) ;Open file run.scr for ;writing `n current dir.

;The script commands will open each drawing `n turn, load the ;file run.lsp and apply the run_report command to each file. (foreach a dwgnames ;Write script file. (progn (princ "(if (= 0 (getvar \"DBMOD\")) (command \"._OPEN\")" fp) (princ "(command \"._OPEN\" \"N\"))\n" fp) (princ (strcat dwgdir "\\" a "\n") fp) (princ "(load \"run.lsp\")\n" fp) (princ "run_report\n" fp) ) ) (setq fp (close fp)) ;Close run.scr file.

(command "._SCRIPT" "run") ;Call script as last ; expression.)

(defun C:RUN_REPORT () (setq block_name_list nil) ;Initialize list of Block names.

(if (setq block_table_list (tblnext "BLOCK" t)) ;We have a Block? (progn (prompt "\nFinding Block names.") ;Keep the customer happy. (while ;Add its name to the list and block_table_list ;get the next one. (setq block_name (cdr (assoc 2 block_table_list))) (setq block_name_list (cons block_name block_name_list)) (setq block_table_list (tblnext "BLOCK")) ) ;Sort the list of Block names. (setq block_name_list (acad_strlsort block_name_list)) ;Get the number of Insert entities for each Block. ;Create a list of dotted pairs. Each dotted pair consists

141246430.doc R.2.1 4/22/2013 •233

Page 234: Lectii Auto CAD

AUTODESK, INC.

;of a Block name and the number of Insert entities. (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 selec]ion-set of all (ssget "X" ;the INSERT entities of the (list ;current block_name. (cons 0 "INSERT") (cons 2 block_name) ) ) ) (setq ;Add a dotted pair of the form report_list ;("BLOCK_NAME" . "NUMBER") to (cons ;the report_list. (cons block_name (if ;If, for example, the Block "DOOR" s_set ;is not inserted `n this drawing, (itoa (sslength s_set)) ;add the dotted pair ("DOOR" . "0"). "0" ) ) report_list ) ) (setq count (1+ count)) ;Next Block name. (princ ".") ;Keep the customer happy. ) (setq report_list (reverse report_list)) ;Reverse report list. (setq s_set nil) ;Free selec]ion-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))

•234

Page 235: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(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.)

141246430.doc R.2.1 4/22/2013 •235

Page 236: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•236

Page 237: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la PoliliniiPoliliniile s`nt entit\]i complexe. Ele s`nt formate dintr-o entitate principal\ de tip "POYLINE" urmat\ de una sau mai multe entit\]i de tip "VERTEX" terminate de o entitate de tip "SEQUEND". Aceast\ diagram\ ilustreaz\ lan]ul de entit\]i [i numele lor.

POLYLINE

VERTEX

SEQEND

Main entity

Next entity name:

VERTEX

Sub entity

Next entity name:

VERTEXor

SEQEND

Sub entity

Next entity name:

Next main entityin database

Figura 47.Relatia dintre polyline ca entitate principala si subentitati

~n afara acces\rii entit\]ilor principale ne[terse din baza de date, func]ia entnext va accesa subentit\]ile unei Polilinii [i atributele entit\]ilor Insert. Acest capitol ilustreaz\ acest principiu cu ajutorul unei func]ii care:

• Cere utilizatorului s\ selecteze o polilinie.

• Acceseaz\ subentita]ile unei polilinii.

• Vizualizeaz\ un raport despre fiecare entitate pe display.

• Iese atunci c`nd a ajuns la cap\tul poliliniei.

141246430.doc R.2.1 4/22/2013 •237

Page 238: Lectii Auto CAD

AUTODESK, INC.

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

(defun *error* (msg) ;define new error handler (if (/= "Function cancelled" msg) ;no message if user cancels (if (= msg "quit / exit abort") ;no message if program deliberately (princ) ;aborts (princ (strcat "\nError: " msg));otherwise, print error for user ) (princ) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit ) (setq epick (entsel "\nSelect polyline: ")) ;select an entity (if (not epick) ;if no entity selected, exit (exit) ) (setq ename (car epick)) ;get entity name (setq elist (entget ename)) ;get association list (setq etype (cdr (assoc 0 elist))) ;store entity type (if (/= "POLYLINE" etype) ;if not a Polyline, exit (progn (prompt "\nNot a polyline.") (exit) ) ) (while ;while we have an entity name (and ;and it's not the end of the ename ;Polyline... (/= "SEQEND" etype) ) (princ "\nEntity type: ") ;print the entity type (princ etype) (if ;if it's a Vertex entity... (= "VERTEX" etype) ;get its group 70 flags and (progn ;location, and print location (setq vflags (cdr (assoc 70 elist))) (setq pt (cdr (assoc 10 elist))) (princ "\nLocation: ") (princ (car pt)) (princ " ") (princ (car (cdr pt))) (princ " ") (princ (car (cdr (cdr pt)))) (if ;check each flag and print (= 1 (logand 1 vflags)) ;each if true (princ "\nVertex inserted by curve-fitting.") ) (if (= 2 (logand 2 vflags)) (princ "\nCurve-fit tangent defined for this vertex.")

•238

Page 239: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

) (if (= 8 (logand 8 vflags)) (princ "\nSpline vertex created by spline-fitting.") ) (if (= 16 (logand 16 vflags)) (princ "\nSpline frame control point.") ) (if (= 32 (logand 32 vflags)) (princ "\n3D Polyline vertex.") ) (if (= 64 (logand 64 vflags)) (princ "\n3D Polyline mesh vertex.") ) (if (= 128 (logand 128 vflags)) (princ "\nPolyface mesh vertex.") ) ) ) ;stop screen from scrolling (getstring "\n\nPress RETURN to continue...") (setq ename (entnext ename)) ;get next entity `n Polyline (if ;if we have an entity name... ename ;get its assocation list and (progn ;entity type (setq elist (entget ename)) (setq etype (cdr (assoc 0 elist))) ) ) ) (setq *error* old_error) ;restore old error handler (prin1) ;quiet exit)

141246430.doc R.2.1 4/22/2013 •239

Page 240: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•240

Page 241: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la Block DefinitionsBlock Definitions s`nt entit\]i complexe. O entitate principal\ de tip "BLOCK" cu un nume unic este p\strat\ `n tabela AutoCAD Block. Aceast\ entitate este urmat\ de una sau mai multe entit\]i de orice tip, terminat\ cu o entitate de tip "ENDBLK". Aceast\ diagram\ ilustreaz\ lan]ul de entit\]i [i numele entit\]ilor.

Block Table

Next sub entity

ENDBLK

Named object

Next entity name:

Any type

Any type

Next entity name:

Any type

Sub entity

Next entity name:

None

Figura 48. Relatia dintre intrarea in tabela Block si subentitatile acestuia.

Func]ia entnext acceseaz\ subentit\]ile din defini]iile Block. Acest capitol ilustreaz\ acest principiu printr-o func]ie care:

• Cere utilizatorului s\ selecteze o entitate Insert care se refer\ la Block Definition.

• Acceseaz\ Block Definition `n cadrul tabelei Block.

• Acceseaz\ subentit\]ile din Block Definition

• Tip\re[te lista asociat\ fiec\rei subentit\]i pe display.

• Iese c`nd ajunge la cap\tul entit\]ii Block Definition.

141246430.doc R.2.1 4/22/2013 •241

Page 242: Lectii Auto CAD

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) ) (setq *error* old_error) ;restore default error handler (princ) ;quiet exit ) (setq epick (entsel "\nSelect block: ")) ;select an entity (if (not epick) ;if no entity selected, exit (exit) ) (setq ename (car epick)) ;get entity name (setq elist (entget ename)) ;get association list (setq etype (cdr (assoc 0 elist))) ;store entity type (if (/= "INSERT" etype) ;if not an Insert, exit (progn (prompt "\nNot a block.") (exit) ) ) (setq bname (cdr (assoc 2 elist))) ;get name of Block Definition (setq blist (tblsearch "BLOCK" bname));get its assoc list (setq ename (cdr (assoc -2 blist))) ;get first entity `n Block (setq elist (entget ename)) ;get its assoc list (setq etype (cdr (assoc 0 elist))) ;store entity type (while ;while we have an entity name (and ;and it's not the end of the ename ;Block Definition... (/= "ENDBLK" etype) ) (print elist) ;print entity's assoc list ;stop screen from scrolling

•242

Page 243: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

(getstring "\n\nPress RETURN to continue...") (setq ename (entnext ename)) ;get next entity `n Block (if ;if we have an entity name... ename ;get its assocation list and (progn ;entity type (setq elist (entget ename)) (setq etype (cdr (assoc 0 elist))) ) ) ) (setq *error* old_error) ;restore old error handler (prin1) ;quiet exit)

141246430.doc R.2.1 4/22/2013 •243

Page 244: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•244

Page 245: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Crearea entit\]ilor Line cu func]ia entmakeFunc]ia entmake creaz\ noi entit\]i AutoCAD f\r\ s\ foloseasc\ comenzi AutoCAD de tip LINE, ARC, CIRCLE. Func]ia entmake adaug\ entit\]i noi direct `n baza de date.

Func]ia entmake cere un argument: o list\ asociat\ entit\]ii. Func]ia returneaz\ lista asociat\ entit\]ii `n `ntregime dac\ reu[e[te s\ creeze o entitate, altfel returneaz\ nil.

Lista asociat\ folosit\ ca argument trebuie s\ con]in\ toate informa]iile necesare pentru a defini entitatea. Defini]ii op]ionale, cum ar fi layerul implicit, s`nt omise din lista asociat\.

De exemplu, fiecare dintre aceste expresii creaz\ o entitate Line `n WCS pe Layerul 0 de la 1,1,0 la 5,5,0.

Exemplul 1

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

Exemplul 2

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

141246430.doc R.2.1 4/22/2013 •245

Page 246: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 39: CREAREA UNEI LINII CU ENTMAKE

Crea]i o func]ie numit\ c:xline `ntr-un fi[ier text numit xline.lsp `n directorul student

Comanda XLINE ar trebui s\ fac\ urm\toarele:

• S\ cear\ utilizatorului un punct de start.

• S\ cear\ utilizatorului un punct de sf`r[it.

• S\ creeze o entitate de tip Line `n baza de date prin apelarea func]iei entmake.

• S\ deseneze linia `ntre cele dou\ puncte pe layerul curent.

•246

Page 247: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Crearea entit\]ilor Polylines si Block Definitions cu func]ia entmake

Entit\]i complexe cum s`nt poliliniile, defini]iile de Block [i entit\]ile Insert atribute pot fi definite prin apelarea de c`teva ori a func]iei entmake care s\ le defineasc\ subentit\]ile.

De `ndat\ ce AutoCAD vede c\ func]ia entmake creaz\ o entitate complex\, acesta creaz\ un fi[ier temporar `n care pastreaz\ toate datele defini]iilor. Dup\ definirea entit\]ii prin apelarea func]iei entmake), AutoCAD creaz\ [i adaug\ o entitate de cap\t (o entitate SEQEND pentru o polilinie sau o entitate BLKEND pentru o defini]ie Block), desfiin]eaz\ fi[ierul temporar [i, `n cazul defini]iei Block, returneaz\ numele Blockului care a fost definit [i nu lista asociat\ entita]ii definite.

Polylines

Expresiile care urmeaz\ creaz\ o entitate de tip polilinie pe layerul curent [i UCS cu o eleva]ie 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 defini]ie Block numit\ myblock `n tabelul Block. Defini]ia are un punct de baz\ de 5,5,0 [i este format\ din urm\toarele entit\]i:

141246430.doc R.2.1 4/22/2013 •247

Page 248: Lectii Auto CAD

AUTODESK, INC.

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

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

(entmake (list (cons 0 "BLOCK") (cons 2 "MYBLOCK") (cons 70 0) (list 10 0.0 0.0 0.0) ))

(entmake (list (cons 0 "LINE") (list 10 5.0 5.0 0.0) (list 11 10.0 1.0 0.0) ))

(entmake (list (cons 0 "CIRCLE") (list 10 5.0 5.0 0.0) (cons 40 1.0) ))

(entmake (list (cons 0 "ENDBLK") ))

•248

Page 249: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 40: CREAREA UNEI POLILINII CU FUNCTIA ENTMAKE

1. Crea]i o func]ie numit\ c:polymake `ntr-un nou fi[ier text numit polymake.lsp `n directorul student.

Func]ia trebuie s\ fac\ urm\toarele:

• S\ fac\ o nou\ entitate de tip Polyline cu func]ia entmake.

• S\ introduc\ o bucl\.

• S\ cear\ utilizatorului un vertex.

• S\ apeleze func]ia entmake at`ta timp c`t utilizatorul selecteaz\ un punct.

• S\ ias\ din bucla c`nd utilizatorul introduce o valoare nul\.

• S\ termine de f\cut polilinia prin apelarea func]iei entmake pentru inserarea entit\]ii SEQUEND.

2. Salva]i fi[ierul text.

3. ~nc\rca]i programul `n AutoCAD [i `ncerca]i comanda POLYMAKE.

141246430.doc R.2.1 4/22/2013 •249

Page 250: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•250

Page 251: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Tratarea [irurilorAutoLISP dispune de un set redus de func]ii care realizeaz\ opera]ii de baz\ pe [iruri: lungimea [irului, modificarea caracterelor, concatenarea [i analiza.

Obiective

~n acest capitol ve]i studia:

• Cum s\ determina]i num\rul de caractere dintr-un [ir.

• Cum s\ modifica]i caracterele dintr-un [ir.

• Cum s\ concatena]i dou\ sau mai multe [iruri.

• Cum s\ analiza]i un [ir, fiecare caracter pe r`nd.

Func]ia strlen

{irurile de tip text s`nt formate din 0 sau mai multe caractere aflate `ntre semnele cit\rii duble (“). Un [ir cu nici un caracter este reprezentat ca "", sau cu null string.

Func]ia strlen cere un singur [ir ca argument. Func]ia returneaz\ lungimea unui [ir `n caractere ca un `ntreg.

Un spa]iu valoreaz\ c`t un caracter, caracterul escape este echivalent cu "an".

Exemplu

Introduce]i expresiile care urmeaz\. Afla]i lungimea c`torva [iruri de text.

.Command: (strlen "")0

Command: (strlen "123456789")9

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

Command: (strlen "\nPoint:")7

141246430.doc R.2.1 4/22/2013 •251

Page 252: Lectii Auto CAD

AUTODESK, INC.

Func]ia strcase

Func]ia strcase cere un argument [i un argument op]ional. 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

Introduce]i expresiile care urmeaz\. Transforma]i caracterele celor trei [iruri de tip text.

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

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

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

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

Func]ia strcat

Func]ia strcat cere unul sau mai multe argumente [i fiecare dintre ele trebuie s\ fie un [ir de tip text. Func]ia returneaz\ un singur [ir text: rezultatul concaten\rii argumentelor.

Func]ia strcat, printre altele, este folositoare pentru a formula cereri la utilizator. De exemplu, este posibil s\ fie nevoie s\ cere]i utilizatorului ca a n-a instruc]iune dintr-un grup de instruc]iuni s\ fie procesat\. Pentru aceasta trebuie s\ lua]i num\rul n, sa-l transforma]i `ntr-un [ir, apoi s\-l concatena]i cu restul.

Exemplu

Introduce]i expresiile care urmeaz\. Concatena]i cele dou\ [iruri.

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

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

•252

Page 253: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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

Exemplu

Introduce]i expresiile care urmeaz\. Formula]i o cerere dintr-un [ir [i un num\r `ntreg.

Command: (setq index 1)1Command: (setq a "Processing object " b "...")"..."Command: (strcat a (itoa 1) b)"Processing object 1..."

Analiza [irurilor

Pu]ine texte `n Lisp acord\ subiectului despre analiza [irurilor importan]a cuvenit\. De[i pare ciudat, probabil v\ este mai comod s\ c\uta]i un text despre limbajul C cu explica]ii [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 s`nt manuale care acord\ cel pu]in un capitol [irurilor [i analizei [irurilor.

Analiza [irurilor simple, adic\ citirea pe r`nd a caracterelor dintr-un [ir [i compararea acestora cu valori, este discutat\ `n urm\torul capitol destinat func]iei substr.

Func]ia substr

Func]ia substr cere trei argumente: un [ir de tip text, un num\r `ntreg de indexare a caracterelor din [ir de la st`nga la dreapta, [i un pas de incrementare a num\rului de caractere spre dreapta [i inclusiv a caracterului indexat.

Func]ia substr returneaz\ un [ir care `ncepe cu caracterul indexat din [ir [i se continu\ cu num\rul 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".

141246430.doc R.2.1 4/22/2013 •253

Page 254: Lectii Auto CAD

AUTODESK, INC.

(substr "123456" 4 1)

Aceast\ expresie returneaz\ [irul "456".

(substr "123456" 4 3)

Formarea buclelor de program cu func]ia substr

Pentru a analiza caracterele unui [ir pe r`nd, ar trebui s\ apela]i func]ia substr aflat\ `ntr-o bucl\.

Un index al unui caracter dintr-un [ir este ini]ializat cu 1. Bucla `ncepe [i se repet\ pentru fiecare caracter din [ir. Fiecare caracter este returnat [i tip\rit separat [i indexul incrementat cu 1 `n bucl\.(setq index 1)(setq string "Hello, world.")

(repeat (strlen string) (print (substr string index 1)) (setq index (1+ index)))

Recapitulare• strlen returneaz\ lungimea unui [ir `n caractere.

• Func]ia strcase poate returna un [ir de tip text a c\rui caractere s`nt transformate `n litere mari sau mici.

• Func]ia strcat concateneaz\ dou\ sau mai multe [iruri.

• Analiza [irului `n AutoLISP se face cu func]ia substr.

•254

Page 255: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 41: SIRURI SI ANALIZA LOR

~n acest exerci]iu:

• Ve]i concatena [iruri pentru a crea cereri la utilizator.

• Ve]i folosi lungimea [irului pentru a determina de c`te ori trebuie repetat\ o bucl\.

• Ve]i analiza toate caracterele dintr-un [ir, pe r`nd, [i ve]i elimina toate spa]iile din [ir.

Etape de lucru

~n editorul de text crea]i un fi[ier nou numit nospace.lsp `n directorul student.~n acest fi[ier crea]i o func]ie numit\ nospace. Aceast\ func]ie ar trebui s\ fac\ urmatoarele opera]ii `n ordine.

1. S\ cear\ un argument: un [ir.

2. S\ seteze o variabil\ de indexare la 1.

3. S\ seteze o variabil\ de ie[ire la [irul nul "".

4. S\ `nceap\ o bucl\ care s\ se repete conform num\rului de caractere din [ir.

5. S\ extrag\ un caracter din [ir de la pozi]ia curent\.

6. ~n cazul `n care caracterul este un spa]iu, acesta se ignor\; dac\ nu, adaug\ caracterul la valoarea concatenat\.

7. S\ incrementeze indexul cu 1.

8. S\ returneze variabila cu spa]iile eliminate.

141246430.doc R.2.1 4/22/2013 •255

Page 256: Lectii Auto CAD

AUTODESK, INC.

EXERCITIUL 41: ANALIZA SIRURILOR CU CARACTERE DE DELIMITARE

Pute]i rezolva acest exerci]iu dac\ Lotus® 1-2-3® [i Microsoft® Excel s`nt instalate `n computerul dvs.

Generalit\]i

Programele de calcul tabelar cum s`nt programele Lotus 1-2-3 [i Microsoft Excel pot scrie date `ntr-un fi[ier de tip text. Fiecare linie din calculul tabelar reprezint\ un singur r`nd de text `n fi[ierul de ie[ire. Coloanele dintr-un [ir s`nt separate unele de altele printr-un caracter delimitator. Delimitatorul este selectabil de c\tre utilizator [i de obicei lipsit de TAB sau virgul\.

Programul prezentat mai jos implementeaz\ o func]ie numit\ parse. Func]ia parse cite[te un singur r`nd de text creat dup\ formatul descris mai sus. Func]ia returneaz\ o lista de [iruri unde fiecare coloan\ dintr-un r`nd este tratat\ ca un [ir individual.

Func]ia parse cere trei argumente: [irul de analizat, caracterul folosit ca delimitator `n interiorul [irului [i un indicator de condi]ie care dac\ nu este nil va returna toate pozi]iile unde apare delimitatorul care separ\ [irul `n lista returnat\.

~mpreun\ cu func]ia parse este definit\ [i func]ia c:test_parse. Func]ia TEST_PARSE cite[te o list\ de [iruri, le analizeaz\ pe fiecare [i scrie rezultatul `ntr-un fi[ier asociat numit testpars.txt `n directorul curent. Fiecare valoare returnat\ de parse este testat\; dac\ apare o eroare, se scrie un mesaj `n fi[ierul asociat.

Etape de lucru

1. Lansa]i programul de calcul tabelar.

2. ~n acest program deschide]i fi[ierul testpars.xls `n directorul student.

3. Folosi]i comanda SAVE AS pentru a salva datele ca un format text `ntr-un fi[ier. ~n programul Excel comanda folose[te caracterul TAB ca delimitator.

4. ~nchide]i programul de calcul tabelar.

5. ~n editorul de text, examina]i formatul Text din fi[ier.

6. ~nc\rca]i programul parse.lsp `n AutoCAD.

•256

Page 257: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

7. Activa]i comanda PARSETEXT [i urm\ri]i cererile.

8. PARSETEXT va analiza fiecare [ir din fi[ierul text [i va afi[a pe display lista de [iruri returnat\ pentru fiecare r`nd de c\tre func]ia parse.

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

(defun parse (str delim rd / char index rl sstr strl)

(setq ;initialize... sstr "" ;string to place `n list rl nil ;list to return index 1 ;character index `n string strl (strlen str) ;length of string )

continuare pe pagina urmatoare

141246430.doc R.2.1 4/22/2013 •257

Page 258: Lectii Auto CAD

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)) ;increment the char index );end repeat

(reverse rl) ;reverse the list to return so the ;strings are `n original order );end progn );end if)

continuare pe pagina urmatoare

•258

Page 259: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

; TEST_PARSE.LSP; Version 1.0 3/30/93;; test_parse;; Test the function (parse). Use two lists of strings with different; delimiter characters: "\t" and ",". Test for both nil and t delimiter; flag. Write test results to the log file TESTPARS.TXT `n the current; directory. Write an error message with index every time (parse) fails; to match a value `n a result list.;;; Local variables:;; fp FILE Pointer to log file; string STR Current string argument to parse; t1 LIST List of strings to test; t2 LIST List of strings to test; t1_r1 LIST List of t1 results for nil delim flag; t1_r2 LIST List of t1 results for t delim flag; t2_r1 LIST List of t2 results for nil delim flag; t2_r2 LIST List of t2 results for t delim flag

(defun c:test_parse (/ fp string t1 t1_r1 t1_r2 t2 t2_r1 t2_r2) (setq t1 '("" "\t" "a" "ab" "a\t" "\ta" "a\tb" "a\tb\t" "\ta\t" "\t\t") t1_r1 '(("") ("" "") ("a") ("ab") ("a" "") ("" "a") ("a" "b") ("a" "b" "") ("" "a" "") ("" "" "") ) t1_r2 '(("") ("" "\t" "") ("a") ("ab") ("a" "\t" "") ("" "\t" "a") ("a" "\t" "b") ("a" "\t" "b" "\t" "") ("" "\t" "a" "\t" "") ("" "\t" "" "\t" "") ) t2 '("" "," "a" "ab" "a," ",a" "a,b" "a,b," ",a," ",,") t2_r1 '(("") ("" "") ("a") ("ab") ("a" "") ("" "a") ("a" "b") ("a" "b" "") ("" "a" "") ("" "" "") ) t2_r2 '(("") ("" "," "") ("a") ("ab") ("a" "," "") ("" "," "a") ("a" "," "b") ("a" "," "b" "," "") ("" "," "a" "," "") ("" "," "" "," "") ) ) (setq fp (open "testpars.txt" "w"))

continuare pe pagina urmatoare

141246430.doc R.2.1 4/22/2013 •259

Page 260: Lectii Auto CAD

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

continuare pe pagina urmatoare

•260

Page 261: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

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

141246430.doc R.2.1 4/22/2013 •261

Page 262: Lectii Auto CAD

AUTODESK, INC.

Aceast\ pagin\ a fost l\sat\ liber\ `n mod inten]ionat.

•262

Page 263: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Pointere de entit\]iUn pointer de entitate este un identificator unic [i permanent pentru o entitate dintr-un desen AutoCAD. Aplica]iile pot folosi pointere de entit\]i pentru a men]ine leg\turi asociative `ntre entita]i sau `ntre entit\]i [i seturi arbitrare de date `n timpul sesiunii de editare grafic\.

Obiective

~n acest capitol ve]i studia:

• Cum s\ activa]i sau s\ distruge]i pointerele de entit\]i.

• Cum s\ extrage]i un pointer dintr-o list\ asociat\ entit\]ii.

• Cum s\ g\si]i o entitate cu ajutorul pointerului.

Formatul unui pointer de entitate

Pointerele de entita]i s`nt p\strate ca numere hexadecimale exprimate sub forma unui [ir. De exemplu, primul pointer atribuit entit\]ii `ntr-un desen poate fi "1" iar pointerul treizeci [i unu poate fi "1F".

Pointerul unei entit\]i nu poate fi schimbat: poate fi numai distrus. C`nd se [terge o entitate dintr-un desen, pointerul ei este retras [i niciodat\ refolosit `n acel desen.

Lungimea maxim\ a unui [ir este de 16 caractere, ceea ce `nseamn\ c\ num\rul maxim de pointere pentru un singur desen este 264-1.

Pointerele s`nt p\strate `n codul de grup DXF cimpul 5 al unei liste asociat\ entit\]ii.

Atribuirea de pointere entit\]ilor

Spunem c\ al 31-lea pointer atribuit entit\]ii ar putea fi "1F" deoarece atribuirea pointerelor nu este `ntotdeauna secven]ial\, de[i `ntotdeauna progreseaz\ de la mai mic la mai mare. Este imposibil de prev\zut `n toate cazurile care va fi urm\toarea atribuire pe care o va face AutoCAD-ul; de aceea este necesar de stabilit `n mod explicit pointerul unei entit\]i din lista asociat\ entit\]ii, dec`t s\ `ncerc\m s\ ghicim ce pointer va atribui AutoCAD-ul entit\]ii.

141246430.doc R.2.1 4/22/2013 •263

Page 264: Lectii Auto CAD

AUTODESK, INC.

Activarea si dezactivarea pointerelor

Ac]iunea de atribuire a pointerelor este dezactivat\ `n momentul `n care pointerele lipsesc. Comanda HANDLE ON va activa pointerele permanent `n desenul curent.

Pointerele pot fi dezactivate. Deoarece prin aceasta se poate dezactiva orice legatur\ `ntre entit\]ile AutoCAD [i de bazele de date externe (de exemplu pointerele s`nt folosite extensiv de c\tre AutoCAD SQL Extension), pointerele pot fi distruse printr-un act deliberat din partea utilizatorului.

Comanda HANDLES DESTROY <CONFIRMATION-STRING> va dezactiva toate activit\]ile de atribuire a pointerelor `n sesiunea curent\. <CONFIRMATION-STRING> este unul din cele [ase [iruri posibile pe care le poate introduce utilizatorul. AutoCAD genereaz\ unul dintre [iruri la `nt`mplare `n timpul execu]iei comenzii; de aceea este imposibil de prezis de care [ir este nevoie ca s\ confirme comanda.

Verificarea atribuirii pointerelor

Variabila de sistem HANDLES este setat\ la 1 c`nd pointerele s`nt activate `n sesiunea curent\.

G\sirea unei entit\]i cu ajutorul pointerului

Func]ia handent cere un argument de tip [ir: pointerul unei entit\]i. Dac\ unei entit\]i din sesiunea curent\ i se atribuie un pointer, func]ia handent va returna numele entit\]ii; dac\ nu, va returna nil.

Exemplu

~ntr-o nou\ sesiune, introduce]i comenzile [i expresiile care urmeaz\. Extrage]i un pointer de entitate [i stabili]i numele entit\]ii folosind pointerul.

Activa]i pointerele `n sesiunea curent\.

Command: handlesHandles are disabled.ON/DESTROY: on

Desena]i c`teva entit\]i Line.

Command: lineetc...

Extrage]i un pointer cu una din entit\]ile Line.

Command: (setq elist (entget (car (entsel))))Select object: pick a line

•264

Page 265: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (setq ehand (cdr (assoc 5 elist)))

Command: !ehand"1B" (sau un [ir similar)

141246430.doc R.2.1 4/22/2013 •265

Page 266: Lectii Auto CAD

AUTODESK, INC.

Extrage]i numele entit\]ii folosindu-i pointerul.

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

Recapitulare• Pointerele de entit\]i s`nt p\strate ca numere

hexazecimale exprimate sub form\ de [iruri.

• Pointerul nu poate fi schimbat niciodat\. El poate fi numai distrus.

• Pointerele s`nt p\strate `n coduri DXF de grup 5 `ntr-o list\ asociat\ entit\]ii.

• Atribuirea de valori nu este `ntotdeauna secven]ial\.

• Comanda HANDLES activeaz\ sau dezactiveaz\ pointerele.

• Func]ia handent va returna numele entit\]ii prin pointerul entit\]ii.

•266

Page 267: Lectii Auto CAD

AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 43: SALVAREA SETURILOR DE SELECTIE

~n acest exerci]iu:

• Ve]i folosi un program pentru a citi pointerele entit\]ilor.

• Ve]i p\stra pointerele `ntr-un fi[ier extern.

• Ve]i citi fi[ierul extern [i ve]i crea un set de selec]ie din pointerele entit\]ilor.

Programul savset.lsp din directorul student implementeaz\ dou\ comenzi pentru AutoCAD: SAVESET [i GETSET.

SAVESET p\streaz\ p`n\ la [ase seturi de selec]ie diferite dintr-un desen [i permite ca acestea s\ fie folosite `n timpul sesiunii de editare grafic\. SAVESET salveaz\ pointerele dintr-un set de selec]ie `ntr-un fi[ier extern a c\rui nume este <dwgname>.st<n>, unde <dwgname> este numele desenului respectiv [i <n> este un num\r cuprins `ntre 1 [i 6.

GETSET cite[te pointerele entit\]ilor dintr-un fi[ier creat de SAVESET [i construie[te setul de selec]ie anterior din entit\]ile asociate cu pointerele.

Etape de lucru

P\stra]i seturile de selec]ie `n timpul sesiunii de editare prin scrierea [i cititrea pointerelor `n/[i din fi[ierul extern.

• Deschide]i desenul ssget.lsp din directorul student.

• ~nc\rca]i programul savset.lsp `n AutoCAD.

• Folosi]i comanda SAVESET [i salva]i dou\ sau mai multe seturi de selec]ie.

• Deschide]i o nou\ sesiune de editare grafic\ cu ssget.

• ~nc\rca]i programul saveset.lsp.

• Folosi]i comanda GETSET pentru a extrage unul dintre seturile de selec]ie p\strate.

• Folosi]i comanda MOVE cu setul de selec]ie anterior.

• Deschide]i fi[ierul savset.lsp `n editorul de text [i examina]i codul.

141246430.doc R.2.1 4/22/2013 •267

Page 268: Lectii Auto CAD

AUTODESK, INC.

EXECITIUL 44: UN MANAGER SIMPLU PENTRU FISIERELE TIP DWG

Acesta este un exerci]iu op]ional

Fi[ierul drawman.lsp din directorul student implementeaz\ un sistem de management pentru fi[iere tip dwg, foarte simplu pentru a ilustra modul cum pot fi folosite pointerele.

Pute]i folosi comenzile din acest fi[ier urm`nd aceste etape:

1. ~nc\rca]i fi[ierul drawman.lsp `n AutoCAD.

2. Folosi]i comanda LOGIN.

3. Desena]i c`teva entit\]i.

4. Folosi]i comanda LOGOUT.

5. Folosi]i oricare dintre aceste comenzi pentru a afla informa]ii despre entit\]ile pe care le-a]i desenat prin leg\turi `ntre pointere [i atribute `ntr-un bloc inserat aplica]iei.

FINGERRLISTSELUSERSELECO

Aduce]i fi[ierul `n editorul de text [i studia]i-l. Codul este scurt, u[or de `n]eles [i bine comentat.

•268