Calculul si reprezentarea curbelor si suprafetelor_extras PFAC_11.10.2013.pdf

Embed Size (px)

Citation preview

  • Editura Universitii "Petru Maior" Trgu-Mure

    2010

    Calculul i reprezentarea CURBELOR I SUPRAFEELOR

    Aplicaii n ingineria mecanic Colecia CAD&CAM Modulul 05

    Alexandru POZDRC

  • Refereni tiinifici: Prof. Dezideriu MAROS Universitatea Tehnic din Cluj-Napoca Conf. Piroska HALLER Universitatea Petru Maior" din Trgu-Mure Conf. Sndor HORVTH Universitatea Petru Maior" din Trgu-Mure

    Descrierea CIP a Bibliotecii Naionale a Romniei POZDRC, ALEXANDRU Calculul i reprezentarea curbelor i suprafeelor / Alexandru Pozdrc - Trgu-Mure : Editura Universitii "Petru Maior", 2010 ISBN 978-973-7794-91-8 004.43 AUTOLISP 51

    Comenzile de carte pot fi adresate telefonic, prin fax sau prin e-mail, la adresa: Consilier editorial: Dumitru Mircea Buda Tehnoredactare: Autorul Design coperta: Rzvan Ceontea, ABSOLUT CONCEPT S.R.L. Trgu-Mure Multiplicare: ABSOLUT CONCEPT S.R.L. Trgu-Mure ISBN 978-973-7794-91-8 Copyright 2010 Autorul Editura Universitii Petru Maior Trgu-Mure (Editur acreditat CNCSIS) Str. Nicolae Iorga, nr. 1 540088 Trgu-Mure, ROMNIA

    Promax S.R.L. www.promax.ro 540091 Trgu-Mure Str. Avram Iancu, Nr. 45/2 E-mail: [email protected] Tel./Fax: 0265.210289, 0365.801840

  • Cuvnt nainte

    Scopul lucrrii l constituie prezentarea unor noiuni de matematic i programare asociate calculului i reprezentrii curbelor i suprafeelor cu aplicaii n ingineria mecanic. Lucrarea este organizat n acest sens pe trei pri, Partea 3 fiind dedicat Aplicaiilor o colecie de probleme practice rezolvate. Aplicaiile au fost astfel alese nct s evolueze de la simplu spre complex. Ele se bazeaz pe noiunile prezentate n forma unor complemente de matematic i programare, n cadrul primelor dou pri. Partea 1, Complemente de matematic, conine elemente de geometrie analitic i diferenial asociate exprimrii i calculului curbelor i suprafeelor. Este preferat forma parametric de exprimare a acestora. Se prezint modul n care se pot calcula curbe sau suprafee atunci cnd acestea sunt generate prin micarea unui punct, a unei curbe sau suprafee. Uneori curba sau suprafaa dorit nu se poate bucura de o exprimare analitic sau exprimarea analitic se dovedete a fi prea complicat, de aceea se prezint n final calculul de aproximare a curbelor i suprafeelor definite prin puncte discrete.

    AutoCAD este probabil cel mai popular program de proiectare asistat de calculator. n reprezentrile grafice, prin puterea reprezentrilor plane, PC-ul i AutoCAD au nlocuit planeta. Partea 2, Complemente de programare n AutoLISP, prezint limbajul de programare AutoLISP, integrat mediului AutoCAD, care fr a solicita abiliti speciale de programare, poate servi reprezentrii curbelor i suprafeelor rezultate dintr-un calcul matematic/ingineresc.

    Lucrarea se adreseaz studenilor din nvmntul superior tehnic, cu predilecie mecanic, la nivelul studiilor de licen i masterat. Exemplele mai complexe probabil pot constitui un bun suport i doctoranzilor sau specialitilor ingineri, n vederea rezolvrii unor probleme practice. Lucrarea face trimiteri bibliografice spre Matematic, Mecanic i Mecanisme. De asemenea, se presupune cunoscut operarea cu programul AutoCAD.

    Mulumesc designer-ului Rzvan Ceontea pentru aportul estetic asupra crii; acest efort sperm c va avea ca rezultat o mai plcut parcurgere a lucrrii. Mulumirile de coninut se adreseaz colegilor refereni Piroska Haller i Sndor Horvth, n a cror opinie competent m-am ncredinat cu deplin ncredere. Mulumirile mele speciale se adreseaz profesorului Dezideriu Maros, n preajma cruia am simit cu adevrat aura matematicii aplicate n inginerie; aceast lucrare i este dedicat cu profund recunotin.

    Trgu Mure, iunie 2010 Alexandru Pozdrc

  • Cuprins

    PARTEA 1. Complemente de matematic 1

    1.1. Curbe i suprafee exprimate analitic 2 - Ecuaiile parametrice ale unei curbe 2 - Tangenta la o curb 3 - Normala unei curbe plane 3 - Curbura unei curbe plane 4 - Planuri osculatoare la curb 5 - Lungimea arcului de curb 5 - Curbura i torsiunea unei curbe 6 - Elemente de calcul vectorial 6 - Ecuaiile parametrice ale unei suprafee 7 - Tangenta la o curb coordonat 7 - Normala la o suprafa 8 - Curburile principale 8 - Curbe i suprafee echidistante 10

    1.2. Generarea curbelor i suprafeelor 11 - Transformri de coordonate 11 - Transformri de vectori 13 - Transformri multiple 13 - Curbe de nfurare reciproc 13 - Suprafee de nfurare reciproc 16 - nfurtoare, evolute, centroide 17 - Scheme de generare 19

    1.3. Aproximarea curbelor i suprafeelor 21 - Arc spline cubic 21 - Curb spline cubic 23 - Element de suprafa spline 26 - Suprafa spline bicubic 30 - Suprafa spline biliniar 32 - Calculul local al suprafeelor spline 33 - Polinomul de interpolare a lui Newton 36 - Polinomul de interpolare a lui Newton aplicat curbelor 37 - Polinomul de interpolare a lui Newton aplicat suprafeelor 39 - Derivarea aproximativ 41

  • PARTEA 2. Complemente de programare n AutoLISP 45

    2.1. Fundamentele AutoLISP 46 - Introducere 46 - Expresii simbolice 46 - Atomii, listele i cazul special a lui NIL 48 - Evaluarea atomilor i listelor 49 - Funcii aritmetice 51 - Atribuirea 52 - Tipuri de date numerice 53 - Puncte AutoCAD i liste AutoLISP 54 - Extragerea elementelor dintr-o list 55 - AutoLISP i comenzi AutoCAD 56

    2.2. Definirea funciilor externe AutoLISP 59 - Definirea unei noi funcii AutoLISP 59 - Utilizarea unui editor de texte la scrierea programelor 60 - ncrcarea n AutoCAD a unui program AutoLISP 62 - Reguli de editare a unui program AutoLISP 63 - Sintaxa funciei defun 64 - Expresiile test i cele condiionale 65

    2.3. Definirea de noi comenzi AutoCAD 68 - Comanda de desenare a unui dreptunghi 68 - Cereri de date din AutoLISP 69 - Perfecionarea programului AutoLISP 71 - Comanda de desenare a unui semicerc 72 - Tabloul funciilor GET mai importante 73

    2.4. Reprezentarea unor curbe rezultate din calcul 75 - Reprezentarea evolventei 75 - Mrirea vitezei de reprezentare a curbei 77 - Reprezentarea unei elice cilindrice 79 - Funcia cond i despre cicluri 81

    2.5. Accesul la baza de date AutoCAD 84 - Nume de entitate 84 - Caracteristicile unei entiti 85 - Liste asociate i liste cu punct 86 - Contur orientat unei entiti 87 - Funcia de verificare a tipului entitii selectate 89 - O funcie util de transformare de coordonate 90

  • 2.6. irurile, citirea i tiprirea datelor 93 - Funcii de lucru cu iruri 93 - Caractere de control 94 - Funcii de tiprire 94 - Deschiderea unui fiier pentru citire/scriere 96 - Exemplu de scriere i citire 98 - Tratarea erorilor 100

    2.7. Accesul la polilinii 102 - Structura unei polilinii 102 - Procesarea elementelor unei polilinii 103 - Analiza informaiei de la codul 42 (bulge) 106 - Scrierea punctelor ntr-un fiier 107

    2.8. Curbe i suprafee n AutoCAD 109 - Tipuri de suprafee AutoCAD 109 - Reprezentarea unei suprafee elicoidale 110 - Reprezentarea unei curbe spline 113

    PARTEA 3. Aplicaii 115

    3.1. Cercul 116 3.2. Elipsa 117 3.3. Elicea cilindric 119 3.4. Proiectarea unui ablon neted 122 3.5. Suprafaa elicoidal cilindric 127 3.6. Transportorul melcat 129 3.7. Calculul de intersecie a dou conducte 132 3.8. Generarea cicloidei i evolventei 136 3.9. Calculul unui dispozitiv de centrare pe strung, tip Forkardt 139 3.10. Calculul unui dispozitiv de fixare cu cam, tip Carrlane 142 3.11. Limitele nfurrii practice 146 3.12. Un calcul de nfurare de suprafee 149 3.13. Determinarea profilului dintelui unei roi dinate 152 3.14. Calculul unei foarfeci cu roi dinate necirculare, tip Fiskars 156 3.15. Profilarea uruburilor de la o pomp 162 3.16. O proprietate a suprafeelor elicoidale cilindrice 166 3.17. Calculul de prelucrare a unui melc ZK1 generalizat 168

    Bibliografie 176

    Breviar de funcii AutoLISP 177

  • 1. Complemente de matematic

    1

    PARTEA 1. Complemente de matematic

    Aceast parte instrumenteaz matematic reprezentarea i calculul curbelor i suprafeelor. Sunt indicate ecuaiile parametrice ale curbelor i suprafeelor precum i relaiile de calcul ale unor caracteristici de baz precum: tangenta, normala, curbura, torsiunea, etc. Noiunile prezentate vor fi reluate i fundamentate prin exemple n partea a treia a manualului. Noiunile matematice introduse funcioneaz n punctele regulate ale unei curbe respectiv suprafee generale i sunt valabile atunci cnd formulele au sens. Curbe i suprafee tehnice pot fi obinute pe baza unor scheme de generare bazate pe micri relative simple, care au coresponden n practica prelucrrilor. Corpurilor n micare relativ li se asociaz sisteme de coordonate. n general se pleac de la cunoaterea ntr-un prim sistem a poziiei unui punct sau ecuaiile parametrice ale unor curbe/suprafee, numite generatoare. Prin micarea relativ cunoscut a celor dou sisteme, punctul, curba sau suprafaa dat, genereaz o curb sau o suprafa, numit nfurtoare, ale crei ecuaii se caut. Se prezint n cele din urm aproximarea curbelor i suprafeelor printr-un calcul care permite nlocuirea unei curbe/suprafee reale, cunoscut discret prin puncte, cu o curb/suprafa de interpolare. Interpolarea permite calculul aproximativ al unor mrimi utile n procesul de proiectare-fabricare al curbei/suprafeei reale: tangente, normale, curburi etc. Omagiind nume importante ale domeniului sau sugernd aparatul matematic ce le descrie, se cunosc o serie de metode de interpolare: Coons, Bezier, B-splines, NURB, Newton etc.

    Cuprins: Pag.

    1.1. Curbe i suprafee exprimate analitic 21.2. Generarea curbelor i suprafeelor 111.3. Aproximarea curbelor i suprafeelor 21

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    2

    1.1. Curbe i suprafee exprimate analitic

    Acest capitol instrumenteaz matematic reprezentarea i calculul n form parametric a curbelor i suprafeelor. Sunt indicate ecuaiile parametrice ale curbelor i suprafeelor precum i relaiile de calcul ale unor caracteristici de baz precum: tangenta, normala, curbura, torsiunea, etc. Noiunile prezentate vor fi reluate i fundamentate prin exemple n cadrul aplicaiilor. Noiunile matematice introduse funcioneaz n punctele regulate ale unei curbe respectiv suprafee generale i sunt valabile atunci cnd formulele au sens.

    Ecuaiile parametrice ale unei curbe Tehnica apeleaz frecvent la reprezentarea vectorial sau parametric a curbelor. Fie astfel o curb n spaiu (C) i un sistem de referin ortogonal drept OXYZ, avnd versorii axelor notai i, j, k. Acestui sistem i se spune ortogonal pentru c axele sale sunt perpendiculare ntre ele, i drept pentru c respect regula minii drepte - n sensul c pe versorii i, j i k se pot aranja degetul mare, respectiv arttor i mijlociu al minii drepte (figura 1.1).

    Ecuaia vectorial a curbei se scrie n forma [Enciclopedie_1980, pag. 704]: kjirr )()()()( tztytxt (1.1)

    n care t se numete parametrul curbei. Aceast ecuaie apare n forma unui vector de poziie cu punctul de aplicaie n originea sistemului de coordonate, iar vrful ntr-un punct curent pe curb. Curba astfel reprezentat are un sens: sensul de deplasare pe curb a punctului M, atunci cnd parametrul t crete (figura 1.2). O exprimare echivalent relaiei (1.1), este cea numit parametric, sub forma unui sistem de trei ecuaii scalare:

    )()()(

    tzztyytxx

    (1.2)

    Figura 1.2. Definirea noiunii de SENS pe o curb n spaiu.

    Figura 1.1. O curb raportat la un sistem ortogonal drept; regula minii drepte.

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    3

    Pentru curbele plane sistemul se reduce la dou ecuaii scalare:

    )()(

    tyytxx

    (1.3)

    Tangenta la o curb Prin derivarea relaiei vectoriale (1.1) se obine un nou vector, care are calitatea de a fi tangent la curb n punctul curent M (figura 1.3):

    kjirr )()()()( tztytxt (1.4) n care s-au folosit notaiile:

    dttdztz

    dttdyty

    dttdxtx

    )()(

    )()(

    )()(

    (1.5)

    ntr-un punct al unei curbe cu derivata continu poate fi dus un singur vector tangent, iar sensul acestui vector este identic cu sensul curbei. Notnd cu versorul vectorului tangent, proieciile sale vor fi date de relaiile cunoscute:

    222222222;;

    zyx

    z zyx

    y zyx

    xzyx

    (1.6)

    Normala unei curbe plane

    Pentru o curb n spaiu se poate vorbi despre un singur plan normal la curb ntr-un punct i de o infinitate de normale. Pentru o curb plan exist ntr-un punct o singur direcie normal (N). Pe aceast direcie ne vom referi la versorul normal , obinut prin rotirea cu 90 n sens trigonometric a versorului tangent . Se va imagina n acest sens rsturnarea unui dreptunghi n jurul colului M, relaiile de calcul ale proieciilor versorului normalei pe baza versorului tangentei devenind evidente (figura 1.4):

    xy

    yx (1.7)

    Figura 1.3. Vector tangent ntr-un punct la o curb.

    Figura 1.4. Determinarea normalei la o curb plan, pe baza proieciilor tangentei.

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    4

    Curbura unei curbe plane

    Msura n care se curbeaz o curb plan este dat de noiunile de curbur , sau raz de curbur , legate prin relaia:

    1 (1.8)

    Relaia (1.8) sugereaz curbura drept o mrime susceptibil de a fi pozitiv sau negativ, iar raza de curbur drept o mrime ntotdeauna pozitiv. Pentru o curb plan definit parametric, relaia analitic de calcul a curburii este [Enciclopedie_1980, pag. 534]:

    2/322 )( yxyxyx

    (1.9)

    n care yxyx ,,, sunt derivatele de ordinul unu i doi n raport cu t a funciilor (1.3). Semnul curburii este strns legat de sensul de parcurs al unei curbe; astfel, asociind o curb plan cu o osea, iar punctul curent M cu un automobil ce se deplaseaz pe osea n sensul asociat curbei, semnul curburii indic un viraj spre stnga (+) sau dreapta (), iar modulul su indic ct de strns este virajul care urmeaz (figura 1.5). Viraje strnse nseamn trecerea prin puncte cu curbur mare i raz de curbur mic.

    n particular, n toate punctele sale o dreapt are raza de curbur infinit i curbura egal cu zero, iar raza de curbur a unui cerc este o constant egal cu raza cercului. n general, n diferite puncte ale unei curbe, curburile/razele de curbur sunt diferite. n jurul unui punct alura curbei poate fi aproximat cu un arc de cerc care aparine unui cerc de centru A (figura 1.6), definit prin punctul dat i dou puncte nvecinate, apropiate. Alegnd puncte infinit apropiate, raza cercului de aproximare devine egal cu raza de curbur , iar centrul cercului se numete centru de curbur, ale crui coordonate se calculeaz cu ajutorul curburii i proieciilor versorului normalei , pe baza relaiei:

    yA

    xA

    yy

    xx

    1

    1

    (1.10)

    Figura 1.5. Semnul curburii interpretat ca sens al unui viraj pentru un mobil n micare.

    Figura 1.6. Centrul de curbur al unei curbe plane, ntr-un punct curent M.

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    5

    Planuri osculatoare la curb Fie un punct P0 al unei curbe n spaiu (C) i dou puncte P1 i P2 alese pe curb de o parte i alta a punctului P0. Prin cele dou puncte P1 i P2 ducem o secant i facem ca aceste puncte s tind spre P0 atunci limita ctre care tinde secanta va fi tangenta n P0 la (C). Pe direcia acestei tangente se afl vectorul r ale crui proiecii sunt date de relaia (1.5). Existena tangentei este asigurat n punctele zise regulate ale unei curbe; punctele care nu sunt regulate se numesc singulare, iar proprietile lor trebuie discutate separat [Enciclopedie_1980, pag. 705]. Planul perpendicular n P0 pe tangent se numete plan normal al lui (C) n P0 (plan notat cu [N] n figura 1.7a). Presupunem c curba (C) nu este o dreapt, prin urmare punctele P0, P1 i P2 alese mai sus nu sunt coliniare. Trei puncte necoliniare determin un plan. Cnd punctele P1 i P2 tind spre P0, planul celor trei puncte va tinde spre o poziie limit numit plan osculator [T] la curba (C) n punctul P0. Planul perpendicular pe planul normal i pe planul osculator se numete plan rectificant n P0 (notat cu [R] n figura 1.7b).

    Fiecare dreapt care se afl n planul normal i trece prin P0 este normal lui (C) n P0. Normala care se afl n planul osculator [T] se numete normala principal a lui (C) n punctul P0 iar cea care se afl n planul rectificant se numete binormal. Vectorii directori ai celor dou normale astfel definite sunt:

    rrr )( , pentru normala principal rr , pentru binormal

    Dac pentru fiecare punct al curbei (C) ducem trei vectori , i de lungime unitar n direcia tangentei, normalei principale i binormalei, acetia vor forma un triedru ortonormat care se numete triedrul mobil osculator al curbei, sau triedrul lui Frenet (figura 1.7b).

    Lungimea arcului de curb O curb poate fi trasat aproximativ printr-o linie poligonal compus din segmente de dreapt adiacente. Lungimea unei astfel de linii poligonale este egal cu suma segmentelor r. Suma acestor segmente aproximeaz lungimea real a curbei. Pentru un segment de curb care are reprezentarea parametric (1.2), cu parametrul t din intervalul 10 ttt , lungimea arcului de curb corespunztor va fi dat de integrala [Enciclopedie_1980, pag. 706]:

    Figura 1.7b. Triedrul osculator al curbei. Figura 1.7a. Planul normal la o curb

    n spaiu.

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    6

    dtlt

    t 21

    r (1.11a)

    unde r este lungimea vectorului r ale crui proiecii sunt date de relaia (1.5). Dac dorim exprimarea lungimii arcului ca funcie de parametrul t i ca msur a lungimii curbei ntre punctul care are parametrul 0 i punctul corespunztor unui t oarecare, atunci integrala se va scrie de forma:

    dtlt

    0

    r (1.11b)

    Curbura i torsiunea unei curbe n evoluia lor general, curbele n spaiu se curbeaz i se torsioneaz (rsucesc). Arcul de cerc este evident o curb plan, de curbur constant. Prin rsucirea arcului de cerc cu o torsiune constant, acesta devine curb n spaiu, de forma unei elice. n cazul general, o curb n spaiu prezint curbur i torsiune variabil n diferite puncte ale sale. Fie ecuaia vectorial a curbei i derivatele sale de ordinul 1, 2 i 3 n raport cu parametrul t, notate astfel:

    kjirr )()()()( tztytxt kjirr )()()()( tztytxt

    kjirr )()()()( tztytxt kjirr )()()()( tztytxt

    Cu aceste notaii, curbura i torsiunea sunt date de relaiile generale [Ionescu_1984, pag. 142-143]:

    31

    r

    rr

    (1.12)

    2

    1rr

    rrr

    T

    (1.13)

    n relaia curburii, numrtorul este dat de modulul unui produs vectorial, iar numitorul de puterea a treia a modulului vectorului r . n relaia torsiunii, numrtorul este dat de produsul mixt a trei vectori, iar numitorul de ptratul modulului unui produs vectorial.

    Elemente de calcul vectorial

    Reamintim cteva relaii utile aparinnd calculului vectorial. Pentru doi vectori a i b dai prin proiecii, produsul vectorial este un vector c ale crui proiecii sunt:

    xyyxz

    zxxzy

    yzzyx

    babacbabacbabac

    bac

    (1.14)

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    7

    Produsul scalar a doi vectori a i b este un scalar dat de relaia: zzyyxx bababa ba (1.15)

    Versorul e al unui vector a este un vector care pstreaz direcia i sensul lui a, iar modulul este egal cu unitatea; proieciile versorului e pot fi calculate n funcie de cele ale vectorului a asociat:

    ax

    xae ;

    ay

    ya

    e ; a

    zz

    ae (1.16)

    n care 222 zyx aaa a este modulul vectorului a.

    Ecuaiile parametrice ale unei suprafee Fie o suprafa (S) i un sistem de referin ortogonal drept OXYZ, avnd versorii axelor notai i, j, k. Ecuaia vectorial a suprafeei se scrie n forma:

    kjirr ),(),(),(),( vuzvuyvuxvu (1.17) n care parametrii u i v se mai numesc i coordonatele curbilinii ale suprafeei. Aceast ecuaie apare n forma unui vector de poziie, al crui punct de aplicaie se afl n originea sistemului de coordonate, iar vrful n punctul curent P pe suprafa (figura 1.8). O exprimare echivalent relaiei (1.17) este cea parametric, sub forma unui sistem de trei ecuaii scalare:

    ),(),(),(

    vuzzvuyyvuxx

    (1.18)

    Pentru u=u0=ct. punctul P se mic pe suprafa de-a lungul unei curbe numit curb coordonat v, notat (Cv), de ecuaie:

    kjirr ),(),(),(),( 0000 vuzvuyvuxvu (1.19) Un punct P fixat pe suprafa corespunde unei perechi de coordonate curbilinii u=u0, v=v0; acest punct se va afla la intersecia a dou curbe coordonate, ale cror ecuaii vectoriale sunt:

    kjirr ),(),(),(),( 0000 vuzvuyvuxvu kjirr ),(),(),(),( 0000 vuzvuyvuxvu (1.20)

    Tangenta la o curb coordonat Prin derivarea parial n raport cu u a relaiei vectoriale (1.17) se obine un nou vector, care are calitatea de a fi tangent la curba coordonat u n punctul curent P (figura 1.8):

    Figura 1.8. O suprafa, curbele sale coordonate, normala i cei doi vectori tangeni la curbele coordonate

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    8

    kjirr uuuu zyx

    uvu ),( (1.21)

    Similar, vectorul tangent la o curb coordonat v este dat de derivata parial: kjirr

    vvvv zyxv

    vu ),( (1.22)

    n relaiile de mai sus s-au folosit notaiile:

    duvuzz

    uvuyy

    uvuxx

    u

    u

    u

    ),(

    ),(

    ),(

    i respectiv

    dvvuzz

    vvuyy

    vvuxx

    v

    v

    v

    ),(

    ),(

    ),(

    (1.23)

    Doi vectori tangeni ntr-un punct la curbele coordonate, vor determina un plan tangent la suprafa n punctul considerat.

    Normala la o suprafa Normala la suprafa ntr-un punct arbitrar P este un vector perpendicular pe planul determinat de vectorii tangeni la curbele coordonate i este definit de produsul vectorial (figura 1.9):

    vu rrn (1.24) Utiliznd matricea antisimetric a derivatei pariale ru, proieciile normalei la suprafa pot fi determinate i cu relaia matricial:

    v

    v

    v

    uu

    uu

    uu

    z

    y

    x

    zyx

    xyxz

    yz

    nnn

    00

    0 (1.25)

    Calculul normalei la o suprafa este util n tehnic pentru determinarea suprafeelor echidistante sau suprafeelor generate prin nfurare n procese practice de prelucrare; pe suprafeele echidistante se nscrie traiectoria sculei de prelucrare.

    Curburile principale

    Fie un punct P de pe o suprafa, normala i planul tangent n punct la suprafaa dat. Fie de asemenea un vector care aparine planului tangent, cu originea n P; acest vector l vom numi de orientare i va determina mpreun cu normala un plan de seciune prin suprafa. Planul de seciune intersecteaz suprafaa dup o curb plan, a crei curbur n punctul P se numete curbur normal (figura 1.9). Curbura normal se determin pentru un punct de pe suprafa i pentru un vector de orientare ales n planul tangent determinat de cei doi vectori tangeni la curbele coordonate, cu ajutorul relaiei cunoscute [Ionescu_1984, pag. 199]:

    GmFmENmMmL

    n

    22

    2

    2 (1.26)

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    9

    n care mrimile E, F, G, L, M i N depind de poziia punctului pe suprafa, i se calculeaz cu ajutorul derivatelor pariale simple, duble i mixte ale ecuaiilor parametrice (1.18) ale suprafeei, n raport cu parametrii u i v:

    222 )()()( uuu zyxE (1.27) vuvuvu zzyyxxF

    222 )()()( vvv zyxG

    uuuuuu

    vvv

    uuu

    zyxzyxzyx

    FGEL

    2

    1

    uvuvuv

    vvv

    uuu

    zyxzyxzyx

    FGEM

    2

    1

    vvvvvv

    vvv

    uuu

    zyxzyxzyx

    FGEN

    2

    1

    Variabila m depinde de orientarea seciunii normale, definit de raportul: tan

    dvdum (1.28)

    Pentru un punct dat al unei suprafee, curbura normal se modific odat cu schimbarea orientrii seciunii normale, deci odat cu modificarea variabilei m. Curburile principale ale unei suprafee ntr-un punct dat sunt valori extreme ale curburii normale, determinate ca soluii ale ecuaiei de gradul doi n n [Ioenscu_1984, pag. 215]:

    02 222 MNLLGMFNEFGE nn (1.29) Se noteaz cu 1 i 2 cele dou soluii ale ecuaiei (1.29). Produsul curburilor principale se numete curbur total i caracterizeaz prin semnul su forma suprafeei (figura 1.10) [Enciclopedie_1980, pag. 712]:

    pentru 120, punctul de pe suprafa se numete de tip eliptic, iar o suprafa avnd toate punctele eliptice se numete suprafa eliptic;

    pentru 12=0, punctul de pe suprafa se numete parabolic, iar o suprafa avnd toate punctele parabolice se numete suprafa parabolic.

    Direciile principale ntr-un punct P al unei suprafee sunt acele direcii din planul tangent n P la suprafa, pentru care curburile normale au valori extreme - deci sunt curburi principale. Direciile principale sunt date de soluiile ecuaiei de gradul doi n m [Ionescu_1984, pag. 217]:

    Figura 1.9. Orientarea planului de seciune n studiul curburii normale.

  • 1. Complemente de matematic Curbe i suprafee exprimate analitic

    10

    02 MGNFmLGNEmLFME (1.30)

    Curbe i suprafee echidistante Fie o curb plan definit parametric prin ecuaii de tipul (1.3). Alegem pe curba plan un punct arbitrar P al crui vector de poziie este r. n fiecare punct P de pe curba plan poate fi determinat versorul tangent, iar prin rotirea cu 90 a acestuia se poate determina versorul normalei. Vrful versorului tangent este ndreptat n sensul de parcurs al curbei. Fa de sensul de naintare, curba plan admite dou curbe echidistante: stng i dreapt.

    Pentru fiecare punct P de pe curb exist un punct echivalent pe echidistant aflat pe normala n punct, la o distan egal cu distana dintre curba dat i echidistanta sa. Vom nota cu a distana i A punctele echidistantei-stnga (figura 1.11). Pornind de la ecuaia vectorial a curbei plane, vectorul de poziie al punctului A de pe echidistanta stng i n acelai timp ecuaie vectorial a curbei echidistante este dat de relaia:

    AA a rr (1.31) Similar, pentru o suprafa, fiecrui punct P de pe suprafa i va corespunde un punct pe suprafaa echidistant, aflat pe direcia normalei la suprafa. n punctul considerat poate fi trasat un vector normal spre interior i unul spre exteriorul suprafeei. Noiunile de interior i exterior pentru o suprafa sunt convenionale. Atunci cnd suprafaa delimiteaz un corp, normala interioar are un sens clar: spre partea material a corpului. Relaia (1.31) este valabil i pentru ecuaia vectorial a suprafeei echidistante.

    Figura 1.10. Clasificarea punctelor unei suprafee n funcie de semnul curburii totale n punctul considerat.

    Figura 1.11. Curbe i suprafee echidistante.

  • 1. Complemente de matematic Generarea curbelor i suprafeelor

    11

    1.2. Generarea curbelor i suprafeelor

    Curbe i suprafee tehnice pot fi obinute pe baza unor scheme de generare bazate pe micri relative simple, care au coresponden n practica prelucrrilor. O astfel de micare relativ ar putea fi rostogolirea unui cerc peste o dreapt, sau a unui con peste un plan. Corpurilor n micare relativ li se asociaz sisteme de coordonate. n general se pleac de la cunoaterea ntr-un prim sistem a poziiei unui punct sau ecuaiile parametrice ale unor curbe/suprafee, numite generatoare. Prin micarea relativ cunoscut a celor dou sisteme, punctul, curba sau suprafaa dat, genereaz o curb sau o suprafa, numit nfurtoare, ale crei ecuaii parametrice se caut (dac exist).

    Transformri de coordonate Ecuaiile parametrice ale curbelor tehnice pot fi uor determinate folosind transformrile de coordonate. Fie dou sisteme de referin ortogonale drepte, notate S1 i S2. Problema este de a gsi o relaie ntre coordonatele x1, y1, z1 ale punctului P n primul sistem i coordonatele x2, y2, z2 date n cellalt sistem, atunci cnd se cunoate poziia relativ a celor dou sisteme. O astfel de relaie se numete transformare de coordonate.

    Poziia punctului P n sistemul S2 este definit printr-un vector de poziie r2, ale crui proiecii pe axele sistemului sunt coordonatele x2, y2, z2. Un astfel de vector admite i o reprezentare matricial, folosind matricea unicoloan a coordonatelor, de forma:

    Figura 1.12. Transformri de coordonate: fiind dat un punct n sistemul 2, se cer coordonatele sale n sistemul 1.

    Figura 1.13. Transformri de vectori: fiind date proieciile unui vector n sistemul 2, se cer proieciile sale n sistemul 1.

  • 1. Complemente de matematic Generarea curbelor i suprafeelor

    12

    2

    2

    2

    2

    zyx

    r (1.32)

    Vectorul r2 este legat, n sensul c originea sa este obligatoriu n originea sistemului de coordonate. n transformrile de coordonate este util reprezentarea sa cu ajutorul matricei unicoloan a coordonatelor omogene, prin care se adaug coordonatelor nc o valoare: 1 n cazul de mai jos:

    12

    2

    2

    2 zyx

    r (1.33)

    Poziia relativ n spaiu a sistemului S2 fa de sistemul S1, este definit prin urmtorul set de parametri, nu toi independeni (figura 1.12):

    coordonatele originii O2 n sistemul S1, notate cu x12, y12, z12; unghiurile pe care le fac axele sistemului S2 cu axele sistemului S1, notate de exemplu

    pentru axele Y, cu

  • 1. Complemente de matematic Generarea curbelor i suprafeelor

    13

    Transformri de vectori Transformrile de vectori sunt independente de punctul de aplicaie al vectorilor. Problema care se pune este de a determina proieciile unui vector v n sistemul S1, atunci cnd sunt date proieciile vectorului n sistemul S2 i rotaia axelor sistemului S2 fa de cele ale sistemului S1 (figura 1.13). Relaia de transformare este n form matricial simbolic:

    22,11 vRv (1.37) sau n forma extins:

    2

    2

    2

    212121

    212121

    212121

    1

    1

    1

    coscoscoscoscoscoscoscoscos

    z

    y

    x

    z

    y

    x

    vvv

    ZZYZXZZYYYXYZXYXXX

    vvv

    (1.38)

    n care: v1 - matricea unicoloan a proieciilor vectorului v n sistemul S1, considerate

    necunoscute; v2 - matricea unicoloan a proieciilor vectorului v n sistemul S2, considerate

    cunoscute; R1,2 - matricea de rotaie de la sistemul 2 la sistemul 1, coninnd parametri cunoscui

    de rotaie relativ a axelor sistemului S2 fa de cele ale sistemului S1. Transformri multiple

    Fie un punct P, ale crui coordonate fa de sistemul cu indice n sunt cunoscute. Se cere determinarea coordonatelor punctului P n sistemul cu indice 1, atunci cnd se cunoate poziia sistemului n fa de sistemul n-1, a sistemului n-1 fa de sistemul n-2, ..., a sistemului 2 fa de 1. Transformarea n/1 se va numi transformare multipl, iar relaia de transformare are exprimarea matricial:

    nnn rMMMr ,13,22,11 ... (1.39) Similar, pentru transformri de vectori se poate scrie relaia:

    nnn vRRRv ,13,22,11 ... (1.40)

    Curbe de nfurare reciproc Fie o curb (C2), solidar unui sistem S2. Poziia unui punct curent de pe curb este definit printr-un vector de poziie r2; notm parametrul curbei cu t (figura 1.14). Ecuaia vectorial a acestei curbe este:

    )(22 trr (1.41) Sistemul S2 i curba (C2) solidar lui, le presupunem mobile fa de un sistem de referin S1. Presupunem de asemenea c poziia sistemului S1 fa de sistemul S2 este definit printr-un singur parametru, notat . Surprindem sistemul S2 i curba (C2) solidar lui, ntr-o succesiune de poziii definite prin valorile 1, 2... Curbele (C2) astfel surprinse vor forma o familie de curbe, a crei nfurtoare (C1) se caut (figura 1.14).

  • 2. Complemente de programare n AutoLISP

    45

    PARTEA 2. Complemente de programare n AutoLISP

    n reprezentrile grafice, prin puterea reprezentrilor plane, PC-ul i AutoCAD au nlocuit planeta. AutoCAD este probabil cel mai popular program de proiectare asistat de calculator [Pozdirca_2008]. AutoCAD ofer comenzi de desenare a curbelor i suprafeelor primitive, de genul: dreapt, cerc, elips, cilindru, con, etc. Nu are ns incluse n setul standard, comenzi pentru desenarea evolventei, epicicloidei sau ale altor curbe i suprafee tehnice interesante. n acest scop se scriu programe AutoLISP, iar rezultatele grafice sunt reprezentate direct n AutoCAD. Cunoaterea acestui limbaj este important prin prisma popularitii de care se bucur AutoCAD. AutoLISP este disponibil doar din editorul de desenare AutoCAD. Pentru a utiliza AutoLISP sunt necesare noiuni de programare i o bun cunoatere a AutoCAD-ului. n scopul parcurgerii acestei pri este necesar un editor de text ASCII pentru a crea fiiere program AutoLISP. Un astfel de editor este Notepad sau versiunea mbuntit a acestuia Notepad++. Aceast parte este structurat pe o serie de 8 lecii care s permit nsuirea rapid a limbajului AutoLISP. Toate leciile vor presupune c v aflai AutoCAD. Exemplele tratate pot fi descrcate liber de pe site-ul www.promax.ro. Folosind AutoLISP, AutoCAD-ul poate fi adaptat cerinelor unui domeniu tehnic. Multe din aplicaiile puternice proiectate pentru a lucra cu AutoCAD-ul folosesc limbajul de programare AutoLISP. AutoLISP poate fi folosit pentru a crea puternice rutine sau macrouri. Rutinele AutoLISP pot fi compuse din comenzi AutoCAD i funcii AutoLISP, i pot automatiza operaii complexe din AutoCAD. Rutinele AutoLISP pot crea noi funcii AutoLISP i noi comenzi AutoCAD care pot fi utilizate din linia de comand, sau meniuri AutoCAD.

    Cuprins: Pag.

    2.1. Fundamentele AutoLISP 46

    2.2. Definirea funciilor externe AutoLISP 592.3 Definirea de noi comenzi AutoCAD 68

    2.4. Reprezentarea unor curbe rezultate din calcul 75

    2.5. Accesul la baza de date AutoCAD 84

    2.6. irurile, citirea i tiprirea datelor 932.7. Accesul la polilinii 102

    2.8. Curbe i suprafee AutoCAD 109

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    46

    2.1. Fundamentele AutoLISP

    AutoLISP este o facilitate standard a AutoCAD-ului, suportat de toate versiunile acestui popular program. Interpretorul AutoLISP este ncrcat automat cu fiecare sesiune AutoCAD. AutoLISP opereaz din editorul de desenare AutoCAD. Interpretorul AutoLISP este atent la prompt-ul AutoCAD, n ateptarea unei expresii simbolice valide pe care s o evalueze. Lecia prezint elementele fundamentale ale limbajului AutoLISP. Ea presupune c v aflai n AutoCAD pentru a putea proba paii exemplificai.

    Introducere

    AutoLISP este un limbaj de programare de nivel nalt pentru AutoCAD. Parcurgerea acestei pri permite dobndirea unor cunotine practice despre AutoLISP prin explicarea structurii i sintaxei limbajului precum i a relaiei sale cu AutoCAD. De asemenea, prin exerciiile propuse, ofer exemple cu privire la aplicarea teoriei de programare n rezolvarea unor probleme reale legate de reprezentarea grafic a curbelor i suprafeelor. 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 aplicaiile din domeniile sistemelor expert i inteligenei artificiale. Prima implementare a LISP-ului dateaz din jurul anului 1960.

    Expresii simbolice

    Expresiile simbolice, sau pe scurt s-expresiile, sunt instruciunile de baz n programele AutoLISP. LISP provine de la procesare de liste, n sensul c el proceseaz sau evalueaz listele obiectelor. AutoLISP proceseaz listele din cadrul editorului de desenare AutoCAD. Listele sunt instrumentul principal de formare a s-expresiilor n AutoLISP.

    O s-expresie are ntotdeauna o valoare. Sarcina major a AutoLISP-ului este de a determina valoarea unei s-expresii. De fiecare dat cnd interpretorului AutoLISP i se d o s-expresie el evalueaz s-expresia i returneaz rezultatul evalurii sale. Acest rezultat l numim valoarea s-expresiei.

    O s-expresie este o simpl instruciune n AutoLISP. S-expresiile sunt constituite dintr-o succesiune valid de caractere nchise ntre paranteze rotunde. Paranteza stng, sau (, este numit parantez deschis iar paranteza dreapt, sau ), este numit parantez nchis. Parantezele dintr-o s-expresie trebuie s fie balansate fiecare parantez deschis trebuie i nchis. Cea mai ntlnit greeal la programarea n AutoLISP este nebalansarea parantezelor. Editorul Notepad++ are faciliti prin care sunt detectate perechi de paranteze, deosebit de utile n lucrul cu AutoLISP. De notat c AutoCAD conine un instrument complex de editare i depanare a programelor AutoLISP, accesibil cu opiunea de meniu Tools>AutoLISP>Visual LISP Editor.

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    47

    AutoCAD recunoate o s-expresie AutoLISP urmrind datele introduse de utilizator, pentru a determina apariia unei paranteze deschise. Dac gsete o parantez deschis, AutoCAD pred interpretorului AutoLISP s-expresia introdus pentru a fi evaluat, ateptnd rezultatul. AutoCAD afieaz rezultatul s-expresiei introduse (figura 2.1). Pentru a putea face primele ncercri AutoLISP, lansai AutoCAD-ul. La prompt-ul Command tastai o prim s-expresie AutoLISP, prin care s adunai dou numere ntregi, dup care apsai tasta Enter:

    Command: (+ 2 3) 5

    Aa cum se vede n exemplul de mai sus, pe rndul urmtor s-expresiei AutoLISP, este afiat rezultatul adunrii: 5. Cnd AutoCAD vede n loc de o comand o s-expresie AutoLISP, el cedeaz execuia interpretorului AutoLISP, care este dator s evalueze s-expresia. Expresia AutoLISP are reguli simple de formare:

    ncepe cu o parantez rotund; dup parantez urmeaz un nume de funcie AutoLISP; funcia AutoLISP este urmat de argumentele sale, desprite cel puin de un spaiu; argumentele pot fi la rndul lor expresii AutoLISP; n ansamblu, cte paranteze se deschid, tot attea trebuie i nchise (balansare).

    n exemplul de mai sus, s-a folosit funcia + din AutoLISP. Numerele 2 i 3 sunt argumente ale funciei +. Structura s-expresiei AutoLISP este simpl, dar neobinuit. Cele mai multe bti de cap ridic parantezele i mperecherea lor corect. O s-expresie poate fi introdus n linia de comand a AutoCAD-ului. AutoCAD va recunoate paranteza deschis ca debut al unei s-expresii i va preda introducerea interpretorului AutoLISP, ateptnd rezultatul. AutoCAD afieaz rezultatul s-expresiei introduse la prompt-ul Command. AutoCAD poate utiliza rezultatul unei s-expresii introduse i ca un rspuns valid dat unei cereri din linia de comand. Pentru ncercri desenai o linie n AutoCAD. n exemplul de mai jos, n cadrul unei comenzi de rotire a liniei desenate, unghiul de rotire se indic printr-o s-expresie AutoLISP:

    Command: rotate Select objects: last Select objects: apas tasta Enter pentru a ncheia selecia de obiecte de rotit Base point: 0,0 /Reference: (/ 45 2.0)

    Figura 2.1. Diagrama de comunicare a AutoCAD-ului cu AutoLISP-ul.

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    48

    n timpul unei introduceri n linia de comand AutoCAD, acesta se uit i dup apariia caracterului semn de exclamare !. Dac semnul exclamrii este primul caracter al introducerii, AutoCAD pred introducerea interpretorului AutoLISP i ateapt rezultatul. Orice s-expresie valid poate urma caracterului semn de exclamare :

    Command: !(+ 1 2)

    Acest caracter este des utilizat pentru a cere AutoLISP-ului valoarea unei variabile. n acest caz simbolul nu trebuie nchis ntre paranteze. Spre exemplu, pi este n AutoLISP o constant predefinit. Pentru a gsi valoarea lui pi n linia de comand AutoCAD, se va folosi scrierea:

    Command: !pi 3.14159 Command:

    n concluzie, AutOCAD se uit dup dou caractere speciale: paranteza deschis i semnul exclamrii. O parantez deschis spune AutoCAD-ului c urmeaz o s-expresie. Semnul exclamrii spune AutoCAD-ului c ceea ce urmeaz este o s-expresie sau un simbol.

    Atomii, listele i cazul special a lui NIL Exist dou categorii majore de obiecte n AutoLISP: atomii i listele. Atomii sunt obiecte simple. Listele sunt obiecte complexe. Un atom este cel mai simplu obiect n AutoLISP. Un atom poate fi:

    un ntreg: 7 un numr real: 7.54 un ir: "Sir cu spatii" o funcie AutoLISP predefinit: + sau orice alt tip de obiect din tabelul 2.1.

    Tipul atomului Exemple Tip dat AutoLISP

    Nume de variabil pi, a, pt SYM ir exemplu STR ntreg 2, -4 INT Real 3.14, 0.2, -84.7665 REAL Descriptor de fiier FILE Nume de entitate AutoCAD ENAME Set de selecie AutoCAD PICKSET Funcii SUBR

    Tabelul 2.1. Exemple de atomi AutoLISP i tipul lor.

    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;

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    49

    pentru orice list care trebuie evaluat, primul element al listei trebuie s fie o funcie; obiectele din list trebuie separate cu cel puin un spaiu.

    Lista Nr. elemente Tipul elementelor din list (1 2 3) 3 Numerele ntregi: 1, 2 i 3 (+ 1 2.5) 3 Funcia +, ntregul 1 i realul 2.5 (+ 1 (/ 5 2.0)) 3 Funcia +, ntregul 1 i lista (/ 5 2.0) (setq pt (list 1 2 3)) 3 Funcia setq, variabila pt i lista (list 1 2 3) ( ) 0

    Tabelul 2.2. Exemple de liste i a numrului de elemente corespunztor.

    Atomii i listele pot fi combinate n cadrul listelor, dup cum se poate observa printre exemplele din tabelul 2.2. Exemplul din figura 2.2 prezint o list cu trei elemente: funcia +, ntregul 1 i lista (/ 5 2.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 excepia lui nil. Obiectul nil este o list vid. Prin convenie, nil este simultan atom i list. El poate fi exprimat n dou feluri: () sau nil. n AutoLISP nil este echivalent cu "fals". Multe funcii n AutoLISP testeaz dac o condiie este fals sau adevrat; de exemplu dac valoarea unui numr este mai mare dect zero. ntotdeauna cnd rezultatul unui test este "fals", AutoLISP returneaz nil ca valoare a testului efectuat.

    nil este singurul obiect AutoLISP care corespunde lui "fals"; n opoziie, ceea ce nu este fals este "adevrat". Despre aceasta vom vorbi ns mai trziu.

    Evaluarea atomilor i listelor Evaluarea este procesul prin care AutoLISP determin valoarea unui obiect. Sunt supui evalurii att atomii ct i listele. n AutoLISP fiecare obiect are o valoare. Prin evaluare, AutoLISP determin valoarea obiectului i returneaz acea valoare. Cnd AutoLISP primete pentru evaluare un obiect, AutoLISP determin valoarea sa i o returneaz. ntr-un exemplu anterior utiliznd caracterul semn de exclamare, AutoLISP evalua atomul pi, i returna valoarea sa n AutoCAD. AutoCAD afia valoarea returnat n zona de prompt Command:

    Command: !pi 3.14159

    Atomii sunt obiecte simple, evaluate dup o regul simpl n funcie de tipul lor. Cei mai muli atomi sunt evaluai la valorile lor n sine. Numerele ntregi i reale, irurile sunt toate evaluate la ele nsele. Valoarea unei variabile este egal cu ultima valoare atribuit ei.

    Figura 2.2. List cu trei elemente: doi atomi i o list.

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    50

    Valoarea unei liste poate fi determinat n dou moduri: preluarea listei aa cum e sau evaluarea listei. n funcie de natura listei, metodele pot duce la rezultate diferite. Dac o list este preluat aa cum e, atunci valoarea sa este ea nsi. Aceste noiuni vor deveni mai clare dup explicarea ceva mai trziu n cadrul acestui capitol a funciei quote. Pentru orice list care trebuie evaluat, primul element din list trebuie s fie o funcie. Listele se evalueaz n funcie de regulile date de primul element din list. n general, paii de evaluare sunt:

    AutoLISP privete la primul element; el trebuie s fie o funcie. Dac primul element nu este o funcie, atunci AutoLISP va genera un mesaj de eroare. Elementele dintr-o list care urmeaz funciei sunt argumentele funciei adic datele asupra crora opereaz funcia.

    AutoLISP evalueaz funcia pentru a ti cum s proceseze argumentele care i urmeaz. Pentru o anume funcie, numrul i tipul argumentelor trebuie respectat altfel, AutoLISP returneaz un mesaj de eroare. Pentru a le putea procesa, AutoLISP evalueaz de la stnga la dreapta i argumentele n sine - care pot fi de tip atom sau list.

    AutoLISP returneaz valoarea listei. AutoLISP evalueaz elementele unei liste de la stnga spre dreapta. n multe cazuri este mai convenabil poate pentru noi s urmrim procesul evalurii dinspre interior spre exterior. Rezultatul va fi n mod obinuit acelai, i este probabil mai uor pentru noi s citim astfel codurile AutoLISP. Dar acest mod de lucru nu este i cel al AutoLISP-ului. El ntotdeauna lucreaz de la stnga spre dreapta.

    S considerm pentru exemplificare urmtoarea list de trei elemente (figura 2.3):

    (+ 1 (/ 5 2.0)) AutoLISP evalueaz aceast list de la stnga la dreapta, n ordine:

    (+ ..

    AutoLISP se uit la primul element din list, ateptndu-se s gseasc o funcie, i o evalueaz. Funcia returneaz AutoLISP-ului un set de instruciuni.

    (.. 1 ..

    Urmnd instruciunile funciei +, AutoLISP gsete valoarea elementului secund din list, care constituie primul argument al funciei: atomul 1. Reine aceast valoare i apoi continu.

    (.. .. (/ 5 2.0) ..

    AutoLISP gsete valoarea celui de-al treilea element din list, element care constituie al doilea argument al funciei +. Al treilea element este o list. Cum gsete AutoLISP valoarea unei liste? Prin evaluarea ei. Cum evalueaz AutoLISP o list?

    (.. .. (/ ..

    nti, evalueaz funcia / primind instruciunile sale. (.. .. (.. 5 ..

    Figura 2.3. Evaluarea unei liste.

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    51

    (.. .. (.. .. 2.0 ) ..

    Apoi, gsete valorile argumentelor 5 i 2.0. AutoLISP ncheie instruciunile funciei / din lista (/ 5 2.5), mprind valorile i returnnd rezultatul, care n acest caz este realul 2.5. Negsind alte elemente n list, AutoLISP ncheie instruciunile funciei + din lista principal prin adunarea valorilor celor dou argumente, returnnd valoarea 3.5. Tabelul de mai jos exemplific evaluarea unor atomi i s-expresii.

    Atom / list de evaluat Valoare returnat Observaii text text Atom de tip ir, evaluat la sine nsi (setq a 1) 1 Se returneaz valoarea atribuit variabilei A 1 Se returneaz valoarea atribuit variabilei (1 2 3) Mesaj eroare Primul element nu este o funcie (+ 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

    Tabelul 2.3. Exemple de evaluare a atomilor i listelor.

    Funcia quote din AutoLISP este utilizat pentru a returna o list sau un atom fr a le evalua. Funcia quote admite un singur argument; acesta va fi returnat aa cum este, neevaluat, n urma evalurii listei care are drept prim element funcia quote. Aceast expresie AutoLISP returneaz lista (1.0 2.0 3.0), neevaluat.

    Command: (quote (1.0 2.0 3.0)) (1.0 2.0 3.0)

    Lista rezultat nu ar putea fi evaluat n sine, deoarece primul su element nu este o funcie este realul 1.0.

    Funcii aritmetice AutoLISP are prevzute funcii interne pentru operaiile standard de adunare, scdere, nmulire i mprire. Iat cteva expresii aritmetice simple i echivalentele lor ca expresii valide AutoLISP (verificai fiecare s-expresie n parte):

    S-expresie Rezultat Expresia aritmetic (/ 1 (sqrt 2)) 0.707107 2/1 (sqrt ( 21 (* 4 3))) 3.0 3421 (+ (expt 2.17 3) 1) 11.2183 117.2 3 ( 1 (sin (/ pi 4))) 0.292893 45sin1

    Tabelul 2.4. Rezultatele unor s-expresii i expresiile aritmetice echivalente.

    Prima s-expresie AutoLISP din tabel transpus n cuvinte ar suna aa: mparte pe unu la radicalul lui doi - nu uita c nti numeti funcia i apoi argumentele sale. De urmrit n exemplele de mai sus:

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    52

    dup fiecare parantez deschis urmeaz o funcie; numerele reale se scriu folosind punctul zecimal; argumentele funciilor trigonometrice sunt unghiuri exprimate n radiani; pentru numrul se folosete simbolul pi; fiecare funcie are predefinit un numr de argumente, iar folosirea unui numr incorect

    de argumente genereaz un mesaj de eroare. Un tabel cu funciile interne aritmetice uzuale din AutoLISP i exemple de utilizare ale acestora este dat n tabelul de mai jos, alturi de cteva observaii importante:

    Funcie S-expresie Rezultat Observaii + (+ 1 2 6) (+ 1 2.0)

    3 3.0

    Adunarea poate avea oricte argumente; numerele negative sunt precedate de semnul .

    ( 7 1 5) (- 7 -9.0) 3 -2.0

    Cnd argumentele sunt ntregi, rezultatul este ntreg.

    / (/ 9 3 2.0) (/ 9) 1.5 9

    Dac cel puin un argument este real, atunci rezultatul este real.

    * (* 9 3 2.0) (* 9) 54.0 9

    Funcia nmulire admite de la nici unul pn la oricte argumente; fr argument returneaz 0.

    sqrt (sqrt 4) (sqrt 4 9) 2.0 error

    Funcia radical nu admite dect un singur argument, iar rezultatul este ntotdeauna un real.

    expt (expt 2 3) (expt 2) 8 2

    Ridicarea la putere admite i mai mult de dou argumente; ncercai efectul.

    sin (sin (/ pi 3)) (sin 60) 0.866025 -0.304811

    Funciile trigonometrice lucreaz cu unghiurile date n radiani.

    cos (cos (/ pi 3)) (cos 0) 0.5 1.0

    Nu exist funciile tangent i cotangent, iar dintre cele inverse exist doar arctangenta.

    atan (atan 1 0.0) (atan 1) 1.5708 0.785398

    Returneaz arctangenta raportului dintre cele dou argumente; dac primul argument este pozitiv iar al doilea este 0, atunci returneaz /2.

    Tabelul 2.5. Tabelul principalelor funcii aritmetice interne din AutoLISP.

    Atribuirea

    Atribuirea este procesul prin care o valoare este asignat unei variabile definite de utilizator. Funcia setq din AutoLISP este utilizat pentru a lega o valoare de o variabil. Valoarea funciei setq este un set de instruciuni pentru AutoLISP. Aceste instruciuni s-ar putea traduce prin cuvintele: Ia primul element aa cum este. Nu-l evalua. Gsete valoarea celui de-al doilea argument. Seteaz primul argument la valoarea celui de-al doilea argument. Returneaz valoarea celui de-al doilea argument ca valoare a listei. Expresia de mai jos permite atribuirea ntregului 1 variabilei cu numele a:

    Command: (setq a 1) 1

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    53

    Numirea variabilelor trebuie s evite o serie de nume rezervate funciilor interne sau constantelor AutoLISP. Astfel, vor fi evitate nume precum +, , sqrt, abs, sin, atan, setq etc. Pentru a vedea care este valoarea atribuit unei variabile, se folosete dup cum s-a vzut semnul exclamrii !, pus naintea variabilei. Prin exemplul de mai jos vei putea evalua valorile atribuite variabilelor a, b i setq:

    Command: !a 1 Command: !b Nil Command: !setq

    Variabilei a i s-a atribuit anterior ntregul 1, este deci normal ca AutoLISP s raporteze 1. Aceast valoare se pstreaz pn la atribuirea unei noi valori variabilei a, sau pn la nceperea unei noi sesiuni de desenare n AutoCAD.

    n AutoLISP, nil nseamn nimic sau fals, iar variabila b nefiindu-i atribuit nici o valoare este raportat ca fiind nil. La nceperea unei noi sesiuni AutoCAD, pn la atribuirea unei valori, astfel de variabile sunt nil. Nu sunt nil ns numele de funcii AutoLISP, acestora fiindu-le legat adresa subrutinei, aa cum apare n exemplul de mai sus pentru funcia setq.

    Tipuri de date numerice

    AutoLISP are dou tipuri de date pentru numere: numere ntregi i reale. Funcia type returneaz tipul de dat a unui obiect. type cere un singur argument, i returneaz tipul de dat a acestui argument. De exemplu, aceast expresie returneaz tipul de dat al numrului real 1.0.

    Command: (type 1.0) REAL

    AutoLISP reprezint numerele reale ca numere cu virgul mobil n dubl precizie, reinnd cel puin 14 cifre semnificative exacte. n AutoLISP nu exist un tip de dat care s reprezinte numerele cu virgul mobil n simpl precizie. Toi realii sunt n dubl precizie, i se reprezint n AutoLISP n aceeai manier cu reprezentarea din AutoCAD. Numerele reale sunt numere cu punct zecimal, ex., 3.5 sau 123.456. Spre deosebire de AutoCAD, n AutoLISP pentru valori ntre 1.0 i -1.0, cifra zero trebuie s precead punctul zecimal, ex., 0.45 sau 0.123 sau -0.876. n AutoLISP afiarea numerelor reale se face implicit cu cinci cifre zecimale. Precizia de reprezentare intern este ntotdeauna meninut la cel puin 14 cifre semnificative. Dac este necesar afiarea sau tiprirea valorii unui numr real cu o precizie mai mare dect cea implicit, atunci trebuie ca numrul real s fie nti convertit la un ir cu funcia AutoLISP rtos i apoi afiat sau tiprit cu acurateea dorit. rtos cere trei argumente: un numr real, un ntreg reprezentnd unul din sistemele de uniti recunoscute de AutoCAD, i numrul de cifre zecimale cu care numrul reprezentat ca ir s fie returnat. Urmai dialogul de mai jos la prompt-ul Command din AutoCAD:

    Command: (setq a 4.123) 4.123

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    54

    Command: !a 4.123 Command: (type a) REAL Command: (rtos a 2 8) "4.12300000"

    ntregii sunt numere fr punct zecimal. ntregii AutoLISP sunt ntregi cu semn pe 32-bii cuprini ntre 2,147,483,648 i +2,147,483,647. n timp ce intern AutoLISP utilizeaz 32-bii n reprezentarea ntregilor, transferul acestora ntre AutoLISP i AutoCAD este limitat la valori pe 16-bii; astfel, nu pot fi transferai AutoCAD-ului valori ntregi mai mici dect 32,768 sau mai mari dect +32,767. Dac dorii utilizarea unor numere n afara acestor limite, va trebui s utilizai funcia float pentru a converti ntregul la un real nainte de transferul acestuia spre AutoCAD. Urmai drept exemplu dialogul de mai jos la prompt-ul Command din AutoCAD:

    Command: (setq b 4123) 4123 Command: !b 4123 Command: (type b) INT Command: (float b) 4123.0

    AutoLISP va promova ntregii la reali de fiecare dat cnd vor fi ntlnii mpreun ca argumente ale unei funcii. Dac argumentele unei funii + sunt doi ntregi, valoarea returnat este tot un ntreg. Dac argumentele sunt un ntreg i un real atunci valoarea returnat va fi un real:

    Command: (+ 1 2 3) 6 Command: (+ 1.0 2 3) 6.0 Command: (/ 3 2) 1 Command: (/ 3.0 2) 1.5

    Comportamente similare vor fi ntlnite la multe dintre funciile aritmetice. O atenie sporit se va acorda mpririi n scrierea programelor.

    Puncte AutoCAD i liste AutoLISP AutoCAD utilizeaz coordonate carteziene pentru a descrie n baza de date a desenului puncte 2D sau 3D. AutoLISP reprezint un punct AutoCAD n spaiu ca o list de trei numere reale, n care primul element este valoarea coordonatei X, al doilea valoarea coordonatei Y, iar al treilea valoarea coordonatei Z. Cum se poate construi o astfel de list? Exist dou funcii utilizate preponderent n construirea listelor: quote i list. Aa cum s-a artat, funcia quote admite un singur argument i oprete procesul de evaluare al acestuia, returnnd argumentul neevaluat. O list de trei numere reale poate fi uor construit

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    55

    utiliznd quote. De exemplu, expresia (quote (1.0 2.0 3.0)) returneaz valoarea (1.0 2.0 3.0), care constituie o reprezentare AutoLISP valid pentru un punct AutoCAD. n exemplul urmtor se va trasa o linie ntre dou puncte, pe baza atribuirii de liste variabilelor pt1 i pt2:

    Command: (setq pt1 (quote (1.0 1.0 0.0))) (1.0 1.0 0.0) Command: !pt1 (1.0 1.0 0.0) Command: (setq pt2 (quote (5.0 5.0 0.0))) (5.0 5.0 0.0) Command: !pt2 (5.0 5.0 0.0) Command: line From point: !pt1 To point: !pt2 To point: Enter

    Valoarea returnat de funcia list este o list compus din valorile argumentelor sale. Lista poate avea oricte argumente. Funcia list evalueaz fiecare din argumentele sale, unul dup cellalt, i reine temporar valorile acestora. Cnd list termin evaluarea argumentelor sale, compune valorile argumentelor ntr-o list i o returneaz. Un exemplu mai complex este urmtorul:

    Command: (setq pt3 (list 2.0 2.0 0.0)) (2.0 2.0 0.0) Command: !pt3 (2.0 2.0 0.0) Command: (setq x 6.0) 6.0 Command: (setq y 6.0) 6.0 Command: (setq z 0.0) 0.0 Command: (setq pt4 (list x y z)) (6.0 6.0 0.0) Command: !pt4 (6.0 6.0 0.0) Command: line From point: !pt3 To point: !pt4 To point: Enter

    Extragerea elementelor dintr-o list Funciile list i quote permit formarea listelor. Acum ar fi utile funcii care s permit separarea elementelor unei liste. Funciile car i cdr sunt principalele funcii de acces la elementele unei liste. Funcia car returneaz primul element al unei liste. Funcia car admite un singur argument care trebuie s fie o list, iar lista trebuie s conin unul sau mai multe elemente:

    Figura 2.4. Reprezentarea n AutoLISP a unui punct.

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    56

    Command: (car (list 1 2 3)) 1

    Funcia cdr elimin primul element dintr-o list dat ca argument i returneaz lista astfel prelucrat. Din combinarea funciilor car i cdr pot fi extrase elemente de ordin diferit din liste:

    Command: (cdr (list 1 2 3)) (2 3) Command: (car (cdr (list 1 2 3))) 2

    n lucrul cu AutoCAD lucrul cu puncte este esenial. Accesul la coordonatele X, Y i Z ale unui punct poate fi fcut prin expresiile de mai jos, pornind de la atribuirea unei liste variabilei pt1:

    (setq pt1 (list 1.0 5.0 0.0))

    Tabelul de mai jos ilustreaz funciile necesare pentru a returna coordonatele X, Y i Z ale punctului pt1, folosind funciile standard car i cdr, precum i funciile echivalente directe cadr i caddr.

    S-expresie Echivalent Rezultat Coordonata extras (car pt1) (car pt1) 1.0 X (car (cdr pt1)) (cadr pt1) 5.0 Y (car (cdr (cdr pt1))) (caddr pt1) 0.0 Z

    Tabelul 2.6. Extragerea coordonatelor dintr-o list reprezentnd un punct.

    AutoLISP i comenzi AutoCAD Comenzile AutoCAD pot fi apelate direct din AutoLISP, iar s-expresiile pot fi utilizate ca rspunsuri la prompt-urile AutoCAD. Funcia command invoc comenzi AutoCAD din AutoLISP. command admite ca argument un ir care reprezint numele unei comenzi AutoCAD. n general argumentele funciei vor fi transferate AutoCAD-ului, ca rspunsuri la prompt-urile acestuia.

    Utilizarea irului "" ca argument provoac un rspuns de tip ENTER. Acest ir este n AutoLISP reprezentarea unui ir nul, iar AutoCAD n cadrul funciei command l interpreteaz ca fiind echivalent cu rspunsul nul. n exemplul urmtor, este lansat printr-o s-expresie comanda line, cu tot dialogul care i urmeaz pentru desenarea unei linii ntre punctele de coordonate (1, 1) i (5, 5). Apoi tot printr-o expresie AutoLISP linia desenat va fi rotit cu 45:

    Command: (command "line" "1,1" "5,5" "") nil Command: (setq pt (list 0.0 0.0)) (0.0 0.0) Command: (command "rotate" "last" "" pt 45) nil

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    57

    S-expresia de mai sus cere o serie de explicaii suplimentare. Astfel, funcia command din AutoLISP permite lansarea de comenzi AutoCAD. Numele comenzilor se scriu ca ir, fr spaii suplimentare n cadrul irului care ar avea efect de Enter. Diferitele opiuni din dialogul unei comenzi pot fi de asemenea indicate ca iruri, valori statice sau variabile. irul last rspunde la cererea de selecie i provoac selectarea pentru rotire a ultimei entiti AutoCAD desenate. irul nul are efect de Enter. Variabila pt servete indicrii coordonatelor punctului de baz, dup ce acesteia i s-a atribuit o list cu doi reali. Exersai i alte exemple, pe baza tabelului urmtor (asigurai-v c lucrai n sistem metric).

    Comenzi AutoCAD S-expresii cu acelai rezultat Command: line From point: 20,20 To point: 100,100 To point: Enter

    (command "line" "20,20" "100,100" "")

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

    (command "circle" "60,60" 10)

    Command: arc Center/: 40,20 Center/End/: c Center: 1,1 Angle/Legth of chord/: l Length of chord: 28.2

    (command "arc" "40,20" "c" "1,1" "l" 28.2)

    Funcia command ntotdeauna returneaz nil. Efectul lateral al unei expresii command este mult mai important dect valoarea returnat. Efectul lateral al unei expresii AutoLISP este o schimbare a strii programului AutoCAD provocate prin apelul funciei. Efectul lateral al apelului funciei setq este legarea unei valori de o variabil. Efectul lateral al apelului funciei command este ndreptat spre modificarea fiierului desen prin lansarea unor comenzi AutoCAD.

    De notat c AutoLISP poate lsa AutoCAD ntr-o stare neterminat de dup o comand, dac nu-i servete toate datele cerute de dialogul comenzii lansate. n acest sens, cunoaterea succesiunii prompt-urilor asociate unei comenzi AutoCAD este esenial pentru buna nchidere a comenzii lansate prin programul AutoLISP.

    Rezumat AutoLISP este un limbaj de programare asociat lucrului exclusiv n AutoCAD; acest

    limbaj este parte integrant a programului AutoCAD. Sarcina principal a AutoLISP-ului este de a evalua expresii simbolice.

    Expresiile simbolice AutoLISP pot fi editate direct n faa prompt-ului Command din AutoCAD. Pot fi astfel scrise expresii simbolice pentru efectuarea de calcule aritmetice, sau pentru a rspunde unor cereri adresate de AutoCAD. AutoCAD invoc AutoLISP cnd vede dou semne speciale: ( i !

    n cadrul expresiilor simbolice apar atomi i liste. Exist mai multe tipuri de atomi. Un atom poate fi un ntreg, un numr real, un ir, o funcie AutoLISP predefinit etc.

  • 2. Complemente de programare n AutoLISP Fundamentele AutoLISP

    58

    Atomii sunt obiecte care nu sunt nchise ntre paranteze. Listele sunt nchise ntre paranteze. Obiectele coninute ntre parantezele unei liste sunt numite elemente; elementele unei liste pot fi atomi sau liste. Elementele dintr-o list trebuie separate ntre ele cu cel puin un spaiu.

    Expresiile sunt evaluate de AutoLISP, care va returna un rezultat al evalurii. Cei mai muli atomi sunt evaluai la ei nii. Listele au un proces de evaluare n pai, de la stnga spre dreapta. Primul element al unei liste evaluate trebuie s fie o funcie. Funcia quote oprete procesul de evaluare.

    n AutoLISP pot fi folosite variabile; funcia AutoLISP care permite atribuirea de valori unei variabile, este setq. Evaluarea unei variabile la prompt-ul Command al AutoCAD-ului, este posibil cu utilizarea semnului exclamrii !. La nceperea unei noi sesiuni AutoCAD, se pierd atribuirile fcute n sesiunea precedent.

    n AutoLISP se folosesc mai multe tipuri de date. Funcia type din AutoLISP returneaz tipul de dat al argumentului. AutoLISP are dou tipuri numerice de date: numerele ntregi i numerele reale. Funcia float convertete un ntreg la un real, iar fix un real la un ntreg.

    Un punct AutoCAD este reprezentat n AutoLISP ca o list cu trei reali, reprezentnd coordonatele X, Y i Z ale punctului. Listele se pot forma cu funcia quote sau cu funcia list. Extragerea elementelor dintr-o list se face cu funciile car i cdr.

    Funcia command permite apelul din AutoLISP a comenzilor AutoCAD. Argumentele funciei command sunt numele comenzii AutoCAD, urmat de rspunsurile la prompt-urile comenzii lansate. Un ir nul "" este tratat n cadrul funciei command ca fiind echivalent cu un ENTER.

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    59

    2.2. Definirea funciilor externe AutoLISP

    n prima lecie am utilizat AutoLISP pentru a scrie o serie de s-expresii valide chiar la prompt-ul Command al AutoCAD-ului. Nu este ns acesta scopul principal n care se utilizeaz limbajul de programare AutoLISP. Utiliznd acest limbaj pot fi definite noi funcii AutoLISP i noi comenzi AutoCAD. O nou funcie AutoLISP poate s se refere la transformarea gradelor n radiani, la calculul tangentei sau a funciei arcsinus, etc. O nou comand AutoCAD poate s se refere la desenarea unei suprafee elicoidale sau a profilului unei scule rezultate dintr-un anume calcul ingineresc.

    Definirea unei noi funcii AutoLISP Toate funciile aritmetice enumerate n tabelul 2.5 sunt funcii AutoLISP interne (sau predefinite). AutoLISP are peste 200 de funcii predefinite. Alte funcii, imaginate de utilizator, pot fi cu uurin adugate celor existente. Aceste noi funcii se vor numi externe. Autodesk, firma productoare a programului AutoCAD, pune la dispoziie prin munca programatorilor din lume, o serie de funcii externe utile; unele sunt gratuite, altele se cumpr. Putem ns s ne construim propriul set de funcii externe. La definirea unei noi funcii AutoLISP externe, se fixeaz mai nti cerinele. Astfel, de exemplu, se dorete ca o funcie s poarte numele rad i s admit lucrul cu un argument unghiul dat n grade. Dorim ca funcia s returneze unghiul corespunztor n radiani. Definirea acestei noi funcii poate fi fcut direct la prompt-ul Command:

    Command: (defun rad (x) (* x (/ pi 180))) RAD

    n exemplul de mai sus s-a folosit funcia defun din AutoLISP, care permite definirea unei funcii AutoLISP externe. Argumentele funciei defun sunt:

    numele noii funcii, ales de programator; numele nu se supune evalurii: rad o list cu argumentul noii funcii, cu nume ales de programator: (x) o s-expresie AutoLISP, care nmulete argumentul cu pe 180: (* x (/ pi 180))

    Ceea ce urmeaz listei de argumente este corpul funciei nou definite. n corpul funciei pot fi oricte expresii; exemplul de mai sus prevede o singur expresie n corpul funciei rad. Imediat dup definire, funcia poate fi probat asemenea oricrei funcii AutoLISP interne:

    Command: (rad 180) 3.14159

    Rezultatul evalurii expresiei AutoLISP de mai sus este, conform definiiei funciei rad, valoarea n radiani a unghiului de 180. La apelul unei funcii AutoLISP externe, rezultatul afiat pe ecran corespunde rezultatului evalurii ultimei expresii din corpul funciei apelate. n cazul funciei rad, ultima expresie este i singura.

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    60

    Iat mai jos definirea unei noi funcii externe i apelul ei de verificare. Numele funciei este media i admite ca argumente dou numere reale sau ntregi. Aceast funcie este datoare s returneze media celor dou numere introduse ca argument, n forma unui numr real:

    Command: (defun media (x y) (/ (+ x y) 2.0)) MEDIA

    Command: (media 8 10) 9.0

    Tastarea expresiilor AutoLISP la prompt-ul Command poate fi fcut i n etape, prin apsarea tastei Enter nainte s se fi ncheiat expresia. AutoLISP afieaz un prompt de continuare de tipul 1>, 2> etc., nsemnnd n acelai timp i numrul de paranteze pe care suntem datori s le nchidem:

    Command: (defun media (x) 1> (/ (+ x y) 2.0)) MEDIA

    Atunci cnd anvergura funciei nou definite crete, editarea acesteia la prompt-ul Command devine greoaie i se prefer utilizarea unui editor de texte pentru a scrie comod programul AutoLISP. n plus, definiiile de mai sus sunt reinute de AutoCAD doar pn la nceperea unui nou desen. Paragraful urmtor face posibil editarea i salvarea definiiilor ntr-un fiier.

    Utilizarea unui editor de texte la scrierea programelor

    Odat cu creterea complexitii programelor AutoLISP se prefer utilizarea unui editor de texte pentru scrierea codului. O variant profesional este utilizarea mediului Visual LISP, care permite o scriere i depanare profesionist a programelor AutoLISP. Programele din manual fiind simple, se presupune c editarea acestora se face n Notepad, o aplicaie Windows nelipsit din accesoriile software ale calculatorului personal. O versiune superioar, potrivit programrii AutoLISP la un nivel mediu este Notepad++. Una dintre cele mai mari faciliti oferite de Notepad++ este cea de verificare a mperecherii parantezelor. Aceast aplicaie de editare poate fi descrcat liber de pe Internet. Repede vom gsi util lansarea i pstrarea pe ecran a dou aplicaii paralele: AutoCAD i Notepad. Trecerea comod dintr-o aplicaie n alta va uura mult munca de depanare a programului, care probabil la nceput va conine multe erori. Tehnologia de lucru ar putea fi urmtoarea:

    se scrie un program AutoLISP n Notepad i se salveaz ntr-un fiier cu numele dorit, dar obligatoriu cu extensia .lsp;

    folosind opiunea de meniu Tools>Load Application din AutoCAD, se ncarc fiierul .lsp i se verific funcionarea programului n AutoCAD;

    dac sunt erori de mperechere a parantezelor, sau alte erori de ordin general, fiierul AutoLISP nu va putea fi ncrcat n AutoCAD i acesta semnaleaz un mesaj de eroare;

    corectarea erorilor se face prin revenire n Notepad, o nou salvare de fiier, o nou ncrcare n AutoCAD i o nou verificare a programului AutoLISP.

    Ne propunem definirea unei funcii de calcul a tangentei unui unghi dat n radiani. Ca un aspect particular, funcia va trebui s returneze nil la unghiuri de 90, 270 etc. acolo unde tangenta este nedefinit. Se alege pentru noua funcie numele tan, iar pentru argument x. Lansai Notepad din Windows, aplicaie aflat n grupa Accessories. Fereastra aplicaiei este

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    61

    una dintre cele mai simple. Scriei codul AutoLISP din figura 2.5. Fontul ales este Courier New, de mrime 9. Acest font are o caracteristic favorabil: orice caracter ocup acelai spaiu, permind alinierea liniilor. Setarea fontului se face cu opiunea de meniu Format>Font.

    Se cuvin cteva comentarii la programul AutoLISP de mai sus, cu privire la coninutul i formatul de editare. Astfel, n prima linie de program se utilizeaz funcia defun pentru a defini o nou funcie AutoLISP, avnd numele tan, cu un argument x:

    (defun tan (x)

    S-a ales apoi continuarea programului pe un rnd nou. Aa dup cum deja se cunoate, urmtoarele expresii vor forma corpul funciei tan. Dei nu pare, corpul acestei funcii conine o singur expresie, organizat pe patru linii de program:

    (if (equal (rem x (/ pi 2)) 0.0 1e-6) nil (/ (sin x) (cos x)) )

    Funcia if necesar n definirea funciei externe tan trebuie s traduc n limbaj AutoLISP urmtoarele instruciuni: dac este egal restul mpririi lui x la /2 cu 0, n limita unei marje de eroare de 106, atunci returneaz nil, altfel returneaz ctul mpririi lui sinus la cosinus de unghi. Funcia if admite trei argumente:

    o expresie de testare; expresia atunci, care se execut dac testul este trecut (adevrat); expresia altfel, care se execut dac testul nu e trecut (fals).

    Formatul de prezentare a codului AutoLISP din figura 2.5 face mai uor de citit programul; astfel, pe linia 2-a din program apar funcia if i testul de evaluat. Funcia equal are trei argumente i verific dac este egal primul argument cu al doilea, n limita unei erori precizate de al treilea argument. Primul argument este o expresie de testare care folosete funcia rem, i care returneaz restul mpririi lui x la /2:

    Pe linia 3-a din program apare expresia AutoLISP care se execut dac testul este trecut expresia atunci. Pe poziia acestei expresii este nscris doar nil. Pe linia 4-a din program

    Figura 2.5. Editarea unui program AutoLISP n aplicaia Notepad.

    Figura 2.6. Argumentele funciei de testare equal.

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    62

    apare expresia AutoLISP care se execut dac testul nu este trecut expresia altfel; expresia nscris mparte sinus la cosinus (nu uita de spaiile obligatorii ntre funcii i argumente!). Pe linia a 5-a este nchis paranteza-pereche a lui if, iar pe linia 6-a, ultima din cadrul funciei definite, este nscris paranteza-pereche a lui defun. Dup tastarea programului AutoLISP de mai sus, folosii opiunea de meniu File>Save din Notepad pentru a salva fiierul editat, n directorul C:\Student\Nume. Pentru numele fiierului folosii L02.lsp. Notai necesitatea de a utiliza extensia .lsp pentru fiierele AutoLISP. Extensia implicit oferit de aplicaia Notepad, este .txt; aceast extensie nu este cea potrivit!

    ncrcarea n AutoCAD a unui program AutoLISP Pentru a putea proba noua funcie AutoLISP, trecei n AutoCAD i folosii opiunea de meniu Tools>Load Application. Aceast opiune permite ncrcarea n AutoCAD a programului AutoLISP editat n Notepad. Pe ecran apare caseta Load/Unload Applications (figura 2.7). Localizai fiierul salvat i folosii butonul Load al acestei casete pentru a-l ncrca.

    La ncrcarea unui fiier, AutoLISP face o serie de verificri sumare privind programul de ncrcat. n primul rnd este verificat mperecherea parantezelor. Dac numrul parantezelor nchise l depete pe cel al parantezelor deschise, este posibil s apar, n linia de comand AutoCAD, un mesaj de eroare de forma:

    Command: _appload Loading C:\Student\Nume\L02.lsp ... Error: extra right pare non input

    Figura 2.7

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    63

    Dac numrul parantezelor deschise l depete pe cel al parantezelor nchise, atunci la ncrcarea fiierului este posibil s apar un mesaj de eroare de forma:

    Command: _appload Loading C:\Student\Nume\L02.lsp ... Error: malformed listo on input

    n sfrit, dac programul este corect pe criterii sumare, el este ncrcat i poate fi folosit. Pasul urmtor este verificarea de ctre programator a funciilor definite n cadrul fiierului ncrcat. n cazul de fa, singura funcie definit este tan. Apelul acestei funcii externe este asemenea apelului oricrei funcii AutoLISP interne. Iat dou exemple prin care se verific ce returneaz funcia tan la unghiuri de 90 i 45:

    Command: (tan (/ pi 2)) nil

    Command: (tan (/ pi 4)) 1.0

    Rezultatul apelului este rezultatul evalurii ultimei expresii din corpul funciei tan. Ultima, i singura expresie din corp, este expresia de funcie if. Dac testul (argumentul 1 al funciei if) este trecut, atunci if returneaz valoarea argumentului 2 (editat n linia 3-a din program), altfel if returneaz valoarea argumentului 3 (editat n linia 4-a din program).

    Reguli de editare a unui program AutoLISP

    Programul AutoLISP din figura 2.5 putea fi tastat i la prompt-ul Command: al AutoCAD-ului, ns avantajele utilizrii unui editor de texte sunt evidente:

    editare comod, cu posibilitate de tergere sau inserare, copiere etc.; expresiile tastate se salveaz ntr-un fiier i nu se pierd la ieirea din AutoCAD;

    Figura 2.8

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    64

    Organizarea codului AutoLISP dup modelul din figura 2.5, reluat n figura 2.8, ajut mult la citirea i depanarea programului. Expresiile care fac parte din corpul unei funcii sunt deplasate la dreapta cu 2-3 spaii. Aceast aliniere continu i n cadrul expresiilor din corp. Devine clar unde ncepe i se termin definirea unei funcii, devine clar unde ncepe i se termin expresia if sau un ciclu while etc. Cnd programele cresc n dimensiuni, foarte util devine comentarea liniilor de program. n AutoLISP, comentariile se introduc folosind semnul ;. Tot ce urmeaz pe linia cu acest semn este neglijat de interpretor. Introducei n fiierul L02.lsp funciile rad i media definite la nceputul leciei, comentnd fiecare funcie n parte dup modelul din figura 2.8. De fapt, fiierele AutoLISP conin o serie de definiri de funcii, atent comentate pentru citirea, depanarea sau delimitarea lor. Numele dat fiierului AutoLISP nu este neaprat numele vreunei funcii definite n cadrul acestuia.

    Sintaxa funciei defun Sintaxa funciei defun apare uor diferit de cea a altor funcii ntlnite n acest manual.

    (defun nume list-arg expr )

    Funcia defun cere obligatoriu dou argumente, urmate de un numr variabil de argumente. Primul argument al funciei defun este numele noii funcii definite. Este de preferat s folosii un nume care descrie aciunea funciei. Niciodat nu folosii un nume identic cu al unei funcii interne sau al unui simbol. Aceasta ar provoca pierderea definiiei originare, fcnd de exemplu funcia intern inaccesibil pn la restartarea AutoLISP-ului, odat cu nceperea unui nou desen.

    S relum exemplul precedent, cu mici modificri, pentru explicaii suplimentare: (defun tan (x / numa numi) (setq numa (sin x)) (setq numi (cos x)) (if (equal numi 0.0 1e-6) nil (/ numa numi)) )

    n acest exemplu, primul argument al lui defun este simbolul tan, reprezentnd numele ales pentru funcia nou definit. Al doilea argument al funciei defun este o list de argumente i variabile locale. Cele dou tipuri diferite de argumente sunt desprite prin caracterul /. Acest caracter poate lipsi dac lista este vid, sau nu are variabile locale. n exemplele de mai jos, n funcia nume_f1 lista este vid, iar n funcia nume_f2 lista conine dou argumente:

    (defun nume_f1 () (defun nume_f2 (x y)

    Funcia tan definit mai sus are un argument i dou variabile locale, desprite de caracterul /. Argumentele care urmeaz listei de argumente i variabile locale sunt expresii evaluate cnd funcia definit de utilizator va fi executat. Expresiile conin instruciuni de prelucrare care vor fi executate cnd funcia va fi apelat. Valoarea returnat de o funcie este valoarea ultimei expresii din corpul funciei. Funcia tan definit are trei expresii n corpul su:

    (setq numa (sin x)) (setq numi (cos x)) (if (equal numi 0.0) nil (/ numa numi))

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    65

    n prima expresie, variabilei numa i se atribuie valoarea sinusului unghiului x dat ca argument la apelul funciei tan. n a doua expresie este calculat cosinusul unghiului x, iar rezultatul este atribuit variabilei numi. n expresia final se testeaz dac numitorul unei mpriri este zero. n funcie de rezultatul testului, rezultatul expresiei finale este nil sau este rezultatul mpririi. Prezena lui x n lista argumentelor nainte de caracterul / permite ca apelul funciei tan s se fac cu un argument. Argumentul introdus la apelul funciei tan va fi transmis prin intermediul lui x n corpul funciei. Dup execuie, orice legare fcut lui x se pierde. Mai mult dect att, se terg i legrile fcute variabilelor numa i numi pentru c acestea au fost declarare n lista de argumente ca fiind de existen local. Dac variabilele numa i numi nu ar fi fost trecute n lista de argumente, dup apelul funciei tan, atribuirile fcute celor dou variabile se pstrau, iar funcia lsa dup apel murdrii n urma sa. Aceste legturi se pierd odat cu nceperea unui nou desen n AutoCAD.

    Expresiile test i cele condiionale Programele AutoLISP se pot ramifica pe baza unor expresii condiionale. Funciile de baz n expresiile condiionale sunt:

    if cond

    Funciile if i cond testeaz de obicei unele valori, iar programul n funcie de rezultatul testelor va urma o anumit ramur. AutoLISP are o mare varietate de funcii utilizate n testarea pe diferite criterii, care pot fi combinate n teste complexe utiliznd funcii logice:

    Funcii de testare a egalitii Funcii de testare a tipului de dat = Egal cu atom Este argumentul un atom? /= Diferit de listp Este argumentul o list? < Mai mic dect boundp Are argumentul vreo valoare? Mai mare dect numberp Este argumentul un numr? >= Mai mare sau egal cu Exemple de funcii logice minusp Mai mic dect zero not Verifica dac argumentul este nil zerop Egal cu zero and Aplic I logic unor argumente equal Egal cu or Aplic SAU logic unor argumente

    n AutoLISP, simbolul T este echivalent cu adevrat (true), pentru orice test. Simbolul nil este echivalent cu fals. n AutoLISP, o expresie evaluat la nimic este o expresie nil, sau fals. Dac o astfel de expresie este utilizat n cadrul unui test condiional atunci ramura urmat este cea corespunztoare lui fals. n AutoLISP, o expresie evaluat la altceva dect nil, este o expresie T, sau adevrat. Dac o astfel de expresie este utilizat n cadrul unui test atunci ramura urmat este cea

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    66

    corespunztoare lui adevrat. T i nil sunt mutual exclusive. O expresie care este T, nu poate fi nil. Dac o expresie este nil, atunci ea nu poate fi T. Expresiile test returneaz T, dac testul este trecut, sau nil dac testul nu este trecut. ncercai n AutoCAD dou expresii test simple:

    Command: (setq x 1) 1

    Command: (= x 1) T

    Command: (minusp x) nil

    Funcia = admite cel puin un argument i verific dac argumentele sunt numeric egale. Funcia minusp admite un argument numeric i verific dac acesta este negativ. Expresiile condiionale se bazeaz pe funciile if i cond. Funcia if admite 2 sau 3 argumente. Primul argument este o expresie test. Dac rezultatul testului este diferit de nil, atunci este executat expresia de pe poziia argumentului 2. Dac rezultatul testului este nil, atunci este executat expresia de pe poziia argumentului 3. Iat cteva exemple, care pot fi ncercate n AutoCAD:

    Command: (if 0 1 2) 1 Command: (if nil 1 2) 2 Command: (if (= x 1) DA NU) DA

    Funcia if permite executarea unei singure expresii dup evaluarea expresiei test. Pot fi grupate mai multe expresii n una singur cu ajutorul funciei progn. Funcia progn i evalueaz pe rnd cte un argument i returneaz valoarea ultimului argument. Mai multe expresii grupate n cadrul unei funcii progn par, la apelul funciei, o singur expresie. n exemplul de mai jos, dac variabila x este egal cu 1, atunci variabilelor y i z li se vor atribui valorile 2 i respectiv 3, altfel i se va atribui lui y valoarea 0:

    Command: (if (= x 1) (progn (setq y 2) (setq z 3)) (setq y 0)) 3 Command: !y 2 Command: !z 3

    n AutoLISP exist mai multe funcii logice, dintre care cele mai importante sunt: not, and i or. Funcia not accept un singur argument i verific dac este nil sau nu. Funcia and accept unul sau mai multe argumente. Dac oricare dintre argumente este nil, atunci ea returneaz nil. Dac toate argumentele sunt T, atunci ea returneaz T. and oprete procesul ndat ce ntlnete un argument nil. Iat cteva exemple:

    Command: (not 1) nil Command: (and 1 2 3) T

  • 2. Complemente de programare n AutoLISP Definirea funciilor externe AutoLISP

    67

    Command: (and 1 2 nil) nil

    Funcia or accept unul sau mai multe argumente. Dac oricare dintre argumente este T, atunci se returneaz T. Dac toate argumentele sunt nil, atunci returneaz nil. or oprete procesul de ndat ce un argument este T.

    Command: (or 1 2 3) T Command: (or 1 2 nil) T Command: (or nil nil nil) nil

    Rezumat Scriind programe n AutoLISP pot fi definite noi funcii, numite externe, care se

    adaug setului de funcii interne pus la dispoziie iniial de limbaj. Funcia intern defun permite definirea unei noi funcii AutoLISP externe.

    Argumentele funciei defun sunt: numele noii funcii, o list cu argumentele noii funcii, urmat de expresiile care fac obiectul corpului noii funcii.

    Funciile pot fi definite pentru a fi apelate fr argumente sau s accepte un numr fix de argumente. Apelul funciei se face cu precizarea argumentelor. La apelul unei funcii cu argumente, valoarea argumentelor este transferat n corpul funciei.

    Rezultatul apelului unei funcii externe este rezultatul ultimei evaluri din corpul funciei, n condiiile n care o funcie poate avea oricte expresii n corp. Apelul funciei externe urmeaz regulile lucrului cu funciile interne: se tasteaz parantez, apoi numele funciei, urmat de argumente n numrul stabilit la definirea funciei.

    Pentru editarea comod a expresiilor AutoLISP, precum i pentru salvarea acestora ntr-un fiier, se poate utiliza un editor de texte de tip Notepad. Fiierul poate avea numele ales de programator, dar extensia trebuie s fie .lsp. Un fiier conine una sau mai multe definiii de funcii externe AutoLISP.

    Programele uor de citit i depanat au codul AutoLISP aliniat, nsoit de comentarii. Comentariile se introduc folosind semnul ;

    Fiierele AutoLISP se ncarc n AutoCAD folosind opiunea de meniu Tools>Load Application. La ncrcarea unui fiier, interpretorul AutoLISP face o verificare sumar a acestuia, n primul rnd n ceea ce privete mperecherea corect a parantezelor. Un eventual eec este semnalizat n linia de comand a AutoCAD-ului printr-un mesaj de eroare.

    Programele AutoLISP se pot ramifica pe baza unor expresii condiionale. Funciile de baz n expresiile condiionale sunt if i cond. Funciile if i cond testeaz de obicei unele valori, iar programul n funcie de rezultatul testelor va urma o anumit ramur. Printre funciile de testare uzuale, le amintim pe cele relaionale: =, >, <

    Funcia if testeaz o expresie i ramific programul spre alte dou expresii. Funcia progn este utilizat pentru a executa mai multe expresii n cadrul unei ramuri.

    Funciile logice not, and i or testeaz dac una sau mai multe expresii sunt T sau nil.

  • 2. Complemente de programare n AutoLISP Definirea de noi comenzi AutoCAD

    68

    2.3. Definirea de noi comenzi AutoCAD

    Definirea unor noi comenzi AutoCAD este scopul principal al programrii n AutoLISP. Scriind programe (rutine) n AutoLISP, pot fi adugate AutoCAD-ului noi posibiliti de desenare i calcul. Funcionarea noilor comenzi poate imita lucrul cu comenzi clasice de tipul line, arc, bhatch etc. Noua comand poate declana un dialog cu utilizatorul n linia de comand AutoCAD, sau apariia unei casete de dialog. De altfel, o serie de comenzi AutoCAD existente, des utilizate, se bazeaz, fr s tim, pe rutine AutoLISP scrise de programatorii de la compania Autodesk.

    Comanda de desenare a unui dreptunghi

    Comanda rectangle din AutoCAD permite desenarea unui dreptunghi. Dialogul acestei comenzi este urmtorul:

    Command: rectangle Chamfer/Elevation/Fillet/Thickness/Width/: Other corner:

    Dorim s scriem un program n AutoLISP care s defineasc o comand similar, avnd numele dreptunghi, al crui dialog s fie:

    Command: dreptunghi Primul colt: Colt opus:

    Lansai n acest sens aplicaia Notepad i editai programul de mai jos: (defun c:dreptunghi () (setq p1 (getpoint "Primul colt: ")) (setq p3 (getpoint "Colt opus: ")) (setq p2 (list (car p3) (cadr p1))) (setq p4 (list (car p1) (cadr p3))) (command "pline" p1 p2 p3 p4 "c") )

    Salvai fiierul editat, sub numele L03.lsp, n directorul C:\Student\Nume\. ncrcai apoi acest fiier n AutoCAD, folosind opiunea de meniu Tools>Load Application. Presupunnd c nu exist erori n program, fiierul se va ncrca fr apariia vre-unui mesaj de eroare. ncercai apoi la prompt-ul Command noua comand, tastnd numele ei i rspunznd cererilor de puncte:

    Command: dreptunghi Primul colt: 20,10 Colt opus: 50,30 pline From point: Current line-width is 0.0000 Arc/Close/Halfwidth/Length/Undo/Width/: Arc/Close/Halfwidth/Length/Undo/Width/:

  • 2. Complemente de programare n AutoLISP Definirea de noi comenzi AutoCAD

    69

    Arc/Close/Halfwidth/Length/Undo/Width/: Arc/Close/Halfwidth/Length/Undo/Width/: c Command: nil

    Rezultatul va fi desenarea pe ecran a unui dreptunghi, definit prin colurile de coordonate 20,10 i respectiv 50,30. n zona de dialog, dup lansarea comenzii dreptunghi i indicarea colurilor, defileaz n mod automat numele comenzii pline, precum i cererile acesteia. Comanda pline este lansat din programul AutoLISP, iar cererile de puncte ale comenzii sunt de asemenea transmise de programul AutoLISP.

    Dou dintre punctele dreptunghiului sunt cerute utilizatorului (P1 i P3 din figura 2.9); restul de dou puncte sunt calculate de program pe baza urmtoarei observaii:

    Punctul P2 are aceeai coordonat x cu punctul P3 i aceeai coordonat y cu P1;

    Punctul P4 are aceeai coordonat x cu punctul P1 i aceeai coordonat y cu P3.

    Programul AutoLISP editat mai sus are o serie de elemente noi, pe care le vom trata n continuare. Astfel, prima linie de program este de forma:

    (defu