Monday, 28 September 2009

Thundax Box Manager 2.0

Ya está disponible la última versión de la aplicación Thundax Box Manager 2.0, la cuál ajustando unos cuantos conceptos de diseño pasará a convertirse en un framework de trabajo para poder dibujar objetos sobre un canvas. En ésta versión he acabado de implementar la persistencia de objetos mediante Marshal y Unmarshal con apoyo mediante XML. Aunque trae bastante trabajo, es fácil de implementar y fácil de seguir sin tocar el diseño original de nuestras clases. Entre las últimas novedades que utiliza la herramienta puedo destacar:
  • Identificador único de objeto utilizando un GUID.
  • Persistencia del lienzo mediante una estructura simple en XML.
  • Tamaño del lienzo modificado a 1024 x 780 pixels.
Si analizamos el nuevo diseño de las clases podemos ver:

La famosa clase TBox, que implementa las interfaces ISerializable y ICloneable, permitiendo así que el objeto pueda ser clonado y serializado para su posterior almacenaje o persistencia.


Otra de las partes más importantes de la aplicación es la generación de las líneas y su cálculo. La factoría abstracta ha sido modificada levemente para poder realizar una llamada a un elemento de la factoría a través de su nombre.


TAbstractFactory = class(TObject)
private
FCanvas: TCanvas;
public
constructor Create(Canvas: TCanvas);
destructor Destroy; override;
function GetLine(): TAbstractLine; virtual; abstract;
function GetLineArrow(): TAbstractLine; virtual; abstract;
function GetLineDoubleArrow(): TAbstractLine; virtual; abstract;
function GetLineByName(name : String) : TAbstractLine; virtual; abstract;
end;


Entre los otros aspectos a destacar tenemos las diferentes implementaciones de:

TVertex es una clase mucho más compleja que el registro TPoint (éste último lo he tenido que eliminar por problemas de serialización con Delphi 2010). De ésta manera puedo tener control sobre los vértices y añadirles más propiedades y eventos a éstos.

Luego dispongo de las interfaces que me permiten implementar la clonación y serialización en mis clases básicas Tbox y TAbstractLine.

En las siguientes imágenes muestro las posibilidades que tiene la aplicación para poder crear diversos grafos conectados:


Si nos fijamos en las pantallas de propiedades, veremos que cada objeto está identificado con su identificador único GUID, el cuál aparece representado en el lateral de la pantalla de propiedades:

El tema de la generación del GUID con delphi es muy simple. Si lo queremos para nuestras interfaces, solo tenemos que pulsar CTRL+SHIFT+G '{F6676376-D14B-4860-AD5B-D920DF25E52D}' y obtendremos uno nuevo. Para hacer la llamada mediante una función o método, solo tenemos que utilizar la siguiente función:


uses
ComObj, ActiveX;

function CreateGuid(): string;

implementation

function CreateGuid(): string;
var
ID: TGUID;
begin
Result := '';
if CoCreateGuid(ID) = S_OK then
Result := GUIDToString(ID);
end;


Ahora los siguientes pasos consisten en utilizar ésta base desarrollada y generar aplicaciones más potentes con componente visual. Si os fijáis en la declaración de las clases, de momento he dejado un puntero personalizable en cada objeto TBox y TAbstractLine para que le podamos dar la utilización que queramos.

Gráficamente disponemos de lo siguiente:

Podemos utilizar cada uno de los objetos y colgar nuestro objeto personalizado. De ésta manera, la parte gráfica queda solucionada por TBox y la lógica la podemos hacer externa. En los próximos posts intentaré implementar alguna herramienta típica con mi framework a ver que sale.

En definitiva, el entorno es casi funcional y permite crear bonitos grafos conectados. He podido arreglar temas de aliasing, temas de intersección de rectas y trabajar con puntos en el espacio. Como veis no es tan trivial crear algo que dibuje objetos sobre un lienzo. Hay que disponer de "culturilla" general para poder realizar correctamente los cálculos matemáticos y saberlos transformar para que el ordenador los entienda. Como digo yo, realizar una integral a mano es relativamente fácil, ahora lo complicado es hacerlo para que el ordenador sea capaz de hacerla. Siempre me han fascinado las partes gráficas de los IDE's o de aplicaciones, y creo que es una parte bastante complicada de implementar.



0 comments:

Post a Comment