Ar fi bine sa preciz ez de la bun īnceput ca folosesc Windows NT 3.51 si nu stiu ce rezultate poate p roduce folosirea sistemului de operare Windows 95 asupra compilarii exemplului p e care īl analizam īmpreuna.
Īn filosofia ARX exista doua etape distinct e īn crearea noului nostru obiect, si anume:
Īn articolul anterior am vazut care este implementarea minimala a unui obiect AR X. Metodele prezentate anterior asigura doar vizualizarea si persistenta, respec tiv salvarea īn fisier DWG si restaurarea obiectului la īncarcarea desenului si a aplicatiei.
Pentru a asigura īntreaga paleta a operatiilor de intrare- iesire, va trebui sa suprascriem si metodele DXF in si out. Aceste a se scriu īn tandem si trebuie sa scrie si sa citeasca datele membre ale obiect ului exact īn aceeasi ordine, altfel importul DXF nu este posibil. Argumentul ac estor metode este un obiect AcDbDxfFiler, care are metode readItem() si writeItem(), pe care le folosim. Tipurile de date acceptate de aces te metode pot fi usor identificate daca inspectam fisierul DBFILER.H. Pra ctic, sīnt prevazute toate tipurile de date si obiectele de tip data, folosite ī n AutoCAD. Metodele IN/OUT apeleaza constructorul implicit al obiectului si apoi seteaza datele membru cu valorile stocate īn fisier.
Daca desenam un ob iect Custom, observam ca acesta nu reactioneaza la comenzile de mutare/ro tire/scalare. Pentru a-l īnvata cum sa reactioneze, vom suprascrie metoda tr ansformBy()". Pentru aceasta este suficient sa apelam metoda transfo rmBy pe toate datele membre care au semnificatie geometrica. Toate aceste da te sīnt de fapt obiecte, care au, la rīndul lor, definita aceasta metoda si care folosesc acelasi argument. Exceptie fac datele membre care memoreaza razele cer curilor, deoarece acestea nu sīnt obiecte ci tipuri de date C standard. Pentru a cestea le vom transforma īn vectori, pe care vom aplica matricea de transformare . Īn final, vom citi lungimile vectorilor si le vom atribui noilor raze. Observa m ca aceasta metoda debuteaza cu un apel misterios: assertWriteEnabled(). Aceasta este o metoda AcDbObject care are dubla menire. Īn primul rīnd verifica daca obiectul a fost accesat pentru scriere si īn al doilea rīnd asigura memora rea datelor pentru operatia UNDO. Ea este folosita NUMAI īn interiorul functiilo r membre ale claselor derivate din AcDbObject si trebuie sa fie prezenta īn prima linie. Īn forma īn care avem acum metoda transformBy, putem sa f acem UNDO si REDO. Daca comentam linia cu pricina si recompilam, observam ca UND O si REDO nu mai au nici un efect asupra obiectului Custom. De aceea, reg ula este ca orice metoda care modifica datele membre trebuie sa debuteze cu dire ctiva assertWriteEnabled(). Daca nu sīntem consecventi, AutoCAD-ul pur si simplu va disparea din fata ochilor nostri īn cazul unui UNDO care implica si un obiect
Custom si care nu are mecanismul de memorare aplicat pe toate metodele necesare. Explicatia este simpla: daca unele metode memoreaza date si altele nu, restaurarea datelor membre la o comanda UNDO este supusa hazardului. Asadar, assertWriteEnabled() se foloseste sau peste tot unde se modifica date membru, sau nicaieri.
Pentru a face mai usoara dezvoltarea acestui obiect, vom suprascrie si metoda list", pentru a citi diverse date din obiectul nostru. Īn aceasta metoda sīntem liberi sa listam orice date care pot fi utile. Privind metoda list, prea multe de spus nu mai sīnt.
Si ultima metoda pe care o vom implementa īn acest articol, este metoda explode". Scopul nostru va fi sa construim doua cercuri, folosind datele membre. Daca dorim, sau daca aplicatia o cere, putem genera alte entitati, pe baza datelor membre existente sau sa generam entitati care nu au nici o legatura cu acestea. Argumentul AcDbVoidPtrArray este o lista de pointeri pe care o vom umple cu entitatile create īn corpul metodei. Din nou atentie! Nu folositi operatorul delete" pentru cele doua cercuri create cu new". Ele trebuie sa ramīna la dispozitia AutoCAD-ului care le va prelua si le va gestiona īn continuare. Pasul urmator va fi popularea entitatii cu grip-points" si stabilirea regulilor dupa care obiectul nostru sa reactioneze la object snap". Dar aceasta, īn numarul viitor. Pīna atunci, compilare placuta!
Fisierul custom.h din numarul trecut, cu noi
adaugiri
Fisierul custom.cpp din numarul trecut, continuare