You are on page 1of 259

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.

50793936.doc R.2.1 12/8/2021 ATC. Iasi ·1


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
Accesul la entit\]i simple [i la polilinii................................................................217

·2
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·3


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:

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

·4
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

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.

50793936.doc R.2.1 12/8/2021 ·5


AUTODESK , INC.

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

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.

50793936.doc R.2.1 12/8/2021 ·7


AUTODESK , INC.

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)

(+ 1 2)
AutoCAD AutoLISP
3

3
Command:

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)
3
Command:
S-expresii Rezultate
(+ 1 2) 3
(- 2 1) 1
(/ 4 2) 2
(* 4 2) 8
Tabelul 1. Rezultatele expresiilor simbolice

·8
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

Command:array
last
polar
5,5
(/ 360 15)

(/ 360 15)
AutoCAD 24
AutoLISP

Command:array
last
polar
5,5
20
Figura 2. Cum AutoCAD-ul si AutoLISP-ul comunica intr-o comanda AutoCAD

50793936.doc R.2.1 12/8/2021 ·9


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: line
From point: 5,5
To point: 5,8
To point: Enter

Command: array
Select objects: last
1 found
Select objects: Enter
Rectangular or Polar array (R/P): p
Center point of array: 5,5
Number of items: (/ 360 15)
Angle to fill (+=ccw, -=cw) <360>:Enter
Rotate objects as they are copied? <Y>Enter

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

Caracterul semnul 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
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
pieste 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.

50793936.doc R.2.1 12/8/2021 ·11


AUTODESK , INC.

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

·12
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Atomi [i liste

Exist\ dou\ mari categorii de tipuri de date `n AutoLISP: atomi [i liste.


Atomii 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.

50793936.doc R.2.1 12/8/2021 ·13


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.

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

·14
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·15


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
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"

50793936.doc R.2.1 12/8/2021 ·17


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 I
1. Determina]i dac\ obiectul este atom sau list\.
2. Completa]i rezultatul evalu\rii `n c\su]a corespunzatoare.
Tabelul 3. Determinarea naturii obiectului

Obiecte Atomi Liste

73.5

"0,0"

(1.0 2.0 3.0)

"String"

("String")

()

·18
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a II-a
1. 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:
Exemplu
Command: !4.5

Atomi Valori

4.5

"text"

17

setq

xyz

nil
Tabelul 4. Determinarea valorii atomului

Partea a III-a
1. 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

50793936.doc R.2.1 12/8/2021 ·19


AUTODESK , INC.

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

·20
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Evaluarea
Evaluarea este procesul prin care AutoLISP-ul determin\ valoarea unui
obiect. Evaluarea se aplic\ [i la atomi [i la liste.

Fiecare obiect din AutoLISP are o valoare. Prin evaluarea unui obiect,
AutoLISP-ul determin\ valoarea acestuia.

Obiective
~n acest capitol 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: !pi
3.14159 <--- valoare returnata

~ntr-un exemplu anterior folosind comanda ARRAY, AutoLISP-ul a evaluat


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

50793936.doc R.2.1 12/8/2021 ·21


AUTODESK , INC.

AutoCAD prompt User enters


Number of items: (/ 360 15)

AutoLISP

receives
(/ 360 15)
returns
24

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 Valoare
evaluare

Intreg 1 Valoarea este 1


nr. insusi

Real 4.5 Valoarea este 4.5


nr. insusi

Sir "text" Valoarea este "text"


nr. insusi

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.

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.

·22
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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


regula sintactic\.
· Pentru orice list\ care poate fi evaluat\, primul element din
cadrul listei trebuie s\ fie o 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 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.

50793936.doc R.2.1 12/8/2021 ·23


AUTODESK , INC.

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)

·24
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

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.

50793936.doc R.2.1 12/8/2021 ·25


AUTODESK , INC.

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

·26
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·27


AUTODESK , INC.

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.

·28
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 I
1. 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:
(+12)

Expresii aritmetice S-expresii

3 + 10 + 5

20 * 15

16 - 10

15 / 3

5 + (10 * 2)

(5 + 10) * 2

Tabelul 9. Traducerea expresiilor aritmetice

50793936.doc R.2.1 12/8/2021 ·29


AUTODESK , INC.

Partea a II-a
1. 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))

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)
Tabelul 10. Traducerea expresiilor AutoLISP

·30
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

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.5
Command: !x
4.5

50793936.doc R.2.1 12/8/2021 ·31


AUTODESK , INC.

~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.

·32
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 I
1. 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
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))

50793936.doc R.2.1 12/8/2021 ·33


AUTODESK , INC.

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)
1
Command: !x
1

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

Command: (setq x (quote (4 (+ 5 6)))


(4 (+ 5 6))
Command:!x
(4 (+ 5 6))

Valoare pentru
x

4.5

"text"

(1.0 2.0 3.0)

(+ 1 2 3)

(1 (+ 2 3))

Tabelul 12. Legarea lui x unor valori diferite

·34
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·35


AUTODESK , INC.

S-expresii AutoLISP `n cadrul comenzilor AutoCAD


S-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))
10
Command: !x
10
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.

·36
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
~ncepe]i un desen nou.

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

Command: (/ 6.0 0.35)


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

Command: line
From point: 1,1
To point: 5,5
To point: Enter

Command: array
Select objects: I
Select objects: Enter
Rectangular or Polar array (R/P): r
Number of rows (-) <1>: 1
Number of columns (III) <1>: (fix (/ 6.0 0.35))
Distance between columns: 0.35
AutoCAD creaz\ 17 elemente `n array.

Trebuie avut `n vedere faptul c\ o expresie AutoLISP a fost folosit\


interactiv, `n mijlocul unei comenzi AutoCAD, pentru a calcula o valoare
(`n acest caz un num\r `ntreg) care ulterior este dat\ automat comenzii `n
acel punct special la secven]a de cerere a comenzii.

50793936.doc R.2.1 12/8/2021 ·37


AUTODESK , INC.

~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: line
From point: 1,1
To point: 5,5
To point: Enter

Command: line
From point: 10,1
To point: 6,5
To point: Enter

Command: fillet
Polyline/Radius/<Select two lines>: r
Enter fillet radius <1.0>: (/ 28.0 12.5)

Command: fillet
Polyline/Radius/<Select two lines>: pick first line
Select second object: pick second line

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

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

·38
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 4: EXPRESII AUTOLISP IN CADRUL COMENZILOR AUTOCAD

~n acest 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]iuni
1. ~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: arc
Center/<Start point>: 5,5
Center/End/<Second point>: c
Center: 3,5
Angle/Length of chord/<End point>: a
Included angle: (/ 180 pi)
Command: (setq x (* pi (/ 2.0 3.0)))
2.0944

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

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

50793936.doc R.2.1 12/8/2021 ·39


AUTODESK , INC.

Command: (setq x (/ 360 15))


24

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

Figura 11. Array completat

·40
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·41


AUTODESK , INC.

Tipuri de date numerice


AutoLISP-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.

·42
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

rtoscere 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: !x
4.5
Command: (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.

50793936.doc R.2.1 12/8/2021 ·43


AUTODESK , INC.

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: !x
65535
Command: (float x)
65535.0
Command: (fix (float x))
65535
Command: (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))
REAL
Command: (type (fix (float x)))
INT
Command: (rtos (float x) 2 10)
"65535.0000000000"

Conversia automat\ a numerelor `ntregi


AutoLISP-ul va converti numerele `ntregi `n numere reale ori de 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.

·44
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Command: (+ 1 2)
3
Command: (type (+ 1 2))
INT
Aceast\ expresie returneaz\ un num\r real.
Command: (+ 1.0 2)
3.0
Command: (type (+ 1.0 2)
REAL

Recapitulare

· AutoLISP-ul are dou\ tipuri de date numerice: numere `ntregi


[i numere reale.
· Numerele `ntregi au valori de 32 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.

50793936.doc R.2.1 12/8/2021 ·45


AUTODESK , INC.

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 I
1.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.

·46
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Partea aII-a
1.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.

50793936.doc R.2.1 12/8/2021 ·47


AUTODESK , INC.

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.

X axis Y axis Z axis

Distance from origin

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.

X = 1.0 Y = 2.0 Z = 3.0

3-dimensional point 1,2,3

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

·48
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

(1.0 2.0 3.0)


3-dimensional point 1,2,3 as an AutoLISP object
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.

50793936.doc R.2.1 12/8/2021 ·49


AUTODESK , INC.

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: line
From point: !pt1
To point: !pt2
To point: Enter

pt2 (5.0 5.0 0.0)

pt1 (1.0 1.0 0.0)

Figura 15. Linie de la pt1 la pt2

Construirea punctelor cu 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.

evalueaz\ fiecare argument, unul dup\ altul [i le memoreaz\ valoarea


list
temporar. C`nd func]ia list `[i epuizeaz\ argumentele `[i compune valorile
argumentelor din elemente `n cadrul unei liste [i returneaz\ lista.

·50
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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: id
Point: !pt
X=1.0000 Y=2.0000 Z=3.0000
Command:

(1.0 2.0 3.0)


return value

(list 1.0 2.0 3.0)

evaluate all arguments


and return a list of values
evaluates to 1.0
evaluates to 2.0
evaluates to 3.0

Figura 16. Valoare returnata de functia list

50793936.doc R.2.1 12/8/2021 ·51


AUTODESK , INC.

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.

Bind x to 1.0

(setq x 1.0) Value of x is 1.0, or x = 1.0

Bind y to 2.0
(setq y 2.0) Value of y is 2.0, or y = 2.0

Bind z to 3.0
(setq z 3.0) Value of z is 3.0, or 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)

(1.0 2.0 3.0)


return value

(list x y z )

evaluate all arguments


and return a list of values
evaluates to 1.0
evaluates to 2.0
evaluates to 3.0
Figura 18. Valoare returnata de functia list

·52
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu

Introduce]i expresiile care urmeaz\.

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


Command: (setq x 1.0)
1.0
Command !x:
1.0
Command: (setq y 2.0)
2.0
Command: !y
2.0
Command: (setq z 3.0)
3.0
Command: !z
3.0
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: id
Point: !pt
X=1.0000 Y=2.0000 Z=3.0000
Command:

50793936.doc R.2.1 12/8/2021 ·53


AUTODESK , INC.

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.

·54
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 I
1. 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.

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
Tabelul 15. Crearea punctelor din liste de numere

50793936.doc R.2.1 12/8/2021 ·55


AUTODESK , INC.

Partea a II-a
1. ~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: line
From point: !pt1
To point: !pt2
To point: Enter

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

5,6,0

1,2,0

Figura 19. Linie si cerc folosind variabilele pt1 si pt2

·56
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·57


AUTODESK , INC.

Separarea listelor
Av`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\.

·58
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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)

50793936.doc R.2.1 12/8/2021 ·59


AUTODESK , INC.

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.

·60
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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
pt
(1.0 2.0 3.0)

(car of list) (cdr of list)


(car pt) (cdr pt)
1.0 (2.0 3.0)

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


(car (cdr pt)) (cdr (cdr pt))
2.0 (3.0)

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


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

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

50793936.doc R.2.1 12/8/2021 ·61


AUTODESK , INC.

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

·62
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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]iuni
1. 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

50793936.doc R.2.1 12/8/2021 ·63


AUTODESK , INC.

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]iuni
1. 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\.

xlst
(1.0 (2.0 3.0) 4.0)

1.0 ((2.0 3.0) 4.0)


(car xlst) (cdr xlst)

(2.0 3.0) ?
(car (cdr xlst)) (cdr (cdr xlst))

? ? ? ?
(car (car (cdr xlst))) ? ? ?

? ?
? ?

Figura 27. Completarea graficul binar

·64
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.0
Command: !x
1.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.

50793936.doc R.2.1 12/8/2021 ·65


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 calculated point

calculated point known point

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

·66
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·67


AUTODESK , INC.

Figura care urmeaz\ reprezint\ coordonatele punctelor `n func]ie de


variabilele X [i Y.

X1,Y1 X2,Y1

X1,Y2 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.

·68
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 pt2) (car (cdr pt1)))

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

0,0

Figura 30. Calcularea colturilor unui dreptunghi

50793936.doc R.2.1 12/8/2021 ·69


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)

·70
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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


(10.0 5.0)

Command: !pt4
(10.0 5.0)
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: line
From point: !pt1
To point: !pt2
To point: !pt3
To point: !pt4
To point: close

pt1 pt4
1,5 10,5

pt2 pt3
1,1 10,1
0,0

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

50793936.doc R.2.1 12/8/2021 ·71


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, pt1y


pt2 = pt2x, pt2y
midpt = mptx, mpty

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

mptx = (pt1x + pt2x)/2


mpty = (pt1y + pt2y)/2

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.

·72
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Comenzi AutoCAD si AutoLISP


Comenzile AutoCAD pot fi chemate direct din AutoLISP, s-expresiile
AutoLISP pot fi folosite ca 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))
(5.0 5.0)

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


nil

50793936.doc R.2.1 12/8/2021 ·73


AUTODESK , INC.

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
5,5

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

·74
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: circle
3P/2P/TTR/<center point>: !pt1
Diameter/<Radius>: 0.5
Command: (command "circle" pt2 0.5)
Command: (command "circle" "2p" pt1 pt2)

Figura 33. Cercuri definite de pt1 si pt2

50793936.doc R.2.1 12/8/2021 ·75


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: arc
Center/<Start point>: !pt1
Center/End/<Second point>: e
End point: !pt2
Angle/Direction/Radius/<Center point>: r
Radius: 3.5

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

Figura 34. Arce definite de pt1 si pt2

·76
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Globalizarea comenzilor

Toate versiunile AutoCAD-ului vor accepta comenzile [i 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.

50793936.doc R.2.1 12/8/2021 ·77


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]iuni
1. ~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 Expresii AutoLISP

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


From point: 1,1 or
To point: 5,5
To point: ENTER (command "line" '(1.0 1.0) '(5.0 5.0) "")

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

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

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

·78
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

EXERCITIUL 11: APELUL COMENZII POLYLINE DIN AUTOLISP

~n acest 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]iuni
1. ~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.

50793936.doc R.2.1 12/8/2021 ·79


AUTODESK , INC.

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

·80
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Selec]ia interactiv\ a punctelor


AutoLISP-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 program AutoLISP, puncte care vor fi folosite
apoi ca puncte finale ale unei linii.

50793936.doc R.2.1 12/8/2021 ·81


AUTODESK , INC.

Command: (setq pt1 (getpoint))


1,1
(1.0 1.0 0.0)

Command: (setq pt2 (getpoint))


5,5
(5.0 5.0 0.0)
Command: (command ”line” pt1 pt2 “”)

Deoarece toate serviciile AutoCAD de specificare a punctelor 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

·82
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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,2
1.41421
Command: !dst1
1. 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,2
1.41421
Command: !dst1
1.41421

50793936.doc R.2.1 12/8/2021 ·83


AUTODESK , INC.

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)

·84
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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,2
1.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,2
1.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]\.

50793936.doc R.2.1 12/8/2021 ·85


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.

·86
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.

50793936.doc R.2.1 12/8/2021 ·87


AUTODESK , INC.

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

·88
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Func]ii
Pe 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.

setqeste 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.

50793936.doc R.2.1 12/8/2021 ·89


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.

·90
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 point
Second point: pick a point

50793936.doc R.2.1 12/8/2021 ·91


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.

function name

(defun myfun () list of required arguments and local variables

(+ 1 2) 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))
MYFUN
Command: (myfun)
7

function name

(defun myfun () list of required arguments and local variables

(+ 1 2) body of definition

return value of function (+ 3 4)

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

·92
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))


MYFUN
10
Command: (myfun 1)
20
Command: (myfun 2)
Command:

(myfun 1) user calls myfun with argument of 1

(defun myfun (x) 1 is mapped into argument x


(* x 10)
)

(defun myfun (1)

(* x 10) value of x becomes 1 in body of expressions


)

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

50793936.doc R.2.1 12/8/2021 ·93


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-ONE
Command: (add-one 1)
2
Command: (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)))


DTR
Command: (dtr 180)
3.14159
Command: (dtr 360)
6.28319
Command: (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-TWO
Command: (add-two 1 2)
3
Command: (add-two 4 5)
9

·94
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.
·
·

50793936.doc R.2.1 12/8/2021 ·95


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]iuni
1. 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

·96
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Partea a III-a
Instruc]iuni
1. 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.

50793936.doc R.2.1 12/8/2021 ·97


AUTODESK , INC.

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

·98
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: zoom
All/Center/Dynamic/Extens/Left/Previous/Vmax/Window/<Scale(X/XP>:
Center point:
Magnification or Heigh<current>:
Avem nevoie de dou\ valori pentru aceast\ 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.

50793936.doc R.2.1 12/8/2021 ·99


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))
ZPLUS
Command: (zplus)
All/Center/Dynamic/Extens/Left/Previous/Vmax/Windows/<Scale(X/XP)>:
Center point: pick a point 4.
Magnification or Heigh<9.0000>:4.5.000000000
Command: nil
Command:

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.

·100
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 point
Magnification or Height <2.250000>: 1125000000000
Command: nil

Command:zplus

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

Recapitulare
·
· Simbolul pause permite utilizatorului s\ 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
·

50793936.doc R.2.1 12/8/2021 ·101


AUTODESK , INC.

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-a
1. 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.

·102
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·103


AUTODESK , INC.

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

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

·104
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

· 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.

50793936.doc R.2.1 12/8/2021 ·105


AUTODESK , INC.

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: rectangle
First corner:

·106
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·107


AUTODESK , INC.

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

Anularea 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).

·108
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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)
1
Command: !x
1
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_ARG
Command: (local_arg 2)
2
4
Command: !x
1
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_VAR
Command: (local_var)

50793936.doc R.2.1 12/8/2021 ·109


AUTODESK , INC.

3
Command: !x
1
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_VAR
Command: (global_var)
4
Command: !x
4

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.

·110
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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: undefine
Command 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.

50793936.doc R.2.1 12/8/2021 ·111


AUTODESK , INC.

Command: line
.- line From point: pick a point
To point pick a point
To point:
Command: nil
Redefini]i comanda AutoCAD.
Command: redefine
Command name: line

·112
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·113


AUTODESK , INC.

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 lucru
1. 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\.

·114
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·115


AUTODESK , INC.

Teste logice [i de egalitate


Programele 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."?

t or true nil or false

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

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
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

·116
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·117


AUTODESK , INC.

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]iuni
1. ~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

·118
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·119


AUTODESK , INC.

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

·120
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·121


AUTODESK , INC.

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

·122
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 not
Func]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 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.

50793936.doc R.2.1 12/8/2021 ·123


AUTODESK , INC.

Exemplu
Command: (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

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 .

·124
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.

50793936.doc R.2.1 12/8/2021 ·125


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 if
Func]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\.

·126
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: !y
1
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: !y
0

50793936.doc R.2.1 12/8/2021 ·127


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 lucru
1. ~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 .

·128
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.

Exemplu
Command: (setq x 1)
1

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


3

Command: !y
2

Command: !z
3

50793936.doc R.2.1 12/8/2021 ·129


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 lucru
1. ~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.

·130
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.

Func]ia progn este folosit\ pentru a executa s-expresii multiple `n cadrul


func]iei if.

50793936.doc R.2.1 12/8/2021 ·131


AUTODESK , INC.

Func]ia cond poate testa mai multe expresii [i poate executa orice num\r de
s-expresii `ntr-o ramifica]ie dat\.

·132
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 lucru
1. 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.

50793936.doc R.2.1 12/8/2021 ·133


AUTODESK , INC.

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

·134
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Bucle de program
Buclele 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\.

50793936.doc R.2.1 12/8/2021 ·135


AUTODESK , INC.

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.

Exemplu
Command: (repeat 3 (prompt "\nHello"))
Hello
Hello
Hellonil
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)
0
1
2
3
4
5
6
7
8
9

·136
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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: ")

50793936.doc R.2.1 12/8/2021 ·137


AUTODESK , INC.

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 lucru
1. ~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

·138
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

;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.

50793936.doc R.2.1 12/8/2021 ·139


AUTODESK , INC.

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

(setq x 10) initialize x

(while x is less than 10?


(< x 10)

NO YES

(print x) print the value of x

(setq x (+ 1 x)) add 1 to x

) go back to test

Figuae 3. Diagrama buclei functiei while

·140
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·141


AUTODESK , INC.

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.

·142
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

{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.

50793936.doc R.2.1 12/8/2021 ·143


AUTODESK , INC.

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"

·144
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·145


AUTODESK , INC.

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: text
Justify/Style/<Start point>: 1,5
Height: 0.5
Rotation: 0
Text: !txt1

Command: (setvar "texteval" 1)


1

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

Figura 41. entitati tip text

·146
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·147


AUTODESK , INC.

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.

·148
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 lucru
1. 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

Tabelul 25. Variabile si functii de tiparire

50793936.doc R.2.1 12/8/2021 ·149


AUTODESK , INC.

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

·150
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 Descriere


entitati

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

50793936.doc R.2.1 12/8/2021 ·151


AUTODESK , INC.

Cum se afl\ numele ultimei entit\]i


Introduce]i comenzile [i expresiile care urmeaz\.

~ntr-un desen nou crea]i o entitate Line.

Command: line
From point: 1,1
To point: 5,5
To 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

·152
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Command: U
GROUP

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: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<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.

50793936.doc R.2.1 12/8/2021 ·153


AUTODESK , INC.

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: U
ERASE
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

·154
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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: U
MOVE

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>

50793936.doc R.2.1 12/8/2021 ·155


AUTODESK , INC.

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.

·156
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 lucru
1. 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

50793936.doc R.2.1 12/8/2021 ·157


AUTODESK , INC.

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: scaleall
Scaling entity 1.
Scaling entity 2.
Scaling entity 3.

5. ~nc\rca]i fi[ierul scaleall.lsp.

6. Activa]i comanda SCALEALL.

·158
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Liste asociate entit\]ilor


Pute]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 punct
O 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.

50793936.doc R.2.1 12/8/2021 ·159


AUTODESK , INC.

(0 "LINE") (0 . "LINE")

car cdr car cdr

0 ("LINE") 0 "LINE"

car cdr

"LINE" ()
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

·160
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·161


AUTODESK , INC.

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

·162
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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"

50793936.doc R.2.1 12/8/2021 ·163


AUTODESK , INC.

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)

·164
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·165


AUTODESK , INC.

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 lucru
1. 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\.

·166
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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
)

50793936.doc R.2.1 12/8/2021 ·167


AUTODESK , INC.

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

·168
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Modificarea unei entit\]i


Modificarea 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)

50793936.doc R.2.1 12/8/2021 ·169


AUTODESK , INC.

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: line
From point: 1,1
To point: 5,5
To 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)

·170
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

5,5,0 5,5,0

1,1,0 7.5,2.5,0

Figura 45. Linie inainte si dupa apelarea functiei entmod.

Recapitulare
· O sublist\ dintr-o list\ asociat\ poate fi `nlocuit\ cu func]ia subst.
· Func]ia entmod va actualiza `nregistrarea unei entit\]i `n baza de
date pe baza modific\rilor din lista asociat\.

50793936.doc R.2.1 12/8/2021 ·171


AUTODESK , INC.

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.

·172
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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"
)
)
)

50793936.doc R.2.1 12/8/2021 ·173


AUTODESK , INC.

)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)

·174
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 lucru
1. 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.

50793936.doc R.2.1 12/8/2021 ·175


AUTODESK , INC.

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: line
From point: 1,1
To point: 5,5
To point: Enter

Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<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))

·176
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·177


AUTODESK , INC.

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 lucru
1. ~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)
)
)
)
)

·178
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·179


AUTODESK , INC.

Tratarea erorilor
AutoLISP 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*.
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.

·180
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·181


AUTODESK , INC.

Exemplu

Acest cod implementeaz\ comanda c:rectangle [i propria-i rutin\ de tratare a


erorilor.

(defun c:rectangle (/ pt1 pt2)

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


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

(setq old_cmdecho (getvar "CMDECHO"))


(setvar "CMDECHO" 0)
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command "pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(setvar "CMDECHO" old_cmdecho)

(setq *error* old_error) ;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.

·182
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Rutina noastr\ de tratare a erorilor cu comand\ specific\ reface pozi]ionarea


original\ a variabilei de sistem CMDECHO `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*.

50793936.doc R.2.1 12/8/2021 ·183


AUTODESK , INC.

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 lucru
1. 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.

·184
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·185


AUTODESK , INC.

Exemplu
Extindem codul UNDO pentru a include rutina de tratare a erorilor. Dac\
rutina este anulat\ dintr-un motiv oarecare [i UNDO este disponibil,
rezultatul comenzii 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

·186
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

(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

50793936.doc R.2.1 12/8/2021 ·187


AUTODESK , INC.

)
)

(setvar "CMDECHO" old_cmdecho) ;reset original command echo

(setq *error* old_error) ;restore default error handler


;if command is successful
(prin1) ;quiet exit
)

·188
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Opera]ii cu fi[iere
AutoLISP 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.

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.

50793936.doc R.2.1 12/8/2021 ·189


AUTODESK , INC.

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

·190
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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))
nil
Command: !fp
nil
Deschide]i fi[ierul test.txt `n editorul text [i examina]i-l. Ar trebui s\ con]in\
trei linii de text.
Coders
of the
Lost Spark

50793936.doc R.2.1 12/8/2021 ·191


AUTODESK , INC.

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.

·192
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

nil
Command: !fp
nil

50793936.doc R.2.1 12/8/2021 ·193


AUTODESK , INC.

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.

·194
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·195


AUTODESK , INC.

(defun c:copyfile (/ r_fp_name w_fp_name r_fp_line)

; r_fp source file descriptor


; w_fp destination file descriptor
; r_fp_name source file name
; w_fp_name destination file name
; r_fp_line source file text line

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


(if ;close source file if open
r_fp
(setq r_fp (close r_fp))
)
(if ;close destination file if open
w_fp
(setq w_fp (close w_fp))
)
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)

;get source file from user with dialogue

(setq r_fp_name (getfiled "Select Source File" "" "txt" 0))

;if source file returned, get destination file from user

(if
r_fp_name
(setq w_fp_name (getfiled "Destination File" "" "txt" 1))
)

;check that we got good values for both file names


;exit if not

(if
(or
(not r_fp_name)
(not w_fp_name)
)
(progn
(prompt "\nMust specify both source and destination file.")
(exit)
)

·196
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

continuare pe pagina urmatoare

50793936.doc R.2.1 12/8/2021 ·197


AUTODESK , INC.

;check that file names are different


;exit if not

(if
(= r_fp_name w_fp_name)
(progn
(prompt "\nSource same name as destination file.")
(exit)
)
)

;open source file for read


;exit if it fails

(if
(not (setq r_fp (open r_fp_name "r")))
(progn
(prompt "\nCould not open source file.")
(exit)
)
)

;open destination file for read


;close source file and exit if it fails

(if
(not (setq w_fp (open w_fp_name "w")))
(progn
(setq r_fp (close r_fp))
(prompt "\nCould not open destination file.")
(exit)
)
)

;get first line from source file

(setq r_fp_line (read-line r_fp))

;write source line to destination file and get next...


;source line until end of file is reached

(while
r_fp_line
(write-line r_fp_line w_fp)
(setq r_fp_line (read-line r_fp))
)

;close the source and destination files

(setq r_fp (close r_fp))


(setq w_fp (close w_fp))

;restore original error handler

·198
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

(setq *error* old_error)

(prin1) ;quiet exit


)

50793936.doc R.2.1 12/8/2021 ·199


AUTODESK , INC.

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

·200
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

; 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)
)

50793936.doc R.2.1 12/8/2021 ·201


AUTODESK , INC.

continuare pe pagina urmatoare

·202
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·203


AUTODESK , INC.

Seturi de selec]ie
AutoCAD-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.

·204
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·205


AUTODESK , INC.

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 objects
Select 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: erase
Select objects: !ss1
Select objects: Enter
Reface]i obiectele [terse.
Command: oops

·206
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·207


AUTODESK , INC.

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

·208
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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 objects
Select 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

50793936.doc R.2.1 12/8/2021 ·209


AUTODESK , INC.

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 objects
Select 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

·210
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·211


AUTODESK , INC.

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 lucru
1. 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.

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

·212
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.

50793936.doc R.2.1 12/8/2021 ·213


AUTODESK , INC.

Tabele [i nume de simboluri


Tabelele 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 `l urmeaz\ pe cel returnat prin apelarea anterioar\ a func]iei
tblnext.

·214
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·215


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"))
)

·216
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.

50793936.doc R.2.1 12/8/2021 ·217


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.

·218
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.

50793936.doc R.2.1 12/8/2021 ·219


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.

·220
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.

50793936.doc R.2.1 12/8/2021 ·221


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.

·222
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Fi[iere script [i AutoLISP


Dac\ 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_NEW
Command: my_new
Command: ._new File name:
Command: !c:my_new
nil
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 .

50793936.doc R.2.1 12/8/2021 ·223


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:runfolose[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_REPORT
Command: 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

·224
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.

50793936.doc R.2.1 12/8/2021 ·225


AUTODESK , INC.

;Create a list of dotted pairs. Each dotted pair consists


;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))
(setq spacer (strcat " " spacer))
)

·226
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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

50793936.doc R.2.1 12/8/2021 ·227


AUTODESK , INC.

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

·228
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la Polilinii
Poliliniile 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 SEQEND

Main entity Sub entity

Next entity name: Next entity name:

VERTEX Next main entity


in database

VERTEX

Sub entity

Next entity name:

VERTEX
or
SEQEND

Figura 47.Relatia dintre polyline ca entitate principala si subentitati

~n afara 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.

50793936.doc R.2.1 12/8/2021 ·229


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.")
)

·230
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

(if
(= 2 (logand 2 vflags))
(princ "\nCurve-fit tangent defined for this vertex.")
)
(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
)

50793936.doc R.2.1 12/8/2021 ·231


AUTODESK , INC.

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

·232
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Accesul la Block Definitions


Block 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 ENDBLK

Named object Sub entity

Next entity name: Next entity name:


Any type None

Next sub entity

Any type

Next entity name:


Any type

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.

50793936.doc R.2.1 12/8/2021 ·233


AUTODESK , INC.

(defun c:blklist (/ blist bname elist ename epick etype)

;blist Association list from Block table


;bname Name of Block Definition
;elist Entity association list
;ename Entity name
;epick List returned by entsel
;etype Entity type as string
;old_error Default error handler

(setq old_error *error*) ;save default error handler

(defun *error* (msg) ;define new error handler


(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(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

·234
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

ename ;Block Definition...


(/= "ENDBLK" etype)
)

(print elist) ;print entity's assoc list

;stop screen from scrolling


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

50793936.doc R.2.1 12/8/2021 ·235


AUTODESK , INC.

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

·236
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Crearea entit\]ilor Line cu func]ia entmake


Func]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)
)
)

50793936.doc R.2.1 12/8/2021 ·237


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.

·238
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:

50793936.doc R.2.1 12/8/2021 ·239


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")
)
)

·240
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.

50793936.doc R.2.1 12/8/2021 ·241


AUTODESK , INC.

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

·242
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Tratarea [irurilor
AutoLISP 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

50793936.doc R.2.1 12/8/2021 ·243


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"

Command: (setq z (strcat x x z y y))


"one one one two two two"

·244
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Exemplu
Introduce]i expresiile care urmeaz\. Formula]i o cerere dintr-un [ir [i un
num\r `ntreg.
Command: (setq index 1)
1
Command: (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".

50793936.doc R.2.1 12/8/2021 ·245


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.

·246
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.

50793936.doc R.2.1 12/8/2021 ·247


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.

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.

·248
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

; 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

50793936.doc R.2.1 12/8/2021 ·249


AUTODESK , INC.

(if ;if string length is zero


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

(setq index (1+ index)) ;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

·250
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

50793936.doc R.2.1 12/8/2021 ·251


AUTODESK , INC.

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

continuare pe pagina urmatoare

·252
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)
)

50793936.doc R.2.1 12/8/2021 ·253


AUTODESK , INC.

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

·254
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

Pointere de entit\]i
Un 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.

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.

50793936.doc R.2.1 12/8/2021 ·255


AUTODESK , INC.

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: handles
Handles are disabled.
ON/DESTROY: on
Desena]i c`teva entit\]i Line.
Command: line
etc...
Extrage]i un pointer cu una din entit\]ile Line.

Command: (setq elist (entget (car (entsel))))


Select object: pick a line

Command: (setq ehand (cdr (assoc 5 elist)))

Command: !ehand
"1B" (sau un [ir similar)

·256
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.

50793936.doc R.2.1 12/8/2021 ·257


AUTODESK , INC.

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.

·258
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP

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.
FINGER
RLIST
SELUSER
SELECO

Aduce]i fi[ierul `n editorul de text [i studia]i-l. Codul este scurt, u[or de


`n]eles [i bine comentat.

50793936.doc R.2.1 12/8/2021 ·259

You might also like