CATEGORII DOCUMENTE |
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.
(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.
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.
(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.
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.
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'.
(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'.
(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
(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.
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.
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).
(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 |
Vizualizari: 2549
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved