CATEGORII DOCUMENTE |
Programele AutoLISP pot face un salt pe baza valorii unei expresii test.
in acest capitol veti studia:
Cum se poate schimba controlul desfasurarii unui program pe baza unei expresii test.
Cum sa folositi testele de egalitate si testele logice ca expresii test.
Diferenta dintre simbolul t si simbolul nil.
Cum sa determinati tipul de date al unui obiect.
Aceasta diagrama simpla ilustreaza principiul ramificarii programului.
Figura 2. Ramificarea programului bazata pe testul de conditie
in aceasta diagrama, daca valoarea variabilei x este egala cu sirul de tip text 'Hello, world', atunci programul se va ramifica in expresia y si va continua; daca nu , se va ramifica in expresia z si va continua.
Functiile care realizeaza testele conditionale sint folosite pentru ramificatii in interiorul programelor AutoLISP. Cele doua functii de baza pentru testele conditionale sint:
if
cond
Unele valori sau seturi de valori sint testate cu if sau cond iar programul se ramifica conform rezultatelor testului. AutoLISP-ul dispune de o varietate de functii care testeaza valorile pe baza anumitor criterii sau unele valori pe baza celorlalte. in acest capitol ne concentram atentia asupra unora dintre cele mai utilizate functii de acest tip.
> <
equal
and
or
not
logand
in AutoLISP, simbolul t este echivalentul pentru 'adevarat' in orice test conditional. Simbolul nil este echivalentul lui 'fals'.
Daca o expresie AutoLISP nu se evalueaza, atunci expresia este nil sau falsa. Daca o expresie nil este folosita intr-un test conditional, atunci va fi executata o ramificatie pentru o conditie falsa.
Daca o expresie AutoLISP evalueaza orice altceva decit nil, atunci expresia este t sau adevarata. Daca o expresie t este folosita intr-un test conditional, atunci va fi executata ramificatia pentru o conditie adevarata.
t si nil se exclud mutual. Daca o expresie este t, atunci nu poate fi nil. Daca o expresie este nil, atunci nu poate fi t.
exercitiul nr 17: obiectele si expresiile pot fi t sau nil
in acest exercitiu:
Veti invata sa determinati daca valoarea returnata a unei functii este t sau nil.
intr-un desen nou, desenati o entitate de tip linie.
Introduceti expresiile in coloana din stinga a tabelului.
Determinati daca expresiile sint t sau nil.
Verificati casuta adecvata din tabel.
Expresie |
t |
nil |
(setq ename (entnext)) | ||
!ename | ||
(setq ename (entnext ename)) | ||
!ename | ||
(command 'erase' 'last' '') | ||
(command 'u') |
Tabelul 19. Expresiile pot fi t sau nil
Functia = are doua sau mai multe argumente cu orice tip de date. Aceasta functie verifica daca toate argumentele au valori echivalente. Daca da, functia returneaza t; daca nu, returneaza nil.
De exemplu, aceasta expresie verifica daca valorile numarului real 4.0 si expresia (+ 2.0 2.0) sint echivalente
Command: (= 4.0 (+ 2.0 2.0))
T
Aceasta expresie verifica daca 4.0 este echivalent cu expresia (+ 1.5 2.0)
Command: (= 4.0 (+ 1.5 2.0))
nil
Functia < verifica daca primul ei argument este numeric mai mic decit al doilea argument.
Command: (< 45 50)
T
Functia equal este in esenta aceeasi cu functia =.
Introduceti expresiile care urmeaza.
Legati doua variabile de valori numerice. Folositi variabilele ca argumente la citeva functii si verificati rezultatele.
Command: (setq x 1)
1
Command: (setq y 1.5)
1.5
Verificati daca x este mai mic decit y.
Command: (< x y)
T
Verificati daca x este mai mare decit y.
Command: (> x y)
nil
Verificati daca y este mai mare sau egal cu 1,5.
Command: (>= y 1.5)
T
Verificati daca x este mai mic sau egal cu y.
Command: (<=
x y)
T
Verificati daca x nu este egal cu y.
Command: (/= x y)
T
Acest tabel arata functiile care verifica egalitatea in AutoLISP.
Functie |
Test |
Egal cu |
|
Nu este egal cu |
|
< |
Mai mic decit |
<= |
Mai mic sau egal cu |
> |
Mai mare decit |
>= |
Mai mare sau egal cu |
minusp |
Mai mic decit zero |
zerop |
Egal cu zero |
equal |
Egal cu |
eq |
Au aceeasi legatura |
Tabelul 20. Functii de egalitate
AutoLISP-ul dispune de citeva functii care verifica tipul de date ale unui simbol sau expresii.
Functie |
Test |
ATOM |
Este argumentul un atom? |
LISTP |
Este argumentul o lista? |
BOUNDP |
Este argumentul legat de o valoare? |
NULL |
Este argumentul nil? |
NUMBERP |
Este argumentul un numar? |
Tabelul 21. Functii care testeaza tipul de date
Introduceti expresiile care urmeaza.
Legati trei variabile de trei tipuri de date diferite: un simbol, un numar real si o lista.
Command: (setq x 'abc)
ABC
Command: (setq y 1.0)
1.0
Command: (setq z '(1 2 3))
(1 2 3)
Folositi variabilele ca argumente la functii care testeaza tipul de date. Examinati rezultatele functiilor.
Sint aceste variabile atomi?
Command: (atom x)
T
Command: (atom y)
T
Command: (atom z)
nil
Sint aceste variabile liste?
Command: (listp x)
nil
Command: (listp y)
nil
Command: (listp z)
T
Puteti verifica tipul de date al unui obiect in AutoLISP folosind fie functia =, fie functia equal cu functia type.
Introduceti expresiile care urmeaza.
Legati doua variabile cu tipuri de date diferite: un numar intreg si un numar real.
Command: (setq x 1)
1
Command: (setq y 1.5)
1.5
Folositi functiile type si = pentru a verifica tipul lor de date.
Command: (= (type x) 'INT)
T
Command: (equal (type x) 'REAL)
nil
Command: (equal (type y) 'REAL)
T
Exista citeva functii de test logic in AutoLISP. in acest capitol vom studia patru dintre cele mai importante functii: not, and, or si logand.
Functia not solicita un argument. Daca argumentul este nil, atunci expresia returneaza t; daca nu, aceasta returneaza nil.
Functia not este o functie a carei valoare returnata este opusul argumentului ei. Dati-i nil si va returna t. Dati-i t si va returna nil.
Exemplu
Command: (not nil)
T
Command: (not t)
nil
Functia and solicita unul sau mai multe argumente. Daca unul dintre argumente este nil, ea returneaza nil. Daca toate argumentele sint t , atunci returneaza t.
Functia and opreste procesarea de indata ce gaseste un argument nil. Unele programe sint scrise in acord cu acest comportament. De exemplu, puteti fi siguri ca programul nu va gasi o instructiune intr-o lista de argumente ale functiei and daca nici unul dintre argumentele anterioare nu este nil.
Command: (and 1 2 3)
T
Command: (and 1 2 nil)
nil
Functia or solicita unul sau mai multe argumente. Daca unul dintre argumente este t, functia returneaza t. Daca toate argumentele sint nil, atunci functia returneaza nil.
Functia or opreste procesarea de indata ce gaseste un argument t. Unele programe sint scrise in conformitate cu acest comportament. De exemplu, puteti fi siguri ca programul nu va gasi o instructiune intr-o lista de argumente ale functiei or daca nici unul dintre argumentele anterioare nu este t.
Command: (or 1 2 3)
T
Command: (or 1 2 nil)
T
Command: (or nil nil nil)
nil
Functia logand are doua sau mai multe argumente care ar trebui sa fie numere intregi. Functia returneaza un numar intreg.
Functia logand realizeaza o comparatie AND bit cu bit a bitilor din argumentele care sint numere intregi. Daca un bit este setat la valoarea 'adevarat' in toate argumentele functiei logand, atunci acel bit este setat la valoarea 'adevarat' si in valoarea returnata.
Numerele intregi 7, 3 si 15 sint reprezentate in biti in tabelul de mai jos.
Intreg |
1 bit |
2 bit |
4 bit |
8 bit |
16 bit |
X |
X |
X | |||
X |
X | ||||
X |
X |
X |
X |
Tabelul 22. Biti setati la valoarea 'adevarat' in trei numere intregi.
Aceasta expresie va returna un numar intreg in care toti bitii care sint setati la valoarea 'adevarat' in toate cele trei argumente vor fi setati la valoarea 'adevarat". in acest caz, bitii pentru valorile 1 si 2 vor fi returnati ca 'adevarat' de catre expresie, deoarece sint singurii biti setati 'adevarat' in toate cele trei argumente.
Command: (logand 7 15 3)
3
Functia logand va fi de folos atunci cind va fi folosita impreuna cu functiile 'entity access' mai tirziu in acest curs, in special cu valorile binare cum ar fi codurile grupului 70 DXF pentru Polylines si Block Definitions .
Ramificarea unui program depinde de valoarea unui test conditional.
Toate obiectele si expresiile din AutoLISP sint t sau nil.
AutoLISP dispune de o varietate de functii care testeaza tipul de egalitate si tipul de date ale obiectelor si expresiilor.
Puteti testa tipul exact de date al unui obiect combinind functiile type si =.
Functiile logice not, and si or verifica daca una sau mai multe expresii sint t sau nil.
Functia logand realizeaza o comparatie AND bit cu bit a unei liste de numere; aceasta functie va fi de ajutor in combinatie cu functiile de tip entity access mai tirziu.
Functiile de egalitate si functiile logice sint folosite in expresii test. Expresiile test sint folosite in expresii conditionale si iterative formate din functii ca if si while. Ele verifica daca exista o anumita conditie si arata AutoLISP-ului ce functie sa execute care depinde de conditie, sau de rezultatul testului.
NOT| Orice atom, simbol sau expresie poate fi folosita ca expresie test deoarece orice obiect in LISP are o valoare: fie nil, fie altceva.
in acest capitol veti studia:
Cum sa folositi expresiile conditionale pentru a face salt la diferite seturi de expresii in cadrul programului AutoLISP
Sintaxa functiilor if si cond.
Cum sa folositi functia progn pentru a executa multiple s- expresii in cadrul functiei if.
Expresiile conditionale controleaza desfasurarea unui program AutoLISP. Folosim expresiile test pentru a verifica daca o anumita conditie exista, iar rezultatul expresiei test este folosit pentru a comuta expresia conditionala. Expresia conditionala poate opta pentru executia programului in oricare din cele citeva directii posibile. Fiecare directie va avea un set de expresii de evaluat in AutoLISP.
Cele mai folosite expresii conditionale in AutoLISP sint functiile if si cond.
Functia if are doua argumente obligatorii si un al treilea argument care este optional.
Daca valoarea primului argument este t, adica oricare in afara de nil, AutoLISP-ul evalueaza al doilea argument.
Daca valoarea primului argument este nil, AutoLISP-ul sare peste al doilea argument. Daca exista cel de-al treilea argument optional, AutoLISP-ul il evalueaza.
Simplificind putin lucrurile, functia if ar arata cam asa:
(if
(I_return_true)
(do_this)
(else_do_this)
)
Introduceti expresiile care urmeaza:
Legati variabila x de o valoare a lui 1. Legati valoarea lui y bazata pe valoarea lui x.
Command: (setq x 1)
1
Command: (if (= x 1) (setq y
1) (setq y 0))
1
Command: !y
1
Legati variabila x de o valoare a lui 0. Legati variabila y bazata pe valoarea x.
Command: (setq x 0)
0
Command: (if (= x 1) (setq y
1) (setq y 0))
0
Command: !y
0
exercitiul 18: ramificarea programului folosind functia if
in acest exercitiu :
Veti folosi functia if.
Veti scrie o functie pentru a comuta SNAP pe on sau off in functie de setarea curenta.
intr-un fisier nou, folositi editorul de text pentru a crea o functie numita c:snaptog.
Introduceti codul de mai jos.
Functia ar trebui sa comute modul SNAP in functie de valoarea curenta.
(defun c:snaptog (/ snapval)
(setq snapval (getvar 'SNAPMODE')) ;get current SNAPMODE
(if
(= 1 snapval) ;if it's on
(setvar 'SNAPMODE' 0) ;turn it off
(setvar 'SNAPMODE' 1) ;otherwise, turn it on
(prin1) ;quiet exit
Salvati functia intr-un fisier numit snaptog.lsp din directorul student.
incarcati fisierul in AutoCAD.
Desenati citeva entitati tip Line si Circle.
Folositi SNAPTOG pentru a comuta SNAP pe on sau off cind desenati entitatile.
NOT| incercati sa apelati SNAPTOG in cadrul unei comenzi LINE sau CIRCLE.
Functia if permite executia unei singure expresii dupa ce a fost evaluata expresia test.
Puteti face ca expresii multiple sa apara ca o singura expresie la functia if prin amplasarea acestora in cadrul expresiei progn.
Functia progn evalueaza pe fiecare dintre argumentele sale, pe rind si returneaza valoarea ultimului argument. Expresii multiple aflate in cadrul functiei progn apar sub forma unei simple expresii la o functie de apelare.
in acest exemplu, daca variabila x este egala cu 1, atunci valorile vor fi atribuite ambelor variabile y si z. Asignarea este realizata de doua s-expresii.
Command: (setq x 1)
1
Command: (if (= x 1) (progn
(setq y 2) (setq z 3)) (setq y 0))
3
Command: !y
2
Command: !z
3
exercitiul 19: expresii multiple in cadrul functiei if
in acest exercitiu:
Veti modifica functia existenta de la exercitiul 18.
Veti folosi functia progn.
Veti executa s-expresii multiple prin apelarea unei functii if.
1. in editorul de text, deschideti fisierul snaptog.lsp din directorul student.
2. Redenumiti functia c:modetog.
3. Cu ajutorul functiei progn, adaugati codul care comuta SNAPMODE si GRIDMODE pe baza valorii curente a lui SNAPMODE.
4. Salvati fisierul pe disc ca modetog.lsp.
5. incarcati programul modificat in AutoCAD.
6. Testati comanda MODETOG.
Functia cond cere un argument obligatoriu si un numar oarecare de argumente optionale.
Fiecare argument al functiei cond poate fi un set de expresii incluse intr-o lista externa.
Functia cond evalueaza prima expresie in fiecare din listele de argumente, pe rind, pina ce o expresie evalueaza 'adevarat'. Atunci functia cond evalueaza expresiile care urmeaza primei expresii din cadrul argumentului si returneaza.
Functia cond este de preferat functiei if ori de cite ori exista mai mult de doua cazuri de testat, adica mai mult de doua ramificari in orice punct din program.
Aceasta definitie a functiei va introduce valori diferite in zona liniei de comanda, in functie de valoarea numerica a variabilei x.
Fiti atenti in mod special la modul in care pot fi construite argumentele la functia cond. Prima expresie dintr-un argument este expresia test si expresiile care urmeaza dupa test vor fi evaluate daca argumentul test este adevarat.
Functia cond opreste testarea argumentelor de indata ce gaseste un argument a carui expresie test este adevarata, adica nu este nil.
(defun testx (x)
(cond
(= x 0)
(prompt 'anX equals 0.')
(< x 0)
(prompt 'anX is less than 0.')
(> x 0)
(prompt 'anX is greater than 0.')
(prin1)
Functia if testeaza o expresie si se ramifica spre oricare dintre cele doua s-expresii.
Functia progn este folosita pentru a executa s-expresii multiple in cadrul functiei if.
Functia cond poate testa mai multe expresii si poate executa orice numar de s-expresii intr-o ramificatie data.
exercitiul 20: utilizarea functiei cond pentru ramificarea programului
in acest exercitiu:
Veti folosi functia cond in cadrul unei functii noi.
Veti testa o variabila pentru egalitate numerica.
Veti executa toate trei ramificatiile expresiei cond.
Creati o noua functie intr-un nou fisier cu ajutorul editorului de text.
Numiti aceasta functie testx.
Functia cere un argument obligatoriu.
intr-o instructiune cond, folositi testele de egalitate pentru a vedea daca valoarea argumentului este egala, mai mica sau mai mare decit 0.
Daca este satisfacut un test de egalitate, folositi functia prompt pentru a semnaliza utilizatorul.
(prompt 'anX equals 0.')
Salvati fisierul ca testx.lsp in directorul student.
incarcati fisierul in AutoCAD.
Folositi functia testx cu valorile argumentelor 0, 1 si -1.
Aceasta pagina a fost lasata libera in mod intentionat.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1197
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved