L01_m03_autolisp

  • Uploaded by: Florin Manea
  • 0
  • 0
  • April 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View L01_m03_autolisp as PDF for free.

More details

  • Words: 2,598
  • Pages: 6
Modul 03 LecŃia nr. 1

Universitatea “Petru Maior” Tg.Mureş Centrul de Instruire CAD&CAM

LecŃia nr. 1: Introducere în AutoLISP AutoLISP este un limbaj de programare de nivel înalt, care face parte integrantă din mediul AutoCAD. LISP este un acronim pentru LISt Processing (procesare de liste). AutoLISP este un dialect al limbajului de programare LISP, o variantă dedicată exclusiv AutoCAD-ului. LISP este unul dintre cele mai vechi limbaje de programare de nivel înalt, cunoscut mai ales pentru aplicaŃiile din domeniile sistemelor expert şi inteligenŃei artificiale. Ca şi FORTRAN-ul, prima implementare a LISP-ului datează din jurul anului 1960. Acum există mai multe dialecte (variante) ale LISP-ului, incluzând Common Lisp, Franz Lisp, Mu Lisp şi X Lisp.

Primele încercări AutoLISP AutoLISP este un limbaj de care beneficiem odată cu instalarea AutoCAD-ului. Programele AutoLISP nu pot fi folosite decât în AutoCAD; orice încercare de program AutoLISP se face deci în AutoCAD. Limbajul este de tip interpretor, astfel încât rezultatul calculelor sale pot fi vizualizate interactiv în editorul de desenare AutoCAD. AutoLISP interacŃionează direct cu AutoCAD-ul, fără a cere programe suport externe cum ar fi un compilator. Pentru a putea face primele încercări AutoLISP, lansaŃi AutoCAD-ul. La prompt-ul Command: tastaŃi o primă expresie AutoLISP, prin care să adunaŃi două numere întregi, după care apăsaŃi tasta Enter: Command: (+ 2 3) 5

Aşa cum se vede în exemplul de mai sus, pe rândul următor expresiei AutoLISP, este afişat rezultatul adunării: 5. Când AutoCAD “vede”, în loc de o comandă, o expresie AutoLISP, el cedează execuŃia interpretorului AutoLISP, care este dator să evalueze expresia. Expresia AutoLISP are reguli simple de formare: • • • • •

începe cu o paranteză rotundă; după paranteză urmează un nume de funcŃie AutoLISP; funcŃia AutoLISP este urmată de argumentele sale, despărŃite cel puŃin de câte un spaŃiu; argumentele pot fi la rândul lor expresii AutoLISP; în ansamblu, câte paranteze se deschid, tot atâtea trebuie şi închise.

În exemplul de mai sus, aŃi folosit funcŃia “+” din AutoLISP. Numerele 2 şi 3 sunt argumente ale funcŃiei “+”. Structura expresiei AutoLISP este simplă dar neobişnuită. Cele mai multe bătăi de cap ridică parantezele şi împerecherea lor corectă. Astfel, iată câteva expresii aritmetice simple şi echivalentele AutoLISP, într-o formă tabelară (verificaŃi fiecare expresie în parte): Expresie aritmetică

1 2

21 − 4 ⋅ 3 2.17 3 + 1 1 − sin 45°

Expresia echivalentă în AutoLISP Command: (/ 1 (sqrt 2)) 0.707107 Command: (sqrt (− − 21 (* 4 3))) 3.0 Command: (+ (expt 2.17 3) 1) 11.2183 Command: (− − 1 (sin (/ pi 4))) 0.292893

M03-1

Modul 03 LecŃia nr. 1

Universitatea “Petru Maior” Tg.Mureş Centrul de Instruire CAD&CAM

Analizând expresiile de mai sus, pot fi sintetizate câteva aspecte ale scrierii AutoLISP: •

prima expresie AutoLISP din tabel transpusă în cuvinte ar suna aşa: împarte pe unu la radicalul lui doi - nu uita deci că întâi numeşti funcŃia şi apoi argumentele sale; după fiecare paranteză deschisă urmează o funcŃie; numerele reale se scriu folosind punctul zecimal; funcŃiile trigonometrice aşteaptă unghiurile în radiani, nu în grade; pentru numărul π se foloseşte cuvântul “pi”; fiecare funcŃie are dreptul la un număr dat de argumente, iar folosirea unui număr incorect de argumente atrage un mesaj de eroare.

• • • • •

Un tabel cu funcŃiile aritmetice uzuale şi exemple de utilizare ale acestora, este dat în tabelul de mai jos, alături de câteva observaŃii importante: FuncŃia AutoLISP

Exemplu de utilizare Command: (+ 1 2 −6) −3 Command: (− − 7 –1 5) 3 Command: (/ 9 3 2.0) 1.5 Command: (* 9 −3 2.0)

+ − / *

sqrt expt sin cos atan

−54.0 Command: (sqrt 4) 2.0 Command: (expt 2 3) 8 Command: (sin (/ pi 3)) 0.866025 Command: (cos (/ pi 3)) 0.5 Command: (atan 1 0.0) 1.5708

ObservaŃii Adunarea poate avea oricâte argumente; numerele negative sunt precedate de semnul −. Când argumentele sunt întregi, rezultatul este întreg. Dacă cel puŃin un argument este real, atunci rezultatul este real; încercaŃi cu 2 în loc de 2.0! FuncŃia înmulŃire admite de la nici unul până la oricâte argumente; fără argument întoarce 0. FuncŃia radical nu admite decât un singur argument, iar rezultatul este întotdeauna un real. Ridicarea la putere admite şi mai mult de două argumente; încercaŃi efectul. FuncŃiile trigonometrice lucrează cu unghiurile în radiani. Nu există funcŃiile tangentă şi cotangentă, iar dintre cele inverse există doar arctangenta. Întoarce arctangenta raportului dintre cele două argumente; dacă primul argument este pozitiv iar al doilea este zero, atunci întoarce 1.5708 (90°).

Legarea variabilelor şi interogarea lor Numărul π este exprimat în AutoLISP prin cuvântul pi. Pe de altă parte, + sau sqrt sunt de asemenea cuvinte rezervate pentru nume de funcŃii interne AutoLISP – primul fiind dedicat adunării şi cel de-al doilea extragerii radicalului de ordinul doi. Asemenea oricărui limbaj de programare, AutoLISP permite utilizarea de variabile. Expresia de mai jos permite legarea întregului 1 la variabila cu numele a: Command: (setq a 1) 1

FuncŃia AutoLISP care permite legarea de valori unei variabile, este setq. Este evident că numirea variabilelor trebuie să evite o serie de nume rezervate funcŃiilor interne sau constantelor AutoLISP; astfel, vor fi evitate nume precum +, −, sqrt, abs, sin, atan, setq etc.

M03-2

Modul 03 LecŃia nr. 1

Universitatea “Petru Maior” Tg.Mureş Centrul de Instruire CAD&CAM

Pentru a vedea care este valoarea legată de o variabilă, se foloseşte semnul exclamării “!”, pus înaintea variabilei. Prin exemplul de mai jos veŃi putea evalua valorile legate de variabilele a, b şi setq: Command: !a 1 Command: !b Nil Command: !setq <Subr: #22a3e24>

Variabilei a i s-a legat anterior întregul 1, este deci normal ca AutoLISP să raporteze 1. Această valoare se păstrează până la legarea unei noi valori de variabila a, sau până la începerea unei noi sesiuni de desenare în AutoCAD. În AutoLISP, nil înseamnă “nimic” sau “fals”, iar variabilei b nefiindu-i legată nici o valoare, este raportată ca fiind nil. La începerea unei noi sesiuni AutoCAD, până la atribuirea unei valori, astfel de variabile sunt nil. Nu sunt nil însă numele de funcŃii AutoLISP, acestora fiindu-le legaŃi indicativi de subrutină, aşa cum apare în exemplul de mai sus pentru funcŃia setq. Răspunsuri AutoLISP la cereri AutoCAD Cererilor formulate de comenzi AutoCAD li se poate răspunde cu expresii AutoLISP. Folosind astfel de expresii, pot fi lansate chiar comenzi AutoCAD. Pentru câteva încercări, desenaŃi mai întâi o linie oarecare în AutoCAD. În exemplul de mai jos, în cadrul unei comenzi de rotire a liniei desenate, unghiul de rotire se indică printr-o expresie AutoLISP: Command: rotate Select objects: last Select objects: apasă tasta Enter pentru a încheia selecŃia de obiecte de rotit Base point: 0,0 /Reference: (/ 45 2.0)

În exemplul următor, este lansată printr-o expresie AutoLISP însăşi comanda rotate, cu tot dialogul care îi urmează; rezultatul va fi o nouă rotire a liniei, în jurul aceluiaşi punct, cu acelaşi unghi rezultat din calcul AutoLISP: Command: (command "rotate" "last" "" "0,0" (/ 45 2.0))

Expresia de mai sus cere o serie de explicaŃii suplimentare. Astfel, funcŃia command din AutoLISP permite lansarea de comenzi AutoCAD. Numele comenzilor se scriu ca şir, fără spaŃii suplimentare în cadrul şirului – care ar avea efect de Enter. Diferitele opŃiuni din dialogul unei comenzi pot fi de asemenea indicate ca şiruri: ″last″ va răspunde la cererea de selecŃie şi provoacă selectarea pentru rotire a ultimei entităŃi AutoCAD desenate; şirul nul ″″ are efect de Enter; şirul ″0,0″ indică coordonatele punctului de bază. ExersaŃi şi alte exemple, pe baza tabelului următor (asiguraŃi-vă să lucraŃi în sistem metric). Comenzi AutoCAD Command: line From point: 20,20 To point: 100,100 To point: Enter

Expresii AutoLISP Command: (command “line” “20,20” “100,100” “”)

Command: circle 3P/2P/TTR/
: 60,60 Diameter/: 10

M03-3

Modul 03 LecŃia nr. 1

Universitatea “Petru Maior” Tg.Mureş Centrul de Instruire CAD&CAM

Command: arc Center/<Start point>: 40,20 Center/End/<Second point>: c Center: 1,1 Angle/Legth of chord/<End point>: l Length of chord: 28.2

Atomi şi liste Expresiile AutoLISP pot să răspundă oricăror cereri AutoCAD. În dialogul comenzilor AutoCAD pot să apară cereri de numere reale, numere întregi, puncte, texte, selecŃii de obiecte, nume de fişiere etc. Am enumerat mai sus o serie de tipuri de date, pe care expresiile AutoLISP trebuie să le poată prelucra. Ca orice program de desenare, AutoCAD are de-a face mai ales cu puncte, definite prin coordonatele lor într-un sistem de referinŃă. Pentru a răspunde în AutoCAD unei cereri de punct, AutoLISP formează o listă cu doi sau trei reali, reprezentând coordonatele x, y, z ale punctului; astfel, exprimarea în AutoLISP a punctului de coordonate x = 10, y = − 20, z = 30.7 este prin lista (10 –20 30.7).

Listele se prelucrează şi se generează prin funcŃii AutoLISP specifice. Iată un exemplu, probat la prompt-ul Command: din AutoCAD, prin care se generează lista (10 −20 30.7): Command: (list 10 −20 30.7) (10 −20 30.7)

Valoarea returnată de funcŃia list este o listă compusă din valorile argumentelor sale. FuncŃia admite oricâte argumente, dar pentru reprezentarea punctelor sunt necesare 2 sau 3 argumente de tip întreg sau real. În exemplul următor, se leagă lista la variabila pt, iar apoi această variabilă este utilizată într-o cerere de punct pentru comanda line din AutoCAD: list

