Professional Documents
Culture Documents
Introducere
AutoLISP-ul este un limbaj de programare pentru AutoCAD. Acest curs
ofer\ cursantului posibilitatea de a-[i `nsu[i cuno[tin]e practice de lucru `n
AutoLISP prin cursuri [i texte care explic\ structura [i sintaxa limbajului [i
rela]ia acestuia cu AutoCAD-ul. Prin exerci]ii aplicative la teoria de
programare [i exemple concrete cursantul `[i completeaz\ aceste cuno[tin]e.
Obiective
La sf`r[itul acestui curs, cursantul va fi capabil s\ `n]eleag\ sintaxa
AutoLISP, o varietate de func]ii standard [i procesul de evaluare Lisp.
Cursantul va putea folosi AutoLISP-ul pentru:
· Utilizarea comenzilor AutoCAD prin intermediul func]iilor de
baz\ AutoLISP.
· Crearea de noi func]ii AutoLISP.
· Crearea de noi func]ii AutoCAD pe baza limbajului AutoLISP.
· Corectarea [i modificarea entit\]ilor din baza de date a
AutoCAD-ului.
· Citirea [i scrierea `n fi[iere cu texte ASCII cu ajutorul limbajului
AutoLISP.
· Combinarea programelor de tip AutoLISP cu fi[ierele AutoCAD
de tip script.
Cuprins
Acest material cuprinde subiectele prezentate mai jos. Explicarea acestor
subiecte reprezint\ con]inutul principal al capitolelor de mai jos.
Introducere...............................................................................................................1
Generalit\]i...............................................................................................................3
Expresii simbolice....................................................................................................7
Atomi [i liste..........................................................................................................13
Evalu\ri ..................................................................................................................21
Expresii simbol AutoLISP far\ comenzi AutoCAD..............................................35
Tipuri de date numerice.........................................................................................41
Puncte AutoCAD [i liste AutoLISP.......................................................................47
Prelucrare de liste...................................................................................................57
Comenzi AutoCAD [i liste AutoLISP...................................................................71
Selec]ie interactiv\ de puncte.................................................................................79
Func]ii....................................................................................................................87
Func]ii care ac]ioneaz\ ca [i comenzi AutoCAD...................................................97
Fi[iere de programare AutoLISP.........................................................................101
Func]ia C..............................................................................................................105
Teste logice [i condi]ionale..................................................................................113
Bucle de program.................................................................................................123
Opera]ii cu [iruri..................................................................................................131
Acces la entit\]i....................................................................................................139
Liste asociate entit\]ilor.......................................................................................147
Modificarea unei entit\]i......................................................................................155
Selectarea grafic\ a unei entit\]i...........................................................................165
Tratarea erorilor...................................................................................................171
Opera]ii cu fi[iere................................................................................................175
....................................................................................................................................
Seturi de selec]ie..................................................................................................193
Tabele [i nume de obiecte....................................................................................203
Fi[iere script [i AutoLISP....................................................................................211
Accesul la entit\]i simple [i la polilinii................................................................217
·2
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Lisp este un acronim pentru list processing (in alte texte, list
programming. Este un limbaj de programare superior foarte cunoscut
pentru aplica]iile lui `n domeniul sistemelor specializate, inteligen]\
artificial\, programare pe baz\ de reguli [i AutoCAD.
·4
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Lansarea `n execu]ie
Lansa]i editorul grafic AutoCAD `nainte de a lansa orice alt\ comanda. Va
trebui s\ introduce]i s-expresiile AutoLISP din linia de comand\.
V\ suger\m s\ lansa]i sesiunea de editare grafic\ ori de c`te ori utiliza]i acest
manual.
·6
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Expresii simbolice
Obiective
~n acest capitol ve]i `nv\]a:
· Cum s\ crea]i o expresie simbolic\
· Cum recunoa[te AutoCAD-ul expresiile simbolice
· Cum s\ folosi]i expresiile simbolice `n cadrul comenzilor
AutoCAD
· Cum s\ afla]i valoarea unei expresii simbolice
Instruc]iuni `n AutoLISP
Command: (+ 1 2)
(+ 1 2)
AutoCAD AutoLISP
3
3
Command:
Exemplu
Pe linia de comand\ a AutoCAD-ului `nscrie]i s-expresiile `n coloana din
st`nga a tabelului care urmeaz\. Compara]i rezultatele date de AutoCAD cu
rezultatele care se afl\ `n coloana din dreapta a tabelului.
Command:(+12)
3
Command:
S-expresii Rezultate
(+ 1 2) 3
(- 2 1) 1
(/ 4 2) 2
(* 4 2) 8
Tabelul 1. Rezultatele expresiilor simbolice
·8
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command:array
last
polar
5,5
(/ 360 15)
(/ 360 15)
AutoCAD 24
AutoLISP
Command:array
last
polar
5,5
20
Figura 2. Cum AutoCAD-ul si AutoLISP-ul comunica intr-o comanda AutoCAD
Exemplu
~n comanda "polar array" care urmeaz\, `mp\r]ind 360 de grade la 15 se
determin\ num\rul de obiecte de creat, de exemplu se creaz\ un obiect la
fiecare 15 grade de rota]ie.
Introduce]i comenzile.
Command: line
From point: 5,5
To point: 5,8
To point: Enter
Command: array
Select objects: last
1 found
Select objects: Enter
Rectangular or Polar array (R/P): p
Center point of array: 5,5
Number of items: (/ 360 15)
Angle to fill (+=ccw, -=cw) <360>:Enter
Rotate objects as they are copied? <Y>Enter
·10
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command: !pi
Exemplu
pieste un simbol predefinit `n AutoLISP. Extrage]i valoarea simbolului pi
pe linia de comand\ AutoCAD.
Command: !pi
3.14159
Command:
Recapitulare
·12
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Atomi [i liste
Obiective
Atomi
Un atom este cel mai simplu tip de date din Lisp. Un atom poate fi un
num\r `ntreg
· 1
· un num\r real
· 4587.993401
· un [ir de caractere
· “A String Of Pearls “
· o func]ie AutoLISP predefinit\
· +
· un simbol
· XYZ
· sau oricare alt tip de obiecte existente `n tabelul 3-1.
Exist\ o regul\ simpl\ pentru a afla dac\ un obiect este un atom sau o list\.
Dac\ obiectul nu se afl\ `ntre paranteze atunci este un atom; dac\ da, atunci
este o list\.
Liste
Listele s`nt s- expresii complexe formate din atomi [i/sau alte liste. Listele
necesit\ sintaxe simple dar riguroase.
· O list\ trebuie s\ se afle `ntre paranteze.
· Pentru orice list\ care poate fi evaluat\, primul termen din cadrul
listei respective trebuie s\ fie o func]ie.
· Obiectele din cadrul listei trebuie separate prin cel pu]in un
spa]iu.
Iat\ c`teva exemple de liste. Observa]i c\ fiecare obiect este separat printr-
un spa]iu de celelalte obiecte din cadrul listei.
(+ 1 2 )
(- 4 2 )
(x y z )
(1.0 1.0 0.0 )
Despre evaluarea listelor vom vorbi pu]in mai t`rziu.
Exemplu
Aceast\ list\ are trei elemente: numerele reale 1.0, 1.0 [i 0.0
·14
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(+ 1 (+ 2 3))
First element: +
Second element: 1
Third element: (+ 2 3)
Figura 4. Lista de trei elemente: doi atomi si o lista
Exemplu
Aceast\ list\ are trei elemente: func]ia de adunare +, lista (+ 1(+ 2 3)) [i lista
(+ 4 5).
(+ (+ 1 (+ 2 3)) (+ 4 5))
(+ (+ 1 (+ 2 3)) (+ 4 5))
First element: +
Second element: (+ 1 (+ 2 3))
Third element: (+ 4 5)
Condi]ii de eroare
C`nd introduce]i s-expresii `n linia de comand\ AutoCAD, interpretorul
AutoLISP v\ va spune dac\ a]i introdus o expresie neechilibrat\. O
expresie neechilibrat\ are mai multe paranteze deschise dec`t `nchise.
Not\ Este de asemenea posibil s\ vede]i acest mesaj c`nd un [ir este
neechilibrat. Un [ir neechilibrat are ghilimele duble la un cap\t [i simple la
cel\lalt.
Obiectul nil este "lista goal\". Prin conven]ie nil este [i atom [i list\. nil
poate fi exprimat `n dou\ moduri: 0 sau nil;.
nil este singurul obiect din AutoLISP corespunzator lui "fals"; de aceea
orice alt\ valoare returnat\ de un test de condi]ie trebuie s\ corespund\ lui
"adev\rat".
·16
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
· Cele dou\ mari clase de obiecte din AutoLISP s`nt atomii [i
listele.
· Exist\ c`teva tipuri diferite de atomi.
· Atomii s`nt obiecte care nu s`nt `ncadrate `ntre paranteze.
· Listele s`nt `ntodeauna `ncadrate `ntre paranteze
· Obiectele con]inute `ntr-o list\ constituie elementele unei liste
· Elementele unei liste pot fi atomi sau liste
· Elementele unei liste s`nt separate `ntre ele de cel pu]in un
spa]iu
· AutoLISP detecteaz\ expresiile neechilibrate
· nil este [i atom [i list\
· nil este lista goal\
· nil este returnat de testele de condi]ie pentru a indica "fals"
Partea I
1. Determina]i dac\ obiectul este atom sau list\.
2. Completa]i rezultatul evalu\rii `n c\su]a corespunzatoare.
Tabelul 3. Determinarea naturii obiectului
73.5
"0,0"
"String"
("String")
()
·18
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Partea a II-a
1. Gasi]i valoarea acestui atom `n linia de comand\ AutoCAD
2. Tip\ri]i "!" urmat de un atom
3. Scrie]i r\spunsul `n coloana din dreapta:
Exemplu
Command: !4.5
Atomi Valori
4.5
"text"
17
setq
xyz
nil
Tabelul 4. Determinarea valorii atomului
Partea a III-a
1. Determina]i num\rul de elemente con]inut de fiecare list\.
2. Scrie]i r\spunsul `n coloana din dreapta.
Lista Numar de elemente
(+ 1 2)
(+ 1 (+ 2 3))
(+ 1 2 (+ 3 4) 5)
(+ 1 (+ 2 (+ 3 4)) 5)
()
·20
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Evaluarea
Evaluarea este procesul prin care AutoLISP-ul determin\ valoarea unui
obiect. Evaluarea se aplic\ [i la atomi [i la liste.
Fiecare obiect din AutoLISP are o valoare. Prin evaluarea unui obiect,
AutoLISP-ul determin\ valoarea acestuia.
Obiective
~n acest capitol ve]i studia:
· Procesul evalu\rii
· Cum returneaz\ AutoLISP-ul o valoare
· Cum evalueaz\ AutoLISP-ul atomi [i liste
· Cum se folosesc func]iile aritmetice de baz\ `n AutoLISP
· Cum se anuleaz\ evaluarea unui obiect
· Cum leag\ AutoLISP-ul o valoare de o variabil\
Returnarea valorii
C`nd transmite]i un obiect spre evaluare AutoLISP-ului, acesta `i determin\
valoarea [i o returneaz\. ~ntr-un exemplu anterior, folosind caracterul "!",
AutoLISP-ul a evaluat obiectul pi [i a returnat valoarea AutoCAD-ului.
AutoCAD-ul a tip\rit valoarea returnat\ `n zona liniei de comand\.
Command: !pi
3.14159 <--- valoare returnata
AutoLISP
receives
(/ 360 15)
returns
24
Evaluarea atomilor
Atomii s`nt obiecte simple [i s`nt evalua]i folosind reguli simple potrivit
tipului lor de date. Majoritatea atomilor se autoevalueaz\. Numerele `ntregi,
numerele reale, [irurile, se autoevalueaz\ la valoarea pe care o au. Modul `n
care se evalueaz\ un simbol nu poate fi discutat dec`t dup\ ce `nv\]am cum
se leag\ o list\.
Tip de atom Exemplu Regula de Valoare
evaluare
Evaluarea listelor
Evaluarea unei liste poate fi facut\ `ntr-unul din aceste dou\ moduri: se ia
lista ca atare sau se evalueaz\. ~n func]ie de natura listei, metodele dau
rezultate diferite,de exemplu, valori diferite.
Dac\ o list\ este luat\ ca atare, atunci valoarea ei este lista `ns\[i. Acest lucru
va fi mai clar dup\ explicarea func]iei quote mai t`rziu `n aceast\ lec]ie.
·22
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Func]iile s`nt fie func]ii interne AutoLISP, fie subrutine, a[a cum s`nt cele
prezentate `n capitolul 4 al manualului AutoLISP Programmer’s Reference
Manual, fie func]ii externe definite de utilizator sau exsubr definite de
aplica]ii ADS, sau func]ii AutoLISP definite de utilizator.
Aceasta este o list\ format\ din trei elemente: func]ia + numerele `ntregi 1 [i
2.
(+ 1 2)
(.. .. 2)
·24
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(+ 1 (+ 2 3))
value is 1 value is 5
value is 6
Figura 7. Evaluarea unei liste complexe
(+ ..
(.. 1 ..
(.. .. (+ 2 3) ..
Al treilea element este el `nsu[i o list\. Cum afl\ AutoLISP-ul valoarea unei
liste? Prin evaluare. Cum evalueaz\ AutoLISP-ul o list\?
(.. .. (+ ..
( .. .. (.. 2 ..
(.. .. (.. .. 3) ..
Func]ii aritmetice
AutoLISP-ul include func]ii interne pentru opera]ii aritmetice ca: adunarea,
sc\derea, `nmul]irea [i `mp\r]irea
· + func]ia de adunare
· - func]ia de sc\dere
· * func]ia de `nmul]ire
· / func]ia de `mp\r]ire
·26
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemple
1+2 (+ 1 2)
2-1 (- 2 1)
2*4 (* 2 4)
4/2 (/ 4 2)
(- 2 1)
Subtract this...
... from this.
Fig. 8 Ordinea argumentelor in functia de scadere
(/ 4 2)
Divide this...
... by this.
Fig. 9 Ordinea argumentelor in functia de impartire
Exemple
1 + (2 - 3) (+ 1 (- 2 3))
(4 + 2) - 1 (- (+ 4 2) 1)
4*4/2 (/ (* 4 4) 2)
4/2*3 (* 3 (/ 4 2))
Recapitulare
· AutoLISP-ul determin\ valoarea unui obiect prin evaluare.
· AutoLISP-ul returneaz\ valoarea fiec\rui obiect pe care il
evalueaz\.
· Majoritatea atomilor se evalueaz\ pe sine.
· Simbolurile se evalueaz\ prin legare sau atribuire.
· Listele s`nt evaluate printr-un proces standard.
· Primul element al oricarei liste ce poate fi evaluat\ trebuie s\ fie
o func]ie.
· AutoLISP-ul are func]ii standard pentru opera]ii aritmetice.
·28
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Partea I
1. Folosi]i func]ia +, -, /, [i *.
2. Transforma]i expresiile aritmetice `n expresii AutoLISP.
3. Scrie]i r\spunsurile `n coloana din dreapta.
Exemplu
Expresia `n nota]ia aritmetic\ standard:
1+2
Expresia `n AutoLISP:
(+12)
3 + 10 + 5
20 * 15
16 - 10
15 / 3
5 + (10 * 2)
(5 + 10) * 2
Partea a II-a
1. Transforma]i s-expresiile `n expresii aritmetice
2. Scrie]i r\spunsurile `n coloana din dreapta
Exemplu
Expresia `n nota]ia aritmetic\ standard
(2 * 5) / (7 - 2)
Expresia `n AutoLISP
(/ (* 2 5) (- 7 2))
(+ 2 (+ 5 4) (- 4 2))
(- 5 (+ 4 (- 3 2)))
(/ 8 (- (/ 6 2) 1))
(* 2 (/ (+ 2 4) 3))
(- 5 (/ 6 (+ 1 2)))
(+ (/ (* 2 3) (- 4 2)) 1)
Tabelul 10. Traducerea expresiilor AutoLISP
·30
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Liste neevaluate
Valoarea unei liste poate fi determinat\ `n unul din aceste dou\ moduri: se
evalueaz\ lista sau se consider\ lista ca atare.
Func]ia AutoLISP quote este folosit\ pentru a returna o list\ sau un atom
neevaluat, adic\ la valoarea ca list\.
Exemplu
Aceast\ expresie returneaz\ lista (1.0 2.0 3.0) neevaluat\.
Command: (quote (1.0 2.0 3.0))
(1.0 2.0 3.0)
Ce s-ar `nt`mpla dac\ AutoLISP-ului i s-ar cere s\ evalueze lista?
De ce?
Command: (1.0 2.0 3.0)
?
Exemplu
Aceast\ expresie leag\ simbolul x de valoarea 4.5.
Command: (setq x 4.5)
4.5
Command: !x
4.5
LET x = 4.5
Exemplu
Nota]i returnarea valorii acestei expresii. Valoarea listei este valoarea
leg\turii stabilite pentru simbolul x de c\tre func]ia setq.
Command: (setq x 4.5)
4.5
Recapitulare
· Func]ia quote suprim\ procesul de evaluare.
· Legarea este procesul de atribuire a unei valori la o variabil\.
· Functia setq este folosit\ pentru a lega o variabil\ de o valoare.
·32
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Partea I
1. Determina]i dac\ o list\ poate fi evaluat\ sau trebuie considerat\ ca
atare.
2. Pune]i un semn `n coloana corespunz\toare
Tabelul 11. Determinarea situatiei in care o lista poate fi evaluata
s-expresii Evaluari? Numai fata
valorii?
(+ 1 2)
(+ 1 (+ 2 3))
(setq x 4.5)
(y (1 2))
Partea a II-a
Command: (setq x 1)
1
Command: !x
1
Command:(setq x (+ 1 2 3))
6
Command: !x
6
Valoare pentru
x
4.5
"text"
(+ 1 2 3)
(1 (+ 2 3))
·34
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum s\ folosi]i AutoLISP-ul `n cadrul comenzilor AutoCAD
· Cum s\ returna]i o valoare din AutoLISP c\tre o comand\
AutoCAD
Dac\ linia de comand\ este `n ac]iune, valoarea unei expresii este pur [i
simplu tiparit\ `n zona liniei de comand\.
Command: (setq x (+ 4 6))
10
Command: !x
10
Aceast\ expresie returneaz\ valoarea diviz\rii r\d\cinii p\trate num\rului 50
prin num\rul real 9.
Command: (/ (sqrt 50.0) 9.0)
0.78567
Aceast\ expresie returneaz\ valoarea multiplic\rii rezultatului ob]inut prin
adunarea lui 2.5 cu 6.3 de 24.0.
Command: (* (+ 2.5 6.3) 24.0)
211.2
·36
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
~ncepe]i un desen nou.
Command: line
From point: 1,1
To point: 5,5
To point: Enter
Command: array
Select objects: I
Select objects: Enter
Rectangular or Polar array (R/P): r
Number of rows (-) <1>: 1
Number of columns (III) <1>: (fix (/ 6.0 0.35))
Distance between columns: 0.35
AutoCAD creaz\ 17 elemente `n array.
Exemplu
~ncepe]i un desen nou.
Command: line
From point: 10,1
To point: 6,5
To point: Enter
Command: fillet
Polyline/Radius/<Select two lines>: r
Enter fillet radius <1.0>: (/ 28.0 12.5)
Command: fillet
Polyline/Radius/<Select two lines>: pick first line
Select second object: pick second line
Figura 10. Doua linii cu o racordare la o raza de (/28.0 12.5) sau 2.24
Recapitulare
· S-expresiile pot fi folosite ca r\spunsuri la cererile de comand\
AutoCAD.
· AutoLISP returneaz\ valoarea unei s-expresii folosite `n cadrul
unei comenzi AutoCAD la cererea comenzii.
·
·38
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<Radius>: !x
Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<Radius>: (/ x 2)
Command: array
Select objects: pick the arc
1 found
Select objects: Enter
Rectangular or Polar array (R/P): p
Center point of array: 5,5
Number of items: !x
Angle to fill (+=ccw, -=cw) <360>:Enter
Rotate objects as they are copied? <Y>Enter
·40
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Diferen]ele dintre cele dou\ tipuri de date numerice
· Cum s\ determina]i tipul de date al unui obiect
Numere reale
AutoLISP-ul reprezint\ numerele reale `n virgul\ mobil\, dubl\ precizie cu
cel pu]in 14 zecimale. Nu exist\ tipuri de date care s\ reprezinte numere cu
simpl\ precizie `n AutoLISP. Toate numerele reale s`nt cu dubl\ precizie [i
ele s`nt reprezentate `n AutoLISP `n aceea[i manier\ ca `n AutoCAD.
Numerele reale s`nt numere introduse cu punct zecimal, de exemplu 4.5 sau
123.456.
Command: (setq x 4.5)
4.5
Pentru valori cuprinse `ntre 1.0 [i -1.0, zero trebuie s\ precead\ punctul
zecimal, de exemplu, 0.45 sau 0.123 sau -0.876.
Command: (setq x 0.123)
0.123
·42
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Dac\ este necesar\ afi[area sau tip\rirea valorii unui num\r real cu o precizie
mai mare dec`t precizia de afi[are a AutoLISP-ului, num\rul real poate fi
transformat `ntr-un [ir cu ajutorul func]iei AutoLISP rtos [i apoi afi[at sau
tip\rit cu precizia de afi[are dorit\.
Exemplu
Introduce]i expresiile care urmeaz\.
Numere `ntregi
Numerele `ntregi s`nt numere introduse f\r\ punct zecimal. Numerele
`ntregi `n AutoLISP s`nt numere `ntregi cu semn pe 32 bi]i cuprinse `ntre
2.147.483.648 [i +2.147.483.647. De[i AutoLISP-ul folose[te valori de 32
bi]i, cele transferate `ntre AutoLISP [i AutoCAD s`nt limitate la valori de
16 bi]i, de exemplu nu se poate transfera o valoare mai mic\ de -32.768 sau
mai mare de +32.767 `n AutoCAD. Dac\ folosi]i o valoare care dep\[este
aceste limite, pute]i folosi func]ia float pentru a o transforma `ntr-un num\r
real `nainte de a o transfera `n AutoCAD.
Exemplu
Introduce]i expresiile care urmeaz\.
Exemplu
Aceast\ expresie returneaz\ un num\r `ntreg.
·44
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command: (+ 1 2)
3
Command: (type (+ 1 2))
INT
Aceast\ expresie returneaz\ un num\r real.
Command: (+ 1.0 2)
3.0
Command: (type (+ 1.0 2)
REAL
Recapitulare
Partea I
1.Lega]i simbolurile de valori diferite.
2.Introduce]i s-expresia corespunzatoare `n linia de comand\ AutoCAD.
simbol valoare
a 1
b 2
c 3
x 1.0
y 2.0
z 4.5
·46
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Partea aII-a
1.Determina]i valoarea returnat\ [i tipul de date pentru fiecare expresie.
2.Scrie]i r\spunsurile `n coloanele corespunzatoare
3.Trebuie mai `nt`i s\ efectua]i prima parte a acestui exerci]iu.
(+ 1 2)
(+ 1 2.0)
(+ 1.0 2.0)
(+ a b)
(+ a y)
(+ y z)
(fix x)
(float a)
(fix z)
(/ x y)
(fix (/ x y))
Obiective
~n acest capitol ve]i studia:
· Cum reprezint\ AutoLISP-ul puncte
· Cum s\ construi]i o list\ care reprezint\ un punct folosind at`t
constante c`t [i variabile.
Puncte AutoCAD
Un punct 3-dimensional este format din trei numere, fiecare av`nd o
valoare independent\ care corespunde unei distan]e de la originea
sistemului de coordonate de-a lungul axelor X, Y [i Z. Imagina]i-v\ punctul
3-D sub forma a trei cutii, fiecare con]in`nd un num\r real.
Punctul 1,2,3 exprimat sub forma unui obiect AutoLISP este (1.0 2.0 3.0)
·48
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Construirea unei liste format\ din trei numere reale este un proces simplu cu
ajutorul func]iei quote. De exemplu, expresia (quote (1.0 2.0 3.0) returneaz\
valoarea (1.0 2.0 3.0), o reprezentare AutoLISP valid\ a unui punct
AutoCAD.
Exemplu
Introduce]i expresiile care urmeaz\. Crea]i dou\ liste formate din c`te trei
numere reale [i folosi]i listele `n linia de comand\ AutoCAD.
Command: (setq pt1 (quote (1.0 1.0 1.0)))
(1.0 1.0 0.0)
Command: !pt1
(1.0 1.0 0.0)
Command: (setq pt2 (quote (5.0 5.0 0.0)))
(5.0 5.0 0.0)
Command: !pt2
(5.0 5.0 0.0)
Command: line
From point: !pt1
To point: !pt2
To point: Enter
·50
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\.
Folosi]i func]ia list pentru a returna o list\ format\ din trei numere reale.
Command: (list 1.0 2.0 3.0)
(1.0 2.0 3.0)
Folosi]i func]ia setq pentru a lega simbolul pt la o list\ cu trei numere reale.
Command: (setq pt (list 1.0 2.0 3.0))
(1.0 2.0 3.0)
Command: !pt
(1.0 2.0 3.0)
Folosi]i simbolul pt ca intrare la comanda AutoCAD ID [i verifica]i dac\
AutoCAD-ul recunoa[te valoarea simbolului ca punct valid 3-D.
Command: id
Point: !pt
X=1.0000 Y=2.0000 Z=3.0000
Command:
Bind x to 1.0
Bind y to 2.0
(setq y 2.0) Value of y is 2.0, or y = 2.0
Bind z to 3.0
(setq z 3.0) Value of z is 3.0, or z = 3.0
(list x y z )
·52
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Command: !pt
(1.0 2.0 3.0)
Command: id
Point: !pt
X=1.0000 Y=2.0000 Z=3.0000
Command:
Recapitulare
· AutoCAD-ul folose[te sistemul de coordonate carteziene 3-D
pentru a specifica punctele.
· Un punct AutoCAD este reprezentat `n AutoLISP sub forma
unei liste de numere reale.
· AutoLISP-ul reprezint\ un punct AutoCAD 2-D sub forma unei
liste format\ din dou\ numere reale.
· Un punct AutoCAD 3-D este reprezentat sub forma unei liste cu
trei numere reale.
· Func]ia quote poate construi o list\ de numere din constante.
· Func]ia list poate construi o list\ de numere din constante sau din
variabile.
·54
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Partea I
1. Introduce]i expresiile `n coloana din st`nga.
2. Scrie]i valoarea returnat\ a fiecarei expresii `n coloana din mijloc.
3. Dac\ o legatur\ simbol apare `n cadrul expresiei, scrie]i-i valoarea `n
coloana din dreapta.
(setq y 2.0)
(setq z 0.0)
(list x y z)
!pt1
!pt2
(quote (x y z))
!notapoint
Tabelul 15. Crearea punctelor din liste de numere
Partea a II-a
1. ~n acela[i desen din partea I introduce]i expresiile care urmeaz\.
2. Crea]i o Linie [i un Cerc folosind variabilele legate de liste formate din
numere reale a[a cum s`nt punctele pentru comenzile AutoCAD.
3. Legaturile simbol se bazeaz\ pe partea I a acestui exerci]iu.
Command: line
From point: !pt1
To point: !pt2
To point: Enter
Command: circle
3P/2P/TTR/<center point>: 2p
First point on diameter: !pt1
Second point on diameter: !pt2
5,6,0
1,2,0
·56
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Separarea listelor
Av`nd instruc]iuni pentru construirea listelor - func]iile list [i quote - ne-ar fi
de folos s\ avem [i c`teva instruc]iuni pentru separarea listelor.
Obiective
~n acest capitol ve]i studia:
· Cum s`nt reprezentate listele `n memoria computerului sub
forma unui arbore binar.
· Cum s`nt listele reprezentate grafic.
· Cum s\ folosi]i func]iile car [i edr pentru separarea listelor.
· Cum s\ separa]i liste care reprezint\ puncte `n AutoCAD [i cum
s\ specifica]i puncte prin crearea unor liste noi bazate pe
punctele existente.
·58
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
root of list
2.0 (3.0)
3.0 ()
Figura 22. Arbore binar complet pentru lista (1.0 2.0 3.0)
AutoLISP-ul are apelative speciale pentru cele dou\ par]i ale ramifica]iei
listei. Primul element al listei se nume[te car-ul listei. Lista f\r\ primul ei
element se nume[te cdr-ul listei. Ramifica]ia st`ng\ este partea car a listei iar
ramifica]ia dreapt\ este partea cdr.
root of list
car cdr
Figura 23. Partile car si cdr de la nodul radacina al listei.
·60
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Reprezentarea unei liste cu trei elemente atomice prin car [i cdr, c\reia `i este
atribuit simbolul x, ar ar\ta dup\ cum urmeaz\. Dac\ o list\ format\ din unul
sau mai multe elemente se afl\ la oricare din nodurile arborelui, este urmat\
de o ramifica]ie. Partea st`ng\ a ramifica]iei este car-ul listei la care se refer\
nodul iar partea dreapt\ este cdr-ul listei la care se refer\ nodul.
root of x
(car x) (cdr x)
root of list
pt
(1.0 2.0 3.0)
Figura 25. Grafic combinat pentru simbolul pt, legat de lista (1.0 2.0 3.0).
Recapitulare
· Listele s`nt reprezentate `n memorie sub forma unui arbore
binar.
· Primul element al listei este car-ul listei.
· Lista dup\ ce primul element este `ndep\rtat reprezint\ cdr-ul
listei.
· Func]iile car [i cdr formeaz\ ramifica]iile car [i cdr ale listei.
· O ramifica]ie cdr a unui arbore binar se termin\ `n nil sau lista
goal\.
·62
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
8.0 ?
? ?
? ?
xlst
(1.0 (2.0 3.0) 4.0)
(2.0 3.0) ?
(car (cdr xlst)) (cdr (cdr xlst))
? ? ? ?
(car (car (cdr xlst))) ? ? ?
? ?
? ?
·64
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Func]iile car [i cdr s`nt func]ii non-destructive. Nici una dintre ele nu
afecteaz\ legarea argumentului ei ceea ce este un mod curios de a spune
despre (car x) c\ poate returna o valoare diferit\ de x dar nu va schimba
valoarea lui x.
car
Func]ia car returneaz\ primul element al listei. Singurul argument al
func]iei car trebuie s\ fie o list\, iar lista trebuie s\ aib\ unul sau mai multe
elemente.
Exemplu
Introduce]i expresia care urmeaz\. Lega]i variabila pt la o list\ cu trei
numere reale. Folosi]i func]ia car pentru a returna coordonata x `n list\
(primul element) [i lega]i variabila x de acea valoare.
Command: (setq pt (list 1.0 2.0 0.0))
(1.0 2.0 0.0)
Command: !pt
(1.0 2.0 0.0)
Command: !pt
(1.0 2.0 0.0)
cdr
Func]ia cdr returneaz\ o list\ [i elementele ei cu excep]ia primului element;
cu alte cuvinte `ndep\rteaz\ primul element al listei `n afara valorii lui
returnate.
Exemplu
Introduce]i expresiile care urmeaz\.
Command: !pt
(1.0 2.0 0.0)
Folosi]i func]ia cdr pentru a returna o list\ f\r\ primul element [i lega]i
variabila yzlst de acea valoare.
Command: (cdr pt)
(2.0 0.0)
Command: !lyzlst
(2.0 0.0)
Command: !pt
(1.0 2.0 0.0)
·66
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
X1,Y1 X2,Y1
X1,Y2 X2,Y2
0,0
Considera]i c\ dou\ variabile s`nt legate de cele dou\ liste formate din
numere reale.
(setq pt1 (list 1.0 5.0 0.0))
(setq pt2 (list 10.0 1.0 0.0))
Acest tabel arat\ func]iile necesare pentru returnarea valorilor X, Y [i Z din
fiecare punct.
coordinate pt1 pt2
·68
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
0,0
Exemplu
Introduce]i expresiile care urmeaz\.
Command: !pt1
(1.0 5.0)
Command: !pt3
(10.0 1.0)
Folosi]i func]iile car [i cdr pentru a extrage valorile X [i Y ale punctelor
cunoscute.
Command: (car pt1)
1.0
Command: !pt2
(1.0 1.0)
·70
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command: !pt4
(10.0 5.0)
Desena]i dreptunghiul folosind linia de comand\ AutoCAD.
pt1 pt4
1,5 10,5
pt2 pt3
1,1 10,1
0,0
Recapitulare
· Func]ia car returneaz\ primul element al unei listei.
· Func]ia cdr returneaz\ o list\ cu excep]ia primului element.
· Exist\ func]ii standard la care se face apel pentru stabilirea
componentelor X, Y [i Z ale unui punct reprezentat printr-o
list\.
Valorile X [i Y ale lui mpt pot fi exprimate aritmetic dup\ cum urmeaz\.
Instruc]iuni
Scrie]i un set de expresii AutoLISP care execut\ urmatoarele comenzi `n
ordine
1. Lega]i o variabil\ pt1 de lista format\ din dou\ numere reale 1.5 [i
8.9.
2. Lega]i o variabil\ pt2 de o list\ format\ din dou\ numere reale 7.8 [i
3.2.
3. Scrie]i un set de expresii care leag\ variabila midpt de punctul care se
afl\ la mijlocul distan]ei dintre punctele pt1 [i pt2.
Dupa ce a]i verificat expresiile `n editorul AutoCAD scrie]i-le mai jos.
·72
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum s\ chema]i o comand\ AutoCAD direct din AutoLISP.
· Cum s\ folosi]i [irul AutoLISP, s-expresiile constante [i
variabile ca r\spunsuri la cererile de comand\.
· Sintaxa func]iei AutoLISP command.
· Cum s\ evita]i lucrul c`nd traduce]i un program folosind
comenzile `n limba englez\ indiferent de versiunea
AutoCAD.
Func]ia command
Func]ia command apeleaz\ func]iile AutoCAD din AutoLISP. Func]ia
command accept\ un argument de tip [ir care trebuie s\ fie numele unei
comenzi AutoCAD [i oricare alte argumente op]ionale care ar fi `n mod
normal introduse `n linia de comand\.
Command: (command "line” (quote (1.0 1.0)) (quote (5.0 5.0)) "")
nil
Command: (setq pt1 (list 1.0 1.0) pt2 (list 5.0 5.0))
(5.0 5.0)
Efecte secundare
Func]ia command returneaz\ `ntotdeauna nil. Efectul secundar al unei
expresii command este mult mai interesant dec`t valoarea returnat\. Un efect
secundar al unei expresii AutoLISP reprezint\ o schimbare `n starea
programului care se produce datorit\ unei func]ii de apelare. Efectul
secundar al apel\rii unei func]ii setq este pentru a crea un nou simbol de
legatur\ sau pentru a atribui o valoare la o variabil\. Efectul secundar al
apel\rii unei func]ii command este de a realiza o comand\ AutoCAD care
modific\ fi[ierul grafic `ntr-un anume fel.
Exemplu
~ncepe]i un desen nou.
1,1
Figura 32. Linie de la 1.1 la 5.5
·74
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\.
Exemplu
Folosi]i valorile lui pt1 [i pt2 de la exerci]iul anterior.
Desena]i dou\ arce folosind pt1 [i pt2 ca puncte finale [i o valoare a razei de
3.5.
Command: arc
Center/<Start point>: !pt1
Center/End/<Second point>: e
End point: !pt2
Angle/Direction/Radius/<Center point>: r
Radius: 3.5
·76
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Globalizarea comenzilor
Recapitulare
· Functia command permite apelarea comenzilor AutoCAD din AutoLISP.
· {irul nul sau "" este tratat ca un return de c\tre func]ia command.
Command: circle
3P/2P/TTR/<Center point>: 3,3
Diameter/<Radius>: 0.5
Command: circle
3P/2P/TTR/<Center point>: 2p
First point on diameter: 1,1
Second point on diameter: 5,5
Command: arc
Center/<Start point>: 2,1
Center/End/<Second point>: c
Center: 1,1
Angle/Length of chord/<End point>: l
Length of chord: 1.414
Tabelul 17. Traducerea comenzilor in AutoLISP
·78
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu:
· Ve]i folosi AutoLISP-ul pentru a executa o comand\ AutoCAD
[i pentru a desena o nou\ entitate.
· Ve]i apela comanda AutoCAD PLINE din AutoLISP.
· Ve]i scrie un set de expresii AutoLISP pentru a desena o
polilinie rectangular\.
Instruc]iuni
1. ~ncepe]i un desen nou.
2. Crea]i urmatoarele legaturi de variabile `n AutoCAD:
·80
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum s\ cere]i informa]ii utilizatorului `n cadrul unui program
AutoLISP.
· Cum s\ cere]i coordonatele unui punct utilizatorului.
· Cum s\ cere]i o distan]\ utilizatorului.
· Cum s\ cere]i utilizatorului valoarea pe care o dori]i.
· Cum s\ folosi]i puncte [i distan]e de la utilizator `n cadrul
func]iilor AutoLISP command [i comenzilor AutoCAD.
Puncte si distan]e
Func]ia getpoint permite utilizatorului s\ selecteze un punct folosind orice
metode standard AutoCAD de selectare a punctelor: selectare grafic\,
coordonate absolute, relative sau relative polare, ag\]area obiectelor, filtre
de coordonate sau accesarea ultimului punct.
getpoint
Func]ia getpoint folose[te serviciile AutoCAD pentru a permite utilizatorului
s\ introduc\ un punct. Punctul selectat de utilizator reprezint\ valoarea
returnat\ a expresiei. AutoLISP-ul returneaz\ punctul sub forma unei liste
format\ din trei numere reale: valorile coordonatelor X, Y [i Z.
Command:(getpoint)
1,1,0
(1.01.00.0)
Func]ia getpoint este folosit\ pentru a ob]ine un punct de la utilizator `n
cadrul unei expresii AutoLISP. De exemplu ar putea fi nevoie s\ cere]i
utilizatorului din cadrul unui program AutoLISP, puncte care vor fi folosite
apoi ca puncte finale ale unei linii.
Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabilele pt1 [i pt2 de puncte pe
care le selecta]i cu mouse-ul `n cadrul unei func]ii de apelare getpoint [i
folosi]i variabilele `ntr-o comanda LINE.
Command: ( setq pt1 (getpoint))
pick a point
Command: (setq pt2 (getpoint))
pick a point
Command: (command “line” pt1 pt2””)
Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de un punct pe care
`l selecta]i cu mouse-ul [i variabila pt2 de un punct descris de coordonatele
polare relative. Folosi]i variabilele `n linia de comand\.
Command: (setq pt1 (getpoint ))
pick a point
Command: (setq pt2 (getpoint))
@2<45
·82
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de un punct pe care
`l selecta]i cu mouse-ul `n cadrul unei func]ii de apelare getpoint [i folosi]i
variabila `ntr-o comand\ CIRCLE.
Command: (setq pt1 (getpoint))
pick a point
getdist
Func]ia getdist cere utilizatorului dou\ puncte. Valoarea returnat\ este un
num\r real: distan]a 3-D `ntre dou\ puncte.
Command: (setq dst1 (getdist))
Second point: 2,2
1.41421
Command: !dst1
1. 41421
Func]ia getdist prime[te un argument op]ional, punctul de baz\ de la care
se m\soar\ distan]a. ~n acest caz func]ia cere utilizatorului un singur punct.
Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila pt1 de un punct
folosind coordonatele absolute [i variabila rad de distan]a dintre dou\
puncte pe care o selecta]i cu mouse-ul. Folosi]i variabila `n comanda
CIRCLE .
Command: (setq pt1 (getpoint))
5,5
(5.0 5.0 0.0)
Command: (setq rad (getdist))
pick two points
Command: (command “circle” pt1 rad)
Exemplu
Introduce]i expresiile care urmeaz\. Lega]i variabila cen de un punct pe care
`l selecta]i cu mouse-ul. Lega]i variabila rad de distan]a dintre cen [i un
punct pe care `l selecta]i cu mouse-ul. Folosi]i variabilele `n comanda
CIRCLE .
Command: (setq cen (getpoint))
pick a point
Command: (setq rad (getdist cen))
pick a point
Command: (command “circle” cen rad)
·84
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Dialog cu utilizatorul
Func]iile getpoint [i getdist primesc [i argumente op]ionale: un [ir de text care
este afi[at `n zona liniei de comand\ ca o cerere pentru utilizator.
Dac\ getdist cere dou\ puncte, se cere automat al doilea punct "Second
point:".
Recapitulare
·
· Func]ia getpoint returneaz\ un punct de la utilizator.
· Func]ia getdist returneaz\ o distan]\ dat\ sub forma unui num\r
real de la utilizator.
· Ambele func]ii primesc argumente op]ionale pentru utilizator.
· Utilizatorul poate aplica oricare dintre metodele AutoCAD de
specificare a punctelor [i distan]elor la o cerere AutoLISP
pentru un punct sau o distan]\.
Partea I
Instruc]iuni
Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD apoi scrie]i-le
mai jos.
1. Cere]i utilizatorului patru puncte.
2. Atribui]i-le variabilelor pt1 prin pt4.
3. Trasa]i o polilinie 2-D `nchis\ `ntre cele patru puncte.
Partea a II-a
Instruc]iuni
Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD apoi scrie]i-le
mai jos.
1. Cere]i utilizatorului un punct centru [i atribui]i valoarea unei variabile
numite cen.
2. Cere]i utilizatorului distan]a de la variabila cen [i atribui]i valoarea
unei variabile numite rad.
3. Desena]i un cerc cu centrul cen [i raza rad.
·86
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Partea a III-a
Instruc]iuni
Scrie]i un set de expresii. Testa]i-le `n editorul AutoCAD apoi scrie]i-le
mai jos.
1. Cere]i utilizatorului dou\ puncte.
2. Atribui]i-le variabilelor pt1 [i pt2.
3. Desena]i o polilinie 2-D `nchis\.
4. Folosi]i pt1 [i pt2 pentru col]urile opuse ale poliliniei.
5. Calcula]i celelalte dou\ puncte din pt1 [i pt2 folosind func]iile car, cdr [i
list.
·88
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Func]ii
Pe l`ng\ func]iile interne, AutoLISP-ul permite crearea func]iilor definite
de utilizator, adic\ func]ii ale caror seturi de instruc]iuni [i nume au fost
definite.
Obiective
~n acest capitol ve]i studia:
· Defini]ia func]iei AutoLISP.
· Cum s\ crea]i propriile func]ii AutoLISP.
· Sintaxa func]iei defun.
· Cum s\ trimite]i argumente unei func]ii.
· Cum returneaz\ func]ia o valoare.
(setq x 10)
Leg\turi noi se creaz\ prin folosirea subprogramului defun care este func]ia
de definire.
·90
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun apoi apela]i-o.
Command: (myfun)
3
Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun apoi apela]i-o.
myfun va returna radacina patrat\ a lui 624, rotunjit\ p`na la cel mai apropiat
num\r `ntreg.
Command: (myfun)
24
Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia myfun apoi apela]i-o.
myfun va returna distan]a dintre dou\ puncte alese de utilizator.
Command: (defun myfun () (getdist “From point: “))
MYFUN
Command: (myfun)
From point: pick a point
Second point: pick a point
function name
(+ 1 2) body of definition
function name
(+ 1 2) body of definition
·92
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o func]ie numit\ add-one care
solicit\ un argument. Ad\uga]i unu la valoarea lui [i returna]i. Folosi]i
func]ia cu dou\ valori diferite
.
Command: (defun add-one (x) (+ x 1))
ADD-ONE
Command: (add-one 1)
2
Command: (add-one 4)
5
Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o func]ie numit\ dtr care cere un
argument exprimat `n grade [i returneaz\ valoarea transformat\ `n radiani.
Folosi]i func]ia cu trei valori diferite.
Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o func]ie care se nume[te add-two
care cere dou\ argumente, adaug\ valorile lor [i returneaz\. Folosi]i func]ia
cu dou\ seturi de valori diferite.
·94
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
·
· Noile func]ii externe s`nt create cu ajutorul func]iei defun.
· Toate func]iile returneaz\ o valoare .
· Func]iile s`nt definite f\r\ argumente sau cu un num\r fix de
argumente solicitate .
· Argumentele unei func]ii s`nt evaluate oriunde s-ar afla `n
corpul defini]iei func]iei.
·
·
Partea I
Instruc]iuni
Partea a II-a
Instruc]iuni
1. Crea]i o func]ie numit\ rtd.
2. Func]ia solicit\ un argument.
3. Func]ia transform\ valoarea argumentului din radiani `n grade [i
returneaz\ valoarea.
4. Testa]i-o `n AutoCAD.
5. Scrie]i-o mai jos.
Formula aritmetic\ de transformare din radiani `n grade pentru valoarea r
este:
(r / pi) * 180
·96
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Partea a III-a
Instruc]iuni
1. Crea]i o func]ie numit\ rectangle.
2. Func]ia nu cere argumente.
3. Cere]i utilizatorului dou\ puncte [i memora]i-le sub form\ de variabile.
4. Trasa]i o polilinie 2-D `nchisa folosind punctele pentru col]urile opuse.
5. Calcula]i celelalte dou\ puncte cu ajutorul func]iilor car, cdr [i list.
6. Testa]i-o `n AutoCAD.
7. Scrie]i-o mai jos.
·98
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum s\ transforma]i o func]ie AutoLISP definit\ de utilizator
`ntr-o nou\ comand\ AutoCAD.
· Cum s\ folosi]i simbolul pause `n cadrul func]iilor de tip
command .
· Cum s\ ob]ine]i valoarea unei variabile de sistem `n AutoLISP.
Command: zoom
All/Center/Dynamic/Extens/Left/Previous/Vmax/Window/<Scale(X/XP>:
Center point:
Magnification or Heigh<current>:
Avem nevoie de dou\ valori pentru aceast\ func]ie: noul punct centru [i
factorul curent de afi[are multiplicat cu 2. Vom ob]ine cele dou\ puncte de
la utilizator prin suspendarea evolu]iei func]iei [i vom ob]ine factorul de
afi[are prin setarea variabilei de sistem VIEWSIZE.
Simbolul "pause"
Putem ob]ine un punct de la utilizator prin legarea unei variabile cu setq [i
getpoint [i transferarea variabilei c\tre comanda ZOOM.
Func]ia ZPLUS
Avem toate instruc]iunile necesare pentru definirea func]iei noastre.
· O modalitate de a suspenda comanda ZOOM [i de a permite
utilizatorului s\ selecteze un nou punct de centru.
· O modalitate de a ob]ine factorul de afi[are curent zoom.
Exemplu
Introduce]i expresiile care urmeaz\. Crea]i o nou\ func]ie numit\ zplus [i
folosi]i-o. zplus va afi[a noul punct de centru pe care `l selecta]i cu factorul
2. defun zp
Command: (defun zplus() )
1> (setq zplus-height (*0.5 (getvar “viewsize”)))
1> (command “zoom” “c” pause zplus-height))
ZPLUS
Command: (zplus)
All/Center/Dynamic/Extens/Left/Previous/Vmax/Windows/<Scale(X/XP)>:
Center point: pick a point 4.
Magnification or Heigh<9.0000>:4.5.000000000
Command: nil
Command:
Func]ia C:ZPLUS
O sintax\ special\ pentru numele func]iei definite de utilizator ne permite s\
apel\m func]ia sub o form\ prescurtat\ f\r\ s\ folosim paranteze. Aceast\
func]ie apare mai cur`nd sub forma unei comenzi AutoCAD dec`t sub
forma unei func]ii.
·100
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Dac\ numele unei func]ii `ncepe cu litera C:, atunci func]ia poate fi apelat\
fie sub forma unei func]ii sau sub forma unei comenzi.
Dac\ numele unei func]ii `ncepe cu caracterul C:, func]ia poate fi apelat\ pe
linia de comand\ fie ca o func]ie, fie ca o comand\.
Exemplu
Introduce]i expresiile care urmeaz\. Defini]i func]ia c:zplus [i apela]i-o `n
ambele moduri, ca o func]ie [i ca o comand\.
Command: (defunc: zplus ()
1> (setq zplus-height (* 0.5 (getvar "viewsize")))
1> (command "zoom" "c" pause zplus-height))
C:ZPLUS
Command: (c:zplus)
All/Center/Dynamic/Extents/Left/Previous/Vmax/Window/<Scale(X/XP)>:c
Center point: pick a point
Magnification or Height <2.250000>: 1125000000000
Command: nil
Command:zplus
All/Center/Dynamic/Extents/Left/Previous/Vmax/Window/<Scale(X/XP)>:
c Center point: pick a point
Magnification or Height <9.0000>: 4.5000000000
Command:nil
Command:
Recapitulare
·
· Simbolul pause permite utilizatorului s\ r\spund\ la o cerere
dintr-o comand\ AutoCAD apelat\ de func]ia AutoLISP de
tip command.
· Func]ia getvar stabile[te valoarea variabilei de sistem.
· Prefa]`nd numele unei func]ii definit\ de utilizator cu C: se
creaz\ o nou\ comand\ AutoCAD
·
Partea I
Partea a II-a
1. Defini]i o func]ie numit\ c:zminus.
2. Aceasta trebuie s\ fac\ acelea[i lucruri ca [i func]ia c:zplus, dar
schimba]i factorul de afi[are de la 2 la 1/2.
3. Scrie]i func]ia mai jos.
4. Testa]i-o `n AutoCAD.
·102
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum s\ scrieti fi[iere text care con]in programe AutoLISP.
· Cum s\ `ncarca]i fi[ierele program AutoLISP `n editorul
grafic AutoCAD.
· Cum lucreaz\ func]ia AutoLISP load.
· Cum s\ recunoa[te]i cele mai frecvente mesaje de erori `n
timpul inc\rc\rii.
·
Func]ia load cere un singur argument de tip [ir: numele fi[ierului .lsp de
`nc\rcat.
(load “filename”).
Dac\ ad\uga]i codul pentru func]ia c:rectangle la numele unui fi[ier
rectang.lsp pute]i `nc\rca fi[ierul `ntr-o sesiune de editare grafic\ f\r\ s\
reintroduce]i `ntreaga defini]ie a func]iei
C\utarea fi[ierului
can't open file for input -- LOAD failed Fisierul numit in Functia load nu poate fi
gasit., sau utilizatorul nu are acces sa
citeasca fisierul.
extra right paren S-a detectat una sau mai multe paranteze
dreapta in plus.
Recapitulare
·104
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Instruc]iuni
(defun c:rectangle ()
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command
"_.pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
)
Command: (load "rectang")
C:RECTANGLE
Command: rectangle
First corner:
·106
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum se `ntrerupe execu]ia unei func]ii definite de utilizator.
· Cum s\ anula]i afi[area cererilor de comand\ AutoCAD `n
timpul execut\rii unei comenzi AutoLISP.
· Conceptul de alocare [i de variabile locale [i globale.
· Diferen]a dintre variabilele locale [i globale.
· Cum s\ declara]i [i s\ folosi]i variabilele locale `n cadrul
defini]iei func]iei.
Func]ia AutoLISP prin1 va vizualiza un [ir vid pe ecran dac\ prin1 este
ultima expresie din defini]ia func]iei. De exemplu, aceast\ versiune
modificat\ a comenzii RECTANGLE nu vizualizeaz\ nil la cererea de comand\
dup\ ce aceasta a fost executat\.
( defun c:rectangle ()
(setq pt1 (getpoint "\nFirst corner: "))
(setq pt3 (getpoint "\nOther corner: "))
(command
"_.pline"
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
"c"
)
(prin1)
)
O variabil\ global\ este o variabil\ a c\rei legare (sau atribuire a unei valori)
a fost f\cut\ cu ajutorul func]iilor set [i setq [i nedeclarat\ local\ `n func]ie.
Variabilele globale pot fi vizualizate sub forma de liste pe ecran folosind
func]ia de apelare (familia de atomi 0).
·108
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Citi]i explica]iile [i introduce]i s-expresiile adecvate.
3
Command: !x
1
Ve]i defini apoi o func]ie global_var unde variabila x nu a fost definit\ nici
ca argument nici ca variabil\ local\; de aceea schimbarea `n interiorul
leg\turii se va face global, `n afara alocarii func]iei global_var.
Command: (defun global_var () (setq x 4) (print x))
GLOBAL_VAR
Command: (global_var)
4
Command: !x
4
·110
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Redefinirea comenzii
Pute]i `nlocui comenzile AutoCAD existente cu comenzi AutoLISP care au
acela[i nume.
Exemplu
Introduce]i expresiile care urmeaz\.
Command: line
.- line From point: pick a point
To point pick a point
To point:
Command: nil
Redefini]i comanda AutoCAD.
Command: redefine
Command name: line
·112
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
· Pute]i ie[i dintr-o func]ie apel`nd prin1 sau princ care reprezint\
ultima expresie `n corpul definitiei func]iei.
· Variabila de sistem CMDECHO poate suprima afi[area cererilor
de comand\ AutoCAD.
· AutoLISP-ul utilizeaz\ o schem\ dinamic\ de alocare.
· Variabilele globale s`nt accesibile pentru toate func]iile.
· Variabilele locale s`nt accesibile numai `n contextul func]iilor `n
care au fost declarate.
· Pute]i folosi variabile locale `n cadrul func]iilor pentru a evita
posibilitatea unor conflicte `ntre variabile cu acelea[i nume
din alte func]ii.
· Variabilele de sistem apelate de func]ia setvar nu se traduc
niciodat\ din englez\.
· Comenzile AutoCAD pot fi `nlocuite cu comenzi AutoLISP care
au acela[i nume, folosind comanda UNDEFINE.
· Comanda AutoCAD va fi `ntotdeauna apelat\ c`nd numele
comenzii este prefa]at printr-un punct; de exemplu . LINE,
indiferent dac\ comanda a fost anihilat\.
· Prefa]a]i `ntotdeauna numele unei comenzi cu un punct (.) sau
prin caracterul subliniere ( _ ) `n cazul func]iei de tip
command .
· Prefa]a]i `ntotdeauna op]iunea de comand\ prin caracterul
subliniere ( _ ) `n cazul func]iei de tip command.
~n acest exerci]iu:
· Ve]i consolida cuno[tin]ele cu privire la ordonarea func]iilor
C:, incluz`nd ie[irea func]iilor, dublarea cererii de comand\
[i declara]ia variabilei locale.
· Ve]i modifica fi[ierul rectang.lsp pentru a introduce noi
concepte din acest capitol.
· Ve]i crea un nou fi[ier text cu o func]ie modificat\.
Partea I
Etape de lucru
1. Modifica]i fi[ierul rectang.lsp
2. Ad\uga]i func]ia de ie[ire imediat\.
3. Anula]i ecoul cererii de comand\.
4. Declara]i variabilele corespunz\toare ca variabile locale.
5. ~nc\rca]i, lansa]i [i testa]i programul dup\ ce a]i f\cut modific\rile.
Partea a II-a
Etape de lucru
· Rescrie]i func]ia c:zplus de la sf`r[itul capitolul 12 `ntr-un fi[ier
numit zplus.lsp.
· Folosi]i func]ia getpoint pentru a ob]ine noul punct de centru a
ecranului.
· Anula]i ecoul din op]iunile [i cererile de comand\ ZOOM.
· Declara]i toate variabilele local.
· Introduce]i func]ia de ie[ire.
· ~nc\rca]i, demara]i [i testa]i programul dup\ ce a]i f\cut
modific\rile.
·114
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum se poate schimba controlul desf\[urarii unui program pe
baza unei expresii test.
· Cum s\ folosi]i testele de egalitate [i testele logice ca expresii
test.
· Diferen]a dintre simbolul t [i simbolul nil.
· Cum s\ determina]i tipul de date al unui obiect.
Ramificarea programului
Aceasta diagrama simpl\ ilustreaz\ principiul ramific\rii programului.
Set value of x
x = "Hello, world."?
~n aceast\ diagram\, dac\ valoarea variabilei x este egal\ cu [irul de tip text
"Hello, world", atunci programul se va ramifica `n expresia y [i va continua;
dac\ nu , se va ramifica `n expresia z [i va continua.
Func]iile care realizeaz\ testele condi]ionale s`nt folosite pentru ramifica]ii
`n interiorul programelor AutoLISP. Cele dou\ func]ii de baz\ pentru testele
condi]ionale s`nt:
· if
· cond
Unele valori sau seturi de valori s`nt testate cu if sau cond iar programul se
ramific\ conform rezultatelor testului. AutoLISP-ul dispune de o varietate
de func]ii care testeaz\ valorile pe baza anumitor criterii sau unele valori pe
·116
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
t si nil
~n AutoLISP, simbolul t este echivalentul pentru "adev\rat" `n orice test
condi]ional. Simbolul nil este echivalentul lui "fals".
Dac\ o expresie AutoLISP nu se evalueaz\, atunci expresia este nil sau fals\.
Dac\ o expresie nil este folosit\ `ntr-un test condi]ional, atunci va fi
executat\ o ramifica]ie pentru o condi]ie fals\.
Dac\ o expresie AutoLISP evalueaz\ orice altceva dec`t nil, atunci expresia
este t sau adev\rat\. Dac\ o expresie t este folosit\ `ntr-un test condi]ional,
atunci va fi executat\ ramifica]ia pentru o condi]ie adevarat\.
t[i nil se exclud mutual. Dac\ o expresie este t, atunci nu poate fi nil. Dac\ o
expresie este nil, atunci nu poate fi t.
~n acest exerci]iu:
· Ve]i `nv\]a s\ determina]i dac\ valoarea returnat\ a unei func]ii
este t sau nil.
Instruc]iuni
1. ~ntr-un desen nou, desena]i o entitate de tip linie.
2. Introduce]i expresiile `n coloana din st`nga a tabelului.
3. Determina]i dac\ expresiile s`nt t sau nil.
4. Verifica]i c\su]a adecvat\ din tabel.
Expresie t nil
!ename
!ename
(+ 1 2)
(- 1 1)
()
(command "u")
·118
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exerci]iu
Introduce]i expresiile care urmeaz\.
Lega]i dou\ variabile de valori numerice. Folosi]i variabilele ca argumente
la c`teva func]ii [i verifica]i rezultatele.
Command: (setq x 1)
1
Command: (<= x y)
T
Functie Test
= Egal cu
/= Nu este egal cu
equal Egal cu
eq Au aceeasi legatura
·120
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\.
Lega]i trei variabile de trei tipuri de date diferite: un simbol, un num\r real
[i o list\.
Command: (atom y)
T
Command: (atom z)
nil
S`nt aceste variabile liste?
Command: (listp x)
nil
Command: (listp y)
nil
Command: (listp z)
T
Exemplu
Introduce]i expresiile care urmeaz\.
·122
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Func]ii logice
Exist\ c`teva func]ii de test logic `n AutoLISP. ~n acest capitol vom studia
patru dintre cele mai importante func]ii: not, and, or [i logand .
Func]ia not
Func]ia not solicit\ un argument. Dac\ argumentul este nil, atunci expresia
returneaz\ t; dac\ nu, aceasta returneaz\ nil.
Func]ia not este o func]ie a c\rei valoare returnat\ este opusul argumentului
ei. Da]i-i nil [i va returna t. Da]i-i t [i va returna nil.
Exemplu
Command: (not nil)
T
Command: (not t)
nil
Func]ia and
Func]ia and solicit\ unul sau mai multe argumente. Dac\ unul dintre
argumente este nil, ea returneaz\ nil. Dac\ toate argumentele s`nt t , atunci
returneaz\ t.
Exemplu
Command: (and 1 2 3)
T
Func]ia or
Func]ia or solicit\ unul sau mai multe argumente. Dac\ unul dintre
argumente este t, func]ia returneaz\ t. Dac\ toate argumentele s`nt nil,
atunci func]ia returneaz\ nil.
Exemplu
Command: (or 1 2 3)
T
Func]ia logand
Func]ia logand are dou\ sau mai multe argumente care ar trebui s\ fie
numere `ntregi. Func]ia returneaz\ un num\r `ntreg.
7 X X X
3 X X
15 X X X X
Aceast\ expresie va returna un num\r `ntreg `n care to]i bi]ii care s`nt seta]i
la valoarea "adev\rat" `n toate cele trei argumente vor fi seta]i la valoarea
"adev\rat”. ~n acest caz, bi]ii pentru valorile 1 [i 2 vor fi returna]i ca
"adev\rat" de c\tre expresie, deoarece s`nt singurii bi]i seta]i "adev\rat" `n
toate cele trei argumente.
Command: (logand 7 15 3)
3
·124
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
· Ramificarea unui program depinde de valoarea unui test
condi]ional.
· Toate obiectele [i expresiile din AutoLISP s`nt t sau nil.
· AutoLISP dispune de o varietate de func]ii care testeaz\ tipul de
egalitate [i tipul de date ale obiectelor [i expresiilor.
· Pute]i testa tipul exact de date al unui obiect combin`nd func]iile
type [i =.
· Func]iile logice not, and [i or verific\ dac\ una sau mai multe expresii
s`nt t sau nil.
· Func]ia logand realizeaz\ o compara]ie AND bit cu bit a unei liste de
numere; aceasta func]ie va fi de ajutor `n combina]ie cu func]iile de
tip entity access mai t`rziu.
NOT| Orice atom, simbol sau expresie poate fi folosit\ ca expresie test
deoarece orice obiect `n LISP are o valoare: fie nil, fie altceva.
Obiective
~n acest capitol ve]i studia:
· Cum s\ folosi]i expresiile condi]ionale pentru a face salt la
diferite seturi de expresii `n cadrul programului AutoLISP
· Sintaxa func]iilor if [i cond.
· Cum s\ folosi]i func]ia progn pentru a executa multiple s-
expresii `n cadrul func]iei if.
Expresii condi]ionale
Func]ia if
Func]ia if are dou\ argumente obligatorii [i un al treilea argument care este
op]ional.
Dac\ valoarea primului argument este nil, AutoLISP-ul sare peste al doilea
argument. Dac\ exist\ cel de-al treilea argument op]ional, AutoLISP-ul il
evalueaz\.
·126
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(if
(I_return_true)
(do_this)
(else_do_this)
)
Exemplu
Introduce]i expresiile care urmeaz\:
Command: !y
1
Lega]i variabila x de o valoare a lui 0. Lega]i variabila y bazat\ pe valoarea
x.
Command: (setq x 0)
0
Command: !y
0
~n acest exerci]iu :
Etape de lucru
1. ~ntr-un fi[ier nou, folosi]i editorul de text pentru a crea o func]ie
numit\ c:snaptog.
2. Introduce]i codul de mai jos.
3. Func]ia ar trebui s\ comute modul SNAP `n func]ie de valoarea
curent\.
(defun c:snaptog (/ snapval)
(if
(= 1 snapval) ;if it's on...
(setvar "SNAPMODE" 0) ;turn it off...
(setvar "SNAPMODE" 1) ;otherwise, turn it on
)
·128
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Command: (setq x 1)
1
Command: !y
2
Command: !z
3
~n acest exerci]iu:
· Ve]i modifica func]ia existent\ de la exerci]iul 18.
· Ve]i folosi func]ia progn.
· Ve]i executa s-expresii multiple prin apelarea unei func]ii if.
Etape de lucru
1. ~n editorul de text, deschide]i fi[ierul snaptog.lsp din directorul
student.
2. Redenumi]i func]ia c:modetog .
3. Cu ajutorul func]iei progn, ad\uga]i codul care comut\ SNAPMODE [i
GRIDMODE pe baza valorii curente a lui SNAPMODE.
4. Salva]i fi[ierul pe disc ca modetog.lsp.
5. ~nc\rca]i programul modificat `n AutoCAD.
6. Testa]i comanda MODETOG.
·130
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Func]ia cond
Func]ia cond cere un argument obligatoriu [i un num\r oarecare de
argumente op]ionale.
Func]ia cond este de preferat func]iei if ori de c`te ori exist\ mai mult de
dou\ cazuri de testat, adic\ mai mult de dou\ ramific\ri `n orice punct din
program.
Exemplu
Aceast\ defini]ie a func]iei va introduce valori diferite `n zona liniei de
comand\, `n func]ie de valoarea numeric\ a variabilei x.
Recapitulare
Func]ia if testeaz\ o expresie [i se ramific\ spre oricare dintre cele dou\ s-
expresii.
Func]ia cond poate testa mai multe expresii [i poate executa orice num\r de
s-expresii `ntr-o ramifica]ie dat\.
·132
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu:
· Ve]i folosi func]ia cond `n cadrul unei func]ii noi.
· Ve]i testa o variabil\ pentru egalitate numeric\.
· Ve]i executa toate trei ramifica]iile expresiei cond.
Etape de lucru
1. Crea]i o nou\ func]ie `ntr-un nou fi[ier cu ajutorul editorului de text.
2. Numi]i aceast\ func]ie testx.
3. Func]ia cere un argument obligatoriu.
4. ~ntr-o instruc]iune cond, folosi]i testele de egalitate pentru a vedea
dac\ valoarea argumentului este egal\, mai mic\ sau mai mare dec`t
0.
5. Dac\ este satisfacut un test de egalitate, folosi]i func]ia prompt pentru a
semnaliza utilizatorul.
·134
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Bucle de program
Buclele de program reprezint\ un concept important pentru orice limbaj de
programare. Buclele permit instruc]iunilor programului s\ fie executate de
nenum\rate ori pe baza valorii unei espresii test.
Obiective
~n acest capitol ve]i studia:
· Cum s\ folosi]i buclele pentru a repeta un set de expresii.
· Sintaxa func]iilor repeat [i while.
" Testa]i o expresie. Dac\ expresia este adev\rat\, atunci executa]i un set de
instruc]iuni ale programului, pe r`nd, apoi testa]i expresia din nou. Dac\
este tot adev\rat\, executa]i toate instruc]iunile programului apoi testa]i din
nou expresia la infini.
Func]ia repeat
Func]ia repeat cere dou\ argumente [i un num\r oarecare de argumente
op]ionale.
Primul argument trebuie s\ fie un num\r `ntreg (sau evaluat `ntr-un num\r
`ntreg). Acesta spune func]iei repeat de c`te ori s\ execute al doilea
argument p`n\ la al n -lea argument.
Exemplu
Command: (repeat 3 (prompt "\nHello"))
Hello
Hello
Hellonil
nil de la sf`r[it este valoarea returnat\ de func]ia repeat .
Exemplu
Introduce]i expresiile care urmeaz\.
~n func]ia count, dup\ ce variabila num este legat\ de 0, valoarea lui num este
vizualizat\ pe monitor [i incrementat\ cu 1 p`n\ la un total de 10 ori.
Command: (defun count ()
1> (setq num 0)
1> (repeat 10 (print num) (setq num (1+ num)))
1> (prin1))
COUNT
Folosi]i func]ia count. Aceasta va introduce numerele de la 0 la 9 `n zona
liniei de comand\.
Command: (count)
0
1
2
3
4
5
6
7
8
9
·136
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
~ntr-un desen nou, desena]i cel pu]in trei (3) entit\]i de orice fel.
Apela]i initget care are un num\r `ntreg ca argument [i/sau o list\ de cuvinte
cheie acceptabile, imediat dup\ apelarea unei func]ii GETXXX.
~n acest exerci]iu:
· Ve]i consolida cuno[tin]ele despre bucle de program.
· Ve]i consolida cuno[tin]ele despre func]ia cond.
· Ve]i folosi func]ia repeat pentru a executa un set de s-expresii de
un num\r stabilit de ori.
· Ve]i scrie o func]ie care cere utilizatorului num\rul de bucl\ri de
program.
· Ve]i folosi instruc]iunea cond `n cadrul buclei.
Etape de lucru
1. ~ncepe]i un desen nou `n AutoCAD.
2. Desena]i un Cerc cu centrul `n punctul 5,5 [I o raz\ de o unitate.
3. ~n editorul text, deschide]i fi[ierul numit displace.lsp din directorul
student.
4. Crea]i func]ia c:displace . Folosi]i codul `n displace.lsp ca baz\ pentru
func]ie.
5. DISPLACE ar trebui s\ execute urm\toarele:
· S\ cear\ utilizatorului o incrementare a deplas\rii.
· S\ cear\ utilizatorului de c`te ori s\ execute deplasarea.
· S\ cear\ utilizatorului direc]ia de deplasare.
· S\ repete codul care restabile[te ultima entitate desenat\ [i care
este vizualizat\ pe monitor [i s\ o deplaseze cu un increment
adecvat de un num\r de ori.
·138
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Func]ia while
Func]ia repeat este cea mai simpl\ func]ie de buclare util\ dac\ [ti]i exact de
c`te ori trebuie s\ repeta]i evaluarea grupului de expresii anterioare intr\rii
buclei.
Totu[i ve]i `nt`lni ocazii c`nd ve]i dori s\ repeta]i ceva de un num\r
nedefinit de ori; adic\ num\rul de repeti]ii nu poate fi determinat `naintea
intr\rii `n bucl\.
Exemplu
(setq x 0) ;set initial value for test
(while
(< x 10) ;while x is less than 10...
(print x) ;print value of x...
(setq x (+ 1 x)) ;add 1 to x and then...
) ;go back to test expression
NO YES
) go back to test
·140
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Pentru a ie[i dintr-o bucl\ while, valoarea expresiei test trebuie s\ fie egal\ cu
nil. De aceea, dac\ expresia test este ini]ial t, valoarea expresiei test trebuie
s\ se schimbe ca rezultat al unei atribuiri din cadrul corpului buclei.
Recapitulare
· Buclele repet\ un set de expresii.
· Buclele pot repeta de un num\r de ori prestabilit sau p`n\ ce
valoarea expresiei test este nil.
· Func]ia repeat repet\ un set de expresii de un num\r de ori
stabilit.
· Func]ia while repet\ un set de s-expresii p`n\ ce expresia test este
egal\ cu nil.
~n acest exerci]iu:
· Ve]i consolida cuno[tin]ele despre buclele de program din
AutoLISP.
· Ve]i modifica o func]ie existent\ de la exerci]iul anterior.
· Ve]i crea un program care deseneaz\ dreptunghiuri multiple.
· Ve]i folosi func]ia while.
Etape de lucru
1. ~n editorul de text, `nc\rca]i fi[ierul rectangle.lsp.
8. Salva]i fi[ierul.
·142
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Despre [irurile text [i valorile lor
· Cum s\ folosi]i caracterele de control `n [irurile text.
· Cum s\ lua]i [iruri text de la utilizator.
· Cum s\ folosi]i comanda AutoCAD TEXT cu variabile AutoLISP-
ul legate la [iruri text.
· Diferen]ele dintre cele [ase func]ii de tip\rire `n AutoLISP.
· Cum s\ folosi]i func]iile de tip\rire.
Command: !x
"This is a string."
Caractere de control
Caracterul "\" precede un caracter de control `n cadrul unui [ir text.
Caracterul care urmeaz\ imediat are o semnifica]ie special\.
Cod Semnificatie
\\ \ caracter
\e caracter escape
\n caracter newline
\r caracter return
\t caracter tab
Func]ia getstring
Func]ia getstring a[teapt\ ca utilizatorul s\ introduc\ un [ir text. Are dou\
argumente op]ionale: suprim\ caracterul spa]iu ca [i return [i un [ir de la
utilizator.
Dac\ primul argument op]ional este furnizat [i acesta nu este nil, atunci este
posibil ca [irul s\ con]in\ spa]ii; primul spa]iu din [ir este tratat ca "return".
Exemplu
Introduce]i expresiile care urmeaz\.
Command: !txt
"single"
Lega]i variabila txt de [irul text `n care s-au introdus spa]ii.
Command: (setq txt (getstring T "\nEnter text: "))
Enter text: embedded spaces
"embedded spaces"
Command: !txt
"embedded spaces"
·144
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Comanda TEXT va tip\ri `ntotdeauna valoarea unei variabile [ir atunci c`nd
este apelat\ `n cadrul unei func]ii AutoLISP de tip command indiferent de
setarea TEXTVAL.
Exemplu
~ntr-un desen nou introduce]i expresiile care urmeaz\.
Prima comand\ TEXT va tip\ri !txt1. A dou\ comand\ TEXT va tip\ri Second
line. Vezi figura 18-1.
Command: (setq txt1 "First line.")
"First line."
Command: text
Justify/Style/<Start point>: 1,5
Height: 0.5
Rotation: 0
Text: !txt1
Command: text
Justify/Style/<Start point>: Enter
Text: !txt2
·146
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Func]iile de tip\rire
Exist\ [ase func]ii de tip\rire `n AutoLISP. Cinci dintre ele tip\resc [iruri
text iar una tip\re[te caractere text. Trei dintre aceste func]ii tip\resc orice
fel de expresii indiferent dac\ acestea s`nt de tipul [ir text. Func]ia pentru
caractere [i patru dintre func]iile de tip [ir pot tip\ri nu numai `ntr-un fi[ier
dar [i pe un monitor.
Functia Argumente Descriere
Intrarea [i ie[irea `n/[i dintr-un fi[ier incluz`nd [i tip\rirea `ntr-un fi[ier vor
fi discutate mai t`rziu `n acest curs.
Recapitulare
· {irurile text s`nt caractere alfanumerice aflate `ntre ghilimele
duble.
· Caracterele de control din cadrul unui [ir de tip text `ncep cu
un caracter "a".
· Func]ia getstring primeste [iruri interactiv de la utilizator.
· Variabila de sistem TEXTEVAL demonstreaz\ cum comanda
AutoCAD TEXT va tip\ri o variabil\ AutoLISP.
· AutoLISP-ul dispune de o varietate de func]ii de tip\rire pentru
diferite `ntrebuin]\ri.
·148
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu:
· Ve]i consolida cuno[tin]ele despre [iruri de tip text [i func]ii de
tip\rire.
· Ve]i ob]ine dou\ [iruri text interactiv de la utilizator.
· Ve]i folosi [irurile de tip text cu patru dintre func]iile de tip\rire.
Etape de lucru
1. Intoduce]i expresiile care urmeaz\.
2. Lega]i cinci variabile de la a la d de diferite tipuri de date: num\r
`ntreg, list\, [ir [i [ir care con]ine caractere de control.
Command: (setq a 1)
·150
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Accesul la entit\]i
Fiec\rei entit\]i dintr-o sesiune de editare `i este atribuit un nume de
entitate de c\tre AutoCAD. Numele unei entit\]i este un
identificator unic al fiec\rei entit\]i dintr-un desen. Numele unei
entit\]i se poate schimba de la o sesiune de editare la alta, dar
fiecare nume de entitate este unic determinat\ `n timpul unei
sesiuni de editare.
Obiective
Command: line
From point: 1,1
To point: 5,5
To point: Enter
Folosi]i func]ia entlast pentru a stabili numele ultimei entit\]i ad\ugate la
desen, adic\ entitatea Line. (Num\rul din numele entit\]ii poate fi diferit pe
computerul dumneavoastra).
Command: (entlast)
<Entity name: 60000022>
Func]ia entlast stabile[te numele ultimei entit\]i principale ne[tears\ din
desen.
Command: !ename
<Entity name: 60000022>
Exemplu
Introduce]i expresiile [i comenzile care urmeaz\. Expresia AutoLISP va
[terge entitatea Line. Comanda U o va restabili.
Command: (command "erase" ename "")
nil
·152
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command: U
GROUP
5,5
1,1
Figura 42.Entitati tip linie si cerc
Folosi]i func]ia entnext pentru a extrage numele primei entit\]i din baza de
date, adic\, entitatea Line.
Exemplu
Introduce]i expresiile care urmeaz\.
Afla]i numele primei entit\]i din desen, entitatea Linie. Sterge]i-o.
Restabili]i-o cu comanda U.
Command: (setq ename (entnext))
<Entity name: 60000022>
Command: U
ERASE
Afla]i numele ultimei entit\]i din desen: entitatea Circle. Deplasa]i-o cu o
unitate `n directia X pozitiv\ din pozi]ia ini]ial\.
Command: (setq ename (entlast))
<Entity name: 60000028>
·154
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
5,5
1,1
Figura 43. Situatia dupa miscarea cercului cu o unitate in directia X pozitiva
Func]ia entnext are un argument op]ional: numele unei entit\]i. ~n acest caz
func]ia entnext returneaz\ numele entit\]ii care urmeaz\ dup\ argument `n
baza de date.
Dac\ nu exist\ nici o entitate care se urmeze dup\ cea din numele
argumentului entita]ii, entnext returneaz\ nil.
De exemplu acest set de expresii vor returna numele celei de a doua entit\]i
din baza de date.
sau
Expresia care urmeaz\ ar [terge atunci a doua entitate din baza de date.
Command: (command "erase" ename2 "")
Ar fi bine s\ se poat\ stabili numele tuturor entit\]ilor din baza de date, pe
r`nd, pentru a le procesa una c`te una. Func]ia entnext poate face acest lucru
c`nd este plasat\ `ntr-o bucl\ while `mpreun\ cu instruc]iunile de procesare
pentru entit\]i.
Recapitulare
· Fiecare entitate dintr-un desen are un nume unic de entitate.
· Numele entit\]ilor nu se schimb\ niciodat\ `n timpul unei sesiuni
de editare grafic\, dar se pot schimba pe parcursul sesiunilor
de editare grafic\.
· AutoLISP dispune de func]ii care returneaz\ numele entit\]ii.
· Func]ia entlast returneaz\ numele ultimei entit\]i ad\ugat\ la
desen.
· Func]ia entnext returneaz\ numele primei entit\]i ad\ugat\ la
desen sau numele entit\]ii care urmeaz\ dup\ argumentul
op]ional.
· Pute]i folosi entnext [i o bucl\ while pentru a accesa fiecare
entitate din desen.
· Numele entit\]ilor pot fi folosite cu comenzi AutoCAD.
·156
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu:
· Ve]i aprofunda cuno[tin]ele despre accesarea numelor de
entit\]i.
· Ve]i crea o comanda MOVEALL care afl\ numele fiec\rei entit\]i
din baza de date, pe r`nd, [i deplaseaz\ fiecare entitate cu o
unitate `n X pozitiv.
· Ve]i folosi func]iile entnext [i while.
· Ve]i folosi numele entit\]ilor [i comanda AutoCAD MOVE.
Etape de lucru
1. Folosi]i editorul de texte pentru a salva urm\torul cod `n fi[ierul numit
moveall.lsp.
(defun c:moveall ()
(setq ename (entnext)) ;get first entity
(while
ename ;we have an entity?
(command "._MOVE" ename "" "1,0" "") ;move it
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)
Command: moveall
~n acest exerci]iu:
· Ve]i aprofunda cuno[tin]ele despre accesarea numelor de
entit\]i.
· Ve]i modifica func]ia de la exerci]iul 24.
· Ve]i folosi func]iile entnext [i while.
· Ve]i crea o comand\ care scaleaz\ fiecare entitate din desen.
· Ve]i tip\ri num\rul de entita]i scalate folosind un contor `n
cadrul unei bucle.
Aceste expresii vor tip\ri [irul “Scaling entity 1.” `n zona liniei de
comand\.
(setq counter 1)
Etape de lucru
1. Deschide]i fi[ierul text moveall.lsp.
4. Modifica]i c:moveall .
·158
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Formatul unei perechi cu punct sau cum s\ crea]i o astfel de
pereche.
· Formatul unei liste asociate.
· Cum s\ extrage]i o list\ asociat\ unei entit\]i.
· Cum s\ examina]i o lista asociat\.
· Cum s\ determina]i tipul entit\]ii din lista asociat\.
Perechi cu punct
O pereche cu punct este o form\ special\ a unei liste. O pereche cu punct
este o list\ format\ din dou\ elemente a c\rei parte cdr din arborele binar se
termin\ cu ultimul element al listei [i nu cu nil.
At`t listele obi[nuite c`t [i perechile cu punct s`nt folosite `n listele asociate
entit\]ilor pentru a reprezenta grupul de coduri DXF [i valorile asociate
acestora.
Perechile cu punct con]in `ntotdeauna dou\ elemente. Primul element al
unei perechi cu punct poate fi stabilit la fel ca [i primul element al unei liste
obi[nuite: cu func]ia car. Al doilea element al perechii cu punct poate fi
stabilit direct cu func]ia cdr [i acest lucru difer\ de modul `n care se
stabile[te al doilea element dintr-o list\ obi[nuit\.
Exemplu
Perechea cu punct care con]ine cele dou\ elemente 0 [i "Line" arat\ astfel.
(0 . "LINE")
Ilustra]ia care urmeaz\ prezint\ arborii binari pentru dou\ obiecte similare: o
list\ [i o pereche cu punct, ambele con]in`nd acelea[i elemente.
(0 "LINE") (0 . "LINE")
0 ("LINE") 0 "LINE"
car cdr
"LINE" ()
Figura 44. Arbori binari pentru lista obisnuita si pereche cu punct avind elemente
identice.
Func]ia cons
Func]ia cons cere dou\ argumente obligatorii: o valoare care se adaug\ [i o
valoare la care se adaug\.
Dac\ valoarea care se adaug\ este un atom, atunci func]ia cons returneaz\ o
pereche cu punct a celor dou\ elemente.
Dac\ valoarea la care se adaug\ este o lista, atunci func]ia cons returneaz\
lista cu primul argument ad\ugat `n capul listei.
Exemplu
Introduce]i expresiile care urmeaz\.
·160
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Primul element al fiec\rei subliste este tipul acelei liste. Celelalte elemente
reprezint\ datele asociate cu codul.
De exemplu, codul din prima sublist\ este num\rul `ntreg -1. Data asociat\
este numele entit\]ii. Codul din a dou\ sublist\ este num\rul `ntreg 0. Data
asociat\ este tipul entit\]ii; `n acest caz, o entitate Line.
Exist\ mici diferen]e `ntre codurile de grup dintr-un fi[ier DXF [i codurile
de grup returnate `ntr-o list\ asociat\ unei entit\]i. ~n anexa din AutoLISP
Programmer’s Reference Manual g\si]i lista corect\ a codurilor de grup
pentru liste asociate entit\]ilor.
Acestea s`nt codurile listelor asociate entit\]ilor (sau coduri de grup DXF)
pentru entitatea Line.
-1 Numele entitatii
8 Layer
10 Punct de start
11 Punct final
·162
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
~ncepe]i un desen nou [i desena]i o linie de la 1,1 la 5,5; tip\ri]i expresiile
care urmeaz\.
Command: (setq ename (entnext))
<Entity name: xxxxxxxx>
Command: (setq elist (entget ename))
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Command: !elist
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Command: !elist
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Aceast\ expresie va returna sublista care descrie layerul entit\]ii.
Command: (assoc 8 elist)
(8 . "0")
~n aceast\ expresie, apel\m cdr care returneaz\ layerul entit\]ii.
Command: (cdr (assoc 8 elist))
"0"
Exemplu
Introduce]i expresiile care urmeaz\.
Command: !ename
<Entity name: xxxxxxxx>
Command: !elist
( (-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 1.0 1.0 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
Extrage]i tipul entit\]ii, Layerul [i punctul de start al sublistei din lista
asociat\.
Command: (assoc 0 elist)
(0 . "LINE")
·164
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
· Perechile cu punct au dou\ elemente [i s`nt forme speciale de
liste.
· Al doilea element al perechii cu punct este returnat de cdr.
· Perechile cu punct s`nt folosite ca liste obi[nuite `n listele
asociate entit\]ilor.
· Entit\]ile `nregistrate `n baza de date s`nt reprezentate `n
AutoLISP sub forma de liste asociate.
· O lista asociat\ este o list\ de liste.
· Fiecare sublist\ dintr-o list\ asociat\ are dou\ p\r]i: car [i cdr.
· Partea car a unei liste asociate entit\]ii este un cod de grup DXF
care desemneaz\ o proprietate a entit\]ii car este de asemenea
denumit codul sublistei.
· Partea cdr a unei liste asociate entit\]ii reprezint\ valoarea codului
de grup DXF.
· Func]ia assoc returneaz\ o sublista prin c\utarea unui cod.
~n acest exerci]iu :
· Ve]i consolida cuno[tin]ele despre listele asociate entit\]ilor.
· Ve]i folosi func]ia entget .
· Ve]i modifica func]ia de la exerci]iul 25.
· Ve]i crea o func]ie care scaleaz\ numai entit\]ile de tip Line din
desen.
Etape de lucru
1. Deschide]i fi[ierul text scaleall.lsp.
2. Salva]i textul `ntr-un nou fi[ier scline.lsp.
3. Schimba]i numele func]iei din c:scaleall `n c:scline.
4. Modifica]i func]ia ca s\ scaleze numai entit\]ile de tip Line din desen.
5. Salva]i fi[ierul.
6. Desena]i c`teva tipuri de entit\]i `n desen:.Lines, Circles and Arcs.
7. Inc\rca]i fi[ierul scline.lsp [i activa]i comanda SCLINE. Numai entit\]ile
de tip Line vor fi scalate cu aceasta comand\.
·166
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
C:SCALEALL
(defun c:scaleall ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(command "._SCALE" ename "" "0,0" "0.5");scale it
(prompt ;tell user which one
(strcat
"\nScaling entity "
(itoa counter)
".\n"
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)
C:SCLINE
(defun c:scline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(if ;if it's a Line...
(=
"LINE"
(cdr (assoc 0 (entget ename)))
)
(progn
(command "._SCALE" ename "" "0,0" "0.5");scale it and...
(prompt ;tell user which one
(strcat
"\nScaling entity "
(itoa counter)
".\n"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)
·168
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Obiective
~n acest capitol ve]i studia:
· Cum s\ modifica]i o list\ asociat\ unei entit\]i.
· Cum s\ actualiza]i `nregistrarea unei entit\]i `ntr-un desen pe
baza schimb\rilor din lista asociat\.
Pute]i folosi func]ia subst pentru a `nlocui o valoare `ntr-o list\ asociat\ unei
entit\]i.
Iat\ un exemplu care ilustreaz\ modul cum func]ioneaz\ func]ia subst. Vom
`nlocui num\rul 15 cu num\rul 16 `n lista noastr\ de p\trate de numere
`ntregi.
Exemplu
Introduce]i comenzile [i expresiile care urmeaz\.
Command: line
From point: 1,1
To point: 5,5
To point: Enter
Folosi]i func]ia subst pentru a schimba punctul de start al listei asociate
entit\]ii Line.
·170
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Folosi]i func]ia entmod pentru a aplica modific\rile la entitatea Line pe baza
modific\rilor f\cute `n copia listei asociate.
Command: !elist
((-1 . <Entity name: xxxxxxxx>) (0 . "LINE") (8 . "0") (10 7.5 2.5 0.0) (11
5.0 5.0 0.0) (210 0.0 0.0 1.0))
5,5,0 5,5,0
1,1,0 7.5,2.5,0
Recapitulare
· O sublist\ dintr-o list\ asociat\ poate fi `nlocuit\ cu func]ia subst.
· Func]ia entmod va actualiza `nregistrarea unei entit\]i `n baza de
date pe baza modific\rilor din lista asociat\.
~n acest exerci]iu:
· Ve]i aprofunda cuno[tin]ele despre modificarea entita]ilor [i
despre listele asociate.
· Ve]i folosi func]ia entmod.
· Ve]i modifica func]ia de la exerci]iul 26.
· Ve]i modifica listele asociate tuturor entit\]ilor Line.
· Ve]i actualiza `nregistrarea entit\]ilor acestora.
Etape de lucru
· Deschideti fi[ierul text scline.lsp.
· Salva]i textul `ntr-un fi[ier nou numit modline.lsp.
· Schimba]i numele func]iei din c:scline `n c:modline.
· Modifica]i func]ia.
· Dac\ entitatea este de tip Line, modifica]i-i punctul de cap\t din
valoarea curent\ `n punctul 5.0, 5.0, 0.0.
· Salva]i fi[ierul.
· ~ntr-un desen nou, desena]i c`teva linii [i cercuri `n diferite
pozi]ii.
· ~nc\rca]i fi[ierul modline.lsp.
· Activa]i comanda MODLINE.
·172
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
C:SCLINE
(defun c:scline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(if ;if it's a Line...
(=
"LINE"
(cdr (assoc 0 (entget ename)))
)
(progn
(command "._SCALE" ename "" "0,0" "0.5");scale it and...
(prompt ;tell user which one
(strcat
"\nScaling entity "
(itoa counter)
".\n"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)
C:MODLINE
(defun c:modline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(setq elist (entget ename)) ;get its assoc list
(if ;if it's a Line...
(= "LINE" (cdr (assoc 0 elist)))
(progn
(entmod ;change its end point
(subst '(11 5.0 5.0 0.0) (assoc 11 elist) elist)
)
(prompt ;tell user which one
(strcat
"\nModifying entity "
(itoa counter)
".\n"
)
)
)
)
(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
~n acest exerci]iu:
· Ve]i aprofunda cuno[tin]ele despre modificarea entit\]ilor [i
listele asociate.
· Ve]i scrie o func]ie care s\ modifice toate entita]ile de tip
Dimmension din desen.
Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg `n directorul student.
Obiective
~n acest capitol ve]i studia:
· Cum s\ extrage]i numele unei entit\]i interactiv cu utilizatorul.
· Cum s\ folosi]i func]ia entsel.
· Cum s\ deplasa]i centrul cercului selectat de utilizator.
Func]ia entsel
Func]ia entsel v\ cere s\ selecta]i un singur obiect. Func]ia returneaz\ o list\
cu dou\ obiecte: numele entit\]ii [i punctul `n care a fost selectat; dac\ nu se
selecteaz\ nimic atunci func]ia returneaz\ nil.
Pute]i extrage numele entit\]ii din lista returnat\ de func]ia entsel cu ajutorul
func]iei car.
Exemplu
Introduce]i expresiile care urmeaz\.
Command: line
From point: 1,1
To point: 5,5
To point: Enter
Command: circle
3P/2P/TTR/<Center point>: 5,5
Diameter/<Radius>: 1
Selecta]i cercul `n punctul 5,6,0 ca r\spuns la cererea func]iei entsel [i lega]i
valoarea returnat\ de variabila epick.
Command: !epick
(<Entity name: xxxxxxxx> (5.0 6.0 0.0))
·176
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command: !ename
<Entity name: xxxxxxxx>
Recapitulare
· Func]ia entsel extrage o list\ a propriet\]ilor unui obiect selectat
de utilizator: numele entit\]ii [i punctul `n care a fost
selectat.
· Partea car a unei liste selectate de entsel reprezint\ numele unei
entit\]i.
~n acest exerci]iu:
· Ve]i consolida cuno[tin]ele despre selec]ia interactiv\ a
entit\]ilor.
· Ve]i crea un program care cere utilizatorului s\ selecteze o
entitate Circle [i un nou punct de centru care deplaseaz\
centrul cercului
Etape de lucru
1. ~n editorul de texte, deschide]i fi[ierul text numit circen.lsp din
directorul student.
2. Ad\uga]i codul care face urmatoarele:
· Define[te func]ia c:circen.
· Cere utilizatorului o entitate cu func]ia entsel .
· Dac\ utilizatorul selecteaz\ o entitate, codul trimite lista asociat\
entit\]ii ca argument la func]ia circen_mod .
3. Salva]i fi[ierul.
4. ~nc\rca]i programul `n AutoCAD.
5. Verifica]i comanda CIRCEN `ntr-un desen care con]ine cel pu]in un cerc.
·178
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
c:movelast
· Deplasa]i ultima entitate `n baza de date.
· Cere]i operatorului punctul de baz\ [i al doilea punct al
deplas\rii..
c:printent
· Selecta]i fiecare entitate din desen, una dup\ alta.
· Tip\ri]i fiecare tip [i layer ale entit\]ii `n zona liniei de comand\.
c:red
· Cere]i operatorului s\ selecteze o entitate.
· Schimba]i culoarea entit\]ii `n RED (reprezentat\ `ntr-o list\
asociat\ de codul de grup 62 [i num\rul `ntreg 1).
· Observa]i c\ pute]i ad\uga o nou\ sublist\ la lista asociat\ `n loc
s\ `nlocui]i o list\ existent\ folosind func]ia entmod. O sublist\
de grup 62 nu este prezent\ `ntr-o list\ asociat\ unei entit\]i
dac\ culoarea entit\]ii este BYLAYER.
c:chglayer
· Cere]i operatorului s\ selecteze o entitate.
· Cere]i operatorului numele unui nivel.
· Schimba]i nivelul entit\]ii.
Tratarea erorilor
AutoLISP dispune de o metod\ pentru tratarea erorilor de program [i de
utilizare.
Obiective
~n acest capitol ve]i studia:
· Cum s\ folosi]i func]iile exit [i quit pentru a for]a o eroare
AutoLISP.
· Cum s\ `nlocui]i rutina implicit\ AutoLISP de tratare a erorilor.
· Cum s\ utiliza]i rutina de tratare a erorilor pentru "a [terge" un
program dup\ ce a fost abortat din cauza unei erori sau
pentru c\ utilizatorul a anulat programul.
· Cum s\ folosi]i comanda UNDO `n rutina de tratare a erorilor.
Func]iile exit [i quit for]eaz\ aplica]ia curent\ s\ se termine prin for]area unei
erori AutoLISP. Ele returneaz\ [irul "quit/exit abort" [i transfer\ [irul
func]iei de tratare a erorilor *error*. Dup\ executarea func]iei de tratare a
erorilor, AutoCAD-ul se `ntoarce la linia de comand\.
Func]ia *error*
Pute]i fi siguri c\ pozi]ionarea unei variabile de sistem sau o anumit\
condi]ie AutoCAD pot fi restabilite dup\ apari]ia unei erori nea[teptate
folosind func]ia *error*. ~n cadrul acestei func]ii care poate fi definit\ de
utilizator pute]i evalua condi]iile de eroare, pute]i returna un mesaj adecvat
utilizatorului [i puteti restabili setarea variabilelor AutoCAD.
Redefini]i subrutina veche de tratare a erorilor prin comanda exit sau prin
exit dintr-o nou\ subrutin\ de tratare a erorilor.
·180
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
·182
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu:
· Ve]i aprofunda cuno[tin]ele despre modul cum se folose[te o
rutin\ de tratare a erorilor.
· Ve]i modifica func]ia de la exerci]iul 29.
Etape de lucru
1. Ad\uga]i o rutin\ de tratare a erorilor pentru comanda CIRCEN `n
fi[ierul circen.lsp.
2. Folosi]i exemplul de la c:rectangle ca o baz\ de la care s\ porni]i.
3. ~nc\rca]i programul `n AutoCAD.
4. Activa]i comanda CIRCEN [i anula]i-o cu Ctrl-C pentru a verifica rutina
de tratare a erorilor.
·184
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Aceast\ defini]ie a comenzii RECTANGLE permite utilizatorului s\ anuleze
rezultatele comenzii `ntr-o singur\ etap\.
Instruc]iunea if testeaz\ dac\ UNDO este activat\. Dac\ da, atunci d\ o
comand\ UNDO MARK la `nceputul rutinei.
Dup\ ce utilizatorul introduce o comand\ RECTANGLE, utilizatorul poate
anula rezultatul comenzii cu comenzile U sau UNDO BACK.
(if
(= 1 (logand 1 (getvar "UNDOCTL")))
(command "._UNDO" "_MARK")
)
(prin1)
)
Exemplu
Extindem codul UNDO pentru a include rutina de tratare a erorilor. Dac\
rutina este anulat\ dintr-un motiv oarecare [i UNDO este disponibil,
rezultatul comenzii p`n\ la punctul de eroare este anulat automat. Se seteaz\
o variabila de condi]ie pentru a fi examinat\ `n rutina de tratare a erorilor.
Un UNDO GROUP este activat `n comand\ [i corelat cu un UNDO END.
·186
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(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
)
)
)
·188
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Opera]ii cu fi[iere
AutoLISP poate citi [i scrie fi[iere text de tip ASCII.
Obiective
~n acest capitol ve]i studia:
· Ce este un descriptor de fi[ier [i cum este folosit.
· Cum s\ deschide]i un fi[ier pentru opera]ii de citire sau scriere.
· Cum s\ scrie]i linii de text `ntr-un fi[ier deschis.
· Cum s\ citi]i linii de text dintr-un fi[ier deschis.
· Cum s\ descoperi]i sf`r[itul unui fi[ier text.
· Cum s\ `nchide]i un fi[ier.
Command: !fp
<File: #xxxxx>
Aceast\ expresie va `nchide fi[ierul deschis [i `n care s-a scris `n cele dou\
exemple anterioare.
Command: (setq fp (close fp))
Deoarece descriptorul de fi[ier fp nu mai este valid dup\ ce fi[ierul la care
se refer\ este `nchis, de exemplu dac\ se seteaza fp la nil este echivalent cu a
`nchide fi[ierul. Se elibereaz\ astfel memoria [i se ob]ine asigurarea c\ fp nu
poate fi folosit `n afara contextului.
Exemplu
Introduce]i expresiile care urmeaz\.
·190
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Command: !fp
<File: #xxxxx>
Scrie]i c`teva linii de text `ntr-un fi[ier.
Command: (write-line "Coders" fp)
"Coders"
Command: (write-line "of the" fp)
"of the"
Command: (write-line "Lost Spark" fp)
"Lost Spark"
~nchide]i fi[ierul.
Command: (setq fp (close fp))
nil
Command: !fp
nil
Deschide]i fi[ierul test.txt `n editorul text [i examina]i-l. Ar trebui s\ con]in\
trei linii de text.
Coders
of the
Lost Spark
·192
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\.
Command: !fp
<File: #XXXX>
Citi]i prima, a dou\ [i a treia linie din fi[ier.
nil
Command: !fp
nil
Recapitulare
· Un descriptor de fi[ier este un pointer al unui fi[ier returnat de
func]ia open.
· Un program trebuie s\ p\streze un descriptor de fi[ier pentru a
avea acces la fi[ierul pe care l-a deschis.
· Fi[ierele pot fi deschise pentru opera]ii de citire, scriere [i
ad\ugare.
· Argumentele pentru modul de deschidere a fi[ierelor la func]ia
open trebuie s\ fie litere mici.
· Un fi[ier poate fi deschis numai pentru o singur\ opera]ie.
· Func]iile write-line [i read-line scriu [i citesc din fi[iere.
· Func]ia read-line returneaz\ nil c`nd ajunge la cap\tul fi[ierului.
·194
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(if
r_fp_name
(setq w_fp_name (getfiled "Destination File" "" "txt" 1))
)
(if
(or
(not r_fp_name)
(not w_fp_name)
)
(progn
(prompt "\nMust specify both source and destination file.")
(exit)
)
·196
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(if
(= r_fp_name w_fp_name)
(progn
(prompt "\nSource same name as destination file.")
(exit)
)
)
(if
(not (setq r_fp (open r_fp_name "r")))
(progn
(prompt "\nCould not open source file.")
(exit)
)
)
(if
(not (setq w_fp (open w_fp_name "w")))
(progn
(setq r_fp (close r_fp))
(prompt "\nCould not open destination file.")
(exit)
)
)
(while
r_fp_line
(write-line r_fp_line w_fp)
(setq r_fp_line (read-line r_fp))
)
·198
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Etape de lucru
1. Deschide]i un nou fi[ier `n editorul text.
·200
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
; Iotext.lsp
;
; Command function IOTEXT prompts for the name of a text file.
; It reads each line of the file and draws the corresponding Text
; entities `n AutoCAD.
;
; It prompts for the height, rotation angle and insertion point
; of the text. Text is always drawn left-justified.
(defun C:IOTEXT()
·202
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
;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))
)
Seturi de selec]ie
AutoCAD-ul poate a[eza grupuri de entit\]i `n seturi de selec]ie. Comenzile
AutoCAD [i func]iile AutoLISP pot ac]iona asupra unui set de selec]ie [i
fac`nd aceasta, poate ac]iona global asupra grupului de entit\]i din setul de
selec]ie.
Obiective
~n acest capitol ve]i `nv\]a:
· Cum s\ crea]i un set de selec]ie.
· Cum s\ folosi]i un set de selec]ie cu comenzi AutoCAD.
· Cum s\ crea]i un set de selec]ie interactiv, cu fereastr\, cu filtru
[i prin selectarea tuturor componentelor dintr-un desen.
· Cum s\ afla]i lungimea num\rului de entit\]i `ntr-un set de
selec]ie.
· Cum s\ lucra]i cu nume de entit\]i `ntr-un set de selec]ie.
·
·
·204
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Functia Operatia
(ssget "W" '(1.0 1.0 0.0) '(11.0 8.0 0.0)) Selecteaza toate entita]ile din
fereastra de la 1,1,0 la 11,8,0
Exemple de lucru
Deschide]i desenul ssget.dwg `n directorul student. Ve]i folosi acest desen
pentru urm\toarele patru exemple care arat\ cum s\ folosi]i ssget.
Selec]ia interactiv\
Func]ia ssget apelat\ f\r\ argumente va genera cererea standard "select
objects:" `n zona liniei de comand\ [i va permite utilizatorului s\ selecteze
obiecte interactiv. C`nd utilizatorul termin\ procesul de selec]ie cu tasta
Return sau Space, func]ia ssget returneaz\ valoarea ei sub forma unui nou
set de selec]ie.
Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.
·206
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
C`nd s`nte]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.
Folosi]i func]ia ssget pentru a crea un set de selec]ie format din toate
entit\]ile din desen.
Command: (setq ss1 (ssget "X"))
<Selection set: 2>
{terge]i toate obiectele din desen.
Command: (command ".erase" ss1 "")
Reface]i obiectele [terse.
Command: oops
Exemplu
C`nd s`nte]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.
Crea]i un set de selec]ie din entit\]i care apar]in unei ferestre definit\ de
punctele 6,3,0 [i 11,8,,0.
Command: (setq ss1 (ssget "W" '(6 3 0) '(11 8 0)))
<Selection set: 3>
{terge]i toate entit\]ile care se afl\ `n interiorul ferestrei.
Command: (command ".erase" ss1 "")
Reface]i toate entit\]ile [terse.
Selectarea cu filtru
Func]ia ssget v\ permite s\ selecta]i entit\]ile prin filtru. Pute]i filtra `n
acord cu oricare dintre propriet\]ile entit\]ilor care s`nt p\strate `n coduri de
grup DXF `n cadrul listelor asociate entit\]ilor.
Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.
Crea]i un set de selec]ie format din entit\]ile de tip Line din desen.
Command: (setq ss1 (ssget "X" '((0 . "LINE"))))
<Selection set: 4>
{terge]i toate entit\]ile de tip Line din desen.
Command: (command ".erase" ss1 "")
Reface]i obiectele [terse.
Command: oops
Seta]i variabila ss1 pe nil [i elibera]i resursele folosite curent de setul de
selec]ie.
Command: (setq ss1 nil)
nil
·208
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.
Exemplu
C`nd v\ afla]i `n desenul ssget.dwg, introduce]i expresiile care urmeaz\.
·210
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
· Grupurile de entit\]i pot fi plasate `n seturi de selec]ie.
~n acest exerci]iu:
Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg din directorul student.
2. ~n editorul de text deschide]i fi[ierul numit chdim.lsp din directorul student.
3. Ad\uga]i codul care realizeaz\ urm\toarele:
· Crea]i o func]ie numit\ c:chdim .
· Cere]i utilizatorului un set de selec]ie.
· Explora]i fiecare entitate din setul de selec]ie.
· Transfera]i ficare list\ asociat\ entit\]ii ca argument la func]ia
chdim_mod.
· Elibera]i setul de selec]ie.
4. Salva]i fi[ierul chdim.lsp.
5. ~nc\rca]i fi[ierul `n AutoCAD [i `ncerca]i comanda CHDIM.
6. Ie[i]i din desen moddim f\r\ a salva modific\rile.
7. Dac\ ave]i timp v\ pute]i modifica programul astfel:
· Ad\uga]i o rutin\ de tratare a erorilor.
· Ad\uga]i un dic]ionar de date.
· Transforma]i variabilele corespunz\toare mai degrab\ `n
variabile locale dec`t `n variabile globale.
·212
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Codul care urmeaz\, implementeaz\ o versiune a CHDIM care este din punct
de vedere func]ional echivalent\ cu versiunea anterioar\. Aceast\ versiune
folose[te un filtru pentru set de selec]ie `n combina]ie cu o selec]ie
interactiv\ de entit\]i cu scopul de a amplasa numai entit\]ile de tip
dimension `n setul de selec]ie.
Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg din directorul student.
(defun c:chdim2 ()
;get a selec]ion-set from user and filter out all but dimensions
(setq ss (ssget “X”((0 . "DIMENSION"))))
Obiective
~n acest capitol ve]i studia:
Func]ia tblnext are o sintax\ ciudat\. Func]ia cere un argument: un [ir care
corespunde unuia dintre numele de tabele AutoCAD. Dac\ se adaug\ al doilea
argument op]ional [i acesta nu este nil, atunci func]ia tblnext returneaz\ primul
nume de simbol din tabel; dac\ nu se adaug\ argumentul, func]ia returneaz\
simbolul cerut care `l urmeaz\ pe cel returnat prin apelarea anterioar\ a func]iei
tblnext.
·214
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Aceast\ expresie returneaz\ lista asociat\ pentru prima intrare `n tabelul
layer.
Command: (tblnext "LAYER" t)
((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))
Lista asociat\ este o list\ cu perechi cu punct, a c\rei cod este realizat `n
acela[i mod `n care s`nt realizate codurile pentru liste asociate entit\]ilor.
Deoarece nu lucr\m cu entit\]i individuale, este clar c\ aceast\ list\ asociat\
nu are un grup -1 reprezent`nd un nume de entitate.
Exemplu
Dac\ un desen ar con]ine layerele din tabelul de mai jos, atunci s-expresiile
care urmeaz\ ar returna listele asociate ar\tate mai jos.
Layer Stare Culoare Tipul de linie
(while
tlist
(print tlist)
(setq tlist (tblnext "LAYER"))
)
·216
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu :
· Ve]i crea o nou\ func]ie care scaneaz\ fiecare intrare din tabel.
Etape de lucru
1. Deschide]i desenul moddim.dwg `n directorul student.
2. ~ntr-un fi[ier nou din editorul text, introduce]i codul care urmeaz\.
Acesta implementeaz\ func]ia c:tlist.
Exemplu
Aceast\ expresie caut\ layerul 0 [i-i returneaz\ lista asociat\.
Command: (tblsearch "LAYER" "0")
((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "CONTINUOUS"))
Recapitulare
· AutoCAd p\streaz\ simbolurile cum ar fi layer-ele [i Block Definitions
`n tabele.
·218
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu:
Instruc]iuni
1. Deschide]i desenul moddim.dwg din directorul student.
2. ~ntr-un fi[ier nou din editorul de text introduce]i codul care urmeaz\.
Acesta implementeaz\ func]ia c:chklayer .
(if
(tblsearch "LAYER" lname) ;layer exists?
(prompt (strcat "\nLayer " lname " exists. ")) ;yes
(prompt (strcat "\nLayer " lname " does not exist. ")) ;no
)
Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg `n directorul student.
2. ~ntr-un fi[ier nou din directorul student scrie]i dou\ func]ii: c:chktable [i
c:layerset .
c:chktable
1. ~ntreab\ utilizatorul ce tabel\ s\ caute.
c:layerset
1. ~ntreab\ utilizatorul care este numele layerului.
·220
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Etape de lucru
1. Deschide]i fi[ierul grafic moddim.dwg din directorul student.
2. ~ntr-un fi[ier nou din editorul de text, introduce]i codul care urmeaz\.
Acesta implementeaz\ func]ia c:tsearch .
(defun c:tsearch ()
(if
(not tlist) ;if no list, then target...
(progn ;was not found, so exit.
(prompt "\nNo such entry.")
(exit)
)
)
(while
tlist ;while we still have a list...
(print (car (car tlist))) ;print first group code...
(print (cdr (car tlist))) ;and value from assoc list...
(setq tlist (cdr tlist)) ;then truncate assoc list.
)
·222
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
c:runfolose[te func]ia dosdir din fi[ierul xdos.exe, o aplica]ie ADS real mode
pentru ACAD R12 care se afl\ `n CompuServe ACAD Forum `n Library 2.
xdos este `n directorul student din computerul dvs. Instruc]iunile de folosire
a acestei func]ii se afl\ `n fi[ierul xdos.txt.
·224
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(defun C:RUN ()
(if
(not (member "DOSDIR" (atoms-family 1))) ;Check for dosdir function.
(if ;If not there, attempt to
(= "bad" (xload "XDOS.EXE" "bad")) ;load XDOS program; exit
(progn ;if attempt fails.
(prompt "\nCan't load XDOS.EXE.")
(exit)
)
)
)
;The script commands will open each drawing `n turn, load the
;file run.lsp and apply the run_report command to each file.
(defun C:RUN_REPORT ()
(if
(setq block_table_list (tblnext "BLOCK" t)) ;We have a Block?
(progn
(prompt "\nFinding Block names.") ;Keep the customer happy.
(while ;Add its name to the list and
block_table_list ;get the next one.
(setq block_name (cdr (assoc 2 block_table_list)))
(setq block_name_list (cons block_name block_name_list))
(setq block_table_list (tblnext "BLOCK"))
)
·226
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
·228
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Accesul la Polilinii
Poliliniile s`nt entit\]i complexe. Ele s`nt formate dintr-o entitate principal\
de tip "POYLINE" urmat\ de una sau mai multe entit\]i de tip " VERTEX"
terminate de o entitate de tip "SEQUEND". Aceast\ diagram\ ilustreaz\ lan]ul
de entit\]i [i numele lor.
POLYLINE SEQEND
VERTEX
Sub entity
VERTEX
or
SEQEND
(defun c:polylist ()
(if
(/= "POLYLINE" etype) ;if not a Polyline, exit
(progn
(prompt "\nNot a polyline.")
(exit)
)
)
·230
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(if
(= 2 (logand 2 vflags))
(princ "\nCurve-fit tangent defined for this vertex.")
)
(if
(= 8 (logand 8 vflags))
(princ "\nSpline vertex created by spline-fitting.")
)
(if
(= 16 (logand 16 vflags))
(princ "\nSpline frame control point.")
)
(if
(= 32 (logand 32 vflags))
(princ "\n3D Polyline vertex.")
)
(if
(= 64 (logand 64 vflags))
(princ "\n3D Polyline mesh vertex.")
)
(if
(= 128 (logand 128 vflags))
(princ "\nPolyface mesh vertex.")
)
)
)
;stop screen from scrolling
(getstring "\n\nPress RETURN to continue...")
)
(setq *error* old_error) ;restore old error handler
(prin1) ;quiet exit
)
·232
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Any type
(if
(/= "INSERT" etype) ;if not an Insert, exit
(progn
(prompt "\nNot a block.")
(exit)
)
)
·234
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
)
(setq *error* old_error) ;restore old error handler
(prin1) ;quiet exit
)
·236
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplul 1
(entmake
'(
(0 . "LINE")
(8 . "0")
(10 1.0 1.0 0.0)
(11 5.0 5.0 0.0)
(210 0.0 0.0 1.0)
)
)
Exemplul 2
(entmake
(list
(cons 0 "LINE")
(cons 8 "0")
(list 10 1.0 1.0 0.0)
(list 11 5.0 5.0 0.0)
(list 210 0.0 0.0 1.0)
)
)
Crea]i o func]ie numit\ c:xline `ntr-un fi[ier text numit xline.lsp `n directorul
student
·238
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Polylines
Expresiile care urmeaz\ creaz\ o entitate de tip polilinie pe layerul curent [i
UCS cu o eleva]ie 0 [i dou\ vertexuri la 1,1,0 [i 5,5,0.
(entmake
(list
(cons 0 "POLYLINE")
(cons 66 1)
(list 10 0.0 0.0 0.0)
)
)
(entmake
(list
(cons 0 "VERTEX")
(list 10 1.0 1.0 0.0)
)
)
(entmake
(list
(cons 0 "VERTEX")
(list 10 5.0 5.0 0.0)
)
)
(entmake
(list
(cons 0 "SEQEND")
)
)
Blocks
Expresiile care urmeaz\ creaz\ o defini]ie Block numit\ myblock `n tabelul
Block. Defini]ia are un punct de baz\ de 5,5,0 [i este format\ din
urm\toarele entit\]i:
(entmake
(list
(cons 0 "LINE")
(list 10 5.0 5.0 0.0)
(list 11 10.0 1.0 0.0)
)
)
(entmake
(list
(cons 0 "CIRCLE")
(list 10 5.0 5.0 0.0)
(cons 40 1.0)
)
)
(entmake
(list
(cons 0 "ENDBLK")
)
)
·240
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
·242
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Tratarea [irurilor
AutoLISP dispune de un set redus de func]ii care realizeaz\ opera]ii de baz\
pe [iruri: lungimea [irului, modificarea caracterelor, concatenarea [i
analiza.
Obiective
~n acest capitol ve]i studia:
· Cum s\ determina]i num\rul de caractere dintr-un [ir.
· Cum s\ modifica]i caracterele dintr-un [ir.
· Cum s\ concatena]i dou\ sau mai multe [iruri.
· Cum s\ analiza]i un [ir, fiecare caracter pe r`nd.
Func]ia strlen
{irurile de tip text s`nt formate din 0 sau mai multe caractere aflate `ntre
semnele cit\rii duble (“). Un [ir cu nici un caracter este reprezentat ca "",
sau cu null string.
Exemplu
Introduce]i expresiile care urmeaz\. Afla]i lungimea c`torva [iruri de text.
.Command: (strlen "")
0
Func]ia strcase
Func]ia strcase cere un argument [i un argument op]ional. Primul argument
trebuie s\ fie un [ir de tip text. Dac\ al doilea argument este omis sau este
nil, [irul cu toate caracterele transformate `n litere mari este returnat; sau
dac\ al doilea argument este t, adic\ nu este nil, atunci se returneaz\ [irul cu
caracterele transformate `n litere mici.
Exemplu
Introduce]i expresiile care urmeaz\. Transforma]i caracterele celor trei
[iruri de tip text.
Command: (strcase "to upper")
"TO UPPER"
Func]ia strcat
Func]ia strcat cere unul sau mai multe argumente [i fiecare dintre ele trebuie
s\ fie un [ir de tip text. Func]ia returneaz\ un singur [ir text: rezultatul
concaten\rii argumentelor.
Exemplu
Introduce]i expresiile care urmeaz\. Concatena]i cele dou\ [iruri.
Command: (setq x "one" y "two")
"two"
·244
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduce]i expresiile care urmeaz\. Formula]i o cerere dintr-un [ir [i un
num\r `ntreg.
Command: (setq index 1)
1
Command: (setq a "Processing object " b "...")
"..."
Command: (strcat a (itoa 1) b)
"Processing object 1..."
Analiza [irurilor
Pu]ine texte `n Lisp acord\ subiectului despre analiza [irurilor importan]a
cuvenit\. De[i pare ciudat, probabil v\ este mai comod s\ c\uta]i un text
despre limbajul C cu explica]ii [i exemple de analiz\ a [irului. Manualele
The C Programming Language de Brian Kernighan [i Dennis Ritchiei,
Programming `n C de Stephen G. Kochan [i Advanced Turbo C de Herbert
Schildt s`nt manuale care acord\ cel pu]in un capitol [irurilor [i analizei
[irurilor.
Func]ia substr
Func]ia substr cere trei argumente: un [ir de tip text, un num\r `ntreg de
indexare a caracterelor din [ir de la st`nga la dreapta, [i un pas de
incrementare a num\rului de caractere spre dreapta [i inclusiv a caracterului
indexat.
Func]ia substr returneaz\ un [ir care `ncepe cu caracterul indexat din [ir [i se
continu\ cu num\rul de caractere din dreapta indexului indicat de al treilea
argument.
Argumentul index `ncepe cu 1; adic\ primul caracter din [ir are indexul 1.
(substr "123456" 4 1)
(repeat
(strlen string)
(print (substr string index 1))
(setq index (1+ index))
)
Recapitulare
· strlen returneaz\ lungimea unui [ir `n caractere.
· Func]ia strcase poate returna un [ir de tip text a c\rui caractere
s`nt transformate `n litere mari sau mici.
· Func]ia strcat concateneaz\ dou\ sau mai multe [iruri.
· Analiza [irului `n AutoLISP se face cu func]ia substr.
·246
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
~n acest exerci]iu:
· Ve]i concatena [iruri pentru a crea cereri la utilizator.
· Ve]i folosi lungimea [irului pentru a determina de c`te ori
trebuie repetat\ o bucl\.
· Ve]i analiza toate caracterele dintr-un [ir, pe r`nd, [i ve]i elimina
toate spa]iile din [ir.
Etape de lucru
~n editorul de text crea]i un fi[ier nou numit nospace.lsp `n directorul
student.~n acest fi[ier crea]i o func]ie numit\ nospace. Aceast\ func]ie ar
trebui s\ fac\ urmatoarele opera]ii `n ordine.
7. S\ incrementeze indexul cu 1.
Pute]i rezolva acest exerci]iu dac\ Lotus® 1-2-3® [i Microsoft® Excel s`nt
instalate `n computerul dvs.
Generalit\]i
Programele de calcul tabelar cum s`nt programele Lotus 1-2-3 [i Microsoft
Excel pot scrie date `ntr-un fi[ier de tip text. Fiecare linie din calculul
tabelar reprezint\ un singur r`nd de text `n fi[ierul de ie[ire. Coloanele
dintr-un [ir s`nt separate unele de altele printr-un caracter delimitator.
Delimitatorul este selectabil de c\tre utilizator [i de obicei lipsit de TAB sau
virgul\.
Etape de lucru
1. Lansa]i programul de calcul tabelar.
·248
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
; PARSE.LSP
; Version 1.0 3/29/93
;
; (parse str str expr)
;
; Parse a delimited text string and return a list of strings. Adds a
; null string between two sequential delimiters.
;
; Arguments:
;
; str (required) Text string to parse.
; str (required) Character used to delimit the string.
; expr (required) If t, return delimiter as a separate string.
;
; Local variables:
;
; char STR Current character from string.
; index INT Current location of character from string.
; rl LIST Return list of strings.
; sstr STR Current string to add to return list.
; strl INT Length of string.
(setq ;initialize...
sstr "" ;string to place `n list
rl nil ;list to return
index 1 ;character index `n string
strl (strlen str) ;length of string
)
);end repeat
·250
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
; TEST_PARSE.LSP
; Version 1.0 3/30/93
;
; test_parse
;
; Test the function (parse). Use two lists of strings with different
; delimiter characters: "\t" and ",". Test for both nil and t delimiter
; flag. Write test results to the log file TESTPARS.TXT `n the current
; directory. Write an error message with index every time (parse) fails
; to match a value `n a result list.
;
;
; Local variables:
;
; fp FILE Pointer to log file
; string STR Current string argument to parse
; t1 LIST List of strings to test
; t2 LIST List of strings to test
; t1_r1 LIST List of t1 results for nil delim flag
; t1_r2 LIST List of t1 results for t delim flag
; t2_r1 LIST List of t2 results for nil delim flag
; t2_r2 LIST List of t2 results for t delim flag
(setq index 0)
(repeat
(length t1)
(setq string (nth index t1))
(print string fp)
(print (parse string "\t" nil) fp)
(print (parse string "\t" t) fp)
(if
(not
(equal
(setq x (parse string "\t" nil))
(setq y (nth index t1_r1))
)
)
(print
(strcat
"Test t1_r1 failed `n index " (itoa index) "."
)
fp
)
);end if
(if
(not
(equal
(parse string "\t" t)
(nth index t1_r2)
)
)
(print
(strcat
"Test t1_r2 failed `n index " (itoa index) "."
)
fp
)
);end if
(setq index (1+ index))
);end repeat
·252
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
(setq index 0)
(repeat
(length t2)
(setq string (nth index t2))
(print string fp)
(print (parse string "," nil) fp)
(print (parse string "," t) fp)
(if
(not
(equal
(parse string "," nil)
(nth index t2_r1)
)
)
(print
(strcat
"Test t2_r1 failed `n index " (itoa index) "."
)
fp
)
);end if
(if
(not
(equal
(parse string "," t)
(nth index t2_r2)
)
)
(print
(strcat
"Test t2_r2 failed `n index " (itoa index) "."
)
fp
)
);end if
(setq index (1+ index))
);end repeat
(setq fp (close fp))
(prin1)
)
·254
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Pointere de entit\]i
Un pointer de entitate este un identificator unic [i permanent pentru o
entitate dintr-un desen AutoCAD. Aplica]iile pot folosi pointere de entit\]i
pentru a men]ine leg\turi asociative `ntre entita]i sau `ntre entit\]i [i seturi
arbitrare de date `n timpul sesiunii de editare grafic\.
Obiective
~n acest capitol ve]i studia:
· Cum s\ activa]i sau s\ distruge]i pointerele de entit\]i.
· Cum s\ extrage]i un pointer dintr-o list\ asociat\ entit\]ii.
· Cum s\ g\si]i o entitate cu ajutorul pointerului.
Pointerele s`nt p\strate `n codul de grup DXF cimpul 5 al unei liste asociat\
entit\]ii.
Exemplu
~ntr-o nou\ sesiune, introduce]i comenzile [i expresiile care urmeaz\.
Extrage]i un pointer de entitate [i stabili]i numele entit\]ii folosind
pointerul.
Command: !ehand
"1B" (sau un [ir similar)
·256
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
· Pointerele de entit\]i s`nt p\strate ca numere hexazecimale
exprimate sub form\ de [iruri.
· Pointerul nu poate fi schimbat niciodat\. El poate fi numai
distrus.
· Pointerele s`nt p\strate `n coduri DXF de grup 5 `ntr-o list\
asociat\ entit\]ii.
· Atribuirea de valori nu este `ntotdeauna secven]ial\.
· Comanda HANDLES activeaz\ sau dezactiveaz\ pointerele.
· Func]ia handent va returna numele entit\]ii prin pointerul
entit\]ii.
~n acest exerci]iu:
· Ve]i folosi un program pentru a citi pointerele entit\]ilor.
· Ve]i p\stra pointerele `ntr-un fi[ier extern.
· Ve]i citi fi[ierul extern [i ve]i crea un set de selec]ie din
pointerele entit\]ilor.
Programul savset.lsp din directorul student implementeaz\ dou\ comenzi
pentru AutoCAD: SAVESET [i GETSET.
Etape de lucru
P\stra]i seturile de selec]ie `n timpul sesiunii de editare prin scrierea [i
cititrea pointerelor `n/[i din fi[ierul extern.
· Deschide]i desenul ssget.lsp din directorul student.
· ~nc\rca]i programul savset.lsp `n AutoCAD.
· Folosi]i comanda SAVESET [i salva]i dou\ sau mai multe seturi
de selec]ie.
· Deschide]i o nou\ sesiune de editare grafic\ cu ssget.
· ~nc\rca]i programul saveset.lsp.
· Folosi]i comanda GETSET pentru a extrage unul dintre seturile
de selec]ie p\strate.
· Folosi]i comanda MOVE cu setul de selec]ie anterior.
· Deschide]i fi[ierul savset.lsp `n editorul de text [i examina]i
codul.
·258
AUTODESK , INC. TRAINING LECTII DE BAZA AUTOLISP