From d28e70425d07b46f732db220f83d6c0826c90a88 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Mon, 1 Dec 2003 21:27:24 +0000 Subject: [PATCH] * Se modifica el modelo para que el tanque mando en el XML el estado logico de sus salidas * Se modifica el cliente para leer el estado logico del tanque * Se modifica el trazado de lineas para dibujar correctamente las lineas del tanque y los colores segun el estado logico de las salidas * Se deja bonito el ejemplo tanque.xml --- Client/include/item.h | 11 ++++- Client/include/item_tank.h | 9 ++++ Client/src/principal.cpp | 90 +++++++++++++++++++++++++++++++------- Model/src/tank.cpp | 2 + Samples/tanque.xml | 7 ++- 5 files changed, 100 insertions(+), 19 deletions(-) diff --git a/Client/include/item.h b/Client/include/item.h index d44f403..62f1b66 100644 --- a/Client/include/item.h +++ b/Client/include/item.h @@ -9,6 +9,13 @@ #include #include +/** Estructura para guardar las lineas de conexión */ +typedef struct { + std::string dst; ///< Destino de la línea + bool is_tank; ///< Define si es un tanque + bool is_tank_lower; ///< Define si esta conectado abajo +} t_Linea; + class ViewItem:public Gtk::EventBox { public: ViewItem(Glib::ustring _name); @@ -31,8 +38,8 @@ public: virtual std::string get_cap_extra() { return ""; } virtual std::string get_extra() { return ""; } - std::list out_lines; // lineas que salen de una compuerta - std::list in_lines; // lineas que entran a una compuerta + std::list out_lines; // lineas que salen de una compuerta + std::list in_lines; // lineas que entran a una compuerta // Coordenadas para los conectores int x,y; diff --git a/Client/include/item_tank.h b/Client/include/item_tank.h index 1b9aee9..2cf4ac6 100644 --- a/Client/include/item_tank.h +++ b/Client/include/item_tank.h @@ -13,6 +13,15 @@ public: virtual std::string get_cap_extra() { return "Liquido :"; } virtual std::string get_extra(); bool on_image_expose_event(GdkEventExpose *e); + + void set_out_sup(bool b) { out_sup = b; } + bool get_out_sup() { return out_sup; } + void set_out_inf(bool b) { out_inf = b; } + bool get_out_inf() { return out_inf; } + +protected: + /* Salida logica superior e inferior respectivamente */ + bool out_sup, out_inf; }; #endif diff --git a/Client/src/principal.cpp b/Client/src/principal.cpp index 3a9bfe4..cdba798 100644 --- a/Client/src/principal.cpp +++ b/Client/src/principal.cpp @@ -117,15 +117,36 @@ bool Principal::on_workplace_expose_event(GdkEventExpose *e) if (dynamic_cast(i->second) || dynamic_cast(i->second) || dynamic_cast(i->second)) { x1 = i->second->x + i->second->in_x; y1 = i->second->y + i->second->in_y; - std::list::iterator linea; + std::list::iterator linea; for(linea=i->second->in_lines.begin(); linea!=i->second->in_lines.end(); linea++) { - ViewItem *tmp = find_item(*linea); - x2 = tmp->x + tmp->out_x; - y2 = tmp->y + tmp->out_y; - if (tmp->get_open()) { - gc->set_foreground(color_high); + ViewItem *tmp = find_item(linea->dst); + /* Si este item es un tanque */ + if (linea->is_tank) { + if (linea->is_tank_lower) { + x2 = tmp->x + tmp->out_x; + y2 = tmp->y + tmp->out_y; + if (dynamic_cast(tmp)->get_out_inf()) { + gc->set_foreground(color_high); + } else { + gc->set_foreground(color_low); + } + } else { + x2 = tmp->x + tmp->in_x; + y2 = tmp->y + tmp->in_y; + if (dynamic_cast(tmp)->get_out_sup()) { + gc->set_foreground(color_high); + } else { + gc->set_foreground(color_low); + } + } } else { - gc->set_foreground(color_low); + x2 = tmp->x + tmp->out_x; + y2 = tmp->y + tmp->out_y; + if (tmp->get_open()) { + gc->set_foreground(color_high); + } else { + gc->set_foreground(color_low); + } } gc->set_line_attributes(3, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_MITER); window->draw_line(gc, x2+tmp->item_offset_x, y2+tmp->item_offset_y, x2+tmp->item_offset_x, y1+i->second->offset_y); @@ -136,7 +157,7 @@ bool Principal::on_workplace_expose_event(GdkEventExpose *e) x1 = i->second->x + i->second->out_x; y1 = i->second->y + i->second->out_y; for(linea=i->second->out_lines.begin(); linea!=i->second->out_lines.end(); linea++) { - ViewItem *tmp = find_item(*linea); + ViewItem *tmp = find_item(linea->dst); x2 = tmp->x + tmp->in_x; y2 = tmp->y + tmp->in_y; if (i->second->get_open()) { @@ -434,6 +455,7 @@ void Principal::loadNot(xmlNodePtr nodo) std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre"); std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id"); int orientacion=0, x, y; + t_Linea linea; ViewNot *p; nodo = nodo->children; @@ -447,9 +469,18 @@ void Principal::loadNot(xmlNodePtr nodo) } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) { y = atoi( (char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) { - p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + p->out_lines.push_back(linea); } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { - p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + linea.is_tank = false; + if (dynamic_cast(find_item(linea.dst)) != NULL) { + linea.is_tank = true; + linea.is_tank_lower = false; + if (xmlStrcmp(xmlGetProp(nodo, BAD_CAST"id"), BAD_CAST"inferior")==0) + linea.is_tank_lower = true; + } + p->in_lines.push_back(linea); } } nodo = nodo->next; @@ -468,6 +499,7 @@ void Principal::loadOr(xmlNodePtr nodo) std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre"); std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id"); int orientacion=0, x, y; + t_Linea linea; ViewOr *p; @@ -482,9 +514,18 @@ void Principal::loadOr(xmlNodePtr nodo) } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) { y = atoi( (char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) { - p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + p->out_lines.push_back(linea); } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { - p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + linea.is_tank = false; + if (dynamic_cast(find_item(linea.dst)) != NULL) { + linea.is_tank = true; + linea.is_tank_lower = false; + if (xmlStrcmp(xmlGetProp(nodo, BAD_CAST"id"), BAD_CAST"inferior")==0) + linea.is_tank_lower = true; + } + p->in_lines.push_back(linea); } } nodo = nodo->next; @@ -505,7 +546,7 @@ void Principal::loadAnd(xmlNodePtr nodo) int orientacion=0, x, y; float flujo; xmlNodePtr inicial = nodo; - + t_Linea linea; ViewAnd *p; nodo = nodo->children; @@ -519,9 +560,18 @@ void Principal::loadAnd(xmlNodePtr nodo) } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) { y = atoi( (char *)XML_GET_CONTENT(nodo->children) ); } else if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) { - p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + p->out_lines.push_back(linea); } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) { - p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children)); + linea.dst = (char *)XML_GET_CONTENT(nodo->children); + linea.is_tank = false; + if (dynamic_cast(find_item(linea.dst)) != NULL) { + linea.is_tank = true; + linea.is_tank_lower = false; + if (xmlStrcmp(xmlGetProp(nodo, BAD_CAST"id"), BAD_CAST"inferior")==0) + linea.is_tank_lower = true; + } + p->in_lines.push_back(linea); } } nodo = nodo->next; @@ -782,18 +832,28 @@ void Principal::read_status_xml(const std::string &frame) xmlNodePtr nodo_tmp = items->children; float cap, lit; cap = lit = -1; + bool b_inf, b_sup; while (nodo_tmp != NULL) { if (nodo_tmp->type == XML_ELEMENT_NODE) { if (xmlStrcmp(nodo_tmp->name, BAD_CAST"capacity")==0) cap = atof( (char *)XML_GET_CONTENT(nodo_tmp->children) ); else if (xmlStrcmp(nodo_tmp->name, BAD_CAST"litros")==0) lit= atof( (char *)XML_GET_CONTENT(nodo_tmp->children) ); + else if (xmlStrcmp(nodo_tmp->name, BAD_CAST"salida")==0) { + if (xmlStrcmp(xmlGetProp(items, BAD_CAST"id"), BAD_CAST"inferior")==0) { + b_inf = get_bool_from_xml(nodo_tmp->children); + } else { + b_sup = get_bool_from_xml(nodo_tmp->children); + } + } } nodo_tmp = nodo_tmp->next; } item_name = (char *)xmlGetProp(items, BAD_CAST"name"); mapItems[item_name]->set_actual_flow(cap); mapItems[item_name]->set_extra(lit); + dynamic_cast(mapItems[item_name])->set_out_sup(b_sup); + dynamic_cast(mapItems[item_name])->set_out_inf(b_inf); } } items = items->next; diff --git a/Model/src/tank.cpp b/Model/src/tank.cpp index 0a83de3..c9a4cc6 100644 --- a/Model/src/tank.cpp +++ b/Model/src/tank.cpp @@ -108,5 +108,7 @@ void Tank::get_state_as_xml(std::stringstream &out) out << "\t" << std::endl; out << "\t\t" << capacity << "" << std::endl; out << "\t\t" << litros << "" << std::endl; + out << "\t\t" << (output->get_output()?"true":"false") << "" << std::endl; + out << "\t\t" << (input->get_output()?"true":"false") << "" << std::endl; out << "\t" << std::endl; } diff --git a/Samples/tanque.xml b/Samples/tanque.xml index 06c617b..1f918a1 100644 --- a/Samples/tanque.xml +++ b/Samples/tanque.xml @@ -44,9 +44,12 @@ codo2 - exclusa4 + tubo9 - 0 + 80 + 20 + + 0 288 160 -- 2.43.0