Pentru a avea o entitate care sa semene cu cele native AutoCAD, trebuie sa continuam implementarea unora dintre metodele virtuale ramase. Pentru aceasta ne vom focaliza pe implementarea comenzii "stretch" si pe popularea entitatii cu "grip-points". La primul pas se specifica punctele care vor actiona la comanda STRETCH si la al doilea pas se specifica transformarile pe care trebuie sa le sufere entitatea īn cadrul acestei comenzi. Problematica GRIP-POINTS este asemanatoare īn acest caz, dar se poate imagina o extindere a posibilitatilor de modificare a entitatii, atasīndu-i puncte cu actiune specializata, dupa acelasi tipic. Asadar, īn metoda getStretchPoints avem de umplut argumentul lista de puncte cu coordonatele viitoarelor GRIP-POINTS. Īn mod evident, acestea sīnt punctul de start si cel de terminare. Ne putem imagina, de asemenea, un punct aflat la jumatatea distantei dintre punctele sus-mentionate, care sa fie responsabil de mutarea sau rotirea entitatii. Trebuie sa tinem cont de faptul ca ordinea īn care indicam punctele conteaza, ulterior primind doar indicii acestora din lista. Īn metoda moveStretchPointsAt vom face un test preliminar īn asa fel īncīt sa nu parcurgem codul degeaba daca nu e cazul. Daca nu primim indicele niciunui punct sau daca vectorul deplasament, care este oferit ca parametru de intrare, este de lungime zero, e mai bine sa ne lasam pagubasi. Daca īn schimb, sīnt implicate toate punctele definite de noi, asa cum cere comportamentul entitatlor AutoCAD standard, va trebui sa implementam translatia. Aceasta se face usor, setīnd valorile vectorului deplasare īntr-o matrice de transformare cu care invocam metoda transformBy() anterior implementata. Īn fine, daca anvem unul sau mai multe puncte (dar nu toate) implicate īn actiunea de STRETCH, vom apela metoda moveGripPointsAt, pe care o vom discuta imediat. Metoda getGripPoints este identica cu getStretchPoints si de aceea apelul va fi redirectat spre aceasta. Īn alte situatii, se pot alege alte coordonate decīt cele definite pentru STRETCH. Dupa ce si acest pas s-a terminat, vom defini (īn sfīrsit) actiunile pe care le dorim īn cazul editarii GRIP-POINT-urilor (ce mai cuvīnt!). Metoda moveGripPointsAt ia fiecare indice si īn conformitate cu ordinea anterior aleasa, face o anumita actiune asupra datelor entitatii. Īn cazul nostru, pentru indicele zero, se deplaseaza punctul de start cu valoarea data de vectorul deplasament si se modifica raza celui de-al doilea cerc cu o valoare calculata īn asa fel īncīt cele doua cercuri sa ramīna tangente. V-am prezentat o implementare minimala a celor doua actiuni īnfratite, dar Dumneavoastra puteti sa va imaginati si sa implementati actiuni mult mai sofosticate si diverse. Urmeaza sa implementam modurile OBJECT SNAP si cu asta putem spune ca avem o entitate īn toata legea. Dar aceasta se va īntīmpla īn numarul viitor. Pīna atunci, compilare placuta.