Scrigroup - Documente si articole

     

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


Initiere in autolisp. generalitati.

autocad



+ Font mai mare | - Font mai mic



Initiere in AutoLISP. Generalitati.

Scopul lucrarii

Lucrarea are ca scop initierea studentilor in lucrul cu pachetul de programe AutoLISP inclus in AutoCAD 200



Notiuni teoretice

Desenarea asistata de calculator folosind programul AutoCAD 2002 poate fi realizata in mod semiautomat folosind limbajele de programare incluse / acceptate de acesta. Folosind limbajele de programare acceptate pot fi create module program care sa genereze automat blocuri 2D sau 3D. Acestea pot fi utilizate in orice desen si pot fi incluse la randul lor in alte module program. Limbajele de programare acceptate de AutoCAD 2002 sunt:

AutoLISP - este un limbaj de programare derivat din LISP (LISt Processing).

Este principalul si primul limbaj de programare adoptat de AutoCAD fiind special conceput pentru lucrul cu liste de dimensiuni variabile, care sunt exact tipul de informatii vehiculate de AutoCAD.

Este un INTERPRETOR (orice linie program introdusa la prompterul Command are efect imediat), deci are avantajul posibilitatii verificarii liniilor de cod fara compilarea (generarea) intregului program;

Incepand cu versiunea AutoCAD 2000 este inclus in program un editor AutoLISP denumit Visual LISP;

Principalul dezavantaj il constituie viteza mica de executie (fiind interpretor asamblarea programului se face in timpul executiei). Odata cu introducerea Visual LISP-ului acest neajuns este inlaturat, acest limbaj permitand si lucrul cu obiecte (lucru imposibil in versiunile anterioare);

Acest limbaj de programare va fi tratat in cadrul laboratorului.

ARX (AutoCAD Runtime Extension) - este un limbaj de programare derivat din limbajul de programare C++, bazat pe programe compilate;

Este o versiune imbunatatita a limbajului ADS (AutoCAD Development System)     care este derivat din limbajul de programare C. Dezavantajul acestuia este dependenta de platforma hardware cu care se lucra si faptul ca modulele trebuiau rulate tot sub AutoLISP. Mediul de dezvoltare ARX suporta si biblioteca ADS;

Avantajul acestuia consta in viteza mare de executie, deoarece programul este compilat si incarcat sub forma executabila;

Dezavantajul consta in faptul ca limbajul de programare C++ este un COMPILATOR, deci inainte de a putea fi rulat (testat) trebuie compilat tot programul. O aplicatie ARX nu poate fi citita deoarece nu este disponibila in forma de program sursa;

Incarcarea unei aplicatii ARX se face cu functia arxload.

DCL (Dialog Control Language) - un limbaj independent de platforma hardware creat pentru definirea si controlul casetelor de dialog;

Un fisier care descrie casete de dialog are extensia .DCL si este incarcat din AutoLISP prin functia load_dialog

Visual BASIC si ActiveX - pun la dispozitia programatorului tehnologia obiectelor ActiveX;

Visual Basic este un limbaj de programare puternic dezvoltat de Microsoft integrat in pachetul de programe MsOffice, deci va fi simplu de integrat desenele AutoCAD in aceste aplicatii;

Visual Basic lucreaza foarte bine cu obiectele Windows (ferestre, butoane, casete de dialog, etc), putandu-se construi relativ usor o interfata windows (comuna de altfel tuturor programelor care lucreaza sub windows);

Tehnologia ActiveX poate integra desenele AutoCAD in toate programele care utilizeaza aceasta tehnologie (si viceversa), conform fig.1;


Impreuna cu limbajul de programare AutoLISP sunt singurele care ruleaza direct de sub interfata AutoCAD.

In continuare va explica progresiv limbajul de programare AutoLISP, realizand un program care sa genereze semiautomat in functie de parametrii introdusi desenul din lucrarea 1 - un surub tridimensional.

Avantajul utilizarii unui limbaj de programare rezida in posibilitatea crearii unei biblioteci de comenzi proprii care sa genereze blocuri 2D sau 3D. Spre deosebire de o biblioteca de blocuri create cu comanda WBlock blocurile generate prin rularea unui program pot fi dimensionate in functie de parametrii introdusi (de exemplu la surub lungimea filetului).

De asemenea comenzile din AutoCAD care pot fi modificate sau completate sau pot fi create altele noi. Pot fi facute selectii sau generate modele de hasurare, etc. Deci poate fi automatizat orice proces repetitiv si pot fi modificate/create comenzi AutoCAD.

Chestiuni de studiat

Se studiaza Editorul VisualLISP.

Se creeaza un program AutoLISP care sa deseneze o grila din linii.

Se creeaza un program AutoLISP care sa deseneze proiectia capului surubului in plan.

Modul de lucru

Se lanseaza programul AutoCAD din meniul Start/Programs/AutoCAD 2000/AutoCAD 2000 [Fig.1.1] sau cu ajutorul pictogramei (icon-ului) de pe ecran (desktop) [Fig.1.2].

Se creeaza un desen nou utilizand optiunile implicite (Start from Scratch / Metric)

Se salveaza desenul.


Se deschide editorul Visual LISP din meniul Tools / AutoLISP / VisualLISP Editor (fig.2).


Se deschide Editorul VisualLISP fig.3.


INFO: Limbajul de programare AutoLISP (VisualLISP) va fi explicat gradual, pornind de la simplu (sau foarte simplu) la complex, fiind tratate numai notiunile si functiile necesare parcurgerii lucrarilor de laborator. Pentru aprofundarea acestui limbaj de programare va fi consultat cursul de specialitate si bibliografia.


La deschiderea editorului VisualLisp se deschid automat 2 ferestre: VisualLISP Console si Trace. Deocamdata este utila numai fereastra VisualLISP Console, care va fi redimensionata astfel incat sa poata afisa 3-4 randuri si va fi pozitionata in partea de jos a ferestrei principale. In aceasta fereastra sunt afisate mesaje referitoare la programul introdus si la corectitudinea transferului acestuia catre AutoCAD. Fereastra Trace va fi minimizata sau inchisa. De asemenea fereastra principala este util sa fie maximizata pentru obtinerea unui spatiu mai mare pentru editare. Se deschide un fisier nou folosind butonul New, dau comanda New din meniul File. Se redimensioneaza aceasta fereastra astfel incat sa poata contine cat mai multe randuri.

Daca nu a fost deja deschis un fisier nou (vezi INFO) se deschide si se salveaza utilizand un nume sugestiv, de exemplu Lucrare

INFO: Numele fisierului descrie numai continutul functiilor sau comenzilor definite in el, dar nu are legatura directa cu executia sau incarcarea acestora in AutoCAD

In aceasta fereastra se scrie un program minimal in LISP:

(defun L2()

Explicarea programului:

Orice program AutoLISP contine cel putin o functie care are formatul programului de mai sus. Incepe cu deschiderea unei paranteze rotunde, urmata de cuvantul cheie DEFUN dupa care urmeaza numele functiei si parametrii acesteia, urmate de corpul functiei (instructiunile executate in cazul apelarii functiei) dupa care se termina prin inchiderea parantezei rotunde. In AutoLISP simbolul spatiu este folosit ca separator.

INFO: ATENTIE! in AutoLISP orice instructiune este scrisa intre paranteze rotunde. Nu introduceti 2 sau mai multe spatii intre simboluri deoarece aceasta este considerata eroare. De asemenea in lipsa spatiilor 2 sau mai multi parametri sunt considerati unul singur, ceea ce genereaza erori. Se observa ca parantezele sunt scrise cu culoarea rosie, cuvintele cheie AutoLISP sunt scrise cu culoarea albastra, etc. Acest efect usureaza depanarea programului, deoarece o functie AutoLISP tastata gresit nu se mai coloreaza automat in albastru. AutoLISP nu este sensibil la majuscule, deci nu conteaza daca numele functiilor este scris cu majuscule sau nu.

In cazul exemplului de mai sus este definita functia L2 (s-a folosit la nume un nume scurt pentru usurinta apelarii in AutoCAD; 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 AutoLISP poate fi executata direct la promterul Command (in AutoCAD bineinteles)).

Se incarca programul editat in AutoCAD prin apasarea butonului Load Active Edit Window (vezi fig.3).

INFO: Se observa ca in fereastra VisualLISP Console apare mesajul:

; error: bad DEFUN syntax: (L2 nil)

Programul este corect ca sintaxa, mesajul de eroare semnaland ca functia L2 nu contine nici o instructiune. In timp ce in Pascal sau C corpul unei functii poate fi vid, in AutoLISP acest lucru genereaza eroare.

Introducem o linie care sa afiseze un mesaj. Programul completat cu noua linie va fi urmatorul:

(defun c:L1 ()

(princ'gfghf')

INFO: Toate noile linii din program se introduc intre linia de definire a functiei (defun. si paranteza rotunda care termina functia. In platforma programul va apare in forma integrala numai unde acesta faciliteaza intelegerea lui. Cand va trebui creata o noua functie sau un nou fisier acest lucru va fi specificat explicit, in rest noile linii vor fi adaugate la programul existent.

Il salvam si incarcam din nou in AutoCAD.

INFO: Se observa ca in fereastra VisualLISP Console apare mesajul:

; 1 form loaded from #<editor 'C:/My Documents/lablsp'>

Mesajul semnaleaza ca nu exista nici o eroare in programul incarcat si ca a fost incarcata o singura functie din fisierul lablsp.

Se comuta in fereastra AutoCAD prin apasarea butonului Activate AutoCAD sau prin utilizarea barei de stare a windows-ului. La prompterul Command se tasteaza numele functiei intre paranteze rotunde. In fereastra de comenzi va aparea:

Command: (l2)

gfghf ' gfghf '

INFO: Se observa ca la fiecare modificare fisierul trebuie reincarcat permanent in AutoCAD.

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 (nume functii sau texte afisate).

Pana acum avem un program care afiseaza un mesaj (sir de caractere) cu ajutorul functiei AutoLISP 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 AutoLISP COMMAND, argumentele acesteia fiind comenzi si subcomenzi AutoCAD. Deci programul va fi completat cu linia:

(defun L2()

(princ'Test')

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

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

Il reincarcam L2:

Command: (l2)

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 modificam programul:

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

Ruland din nou obtinem trasarea liniei. Se observa ca dupa functia AutoLISP 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 L2()

(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 AutoLISP ca separator se foloseste spatiul. Punctul asociat variabilei pct1 a fost creat cu functia AutoLISP LIST care alcatuieste o lista din parametrii dati, in cazul nostru 10 si 10.

AutoLISP 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, pct

(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 pct Incarcam si rulam programul. INFO: Deoarece de la rularea anterioara este trasata o linie, acum linia trasata se suprapune peste aceasta si nu apare nici o schimbare vizibila. Pentru a inlatura acest neajuns sunt doua metode: se sterge tot desenul sau se foloseste comanda Undo cu parametru. Varianta a doua este cea mai comoda, deci inainte de fiecare rulare se lanseaza comanda Undo si ca numar de comenzi anulate se poate furniza un numar intre 1 si 65357, care indica numarul de operatii care vor fi anulate. Cred ca 200 este acoperitor.

Continuam si variabilele pct1 si pct2 le obtinem din liste de variabile: x1, y1, x2, y2:

(defun L2()

(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 L2()

(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 L2()

(setq x1 -10 y1 0 x2 -10 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 '')

)

Acum deschidem un program nou in VisualLISP care va trasa o parte din surub.

Se salveaza programul folosind un nume sugestiv, de exemplu surub.

INFO: Se observa ca se pot deschide mai multe fisiere de lucru in VisualLISP si se poate lucra simultan cu mai multe programe. De asemenea o functie incarcata dintr-un asemenea fisier, sau chiar o variabila AutoLISP creata la prompterul Command, este activa toata sesiunea de lucru AutoCAD, exact ca orice comanda, de exemplu LINE. Deoarece primul fisier (care trasa linia) nu mai este necesar poate fi minimizat sau inchis. Un fisier AutoLISP poate contine o singura functie principala sau mai multe. Orice functie dintr-un fisier incarcat in AutoCAD poate fi apelata in corpul unei functii sau in mod independent la promterul AutoCAD.

Cream functia principala, care pentru inceput va afisa un mesaj.

(defun sd()

(princ 'Program principal desenare surub')

INFO: Se poate alege numele functiei respectand conventia de notare AutoLISP amintita mai sus. Un nume sugestiv ar fi de exemplu surub, dar cum programul va fi rulat de foarte multe ori pana in faza finala ar fi mai comod sa putem lansa programul prin tastarea unei singure litere. Verificam in AutoCAD litera s. Si bineinteles este atribuita comenzii Stretch, deci nu o putem folosi. Incercam su, dar si aceasta combinatie este asociata comenzii Subtract. Din aceasta cauza am ales sd pentru numele functiei, care nu are nici o asociere.

Incarcam programul in AutoCAD si il rulam. Ca rezultat in fereastra de comenzi apare textul Program principal desenare surub.

Consultam referatul de la lucrarea 1 (J) si observam ca pentru desenarea surubului prima etapa consta in desenarea unui hexagon folosind comanda Polygon. Introducem apelul acestei comenzi in program.

(command "polygon" "6" "0,0" "I" "150"

INFO: Orice comanda AutoCAD folosita, la care nu se cunosc bine parametrii, este indicat sa fie apelata in AutoCAD, si sa fie notati parametrii si ordine solicitarii acestora. In cazul nostru sunt solicitati 4 parametri in urmatoarea ordine: numar de laturi, centru cercului, inscris/circumscris, raza cercului. De asemenea este necesar sa se cunoasca daca este necesar sa fie terminata comanda cu Enter sau nu (cazul comenzii Line, Polyline, etc.). Daca unele optiuni implicite sunt convenabile pot fi inlocuite cu Enter - "", dar este indicata pastrarea optiunii pentru claritatea programului.

Am desenat hexagonul folosind datele din lucrarea 1, dar noi suntem interesati sa putem genera un surub in functie de dimensiunile introduse de la tastatura. Pentru hexagon avem nevoie de o variabila in care sa fie memorat centrul cercului generator si de o variabila in care sa fie memorata raza cercului. Introducem in program liniile necesare si programul modificat va fi urmatorul:.

(defun sd()

(princ 'program principal desenare surub')

(setq centru '0,0' razacap '150')

(command 'polygon' '6' centru 'i' razacap)

INFO: Toate datele introduse intre ghilimele nu sunt evaluate fiind tratate ca siruri de caractere. in apelul unei comenzi AutoCAD parametrii care sunt dati prin variabile nu sunt pusi intre ghilimele. De fapt variabilele sunt apelate prin nume oriunde in program.

Introducem in fisier si liniile care automatizeaza stergerea desenului.

(defun sd()

(princ 'program principal desenare surub')

(setq centru '0,0' razacap '150')

(command 'polygon' '6' centru 'i' razacap)

(getstring 'apasa enter sau spatiu pentru stergere')

(command 'undo' '400')

INFO: Getstring este o functie AutoLISP care solicita introducerea unui sir de caractere terminat cu Enter. Aceasta linie program este necesara deoarece opreste executia programului inainte de stergerea desenului.

Continutul referatului

Titlul lucrarii.

Scopul lucrarii.

Chestiunile de studiat.

Comenzile si optiunile acestora.

Functiile utilizate si parametrii acestora.

Listingul programelor.

Desenul realizat copiat la imprimanta.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


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