Documente Academic
Documente Profesional
Documente Cultură
LISP Romana PDF
LISP Romana PDF
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
Accesul la entităţi simple şi la blocuri.......................................................221
•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ă.
•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
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
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
Există două mari categorii de tipuri de date în AutoLISP: atomi şi liste.
Atomii sînt obiecte simple. Listele sînt obiecte complexe. Acest capitol
defineşte atomii şi listele.
Obiective
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
Exemplu
Această listă are trei elemente: funcţia de adunare +, lista (+ 1(+ 2 3)) şi
lista (+ 4 5).
(+ (+ 1 (+ 2 3)) (+ 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. Găsiţ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
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.
•22
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Dacă o listă este luată ca atare, atunci valoarea ei este lista însăşi. Acest
lucru va fi mai clar după explicarea funcţiei quote mai tîrziu în această
lecţie.
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
(.. .. (.. .. 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)
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.
•48
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Punctul 1,2,3 exprimat sub forma unui obiect AutoLISP este (1.0 2.0 3.0)
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:
•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
Figura 19. Linie si cerc folosind variabilele pt1 si pt2
•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
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.
•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.
Figura 24. Reprezentarea completa a unei liste cu trei atomi ca elemente cu car
si cdr.
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 ?
? ?
? ?
Figura 26. Completarea grafului binar
(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.
După 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
Toate versiunile AutoCAD-ului vor accepta comenzile şi opţiunile din
limbajul american şi englezesc indiferent de versiunea limbii sursă. Acest
lucru permite utilizatorului să scrie o aplicaţie AutoLISP care poate fi
folosită în toate versiunile de limbaj ale AutoCAD-ului fără a traduce
funcţiile command în limba sursă.
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:
(setq pt1 (list 1.0 1.0 0.0))
(setq pt3 (list 11.0 8.0 0.0))
•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
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
•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
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.
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
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
AutoLISP-ul va căuta fişierul rectang.lsp în directorul curent împreună cu
alte directoare menţionate în specificarea de cale a bibliotecii AutoCAD-
ului. Dacă găseşte fişierul, îl va încărca în editor.
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.
•104
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
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)
)
•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
Î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
1. Rescrieţi funcţia c:zplus de la sfîrşitul capitolul 12 într-un
fişier numit zplus.lsp.
2. Folosiţi funcţia getpoint pentru a obţine noul punct de centru a
ecranului.
3. Anulaţi ecoul din opţiunile şi cererile de comandă ZOOM.
4. Declaraţi toate variabilele local.
5. Introduceţi funcţia de ieşire.
6. Î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.
Î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
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 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.
•116
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Î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")
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
•118
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Command: (<= x y)
T
Functie Test
= Egal cu
/= Nu este egal cu
equal Egal cu
eq Au aceeasi legatura
Exemplu
Introduceţi expresiile care urmează.
Legaţi trei variabile de trei tipuri de date diferite: un simbol, un număr real
şi o listă.
Command: (setq x 'abc)
ABC
Command: (atom y)
T
Command: (atom z)
nil
Sînt aceste variabile liste?
Command: (listp x)
nil
Command: (listp y)
nil
Command: (listp z)
T
•120
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Introduceţi expresiile care urmează.
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.
•122
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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
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.
•124
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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ă.
(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
•126
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Î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
)
Exemplu
Command: (setq x 1)
1
Command: !y
2
Command: !z
3
•128
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Î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.
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.
•130
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Funcţia cond poate testa mai multe expresii şi poate executa orice număr de
s-expresii într-o ramificaţie dată.
Î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.
•132
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.
•134
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Funcţia repeat
Funcţia repeat cere două argumente şi un număr oarecare de argumente
opţionale.
Primul argument trebuie să fie un număr întreg (sau evaluat într-un număr
întreg). Acesta spune funcţiei repeat de cîte ori să execute al doilea
argument pînă la al n -lea argument.
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
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.
•136
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Î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
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.
•140
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Î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.
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ă.
•142
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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"
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.
•144
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Într-un desen nou introduceţi expresiile care urmează.
Command: text
Justify/Style/<Start point>: 1,5
Height: 0.5
Rotation: 0
Text: !txt1
Command: text
Justify/Style/<Start point>: Enter
Text: !txt2
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.
•146
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Recapitulare
• Şirurile text sînt caractere alfanumerice aflate între
ghilimele duble.
• Caracterele de control din cadrul unui şir de tip text încep
cu un caracter "a".
• Funcţia getstring primeste şiruri interactiv de la utilizator.
• Variabila de sistem TEXTEVAL demonstrează cum comanda
AutoCAD TEXT va tipări o variabilă AutoLISP.
• AutoLISP-ul dispune de o varietate de funcţii de tipărire
pentru diferite întrebuinţări.
Î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)
•148
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
•150
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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
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.
•152
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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>
5,5
1,1
Figura 23. 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
•154
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Expresia care urmează ar şterge atunci a doua entitate din baza de date.
Command: (command "erase" ename2 "")
Ar fi bine să se poată stabili numele tuturor entităţilor din baza de date, pe
rînd, pentru a le procesa una cîte una. Funcţia entnext poate face acest lucru
cînd este plasată într-o buclă while împreună cu instrucţiunile de procesare
pentru entităţi.
Recapitulare
• Fiecare entitate dintr-un desen are un nume unic de
entitate.
• Numele entităţilor nu se schimbă niciodată în timpul unei
sesiuni de editare grafică, dar se pot schimba pe parcursul
sesiunilor de editare grafică.
• AutoLISP dispune de funcţii care returnează numele
entităţii.
• Funcţia entlast returnează numele ultimei entităţi adăugată la
desen.
• Funcţia entnext returnează numele primei entităţi adăugată la
desen sau numele entităţii care urmează după argumentul
opţional.
• Puteţi folosi entnext şi o buclă while pentru a accesa fiecare
entitate din desen.
• Numele entităţilor pot fi folosite cu comenzi AutoCAD.
Î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
•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 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.
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.
•158
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
(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ă.
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.
•160
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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
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"
•162
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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")
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.
•164
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Î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ă.
C:SCALEALL
(defun c:scaleall ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(command "._SCALE" ename "" "0,0" "0.5");scale it
(prompt ;tell user which one
(strcat
"ănScaling entity "
(itoa counter)
".ăn"
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)
C:SCLINE
(defun c:scline ()
(setq ename (entnext)) ;get first entity
(setq counter 1) ;initialize counter
(while
ename ;we have an entity?
(if ;if it's a Line...
(=
"LINE"
(cdr (assoc 0 (entget ename)))
)
(progn
(command "._SCALE" ename "" "0,0" "0.5");scale it and...
(prompt ;tell user which one
(strcat
"ănScaling entity "
(itoa counter)
".ăn"
)
)
)
)
(setq counter (1+ counter)) ;increment the counter
(setq ename (entnext ename)) ;get the next entity
)
(prin1) ;quiet exit
)
•166
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.
•168
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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.
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ă.
•170
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Î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.
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
)
Această pagină a fost lăsată liberă în mod intenţionat.
•172
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))
•174
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.
•176
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ţ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.
•178
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Exemplu
Acest cod implementează comanda c:rectangle şi propria-i rutină de tratare a
erorilor.
•180
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.
•182
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.
•184
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
)
•186
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ă.
•188
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
•190
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.
•192
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Instrucţiuni
1. Introduceţi codul care urmează într-un document nou din editorul text.
(if
r_fp_name
(setq w_fp_name (getfiled "Destination File" "" "txt" 1))
)
;check that we got good values for both file names
;exit if not
(if
(or
(not r_fp_name)
(not w_fp_name)
)
(progn
(prompt "ănMust specify both source and destination file.")
(exit)
)
)
•194
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))
)
•196
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Etape de lucru
1. Deschideţi un nou fişier în editorul text.
•198
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()
•200
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.
•202
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ă.
•204
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
•206
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ă.
•208
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.
1. Salvaţi fişierul chdim.lsp.
2. Încărcaţi fişierul în AutoCAD şi încercaţi comanda CHDIM.
3. Ieşiţi din desen moddim fără a salva modificările.
4. 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.
•210
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.
Exemplu
Această expresie returnează lista asociată pentru prima intrare în tabelul
layer.
•212
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
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"))
)
•214
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.
•216
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.
•218
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.
)
•220
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.
•222
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.
•224
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
"0"
)
)
report_list
)
)
(setq count (1+ count)) ;Next Block name.
(princ ".") ;Keep the customer happy.
)
•226
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
•228
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
(defun c:polylist ()
(exit)
)
(if
(/= "POLYLINE" etype) ;if not a Polyline, exit
(progn
(prompt "ănNot a polyline.")
(exit)
)
)
•230
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
)
(setq *error* old_error) ;restore old error handler
(prin1) ;quiet exit
)
•232
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
Any type
•234
AUTODESK, INC. TRAINING LECTII DE BAZA AUTOLISP
(if
(/= "INSERT" etype) ;if not an Insert, exit
(progn
(prompt "ănNot a block.")
(exit)
)
)
)
(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