]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Constructor/include/item.h
corregi las imagenes del manual del usuario y agregue una mas
[z.facultad/75.42/plaqui.git] / Constructor / include / item.h
index 5db334182c026d25382d2b030317c08cedacf441..41348ca046260d98712fe080579fa9df6b2e2d8f 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;
-       
+/**Esta es la clase padre de todos los items que puedan aparecer
+  *Aca estan definidos todos los comportamientos en comun y en 
+  *algunos casos hay funciones abstractas para que cada item defina
+  * su propio comportamiento.
+*/
+/**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.
+*/
+
 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; }
@@ -89,17 +131,115 @@ public:
          * ya que cada item verifica sus conexione de manera difenrente y todos deben
          * hacerlo.
        */
+/**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:
+ *      \image html ckeck_connection.png
+ *      
+ *     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.
+*/
        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.
@@ -133,6 +275,9 @@ public:
        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;
@@ -140,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;
        
@@ -160,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