Command: (setq pt (list 10 −20 30.7)) (10 −20 30.7) Command: line From point: !pt To point: (list 100 100) To point: Enter

Reprezentarea liniei poate fi provocată şi printr-o expresie AutoLISP de tipul: Command: (command “line” pt (list 100 100) “”)

unde trebuie remarcat faptul că variabila pt nu cere ghilimele! Ghilimele sunt folosite atunci când parametri de transmis AutoCAD-ului, la utilizarea funcŃiei command, nu trebuie evaluaŃi de interpretorul AutoLISP. În AutoLISP există două categorii majore de obiecte: atomii şi listele. Un atom este cel mai simplu obiect în AutoLISP. Un atom poate fi un întreg, un număr real, un şir, o funcŃie AutoLISP predefinită, sau orice alt tip de obiect din tabelul alăturat. Tipul atomului

Exemple

Tip de dată AutoLISP

Nume de variabilă (simbol)

pi, a, pt

SYM

Şir

″exemplu″

STR

Întreg

2, -4

INT

Real

3.14, 0.2, -84.7665

REAL

Descriptor de fişier



FILE

Nume de entitate AutoCAD

<Entity name: 37e0520>

ENAME

M03-4

Modul 03 LecŃia nr. 1

Universitatea “Petru Maior” Tg.Mureş Centrul de Instruire CAD&CAM

Set de selecŃie AutoCAD

<Selection set: 1>

PICKSET

FuncŃii

<Subr: #22a3e24>

SUBR

FuncŃii ADS

<Ext. Subr: 1 #3a970498>

EXSUBR

Există o regulă simplă de a determina dacă un obiect este un atom sau o listă: dacă obiectul nu este închis între paranteze, atunci el este un atom; altfel este o listă. Listele sunt expresii complexe care includ atomi şi/sau alte liste. Listele au reguli sintactice stricte, dar simple: • • •

o listă trebuie închisă între paranteze; pentru orice listă care trebuie evaluată, primul element al listei trebuie să fie o funcŃie; obiectele din listă trebuie separate cu cel puŃin un spaŃiu.

Iată într-o formă tabelară, câteva exemple de liste: Lista

Nr. elemente

Tipul elementelor din listă

(1 2 3)

3

Numerele întregi: 1, 2 şi 3

(+ 1 2.5)

3

FuncŃia +, întregul 1 şi realul 2.5

(+ 1 (/ 5 2.0))

3

FuncŃia +, întregul 1 şi lista (/ 5 2.0)

(setq pt (list 1 2 3))

3

FuncŃia setq, variabila pt şi lista (list 1 2 3)

()

0

Toate obiectele din AutoLISP sunt fie atomi fie liste. Un atom nu poate fi niciodată listă, iar o listă nu poate fi niciodată atom. Cu excepŃia lui nil. Câteva aspecte legate de nil au fost deja prezentate într-un paragraf precedent. Obiectul nil este o listă vidă. Prin convenŃie, nil este simultan atom şi listă. El poate fi exprimat în două feluri: ( ) sau nil. În AutoLISP nil este echivalent cu fals. Multe funcŃii în AutoLISP testează dacă o condiŃie este falsă sau adevărată; de exemplu dacă valoarea unui număr este egală cu zero. Întotdeauna când rezultatul unui test este “fals”, AutoLISP returnează nil ca valoare a testului efectuat. nil este singurul obiect AutoLISP care corespunde lui “fals”; în opoziŃie, ceea ce nu este fals, este “adevărat”.

Evaluarea Evaluarea este procesul prin care AutoLISP determină valoarea unui obiect. Sunt supuşi evaluării atât atomii cât şi listele. În AutoLISP fiecare obiect are o valoare. Prin evaluare, AutoLISP determină valoarea obiectului şi returnează acea valoare. Atomii sunt obiecte simple, evaluate după o regulă simplă în funcŃie de tipul lor. Cei mai mulŃi atomi sunt evaluaŃi la valorile lor în sine. Valoarea unei variabile este egală cu ultima valoarea legată ei. Câteva exemple de evaluare sunt date în tabelul de mai jos. Pentru orice listă care trebuie evaluată, primul element din listă trebuie să fie o funcŃie. Listele se evaluează în funcŃie de regulile date de primul element din listă. În general, paşii de evaluare sunt: • AutoLISP priveşte la primul element; el trebuie să fie o listă. Dacă primul element nu este o listă, atunci AutoLISP va genera un mesaj de eroare. Elementele care urmează funcŃiei într-o listă sunt argumentele funcŃiei – adică datele asupra cărora operează funcŃia. • AutoLISP evaluează funcŃia pentru a şti cum să proceseze argumentele care îi urmează. Pentru o anume funcŃie, numărul şi tipul argumentelor admise trebuie respectat – altfel,

M03-5

Modul 03 LecŃia nr. 1

Universitatea “Petru Maior” Tg.Mureş Centrul de Instruire CAD&CAM

AutoLISP returnează un mesaj de eroare. Pentru a le putea procesa, AutoLISP evaluează de la stânga la dreapta şi argumentele în sine - care pot fi de tip atom sau listă. AutoLISP returnează valoarea listei.



Exemple de evaluare a unor atomi sau liste: Atom / listă de evaluat

Valoare returnată

ObservaŃii

″text″

″text″

Atom de tip şir, evaluat la sine însăşi

(setq a 1)

1

Se returnează valoarea legată variabilei

A

1

Se returnează valoarea legată variabilei

(1 2 3)

Mesaj de eroare

Primul element nu este o funcŃie

(+ 1 2 3)

6

Se returnează întregul 6

(list 1 2 (+ 2.5 0.5))

(1 2 3.0)

Se returnează o listă cu doi întregi şi un real

Rezumat •

AutoLISP este un limbaj de programare asociat lucrului exclusiv în AutoCAD; acest limbaj este parte integrantă a programului AutoCAD.



Încercările AutoLISP pot fi efectuate la prompt-ul Command: al AutoCAD-ului. Pot fi astfel efectuate calcule aritmetice, utilizând expresii AutoLISP cu o sintaxă mai specială, dată de lucrul cu multe paranteze. FuncŃiile aritmetice uzuale folosite în AutoLISP sunt: +, −, /, *, sqrt, expt, sin, cos, atan.



În AutoLISP pot fi folosite variabile; funcŃia AutoLISP care permite atribuirea de valori unei variabile, este setq. Evaluarea unei variabile la prompt-ul Command al AutoCADului, este posibilă cu utilizarea semnului “!”. La începerea unei noi sesiuni AutoCAD, se pierd atribuirile făcute în sesiunea precedentă.



Cererile AutoCAD pot fi satisfăcute prin răspunsuri cu expresii AutoLISP. Fiecărui tip de cerere trebuie să i se răspundă cu un tip de dată corespunzător: unei cereri de rază i se poate răspunde cu un real sau un întreg, unei cereri de punct i se poate răspunde cu o listă, unei cereri de obiect i se răspunde cu un nume de obiect sau un set de selecŃie etc.



AutoLISP lucrează cu două tipuri majore de obiecte: atomi şi liste. . Un atom poate fi un întreg, un număr real, un şir, o funcŃie AutoLISP predefinită etc. Există o regulă simplă de a determina dacă un obiect este un atom sau o listă: dacă obiectul nu este închis între paranteze, atunci el este un atom; altfel este o listă.



Evaluarea este procesul prin care AutoLISP determină valoarea unui obiect. Sunt supuşi evaluării atât atomii cât şi listele. În urma evaluării, AutoLISP returnează valoarea determinată. Pentru orice listă care trebuie evaluată, primul element din listă trebuie să fie o funcŃie.

M03-6

More Documents from "Florin Manea"