PlaQui Constructor Documentación Técnica Table of Contents 1 Introducción: 2 Descripción del desarrollo: 2.1 Constructor: 2.2 WorkPlace: 2.3 CItem: 2.3.1 Método check_connection(): 3 Formtato del archivo: 1 Introducción: Al ser una aplicación visual, algunos conceptos de la programación orientada a objetos no se han tomados al pie de la letra, ya sea cuestiones de encapsulamiento o abstracción. 2 Descripción del desarrollo: 2.1 Constructor: La clase principal de esta aplicación es la clase Constructor. Ella es la encargada de obtener e inicializar todos los elementos de la ventana principal, ya sean botones, cuadros de diálogo, barras de herramientas, etc. Para cada botón referenciado por esta clase, es conectado a ellos una señal, que será el método que deben invocar al ser presionados. Uno de los métodos mas importantes de esta clase es " on_item_drop_drag_recived()" que es la encargada de crear un nuevo elemento si es arrastrado desde la barra de elementos, o de moverlo dentro del área de trabajo si este ya estaba creado. Para facilitar el diseño y disminuir la complejidad, la grilla fue dividida en sectores de 32x32 pixels, lo que permite que el usuario no tenga que ser muy preciso a la hora de soltar un item en el área de trabajo. Cada nuevo elemento creado es almacenado en una lista de elementos ( "listaItems" ) de transporte o almacenamiento de fluido, o de elementos lógicos, según cual sea ( "lista_logic_items"). Otra de las funciones principales es "check_connection()" que recorre todos los items de ambas listas y verifica que se haya formado en el momento del diseño un circuito posible. Mas adelante se verá como cada elemento verifica su conexión. Esta clase contiene los métodos necesarios para guardar y cargar un archivo XML cuyo formato se explica mas adelante. También está contenida en ella la clase WorkPlace, que detalla a continuación. 2.2 WorkPlace: Esta clase es la encarga de de manejar el área trabajo. Deriva de Gtk::DrawingArea pues es donde se van a dibujar todos los elementos. Una de sus principales tareas es redibujarse cuando sea necesario y al mismo tiempo, redibujar los elementos que contiene, como pueden ser los items de la planta o las líneas lógicas que conectan los mismos. Para lograr esto, se ha redefinido el método virtual (contenido en la clase ancestro) "on_expose_event()" de manera conveniente. También se encarga de eliminar correctamente un item, eliminando al mismo tiempo las lineas que llegan o salen de él. 2.3 CItem: Acá se definen los comportamientos comunes de todo los items de la aplicación, como puede ser la imagen actual, la posición en la grilla, el caudal máximo,el número único de identificación y diferentes punteros a otros objetos. Por cuestiones de diseño los elementos de la planta además de tener un número único que los identifica, también deben tener nombres difrerentes. También esta definida en esta clase la estuctura que representa los conectores físicos, y otra que representa a los conectores lógicos. Esta clase contiene métodos abstractos ya que cualquier elemento que descienda de ella deberá poder implementar los mismos porque, por ejemplo, ningún item se guarda en un archivo de la misma manera; este es el caso del método "save( FILE archivo)". Existe otro método abstracto dentro de esta clase que es "check_connection()". Del mismo modo que un item se guarda de forma diferente que otro, también verifica su conexión de distinta forma, es por eso que cada item debe implementar su manera de verificar como y con quién esta conectado. Al ser esta clase abstracta, no puede ser instanciada, con lo cual existirá una clase derivada de esta para cada item que se quiera agregar en la aplicación. 2.3.1 Método check_connection(): Anteriormente se mencionó que cada item verifica sus conexiones de manera diferente. Las clases que heredan de CItem son las siguientes: 1. Conduct: representa un tubo. 2. Splitter: representa un codo. 3. Union: representa un empalme ( UNION ó DIVISION). 4. Cistern: representa un tanque, 5. Exclusa: representa una exclusa. 6. Drain: representa un drenaje. 7. Pump: representa una bomba. Para las clases Conduct, Splitter y Exclusa, este método es bastante similar, sobre todo teniendo en cuenta que una exclusa es un tubo con una propiedad mas (abierto/cerrado) y el codo es un tubo que en la aplicación representa un curva. Estos tres elementos tienen la particularidad que sus conectores físicos no estan definidos en el momento de su creación, sino que se definen una vez que pertenecen a un circuito. La verificación se realiza recorriendo la lista de items y preguntandole a cada uno que posee en sus extremos. El tanque, la bomba, el empalme y el drenaje, tiene definidos sus conectores en el momento de la creación. Supongamos que el circuito es el siguiente: Donde bomba0 y tubo0 son los de la izquiera y bomba1 y tubo1 son los de la derecha, para poder diferenciarlos. Cabe aclarar que no importa con cual de los items se comience la iteración. Según la imagen actual de la bomba0, este debe preguntar con quién esta conectado en su salida pero ya sabe, por ser bomba que tendrá una salida, luego el tubo0 que en ese momento no esta definido, debe averiguar como definirse, para hacerlo pregunta en su otro extremo el cual esta conectado con una unión, que por ser unión posee dos entradas (horizontales en este caso) y una salida (vertical). La unión le responde que posee una entrada, por lo tanto el extremo derecho del tubo será una salida, lo cual implica que el extremo izquierdo tiene que ser una entrada, y esto es compatible con la bomba. De esta forma la bomba0 y el tubo0 se setean sus conectores y se establecen como "conectados" . Continuando con la iteración, es el turno del tubo0 (por el orden de incersión en la lista), pero este ya está conectado, por lo tanto no se realizan verificaciones. Lo mismo ocurre del lado derecho del circuito con la bomba1 y el tubo1. Algo similar ocurre cuando la unión pregunta que tiene en su salida, la exclusa debe preguntarle al tanque y este le responderá que posee una entrada, luego la exculsa tendrá una entrada en el extremo superior y una salida en el inferior; nuevamente el circuito es compatible. Por último el tanque le solicita al codo que le informe su estado y el proceso se repite con el drenaje que posee solamente una salida. Así todos los elementos han quedado conectados y conocen también con quién o quienes lo están. 3 Formtato del archivo: El archivo de salida de la planta al guardarla tiene un formato XML. Para el ejemplo anterior el archivo sería el siguiente: