LISP Complet

download LISP Complet

of 319

description

Autocad Autoslip

Transcript of LISP Complet

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    0-1

    0 Cuvnt nainte Aceast carte nu ar fi putut fi scris fr existena minunatului

    colectiv de Inginerie Asistat de Calculator din cadrul Universitii POLITEHNICA din Bucureti, dezvoltat n jurul Centrului de Calcul al Catedrei T.C.M. nc din anul 1980.

    AutoCAD a fost introdus ntre obiectivele strategice ale Laboratorului de Inginerie Asistat de Calculator prin strdaniile Prof.dr.Ing. Constantin Stncescu nc din 1991 i constituie n continuare baza logistic de implementare a noiunilor de Proiectare Asistat de Calculator.

    De-a lungul anilor, dezvoltarea aptitudinilor absolvenilor n acest domeniu de activitate a fost permanent n atenia celor ce direcioneaz coninutul planurilor de nvmnt, n special a D-lui Prof.dr.Ing. Marian Gheorghe.

    AutoLISP a venit firesc, odat cu AutoCAD, i a constituit un domeniu de fireasc curiozitate la nceput, de investigare atent i mare satisfacie, ulterior.

    Cu toii ne-am aplecat asupra tainelor sale i ncetul cu ncetul am reuit s obinem primele rezultate i de ce nu, o consacrare ulterioar.

    Mulumesc pe aceast cale profesorilor mei:

    prof.dr.Ing Constantin Stncescu i

    ef lucrri dr.Ing. Corneliu Prvu,

    crora le sunt acum coleg, sper de ndejde,

    dar i studenilor notri ,

    ef lucrri Cristian Doicin,

    Ing. Nicolae Bioaic i

    Drnd. Ing. Mircea Matei

    care ne-au devenit pe rnd colaboratori apropiai i colegi.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    0-2

    Fr ei AutoLISP i AutoCAD n Romnia nu ar fi fost acelai lucru.

    Cursul este dedicat studenilor notri, cu sperana s devin pentru noi ceea ce am devenit noi pentru profesorii notri.

    Calea ctre profesionalism este ntotdeauna dificil, dar este att de frumoas atunci cnd o parcurgem mpreun, profesori i discipoli.

    Programarea este un domeniu de activitate unde spiritul de echip poate conduce la realizri deosebite, dar unde iniiativa personal i ideile originale sunt flori rare ce trebuie cultivate cu grij.

    ncerc de mai muli ani s imprim studenilor care urmeaz acest curs de programare sub AutoLISP principiile de baz ale programrii cu acest limbaj, dar i marea bucurie i plcere a programrii n sine.

    Am avut experiene bune i rele, sentimentul cel mai important pe care pot ns s l mprtesc este acela de satisfacie, pentru atingerea unui prag care mi-a permis o real independen.

    Nu este vorba de a tri ntr-o realitate virtual ci de a reui n cruda realitate nconjurtoare.

    Pentru a programa n AutoLISP nu este nevoie de multe resurse ci de timp, ambiie i putere de munc.

    Sunt attea probleme care ateapt s fie rezolvate, iar rezolvrile nu trebuie s fie sofisticate.

    Chiar cu costuri mici, problemele sunt att de numeroase nct merit s ne apucm odat s le rezolvm.

    Ce este interesant, problemele sunt pentru toi.

    Nu rmne dect s ne apucm de treab.

    Mulumesc deasemenea prietenului meu, Ing. tefan Gingirof pentru sufletul su tnr i profunda aplecare ctre munc i performan n inginerie.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    1-1

    1 Introducere 1.1 Programarea n mediul AutoCAD?

    Orice program CAD care se respect are asociat un limbaj de dezvoltare a unor aplicaii sau funcii noi ce completeaz setul de comenzi native cu comenzi noi scrise de utilizatori.

    Aceste program se scrie de obicei "pe genunchi", este mic i aglutineaz mai multe comenzi, care sunt rulate consecutiv pentru ndeplinirea unui anumit scop.

    AutoCAD are disponibil procedura SCRIPT tocmai pentru a realiza aceste macro-comenzi. Scrii ntr-un fiier cu extensie .scr o succesiune de comenzi AutoCAD cu o anumit regul sintactic , iar cu comanda SCRIPT poate fi rulat acest macrou.

    Comenzile sunt executate n ordinea programat i se obin rezultatele grafice concrete.

    Ce nu poate ns un astfel de mod de lucru este de a calcula nite parametri care s dea o deschidere ntregii maniere de lucru. Ingineria este plin de desene, dar aceste sunt n cea mai mare majoritate expresia final a unui concept concretizat prin calcule. Fiecare problem are un mod specific de rezolvare, uneori necesitnd un calcul laborios, care poate fi fcut doar de un program.

    Principiile programrii calculatoarelor implic existena unui fiier, a ncrcrii unui program coninut acolo i a rulrii sale.

    Rezultatele intermediare sunt stocate n variabile, utilizabile pe tot parcursul rulrii, rezultatele finale fiind afiate pe ecran sau transpuse n fiiere de date.

    Important este n acest moment ct de accesibil este de a scrie un program? Cine l poate scrie i mai ales ct timp este necesar pentru a avea aceste abiliti?

    Un lucru este clar: AutoLISP este cea mai scurt cale prin care se poate scrie un program care s satisfac nevoile imediate ale unui utilizator de AutoCAD.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    1-2

    Acest fapt este n primul rnd posibil datorit faptului c AutoLISP este mereu aproape de AutoCAD, "semper fidelis", deoarece este trup comun cu acesta.

    Cum putem percepe acest lucru?

    Deschidei o parantez "(" n zona de comand i tastai aceast secven:

    Command: (+ 1 2)

    3

    Ai apelat interpretorul de AutoLISP i i-ai comandat s execute un calcul pe care el l-a i efectuat.

    1.2 Ce este un interpretor?

    Un program sau o parte a unui program capabil s primeasc comenzi ale utilizatorului i s le execute.

    Aceast abilitate nu este absolut ci se desfoar n condiiile unei sintaxe i a unei ortografii stricte. Cu alte cuvinte nu poate fi interpretat dect mesajul scris strict n condiiile pe care interpretorul le cunoate.

    Limitrile sunt natural a fi impuse datorit faptului c nu exist un program care s neleag orice comenzi.

    Avem prin urmare de nvat nite reguli fr de care AutoLISP nu ne va nelege i deci nu ne va executa ordinele.

    1.3 Ce este LISP?

    Acest acronim provine de la List Processing (procesare de liste) sau poate de la List Programming (programere de liste).

    Lista este structura fundamental utilizat n programarea cu LISP.

    Lisp este un limbaj de programare la nivel nalt, cel mai bun limbaj cunoscut pentru aplicaii n domeniile inteligenei artificiale, sisteme expert i AutoCAD.

    Lisp este unul din cele mai vechi limbaje de programare. A aprut ca i FORTRAN n anul 1960. Exist n prezent multe dialecte de Lisp, cum sunt: Common Lisp, Franz Lisp, Mu Lisp, X Lisp.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    1-3

    1.4 Ce este AutoLISP?

    AutoLISP este un dialect de lisp, implementat sub AutoCAD, cu urmtoarele disponibiliti:

    Sintaxa este foarte simpl i riguroas. Este uor de nvat modul de evaluare precum i modul de construire a unei expresii.

    Este un interpretor, deci rezultatele calculelor pot fi vizualizate direct n editorul de desenare AutoCAD;

    Interaciunea cu AutoCAD este direct, fr a fi absolut necesar utilizarea unui compilator;

    Este posibil scrierea unor funcii simple, structurate care pot fi combinate n programe complexe;

    Dispune de toate instrumentele necesare programrii structurate i are acces la informaiile coninute n baza de date asociate entitilor AutoCAD.

    1.5 Ce face AutoLISP ?

    Datorit facilitilor oferite n programare, AutoLISP poate fi folosit, n contextul AutoCAD, la dezvoltarea de noi aplicaii, exploatnd editorul grafic puternic al AutoCAD personaliznd i completnd ori de cte ori este nevoie mediul de lucru cu comenzi noi.

    Programele care pot fi dezvoltate pot fi foarte extinse, combinnd comenzi AutoCAD n subrutine extrem de puternice i complexe.

    Adugarea de noi comenzi AutoCAD duce la generarea unor medii speciale CAD care pot s constituie dezvoltri importante ale programului n domenii noi de activitate.

    1.6 Cum acioneaz AutoLISP ?

    Prezena AutoLISP este element standard al AutoCAD, valabil pe oricare din platformele de lucru.

    Interpretorul este ncrcat automat la nceputul sesiunii de editare i este disponibil din acest prim moment.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    1-4

    Funcionarea interpretorului este nepretenioas. Dac s-a instalat AutoCAD i merge, atunci merge i AutoLISP.

    Apelurile AutoLISP sunt posibile doar din cadrul editorului de desenare, accesul fiind disponibil permanent att pe promptul Command: ct i n cadrul unei comenzi.

    1.7 Cunotine preliminare

    Trebuie ca utilizatorul s satisfac urmtoarele cerine :

    s posede cunotine temeinice de AutoCAD; s posede cunotine legate de programare n general; s aib experien n utilizarea fiierelor script i a celor menu; s aib abilitatea de a utiliza un editor de texte tip ASCII

    neformatate ( NE sau EDIT sub DOS, NOTEPAD sub Windows)

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-1

    2 AutoLISP i listele 2.1 Procesarea de liste

    Activitatea central a interpretorului AutoLISP este procesarea de liste, sau altfel spus evaluarea acestor informaii.

    Faptul c ne aflm n editorul de desenare i deschidem o parantez "(" reprezint un eveniment ateptat. AutoCAD cedeaz controlul interpretorului AutoLISP odat cu identificarea acestui simbol. Evenimentul trebuie completat n mod necesar cu "nchiderea" ")". ntre cele dou momente, caracterele scrise pot s mai fie consecutiv i "(" sau ")", cu condiia ca ele s fie "echilibrate" adic fiecrui semn "(" s i fie asociat perechea sa ")".

    Ceea ce se gsete n interiorul acestui cuplu este din punct de vedere informaional o list.

    Parantezele deschise sau nchise i necesitatea echilibrrii lor, constituie o regul de baz n scrierea expresiilor AutoLISP i este totodat de obicei prima regul clcat de utilizator.

    Neechilibrarea parantezelor va duce n mod necesar la apariia unui mesaj care s indice gradul de neechilibrare sau s indice o construcie greit a listei introduse.

    n aceast faz a devenirii sale, programatorul nceptor nu obine rezultatele scontate pn nu depete acest obstacol al mperecherii corecte a parantezelor.

    Pn la procesarea de liste mai este cale lung, utilizatorul este tentat deocamdat s denumeasc LISP ca fiind "Lot of Idiotic Silly Parenthesis" (" o mulime de paranteze idioate i prosteti").

    S avem rbdarea i credina c se va depi aceast perioad.

    Problema neechilibrrii poate fi "salvat" dac folosim un editor "detept" care s introduc automat i paranteza corespunztoare de nchidere sau mcar s ne ofere posibilitatea de a putea verifica aceast coresponden.

    Exerciii:

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-2

    Pe promptul "Command : " al AutoCAD introducei urmtoarele expresii simple:

    Expresie Rezultat

    (+ 1 2) 3

    (- 3 5) -2

    (/ 4 2) 2

    (* 3 5) 15

    2.2 Utilizarea expresiei n cadrul unei comenzi AutoCAD:

    Comenzile AutoCAD poart adeseori un dialog cu utilizatorul, dialog ce urmrete introducerea unei valori. Momentul introducerii poate s nu fie favorabil utilizatorului, valoare ape care urmeaz a fi utilizat nefiind nc calculat.

    Utilizarea unei expresii AutoLISP prin care se poate calcula ad-hoc acea valoare are darul s-l "salveze" pe utilizator de la o pierdere important de timp care se materializeaz printr-o productivitate diminuat.

    Este permis invocarea AutoLISP prin introducerea n acel moment a unei expresii.

    De exemplu, dorim s desenm un cerc a crui raz este 135 15. Vom proceda astfel:

    Command: CIRCLE Specify center point for circle or [3P 2PTtr (tan tan radius)]: 100,100

    Specify radius of circle or [Diameter]:(/ 135 15)

    9

    Cercul a fost desenat, i am obinut i rezultatul evalurii expresiei "9".

    Ori de cte ori avem un calcul de fcut, putem invoca AutoLISP , iar acesta ne va ajuta.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-3

    Salvarea rezultatelor intermediare n variabile cu ajutorul crora s regsim aceste rezultate este accesibil n urma procedurii de atribuire pe care o vom dezbate ceva mai trziu.

    Interogarea valorii unei variabile sau a unei constante anterior definite este posibil datorit unui al doilea semn ateptat de interpretorul AutoLISP i anume semnul "!".

    Apariia acestui semn pe promptul "Command:" urmat de un nume al unei constante sau al unei variabile utilizate dar chiar i al unei expresii conduce al afiarea consecutiv a coninutului acelei informaii interogate.

    De exemplu constanta pi:

    Command: !pi

    3.14159

    sau

    Command: !(+ 1 4)

    5

    Acest semn poate fi folosit chiar i ntr-o comand AutoCAD atunci cnd valoarea dorit este stocat ntr-o variabil anterior calculat.

    2.3 Structura listelor

    Listele sunt informaii complexe, structurate linear sau radicular, mpachetate ntre dou paranteze, una de deschidere, alta de nchidere.

    Elementul cel mai simplu al unei liste, care nu mai poate fi mprit, poart numele de atom.

    Atomii stau ntr-o list ca boabele de ntr-o pstaie, fiecare n alveola sa, fiind ntotdeauna desprite.

    O list poate avea o structur mai complicat, "radicular", dac elementele sale componente sunt la rndul lor liste (subliste).

    O alt imagine asociat unei liste este aceea a unui irag de mrgele n care fiecare mrgic este un atom.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-4

    a. list simpl

    b. list complex

    2.4 Separatori

    Elementele unei liste sunt ntotdeauna distincte iar acest fapt este realizat cu ajutorul separatorilor. Se consider separatori urmtoarele :

    spaiul (blancul) < >; indic nceputul i sfritul unui ir de caractere, deci trebuie s avem grij i cu mperecherea acestora. Omiterea unui semn va altera sensul frazei scrise, tot ceea ce se afl ntre dou astfel de semne fiind interpretat ca ir chiar dac continuarea se face pe cteva rnduri. Eroarea este semnalat fie de funcionarea "ciudat" a programului, fie de depirea lungimii maxime pe care un ir o poate avea (256 de caractere).

    Din punct de vedere informatic, pentru cei familiarizai cu noiunea de pointer, lista poate fi explicat ca o secven de pointeri (adrese de memorie). Acetia sunt grupai perechi, primul fiind ctre o locaie de memorie care conine valoarea cutat, cel de-al doilea fiind pointer ctre elementul urmtor. Cutarea are aadar loc din atom n atom, ultimul element din list avnd un pointer nil, indicnd terminarea listei.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-5

    Parcurgerea unei liste este deci ntrerupt la gsirea unui pointer ctre nil.

    Aceast structur asigur o utilizare eficient a memoriei i n acela i timp o citire rapid a informaiei. Totul este de a genera aceste "iraguri de perle" i a le manevra ct mai eficient.

    2.5 Evaluarea listelor

    Evaluarea unei liste ncepe cu primul element care urmeaz parantezei de deschidere i se desfoar progresiv element dup element. Odat deschis o nou sublist, dac aceasta exist, se iniiaz un proces paralel de evaluare care ia sfrit odat cu epuizarea respectivei structuri. Rezultatul evalurii este un atom de substituie care va fi amplasat n locul sublistei, evaluarea continund pe ramura principal.

    Evaluarea este deci un proces complex, care poate s fie ntrerupt de orice eroare descoperit fie pe ramura principal, fie pe oricare din subliste.

    Mesajul de ntrerupere a evalurii cuprinde n el i locul unde s-a descoperit anomalia, precum i toate listele ce cuprind acel atom.

    O structur complex va genera ntotdeauna un mesaj foarte mare datorit prezenei tuturor listelor ierarhice n care se gsete eroarea.

    n cazul unor versiuni mai vechi de AutoCAD aa cum sunt cele pentru DOS, limitarea afirii mesajului de eroare din cauza efectului ireversibil de scroll va duce la ascunderea nceputului mesajului de eroare ceea ce va face extrem de dificil determinarea exact a tipului de eroare i apoziiei precise a acesteia.

    n aceste cazuri doar o scriere structurat a programelor permite rularea unei anumite poriuni mai reduse din acesta, astfel nct mesajul de eroare s ncap pe ecranul text.

    Oricum nu uitai c vizualizarea ecranului text AutoCAD se poate face cu comanda TEXTSCREEN sau cu apsarea tastei F1 (DOS) sau F2 (Windows).

    2.6 Atomi

    Atomul este tipul cel mai simplu de dat n LISP.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-6

    Pentru a afla dac obiectul este list sau atom, putem s verificm dac este sau nu cuprins ntre paranteze. Dac da, el este o list.

    Se prezint n continuare principalele tipuri de atomi din AutoCAD

    Tip Atom Exemple Tip data AutoLISP

    Simbol pi x mid_pt SYM

    ir de caractere "Viata este frumoas!" STR

    ntreg 1, 2 ,32456, -4567, INT

    Real 1.0, 43.234, -12.345 REAL

    Descriptor de fiier FILE

    Nume de entitate AutoCAD

    ENAME

    Set de selecie AutoCAD PICKSET

    Funcie intern AutoLISP

    SUBR

    Funcie extern

    EXSUBR

    Un tip special de dat este "nil". El este singurul care este simultan i atom i list.

    Formularea sa poate fi fcut fie ca o list vid (), fie ca nil.

    Nil este echivalentul AutoLISP pentru FALSE (fals). Are deci o valoare logic i este testat apariia sa de diferite funcii care opereaz cu valori logice.

    Orice nil nu exist deci este FALSE.

    Este interesant c n AutoLISP nu exist valoarea TRUE. Orice atom sau list care exist, are aceast proprietate (se returneaz T).

    T este o valoare de adevr care nu trebuie alterat.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-7

    Nu folosii niciodat numele formal t pentru o variabil de-a Dvs. Se va altera T i chiar sub unele versiuni de AutoLISP programul nu va putea fi rulat.

    2.7 Funcii

    2.7.1 Structura general a unei funcii

    Scrierea unei funcii la modul general se poate face astfel:

    (nume_functie [[argument1] argument2 argumentN]])

    Semnele "[" i "]" le folosim pentru a semnala faptul c elementele respective sunt opionale, adic funcia poate s aib sau nu argumente iar numrul lor este variabil.

    Putem scrie de exemplu:

    (fct1 arg1 [arg2]) - Funcia poate s aib unul sau dou argumente

    (fct1 [arg]) - Funcia poate s aib un argument sau nici un argument.

    Ordinea argumentelor nu este opional deoarece funciile nu pot fi toate comutative (vezi cazul diferenei sau a mpririi).

    Primul element are o importan crucial n procesul de evaluare. Aceasta deoarece primul element al listei este primul evaluat. Procesul de evaluare caut o coresponden ntre primul element al listei i numele unei funcii AutoLISP.

    Scrierea atomilor n ordinea aceasta are o logic aparte fiind strns legat de procesul de evaluare, deci de logica interpretorului.

    Deoarece interpretorul "ronie " lista bob cu bob, el poate s se atepte la ceva atunci cnd a nghiit numele funciei.

    E ca i cum interlocutorul i "ia vorba din gur" , ceea ce indiscutabil este dovada unui grad de inteligen. Dac vorba urmtoare nu se potrivete, interpretorul i-o reteaz repede. (Asta este chiar obrznicie!)

    Compilatorul este mai politicos, ateapt tot programul, trateaz toate erorile i le servete pe toate.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-8

    Aceast ordine de scriere numit i scriere prefixat a fost inventat de coala polonez de logic (1925 J. Lukasiewicz) i de aceea poart numele de "scriere polonez invers".

    Dei difer de scrierea natural, din punct de vedere logic este mult mai facil a fi folosit n domeniul computerelor i a fost adoptat de prinii Lisp ca regul fundamental.

    Dei noi scriem a + b , n AutoLISP se scrie (+ a b) "aduna pe a cu b"

    Omiterea separatorului ntre primul element i al doilea va conduce la alterarea numelui funciei i implicit la negsirea corespondenei cu tabela de funcii.

    ntr-o prim situaie, avem doar funciile interne SUBR standard. Pe msur ce dezvoltm funcii noi (aceasta este permis n AutoLISP) setul standard este extins cu funciile interne dezvoltate de utilizator, sau ncrcate de acesta din fiiere. Dac numele primului atom nu face parte din setul de funcii prezent iniial sau dezvoltat pe parcurs, mesajul este unul de eroare "bad function" i procesul de evaluare se oprete.

    n cazuri speciale , cnd se dorete ca procesul de evaluare a unei liste s fie "srit" i lista s fie luat ca atare, se poate folosi o scriere special i anume amplasarea n faa listei ce nu trebuie evaluate a semnului "'" (apostrof) ceea ce corespunde unei aa numite "quoted list" sau "list quotat". Acelai efect se poate obine i mbrcnd lista respectiv cu o funcie numit quote.

    Funciile sunt destinate operrii rapide i structurate cu diferite tipuri de informaie, atomi sau liste.

    Clasificarea lor se poate face ntr-o prim faz n funcii standard i funcii ale utilizatorului.

    O a doua clasificare este aceea legat de obiectivul funciei i anume de tipul de operaiune pe care l execut.

    Elementele consecutive primului element sunt argumentele actuale ale funciei. Asupra lor se exercit operaia programat, iar numrul i tipul lor este dictat de definiia funciei. Utilizarea unui numr diferit de argumente sau fiind de tip nepotrivit conduce la apariia unor erori care ntrerup evaluarea funciei. Mesajele de eroare sunt clare n aceste cazuri:

    "too many arguments" sau "too few arguments"

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-9

    "bad argument type"

    Exist funcii definite astfel nct pot s aib un numr variabil de argumente, procesul de evaluare fcnd distincie ntre utilizrile diferite.

    De exemplu funcia care calculeaz arctangenta poate fi scris cu unul sau dou argumente. Exemplele urmtoare sunt echivalente:

    Command: (atan 0.5)

    0.463648

    Command: (atan 1 2)

    0.463648

    n al doilea caz se va efectua automat mprirea primului argument la al doilea, arctangenta fiind calculat rezultatului.

    Alt exemplu:

    Command: (+ 1 2 3 4 5)

    15

    Command: (+ 1 2)

    3

    Funcia de tiprire princ poate avea dou argumente, unul sau niciunul, ea funcionnd n toate aceste cazuri.

    Cunoaterea amnunit a sintaxei i ortografiei funciilor este absolut necesar atunci cnd dorim s scriem programe corecte i s avem productivitate. Erorile fiind ntotdeauna semnalate i urmate de ntreruperea programului, vor duce la prelungirea timpului de testare i deci la productivitate sczut.

    Pe de-alt parte, procesul de nvare este natural presrat cu greeli. Rolul acestor greeli este benefic pentru utilizatorul nceptor, oprirea fiind o bun oportunitate pentru a se nelege cauza apariiei greelii i evitarea comiterii ei pe viitor.

    Se poate spune c toi utilizatorii fac aceleai greeli n acelai moment al devenirii lor.

    Diferena ntre experi i nceptori este msurat pe mai multe coordonate:

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-10

    timp i anume de timpul scurs ntre momentele n care cei doi s-au apucat de programare,

    intensitate a lucrului, atenie, ambiia de a rezolva problemele.

    Acest handicap de profesionalizare poate fi atenuat doar dac programatorul posed ultimele trei abiliti

    Exerciii

    1. Determinai care din obiectele AutoLISP urmtoare este atom sau list:

    Obiect Atom List

    123.1

    "Bun ziua!"

    "0.0"

    ("0.0")

    0

    2. Testai n AutoCAD (prompterul "Command:", utiliznd interogarea "!"):

    Atom Valoare

    23

    "text"

    Pi

    Setq

    x1

    Nil

    3. Cte elemente ar fiecare list?

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    2-11

    Lista Numr de elemente

    (1.0 2.0 3.0)

    (+ 1 2)

    (+ 2 (+ 3 5))

    (+ 1 2 (+ 3 4) 5)

    (+ 1 (+ 2 (+ 3 4) 5))

    ()

    2.7.2 Valorile returnate de funcii

    Este important a se aminti mecanismul prin care funciile cedeaz informaiile procesate.

    Odat un apel iniiat el este natural urmat de evaluare. Rezultatul evalurii este un fel de "ecou" care ntoarce valoarea calculat. Orice funcie AutoLISP are un ecou, iar cunoaterea tipului de dat returnat este vital pentru o expresie compus.

    Ultima operaie executat genereaz un rezultat care este automat repetat ca valoare de retur. De pot construi astfel secvene de apeluri care s preia direct rezultate fr a fi necesar a fi stocate intermediar n variabile dac nu vor mai fi utilizate n cursul programului.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-1

    3 Ce este un program AutoLISP? Un program AutoLISP este o funcie special descris utiliznd

    structuri de programare, capabil a fi apelat din AutoCAD.

    Caracteristic unui program este fie faptul c se execut automat la ncrcarea sa, fie c este apelat prin numele su , i este astfel executat ca o nou comand AutoCAD.

    Programul poate s apeleze la rndul su o serie de funcii (subprograme) fie standard fie dezvoltate de programator.

    Apelul succesiv al diferitelor funcii sau a altor programe este coninut de regul n corpul unei funcii principale numite program principal sau apelant.

    3.1 Cum poate fi definit o nou funcie sau un program?

    Printre funciile AutoLISP exist o funcie special de definire a unor noi funcii. Aceast funcie poart numele de defun.

    Defun

    Sintaxa funciei:

    (defun [C: | S::]nume_fun ( [[arg1] [arg2][argn] / [par1] [par2] [parn]]) .expr1 .exprn)

    Numele este sugestiv, defun , i este evident amplasat pe primul loc

    Prefixele c: sau s:: sunt opionale, dar ele fac diferena:

    Lipsa oricrui prefix va face ca funcia s poat fi apelat doar ca o expresie AutoLISP.

    Command: (nume_fun)

    Prefixul C: semnific posibilitatea de apel direct din AutoCAD ca orice command a acestuia.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-2

    Command: nume_fun

    Adugarea unei noi comenzi reprezint o deschidere formidabil ctre personalizarea AutoCAD, noile funcii fiind apte s creeze o interfa cu utilizatorul, specific fiecrui domeniu de activitate, fiecrei aplicaii.

    Se contureaz n acest moment una din marile disponibiliti ale AutoCAD, aceea de a fi un sistem deschis, deschis ideilor, deschis evoluiei, deschis dezvoltrii.

    Prefixul S:: conduce la un comportament inedit, i anume, funcia va fi automat executat la ncrcare. Trebuie menionat c acest comportament poate fi asociat tuturor expresiilor AutoLISP scrise negrupate ntr-o funcie, expresii care vor fi evaluate imediat ce sunt ncrcate. Diferena este bineneles dat de faptul c funcia cu s:: poate fi apelat consecutiv de un program , pe cnd expresiile izolate rmn "rzlee", nu constituie macrofuncii reapelabile.

    Urmeaz o list ( [[arg1] [arg2][argn] / [par1] [par2] [parn]])

    Evident coninutul acesteia poate fi vid sau n diferte combinaii: Astfel avem urmtoarele posibiliti:

    Varianta Semnificaie Apel

    (arg1 arg2 argn) Funcie de n argumente (nume_fun arg1 arg2 argn)

    () Funcie fr argumente (nume_fun)

    ( / par1 par2 parn) Funcie fr argumente cu variabile locale

    (nume_fun)

    (arg1 arg2 argn / par1 par2 parn)

    Funcie de n argumente cu n variabile locale

    (nume_fun arg1 arg2 argn)

    Variabilele locale sunt "volatile", adic vor fi descrise ntr-o alt zon de memorie, care va fi permanent tears dup terminarea funciei.

    Pot fi deci descrise cu acelai nume formal dou tipuri de variabile, cele globale sau permanente, al cror coninut poate fi pstrat i utilizate de programe succesive, i variabile locale descrise n cadrul unei funcii care mor odat cu executarea ei.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-3

    Este o inspirat alegere, deoarece prin variabilele globale se pot transmite date ntre programe rulate succesiv, iar pe de-alt parte nu este neaprat necesar s folosim un nume de variabil o singur dat ci el poate fi multiplu utilizat prin acest mecanism de variabil volatil.

    Funciile definite de utilizator au n general un numr fixat de argumente. Modul de utilizare al acestora este specific expresiilor interne i de aceea trebuie ca n apelarea funciilor s se respecte att numrul de argumente ct i tipul i poziia lor n apel.

    Interesant este i modul n care se termin o funcie. Valoarea returnat de aceasta este rezultatul ultimei evaluri (a ultimei operaii din cadrul funciei). Rezultatul poate fi nil ceea ce conduce la o valoare logic de false. Multe funcii ns returneaz nil chiar dac au executat ceva. Acest aspect , precum i acela al ecoului ultimei operaii poate fi anihilat prin utilizarea unei funcii care s nu returneze nimic. De exemplu funcia princ de tiprire a rezultatelor, dac este apelat fr argumente produce tocmai acest efect i se recomand a fi utilizat n cazul programelor.

    Pe de-alt parte funciile sunt create pentru a returna valori calculate. Pentru ca aceste valori s fie cu siguran returnate este util ca ultimul atom scris ntr-o list s fie chiar variabila unde a fost stocat valoarea calculat. Aceast indicaie trebuie s se transforme ntr-un automatism de programare.

    Evaluarea funciei este consecutiv apelrii sale, mesajele eventuale de eroare aprnd imediat ce evaluarea este ntrerupt.

    3.2 Ce este atribuirea?

    Atribuirea este unul din mecanismele de baz ale unui limbaj de programare.

    Prin ea se realizeaz memorarea unei informaii.

    Primele calculatoare aveau un numr fix de celule de memorie asociate unui numr i care odat epuizate limitau evaluarea corect a programelor. Trebuiau fcute diferite "jonglerii" pentru a nu se depi numrul fix de memorii.

    Calculatoarele moderne pot s creeze n memorie adevrate impresionante mulimi de date. Acestor date, pentru a putea fi identificate li se asociaz de obicei nite nume. Datele, constante sau

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-4

    variabile sunt astfel asociate acestor nume care pot fi utilizate n expresii formale sau formule de calcul.

    Numrul lor este evident limitat, ns practica a artat c, odat cu dezvoltarea programelor i a computerelor, capacitatea de stocare a acestor variabile crete mult i practic, n acest moment, cel puin pentru AutoLISP, aceste limitri nu pot constitui grave impedimente, mai ales datorit anvergurii specific limitate a acestor programe.

    AutoLISP este un interpretor, deci este mai lent n procesul de evaluare dect programele compilate, iar lucrul cu multe variabile i cu volum de date extrem de mare va conduce la programe "lenee". Alegerea corect a domeniului aplicaiei va conduce la rezolvarea cu AutoLISP a unor probleme mici, dar extrem de diverse, fr a se atinge o limit din punct de vedere al utilizrii memoriei.

    Un simplu mod de scriere

    a=12

    are semnificaia de a pstra n variabila a valoarea 12.

    Aceasta este o atribuire simpl a unei valori constante 12 care poate fi ns oricnd nlocuit cu rezultatul unei formule mai complicate sau cu o structur de date.

    n AutoLISP exist dou funcii speciale care permit atribuirea:

    Funciile setq i set

    Setq

    Sintaxa :

    (setq var1 val1 var2 val2 var n valn)

    Funciile de atribuire admit ntotdeauna un numr par de argumente. Ele formeaz perechi constituite de nume de variabile i valori de atribuit acelei variabile. Valoarea poate fi nlocuit de o expresie formal care s conduc prin evaluare la valoarea de atribuit.

    Neconstituirea integral a unei perechi va conduce la un numr impar de argumente ceea ce va fi semnalat ca eroare. Evident o omisiune dubl poate s nu fie considerat eroare de numr de argumente, dar poate s conduc la o alt eroare.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-5

    set

    Sintaxa :

    (set var2 var1)

    Funcia set este mai special, ea fcnd doar o referire la o alt variabil var1, fr a mai rezerva memorie pentru coninutul lui var2. Este ca un alias (nume substitut) al lui var1.

    n momentul n care exist astfel de legtur stabilit ntre dou variabile, setarea ulterioar a uneia va fi automat perceput i de cealalt.

    Funcia set admite doar dou argumente. Procesul de evaluare fiind omniprezent, pentru anihilarea sa este utilizat de obicei funcia quote sau prefixul '.

    Pentru o atribuire simpl, fr alias, se folosete funcia setq , adic "set quote".

    n acest context sunt echivalente urmtoarele sintaxe:

    (set 'a 23) i (setq a 23)

    Pentru utilizarea setrii prin alias se folosete urmtoarea Sintaxa:(setq a 6)(set b a) rezult atribuirea valorii 6 i pentru a.

    n marea majoritate a cazurilor se folosete setq i din cauza posibilitii atribuirilor mai multor perechi ntr-un singur apel al funciei.

    Funciile set i setq creeaz i modific variabilele globale sau, dac sunt apelate ntr-o funcie unde sunt declarate variabile locale le creeaz i le modific local.

    Este esenial a se aminti c atribuirea este una din uneltele de baz n orice program i c pstrarea i valorificarea rezultatelor intermediare nu este posibil fr acest proces.

    3.3 Structuri de programare

    Programarea are o serie de principii care se regsesc n cadrul oricrui limbaj de programare. Ele pot fi simbolizate distinct, formnd schema logic a programului.

    Vom enumera n continuare aceste elemente:

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-6

    Secvena este o structur format din una sau mai multe instruciuni care se execut una dup cealalt fr a fi necesar oprirea.

    De exemplu citirea de date cu iniializare a variabilelor utiliznd procedee diverse de obinere a acestora : prin dialog , din fiiere , din blocuri de date.

    Decizia este o structur prin care se execut o secven sau alta n urma unui test logic.

    Alte structuri de programare sunt derivate din acestea.

    AutoLISP nu are n vedere structuri de tipul salt condiionat sau necondiionat, datorit specificitii procesului de evaluare.

    Evaluarea unui program se face top-down, cu ocolirea unor instruciuni n cazul apariiei unor decizii sau cu iterare n cazul unor cicluri.

    Orice program poate fi exprimat printr-o schem logic bazat pe structuri de programare.

    Organizarea unei aplicaii complexe impune o abordare sistematizat, o divizare a programului pentru o mai uoar scriere i depanare.

    S nu excludem posibilitatea ca anumite pri ale unui program sunt repetabile de la o aplicaie la alta sau constituie chiar un "nucleu" al oricrei aplicaii.

    Modularizarea aplicaiilor conduce aadar la o minimizare a efortului global de programare i la poteniale economii substaniale de timp i alte resurse.

    Un modul gata testat este utilizabil integral n contextul altei aplicaii i elimin necesitatea testrii ulterioare a acestuia.

    Sunt astfel excluse apariia unor erori altele dect cele legate de utilizarea unor tipuri inadecvate de date sau liste cu structuri diferite de cele acceptate de program.

    Structurile oricrui limbaj de programare sunt completate cu funcii sau subprograme care prin abilitatea programatorului de a le apela conform algoritmului conduc la rezolvarea problemei propuse.

    n tabelul urmtor sunt prezentate principalele structuri de programare, prezentate sub forma de scheme logice (flow chart).

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-7

    Agregarea acestor simboluri de baz permite generarea schemelor logice complexe care pot ilustra seciuni importante de programare.

    Secvena Decizia Iteraia

    3.3.1 Secvena

    Am vzut c expresiile AutoLISP pot fi lansate ntr-o succesiune , constituindu-se ntr-o secven.

    Gruparea acestora ntr-o singur expresie complex se face utiliznd funcia de agregare progn.

    Progn

    Sintaxa:(progn expr1 expr2 exprn)

    Aceasta conduce la considerare expresiilor componente ca fcnd un corp unic, indivizibil.

    3.3.2 Decizia

    Decizia sau testul este o structur de programare care produce ramificarea unui algoritm.

    O variabil testat poate conduce la un rspuns T (adevrat) sau nil (fals)

    Tratarea rspunsului poate conduce la executarea unei secvene sau a alteia.

    AutoLISP folosete ca funcie test de baz funcia if

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-8

    If

    Sintaxa:(if test expr1 expr2)

    dac rezultatul testului este T se execut secvena 1 altfel (nil) secvena 2.

    n cazul n care expresiile 1 i 2 sunt formate din mai multe instruciuni, acestea se agreg cu ajutorul funciei progn.

    Numele funciei decizie n AutoLISP, if, este n general consacrat n limbajele de programare i deci se consider ca fiind uor de reinut.

    3.3.3 Decizia multipl (case)

    Exist momente cnd ramificarea programului este multipl. Evident putem efectua aceste ramificri folosind decizii simple n cascad, ns o structur specializat de ramificare multipl parc este necesar.

    n alte limbaje de programare exist un tip de structur botezat case. Acest tip va produce o serie de teste consecutive care ndeplinite vor conduce aplicaia pe ramura respectiv.

    Fiind vorba de primul test gsit adevrat, celelalte teste, consecutive acestuia nu vor mai fi evaluate, ceea ce conduce la unele probleme. Este vorba de existena unei probabiliti ca unele ramuri de program s nu fie parcurse niciodat datorit existenei unei expresii test, s le zicem "banale", care este validat sistematic i conduce executarea cu precdere a unei ramuri.

    Greeala nu este de sintax ci de logic a programului, fiind de tipul erorilor sistematice produse de un automatism de gndire.

    Programatorul poate s evite aceste capcane prin experien sau prin analiza rezultatelor programului n procesul final de testare a aplicaiei.

    Deoarece AutoLISP este i un bun limbaj de dezvoltarea sistemelor expert, cunoaterea acestei particulariti de programare este benefic.

    Structura case este reprezentat n AutoLISP de funcia cond.

    Cond

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-9

    Sintaxa:(cond ((test1 secventa1)(test2 secventa2)(testn secvenan)))

    Se observ c argumentul funciei este o list compus din subliste ce conin perechi test-secven.

    Secvenele parcurse fiind posibile apeluri de subprograme , se produce acea ramificare car poate s fie temporar pentru a trata diferite formule de calcul sau definitiv, fr a se mai unifica ramurile.

    Structura este deosebit de interesant i de eficient , avei ns grij cu testele banale.

    3.3.4 Cicluri

    Puterea deosebit a unei aplicaii este de a repeta fr s oboseasc un volum mare de operaii.

    n limbajul programatorilor acestea se numesc iteraii sau bucle sau cicluri.

    Aceast ciclare, asemntoare unui vrtej care local n program ncepe a se nvrti i repeta o secven poate avea scopuri multiple.

    Cteodat ciclul este doar o metod de a se ntrzia programul.

    De exemplu scriem un program care s cronometreze ceva. Evident c trebuie s crem o legtur ntre ceasul intern al computerului i contorul intern al programului. Dac facem apel la funcii ce pot accesa ceasul computerului este ok. n AutoLISP ns nu avem sunt aceste funcii. Putem crea un ciclu cu un numr fixat de iteraii unde s repetm o secven de operaii benigne de un numr de ori, s vedem ct timp ocup aceste iteraii i ulterior s potrivim acest numr de iteraii ca s produc un efect de ntrziere similar cu un interval de timp.

    Alteori avem de repetat o secven n vederea minimizrii unei erori de calcul.

    n acest caz, este posibil s efectum o rezolvare iterativ a unei ecuaii, validarea soluiei fiind testarea erorii prin nlocuirea n ecuaie. Condiia fiind ca eroarea s fie mai mic dect eroarea acceptat, dup un numr de iteraii se produce ntreruperea ciclului.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    3-10

    Ceste dou tipuri de probleme conduc la dou structuri de tip ciclu diferite.

    Prima, cu repetarea strict a unui numr de iteraii este de tip REPEAT. Ieirea din acest ciclu se face la epuizarea iteraiilor programate.

    A doua, cu efectuarea unui test de prsire a ciclului este de tip WHILE dac testul este iniial, sau de tip UNTIL, dac testul este final.

    AutoLISP are cicluri pentru ambele tipuri de probleme, structuri materializate prin funciile repeat i while.

    O problem crucial n cazul ciclului de tip while este aceea a ntreruperii ciclului. Condiia testat cuprinde o variabil care este de dorit a fi modificat n corpul ciclului pentru a se modifica valoarea de adevr a testului.

    Dac rezultatul este T sistematic, ciclul devine infinit, programul executnd la nesfrit secvena programat.

    Prsirea ciclului se poate face n acest caz doar cu ntreruperea de la consol cu ESC sau cu CTRL C, ceea ce conduce la ntreruperea rulrii ntregului program.

    n general ciclurile infinite nu sunt urmrite a fi programate, dar cine tie ce idee v vine aa c ai aflat cum se fac. Uneori o mod eronat de programare (cel cu ciclu infinit) poate fi un comportament cutat.

    De exemplu putem s amplasm un ciclu capcan n programul nostru care dorim s fie utilizat doar de un numr fixa de ori sau doar pn la o anumit dat, aa nct dup expirare s funcioneze extrem de lent, suficient de enervant pentru a se plti urmtoarea rat (asta dac nu dorim s se ntrerup brusc cu un mesaj de avertisment).

    Repeat

    Sintaxa:(repeat nr secventa)

    While

    Sintaxa:(while test secventa)

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-1

    4 Cum se scrie , se ncarc i se execut un program

    Am vzut c pe promptul Command: se poate introduce i evalua o expresie AutoLISP. Procedeul este accesibil, dar se rezum la scrierea unui numr limitat de expresii, iar acestea nu pot fi repetate dect prin rescrierea lor. Exist posibilitatea apelului unei instruciuni anterioare prin apsarea sgeii n sus, dar acest lucru este valabil doar la versiuni de AutoCAD mai noi dect R14 inclusiv.

    Cu alte cuvinte, scrierea unei ntregi aplicaii n acest mod este nu numai neplcut dar i practic imposibil de realizat.

    Trebuie fcut apel la utilizarea unui editor de texte care s ne permit tehnoredactarea programului.

    Principala caracteristic a editoarelor de texte destinate scrierii programelor este faptul c genereaz un cod ASCII care s poat fi preluat de interpretor fr a fi presrat cu semne speciale care s-l dezorienteze.

    Pentru accesibilitatea sa, prezint n continuare principalele caracteristici ale editorului NE.com , utilizat n special pe calculatoarele care lucreaz sub DOS.

    4.1 Editorul de texte NE

    Acest editor de texte foarte compact (aprox 30 Kb) care se gsete n pachetul Norton Utility este foarte potrivit pentru utilizare sub AutoCAD (versiunile de DOS)

    Deschiderea unui fiier la iniializare se face cu comanda DOS

    >NE nume.ext

    Apare imediat un ecran de info care poate fi depit prin apsarea oricrei teste, sau prin care se poate apela direct Help-ul cu tasta F1.

    Odat intrai n editor, cursorul se amplaseaz stnga-sus de unde putei ncepe scrierea programului.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-2

    Deplasarea cursorului

    La baza ecranului se prezint o linie de informaii privind poziia cursorului, numele fiierului n care se lucreaz, modul de lucru (insert sau replace) lungimea maxim a liniei (wrap) de la care textul va avansa automat pe rndul urmtor cu pstrarea cuvintelor ntregi.

    Cursorul este prezent i poate fi deplasat odat ce textul capt consisten folosind tastele cu sgei. Apsnd simultan tastele stnga-dreapta avansul se face cuvnt cu cuvnt.

    Tastele Home i End permit deplasarea cursorului la nceputul, respectiv sfritul liniei curente. Combinarea acestora cu tasta Ctrl va produce deplasarea la nceputul sau sfritul fiierului.

    tergerea

    Orice nceptor face greeli, deci trebuie nvat cum poate face corecturi.

    Pentru tergerea caracterului anterior se apas backspace iar pentru cel curent Delete.

    tergerea cuvntului :

    anterior CTRL-W ; urmtor ALT-W.

    tergerea ntregii linii ALT-K sau pe buci

    cea dinainte de cursor CTRL-L ; cea dup cursor ALT-L.

    tergerea unui bloc marcat, apel succesiv F4 - D

    Readucerea ultimului lucru ters se poate face cu CTRL-U

    Avem de nsuit o serie de comenzi importante necesare utilizri eficiente a editorului de texte.

    Apelul acestora se face n succesiune (consecutiv) i sunt expresia lucrului n diferite moduri setate de prima tast din combinaie.

    Modul file activat cu prefixul F3:

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-3

    F3 E salveaz fiierul curent i prsete editorul

    F3 S salveaz fiierul curent i rmne n editor(salvare intermediar)

    F3 X deschide o nou fereastr n care poate fi afiat coninutul unui alt fiier

    F3 W transcrie n poziia curent coninutul unui bloc marcat

    Modul bloc activat cu prefixul F4

    F4 S Marcheaz nceputul i sfritul unui bloc printr-un ptrat situat n poziia curent a cursorului

    F4 L marcheaz lina curent ca bloc

    F4 E marcheaz ca bloc poriunea din linia curent pn la sfritul ei

    F4 R elimin marcajele de bloc

    F4 D terge blocul curent

    F4 C copiaz blocul curent n poziia curent a cursorului

    F4 W copiaz blocul curent n alt fereastr deschis anterior n poziia cursorului

    F4 M mut blocul marcat n poziia indicat de cursor

    F4 F gsete urmtorul marcaj de bloc

    De observat c la un moment dat nu poate fi definit mai mult de un bloc

    Marcajele pot fi terse ca orice caracter, dac poziia lor a fost greit aleas.

    Controlul afirii pe ecran

    Trecerea la rndul urmtor de text scris se poate face automat atunci cnd se depete n scris lungimea setat a rndului, cu pstrarea integritii ultimului cuvnt (de obicei separatorul spaiu este cel care este recunoscut ca separator de cuvinte).

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-4

    Cnd dorim s trecem voit la alt linie de text se apas Enter

    Setri ale afirii se fac cu urmtoarele comenzi:

    F5 L seteaz lungimea liniei pentru WrapWord (WW)

    F5 W Dezactiveaz/activeaz WW

    F5 F Formateaz un paragraf conform setrii curente WW

    F5 T fixeaz saltul de tabulare Tab

    F5 C comut cursorul din mare/mic clipitor/static

    F5 D seteaz succesiv culorile ecranului

    F5 I comut pe modul indent on/off (amplasarea cursorului dup Enter pe poziia primului caracter nonblanc din linia anterioar

    F5 K seteaz funcionarea tastelor tab i INS

    F5 S salveaz starea curent a editorului

    Controlul tipririi

    Setri ale tipriri se fac prin urmtoarele comenzi:

    F7 P tiprete la imprimant tot textul

    F7 B tiprete la imprimant blocul curent marcat

    F7 E salt la pagina urmtoare (FormFeed)

    F7 S fixeaz mrimea paginii tiprite

    F7 M fixeaz marginea din stnga

    Comenzi suplimentare

    F1 help

    F2 afiare stare curent a editorului

    F9 shell (comutare temporar n sistemul de operare; revenire cu EXIT)

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-5

    Comenzi cursor

    F6 INS seteaz mod nlocuire dac a fost nlocuit cu F5 K INS

    F6 G cere numrul linei de repoziionare a cursorului

    F6 M testeaz mperecherea parantezei pe care se gsete cursorul (semnele pereche testate sunt ( ) { } [ ] < >)

    F6 T testeaz diferenele ntre dou texte situate n ferestre diferite ncepnd cu poziiile curente ale cursorului

    Comenzi cu CTRL i ALT

    Acestea trebuie descrise prin apsarea simultan a tastelor respective

    CTRL V comut caracterele de la nceputul linie pn la cursor n majuscule minuscule

    CTRL P prefix care permite introducerea imediat a unui caracter special

    ALT V comut caracterele de la cursor pn la sfritul liniei n majuscule minuscule

    CTRL U readuce ultimul lucru ters

    ALT F cere un text ce va fi cutat n jos

    CTRL F cere un text ce va fi cutat n sus

    ALT C continuarea cutrii n jos a textului

    CTRL C continuarea cutrii n sus

    ALT F Cutare i nlocuire n jos se apas ALT F de dou ori o dat pentru introducerea textului de cutat a doua pentru textul nlocuitor

    CTRL F Cutare i nlocuire n jos se apas ALT F de dou ori o dat pentru introducerea textului de cutat a doua pentru textul nlocuitor

    ncheierea comenzilor de cutare i cutare cu tergere

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-6

    ncheierea cu Enter va produce cutarea exact a caracterelor introduse,

    ncheierea cu ESC va cuta textul care conine combinaia de text modificat prin majuscule sau minuscule

    La gsirea irului se ateapt rspunsul privind validarea nlocuirii

    Y- execut nlocuirea N - nu execut nlocuirea * - execut toate nlocuirile n sensul ales (ALT sau CTRL) blanc - abandon comand

    Sunt destul de multe comenzi dar nu trebuie s ne sperie acest lucru. Toate aceste faciliti exprimate prin comenzi ne vor fi utile mai devreme sau mai trziu.

    Nu trebuie memorate pe dinafar ci scrise pe o hrtiu sau mai bine ntr-o agend de lucru de unde le putem consulta cnd avem nevoie de o anumit comand pn cnd le vei utiliza suficient de mult ca s nu mai fie nevoie de consultarea lor.

    Editoarele sub Windows posibile a fi utilizate trebuie setate pe non-document astfel nct salvarea textelor s fie de tip ASCII.

    Un editor foarte simplu este Notepad, el satisface condiiile nondocument i n plus tehnica ferestrelor ne permite s nu prsim editorul, salvarea intermediar a corecturilor fiind suficient pentru a putea rencrca fiierul modificat.

    Activarea ferestrei editorului poate fi fcut consecutiv testrii programului pentru corectarea eventualelor erori.

    4.2 Elementele unui program AutoLISP

    Structura programului este constituit din blocuri i trebuie s fie cea mai simplu posibil rezolvare a problemei de programare.

    Trebuie avute n vedere urmtoarele aspecte:

    Problema complex trebuie spart n module mai mici, dar nu trebuie depit o anumit limit de la care problema nu mai este uor de cuprins.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-7

    Aceste module numite n continuare funcii pot fi apelate n ordinea cerut de algoritm, dar constituie nite crmizi eseniale i n rezolvarea altor probleme ulterioare. Identificarea posibilitii ca o funcie s mai poat fi utilizat ulterior i confer programatorului un cmp lrgit de manevr n abordarea altor probleme de programare.

    Aceste funcii pot fi scrise oriunde n corpul fiierului programului, ns este de preferat ca ele s precead programul principal.

    Sunt de identificat mai multe pri ale programelor:

    Header-ul programului Declaraii Funcii (proceduri) Programul principal n header-ul programului sunt scrise titlul , eventualele

    explicaii, data scrierii lui, informaii depre autor.

    n zona de declaraii se nscriu pe rnd numele variabilelor folosite precum i semnificaiile acestora i tipul de dat pe care l au n utilizare.

    Informaiile din aceste dou zone vor fi precedate la nceputul fiecrui rnd de semnul ; (punct i virgul), acesta desemnnd ca tot ceea urmeaz s fie considerat ca un comentariu.

    Comentariile iniiale n aceste dou zone ale programului sunt deci opionale, dar semnificative din punct de vedere al ordonrii activitii programatorului.

    Variantele de program vor putea fi astfel identificate cronologic i utilizate ulterior.

    Evident c nu ntotdeauna vom putea s furnizm toate aceste informaii aa nct ele pot s lipseasc.

    n zona de funcii vor fi descrise procedurile create special pentru programul conceput.

    Fiecare funcie este n fapt un subprogram i vor fi necesare o serie de comentarii care s ne readuc aminte ce tip au i ce fac diferitele variabile folosite.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-8

    Programul principal cuprinde o apelare logic a funciilor descrise anterior. n acest moment sunt folosite de obicei i instruciuni de tiprire a rezultatelor.

    Spre deosebire de limbajul BASIC de exemplu, unde ordinea de evaluare este dat de numerotarea fiecrei fraze scrise, aici ordinea este dat de succesiunea n care aceste fraze au fost scrise.

    Un program bun trebuie s satisfac anumite cerine suplimentare:

    Funciile s nu dea erori chiar i pentru valori extreme Programul s fie bine documentat, S fie construit cu atenie astfel nct funcionarea s fie lin i

    rapid

    Utilizatorul programului s aib o interfa de lucru simpl i eficient.

    4.3 Scrierea indentat

    Utilizarea unui editor de texte permite scrierea unor programe lungi i complicate.

    Am vzut anterior c partajarea unui program are efecte benefice prin modularizarea aplicaiilor, respectiv posibilitatea de a refolosi funcii n cadrul diferitelor aplicaii.

    Chiar n cazul scrierii unei funcii simple, scurte, posibilitatea de a grei este prezent. Nu faptul n sine al greelii este suprtor ct timpul consumat pentru corectarea ei.

    Refolosirea unui modul deja corectat i validat anterior duce la scurtarea considerabil a timpului de elaborare a unei aplicaii. Termenele nu sunt niciodat prea ndeprtate i de aceea trebuie s fim foarte "vioi" cnd scriem un program.

    Un modul nou nu este niciodat o "piatr uoar". Trebuie s avem o metod de a-l scrie astfel nct s ne fie uor de depanat.

    Scrierea codului programului este un moment prezent permanent n activitatea programatorului

    Suntem nevoii a apela la metode speciale de scriere pentru a asigura o citire rapid i logic a codului, o metod de evaluare vizual

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-9

    care s ne permit distingerea unor eventuale erori de sintax sau de ortografie.

    Timpul necesar corectrii greelilor de acest tip este neproductiv i de aceea trebuie eliminat.

    Un program AutoLISP este o list, deci teoretic el poate fi scris la rnd, atom cu atom pe un singur rnd att ct ne permite editorul

    Economia de spaiu pe care o facem este copios anihilat de ilizibilitatea programului.

    Textul pe care l scriem este o secven de instruciuni care au fiecare niveluri diferite de semnificaii.

    Scrierea cap la cap duce inevitabil la uniformitate i denot o lips de organizare.

    Se propune n ceea ce urmeaz o pledoarie pentru nuanarea codului scris prin poziia difereniat a semnelor utilizate astfel nct codul scris s fie mult mai citibil.

    Elementul central al acestei maniere de scriere este indentarea.

    Indentarea

    Noiunea este frecvent folosit n tehnoredactarea computerizat, ea desemnnd o anumit distan setat fa de marginea zonei de scriere, asociat de obicei paragrafelor, zon care are menirea de a sublinia prioritatea unui paragraf fa de altul prin faptul c este mai apropiat de marginea de scriere.

    n scrierea unui program AutoLISP, primul element din program este o parantez care deschide lista i natural ea va avea poziia prioritar cea mai aproape de margine.

    Consecutiv acesteia este primul atom care am vzut, este decisiv n procesul de evaluare. Dac definim o funcie nou am vzut c cuvntul cheie defun este acest atom prioritar i va fi urmat de numele funciei i de eventuala list de argumente i variabile locale.

    Acesta trebuie s formeze primul rnd al codului unei funcii, ceea ce urmeaz fiind o secven ce va trebui parcurs.

    S ncercm s dm o structur de funcie-program care s exemplifice diferite moduri de scriere indentat utilizabil ca model n programele dvs.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-10

    ; descriere a structurii generale a unei funcii AutoLISP

    ; Autor : *** Data: *****

    ;

    ; Variabile locale

    ; a1 INTEGER

    ; a2 STRing

    ; a3 REAL

    .

    (defun functie_noua ( a b c / a1 a2 a3)

    (setq a1 5

    a2 "bebe"

    a3 123.5

    ); end setq

    (if (= x a1)

    (progn

    .

    ); end progn

    (progn

    ); end progn

    );end if

    (while (

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-11

    Scrierea comentariului ";" la sfritul fiecrei liste semnificative are o conotaie organizatoric prin faptul c ne ateptm a structura folosit s se ncheie n acea poziie.

    Verificarea mperecherii parantezelor, aa cum am vzut anterior c este posibil, ne va confirma sau nu aceste ateptri.

    Programatorul versat nu are nevoie de aceste comentarii, mai ales dac nu are timp de pierdut.

    Este totui de dorit ca programele s fie mpnate cu astfel de comentarii pentru a le face uor de citit i de depanat.

    Alinierea parantezelor este i ea semnificativ, lista care urmeaz logic pe rndul urmtor, component a unei structuri fiind indentat cu dou spaii.

    nchiderea parantezelor se face fie pe poziia parantezei omoloage deschise, fie imediat sub ultima structur.

    Jocul acesta de expresii cu evidenierea semantic va conduce la o redactare util a programului.

    Seciunile auxiliare ale programului, referitoare la header, informaii despre variabilele utilizate, prezentate anterior au importana lor n construcia unui program citibil i reutilizabil.

    n general, programatorii uit odat cu trecerea timpului s respecte o parte din aceste indicaii, poate din comoditate, dei cer programatorilor nceptori s-i pstreze zelul de ordonare a codului.

    Nu uitai c o vorb popular spune "S faci ce zice popa, nu ce face popa!".

    4.4 ncrcarea unui program

    Un program rezident ntr-un fiier trebuie ncrcat pentru a putea fi rulat.

    ncrcarea se poate face n mai multe moduri:

    Cu ajutorul funciei AutoLISP load Din meniu cu ajutorul comenzii meniu "Applications" Automat la pornirea editorului grafic AutoCAD

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    4-12

    Load

    Funcia de ncrcare load

    Se poate apela din editorul grafic folosind urmtoarea sintax:

    Command: (load "Fiier")

    "Fiier" esute un ir care poate avea urmtoarele ipostaze:

    Sir Semnificaie

    "nume_fisier" Fiierul este cutat n directorul curent avnd asumat prezena extensiei .lsp

    "nume_fisier.ext" Permite ncrcarea unui fiier avnd orice extensie

    "cale\\nume_fisier" se poate ncrca calea de ncrcare atunci cnd fiierul este rezident altundeva dect n directorul de lucru sau n afara cilor cunoscute de AutoCAD

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-1

    5 Prezentarea principalelor clase de funcii AutoLISP

    Funciile AutoLISP, extrem de numeroase, sunt n general prezentate n manualele de programare ntr-o dispunere ordonat alfabetic.

    Acest mod de prezentare este foarte util n ideea prezentrii sub forma de index, regsirea unei funcii fiind rapid i eficient.

    Analiznd din punct de vedere al utilizrii acestor funcii, al tipului de date utilizate, putem avea surpriza ca funcii foarte strns legate n utilizare s le gsim la mare distan i s nu putem face o legtur mental n utilizarea lor.

    Am ales calea de loc uoar de a prezenta clase de funcii AutoLISP, ordonndu-le firesc dup gradul lor de utilizare.

    S nu uitm c funciile se "nmulesc" de la o versiune la alta de AutoCAD, fie prin dezvoltrile funciilor standard, fie prin funcii definite de utilizator.

    Este necesar a alege funciile eseniale, perene, ce se vor regsi n toate variantele de program, astfel nct s putem concepe programe care s funcioneze n toate situaiile.

    Este vorba de a explica faptul c funciile standard AutoLISP se constituie ntr-un nucleu ce va putea susine elaborarea oricrei aplicaii.

    n cele ce urmeaz vor fi prezentate funcii specifice nucleului de programare sub AutoCAD R13, funcii care se regsesc prezente i n versiunile ulterioare.

    5.1 Funcii care opereaz cu numere

    Calculele numerice sunt permanent prezente ntr-un program de proiectare asistat. Formulele inginereti abund de calcule i nlocuiri dintr-o formul n alta.

    Asamblarea funciilor ntr-o formul complex reprezint o piatr de ncercare pentru programatorul nceptor.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-2

    Cunoaterea facilitilor oferite de atribuirea rezultatelor unei variabile intermediare fac s se simplifice efortul de generare a unei formule complicate.

    Tipurile de date numerice acceptate sunt REAL i INTEGER, diferena dintre ele fiind dat n principal de mrimea spaiului de memorie alocat pentru fiecare tip.

    Numerele ntregi necesit pentru reprezentarea lor 32 de bii Intervalul de reprezentare este deci ngrdit pentru numere ntre -2147483648 i 2147483647.O depire a acestor limite nu conduce la un mesaj de eroare ci la un rezultat eronat.

    Un real reprezentat n dubl precizie ocup un spaiu mai mare dect un ntreg i sunt de aceea mai dificil i mai lent de manipulat. Numerele reale sunt adeseori utilizate ca valori aproximative i nu ca numere exacte, aceasta datorit reprezentrii lor. Sunt dou moduri de reprezentare:

    cu virgul fix : 3.456212 (AutoLISP afieaz primele 6 zecimale)

    cu virgul mobil: 10.5678E8 (E8 = 108) Punctul zecimal trebuie folosit ntre cifre pentru a fi corect

    interpretat (punctul mai are i alt semnificaie aceea de separator ntr-o pereche cu punct)

    Numerele sunt folosite sub forma de constante utilizate n calcul, dar i ca argumente ale funciilor care opereaz cu ele.

    Funciile accept argumente numerice ntregi sau reale , rezultatul fiind ns o consecin a tipului de dat introdus.

    Cnd apar argumente de tipuri diferite, reale i ntregi, rezultatul este convertit ntotdeauna la un real.

    Cnd utilizm o funcie cum este extragerea rdcinii ptrate, rezultatul este automat un numr real i acest lucru este caracteristic mai multor funcii numerice care au un singur argument, chiar dac argumentul folosit este un ntreg.

    Principalele funcii numerice.

    Funcii operatori aritmetici:

    +

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-3

    Funcia de adunare

    Sintaxa:(+ arg1 arg2 [arg3 argn])

    Exemplu: (+ 1 2 4) -> 7

    -

    Funcia de scdere sau schimbare de semn

    Sintaxa:(- arg1 [arg2 .argn])

    Exemple:

    (- 3 1) -> 2

    (- 3) -> -3

    *

    Funcia multiplicativ (nmulire)

    Sintaxa:(* arg1 arg2 [arg3 .argn])

    Exemplu: (* 2 2) -> 4

    /

    Funcia mprire

    Sintaxa:(/ arg1 arg2 [arg3 argn])

    echivalent cu (/ arg1 (* arg2 arg3 argn))

    Se observ c admit un numr indefinit de variabile, nu mai puin dect dou, cu excepia funciei de scdere, unde un singur argument semnific schimbarea semnului sau scderea argumentului din 0.

    Se practic convertirea automat a rezultatului dac cel puin un argument este numr real. Dac toate argumentele sunt ntregi, rezultatul este un ntreg.

    Rezultatul mpririi a dou numere ntregi este deci un ntreg, i anume partea ntreag a rezultatului exprimat n numere reale.

    Acest fapt conduce la propagarea unei erori de calcul practic dificil de evitat dac este vorba de un rezultat intermediar.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-4

    Evitarea pentru mprire a folosirii numerelor exclusiv ntregi duce la anihilarea acestui comportament. Dac mprim ns dou variabile, este dificil de tiut dac sunt ambele ntregi.

    Disciplinarea scrierii programului prin afectarea spaiului de declarare a variabilelor i a tipului lor, precum i folosirea unui nume o singur dat ntr-un program, fr a-l reutiliza pentru atribuiri consecutive cu tipuri diferite de date, poate s duc la evitarea propagrii unor asemenea erori de calcul practic dificil de depistat, numai n prezena unor seturi de rezultate de referin.

    Pentru convertirea unui numr ntr-un numr real, mai ales atunci cnd este vorba de valori ntregi ascunse n apatele unor variabile se utilizeaz funcia float.

    Float

    Funcie de conversie ntreg-real.

    Sintaxa: (float a)

    Exemplu: (setq a 1) -> 1

    (float a) -> 1.0

    Funcii trigonometrice

    Aceste funcii sunt extrem de utilizate n calculele inginereti. Avem precum se tie de a face cu funcii trigonometrice directe i funcii trigonometrice inverse.

    Diversitatea funciilor trigonometrice utilizate n calculele practice este mare, ns ele au o caracteristic , sunt unele funcii care pot fi deduce din funcii trigonometrice simple prin formule trigonometrice.

    Funciile trigonometrice directe de baz sunt sinus i cosinus. Ele admit ca argumente unghiuri exprimate n radiani. n AutoLISP acest fapt este axiomatic, aa nct utilizatorul este avertizat.

    sin

    Sintaxa: (sin x)

    (sin 0.0) -> 0.0

    cos

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-5

    Sintaxa: (cos x)

    (cos 0.0)-> 1.0

    AutoLISP pune la dispoziia utilizatorului o constant trigonometric pi.

    Cu ajutorul ei vor putea fi reprezentate orice unghiuri pentru a fi transformate n radiani i utilizate n calcule trigonometrice.

    Atenie la variabilele dvs.! Nu atribuii niciodat o nou valoare lui pi cci v vei ci!.

    Pentru utilizarea eficient a funciilor trigonometrice folosim o serie de funcii de conversie pentru mrimi numerice care exprim unghiurile.

    (defun dtr(x) ; convertete pe x din grade sexagesimale n radiani pi= 3.1415926

    (* x (/ pi 180))

    )

    Utilizare: (dtr 180) ->3.1415926

    (defun rtd(x) ; convertete pe x din radiani n grade sexagesimale pi= 3.1415926

    (* x (/ 180 pi))

    )

    Utilizare: (rtd pi) ->180.0

    Aceast ultim funcie returneaz rezultatul n grade sexagesimale exprimate n scriere zecimal, cea mai frecvent utilizat uniate de msur n lucrul cu AutoCAD.

    Folosirea acestor funcii de conversie unghiular scutete n general folosirea unor alte funcii de conversie speciale pentru unghiuri disponibile n AutoLISP, dar mai greu de neplcut de utilizat.

    Celelalte funcii trigonometrice pot fi scrise cu ajutorul formulelor trigonometrice:

    Funcia tangent:

    (defun tan(x)

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-6

    (/ (sin x)(cos x))

    )

    Utilizare:

    (tan pi) ->0

    Dac dorim s pasm argumente exprimate direct n grade, putem scrie o combinaie:

    (defun tang(x)

    (setq x (* x (/ pi 180)))

    (/ (sin x)(cos x))

    )

    Utilizare:

    (tang 45)-> 1

    Orice alt funcie trigonometric poate fi introdus ntr-un mod asemntor.

    Funcii trigonometrice inverse Aceste funcii permite obinerea unghiului exprimat n radiani

    asociat unei funcii trigonometrice directe.

    n AutoLISP este implementat o singur astfel de funcie, corespunztoare arctangentei.

    Utilizare sa este posibil n dou moduri, corespunztoare numrului de argumente introduse de utilizator n apelul funciei.

    Sintaxa general:

    (atan arg1 [arg2])

    Utilizare:

    (atan 1) -> 0.707 (exprimarea lui pi/4)

    (atan a b) scriere echivalent (atan (/ a b))

    Celelalte funcii trigonometrice inverse pot fi exprimate prin intermediul funciei arctangent.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-7

    S nu uitm c rezultatul returnat de atan este un numr exprimat n radiani, aa nct utilizarea sa ulterioar trebuie s fie fcut cu grija exprimrii sale adecvate.

    Funcii de ridicare la putere, radicali i logaritmi

    Expt

    Puterea unei baze arbitrare

    Sintaxa: (expt a b) -> ab

    Exp

    Puterea lui e (exponeniala)

    Sintaxa: (exp a) -> ea

    Log

    Logaritmul natural al unui numr

    Sintaxa: (log a) -> ln(a)

    Sqrt

    Rdcina ptrat

    Sintaxa: (sqrt a) -> a Alte funcii cu argumente numerice

    Fix

    Partea ntreag a unui numr

    Sintaxa:(fix a),

    (fix 3.2)-> 3, (fix (+ 0.5 a)) -> rotunjirea lui a

    Float

    conversia ntreg-real

    Sintaxa: (float 2)->2.0

    Rem

    restul mpririi a dou numere:

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-8

    Sintaxa: (rem a b),

    Exemplu: (rem 13 3) -> 1

    Gcd

    cel mai mare divizor comun (cmmdc), doar pentru numere ntregi

    Sintaxa: (gcd a b),

    Exemplu: (gcd 45 35) -> 5

    Abs

    modulul unui numr |a|

    Sintaxa: (abs a),

    Exemplu: (abs -5) -> 5

    Max

    numrul maxim dintr-un ir de argumente

    Sintaxa: (max a b c d n) ,

    Exemplu: (max -1 4 34 123) -> 123

    Min

    numrul minim dintr-un ir de argumente

    Sintaxa: (min a b c d n) ,

    Exemplu: (min -1 4 34 123) -> -1

    1+

    incrementare cu o unitate (pentru contori)

    Sintaxa: (1+ a) ,

    Exemplu: (1+ 5)->6

    1-

    decrementare cu o unitate (pentru contori)

    Sintaxa: (1- a),

    Exemplu: (1- 5) ->4

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-9

    Minusp

    semnul unui numr

    Sintaxa: (minusp a),

    Exemplu: (minusp 1) ->nil,(minusp -1)->T

    5.2 Funcii relaionale

    Aceste funcii returneaz o valoare logic T n cazul satisfacerii expresiei sau nil n caz contrar.

    =

    Egalitate aritmetic

    Sintaxa: (= arg1 arg2 [arg3 .argn])

    =

    neegalitate aritmetic "diferit"

    Sintaxa: (= arg1 arg2 [arg3argn])

    <

    inegalitate "mai mic"

    Sintaxa: (< arg1 arg2 [arg3 argn])

    >

    inegalitate "mai mare"

    Sintaxa: (> arg1 arg2 [arg3 argn])

    = arg1 arg2 [arg3 argn])

    Equal

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-10

    egalitate cu toleran

    Sintaxa: (equal arg1 arg2 [toleranta])

    Eq

    echivalen

    Sintaxa: (eq arg1 arg2)

    Aceste funcii sunt de obicei utilizate pentru teste n cadrul funciilor decizie i de buclare.

    Compunerea lor se poate face cu ajutorul funciilor operatori logici.

    5.3 Funcii logice

    Aceste funcii returneaz valori logice T sau nil sau compun atomi logici

    And

    Operator logic "i"

    Sintaxa: (and arg1 arg2 argn),

    Exemple:

    (setq a T b nil c T)

    (and a b)->nil;

    (and a b c)->nil;

    (and a c)->T

    Or

    Operator logic "sau"

    Sintaxa: (or arg1 arg2 argn),

    Exemple: (setq a T b nil c T)

    (or a b)->T;

    (or a c)->T

    Not

    Operator logic "not" (negare)

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-11

    Sintaxa: (not arg),

    Exemplu:

    (setq a T);

    (non a)->nil

    compunerea lor poate fi multipl, pe mai multe niveluri logice.

    Atenie la funciile logice, condiiile pe care acestea le exprim sunt importante n logica programului care se scrie!

    Funcii booleene

    Boole

    Sintaxa: (boole func-bit num1 num2 [num3 numn])

    Funciile booleene exprimate prin funcia boole sunt folosite n exprimarea orientat pe bii.

    Pentru fiecare funcie-bit (func-bit) exist o tabel de adevr cu care se calculeaz rspunsul 0 sau 1.

    Aceste funcii operator booleeni standard AND, OR, XOR, NOT pot fi exprimai prin urmtorii bii:

    Funcie-bit Operaie Rezultat 1 cnd comparm doi bii

    1 AND amndoi biii sunt 1

    6 XOR numai un bit este 1

    7 OR unul sau cellalt este 1

    8 NOT ambii sunt 0

    S parcurgem urmtoarele exemple:

    a->adevrat

    f->fals

    Apel Rezul. Zec. Rezult.

    Bin.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-12

    (boole 1 14 7) 6 110 8 4 2 1 14 1 1 1 0 7 1 1 1 f a a f (boole 7 4 13 8) 13 1101 8 4 2 1 4 1 1 0 13 1 1 0 1 8 1 0 0 1 a a f a

    (boole 6 15 11) 4 100 8 4 2 1 15 1 1 1 1 11 1 0 1 1 f a F f (boole 4 6 15) 9 1001 8 4 2 1 6 1 1 0 15 1 1 1 1 a f f a

    O abordare extins poate s conduc la o funcie-bit nou: un bit s fie setat n al doilea numr iar bitul corespunztor din primul nu.

    logand

    Sintaxa: (logand num1 num2 [num3numn]) i

    logior

    Sintaxa: (logior num1 num2 [num3numn]) sunt funcii logice de comparare orientate pe bii.

    Acestea returneaz 0 sau 1 dup cum biii comparai formeaz o tabel de adevr: (logand 4 9 2) 0 0000 8 4 2 1 4 1 0 0 9 1 0 0 1 2 1 0 0 0 0 0

    (logand 15 13 5) 5 101 8 4 2 1 15 1 1 1 1 13 1 1 0 1 5 1 0 1

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-13

    0 1 0 1

    (logior 1 2 3) 3 11 8 4 2 1 1 1 2 1 0 3 1 1 1 1

    (logior 19 7 11 4) 31 11111 16 8 4 2 1 19 1 0 0 1 1 7 1 1 1 11 1 0 1 1 4 1 0 0 1 1 1 1 1

    ~

    Complement al lui 1

    Sintaxa: (~ 12)->-13

    (~ -7)-> 6

    (~ 0) -> -1

    funcia ~ reprezint complementul fa de 1

    Lsh

    Funcia se folosete pentru deplasarea numrului exprimat binar "ctre stnga"(left shift) dac numrul (ntreg ) este pozitiv, sau spre dreapta dac este negativ

    Aceasta se traduce prin aducerea din exterior de bii 0 dinspre partea opus deplasrii, iar n partea deplasrii biii vor fi pierdui.

    Dac deplasarea este prea mare numrul este alterat la o deplasare invers fcut cu acelai numr de bii.

    Sintaxa: (lsh numar nr-deplas)

    Schimbarea semnului numrului este dependent de reprezentarea numrului pe 16 sau 32 de bii.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-14

    O posibil utilizare este aceea de a cifra o informaie deplasnd fiecare caracter ctre stnga cu un bit i apoi citind informaia cifrat prin deplasare ctre dreapta cu un bit.

    Caracterele fiind reprezentate n tabela ASCII prin coduri exprimate numeric, deplasrile cu un bit genereaz alte caractere, care sunt apoi decifrate cu un program care deplaseaz fiecare caracter cu un bit n sensul opus. (lsh 7 1) 14 1110 16 8 4 2 1 7 1 1 1 1bit 1 1 1 0

    (lsh 7 -1) 3 11 16 8 4 2 1 7 1 1 1 1bit 1 1

    (lsh 15 3) 120 11 64 32 16 8 4 2 1 15 1 1 1 1 3biti 1 1 1 1 0 0 0

    (lsh 16383 1) -> 32766

    (lsh 16384 1) ->-32768 pe maini 16-bii

    32768 pe maini 32-bii

    5.4 Funcii de introducere de date

    Aceast clas de funcii sunt deosebit de importante prin faptul c stabilesc ntre program i utilizator un dialog de introducere a datelor.

    ntr-o aplicaie acurateea dialogului face parte din obiectivele principale ale programatorului. Introducerea greit a datelor, nevalidarea lor prin calculele efectuate poate duce la generarea unei erori care stopeaz programul sau mai ru programul funcioneaz i genereaz rezultate greite. Dac rezultatele sunt aberante mai avem ansa s le putem depista i s corectm programul, dac sunt doar "puin" eronate este mai grav.

    Crearea unui dialog program-utilizator urmrete ntreaga istorie a programrii calculatoarelor.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-15

    Interfaa om-computer creat definete gradul de complexitate a programulu i pe programator.

    Se definesc mai multe niveluri de dialog, dup cum urmeaz:

    a. Non-dialogul - programul st i ateapt introducerea unei date, utilizatorul nu tie ce s fac

    b. Dialogul arid - Programul cere o dat, utilizatorul nu tie ce mrime s introduc i caut printr-o carte

    c. Dialogul sugestiv - Programul cere o dat, sugereaz ce tip are i d o list de valori posibil de ales, utilizatorul alege o valoare din acest ir

    d. Dialogul restrictiv - Programul nu l las pe utilizator s dea dect o dat din irul indicat

    e. Dialogul vizual - Programul deschide o fereastr de dialog cu tot felul de butoane i cursoare i l las pe utilizator s-i fac de cap

    f. Dialogul vizual sugestiv - fereastra de dialog este completat cu apelul ctre un help care indic intervalele de valori, modul de alegere etc.

    g. Dialogul vizual sugestiv restrictiv - Totul ceea ce am enunat anterior plus utilizatorul este controlat la snge

    Evident a scrie programe care s respecte aceste tipuri de dialog este la ndemna diferitelor categorii de programatori.

    AutoLISP ofer soluii pentru toate aceste tipuri de dialog.

    n cadrul acestui capitol ne vom ocupa de funcii care pot genera tipurile a-d de dialog.

    Modelul de dialog pe care l recomandm la acest nivel ca fiind cel mai performant este fr ndoial modelul d.

    S nu uitm c programele sunt ns "orientate ctre client" i eventual sunt pltite de acesta, aa nct un program bine pltit nu trebuie s fac rabat la interfaa client-program. Dac a pltit bani, trebuie s-l satisfacem, dac se codete i se zgrcete, i face programul minimal i-l invitm s cumpere i varianta urmtoare mult mbuntit.

    Initget -

    Funcia care "iniiaz cererea"

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-16

    Este vorba de o funcie care poate fi apelat naintea funciilor de dialog i care seteaz modul de validare a datelor introduse de utilizator.

    Sintaxa: (initget bit-control ["Sir de cuvinte cheie"])

    bit-control este un numr ntreg ntre 1 i 255 reprezentat pe 8 bii. Setarea unui bit din cei opt are o semnificaie privind modul n care se restricioneaz dialogul.

    Numr Bit Semnificaie

    1 1 Rspuns nul interzis (ENTER)

    2 2 Valoare zero interzis

    4 3 Valoare negativ interzis

    8 4 Nu se testeaz limitele desenului AutoCAD chiar cu LIMCHECK activat

    16 5 Neutilizat

    32 6 Linie ntrerupt pentru reprezentarea liniei elastice sau box-ului elastic

    64 7 Ignorarea coordonatei Z la utilizarea lui GETDIST

    128 8 Preia orice introducem i returneaz valoarea

    Utilizarea bitului de control este posibil i prin combinarea de bii, formulnd astfel o restricionare combinat.

    De exemplu utilizarea numrului 7 care poate fi scris i ca (+ 1 2 4) seteaz primii trei bii ai numrului de control ceea ce semnific c este interzis introducerea unui rspuns nul, a valorii 0 sau de numere negative.

    Decodificarea cuvntului de control este mult mai simpl atunci cnd este scris aditiv

    "irul de cuvinte cheie" conine cuvinte care au efect n special pentru a introduce valori-cheie cunoscute de program, dar care trebuie introduse prin dialog.

    Cuvintele-cheie sunt scrise unul dup cellalt, separate prin blancuri i avnd sau nu caractere scrise cu majuscule.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-17

    Aceste majuscule sunt destinate a fi recunoscute cu prioritate , introducerea lor fiind suficient pentru recunoaterea ntregului cuvnt-cheie. Evident o parol trebuie s fie scris doar cu majuscule.

    Cuvintele car ncep cu aceeai majuscule pot fi difereniate prin folosirea unui numr mai mare de litere majuscule, sau prin alegerea uneia din corpul cuvntului-cheie.

    Command: (initget 1 "MIhai Vasile MArius")

    Nil

    Command: (getkword "Numele utilizatorului:")

    Numele utilizatorului:petre

    Invalid option keyword.

    Command: (getkword "Numele utilizatorului:")

    Numele utilizatorului:marius

    "MArius"

    Efectul restriciilor se face diferit pentru diversele funcii de dialog.

    Acestea sunt n general purttoare ale prefixului GET sau cu alte cuvinte fac parte din familia GETxxx.

    S vedem cum rspund aceste funcii la restriciile formulate de initget.

    Ne vom ocupa n cele ce urmeaz de familia de funcii GETxxx.

    Aceste funcii constituie principalul mod i totodat cel mai accesibil n conceperea unui dialog de introducere de date.

    Folosirea funciei de iniializare a cererii initget constituie un avantaj i de aceea vom da ca exemple structuri AutoLISP care cupleaz aceste funcii.

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-18

    Funcie Cuv. Cheie

    Nu

    Nul

    Nu

    zero

    Nu

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-19

    Value must be positive and nonzero.

    Introduceti varsta Dvs.

    Requires a positive nonzero integer.

    Introduceti varsta Dvs.12.5

    Requires a positive nonzero integer.

    Introduceti varsta Dvs.22

    22

    getdist

    Sintaxa: (getreal ["Mesaj"])

    Exemplu:

    Command: (initget (+ 1 2 4))

    nil

    Command: (getreal "Lungimea laturii:")

    Lungimea laturii:

    Requires numeric value.

    Lungimea laturii:-25

    Value must be positive and nonzero.

    Lungimea laturii:45.5

    45.5

    Valoarea ateptat va fi un numr real pozitiv nenul (+ 1 2 4)

    Dac dorim introducerea numai a unor valori restricionate se va folosi urmtoarea secven:

    (defun c:qq()

    (setq restrictii "Implicite Vechi")

    (initget restrictii)

    (setq raspuns (getreal (strcat "Valori " restrictii " :")))

    )

    Command: qq

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-20

    Valori Implicite Vechi :i

    "Implicite"

    Command: qq

    Valori Implicite Vechi :v

    "Vechi"

    Command: qq

    Valori Implicite Vechi :23

    23.0

    Funcia qq apelat succesiv permite obinerea rspunsului din partea utilizatorului, spre a indica valori implicite, valorile vechi sau o valoare real.

    Rspunsul este n acest caz un atom care poate avea tip diferit de dat, ceea ce necesit precauii n utilizarea acestuia n program.

    Prin acest tip de iniializare i conducere a dialogului se pot introduce informaii ce pot direciona parcursul ulterior al programului.

    Getdist

    Se urmrete introducerea unei distane care poate fi exprimat ca un numr real pozitiv, sau a unui punct grafic care s fie evaluat comparativ cu un punct considerat baz local de referin.

    Sintaxa: (getdist pct_baz ["Mesaj"])

    Setarea bitului 32 conduce la reprezentarea unei linii elestice desenate cu linie punctat.

    Exemplu: (initget (+ 1 2 4 32))

    (getdist '(0 0) "Distanta fat de origine:")

    Punctul grafic este echivalent n AutoLISP cu list de trei numere considerate drept coordonate 3D (x y z) sau de dou numere considerate coordonate 2D (x y) .

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-21

    Punctele introduse n acest mod trebuiesc scrise ntr-o list quotat precedat de '.

    Getangle

    Funcia permite introducerea unui unghi exprimat n unitile curente AutoCAD ca valoare ce va fi convertit automat n radiani, sau n stabilirea unui punct care va fi evaluat n comparaie cu un punct de baz considerat ca referin local.

    Unghiul astfel introdus este exprimat n radiani i se msoar relativ la direcia axei curente x , deci este dependent de setarea unghiului zero cu comanda UNITS .

    Sintaxa: (getangle pct_baz ["Mesaj"])

    Utilizare:

    (initget (+ 1 2 4 32))

    (getangle '(0 0) "Unghi fat de origine:")

    Command: (getangle '(0 0)"Unghi fata de origine:")

    Unghi fata de origine:180

    3.14159

    Getorient

    Funcia este asemntoare cu getangle, cu excepia faptului c unghiul rezultant va fi calculat cu ignorarea unei setri a direciei de msurare a unghiurilor alta dect ctre axa x a UCS-ul curent .

    Getpoint

    Funcia permite introducerea unui punct grafic din AutoCAD prin coordonate sau cu dispozitivul de digitizare. Folosirea opional a unui punct de baz poate fi combinat cu introducerea dinamic a unui punct cu dispozitivul de digitizare provocnd apariia unei linii elastice.

    Sintaxa: (getpoint [pct_baz] ["Mesaj"])

    Utilizare n program:

    (initget (+ 1 2 4 32))

    (getpoint '(0 0) "Punct fat de origine:")

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-22

    Utilizare pe prompt AutoCAD:

    Command: (getpoint '(0 0) "Punct fata de origine:")

    Punct fata de origine:(246.898 200.475 0.0)

    Command: (getpoint '(0 0) "Punct fata de origine:")

    Punct fata de origine:100,100

    (100.0 100.0 0.0)

    Rezultatul returnat este ntotdeauna o list cu trei componente, ultima fiind pus automat 0.0 dac prin dialog am indicat doar dou coordonate

    Getcorner

    Funcia permite indicarea unui punct situat n colul opus al unui dreptunghi virtual bazat n punctul de baz.

    Indicarea poate fi fcut prin coordonate sau cu dispozitivul de digitizare, caz n care apare un dreptunghi elastic.

    Sintaxa: (getcorner [pct_baz] ["Mesaj"])

    Utilizare n program:

    (initget (+ 1 2 4 32))

    (getcorner '(0 0) "Colt opus fat de origine:")

    Utilizare pe prompt AutoCAD:

    Command: (getcorner '(0 0) "Colt opus fat de origine:")

    Punct fata de origine:(246.898 200.475 0.0)

    Command: (getcorner '(0 0) "Colt opus fat de origine:")

    Punct fata de origine:100,100

    (100.0 100.0 0.0)

    Getstring

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-23

    Funcia permite introducerea unui ir de caractere inndu-se cont i de iniializrile fcute initget. Numrul maxim de caractere posibil de introdus ntr-un singur apel este 256.

    Sintaxa: (getstring ["Mesaj"])

    Funcia returneaz irul introdus care poate fi chiar i un ir gol "".

    Uneori poate fi folosit ca moment de stop n program pentru a se evidenia pn unde am ajuns cu rularea acestuia. Aceast oprire programat este util n procesul de depanare pentru a depista cu aproximaie seciunea de program care ne d bti de cap. Se tiprete o valoare intermediar i se cere un ir. Programul ateapt introducerea unui ir i avem astfel un stop al programului. Dup depanare se terge secvena respectiv i programul va curge fr opriri.

    Getkword

    Funcia permite introducerea unui cuvnt-cheie care va fi obligatoriu testat cu valorile admise n iniializarea cu initget. Orice alt cuvnt introdus va fi considerat incorect i va produce o buclare a cererii.

    Cuvintele cheie pot fi valori exprimate prin iruri de caractere . Valoarea returnat este ntotdeauna un ir, aa nct utilizarea n funcii care opereaz cu numere va fi condiionat de conversia acestor valori n valori numerice.

    n cazul n care dorim s punem o parol, cuvntul-cheie trebuie scris integral cu majuscule sau cu minuscule pentru a nu putea fi ocolit prin introducerea doar unuia sau mai multe caractere care au fost subliniate.

    Sintaxa:(getkword ["Mesaj"])

    Exemplu de programare: Valori restricionate

    (defun c:qq()

    (setq restrictii "10 20 25 45")

    (initget restrictii)

    (getkword (strcat "Valori permise/" restrictii "/'; :"))

    )

  • Ovidiu Alupei-Cojocariu AutoLISP - Manual de programare

    5-24

    Command: qq

    Valori permise/10 20 25 45/ :13

    Invalid option keyword.

    Valori permise/10 20 25 45/ :120

    Invalid option keyword.

    Valori permise/10 20 25 45/ :20

    "20"

    Getfiled

    Funcia permite indicarea unui fiier prin alegerea poziiei acestuia n urma parcurgerii unei ferestre de dialog.

    Returneaz un ir care exprim calea ctre acel fiier.

    Sintaxa: (getfiled "Sir info" "Nume implicit" "ext" flag)

    "Sir info" este un mesaj care va boteza aceast cutare fiind nscris ca titlu sus n marginea ferestrei de dialog.

    "Nume implicit " care poate fi i un ir gol "" indic setarea iniial a numelui fiierului.

    "ext" indic extensia cutat flag este un cod orientat pe bii care n funcie de modul n care

    este setat are diferite semnificaii.

    5.5 Funcii geometrice

    Aceste funcii sunt extrem de utile n calculul unor informaii geometrice.

    Pot fi calculate unghiuri, distane, puncte exprimate n coordonate polare, puncte de intersecie.

    Angle

    Funcia permite calcularea unui unghi exprimat n radiani corespunztor unui vector definit de dou puncte . Ambele puncte sunt situate n UCS-ul curent, iar unghiul este cel fcut de vector cu di