Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Introducere in limbajul de programare AutoLISP

calculatoare



+ Font mai mare | - Font mai mic



Introducere in limbajul de programare AutoLISP

Scopul lucrarii

Aceasta lucrare de laborator urmareste familiarizarea studentilor cu limbajul de programare AutoLISP.

Notiuni teoretice

Se foloseste cursul PFAC (CAD-CAM).



Mod de lucru

  1. Se deschide o noua sesiune de lucru AutoCAD si se incepe un nou desen.

Se deschide un document text cu editorul de texte Notepad aflat in START/Programs/Accesories/.

Se salveaza documentul creat cu Notepad astfel:

se selecteaza optiunea Save si din caseta cu tipul fisierului, care implicit afiseaza .txt, se selecteaza All Files (in cazul in care in document nu este introdus nimic, se introduce un caracter pentru a putea fi salvat);

se introduce numele fisierului cu extensia lsp (de exemplu L1.lsp) in caseta pentru introducerea numelui (deasupra casetei pentru extensie (tipul fisierului))

se actioneaza butonul OK.

Se scrie un program minimal in LISP:

(defun c:L1 ()

Explicarea programului:

Orice program AutoLISP contine cel putin o functie care are formatul programului de mai sus. Incepe cu deschiderea unei paranteze, urmata de cuvantul cheie DEFUN dupa care urmeaza numele functiei si parametrii, urmate de corpul functiei (instructiunile executate in cazul apelarii functiei) dupa care se termina prin inchiderea parantezei. ATENTIE ! in AutoLISP orice instructiune este scrisa intre paranteze rotunde.

In cazul exemplului de mai sus este definita functia L1 (s-a folosit la nume un nume scurt pentru usurinta apelarii in ACAD; in cazul existentei mai multor functii, numele acestora vor trebui sa reflecte actiunea functiei (LINE - traseaza o linie)).

Functia nu are parametri (), deci nu cere nimic utilizatorului (asa cum functia LINE solicita introducerea unor puncte intre care se traseaza linia)

Programul ar fi echivalent in Pascal cu:

begin

end.

si in C cu

main ()

programe absolut corecte in ambele limbaje, putand fi compilate si executate. In anumite limite se poate face o paralela intre limbaje, dar sa nu uitam totusi ca limbajele Pascal si C sunt COMPILATOARE, in timp ce limbajul LISP este INTERPRETOR (deci orice functie (comanda) din LISP poate fi executata direct la promterul Command (in AutoCAD bineinteles)).

Se salveaza programul cu comanda SAVE, fara sa se inchida documentul Notepad (deoarece editorul de text nu mentine "deschis" fisierul editat (lucreaza intr-un fisier temporar), este mai comod sa fie mentinut deschis si dupa modificari sa fie salvat, decat sa fie deschis si inchis pentru fiecare modificare).

Se incarca fisierul cu comenzi in AutoCAD cu comanda LOAD.

Daca fisierul lsp nu a fost salvat in directorul AutoCAD, ceea ce oricum nu este indicat (s-ar umple directorul acad de fisiere "in lucru", temporare, etc.), mesajul returnat de AutoCAD va fi:

Command: (load 'l1')

Can't open 'l1.lsp' for input

error: LOAD failed

(LOAD 'l1')

*Cancel*

In acest caz se va da comanda LOAD specificand calea catre fisierul lsp (in acest caz fisierul se afla pe unitatea D: in radacina):

Command: (load 'd:l1')

error: too few arguments

(DEFUN C:L1 nil)

(LOAD 'd:l1')

*Cancel*

Coamanda a fost corecta, eroarea a provenit din faptul ca o functie LISP trebuie sa nu fie vida. Deci introducem o noua linie in programul L1. activam Notopad-ul (il selectam din bara de stare) si introducem o linie care sa afiseze un mesaj:

(defun c:L1 ()

(princ'gfghf')

Il salvam si incarcam din nou in AutoCAD:

Command: (load 'd:l1')

C:L1

Faptul ca numele fisierului coincide cu cel al functiei lisp este o coincidenta.

Se observa ca la fiecare modificare fisierul trebuie reincarcat permanent in AutoCAD. Pentru a automatiza aceasta cream o functie in acest scop, pe care o adaugam in fisierul deja creat.



(defun c:I ()

(load 'd:l1')

(defun c:L1 ()

(princ'gfghf')

In AutoCAD unele comenzi au asociate combinatii de taste (de fapt apelul comenzilor mai des utilizate se poate face prin apasarea unei singure taste). De exemplu comanda zoom poate fi apelata prin apasarea tastei z. Se dau nume functiilor create diferite de numele comenzilor AutoCAD, sau al functiilor AutoLISP predefinite. Nu este necesar sa copiati programul prezentat, deci sa respectati inclusiv conventiile de notare.

Salvam fisierul si il incarcam in AutoCAD.

Command: (load 'd:l1')

C:L1

Se observa ca a fost afisat numele ultimei functii din fisier. Totusi este activa si comanda de incarcare definita mai sus I.

Command: i

C:L1

Deci fisierul a fost reincarcat. Verificam. Pentru aceasta rulam L1

Command: l1

gfghf'gfghf'

Schimbam textul afisat

(defun c:i ()

(load 'd:l1')

(defun c:L1 ()

(princ'Test')

Tastam I pentru incarcarea fisierului (actualizare)

Tastam L1 pentru executia functiei L1

Command: i

C:L1

Command: l1

Test'Test'

Pana acum avem un program care afiseaza un mesaj (sir de caractere) cu ajutorul functiei lisp PRINC. In continuare o sa "complicam" programul, adaugandu-i linii pentru obtinerea unui program util. In final programul obtinut va trasa o linie intre doua puncte introduse de la tastatura.

Pentru executia oricarei comenzi AutoCAD Se foloseste functia lisp COMMAND, argumentele acesteia fiind comenzi si subcomenzi AutoCAD. Deci programul va fi completat cu linia:

(defun c:i ()

(load 'd:l1')

(defun c:L1 ()

(princ'Test')

(Command 'LINE' '10,10' '100,100')

Programul va trasa o linie intre punctele de coordonate 10,10 si 100,100.

Il reincarcam cu i si il executam cu l1:

Command: i

C:L1

Command: l1

TestLINE From point: 10,10

To point: 100,100

To point: nil

Observam ca AutoCAD-ul nu a parasit comanda LINE si asteapta introducerea unui nou punct. Bineinteles, deoarece stim ca orice comanda se termina cu ENTER. Deci:

(Command 'LINE' '10,10' '100,100' '')

Rulandu-l din nou obtinem trasarea liniei. ATENTIE! dupa fiecare modificare salvati fisierul inainte de a-l incarca in AutoCAD. Se observa ca dupa comanda lisp COMMAND intre ghilimele urmeaza parametrii functiei, in cazul nostru comanda AutoCAD "LINE", primul punct al liniei "10,10" , ultimul punct al liniei "100,100" si echivalentul tastei enter "" pentru terminarea comenzii LINE. Analog se poate folosi orice comanda AutoCAD.

Bineinteles ca aceasta modalitate de a desena nu ne satisface (mai simplu ar fi fost de la promter-ul AutoCAD). Sa trasam linia intre puncte date de valoarea unor variabile.

(defun c:L1 ()

(princ'Test')

(setq pct1 (list 10 10))

(Command 'LINE' pct1 '100,100' '')

Se observa ca functia setq creeaza variabila pct1 si ii asociaza acesteia un punct de coordonate 10,10. Intre parametrii comenzilor lisp ca separator se foloseste spatiul. Punctul asociat variabilei pct1 a fost creat cu functia lisp LIST care alcatuieste o lista din parametrii dati, in cazul nostru 10 si 10.

LISP este un limbaj de programare care lucreaza cu LISTE. orice punct 2D sau 3D este e fapt o lista (un vector) cu 2 sau 3 elemente. Pentru crearea unei polilinii, de exemplu, trebuie furnizata o lista de puncte intre care se traseaza polilinia, fiecare punct fiind o lista de 2 elemente care contine coordonatele punctului. Deci avem o lista cu elemente de tip lista.

Analog se defineste si cel de-al doilea punct, pct2.

(setq pct1 (list 10 10))

(setq pct2 (list 100 100))

(Command 'LINE' pct1 pct2 '')

Obtinem acum acelasi efect ca si programul precedent, deosebirea fiind ca in comanda LINE coordonatele punctelor sunt date de variabilele pct1 si pct2. Continuam si variabilele pct1 si pct2 le obtinem din liste de variabile: x1, y1, x2, y2:



(defun c:i ()

(load 'd:l1')

(defun c:L1 ()

(princ'Test')

(setq x1 10)

(setq y1 10)

(setq x2 100)

(setq y2 100)

(setq pct1 (list x1 y1))

(setq pct2 (list x2 y2))

(Command 'LINE' pct1 pct2 '')

Daca tot avem coordonatele punctelor prin variabilele x1, y1, x2, y2, sa le folosim. Vom trasa o grila intre punctele 0,0 si 200,200, avand celulele patrate, cu latura de 10. Traducand, vom trasa 20 de linii orizontale cu lungimea de 200, incepand din punctul 0,0 si avand distanta intre ele de 10. Analog vom trasa 20 de linii verticale cu distanta dintre ele de 10.

Sa trasam prima data liniile orizontale. Vom trasa linii avand coordonatele x1 si x2 fixe, si anume x1=0 si x2=200. Coordonatele y1 si y2 vor fi egale ca valoare (bineinteles ca in sistemul de axe AutoCAD orice punct de pe o linie orizontala isi pastreaza coordonata y constanta, tocmai pentru a fi pe linie) avand initial valoarea 0 si incrementand aceasta valoare cu 10 pentru fiecare linie nou trasata. Pentru aceasta in AutoLISP dispunem de functia while. Formatul functiei este urmatorul:

(while <expresie text>

(prima expresie)

(a doua expresie)

(ultima expresie)

Aceasta functie evalueaza <expresie test> si, daca nu e nil, evalueaza celelalte expresii dupa care evalueaza din nou <expresie test>. Aceasta continua pana cand <expresie test> devine nil (deci trebuie ca evaluarile sa modifice aceasta expresie, valoarea ei ajungand in final la valoarea nil (altfel bucla devine  "infinita")). Dupa modificari programul devine:

(defun c:i ()

(load 'd:l1')

(defun c:L1 ()

(setq x1 0 y1 -10 x2 200 y2 -10)

(while (< y1 200)

(setq y1 (+ y1 10))

(setq y2 (+ y2 10))

(setq pct1 (list x1 y1))

(setq pct2 (list x2 y2))

(Command 'LINE' pct1 pct2 '')

)

Se observa ca setq permite mai multe atribuiri in timpul unei executii. Initial y1 si y2 sunt initializate cu -10, pentru ca inainte de trasarea primei linii valoarea lor se incrementeaza cu 10.

Analog se face pentru trasarea liniilor verticale. Deci:

(defun c:i ()

(load 'd:l1')

(defun c:L1 ()

(setq x1 0 y1 -10 x2 200 y2 -10)

(while (< y1 200)

(setq y1 (+ y1 10))

(setq y2 (+ y2 10))

(setq pct1 (list x1 y1))

(setq pct2 (list x2 y2))

(Command 'LINE' pct1 pct2 '')

)

(setq x1 0 y1 0 x2 0 y2 200)

(while (< x1 200)

(setq x1 (+ x1 10))

(setq x2 (+ x2 10))

(setq pct1 (list x1 y1))

(setq pct2 (list x2 y2))

(Command 'LINE' pct1 pct2 '')

)

GATA





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2039
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