Documente Academic
Documente Profesional
Documente Cultură
Autolisp-Visuallisp PDF
Autolisp-Visuallisp PDF
CAPITOLUL 1
Pictograme
Meniul
desfăşurător
Fereastra Fereastr
Visual a
LISP Build
Visual LISP/AutoLISP
CAPITOLUL 2
LIMBAJUL AUTOLISP
obiect un nume de funcţie AutoLISP. Acesta este motivul pentru care orice
expresie simbolică returnează întotdeauna o valoare.
Exemplu: (+ 4 5)→ 9
Exemplu:
Command: (+ 1 2) (+ 1 2)
AutoCAD AutoLISP
3
3
Exemple:
2. Dacă simbolului a i-a fost atribuită valoarea 4.5 prin expresia (setq a 4.5)
Command: (setq a 4.5)
atunci avem:
Command: !a
4.5
Prof. dr. ing. Gheorghe OANCEA 11
Exemple:
Este predefinit şi un simbol special, denumit nil, care este atât atom cât şi
listă, fiind singurul care nu se satisface regula enunţată mai sus. Reprezentarea
lui nil ca listă este ( ), adică lista vidă cu zero elemente. Prin nil se înţelege în
AutoLISP fals, nimic, nul.
Observaţii:
1. Numele unui identificator utilizat în AutoLISP, nu poate să conţină
următoarele caractere (, ), ’, ”, ., ; şi nu poate fi format numai din caractere de tip
cifră. Caracterele utilizate la scrierea identificatorilor pot fi mari sau mici
deoarece limbajul nu este de tip case sensitive.
2. Dacă un întreg depăşeşte intervalul alocat (-2147483648 .. +2147483647)
atunci acesta este transformat automat în real.
3. Comentariile în AutoLISP sunt scrise după caracterul ; .
Atomii de tip întreg, real, şir de caractere şi nume de funcţii sunt evaluaţi
prin valoarea lor. Spre exemplu, atomul întreg 10 va fi evaluat prin valoarea 10,
atomul real 1.3 va fi evaluat prin valoarea 1.3 şi atomul de tip şir de caractere
”ACAD” va fi evaluat prin valoarea ”ACAD”. Pentru exemplificarea acestui
lucru, se tastează în AutoCAD !10, !1.3, !”ACAD” iar în VLISP (în fereastra
Visual LISP Console) direct atomii respectivi.
14 Visual LISP/AutoLISP
Exemple:
1. Dacă în zona prompter-ului Command: se tastează expresia:
(setq x 3.4 z 2 text ”AutoCAD”)
atunci se atribuie variabilelor x, z şi text valorile indicate. Iar dacă în continuare
se tastează în AutoCAD !x !z !text iar în VLISP (în Visual LISP Console)
direct numele variabilelor respective atunci se vor obţin valorile curente ale
simbolurilor x, z şi text.
2. Dacă se doreşte atribuirea unor valori rezultate în urma evaluării unor expresii
simbolice atunci se poate considera următorul exemplu:
(setq a (* x (+ 5 z))
b (* z pi)
p1 (list a b (+ a b z))
)
în urma tastării expresiei de mai sus, a primeşte valoarea expresiei x*(5+z), b
valoare a lui z* π iar p1 va fi o listă formată din trei elemente.
Simbolurile protejate la atribuire (în principal simbolurile standard, nil, T,
pause şi acele simboluri protejate de utilizator în VLISP) care apar ca argumente
impare la apelarea funcţiei setq, generează mesaje de genul celor din figura 2.2.
Exemple:
(+ 2 3 4)→9
(+ 2 1.0)→3.0
(+ 3)→3
(+)→0
16 Visual LISP/AutoLISP
Exemple:
(- 10 3 4)→3
(- 2 1.0)→1.0
(- 2 )→ -2
(-)→0
Se observă că dacă toate argumentele sunt întregi, atunci rezultatul este un
întreg, iar dacă cel puţin un argument este un real, atunci rezultatul este un real.
Dacă funcţiei nu i se indică argumente, atunci este returnată valoarea 0.
Exemple:
(* 10 3 2)→60
(* 2 4.0)→8.0
(* 2)→2
Se observă că dacă toate argumentele sunt întregi, atunci rezultatul este un
întreg, iar dacă cel puţin un argument este un real, atunci rezultatul este un real.
Dacă funcţiei nu i se indică argumente, atunci este returnată valoarea 0.
Exemple:
(/ 1 2)→0
(/ 1 2.0)→0.5
(/ 2 2 4.0)→0.25
(/ 4.0)→4.0
Funcţia 1+
Sintaxă:
(1+ <nr>)
Exemple:
(1+ 4)→5
(1+ 100.0)→101.0
Funcţia 1-
Sintaxă:
(1- <nr>)
Exemple:
(1- 4)→3
(1- 100.0)→99.0
Funcţia ABS
Sintaxă:
(ABS <nr>)
18 Visual LISP/AutoLISP
Exemple:
(abs 100)→100
(abs -78.23)→78.23
Funcţia EXP
Sintaxă:
(EXP <nr>)
Exemple:
(exp 1)→2.71828
(exp -0.4)→0.67032
(exp (exp 1))→ 15.1543 ;returnează ee
Funcţia LOG
Sintaxă:
(LOG <nr>)
Exemple:
(log 1.22)→0.198851
(log (exp 1))→1.0
Funcţia EXPT
Sintaxă:
(expt 3 2)→9
(expt 3.0 3)→27.0
(expt (exp 1) pi)→23.1407 ;returnează epi
Funcţia SQRT
Sintaxă:
(SQRT <nr> )
Exemple:
(sqrt 9)→3.0
(sqrt 2)→1.41421
Funcţia REM
Sintaxă:
Funcţia rem returnează restul împărţirii lui <nr1> la <nr2> dacă sunt
indicate două argumente. Dacă sunt date mai multe argumente, atunci se
efectuează împărţirea repetată fiind returnat restul ultimei împărţiri. Tipul
rezultatului returnat este real dacă cel puţin un argument este real, sau întreg
dacă ambele argumente sunt întregi. În situaţia în care se indică un singur
argument, rem returnează valoarea acestuia, iar dacă nu sunt date argumente se
returnează 0.
Exemple:
(rem 9 4)→1
(rem 20 6.0)→2.0
(rem 26 7 2)→1
Funcţia FIX
Sintaxă:
(FIX <nr>)
Exemple:
(fix 9.4)→9
(fix 20.6)→20
(fix 10)→10
Funcţia FLOAT
Sintaxă:
(FLOAT <nr>)
Exemple:
(float 9)→9.0
(float 20)→20.0
(float 2.3)→2.3
Funcţia MAX
Sintaxă:
Funcţia max returnează argumentul cu valoarea cea mai mare din şirul de
argumente. Dacă cel puţin un argument este real, atunci funcţia returnează o
valoare de tip real, în caz contrar returnează un întreg. În situaţia în care se nu
sunt indicate argumente, funcţia returnează valoarea 0.
Exemple:
(max -23 3 1.0 8 9)→9.0
(max 20 21 0 30)→30
(max)→0
Funcţia MIN
Sintaxă:
Funcţia min returnează argumentul cu valoarea cea mai mică din şirul de
argumente. Dacă cel puţin un argument este real, atunci funcţia returnează o
valoare de tip real, în caz contrar returnează o valoare întreagă. În situaţia în care
se nu sunt date argumente, funcţia returnează valoarea 0.
Prof. dr. ing. Gheorghe OANCEA 21
Exemple:
(min -23 3 1.0 8 9)→-23.0
(min 20 21 0 30)→0
(min)→0
Funcţia GCD
Sintaxă:
Exemple:
(gcd 81 57)→ 3
(gcd 12 28)→ 4
Funcţia SIN
Sintaxă:
(SIN <unghi>)
Funcţia COS
Sintaxă:
(COS <unghi>)
Exemple:
22 Visual LISP/AutoLISP
(cos (/ pi 2))→0.0
(cos (/ pi 3))→0.5
Funcţia ATAN
Sintaxă:
Exemple:
(atan 2.0 3.0)→0.463648
(atan 2.0 -3.0)→2.55359
(atan -2.0 -3.0)→ -2.55359
(atan -0.5 0.0)→ -1.5708
(atan 0.5 0.0)→ 1.5708
Funcţia QUOTE
Sintaxă:
(QUOTE <expr>)
Funcţia returnează argumentul <expr> neevaluat, îngheţând practic
mecanismul de evaluare a expresiilor simbolice conţinute de argument. Se
utilizează de regulă pentru formarea listelor cu valori iniţiale cunoscute. Există o
formă abreviată a funcţiei şi anume caracterului apostrof (’ ).
Prof. dr. ing. Gheorghe OANCEA 23
Exemple:
(quote a) → a
(quote (sin (/ pi 3)))→ (sin (/ pi 3))
(quote (a b c d))→ (a b c d)
(quote (1 2 3))→ (1 2 3)
’a → a
’(sin (/ pi 3))→ (sin (/ pi 3))
’(a b c d)→ (a b c d)
’ (1 2 3)→ (1 2 3)
Command:’(sin (/ pi 3))
şi AutoCAD-ul va furniza un mesaj de eroare, dar este corect astfel:
Observaţie: Ambele exemple de mai sus pot fi tastate în fereastra Visual LISP
Console fără a fi semnalate erori.
Funcţia EVAL
Sintaxă:
(EVAL <expr>)
Funcţia APPLY
Sintaxă:
Exemple:
(apply ’+ ’(1 2 3))→ 6
(apply ’strcat ’(”Exemplu ” ”apply”)) → ”Exemplu apply”.
Apply poate fi utilizată atât pe funcţii standard cât şi pe cele definite de
programator.
Funcţia TYPE
Sintaxă:
(TYPE <articol>)
Exemple:
Considerându-se următoarele atribuiri:
(setq i 45
r 34.3
s ”AUTOCAD”
l ’(1 2 3)
f (open ”DATE.TXT” ”w”)
)
se obţin, aplicând TYPE pe fiecare simbol definit mai sus, următoarele rezultate:
(type ’i) → SYM
(type i) → INT
(type r) → REAL
(type s) → STR
(type l) → LIST
(type f) → FILE
(type getreal) → SUBR
Prof. dr. ing. Gheorghe OANCEA 25
Tabelul 2.1
Rezultatul returnat Explicaţie
REAL pentru un argument numeric de tip real
INT pentru un argument numeric de tip întreg
STR pentru un argument de tip şir de caractere
LIST pentru un argument de tip listă
FILE pentru un argument de tip descriptor de fişier
SYM pentru un simbol AutoLISP
SUBR pentru o funcţie standard a AutoLISP-ului sau
definită de programator şi încărcată din fişiere FAS
sau VLX sau definită de programator direct pe
prompter-ul Command:
USUBR pentru o funcţie AutoLISP definită de programator
sau încărcată din fişier sursă LISP (LSP)
PICKSET pentru un argument de tip mulţime de selecţie
ENAME pentru un argument de tip nume de entitate
EXRXSUBR pentru aplicaţii externe ObjectARX
NIL pentru un simbol evaluat prin nil (adică nu are
atribuită o valoare)
Funcţia SET
Sintaxă:
Funcţia set atribuie simbolului notat cu <simbol> valoarea prin care este
evaluată expresia <expr>. Spre deosebire de setq, funcţia set acceptă ca prim
argument, chiar o expresie care returnează un simbol.
Exemple:
(set ’x (+ 5 23 (* pi 3))) → 37.4248
(set (read ”y”) 10)→ 10
Funcţia READ
Sintaxă:
26 Visual LISP/AutoLISP
(READ [ <şir> ])
Funcţia read citeşte prima dată AutoLISP (atom, listă, simbol etc) din
şirul de caractere dat ca argument şi o converteşte în tipul de dată corespondent.
Dacă şirul conţine spaţii atunci se preia doar prima dată (sub şirul de până la
primul spaţiu) din acesta. Listele pot să conţină spaţii.
Exemple:
(read "a")→A
(read "b c d")→B
(read "78")→78
(read "7.5")→7.5
(read "(a b c)") → (A B C)
(read "Visual LISP”)→ VISUAL
(set (read "a") 10) ;simbolul a va avea valoarea 10
(read "(+ (exp 3) (* pi 2))") → (+ (exp 3) (* pi 2))
(eval (read "(+ (exp 3) (* pi 2))")) → 26.3687
Funcţia ATOMS-FAMILY
Sintaxă:
Exemple:
1. (atoms-family 0) → (VL-CONSP LISPED *MERR* VL-ACAD-DEFUN
C:MVSETUP GRCLEAR _AUTOARXLOAD GETANGLE .......)
2. (atoms-family 1) → ("VL-CONSP" "LISPED" "*MERR*" "VL-ACAD-
DEFUN" "C:MVSETUP" "GRCLEAR" "_AUTOARXLOAD" .....)
3. (atoms-family 1 '("getint" "getdist" "getx" "gety"))→("GETINT" "GETDIST"
nil nil)
Ultimul exemplu verifică dacă simbolurile: getint, getdist, getx şi gety
sunt definite. Se observă că simbolurile getx şi gety nu sunt definite deoarece în
listă a fost returnată valoarea nil.
Prof. dr. ing. Gheorghe OANCEA 27
Funcţia LIST
Sintaxă:
Funcţia list are ca argument una sau mai multe expresii simbolice şi
returnează lista formată din valorile rezultate în urma evaluării expresiilor
simbolice. List apelată fără argumente returnează nil.
Exemple:
(setq a 1 b 2 c 3)
(list a b c)→(1 2 3)
(list a ’(c d) b)→(1 (c d) 2)
’(1 2 3)⇔(list 1 2 3)
(-34 10 19)
Specify next point or [Undo]:
2. Exemplu pentru trasarea unui cerc prin două puncte (P1 şi P3) pe diametru:
Command: Circle
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 2p
Specify first end point of circle's diameter: !p1
(2 3)
Specify second end point of circle's diameter: !p3
(100 100)
3. Exemplu pentru trasarea unui arc de cerc prin trei puncte (P1, P2 şi P3):
Command: Arc
ARC Specify start point of arc or [Center]: !p1
(2 3)
Specify second point of arc or [Center/End]: !p2
(6 12 -4)
Specify end point of arc: !p3
(100 100)
Funcţia APPEND
Sintaxă:
(APPEND [ <1ista1>...<1istan> ])
Exemple:
(setq a 10 b 20 c 30)
(setq p1 (list a b c)
p2 (list 40 50 60)
)
(append p1 p2)→(10 20 30 40 50 60)
(append ’( (x) (y)) ’((u) (v)))→ ((x) (y) (u) (v))
30 Visual LISP/AutoLISP
Nodul rădăcină
Fig. 2.6 Nodul rădăcină şi primele două ramuri ale unei liste oarecare.
Fig. 2.7 Nodul rădăcină şi primele două ramuri ale listei (1.0 2.0 3.0) .
2.0 (3.0)
3.0 ()
(x (y z) t)
x ((y z) t)
(y z) (t)
y (z t ()
)
z ()
P1=(x y z)
Funcţia CAR
Sintaxă:
(CAR <listă>)
Funcţia car returnează primul element al listei argument sau nil dacă lista
este vidă. Tipul rezultatului poate fi atom sau listă.
Funcţia CDR
Sintaxă:
(CDR <listă>)
Exemple:
Pentru un punct AutoCAD cu trei coordonate (x y z) definit astfel:
(setq x 1 y 2 z 3)
(setq p (list x y z))
Funcţia LAST
Sintaxă:
(LAST <listă>)
Exemple:
(last ’(a b c))→c
(last ’(a b c (d e f)))→(d e f)
Funcţia LENGTH
Sintaxă:
(LENGTH <listă>)
Exemple:
(length ’(a b c))→3
(length ’(a b c (d e f)))→4
(length ’( ))→0
Funcţia MEMBER
Sintaxă:
Exemple:
34 Visual LISP/AutoLISP
Funcţia NTH
Sintaxă:
Exemple:
(nth 2 ’(a b c d))→c
(nth 0 ’(a b c d ))→a
(nth 4 ’(a b c d ))→nil
Funcţia REVERSE
Sintaxă:
(REVERSE <listă>)
Exemple:
(reverse ’(a b c d))→(d c b a)
(reverse ’((a b) (c d )))→((c d) (a b))
Funcţia SUBST
Sintaxă:
Exemple:
Prof. dr. ing. Gheorghe OANCEA 35
Funcţia MAPCAR
Sintaxă:
Exemple:
(mapcar ’+ ’(1 2 3) ’(10 20 30))→ (11 22 33)
(setq a 1 b 2 c 3)
(mapcar ’1+ (list a b c)) → (2 3 4)
Ultima expresie este echivalentă cu expresiile:
(1+ a)
(1+ b)
(1+ c)
Mapcar poate fi utilizată atât pe funcţii standard cât şi pe cele definite de
programator.
36 Visual LISP/AutoLISP
Funcţia COMMAND
Sintaxă:
(COMMAND [ <argumente> ])
Exemple:
1. (command ”line” ”20,20” ”30,30” ”@45<-10” ”c”)
;trasează un triunghi care are definite colţurile ca şi în AutoCAD
2. (setq p1 ’(1 4)
p2 ’(23 56)
raza 10) ;se definesc variabilele p1, p2 şi raza
(command ”line” p1 p2 ””
”circle” ”2p” p1 p2
”circle” p2 raza) ;se trasează o linie din p1 până în p2
;un cerc prin 2 puncte p1 şi p2
;un cerc cu centrul în p2 şi de rază raza
3. (command ”line” ’(1 2 3) ’(30 4 22) ””) ;trasează o linie în spaţiu
4. (command ”line” pause pause pause ”c”)
;trasează un triunghi, pentru fiecare colţ se solicită un punct în AutoCAD
(command ”circle” pause 23)
;trasează un cerc de centru dat în AutoCAD şi de rază 23.
5. Pentru a obţine modelul 3D din figura 2.11, se trasează o polilinie plana
(cu punct de start 50,50 şi de dimensiuni 100x50) cu colţuri rotunjite (rază 10)
care apoi se extrudează cu tapper angle 0. În final se setează direcţia de privire
1,1,1 şi apoi se ascund liniile invizibile aferente modelului 3D generat.
(command "pline" "50,50" "@100,0" "@0,50" "@-100,0" "c" )
; trasează polilinia
(command "fillet" "t" "t" "r" 10 ;setează raza de racordare şi
"fillet" "p" "l") ;racordează polilinia
(command "extrude" "l" "" 75 "") ;extrudează polilinia
(command "vpoint" "1,1,1") ;setează direcţia de privire
(command "hide") ;ascunde liniile invizibile
(setq lx 100
ly 50
lz 75
r 10
u5
p1 '(50 50)
) ;setare valori parametrii de intrare
(setq p3 (list (+ (car p1) lx) (+ (cadr p1) ly))
p2 (list (car p3) (cadr p1))
p4 (list (car p1) (cadr p3))
) ;calcul puncte caracteristice
(command "pline" p1 p2 p3 p4 "c") ;trasează polilinia
(command "fillet" "t" "t" "r" r
Prof. dr. ing. Gheorghe OANCEA 39
Observaţii:
1. Începând cu AutoCAD2002, funcţiile din categoria getxxx pot fi apelate din
interiorul funcţiei command. De exemplu:
(setvar ”cmdecho” 0)
(command ”line”
(setq p1 (getpoint ”\nPunct de start:”))
(setq p2 (getpoint p1 ”\nPunct de final:”)) ””
)
2. O comandă AutoCAD lansată din AutoLISP cu o funcţia command:, poate fi
încheiată ulterior cu o altă funcţie command: . De exemplu:
(setq pc ’(100 100))
(command ”circle” pc)
(setq dia 32.345)
(command ”d” dia)
Funcţia GETINT
Sintaxă:
(GETINT [ <mesaj> ])
Funcţia GETREAL
Sintaxă:
(GETREAL [ <mesaj> ])
Funcţia GETSTRING
Sintaxă:
Exemple:
(setq nume (getstring ”\nIntroduceţi numele:”))
(setq numep (getstring T ”\nIntroduceţi numele şi prenumele:”))
(setq s (getstring T "\nIntroduceţi numele fişierului: "))
Funcţia GETPOINT
Sintaxă:
(GETPOINT [ <pb> ] [ <mesaj> ])
Exemple:
(setq p (getpoint))
(setq p1 (getpoint ”\nIntroduceţi punctul P1:”))
(setq p2 (getpoint p1 ”\nIntroduceţi punctul P2:”))
Funcţia GETCORNER
Sintaxă:
Funcţia GETDIST
Sintaxă:
Exemple:
(setq d (getdist))
(setq d1 (getdist p2 ”\nIntroduceţi raza cercului:”))
(setq d2 (getdist p2))
(setq d3 (getdist ”\nIntroduceţi raza cercului:”))
Funcţia GETANGLE
Sintaxă:
Funcţia GETORIENT
Sintaxă:
Funcţia GETVAR
Sintaxă:
(GETVAR <nume_variabilă>)
44 Visual LISP/AutoLISP
Funcţia SETVAR
Sintaxă:
Funcţia GETENV
Sintaxă:
(GETENV <nume_variabilă>)
Exemple:
(getenv ”ACAD”) → ”/acad/support”
(getenv ”INEXSIT”) → nil
Funcţia INITGET
Sintaxă:
Tabelul 2.2
Funcţia Modurile funcţiei INITGET
1 2 4 8 32 64
GETINT ; ; ;
GETREAL ; ; ;
GETDIST ; ; ; ; ;
GETANGLE ; ; ;
GETORIENT ; ; ;
GETPOINT ; ; ;
GETCORNER ; ; ;
GETKWORD ;
GETSTRING
GETVAR
Argumentul opţional <cuvinte_cheie> este reprezentat sub forma unui şir
de caractere în care cuvintele cheie sunt separate de spaţii. Forma generală este:
46 Visual LISP/AutoLISP
Funcţia GETKWORD
Sintaxă:
(GETKWORD [ <mesaj> ])
; se trasează polilinia
(command "fillet" "t" "t" "r" r
"fillet" "p" "l")
;se setează raza de racordare şi apoi se racordează polilinia
(command "extrude" "l" "" lz u)
; se extrudează polilinia
(command "vpoint" "1,1,1")
;se setează convenabil direcţia de privire
(command "hide")
;se ascund liniile invizibile
Funcţia DISTANCE
Sintaxă:
(DISTANCE <pct1> <pct2>)
Dacă unul din cele două puncte are două coordonate (este un punct 2D)
atunci funcţia distance returnează distanţa 2D dintre cele două puncte altfel
returnează distanţa 3D.
Funcţia INTERS
Sintaxă:
Toate punctele sunt exprimate relativ la UCS-ul curent. Dacă ele sunt
puncte 3D atunci se returnează intersecţia 3D iar dacă un punct este 2D atunci
liniile sunt proiectate în planul curent de lucru şi se va returna intersecţia 2D.
Parametrul opţional <ind> dacă există şi este nil atunci liniile definite de
cele 4 puncte sunt considerate de lungime infinită (drepte).
Exemple:
(setq p1 ’(1.0 1.0) p2 ’(9.0 9.0))
(setq p3 ’(4.0 1.0) p4 ’(4.0 2.0))
(inters p1 p2 p3 p4)→ nil
(inters p1 p2 p3 p4 nil)→ (4.0 4.0)
Funcţia OSNAP
Sintaxă:
Exemple:
(setq p1 (getpoint ”\nIntroduceti un punct de pe o entitate:”))
(setq p2 (osnap p1 ”mid”))
(setq p4 (osnap p1 ”mid, end, centre”))
Funcţia POLAR
Sintaxă:
Exemplu:
(polar ’(1 1 3.5) 0.783398 1.414214) → (2.0 2.0 3.5)
50 Visual LISP/AutoLISP
Funcţia ANGLE
Sintaxă:
Exemple:
(angle ’(1.0 1.0) ’(1.0 4.0)) → 1.5708
(angle ’(6.0 2.3) ’(2.0 2.3))→ 3.14159
Funcţia DEFUN
Sintaxă:
După cum se poate observa, sintaxa lui defun este puţin diferită de a
celorlalte funcţii prezentate până acum. Funcţia are două argumente obligatorii
Prof. dr. ing. Gheorghe OANCEA 51
în care pa1 ... pan sunt parametri actuali. Legătura dintre parametrii actuali şi cei
formali se realizează prin locul ocupat de aceştia în cele două liste. Parametrii de
pe acelaşi loc trebuie să fie de acelaşi tip, în caz contrar se afişează un mesaj de
eroare. Numărul de parametri formali trebuie să fie egal cu numărul de parametri
actuali, în caz contrar la apelarea funcţiei se afişează un mesaj de eroare.
După apelarea unei funcţii, va fi returnată valoarea ultimei expresii
evaluate în corpul funcţiei.
Exemple:
52 Visual LISP/AutoLISP
(defun s1 (x y)
(/ (* (+ x y) (- x y)) (* x y))
)
Funcţia se apelează fie utilizând expresia (s1 23.0 5), fie (s1 t v) dacă t şi
v sunt simboluri de tip întreg sau real, dar cel puţin unul de tip real. Dacă atât t
cât şi v sunt întregi atunci se efectuează operaţiile de împărţire şi înmulţire cu
întregi, obţinându-se ca rezultat un întreg. În cazul în care se doreşte preluarea
valorii returnate de funcţia definită, atunci aceasta se apelează astfel:
(setq val (s1 23.0 5)) sau (setq val (s1 t v))
(defun s2 (x / y)
(setq y (getreal ”\nIntroduceti y:”))
(/ (* (+ x y) (- x y)) (* x y))
)
Funcţia se apelează astfel:
(s2 20) sau (s2 t);
(setq val (s2 20)) sau (setq val (s2 t))
Exemple:
1. Să se definească o nouă comandă AutoCAD care să permită trasarea
unui triunghi oarecare, solicitându-se utilizatorului cele trei puncte care
materializează vârfurile acestuia.
(defun C:triunghi (/ p1 p2 p3)
(initget 1)
(setq p1 (getpoint ”\n Introduceti p1:”))
(initget 1)
(setq p2 (getpoint p1 ”\n Introduceti p2:”))
(initget 1)
(setq p3 (getpoint p2 ”\n Introduceti p3:”))
(command ”line” p1 p2 p3 ”c”)
(prin1)
)
Funcţia se apelează ca orice comandă standard a AutoCAD-ului, prin
tastarea numelui triunghi în zona prompter-ului Command: .
2. Să se definească o nouă comandă AutoCAD care să permită generarea
modelului 3D din figura 2.12 parametrizat cu simboluri variabile. Semnificaţia
simbolurilor este aceeaşi ca şi în exemplul de la subcapitolul 2.7. Noua comandă
AutoCAD trebuie să aibă ecoul inhibat (nu sunt afişate pe ecran comenzile
AutoCAD apelate din program) şi trebuie să funcţioneze corect, atunci când sunt
moduri OSNAP curent setate.
54 Visual LISP/AutoLISP
Funcţia LOAD
Sintaxă:
Funcţia load încarcă un fişier care are, în ordine, una din extensiile VLX,
FAS, LSP. Dacă se încarcă un fişier AutoLISP (cu extensia LSP) atunci citirea
se face secvenţial, pe măsură ce se citesc expresii, acestea sunt evaluate.
Valoarea returnată de funcţie este identică cu valoarea ultimei expresii evaluate.
Funcţia are un singur argument obligatoriu de tip şir de caractere care
desemnează numele fişierului fără extensie (deoarece extensia implicită este
LSP) ce trebuie încărcat. Al doilea argument de tip atom este opţional, şi dacă
este indicat, atunci în cazul încărcării fără succes a unui fişier, se va afişa
valoarea acestuia în locul mesajului de eroare.
De regulă funcţia load este utilizată pentru încărcarea fişierelor din
programe AutoLISP.
Exemple:
(load ”ex1”)
(load ”a:\\work\\desen”)
(load ”/work/desene/inexist” ”Eroare la incarcare”)
Observaţie: Funcţia AutoLISP load este diferită de comanda AutoCAD LOAD.
Tabelul 2.3
Mesaje de eroare Explicaţie
Numele invocat de funcţia load nu
LOAD failed ”Nume-fişier” poate fi găsit, sau utilizatorul nu are
acces pentru citirea fişierului.
extra right paren on input Au fost întâlnite prea multe paranteze
dreapta (închise)
malformed string on input Mesajul se datorează neînchiderii
unor ghilimele.
S-a citit o listă incompletă. De obicei
malformed list on input cauza este neînchiderea unor
paranteze.
Funcţia =
Sintaxă:
(= <atom1> [ <atom2> ..... <atomn> ])
Exemple:
(= 1 1.0)→T
(= 8 6.23)→ nil
(= 1.2 1.2 1.2 1.2)→T
(= 3.22 3.21 3.22)→ nil
(= ”AutoLISP” ”AutoCAD”)→ nil
(= ”Auto” ”Auto”)→T
(= ”auto” ”Auto”)→ nil
(= 10) →T
Funcţia /=
Sintaxă:
(/= <atom1> [ <atom2> ..... <atomn> ])
Exemple:
(/= 1 1.0)→nil
(/= 8 6.23)→T
(/= 1.2 1.2 1.2 1.2)→nil
(/= 1.2 10 1.2 20)→T
(/= 12 10 12 12)→nil
(/= 3.22 3.21 3.22)→T
(/= ”AutoLISP” ”AutoCAD”)→T
(/= ”Auto” ”Auto”)→nil
(/= ”a” ”A”)→ T
(/= 10) →T
Funcţia <
Sintaxă:
Funcţia relaţională ”<” returnează T dacă toate argumentele (de tip atom)
respectă valoric relaţia cerută (şir strict crescător), sau nil în caz contrar. În
cazul existenţei mai multor argumente se compară atomul curent cu cel din
dreapta sa. Această funcţie se utilizează pentru atomii numerici şi şiruri de
caractere. Dacă funcţia are un singur argument atunci este returnat T.
Prof. dr. ing. Gheorghe OANCEA 59
Exemple:
(< 10 12.0)→T
(< 8 6.23 89)→nil
(< 1.2 2.2 5.2 12)→T
(< ”A” ”D”)→T
(< ”AutoLISP”) →T
Funcţia <=
Sintaxă:
Exemple:
(<= 10 12.0)→T
(<= 8 23.23 89)→T
(<= 1.2 2.2 -1.2 12)→nil
(<= ”A” ”A”)→T
(<= 12)→T
Funcţia >
Sintaxă:
Funcţia >=
60 Visual LISP/AutoLISP
Sintaxă:
(>= <atom1> [ <atom2> ..... <atomn> ])
Exemple:
(>= 10 10.0)→T
(>= 8 23.23 89)→nil
(>= 1.2 1.2 1.2 1.2)→T
(>= ”A” ”A”)→T
(>= -5)→T
Funcţia EQ
Sintaxă:
Exemple:
Să considerăm următoarele atribuiri:
(setq l1 ’(a b c))
(setq l2 ’(a b c))
(setq l3 l2)
dacă utilizăm funcţia eq pe perechi de liste avem:
(eq l1 l3)→nil ;deoarece l1 şi l3 nu sunt perfect identice (au fost
obţinute prin metode diferite)
(eq l3 l2)→T ;deoarece argumentele l3 şi l2 referă aceeaşi listă
;s-a utilizat funcţia setq la obţinerea lui l3 din l2
Funcţia EQUAL
Sintaxă:
Funcţia equal determină dacă <expr1> şi <expr2> sunt egale, adică dacă
cele două argumente sunt evaluate la aceeaşi valoare în marja de eroare dată de
argumentul opţional <eroare>. Equal returnează T dacă cele două expresii sunt
egale, sau nil în caz contrar.
Exemple:
Dacă considerăm următoarele atribuiri:
(setq l1 ’(a b c))
(setq l2 ’(a b c))
(setq l3 l2)
utilizând funcţia equal pe liste avem:
(equal l1 l3)→T ;deoarece l1 şi l3 sunt evaluate la acelaşi obiect
(equal l3 l2)→T ;deoarece l2 şi l3 sunt exact aceleaşi liste
Dacă se compară de exemplu două numere reale (sau două liste de numere
reale, ca în cazul punctelor AutoCAD), care ar trebui să fie identice dar ele
diferă foarte puţin, datorită faptului că au fost obţinute prin metode diferite,
poate fi utilizată funcţia equal deoarece permite, conform sintaxei generale,
verificarea egalităţii într-o marjă de eroare stabilită de programator.
Exemple:
Dacă avem următoarele atribuiri:
(setq x 2.222222
y 2.222223)
în cazul utilizării funcţiei equal se obţine:
(equal y x)→nil
(equal y x 0.0000011)→T
(equal y x 0.000001)→nil
Funcţia ATOM
Sintaxă:
(ATOM <articol>)
Această funcţie returnează nil dacă <articol> este o listă şi T în caz
contrar. Argumentul funcţiei poate fi orice obiect AutoLISP. Funcţia se bazează
pe faptul că tot ce nu este listă este considerat atom.
Exemple:
62 Visual LISP/AutoLISP
Pentru atribuirile:
(setq lista ’(a b c)
l1 ’lista)
se obţine:
(atom ’lista)→T ;deoarece lista este considerată ca fiind simbol
(atom lista)→nil
(atom ’l1)→T ;deoarece l1 memorează simbolul lista
(atom l1)→T
(atom ’(a b c))→nil
(atom getpoint) →T
(atom nil)→ T
(atom ’())→ T
Ultimele două exemple, demonstrează faptul că simbolul nil poate fi atât
atom cât şi listă.
Funcţia LISTP
Sintaxă:
(LISTP <articol>)
Funcţia listp returnează T dacă <articol> este o listă sau nil în caz contrar.
Argumentul funcţiei poate fi o listă, un atom sau o expresie.
Exemple:
(listp ’(1 2 3 4 5))→T
(listp 1.23)→nil
(listp ’x)→nil ;deoarece x este simbol
(listp nil)→T ;deoarece nil este atât atom cât şi listă
(listp initget) →nil
(listp (setq a '(1 1))) →T
;deoarece expresia simbolică argument este caz particular de listă
Funcţia BOUNDP
Sintaxă:
(BOUNDP <simbol>)
(boundp ’y)→nil
Funcţia NULL
Sintaxă:
(NULL <articol>)
Funcţia null returnează T dacă <articol> este legat la nil, iar în caz
contrar returnează nil. Argumentul notat cu <articol> este un simbol sau o
expresie AutoLISP.
Exemple:
Pentru atribuirile:
(setq x 243
s ”AutoLISP”
y nil)
în urma aplicării funcţiei null se poate scrie:
(null y)→T
(null x)→nil
(null s)→nil
(null ’())→T
(null 20) →nil
Funcţia MINUSP
Sintaxă:
(MINUSP <nr>)
Această funcţie returnează T dacă <nr> este un real sau întreg evaluat la o
valoare negativă, în caz contrar returnează nil.
Exemple:
(minusp -1.1)→T
(minusp 1110.1)→nil
(minusp -45.671)→T
Funcţia NUMBERP
Sintaxă:
(NUMBERP <articol>)
64 Visual LISP/AutoLISP
Funcţia returnează T dacă <articol> este un real sau un întreg, iar în caz
contrar nil. Argumentul notat cu <articol> este un simbol sau o expresie.
Exemple:
Pentru atribuirile:
(setq x 243
s ”AutoLISP”
y ’x)
se obţin următoarele rezultate:
(numberp 23)→T
(numberp 57.35)→T
(numberp x)→T
(numberp y)→nil
(numberp s)→nil
(numberp (eval y))→T
Funcţia ZEROP
Sintaxă:
(ZEROP <nr>)
Exemple:
(zerop 0)→T
(zerop 0.04)→nil
(zerop 100)→nil
(zerop 0.0)→T
Funcţia NOT
Sintaxă:
(NOT <expr>)
Prof. dr. ing. Gheorghe OANCEA 65
Funcţia not returnează T dacă expresia <expr> este evaluată prin nil, iar
în caz contrar nil. Funcţia este utilizată de regulă pentru tipuri de date diferite de
liste.
Exemple:
(setq a 1212
b ”LISP”
c nil)
(not a)→nil
(not b)→nil
(not (= a b))→ T
(not c)→T
(not ’())→T
Funcţia AND
Sintaxă:
Exemple:
Pentru atribuirile:
(setq a 1.0
b nil
c ”ABC”)
avem:
(and 2 a c)→T
(and 2 a b c)→nil
(and)→T
Funcţia OR
Sintaxă:
iar dacă există cel puţin un argument evaluat printr-o valoare diferită de nil,
rezultatul este T; dacă toate argumentele sunt nil returnează nil. Funcţia apelată
fără argumente returnează valoarea nil.
Exemple:
Pentru atribuirile:
(setq a 1.0
b nil
c ”ABC”)
avem:
(or nil 2 a c)→T
(or 2 a b c)→T
(or nil b ’())→nil
(or)→nil
Funcţia IF
Sintaxă:
Exemple:
Următoarele expresii se vor tasta direct pe prompter-ul Command: sau în
Visual LISP Console.
1. (setq a 2)
(if (= a 2) (setq y 15) (setq y 20))→15
Se solicită apoi valoarea lui y (!y în AutoCAD).
2. (setq b 3)
(if (and (/= a 0) (numberp b)) (setq z 0) (setq x 20))→0
Se solicită valorile lui z şi x (!z !x în AutoCAD).
3. (setq b nil)
( if b (setq b 10) (setq b 0))→0
Se solicită valoarea lui b (!b în AutoCAD).
Funcţia PROGN
Sintaxă:
(setq a 10)
(setq b 20)
)
(progn
(setq a (+ a 10))
(setq b (+ b 20))
)
)→20
Se solicită apoi valorile lui a şi b (!a !b în AutoCAD).
2. (setq a 3)
(if (>= a 0) (progn
(setq y 12)
(setq z 0)
)
(setq x 20)
)→0
Se solicită apoi valorile lui y, z şi x (!y !z !x în AutoCAD).
Funcţia COND
Sintaxă:
(COND
[ ( <expr-test_1> <expr11> <expr12>.... )
( <expr-test_2> <expr21> <expr22>.... )
......................
( <expr-test_n> <exprn1> <exprn2>.... )
[ (T <exprn+1 1> <exprn+1 2>.... )] ]
)
Funcţia cond are un număr oarecare de argumente opţionale. După cum se
observă, fiecare argument al funcţiei conţine mai multe expresii simbolice,
prima dintre ele <expr-test_i> fiind expresia test.
Cond evaluează pe rând expresiile logice <expr-test_i> şi când întâlneşte
una diferită de nil, se evaluează expresiile <expri1>, <expri2>.... care urmează
expresiei test respective, urmând a se relua programul cu următoarea expresie
simbolică de după cond. Dacă toate expresiile <expr-test_i> evaluate sunt nil şi
există ramura de else, este parcursă aceasta (expresiile simbolice <exprn+1 1>,
<exprn+1 2>....) deoarece expresia test aferentă are întotdeauna valoarea T.
Această funcţie returnează valoarea ultimei expresii evaluate. Dacă funcţia nu
are argumente este returnată valoarea nil.
Prof. dr. ing. Gheorghe OANCEA 69
Exemple:
1. Funcţia următoare testează dacă argumentul este mai mare, mai mic sau egal
cu zero şi afişează mesajul corespunzător.
(defun test (x)
(cond
((> x 0) (princ ”\nValoare pozitiva”))
((< x 0) (princ ”\nValoare negativa”))
(T (princ ”\nValoare egală cu zero”))
)
(prin1)
)
Funcţia definită se apelează în diverse ipostaze: (test y) dacă anterior s-a
tastat (setq y 100), (test -5) şi (test 0).
Funcţia REPEAT
Sintaxă:
(REPEAT <număr>
[ <expr1>
<expr2>
........
<exprn> ]
)
Exemple:
1. Se atribuie variabilelor a şi b valorile iniţiale 1 şi respectiv 10. Aceste
variabile se incrementează de 10 ori, cu ajutorul unui repeat, cu 1 respectiv 10.
După fiecare incrementare, se afişează valorile asociate variabilelor.
(setq a 1
b 10)
(repeat 10
Prof. dr. ing. Gheorghe OANCEA 71
(setq a (1+ a)
b (+ 10 b)
)
(princ”\na=”)
(princ a)
(princ”\nb=”)
(princ b)
)
După parcurgerea de 10 ori a corpului funcţiei repeat, a are valoarea 11
iar b 110.
Funcţia WHILE
Sintaxă:
(WHILE <expr-test>
[ <expr1>
<expr2>
........
<exprn> ]
)
Exemple:
1. În timp ce variabila a este diferită de nil (deci T) şi este mai mare decât 0, se
micşorează valoarea lui a şi apoi se afişează această valoare dacă este diferită de
nil. Se iese din while atunci când a devine egală cu nil. Valoarea iniţială a
variabilei a este 20.
(setq a 20)
(while a
(if (> a 0) (setq a (1- a)) (setq a nil))
(if a (princ a))
)
Funcţia FOREACH
Sintaxă:
Exemple:
1.
(setq a ”AutoLISP”
b ”AutoCAD”
c (strcat b ” si ” a)
)
(foreach s (list a b c) (print s))→ ”AutoCAD şi AutoLISP”
Ultima expresie simbolică va atribui pe rând simbolului s valorile
conţinute de lista (a b c) cu a, b şi c evaluate şi le va afişa pe ecran.
2.
(foreach I ’(2 5 6 9 23 45 46 61) (factp I))
Funcţia ATOI
Sintaxă:
(ATOI <şir>)
Funcţia ITOA
Sintaxă:
(ITOA <intreg>)
Funcţia RTOS
Sintaxă:
Tabelul 2.4
Moduri
RTOS Format Exemplu
Funcţia ATOF
Sintaxă:
(ATOF <şir>)
Prof. dr. ing. Gheorghe OANCEA 77
Observaţii:
1. Dacă primele caractere ale şirului sunt de tip numeric, dar şirul conţine şi alte
caractere diferite de cele numerice, atunci atof va converti la un real doar
primele caractere. Iar dacă primul caracter este unul alfabetic atunci funcţia
returnează valoarea 0.0.
2. Funcţia nu poate fi folosită (în mod direct) la evaluarea unor expresii test
pentru că 0.0 este echivalent cu T. Pentru acestea este indicat a se utiliza funcţia
distof.
Funcţia DISTOF
Sintaxă:
Observaţii:
1. Dacă şirul de caractere nu poate fi convertit într-un real, funcţia returnează
valoarea nil.
2. Funcţiile rtos şi distof sunt complementare.
Funcţia ANGTOS
78 Visual LISP/AutoLISP
Sintaxă:
Tabelul 2.5
Moduri
ANGTOS Format Exemplu
Grade/minute/secunde
1 (Degrees/minutes/seconds) 82d 20’ 10”
Unităţi speciale
4 (Surveyor’s units) N 54d0’ E
Exemple:
(setq a PI)
(angtos a 0 0)→ ”180”
(angtos a 0 4) → ”180.0000”
(angtos a 1) → ”180 d 0´ 0 ˝”
(angtos a 3 4) → ”3.1416r”
(angtos a 4) → ”W”
(angtos a 2 4) → ”200.0000g”
Prof. dr. ing. Gheorghe OANCEA 79
Funcţia ANGTOF
Sintaxă:
Exemple:
(angtof ”180” 0)→ 3.14159
(angtof ”180d0’0\”” 1) → 3.14159
(angtof ”3.1416r” 3 ) → 3.1416
(angtof ”W” 4 ) → 3.14159
(angtof ”200.0g” 2) → 3.14159
Funcţia ASCII
Sintaxă:
(ASCII <şir>)
Exemple:
(ascii ”A”) → 65
(ascii ”B”) → 66
(ascii ”AutoLISP”) → 65
Funcţia CHR
80 Visual LISP/AutoLISP
Sintaxă:
(CHR <întreg> )
Returnează caracterul al cărui cod ASCII în baza 10 este argumentul.
Exemple:
(chr 65) → ”A”
(chr 66) → ”B”
Funcţia CVUNIT
Sintaxă:
(CVUNIT <articol> <su1> <su2>)
Converteşte argumentul <articol> din sistemul de unităţi <su1> în
sistemul de unităţi <su2>. Argumentul <articol> poate fi un întreg, un real sau o
listă ce materializează un punct 2D sau 3D. Argumentele <su1> şi <su2> sunt
şiruri de caractere care desemnează unităţile de măsură în conformitate cu datele
stocate în fişierul acad.unt.
Exemple:
(cvunit 1.5 "minute" "second") →90.0
(cvunit 32 "degrees" "radians")→0.558505
(cvunit 1.0 "inch" "mm") →25.4
(cvunit '(100 250) "mm" "in") → (3.93701 9.84252)
(cvunit '(10 20 30) "ft" "in") → (120.0 240.0 360.0)
Funcţia TRANS
Sintaxă:
Exemple:
Prof. dr. ing. Gheorghe OANCEA 81
Funcţia STRCAT
Sintaxă:
Exemple:
(setq s (strcat ”Auto” ”LISP”)) → ”AutoLISP”
(setq s (strcat s ” si Auto” ”CAD”)) → ”AutoLISP si AutoCAD”
(strcat ”VisualLISP/” s) → ”VisualLISP/AutoLISP si AutoCAD”
(strcat) → ””
Funcţia SUBSTR
Sintaxă:
82 Visual LISP/AutoLISP
Exemple:
(setq s ”AutoLISP si AutoCAD”)
(substr s 5 4) → ”LISP”
(substr s 13 4) → ”Auto”
(substr s 13 17) → ”AutoCAD”
(substr s 10 2) → ”si”
(substr s 25 4) → nil
Funcţia STRLEN
Sintaxă:
Exemple:
(strlen ”AutoLISP” ” si ” ”AutoCAD”) →19
(strlen ”LISP”) →4
(strlen ””) →0
(strlen) →0
Funcţia STRCASE
Sintaxă:
Prof. dr. ing. Gheorghe OANCEA 83
Exemple:
(strcase ”AutoLISP - AutoCAD”) → ”AUTOLISP - AUTOCAD”
(strcase ”AutoLISP - AutoCAD” T) → ”autolisp - autocad”
Observaţie: Caracterele diferite de cele alfabetice nu sunt modificate de funcţia
strcase.
Funcţia WCMATCH
Sintaxă:
Tabelul 2.6
Caracter Specificaţie
Exemplu:
(wcmatch ”Desen” ”???,~*s*,D*”)→ T ;testează dacă ”Desen”
este format din trei caractere (nil), nu conţine caracterul ”s” (nil) şi începe cu
caracterul ”D” (T). Rezultatul returnat va fi T.
Prof. dr. ing. Gheorghe OANCEA 85
Funcţia PRIN1
Sintaxă:
Exemple:
1. Afişare pe ecran
(setq a 67.78)
(setq b ’(x y))
(prin1 ’a) ;afişează A şi returnează A
(prin1 a) ;afişează 67.78 şi returnează 67.78
(prin1 b) ;afişează (x y) şi returnează (x y)
(prin1 ”LISP”) ;afişează ”LISP” şi returnează ”LISP”
(prin1 ”\nLISP”) ;afişează ”\nLISP” şi returnează ”\nLISP”
(prin1 " \nCalea este: \”d:\\studenti\\ppac\\aplicatii\”")
;afisează ”Calea este: \”d:\studenti\ppac\aplicatii\”” pe line noua şi
;returnează " \nCalea este: \”d:\\studenti\\ppac\\aplicatii\”")
(prin1) ;afişează o linie goală
2. Scriere în fişier
(setq f (open ”EX.TXT” ”w”)) ;deschide fişierul
86 Visual LISP/AutoLISP
Funcţia PRINC
Sintaxă:
Funcţia PRINT
Sintaxă:
Funcţia PROMPT
Sintaxă:
(PROMPT <mesaj>)
Exemple:
1. (prompt ”\nIntroduceti o valoare:”)
;returnează nil şi afişează mesajul pe linie nouă
2. (setq n 5)
(setq f 120)
(prompt (strcat ”\nFactorialul calculat este ” (itoa n) ”!=” (rtos f 2 0)))
;returnează nil şi afişează mesajul pe o linie nouă
Observaţii:
1. Funcţia se recomandă a fi utilizată la afişarea mesajelor pe ecran (vezi
exemplul 2 de mai sus) deoarece expandează caracterele de control şi afişează
mesajele fără ghilimele.
2. Prompt nu afişează valorile în fereastra Visual LISP Console ci nu mai în
zona prompter-ului Command:.
Funcţia WRITE-LINE
Sintaxă:
Exemple:
1. Afişare pe ecran
(write-line ”\nExemplu”) ; scrie pe ecran Exemplu şi returnează pe linia
; următoare ”\nExemplu”
2. Scriere în fişier
(setq f (open ”EX.TXT” ”w”)) ;deschide fişierul
(write-line ”\nExemplu write-line\n” f) ;scrie în fişier: prima linie goală,
;pe a doua linie Exemplu write-line şi a treia linie goală.
(setq f (close f)) ;închide fişierul
Observaţie: Scrierea fizică în fişiere se realizează atunci când acestea se închid
cu funcţia close.
Funcţia READ-LINE
Sintaxă:
(READ-LINE [ <df> ])
Exemple:
1. Citire din fişierul EX.TXT creat la exemplul 2 de la funcţia write-line
(setq f (open ”EX.TXT” ”r”)) ;deschide fişierul
(if f ;dacă fişierul există
(setq linie1 (read-line f) ;citeşte prima linie şi avansează
; pointer-ul de fişier pe linia următoare
linie2 (read-line f) ; citeşte a doua linie şi avansează
; pointer-ul de fişier pe linia următoare
linie3 (read-line f) ; citeşte a treia linie şi avansează
; pointer-ul de fişier pe linia următoare
)
)
(setq f (close f)) ;închide fişierul
După tastarea expresiilor de mai sus, linie1 şi linie3 vor conţine şirul vid
(””) iar linie2 şirul ”Exemplu write-line”.
2. Citire de la tastatură
(read-line) ;utilizatorul va introduce de la tastatură un şir
Funcţia WRITE-CHAR
Sintaxă:
Funcţia write-char scrie un caracter pe ecran sau în fişier, dat prin codul
ASCII (în baza 10) din argumentul <nr>. Returnează codul ASCII al
caracterului afişat.
Exemple:
(write-char 65) ;scrie caracterul A pe ecran şi returnează 65
(write-char 67) ;scrie caracterul C pe ecran şi returnează 67
(write-char 90 f) ;scrie caracterul Z în fişierul identificat prin f şi
;returnează 90
Funcţia READ-CHAR
Sintaxă:
(READ-CHAR [ <df> ])
Exemplu:
(read-char )
Expresia simbolică de mai sus, aşteptă introducerea de la tastatură a unuia
sau a mai multor caractere. Dacă se introduce spre exemplu ABC urmat de enter,
read-char citeşte primul caracter şi returnează 65 (codul ASCII al primului
caracter). La următoarele trei apeluri ale funcţiei se vor returna automat codurile
ASCII 66, 67 şi 10 (codul caracterului linie nouă). Abia la următorul apel al
funcţiei se aşteaptă introducerea unor alte caractere. Datele introduse sunt
păstrate în buffer-ul de intrare-ieşire.
Observaţie: La citirea datelor din fişier, funcţia read-char returnează nil la
atingerea sfârşitului de fişier.
Funcţia GRAPHSCR
Sintaxă:
(GRAPHSCR)
Funcţia graphscr schimbă ecranul din mod text în mod grafic (acţionează
ca şi tasta funcţională F2). Returnează întotdeauna nil.
Funcţia TERPRI
Sintaxă:
(TERPRI)
Funcţia TEXTPAGE
Sintaxă:
(TEXTPAGE)
Funcţia textpage comută ecranul din mod grafic în mod text. Returnează
întotdeauna nil.
90 Visual LISP/AutoLISP
Funcţia TEXTSCR
Sintaxă:
(TEXTSCR)
Funcţia OPEN
Sintaxă:
Exemple:
(setq f (open ”EX.TXT” ”w”))→ #<file "EX.TXT">
(setq f (open ”INEXIST.DTA” ”r”))→nil
(setq f (open ”EX1.DAT” ”a”))→ #<file "EX1.DAT">
Observaţii:
1. Argumentul <nume_fişier> poate să conţină ca prefix şi calea până la fişierul
care urmează a fi deschis. Calea poate să fie prefixată şi cu o unitate de disc.
Subdirectoarele din aceasta trebuie separate prin slash (/) sau prin două
backslash-uri (\\) conform interpretării caracterelor de control.
2. Nu pot fi deschise în vederea citirii sau scrierii datelor decât fişiere text.
Exemple:
(setq f (open ”d:/student/ppac/ex.txt” ”w”))→#<file"d:/student/ppac/ex.txt">
(setq f (open ”\\student\\inexist.dta” ”r”))→nil
(setq f(open ”c:/teh/arbore.dat” ”a”))→#<file"c:/teh/arbore.dat ">
Tabelul 2.7
Mod de Descriere
deschidere
”r” Deschide fişierul pentru citire, pointer-ul de fişier este poziţionat
pe primul caracter din fişier. Dacă <nume_fişier> nu există, se
întoarce nil, nefiind permis accesul la citirea datelor.
Deschide fişierul pentru scriere. Dacă <nume_fişier> nu există,
”w” este creat un nou fişier şi este deschis pentru scriere. Dacă
<nume_fişier> deja există, datele anterioare vor fi suprascrise.
Deschide fişierul pentru adăugare de date. Dacă <nume_fişier>
nu există, este creat un nou fişier şi este deschis pentru scriere;
”a” iar dacă <nume_fisier> există deja, fişierul este deschis şi
pointer-ul de fişier este poziţionat la sfârşitul acestuia, în acest
fel datele pot fi adăugate în fişier după cele existente.
Funcţia CLOSE
Sintaxă:
(CLOSE <df>)
Funcţia close închide un fişier deschis prin apelarea funcţiei open. Aceasta
are un singur argument şi anume un descriptor de fişier valid. După apelare,
close returnează nil dacă operaţia de închidere s-a realizat cu succes sau afişează
un mesaj de eroare în caz contrar.
92 Visual LISP/AutoLISP
Exemplu:
(setq f (close f))
Deoarece descriptorul de fişier f nu mai este valabil după ce fişierul la
care se referă este închis, exemplul atribuie variabilei f valoarea nil, acesta fiind
modul recomandat de închidere a unui fişier. În acest fel, se eliberează memoria
calculatorului, existând posibilitatea testării stării unui fişier (dacă este închis
sau deschis) şi se asigură utilizarea corectă a variabilelor în program.
Exemple:
1. Următorul exemplu permite citirea unui fişier text, cu un nume indicat de
programator (DATE.TXT), afişând pe ecran conţinutul acestuia.
(defun c:citdate ( / linie f)
(setq linie "" ;se asigura intrarea in ciclu while
f (open "date.txt" "r") ;se deschide fisierul pentru citirea datelor
)
(if f ;daca exista fişierul
(while linie ;atâta timp cat exista linie in fişier
(setq linie (read-line f)) ;se citeşte o linie din fişier
(if linie (write-line linie)(setq f (close f))) ;daca exista linie afişeaz-o pe ecran
) ;altfel închide fişierul
(prompt "\n!!!!!FISIER INEXISTENT!!!") ;daca nu exista fişierul afişează mesajul
)
(prin1) ;ieşire fără a fi returnata o valoare
)
2. Exemplul următor defineşte o nouă comandă AutoCAD care permite citirea
unui fişier text, şi afişează conţinutul acestuia pe ecran.
(defun c:citfis ( / nume linie f rep)
(setq rep T) ;se asigura intrarea in primul ciclu while
(while rep
(setq nume ;se citeşte numele fişierului
(getstring "\nIntroduceti numele fisierului [cu extensie]:"))
(setq linie T ;se asigura intrarea in al doilea while
f (open nume "r") ;se deschide fişierul pentru citirea datelor
)
(if f ;daca exista fişierul
(while linie ;atâta timp cat exista linie in fişier
(setq linie (read-line f)) ;se citeşte o linie din fişier
(if linie (write-line linie) (setq f (close f))) ;daca exista linie se afişează pe ecran
(setq rep nil) ;se asigura ieşirea din primul ciclu while
) ;altfel închide fişierul
(prompt (strcat ”\nFISIERUL ” nume ” ESTE INEXISTENT!!!”))
;daca nu exista fişierul afiseaza mesajul
)
)
(prin1) ;ieşire fără a fi returnata o valoare
)
Prof. dr. ing. Gheorghe OANCEA 93
Funcţia FINDFILE
Sintaxă:
(FINDFILE <nume_fişier>)
Exemple:
Să presupunem că:
subdirectorul din care este lansat AutoCAD-ul este D:\\Program
Files\\MDT6;
desenul editat se găseşte în subdirectorul D:\\studenti\\ppac;
fişierul DATE.DTA se găseşte în subdirectorul D:\\studenti\\ppac\\;
fişierul INEXIST.LSP nu este pe disc.
Funcţia GETFILED
Sintaxă:
”\\”. Dacă utilizatorul nu indică un nume valid de fişier sau apasă butonul
Cancel atunci getfiled returnează nil.
Tabelul 2.8
<mod> Semnificaţie
64
Nu transferă fişierul dacă utilizatorul specifică un URL.
(bitul 6)
128
Nu permite introducerea unui URL.
(bitul 7)
Exemple:
1. Expresia simbolică următoare:
Prof. dr. ing. Gheorghe OANCEA 95
Observaţii:
1. Dacă extensia este indicată ca fiind şirul vid (””) atunci aceasta este
considerată ca fiind oricare (*) iar în fereastră sunt prezentate numele tuturor
fişierelor (All files).
2. În situaţia în care la apelare se indică extensia DWG, fereastra de dialog
conţine o zonă de previzualizare a fişierelor existente pe disc (cele care au
extensia DWG).
Funcţia ENTLAST
Sintaxă:
(ENTLAST)
Funcţia ENTNEXT
Sintaxă:
(ENTNEXT [ <nume_ent> ])
98 Visual LISP/AutoLISP
Dacă este apelată fără argument, funcţia returnează numele primei entităţi
neşterse din baza de date a desenului. Dacă entnext este apelată cu un parametru
de tip nume de entitate, atunci returnează numele entităţii (neşterse) din baza de
date poziţionată imediat după argumentul <nume_ent>. În cazul în care nu există
o următoare entitate după entitatea desemnată de argument, funcţia returnează
nil. Entnext returnează atât nume de entităţi principale cât şi de entităţi
secundare (subentităţi).
Exemple:
1. Exemplul de mai jos permite ştergerea primelor două entităţi desenate în
AutoCAD (dacă acestea sunt entităţi principale).
(setq ne1 (entnext)
(setq ne2 (entnext e1)
(command ”erase” ne1 ne2 ””)
2. Următorul exemplu parcurge întreaga bază de date a desenului şi afişează
numărul şi numele entităţii, indiferent dacă acestea sunt principale sau
secundare.
(defun c:contor (/ ne k)
(setq k 1 ;se initializeaza contorul
ne (entnext) ;se preia numele primei entitati
)
(while ne
(prompt (strcat "\n Numar entitate:" (itoa k)))
;se afiseaza numarul entitatii
(prompt "\n Nume entitate:")
(prin1 ne) ;se afiseaza numele entitatii
(setq ne (entnext ne) ;se preia numele urmatoarei entitati
k (1+ k) ;se mareste contorul
)
)
(prin1)
)
3. În cazul în care se doreşte aflarea ultimei entităţi trasate, indiferent dacă este
principală sau secundară, se defineşte următoarea funcţie:
(defun c:ultimaent (/ neu nsb)
(if (setq neu (entlast)) ;se preia numele ultimei entitati principale
(while (setq nsb (entnext neu));daca exista subentitate parcurge while
; până când nu mai există subentitate
(setq neu nsb) ; se preia numele subentitatii
)
)
neu ;returnează numele ultimei entitati principale sau al subentitatii
)
Prof. dr. ing. Gheorghe OANCEA 99
Funcţia ENTSEL
Sintaxă:
(ENTSEL [ <mesaj> ])
Funcţia entsel este utilizată pentru aflarea numelui unei entităţi selectate
de utilizator. Returnează o listă formată din două elemente: numele entităţii
selectate şi lista care materializează punctul în care aceasta a fost selectată, adică
(<nume_ent> (x y z)). Dacă argumentul opţional <mesaj> (de tip şir de
caractere) este indicat, acesta va fi afişat înaintea selectării entităţii, în caz
contrar este generat automat mesajul Select objects:. Funcţia acţionează numai
pentru entităţi principale. Dacă prin punctul indicat nu trece o entitate atunci este
returnat nil.
Exemplu:
Exemplul de mai jos permite selectarea unei entităţi şi afişează numele şi
punctul de selectare al acesteia. Dacă nu este selectată o entitate, funcţia afişează
un mesaj şi permite din nou selectarea unei entităţi.
(defun c:exsel (/ ne lp lista)
;simbolurile din program reprezintă: ne-numele entităţii
; lp-lista punctului de selectare
; lista-lista returnată de entsel
(while (not lista)
(setq lista (entsel "\nSelectati o entitate:")) ;se preia lista returnată
(if lista ;dacă s-a selectat o entitate
(progn
(setq ne (car lista) ;se preia numele entităţii
lp (cadr lista) ;se preia punctul de selectare
)
(prompt "\nNumele entitatii selectate este:")
(prin1 ne) ;se afişează numele entităţii
(prompt "\nPunctul de selectare este:")
(prin1 lp) ;se afişează punctul de selectare
)
(prompt "\nNu ati selectat o entitate!!! Mai incercati!!")
)
)
(prin1)
)
Observaţie: La selectarea entităţii prin intermediul funcţiei entsel, modurile
OSNAP setate permanent în AutoCAD, nu sunt luate în considerare.
Funcţia NENTSEL
100 Visual LISP/AutoLISP
Sintaxă:
(NENTSEL [ <mesaj> ])
Funcţia NENTSELP
Sintaxă:
Funcţia HANDENT
Sintaxă:
(HANDENT <şir>)
Exemplu:
(handent "2B")) ;poate să returneze <Entity name: 40063d58> în sesiunea
curentă de editare.
(<e1> . <e2>).
Se remarcă faptul că cele două elemente sunt separate de punct, iar înainte
şi după punct, există întotdeauna spaţiu.
Exemple:
1. (8 . ”0”)
2. (0 . ”LINE”)
102 Visual LISP/AutoLISP
(0 ”LINE”) (0 . ”LINE”)
0 (”LINE”) 0 ”LINE”
”LINE” ()
Observaţie: A nu se uita spaţiile înainte şi după punctul care separă cele două
elemente ale unei perechi cu punct.
o Prin utilizarea funcţiei CONS:
Funcţia CONS
Sintaxă:
Funcţia cons este utilizată pentru generarea perechilor cu punct sau a unor
liste normale. Dacă argumentul <e2> este o listă, se generează lista formată din
elementele lui <e2> cu <e1> inserat pe prima poziţia a listei. Dacă atât <e1> cât
şi <e2> sunt atomi atunci este generată automat perechea cu punct (<e1> .
<e2>).
Exemple:
(setq pp (cons 0 ”LINE”))→ (0 . ”LINE”)
(setq ln (list 0 ”LINE”))→ (0 ”LINE”)
(car pp)→0
Prof. dr. ing. Gheorghe OANCEA 103
(car ln)→0
(cdr pp)→ ”LINE”
(cdr ln)→ (”LINE”)
(cons 5 ’(6 7 8 9))→ (5 6 7 8 9)
(cons ’(5) ’(6 7 8 9))→ ((5) 6 7 8 9)
Exemplu:
Pentru o entitate de tip linie, lista asociată cu datele asociate obligatorii,
are următoarea formă:
((-1 . <Entity name: .......>) ; numele entităţii
(0 . ”LINE”) ; tipul entităţii
(5 . ”2F”) ; handle-ul
(8 . ”0”) ; layer-ul
(67 . 0) ; spaţiul în care este entitatea
(100 . "AcDbLine") ; marcatorul de subcalsă
(410 . "Model") ; numele layout-ului
(10 20.0 40.0 60.0) ; punctul de start
(11 30.0 70.0 80.0) ; punctul final
(210 0.0 0.0 1.0) ; direcţia de extruziune
)
Primul element al fiecărei subliste este cheia sau codul DXF al acesteia,
elementele rămase sunt datele asociate secţiunii determinate de cheie.
În exemplul dat, cheia primei subliste este întregul -1, data aferentă
acestei chei este numele entităţii. Cheia celei de a doua subliste este atomul 0, iar
data asociată este tipul entităţii. În tabelul 2.9 sunt prezentate codurile DXF
pentru o entitate de tip linie, iar în Anexa acestei lucrări sunt prezentate codurile
principalelor entităţi grafice utilizate în liste asociate.
Tabelul 2.9
Codul DXF Data asociată
-1 Numele entităţii
0 Tipul entităţii (Line, Arc, Circle, etc)
104 Visual LISP/AutoLISP
5 Handle-ul entităţii
8 Layer-ul de apartenenţă
67 Spaţiul (Model/Paper) în care se găseşte
entitatea
100 Marcatorul de subclasă
410 Numele Layout-ului
10 Punctul de start
11 Punctul final
210 Direcţia de extruziune
Funcţia ENTGET
Sintaxă:
Exemplu:
Dacă se trasează în layer-ul 0 o linie din punctul 10,10 până în punctul
100,100 atunci se poate obţine lista asociată acestei entităţi prin expresiile:
(setq ne (entlast))
(setq lasoc (entget ne))
Extragerea unei subliste sau a unei perechi cu punct dintr-o listă asociată
este realizabilă prin apelarea funcţiei assoc.
Funcţia ASSOC
Sintaxă:
Exemplu:
(setq lasoc (entget (entlast))) ;returnează lista asociată ultimei entităţi
(assoc 8 lasoc) ;returnează perechea (8 . ”nume-layer”)
(setq numelayer (cdr (assoc 8 lasoc))) ;returnează numele layer-ului
(setq tipent (cdr (assoc 0 lasoc))) ;returnează tipul entităţii
Exemplu:
(setq supraf ’((tip . ”CILINDRICA”) (dia . 123.4) (aid . -0.05)
(asd . 0.05) (lung . 50.0) (ail . 0) (asl . 0) (rugo . 1.6)))
(assoc ’tip supraf) →(tip . ”CILINDRICA”)
(cdr (assoc ’tip supraf)) → ”CILINDRICA”
(setq d1 (cdr (assoc ’dia supraf))) → 123.4
(setq rug (cdr (assoc ’rugo supraf))) → 1.6
Funcţia ENTMOD
Sintaxă:
(ENTMOD <1ista_asoc>)
Observaţii:
1. Funcţia entmod poate modifica atât entităţi grafice cât şi nongrafice.
2. Entmod nu poate modifica tipul entităţii, numele entităţii şi handle-ul
entităţii.
3. Nu poate fi utilizată pentru entităţi de tip viewport.
Exemple:
1. Se trasează o linie în AutoCAD şi apoi se tastează expresiile simbolice de
mai jos care modifică punctul de final al liniei în 100,100,0.
(setq ne (entlast)) ;se preia numele ultimei entităţi trasate
(setq la (entget ne)) ;se preia lista asociată ultimei entităţi trasate
(setq lamod (subst ’(11 100 100 0) (assoc 11 la) la ))
;se generează noua listă asociată entităţii modificate
(entmod lamod) ;se modifică entitatea
2. Se trasează un cerc în AutoCAD şi apoi se tastează expresiile simbolice de
mai jos care modifică raza cercului (noua rază va fi 35) şi centrul acestuia în
punctul 100,100,0.
(setq ne (entlast)) ;se preia numele ultimei entităţi trasate
(setq la (entget ne)) ;se preia lista asociată ultimei entităţi trasate
(setq lamod (subst ’(10 100 100 0) (assoc 10 la) la ))
(setq lamod (subst (cons 40 35) (assoc 40 lamod) lamod ))
;se generează noua listă asociată entităţii modificate
(entmod lamod) ;se modifică entitatea
3. Următorul exemplu preia toate entităţile din baza de date a desenului şi
modifică pentru entităţile de tip linie, layer-ul în care sunt desenate (în layer-ul
existent ”L1”).
(defun c:mod (/ ne nou lasoc)
(setq ne (entnext) ;se preia prima entitate
nou (cons 8 ”L1”)) ;se generează perechea cu punct
(while ne ;cat timp există entitate
(setq lasoc (entget ne)) ;se preia lista asociată
Prof. dr. ing. Gheorghe OANCEA 107
Funcţia ENTDEL
Sintaxă:
(ENTDEL <nume_ent>)
Exemplu:
(setq e1 (entlast))
;se preia în simbolul e1 numele ultimei entităţi desenate
(entdel e1) ;se şterge entitatea identificată prin e1
(entdel e1) ;se readuce pe ecran entitatea ştearsă e1
Funcţia ENTUPD
Sintaxă:
(ENTUPD <nume_ent>)
Exemplu:
Se trasează o polilinie 3D în AutoCAD şi apoi se tastează expresiile
simbolice de mai jos care modifică punctul primului vertex al poliliniei în
100,50,0.
(setq e1 (entlast)) ;se preia numele ultimei entităţi trasate
108 Visual LISP/AutoLISP
(setq e2 (entnext e1)) ;se preia numele primei subentităţi (vertex) din polilinie
(setq la (entget e2)) ;se preia lista asociată primului vertex
(setq la
(subst '(10 100.0 50.0 0.0)
(assoc 10 la) ;se modifică lista asociată
la
)
)
(entmod la) ;se mută vertexul în desen
(entupd e1) ;se regenerează polilinia
Funcţia ENTMAKE
Sintaxă:
(ENTMAKE <1ista_asoc>)
) → ((0 . "LINE") (8 . "NOU") (10 1.0 1.0 0.0) (11 100.0 0.0 0.0))
Observaţii:
1. Perechile cu punct (-1 . <Entity name: .......> şi (5 . ”.....”) sunt generate
automat de către AutoCAD, dacă ele apar în lista asociată, atunci ele sunt
ignorate de comandă.
2. Perechile cu punct ce au codul DXF 100 sunt ignorate de entmake pentru
majoritatea categoriilor de entităţi AutoCAD.
3. Funcţia poate fi utilizată pentru entităţi grafice şi nongrafice.
Funcţia ENTMAKEX
Sintaxă:
(ENTMAKEX <1ista_asoc>)
Funcţia SSGET
Sintaxă:
Tabelul 2.10
Metoda de selectare Semnificaţia
”L” Selectarea ultimei entităţi desenate (last).
”P” Selectarea tuturor entităţilor indicate în cadrul
mulţimii anterioare de selecţie.
Selectarea tuturor entităţilor care se găsesc în
”W” întregime în fereastra delimitată de argumentele
<pct1> şi <pct2> (Window).
Selectarea tuturor entităţilor care se găsesc în
”WP” întregime în poligonul descris prin argumentul
<lista_puncte> şi (Window Polygon).
Selectarea tuturor entităţilor conţinute şi a celor
”C” care ating (traversează) fereastra delimitată de
argumentele <ptc1> şi <pct2> (Crossing).
Selectarea tuturor entităţilor conţinute şi a celor
”CP” care traversează (ating) poligonul descris prin
argumentul <lista_puncte> şi (Crossing Polygon)
Selectarea tuturor entităţilor care traversează
”F” (ating) conturul descris prin argumentul
<lista_puncte> şi (Fence)
Selectarea tuturor entităţilor din desen, dacă nu
apare o listă de filtre, vor fi selectate toate
”X”
entităţile care satisfac condiţiile impuse de lista
de filtre.
Exemple:
(ssget)
;solicită utilizatorului formarea mulţimii de selecţie
(ssget ”L”)
;selectează ultima entitate adăugată în baza de date
(ssget ”P”)
;selectează entităţile indicate la formarea ultimei mulţimi de selecţie
(ssget ”W” ’(1.0 2.0) ’(20.0 10.0))
;selectează toate entităţile aflate în întregime în fereastra determinată
(ssget ”WP” (list ’(1.0 2.0) ’(20.0 10.0) ’(150.0 50.0) ’(20.0 80.0)))
;selectează toate entităţile aflate în întregime în poligonul determinat -
;de punctele 1,2 20,10 150,50 şi 20 80
112 Visual LISP/AutoLISP
Funcţia SSLENGTH
Sintaxă:
(SSLENGTH <m_sel>)
Exemplu:
(setq s1 (ssget ”L”)) ;generează o mulţime de selecţie formată din
;ultima entitate desenată
(sslength s1)→1 ;returnează numărul de elemente din mulţime
Funcţia SSNAME
Sintaxă:
Exemple:
(setq s1 (ssget ”X”)) ;se generează o mulţime de selecţie formată
;din toate entităţile din desen
(setq e1 (ssname s1 0) ;se preia numele primei entităţi din mulţime
e12 (ssname s1 11);se preia numele entităţii de pe poziţia a 11-a
;(a 12-a pentru utilizator)
e100 (ssname s1 99) ;se preia numele entităţii de pe poziţia a 99-a
;(a 100-a pentru utilizator)
)
114 Visual LISP/AutoLISP
Funcţia SSNAMEX
Sintaxă:
Exemple:
(setq s1 (ssget ”X”))
;se generează o mulţime de selecţie formată din toate entităţile din desen
(setq l1 (ssnamex s1 0)) →((0 <Entity name: 40079d68> 0))
;se preia numele şi modul primei entităţi din mulţime
(setq s2 (ssget))
;se generează o mulţime prin selectarea entităţilor de către utilizator
(setq l2 (ssnamex s1 0)) →
((1 <Entity name: 40079d60> 0 (0 (201.413 110.595 0.0))))
;se preia numele şi modul primei entităţi din mulţime
Funcţia SSADD
Sintaxă:
Exemple:
Prof. dr. ing. Gheorghe OANCEA 115
Funcţia SSDEL
Sintaxă:
Exemplu:
(setq e1 (entnext)) ;se preia prima entitate din baza de date
(setq s1 (ssadd e1)) ;se generează o mulţime de selecţie formată din e1
(setq s1 (ssdel e1 s1));se şterge e1 din mulţimea de selecţie
(ssdel e1 s1) ;returnează nil deoarece e1 nu mai face parte din
;mulţimea de selecţie
Funcţia SSMEMB
Sintaxă:
Exemplu:
(setq e1 (entnext)) ;se preia prima entitate din baza de date
(setq e2 (entnext e1)) ;se preia următoarea entitate din baza de date
(setq s1 (ssadd e1)) ;se generează o mulţime de selecţie, s1, formată
;din e1
(ssmemb e1 s1) ;returnează numele de entitate e1
(ssmemb e2 s1) ;returnează nil deoarece e2 nu face parte din
;mulţimea de selecţie
116 Visual LISP/AutoLISP
CAPITOLUL 3
APLICAŢII
BIBLIOGRAFIE