ALTE DOCUMENTE
|
|||||
|
INTRODUCERE ÎN AUTOLISP
În acest capitol vom introduce într-un mod accesibil elemente de bazã legate de limbajul de programare AutoLISP, care vor da posibilitatea utilizatorilor sã realizeze programe în acest limbaj în vederea automatizãrii muncii de proiectare.
Detalii asupra acestor elemente se dau pe larg în documentaþia care însoþeºte produsul AutoCAD ºi alte lucrãri de specialitate în domeniu.
15.1. De ce trebuie învãþat AutoLISP?
AutoLISP este bazat pe limbajul de programare de uz general XLISP care face parte din familia limbajelor LISP (LISt Processing). Limbajul LISP este mai puþin cunoscut în comparaþie cu limbajele BASIC, FORTRAN, PASCAL, COBOL ºi chiar C, dar a fost ales de autorii AutoCAD-ului ca limbaj de interfaþã în proiectarea asistatã, datoritã unor avantaje:
Este ideal pentru manevrarea informaþiilor specifice AutoCAD-ului
Exceleazã în tratarea unitarã a unor entitãþi eterogene
Este uºor de învãþat ºi stãpânit
Datoritã sintaxei simple, un interpretor LISP este foarte uºor de implementat ºi cere memorie puþinã
Este limbajul ales pentru cercetarea ºi dezvoltarea inteligenþei artificiale precum ºi a sistemului expert.
AutoLISP este un limbaj funcþional (opereazã numai cu funcþii care pot fi proprii sau create de utilizator), el efectuând prelucrãri de liste.
Datoritã faptului cã AutoLISP este un limbaj de programare, trebuie învãþatã sintaxa sa specificã pentru a comunica cât mai bine cu AutoCAD-ul ºi cu baza de date a desenului.
15.2. Elemente de bazã în utilizarea AutoLISP-ului
15.2.1. Tipuri de date în AutoLISP
În AutoLISP formatul datelor este legat de tipurile de date. AutoLISP acceptã folosirea urmãtoarelor tipuri de date:
Numere întregi - sunt numere care nu au virgulã (punct zecimal). De exemplu, 9 este un întreg, dar 9.018 ºi 9.0 nu sunt numere întregi. Deºi AutoLISP foloseºte intervalul de 32 biþi pentru calculul valorilor, aceste valori transferate între AutoLISP ºi AutoCAD sunt limitate la 16 biþi, deci nu se poate transfera o valoare întreagã mai mare decât +32767 sau mai micã decât -32768 în AutoCAD.
Numere reale - sunt numere care au virgulã (punct zecimal). De exemplu, 7.082 ºi 7.0 sunt numere reale, dar 7 nu este. Numerele reale sunt memorate într-un format de dublã precizie, de tip virgulã mobilã, furnizând cel puþin 14 zecimale semnificative, chiar dacã pe linia de comandã a AutoCAD-ului sunt afiºate numai 6 zecimale.
Simboluri - sunt colecþii de caractere alfabetice pe care AutoLISP le foloseºte ca nume de variabile; o valoare memoratã este reprezentatã printr-un simbol. În urmãtorul exemplu funcþia "setq" foloseºte simbolul "pt1" pentru a memora valoarea (3,7) (coordonatele unui punct):
(setq pt1 '(3 7))
Termenii "simbol" ºi "variabilã" sunt folosiþi echivalent.
Liste - sunt colecþii de simboluri, numere reale, numere întregi ºi ºiruri, pe care AutoLISP le evalueazã ca seturi de acþiuni. Organizarea listelor ºi legãturile dintre ele determinã ordinea acþiunilor AutoLISP în executarea unei rutine. O listã este delimitatã de paranteze rotunde. Pentru a specifica coordonatele grafice ale unui punct în 2D, exprimate sub forma unei liste, se scrie (3.6 9.72). Prima valoare reprezintã coordonata X, iar cea de-a doua este coordonata Y. Punctele 3D sunt exprimate ca liste a trei numere reale (X, Y, Z), astfel: (4.81 2.1 6.95). Prima valoare este coordonata X, cea de-a doua este coordonata Y ºi a treia este coordonata Z.
ªiruri (strings) - sunt colecþii de caractere numerice sau alfabetice, care nu pot fi evaluate ºi pe care AutoLISP le reþine ca o entitate unicã. Un text în AutoLISP se scrie între ghilimelele speciale ("). De exemplu, "Cartea mea" este un ºir, dar Cartea mea nu este ºir. De asemenea "9.07" este un ºir, dar 9.07 nu este ºir.
Descriptori de fiºiere - sunt etichete alfanumerice stabilite pentru fiºiere deschise de AutoLISP. Când o funcþie AutoLISP necesitã accesarea unui fiºier (pentru citit sau scris), etichetele trebuie sã fie indicate. În exemplul de mai jos este deschis fiºierul "info.dat", fãcându-l accesibil altor funcþii pentru citit ºi stabileºte valoarea descriptorului de fiºier la simbolul "r":
(setq fiº (open "info.dat" "r")) ar putea sã returneze <File: #34614>
Nume de entitãþi. Numele unei entitãþi este o etichetã numericã stabilitã pentru entitãþile dintr-un desen. Aceastã etichetã poate fi referitã de funcþiile AutoLISP pentru a permite selectarea de entitãþi pentru procesare în diferite feluri. În urmãtorul exemplu se seteazã simbolul "e1" la numele ultimei entitãþi introduse în desen:
(setq e1 (ultima_entitate)) ar putea sã returneze <Entity name: 60000016>
AutoLISP-ul utilizeazã câteva convenþii lexicale:
O expresie poate fi scrisã pe mai multe linii.
Un comentariu începe cu caracterul (;) ºi continuã pânã la sfârºitul liniei respective. De exemplu:
; Aceastã linie este un comentariu
Orice text scris astfel " ;| ....|; " este ignorat.
Spaþiile multiple între simboluri sunt echivalente unui singur spaþiu.
Numele simbolurilor pot fi orice secvenþã de caractere cu excepþia: ( ) . ' " ;
Numele de funcþii ºi simboluri pot fi introduse cu litere mari sau mici.
În cadrul ºirurilor de caractere, backslash-ul (\) este utilizat 10210m1217k pentru introducerea caracterelor de control care transmit comenzi cãtre periferice. De exemplu, urmãtoarea funcþie afiºeazã prompt-ul "Introduceþi primul punct" pe o linie nouã:
(prompt "\nIntroduceþi primul punct: ")
15.2.2. Interpretorul AutoLISP
Interpretorul AutoLISP traduce instrucþiunile din programul AutoLISP ºi transmite aceste instrucþiuni AutoCAD-ului ºi unitãþii centrale de prelucrare a calculatorului. La baza fiecãrui interpretor LISP stã evaluatorul. Evaluatorul ia o linie introdusã de utilizator, o evalueazã ºi returneazã rezultatul. Acesta este procesul de evaluare în AutoLISP.
Expresii AutoLISP
Toate expresiile AutoLISP au urmãtoarea formã:
(nume_funcþie [argumente] ...)
Fiecare expresie începe cu o parantezã deschisã ºi este alcãtuitã din numele unei funcþii ºi o listã opþionalã de argumente pentru acea funcþie (fiecare dintre ele poate fi o expresie). Expresia se terminã apoi cu o parantezã închisã. Fiecare expresie returneazã o valoare care poate fi folositã de o altã expresie; dacã aceasta nu existã, AutoLISP returneazã valoarea AutoCAD-ului.
Dacã se introduce o expresie AutoLISP ca rãspuns la prompt-ul "Command" al AutoCAD-ului, AutoLISP evalueazã expresia ºi afiºeazã rezultatul.
Când o expresie este incorect introdusã sau cititã dintr-un fiºier, AutoLISP ar putea afiºa urmãtorul prompt:
n>
unde "n" este un numãr întreg care indicã numãrul de nivele sau paranteze rãmase deschise. Dacã acest prompt apare, trebuie sã introducem n paranteze închise pentru a ieºi din aceastã condiþie. O greºealã frecventã este omiterea închiderii ghilimelelor duble (") într-un ºir text, caz în care greºala este interpretatã asemãnãtor ºi modificarea (prin introducerea de paranteze) nu are nici un efect. Pentru a corecta aceastã condiþie se anuleazã funcþia introducând Ctrl-C ºi se reintroduce corect funcþia.
Variabile AutoLISP
Variabilele AutoLISP sunt de patru tipuri: numãr întreg, numãr real, punct, ºir. Tipul unei variabile îi este asociat automat, în funcþie de tipul de valoare care i se atribuie. Variabilele reþin valorile lor pânã la atribuirea unei noi valori sau pânã când sesiunea curentã de lucru ia sfârºit. Variabilele pot lua orice nume, cu condiþia ca primul caracter sã fie alfabetic. Variabila "pi" este presetatã cu valorea lui p ºi poate fi folositã ca ºi celelalte variabile definite de noi.
Pentru a atribui valori variabilelor se foloseºte funcþia "setq" (vezi paragraful 15.3.3). Formatul acesteia este: (setq nume_variabilã valoare). Funcþia "setq" atribuie valoarea specificatã variabilei al cãrei nume este dat. De asemenea returneazã valoarea ca rezultat al funcþiei.
Se poate folosi valoarea unei variabile ca rãspuns la un prompt din AutoCAD, introducând numele variabilei precedat de un semn al exclamãrii (!). Sã presupunem, de exemplu, cã am setat variabila "a1" la valoarea 15.8802. Se poate introduce acum "!a1", ori de câte ori se doreºte ca rãspunsul la o cerere AutoCAD sã fie 15.8802. De exemplu:
Distance betwen columns (|||):!a1
Similar, dacã se doreºte trasarea unui segment din punctul (2.4, 5.0) atribuit variabilei "pt", se poate introduce:
Command: line
From point: !pt
Observaþie: Nu se poate folosi o variabilã ca referire la o comandã AutoCAD. De exemplu, dacã s-a atribuit ºirul "Line" variabilei "X" ºi apoi se introduce "!X" drept rãspuns la prompt-ul Command: al AutoCAD-ului, se va afiºa doar "LINE", iar comanda LINE nu va fi executatã.
15.2.3. Definirea funcþiilor
Toate funcþiile AutoLISP (prezentate în partea a doua a acestui capitol) pot fi introduse din interiorul AutoCAD-ului, în linia de comandã, pentru a vedea cum acþioneazã. De exemplu, dacã se scrie lista (* 15 3.5) la prompt-ul AutoCAD-ului ºi apoi se apasã tasta Enter, AutoLISP va returna 52.5, deci:
Command:(* 15 3.5)
În acest caz s-a folosit funcþia matematicã înmulþire (*) pentru a face produsul numerelor 15 ºi 3.5. Acest lucru este posibil pentru cã scrierea funcþiei a început cu o parantezã deschisã care invocã interpretorul AutoLISP pentru a prelua informaþiile din linia de comandã.
A scrie linii din interiorul AutoCAD-ului (ca mai sus) se justificã numai pentru mici încercãri (rutine alcãtuite din câteva instrucþiuni). Dacã avem rutine mai mari pe care le introducem linie cu linie, dupã executarea rutinei este posibil sã primim mesajul unei erori (v. anexa). În acest caz, totul trebuie scris de la capãt, fiindcã nu putem sã ne întoarcem în vreo linie scrisã anterior.
Pentru a evita acest neajuns putem scrie rutina sub forma unui fiºier text cu extensia .LSP, în afara AutoCAD-ului, folosind un editor de texte, ca de exemplu Norton Commander (cel mai mic ºi cel mai simplu editor) sau EDIT din sistemul DOS. Fiºierul astfel creat va fi transmis AutoLISP-ului de unde poate fi încãrcat folosind funcþia AutoLISP "load".
Pentru a putea scrie ºi corecta rutine ºi programe AutoLISP, este necesar ca din AutoCAD sã fie posibil accesul într-un editor de texte. Acest lucru se realizeazã punând în fiºierul ACAD.PGP linia:
NC,NC, 72000, ,4
sau
EDIT, EDIT, 72000, Fiºier de ediat: ,4
Prima linie va permite lansarea Norton Commander-ului iar a doua linie lansarea editorului EDIT.COM din DOS. Spaþiul alocat este de 72000 de octeþi ºi el poate fi mãrit dacã la încercarea de editare a unui fiºier se primeºte un mesaj de genul Out of memory. Dupã scrierea liniei respective în fiºierul ACAD.PGP se face o resetare a calculatorului ºi apoi se lanseazã AutoCAD-ul.
Pentru definirea ºi memorarea unui grup de funcþii (rutinã), în vederea execuþiilor ulterioare, se foloseºte funcþia AutoLISP DEFUN (Defining FUNction). Crearea de funcþii ºi rutine este "miezul" eficienþei acestui limbaj. Când într-o listã este scris numele funcþiei, AuoLISP gãseºte acest nume în memorie ºi executã instrucþiunile legate de acest nume. Funcþia "defun" este prezentatã pe larg în paragraful "Funcþii procedurale".
Dacã vom considera cã numele fiºierului în care sunt scrise instrucþiunile funcþiei cu numele "Calcul" este "Test.lsp", pentru a executa funcþia "Calcul", la prompt-ul Command: din AutoCAD se tasteazã:
Command: (load "Test") enter
CALCUL este afiºat numele funcþiei definitã în cadrul fiºierului.
Command: (calcul)
Deci, pentru executarea instrucþiunilor ce compun funcþia, la prompt-ul "Command:" se tasteazã numele funcþiei, delimitat de paranteze. Dupã execuþie se returneazã rezultatul ultimei expresii evaluate.
Dacã în definiþia funcþiei punem prefixul "C:" la numele funcþiei, funcþia definitã va fi tratatã ca o comandã AutoCAD. De exemplu, considerând prima linie din definiþia funcþiei ca fiind:
(defun C:calcul () <expresii...)
apelarea funcþiei se face astfel:
Command: (load "Test")
C:CALCUL este afiºat numele funcþiei
Command: calcul
Spre deosebire de primul caz când prefixul "C:" nu exista, acum, dupã încãrcarea fiºierului Test.lsp, pentru executarea instrucþiunilor funcþiei, s-a rãspuns la prompt-ul "Command:" cu numele funcþiei "calcul" ca ºi cum aceasta ar fi o comandã AutoCAD, deci invocarea funcþiei s-a fãcut doar prin introducerea numelui funcþiei fãrã prfixul "C:" ºi fãrã delimitarea acestuia de paranteze.
Modul acesta de definire a funcþiilor permite adãugarea de noi comenzi create de utilizator la cele existente în AutoCAD. Aceastã manierã de lucru este o foarte puternicã utilitate a AutoLISP-ului. Odatã definitã, noua comandã poate folosi toate facilitãþile permise de AutoLISP ºi AutoCAD, inclusiv apelarea transparentã, precedând numele funcþiei cu un apostrof (').
Când este chematã o funcþie definitã ca o comandã, din cadrul altei funcþii AutoLISP, trebuie folosit numele întreg (cu prefix); de exemplu, C:calcul.
Dacã se doreºte ca funcþia "calcul" sã fie permanent accesibilã, ori de câte ori se intrã în AutoCAD, se creazã un fiºier cu numele special "acad.lsp" al cãrui conþinut sã fie reprezentat de aceastã funcþie. Lansând AutoCAD-ul din directorul în care se aflã fiºierul "acad.lsp" astfel creat, acesta îl va încãrca în mod automat de fiecare datã.
În paragrafele urmãtoare se prezintã funcþiile AutoLISP de bazã. Parantezele drepte utilizate în sintaxa funcþiilor pentru a delimita anumite argumente sau expresii aratã cã acestea sunt opþionale. Rezultatul returnat de o funcþie este arãtat cu simbolul "
15.3. Funcþii AutoLISP
15.3.1. Funcþii matematice
În aceastã categorie de funcþii sunt cuprinse funcþiile aritmetice de bazã, funcþiile logaritmice ºi funcþiile trigonometrice. Funcþiile matematice vor returna întotdeauna un numãr întreg sau real, depinzând de tipul de argumente din listã. Dacã toate numerele din listã sunt întregi, rezultatul returnat este un numãr întreg (restul oricãrei operaþii matematice va fi abandonat); de exemplu, rezultatul împãrþirii lui 47 la 3 , în calculul cu numere întregi, va fi 15 în loc de 15.6667. Dacã numai unul din numerele din lista de argumente este real, AutoLISP le va converti pe toate în numere reale ºi va realiza operaþii matematice cu virgulã mobilã. În acest caz, rezultatul returnat va fi un numãr real.
Funcþia (+ <n1> <n2> .....) - returneazã suma numerelor din listã; n1, n2, ...sunt reale sau întregi. Exemple:
Funcþia (- <n1> <n2> ........<nk>) - returneazã diferenþa numerelor din listã; n1,n2,......,nk sunt reale sau întregi. Dacã lista cuprinde mai mult de douã numere, al treilea ºi fiecare numãr care urmeazã este scãzut din rezultatul scãderii anterioare. Exemple:
Funcþia (* a b c ...) - returneazã produsul numerelor pe care le cuprinde lista; a, b, c, .... sunt reale sau întregi. Exemple:
Funcþia (/ a1 a2 a3 .....) - returneazã câtul numerelor din listã; a1, a2, a3, ....sunt reale sau întregi. În cazul în care lista are mai mult de douã argumente, primul numãr este împãrþit la produsul urmãtoarelor. Exemple:
8 ºi este similar cu (/96 (* 4 3))
Funcþiile (max) ºi (min)
(max <n1> <n2> ......) returneazã maximul dintre argumente
(min <n1> <n2>....) returneazã minimul dintre argumente
Exemple:
(max 27 32 3 -10)
(min 4 3 2 -15)
Fiecare din funcþiile (+) (-) (*) (/) (max) (min) permit mai multe argumente.
Se observã cã, imediat dupã prima parantezã (fãrã vreun blanc), urmeazã numele funcþiei, apoi blanc ºi argumente; dupã ultimul argument se pune imediat paranteza închisã.
Funcþiile (1+) ºi (1-)
(1+a); (1-a) - incrementeazã cu plus 1, respectiv în minus 1 numãrul "a" care poate fi real sau întreg. Exemple:
(1+ -12)
(1- -5)
Funcþia (abs <n>) - întoarce valoarea absolutã a lui "n" (modulo). Exemplu:
(abs -3.987)
Funcþia (exp <n>) - returneazã () (antilogaritmul
natural). Exemplu:
(exp 2)
Funcþia (expt <bazã> <putere>) - returneazã baza ridicatã la putera specificatã; argumentele pot fi numere întregi sau reale. Exemple:
(expt 2 4.0)
(expt 9 3)
Funcþia (fix <n>) - returneazã conversia lui <n> într-un întreg; <n> poate fi întreg sau real. Exemple:
(fix 3.7)
(fix -12.99)
Funcþia (float <n>) - returneazã conversia lui <n> într-un real; <n> poate fi un întreg sau real. Exemple:
(float 9)
(float 46.3)
Funcþia (gcd <întreg1> <întreg2>) - returneazã cel mai mare divizor comun al numerelor <întreg1> ºi <întreg2> , deci argumentele trebuie sã fie numere întregi. Exemple:
(gcd 24 78)
(gcd 36 -52) error: improper argument
Se observã cã în cazul celui de-al doilea exemplu apare un mesaj de eroare.
Funcþia (rem <n1> <n2>) - returneazã restul împãrþirii numerelor <n1> <n2>; aplicã <n1> modulo <n2>, argumentele fiind atât numere intregi cât ºi reale. Exemplu:
(rem 368 17)
Funcþia (sqrt <n>) - returneazã rãdãcina pãtratã (radicalul) a lui <n> numãr real. Exemplu:
(sqrt 16)
Funcþia (atan <n1> [<n2>])
Dacã
<n2> nu este dat, atan
returneazã arctangenta lui <n1> în radiani de la - la +
radiani. Exemplu:
(atan 0.5)
Dacã se dã atât <n1> cât ºi <n2>, se returneazã arctangenta lui <n1>/<n2>, în radiani. Exemplu:
(atan 2.0 3.0)
Funcþia (cos <unghi>) - returneazã cosinusul unui unghi, unde unghiul este în radiani. Exemple:
(cos 0.0)
(cos 1.2)
Funcþia (sin <unghi>) - returneazã sinusul unui unghi, unde <unghi> este exprimat în radiani. Exemplu:
(sin 1.0)
Funcþia (log <n>) - returneazã logaritmul natural din <n>, unde <n> este real. Exemplu:
(log 4.5)
15.3.2. Funcþii de manipulare a listelor
Multe dintre funcþiile AutoLISP, cum ar fi funcþiile ºir ºi matematice, sunt comune celor mai multe limbaje de programare. Funcþiile de manipulare a listelor sunt totuºi unice în limbajul LISP. Funcþiile care urmeazã sunt de bazã în programarea AutoLISP, oferind unele instrumente puternice pentru manipularea simbolurilor. Iatã câteva informaþii specifice structurãrii listelor.
O listã poate fi alcãtuitã din simboluri, numere, ºiruri sau alte liste. Un simbol este creat doar atunci când este declarat ca al doilea element al unei liste care începe cu una din funcþiile AutoLISP "defun", "setq" sau "quote". Fiecare simbol care este creat este adãugat listei ºi de fiecare datã când simbolul este evaluat printr-o expresie, AutoLISP trebuie mai întâi sã caute în listã numele acelui simbol.
Funcþia (list <expr1> <expr2>...<exprk)
Aceastã funcþie primeºte orice numãr de expresii <expr> (inclusiv ºiruri) ºi le listeazã împreunã, returnând o listã. Exemple:
(list 3.9 6.7)
(list '(x y z)) ((X Y Z))
Funcþia list este frecvent folositã pentru a defini o variabilã punct 2D sau 3D.
Funcþia (append <list1> <list2>....<listk>)
Aceastã funcþie preia oricâte liste ºi le considerã o singurã listã; deci reuneºte mai multe liste în una singurã. Exemplu:
(append '(a b c) '(d e f)) (a b c d e f)
Funcþia (assoc <articol> <alist>)
Aceastã funcþie cautã <articol> în lista asociatã <alist>, ca element cheie ºi returneazã intrarea din <alist>. Exemplu: presupunem lista asociatã cu numele 'tabel definitã ca o asociere de mai multe liste;
((grupa 42) (numãr_studenþi 25) (bursieri 8) (restanþieri 5))
atunci,
(assoc 'bursieri tabel) BURSIERI 8
(assoc 'restanþieri tabel) RESTANTIERI 5
(assoc 'integraliºti tabel) nil
Funcþiile (car <list>)
(cdr <list>)
(cadr <list>)
Fie lista (setq tl '(a b c d e))
(car tl) a; adicã primul element al listei;
(cadr tl) b; adicã al doilea element;
(caddr tl) c; al treilea element al listei;
(cadddr tl) d; al patrulea element;
(cdr tl) b c d e; toate elementele cu excepþia primului;
(cddr tl) c d e; elementele listei fãrã primele douã;
(cdddr tl) d e;
(cddddr tl) e;
Exemplu:
(setq p1 '(7 15))
(setq p2 '(10 20))
(setq p3 '(car p1 cadr p2))
În ultima instrucþiune din exemplu, variabilei punct "p3" i se atribuie coordonatele (7, 20); adicã coordonata x a punctului "p1" ºi coordonata y a punctului "p2".
Funcþia (cons <noul_prim_element> <list>)
Aceastã funcþie adaugã noul element ca prim element la o listã <list> ºi returneazã noua listã. Exemplu:
(cons 'a '(b c)) (a b c)
Funcþia (last <list>) - returneazã ultimul element din <list>; parametrul <list> nu trebuie sã fie nul. Exemplu:
(last '(a b c d e)) e
Funcþia (member <expr> <list>)
Aceastã funcþie cerceteazã lista <list> pentru a gãsi expresia <expr> ºi returneazã partea din <list> rãmasã dupã prima întâlnire a lui <expr>, începând cu aceasta. Exemple:
(member 'c '(a b c d c d e)) (c d c d e)
(member 'q '(a b c d)) nil
Funcþia (nth <n> <list>) - returneazã elementul cu numãrul "n" din listã. Primul element din listã corespunde lui n=0, nu lui n=1. Exemplu:
(nth 3 '(f g h i j k) i
Funcþia (reverse <list>) - returneazã <list> cu elementele puse în ordine inversã. Exemplu:
(reverse '(d e f)) (f e d)
Funcþia (subst <articol_nou> <articol_vechi> <list>)
Aceastã funcþie cautã <articol_vechi> în <list> ºi returneazã o copie a <list> în care <articol_vechi> este înlocuit cu <articol_nou> Exemplu:
Fie lista (setq exemplu '(a b c d))
atunci
(subst 'z 'c exemplu) (a b z d)
15.3.3. Funcþii de atribuire
Funcþiile din aceastã grupã atribuie sau citesc valori prin AutoCAD ºi AutoLISP.
Funcþia (getvar <nume_var>)
Aceastã funcþie regãseºte valoarea unei variabile de sistem AutoCAD. Exemplu:
(getvar "FILLETRAD") 0.25 dacã raza de racordare specificatã pentru comanda FILLET cea mai recentã a fost 0.25 unitãþi.
Funcþia (quote <expr>) - returneazã <expr> neevaluatã. Exemplu:
(quote (+ 9 7.1))
Funcþia (setq <simbol> <expr>)
Aceastã funcþie atribuie valoarea <expr> numelui de variabilã <simbol>. Este principala funcþie de atribuire din AutoLISP, fiind similarã cu "Last" din BASIC ºi cu ":=" din PASCAL ºi C. Exemple:
(setq a 30) (setq x 34.2)
(setq b "DA") (setq c '(a x))
Funcþia (set <simbol> <expr>)
Aceastã funcþie seteazã (fixeazã) valorea lui <simbol>, unde <simbol> este un nume de simbol, evaluând <expr> ºi returnând acea valoare. Exemplu:
(set 'a 6) 6 ºi seteazã simbolul <a>; este identic cu (setq a 6)
Funcþia (setvar <nume_var> <valoare>)
Aceastã funcþie seteazã o variabilã de sistem AutoCAD pe valoarea <valoare> ºi returneazã acea valoare. Exemplu:
(setvar "FILLETRAD" 0.5) 0.5 setând raza de racordare FILLET a AutoCAD-ului pe 0.5 unitãþi.
15.3.4. Funcþii procedurale
Funcþiile procedurale sunt folosite pentru a descrie o serie de instrucþiuni, pas cu pas, pentru a fi executate de calculator.
Funcþia (apply <funcþie> <listã>) - executã funcþia specificatã prin <funcþie> cu argumentele date de <listã> ºi returneazã rezultatul. Exemplu:
(apply '+' (1 2 3)) 6 (aplicã funcþia "+" pe argumentele listei (1 2 3)
Aceastã funcþie lucreazã numai cu funcþii înglobate sau definite de utilizator (cele create cu funcþia DEFUN sau LAMBDA)
Funcþia (command <args>....)
Aceastã funcþie executã comenzi AutoCAD din interiorul AutoLISP-ului ºi întotodeauna returneazã nil. Argumentele <args> reprezintã comenzi AutoCAD ºi subcomenzi ale lor. Exemplu:
(setq pt1 '(7 15))
(setq pt2 (getpoint "Introduceþi un punct: "))
(command "line" pt1 pt2)
Secvenþa de expresii seteazã o valoare pentru punctul "pt1", cere o valoare pentru "pt2" ( de la tastaturã sau mouse) ºi executã comanda LINE a AutoCAD-ului.
Un ºir nul (" ") este echivalent cu introducerea unui spaþiu de la tastaturã. Apelul lui Command fãrã argumente este echivalent cu introducerea unui CTRL/C de la tastaturã, ducând la abandonarea celor mai multe comenzi.
Funcþia (defun nume_func (argument / variabile locale) <expresii>....)
DEFUN defineºte o funcþie cu numele "nume_func". Dupã numele funcþiei urmeazã lista de argumente (posibil vidã) separatã de lista de variabile locale printr-un slash (/). Slash-ul trebuie sã fie separat de simbolul primei variabile locale ºi de ultimul argument prin cel puþin un spaþiu. Dupã lista de argumente ºi simbolurile variabilelor locale se dau una sau mai multe expresii de evaluare la execuþia funcþiei.
Nu toate funcþiile necesitã argumente sau variabile locale, dar o listã trebuie sã fie prezentã chiar dacã este vidã. Iatã câteva exemple de folosire a funcþiei DEFUN. Numele funcþiei definite este "test".
(defun test ( ) <expresii>...) nu conþine argumente sau variabile locale
(defun test (x) <expresii>...) un argument , fãrã variabile locale
(defun test (x y) <expresii>...) douã argumente, fãrã variabile locale
(defun test (x y / z) <expresii...) douã argumente, o variabilã localã
(defun test (/ a b) <expresii>...) fãrã argumente, douã variabile locale
Argumentele funcþiei trebuie sã aibã nume diferite, de exemplu, funcþia defun test1 (x x / a)..) este incorect definitã. Dar putem defini funcþii care au variabile locale cu acelaºi nume, de exemplu, funcþia defun test2 (x y / a a b) ...) este corect definitã.
Când funcþia definitã este invocatã, argumentele sale vor fi evaluate ºi asociate simbolurilor argument. Variabilele dintr-o funcþie obþinute prin atribuire (de exemplu, prin funcþia setq) sunt variabile globale ºi pot fi utilizate în orice rutinã din program. Variabilele locale pot fi folosite numai în cadrul funcþiei respective fãrã a schimba corelaþiile acestora la nivelele exterioare. Funcþia va returna rezultatul ultimei expresii evaluate. Toate expresiile anterioare din funcþie au numai efecte laterale. Funcþia DEFUN însãºi returneazã numele funcþiei definite. Exemplul 1:
(defun adun (x)
(+10 x)) adun (a fost returnat numele funcþiei)
Dacã într-un program este apelatã funcþia de mai sus :
(adun 5) ea returneazã 15 ( la 10 a fost adunat argumentul "x" cãruia i s-a atribuit valoarea 5)
Exemplul 2:
(defun AC ()
(setq r (getreal "Daþi raza cercului:"))
(setq aria (* pi (expt r 2)))
Acest exemplu va calcula aria unui cerc de razã datã. Raza cercului se introduce de la tastaturã la cererea "Daþi raza cercului" afiºatã pe ecran.
Funcþia (eval <expr>) - returneazã rezultatul evaluãrii expresiei <expr>, unde <expr> este orice expresie LISP. Exemple: dându-se atribuirile
(setq a 245)
(setq b 'a)
atunci
(eval a)
(eval (abs -10))
Funcþia (lambda <argument> <expr>....) - defineºte o funcþie anonimã. Este folositã în mod tipic atunci când definirea generalã a unei funcþii noi nu se justificã. LAMBDA returneazã valoarea ultimei sale <expr> ºi este adesea folositã împreunã cu APPLY sau MAPCAR pentru a executa o funcþie pe o listã. Exemplu:
(apply '(lambda (a b c) (* a (+ b c))) '(5 20 14))
Funcþia (mapcar <funcþie> <list1>...<listn>)
Aceastã funcþie returneazã rezultatul aplicãrii funcþiei <funcþie> pe elementele individuale exprimate de <list1> pânã la <listn>, date ca argumente ale lui <funcþie>. Exemple:
(setq a 10 b 20 c 30)
(mapcar '1+ (list a b c ))
(mapcar '+ '(10 20 30) '(45 3))
Funcþia (progn <expr>...) - evalueazã fiecare <expr> secvenþial ºi returneazã valoarea ultimei expresii. Exemplu:
(setq a 80 b 80)
(if (= a b) (progn (setq a (+a 10)) (setq b (-b 10))))
Când funcþia PROGN este folositã, ea permite evaluarea mai multor expresii ºi nu a uneia cum se întâmplã în mod normal dupã "then".
Funcþia (repeat <nr> <expr> .....)
Aceastã funcþie evalueazã fiecare <expr> de <nr> ori ºi returneazã valoarea ultimei expresii. Exemplu:
(setq a 10)
(setq b 100)
(repeat 3 (setq a (+a 10))
(setq b (+ b 100)))
15.3.5. Funcþii condiþionale
Funcþiile condiþionale sunt acelea care testeazã rezultatele expresiei ºi realizeazã operaþii specificate în funcþie de rezultatele testelor. În AutoLISP pot fi realizate trei tipuri de teste coniþionale: "cond", "if", "while".
Funcþia (cond (<test1> <result_expr1>.... <rezult_exprN>)....)
Aceastã funcþie evalueazã primul articol din fiecare listã (în ordinea datã) pânã ce unul dintre aceste articole returneazã altã valoare decât nil. Atunci ea evalueazã acele expresii care urmeazã dupã testul trecut ºi returneazã valoarea ultimei expresii din listã. COND este funcþia condiþionalã principalã din AutoLISP. Exemplu:
(setq a 12)
(cond ((= a 12) 1) ((= a 13) 0))
Funcþia (if <expr_test> <expr_atunci> [<expr_altfel>])
Aceastã funcþie evalueazã expresii în mod condiþional. Dacã <expr_test> nu este nil atunci este evaluatã expresia <expr_atunci>, altfel este evaluatã expresia <expr_ altfel>. Exemplu:
(setq a 7)
(if (= a 7) "DA" "NU") DA
Funcþia (while <expr_test> <expr1>..... <exprN>)
Aceastã funcþie evalueazã <expr_test> ºi dacã nu este nil, evalueazã celelalte expresii dupã care evalueazã din nou <expr_test>. Aceasta continuã pânã ce <expr_test> devine nil (deci evaluãrile trebuie sã modifice ceva din <expr_test>, altfel ciclarea nu se va termina niciodatã.). Exemplu:
(setq a 1)
(while (<= a 10)
..... alte funcþii (se executã de 10 ori)
(setq a (1+a)))
15.3.6. Funcþii relaþionale
Funcþiile relaþionale returneazã rezultatele unui test al relaþiei dintre mai mulþi atomi. Atomii pot fi egali între ei, diferiþi sau pot avea multe alte relaþii.
Funcþia (= <atom1> <atom2>.....)
Funcþia relaþionalã "egal cu" returneazã true dacã toþi <atom>-ii sunt numeric egali ºi nil în caz contrar. Funcþia este valabilã pentru numere ºi ºiruri. Exemple:
(setq a 1) (= a b c) true
(setq b 1) (= "eu" "eu") true
(setq c 1) (= "eu" "tu") nil
Funcþia (/= <atom1> <atom2>)
Funcþia relaþionalã "neegal cu" returneazã true dacã <atom1> nu este egal cu <atom2> ºi nil dacã cei doi atomi sunt numeric egali. Funcþia este nedefinitã dacã se dau mai mult de douã argumente. Exemplu:
(setq a 1)
(setq b 2)
(/= a b) true
Funcþia (< <atom1> <atom2> .....)
`Aceasta este funcþia relaþionalã "mai mic decât". Ea returneazã true dacã primul <atom1> este numeric mai mic decât <atom2> ºi nil altfel. Dacã sunt mai mulþi atomi se returneazã true dacã fiecare atom este mai mic decât atomul din dreapta sa, deci dacã ºirul de atomi este strict crescãtor. Exemplu:
(setq a 1) (setq c 3)
(setq b 2) (< a b c) true
Funcþia (<= <atom1> <atom2> ....)
Aceasta este funcþia relaþionalã "mai mic sau egal cu". Ea returneazã true dacã <atom1> este mai mic sau egal cu <atom2>. Dacã sunt mai mult de doi atomi, se returneazã true dacã fiecare atom este mai mic sau egal cu atomul din dreapta sa. Exemplu:
(<= 1 2 3 3.0 4 5 5 5) true
Funcþia (> <atom1> <atom2>....)
Aceasta este funcþia relaþionalã "mai mult decât". Ea returneazã true dacã <atom1> este mai mare decât <atom2> ºi nil altfel. Dacã sunt mai mulþi atomi, se returneazã true dacã fiecare atom este mai mare decât atomul din dreapta sa, deci dacã ºirul este strict descrescãtor. Exemplu:
(> 3 2 1) true
Funcþia (>= <atom1> <atom2> ......)
Aceasta este funcþia relaþionalã "mai mare sau egal cu". Ea returneazã true dacã <atom1> este mai mare sau egal cu <atom2> ºi nil altfel. Dacã se dau mai mult de doi atomi, se returneazã true dacã fiecare atom este mai mare sau egal cu atomul din dreapta sa. Exemple:
(>= 3 2 2 1) true
(>= 3 2 3 1) nil
Funcþia (eq <expr1> <expr2>)
Aceastã funcþie determinã dacã expresiile <expr1> ºi <expr2> sunt identice. Funcþia returneazã true dacã cele douã expresii sunt identice ºi nil altfel. Este folositã în mod tipic pentru a determina dacã cele douã liste sunt identice. Exemple:
(setq a '(c d e f)) (eq g b) true
(setq b '(c d e f) (eq a g) nil
(setq g b)
Observaþie: Variabilele g ºi b sunt asociate aceluiaºi obiect prin SETQ (sunt exact aceeaºi listã), dar a ºi g nu, deci nu sunt identice deºi conþinutul este acelaºi, nu sunt aceeaºi listã.
Funcþia (equal <expr1> <expr2> [<variaþie>])
Aceastã funcþie determinã dacã <expr1> ºi <expr2> sunt egale, mai precis dacã ele sunt evaluate prin acelaºi lucru. Funcþia returneazã true dacã cei doi atomi sunt egali sau diferenþa dintrei ei este egalã sau mai mare decât <variaþie> ºi nil altfel. Exemple:
(setq x 3.14159) (equal x y 0.00001) true
(setq y 3.141593) (equal x y) nil
15.3.7. Funcþii predicative
Funcþiile predicative sunt acelea care produc un efect bazat pe testul uneia sau mai multor expresii. Subiectul este expresia care trebuie testatã, iar predicatul este rezultatul testului.
Funcþia (and <expr> ...)
Aceastã funcþie returneazã AND logic al unei liste de expresii. Ea înceteazã evaluarea ºi returneazã nil dacã o expresie este evaluatã ca nil, altfel returneazã true. Nil are rolul de "nu", iar orice altceva de "da". Exemple:
(setq a 1) (setq d nil)
(setq b 2) (and a b c) true
(setq c "xyz") (and a b d) nil
Funcþia (atom <arg>)
Aceastã funcþie returneazã nil dacã <arg> este o listã ºi true altfel. Orice nu este o listã este considerat un atom. Exemple:
(setq x 'a) (atom x) true
(setq y '(a b c)) (atom 'y) true
(atom 'x) true (atom y) nil
Funcþia (listp <arg>) - returneazã True, dacã argumentul este o listã ºi nil, dacã argumentul este orice altceva. Exemple:
(setq a 1) (setq b '(x y z))
(listp a) C nil (listp b) True
Funcþia (minusp <arg>)
Aceastã funcþie permite testarea argumentului <arg> pentru a vedea dacã este un numãr întreg sau real negativ, caz în care returneazã True; în caz contrar returneazã nil. Argumentul de tip ºir nu este recunoscut. Exemple:
(minusp 12) nil
(minusp -3.14159) True
Funcþia (not <arg>) - returneazã opusul valorii argumentului <arg>. Dacã argumentul este evaluat ca True, funcþia "not" returneazã nil; dacã argumentul este evaluat ca nil, funcþia returneazã True. Exemple:
(setq x 2) (setq y nil) nil
(not x) nil (not y) True
Funcþia (null <arg>) - permite testarea unui argument pentru a vedea dacã este nil. Funcþia "null" returneazã valoarea True dacã argumentul este nil ºi returneazã nil dacã nu este. Exemple:
(setq x nil) (setq x 2)
(null x) True (null x) nil
Funcþia (numberp <arg>) - returneazã True dacã argumentul <arg> este o valoare întreagã sau realã; în caz contrar va returna nil. Exemple:
(numberp 3.57) True
(setq x "un ºir")
(numberp x) nil
Funcþia (or <expr1.... <exprN>)
Dacã nici-o expresie nu este nil, evaluarea se opreºte la acea expresie ºi valoarea returnatã este True. Exemple:
(setq a nil) (setq c 1)
(setq b nil) (or a b c) True
(or a b) nil
Funcþia (type <arg>) - ne permite sã cunoaºtem tipul argumentului prin tipãrirea simbolului corespunzãtor tipului de date din care acesta face parte. Exemple:
(setq x 4.52) (type 'x) SYM
(type x) REAL (type "proiectare") STR
Funcþia (zerop <arg>) - permite sã determinãm dacã un argument este un numãr întreg sau real ºi îl evalueazã ca zero. Funcþia returneazã True dacã argumentul este un întreg sau real ºi este zero; altfel returneazã nil. Argumentul de tip ºir nu este recunoscut. Exemple:
(zerop 5) nil (zerop 0.0) True
(zerop 0) True (zerop (- 1 1)) True
15.3.8. Funcþii pentru prelucrarea ºirurilor de caractere
Aceste funcþii permit prelucrarea ºirurilor de caractere cu AutoLISP. Existã posibilitatea afiºãrii ºirurilor, testãrii, comparaþiei ºi modificãrii caracteristicilor lor.
Funcþia (strcase <ºir> [<case>] - va lua un ºir ºi va converti toate caracterele din el în litere mari sau mici în funcþie de valoarea argumentului <case>. Dacã argumentul <case> existã ºi nu este nil, toate caracterele ºirului <ºir> sunt convertite în litere mici; dacã argumentul <case> nu existã sau este evaluat ca nil, ºirul va fi convertit în litere mari. Exemple:
(setq x "proiectare")
(strcase x 1) "proiectare"
(strcase x) "PROIECTARE"
(strcase x nil) "PROIECTARE"
Funcþia (strcat <ºir1> <ºir2>....<ºirN>)
Cu aceastã funcþie se pot concatena ºiruri de caractere. Concatenarea va fi în ordinea în care ºirurile apar în listã. Exemplu:
(strcat "Îmi" " place" " AutoLISP") "Îmi place AutoLISP"
Funcþia (strlen <ºir>) - returneazã un numãr întreg care reprezintã numãrul de caractere ale ºirului. Exemplu:
(setq x "AutoLISP")
(strlen x)
Funcþia (substr <ºir> <start> [<nr_caract>]) - este folositã pentru extragerea unui subºir dintr-un ºir. Începând cu <start> subºirul alcãtuit din numãrul de caractere <nr_caract> care urmeazã (inclusiv blancuri), va fi returnat. Dacã numãrul de caractere este omis, restul ºirului care începe cu <start> va fi returnat. Exemple:
(substr "Îmi place AutoLISP" 11) "AutoLISP"
(substr "Îmi place AutoLISP" 5 5) "place"
Funcþia (angtos <unghi> [<mod> [<precizie>]])
Aceastã funcþie converteºte un unghi într-un ºir. Argumentul <unghi> trebuie sã fie un numãr real ºi exprimã valoarea unghiului în radiani. Metoda se bazeazã pe variabila de sistem DIMZIN exprimatã prin argumentul <mod>. Dacã valoarea argumentului mod este:
0 - ºirul va fi exprimat în grade sexazecimale;
1 - formatul va fi grade/minute/secunde;
2 - ºirul va fi exprimat în grade centezimale;
3 - ºirul va fi mãsurat în radiani;
4 - ºirul va fi mãsurat în unitãþi topografice.
Argumentul <precizie> trebuie sã fie întreg ºi exprimã numãrul de zecimale dorite. Argumentele <mod> ºi <precizie> sunt opþionale; dacã nu sunt date vor fi folosite valorile implicite curente ale variabilelor de sistem. Exemplu:
(angtos (/ pi 2) 0 2)
Funcþia (ascii <ºir>) - returneazã codul ASCII (numãr întreg) al argumentului <ºir>. Exemple:
(ascii "U")
(ascii "u")
(ascii "T")
Funcþia (atof <ºir>) - converteºte un ºir care conþine o expresie numericã într-un numãr real. Exemple:
(atof "3.14159")
(atof "numãrul 15")
Funcþia (atoi <ºir>) - converteºte un ºir care conþine o expresie numericã într-un numãr întreg. Exemple:
(atoi "3.14159")
(atoi "numãrul 72")
Funcþia (chr <numãr>) - returneazã caracterul corespunzãtor codului ASCII; realizeazã procesul invers funcþiei "ascii". Exemple:
(chr 83) "S"
(chr 115) "s"
Funcþia (Itoa <întreg>) - converteºte un numãr întreg într-un ºir ASCII. Exemple:
(itoa -35)
(itoa 1997)
Funcþia (read <ºir>) - returneazã primul atom sau listã dintr-un ºir; ºirul trebuie sã fie fãrã blancuri. Exemplu:
(setq a "AutoCAD") "AutoCAD"
(read a) AutoCAD
Funcþia (rtos <numãr> [<mod> [<precizie>]]) - returneazã un ºir ca ºi funcþia "itoa", dar numãrul poate fi formatat în timp ce este citit ca ºir. Dacã este dat un argument <mod>, acesta trebuie sã aibã una din valorile urmãtoare:
1 - creeazã un ºir în notaþie ºtiinþificã;
2 - creeazã un ºir zecimal;
3 - creeazã un ºir în notaþie Engineering;
4 - creeazã un ºir în notaþie arhitecturalã;
5 - creeazã fracþii simple.
Argumentul <precizie> corespunde numãrului de zecimale. Exemple:
(rtos pi 5 8)
(rtos pi 1 4) "3.1416E+00"
15.3.9. Funcþii grafice
Funcþiile grafice în AutoLISP se împart în douã categorii principale: funcþii pentru tratarea graficelor ºi funcþii grafice pentru ecran. Se pot adãuga entitãþi grafice la baza de date cu o categorie de funcþii ºi manipula grafice pe ecranul calculatorului folosind cealaltã categorie de funcþii.
Funcþia (angle <pct1> <pct2>)
Aceastã funcþie returneazã unghiul unei drepte ce uneºte punctul UCS <pct1> cu punctul UCS <pct2>. Acest unghi este mãsurat în radiani în sens trigonometric faþã de direcþia pozitivã a axei OX a planului curent. Exemplu:
(angle '(2.0 2.0) '(5.0 5.0))
Funcþia (distance <pct1> <pct2>)
Aceastã funcþie returneazã distanþa 3D între punctele <pct1> ºi <pct2>. Dacã variabila de sistem FLATLAND este nenulã, DISTANCE aºteaptã puncte 2D (coordonata z este ignoratã). Exemplu:
(distance '(2.0 2.0) '(5.0 5.0))
Funcþia (inters <pct1> <pct2> <pct3> <pct4> [<onseg>])
Funcþia INTERS analizeazã douã linii drepte ºi returneazã punctul lor de intersecþie sau nil dacã ele nu se intersecteazã. Parametrii <pct1> <pct2> sunt capetele primei drepte, iar <pct3> <pct4> sunt capetele celei de-a doua drepte.
Dacã este prezent ºi argumentul opþional <onseg> ºi este nil, atunci liniile definite de cele patru argumente <pct> sunt considerate de lungime infinitã ºi INTERS returneazã punctul lor de intersecþie, chiar dacã acesta nu se aflã pe nici unul dintre segmentele determinate de acele puncte. Dacã argumentul <onseg> lipseºte sau nu este nil, atunci punctul de intersecþie trebuie sã se afle între limitele de segment pentru a fi gãsit de INTERS, altfel se returneazã nil. Exemplu:
(setq a '(0 0) b'(1 1))
(setq c '(0 1) d '(1 0))
(inters a b c d)
Funcþia (osnap <pct> <ºir_mod>)
Aceastã funcþie returneazã un punct care este rezultatul aplicãrii modurilor "object snap" descrise de <ºir_mod> pe punctul <pct>. Exemplu:
(osnap '(1.0 1.0) "mid") nil
Dacã nu se gãseºte nici un punct care sã întruneascã acele condiþii "object snap" exprimate de <ºir_mod> pentru punctul <pct>, atunci se returneazã nil.
Funcþia (polar <pct> <unghi> <distanþã>)
Aceastã funcþie returneazã punctul UCS aflat la unghiul <unghi> ºi distanþa <distanþã> de punctul UCS <pct>. Parametrul <unghi> este exprimat în radiani faþã de direcþia pozitivã a axei OX, în sens trigonometric. Deºi <pct> poate fi un punct 3D, <unghi> este întotdeauna raportat (proiectat pe) planul curent de construcþie. Dacã variabila de sistem FLATLAND este zero, se returneazã un punct 3D, iar altfel 2D. Exemplu:
(polar '(0 0) 45.0 1)
Funcþia (redraw [<nume_entitate> [<mod>]])
Funcþiea REDRAW fãrã argumente va reface imaginea curentã exact ca ºi comanda REDRAW din AutoCAD. Dacã este apelatã cu un argument <nume_entitate> va fi redesenatã entitatea selectatã.
Funcþia (trans <pct> <from> <to> [<disp>])
Aceastã funcþie translateazã un punct dintr-un sistem de coordonate în altul. Argumentul <from> indicã sistemul de coordonate în care este reprezentat punctul <pct>, iar <to> este un cod care specificã sistemul de coordonate dorit pentru punctul returnat. Argumentul opþional <disp>, dacã nu este nil, aratã cã <pct> este un vector 3D în loc de 2D. Argumentele <from> ºi <to> pot fi:
- 0 pentru WCS (World Coordonate System);
- 1 pentru UCS (User Coordonate System);
- 2 pentru viewport-ul curent;
- 3 pentru spaþiul hârtie.
15.3.10. Funcþii pentru introducerea datelor
Pentru a comunica cu AutoLISP-ul ºi prin el cu AutoCAD-ul, utilizatorul trebuie sã introducã anumite valori. Existã multe cãi de comunicare cu AutoCAD-ul: pot fi tipãrite rãspunsurile de la tastaturã, se pot alege valori dintr-un digitizor sau am putea folosi un mouse. AutoLISP-ul oferã un set de funcþii cu ajutorul cãrora putem comunica cu AutoCAD-ul.
Funcþia (getangle [<pct>] [<prompt>])
Aceastã funcþie aºteaptã introducerea de cãtre utilizator a unui unghi; <prompt> este un ºir opþional de afiºat ca prompt, iar <pct> este un punct opþional 2D în UCS-ul curent. Unghiul este exprimat în radiani, cu respectarea planului curent de construcþie. Se poate specifica un unghi prin introducerea unui numãr în formatul curent de unghiuri al AutoCAD-ului, dar este returnat în radiani. Se poate da AutoLISP-ului unghiul dorit pe cale graficã prin indicarea a douã puncte cu mouse-ul, astfel încât AutoCAD-ul sã prezinte o linie elasticã de la primul punct la punctul curent indicat pentru a vizualiza unghiul. Argumentul <pct> (dacã este specificat), va fi considerat primul dintre cele douã puncte. Exemple:
(getangle)
(setq a '(12.34 45.67))
(getangle a "Daþi cel de-al doilea punct: ")
Daþi cel de-al doilea punct: 85.32,90.87
Funcþia (getcorner <pct> [<prompt>])
Aceastã funcþie returneazã un punct <pct> în UCS-ul curent, ca punct de bazã ºi deseneazã un dreptunghi începând din acel punct, pânã în punctul dat cu mouse-ul. exemplu:
(getcorner '(10.00 12.35) "Click pentru punctul opus:") coordonatele punctului opus
Funcþia (getdist [<pct>] [<prompt>])
Aceastã comandã aºteaptã introducerea unei distanþe de cãtre utilizator. Parametrul <prompt> este un ºir opþional ce va fi afiºat ca prompt, iar <pct> este un punct de bazã 2D sau 3D opþional din UCS-ul curent. Se poate specifica o distanþã prin introducerea oricãrui numãr sau se pot da douã puncte, iar AutoCAD-ul va returna distanþa dintre ele. Exemplu:
(getdist '(17.32 20.35) "Faceþi "click" pentru punctul 2 ") distanþa dintre puncte
Funcþia (getint [<prompt>])
Aceastã funcþie aºteaptã introducerea unui întreg ºi returneazã acel întreg. Valoarea poate varia de la -32768 la +32767, iar <prompt> este un ºir opþional de afiºat ca prompt. Exemplu:
(setq num (getint "Introduceþi un numãr:")
Funcþia (getpoint [<pct>] [<prompt>])
Aceastã funcþie aºteaptã introducerea unui punct <pct>. Parametrul <prompt> este un ºir opþional de afiºat ca promp. Se poate rãspunde, specificând un punct prin indicare cu mouse-ul sau dându-i coordonatele. Exemple:
(setq p1 (getpoint "Introduceþi un punct"))
(setq p2 (getpoint '(12.7 20.5) "Al doilea punct:"))
Funcþia (getreal [<prompt>])
Aceastã funcþie aºteaptã introducerea unui numãr real ºi returneazã acel numãr real. Parametrul <prompt> este un ºir opþional de afiºat ca prompt. Exemplu:
(setq val (getreal "Introduceþi un numãr real:"))
Funcþia (getstring [<cr>] [<prompt>])
Funcþia "getstring" aºteaptã introducerea unui ºir ºi returneazã acel ºir. Dacã ºirul este mai lung de 132 de caractere se returneazã primele 132 de caractere. Dacã se adaugã ºi parametrul boolean <cr> care nu este nil, ºirul introdus poate conþine ºi blancuri (trebuind astfel sã fie încheiat cu RETURN). Altfel, ºirul de intrare este încheiat cu blanc sau RETURN. Exemple:
(setq s (getstring))
(setq s (getstring "Care este prenumele dv. ?))
(setq s (getstring T "Care este numele dv. ?))
15.3.11. Funcþii pentru ieºire
În paragraful precedent s-a observat utilitatea unei forme a ecranului text la prompt-urile asociate cu familia de funcþii "get". Acum vom vedea cum, cu ajutorul unor funcþii, AutoLISP trimite textul pe ecran sau într-un fiºier fãrã a aºtepta rãspunsul utilizatorului.
Funcþia (prin1 [<expr> [<descriptor_fiº>]])
Aceastã funcþie tipãreºte expresia <expr> pe ecran sau într-un fiºir ºi returneazã <expr>. Dacã argumentul <descriptor_fiº> existã ºi este valid, se presupune cã un fiºier a fost deschis ºi în acesta se va scrie expresia, altfel expresia este tipãritã pe ecran. Expresia trebuie sã fie de tipul permis de AutoLISP. Se pot tipãri ºiruri, numere întregi ºi reale printre multe tipuri admise. Exemplu:
(setq a 24.82)
(setq b '(m n))
(setq str "AutoCAD\nLISP")
(prin1 a) tipãreºte 24.82 ºi
(prin1 b) tipãreºte (m n) ºi (m n)
(prin1 str) tipãreºte "AutoCAD\nLISP" ºi "AutoCAD\nLISP"
Presupunând cã "f" este un descriptor valid al unui fiºier deschis pentru scris, la apelarea funcþiei:
(prin1 "AutoCAD" f)
calculatorul scrie "AutoCAD" în fiºierul specificat ºi va returna "AutoCAD".
Funcþia (princ [<expr> [<discriptor_fiº>]]) - este similarã cu "prin1", dar eventualele caractere de control care apar în expresie nu sunt tipãrite. Exemplu:
(setq str "AutoCAD\nLISP")
(princ str) tipãreºte: AutoCAD
LISP
ºi returneazã "AutoCAD\nLISP"
Funcþia (princ) scrisã fãrã expresie, determinã AutoLISP sã nu afiºeze nimic pe linia de comandã.
Funcþia (print [<expr> [<descriptor_fiº>]]) - face în mod esenþial acelaºi lucru ca ºi "prin1". Singura diferenþã este cã funcþia "print" trece la o linie nouã înaintea tipãririi ºirului ºi adaugã un blanc la sfârºit. Un ºir ca "Acesta este ºirul meu" este tipãrit ca ºi cum ar fi fost "\nAcesta este ºirul meu.\n", dar tipãrit cu ajutorul funcþiei "prin1". Exemplu:
(setq str "AutoCAD\nLISP")
(print str) tipãreºte: linie nouã
"AutoCAD\nLISP" spaþiu
ºi returneazã "AutoCAD\nLISP"
Funcþia (prompt <mesaj>)
Aceastã funcþie afiºeazã <mesaj> (care este un ºir) pe suprafaþa ecranului ºi returneazã nil. Pe configuraþiile AutoCAD cu douã ecrane, funcþia "prompt" afiºeazã mesajul pe ambele ecrane ºi de aceea este preferabilã funcþiei "princ". Exemple:
(setq str "AutoCAD\nLISP")
(prompt str) tipãreºte: AutoCAD
LISP ºi nil
(prompt "Noua valoare:") tipãreºte Noua valoare: ºi nil.
Funcþia (terpri) - realizeazã simpla cerinþã de tipãrire pe ecran a unei singure linii ºi returneazã nil. Exemplu:
(terpri) nil
ºi o nouã linie este afiºatã pe ecran.
15.3.12. Funcþii pentru operaþii cu fiºiere
AutoLISP este capabil sã scrie ºi sã citeascã fiºiere, precum sã ºi adauge noi date în acestea. Pentru a face acest lucru, AutoLISP ne oferã accesul la sistemul de operare a funcþiilor prin propriul sãu mecanism. Cine este familiarizat cu limbajul "C" va constata cã mecanismul AutoLISP nu diferã mult de metodele de accesare a fiºierelor pe care le ºtie deja.
Funcþia (open <nume_fiº> <mod>) - deschide un fiºier pentru accesarea funcþiilor AutoLISP de intrare/ieºire. Aceastã funcþie returneazã un descriptor de fiºier pentru a fi folosit de alte funcþii de intrare/ieºire; de aceea trebuie sã fie atribuitã unui simbol folosind funcþia "setq". Exemplu:
(setq a (open "test.lsp" "r"))
Argumentul <nume_fiº> este un ºir care specificã numele ºi extensia fiºierului care va fi deschis. Dacã numele fiºierului se aflã într-un director (de exemplu "cad"), trebuie specificatã ºi calea sub forma: "/cad/test.lsp". Argumentul <mod> este un simbol de citit/scris ºi trebuie sã fie un ºir care conþine o singurã literã micã, cu urmãtoarele semnificaþii:
"r" - deschide fiºierul pentru citit; dacã <nume_fiº> nu existã, este returnat nil.
"w" - deschide fiºierul pentru scris. Dacã <nume_fiº> nu existã, un nou fiºier este creat ºi deschis; dacã existã deja, datele sunt scrise peste cele existente în fiºier.
"a" - deschide fiºierul pentru completare. Dacã <nume_fiº> nu existã un nou fiºier este creat ºi deschis; dacã <nume_fiº> existã deja, el este deschis ºi pointer-ul va fi poziþionat la sfârºitul ultimei date din fiºier, iar noile date sunt scrise aici ºi adãugate la cele existente. În exemplele urmãtoare vom presupune cã numele fiºierelor nu existã:
(setq a (open "test1.txt" "w")) <File: #nnn>
(setq a (open "test2.lsp" "r")) nil
Funcþia (close <descriptor_fiº>) - închide un fiºier ºi returneazã nil. Argumentul <descriptor_fiº> este un descriptor de fiºier obþinut de la funcþia "open". Dupã o închidere descriptorul de fiºier este neschimbat, dar nu mai este valid. De exemplu, presupunând cã "x" este un descriptor valid al fiºierului deschis,
(close x) închide fiºierul asociat ºi returneazã nil.
Funcþia (findfile <nume_fiº>)
Aceastã funcþie cautã în biblioteca AutoCAD calea pentru fiºierul specificat de <nume_fiº> ºi dacã acesta este gãsit, returneazã calea ºi numele fiºierului. În exemplele urmãtoare vom presupune cã fiºierul "prog1.lsp" existã ºi se aflã în directorul /acad , fiºierul "prog2 se aflã în directorul /acad/support ºi fiºierul "prog3.lsp" nu existã; atunci:
(findfile "prog1.lsp") "/acad/prog1.lsp"
(findfile "prog2.txt") "/acad/suport/prog2.txt"
(findefile "prog3.lsp") nil
Funcþia (load <nume_fiº> [<onfailure>])
Aceastã funcþie încarcã un fiºier de expresii AutoLISP ºi evalueazã acele expresii. Parametrul <nume_fiº> este un ºir care reprezintã numele fiºierului fãrã extensie (aceasta fiind presupusã implicit ca fiind .LSP). În nume pot fi incluse calea ºi "drive"-ul, ca de exemplu "A:/programe/test". Dacã se folosesc backslash-uri pentru separarea subdirectoarelor, va trebui sã utilizãm douã caractere de acest fel pentru a obþine un slash într-un ºir; exemplu "A:\\programe\\test".
Dacã operaþia se încheie cu succes, LOAD returneazã numele ultimei funcþii definite în fiºier. De exemplu, presupunând cã fiºierul test de mai sus cuprinde mai multe funcþii, ultima fiind denumitã FUNC, la încãrcarea acestui fiºier:
(load "test") este returnat FUNC
În cazul în care operaþia eºueazã, apare un mesaj de eroare AutoLISP. Dacã, însã este furnizatã o valoare pentru <onfailure>, LOAD returneazã valoarea acestui argument în locul mesajului de eroare. Exemple:
(load "test1" "Greºit") Greºit
(load "test2") mesaj eroare AutoLISP
Funcþia (read-char [<descriptor_fiº>]) - citeºte un singur caracter de la tastaturã sau din fiºierul deschis (descris prin <descriptor_fiº>) ºi returneazã un cod ASCII (întreg) reprezentând caracterul citit. Dacã argumentul <descriptor_fiº> nu este specificat ºi nu existã caractere date de la tastaturã, funcþia "read-char" aºteaptã sã le introducem. De exemplu, presupunând cã nu s-a introdus nici un caracter,
(read-char)
aºteaptã sã introducem ceva. Dacã se introduce ABC urmat de Enter "read-char" returneazã 65 (codul zecimal ASCII pentru litera A). La urmãtoarele trei apelãri, funcþia "read-char" returneazã 66 (litera B), 67 (litera C) ºi respectiv 10 (linie nouã). Dacã este apelatã din nou, "read-char" aºteaptã din nou introducerea unui caracter.
Funcþia (read-line [<descriptor_fiº>]) - citeºte un ºir de la tastaturã sau dintr-un fiºier deschis de <descriptor_fiº>. Dacã "read-line" ajunge la sfârºitul fiºierului, returneazã nil, altfel returneazã ºirul citit. Exemplu:
(read-line f)
unde "f" este un descriptor valid
Funcþia (write-char <numãr> [<descriptor_fiº>]) - scrie un caracter pe ecran sau în fiºierul descris de <descriptor_fiº>. Argumentul <numãr> este codul zecimal ASCII pentru caracterul care urmeazã sã fie scris ºi reprezintã de asemenea valoarea returnatã de funcþie. Exemple:
(write-char 67) 67 ºi scrie litera C pe ecran.
Presupunând cã "f" este un descriptor pentru un fiºier deschis
(write-char 67 f) 67 ºi scrie litera C în fiºier
Funcþia (write-line <ºir> [<descriptor_fiº>]) - scrie ºirul pe ecran sau în fiºierul deschis (descris de <descriptor_fiº>). Funcþia returneazã ºirul menþionat în mod normal, dar omite menþiunile când scrie în fiºier. De exemplu, presupunând cã "f" este un descriptor valid al unui fiºier deschis
(writ-line "Test" f) scrie Test în fiºier ºi "Test"
|