Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Tratarea erorilor AutoLISP

autocad



+ Font mai mare | - Font mai mic



Tratarea erorilor AutoLISP

AutoLISP dispune de o metoda pentru tratarea erorilor de program si de utilizare.

Obiective

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.

Fortarea unei erori

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.

Functia *error*

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.

Etape de lucru

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.

UNDO si tratarea 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.

Exemplu

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)

Exemplu

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1090
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved