Documente Academic
Documente Profesional
Documente Cultură
Iasi 1
AutoLISP
Introducere
AutoLISP-ul este un limbaj de programare pentru AutoCAD.
Acest curs ofer\ cursantului posibilitatea de a-[i `nsu[i
cuno[tine practice de lucru `n AutoLISP prin cursuri [i te!te
care e!plic\ structura [i sinta!a limbajului [i relaia acestuia
cu AutoCAD-ul. Prin e!erciii aplicati"e la teoria de
programare [i e!emple concrete cursantul `[i completea#\
aceste cuno[tine.
Acest curs repre#int\ o culegere de te!te [i un g$id pentru
un curs AutoLISP pe o perioada de % #ile& oferit de
Autodes'& Inc. (raining Department. La e!erciiile de
proiectare se adaug\ lecii suplimentare [i discuii la obiect.
Acest curs poate fi folosit indi"idual atunci c`nd este `n
combinaie cu o disc$et\ ce conine fi[ierele necesare
pentru re#ol"area e!erciiilor.
Acest curs este ba#at pe o "ersiune AutoLISP ce poate fi
g\sit\ pe toate platformele pe care este implementat
AutoCAD )*+.
Obiective
La sf`r[itul acestui curs& cursantul "a fi capabil s\ `neleag\
sinta!a AutoLISP& o "arietate de funcii standard [i procesul
de e"aluare Lisp. Cursantul "a putea folosi
AutoLISP-ul pentru,
-tili#area comen#ilor AutoCAD prin intermediul
funciilor de ba#\ AutoLISP.
Crearea de noi funcii AutoLISP.
Crearea de noi funcii AutoCAD pe ba#a limbajului
AutoLISP.
Corectarea [i modificarea entit\ilor din ba#a de
date a AutoCAD-ului.
Citirea [i scrierea `n fi[iere cu te!te ASCII cu
ajutorul limbajului AutoLISP.
Combinarea programelor de tip AutoLISP cu
fi[ierele AutoCAD de tip script.
141246430.doc R.2.1 4/22/2013 ATC. Iasi 1
AUTODESK, INC.
Cuprins
Acest material cuprinde subiectele pre#entate mai jos.
.!plicarea acestor subiecte repre#int\ coninutul principal al
capitolelor de mai jos.
Introducere...........................................................................*
/eneralit\i............................................................................%
.!presii simbolice.................................................................0
Atomi [i liste........................................................................*%
."alu\ri ...............................................................................+*
.!presii simbol AutoLISP far\ comen#i AutoCAD.................%1
(ipuri de date numerice......................................................2*
Puncte AutoCAD [i liste AutoLISP........................................20
Prelucrare de liste...............................................................10
Comen#i AutoCAD [i liste AutoLISP.....................................0*
Selecie interacti"\ de puncte.............................................03
4uncii.................................................................................50
4uncii care acionea#\ ca [i comen#i AutoCAD...................30
4i[iere de programare AutoLISP........................................*6*
4uncia C...........................................................................*61
(este logice [i condiionale...............................................**%
7ucle de program.............................................................*+%
8peraii cu [iruri................................................................*%*
Acces la entit\i.................................................................*%3
Liste asociate entit\ilor....................................................*20
9odificarea unei entit\i....................................................*11
Selectarea grafic\ a unei entit\i.......................................*:1
(ratarea erorilor...............................................................*0*
8peraii cu fi[iere..............................................................*01
................................................................................................
Seturi de selecie..............................................................*3%
(abele [i nume de obiecte................................................+6%
4i[iere script [i AutoLISP....................................................+**
2
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Accesul la entit\i simple [i la polilinii...............................+*0
Accesul la entit\i simple [i la blocuri................................++*
Crearea entit\ilor cu funcia entma'e..............................++1
Crearea poliliniilor [i a definitiilor de bloc cu funcia
entma'e ...........................................................................++0
(ratarea [irurilor...............................................................+%*
(ratarea entit\ilor............................................................+2%
141246430.doc R.2.1 4/22/2013 3
AUTODESK, INC.
Generalit\]i despre AutoLISP
Ce este AutoLISP-ul ?
AutoLISP-ul este un dialect al limbajului de programare Lisp
utili#at pentru completarea posibilit\ilor de proiectare `n
AutoCAD.
Lisp este un acronim pentru list processing ;in alte te!te&
list programming. .ste un limbaj de programare superior
foarte cunoscut pentru aplicaiile lui `n domeniul sistemelor
speciali#ate& inteligen\ artificial\& programare pe ba#\ de
reguli [i AutoCAD.
Lisp este unul dintre limbajele de programare cele mai
"ec$i. Ca [i 48)()A<& primele implement\ri ale limbajului
Lisp datea#\ din anii :6. 9ulte sublimbaje ale limbajului Lisp
e!ist\ `n pre#ent& inclu#`nd Common Lisp& 4ran# Lisp& 9u
Lisp [i = Lisp.
Limbajul Lisp are multe caracteristici care se adresea#\ at`t
profesioni[tilor c`t [i amatorilor.
AutoLISP are o sinta!\ simpl\& precis\. Procesul de
e"aluare [i sinta!a folosit\ pentru crearea
e!presiilor Lisp sunt u[or de `n"\at.
.ste un interpretor a[a `nc`t re#ultatele obinute
din calcule pot fi "i#uali#ate interacti" `ntr-o
sesiune AutoCAD.
AutoLISP interacionea#\ direct cu AutoCAD f\r\ s\
necesite programe de sprijin e!tern& cum ar fi
compilatorul.
Programele AutoLISP s`nt u[or de `neles [i
modificat.
AutoLISP-ul este capabil de iteraie [i recursi"itate.
4unciile pot utili#a instruciuni condiionale [i
de start standard [i pot fi definite `n a[a fel
`nc`t o funcie apelea#a la recursiune .
AutoLISP-ul `ncurajea#\ programatorul s\ scrie
funcii simple&structurate [i s\ combine aceste
funcii cu scopul de a crea programe comple!e
dar u[or de `neles.
Pentru cei ce s`nt interesai s\ lucre#e cu programe
AutoLISP le recomand\m urm\toarele c\ri,
4
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Common LISP: A Gentle Introduction to Symbolic
Computing de Da"id S. (ouret#'>? LISP de @inston A Born
Looking at LISP de (on> Basemer Common LispCraft de
)obert @ilens'> AutoLISP Programmer's Reference
Manual
Ce poate face AutoLISP-ul ?
AutoLISP-ul este o scul\ puternic\. Poate fi folosit pentru a
adapta AutoCAD-ul la orice fel de aplicaii& f\c`nd astfel
AutoCAD-ul mai sensibil la modul de lucru. 9ulte dintre cele
mai complicate aplicaii 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 comen#i AutoCAD [i
funcii AutoLISP [i pot automati#a operaii comple!e `n
cadrul AutoCAD-ului.
Subrutinele AutoLISP pot crea noi funcii AutoLISP [i noi
comen#i 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 operea#\ `n cadrul editorului grafic AutoCAD.
Interpretorul st\ `n Cumbr\C `n timpul unei sesiuni de
interpretare grafic\ a[tept`nd s\ e"alue#e o e!presie
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.
(rebuie de asemenea s\ a"ei cuno[tine despre,
4i[iere script.
9enu-uri utili#ator.
Dn unele ca#uri este mai simplu [i mai u[or s\ optimi#ai o
sec"ent\ de desenare cu un fi[ier script sau cu un menu de
ba#\ dec`t s\ folosii un program AutoLISP.
141246430.doc R.2.1 4/22/2013 5
AUTODESK, INC.
Ce editor de tet ar trebui folosit ?
.ste ne"oie de un editor de te!t ASCII pentru a crea fi[iere
program AutoLISP pe ba#a acestui manual.
4i[ierele de te!t ASCII pot fi `nt`lnite sub denumirea de
fi[iere CprogrammerC& Cnon-documentC sau CunformattedC.
Eersiunea 9S-D8SF 1.6 a ap\rut cu un editor de te!t
simplu numit .DI(. Dac\ folosii "ersiunea D8S %5: a
AutoCAD-ului din acest manual este posibil s\ dorii s\
folosii acest editor.
Aplicaia <8(.PAD din 9icrosoftF @indoGs
(9
este un editor
de te!t ASCII a[a cum este aplicaia (e!t .ditor din Sun
9>cros>stemsF SPA)C
(9
din 8pen @indoGs
(9
.
.!ist\ o "arietate de editoare de te!t gratuite [i care circul\
liber pentru AutoCAD [i AutoLISP `n cadrul 4orumului
CompuSer"e AutoCAD ;/8 ACADH. 8rice editor profesional
de programare este o unealt\ bun\ cu care se pot scrie
fi[iere program AutoLISP.
!ard"are pentru AutoLISP [i necesarul de memorie
Computerul dumnea"oastr\ trebuie s\ aib\ $ardGare-ul [i
memoria cerut\ de AutoCAD pentru a putea folosi AutoLISP-
ul. 9anualele AutoCA! Interface [i Installation And
Performance Guide pre#int\ cerinele specifice fiec\rei
platforme.
Lansarea `n eecu#ie
Lansai editorul grafic AutoCAD `nainte de a lansa orice alt\
comanda. Ea trebui s\ introducei s-e!presiile AutoLISP din
linia de comand\.
E\ suger\m s\ lansai sesiunea de editare grafic\ ori de c`te
ori utili#ai acest manual.
6
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Expresii simbolice
.!presiile simbolice s`nt instruciuni de ba#\ ale
limbajului AutoLISP.
Obiective
Dn acest capitol "ei `n"\a,
Cum s\ creai o e!presie simbolic\
Cum recunoa[te AutoCAD-ul e!presiile simbolice
Cum s\ folosii e!presiile simbolice `n cadrul
comen#ilor AutoCAD
Cum s\ aflai "aloarea unei e!presii simbolice
Instruc#iuni `n AutoLISP
Dn principal LISP-ul procesea"# listele, el procesea#\ [i
e$aluea"# listele de obiecte. AutoLISP-ul procesea#\ liste
cunoscute ca epresii simbolice& `n cadrul AutoCAD-ului.
Listele s`nt principalul mijloc de construire a e!presiilor
simbolice `n AutoLISP. 8 e!presie simbolic\ din AutoLISP
poate fi comparat\ cu o propo#iie `n limba engle#\.
8 e!presie simbolic\ sau o s-epresie are `ntotdeauna o
anumit\ "aloare. 4uncia principal\ a LISP-ului este s\
determine "aloarea unei s-e!presii. De fiecare dat\ c`nd
lans\m o s-e!presie interpretorului LISP ;de obicei sub
forma unei liste& el "a e"alua acea e!presie [i ne "a da
re#ultatul. Acest re#ultat se nume[te valoarea epresiei.
8 e!presie simbolic\ sau o s-e!presie repre#int\ pur [i
simplu o instruciune `n LISP.
S-e!presiile `n AutoLISP s`nt construite prin `ncadrarea
unei sec"ene "alide de caractere `ntre parante#e.
Caracterul parante#\ st`nga sau ; se nume[te parante#\
desc$is\ [i caracterul parante#\ dreapta sau H se nume[te
parante#\ `nc$is\. Dn mod obi[nuit aceste caractere s`nt
denumite desc$is [i `nc$is%
Parante#ele dintr-o s-e!presie trebuie s\ fie ec$ilibrate.
8ric\rei parante#e desc$ise trebuie sa-i corespund\ una
`nc$is\.
141246430.doc R.2.1 4/22/2013 7
AUTODESK, INC.
Obs% Cea mai frec"ent\ gre[eal\ `n AutoLISP este
ne`nc$iderea parante#elor. .ditoarele de te!t profesionale
au aceast\ caracteristic\ de a g\si parante#ele
corespondente cu un minim de efort.
Cum recunoa[te AutoCA&-ul o s-epresie
AutoCAD-ul recunoa[te o s-e!presie AutoLISP printr-o
parante#\ desc$is\. Dac\ g\se[te o astfel de parante#\&
AutoCAD-ul transfer\ intrarea utili#atorului c\tre
interpretorul AutoLISP [i a[teapt\ re#ultatul. AutoCAD
afi[ea#\ re#ultatul s-e!presiei.
Command: (+ 1 2)
3
Command:
AutoCAD AutoLISP
(+ 1 2)
3
Figura 1. Diagrama de comunicatie dintre AutoCAD si AutoLISP
'emplu
Pe linia de comand\ a AutoCAD-ului `nscriei s-e!presiile `n
coloana din st`nga a tabelului care urmea#\. Comparai
re#ultatele date de AutoCAD cu re#ultatele care se afl\ `n
coloana din dreapta a tabelului.
Command:(+1!
"
Command:
S-e!presii )e#ultate
;I * +H %
;- + *H *
;J 2 +H +
8
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
;K 2 +H 5
Tabelul 1. Rezultatele expresiilor simbolice
S-epresiile [i comen(ile AutoCA&
S-e!presiile pot fi introduse ca intrare la comen#i AutoCAD.
AutoCAD-ul "a recunoa[te parante#ele desc$ise& "a
transfera intrarea interpretorului AutoLISP [i "a a[tepta
re#ultatul.
AutoCAD-ul tip\re[te re#ultatul intr\rii s-e!presiilor pe linia
de comand\. AutoCAD-ul folose[te re#ultatul unei s-e!presii
introduse& drept intrare la comanda curent\.
AutoCAD AutoLISP
(/ 360 15)
24
Command:array
polar
last
5,5
(/ 360 15)
Command:array
polar
last
5,5
20
Figura . Cum AutoCAD!ul si AutoLISP!ul comunica intr!o comanda AutoCAD
141246430.doc R.2.1 4/22/2013 9
AUTODESK, INC.
'emplu
Dn comanda Cpolar arra>C care urmea#\& `mp\rind %:6 de
grade la *1 se determin\ num\rul de obiecte de creat& de
e!emplu se crea#\ un obiect la fiecare *1 grade de rotaie.
Introducei comen#ile.
Command: line
#$om %o&nt: 5,5
To %o&nt: 5,8
To %o&nt: Enter
Command: arra
S'(')t o*+')t,: last
1 -ound
S'(')t o*+')t,: Enter
R')tan.u(a$ o$ Po(a$ a$$a/ (R0P!: !
C'nt'$ %o&nt o- a$$a/: 5,5
Num*'$ o- &t'm,: "/ 360 15#
An.(' to -&(( (+1))2, 31)2! 4"567:Enter
Rotat' o*+')t, a, t8'/ a$' )o%&'d9 4:7Enter
Figura ". #xpresia $%"&' 1() genereaza un arra* de + linii
Caracterul semnul eclam\rii
AutoCAD-ul anali#ea#\ intrarea utili#atorului `n linia de
comand\ caut`nd un alt caracter AutoLISP asociat, semnul
e!clamarii sau L. Acest caracter este denumit `n mod
frec"ent bang. Dac\ semnul e!clamarii este primul
caracter& AutoCAD-ul transfer\ intrarea c\tre interpretorul
AutoLISP [i a[teapt\ re#ultatul.
8rice s-e!presie "alid\ poate urma dup\ semnul e!clam\rii.
Command, L;I *+H
10
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Caracterul CbangC este deseori folosit pentru a cere
AutoLISP-ului "aloarea unui simbol. Dn acest ca#& simbolul
nu trebuie s\ se afle `ntre parante#e.
Command, Lpi
'emplu
pi este un simbol predefinit `n AutoLISP. .!tragei "aloarea
simbolului pi pe linia de comand\ AutoCAD.
Command: $!i
".1;1<=
Command:
)ecapitulare
S-epresiile s`nt e!presii AutoLISP "alide aflate
`ntre parante#e.
AutoCAD-ul caut\ dou\ caractere speciale,
parante#ele desc$ise sau open [i semnul
e!clam\rii sau bang.
8pen indic\ AutoCAD-ului c\ urmea#\ o s-e!presie.
7ang indic\ AutoCAD-ului c\ urmea#\ o s-e!presie
sau un simbol.
S-e!presiile [i caracterul bang pot fi folosite `n linia
de comand\ sau `n cadrul comen#ilor AutoCAD.
Caracterul bang poate precede S-e!presiile sau
simbolurile.
141246430.doc R.2.1 4/22/2013 11
AUTODESK, INC.
Aceast\ pagin\ a fost l\sat\ liber\ `n mod intenionat.
12
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Atomi [i liste
.!ist\ dou\ mari categorii de tipuri de date `n AutoLISP,
atomi [i liste% Atomii s`nt obiecte simple. Listele s`nt
obiecte comple!e. Acest capitol define[te atomii [i listele.
Obiective
Dn acest capitol se "a studia,
Diferena dintre atomi [i liste
Componentele unei liste
Cum s\ recunoa[tem un raport de erori AutoLISP
<atura obiectului AutoLISP nil
Atomi
-n atom este cel mai simplu tip de date din Lisp. -n atom
poate fi un num\r `ntreg
*
un num\r real
2150.33%26*
un [ir de caractere
A String 8f Pearls
o funcie AutoLISP predefinit\
I
un simbol
=MN
sau oricare alt tip de obiecte e!istente `n tabelul %-*.
141246430.doc R.2.1 4/22/2013 13
AUTODESK, INC.
Ti!%ri de ato&i E'e&!le Ti! de data
A%to(I)*
,&m*o( %&,>,m&d?%t S:@
,&$ AB'((o, 2o$(d.A STR
&nt$'. 1,"C5C,3"C5D INT
numa$ $'a( 1.6,;<.5CD,3DC5<;".1 REAL
d',)$&%to$ d' -&E&'$ 4#&(': FaD7 #ILE
num' 'nt&tat' AutoCAD 4Ent&t/ nam': 5666661a7 ENA@E
,'t d' ,'(')t&' AutoCAD 4S'(')t&on ,'t: 17 PICKSET
,u*$ (-un)t&' &nt'$na! 4Su*$: F1'"7 SUBR
,u*$ '>t'$na (#un)t&a ADS! 4E>t. Su*$: 1 F"a=C6;=D7 EGSUBR
Tabelul . #xemple de atomi din AutoLISP si tipul de date al acestora
.!ist\ o regul\ simpl\ pentru a afla dac\ un obiect este un
atom sau o list\. Dac\ obiectul nu se afl\ `ntre parante#e
atunci este un atom? dac\ da& atunci este o list\.
Liste
Listele s`nt s- e!presii comple!e formate din atomi [iJsau
alte liste. Listele necesit\ sinta!e simple dar riguroase.
8 list\ trebuie s\ se afle `ntre parante#e.
Pentru orice list\ care poate fi e"aluat\& primul
termen din cadrul listei respecti"e trebuie s\ fie
o funcie.
8biectele din cadrul listei trebuie separate prin cel
puin un spaiu.
Iat\ c`te"a e!emple de liste. 8bser"ai c\ fiecare obiect
este separat printr-un spaiu de celelalte obiecte din cadrul
listei.
(+ 1 2 )
(- 4 2 )
(x y z )
(1.0 1.0 0.0 )
Despre evaluarea listelor "om "orbi puin mai t`r#iu.
'lementele unei liste
Atomii [i listele pot fi combinate sub form\ de liste. Dn
urm\toarele patru e!emple am introdus trei atomi `ntr-o
list\. 4iecare atom este un element al listei.
14
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'emplu
Aceast\ list\ are trei elemente, numerele reale *.6& *.6 [i
6.6
(1.0 1.0 0.0)
Aceast\ list\ are trei elemente, funcia de adunare I
;funcie intern\H& nr. `ntreg * [i nr. `ntreg %.
(+ 1 3)
Aceast\ list\ are trei elemente, funcia de adunare I& nr.
`ntreg * [i list\ ;I + %H
(+ 1 (+ 2 3 ))
(+ 1 (+ 2 3))
#&$,t '('m'nt: +
S')ond '('m'nt: 1
T8&$d '('m'nt: (+ "!
Figura +. Lista de trei elemente, doi atomi si o lista
'emplu
Aceast\ list\ are trei elemente, funcia de adunare I& lista
;I *;I + %HH [i lista ;I 2 1H.
(+ (+ 1 (+ 2 3)) (+ 4 5))
(+ (+ 1 (+ 2 3)) (+ 4 5))
#&$,t '('m'nt: +
S')ond '('m'nt: (+ 1 (+ "!!
T8&$d '('m'nt: (+ ; <!
Figura (. Lista de trei elemente, un atom si doua liste.
Ceea ce este `ncadrat `ntre parante#e repre#int\ o list\.
O list\ se compune dintr-o parante(\ de desc$idere
urmat\ de (ero sau de mai multe obiecte care pot fi
atomi sau liste dup\ care urmea(\ o parante(\ de
`nc$idere%
141246430.doc R.2.1 4/22/2013 15
AUTODESK, INC.
Condi#ii de eroare
C`nd introducei s-e!presii `n linia de comand\ AutoCAD&
interpretorul AutoLISP "\ "a spune dac\ ai introdus o
epresie neec$ilibrat\. 8 e!presie neec$ilibrat\ are mai
multe parante#e desc$ise dec`t `nc$ise.
Iat\ o e!presie neec$ilibrat\. Di lipse[te o parante#\ `nc$is\.
Command: (+ 1 (+ "!
17
AutoLISP-ul semnali#ea#\ o e!presie neec$ilibrat\ printr-un
mesaj special.
n7
unde n este num\rul de parante#e `nc$ise care lipsesc.
S`nt dou\ modalit\i de re#ol"are `n ca#ul condiiilor de
eroare, completai num\rul corect de parante#e `nc$ise sau
ap\sai Ctrl-C pentru a anula e!presia [i a ne re`ntoarce `n
linia de comand\.
*ot\ .ste de asemenea posibil s\ "edei acest mesaj c`nd
un [ir este neec$ilibrat. -n [ir neec$ilibrat are g$ilimele
duble la un cap\t [i simple la cel\lalt.
Particularit\#ile obiectului nil
(oate obiectele din AutoLISP s`nt atomi sau liste. Atomii [i
listele se e!clud mutual. -n atom nu este niciodat\ list\ [i o
list\ nu este niciodat\ atom.
.!cepia o face obiectul nil%
8biectul nil este +lista goal\+% Prin con"enie nil este [i
atom [i list\. nil poate fi e!primat `n dou\ moduri, 6 sau nil?.
nil este ec$i"alentul AutoLISP pentru fals% 9ulte funcii `n
AutoLISP testea#\ dac\ o condiie este ade"arat\ sau fals\&
de e!emplu dac\ "aloarea unui num\r este mai mare dec`t
6. De c`te ori un test de condiie este fals& AutoLISP-ul "a
returna obiectul nil ca fiind "aloarea testului.
nil este singurul obiect din AutoLISP corespun#ator lui CfalsC?
de aceea orice alt\ "aloare returnat\ de un test de condiie
trebuie s\ corespund\ lui Cade"\ratC.
16
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
)ecapitulare
Cele dou\ mari clase de obiecte din AutoLISP s`nt
atomii [i listele%
.!ist\ c`te"a tipuri diferite de atomi.
Atomii s`nt obiecte care nu s`nt `ncadrate `ntre
parante#e.
Listele s`nt `ntodeauna `ncadrate `ntre parante#e
8biectele coninute `ntr-o list\ constituie
elementele unei liste
.lementele unei liste pot fi atomi sau liste
.lementele unei liste s`nt separate `ntre ele de cel
puin un spaiu
AutoLISP detectea#\ epresiile neec$ilibrate
nil este [i atom [i list\
nil este lista goal\
nil este returnat de testele de condiie pentru a
indica +fals+
141246430.doc R.2.1 4/22/2013 17
AUTODESK, INC.
E+ERCITI,( 1- AT./I )I (I)TE
Dn acest e!erciiu "ei,
)ecapitula ce ai `neles despre atomi [i liste
Determina dac\ un obiect este atom sau list\
4olosi AutoLISP pentru a afla "aloarea diferitelor
obiecte
Partea I
*. Determinai dac\ obiectul este atom sau list\.
+. Completai re#ultatul e"alu\rii `n c\sua
corespun#atoare.
Tabelul ". Determinarea naturii obiectului
18
.0iecte Ato&i (iste
C".<
A6,6A
(1.6 .6 ".6!
ASt$&n.A
(ASt$&n.A!
(!
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Partea a II-a
*. /asii "aloarea acestui atom `n linia de comand\
AutoCAD
+. (ip\rii CLC urmat de un atom
%. Scriei r\spunsul `n coloana din dreapta,
'emplu
Command: H;.<
Tabelul +. Determinarea -alorii atomului
Partea a III-a
*. Determinai num\rul de elemente coninut de fiecare
list\.
+. Scriei r\spunsul `n coloana din dreapta.
L&,ta Numa$ d' '('m'nt'
(1.6 .6 ".6!
(+ 1 !
(+ 1 (+ "!!
(+ 1 (+ " ;! <!
(+ 1 (+ (+ " ;!! <!
(!
Tabelul (. Determinarea numarului de elemente din lista
141246430.doc R.2.1 4/22/2013 19
Ato&i 1alori
;.<
At'>tA
1C
,'tI
>/J
n&(
AUTODESK, INC.
Aceast\ pagin\ este l\sat\ liber\ `n mod intenionat
20
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Evaluarea
'valuarea este procesul prin care AutoLISP-ul determin\
"aloarea unui obiect. ."aluarea se aplic\ [i la atomi [i la
liste.
4iecare obiect din AutoLISP are o "aloare. Prin e"aluarea
unui obiect& AutoLISP-ul determin\ "aloarea acestuia.
Obiective
Dn acest capitol "ei studia,
Procesul e"alu\rii
Cum returnea#\ AutoLISP-ul o "aloare
Cum e"aluea#\ AutoLISP-ul atomi [i liste
Cum se folosesc funciile aritmetice de ba#\ `n
AutoLISP
Cum se anulea#\ e"aluarea unui obiect
Cum leag\ AutoLISP-ul o "aloare de o "ariabil\
)eturnarea valorii
C`nd transmitei un obiect spre e"aluare AutoLISP-ului&
acesta `i determin\ "aloarea [i o returnea(\% Dntr-un
e!emplu anterior& folosind caracterul CLC& AutoLISP-ul a
e"aluat obiectul pi [i a returnat "aloarea AutoCAD-ului.
AutoCAD-ul a tip\rit "aloarea returnat\ `n #ona liniei de
comand\.
Command: H%&
".1;1<= 4333 Ka(oa$' $'tu$nata
Dntr-un e!emplu anterior folosind comanda A))AM&
AutoLISP-ul a e"aluat lista ;J %:6 *1H [i a returnat "aloarea
+2 AutoCAD-ului. AutoCAD-ul a folosit "aloarea returnat\ la
intrare `n comanda A))AM.
C'nt'$ %o&nt o- a$$a/: <,<
Num*'$ o- &t'm,: (0 "56 1<!
An.(' to -&(( (+1))2, 31)2! 4"567:Ent'$
141246430.doc R.2.1 4/22/2013 21
AUTODESK, INC.
Number of tems: (/ 360 15)
(/ 360 15)
24
AutoCAD %$om%t U,'$ 'nt'$,
AutoLISP
$')'&K',
$'tu$n,
Figura &. AutoLISP returneaza -aloarea expresiei in linia de comanda AutoCAD.
'valuarea atomilor
Atomii s`nt obiecte simple [i s`nt e"aluai folosind reguli
simple potri"it tipului lor de date. 9ajoritatea atomilor se
autoe"aluea#\. <umerele `ntregi& numerele reale& [irurile&
se autoe"aluea#\ la "aloarea pe care o au. 9odul `n care se
e"aluea#\ un simbol nu poate fi discutat dec`t dup\ ce
`n"\am cum se leag\ o list\.
Ti! de ato& E'e&!l% Re2%la de
e3al%are
1aloare
Int$'. 1 La(oa$'a ',t'
n$. &n,u,&
1
R'a( ;.< La(oa$'a ',t'
n$. &n,u,&
;.<
S&$ At'>tA La(oa$'a ',t'
n$. &n,u,&
At'>tA
S&m*o( > L'.a$'a )u$'nta U(t&ma a,&.na$'
Tabelul &. Reguli de e-aluare a atomilor
'valuarea listelor
."aluarea unei liste poate fi facut\ `ntr-unul din aceste dou\
moduri, se ia lista ca atare sau se e"aluea#\. Dn funcie de
natura listei& metodele dau re#ultate diferite&de e!emplu&
"alori diferite.
22
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Dac\ o list\ este luat\ ca atare& atunci "aloarea ei este lista
`ns\[i. Acest lucru "a fi mai clar dup\ e!plicarea funciei
Ouote mai t`r#iu `n aceast\ lecie.
Dac\ o list\ urmea#\ a fi e"aluat\ de AutoLISP& atunci trebuie
respectat\ regula sintactic\.
Pentru orice list\ care poate fi e"aluat\& primul
element din cadrul listei trebuie s\ fie o func#ie.
Listele s`nt e"aluate potri"it instruciunilor referitoare la
primul element al listei. Dac\ primul element este numele
unei subrutine interne AutoLISP sau funcii& restul de
elemente ale listei s`nt transferate funciei ca argumente
formale [i s`nt e"aluate de c\tre funcie.
4unciile s`nt fie funcii interne AutoLISP& fie subrutine& a[a
cum s`nt cele pre#entate `n capitolul 2 al manualului
AutoLISP Programmer%s Reference Manual& fie funcii
e!terne definite de utili#ator sau esubr definite de
aplicaii ADS& sau funcii AutoLISP definite de utili#ator.
Cum evaluea(\ AutoLISP-ul o list\
Eom folosi o list\ simpl\ pentru a ilustra procesul de
e"aluare a unei liste.
Aceasta este o list\ format\ din trei elemente, funcia I
numerele `ntregi * [i +.
(+ 1 2)
'tapa I, Anali(a primului element
Primul element al unei liste pe care AutoLISP-ul o poate
e"alua trebuie s\ fie o func#ie%
AutoLISP-ul "erific\ primul element al listei unde se a[teapt\
s\ g\seasc\ o funcie. Dac\ primul element al listei pe care
AutoLISP-ul `ncearc\ s\ o e"alue#e nu este o funcie& acesta
"a da na[tere unei erori.
.lementele care urmea#\ dup\ o funcie `n cadrul unei liste
s`nt argumentele funciei? adic\ ele repre#int\ datele
asupra c\rora funcia operea#\.
'tapa a II-a, 'valuarea func#iei
AutoLISP e"aluea#\ funcia. 8 funcie e"aluea#\ un set de
instruciuni care sugerea#\ AutoCAD-ului cum s\ acione#e
mai departe.
4uncia I e"aluea#\ un set de instruciuni pentru AutoLISP.
Dac\ ar fi s\ e!prim\m `n cu"inte aceste instruciuni& am
141246430.doc R.2.1 4/22/2013 23
AUTODESK, INC.
putea spune, g#si&i $aloarea fiec#rui element din aceast#
list# Care s'nt argumentele func&iei( Pune&i toate $alorile la
un loc )i returna&i re"ultatul ca fiind $aloarea 'ntregii liste
24
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'tapa a III-a, Continuarea instruc#iunilor func#iei
;.. * ..H
-rm\rind instruciunile din funcia I& AutoLISP-ul g\se[te
"aloarea urm\torului element din list\, num\rul `ntreg *.
<umerele `ntregi se e"aluea#\ pe sine. Astfel AutoLISP-ul
memorea#\ "aloarea * `n sti"a programului& de e!emplu o
introduce `ntr-o locaie de memorie temporar\.
;.. .. +H
Conin`nd cu instruciunile de la funcia I& AutoLISP-ul
"erific\ dac\ mai s`nt [i alte elemente `n list\. 9ai e!ist\ un
element, num\rul `ntreg +. AutoLISP-ul `i pastrea#\ "aloarea
`n sti"\.
'tapa a I--a, )eturnarea valorii func#iei
<emaig\sind alte elemente `n list\& de e!emplu argumente
la funcie& AutoLISP-ul `[i termin\ instruciunile de la funcia
I prin ad\ugarea "alorilor argumentelor * [i + [i prin
returnarea num\rului `ntreg % ca fiind "aloarea listei.
Command: (+ 1 !
"
Command:
.n eemplu mai comple
AutoLISP e"aluea#\ elementele dintr-o list\ de la st`nga la
dreapta.
Dn multe ca#uri ar fi con"enabil pentru noi s\ urm\m
procesul de e"aluare din interior spre e!terior dec`t de la
dreapta spre st`nga. )e#ultatele 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
e!terior. Dar nu acesta este modul `n care AutoLISP-ul
e"aluea#\ o list\. Dntotdeauna lucrea#\ de la st`nga la
dreapta.
Considerai aceast\ list\ format\ din trei elemente, ;I * ;I +
%HH
4uncia I
Atomul *
Lista ;I + %H
141246430.doc R.2.1 4/22/2013 25
AUTODESK, INC.
(+ 1 (+ 2 3))
Ka(u' &, 1 Ka(u' &, <
Ka(u' &, 5
Figura .. #-aluarea unei liste complexe
AutoLISP-ul e"aluea#\ aceast\ list\ folosind e!act aceea[i
metod\ ca `n e!emplul anterior.
;I ..
AutoLISP-ul caut\ primul element al listei a[tept`nd s\
g\seasc\ o funcie [i apoi o e"aluea#\. 4uncia returnea#\
"aloarea ei ca un set de instruciuni pentru AutoLISP.
(.. 1 ..
-rm`nd instruciunile funciei I& AutoLISP-ul afl\ "aloarea
celui de al doilea element al listei& de e!. primul argument
la funcia I, atomul *. Apoi `i memorea#\ "aloarea [i
continu\.
(.. .. (+ "! ..
AutoLISP-ul g\se[te "aloarea celui de al treilea element al
listei& cum ar fi al doilea argument la funcia I.
Al treilea element este el `nsu[i o list\. Cum afl\ AutoLISP-ul
"aloarea unei listeP Prin e"aluare. Cum e"aluea#\ AutoLISP-
ul o list\P
(.. .. (+ ..
9ai `nt`i e"aluea#\ funcia I [i `i prime[te instruciunile
( .. .. (.. ..
(.. .. (.. .. "! ..
Apoi g\se[te "aloarea argumentelor + [i %. (ermin`ndu-i
instruciunile de la funcia I din cadrul listei (+ "!, AutoLISP-
ul adaug\ "alorile [i returnea#\ re#ultatul care `n acest ca#
este nr. `ntreg 1.
26
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
<emaig\sind alte elemente `n list\& AutoLISP-ul termin\
instruciunile de la funcia I `n lista principal\ prin
ad\ugarea "alorii celor dou\ elemente la un loc [i return`nd
"aloarea :.
/unc#ii aritmetice
AutoLISP-ul include funcii interne pentru operaii aritmetice
ca, adunarea& sc\derea& `nmulirea [i `mp\rirea
I funcia de adunare
- funcia de sc\dere
K funcia de `nmulire
J funcia de `mp\rire
141246430.doc R.2.1 4/22/2013 27
AUTODESK, INC.
'emple
E'!resii arit&etice )4e'!resii A%to(I)*
1 + (+ 1 !
3 1 (3 1!
M ; (M ;!
; 0 (0 ; !
Tabelul .. Aritmetica AutoLISP
8rdinea argumentelor `n funciile de adunare [i de
`nmulire nu are importan\. .ste `ns\ important\ pentru
sc\dere [i `mp\rire.
(! 2 1)
Su*t$a)t t8&,...
... -$om t8&,.
Fig. / 0rdinea argumentelor in 1unctia de scadere
Dn ca#ul sc\derii& "aloarea celui de al doilea argument este
sc\#ut\ din "aloarea primului argument [i re#ultatul returnat
este "aloarea listei.
(/ 4 2)
D&K&d' t8&,...
... */ t8&,.
Fig. 2 0rdinea argumentelor in 1unctia de impartire
Dn ca#ul `mp\ririi& "aloarea celui de al doilea argument
este di"i#orul "alorii primului argument.
Iat\ c`te"a e!emple comple!e.
28
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'emple
E'!resii arit&etice )4e'!resii A%to(I)*
1 + ( 3 "! (+ 1 (3 "!!
(; + ! 3 1 (3 (+ ; ! 1!
; M ; 0 (0 (M ; ;! !
; 0 M " (M " (0 ; !!
Tabelul /. #xemple complexe de expresii aritmetice
)ecapitulare
AutoLISP-ul determin\ "aloarea unui obiect prin
evaluare.
AutoLISP-ul returnea#\ valoarea fiec\rui obiect pe
care il e"aluea#\.
9ajoritatea atomilor se e"aluea#\ pe sine.
Simbolurile se e"aluea#\ prin legare sau atribuire.
Listele s`nt e"aluate printr-un proces standard.
Primul element al oricarei liste ce poate fi e"aluat\
trebuie s\ fie o funcie%
AutoLISP-ul are funcii standard pentru operaii
aritmetice.
141246430.doc R.2.1 4/22/2013 29
AUTODESK, INC.
E+ERCITI,( 2- (I)TE )I ARIT/ETICA (I)TE(.R
Dn acest e!erciiu "ei,
Consolida cuno[tinele despre procesul de e"aluare
Dncepe scrierea e!presiilor AutoLISP folosind
listele
(ransforma e!presiile aritmetice `n e!presii
AutoLISP
(ransforma e!presiile AutoLISP `n e!presii
aritmetice
Partea I
*. 4olosii funcia I& -& J& [i K.
+. (ransformai e!presiile aritmetice `n e!presii AutoLISP.
%. Scriei r\spunsurile `n coloana din dreapta.
'emplu
.!presia `n notaia aritmetic\ standard,
1 + 2
.!presia `n AutoLISP,
( + 1 2 )
E'!resii arit&etice )4e'!resii
" + 16 + <
6 M 1<
15 3 16
1< 0 "
< + (16 M !
(< + 16! M
Tabelul 2. Traducerea expresiilor aritmetice
30
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Partea a II-a
*. (ransformai s-e!presiile `n e!presii aritmetice
+. Scriei r\spunsurile `n coloana din dreapta
'emplu
.!presia `n notaia aritmetic\ standard
;+ K 1H J ;0 - +H
.!presia `n AutoLISP
(/ (* 2 5) (- 7 2))
Tabelul 1'. Traducerea expresiilor AutoLISP
141246430.doc R.2.1 4/22/2013 31
s4e'!resii e'!resii arit&erice
(+ (+ < ;! (3 ; !!
(3 < (+ ; (3 " !!!
(0 D (3 (0 5 ! 1!!
(M (0 (+ ;! "!!
(3 < (0 5 (+ 1 !!!
(+ (0 (M "! (3 ; !! 1!
AUTODESK, INC.
Liste neevaluate
Ealoarea unei liste poate fi determinat\ `n unul din aceste
dou\ moduri, se e"aluea#\ lista sau se consider\ lista ca
atare.
4uncia AutoLISP Ouote este folosit\ pentru a returna o list\
sau un atom nee"aluat& adic\ la "aloarea ca list\.
4olosii Ouote ca fiind primul element `ntr-o list\ [i ad\ugai
un singur argument. Ealoarea listei "a fi "aloarea
nee"aluat\ a celui de al doilea element al listei& adic\
argumentul la Ouote.
'emplu
Aceast\ e!presie returnea#\ lista ;*.6 +.6 %.6H nee"aluat\.
Command: (Iuot' (1.6 .6 ".6!!
(1.6 .6 ".6!
Ce s-ar `nt`mpla dac\ AutoLISP-ului i s-ar cere s\ e"alue#e
listaP
De ceP
Command: (1.6 .6 ".6!
9
Opera#ia de legare a dou\ obiecte
Legarea este procesul prin care o "aloare este atribuit\
unui simbol definit de utili#ator sau unei "ariabile. Dn
AutoLISP& spunem c\ la un simbol sau la o "ariabil\ se leag\
o "aloare. Aceasta `nseamn\ `n limbajul 7ASIC c\ o "aloare
este egal\ de o "ariabil\ sau c\ o "aloare este atribuit\
unei "ariabile.
4uncia AutoLISP setO se folose[te pentru a lega un simbol
sau o "ariabil\ de o "aloare.
'emplu
Aceast\ e!presie leag\ simbolul ! de "aloarea 2.1.
Command: (,'tI > ;.<!
;.<
Command: H>
;.<
32
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Dn 7ASIC& aceea[i operaie ar putea fi e!primat\ astfel,
L.( ! Q 2.1
Cum func#ionea(\ func#ia set0
Ealoarea funciei setO este un set de instruciuni pentru
AutoLISP.
Aceste instruciuni ar putea fi e!primate astfel, Lua&i primul
argument ca atare *u+l e$alua&i G#si&i $aloarea celui de al
doilea argument Lega&i primul argument de $aloarea celui
de al doilea argument Returna&i $aloarea leg#rii ca fiind
$aloarea listei
'emplu
<otai returnarea "alorii acestei e!presii. Ealoarea listei
este "aloarea leg\turii stabilite pentru simbolul ! de c\tre
funcia setO.
Command: (,'tI > ;.<!
;.<
)ecapitulare
4uncia 0uote suprim\ procesul de e"aluare.
Legarea este procesul de atribuire a unei "alori la
o "ariabil\.
4unctia set0 este folosit\ pentru a lega o "ariabil\
de o "aloare.
141246430.doc R.2.1 4/22/2013 33
AUTODESK, INC.
E+ERCITI,( 3- E1A(,AREA (I)TE(.R )I (E5AREA 1ARIA6I(E(.R
Dn acest e!erciiu "ei,
Consolida cuno[tinele despre procesul de e"aluare
Determina dac\ o list\ poate fi e"aluat\ f\r\ erori
Consolida cuno[tinele despre procesul de legare
4olosi funcia setO pentru a lega "ariabile de "alori&
adic\ "ei atribui "alori "ariabilelor
Partea I
*. Determinai dac\ o list\ poate fi e"aluat\ sau trebuie
considerat\ ca atare.
+. Punei un semn `n coloana corespun#\toare
Tabelul 11. Determinarea situatiei in care o lista poate 1i e-aluata
34
s4e'!resii E3al%ari7 8%&ai 9ata
3alorii7
(+ 1 !
(+ 1 (+ "!!
(1.6 .6 ".6!
(Iuot' (1.6 .6
".6!!
(,'tI > ;.<!
(,'tI / (1.6 .6
".6!!
(/ (1 !!
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Partea a II-a
*. Legai "ariabila ! de "alorile din tabel
+. 4olosii funcia setO [i funcia Ouote dac\ este necesar
%. Eerificai "aloarea "ariabilei folosind CbangC pentru a-i
afla legarea curent\.
'emplu
Command: (,'tI > 1!
1
Command: H>
1
Command:(,'tI > (+ 1 "!!
5
Command: H>
5
Command: (,'tI > (Iuot' (; (+ < 5!!!
(; (+ < 5!!
Command:H>
(; (+ < 5!!
1aloare !entr%
'
1
;.<
At'>tA
(1.6 .6 ".6!
(+ 1 "!
(1 (+ "!!
Tabelul 1. Legarea lui x unor -alori di1erite
141246430.doc R.2.1 4/22/2013 35
AUTODESK, INC.
Aceast\ pagin\ este l\sat\ liber\ `n mod intenionat.
36
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
S-expresii AutoLISP `n cadrul comenzilor AutoA!
S-e!presiile AutoLISP pot fi folosite `n cadrul comen#ilor
AutoCAD.
Obiective
Dn acest capitol "ei studia,
Cum s\ folosii AutoLISP-ul `n cadrul comen#ilor
AutoCAD
Cum s\ returnai o "aloare din AutoLISP c\tre o
comand\ AutoCAD
)eturnarea unei valori `n linia de comand\
Ealoarea unei e!presii AutoLISP este trecut\ din AutoLISP `n
AutoCAD ca r\spuns la linia AutoCAD `n aciune.
Dac\ linia de comand\ este `n aciune& "aloarea unei
e!presii este pur [i simplu tiparit\ `n #ona liniei de
comand\.
Command: (,'tI > (+ ; 5!!
16
Command: H>
16
Aceast\ e!presie returnea#\ "aloarea di"i#\rii r\d\cinii
p\trate num\rului 16 prin num\rul real 3.
Command: (0 (,I$t <6.6! =.6!
6.CD<5C
Aceast\ e!presie returnea#\ "aloarea multiplic\rii
re#ultatului obinut prin adunarea lui +.1 cu :.% de +2.6.
Command: (M (+ .< 5."! ;.6!
11.
)eturnarea unei valori la o comand\ AutoCA&
Dac\ o comand\ AutoCAD este `n aciune& atunci e"aluarea
unei e!presii AutoLISP returnea#\ "aloarea e!presiei `n
AutoCAD. Ealoarea de"ine r\spunsul la linia curent\ a
comen#ii AutoCAD.
Dn acest e!emplu& comanda A))AM recepionea#\ ca num\r
de repetiii ale funciei& re#ultatul unei e!presii AutoLISP
pentru care :.6 se di"ide la 6.%1? cu alte cu"inte& nu [tim
dinainte c`te repetiii cuprinde unitatea 6.%1 la o distant\ de
:.6 unitai& deci rug\m AutoLISP-ul s\ calcule#e "aloarea
pentru noi [i s\ returne#e r\spunsul AutoCAD-ului.Deoarece
comanda din A))AM accept\ numai numere `ntregi [i nu
numere reale& "om folosi funcia AutoLISP fi! pentru a
rotunji cel mai apropiat num\r `ntreg.
141246430.doc R.2.1 4/22/2013 37
AUTODESK, INC.
'emplu
Dncepei un desen nou.
(ip\rii comen#ile [i e!presiile care urmea#\.
Command: (0 5.6 6."<!
1C.1;=
Command: (-&> 1C.1;=!
1C
Command: (-&> (0 5.6 6."<!!
1C
Command: (&n'
#$om %o&nt: 1,1
To %o&nt: <,<
To %o&nt: Ent'$
Command: a$$a/
S'(')t o*+')t,: I
S'(')t o*+')t,: Ent'$
R')tan.u(a$ o$ Po(a$ a$$a/ (R0P!: $
Num*'$ o- $o2, (3! 417: 1
Num*'$ o- )o(umn, (III! 417: (-&> (0 5.6 6."<!!
D&,tan)' *'t2''n )o(umn,: 6."<
AutoCAD crea#\ *0 elemente `n arra>.
(rebuie a"ut `n "edere faptul c\ o e!presie AutoLISP a fost
folosit\ interacti"& `n mijlocul unei comen#i AutoCAD& pentru
a calcula o "aloare ;`n acest ca# un num\r `ntregH care
ulterior este dat\ automat comen#ii `n acel punct special la
sec"ena de cerere a comen#ii.
38
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Dn e!emplul urmator& AutoLISP-ul calculea#\ m\rimea ra#ei
unei racord\ri.
'emplu
Dncepei un desen nou.
(ip\rii e!presiile [i comen#ile care urmea#\.
9\rimea ra#ei unei racord\ri este stabilit\ la +.+2.
Command: line
#$om %o&nt: 1,1
To %o&nt: 5,5
To %o&nt: Enter
Command: line
#$om %o&nt: 10,1
To %o&nt: 6,5
To %o&nt: Enter
Command: 9illet
Po(/(&n'0Rad&u,04S'(')t t2o (&n',7: r
Ent'$ -&(('t $ad&u, 41.67: "/ 28.0 12.5#
Command: 9illet
Po(/(&n'0Rad&u,04S'(')t t2o (&n',7: !ic: 9irst line
S'(')t ,')ond o*+')t: !ic: second line
Figura 1'. Doua linii cu o racordare la o raza de $%/.' 1.() sau .+
)ecapitulare
S-e!presiile pot fi folosite ca r\spunsuri la cererile
de comand\ AutoCAD.
AutoLISP returnea#\ "aloarea unei s-e!presii
folosite `n cadrul unei comen#i AutoCAD la
cererea comen#ii.
Command: (add3on' ;!
<
'emplu
Introducei e!presiile care urmea#\. Creai o funcie numit\
dtr care cere un argument e!primat `n grade [i returnea#\
"aloarea transformat\ `n radiani. 4olosii funcia cu trei
"alori diferite.
4ormula aritmetic\ pentru transformarea gradelor `n radiani
pentru "aloarea d este,
(d / 180) * pi
Command: (d'-un dt$ (d! (M %& (0 d 1D6.6!!!
DTR
Command: (dt$ 1D6!
".1;1<=
Command: (dt$ "56!
5.D"1=
Command: (dt$ =6!
1.<C6D
'emplu
Introducei e!presiile care urmea#\. Creai o funcie care se
nume[te add-tGo care cere dou\ argumente& adaug\ "alorile
lor [i returnea#\. 4olosii funcia cu dou\ seturi de "alori
diferite.
Command: (d'-un add3t2o (> /! (+> /!!
ADD3TRO
Command: (add3t2o 1 !
"
Command: (add3t2o ; <!
=
98
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
)ecapitulare
;
Command: $'
1
Apoi "ei defini o funcie localT"ar care `l declar\ pe ! ca
"ariabil\ local\. Legarea lui ! se poate sc$imba local `n
cadrul aloc\rii funciei localT"ar [i legarea global\ "a fi
restabilit\ la ie[irea funciei localT"ar.
Command: "de9%n localG3ar "/ '# "set= ' 3# "!rint '##
LOCAL?LAR
Command: "localG3ar#
114
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
"
Command: $'
1
Eei defini apoi o funcie globalT"ar unde "ariabila ! nu a fost
definit\ nici ca argument nici ca "ariabil\ local\? de aceea
sc$imbarea `n interiorul leg\turii se "a face global& `n afara
alocarii funciei globalT"ar.
Command: "de9%n 2lo0alG3ar "# "set= ' 4# "!rint '##
GLOBAL?LAR
Command: "2lo0alG3ar#
;
Command: $'
;
/olosirea variabilelor locale
4uncia c,rectangle a fost pe deplin clarificat\. Dn acest
e!emplu& "ariabilele oldTemdec$o& pt* [i pt+ s`nt declarate ca
fiind locale la funcie? deci ele nu pot intra `n conflict cu
"ariabilele globale care au acela[i nume [i nici cu "ariabilele
cu acela[i nume care pot fi g\site `n cadrul altor funcii.
(defun c:rectangle (/ old_cmdecho pt1 pt3)
(setq old_cmdecho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt2 (getpoint "\nOther corner: "))
(command "pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(setvar "CMDECHO" old_cmdecho)
(prin1)
)
Declaraia "ariabilelor locale se face de obicei dup\ un
program care a fost "erificat [i pus la punct `ntruc`t
declaraia face dificil\ sau c$iar imposibil\ e!aminarea
"alorilor lor `n ca#ul `n care funcia abortea#\ sau face ce"a
nea[teptat din cau#a unei erori `n cod.
4lobali(area variabilelor de sistem
Eariabilele de sistem apelate de funcia AutoLISP set"ar nu
se traduc niciodat\ din limba engle#\ `n limba utili#atorului.
Cererile de apelare a funciei set"ar funcionea#\ `n toate
"ersiunile AutoCAD-ului f\r\ s\ necesite traducerea numelui
"ariabilei de sistem din limba engle#\ `n limba utili#atorului.
141246430.doc R.2.1 4/22/2013 115
AUTODESK, INC.
Eariabilele de dimensiune se traduc numai `n linia de
comand\ pentru dimensionare.
)edefinirea comen(ii
Putei `nlocui comen#ile AutoCAD e!istente cu comen#i
AutoLISP care au acela[i nume.
-tili#atorul poate apela o comand\ AutoCAD prin prefaarea
numelui comen#ii prin caracterul punct ;.H& de
e!emplu& .LI<.& indiferent dac\ comanda a fost nedefinit\.
.ste bine s\ prefaai numele unei comen#i apelate de
funcia AutoLISP de tip command printr-un punct ;.H sau prin
subliniere ;pentru a "\ asigura c\ funcionea#a `n toate
limbileH.
S`nt dou\ etape de parcurs pentru `nlocuirea comen#ii
AutoCAD cu o comand\ AutoLISP care are acela[i nume.
4olosii comanda -<D.4I<. pentru a ani$ila o
comand\ AutoCAD pentru sesiunea de editare
curent\.
Creai o funcie AutoLISP care are acela[i nume ca
[i comanda AutoCAD [i prefaai-o cu c,.
Putei redefini o comand\ AutoCAD folosind comanda
).D.4I<..
'emplu
Introducei e!presiile care urmea#\.
Ani$ilai comanda AutoCAD LI<..
Command: %nde9ine
Command nam': line
Dnlocuii-o cu o comand\ AutoLISP cu acela[i nume care
desenea#\ o linie segment. Apelai "ersiunea engle#easc\ a
comen#ii AutoCAD LI<. din cadrul funciei AutoLISP.
Command: "de9%n c- line "# "co&&and H.G line H !a%se !a%se HD##
C- (I8E
Apelai comanda LI<..
116
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Command: line
.3 (&n' #$om %o&nt: !ic: a !oint
To %o&nt !ic: a !oint
To %o&nt:
Command: nil
)edefinii comanda AutoCAD.
Command: rede9ine
Command nam': line
141246430.doc R.2.1 4/22/2013 117
AUTODESK, INC.
)ecapitulare
Putei ie[i dintr-o funcie apel`nd prin; sau princ
care repre#int\ ultima e!presie `n corpul
definitiei funciei.
Eariabila de sistem C9D.CB8 poate suprima
afi[area cererilor de comand\ AutoCAD.
AutoLISP-ul utili#ea#\ o sc$em\ dinamic\ de
alocare.
Eariabilele globale s`nt accesibile pentru toate
funciile.
Eariabilele locale s`nt accesibile numai `n
conte!tul funciilor `n care au fost declarate.
Putei folosi "ariabile locale `n cadrul funciilor
pentru a e"ita posibilitatea unor conflicte `ntre
"ariabile cu acelea[i nume din alte funcii.
Eariabilele de sistem apelate de funcia set"ar nu
se traduc niciodat\ din engle#\.
Comen#ile AutoCAD pot fi `nlocuite cu comen#i
AutoLISP care au acela[i nume& folosind
comanda -<D.4I<..
Comanda AutoCAD "a fi `ntotdeauna apelat\ c`nd
numele comen#ii este prefaat printr-un punct?
de e!emplu .LI<.& indiferent dac\ comanda a
fost ani$ilat\.
Prefaai `ntotdeauna numele unei comen#i cu un
punct ;.H sau prin caracterul subliniere ; T H `n
ca#ul funciei de tip command.
Prefaai `ntotdeauna opiunea de comand\ prin
caracterul subliniere ; T H `n ca#ul funciei de tip
command.
118
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 16- A,8CTIA ;E *R.5RA/ARE .*TI/A
Dn acest e!erciiu,
Eei consolida cuno[tinele cu pri"ire la ordonarea
funciilor C,& inclu#`nd ie[irea funciilor&
dublarea cererii de comand\ [i declaraia
"ariabilei locale.
Eei modifica fi[ierul rectanglsp pentru a introduce
noi concepte din acest capitol.
Eei crea un nou fi[ier te!t cu o funcie modificat\.
Partea I
'tape de lucru
*. 9odificai fi[ierul rectanglsp
+. Ad\ugai funcia de ie[ire imediat\.
%. Anulai ecoul cererii de comand\.
2. Declarai "ariabilele corespun#\toare ca "ariabile locale.
1. Dnc\rcai& lansai [i testai programul dup\ ce ai f\cut
modific\rile.
Partea a II-a
'tape de lucru
)escriei funcia c,#plus de la sf`r[itul capitolul *+
`ntr-un fi[ier numit "pluslsp
4olosii funcia getpoint pentru a obine noul punct
de centru a ecranului.
Anulai ecoul din opiunile [i cererile de comand\
N889.
Declarai toate "ariabilele local.
Introducei funcia de ie[ire.
Dnc\rcai& demarai [i testai programul dup\ ce ai
f\cut modific\rile.
*O6A 4unciile /.(!!! nu pot fi folosite `n cadrul
e!presiilor funciilor command? de e!emplu& ;command ClineC
;getpointHH nu este permis\.
141246430.doc R.2.1 4/22/2013 119
AUTODESK, INC.
Aceast\ pagin\ a fost l\sat\ liber\ `n mod intenionat.
120
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
"este lo'ice [i de e'alitate
Programele AutoLISP pot face un salt pe ba#a "alorii unei
epresii test.
Obiective
Dn acest capitol "ei studia,
Cum se poate sc$imba controlul desf\[urarii
unui program pe ba#a unei epresii test%
Cum s\ folosii testele de egalitate [i testele
logice ca e!presii test.
Diferena dintre simbolul t [i simbolul nil%
Cum s\ determinai tipul de date al unui obiect.
)amificarea programului
Aceasta diagrama simpl\ ilustrea#\ principiul ramific\rii
programului.
Set "alue of !
! Q CBello& Gorld.CP
7ranc$ to function ;>H 7ranc$ to function ;#H
t or true
nil or false
Figura . Rami1icarea programului bazata pe testul de conditie
Dn aceast\ diagram\& dac\ "aloarea "ariabilei ! este egal\ cu
[irul de tip te!t CBello& GorldC& atunci programul se "a
ramifica `n e!presia > [i "a continua? dac\ nu & se "a
ramifica `n e!presia # [i "a continua.
4unciile care reali#ea#\ testele condi#ionale s`nt folosite
pentru ramificaii `n interiorul programelor AutoLISP. Cele
dou\ funcii de ba#\ pentru testele condiionale s`nt,
f
&ond
141246430.doc R.2.1 4/22/2013 121
AUTODESK, INC.
-nele "alori sau seturi de "alori s`nt testate cu if sau cond
iar programul se ramific\ conform re#ultatelor testului.
AutoLISP-ul dispune de o "arietate de funcii care testea#\
"alorile pe ba#a anumitor criterii sau unele "alori pe ba#a
celorlalte. Dn acest capitol ne concentr\m atenia asupra
unora dintre cele mai utili#ate funcii de acest tip.
(& )& *
e#ual
and
or
not
lo+and
t si nil
Dn AutoLISP& simbolul t este ec$i"alentul pentru Cade"\ratC
`n orice test condiional. Simbolul nil este ec$i"alentul lui
CfalsC.
Dac\ o e!presie AutoLISP nu se e"aluea#\& atunci e!presia
este nil sau fals\. Dac\ o e!presie nil este folosit\ `ntr-un test
condiional& atunci "a fi e!ecutat\ o ramificaie pentru o
condiie fals\.
Dac\ o e!presie AutoLISP e"aluea#\ orice altce"a dec`t nil&
atunci e!presia este t sau ade"\rat\. Dac\ o e!presie t este
folosit\ `ntr-un test condiional& atunci "a fi e!ecutat\
ramificaia pentru o condiie ade"arat\.
t [i nil se e!clud mutual. Dac\ o e!presie este t& atunci nu
poate fi nil. Dac\ o e!presie este nil& atunci nu poate fi t.
122
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 8R 17- .6IECTE(E )I E+*RE)II(E *.T AI T )A, 8I(
Dn acest e!erciiu,
Eei `n"\a s\ determinai dac\ "aloarea returnat\ a
unei funcii este t sau nil.
Instruc#iuni
*. Dntr-un desen nou& desenai o entitate de tip linie.
+. Introducei e!presiile `n coloana din st`nga a tabelului.
%. Determinai dac\ e!presiile s`nt t sau nil.
2. Eerificai c\sua adec"at\ din tabel.
E'!resie t nil
(,'tI 'nam' ('ntn'>t!!
H'nam'
(,'tI 'nam' ('ntn'>t 'nam'!!
H'nam'
(+ 1 !
(3 1 1!
(!
()ommand A'$a,'A A(a,tA AA!
()ommand AuA!
Tabelul 12. #xpresiile pot 1i t sau nil
141246430.doc R.2.1 4/22/2013 123
AUTODESK, INC.
/unc#ii care testea(\ egalitatea
4uncia Q are dou\ sau mai multe argumente cu orice tip de
date. Aceast\ funcie "erific\ dac\ toate argumentele au
"alori ec$i"alente. Dac\ da& funcia returnea#\ t? dac\ nu&
returnea#\ nil.
De e!emplu& aceast\ e!presie "erific\ dac\ "alorile num\rului
real 2.6 [i e!presia ;I +.6 +.6H s`nt ec$i"alente
Command: (1 ;.6 (+ .6 .6!!
T
Aceast\ e!presie "erific\ dac\ 2.6 este ec$i"alent cu
e!presia ;I *.1 +.6H
Command: (1 ;.6 (+ 1.< .6!!
n&(
4uncia U "erific\ dac\ primul ei argument este numeric mai
mic dec`t al doilea argument.
Command: (4 ;< <6!
T
4uncia eOual este `n esen\ aceea[i cu funcia Q.
'erci#iu
Introducei e!presiile care urmea#\.
Legai dou\ "ariabile de "alori numerice. 4olosii "ariabilele
ca argumente la c`te"a funcii [i "erificai re#ultatele.
Command: "set= ' 1#
1
Command: "set= 1.5#
1.<
Eerificai dac\ ! este mai mic dec`t >.
Command: "I ' #
T
Eerificai dac\ ! este mai mare dec`t >.
Command: "J ' #
n&(
124
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Eerificai dac\ > este mai mare sau egal cu *&1.
Command: "JK 1.5#
T
Eerificai dac\ ! este mai mic sau egal cu >.
Command, <=> 2?
(
Eerificai dac\ ! nu este egal cu >.
Command: "/K ' #
T
Acest tabel arat\ funciile care "erific\ egalitatea `n
AutoLISP.
A%nctie Test
1 E.a( )u
01 Nu ',t' '.a( )u
4 @a& m&) d')&t
41 @a& m&) ,au '.a( )u
7 @a& ma$' d')&t
71 @a& ma$' ,au '.a( )u
m&nu,% @a& m&) d')&t J'$o
J'$o% E.a( )u J'$o
'Iua( E.a( )u
'I Au a)''a,& ('.atu$a
Tabelul '. Functii de egalitate
141246430.doc R.2.1 4/22/2013 125
AUTODESK, INC.
/unc#ii care verific\ tipul de date
AutoLISP-ul dispune de c`te"a funcii care "erific\ tipul de
date ale unui simbol sau e!presii.
A%nctie Test
ATO@ E,t' a$.um'ntu( un atom9
LISTP E,t' a$.um'ntu( o (&,ta9
BOUNDP E,t' a$.um'ntu( ('.at d' o Ka(oa$'9
NULL E,t' a$.um'ntu( n&(9
NU@BERP E,t' a$.um'ntu( un numT$9
Tabelul 1. Functii care testeaza tipul de date
'emplu
Introducei e!presiile care urmea#\.
Legai trei "ariabile de trei tipuri de date diferite, un simbol&
un num\r real [i o list\.
Command: "set= ' La0c#
ABC
Command: "set= 1.0#
1.6
Command: "set= B L"1 2 3##
(1 "!
4olosii "ariabilele ca argumente la funcii care testea#\
tipul de date. .!aminai re#ultatele funciilor.
S`nt aceste "ariabile atomiP
Command: "ato& '#
T
Command: "ato& #
T
Command: "ato& B#
n&(
S`nt aceste "ariabile listeP
Command: "list! '#
n&(
Command: "list! #
n&(
126
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Command: "list! B#
T
Combinarea func#iilor t2pe cu func#iile +>+
Putei "erifica tipul de date al unui obiect `n AutoLISP
folosind fie funcia Q& fie funcia eOual cu funcia t>pe.
'emplu
Introducei e!presiile care urmea#\.
Legai dou\ "ariabile cu tipuri de date diferite, un num\r
`ntreg [i un num\r real.
Command: "set= ' 1#
1
Command: "set= 1.5#
1.<
4olosii funciile t>pe [i Q pentru a "erifica tipul lor de date.
Command: "K "t!e '# LI8T#
T
Command: "e=%al "t!e '# LREA(#
n&(
Command: "e=%al "t!e # LREA(#
T
141246430.doc R.2.1 4/22/2013 127
AUTODESK, INC.
/unc#ii logice
.!ist\ c`te"a funcii de test logic `n AutoLISP. Dn acest
capitol "om studia patru dintre cele mai importante funcii,
not& and& or [i logand.
/unc#ia not
4uncia not solicit\ un argument. Dac\ argumentul este nil&
atunci e!presia returnea#\ t? dac\ nu& aceasta returnea#\
nil.
4uncia not este o funcie a c\rei "aloare returnat\ este
opusul argumentului ei. Dai-i nil [i "a returna t. Dai-i t [i "a
returna nil.
.!emplu
Command: (not n&(!
T
Command: (not t!
n&(
/unc#ia and
4uncia and solicit\ unul sau mai multe argumente. Dac\
unul dintre argumente este nil& ea returnea#\ nil. Dac\ toate
argumentele s`nt t & atunci returnea#\ t.
4uncia and opre[te procesarea de `ndat\ ce g\se[te un
argument nil. -nele programe s`nt scrise `n acord cu acest
comportament. De e!emplu& putei fi siguri c\ programul nu
"a g\si o instruciune `ntr-o list\ de argumente ale funciei
and dac\ nici unul dintre argumentele anterioare nu este nil.
'emplu
Command: (and 1 "!
T
Command: (and 1 n&(!
n&(
/unc#ia or
4uncia or solicit\ unul sau mai multe argumente. Dac\ unul
dintre argumente este t& funcia returnea#\ t. Dac\ toate
argumentele s`nt nil& atunci funcia returnea#\ nil.
4uncia or opre[te procesarea de `ndat\ ce g\se[te un
argument t. -nele programe s`nt scrise `n conformitate cu
128
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
acest comportament. De e!emplu& putei fi siguri c\
programul nu "a g\si o instruciune `ntr-o list\ de
argumente ale funciei or dac\ nici unul dintre argumentele
anterioare nu este t.
'emplu
Command: (o$ 1 "!
T
Command: (o$ 1 n&(!
T
Command: (o$ n&( n&( n&(!
n&(
/unc#ia logand
4uncia logand are dou\ sau mai multe argumente care ar
trebui s\ fie numere `ntregi. 4uncia returnea#\ un num\r
`ntreg.
4uncia logand reali#ea#\ o comparaie A<D bit cu bit a
biilor din argumentele care s`nt numere `ntregi. Dac\ un
bit este setat la "aloarea Cade"\ratC `n toate argumentele
funciei logand& atunci acel bit este setat la "aloarea
Cade"\ratC [i `n "aloarea returnat\.
<umerele `ntregi 0& % [i *1 s`nt repre#entate `n bii `n
tabelul de mai jos.
Intre2 1 0it 2 0it 4 0it 8 0it 16 0it
C G G G
" G G
1< G G G G
Tabelul . Aiti setati la -aloarea Bade-aratB in trei numere intregi.
Aceast\ e!presie "a returna un num\r `ntreg `n care toi
biii care s`nt setai la "aloarea Cade"\ratC `n toate cele trei
argumente "or fi setai la "aloarea Cade"\ratS. Dn acest
ca#& biii pentru "alorile * [i + "or fi returnai ca Cade"\ratC
de c\tre e!presie& deoarece s`nt singurii bii setai
Cade"\ratC `n toate cele trei argumente.
Command: ((o.and C 1< "!
"
141246430.doc R.2.1 4/22/2013 129
AUTODESK, INC.
4uncia logand "a fi de folos atunci c`nd "a fi folosit\
`mpreun\ cu funciile Centit2 accessC mai t`r#iu `n acest
curs& `n special cu "alorile binare cum ar fi codurile grupului
06 D=4 pentru Pol>lines [i 7loc' Definitions .
130
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
)ecapitulare
)amificarea unui program depinde de "aloarea unui
test condi#ional.
(oate obiectele [i e!presiile din AutoLISP s`nt t sau nil.
AutoLISP dispune de o "arietate de funcii care
testea#\ tipul de egalitate [i tipul de date ale
obiectelor [i e!presiilor.
Putei testa tipul e!act de date al unui obiect
combin`nd funciile t>pe [i Q.
4unciile logice not& and [i or "erific\ dac\ una sau mai
multe e!presii s`nt t sau nil.
4uncia logand reali#ea#\ o comparaie A<D bit cu bit a
unei liste de numere? aceasta funcie "a fi de ajutor
`n combinaie cu funciile de tip entit2 access mai
t`r#iu.
141246430.doc R.2.1 4/22/2013 131
AUTODESK, INC.
'presii test [i epresii condi#ionale
4unciile de egalitate [i funciile logice s`nt folosite
`n epresii test. .!presiile test s`nt folosite `n
e!presii condiionale [i iterati"e formate din
funcii ca if [i G$ile. .le "erific\ dac\ e!ist\ o
anumit\ condiie [i arat\ AutoLISP-ului ce funcie
s\ e!ecute care depinde de condiie& sau de
re#ultatul testului.
*O6: 8rice atom& simbol sau e!presie poate fi folosit\ ca
e!presie test deoarece orice obiect `n LISP are o "aloare,
fie nil& fie altce"a.
Obiective
Dn acest capitol "ei studia,
Cum s\ folosii epresiile condi#ionale pentru a
face salt la diferite seturi de e!presii `n cadrul
programului AutoLISP
Sinta!a funciilor if [i cond.
Cum s\ folosii funcia progn pentru a e!ecuta
multiple s- e!presii `n cadrul funciei if.
'presii condi#ionale
.!presiile condiionale controlea#\ desf\[urarea unui
program AutoLISP. 4olosim e!presiile test pentru a "erifica
dac\ o anumit\ condiie e!ist\& iar re#ultatul e!presiei test
este folosit pentru a comuta e!presia condiional\. .!presia
condiional\ poate opta pentru e!ecuia programului `n
oricare din cele c`te"a direcii posibile. 4iecare direcie "a
a"ea un set de e!presii de e"aluat `n AutoLISP.
Cele mai folosite e!presii condiionale `n AutoLISP s`nt
funciile if [i cond.
/unc#ia if
4uncia if are dou\ argumente obligatorii [i un al treilea
argument care este opional.
Dac\ "aloarea primului argument este t& adic\ oricare `n
afar\ de nil& AutoLISP-ul e"aluea#\ al doilea argument.
Dac\ "aloarea primului argument este nil& AutoLISP-ul sare
peste al doilea argument. Dac\ e!ist\ cel de-al treilea
argument opional& AutoLISP-ul il e"aluea#\.
132
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Simplific`nd puin lucrurile& funcia if ar ar\ta cam a[a,
(if
(I_return_true)
(do_this)
(else_do_this)
)
'emplu
Introducei e!presiile care urmea#\,
Legai "ariabila ! de o "aloare a lui *. Legai "aloarea lui >
ba#at\ pe "aloarea lui !.
Command: (,'tI > 1!
1
Command: (&- (1 > 1! (,'tI / 1! (,'tI / 6!!
1
Command: H/
1
Legai "ariabila ! de o "aloare a lui 6. Legai "ariabila >
ba#at\ pe "aloarea !.
Command: (,'tI > 6!
6
Command: (&- (1 > 1! (,'tI / 1! (,'tI / 6!!
6
Command: H/
6
141246430.doc R.2.1 4/22/2013 133
AUTODESK, INC.
E+ERCITI,( 18- RA/IAICAREA *R.5RA/,(,I A.(.)I8; A,8CTIA IA
Dn acest e!erciiu ,
Eei folosi funcia if.
Eei scrie o funcie pentru a comuta S<AP pe on sau
off `n funcie de setarea curent\.
'tape de lucru
*. Dntr-un fi[ier nou& folosii editorul de te!t pentru a
crea o funcie numit\ c,snaptog.
+. Introducei codul de mai jos.
%. 4uncia ar trebui s\ comute modul S<AP `n funcie
de "aloarea 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
)
2. Sal"ai funcia `ntr-un fi[ier numit snaptoglsp din
directorul student.
1. Dnc\rcai fi[ierul `n AutoCAD.
:. Desenai c`te"a entit\i tip Line [i Circle.
0. 4olosii S<AP(8/ pentru a comuta S<AP pe on sau off
c`nd desenai entit\ile.
*O6: Dncercai s\ apelai S<AP(8/ `n cadrul unei
comen#i LI<. sau CI)CL..
134
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'presii multiple `n cadrul func#iei if%
4uncia if permite e!ecuia unei singure e!presii dup\ ce a
fost e"aluat\ e!presia test.
Putei face ca e!presii multiple s\ apar\ ca o singur\
e!presie la funcia if prin amplasarea acestora `n cadrul
e!presiei progn.
4uncia progn e"aluea#\ pe fiecare dintre argumentele sale&
pe r`nd [i returnea#\ "aloarea ultimului argument. .!presii
multiple aflate `n cadrul funciei progn apar sub forma unei
simple e!presii la o funcie de apelare.
Dn acest e!emplu& dac\ "ariabila ! este egala cu *& atunci
"alorile "or fi atribuite ambelor "ariabile > [i #. Asignarea
este reali#at\ de dou\ s-e!presii.
'emplu
Command: (,'tI > 1!
1
Command: (&- (1 > 1! (%$o.n (,'tI / ! (,'tI J "!! (,'tI / 6!!
"
Command: H/
Command: HJ
"
141246430.doc R.2.1 4/22/2013 135
AUTODESK, INC.
E+ERCITI,( 19- E+*RE)II /,(TI*(E I8 CA;R,( A,8CTIEI IA
Dn acest e!erciiu,
Eei modifica funcia e!istent\ de la e!erciiul *5.
Eei folosi funcia progn.
Eei e!ecuta s-e!presii multiple prin apelarea unei
funcii if.
'tape de lucru
*. Dn editorul de te!t& desc$idei fi[ierul snaptoglsp din
directorul student.
+. )edenumii funcia c,modetog.
%. Cu ajutorul funciei progn& ad\ugai codul care comut\
S<AP98D. [i /)ID98D. pe ba#a "alorii curente a lui
S<AP98D..
2. Sal"ai fi[ierul pe disc ca modetoglsp.
1. Dnc\rcai programul modificat `n AutoCAD.
:. (estai comanda 98D.(8/.
136
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
/unc#ia cond
4uncia cond cere un argument obligatoriu [i un num\r
oarecare de argumente opionale.
4iecare argument al funciei cond poate fi un set de e!presii
incluse `ntr-o list\ e!tern\.
4uncia cond e"aluea#\ prima e!presie `n fiecare din listele
de argumente& pe r`nd& p`n\ ce o e!presie e"aluea#\
Cade"\ratC. Atunci funcia cond e"aluea#\ e!presiile care
urmea#\ primei e!presii din cadrul argumentului [i
returnea#\.
4uncia cond este de preferat funciei if ori de c`te ori e!ist\
mai mult de dou\ ca#uri de testat& adic\ mai mult de dou\
ramific\ri `n orice punct din program.
'emplu
Aceast\ definiie a funciei "a introduce "alori diferite `n
#ona liniei de comand\& `n funcie de "aloarea numeric\ a
"ariabilei !.
4ii ateni `n mod special la modul `n care pot fi construite
argumentele la funcia cond. Prima e!presie dintr-un
argument este e!presia test [i e!presiile care urmea#\ dup\
test "or fi e"aluate dac\ argumentul test este ade"\rat.
4uncia cond opre[te testarea argumentelor de `ndat\ ce
g\se[te un argument a c\rui e!presie test este ade"arat\&
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)
)
)ecapitulare
4uncia if testea#\ o e!presie [i se ramific\ spre oricare
dintre cele dou\ s-e!presii.
141246430.doc R.2.1 4/22/2013 137
AUTODESK, INC.
4uncia progn este folosit\ pentru a e!ecuta s-e!presii
multiple `n cadrul funciei if.
138
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
4uncia cond poate testa mai multe e!presii [i poate
e!ecuta orice num\r de s-e!presii `ntr-o ramificaie dat\.
141246430.doc R.2.1 4/22/2013 139
AUTODESK, INC.
E+ERCITI,( 20- ,TI(I<AREA A,8CTIEI C.8; *E8TR, RA/IAICAREA *R.5RA/,(,I
Dn acest e!erciiu,
Eei folosi funcia cond `n cadrul unei funcii noi.
Eei testa o "ariabil\ pentru egalitate numeric\.
Eei e!ecuta toate trei ramificaiile e!presiei cond.
'tape de lucru
*. Creai o nou\ funcie `ntr-un nou fi[ier cu ajutorul
editorului de te!t.
+. <umii aceast\ funcie test!.
%. 4uncia cere un argument obligatoriu.
2. Dntr-o instruciune cond& folosii testele de egalitate
pentru a "edea dac\ "aloarea argumentului este
egal\& mai mic\ sau mai mare dec`t 6.
1. Dac\ este satisfacut un test de egalitate& folosii funcia
prompt pentru a semnali#a utili#atorul.
(prompt "\nX equals 0.")
:. Sal"ai fi[ierul ca test,lsp `n directorul student.
0. Dnc\rcai fi[ierul `n AutoCAD.
5. 4olosii funcia test! cu "alorile argumentelor 6& * [i -*.
140
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Aceast\ pagin\ a fost l\sat\ liber\ `n mod intenionat.
141246430.doc R.2.1 4/22/2013 141
AUTODESK, INC.
*ucle de pro'ram
7uclele de program repre#int\ un concept important pentru
orice limbaj de programare. 7uclele permit instruciunilor
programului s\ fie e!ecutate de nenum\rate ori pe ba#a
"alorii unei espresii test.
Obiective
Dn acest capitol "ei studia,
Cum s\ folosii buclele pentru a repeta un set de
e!presii.
Sinta!a funciilor repeat [i "$ile.
'plicarea modului de func#ionare a buclelor
8 bucl\ se e!plic\ astfel,
C (estai o e!presie. Dac\ e!presia este ade"\rat\& atunci
e!ecutai un set de instruciuni ale programului& pe r`nd&
apoi testai e!presia din nou. Dac\ este tot ade"\rat\&
e!ecutai toate instruciunile programului apoi testai din
nou e!presia la infini.
A[a lucrea#\ funcia G$ile. 4uncia repeat e!ecut\ un set de
e!presii de un num\r de ori prestabilit.
Ca e!emplu s\ presupunem c\ a"em un set de e!presii pe
care "rem s\-l e!ecut\m de 1 ori. .ste mai `nelept s\ scriei
setul de e!presii o singur\ dat\ `n program [i s\ folosii unele
funcii care s\ cear\ AutoLISP-ului s\ repete e!presiile de 1
ori dec`t s\ scriei setul de e!presii de 1 ori.
Ca e!emplu ;si nu unul str\lucitH "om construi o funcie
simpl\ de num\rare folosind funcia repeat. 4uncia "a ad\uga
num\rul `ntreg * la "aloarea unei "ariabile ori de c`te ori
funcia este apelat\ [i apoi "a tip\ri "aloarea "ariabilei `n
#ona liniei de comand\.
142
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
/unc#ia repeat
4uncia repeat cere dou\ argumente [i un num\r oarecare de
argumente opionale.
Primul argument trebuie s\ fie un num\r `ntreg ;sau e"aluat
`ntr-un num\r `ntregH. Acesta spune funciei repeat de c`te
ori s\ e!ecute al doilea argument p`n\ la al n -lea
argument.
'emplu
Command: ($'%'at " (%$om%t ATnB'((oA!!
B'((o
B'((o
B'((on&(
nil de la sf`r[it este "aloarea returnat\ de funcia repeat.
'emplu
Introducei e!presiile care urmea#\.
.!presiile definesc funcia count.
Dn funcia count& dup\ ce "ariabila num este legat\ de 6&
"aloarea lui num este "i#uali#at\ pe monitor [i incrementat\
cu * p`n\ la un total de *6 ori.
Command: "de9%n co%nt "#
17 "set= n%& 0#
17 "re!eat 10 "!rint n%&# "set= n%& "1@ n%&###
17 "!rin1##
COUNT
4olosii funcia count. Aceasta "a introduce numerele de la 6
la 3 `n #ona liniei de comand\.
Command: "co%nt#
6
1
"
;
<
5
C
D
=
141246430.doc R.2.1 4/22/2013 143
AUTODESK, INC.
8 "ersiune ce"a mai interesant\ a funciei count "a W(.)/.
ultimele trei entitai desenate [i care s`nt "i#ibile pe
monitor.
'emplu
Dntr-un desen nou& desenai cel puin trei ;%H entit\i de
orice fel.
Introducei e!presiile care urmea#\.
Command: "de9%n co%nt "# "re!eat 3 "co&&and CeraseC ClC CC###
COUNT
4olosii funcia count pentru a [terge ultimele entit\i din
desen.
Command: "co%nt#
3ai multe despre intr\rile utili(atorului
4uncia initget poate reface "alorile permise pentru intrarea
utili#atorului `n timpul oric\rei apel\ri a funciilor de tip
/.(===& de e!emplu funciile getpoint [i getdist.
Apelai initget care are un num\r `ntreg ca argument [iJsau o
list\ de cu"inte c$eie acceptabile& imediat dup\ apelarea
unei funcii /.(===.
Acest e!emplu admite numai numere `ntregi cu e!cepia lui
6& ca r\spuns la getint.
(initget (+ 1 2 4))
(setq response (getint "\nEnter an integer: "))
4uncia get'Gord reface un cu"`nt c$eie de la utili#ator ba#at
pe un [ir de cu"inte c$eie stabilite de funcia initget.
Acest e!emplu permite utili#atorului s\ raspund\ cu M.S sau
<8 la cererea de comand\. -n r\spuns nul sau un return nu
s`nt admise.
(initget 1 "Yes No")
(getkword "\nContinue? Yes/No: ")
144
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 21- 6,C(ARE I8 *R.5RA/
Dn acest e!erciiu,
Eei consolida cuno[tinele despre bucle de
program.
Eei consolida cuno[tinele despre funcia cond.
Eei folosi funcia repeat pentru a e!ecuta un set de
s-e!presii de un num\r stabilit de ori.
Eei scrie o funcie care cere utili#atorului num\rul
de bucl\ri de program.
Eei folosi instruciunea cond `n cadrul buclei.
'tape de lucru
*. Dncepei un desen nou `n AutoCAD.
+. Desenai un Cerc cu centrul `n punctul 1&1 [I o ra#\ de o
unitate.
%. Dn editorul te!t& desc$idei fi[ierul numit displacelsp
din directorul student.
2. Creai funcia c,displace. 4olosii codul `n displacelsp ca
ba#\ pentru funcie.
1. DISPLAC. ar trebui s\ e!ecute urm\toarele,
S\ cear\ utili#atorului o incrementare a deplas\rii.
S\ cear\ utili#atorului de c`te ori s\ e!ecute
deplasarea.
S\ cear\ utili#atorului direcia de deplasare.
S\ repete codul care restabile[te ultima entitate
desenat\ [i care este "i#uali#at\ pe monitor [i s\ o
deplase#e cu un increment adec"at de un num\r
de ori.
continuare pe pagina urmatoare
141246430.doc R.2.1 4/22/2013 145
AUTODESK, INC.
;No null, zero or negative response allowed
(initget (+ 1 2 4))
(setq increment (getdist "\nIncrement for movement: "))
;No null, zero or negative response allowed
(initget (+ 1 2 4))
(setq number_of_times (getint "\nNumber of times to displace: "))
;No null response allowed, setup keywords for response
(initget 1 "Up Down Right Left")
(setq direction (getkword "\nUp/Down/Left/Right: "))
(repeat number of times (command MOVE (entlast) (list 0.0 0.0 0.0)
(cond ;match direction of movement...
((= direction "Up") ;based on keyword supplied by user
(command (list 0.0 increment))
)
((= direction "Down")
(command (list 0.0 (- 0.0 increment)))
)
((= direction "Right")
(command (list increment 0.0))
)
((= direction "Left")
(command (list (- 0.0 increment) 0.0))
)
)
(command "") ;second point of displacement...
;for MOVE command prompt
:. Sal"ai fi[ierul te!t.
0. Dnc\rcati fi[ierul `n AutoCAD.
5. Acti"ai comanda DISPLAC..
146
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
/unc#ia "$ile
4uncia repeat este cea mai simpl\ funcie de buclare util\
dac\ [tii e!act de c`te ori trebuie s\ repetai e"aluarea
grupului de e!presii anterioare intr\rii buclei.
(otu[i "ei `nt`lni oca#ii c`nd "ei dori s\ repetai ce"a de un
num\r nedefinit de ori? adic\ num\rul de repetiii nu poate fi
determinat `naintea intr\rii `n bucl\.
Dntr-un astfel de ca#& funcia G$ile "\ d\ posibilitatea s\
repetai un set de e!presii de c`te ori este necesar p`n\ ce
"aloarea unei e!presii test se sc$imb\.
'emplu
(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
! is less t$an *6P
print t$e "alue of !
add * to !
(set# $ 10)
(,-le
(* $ 10)
(prnt $)
(set# $ (+ 1 $))
)
initiali#e !
go bac' to test
M.S <8
Figuae ". Diagrama buclei 1unctiei C:ile
141246430.doc R.2.1 4/22/2013 147
AUTODESK, INC.
Pentru a ie[i dintr-o bucl\ G$ile& "aloarea e!presiei test
trebuie s\ fie egal\ cu nil. De aceea& dac\ e!presia test este
iniial t& "aloarea e!presiei test trebuie s\ se sc$imbe ca
re#ultat al unei atribuiri din cadrul corpului buclei.
)ecapitulare
@uclele repet\ un set de e!presii.
7uclele pot repeta de un num\r de ori prestabilit
sau p`n\ ce "aloarea e!presiei test este nil.
4uncia repeat repet\ un set de e!presii de un
num\r de ori stabilit.
4uncia "$ile repet\ un set de s-e!presii p`n\ ce
e!presia test este egal\ cu nil.
148
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 21- ,TI(I<AREA A,8CTIEI MNI(E *E8TR, 6,C(ARE I8 *R.5A/
Dn acest e!erciiu,
Eei consolida cuno[tinele despre buclele de
program din AutoLISP.
Eei modifica o funcie e!istent\ de la e!erciiul
anterior.
Eei crea un program care desenea#\ dreptung$iuri
multiple.
Eei folosi funcia G$ile.
'tape de lucru
*. Dn editorul de te!t& `nc\rcai fi[ierul rectanglelsp
+. Sal"ai fi[ierul ca mrectanglsp `n directorul student
%. 4acei modific\ri `n fi[ier.
2. 9odificai funcia c,rectangle pentru a cere utili#atorului s\
desene#e dreptung$iuri multiple `n timpul unei
singure sec"ene de funcionare.
1. Plasai corpul codului care cere colurile [i desenea#\
polilinia `n cadrul unei funcii G$ile.
:. -n r\spuns nul& adic\ un return la cererea Cfirst cornerC
"a termina funcia.
0. <umii noua funcie c,mrectangle pentru Cdreptung$iuri
multipleC.
5. Sal"ai fi[ierul.
3. Dnc\rcai fi[ierul `n AutoCAD.
*6.Acti"ai comanda 9).C(A</L..
141246430.doc R.2.1 4/22/2013 149
AUTODESK, INC.
+iruri [i tip\rirea lor
Dn AutoLISP& orice serie de caractere alfanumerice aflate
`ntre g$ilimele duble repre#int\ un [ir tet. Wirul poate
include caractere speciale cum ar fi K& A& & X [i .
Obiective
Dn acest capitol "ei studia,
Despre [irurile te!t [i "alorile lor
Cum s\ folosii caracterele de control `n [irurile te!t.
Cum s\ luai [iruri te!t de la utili#ator.
Cum s\ folosii comanda AutoCAD (.=( cu "ariabile
AutoLISP-ul legate la [iruri te!t.
Diferenele dintre cele [ase funcii de tip\rire `n
AutoLISP.
Cum s\ folosii funciile de tip\rire.
-alorile [irurilor tet
Wirurile te!t se e"aluea#\ pe sine& adic\ "aloarea unui [ir
te!t este [irul `n sine.
Command: HAT8&, &, a ,t$&n.A
AT8&, &, a ,t$&n..A
Command: (,'tI > AT8&, &, a ,t$&n..A!
AT8&, &, a ,t$&n..A
Command: H>
AT8&, &, a ,t$&n..A
Caractere de control
Caracterul C\C precede un caracter de control `n cadrul
unui [ir te!t. Caracterul care urmea#\ imediat are o
semnificaie special\.
Dn urm\torul tabel g\sii caracterele de control cunoscute
de asemenea [i ca +escape codes+ care s`nt recunoscute
`n cadrul [irurilor AutoLISP.
150
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Cod )e&ni9icatie
TT T )a$a)t'$
TA A )a$a)t'$
T' )a$a)t'$ ',)a%'
Tn )a$a)t'$ n'2(&n'
T$ )a$a)t'$ $'tu$n
Tt )a$a)t'$ ta*
Tnnn Ca$a)t'$ a( )a$u& )od o)ta( ',t' nnn
Tabelul . Caractere de control Dn Eiruri
/unc#ia getstring
4uncia getstring a[teapt\ ca utili#atorul s\ introduc\ un [ir
te!t. Are dou\ argumente opionale, suprim\ caracterul
spaiu ca [i return [i un [ir de la utili#ator.
Dac\ primul argument opional este furni#at [i acesta nu
este nil& atunci este posibil ca [irul s\ conin\ spaii? primul
spaiu din [ir este tratat ca CreturnC.
'emplu
Introducei e!presiile care urmea#\.
Legai "ariabila t!t de [irul te!t CsingleC.
Command: "set= t't "2etstrin2 COnEnter te't- C##
Ent'$ t'>t: sin2le
A,&n.('A
Command: $t't
A,&n.('A
Legai "ariabila t!t de [irul te!t `n care s-au introdus spaii.
Command: "set= t't "2etstrin2 T COnEnter te't- C##
Ent'$ t'>t: e&0edded s!aces
A'm*'dd'd ,%a)',A
Command: $t't
A'm*'dd'd ,%a)',A
141246430.doc R.2.1 4/22/2013 151
AUTODESK, INC.
-ariabila de sistem 6'A6'-AL
Dac\ "ariabila de sistem (.=(.EAL este mai mare dec`t 6&
putei r\spunde la o cerere de comand\ (.=( sau D(.=( cu o
"ariabil\ AutoLISP [i comanda "a tip\ri "aloarea asignat\
"ariabilei? dac\ nu& comanda "a tip\ri semnul e!clamarii [i
numele "ariabilei.
Comanda (.=( "a tip\ri `ntotdeauna "aloarea unei "ariabile
[ir atunci c`nd este apelat\ `n cadrul unei funcii AutoLISP
de tip command indiferent de setarea (.=(EAL.
Comanda D(.=( nu poate fi apelat\ de funcia AutoLISP de
tip command.
152
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'emplu
Dntr-un desen nou introducei e!presiile care urmea#\.
Prima comand\ (.=( "a tip\ri Lt!t*. A dou\ comand\ (.=( "a
tip\ri Second line. Ee#i figura *5-*.
Command: "set= t't1 CAirst line.C#
A#&$,t (&n'.A
Command: "set= t't2 C)econd line.C#
AS')ond (&n'.A
Command: te't
Uu,t&-/0St/('04Sta$t %o&nt7: 1,5
B'&.8t: 0.5
Rotat&on: 0
T'>t: $t't1
Command: "set3ar Cte'te3alC 1#
1
Command: te't
Uu,t&-/0St/('04Sta$t %o&nt7: Enter
T'>t: $t't2
Figura +1. entitati tip text
141246430.doc R.2.1 4/22/2013 153
AUTODESK, INC.
/unc#iile de tip\rire
.!ist\ [ase funcii de tip\rire `n AutoLISP. Cinci dintre ele
tip\resc [iruri te!t iar una tip\re[te caractere te!t. (rei dintre
aceste funcii tip\resc orice fel de e!presii indiferent dac\
acestea s`nt de tipul [ir te!t. 4uncia pentru caractere [i
patru dintre funciile de tip [ir pot tip\ri nu numai `ntr-un
fi[ier dar [i pe un monitor.
A%nctia Ar2%&ente ;escriere
%$&n1 Eexpr E1ile!descFF T&%a$',t' expr ,& $'tu$n'aJa expr. E>%and'aJa
)a$a)t'$'(' d' )ont$o(.
%$&n) Eexpr E1ile!descFF T&%a$',t' expr ,& $'tu$n'aJa expr. Nu '>%and'aJa
)a$a)t'$'(' d' )ont$o(
%$&nt Eexpr E1ile!descFF La -'( )a %$&n1, ,& &n %(u, t&%a$',t' un n'2(&n'
&na&nt' d' expr ,& un ,%at&u du%a expr.
%$om%t EmsgF T&%a$',t' msg %' d&,%(a/ ,& $'tu$n'aJa n&(.
2$&t'3)8a$ num E1ile!descF T&%a$',t' un )a$a)t'$ ASCII )on-o$m )u a$.um'ntu(
num %'nt$u )odu( J')&ma( ASCII ,& $'tu$n'aJa
numT$u(.
2$&t'3(&n' string E1ile!descF T&%a$',t' string -T$T Iuot', ,& $'tu$n'aJT string )u
Iuot',. A,'manato$ )u %$&n).
Table ". Functii de tiparire
Intrarea [i ie[irea `nJ[i dintr-un fi[ier inclu#`nd [i tip\rirea
`ntr-un fi[ier "or fi discutate mai t`r#iu `n acest curs.
4uncia prompt este folosit\ pentru tip\rirea mesajelor
destinate utili#atorului& pe afi[aj.
4uncia print tip\re[te e!presii `ntr-o manier\ compatibil\ cu
funcia load& `n timp ce funcia princ le tip\re[te `ntr-o
manier\ compatibil\ cu funcia read-line. Eei studia funcia
read-line `n capitolul destinat intr\rii [i ie[irii `ntr-un fi[ier
mai t`r#iu `n acest curs.
4unciile prin*& princ [i print accept\ orice e!presie ca
argument [i `i "a tip\ri "aloarea.
4unciile prompt [i Grite-line accept\ numai argumente de tip
[ir.
154
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
)ecapitulare
5irurile tet s`nt caractere alfanumerice aflate
`ntre g$ilimele duble.
Caracterele de control din cadrul unui [ir de tip
te!t `ncep cu un caracter CaC.
4uncia getstring primeste [iruri interacti" de la
utili#ator.
Eariabila de sistem (.=(.EAL demonstrea#\ cum
comanda AutoCAD (.=( "a tip\ri o "ariabil\
AutoLISP.
AutoLISP-ul dispune de o "arietate de funcii de
tip\rire pentru diferite `ntrebuin\ri.
141246430.doc R.2.1 4/22/2013 155
AUTODESK, INC.
E+ERCITI,( 22- )IR,RI ;E TE+T )I A,8CTII ;E TI*ARIRE
Dn acest e!erciiu,
Eei consolida cuno[tinele despre [iruri de tip te!t
[i funcii de tip\rire.
Eei obine dou\ [iruri te!t interacti" de la
utili#ator.
Eei folosi [irurile de tip te!t cu patru dintre
funciile de tip\rire.
'tape de lucru
*. Intoducei e!presiile care urmea#\.
+. Legai cinci "ariabile de la a la d de diferite tipuri de
date, num\r `ntreg& list\& [ir [i [ir care conine
caractere de control.
Command: "set= a 1#
Command:"set= 0 L"1.0 1.0 0.0##
Command: "set= c "2etstrin2 COn)trin2- C##
St$&n.: 'B
A>/JA
Command: "set= d "2etstrin2 COnAile na&e- C##
#&(' nam': Ost%dentO'.dP2
ATT,tud'ntTT>.d2.A
%. 4olosii "ariabilele ca argumente la diferite funcii de
tip\rire.
2. Scriei "alorile `n casuele corespun#atoare din tabelul
care urmea#\.
1aria0ila !rin1 !rinc !rint !ro&!t
a
*
)
d
Tabelul (. 3ariabile si 1unctii de tiparire
156
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Aceast\ pagin\ a fost l\sat\ liber\ in mod intenionat
141246430.doc R.2.1 4/22/2013 157
AUTODESK, INC.
Accesul la entit\]i
4iec\rei entit\i dintr-o sesiune de editare `i este atribuit
un nume de entitate de c\tre AutoCAD. <umele unei
entit\i este un identificator unic al fiec\rei entit\i
dintr-un desen. <umele unei entit\i se poate
sc$imba de la o sesiune de editare la alta& dar
fiecare nume de entitate este unic determinat\ `n
timpul unei sesiuni de editare.
Obiective
Dn acest capitol "ei studia,
Cum s\ folosii numele de entit\#i pentru a stabili [i
modifica entit\ile indi"iduale.
Cum s\ aflai numele ultimei entit\i ad\ugate la desen.
Cum s\ aflai numele primei entit\i ad\ugate la desen.
Cum se pot trece `n re"ist\ numele entit\ilor din desen.
Cum s\ creai noi comen#i AutoCAD care acionea#\ asupra
numelor de entit\i.
/unc#ii de acces la entit\#i
<umele de entit\i pot fi stabilite de AutoLISP [i entit\ile
la care se refer\ pot fi modificate de AutoLISP.
Dn acest capitol "ei folosi funciile de acces la entit\i
din AutoLISP pentru a lucra cu entit\i [i grupuri de
entit\i.
Aflai o entitate sau un grup de entit\i.
Acti"ai o entitate cu o comand\ AutoCAD.
.!aminai propriet\ile unei entit\i.
9odificai propriet\ile unei entit\i.
A%nctii de acces la
entitati
;escriere
'nt(a,t $'tu$n'aJa num'(' u(t&m'& 'nt&taV& adau.ata
&n *aJa d' dat'
'nt,'( $'tu$n'aJa (&,ta -o$mata d&n num'(' 'nt&taV&&
,& %un)tu( &n )a$' a -o,t ,'(')tata 'nt&tat'a
'ntn'>t $'tu$n'aJa %$&ma 'nt&tat' d&n *aJa d' dat'
'ntn'>t 'nam' $'tu$n'aJa num'(' 'nt&taV&& &n *aJa d' dat'
du%a a$.um'ntu( 'nam'
Tabelul &.Functii de acces a entitatilor
158
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Cum se afl\ numele ultimei entit\#i
Introducei comen#ile [i e!presiile care urmea#\.
Dntr-un desen nou creai o entitate Line.
Command: line
#$om %o&nt: 1,1
To %o&nt: 5,5
To %o&nt: Enter
4olosii funcia entlast pentru a stabili numele ultimei entit\i
ad\ugate la desen& adic\ entitatea Line. ;<um\rul din numele
entit\ii poate fi diferit pe computerul dumnea"oastraH.
Command: "entlast#
4Ent&t/ nam': 5666667
4uncia entlast stabile[te numele ultimei entit\i principale
ne[tears\ din desen.
Legai "ariabla numit\ ename de "aloarea returnat\ de funcia
entlast. Eerificai legarea lui ename.
Command: "set= ena&e "entlast##
4Ent&t/ nam': 5666667
Command: $ena&e
4Ent&t/ nam': 5666667
/olosirea numelui unei entit\#i intr-o comand\ AutoCA&
<umele entit\ilor pot fi folosite ca argumente la funcia de
tip command ori de c`te ori o comand\ AutoCAD cere un set
de selecie.
Dn acest e!emplu& numele entit\ii Line este furni#at ca
argument la comanda AutoCAD .)AS..Aceasta e!presie "a
[terge entitatea Line.
Command: ()ommand A'$a,'A 'nam' AA!
'emplu
Introducei e!presiile [i comen#ile care urmea#\. .!presia
AutoLISP "a [terge entitatea Line. Comanda - o "a restabili.
Command: "co&&and CeraseC ena&e CC#
n&(
141246430.doc R.2.1 4/22/2013 159
AUTODESK, INC.
Command: ,
GROUP
Aflarea numelui primei entit\#i
'emplu
Citii instruciunile [i tip\rii e!presiile cu caractere aldine.
Dn acelai desen& cu ajutorul entit\ii Line& creai o entitate
Circle.
Command: circle
"P0P0TTR04C'nt'$ %o&nt7: 5,5
D&am't'$04Rad&u,7: 1
1&1
*&*
Figura +.#ntitati tip linie si cerc
4olosii funcia entlast pentru a stabili numele ultimei entit\i
ad\ugat\ la desen& entitatea Circle. ;<um\rul din numele
entitaii poate fi diferit pe computerul d"s.H.
Command: "entlast#
4Ent&t/ nam': 566666D7
4uncia entlast stabile[te ultima entitate principal\ ne[tears\
din desen? `n acest ca# entitatea Circle.
4olosii funcia entne!t pentru a e!trage numele primei
entit\i din ba#a de date& adic\& entitatea Line.
160
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Legai o "ariabil\ numit\ entname de "aloarea returnat\ de
entne!t. Eerificai legarea lui ename.
Command: "set= ena&e "entne't##
4Ent&t/ nam': 5666667
Command: $ena&e
4Ent&t/ nam': 5666667
'emplu
Introducei e!presiile care urmea#\.
Aflai numele primei entit\i din desen& entitatea Linie.
Stergei-o. )estabilii-o cu comanda -.
Command: "set= ena&e "entne't##
4Ent&t/ nam': 5666667
Command: "co&&and CeraseC ena&e CC#
n&(
Command: ,
ERASE
Aflai numele ultimei entit\i din desen, entitatea Circle.
Deplasai-o cu o unitate `n directia = po#iti"\ din po#iia
iniial\.
Command: "set= ena&e "entlast##
4Ent&t/ nam': 566666D7
Command: "co&&and C&o3eC ena&e CC C1,0C CC#
n&(
141246430.doc R.2.1 4/22/2013 161
AUTODESK, INC.
1&1
*&*
Figura +". Situatia dupa miscarea cercului cu o unitate in directia 8 poziti-a
Aducei cercul `n po#iia iniial\.
Command: ,
@OLE
@aleierea ba(ei de date entitate cu entitate
4uncia entlast stabile[te numele ultimei entit\i din ba#a de
date. 4uncia entne!t stabile[te numele primei entit\i din
ba#a de date.
4uncia entne!t are un argument opional, numele unei
entit\i. Dn acest ca# funcia entne!t returnea#\ numele
entit\ii care urmea#\ dup\ argument `n ba#a de date.
Dac\ nu e!ist\ nici o entitate care se urme#e dup\ cea din
numele argumentului entitaii& entne!t returnea#\ nil.
De e!emplu acest set de e!presii "or returna numele celei
de a doua entit\i din ba#a de date.
Command: ('ntn'>t ('ntn'>t!!
4Ent&t/ nam': 566666D7
sau
Command: (,'tI 'nam'1 ('ntn'>t!!
4Ent&t/ nam': 5666667
Command: (,'tI 'nam' ('ntn'>t 'nam'1!!
4Ent&t/ nam': 566666D7
162
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
.!presia care urmea#\ ar [terge atunci a doua entitate din
ba#a de date.
Command: ()ommand A'$a,'A 'nam' AA!
Ar fi bine s\ se poat\ stabili numele tuturor entit\ilor din
ba#a de date& pe r`nd& pentru a le procesa una c`te una.
4uncia entne!t poate face acest lucru c`nd este plasat\
`ntr-o bucl\ G$ile `mpreun\ cu instruciunile de procesare
pentru entit\i.
)ecapitulare
4iecare entitate dintr-un desen are un nume unic
de entitate.
<umele entit\ilor nu se sc$imb\ niciodat\ `n timpul
unei sesiuni de editare grafic\& dar se pot
sc$imba pe parcursul sesiunilor de editare
grafic\.
AutoLISP dispune de funcii care returnea#\
numele entit\ii.
4uncia entlast returnea#\ numele ultimei entit\i
ad\ugat\ la desen.
4uncia entnet returnea#\ numele primei entit\i
ad\ugat\ la desen sau numele entit\ii care
urmea#\ dup\ argumentul opional.
Putei folosi entnet [i o bucl\ "$ile pentru a accesa
fiecare entitate din desen.
<umele entit\ilor pot fi folosite cu comen#i
AutoCAD.
141246430.doc R.2.1 4/22/2013 163
AUTODESK, INC.
E+ERCITI,( 23- ACCE)AREA 8,/E(.R ;E E8TITATI
Dn acest e!erciiu,
Eei aprofunda cuno[tinele despre accesarea
numelor de entit\i.
Eei crea o comanda 98E.ALL care afl\ numele
fiec\rei entit\i din ba#a de date& pe r`nd& [i
deplasea#\ fiecare entitate cu o unitate `n =
po#iti".
Eei folosi funciile entne!t [i G$ile.
Eei folosi numele entit\ilor [i comanda AutoCAD
98E..
'tape de lucru
*. 4olosii editorul de te!te pentru a sal"a urm\torul cod `n
fi[ierul numit mo$ealllsp.
(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
)
+. Desenai c`te"a entit\i `n desenul d"s.
%. Dnc\rcai fi[ierul mo$ealllsp.
2. Acti"ai comanda 98E.ALL.
1. -rm\rii deplasarea entit\ilor& c`te una pe r`nd.
Command: "load C&o3eallC#
C:@OLEALL
Command: &o3eall
164
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 24- )CA(AREA T,T,R.R E8TITATI(.R ACCE)ATE *RI8 8,/E
Dn acest e!erciiu,
Eei aprofunda cuno[tinele despre accesarea
numelor de entit\i.
Eei modifica funcia de la e!erciiul +2.
Eei folosi funciile entne!t [i G$ile.
Eei crea o comand\ care scalea#\ fiecare entitate
din desen.
Eei tip\ri num\rul de entitai scalate folosind un
contor `n cadrul unei bucle.
Aceste e!presii "or tip\ri [irul Scaling entit> *. `n #ona
liniei de comand\.
(setq counter 1)
(prompt (strcat "\nScaling entity " (itoa counter) "."))
'tape de lucru
*. Desc$idei fi[ierul te!t mo$ealllsp.
+. Sal"ai te!tul `ntr-un nou fi[ier numit scalealllsp.
%. 4olosii codul din funcia c,mo"eall.lsp.
2. 9odificai c,mo"eall.
<umii noua funcie c,scaleall.
Scalai fiecare entitate cu un factor ;6.1H relati" fa\
de punctul origine 6&6.
Ad\ugai codul care tip\re[te `n #ona liniei de
comand\ num\rul de entit\i modificate.
Command: ,)a('a((
S)a(&n. 'nt&t/ 1.
S)a(&n. 'nt&t/ .
S)a(&n. 'nt&t/ ".
1. Dnc\rcai fi[ierul scalealllsp.
:. Acti"ai comanda SCAL.ALL.
141246430.doc R.2.1 4/22/2013 165
AUTODESK, INC.
Liste asociate entit\]ilor
Putei folosi numele unei entit\i pentru a e!trage toate
elementele unei entit\i. Dn AutoLISP un astfel de document
este repre#entat print-o list\ asociat\. Listele asociate
cuprind subliste ale listelor obi[nuite sau perec$i cu
punct.
Obiective
Dn acest capitol "ei studia,
4ormatul unei perec$i cu punct sau cum s\ creai
o astfel de perec$e.
4ormatul unei liste asociate.
Cum s\ e!tragei o list\ asociat\ unei entit\i.
Cum s\ e!aminai o lista asociat\.
Cum s\ determinai tipul entit\ii din lista asociat\.
Perec$i cu punct
8 perec$e cu punct este o form\ special\ a unei liste. 8
perec$e 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 perec$ile cu punct s`nt folosite `n
listele asociate entit\ilor pentru a repre#enta grupul de
coduri D=4 [i "alorile asociate acestora.
Perec$ile cu punct conin `ntotdeauna dou\ elemente.
Primul element al unei perec$i cu punct poate fi stabilit la
fel ca [i primul element al unei liste obi[nuite, cu funcia car.
Al doilea element al perec$ii cu punct poate fi stabilit direct
cu funcia cdr [i acest lucru difer\ de modul `n care se
stabile[te al doilea element dintr-o list\ obi[nuit\.
'emplu
Perec$ea cu punct care conine cele dou\ elemente 6 [i
CLineC arat\ astfel.
(0 " ./0N1.)
Ilustraia care urmea#\ pre#int\ arborii binari pentru dou\
obiecte similare, o list\ [i o perec$e cu punct& ambele
conin`nd acelea[i elemente.
166
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
(6 ALINEA!
6 (ALINEA!
ALINEA (!
(6 . ALINEA!
6 ALINEA
car cdr car cdr
car cdr
Figura ++. Arbori binari pentru lista obisnuita si perec:e cu punct a-ind elemente
identice.
/unc#ia cons
4uncia cons cere dou\ argumente obligatorii, o "aloare care
se adaug\ [i o "aloare la care se adaug\.
Dac\ "aloarea care se adaug\ este un atom& atunci funcia
cons returnea#\ o perec$e cu punct a celor dou\ elemente.
Dac\ "aloarea la care se adaug\ este o lista& atunci funcia
cons returnea#\ lista cu primul argument ad\ugat `n capul
listei.
'emplu
Introducei e!presiile care urmea#\.
4ormai o list\ obi[nuit\ din elementele 0 [i ./ne."
Command: (,'tI >(&,t ((&,t 6 ALINEA!!
(6 ALINEA!
4ormai o perec$e cu punct din elementele 0 [i ./ne."
Command: "set= 'dot "cons 0 C(I8EC##
(6 . ALINEA!
.!tragei primul element din list\ [i din perec$ea punct cu
car.
Command: "car 'list#
6
141246430.doc R.2.1 4/22/2013 167
AUTODESK, INC.
Command: "car 'dot#
6
.!tragei cel de-al doilea element din lista normal\ cu car [i
cdr.
Command: "car "cdr 'list##
ALINEA
.!tragei cel de-al doilea element din list\ [i din perec$ea
punct cu car.
Command: "cdr 'dot#
ALINEA
'ntit\#i `nregistrate `n ba(a de date [i liste asociate
9odul `n care AutoLISP-ul repre#int\ o entitate `nregistrat\
`n ba#a de date pentru o entitate desenat\ de tip Line de la
*&* la 1&1 pe La>erul 6 este pre#entat `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)
)
.ntitatea `nregistrat\ `n ba#a de date este p\strat\ sub
forma unei liste asociate%
8 list\ asociat\ este o list\ de liste.
Primul element al fiec\rei subliste este tipul acelei liste.
Celelalte elemente repre#int\ datele asociate cu codul.
De e!emplu& 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 ca#& o entitate Line.
Semnificaia codurilor 2,10 [i 11 si datele lor s`nt u[or de
imaginat ce repre#int\.
Datele codului 210 s`nt repre#entate de sensul po#iti" al
a!ei 3 din sistemul de coordonate care conine entitatea.
3emorarea si etragerea formatelor
Prin con"enie& datele dintr-o list\ asociat\ entit\ii pot fi
e!trase prin scoaterea cdr-ului unei subliste. Pentru
aceasta& AutoLISP-ul folose[te perec$i cu punct `n ca#ul
sublistelor cu dou\ elemente [i forme normale de liste `n
ca#ul sublistelor cu mai mult de dou\ elemente.
168
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
De e!emplu& aceste e!presii returnea#\ La>erul entit\ii
Line [i punctul de start.
Command: ()d$ S(D . A6A!!
A6A
Command: ()d$ S(16 1.6 1.6 6.6!!
(1.6 1.6 6.6!
Coduri de 4rup &A/
Codul fiec\rei subliste dintr-o list\ asociat\ unei entit\i
corespunde unui cod de grup D=4. Documentaia despre
aceste coduri e!ist\ `n AutoCA! Release -. AutoLISP
Programmer%s Reference Manual& Appendi! 7.
.!ist\ mici diferene `ntre codurile de grup dintr-un fi[ier
D=4 [i codurile de grup returnate `ntr-o list\ asociat\ unei
entit\i. Dn ane!a din AutoLISP Programmer%s Reference
Manual g\sii lista corect\ a codurilor de grup pentru liste
asociate entit\ilor.
Acestea s`nt codurile listelor asociate entit\ilor ;sau coduri
de grup D=4H pentru entitatea Line.
Cod de 2ro%! )e&ni9icatie
31 Num'(' 'nt&tat&&
6 T&%u( (L&n', C&$)(', A$), 't).!
D La/'$
16 Pun)t d' ,ta$t
11 Pun)t -&na(
16 D&$')t&a %oJ&t&Ka a a>'& Z d'
'>t$uJ&un'
Tabelul .. Coduri de grup D8F si proprietatile entitaFilor
141246430.doc R.2.1 4/22/2013 169
AUTODESK, INC.
'tragerea unei entit\#i din ba(a de date cu func#ia entget
4uncia entget cere un singur argument, numele unei
entit\i. 4uncia "a returna `nregistrarea entit\ii sub forma
unei liste asociate.
'emplu
Dncepei un desen nou [i desenai o linie de la *&* la 1&1?
tip\rii e!presiile care urmea#\.
Command: "set= ena&e "entne't##
4Ent&t/ nam': >>>>>>>>7
Command: "set= elist "ent2et ena&e##
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 1.6 1.6 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Command: $elist
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 1.6 1.6 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
'tragerea datelor dintr-o list\ asociat\
4uncia assoc cere dou\ argumente, "aloarea unui cod [i o
list\ asociat\. Dac\ funcia g\se[te o perec$e pentru cod `n
lista asociat\& atunci returnea#\ sublista corespun#atoare?
dac\ nu& returnea#\ nl.
Presupunei c\ "ariabila elist este legat\ de lista asociat\ `n
ca#ul entit\ii Line.
Command: (,'tI '(&,t ('nt.'t ('ntn'>t!!!
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 1.6 1.6 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Command: H'(&,t
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 1.6 1.6 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Aceast\ e!presie "a returna sublista care descrie la>erul
entit\ii.
Command: (a,,o) D '(&,t!
(D . A6A!
Dn aceast\ e!presie& apel\m cdr care returnea#\ la>erul
entit\ii.
Command: ()d$ (a,,o) D '(&,t!!
A6A
170
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'emplu
Introducei e!presiile care urmea#\.
Asigurai-"\ c\ "ariabila elist este legat\ de lista asociat\ `n
ca#ul entit\ii Line.
Command: "set= ena&e "entne't##
4Ent&t/ nam': >>>>>>>>7
Command: $ena&e
4Ent&t/ nam': >>>>>>>>7
Command: "set= elist "ent2et ena&e##
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 1.6 1.6 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Command: $elist
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 1.6 1.6 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
.!tragei tipul entit\ii& La>erul [i punctul de start al
sublistei din lista asociat\.
Command: "assoc 0 elist#
(6 . ALINEA!
Command: "assoc 8 elist#
(D . A6A!
Command: "assoc 10 elist#
(16 1.6 1.6 6.6!
Apelai cdr pentru a e!trage tipul entit\ii& La>erul [i punctul
de start din subliste.
Command: "cdr "assoc 0 elist##
ALINEA
Command: "cdr "assoc 8 elist##
A6A
Command: "cdr "assoc 10 elist##
(1.6 1.6 6.6!
141246430.doc R.2.1 4/22/2013 171
AUTODESK, INC.
)ecapitulare
Perec$ile cu punct au dou\ elemente [i s`nt
forme speciale de liste.
Al doilea element al perec$ii cu punct este returnat
de cdr.
Perec$ile cu punct s`nt folosite ca liste obi[nuite `n
listele asociate entit\ilor.
.ntit\ile `nregistrate `n ba#a de date s`nt
repre#entate `n AutoLISP sub forma de liste
asociate.
8 lista asociat\ este o list\ de liste.
4iecare sublist\ dintr-o list\ asociat\ are dou\ p\ri,
car [i cdr.
Partea car a unei liste asociate entit\ii este un cod
de grup D=4 care desemnea#\ o proprietate a
entit\ii car este de asemenea denumit codul
sublistei.
Partea cdr a unei liste asociate entit\ii repre#int\
"aloarea codului de grup D=4.
4uncia assoc returnea#\ o sublista prin c\utarea
unui cod.
172
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 25- ,TI(I<AREA (I)TE(.R A).CIATE E8TITAT(.R
Dn acest e!erciiu ,
Eei consolida cuno[tinele despre listele asociate
entit\ilor.
Eei folosi funcia entget.
Eei modifica funcia de la e!erciiul +1.
Eei crea o funcie care scalea#\ numai entit\ile de
tip Line din desen.
'tape de lucru
*. Desc$idei fi[ierul te!t scalealllsp.
+. Sal"ai te!tul `ntr-un nou fi[ier sclinelsp.
%. Sc$imbai numele funciei din c,scaleall `n c,scline.
2. 9odificai funcia ca s\ scale#e numai entit\ile de tip
Line din desen.
1. Sal"ai fi[ierul.
:. Desenai c`te"a tipuri de entit\i `n desen,.Lines&
Circles and Arcs.
0. Inc\rcai fi[ierul sclinelsp [i acti"ai comanda SCLI<..
<umai entit\ile de tip Line "or fi scalate cu aceasta
comand\.
141246430.doc R.2.1 4/22/2013 173
AUTODESK, INC.
C,SCAL'ALL
(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,SCLI*'
(defun c:scline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(if ;if it's a Line...
(=
"LINE"
(cdr (assoc 0 (entget ename)))
)
(progn
(command "._SCALE" ename "" "0,0" "0.5");scale it and...
(prompt ;tell user which one
(strcat
"\nScaling entity "
(itoa counter)
".\n"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)
174
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Aceast\ pagin\ a fost l\sat\ liber\ `n mod intenionat.
141246430.doc R.2.1 4/22/2013 175
AUTODESK, INC.
,odi(icarea unei entit\]i
9odificarea unei entit\i cu AutoLISP-ul are loc `n dou\
etape.
9odificai lista asociat\ unei entit\i cu funcia subst.
Actuali#ai entitatea prin aplicarea funciei entmod
la noua list\ asociat\.
Obiective
Dn acest capitol "ei studia,
Cum s\ modificai o list\ asociat\ unei entit\i.
Cum s\ actuali#ai `nregistrarea unei entit\i `ntr-
un desen pe ba#a sc$imb\rilor din lista asociat\.
Substituirea valorilor intr-o list\ asociat\
4uncia subst `nlocuie[te un element dintr-o list\. 4uncia
cere trei argumente, "aloarea de substituire& "aloarea de
substituit `ntr-o list\ [i o list\ care conine "aloarea de
substituit.
Putei folosi funcia subst pentru a `nlocui o "aloare `ntr-o
list\ asociat\ unei entit\i.
Iat\ un e!emplu care ilustrea#\ modul cum funcionea#\
funcia subst. Eom `nlocui num\rul *1 cu num\rul *: `n lista
noastr\ de p\trate de numere `ntregi.
Command: (,'tI m/(&,t ((&,t ; = 1<!!
(; = 1<!
Command: Hm/(&,t
(; = 1<!
Command: (,u*,t 15 1< m/(&,t!
(; = 15!
Command: Hm/(&,t
(; = 1<!
Deoarece funcia subst este non-destructi"\& ea nu "a afecta
legarea "ariabilei m>list. Dn acest e!emplu funcia setO este
ad\ugat\ e!presiei pentru a sc$imba legarea.
Command: (,'tI m/(&,t (,u*,t 15 1< m/(&,t!!
(; = 15!
Command: Hm/(&,t
(; = 15!
176
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'emplu
Introducei comen#ile [i e!presiile care urmea#\.
Dntr-un desen nou& desenai o entitate Line de la *&* la 1&1.
Command: line
#$om %o&nt: 1,1
To %o&nt: 5,5
To %o&nt: Enter
4olosii funcia subst pentru a sc$imba punctul de start al
listei asociate entit\ii Line.
.!tragei sublista pentru punctul de start [i p\strai-o sub
forma unei "ariabile.
Command: "set= ena&e "entne't##
4Ent&t/ nam': >>>>>>>>7!
Command: "set= elist "ent2et ena&e##
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 1.6 1.6 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Command: "set= oldGstart "assoc 10 elist##
(16 1.6 1.6 6.6!
Dnlocuii "ec$iul punct de start cu unul nou de 0.1&+.1&6 [i
sc$imbai legarea "ariabilei elist.
Command: "set= nePGstart "list 10 7.5 2.5 0.0##
(16 C.< .< 6.6!
Command: "set= elist "s%0st nePGstart oldGstart elist##
( (31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 C.< .< 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Command: "assoc 10 elist#
(16 C.< .< 6.6!
141246430.doc R.2.1 4/22/2013 177
AUTODESK, INC.
Actuali(area unei entit\#i
4uncia entmod modific\ propriet\ile unei entit\i cer`nd
AutoCAD-ului s\ actuali#e#e entitatea pe ba#a modific\rilor
f\cute `n lista asociat\ entit\ii.
4uncia entmod solicit\ un singur argument , o list\ "alabil\
asociat\ entit\ii.
'emplu
4olosii funcia entmod pentru a aplica modific\rile la
entitatea Line pe ba#a modific\rilor f\cute `n copia listei
asociate.
Introducei e!presiile care urmea#\.
Command: $elist
((31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 C.< .< 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Command: "ent&od elist#
((31 . 4Ent&t/ nam': >>>>>>>>7! (6 . ALINEA! (D . A6A! (16 C.< .< 6.6! (11
<.6 <.6 6.6! (16 6.6 6.6 1.6!!
Punctul de start al entit\ii Line ar trebui s\ se deplase#e de
la *.6& *.6& 6.6 la 0.1& +.1& 6.6.
*&*&6
1&1&6
1&1&6
0.1&+.1&6
Figura +(. Linie inainte si dupa apelarea 1unctiei entmod.
)ecapitulare
8 sublist\ dintr-o list\ asociat\ poate fi `nlocuit\ cu
funcia subst.
4uncia entmod "a actuali#a `nregistrarea unei
entit\i `n ba#a de date pe ba#a modific\rilor din
lista asociat\.
178
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 26- ACT,A(I<AREA I8RE5I)TRARII ,8EI E8TITATI
Dn acest e!erciiu,
Eei aprofunda cuno[tinele despre modificarea
entitailor [i despre listele asociate.
Eei folosi funcia entmod.
Eei modifica funcia de la e!erciiul +:.
Eei modifica listele asociate tuturor entit\ilor
Line.
Eei actuali#a `nregistrarea entit\ilor acestora.
'tape de lucru
Desc$ideti fi[ierul te!t sclinelsp.
Sal"ai te!tul `ntr-un fi[ier nou numit modlinelsp.
Sc$imbai numele funciei din c,scline `n c,modline.
9odificai funcia.
Dac\ entitatea este de tip Line& modificai-i punctul
de cap\t din "aloarea curent\ `n punctul 1.6&
1.6& 6.6.
Sal"ai fi[ierul.
Dntr-un desen nou& desenai c`te"a linii [i cercuri
`n diferite po#iii.
Dnc\rcai fi[ierul modlinelsp
Acti"ai comanda 98DLI<..
141246430.doc R.2.1 4/22/2013 179
AUTODESK, INC.
C,SCLI*'
(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,3O&LI*'
(defun c:modline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(setq elist (entget ename)) ;get its assoc list
(if ;if it's a Line...
(= "LINE" (cdr (assoc 0 elist)))
(progn
(entmod ;change its end point
(subst '(11 5.0 5.0 0.0) (assoc 11 elist) elist)
)
(prompt ;tell user which one
(strcat
"\nModifying entity "
(itoa counter)
".\n"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
180
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
)
(prin1) ;quiet exit
)
141246430.doc R.2.1 4/22/2013 181
AUTODESK, INC.
E+ERCITI,( 27- ACT,A(I<AREA T,T,R.R E8TITATI(.R H;I/E8)I.8D I8TR4,8 ;E)E8
Acesta este un e!erciiu opional.
Dn acest e!erciiu,
Eei aprofunda cuno[tinele despre modificarea
entit\ilor [i listele asociate.
Eei scrie o funcie care s\ modifice toate entitaile
de tip Dimmension din desen.
'tape de lucru
*. Desc$idei fi[ierul grafic moddimd/g `n directorul
student.
Figure (. Desenul moddim.dCg.
+. Dimensiunile din acest desen au fost amplasate pe
c`te"a ni"ele diferite. Sarcina d"s. este s\ scriei un
program AutoLISP care s\ caute toate entit\ile
Dimension din acest desen [i s\ le amplasai pe ni"elul
DI9.
%. 4i[ierul program AutpLISP moddimlsp din directorul
student conine sc$ia programului. Desc$idei acest
fi[ier cu editorul de te!t [i ad\ugai codul necesar pentru
a completa programul.
182
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Selectarea numelui unei entit\]i prin selec]ie
'ra(ic\ cu cursorul
-n program AutoLISP poate e!trage numele unei entit\i
cer`nd utili#atorului s\ selecte#e o entitate.
Obiective
Dn acest capitol "ei studia,
Cum s\ e!tragei numele unei entit\i interacti" cu
utili#atorul.
Cum s\ folosii funcia entsel.
Cum s\ deplasai centrul cercului selectat de
utili#ator.
/unc#ia entsel
4uncia entsel "\ cere s\ selectai un singur obiect. 4uncia
returnea#\ o list\ cu dou\ obiecte, numele entit\ii [i punctul
`n care a fost selectat? dac\ nu se selectea#\ nimic atunci
funcia returnea#\ nil.
Putei e!trage numele entit\ii din lista returnat\ de funcia
entsel cu ajutorul funciei car.
'emplu
Introducei e!presiile care urmea#\.
Dntr-un desen nou & desenai o linie [i un cerc.
Command: line
#$om %o&nt: 1,1
To %o&nt: 5,5
To %o&nt: Enter
Command: circle
"P0P0TTR04C'nt'$ %o&nt7: 5,5
D&am't'$04Rad&u,7: 1
Selectai cercul `n punctul 1&:&6 ca r\spuns la cererea
funciei entsel [i legai "aloarea returnat\ de "ariabila epic'.
Command: "set= e!ic: "entsel##
S'(')t o*+')t: !ic: circle at 5,6,0
(4Ent&t/ nam': >>>>>>>>7 (<.6 5.6 6.6!!
Command: $e!ic:
(4Ent&t/ nam': >>>>>>>>7 (<.6 5.6 6.6!!
141246430.doc R.2.1 4/22/2013 183
AUTODESK, INC.
.!tragei numele entit\ii din lista returnat\ de funcia entsel
[i p\strai-l `n "ariabila ename.
Command: "set= ena&e "car e!ic:##
4Ent&t/ nam': >>>>>>>>7
Command: $ena&e
4Ent&t/ nam': >>>>>>>>7
Wtergei entitatea Circle.
Command: "co&&and C.GeraseC ena&e CC#
)ecapitulare
4uncia entsel e!trage o list\ a propriet\ilor unui
obiect selectat de utili#ator, numele entit\ii [i
punctul `n care a fost selectat.
Partea car a unei liste selectate de entsel repre#int\
numele unei entit\#i%
184
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 28- )E(ECTAREA )I /.;IAICAREA ,8,I CERC
Dn acest e!erciiu,
Eei consolida cuno[tinele despre selecia
interacti"\ a entit\ilor.
Eei crea un program care cere utili#atorului s\
selecte#e o entitate Circle [i un nou punct de
centru care deplasea#\ centrul cercului
'tape de lucru
*. Dn editorul de te!te& desc$idei fi[ierul te!t numit
circenlsp din directorul student.
+. Ad\ugai codul care face urmatoarele,
Define[te funcia c,circen.
Cere utili#atorului o entitate cu funcia entsel.
Dac\ utili#atorul selectea#\ o entitate& codul trimite
lista asociat\ entit\ii ca argument la funcia
circenTmod.
%. Sal"ai fi[ierul.
2. Dnc\rcai programul `n AutoCAD.
1. Eerificai comanda CI)C.< `ntr-un desen care conine
cel puin un cerc.
(defun circen_mod (elist)
(if
(/= "CIRCLE" (cdr (assoc 0 elist))) ;is it a circle?
(prompt "\nNot a circle.") ;if not, exit
(progn
(setq old_cen (cdr (assoc 10 elist))) ;get current center
(initget 1) ;no null reponse...
;for getpoint
;get new center
(setq new_cen (getpoint old_cen "\nCenter point: "))
(entmod ;modify the circle
(subst (cons 10 new_cen) (assoc 10 elist) elist)
)
)
)
)
141246430.doc R.2.1 4/22/2013 185
AUTODESK, INC.
E+ERCITI,( 29- *R.6(E/E .*TI.8A(E ;E ACCE) (A E8TITATI
Acestea s`nt e!erciii opionale pe care le putei completa
`n clas\ sau `n afara clasei.
Scriei un set de definiii de funcii.
c,movelast
Deplasai ultima entitate `n ba#a de date.
Cerei operatorului punctul de ba#\ [i al doilea
punct al deplas\rii..
c,printent
Selectai fiecare entitate din desen& una dup\ alta.
(ip\rii fiecare tip [i la>er ale entit\ii `n #ona liniei
de comand\.
c,red
Cerei operatorului s\ selecte#e o entitate.
Sc$imbai culoarea entit\ii `n ).D ;repre#entat\
`ntr-o list\ asociat\ de codul de grup :+ [i
num\rul `ntreg *H.
8bser"ai c\ putei ad\uga o nou\ sublist\ la lista
asociat\ `n loc s\ `nlocui#i o list\ e!istent\
folosind funcia entmod. 8 sublist\ de grup :+ nu
este pre#ent\ `ntr-o list\ asociat\ unei entit\i
dac\ culoarea entit\ii este 7MLAM.).
c,c$gla2er
Cerei operatorului s\ selecte#e o entitate.
Cerei operatorului numele unui ni"el.
Sc$imbai ni"elul entit\ii.
186
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
"ratarea erorilor
AutoLISP dispune de o metod\ pentru tratarea erorilor de
program [i de utili#are.
Obiective
Dn acest capitol "ei studia,
Cum s\ folosii funciile e!it [i Ouit pentru a fora o
eroare AutoLISP.
Cum s\ `nlocuii rutina implicit\ AutoLISP de tratare
a erorilor.
Cum s\ utili#ai rutina de tratare a erorilor pentru
Ca [tergeC un program dup\ ce a fost abortat din
cau#a unei erori sau pentru c\ utili#atorul a
anulat programul.
Cum s\ folosii comanda -<D8 `n rutina de tratare
a erorilor.
/or#area unei erori
4unciile e!it [i Ouit reali#ea#\ aceea[i operaie& f\r\
argumente.
4unciile e!it [i Ouit forea#\ aplicaia curent\ s\ se termine
prin forarea unei erori AutoLISP. .le returnea#\ [irul
COuitJe!it abortC [i transfer\ [irul funciei de tratare a
erorilor KerrorK. Dup\ e!ecutarea funciei de tratare a
erorilor& AutoCAD-ul se `ntoarce la linia de comand\.
8 aplicaie poate folosi funciile e!it [i Ouit `n combinaie cu
o funcie de tratare a erorilor definit\ de utili#ator pentru a
opri propria-i e!ecuie& pentru a reface orice "alori necesare
`n AutoCAD [i pentru a pre#enta utili#atorului un mesaj
adec"at.
/unc#ia BerrorB
Putei fi siguri c\ po#iionarea unei "ariabile de sistem sau o
anumit\ condiie AutoCAD pot fi restabilite dup\ apariia
unei erori nea[teptate folosind funcia KerrorK. Dn cadrul
acestei funcii care poate fi definit\ de utili#ator putei
e"alua condiiile de eroare& putei returna un mesaj adec"at
utili#atorului [i puteti restabili setarea "ariabilelor AutoCAD.
Parcurgei aceste etape pentru a implementa o subrutin\ de
tratare a erorilor definit\ de utili#ator pentru o comand\.
Sal"ai definiia curent\ a funciei KerrorK.
141246430.doc R.2.1 4/22/2013 187
AUTODESK, INC.
Definii o nou\ funcie KerrorK pentru comand\ sau funcie.
)edefinii subrutina "ec$e de tratare a erorilor prin
comanda e!it sau prin e!it dintr-o nou\ subrutin\ de tratare a
erorilor.
)edefinirea rutinei de tratare a erorilor ar trebui f\cut\ `n
conte!tul unei comen#i sau a unei funcii? plasai codul
pentru a defini o rutin\ de tratare a erorilor `n cadrul
codului pentru comand\.
188
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
.!emplu
Acest cod implementea#\ 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 "edei& AutoLISP-ul "\ permite s\ definii o funcie
;adic\ s\ apelai funcia defunH `n timpul e!ecut\rii unei
comen#i sau funcii definite de utili#ator. Deci rutina de
tratare a erorilor pentru funcia c,rectangle este definit\ de
`ndat\ ce utili#atorul apelea#\ comanda ).C(A</L. dar nu
`nainte de asta. )utina AutoLISP& implicit\ de tratare a
erorilor este refacut\ `n toate ca#urile, c`nd comanda
ajunge s\ fie `ndeplinit\ cu succes sau la cap\tul rutinei de
tratare a erorilor cu comanda specific\.
Aceast\ te$nic\ "\ permite s\ adaptai rutina AutoLISP de
tratare a erorilor pentru orice situaie.
)utina noastr\ de tratare a erorilor cu comand\ specific\
reface po#iionarea original\ a "ariabilei de sistem C9D.CB8
141246430.doc R.2.1 4/22/2013 189
AUTODESK, INC.
`n ca#ul `n care Comanda ).C(A</L. `nt`lne[te o eroare `n
timpul e!ecuiei. Eariabila definit\ de utili#ator oldTemdec$o
a fost facut\ global a[a `nc`t "aloarea ei este accesibil\ noii
funcii KerrorK.
190
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,( 30- ;EAI8IREA )I ,TI(I<AREA ,8EI 8.I ),6R,TI8E ;E TRATARE A ER.RI(.R
Dn acest e!erciiu,
Eei aprofunda cuno[tinele despre modul cum se
folose[te o rutin\ de tratare a erorilor.
Eei modifica funcia de la e!erciiul +3.
'tape de lucru
*. Ad\ugai o rutin\ de tratare a erorilor pentru comanda
CI)C.< `n fi[ierul circenlsp
+. 4olosii e!emplul de la c,rectangle ca o ba#\ de la care s\
pornii.
%. Dnc\rcai programul `n AutoCAD.
2. Acti"ai comanda CI)C.< [i anulai-o cu Ctrl-C pentru a
"erifica rutina de tratare a erorilor.
141246430.doc R.2.1 4/22/2013 191
AUTODESK, INC.
.*&O [i tratarea erorilor
Pentru a permite utili#atorului s\ anule#e `ntr-o singur\
etap\ re#ultatul unei comen#i pe ba#\ de AutoLISP&
amplasai un -<D8 9A)Y la `nceputul rutinei.
Putei folosi rutina de tratare a erorilor pentru a anula
automat re#ultatele unei comen#i pe ba#\ de AutoLISP p`n\
la punctul unde a inter"enit eroarea& admiind faptul ca
-<D8 C8<()8L este setat pentru 8<. sau ALL.
Eariabilele de sistem -<D8C()L [i -<D89A)YS pot fi
e!aminate de un program AutoLISP pentru a determina ce
aciune de anulare& dac\ e!ist\ "reouna& este adec"at\
pentru sesiunea curent\ AutoCAD.
'emplu
Aceast\ definiie a comen#ii ).C(A</L. permite utili#atorului
s\ anule#e re#ultatele comen#ii `ntr-o singur\ etap\.
Instruciunea if testea#\ dac\ -<D8 este acti"at\. Dac\ da&
atunci d\ o comand\ -<D8 9A)Y la `nceputul rutinei.
Dup\ ce utili#atorul introduce o comand\ ).C(A</L.&
utili#atorul poate anula re#ultatul comen#ii cu comen#ile -
sau -<D8 7ACY.
(defun c:rectangle (/ pt1 pt2)
(setq old_cmdecho (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(if
(= 1 (logand 1 (getvar "UNDOCTL")))
(command "._UNDO" "_MARK")
)
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command "._PLINE"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"_C"
)
(setvar "CMDECHO" old_cmdecho)
(prin1)
)
192
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
'emplu
.!tindem codul -<D8 pentru a include rutina de tratare a
erorilor. Dac\ rutina este anulat\ dintr-un moti" oarecare [i
-<D8 este disponibil& re#ultatul comen#ii p`n\ la punctul de
eroare este anulat automat. Se setea#\ o "ariabila de
condiie pentru a fi e!aminat\ `n rutina de tratare a
erorilor. -n -<D8 /)8-P este acti"at `n comand\ [i corelat
cu un -<D8 .<D.
<8(A 4i[ierul ai0utilslsp1 $ersiunea -. din directorul
support conine c`te"a rutine pentru folosirea codului -<D8
`ntr-un program AutoLISP.
continuare pe pagina urmatoare
141246430.doc R.2.1 4/22/2013 193
AUTODESK, INC.
(defun c:rectangle (/ pt1 pt2)
(setq old_cmdecho (getvar "CMDECHO")) ;store orignal command echo
(setvar "CMDECHO" 0) ;turn off command echo
(setq old_error *error*) ;save default error handler
(defun *error* (msg) ;define new error handler
(command) ;cancel any command `n progress
(if
rect_undo_flag ;if the undo flag is t...
(progn
(command "._UNDO" "_END") ;end the group...
(command "._U") ;undo the command...
(setq rect_undo_flag nil) ;and clear the flag
)
)
(setvar "CMDECHO" old_cmdecho) ;restore system variable
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
(princ) ;deliberately aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)
(if
(= 1 (logand 1 (getvar "UNDOCTL")));if UNDO is on...
(progn
(command "._UNDO" "_GROUP") ;start an UNDO GROUP...
(setq rect_undo_flag t) ;and set a flag
)
(setq rect_undo_flag nil) ;else, clear the flag
)
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command "pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(if
rect_undo_flag ;if the flag is set...
(progn
(command "._UNDO" "_END") ;end the UNDO GROUP...
(setq rect_undo_flag nil) ;and clear the flag
)
)
194
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
(setvar "CMDECHO" old_cmdecho) ;reset original command echo
(setq *error* old_error) ;restore default error handler
;if command is successful
(prin1) ;quiet exit
)
141246430.doc R.2.1 4/22/2013 195
AUTODESK, INC.
-pera]ii cu (i[iere
AutoLISP poate citi [i scrie fi[iere te!t de tip ASCII.
Obiective
Dn acest capitol "ei studia,
Ce este un descriptor de fi[ier [i cum este
folosit.
Cum s\ desc$idei un fi[ier pentru operaii de citire
sau scriere.
Cum s\ scriei linii de te!t `ntr-un fi[ier desc$is.
Cum s\ citii linii de te!t dintr-un fi[ier desc$is.
Cum s\ descoperii sf`r[itul unui fi[ier te!t.
Cum s\ `nc$idei un fi[ier.
/unc#iile fi[ier ICO
8peraiile de citire [i scriere `ntr-un fi[ier sau operaii IJ8
`ntr-un fi[ier se reali#ea#\ cu ajutorul a dou\ funcii, read-line
[i Grite-line. Desc$iderea [i `nc$iderea fi[ierelor se reali#ea#\
de asemenea prin dou\ funcii, open [i close.
&esc$iderea unui fi[ier
4uncia open cere dou\ argumente, numele unui fi[ier ce
urmea#\ a fi desc$is [i modul de desc$idere a acestuia.
Ambele argumente trebuie s\ fie [iruri.
Dac\ funcia open reu[e[te& returnea#\ un descriptor de
fi[ier. Dac\ e[uea#\& returnea#\ nil.
Pro'ramul dvs. trebuie s\ p\streze descriptorul de
(i[ier `ntr-o variabil\/ Dac\ nu-l p\strai& nu "ei putea citi&
scrie sau `nc$ide fi[ierul.
Descriptorul de fi[ier este un argument obligatoriu pentru
funciile care scriu `n& citesc dinJsau `nc$id fi[ierul.
.!ist\ trei tipuri "alide de moduri de desc$idere a unui fi[ier.
4iecare trebuie s\ fie repre#entat de o liter\ mic\ desparit\
prin semne de punctuaie.
196
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
.!en &ode ;escriere
A$A D',)8&d'$'a -&,&'$u(u& %'nt$u )&t&$'.
A2A D',)8&d'$'a -&,&'$u(u& %'nt$u ,)$&'$'. da)a '>&,ta
un -&,&'$ )u a)'(a,& num' ,' Ka %$odu)' o
,u%$a,)$&'$'.
AaA D',)8&d'$'a -&,&'$u(u& %'nt$u adau.a$'. da)a '>&,ta
un -&,&'$ )u a)'(a,& num', Ka -& adau.at (a ,-&$,&tu(
a)',tu&a.
Tabelul /. ?oduri de a desc:ide un 1iEier.
De e!emplu& aceast\ e!presie desc$ide un fi[ier numit
testt,t. pentru o operaie de scriere.
Command: (,'tI -% (o%'n At',t.t>tA A2A!!
4#&(': F>>>>>7
Command: H-%
4#&(': F>>>>>7
Scrierea `ntr-un fi[ier
4uncia Grite-line "a scrie un [ir de te!t `ntr-un fi[ier desc$is.
Aceast\ funcie cere dou\ argumente, un [ir de tip te!t [i un
descriptor de fi[ier. Al doilea argument este opional? dac\
nu este introdus& funcia Grite-line "a scrie [irul pe displa>.
Presupunei c\ "ariabila fp este legat\ de un descriptor de
fi[ier "alid returnat prin desc$iderea unui fi[ier pentru o
operaie de scriere.
Aceste e!presii scriu dou\ linii de te!t `ntr-un fi[ier.
Command: (2$&t'3(&n' A#&$,t (&n'.A -%!
A#&$,t (&n'.A
Command: (2$&t'3(&n' AS')ond (&n'.A -%!
AS')ond (&n'.A
Dnc$iderea unui fi[ier
(rebuie s\ `nc$idei fi[ierul imediat dup\ operaii de scriere&
citire sau ad\ugare. Dac\ nu-l inc$idei& resursele sistemului
d"s. "or fi limitate& `n particular num\rul de $andlere de
fi[iere disponibil.
4uncia close "a `nc$ide un fi[ier desc$is. 4uncia cere un
argument, un descriptor de fi[ier "alid. 4uncia returnea#\
nil.
Aceast\ e!presie "a `nc$ide fi[ierul desc$is [i `n care s-a
scris `n cele dou\ e!emple anterioare.
Command: (,'tI -% ()(o,' -%!!
141246430.doc R.2.1 4/22/2013 197
AUTODESK, INC.
Deoarece descriptorul de fi[ier fp nu mai este "alid dup\ ce
fi[ierul la care se refer\ este `nc$is& de e!emplu dac\ se
setea#a fp la nil este ec$i"alent cu a `nc$ide fi[ierul. Se
eliberea#\ astfel memoria [i se obine asigurarea c\ fp nu
poate fi folosit `n afara conte!tului.
'emplu
Introducei e!presiile care urmea#\.
Desc$idei un fi[ier& scriei c`te"a linii de te!t `n fi[ier [i
`nc$idei fi[ierul. .!aminai fi[ierul cu editorul de te!t dup\
ce a fost `nc$is.
Desc$idei un fi[ier numit testt,t pentru o operaie de
scriere.
Command: "set= 9! "o!en Ctest.t'tC CPC##
4#&(': F>>>>>7
Command: $9!
4#&(': F>>>>>7
Scriei c`te"a linii de te!t `ntr-un fi[ier.
Command: "Prite4line CCodersC 9!#
ACod'$,A
Command: "Prite4line Co9 t?eC 9!#
Ao- t8'A
Command: "Prite4line C(ost )!ar:C 9!#
ALo,t S%a$NA
Dnc$idei fi[ierul.
Command: "set= 9! "close 9!##
n&(
Command: $9!
n&(
Desc$idei fi[ierul testt,t `n editorul te!t [i e!aminai-l. Ar
trebui s\ conin\ trei linii de te!t.
Coders
of the
Lost Spark
198
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
&esc$iderea unui fi[ier pentru o opera#ie de citire
C`nd desc$idei un fi[ier pentru o operaie de citire& putei
citi datele din fi[ier& linie cu linie. <u putei modifica sau
scrie `ntr-un fi[ier care a fost desc$is pentru o operaie de
citire. ;Dac\ "rei s\ introducei date `n fi[ier& `nc$idei-l [i
redesc$idei-l pentru o operaie de scriere.H
4uncia open apelat\ cu un argumenr CrC returnea#\ un
descriptor de fi[ier dac\ fi[ierul specificat e!ist\? dac\ nu&
returnea#\ nil.
4uncia read-line cite[te o linie de te!t dintr-un fi[ier. Cere un
argument opional, un descriptor de fi[ier "alid pentru un
fi[ier care a fost desc$is pentru o operaie de citire. Dac\
argumentul nu este ad\ugat& funcia read-line cite[te intrarea
de pe tastatur\.
4uncia read-line returnea#\ o linie de te!t pe care o cite[te
dintr-un fi[ier. 4uncia read-line returnea#\ nil dac\ ajunge la
cap\tul fi[ierului.
4uncia read-line `ncepe cu prima linie de te!t dintr-un fi[ier.
8 apelare ulterioar\ a funciei read-line "a face ca funcia s\
citeasc\ urm\toarea linie de te!t din fi[ier [i a[a mai departe.
141246430.doc R.2.1 4/22/2013 199
AUTODESK, INC.
'emplu
Introducei e!presiile care urmea#\.
Dn acest e!emplu se presupune c\ ai creat cu succes
fi[ierul te,tt,t din e!erciiul anterior.
Desc$idei fi[ierul testt,t pentru o operaie de citire.
Command: "set= 9! "o!en Ctest.t'tC CrC##
4#&(': FGGGG7
Command: $9!
4#&(': FGGGG7
Citii prima& a dou\ [i a treia linie din fi[ier.
Command, ;read-line fpH
RCodersS
Command: "read4line 9!#
Ao- t8'A
Command: "read4line 9!#
ALo,t S%a$NA
Dncercai s\ citii p`n\ la sf`r[itul fi[ierului. 4uncia read-line
"a returna nil.
Command: "read4line 9!#
n&(
Dnc$idei fi[ierul.
Command: "set= 9! "close 9!##
n&(
Command: $9!
n&(
200
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
)ecapitulare
-n descriptor de fi[ier este un pointer al unui
fi[ier returnat de funcia open.
-n program trebuie s\ p\stre(e un descriptor
de fi[ier pentru a a"ea acces la fi[ierul pe care
l-a desc$is.
4i[ierele pot fi desc$ise pentru operaii de citire&
scriere [i ad\ugare.
Argumentele pentru modul de desc$idere a
fi[ierelor la funcia open trebuie s\ fie litere mici.
-n fi[ier poate fi desc$is numai pentru o singur\
operaie.
4unciile "rite-line [i read-line scriu [i citesc din
fi[iere.
4uncia read-line returnea#\ nil c`nd ajunge la
cap\tul fi[ierului.
141246430.doc R.2.1 4/22/2013 201
AUTODESK, INC.
E+ERCITI,( 31- C.*IEREA ,8,I AI)IER TE+T
A"ei %6 de minute la dispo#iie s\ terminai acest e!erciiu?
este un program "ast. A"ei ne"oie de timp ca s\ re"i#uii [i
s\ `nelegeti codul [i de asemenea s\ introducei te!tul
surs\.
Dn acest e!erciiu,
Eei aprofunda cuno[tinele despre fi[iere IJ8 `n
AutoLISP.
Eei crea un program AutoLISP pentru citit fi[iere
te!t de tip ASCII [i pentru copiat fi[iere `ntr-un
fi[ier cu nume diferit.
Eei desc$ide fi[iere at`t pentru citit c`t [i pentru
scris.
Instruciuni
*. Introducei codul care urmea#\ `ntr-un document nou din
editorul te!t.
+. Sal"ai fi[ierul `n directorul student sub numele de
copyfilelsp
%. Aceast\ funcie folosete o rutin\ de tratare a erorilor cu
apelare asem\n\toare cu cea din e!erciiul precedent.
Earibilele legate de descriptoarele de fi[ier au fost
definite global a[a `nc`t rutina de tratare a erorilor le
poate `nc$ide dac\ este necesar.
2. Dnc\rcai copyfilelsp `n AutoCAD.
1. Acti"ai comanda C8PM4IL..
:. Dncercai s\ copiai dou\ fi[iere te!t.
0. Depanai programul dac\ este necesar.
continuare pe pagina urmatoare
202
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
(defun c:copyfile (/ r_fp_name w_fp_name r_fp_line)
; r_fp source file descriptor
; w_fp destination file descriptor
; r_fp_name source file name
; w_fp_name destination file name
; r_fp_line source file text line
(setq old_error *error*) ;save default error handler
(defun *error* (msg) ;define new error handler
(if ;close source file if open
r_fp
(setq r_fp (close r_fp))
)
(if ;close destination file if open
w_fp
(setq w_fp (close w_fp))
)
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)
;get source file from user with dialogue
(setq r_fp_name (getfiled "Select Source File" "" "txt" 0))
;if source file returned, get destination file from user
(if
r_fp_name
(setq w_fp_name (getfiled "Destination File" "" "txt" 1))
)
;check that we got good values for both file names
;exit if not
(if
(or
(not r_fp_name)
(not w_fp_name)
)
(progn
(prompt "\nMust specify both source and destination file.")
(exit)
)
141246430.doc R.2.1 4/22/2013 203
AUTODESK, INC.
)
continuare pe pagina urmatoare
204
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
;check that file names are different
;exit if not
(if
(= r_fp_name w_fp_name)
(progn
(prompt "\nSource same name as destination file.")
(exit)
)
)
;open source file for read
;exit if it fails
(if
(not (setq r_fp (open r_fp_name "r")))
(progn
(prompt "\nCould not open source file.")
(exit)
)
)
;open destination file for read
;close source file and exit if it fails
(if
(not (setq w_fp (open w_fp_name "w")))
(progn
(setq r_fp (close r_fp))
(prompt "\nCould not open destination file.")
(exit)
)
)
;get first line from source file
(setq r_fp_line (read-line r_fp))
;write source line to destination file and get next...
;source line until end of file is reached
(while
r_fp_line
(write-line r_fp_line w_fp)
(setq r_fp_line (read-line r_fp))
)
;close the source and destination files
(setq r_fp (close r_fp))
(setq w_fp (close w_fp))
;restore original error handler
141246430.doc R.2.1 4/22/2013 205
AUTODESK, INC.
(setq *error* old_error)
(prin1) ;quiet exit
)
206
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
E+ERCITI,(32- CITIREA ,8,I AI)IER TE+T )I CREAREA E8TITATII HTE+TD
Acesta este un eerci#iu op#ional%
Dac\ terminai cu comanda C8PM4IL. putei continua cu
acest e!erciiu opional.
4uncia c,iote!t "\ arat\ cum s\ citii un fi[ier te!t de pe disc [i
s\ scriei te!tul sub form\ de entitai te!t AutoCAD. Acesta
este un subset de facilit\i inclus `n ACAD ) *+ din cadrul
fi[ierului ascte,tlsp
'tape de lucru
*. Desc$idei un nou fi[ier `n editorul te!t.
+. Introducei codul care urmea#\ [i sal"ai-l `ntr-un fi[ier
numit iote,tlsp
%. Dnc\rcai fi[ierul `n AutoCAD.
2. Acti"ai comanda I8(.=(.
-n singur lucru trebuie s\ sc$imbai, cerei utili#atorului s\
pun\ spaii `ntre linii `n loc s\ scale#e mereu `n\limea
te!tului cu *.1.
continuare pe pagina urmatoare
141246430.doc R.2.1 4/22/2013 207
AUTODESK, INC.
; Iotext.lsp
;
; Command function IOTEXT prompts for the name of a text file.
; It reads each line of the file and draws the corresponding Text
; entities `n AutoCAD.
;
; It prompts for the height, rotation angle and insertion point
; of the text. Text is always drawn left-justified.
(defun dtr (d) ;convert degrees to radians
(/ (* d pi) 180.0)
)
(defun rtd (r) ;convert radians to degrees
(/ (* r 180.0) pi)
)
(defun C:IOTEXT()
(setq old_cmdecho (getvar "CMDECHO")) ;save old command echo
(setvar "CMDECHO" 0) ;turn off command echo
(setq old_error *error*) ;save default error handler
(defun *error* (msg) ;define new error handler
(if ;close source file if open
io_fp
(setq io_fp (close io_fp))
)
(setvar "CMDECHO" old_cmdecho) ;restore command echo
(if
(/= "Function cancelled" msg) ;no message if user cancels
(if
(= msg "quit / exit abort") ;no message if program
deliberately
(princ) ;aborts
(princ (strcat "\nError: " msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)
(setq io_fp_name ;name of text file to read
(getfiled "Select Text File" "" "txt" 0)
)
(if ;if the file dialogue is
canceled
(= io_fp_name nil) ;then exit
(exit)
)
208
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
continuare pe pagina urmatoare
141246430.doc R.2.1 4/22/2013 209
AUTODESK, INC.
(if ;if we can't open file then exit
(not (setq io_fp (open io_fp_name "r")))
(progn
(prompt "\nCan't open file for input.")
(exit)
)
)
(initget 1) ;no null
(setq ;text insertion point
io_ins_pt (getpoint "\nInsertion point: ")
)
(initget (+ 1 2 4)) ;no null, zero, negative #
(setq ;text height
io_txt_ht (getdist io_ins_pt "\nHeight: ")
)
(setq io_txt_rot ;text rotation angle
(getangle io_ins_pt "\nRotation: ")
)
(if ;if null response to rotation
(not io_txt_rot) ;prompt, set it to 0.0
(setq io_txt_rot 0.0)
)
(setq ;set line spacing distance
io_line_spacing (* io_txt_ht 1.5)
)
(setq ;set line spacing angle
io_spacing_rot (- (dtr io_txt_rot) (/ pi 2))
)
(setq io_fp_line (read-line io_fp)) ;read line from file
;while we have a line of text from the file, draw a Text entity
;in AutoCAD. Set the next Text entity insertion point. Get the
;next line of text from the file.
(while
io_fp_line
(command "text" io_ins_pt io_txt_ht io_txt_rot io_fp_line)
(setq io_ins_pt (polar io_ins_pt io_spacing_rot io_line_spacing))
(setq io_fp_line (read-line io_fp))
)
(setq io_fp (close io_fp)) ;close file
(setvar "CMDECHO" old_cmdecho) ;restore command echo
(setq *error* old_error) ;restore default error handler
(prin1) ;quiet exit
)
210
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Seturi de selec]ie
AutoCAD-ul poate a[e#a grupuri de entit\i `n seturi de
selecie. Comen#ile AutoCAD [i funciile AutoLISP pot
aciona asupra unui set de selecie [i fac`nd aceasta& poate
aciona global asupra grupului de entit\i din setul de
selecie.
Obiective
Dn acest capitol "ei `n"\a,
Cum s\ creai un set de selec#ie.
Cum s\ folosii un set de selecie cu comen#i
AutoCAD.
Cum s\ creai un set de selecie interacti"& cu
fereastr\& cu filtru [i prin selectarea tuturor
componentelor dintr-un desen.
Cum s\ aflai lungimea num\rului de entit\i `ntr-un
set de selecie.
Cum s\ lucrai cu nume de entit\#i `ntr-un set de
selecie.