Mai adīnc īn C++

De Mircea PANTEA

Dupa cum spuneam īn numarul trecut, vom īncerca sa scoatem īn evidenta adevarata putere a uneltelor de dezvoltare puse la dispozitie de catre Autodesk, īncepīnd cu AutoCAD R13. Limbajul C++ īn sine este foarte puternic. Daca la acest element se mai adauga si o tehnologie coerenta pentru dezvoltarea de aplicatii AutoCAD, se profileaza o noua etapa īn zona aplicatiilor "third part". Dupa cum aminteam īn articolul trecut, ARX-ul permite definirea unor entitati noi, perfect adaptate aplicatiei din care fac parte. Aceasta īnseamna ca nu vom mai fi limitati de existenta unui set de entitati AutoCAD, caracterizate de un numar fix de proprietati. Dupa cum veti vedea īn materialul care urmeaza, unealta ARX ne ofera acces īn intimitatea mediului si libertate foarte mare de creatie.

Īn continuare, vom analiza pasii necesari definirii unei noi entitati. Deocamdata, aceasta va avea un set restrīns de proprietati, iar pentru ca este un exemplu didactic, nu va avea nici un fel de utilitate practica. Entitatea noastra va fi generata interactiv si va arata ca un om de zapada fara cap: doua cercuri tangente, generate prin definirea unui segment. Īn acest material vom analiza modul īn care AutoCAD-ul este atentionat de existenta unei noi entitati, vom defini metodele de desenare si salvare (persistenta). Pentru ca entitatea noastra sa aiba, īntr-adevar functionalitate, va trebui sa definim o multime de alte metode:

Primul pas consta īn definirea obiectului cu pricina. Acesta va fi derivat direct din vīrful ierarhiei de obiecte grafice existente, si anume din AcDbEntity. Obiectul se va numi Custom si dosarul lui de cadre poate fi vazut īn listingul CUSTOM.H. Macro-ul ACRX_DECLARE_MEMBERS este definit de catre Autodesk si este o modalitate standardizata de identificare a noului obiect. Am definit un constructor fara parametri, care permite generarea unui obiect care sa fie umplut ulterior cu date prin metode setXXX.

Al doilea constructor cere explicit cele patru elemente care īl caracterizaeaza. Datele private sīnt alese īn asa fel īncīt sa permita generarea si caracterizarea unei instante cu minimum de informatie. Īn acest context afirmatia este evidenta si redundanta. Daca definim obiecte complexe, este indicat sa folosim cu economie cantitatea de informatii din aceasta zona. Functie de numarul si destinatia datelor membre am definit metodele get si set. Dupa cum se observa, toate metodele set īncep īn mod invariabil cu linia assertWriteEnabled(). Prin intermediul acesteia programul se asigura ca obiectul a fost deschis pentru scriere si initiaza mecanismul de memorare a starii curente. Īn cazul unei comenzi UNDO, restaurarea se va face tinīnd cont de aceasta informatie. Cu alte cuvinte, īn toate metodele care intervin si modifica grafic sau logic o instanta, va trebui sa folosim aceasta directiva. Īn lipsa ei, comanda UNDO nu are nici un efect asupra entitatii noastre. Niciuna dintre metodele set nu returneaza o valoare, lucru care nu este recomandat. Ce se īntīmpla daca setam o raza cu o valoare negativa? Nu faceti ca mine! Data viitoare vom corecta metodele īn cauza.

Metodele dwgInFields/dwgOutFields sīnt metode virtuale ale obiectului AcDbEntity, sīnt declarate īn CUSTOM.H, si vor fi implementate īn CUSTOM.CPP , pentru a asigura persistenta noului obiect. Aceste metode nu se folosesc numai la salvarea īn fisier DWG si la restaurarea acestuia, ci si īn operatiile de clonare, respectiv COPY, MIRROR, sau cīnd se genereaza asanumita fantoma grafica si la operatiile UNDO/REDO. Argumentul filer poate fi un fisier DWG, un fisier auxiliar UNDO.AC$ sau REDO.AC$ sau un bloc de memorie. Mediul AutoCAD va apela aceste metode, cu argument corespunzator, ori de cīte ori se va īmpiedica de obiectul nostru, īntr-o comanda standard. Metodele dxfInFields/dxfOutFields vor fi implementate data viitoare.Folosind metoda worldDraw, vom explica mediului cum dorim sa fie reprezentat grafic obiectul nostru. Obiectul īn sine este un depozit de date, metode si relatii. Daca nu redefinim explicit aceasta metoda, obiectul nostru nu va fi desenat. Pentru a desena obiectul nostru nu vom folosi entitati AutoCAD ci primitive grafice care aprind pixeli pe ecran. Avem la dispozitie segmente, arce, cercuri, poligoane, coji (shell), text, semidrepte (ray) si drepte (xline). Tot ceea ce vedem pe ecran, indiferent de provenienta, se genereaza cu aceste primitive. Īn plus, exista metode pentru reprezentarea proiectiilor, deoarece afisarea imaginii grafice se face īntotdeauna īn planul ecranului. Prin suprascrierea acestei metode, folosind datele membre, putem oricīnd sa ne razgīndim si sa desenam obiectul Custom ca pe un trunchi de con. Metoda worldDraw este apelata automat pentru fiecare instanta īn parte, ori de cīte ori se fac operatii gen VPOINT, REGEN, ZOOM, sau OPEN, DXFIN, INSERT, etc. De asemenea, aceasta metoda este apelata automat īn momentul īn care instanta este scrisa īn baza de date AutoCAD. Pīna cīnd nu se executa metoda appendAcDbEntity, mediul nu catadicseste sa deseneze instanta noastra. Faptul ca nu mai folosim entitati AutoCAD pentru desenare este prima diferenta majora īntre o aplicatie ARX si una ADS.

Obiectul nostru Custom este pregatit si mai avem de facut cīteva operatii pentru a-l si vedea pe ecran. Īn fisierul MAIN.CPP, pe līnga ceea ce s-a explicat īn articolul din numarul trecut, se face inserarea noului obiect īn ierarhia existenta Custom::rxInit() si acrxBuildClassHierarchy() precum si descarcarea obiectului la descarcarea aplicatiei. A mai ramas de scris o functie chioara care sa ne ceara date si sa genereze o instanta a noului nostru obiect. Aceasta se face īn fisierul STUDIU.CPP, unde prin tehnici ADS culegem doua puncte din mediu. Tehnicile ARX īnca nu au o interfata cu AutoCAD-ul la nivel interactiv, asa ca, atīt pentru puncte, distante, siruri, īntregi si ce-o mai fi, cīt si pentru seturi de selectie, vom folosi īn continuare functii ADS. Dupa ce am pregatit cele doua centre si cele doua raze, apelam constructorul obiectului Custom. Tot ceea ce urmeaza īn sursa, este procedura standard de adaugare a obiectului la baza de date AutoCAD. Se deschide tabela de blocuri din fisierul DWG curent, se cere pozitia unei īnregistrari noi, si se adauga obiectul cu pricina. Dupa aceea se īnchid toate cu atentie si obiectul nostru īnfloreste pe ecran.

Odata generat, obiectul Custom, īn forma actuala nu poate sa faca niciuna din actiunile specifice entitatilor AutoCAD, pentru ca īnca nu au fost implementate metodele corespunzatoare. Acesta poate fi doar salvat īmpreuna cu desenul curent si reīncarcat ulterior. Daca la deschiderea desenului, aplicatia noastra nu este īncarcata, obiectul este total inert si este un ZOMBIE, care īnvie deīndata ce se īncarca si aplicatia care l-a generat.

Mult zgomot pentru nimic! Dar cu putina rabdare obiectul nostru se va īnsufleti si se va umple de proprietati. Atunci sa vedeti!

Main.cpp
Custom.def
Custom.h
Custom.cpp
Studiu.cpp


(C) Copyright Computer Press Agora