X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/667418327423ba116d24751926a95a2f1235849c..d6c96b6260b244a35d73da28571d1ad48be7cf5d:/Constructor/include/item.h diff --git a/Constructor/include/item.h b/Constructor/include/item.h index 34f9ecd..7400167 100644 --- a/Constructor/include/item.h +++ b/Constructor/include/item.h @@ -15,6 +15,13 @@ ///Tipo de estado en el que pueden estar los conectores de un item typedef enum { UNDEF, IN, OUT } ConnectorType; +///Tipo que indica que conector de alguna compuerta esta conectado con algun item. Usado para cargar el XML. +typedef struct { + ConnectorType type; + Glib::ustring name_dest; + int cistern_connector; +}t_logic_connector; + ///Clase que define un conector del item class Connector { public: @@ -30,8 +37,43 @@ class Connector { } }; -//class WorkPlace; - +/** + * Clase padre de todos los items que puedan aparecer. + * En esta clase están definidos todos los comportamientos en común + * y en algunos casos hay funciones abstractas para que cada item + * defina su propio comportamiento. + * Comportamientos comunes que se definen son, por ejemplo, + * 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ía 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(). + * + * 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 está conectado. + * + * Al ser esta clase abstracta, no puede ser instanciada, + * con lo cual existiría una clase derivada de esta para + * cada item que se quiera agregar en la aplicación. +*/ + class CItem:public Gtk::DrawingArea { public: ///Constructor @@ -42,6 +84,9 @@ public: ///Destructor virtual ~CItem(); + + virtual void on_realize(); + ///Dibuja el item cada vez que este evento es llamado por la ventana que lo contiene. virtual bool on_expose_event(GdkEventExpose* event); @@ -53,9 +98,6 @@ public: ///Elimina el Item al seleccionarse la opcion en el menu flotante virtual void on_menu_popup_eliminar(); - - ///TODO: conectar los items con lineas!!! - virtual void on_menu_popup_conectar(); ///Retorna un puntero a la imagen actual. Glib::RefPtr get_image() { return image; } @@ -85,21 +127,119 @@ public: */ virtual void save(FILE *archivo) = 0; - /**Funcion abstracta que debe ser implementada en las clases descendientes - * ya que cada item verifica sus conexione de manera difenrente y todos deben - * hacerlo. - */ + /** + * Verifica que el ítem esté bien conectado. + * Las clases que heredan de CItem son las siguientes: + * + * -# Conduct: representa un tubo. + * + * -# Splitter: representa un codo. + * + * -# Union: representa un empalme ( UNION ó DIVISION). + * + * -# Cistern: representa un tanque, + * + * -# Exclusa: representa una exclusa. + * + * -# Drain: representa un drenaje. + * + * -# 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: + * \image html check_connection.png + * \image latex check_connection.eps "Planta de ejemplo." width=10cm + * + * Donde \c bomba0 y \c tubo0 son los de la izquiera y \c bomba1 y + * \c 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 \c bomba0, este debe + * preguntar con quién esta conectado en su salida pero ya + * sabe, por ser bomba que tendrá una salida, luego el + * \c 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 \c bomba0 y el + * \c tubo0 se setean sus conectores y se establecen como \e conectados. + * + * Continuando con la iteración, es el turno del \c 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 + * \c bomba1 y el \c 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. + */ virtual bool check_connection()=0; - ///TODO: hacer abstractas estas funciones... en item no hacen nada.... + ///Setea los conectores en su estado inicial. virtual void set_default_connector(); + + ///Devuelve el tipo de conector que tiene el item en la posicion (_a,_b). virtual ConnectorType get_connector_type( int _a, int _b ); + /**Devuelve en _a y _b la posicion de los conectores logicos del item segun su posicion. + */ + virtual void get_in_logic_connect_position(int& _a, int& _b); + virtual void get_out_logic_connect_position(int& _a, int& _b); + + /**Actualiza las posiciones de los conectores ante un movimiento o rotacion del item. + */ + virtual void update_logic_position(); + + /**Funciones para no permitir mas de una conexion a la salida de las compuertas. + *En el caso de la compuerta NOT, tampoco puede tener mas de una conexion + *a la entrada. + */ + virtual void set_out_connected(bool _o); + virtual void set_in_connected(bool _o); + + virtual bool get_out_logic_connect(); + /**Dibuja los conectores logicos del Item, AZUL == SALIDA, ROJO == ENTRADA. + */ + virtual void draw_connectors(); + ///Puntero al area de trabajo de la ventana principal WorkPlace *workplace; ///Puntero al cuadro de texto de la ventana principal - Gtk::Entry *combo_entry; + Gtk::Combo *combo_entry; + + ///Puntero a la barra de estado + Gtk::Statusbar *status_bar; ///Puntero a la lista de items std::list *listaItems; @@ -118,7 +258,9 @@ public: ///Indica si puede realizarse la conexion logica con una compuerta static bool logic_connect; - static int quien; + + ///Almacena el ID de la compuerta logica seleccionada + static int gate_id; /**Vector de connectores donde se mantiene la siguiente referencia: * indice 0 = "arriba/izquierda" para la exclusa, el tubo, el codo, el empalme y el tanque. @@ -131,6 +273,11 @@ public: *excepto el tanque que seria derecha-izquierda. */ std::vector connect_vec; + + void set_img_actual(int i) { imgActual = i; } + + ///Puntero al cuadro de texo de la ventana principal. + std::list *list_pointed; protected: ///Indica el numero que le corresponde a la imagen actual del item. int imgActual; @@ -138,6 +285,10 @@ protected: ///Numero "unico" que identifica al item. int ID; + Glib::RefPtr gc; + + Gdk::Color blue, red; + ///Nombre del item Glib::ustring name; @@ -158,9 +309,12 @@ protected: ///Puntero a la ventana de propiedades del item ItemPtyWnd *property_wnd; - + ///Posicion del item en el area de trabajo int x, y; + + ///Posicion de los conectores logicos. + int in_x, in_y, out_x, out_y; }; #endif