CATEGORII DOCUMENTE |
AutoLISP dispune de o metoda pentru tratarea erorilor de program si de utilizare.
in acest capitol veti studia:
Cum sa folositi functiile exit si quit pentru a forta o eroare AutoLISP.
Cum sa inlocuiti rutina implicita AutoLISP de tratare a erorilor.
Cum sa utilizati rutina de tratare a erorilor pentru 'a sterge' un program dupa ce a fost abortat din cauza unei erori sau pentru ca utilizatorul a anulat programul.
Cum sa folositi comanda UNDO in rutina de tratare a erorilor.
Functiile exit si quit realizeaza aceeasi operatie, fara argumente.
Functiile exit si quit forteaza aplicatia curenta sa se termine prin fortarea unei erori AutoLISP. Ele returneaza sirul 'quit/exit abort' si transfera sirul functiei de tratare a erorilor *error*. Dupa executarea functiei de tratare a erorilor, AutoCAD-ul se intoarce la linia de comanda.
O aplicatie poate folosi functiile exit si quit in combinatie cu o functie de tratare a erorilor definita de utilizator pentru a opri propria-i executie, pentru a reface orice valori necesare in AutoCAD si pentru a prezenta utilizatorului un mesaj adecvat.
Puteti fi siguri ca pozitionarea unei variabile de sistem sau o anumita conditie AutoCAD pot fi restabilite dupa aparitia unei erori neasteptate folosind functia *error*. in cadrul acestei functii care poate fi definita de utilizator puteti evalua conditiile de eroare, puteti returna un mesaj adecvat utilizatorului si puteti restabili setarea variabilelor AutoCAD.
Parcurgeti aceste etape pentru a implementa o subrutina de tratare a erorilor definita de utilizator pentru o comanda.
Salvati definitia curenta a functiei *error*.
Definiti o noua functie *error* pentru comanda sau functie.
Redefiniti subrutina veche de tratare a erorilor prin comanda exit sau prin exit dintr-o noua subrutina de tratare a erorilor.
Redefinirea rutinei de tratare a erorilor ar trebui facuta in contextul
unei comenzi sau a unei functii; plasati codul pentru a defini o rutina de
tratare a erorilor in cadrul codului pentru comanda.
Exemplu
Acest cod implementeaza comanda c:rectangle si propria-i rutina de tratare a erorilor.
(defun c:rectangle (/ pt1 pt2)
(setq old_error *error*) ;save default error handler
(defun *error* (msg) ;define new error handler
(setvar 'CMDECHO' old_cmdecho) ;restore system variable
(if
(/= 'Function cancelled' msg) ;no message if user cancels
(if
(= msg 'quit / exit abort') ;no message if program
(princ) ;deliberately aborts
(princ (strcat 'anError: ' msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)
(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)
(setq *error* old_error) ;restore default error handler
;if command is successful
(prin1)
Dupa cum vedeti, AutoLISP-ul va permite sa definiti o functie (adica sa apelati functia defun) in timpul executarii unei comenzi sau functii definite de utilizator. Deci rutina de tratare a erorilor pentru functia c:rectangle este definita de indata ce utilizatorul apeleaza comanda RECTANGLE dar nu inainte de asta. Rutina AutoLISP, implicita de tratare a erorilor este refacuta in toate cazurile: cind comanda ajunge sa fie indeplinita cu succes sau la capatul rutinei de tratare a erorilor cu comanda specifica.
Aceasta tehnica va permite sa adaptati rutina AutoLISP de tratare a erorilor pentru orice situatie.
Rutina noastra de tratare a erorilor cu comanda specifica reface pozitionarea originala a variabilei de sistem CMDECHO in cazul in care Comanda RECTANGLE intilneste o eroare in timpul executiei. Variabila definita de utilizator old_emdecho a fost facuta global asa incit valoarea ei este accesibila noii functii *error*.
exercitiul 30: definirea si utilizarea unei noi subrutine de tratare a erorilor
in acest exercitiu:
Veti aprofunda cunostintele despre modul cum se foloseste o rutina de tratare a erorilor.
Veti modifica functia de la exercitiul 29.
Adaugati o rutina de tratare a erorilor pentru comanda CIRCEN in fisierul circen.lsp.
Folositi exemplul de la c:rectangle ca o baza de la care sa porniti.
incarcati programul in AutoCAD.
Activati comanda CIRCEN si anulati-o cu Ctrl-C pentru a verifica rutina de tratare a erorilor.
Pentru a permite utilizatorului sa anuleze intr-o singura etapa rezultatul unei comenzi pe baza de AutoLISP, amplasati un UNDO MARK la inceputul rutinei.
Puteti folosi rutina de tratare a erorilor pentru a anula automat rezultatele unei comenzi pe baza de AutoLISP pina la punctul unde a intervenit eroarea, admitind faptul ca UNDO CONTROL este setat pentru ONE sau ALL.
Variabilele de sistem UNDOCTRL si UNDOMARKS pot fi examinate de un program AutoLISP pentru a determina ce actiune de anulare, daca exista vreouna, este adecvata pentru sesiunea curenta AutoCAD.
Aceasta definitie a comenzii RECTANGLE permite utilizatorului sa anuleze rezultatele comenzii intr-o singura etapa.
Instructiunea if testeaza daca UNDO este activata. Daca da, atunci da o comanda UNDO MARK la inceputul rutinei.
Dupa ce utilizatorul introduce o comanda RECTANGLE, utilizatorul poate anula rezultatul comenzii cu comenzile U sau UNDO BACK.
(defun c:rectangle (/ pt1 pt2)
(setq old_cmdecho (getvar 'CMDECHO'))
(setvar 'CMDECHO' 0)
(if
(= 1 (logand 1 (getvar 'UNDOCTL')))
(command '._UNDO' '_MARK')
)
(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)
Extindem codul UNDO pentru a include rutina de tratare a erorilor. Daca rutina este anulata dintr-un motiv oarecare si UNDO este disponibil, rezultatul comenzii pina la punctul de eroare este anulat automat. Se seteaza o variabila de conditie pentru a fi examinata in rutina de tratare a erorilor. Un UNDO GROUP este activat in comanda si corelat cu un UNDO END.
NOTA Fisierul ai_utils.lsp, versiunea 12 din directorul support contine citeva rutine pentru folosirea codului UNDO intr-un program AutoLISP.
continuare pe pagina urmatoare
(defun c:rectangle (/ pt1 pt2)
(setq old_cmdecho (getvar 'CMDECHO')) ;store orignal command echo
(setvar 'CMDECHO' 0) ;turn off command echo
(setq old_error *error*) ;save default error handler
(defun *error* (msg) ;define new error handler
(command) ;cancel any command in progress
(if
rect_undo_flag ;if the undo flag is t
(progn
(command '._UNDO' '_END') ;end the group
(command '._U') ;undo the command
(setq rect_undo_flag nil) ;and clear the flag
)
)
(setvar 'CMDECHO' old_cmdecho) ;restore system variable
(if
(/= 'Function cancelled' msg) ;no message if user cancels
(if
(= msg 'quit / exit abort') ;no message if program
(princ) ;deliberately aborts
(princ (strcat 'anError: ' msg));otherwise, print error for user
)
(princ)
)
(setq *error* old_error) ;restore default error handler
(princ) ;quiet exit
)
(if
(= 1 (logand 1 (getvar 'UNDOCTL')));if UNDO is on
(progn
(command '._UNDO' '_GROUP') ;start an UNDO GROUP
(setq rect_undo_flag t) ;and set a flag
)
(setq rect_undo_flag nil) ;else, clear the flag
)
(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'
)
(if
rect_undo_flag ;if the flag is set
(progn
(command '._UNDO' '_END') ;end the UNDO GROUP
(setq rect_undo_flag nil) ;and clear the flag
)
)
(setvar 'CMDECHO' old_cmdecho) ;reset original command echo
(setq *error* old_error) ;restore default error handler
;if command is successful
(prin1) ;quiet exit
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1090
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved