CATEGORII DOCUMENTE |
Acest capitol trateaza o serie de aspecte referitoare la interfata si operatiile interne ale functiilor C:, dar aceste rezultate pot fi aplicate la orice definitie a unei functii nu numai la cele a caror nume incepe cu C:.
in acest capitol veti studia:
Cum se intrerupe executia unei functii definite de utilizator.
Cum sa anulati afisarea cererilor de comanda AutoCAD in timpul executarii unei comenzi AutoLISP.
Conceptul de alocare si de variabile locale si globale.
Diferenta dintre variabilele locale si globale.
Cum sa declarati si sa folositi variabilele locale in cadrul definitiei functiei.
Valoarea ultimei expresii din corpul de expresii care urmeaza dupa argumentele cerute si variabilele locale din definitia unei functii este intotdeauna returnata ca valoarea functiei. Cred ca ati observat ca functia c:rectangle returneaza nil. Acest lucru este evident deoarece o functie de apelare de tip command este ultima expresie din corpul definitiei functiei c:rectangle si functia de tip command returneaza intotdeauna nil.
Functia AutoLISP prin1 va vizualiza un sir vid pe ecran daca prin1 este ultima expresie din definitia functiei. De exemplu, aceasta versiune modificata a comenzii RECTANGLE nu vizualizeaza nil la cererea de comanda dupa ce aceasta a fost executata.
( defun c:rectangle ()
(setq pt1 (getpoint 'anFirst corner: '))
(setq pt3 (getpoint 'anOther corner: '))
(command
'_.pline'
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
'c'
(prin1)
Implicit AutoCAD-ul dubleaza toate comenzile si optiunile in zona liniei de comanda, incluzind si pe cele emise de un program AutoLISP.
Variabila de sistem CMDECHO poate suprima aceasta 'comanda dubla'.
in aceasta versiune modificata a functiei c:rectangle, CMDECHO este setata pe off la startul rutinei iar la iesire este setata pe on.
(defun c:rectangle ()
(setq old_cmdecho (getvar 'CMDECHO'))
(setvar 'CMDECHO' 0)
(setq pt1 (getpoint 'anFirst corner: '))
(setq pt3 (getpoint 'anOther corner: '))
(command 'pline'
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
'c'
(setvar 'CMDECHO' old_cmdecho)
(prin1)
AutoLISP-ul foloseste o schema dinamica de alocare. Alocarea unei variabile este determinata in timpul functionarii de ordinea apelarii functiei si de declaratiile de variabila.
Variabilele sint legate in doua moduri: global si local
O variabila globala este o variabila a carei legare (sau atribuire a unei valori) a fost facuta cu ajutorul functiilor set si setq si nedeclarata locala in functie. Variabilele globale pot fi vizualizate sub forma de liste pe ecran folosind functia de apelare (familia de atomi 0).
Variabilele globale sint accesibile tuturor functiilor definite de utilizator atit pentru citire cit si pentru scriere.Variabilele globale sint adesea folosite pentru 'comunicare' intre programele AutoLISP. De exemplu Programul 1 va seta o conditie intr-o variabila globala pe care Programul o va verifica inainte de a actiona.
O variabila locala este o variabila a carei legare a fost facuta cu ajutorul functiilor set si setq in cadrul unei functii a carei variabila a fost declarata locala sau cu ajutorul declaratiei sub forma unui argument cerut la o functie.
Variabilele locale isi mentin legatura numai in contextul unei functii in care au fost declarate ca fiind locale. Ele isi pierd legatura odata cu iesirea functiei.
Legarea unei variabile globale se poate schimba in cazul alocarii unei functii in care o variabila cu acelasi nume a fost declarata local. La iesirea functiei, variabila este legata din nou de valoarea globala originala.
Un set de s-expresii ilustreaza aceste concepte.
Cititi explicatiile si introduceti s-expresiile adecvate.
Mai intii veti lega global variabila x de valoarea 1.
Command: (setq x 1)
Command: !x
Apoi veti defini o functie local_arg care il declara pe x ca argument. Legarea lui x se poate schimba local in cadrul alocarii functiei local_arg si legarea globala va fi restabilita la iesirea functiei local_arg .
Command: (defun local_arg (x) (print x) (* x x))
LOCAL_ARG
Command: (local_arg 2)
2
4
Command: !x
1
Apoi veti defini o functie local_var care il declara pe x ca variabila locala. Legarea lui x se poate schimba local in cadrul alocarii functiei local_var si legarea globala va fi restabilita la iesirea functiei local_var.
Command: (defun local_var (/ x) (setq x 3) (print
x))
LOCAL_VAR
Command: (local_var)
3
Command: !x
1
Veti defini apoi o functie global_var unde variabila x nu a fost definita nici ca argument nici ca variabila locala; de aceea schimbarea in interiorul legaturii se va face global, in afara alocarii functiei global_var.
Command: (defun global_var () (setq x 4) (print x))
GLOBAL_VAR
Command: (global_var)
4
Command: !x
4
Functia c:rectangle a fost pe deplin clarificata. in acest exemplu, variabilele old_emdecho, pt1 si pt2 sint declarate ca fiind locale la functie; deci ele nu pot intra in conflict cu variabilele globale care au acelasi nume si nici cu variabilele cu acelasi nume care pot fi gasite in cadrul altor functii.
(defun c:rectangle (/ old_cmdecho pt1 pt3)
(setq old_cmdecho (getvar 'CMDECHO'))
(setvar 'CMDECHO' 0)
(setq pt1 (getpoint 'anFirst corner: '))
(setq pt2 (getpoint 'anOther corner: '))
(command 'pline'
pt1
(list (car pt1) (car (cdr pt3)))
pt3
(list (car pt3) (car (cdr pt1)))
'c'
(setvar 'CMDECHO' old_cmdecho)
(prin1)
Declaratia variabilelor locale se face de obicei dupa un program care a fost verificat si pus la punct intrucit declaratia face dificila sau chiar imposibila examinarea valorilor lor in cazul in care functia aborteaza sau face ceva neasteptat din cauza unei erori in cod.
Variabilele de sistem apelate de functia AutoLISP setvar nu se traduc niciodata din limba engleza in limba utilizatorului. Cererile de apelare a functiei setvar functioneaza in toate versiunile AutoCAD-ului fara sa necesite traducerea numelui variabilei de sistem din limba engleza in limba utilizatorului.
Variabilele de dimensiune se traduc numai in linia de comanda pentru dimensionare.
Puteti inlocui comenzile AutoCAD existente cu comenzi AutoLISP care au acelasi nume.
Utilizatorul poate apela o comanda AutoCAD prin prefatarea numelui comenzii prin caracterul punct (.), de exemplu, .LINE, indiferent daca comanda a fost nedefinita.
Este bine sa prefatati numele unei comenzi apelate de functia AutoLISP de tip command printr-un punct (.) sau prin subliniere (pentru a va asigura ca functioneaza in toate limbile).
Sint doua etape de parcurs pentru inlocuirea comenzii AutoCAD cu o comanda AutoLISP care are acelasi nume.
Folositi comanda UNDEFINE pentru a anihila o comanda AutoCAD pentru sesiunea de editare curenta.
Creati o functie AutoLISP care are acelasi nume ca si comanda AutoCAD si prefatati-o cu c:.
Puteti redefini o comanda AutoCAD folosind comanda REDEFINE.
Introduceti expresiile care urmeaza.
Anihilati comanda AutoCAD LINE.
Command: undefine
Command name: line
inlocuiti-o cu o comanda AutoLISP cu acelasi nume care deseneaza o linie segment. Apelati versiunea englezeasca a comenzii AutoCAD LINE din cadrul functiei AutoLISP.
Command: (defun c: line () (command "._ line " pause pause ""))
C: LINE
Apelati comanda LINE.
Command: line
.- line From point: pick a point
To point pick a point
To point:
Command: nil
Redefiniti comanda AutoCAD.
Command: redefine
Command name: line
Puteti iesi dintr-o functie apelind prin1 sau princ care reprezinta ultima expresie in corpul definitiei functiei.
Variabila de sistem CMDECHO poate suprima afisarea cererilor de comanda AutoCAD.
AutoLISP-ul utilizeaza o schema dinamica de alocare.
Variabilele globale sint accesibile pentru toate functiile.
Variabilele locale sint accesibile numai in contextul functiilor in care au fost declarate.
Puteti folosi variabile locale in cadrul functiilor pentru a evita posibilitatea unor conflicte intre variabile cu aceleasi nume din alte functii.
Variabilele de sistem apelate de functia setvar nu se traduc niciodata din engleza.
Comenzile AutoCAD pot fi inlocuite cu comenzi AutoLISP care au acelasi nume, folosind comanda UNDEFINE.
Comanda AutoCAD va fi intotdeauna apelata cind numele comenzii este prefatat printr-un punct; de exemplu .LINE, indiferent daca comanda a fost anihilata.
Prefatati intotdeauna numele unei comenzi cu un punct (.) sau prin caracterul subliniere ( _ ) in cazul functiei de tip command.
Prefatati intotdeauna optiunea de comanda prin caracterul subliniere ( _ ) in cazul functiei de tip command.
exercitiul 16: functia de programare optima
in acest exercitiu:
Veti consolida cunostintele cu privire la ordonarea functiilor C:, incluzind iesirea functiilor, dublarea cererii de comanda si declaratia variabilei locale.
Veti modifica fisierul rectang.lsp pentru a introduce noi concepte din acest capitol.
Veti crea un nou fisier text cu o functie modificata.
Modificati fisierul rectang.lsp
Adaugati functia de iesire imediata.
Anulati ecoul cererii de comanda.
Declarati variabilele corespunzatoare ca variabile locale.
incarcati, lansati si testati programul dupa ce ati facut modificarile.
Rescrieti functia c:zplus de la sfirsitul capitolul 12 intr-un fisier numit zplus.lsp.
Folositi functia getpoint pentru a obtine noul punct de centru a ecranului.
Anulati ecoul din optiunile si cererile de comanda ZOOM.
Declarati toate variabilele local.
Introduceti functia de iesire.
incarcati, demarati si testati programul dupa ce ati facut modificarile.
NOTA Functiile GETxxx nu pot fi folosite in cadrul expresiilor functiilor command; de exemplu, (command 'line' (getpoint)) nu este permisa.
Aceasta pagina a fost lasata libera in mod intentionat.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1254
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved