Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Functii AutoLISP

calculatoare



+ Font mai mare | - Font mai mic



Functii AutoLISP

 Functiile AutoLISP prezentate in acest capitol sunt implementate in AutoLISP Release 12. Majoritatea sunt compatibile cu cele din versiunile anterioare. Vom prezenta in continuare grupurile functionale, urmand ca la sfarsit sa prezentam un catalog alfabetic al functiilor AutoLISP.

 Definirea functiilor

(defun simbol lista_parametri expresii)



 Dupa cum s-a precizat deja in cap. 1, in LISP, ca si in alte limbaje de programare, exista posibilitatea incapsularii unor prelucrari intr-una singura, careia i se da un nume. Functia DEFUN creeaza o noua functie, avand ca nume primul argument (simbol), ca parametri formali al doilea argument (lista_parametri), iar corpul functiei fiind alcatuit din expresiile care urmeaza, pana la inchiderea ultimei paranteze. DEFUN intoarce numele functiei create. Lista parametrilor poate sa contina atat parametri globali, cat si parametri locali, sau poate sa fie vida. Daca exista ambele tipuri de parametri, ei sunt despartiti prin caracterul '/'.
 Exemplu:
  (defun func (x / temp) ; x este o variabila globala, iar temp una locala.

 Apelarea acestei functii se va face astfel:
  (func x temp)
Deci, apelul unei functii se face prin numele ei insotit de lista parametrilor, si va intoarce rezultatul evaluarii expresiei continute in corpul functiei.
 Pentru exemplificare, definim o functie de incrementare:

 (defun inc (n i)  ; n este numarul incrementat, iar i este incrementul
  (+ i n)  ; intoarce suma i+n
 )   ; intoarce inc

 - apelarea functiei inc:

 (inc 5 2)   ; intoarce 7

 Am definit o functie dintr-o singura expresie. Iata si una alcatuita din mai multe expresii:

 (defun incdec (n i d) ; incrementeaza pe n cu i, apoi il decrementeaza cu d
  (setq n (+ i n)) ; intoarce noua valoare a lui n
  (- n d)  ; intoarce rezultatul decrementarii
 )

 (incdec 5 2 1)  ; intoarce 6, deci rezultatul ultimei evaluari

 Am amintit deja in cap.1 modul de creare a unei noi comenzi AutoCAD. Mai adaugam un exemplu, de selectare a entitatilor cu culoarea rosie (vezi si exemplul din cap.1 si functia ssget din cap.2):

 (defun c:rosu()
  (setq m (ssget 'X' '((62 . 1))))
 )

 Lansarea comenzii:

 Command: rosu
 <Selection set: 1>
 Command:

 Am creat prin lansarea comenzii ROSU o multime de selectie m, care contine toate entitatile din desenul curent care au culoarea rosie.
 Deci, prin adaugarea prefixului C: la numele functiei se defineste o noua comanda AutoCAD.
Pentru inlocuirea unei comenzi predefinite, vezi functia Undefine.
 

 Tratarea erorilor

 De fapt, aici avem doua functii care afiseaza mesaje de eroare sau avertisment.

 (*error* sir)

 Daca se intalneste o eroare, se tipareste mesajul specificat de argumentul functiei (sir).
Definirea unei noi functii *error*:

 (defun *error* (msg)
  (princ 'error: ')
  (princ msg)
  (terpri)
 )

 Aceasta functie va inlocui rutina implicita de tratare a erorilor a AutoLISP-ului; la depistarea unei erori de catre interpretor va aparea mesajul 'error: ' si descrierea erorii respective. Pentru lista mesajelor de eroare, vezi Anexa D, 'AutoLISP Programmer's Reference Manual' - Anexa D sau revista 'HCF' nr.6.

 (alert sir)

 Aceasta functie determina aparitia unei ferestre, cu titlul 'AutoCAD alert' si avand afisat in interior mesajul dat ca argument al functiei. Sunt admise si caracterele de control (cap.1).

 Ex.:
  (alert 'Acesta este n avertisment')

 Functia alert este disponibila numai in Release 12.
 

 Interfatarea cu AutoCAD-ul

 (command [argumente] )

 Se vor executa una sau mai multe comenzi AutoCAD si se intoarce nil. Argumentele vor fi cele cerute de comanda executata; numele comenzii este primul argument din lista. Apelarea functiei command fara argumente este echivalenta cu apasarea combinatiei de taste Ctrl-C. Tasta Enter este echivalata de un sir nul ('').

 Exemplu:
  (setq p1 '(1 1) p2 '(2 2))
  (command 'line' p1 p2 '')

 Nu sunt admise printre argumente functiile getxxx. Acestea vor fi utilizate inaintea apelarii comenzii AutoCAD:

 (setq t (getstring 'nTextul: '))
 (command 'text' p1 '' '' t)

Intr-un asemenea caz se poate folosi si pause:

 (command 'text' p1 ' ' pause)

 (getvar nume)

 nume este numele variabilei a carei valoare va fi citita, caci aceasta functie ne permite sa citim valoarea unei variabile la un moment dat. Astfel, daca (getvar 'PDMODE')  intoarce 34, inseamna ca valoarea variabilei PDMODE in acest moment este 34. Daca numele variabilei apelate nu este cunoscut de AutoCAD, se va intoarce nil.
Lista variabilelor AutoCAD poate fi gasita in Anexa A din AutoCAD Reference Manual.

 (setvar nume valoare)

 Aceasta functie permite stabilirea unei valori pentru o variabila. De exemplu,

 (setvar 'PDMODE' 34)  stabileste valoarea 34 pentru variabila PDMODE.

 (findfile nume_fis)

 Functia findfile va cauta fisierul cu numele nume_fis in directorii de lucru, si va intoarce calea pe care a fost gasit, sau nil daca fisierul nu a fost gasit in nici unul din directorii respectivi.
Ordinea de cautare este:

 - directorul curent
 - directorul care contine desenul curent
 - directorii specificati de variabilele AutoCAD
 - directorul care contine fisierele program AutoCAD.

 Acesti directori nu trebuie sa fie neaparat diferiti.

 Exemple:
  (findfile 'abc.lsp')
  '/acad/abc.lsp'
  (findfile 'xyz.txt')
  '/acad/support/xyz.txt'
  (findfile 'abc.txt')
  nil

 Numele fisierului intors de AutoLISP la evaluarea functiei findfile poate fi utilizat ca argument al functiei open, astfel:

 (setq nume (findfile 'abc.txt'))
 (if (not (equal nume nil))
  (setq f (open nume 'r'))
 )

 (getfiled titlu nume_fis ext flags)

 Aceasta functie este disponibila numai in AutoLISP Release 12; ea determina aparitia unei ferestre de dialog (dialogue box) ce contine lista fisierelor cu extensia specificata. 'titlu' reprezinta eticheta ferestrei de dialog create; apare in linia cea mai de sus a ferestrei. 'nume_fis' este numele implicit al fisierului de incarcat - aici se poate specifica si un director sau o cale de cautare a fisierelor.
'ext' este extensia fisierelor afisate. 'flags' este un numar intreg ce reprezinta o suma de biti. Sunt folositi 4 biti, cu urmatoarea semnificatie:

bit     valoare flag     Semnificatie
0         1     - daca fisierul specificat nu exista, se va afisa un mesaj, asteptandu-se confirmarea crearii fisierului respectiv
1         2     - dezactiveaza butonul 'Type it' din fereastra de dialog; acest buton se folosea pentru introducerea numelui fisierului prin tastare, fara a-l mai cauta in lista afisata
2         4     - setarea acestui bit permite utilizatorului sa introduca o extensie oarecare pentru fisierul cautat, indiferent de extensia implicita specificata la apelarea functiei
3         8     - permite cautarea in alti directori decat cel curent.

 (osnap pt mod)

 Aceasta functie este echivalenta comenzii OSNAP, adica permite localizarea unui punct prin intermediul modurilor OSNAP. Sunt permise mai multe moduri, separate prin virgula:

 (setq p1 (osnap p2 'cen,mid'))

- p2 este un punct oarecare, eventual introdus cu ajutorul mouse-ului prin functia getpoint:
 
 (setq p2 (getpoint))

- p1 este punctul determinat cu ajutorul modurilor 'cen' si 'mid', in functie de punctul p2 si valoarea variabilei APERTURE (latura patratelului selector). Daca p1 nu este identificat prin nici unul din modurile din lista (in acest caz 'cen' si 'mid'), va lua valoarea nil.

 Modurile OSNAP sunt (vezi si manualul AutoCAD):

  CEN - centrul arcului sau cercului
  END - punctul de capat al liniei sau arcului
  INS - punctul de insertie pentru Text/ Block/ Shape/ Attribute
  INT - punctul de intersectie a doua entitati de tip linie, arc, cerc, polilinie
  MID - mijlocul unei linii sau al unui arc
  NEA - punctul cel mai apropiat fata de centrul patratelului selector, aflat pe portiunea din entitatea selectata ce se gaseste in interiorul patratelului
  NOD - punctul (entitate 'POINT') aflat in interiorul patratelului selector
  PER - punctul aflat la intersectia dintre entitatea selectata si perpendiculara dusa pe aceasta din punctul curent
  QUA - punctul aflat pe un arc sau cerc intr-una din pozitiile trigonometrice 0, 90, 180, 270 grade
  QUI - alege, in cazul actiunii mai multor moduri OSNAP, punctul care indeplineste primul conditiile cerute
  TAN - punctul de tangenta al unui arc sau cerc cu dreapta care pleaca de la punctul curent.
 

 Functii geometrice

 Functiile din acest grup se folosesc pentru a obtine informatii geometrice, cum ar fi: distante, unghiuri, puncte de intersectie.

 (distance p1 p2)

 Aceasta functie intoarce distanta dintre punctele p1 si p2. Daca sunt puncte 2D, coordonata Z este ignorata (rezulta distanta dintre doua proiectii pe un plan).

 Exemplu:
  (distance '(1.0 2.5 3.0) '(7.7 2.5 3.0))  intoarce 6.7

 (angle p1 p2)

 Cu functia angle se determina unghiul dintre doua linii. Prima linie este paralela cu axa 0x prin punctul p1. A doua linie este data de punctele p1 si p2. Unghiul este masurat in radiani, in sens trigonometric.

 De exemplu,
  (angle '(1.0 1.0) '(1.0 4.0))  intoarce 1.5708

 (polar p1 unghi dist)

 Se determina un punct in coordonate polare, relativ la punctul p1. Unghiul 'unghi' este dat in radiani si este masurat  ca in cazul functiei angle, plecand de la axa 0x in sens trigonometric. 'dist' este distanta dintre punctul p1 si punctul determinat.

 Ex.:
  (polar '(1 1 3.5) 0.785398 1.414214) intoarce (2.0 2.0 3.5)

  (1 1 3.5)  este punctul p1
  (2.0 2.0 3.5) este punctul rezultat
  0.785398 este unghiul, in radiani
  1.414214 este distanta dintre cele doua puncte.

 (inters p1 p2 p3 p4 [onseg])

 Prin aceasta functie se obtine lista unui punct ce reprezinta intersectia dintre dreptele determinate de punctele p1, p2 si respectiv p3,p4. Daca cele doua linii nu se intersecteaza, se intoarce nil. Daca toate cele patru puncte sunt 3D, se obtine un punct 3D; daca cel putin unul este punct 2D, se intoarce intersectia proiectiilor celor doua linii pe un plan, deci un punct 2D.
 Variabila 'onseg' poate sa existe sau nu. Daca exista si este nil se obtine intersectia a doua linii de lungime infinita (p1 si p2 nu sunt capete, ci puncte prin care trece linia; la fel p3 si p4). Daca 'onseg' este T (true) sau nu exista, se obtine intersectia segmentelor cuprinse intre p1 si p2 si respectiv p3 si p4.

 Exemplu:
  Avem punctele:
   p1 - (1.0 1.0)
   p2 - (9.0 9.0)
   p3 - (4.0 1.0)
   p4 - (4.0 2.0)

  (inters p1 p2 p3 p4) intoarce nil
  (inters p1 p2 p3 p4 T) intoarce nil
  (inters p1 p2 p3 p4 nil) intoarce (4.0 4.0)
 
 (textbox elist)

 Functia textbox (disponibila numai in Release 12) intoarce coordonatele capetelor diagonalei dreptunghiului ce incadreaza textul a carei lista este specificata prin elist.
 Lista elist poate fi obtinuta cu ajutorul functiei entget. Astfel, dupa desenarea unui text, se poate introduce:
  Command: (setq e (entget (entlast)))
  - va fi afisata lista entitatii 'TEXT' create anterior
  Command: (textbox e)
  - va fi afisata o lista cuprinzand doua subliste, ale carei elemente sunt coordonatele celor doua capete ale diagonalei.
 Daca textul este rotit, pot sa apara probleme. In acest caz, consultati AutoLISP Programmer's Reference Manual.
 

 Functii pentru introducerea datelor

 Am amintit deja tipurile de date folosite de AutoLISP, precum si functiile prin care AutoLISP poate prelua date de la utilizator (functiile getxxx). Le reluam in continuare.

 (initget [bits] [sir])

 Aceasta functie stabileste optiunile de utilizare a functiilor entsel, nentsel, nentselp sau getxxx (exceptand getstring, getenv si getvar). Initget intoarce intotdeauna nil.
 
 Argumentul [bits] poate lua valorile:

 1 - dezactiveaza intrare nula
 2 - dezactiveaza valori zero
 4 - dezactiveaza valori negative
 8 - nu verifica limitele (indiferent de var. LIMCHECK)
 16 - intoarce puncte 3D in loc de puncte 2D
 32 - foloseste linie intrerupta pentru linia 'elastica'

 Se poate folosi pentru initget o suma a bitilor de mai sus (adica mai multi biti setati in acelasi timp).
 Daca utilizatorul nu respecta una sau mai multe optiuni specificate prin initget, AutoCAD va cere repetarea introducerii. Astfel, pentru a nu permite introducerea valorilor negative sau zero se poate folosi   (initget 6)  sau  (initget (+ 2 4)).
 Daca la urmatoarea functie getxxx se va introduce o valoare nula sau negativa, se va cere repetarea introducerii pana cand se introduce o valoare valida.

 Argumentul [sir] este o lista de cuvinte cheie ce vor fi verificate de functia getxxx urmatoare daca nu se introduce tipul asteptat pentru intrare (de ex. pentru getpoint nu se introduce un punct, ci un caracter); efectul este asemanator cu cel de la comenzile AutoCAD cu mai multe optiuni, cum ar fi la CHPROP: LType, LAyer, Color samd.
 Functiile de intrare pot fi afectate de initget.

 Bitii de control si lista de cuvinte cheie se aplica numai pe urmatorul apel al unei functii getxxx, dupa care sunt automat dezactivati; trebuie deci sa fie apelata initget pentru fiecare functie getxxx care o necesita.

 (getangle [pct] [prompt])

 Aceasta functie asteapta introducerea de catre utilizator a unui unghi (in grade sau prin punctare) si intoarce valoarea acestuia in radiani. Unghiul se masoara in sens trigonometric, de la valoarea stabilita prin setarea variabilei ANGBASE. Valoarea returnata (in radiani) este relativa la UCS-ul curent, in planul x0y al acestuia.
 Argumentul [prompt] este un sir de caractere afisat in asteptarea introducerii unghiului.

 Ex:
  (getangle '(1.0 3.5) 'Introduceti unghiul: ')
 sau
  (getangle 'Introduceti unghiul: ')

 Unghiul introdus depinde de setarea variabilelor ANGDIR si ANGBASE. Unghiul obtinut (intors de getangle) depinde numai de sistemul de coordonate.
 Cand unghiul este definit prin indicarea a doua puncte, este masurata diferenta dintre unghiul initial (ANGBASE) si unghiul facut de dreapta ce trece prin cele doua puncte cu axa 0x. Daca exista argumentul [pct], acesta este primul din cele doua puncte.

 (getorient [pct] [prompt])

 Aceasta functie este similara functiei getangle, dar valoarea intoarsa la apelarea ei nu este afectata de starea variabilelor ANGDIR si ANGBASE. Unghiul este masurat intotdeauna incepand de la 0 radiani (axa 0x), in sens trigonometric. Argumentele [pct] si [prompt] au aceeasi semnificatie ca la functia getangle.

 (getpoint [pct] [prompt])

 Functia getpoint se foloseste pentru introducerea punctelor. Acestea pot fi introduse prin specificarea coordonatelor (x, y in cazul punctelor 2D si x, y, z in cazul punctelor 3D) sau prin punctare cu mouse-ul. Daca exista argumentul [pct], acesta este considerat punct de baza.

 Ex:
  (setq p (getpoint))
  (setq p (getpoint 'Introduceti un punct: '))
  (setq p (getpoint '(1.0 1.0) 'Al doilea punct: '))

 (getcorner pct [prompt])

 Functia getcorner intoarce un punct in sistemul curent de coordonate, ca si functia getpoint, dar accepta ca argument un punct, care va fi punctul de baza (coltul din stanga-jos) al unui dreptunghi, celalalt colt fiind punctul intors de getcorner. Daca punctul de baza este un punct 3D, coordonata Z este ignorata. Coordonata Z a punctului obtinut este elevatia curenta.

 (getdist [pct] [prompt])

 Functia getdist determina citirea unei distante, care poate fi introdusa ca numar real, prin tastarea acestuia, sau prin specificarea a doua puncte, functia intorcand distanta dintre acestea. Daca punctele sunt 3D, distanta intoarsa de getdist este distanta in spatiu dintre ele. Daca este setat bitul 16 de la functia initget, se ignora coordonata Z.

 Ex.: (setq dist (getdist))
  (setq dist (getdist '(0.0 10.0)))
  (setq dist (getdist 'Introduceti distanta: '))
  (setq dist (getdist '(0.0 10.0) 'Introduceti distanta: '))

 (getint [prompt])

 Functia getint se foloseste pentru citirea unui numar intreg (de la tastatura). Valorile admise sunt cuprinse intre -32768 si +32767.

 Ex.: (setq n (getint))
  (setq n (getint 'nIntroduceti numarul: '))

 (getreal [prompt])

 Functia getreal se foloseste pentru citirea unui numar intreg (de la tastatura).

 Ex.: (setq r (getreal))
  (setq r (getreal 'nIntroduceti numarul: '))

 (getstring [cr] [prompt])

 Aceasta functie se foloseste pentru citirea de la tastatura a unui sir de caractere. Daca sirul introdus are mai mult de 132 de caractere, functia getstring intoarce un subsir format din primele 132 de caractere. Daca sirul contine caracterul '' (backslash), acesta este transformat in '' (doua caractere).
 Daca argumentul [cr] este prezent si nu este nil, sirul introdus poate sa contina blancuri (spatii), si trebuie sa se incheie cu Enter. Altfel, sirul se poate incheia cu Enter sau blanc.

 Ex.:
  (setq sir (getstring 'Cum te cheama? '))
  - raspuns: Ion Ion
  - functia intoarce: 'Ion'

  (setq sir (getstring T 'Cum te cheama? '))
  - raspuns: Ion Ion
  - functia intoarce: 'Ion Ion'

  (setq numefis (getstring 'Nume fisier: '))
  - raspuns: acadfisi
  - functia intoarce: 'acadfisi'

 (getkword [prompt])

 Functia getkword permite introducerea unui cuvant cheie de catre utilizator. Lista cuvintelor cheie admise este stabilita anterior, prin functia initget. Cuvantul cheie este returnat de functie ca un sir de caractere. Daca raspunsul nu este valid, AutoCAD reincearca citirea, intorcand mesajul 'Try again: Daca raspunsul este nul (Enter), functia intoarce nil. De asemenea, daca nu este precedata de initget, functia intoarce nil.

 Ex.: (initget 1 'Yes No')
  (setq x (getkword 'Sigur? (Yes/ No)'))

 In functie de raspunsul utilizatorului, variabila x poate lua valorile 'Yes' sau 'No'.
 

 Conversii

 (rtos numar [mod [precizie]])

 Aceasta functie transforma un numar intr-un sir (care este reprezentarea numarului), in functie de argumentele 'mod' si 'precizie', de variabila AutoCAD 'UNITMODE' si de variabila de cotare 'DIMZIN'. Modul si precizia sunt numere intregi. Valorile pentru 'mod' determina formatul de reprezentare a numerelor:

Mod     Format
1         stiintific
2         zecimal
3         ingineresc (in inch, zecimal)
4         arhitectural (in inch, fractional)
5         fractional

 Argumentele 'mod' si 'precizie' corespund variabilelor AutoCAD 'LUNITS' si 'LUPREC'. Daca sunt omise aceste argumente, rtos va tine seama de setarile curente ale respectivelor variabile.  Variabila 'UNITMODE' afecteaza formatul de conversie cand modul este 3, 4 sau 5.

 (distof sir [mod])

 Se transforma un sir care contine un numar real in formatul de afisare specificat de argumentul [mod], intr-o valoare reala.
 Argumentul [mod] specifica unitatile in care este formatat sirul. Valoarea trebuie sa corespunda valorilor determinate de variabila AutoCAD 'LUNITS'.

Mod     Format
1         stiintific
2         zecimal
3         ingineresc
4         arhitectural
5         fractional

 Functiile rtos si distof sunt complementare; deci dintr-un sir obtinut cu rtos se poate obtine valoarea initiala cu distof (in acelasi mod).

 (angtos unghi [mod [precizie]])

 Functia angtos preia un unghi (exprimat in radiani) si il returneaza sub forma unui sir, in functie de valorile argumentelor 'mod' si 'precizie', de variabila 'UNITMODE' si variabila de cotare 'DIMZIN'. Formatul depinde de 'mod' conform tabelei:

Mod     Format
0         grade zecimale
1         grade/ minute/ secunde
2         grade sexagesimale
3         radiani
4         unitati topografice

 Daca argumentele 'mod' si 'precizie' sunt omise, angtos va tine seama de setarea variabilelor AUNITS si AUPREC.
 Se accepta ca argument o valoare negativa pentru unghi, dar este transformata intr-una pozitiva intre 0 si 2* radiani.

 Ex.: (angtos 0.785398 0 2) intoarce '45.00'
  (angtos -0.785398 0 2) intoarce '315.00'

 (angtof sir [mod])

 Functia angtof transforma un sir care reprezinta un unghi in formatul de afisare specificat prin [mod], intr-o valoare reala. Valoarea rezultata exprima unghiul in radiani.
 Modul este acelasi cu cel de la functia angtos. Daca argumentul [mod] lipseste, se tine seama de setarea variabilelor AUNITS si AUPREC.
 Functiile angtos si angtof sunt complementare (vezi si rtos si distof).

 (cvunit val de_la la)

 Aceasta functie transforma o valoare sau coordonatele unui punct dintr-un sistem de unitati de masura in altul (vezi pentru sisteme cunoscute 'AutoCAD Customization Manual', cap.2). Daca operatia este incheiata cu succes, se obtine valoarea (sau punctul) exprimata in noile unitati, altfel se intoarce nil.

 Ex.: (cvunit 1 'minute' 'second')
  60.0
  (cvunit 1 'gallon' 'furlong')
  nil
  (cvunit 1.0 'inch' 'cm')
  2.54
  (cvunit 1.0 'acre' 'sq yard')
  4840.0
  (cvunit '(1.0 2.5) 'ft' 'in')
  (12.0 30.0)
  (cvunit '(1 2 3) 'ft' 'in')
  (12.0 24.0 36.0)

 Argumentele 'de_la' si 'la' pot fi oricare dintre tipurile de unitati stocate in fisierul 'acad.unt'.
 

 Schimbarea sistemului de coordonate

 (trans punct de_la la [disp])

 Aceasta functie translateaza un punct dintr-un sistem de coordonate in altul. Argumentul 'punct' este punctul care trebuie translatat (lista de trei coordonate, care pot sa reprezinte si un vector de deplasare), 'de_la' este un cod care indica sistemul de coordonate in care este exprimat 'punct', iar 'la' este un cod care specifica sistemul de coordonate dorit pentru punctul returnat. Argumentul [disp], daca exista si nu este nil, arata ca 'punct'  trebuie sa fie tratat ca un vector de deplasare 3D.  Argumentele 'de_la' si 'la' pot fi:  - un cod intreg conform tabelei:

Cod     Sistemul de coordonate
0         WCS
1         UCS (curent)
2         DCS (pentru viewport-ul curent se foloseste impreuna cu 0 sau 1) (pentru 'model space' se foloseste cu 3)
3         DCS 'paper space' (PSDCS) (se foloseste numai cu 2)

 - un nume de entitate, asa cum este returnat de functiile entnext, entlast, entsel si ssname.
Functia trans va translata un punct la si de_la sistemul de coordonate al Entitatii (ECS = Entity Coordinate System) al unei entitati particulare. Pentru unele entitati, ECS este echivalent cu WCS.
 - un vector 3D ('extrusion vector'), dat ca o lista de trei numere reale. Aceasta este o alta metoda de conversie la si de_la ECS-ul unei entitati. Nu functioneaza  pentru entitati al caror ECS este WCS.
 Trans returneaza un punct 3D in sistemul de coordonate cerut de 'la'. Astfel, dandu-se un UCS care este rotit cu 90  in sens trigonometric in jurul axei Z a sistemului WCS:

  (trans '(1.0 2.0 3.0) 0 1) intoarce (2.0 -1.0 3.0)
  (trans '(1.0 2.0 3.0) 1 0) intoarce (-2.0 1.0 3.0)

 Sistemele de coordonate suportate de trans:

 WCS - (World Coordinate System) - sistemul de coordonate fundamental. Toate celelalte sisteme de coordonate se definesc raportat la acesta. WCS nu se schimba niciodata.
 UCS - (User Coordinate System) - sistemul de coordonate utilizator. Toate punctele de intrare sunt interpretate raportat la acest sistem. Din acest motiv, daca doriti sa transmiteti valori de coordonate altor sisteme (WCS, DCS, ECS) trebuie sa le convertiti mai intai la UCS, folosind functia trans.
 ECS - (Entity Coordinate System) - relativ la acest sistem de coordonate sunt masurate valorile coordonatelor returnate de entget. Aceste valori sunt inutile daca nu sunt raportate la sistemul de coordonate corespunzator. De exemplu, pentru a trasa o linie din punctul de insertie al unui text (pct), se va face transformarea (trans pct et 1), unde et este numele entitatii de tip TEXT. Pentru a fi folosite cu entmod, trebuie convertite valorile la ECS.
 DCS - (Display Coordinate System) - sistemul de coordonate in care se transforma imaginile inainte de a fi afisate. Originea este punctul TARGET, iar directia de privire axa 0z. De exemplu, pentru a stabili care capat al unei linii pare mai apropiat de un punct introdus din punctul de vedere al privitorului, se vor converti coordonatele capetelor liniei din ECS in DCS si coordonatele punctului introdus din UCS in DCS:
  (trans pu 1 2) ; pu = punct introdus de utilizator
  (trans pc lin 2) ; pc = punct capat linie  ; lin = nume entitate LINE
 PSDCS - (Paper Space Display Coordinate System) - acest sistem de coordonate poate fi transformat numai in sau din sistemul DCS din viewport-ul curent in 'model space'. Este o transformare 2D, in care coordonatele x si y sunt scalate si sunt deplasate daca argumentul [disp] este 0. Coordonata z este scalata, dar niciodata translatata. PSDCS poate fi transformat numai in sau din DCS!

 Trans poate transforma si puncte 2D, completand in mod conventional coordonata Z, astfel:

Sistem de coord. initial     Punct  /    Deplasare
WCS             0.0 0.0
UCS              elevatia curenta / 0.0
ECS               0.0 / 0.0
DCS               proiectie pe planul curent de constructie (pe XY UCS + elevatia curenta) /  0.0
 

 Calibrarea digitizorului

 (tablet cod [row1 row2 row3 directie])

 Aceasta functie se foloseste pentru citirea sau stabilirea calibrarii digitizorului. Se poate folosi simplu pentru salvarea si refacerea calibrarii (tablet cod), sau pentru crearea unei noi matrici de transformare.
 Argumentele functiei:
  cod - un numar intreg; daca este 0, tablet intoarce calibrarea curenta; in acest caz, celelalte argumente pot fi omise. Daca valoarea lui este 1, tablet stabileste noua calibrare in functie de celelalte argumente.
  row1, row2, row3 - 3 puncte 3D. Coordonatele punctelor vor fi elementele celor 3 linii ale matricei de transformare.
  directia - un punct 3D. Acesta este vectorul (exprimat in sistemul de coordonate WCS) normalei la planul care reprezinta suprafata tabletei de digitizare.

 Calibrarea curenta se poate obtine astfel:

  (defun C:TABGET ()
   (setq tcal (tablet 0))
   (if (not tcal)
    (princ 'nNu poate fi obtinuta calibrarea')
    (princ 'nConfiguratia a fost salvata, folositi TABSET pentru refacerea ei.')
   )
   (princ)
  )

 Daca executia acestei functii este incheiata cu succes, simbolul tcal va contine lista returnata de functia tablet, care poate fi ca aceasta:

  (1 (0.00561717 0.000978942  -7.5171)
      (0.0009782     0.00561717    -9.17308)
      (0.0  0.0  1.0)
      (0.0  0.0  1.0)
  )
 Pentru refacerea calibrarii cu valorile obtinute prin functia TABGET definita mai sus, se poate folosi functia TABSET definita mai jos.

  (defun C:TABSET ()
   (if (not (apply 'tablet tcal))
    (princ 'nNu se poate reface calibrarea)
    (progn
     (princ 'nCalibrarea a fost refacuta')
     (setvar 'tabmode' 1)
     (if (= (getvar 'tabmode') 0)
      (princ 'nNu se poate trece in modul TABLET')
     )
    )
   )
   (princ)
  )

 Matricea de transformare data de argumentele row1, row2, row3 este o matrice de tip 33, ce poate fi folosita pentru a transforma un punct 2D, exprimat ca un vector coloana in coordonate omogene. Transformarea este definita prin ecuatia:

 X1         M00  M01  M02    X
 Y1   =    M10  M11  M12  Y
 D1         M20  M21   1.0    1.0

 Rezulta sistemul de ecuatii:

 X1 = M00*X + M01*Y + M02
 Y1 = M10*X + M11*Y + M12
 D1 = M20*X + M21*Y + 1.0

 Pentru a transforma vectorul obtinut intr-un punct 2D, primele doua componente se impart la factorul de scara D1, obtinandu-se punctul (x1/D1 , y1/D1).  Pentru transformari proiective (cazul general) trebuie sa se faca intregul calcul, dar pentru transformari afine si ortogonale M20 si M21 sunt 0, deci D1 este 1.0, nemaifiind necesar ultimul calcul - punctul rezultat va fi (x1 , y1).
 Daca directia specificata nu este normala la planul determinat de cele trei puncte, AutoCAD o corecteaza; daca coordonata Z al celui de-al treilea punct este diferita de 1, va fi corectata (trebuie sa fie mereu 1).
 Exemplu de calibrare:
  (tablet 1 '(1 0 0) '(0 1 0) '(0 0 1)) se va lucra in sistem cartezian ortogonal.
 

 Functii pentru controlul afisarii

 Functiile care permit controlul afisarii sunt: prin1, princ, print, prompt, menucmd, redraw, graphscr, textscr, textpage.

 (prin1 [expr [fis]])

 Aceasta functie afiseaza pe ecran rezultatul evaluarii expresiei expr. Expresia poate fi de orice fel, nu neaparat  un sir. Daca este prezent argumentul [fis], in locul afisarii pe ecran se va face scrierea in fisierul al carui descriptor este fis.

 Ex.: (setq a 123)
  (prin1 'a) afiseaza A si intoarce A
  (prin1 a)  afiseaza 123 si intoarce 123
  (prin1 'a')  afiseaza 'a' si intoarce 'a'
  (prin1 a f) scrie 123 in fisierul definit de f

 Caracterele de control admise:

Cod     Semnificatie
         caracterul
'         caracterul '
e         caracterul Escape
n         line feed (linie noua)
r         Enter
t         Tab
nnn     caracterul cu codul octal nnn

 Ex.: (prin1 (chr 2)) afiseaza '002'
  (prin1 (chr 10)) afiseaza 'n'

 Daca functia prin1 este apelata fara argument, intoarce sirul nul.

 (princ [expr [fis]])

 Este o functie asemanatoare cu prin1 (vezi mai jos exemplul).

 (print [expr [fis]])

 Este o functie asemanatoare cu prin1, dar afiseaza un caracter 'line feed' la inceputul expresiei si un spatiu in continuarea ei.

 (prompt mesaj)

 Aceasta functie afiseaza mesajul dat ca argument pe ecran si intoarce nil. Mesajul este neaparat un sir.
 De exemplu, avem sirul definit astfel:

  (setq s ('Toleranta 'admisibila' este 361 1/4' ')

 Iata cum va fi afisat de functiile de mai sus:

 (prompt s) afiseaza: Toleranta 'admisibila' este *1/4' si intoarce nil
 (princ s)  afiseaza: Toleranta 'admisibila' este *1/4' si intoarce 'Toleranta 'admisibila' este *1/4' '
 (princ1 s) afiseaza: 'Toleranta 'admisibila' este *1/4' ' si intoarce 'Toleranta 'admisibila' este *1/4' '
 (print s)  afiseaza: (linie noua)
       'Toleranta 'admisibila' este *1/4' '(spatiu) si intoarce 'Toleranta 'admisibila' este *1/4' '

 (menucmd sir)

 Aceasta functie permite programelor AutoLISP sa parcurga paginile din meniul AutoCAD. Intoarce intotdeauna nil. Argumentul 'sir' este de forma:

 'sectiune = submeniu' ,  unde sectiunea indica tipul meniului apelat, iar 'submeniu'  este numele acestuia, conform tabelului:
 
Sectiune     Tip meniu
 
S        meniu ecran (SCREEN)
B1B4       meniu BUTTONS
I         meniu ICON
P0P16     meniuri PULL-DOWN (intre 0 si 16)
T1T4       meniu TABLET
A1A4      meniuri auxiliare
M      pentru expresii DIESEL

 Pentru compatibilitate cu versiunile AutoLISP precedente, 'B' este interpretat ca 'B1'.
 In argumentul 'sir' nu trebuie inclus semnul $, ca in fisierele '.mnu'.

 Exemple:
  (menucmd 'S=OSNAPB') determina afisarea submeniului **OSNAPB definit in meniul incarcat (cu comanda MENU) in momentul respectiv.
  (menucmd 'B1=BUTON)  - activeaza submeniul **BUTON al meniului ***BUTTONS1

 Meniul cursor (definit ca ***POP0) este apelat astfel:
  (menucmd 'P0=POP0') il initializeaza
  (menucmd 'P0=*')  - il afiseaza

 Meniurile PULL-DOWN se activeaza prin:
  (menucmd 'P1=*') functioneaza dar poate avea rezultate neasteptate daca a fost initializat alt submeniu.

 Initializarea submeniului **exemplu:
  (menucmd 'P1=EXEMPLU')
  (menucmd 'P1=*') activeaza acest submeniu. Ramane activ pana la o noua initializare; de exemplu:   (menucmd 'P1=POP1')

 O anumita linie dintr-un meniu pull-down (de exemplu linia a patra din al doilea meniu) se activeaza astfel:
  (menucmd 'P2.4=')
 si se dezactiveaza astfel:
  (menucmd 'P2.4=*').

 (redraw [nume_ent [model]])

 Efectul acestei functii depinde de argumentele utilizate.

 (redraw)  - redeseneaza viewport-ul curent, ca si comanda REDRAW

 (redraw nume_ent) - redeseneaza entitatea specificata. Aceasta metoda este utila pentru afisarea unei entitati dupa ce ecranul a fost sters cu grclear.

 (redraw nume_ent model)  - redeseneaza entitatea in functie de valoarea argumentului 'model':

model     efect
 
1     redeseneaza entitatea
2     sterge entitatea
3     afiseaza punctat entitatea
4     afiseaza normal o entitate afisata punctat
 

 (graphscr)
 (textscr)

 Acestea sunt doua functii complementare. In cazul folosirii unui singur ecran fizic pentru AutoCAD, (graphscr) determina afisarea ecranului grafic, iar (textscr) determina afisarea ecranului text. Se intoarce intotdeauna nil.

 (textpage)

 Functia textpage functioneaza la fel ca textscr, dar sterge orice text afisat anterior in ecranul text.
 

 Controlul ecranului grafic

 Se stie ca in AutoCAD ecranul grafic este impartit in mai multe zone (cel mult patru): pentru desenare, pentru meniul ecran, pentru afisarea starii editorului (coordonate curente, layer) si pentru introducerea comenzilor. Urmatorul grup de functii permite accesul la aceste zone.

 (grclear)

 Efectul apelarii acestei functii este stergerea viewport-ului curent. Pe un sistem cu un singur monitor se trece intai in ecranul grafic (daca era activ ecranul text). Se poate apela functia redraw pentru refacerea ecranului. Grclear intoarce totdeauna nil.

 (grdraw de_la la culoare [high])

 Functia grdraw deseneaza un vector (o linie) intre doua puncte, in viewport-ul curent. Cele doua puncte sunt date de argumentele 'de_la' si 'la' si pot fi puncte 2D sau 3D. Culoarea vectorului desenat este data de argumentul 'culoare', iar argumentul optional [high] determina afisarea vectorului highlight (este scos in evidenta).

 (grread [track] [allkeys [curtype]])

 Functia grread permite citirea directa a datelor de la orice dispozitiv de introducere a acestora; argumentul [track] permite folosirea modului DRAG. Argumentul [allkeys] este o valoare intreaga, care reprezinta un bit, astfel:

1 - bit 0 - intoarce coordonatele curente ale cursorului intr-o lista al carei prim element este 5, iar al doilea (x, y), adica coordonatele punctului curent; asa este implementat modul DRAG in AutoCAD
2 - bit 1 - intoarce toate valorile de intrare, inclusiv functii si coduri de cursor, si nu misca cursorul cand utilizatorul apasa o tasta a dispozitivului de intrare
4 - bit 2 - foloseste valoarea argumentului [curtype] pentru a controla afisarea cursorului (tabelul urmator)
8 - bit 3 - nu afiseaza erorile

 Argumentul [curtype] determina modul de afisare al cursorului:

  0 - cursorul normal (cele doua linii - orizontala si verticala)
  1 - nu afiseaza cursorul
  2 - afiseaza patratelul selector, pentru selectarea unei entitati

 Argumentul curtype afecteaza cursorul numai pe durata apelarii functiei grread.
 Functia grread intoarce o lista alcatuita din doua elemente: primul este un cod ce indica tipul datei de intrare, iar al doilea poate fi un intreg sau o lista (punct), in functie de tipul datei de intrare.
 
 (grtext [box text [highlight]])

 Functia grtext permite scrierea in zonele de text ale ecranului grafic. Daca 'box' este un numar intreg intre 0 si numarul ultimului element din meniul SCREEN minus 1, textul este afisat in linia respectiva a meniului SCREEN. Argumentul 'text' reprezinta textul de afisat, care este trunchiat daca este prea lung si completat cu spatii daca este prea scurt. Daca numarul 'box' nu este un numar valid (pentru o linie de meniu SCREEN), se intoarce nil. Daca numarul 'box' este -1, textul este afisat in linia de stare (linia de sus), incepand cu marginea stanga a liniei (unde este afisat in mod normal layer-ul). Lungimea maxima admisa este de 40 de caractere. Daca 'box' este -2, textul este afisat in linia de sus, incepand cu pozitia in care erau scrise coordonatele curente. Daca modul COORDS este ON, noile coordonate curente vor fi afisate peste textul respectiv. Argumentul [highlight] determina afisarea textului cu intensitate mai mare sau mai mica.

 (grvecs vlist [trans])

 Functia grvecs permite desenarea mai multor vectori in zona de desenare a ecranului grafic; 'vlist' este lista acestor vectori si are forma:

 ([color1] (p11) (p12) [color2] (p21) (p22) ), unde color1, color2, sunt culorile cu care sunt desenati vectorii, iar p11, p12, sunt capetele acestora.

 Exemplu:
  (grvecs '(1 (1 2) (1 5 o linie rosie de la (1, 2) la (1, 5)
   2 (2 2) (2 5) ; o linie galbena  de la (2, 2) la (2, 5)
   3 (3 2) (3 5) ; o linie verde de la (3, 2) la (3, 5)
   )
  )

 Argumentul [trans] este o matrice de transformare a coordonatelor, transformare care se aplica punctelor din lista de vectori.

 Exemplu de matrice:

  '((1.0 0.0 0.0 5.0)
    (0.0 1.0 0.0 5.0)
    (0.0 0.0 1.0 0.0)
    (0.0 0.0 0.0 1.0)
  )
 Aceasta matrice determina translatia cu (5.0, 5.0, 0.0).

 

 Filtrarea sirurilor

 (wcmatch sir pattern)

 Functia wcmatch permite aplicatiilor sa aplice o masca sirurilor (masca este data de argumentul 'pattern'). Aceasta facilitate este utila in special la crearea unei multimi de selectie sau in cazul folosirii datelor extinse.  Se compara un singur sir cu pattern-ul si se returneaza T daca sirul se potriveste si nil daca nu se potriveste. Masca (pattern-ul) este asemanatoare cu cele folosite de alte sisteme, de exemplu de sistemul de operare MsDOS pentru selectarea fisierelor (DIR *.EXE sau DIR FIS?.* s.a.). Atat sirul de verificat, cat si masca pot fi siruri sau nume de variabile in care sunt stocate sirurile respective. Sunt comparate primele 500 de caractere (aproximativ).
 Masca poate contine caracterele speciale:

Caracter      Semnificatie
#    (diez)      inlocuieste o cifra
@   (At)       inlocuieste un caracter alfabetic
            inlocuieste un caracter nonalfanumeric
*         inlocuieste orice secventa de caractere, inclusiv un caracter nul; se poate afla oriunde in sirul masca: la inceput, la mijloc sau la sfarsit
?         inlocuieste un caracter oarecare
~     (tilda)   daca este primul caracter din masca, atunci inlocuieste orice caracter din sir, exceptand masca (negatie)
[ ]         inlocuieste oricare din caracterele cuprinse in paranteze
[- ]         inlocuieste orice caracter neinclus in paranteze
-     (hyphen) se foloseste in interiorul parantezelor pentru a indica intervalul in care poate fi cuprins un caracter; de exemplu STR[1-3 8] se foloseste pentru sirurile STR1, STR2, STR3 si STR8.
,   (virgula) separa doua masti
` inversul simb. quote) daca urmeaza un caracter special, il citeste ca pe un caracter oarecare.

 Exemple:
  (wcmatch 'Name' 'N*') intoarce T
 - s-a verificat daca sirul 'Name' incepe cu 'N'. Se pot face mai multe teste asupra aceluiasi sir, folosind virgula:
  (wcmatch 'Name' '???,~*m*,N*') intoarce T
 - s-a verificat prima data daca 'Name' are trei caractere - fals
 - s-a verificat daca 'Name' nu contine litera 'm' - fals
 - s-a verificat apoi daca 'Name' incepe cu 'N' - adevarat.

 Este suficient ca sirul sa se potriveasca pe o singura masca pentru a se intoarce T (daca sunt specificate mai multe masti).
 Pentru folosirea caracterului ` (escape):
  (wcmatch 'Name' '*`,*') intoarce nil
 - s-a verificat daca 'Name' contine o virgula.
 Este bine ca in aplicatii sa se elimine din masti caracterele nonalfanumerice, pentru a asigura compatibilitatea cu viitoarele versiuni de AutoLISP.
 Pentru a verifica existenta unui caracter (backslash) trebuie sa se tina seama de faptul ca AutoLISP-ul (si C-ul) foloseste backslash-ul pentru marcarea caracterelor speciale, deci in siruri trebuiesc folosite doua caractere :
  (wcmatch 'Name' '*`*') intoarce nil
 - s-a verificat daca 'Name' contine un backslash.
 In interiorul parantezelor ( ]) toate caracterele sunt citite literal, exceptand tilda daca se afla la inceputul sirului.
 
 



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2549
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved