Documente Academic
Documente Profesional
Documente Cultură
Object ARX 1
2.Aplicatii de tip laborator…………………………………………….. 57
2.1. Hello.arx……………………………………………………..57
2.2. Fact.arx……………………………………………………….57
2.3. Alee.arx………………………………………………………58
2.4. Fan.arx……………………………………………………….58
2.5. Spirala.arx……………………………………………………58
2.6. Mir.arx……………………………………………………….59
2.7. Instructiuni de exploatare ……………………………………59
BIBLIOGRAFIE……….………………………………………………………..61
ANEXE…………………………………………………………………………..62
Object ARX 2
1. Mediul de programare ObjectARX 2000
1.1. Introducere
• Cerinte sistem:
Pentru a putea dezvolta aplicatii in ObjectARX, sunt necesare urmatoarele
componente minimale hardware si software:
- sistem de operare Windows NT® 4.0;
- mediu de dezvoltare Microsoft Visual C++® 32bit versiunea 6.0;
- calculator dotat cu un procesor Pentium® PC rulind la 90MHz sau mai
mult, 32 megaocteti si adaptor grafic cu o rezolutie minimala de 800x600 pixeli.
• Instalarea ObjectARX:
In momentul inceperii instalarii ObjectARX-ului, programul de instalare va
ghideaza pe tot parcursul instalarii.
Object ARX 3
Pentru instalarea ObjectARX se procedeaza in felul urmator:
1. Introduceti CD-ul care contine ObjectARX in unitatea de CDROM.
2. Daca rulati Windows NT 4.0 cu optiunea de AutoPlay activata, lasati-va
condusi de instructiunile afisate pe ecran.
3. Daca ati dezacrtivat optiunea AutoPlay din Windows NT 4.0, alegeti din
meniul Start optiunea Run, apoi alegeti unitatea de CDROM care contine CD-ul de
instalare si selectati programul “setup” aflat pe CD.
Object ARX 4
inc
Acest director contine toate fisierele header necesare construirii unei aplicatii
ObjectARX.
lib
Acest director contine toate bibliotecile de functii ObjectARX intr-o forma
precompilata, biblioteci folosite de editorul de legaturi din Microsoft Visual C in
momentul crearii aplicatiei.
redistrib
Acest director contine un set de biblioteci dinamice de functii (DLL) care uneori
sunt necesare pentru a avea o aplicatie functionala. Este recomandabil pentru
dezvoltatorii de aplicatii ca, in cazul in care folosesc biblioteci de functii proprii, sa
copieze aceste fisiere in unul din directoarele prezente in caile de cautare al AutoCAD-
ului si sa foloseasca acest director pentru a salva eventualele biblioteci de functii proprii,
care vor fi distribuite impreuna cu aplicatia creata.
samples
In acest director se gasesc subdirectoare continind exemple de aplicatii complete
ObjectARX, utile in procesul de invatare a programarii in ObjectARX. Polysamp este
subdirectorul cu cea mai semnificativa aplicatie.
utils
Acest director cuprinde un set de utilitare aferente ObjectARX-ului, inclusiv brep
(reprezentarea frontierelor) si istorage (stocarea documentelor compuse). Fiecare
subdirector continind aceste utilitare, include si subdirectorele inc, lib si sample, in acesta
din urma gasindu-se exemple pentru utilitarul in cauza.
Object ARX 5
oferindu-se acces direct la functiile sale interne, la structurile de date, la sistemul grafic si
comenzile sale native. In acelasi timp, aceste biblioteci de functii sunt concepute sa
lucreze cu Visual LISP sau cu orice (API- application programming interface) alt mediu
de programare permitind oricarui dezvoltator sa isi aleaga platforma de programare care
se potriveste cel mai bine cu nevoile si experienta sa.
Biblioteca ObjectARX asigura satisfacerea urmatoarele cerinte ale unei aplicatii
AutoCAD:
• Accesul la structurile de date ale AutoCAD-ului
Un desen AutoCAD este o colectie de obiecte stocate intr-o baza de date. Aceste
obiecte sunt reprezentate nu numai de entitati grafice, dar si de structuri interne precum
tabelele de simboluri si dictionarele. ObjectARX faciliteaza accesul la aceste structuri de
date si totodata permite definirea de structuri proprii specifice unei anumite aplicatii.
• Interactiunea cu editorul AutoCAD
ObjectARX ofera clase si functii membre pentru comunicarea cu editorul
AutoCAD. Este posibila adaugarea de comenzi noi AutoCAD-ului, comenzi care vor fi
tratate la fel ca orice comanda AutoCAD standard. Aplicatia poate primi si raspunde
unei multitudini de notificari si mesaje care apar pe parcursul unei sesiuni AutoCAD.
• Crearea unei interfete folosind Microsoft® Foundation Classes (MFC)
Aplicatiile ObjectARX pot sa foloseasca librarii dinamice de functii MFC care
sunt partajate cu AutoCAD. Aceste biblioteci permit crearea de interfete grafice standard
Microsoft (GUI).
• Suport pentru interfete multi-document (MDI)
Aplicatiile ObjectARX suporta interfetele multi-document specifice AutoCAD-
ului, si este garantata interactiunea cu orice alta aplicatie din mediul Microsoft Windows.
• Crearea unor clase proprii
Este posibila imbunatatirea ierarhiei de clase ObjectARX prin crearea de noi
clase specifice unei anumite aplicatii. La crearea acestor clase se poate apela la biblioteca
extinsa de functii grafice existenta in ObjectARX.
• Crearea de aplicatii complexe
ObjectARX permite dezvoltarea de aplicatii complexe, furnizind urmatoarele
servicii:
Object ARX 6
- notificarea aplicatiilor;
- gestiunea tranzactiilor;
- multiplicare pe mai multe nivele;
- modificarea referintelor;
- extensibilitatea protocolului;
- suport pentru obiecte “proxy”.
• Interactiunea cu alte medii de dezvoltare
Aplicatiile ObjectARX pot comunica cu alte interfete de dezvoltare cum ar fi
Visual LISP, ActiveX si COM. De asemenea, pot sa interactioneze cu Internet-ul prin
asocierea de URL-uri unor entitati grafice care pot fi incarcate si salvate de pe World
Wide Web (WWW).
Object ARX 7
AutoCAD, ele integrindu-se perfect in AutoCAD. Protocolul ARX poate fi extins prin
adaugarea de noi functii claselor AutoCAD deja existente, aceasta facindu-se in
momentul rularii aplicatiei ARX.
Aplicatia ADS
IPC
Procese AutoLISP
separate
IPC
AutoCAD
Apeluri directe
de functii
Aplicatia
Object ARX 8
100
80
60 AutoLISP
ADS
40
ADSRX
20 ARX
0
Viteza Expunere Putere Expertiza
la erori
Tabelul 1 contine numele bibliotecilor care sunt necesare pentru construirea unei
aplicatii ObjectARX. Toate aplicatiile ObjectARX trebuie sa utilizeze bibliotecile
Object ARX 9
acad.lib si rxapi.lib. In raport de functiile si clasele utilizate in aplicatia ObjectARX,
prezenta altor biblioteci este necesara.
In sectiunea urmatoare sunt descrise mai pe larg fiecare din bibliotecile de baza
utilizate in aplicatiile ObjectARX.
• Biblioteca AcRx
Biblioteca AcRx pune la dispozitia dezvoltatorului clase la nivel sistem utilizate
pentru initializarea, legatura, identificarea si inregistrarea bibliotecilor dinamice (DLL).
Clasa de baza a acestei biblioteci este AcRxObject care ofera urmatoarele facilitati:
- identificarea unei clase in momentul rularii aplicatiei si analiza
mostenirii;
- adaugarea unui nou protocol unei clase existente in momentul rularii
aplicatiei;
- functii de comparare si echivalare a obiectelor;
- copierea obiectelor.
Biblioteca AcRx ofera de asemenea un set de macrouri C++ utile in crearea unor
noi clase ObjectARX, derivate din AcRxObject.
AcRxDictionary este o alta clasa importanta in aceasta biblioteca. Un dictionar
reprezinta legatura dintre un identificator de tip sir de caracatere si un obiect. Biblioteca
AcRx isi dispune clasele, obiectele si serviciile intr-un dictionar global, care este o
instanta a clasei AcRxDictionary. Aplicatiile pot adauga obiecte in acest dictionar astfel
incit ele sa fie disponibile altor aplicatii.
Object ARX 10
Ierarhia de clase a bibliotecii AcRx are urmatoarea structura:
AcRxObject
AcRxClass
AcRxDictionary
AcRxDynamicLinker
AcRxEvent
AcEditor
AcRxService
AcRxKernel
AcDbServices
AcEdServices
AcadAppInfo
• Biblioteca AcEd
Biblioteca AcEd furnizeaza clase care permit definirea si inregistrarea unor noi
comenzi in AutoCAD, comenzi care se vor comporta ca orice alta comanda interna a
AutoCAD-ului. Noile comenzi definite sunt numite "native" pentru ca ele rezida in
aceeasi structura interna ca si comenzile standard (stiva de comenzi,
AcEdCommandStack). De asemenea, in biblioteca AcEd mai gasim un editor de reactori
si un set global de functii care facilitateaza interactiunea cu AutoCAD-ul.
Object ARX 11
O clasa importanta in aceasta biblioteca este AcEditorReactor. Ea monitorizeaza
starea editorului AutoCAD si notifica aplicatia cind un anumit eveniment apare, cum ar
fi: lansarea, oprirea sau anularea unei comenzi de editare.
Ierarhia de clase a bibliotecii AcEd este prezentata in urmatoarea figura:
AcRxObject
AcEdCommand
AcEdCommandStack
AcEdUIContext
AcEdJig
AcEdInputFilter
AcEdInputPointMonitor
AcEdInputPointManager
AcEdSolidSubentitySelector
AcTransaction
AcDbTransactionManager
AcTransactionManager
• Biblioteca AcDb
Biblioteca AcDb furnizeaza clasele care compun baza de date AutoCAD. Aceasta
baza de date stocheaza toate informatiile referitoare la obiectele grafice, numite entitati,
care formeaza un desen AutoCAD, precum si informatiile despre toate obiectele non-
grafice (layer-e, tipuri de linii, tipuri de caractere) care fac de asemenea parte dintr-un
desen. Cu ajutorul bibliotecii AcDb pot fi manipulate si interogate instantele existente ale
entitatilor si obiectelor AutoCAD care compun un desen si pot fi definite noi instante ale
obiectelor stocate in baza de date AutoCAD.
Baza de date AutoCAD contine urmatoarele elemente principale:
- un set de noua tabele de simboluri care reprezinta obiecte AcDbDatabase si
datele membre ale acestor obiecte;
- un obiect dictionar (derivat din clasa AcDbDictionary) care ofera un index
referitor la desenul AutoCAD. Initial, aceast index contine identificatorii altor
patru dictionare utilizate de AutoCAD. Aplicatiile nou create au dreptul sa
adauge noi identificatori.
Object ARX 12
- un set de aproximativ 200 de variabile ale caror valori sunt setate de catre
AutoCAD.
Ierarhia de clase a bibliotecii AcDb arata ca in figura urmatoare:
AcRxObject
AcDbDictionary AcDbSymbolTable AcDbSymbolTableRecord
AcDbDictionaryDefault AcDbAbstractViewTablE AcDbAbstractViewTable
AcDbFilter AcDbViewportTable Record
AcDbLayerFilter AcDbViewTable AcDbViewportTable
AcDbSpatialFilter AcDbBlockTable Record
AcDbGroup AcDbDimStyleTable AcDbViewTableRecord
AcDbIDBuffer AcDbFontTable AcDbBlockTableRecord
AcDbIndex AcDbLayerTable AcDbDimStyleTableRecord
AcDbLayerIndex AcDbLinetypeTable AcDbFontTableRecord
AcDbSpatialIndex AcDbRegAppTable AcDbLayerTableRecord
AcDbLongTransaction AcDbTextStyleTable AcDbLinetypeTableRecord
AcDbMlineStyle AcDbUCSTable AcDbRegAppTableRecord
AcDbPlaceholder AcDbTextStyleTableRecord
AcDbPlotSettings AcDbUCSTableRecord
AcDbLayout
AcDbProxyObjects AcDbRasterImageDef
AcDbXrecord AcDbRasterImageDefReaactor
AcDbEntity AcDbRastervariables
• Biblioteca AcGi
Biblioteca AcGi pune la dispozitie interfetele grafice utilizate la desenarea
entitatilor AutoCAD. Aceasta biblioteca este folosita de catre functiile membre
worldDraw(), viewportDraw() si saveAs() ale clasei AcDbEntity, toate facind parte din
protocolul standard. Functia worldDraw() trebuie sa fie definita de catre toate clasele de
entitati particulare. Obiectul AcGiWorldDraw ofera un API prin care functia
AcDbEntity::worldDraw() poate sa reprezinte grafic desenul vazut din toate directiile, in
acelasi timp. In mod similar, AcGiViewportDraw ofera un API prin care functia
AcDbEntity::viewportDraw() poate sa reprezinte grafic desenul vazut dintr-o directie
data.
Ierarhia de clase a bibliotecii AcGi este prezentata in figura 6.
Object ARX 13
AcRxObject
AcGiCommonDraw
AcGiWorldDraw
AcGiContext
AcGiEdgeData
AcGiFaceData
AcGiGeometry
AcGiViewportGeometry
AcGiWorldGeometry
AcGiLinetypeEngine
AcGiSubentityTraits
AcGiDrawableTraits
AcGiTextStyle
AcGiVertexData
AcGiViewport
AcGiDrawable
AcGiGlyph
• Biblioteca AcGe
Biblioteca AcGe este folosita de biblioteca AcDb si ofera clase utilitare, precum
clase de vectori si matrici folosite in calculul geometric 2D si 3D. De asemenea, ea ofera
obiecte grafice de baza, cum ar fi: puncte, curbe si suprafete.
Biblioteca AcGe este formata din doua subseturi de baza: clase pentru calcul
geometric 2D si clase pentru calcul geometric 3D. Clasele de baza ale acestei biblioteci
sunt AcGeEntity2d si AcGeEntity3d. Mai sunt incluse si clasele AcGePoint2d,
AcGeVector2d si AcGeMatrix2d. Aceste clase sunt utilizate pentru calcul gemoetric de
baza cum ar fi: adaugarea unei vector la un punct, calcularea rezultatului de intersectie a
doi vectori si calcularea produsului a doua matrici. Clasele de nivel superior ale acestei
biblioteci sunt implementate tinind cont de clasele de baza.
Ierarhia de clase a bibliotecii AcGe este prezentata in figura 7.
Object ARX 14
AcGeEntity2d AcGeEntity3d
AcGeBoundBlock2d AcGeBoundBlock3d
AcGeClipBoundery2d AcGeCurve3d
AcGeCurve2d AcGeCircArc3d
AcGeCircArc2d AcGeCompositeCurve3d
AcGeCompositeCurve2d AcGeEllipArc3d
AcGeEllipArc2d AcGeExternalCurve3d
AcGeExternalCurve2d AcGeLinearEnt3d
AcGeLinearEnt2d AcGeLine3d
AcGeLine2d AcGeLineSeg3d
AcGeLineSeg2d AcGeRay3d
AcGeRay2d AcGeMatrix3d
AcGeOffsetCurve2d AcGeOffsetCurve3d
AcGeSplineEnt2d AcGeSplineEnt3d
AcGeCubicSplineCurve2d AcGeCubicSpline
AcGeNurbCurve2d Curve3d
AcGePolyline2d AcGeNurbCurve3d
AcGeCurveCurveInt2d AcGePolyline3d
AcGePointEnt2d AcGeAug
AcGePointOnCurve2d Polyline3d
AcGePosition2d AcGeCurveCurveInt3d
AcGeCurveSurfInt
AcGeCurveBoundery AcGePointEnt3d
AcGeContext AcGePointOnCurve3d
AcGeDwgIO AcGePointOnSurface
AcGeDxfIO AcGePosition3d
AcGeFileIO AcGeSurfSurfInt
AcGeFiler AcGeSurface
AcGeInterval AcGeCone
AcGeKnotVector AcGeCylinder
AcGeLibVersion AcGeExternalBounded
AcGeMatrix2d Surface
AcGeMatrix3d AcGeExternalSurface
AcGePoint2d AcGeNurbSurface
AcAxPoint2d AcGeOffsetSurface
AcGePoint3d 1 AcGePlanarEnt
AcAxPoint3d AcGeBoundedPlanet
AcGeScale2d AcGePlane
AcGeScale3d AcGeSphere
AcGeTol AcGeTorus
AcGeVector2d
AcGeVector3d
Object ARX 15
1.6. Functii uzuale ale mediului ObjectARX 2000
Functiile din aceasta catogorie sunt precedate de prefixul “acdb”. S-a considerat
oportuna aceasta notatie deoarece toate functiile realizeaza un anumite fel de interactiune
cu baza de date asociata unui desen AutoCAD.
Object ARX 16
Elimina din dictionarul dictname intrarea specificata prin cheia symname. Daca
functia se executa cu succes, se returneaza RTNORM. Daca esueaza, se returneaza
RTERROR, iar variabila sistem ERRNO este setata la o valoare care indica motivul
esuarii.
Object ARX 17
Creaza o noua entitate prin adaugarea entitatii specificate prin ent la baza de date
corespunzatoare desenului. Argumentul ent este o lista de tip result buffer, avand aceeasi
structura cu lista returnata de acdbEntGet().
Object ARX 18
Returneaza in argumentul entres numele entitatii care are asociat numele de
handle specificat prin handle. Daca functia se executa cu succes, se returneaza
RTNORM. Daca esueaza, se returneaza RTERROR, iar variabila de sistem ERRNO este
setata la o valoare care indica motivul esecului.
• int acdbInters(const ads_point from1, const ads_point to1, const ads_point from2,
const ads_point to2, int teston, ads_point result);
Examineaza doua linii si returneaza in argumentul result punctul lor de
intersectie, daca acesta exista. Cele doua linii sunt specificate prin capetele lor, respectiv
from1, to 1 pentru prima linie, si from2, to2 pentru a doua linie. Daca argumentul teston
are valoarea 0, cele doua linii se considera a fi infinite. Daca teston este 1, punctul de
intersectie trebuie sa se incadreze pe lungimea celor doua segmente. Daca functia se
executa cu succes, se returneaza RTNORM. In caz contrar, se returneaza un cod de
eroare.
Object ARX 19
Returneaza un pointer la o lista continand aplicatiile ARX incarcate la momentul
curent. Numele fiecarei aplicatii este returnat sub forma de string in result-buffer-ul
corespunzator aplicatiei. Daca nici o aplicatie externa nu este incarcata, functia
returneaza NULL.
Object ARX 20
daca este null, prompterul implicit este “select object”. Functia acedEntSel() nu
returneaza numele obiectelor non-grafice.
Object ARX 21
Returneaza un cuvant cheie introdus de utilizatorul AutoCAD in timpul apelului
uneia dintre functiile: acedGetXxx(), acedEntSel() sau acedDragGen(). Argumentul str
va contine maxim 132 de caractere.
Object ARX 22
• int acedGrDraw(const ads_point from, const ads_point to, int color, int hl);
Are ca efect desenarea unui vector intre doua puncte, specificate prin from si to.
Argumentul color corespunde unei culori AutoCAD (poate lua valori intre 0-250). Daca
argumentul hl este diferit de zero, vectorul este desenat in mod accentuat, iar daca
valoarea lui hl este 0, vectorul este desenat in modul de afisare normal.
Object ARX 23
Are ca efect setarea variabile de sistem AutoCAD, specificate prin sym, la
valoarea continuta in result-buffer-ul val. Argumentul sym trebuie sa contina un nume
valid de variabila sistem (indiferent daca este sau nu cu majuscule). Argumentul val
trebuie sa fie initializat si trebuie sa contina o valoare adecvata pentru variabila de sistem
avuta in vedere.
• int acedSSGet(const char* str, const void* pt1, const void* pt2, const struct
resbuf* filter, ads_name ss);
Returneaza o multime de selectie obtinuta prin mentionarea unui mod de selectie
AutoCAD. Argumentul str este optional si reprezinta modul de selectie a entitatilor.
Argumentul filter permite selectarea entitatilor in functie de tip, sau in functie de anumite
proprietati. Argumentele pt1 si pt2 sunt optionale si sunt specifice anumitor moduri de
selectie.
Object ARX 24
Returneaza o valoare intreaga len care contine numarul de entitati cuprinse in
multimea de selectie sname. Multimile de selectie nu contin niciodata entitati identice.
• int acedTrans(const ads_point pt, const struct resbuf* from, const struct resbuf*
to, int disp, ads_point result);
Are ca efect translatarea unui punct dintr-un sistem de coordonate in altul.
Argumentul from reprezinta sistemul de coordonate initial, iar to corespunde sistemului
de coordonate in care se face translatarea.
• int acedUsrBrk();
Verifica daca utilizatorul a apasat combinatia de taste [CTRL]+[C] pentru a
intrerupe executia curenta a unei functii externe. Aceasta functie permite aplicatiilor
ARX care efectueaza operatii complexe si de lunga durata, sa verifice daca nu apar
intreruperi de la utilizator.
Object ARX 25
1.6.3. Functii AcUt
Object ARX 26
Verifica daca argumentul c este sau nu o majuscula. Returneaza TRUE sau
FALSE.
• void acutPolar(const ads_point pt, ads_real angle, ads_real dist, ads_point result)
Determina un punct pe baza coordonatelor polare. In urma executiei functiei,
result va contine punctul aflat la unghiul angle si distanta dist fata de punctul initial pt.
Result si pt sunt puncte tridimensionale. Unghiul angle este exprimat in radiani si este
masurat in sens anti-orar fata de axa X a sistemului de coordonate. Functia nu returneaza
nici o valoare.
Object ARX 27
1.6.4. Functii de gestionare a memoriei
Object ARX 28
Aplicatiile ObjectARX implementeaza in general comenzi ce pot fi accesate din
interiorul AutoCAD-ului. Aceste comenzi sunt implementate adeseori utilizind clase
proprii. Crearea unei aplicatii ObjectARX presupune urmatorii pasi generali:
1.Crearea de clase proprii care sa implementeze noile comenzi.
Puteti deriva clasele proprii din majoritatea claselor continute in ierarhia
de clase ObejctARX si din tabelele de simboluri atasate acestora.
4.Implementarea initializarii.
In interiorul aplicatiei ObjectARX trebuie initializate toate clasele proprii
create si este necesara reconstruirea arborelui de clase utilizate de catre ObjectARX in
momentul executiei aplicatiei. In plus, daca se adauga comenzi noi, ele trebuie
inregistrate in AutoCAD.
Object ARX 29
In urmatoarele paragrafe se arata mai detaliat care sunt pasii necesari pentru
dezvoltarea unei aplicatii ObjectARX.
Este permisa derivarea unei clase proprii din oricare clasa continuta in ierarhia
ObjectARX. ObjectARX pune la dispozitie un set de macro-uri, declarate in fisierul
rxboiler.h, care ajuta la crearea unor noi clase derivate din AdRxObject.
Este interzisa derivarea de clase proprii din urmatoarele clase:
AcDb2dPolyline
AcDb3dPolyline
AcDbPolygonMesh
AcDbPolyFaceMesh
AcDbSequenceEnd
AcDbBlockBegin
AcDbBlockEnd
AcDbVertex
AcDbFaceRecord
AcDb2dVertex
AcDb3dPolylineVertex
AcDbPolygonMeshVertex
AcDbPolyFaceMeshVertex
AcDbMInsertBlock
Daca totusi exista clase derivate din clasele mentionate mai sus, AutoCAD-ul se
va bloca in momentul executiei aplicatiei.
Object ARX 30
- mesaje trimise tuturor aplicatiilor;
- mesaje care sunt trimise doar daca aplicatia ObjectARX a inregistrat o
functie AutoLISP® prin intermediul functiei acedDefun();
- mesaje care sunt trimise aplicatiilor care au inregistrat un serviciu prin
intermediul ObjectARX;
- mesaje trimise aplicatiilor care folosesc automate ActiveX.
Mesaj Descriere
Object ARX 31
Continuare tabelul2.
Mesaj Descriere
kPreQuitMsg Trimis cind AutoCAD-ul isi incheie executia, dar inainte de
a incepe descarcarea aplicatiilor ObjectARX.
Tabelul 3 contine mesajele care sunt trimise in cazul in care aplicatia ObjectARX
a inregistrat o functie AutoLISP® prin intermediul functiei acedDefun().
Mesaj Descriere
kUnloadDwgMsg Trimis cind utilizatorul termina o sesiune de desenare.
kInvkSubrMsg Trimis cand se apeleaza functii inregistrate cu
acedDefun().
kEndMsg Trimis doar cind comanda END e introdusa si exista
schimbari care trebuiesc salvate (cind dbmod != 0).
kEndMsg nu este trimis pentru o comanda NEW sau
OPEN, in schimb, sunt transmise mesajele kSaveMsg si
kLoadDwgMsg. Pentru comanda END, daca dbmod = 0,
atunci este trimis mesajul kQuitMsg in loc de kEndMsg.
kQuitMsg Trimis cind AutoCAD-ul intrerupe editarea unui desen
fara salvare, ca urmare a unei comenzi QUIT introdusa de
utilizator. Mesajul kQuitMsg poate fi de asemenea primit la
aparitia unei comenzi END, asa cum s-a explicat mai sus.
Daca comanda trimisa e END si dbmod = 0, atunci este
trimis mesajul kQuitMsg.
kSaveMsg Trimis cind AutoCAD salveaza desenul datorita
introducerii unei comenzi SAVE, SAVEAS, NEW sau
OPEN.
kCfgMsg Trimis de AutoCAD cind modificarea configuratiei sale
necesita schimbari in driver-ul adaptorului grafic.
Tabelul 3. Mesaje transmise doar daca aplicatia a inregistrat o functie AutoLISP.
Object ARX 32
Tabelul 4 contine mesajele primite de catre o aplicatie doar daca aplicatia are un
serviciu ObjectARX inregistrat.
Mesaj Descriere
kDependencyMsg Trimis cind aplicatia ObjectARX a inregistrat un obiect
AcRxService si functiile(dependency count) pentru acel
serviciu s-au schimbat din 0 in 1.
KNoDependencyMsg Trimis cind aplicatia ObjectARX a inregistrat un obiect
AcRxService si functiile(?) pentru acel serviciu s-au
schimbat din 1 in 0.
Tabelul 4. Mesaje primite doar de aplicatiile care au inregistrat un serviciu.
Object ARX 33
(continuare tabelul 6)
Mesaj Actiuni recomandate
predefinita, ca AutoLISP sa fie incarcat sau o baza de date
sa fie deschisa. Orice actiune in interiorul aplicatiei
dumneavoastra care se bazeaza pe aceste presupuneri duce
la o eroare in aplicatia dumneavoastra, uneori aceste erori
fiind fatale aplicatiei . Bibliotecile de functii AcDb si AcGi
nu sunt in general active desi parti componente, AcRx si
alte structuri, pot sa fie deja incarcate.
kUnloadAppMsg Eliberati resursele sistem utilizate. Orice actiune demarata
in kInitAppMsg trebuie acum distrusa sau oprita. Nu va
asteptati ca lucrurile sa fie diferite fata de descrierea
comportamentala a kInitAppMsg.
KoleUnloadAppMsg Acestui mesaj trebuie sa i se raspunda doar de catre
aplicatiile care utilizeaza automate ActiveX. Raspundeti cu
AcRx::kRetOK, daca aplicatia poate fi descarcata, ceea ce
inseamna ca nici unul din obiectele sau interfetele ActiveX
nu sunt utilizate de catre alte aplicatii. Daca aplicatia nu
poate fi descarcata, raspundeti cu AcRx::kRetError.
kLoadDwgMsg Executati initializari necesare in actuala sesiune de editare a
desenului. AcDb, AcGi si interfata cu utilizatorul a API-
ului (Application Programing Interface) sunt acum active.
Nu se cunoaste nimic despre starea desenului curent. Toate
functiile API ale AutoCAD-ului sunt acum active. Puteti
inregistra functii AutoLISP in acest moment si sa intializati
interfata cu utilizatorul. Efectuati alte operatii de intergoare
a evenimentelor cu AcEditorReactorOther si obtineti
informatii referitoare la dispozitivele AutoCAD, daca doriti
sa aveti acces la aceste resurse in cel mai scurt timp posibil
prin functia acdbHostApplicationServices()-
>workingDatabase(). Luati in calcul faptul ca acest mesaj
Object ARX 34
(continuare tabelul 6)
Mesaj Actiuni recomandate
este transmis de mai multe ori pe perioada de executie a
aplicatiei.
kUnloadDwgMsg Dezactivati sau descarcati orice functie care trateaza
mesajul kLoadDwgMsg. Deactivati toti reactorii AcDb, cu
exceptia celor persistenti. Nu eliberati resursele sistem care
nu au legatura cu o sesiune de editare, nu dezactivati
reactorii AcEd sau comenzile; ele ramin active pe parcursul
sesiunii de editare.
kDependencyMsg Executati orice actiune necesara aplicatiei dumneavoastra
atunci cind alta aplicatie are nevoie de ea, cum ar fi
blocarea ei pentru a nu putea fi descarcata.
kNoDependencyMsg Executati orice actiune necesara aplicatiei dumneavoastra
atunci cind de ea nu mai depind alte aplicatii, cum ar fi
deblocarea ei pentru a putea fi descarcata atunci cand
utilizatorul doreste acest lucru.
kInvkSubrMsg Invocati functiile inregistrate cu acedDefun(). Determinati
functia printr-un apel al functiei acedGetFuncode().
Retrunati valorile obtinute cu ajutorul functiei
acedRetxxx(). NU faceti prea multe lucruri aici, cu exceptia
apelurilor de functii.
kPreQuitMsg Dezactivati orice resurse controlate de catre aplicatia
dumneavoastra (alte aplicatii, biblioteci dinamice (DLL),
etc.) pentru a va asigura ca ele sunt descarcate inaintea
aplicatiei dumneavoastra.
KEndMsg, kCfgMsg, kQuitMsg, kSaveMsg Nu raspundeti acestor mesaje
daca veti utiliza reactorul AcEditorReactor corespunzator
acestor mesaje.
Tabelul 6. Reactia aplicatiilor ObjectARX la mesajele AutoCAD.
Object ARX 35
1.7.1.3. Secventa de evenimente intr-o aplicatie ObjectARX
Quit kUnloadDwgMsg
kQuit
kUnloadApp
Object ARX 36
1.7.1.4. Implementarea unui punct de intrare in aplicatie pentru AutoCAD
extern "C"
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt);
msg
Reprezinta mesajul trimis dinspre nucleul (kernel-ul) ObjectARX inspre aplicatie.
pkt
Contine datele referitoare la pachet.
AppRetCode
Contine codul de stare intors AutoCAD-ului.
Object ARX 37
NOTA: Daca functia acrxEntryPoint() returneaza AutoCAD-ului codul de stare
kRetError ca ultima valoare, acest lucru va determina AutoCAD-ul sa descarce aplicatia.
In schimb, daca kRetError este returnat dintr-o bucla de tratare a mesajelor
kOleUnloadAppMsg si kUnloadAppMsg, aplicatia nu va fi descarcata.
Urmatorul cod arata scheletul de baza al unei aplicatii care foloseste un bloc
conditional switch():
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch(msg) {
case AcRx::kInitAppMsg:
break;
case AcRx::kUnloadAppMsg:
break;
...
default:
break;
}
return AcRx::kRetOK;
}
Object ARX 38
incarcata), sau de catre o functie externa, dar care e apelata de pe acea ramura a buclei
conditionale.
Pentru a initializa o aplicatie ObjectARX se efectueaza urmatoarele:
Cand aplicatia este descarcata, trebuie eliminate toate clasele proprii utilizate si
toate comenzile pe care aplicatia le-a implementat. Toate aceste actiuni trebuie facute in
Object ARX 39
AcRx::kUnloadAppMsg, pe ramura kUnloadAppMsg a blocului conditional definit in
functia acrxEntryPoint(), sau intr-o functie apelata de pe acea ramura conditionala.
Pentru a descarca o aplicatie ObjectARX se efectueaza urmatoarele:
1.7.2.Exemplu de aplicatie
Object ARX 40
asemenea clasa AsdkMyClass si o adauga ierarhiei de clase ObjectARX cu ajutorul
functiei acrxBuildClassHierarchy().
acedRegCmds->addCommand("ASDK_DICTIONARY_COMMANDS",
"ASDK_ITERATE", "ITERATE", ACRX_CMD_MODAL,
iterateDictionary);
AsdkMyClass::rxInit();
acrxBuildClassHierarchy();
}
Object ARX 41
1.7.3. Inregistrarea noilor comenzi
Acad::ErrorStatus
addCommand(
const char* cmdGroupName,
const char* cmdGlobalName,
const char* cmdLocalName,
Adesk::Int32 commandFlags,
Object ARX 42
AcRxFunctionPtr functionAddr,
AcEdUIContext *UIContext=NULL,
int fcode=-1,
HINSTANCE hResourceHandle=NULL);
cmdGroupName
Reprezentarea ASCII a grupului caruia ii va fi adaugata comanda. Daca grupul nu
exista, este creat inainte de adaugarea comenzii.
cmdGlobalName
Reprezentarea ASCII a numelui comenzii care urmeaza a fi adaugata. Acest nume
reprezinta numele global al comenzii.
cmdLocalName
Reprezentarea ASCII a numelui comenzii ce urmeaza a fi adaugata. Acest nume
reprezinta numele local al comenzii.
commandFlags
Valorile posibile sunt:
ACRX_CMD_TRANSPARENT – Comanda poate fi invocata in timp ce o alta
comanda este activa.
ACRX_CMD_MODAL – Comanda nu poate fi invocata atata timp cat o alta
comanda este activa.
ACRX_CMD_USEPICKSET – Cand multimea de selectie este recuperata, ea
este stearsa din AutoCAD.
ACRX_CMD_REDRAW – Cand multimea de selectie este recuperata, ea nu este
stearsa din AutoCAD.
functionAddr
Object ARX 43
Adresa functiei care urmeaza a fi executata in momentul invocarii comenzii de
catre AutoCAD.
UiContext
Pointer catre clasa AcEdUIContext.
fcode
Cod de intrare asignat comenzii.
NOTA: Este recomandat ca numele comenzii sa fie prefixat de patru caractere specifice
pentru a evita conflictul intre comenzi cu acelasi nume dar definite in alte aplicatii. De
exemplu, numele comenzii MOVE pentru un dezvoltator cu prefixul ASDK va fi
ASDKMOVE. Utilizarea prefixului e recomandata si la numirea grupurilor de comenzi.
Cand o comanda este invocata, stiva de comenzi este parcursa dupa numele de
grup, apoi dupa numele comenzii din grupul respectiv. In general, primul grup de
comenzi inregistrat va fi primul cautat dar nu se poate prevedea care va fi ordinea de
cautare. Folosind functia AcEdCommandStack::popGroupToTop() se poate specifica
care grup de comenzi va fi cautat primul. Optiunea 'Group' a comezii ARX permite
utilizatorului sa specifice numele grupului care va fi cautatmai intai.
Object ARX 44
1.7.4. Incarcarea unei aplicatii ObjectARX
Object ARX 45
- Se utilizeaza functia arxunload din AutoLISP.
- Se utilizeaza functia acedArxUnload() din ObjectARX.
- Se introduce comanda 'ARX' la prompterul AutoCAD si foloseste optiunea
'Unload'.
• Deblocarea aplicatiilor
Object ARX 46
1.8. Construirea unei aplicatii ARX in Visual C++ 6.0
Pentru construirea unei aplicatii ObjectARX in Visual C++ 6.0 trebuie parcurse
etapele descrise mai jos. Cu scopul de a facilita intelegerea mecanismului prezentat,
fiecare etapa va fi particularizata pentru o aplicatie ObjectARX foarte simpla, avand
numele “Project.arx”. Aceasta aplicatie va realiza afisarea mesajului “Hello World!” in
linia de comanda a AutoCAD-ului.
• Crearea unui nou proiect
1. Din meniul "File" al Visual C++ 6.0, selectati "New".
2. Selectati "Projects" in ferestra de dialog care apare.
3. Selectati "Win32 Dynamic-Link Library" din lista de tipuri de proiecte.
4. Introduceti numele dorit pentru proiectul dumneavoastra, de exemplu "Project".
5. Specificati directorul pe disk unde vor fi pastrate toate fisierele noii aplicatii,
apoi apasati butonul "OK" (vezi figura 8).
Object ARX 47
Figura 8. Crearea unui nou spatiu de lucru.
6. In urmatoarea fereastra de dialog, alegeti "An empty DLL project."
7. Apasati pe butonul "Finish", apoi pe butonul "OK".
• Setarile compilatorului
Object ARX 48
Figura 9. Selectarea optiunii “Project Settings” din meniul “Project”.
NOTA: Initial, lista de optiuni din stinga ferestrei, "Settings For:" are valoarea "Win32
Debug". Daca trebuie sa aduceti schimbari atit versiunii de depanare, cit si
versiunii finale a aplicatiei, alegeti optiunea "All Configurations".
2. Selectati "C/C++ " din partea dreapta a ferestrei de dialog pentru a avea acces
la parametrii compilatorului.
3. Verificati daca numele proiectului dumneavoastra se afla in lista de proiecte si
este selectat.
4. Din lista "Settings For:", alegeti "All Configurations."
5. Din casuta "Category:", alegeti optiunea "Code Generation."
6. In casuta de editare "Use run-time library", alegeti "Multithreaded DLL" (vezi
figura 10) .
7. Din casuta "Category:", alegeti "Preprocessor."
8. In campul "Additional include directories:", adaugati calea completa pina la
fisierele antet ale ObjectARX 2000. In mod normal, aceste fisiere se gasesc in:
C:\ObjectARX2000\inc.
Object ARX 49
Figura 10. Setarile compilatorului.
Object ARX 50
5. In partea stanga a ferestrei de dialog, selectati "Win32 Release" din cadrul listei
de optiuni "Settings For:".
6. In casuta de editare "Output File Name:", veti vedea scris
"Release/<Project>.dll." Schmibati extensia fisierului din .dll in .arx.
7. In partea stinga a ferestrei de dialog, selectati optiunea "All Configurations" in
cadrul sectiunii "Settings For:".
8. In casuta de editare "Object/library modules" , adaugati urmatoarele nume de
librarii ObjectARX, la inceputul listei deja existente de librarii: rxapi.lib
acrx15.lib acutil15.lib acedapi.lib.
NOTA: Acestea sunt singurele biblioteci ObjectARX 2000 de care avem nevoie
pentru aceasta aplicatie simpla. Aplicatiile mai sofisticate pot avea nevoie de alte
biblioteci ObjectARX 2000.
Object ARX 51
10. In campul "Additional Library Path:", introduceti calea completa pana la
librariile ObjectARX 2000. In mod normal, aceasta este: C:\ObjectARX 2000\lib.
11.Inchideti fereastra de dialog "Project Settings" apasand pe butonul "OK".
In primul rand, trebuie incluse doua fisier antet ObjectARX: aced.h si rxregsvc.h.
Adaugati-le cum se arata mai jos:
#include <aced.h>
#include <rxregsvc.h>
void initApp();
Object ARX 52
void unloadApp();
In urmatorul pas, vom declara functia proprie, care va afisa mesajul "Hello
World!" in linia de comanda a AutoCAD-ului. Adaugati:
void helloWorld();
void initApp()
{
// adaugam o comanda AutoCAD-ului
acedRegCmds->addCommand("HELLOWORLD_COMMANDS",
"Hello",
"Salut",
ACRX_CMD_TRANSPARENT,
helloWorld);
}
Object ARX 53
void unloadApp()
{
acedRegCmds->removeGroup("HELLOWORLD_COMMANDS");
}
void helloWorld()
{
acutPrintf("\nHello World!");
}
Acum trebuie sa definim una dintre cele mai importante functii din cadrul oricarei
aplicatii ObjectARX. Aceasta functie este acrxEntryPoint() si este utilizata in cadrul
schimbului de mesaje dintre aplicatie si AutoCAD. Avind in vedere ca o aplicatie
ObjectARX este in esenta o bilbioteca dinamica de functii (DLL), ea nu contine nici o
functie principala de intrare de tip main(). AutoCAD foloseste functia acrxEntryPoint()
pentru a pasa mesaje aplicatiei ObjectARX.
Primul parametru al functiei este un membru al clasei AcRx, cu numele de msg si
care contine tipul mesajului transmis de catre AutoCAD aplicatiei. In capitolul 8 exista
lista completa a tuturor tipurilor de mesaje pe care o aplicatie ObjectARX le poate primi
de la AutoCAD.
In exemplul nostru, avem nevoie sa fim anuntati de catre AutoCAD atunci cind
aplicatia este incarcata si cind este descarcata, pentru a putea adauga, respectiv, sterge
comanda “hello” din lista de comenzi AutoCAD. Pentru aceasta, vom folosi doua functii,
initApp(), in primul caz, si functia unloadApp(), in cel de-al doilea caz.
Al doilea parametru al functiei acrxEntryPoint() are rolul de a specifica daca o
aplicatie poate sau nu poate sa fie descarcata.
Object ARX 54
Implicit, nici o aplicatie nu poate fi descarcata dupa ce a fost incarcata. Avind in
vedere ca aplicatia noastra este foarte simpla si ca nu defineste noi obiecte care sa fie
utilizate de catre AutoCAD sau de catre alte aplicatii, putem fi siguri ca aplicatia poate fi
descarcata fara nici o problema, acest lucru facindu-se in functia unloadApp().
De asemenea, nici o aplicatie ObjectARX nu are suport pentru MDI (Multiple
Document Interfaces – interfete de documente multiple). Aplicatiile care contin suport
pentru MDI, trebuie sa foloseasca functia acrxRegisterAppMDIAware() pentru a fi
inregistrate in cadrul AutoCAD-ului. Adaugati urmatoarele linii de cod:
Object ARX 55
• Crearea unui fisier de definitii (.DEF)
LIBRARY "Proiect"
EXPORTS
acrxEntryPoint PRIVATE
acrxGetApiVersion PRIVATE
In acest stadiu, proiectul este gata pentru a fi compilat si construit. Daca ati
executat toti pasii prezentati cu atentie, aplicatia trebuie sa fie construita fara nici o
problema. Incarcati "Project.arx" in AutoCAD si introduceti comanda "hello" pentru a o
executa.
Pentru a incarca aplicatia "Project.arx", procedati in unul din modurile urmatoare:
1.Executati "drag" cu mouseul pe icoana aplicatiei din Explorer direct peste
ferestra principala a AutoCAD-ului.
2. Utilizati comanda "Load" a AutoCAD-ului pentru a incarca aplicatia.
3. Din meniul "Tools" al AutoCAD-ului alegeti optiunea "Load Application...".
O data ce aplicatia este incarcata cu succes, tastand "hello" sau "salut" in linia de
comanda AutoCAD, vi se va tipari mesajul "Hello World!".
Object ARX 56
2. Aplicatii de tip laborator
2.1.Hello.arx
NOTA: Primele doua functii sunt caracteristice aplicatiilor ARX (vezi capitolul
1.8.Construirea unei aplicatii ARX cu Microsoft Visual C++ 6.0). Ele vor fi
implementate si in urmatoarele aplicatii, adaptandu-se cerintelor acestora.
Object ARX 57
Codul sursa al aplicatiei este atasat in anexa 2.
2.3.Alee.arx
Este o aplicatie mai complexa. Prin rularea acestei aplicatii, se completeaza o alee
cu dale circulare, respectandu-se dimensiunile furnizate de utilizator. Au fost
implementate urmatoarele functii:
• Acad::ErrorStatus postToDatabase(AcDbEntity* pEnt, AcDbObjectId& idObj) :
functia primeste ca parametru o entitate AutoCAD, pe care o adauga in baza de date
curenta, si returneaza identificatorul entitatii nou adaugate;
2.4.Fan.arx
Object ARX 58
• void cspirala(int ntimes, ads_point bpoint, ads_real cfac, int lppass) : construieste
spirala pe baza urmatoarelor date: punctul central al spiralei, numarul de rotatii,
cresterea pe rotatie si numarul punctelor de rotatie (care nu poate fi mai mare decat
30).
2.5 Mir.arx
ATENTIE: 1. Este recomandabil ca, inainte de incarcarea unei noi aplicatii ARX,
aplicatia anterioara sa fie descarcata.
2. Inainte de introducerea unei noi comenzi, se va curata ecranul de lucru
cu comanda AutoCAD erase all.
Object ARX 59
Pentru testarea aplicatiilor, singura operatie care trebuie efectuata este
introducerea in linia de comanda a AutoCAD-ului a unuia dintre cele doua nume
declarate. Acestea sunt:
• Hello.arx : hello sau salut;
• Fact.arx : fact sau _fact;
• Alee.arx : alee sau _alee;
• Fan.arx : fan sau _fan;
• Spirala.arx: spirala sau _spirala;
• Mir.arx : mir sau _mir.
Object ARX 60
BIBLIOGRAFIE
Object ARX 61
3 ANEXE
ANEXA 1. – Codul sursa al aplicatiei Hello.arx.
#include "aced.h"
#include <rxregsvc.h>
void initApp();
void unloadApp();
void helloWorld();
void initApp()
{
acedRegCmds->addCommand("HELLOWORLD_COMMANDS",
"Hello",
"Bonjour",
ACRX_CMD_TRANSPARENT,
helloWorld);
}
void unloadApp()
{
acedRegCmds->removeGroup("HELLOWORLD_COMMANDS");
}
void helloWorld()
{
acutPrintf("\nHello World!");
}
Object ARX 62
}
return AcRx::kRetOK;
}
#include "aced.h"
#include <rxregsvc.h>
#include <acedads.h>
#include <acutads.h>
void initApp();
void unloadApp();
int fact(int);
void factCommand();
void initApp()
{
acedRegCmds->addCommand("FACT_COMMANDS",
"fact",
"_fact",
ACRX_CMD_TRANSPARENT,
factCommand);
}
void unloadApp()
{
acedRegCmds->removeGroup("FACT_COMMANDS");
}
int fact(int n)
{
int rezultat;
if(n==1) return 1;
rezultat=fact(n-1)*n;
return rezultat;
}
void factCommand()
{
int x, temp;
acedInitGet(7,NULL);
acedGetInt("Introduceti numarul: ",&x);
temp=fact(x);
Object ARX 63
acutPrintf("Factorialul numarului este: %d",temp);
}
#include <aced.h>
#include <dbents.h>
#include <geassign.h>
#include <gepnt3d.h>
#include <acedads.h>
#include <dbsymtb.h>
#include <dbapserv.h>
#include <acdbabb.h>
#include <gepnt2d.h>
#include <acutads.h>
#include <math.h>
Acad::ErrorStatus
postToDatabase(/*[in]*/AcDbEntity* pEnt,/*[out]*/AcDbObjectId& idObj)
{
Acad::ErrorStatus es;
AcDbBlockTable* pBlockTable;
AcDbBlockTableRecord* pSpaceRecord;
if (acdbHostApplicationServices()->workingDatabase()==NULL)
return Acad::eNoDatabase;
Object ARX 64
if ((es = acdbHostApplicationServices()->workingDatabase()-
getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk){
ads_real dtr(ads_real a)
{
return(3.1415*(a/180));
}
if (!pLine){
acedAlert("Nu exista suficienta memorie pentru a crea o linie!");
return Acad::eOutOfMemory;
}
/*int color;
acedGetInt("\nIntroduceti un numar pt. o culoare AutoCAD: ", &color);
if (pLine->setColorIndex(color) != Acad::eOk)
acutPrintf("\nNumarul ales nu este valid.\n");
*/
AcDbObjectId id;
return postToDatabase(pLine, id);
}
Object ARX 65
AcDbCircle *pCerc=new AcDbCircle(asPnt3d(centru), normal, raza);
//verificam daca cercul a fost creat
if (!pCerc){
acedAlert("Nu exista suficienta memorie pt. a crea cercul!");
return Acad::eOutOfMemory;
}
/*int culoare;
acedGetInt("\nIntroduceti un numar valid pt. o culoare AutoCAD:", &culoare);
if (pCerc->setColorIndex(culoare) != Acad::eOk)
acutPrintf("\nNu ati introdus un numar valid!");*/
AcDbObjectId id;
return postToDatabase(pCerc, id);
}
Acad::ErrorStatus alee()
{
ads_point sp,ep;
ads_real hwidth, trad, tspac, pangle, plength, width, angp90, angm90;
int val_try;
try{
if(val_try = acedGetPoint(NULL,"\nIntroduceti punctul de inceput a
aleii:",sp)!=RTNORM)
throw val_try;
if(val_try = acedGetPoint(sp, "\nIntroduceti punctul de sfarsit a aleii:",ep)
!=RTNORM)
throw val_try;
if(val_try = acedGetDist(sp, "\nIntroduceti semilatimea aleii: ",
&hwidth)!=RTNORM)
throw val_try;
if(val_try = acedGetDist(NULL, "\nRaze dale beton: ",
&trad)!=RTNORM)
throw val_try;
if(val_try = acedGetDist(NULL, "\nInterspatii dale: ",
&tspac)!=RTNORM)
throw val_try;
}
catch(int e)
{
if (e == RTCAN)
return Acad::eUserBreak;
if (e == RTERROR)
return Acad::eInvalidInput;
Object ARX 66
}
pangle = acutAngle(sp, ep);
plength = acutDistance(sp, ep);
width = 2*hwidth;
angp90 = pangle + dtr(90);
angm90 = pangle - dtr(90);
int fail;
ads_point p1, p2, p3, p4;
acutPolar(sp, angm90, hwidth, p1);
acutPolar(p1, pangle, plength, p2);
acutPolar(p2, angp90, width, p3);
acutPolar(p3, pangle + dtr(180), plength, p4);
try{
if(fail = linie(p1, p2)!=Acad::eOk) throw fail;
if(fail = linie(p2, p3)!=Acad::eOk) throw fail;
if(fail = linie(p3, p4)!=Acad::eOk) throw fail;
if(fail = linie(p4, p1)!=Acad::eOk) throw fail;
}
catch(...){
acutPrintf("\nConturul nu a fost desenat!");
}
//drow: INCEPUT
ads_point pfirst, pctile, p1tile;
acutPolar(sp, pangle, pdist, pfirst);
acutPolar(pfirst, angp90, off, pctile);
acdbPointSet(pctile, p1tile);
//randul de sus
while(acutDistance(pfirst, p1tile) < hwidth - trad){
if(dala(p1tile, trad)!= Acad::eOk) acutPrintf("\nEsec in
adaugarea unei dale sus!");
acutPolar(p1tile, angp90, tspac+2*trad, p1tile);
}
acutPolar(pctile, angm90, tspac+2*trad, p1tile);
//randul de jos
while(acutDistance(pfirst, p1tile) < hwidth - trad){
if(dala(p1tile, trad)!= Acad::eOk) acutPrintf("\nEsec in
adaugarea unei dale jos!");
acutPolar(p1tile, angm90, tspac+2*trad, p1tile);
}
Object ARX 67
//drow: SFARSIT
//drawtiles: SFARSIT
return Acad::eOk;
}
void aleeCommand()
{
if (alee()==Acad::eOk)
acutPrintf("Succes!\n");
else
acutPrintf("Esec!\n");
acrxDynamicLinker->unlockApplication(pkt);
acrxDynamicLinker->registerAppMDIAware(pkt);
acedRegCmds-
>addCommand("ALEE_COMMANDS","_alee","alee",ACRX_CMD_TRANSPARENT,
aleeCommand);
break;
case AcRx::kUnloadAppMsg:
acedRegCmds->removeGroup("ALEE_COMMANDS");
break;
}
return AcRx::kRetOK;
}
Object ARX 68
ANEXA 4. – Codul sursa al aplicatiei Fan.arx.
#include "aced.h"
#include <rxregsvc.h>
#include <acedads.h>
#include <acutads.h>
#include <math.h>
#include <string.h>
#include "adslib.h"
void initApp();
void unloadApp();
void fan();
void initApp()
{
acedRegCmds->addCommand("Fan_COMMANDS",
"fan",
"_fan",
ACRX_CMD_TRANSPARENT,
fan);
}
void unloadApp()
{
acedRegCmds->removeGroup("Fan_COMMANDS");
}
void fan()
{
ads_real r=0;
ads_name a, entres;
long n;
char pauza[1];
Object ARX 69
int index = 0;
for(int j=1; j<=n; j++)
{
acedSSName(a, index, entres);
b1 = acdbEntGet(entres);
while(b1.rbnext!=NULL) do
{
if(b1.restype ==40) b1.resval.rreal = r;
b1 = b1->rbnext;
}
acdbEntMod(b1);
r+=10;
acedGetKword("\nApasati SPACE BAR: ", pauza);
}
//acutRelRb(filter);
//acutRelRb(b1);
}
#include "aced.h"
#include <rxregsvc.h>
#include <acedads.h>
Object ARX 70
#include <acutads.h>
#include <math.h>
#include "adslib.h"
void initApp();
void unloadApp();
void spirala();
void initApp()
{
acedRegCmds->addCommand("Spirala_COMMANDS",
"spirala",
"_spirala",
ACRX_CMD_TRANSPARENT,
spirala);
}
void unloadApp()
{
acedRegCmds->removeGroup("Spirala_COMMANDS");
}
echo1.restype = RTSHORT;
blip.restype = RTSHORT;
echo1.resval.rint=0;
blip.resval.rint=0;
acedSetVar("BLIPMODE",&blip);//!=RTNORM) acutPrintf("\nEroare la
FILLMODE!");
acedSetVar("CMDECHO",&echo1);//!=RTNORM) acutPrintf("\nEroare la
CMDECHO pe 0!");
circle = 2*3.14159;
ainc = circle / lppass;
dinc = cfac / lppass;
ang = dist = 0.0;
Object ARX 71
RT3DPOINT,
bpoint,0);
acedCmd(plin);
acutRelRb(plin);
void spirala()
{
int nt, lp;
ads_point bp;
ads_real cf;
acedInitGet(1,"");
acedGetPoint(NULL,"\nPunctul central:",bp);
acedInitGet(7,"");
acedGetInt("\nNumarul de rotatii: ", &nt);
acedInitGet(3,"");
acedGetDist(NULL, "\nCresterea pe rotatie: ", &cf);
acedInitGet(6,"");
acedGetInt("\nPuncte pe rotatie <30>: ",&lp);
Object ARX 72
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(pkt);
acrxRegisterAppMDIAware(pkt);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
break;
default:
break;
}
return AcRx::kRetOK;
}
#include "aced.h"
#include <rxregsvc.h>
#include <acedads.h>
#include <acutads.h>
#include <math.h>
#include "adslib.h"
void initApp();
void unloadApp();
void leaf();
void initApp()
{
acedRegCmds->addCommand("LEAF_COMMANDS",
"leaf",
"_leaf",
ACRX_CMD_TRANSPARENT,
leaf);
}
void unloadApp()
{
acedRegCmds->removeGroup("LEAF_COMMANDS");
}
void leaf()
{
acedGraphScr();//!=RTNORM) acutPrintf("\nEroare la comutarea in modul
grafic!");
Object ARX 73
struct resbuf echo1, fill;
echo1.restype = RTSHORT;
fill.restype = RTSHORT;
echo1.resval.rint=0;
fill.resval.rint=1;
acedSetVar("FILLMODE",&fill);//!=RTNORM) acutPrintf("\nEroare la
FILLMODE!");
acedSetVar("CMDECHO",&echo1);//!=RTNORM) acutPrintf("\nEroare la
CMDECHO pe 0!");
ads_real le,a,th,mle;
ads_point p1,p2,p3,p4,p5,p6;
a= a+3.1415/6;
}
acutPolar(p1, 7*3.1415/6, le, p5);
acutPolar(p1, 3.1415/4, 1.4*mle, p6);
Object ARX 74
struct resbuf* mir2 = acutBuildList(RTSTR, "mirror", RTSTR, "c", RT3DPOINT,
p5, RT3DPOINT, p6, RTSTR, "", RT3DPOINT, p1, RT3DPOINT, p2, RTSTR,
"",0);
acedCmd(mir2);
acutRelRb(mir2);
Object ARX 75