]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Constructor/include/item.h
voy completando, estoy pensando como estirar frases para que queden re guaaaauuuu
[z.facultad/75.42/plaqui.git] / Constructor / include / item.h
index 34f9ecd770831ea1008528f713178399a95c21cb..74001672fa3a9c4a236a23433720a43e75daf1b1 100644 (file)
 ///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<Gdk::Pixbuf> 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<CItem *> *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<Connector> connect_vec;
+
+       void set_img_actual(int i) { imgActual = i; }
+       
+       ///Puntero al cuadro de texo de la ventana principal.
+       std::list<Glib::ustring> *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<Gdk::GC> 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