CATEGORII DOCUMENTE |
Pe linga functiile interne, AutoLISP-ul permite crearea functiilor definite de utilizator, adica functii ale caror seturi de instructiuni si nume au fost definite.
in acest capitol veti studia:
Definitia functiei AutoLISP.
Cum sa creati propriile functii AutoLISP.
Sintaxa functiei defun.
Cum sa trimiteti argumente unei functii.
Cum returneaza functia o valoare.
Considerati procesul de evaluare al unei expresii tipice care foloseste o functie interna AutoLISP.
(setq x 10)
AutoLISP-ul evalueaza primul element unde se asteapta sa gasesca o functie. Aici gaseste subprogramul setq si reface legatura. Legarea lui setq reprezinta un set de instructiuni care arata cum trebuie facuta procesarea. AutoLISP-ul evalueaza argumentele lui setq in ordine si termina prin aplicarea instructiunilor de procesare la valoarea argumentelor.
Rezultatul in acest caz este o valoare returnata, 10, pentru expresie si un efect secundar al variabilei x care este legata de 10.
setq este un subprogram si instructiunile lui au fost predefinite in AutoLISP. Utilizatorul nu le poate schimba. Totusi este posibila crearea unor noi functii care sa execute orice instructiuni de procesare dorite de utilizator.
Legaturi noi se creaza prin folosirea subprogramului defun care este functia de definire.
Sintaxa functiei defun este putin diferita de cea a celorlalte functii folosite pina acum.
(defun <sym name> (<arg list> / <local var>) <expr> )
defun cere obligatoriu doua argumente si un numar variabil de argumente care urmeaza dupa primele doua.
Primul argument al functiei este numele noii functii de definit. Folositi un nume nou pe care l-ati creat, de preferinta unul care descrie actiunile functiei.
ATEN}IE Nu folositi niciodata numele unei functii sau a unui simbol construite intern deoarece acesta se va suprapune peste definitia originala si il va face inaccesibil pina lansati AutoLISP-ul in cadrul unei noi sesiuni AutoCAD.
in acest exemplu, primul argument al functiei defun este numele simbol myfun care devine numele functiei definite de utilizator.
(defun myfun (<arg list> / <local var>) <expr> )
Al doilea argument cerut de defun este o lista de argumente cerute si variabile locale. Cele doua tipuri de argumente sint separate de o linie. Acum este suficient sa folositi o lista goala.
Exemplul este extins pentru a include lista argumentelor cerute si a variabilelor locale.
(defun MYFUN ( ) <expr> )
Argumentele care urmeaza dupa argumentele cerute sint expresii de evaluat cind se executa functia definita de utilizator. Ele reprezinta instructiunile de procesare care vor fi executate cind functia va fi apelata.
Valoarea returnata a functiei definite de utilizator este valoarea ultimei expresii din corpul definitiei functiei.
in urmatoarele exemple, expresiile vor fi adaugate corpului functiei myfun. Seturi diferite de expresii vor da intelesuri diferite functiei myfun precum si valori returnate diferite.
in acest exemplu myfun adauga doua numere si returneaza raspunsul.
(defun myfun ( )
Introduceti expresiile care urmeaza. Definiti functia myfun apoi apelati-o.
Command: (defun myfun () (+1 2 ))
MYFUN
Command: (myfun)
Introduceti expresiile care urmeaza. Definiti functia myfun apoi apelati-o. myfun va returna radacina patrata a lui 624, rotunjita pina la cel mai apropiat numar intreg.
Command: (defun myfun () (fix (sqrt 624.0))
MYFUN
Command: (myfun)
Introduceti expresiile care urmeaza. Definiti functia myfun apoi apelati-o. myfun va returna distanta dintre doua puncte alese de utilizator.
Command: (defun myfun () (getdist "From point: "))
MYFUN
Command: (myfun)
From point: pick a point
Second point: pick a point
in cele trei exemple pe care le-ati parcurs, valoarea returnata a functiei myfun este valoarea returnata a ultimei expresii din corpul definitiei.
Figura 36.Corp de expresii pentru o definitie a functiei
Expresii multiple pot fi introduse in corpul definitiei functiei. Valoarea returnata a functiei este valoarea returnata a ultimei expresii din corpul definitiei.
in acest exemplu valoarea returnata a functiei myfun este valoarea expresiei (+3 4)
Command: (defun myfun () (+1 2) (+3 4))
MYFUN
Command: (myfun)
Figura 37.Ultima expresie din corp este valoarea returnata a functiei.
(defun myfun (<arg list> / <local var>) <expr> )
Lista argumentelor cerute dintr-o expresie defun va permite sa adaugati argumente la functiile de apelare.
in acest exemplu functia myfun este definita cu un singur argument solicitat: simbolul x. x este folosit in cadrul expresiei din corpul definitiei functiei myfun: (* x 10). Orice valoare se utilizeaza ca argument la myfun, aceasta va deveni automat valoarea lui x din corpul expresiei (* x 10).
Command: (defun myfun (x) (* x 10))
MYFUN
Command: (myfun 1)
Command: (myfun 2)
Command:
Figura 38. Valoarea argumentului se afla in corpul de expresii al functiei.
Introduceti expresiile care urmeaza. Creati o functie numita add-one care solicita un argument. Adaugati unu la valoarea lui si returnati. Folositi functia cu doua valori diferite
Command: (defun add-one (x) (+ x 1))
ADD-ONE
Command: (add-one 1)
Command: (add-one 4)
Introduceti expresiile care urmeaza. Creati o functie numita dtr care cere un argument exprimat in grade si returneaza valoarea transformata in radiani. Folositi functia cu trei valori diferite.
Formula aritmetica pentru transformarea gradelor in radiani pentru valoarea d este:
(d / 180) * pi
Command: (defun dtr (d) (* pi (/ d 180.0)))
DTR
Command: (dtr 180)
Command: (dtr 360)
Command: (dtr 90)
Introduceti expresiile care urmeaza. Creati o functie care se numeste add-two care cere doua argumente, adauga valorile lor si returneaza. Folositi functia cu doua seturi de valori diferite.
Command: (defun add-two (x y) (+x y))
ADD-TWO
Command: (add-two 1 2)
Command: (add-two 4 5)
Noile functii externe sint create cu ajutorul functiei defun.
Toate functiile returneaza o valoare.
Functiile sint definite fara argumente sau cu un numar fix de argumente solicitate.
Argumentele unei functii sint evaluate oriunde s-ar afla in corpul definitiei functiei.
exercitiul 13: definrea unor noi functii
Trebuie sa completati partea a III-a a acestui exercitiu. Se vor face referiri la aceasta parte in exercitiile care urmeaza.
in acest exercitiu veti:
Consolida cunostintele despre cum sint create functiile definite de utilizator.
Scrie functii cu argumente solicitate.
Scrie o functie care apeleaza o comanda AutoCAD.
Creati o functie numita times-two.
Functia solicita doua argumente.
Functia multiplica cele doua argumente si returneaza valoarea.
Testati-o in AutoCAD.
Scrieti-o mai jos.
Creati o functie numita rtd.
Functia solicita un argument.
Functia transforma valoarea argumentului din radiani in grade si returneaza valoarea.
Testati-o in AutoCAD.
Scrieti-o mai jos.
Formula aritmetica de transformare din radiani in grade pentru valoarea r este:
(r / pi) * 180
Creati o functie numita rectangle.
Functia nu cere argumente.
Cereti utilizatorului doua puncte si memorati-le sub forma de variabile.
Trasati o polilinie 2-D inchisa folosind punctele pentru colturile opuse.
Calculati celelalte doua puncte cu ajutorul functiilor car, cdr si list.
Testati-o in AutoCAD.
Scrieti-o mai jos.
Aceasta pagina a
fost lasata libera intentionat.
Functii care actioneaza sub forma de
comenzi AutoCAD
O functie definita de utilizator poate apela o functie AutoLISP command in cadrul corpului definitiei ei. Apelarea ei apare utilizatorului sub forma unei comenzi AutoCAD, o comanda ce poate fi apelata fara ca aceasta sa se afle intre paranteze.
in acest capitol veti studia:
Cum sa transformati o functie AutoLISP definita de utilizator intr-o noua comanda AutoCAD.
Cum sa folositi simbolul pause in cadrul functiilor de tip command.
Cum sa obtineti valoarea unei variabile de sistem in AutoLISP.
Pentru a ilustra unele puncte
sensibile ale definirii functiilor si comenzilor AutoCAD vom crea o functie
simpla si utila care combina comanda ZOOM cu
Considerati cererile pentru o
operatie
Command: zoom
All/Center/Dynamic/Extens/Left/Previous/Vmax/Window/<Scale(X/XP>:
Center point:
Magnification or Heigh<current>:
Avem nevoie de doua valori pentru aceasta functie: noul punct centru si factorul curent de afisare multiplicat cu 2. Vom obtine cele doua puncte de la utilizator prin suspendarea evolutiei functiei si vom obtine factorul de afisare prin setarea variabilei de sistem VIEWSIZE.
Putem obtine un punct de la utilizator prin legarea unei variabile cu setq si getpoint si transferarea variabilei catre comanda zoom.
(setq pt (getpoint "Center point: "))
(command "zoom" "c" pt )
Putem suspenda cererile de comanda care vin din AutoCAD pentru a permite utilizatorului sa raspunda direct.
(command "zoom" "c" pause )
Simbolul special AutoLISP pause este folosit ca argument pentru functiile tip command. pause suspenda evaluarea expresiei si permite utilizatorului sa raspunda in linia de comanda unde este introdus (in cazul ilustrat mai sus, cererea pentru un nou punct de centru pentru afisare).
Functia AutoLISP getvar are un singur argument: numele unei variabile de sistem exprimata sub forma unui sir, adica intre ghilimele. Functia returneaza valoarea variabilei de sistem.
in acest exemplu functia getvar returneaza valoarea variabilei de sistem viewsize.
Command: (getvar "viewsize")
Avem toate instructiunile necesare pentru definirea functiei noastre.
O modalitate de a suspenda comanda zoom si de a permite utilizatorului sa selecteze un nou punct de centru.
O modalitate de a obtine factorul de afisare curent zoom.
Introduceti expresiile care urmeaza. Creati o noua functie numita zplus si folositi-o. zplus va afisa noul punct de centru pe care il selectati 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:
O sintaxa speciala pentru numele functiei definite de utilizator ne permite sa apelam functia sub o forma prescurtata fara sa folosim paranteze. Aceasta functie apare mai curind sub forma unei comenzi AutoCAD decit sub forma unei functii.
Daca numele unei functii incepe cu litera C:, atunci functia poate fi apelata fie sub forma unei functii sau sub forma unei comenzi.
Daca numele unei functii incepe cu caracterul C:, functia poate fi apelata pe linia de comanda fie ca o functie, fie ca o comanda.
in acest exemplu, functia c:zplus este apelata ca o functie si ca o comanda.
Introduceti expresiile care urmeaza. Definiti functia c:zplus si apelati-o in ambele moduri, ca o functie si ca o comanda.
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:
Simbolul pause permite utilizatorului sa raspunda la o cerere dintr-o comanda AutoCAD apelata de functia AutoLISP de tip command.
Functia getvar stabileste valoarea variabilei de sistem.
Prefatind numele unei functii definita de utilizator cu C: se creaza o noua comanda AutoCAD
exercitiul 14: crearea de noi comenzi autocad
Trebuie sa completati partea I a acestui exercitiu, deoarece se vor face referiri la aceasta parte si in alte exercitii.
in acest exercitiu veti:
Crea comenzi noi in AutoCAD din functii AutoLISP.
Modifica o functie existenta dintr-un exercitiu anterior si o veti transforma intr-o comanda.
Modificati functia rectangle din partea a III-a a exercitiului 11-1.
Definiti functia ca c:rectangle.
Scrieti functia mai jos.
Testati-o in AutoCAD.
Definiti o functie numita c:zminus.
Aceasta trebuie sa faca aceleasi lucruri ca si functia c:zplus, dar schimbati factorul de afisare de la 2 la 1/2.
Scrieti functia mai jos.
Testati-o in AutoCAD.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 997
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved