From: Ricardo Markiewicz Date: Tue, 25 Nov 2003 23:15:02 +0000 (+0000) Subject: * Se mejora la deteccion de conexiones en el constructor X-Git-Tag: svn_import~173 X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/commitdiff_plain/fb8d2fb83534b0ca76f81e6d107e38d002642a46?ds=sidebyside * Se mejora la deteccion de conexiones en el constructor * Se intenta que los colores en la union se sumen bien. Hay problemita por ahi --- diff --git a/Constructor/src/conduct.cpp b/Constructor/src/conduct.cpp index 6cad0bf..769e943 100644 --- a/Constructor/src/conduct.cpp +++ b/Constructor/src/conduct.cpp @@ -115,28 +115,27 @@ void Conduct::save(FILE *archivo) bool Conduct::check_connection() { - ConnectorType aux; + ConnectorType aux, aux1, aux2; CItem *_item0, *_item1; - if ( is_connected ) - return is_connected; switch (get_img_actual()) { - case 0: - connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); - connect_vec[1].type = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5,& _item1); - break; - case 1: - connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); - connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item1); + case 0: + aux1 = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); + aux2 = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5,& _item1); + break; + case 1: + aux1 = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); + aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item1); } - if ( connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF ) { - aux = connect_vec[0].type; - connect_vec[0].type = connect_vec[1].type; - connect_vec[1].type = aux; + if ( (aux1 != UNDEF) && (aux2 != UNDEF) ) { + if (!is_connected) { + connect_vec[0].type = aux2; + connect_vec[1].type = aux1; + } connect_vec[0].id_dest = _item0->get_id(); connect_vec[1].id_dest = _item1->get_id(); return ( is_connected = (connect_vec[0].type != connect_vec[1].type) ); } - else return is_connected; + return is_connected = false; } /*si no estoy conectado pregunto por el del otro lado, y ahi puedo setear los dos @@ -152,16 +151,17 @@ ConnectorType Conduct::get_connector_type(int _a, int _b) connect_vec[1].type = is_other_connection_area(get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item); //pregunto que hay abajo switch ( connect_vec[1].type ) { case IN: - connect_vec[1] = OUT; - connect_vec[0] = IN; + connect_vec[1].type = OUT; + connect_vec[0].type = IN; break; case OUT: - connect_vec[1] = IN; - connect_vec[0] = OUT; + connect_vec[1].type = IN; + connect_vec[0].type = OUT; break; case UNDEF: return UNDEF; } + is_connected = true; return connect_vec[0].type; } @@ -170,16 +170,17 @@ ConnectorType Conduct::get_connector_type(int _a, int _b) connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5,& _item);//pregunto que hay arriba. switch ( connect_vec[0].type ) { case IN: - connect_vec[0] = OUT; - connect_vec[1] = IN; + connect_vec[0].type = OUT; + connect_vec[1].type = IN; break; case OUT: - connect_vec[0] = IN; - connect_vec[1] = OUT; + connect_vec[0].type = IN; + connect_vec[1].type = OUT; break; case UNDEF: return UNDEF; } + is_connected = true; return connect_vec[1].type; } break; @@ -189,12 +190,12 @@ ConnectorType Conduct::get_connector_type(int _a, int _b) connect_vec[1].type = is_other_connection_area(get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item);//pregunto por la derecha switch ( connect_vec[1].type ) { case IN: - connect_vec[1] = OUT; - connect_vec[0] = IN; + connect_vec[1].type = OUT; + connect_vec[0].type = IN; break; case OUT: - connect_vec[1] = IN; - connect_vec[0] = OUT; + connect_vec[1].type = IN; + connect_vec[0].type = OUT; break; case UNDEF: return UNDEF; @@ -207,12 +208,12 @@ ConnectorType Conduct::get_connector_type(int _a, int _b) connect_vec[0].type = is_other_connection_area(get_position_x()-5, get_position_y()+16, &_item); //pregunto por la izquierda. switch ( connect_vec[0].type ) { case IN: - connect_vec[0] = OUT; - connect_vec[1] = IN; + connect_vec[0].type = OUT; + connect_vec[1].type = IN; break; case OUT: - connect_vec[0] = IN; - connect_vec[1] = OUT; + connect_vec[0].type = IN; + connect_vec[1].type = OUT; break; case UNDEF: return UNDEF; diff --git a/Constructor/src/exclusa.cpp b/Constructor/src/exclusa.cpp index 90f8645..680ce43 100644 --- a/Constructor/src/exclusa.cpp +++ b/Constructor/src/exclusa.cpp @@ -158,48 +158,52 @@ void Exclusa::save(FILE *archivo) bool Exclusa::check_connection() { - ConnectorType aux; + ConnectorType aux, aux1, aux2; CItem *_item0, *_item1; switch (get_img_actual()) { - case 0: - connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //izquierda - connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16,& _item1); //derecha - break; - case 1: - connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); // arriba - connect_vec[1].type = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item1); //abajo + case 0: + aux1 = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //izquierda + aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16,& _item1); //derecha + break; + case 1: + aux1 = is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); // arriba + aux2 = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item1); //abajo } - if ( connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF ) { - aux = connect_vec[0].type; - connect_vec[0].type = connect_vec[1].type; - connect_vec[1].type = aux; + if ( aux1 != UNDEF && aux2 != UNDEF ) { + if (!is_connected) { + //aux = connect_vec[0].type; + // Aca van invertidos los tipos de entrada/salida + connect_vec[0].type = aux2; //connect_vec[1].type; + connect_vec[1].type = aux1; + } connect_vec[0].id_dest = _item0->get_id(); connect_vec[1].id_dest = _item1->get_id(); return ( is_connected = (connect_vec[0].type != connect_vec[1].type) ); } - else return is_connected; + return is_connected = false; } ConnectorType Exclusa::get_connector_type(int _a, int _b) { CItem *_item; switch (imgActual) { - case 0: + case 1: if ( (_a <= x+image->get_width()-10 )&&(_a >= x + 10) && (_b <= y+10) &&(_b > 0 ) ){ //arriba if ( is_connected ) return connect_vec[0].type; connect_vec[1].type = is_other_connection_area(get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item); //pregunto que hay abajo switch ( connect_vec[1].type ) { case IN: - connect_vec[1] = OUT; - connect_vec[0] = IN; + connect_vec[1].type = OUT; + connect_vec[0].type = IN; break; case OUT: - connect_vec[1] = IN; - connect_vec[0] = OUT; + connect_vec[1].type = IN; + connect_vec[0].type = OUT; break; case UNDEF: return UNDEF; } + is_connected = true; return connect_vec[0].type; } @@ -208,31 +212,32 @@ ConnectorType Exclusa::get_connector_type(int _a, int _b) connect_vec[0].type = is_other_connection_area( get_position_x()+16, get_position_y()-5,& _item);//pregunto que hay arriba. switch ( connect_vec[0].type ) { case IN: - connect_vec[0] = OUT; - connect_vec[1] = IN; + connect_vec[0].type = OUT; + connect_vec[1].type = IN; break; case OUT: - connect_vec[0] = IN; - connect_vec[1] = OUT; + connect_vec[0].type = IN; + connect_vec[1].type = OUT; break; case UNDEF: return UNDEF; } + is_connected = true; return connect_vec[1].type; } break; - case 1: + case 0: if ((_a <= x+10 )&&(_a > 0) && (_b <= y+image->get_height()-10) &&(_b >= y+10 )){ //izquierda if ( is_connected ) return connect_vec[0].type; connect_vec[1].type = is_other_connection_area(get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item);//pregunto por la derecha switch ( connect_vec[1].type ) { case IN: - connect_vec[1] = OUT; - connect_vec[0] = IN; + connect_vec[1].type = OUT; + connect_vec[0].type = IN; break; case OUT: - connect_vec[1] = IN; - connect_vec[0] = OUT; + connect_vec[1].type = IN; + connect_vec[0].type = OUT; break; case UNDEF: return UNDEF; @@ -245,12 +250,12 @@ ConnectorType Exclusa::get_connector_type(int _a, int _b) connect_vec[0].type = is_other_connection_area(get_position_x()-5, get_position_y()+16, &_item); //pregunto por la izquierda. switch ( connect_vec[0].type ) { case IN: - connect_vec[0] = OUT; - connect_vec[1] = IN; + connect_vec[0].type = OUT; + connect_vec[1].type = IN; break; case OUT: - connect_vec[0] = IN; - connect_vec[1] = OUT; + connect_vec[0].type = IN; + connect_vec[1].type = OUT; break; case UNDEF: return UNDEF; diff --git a/Constructor/src/splitter.cpp b/Constructor/src/splitter.cpp index 6cd6b3c..ea7f2d4 100644 --- a/Constructor/src/splitter.cpp +++ b/Constructor/src/splitter.cpp @@ -128,91 +128,195 @@ void Splitter::save(FILE *archivo) bool Splitter::check_connection() { - ConnectorType aux; + ConnectorType aux, aux1, aux2; CItem *_item0, *_item1; switch (get_img_actual()) { case 0: - connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //arriba-izquierda h - connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item1);//abajo-derecha v + aux1 = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //arriba-izquierda h + aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item1);//abajo-derecha v break; case 1: - connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5,& _item0);//arriba-derecha v - connect_vec[1].type = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item1);//abajo-izquierda h + aux1 = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5,& _item0);//arriba-derecha v + aux2 = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item1);//abajo-izquierda h break; case 2: - connect_vec[1].type = is_other_connection_area( get_position_x() + 16, get_position_y() - 5, &_item1);//arriba-izquierda v - connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item0); //abajo-derecha h + aux2 = is_other_connection_area( get_position_x() + 16, get_position_y() - 5, &_item1);//arriba-izquierda v + aux1 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item0); //abajo-derecha h break; case 3: - connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item1);//arriba-derecha h - connect_vec[0].type = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item0); //abajo-izquierda v + aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item1);//arriba-derecha h + aux1 = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item0); //abajo-izquierda v } - if (connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF) { - aux = connect_vec[0].type; - connect_vec[0].type = connect_vec[1].type; - connect_vec[1].type = aux; + if ((aux2 != UNDEF) && (aux1 != UNDEF)) { + if (!is_connected) { + connect_vec[0].type = aux2; + connect_vec[1].type = aux1; + } connect_vec[0].id_dest = _item0->get_id(); connect_vec[1].id_dest = _item1->get_id(); return ( is_connected = (connect_vec[0].type != connect_vec[1].type) ); } - else return is_connected; + return is_connected = false; } ConnectorType Splitter::get_connector_type(int _a, int _b) { CItem *_item; - if ( ! is_connected ) { - switch (imgActual) { - case 0: - if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h - return is_other_connection_area (get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item); - if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) )//abajo-derecha v - return is_other_connection_area( get_position_x()-5, get_position_y()+16,& _item); - break; - case 1: - if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v - return is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item); - if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h - return is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5, &_item); - break; - case 2: - if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v - return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item); - if ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-derecha h - return is_other_connection_area( get_position_x() + 16, get_position_y() - 5,& _item); - break; - case 3: - if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h - return is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item); - if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v - return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item); - } - } else { - switch (imgActual) { - case 0: - if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h - return connect_vec[0].type; - if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) )//abajo-derecha v - return connect_vec[1].type; - break; - case 1: - if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v - return connect_vec[0].type; - if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h - return connect_vec[1].type; - break; - case 2: - if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v - return connect_vec[1].type; - if ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-derecha h - return connect_vec[0].type; - break; - case 3: - if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h - return connect_vec[1].type; - if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v - return connect_vec[0].type; - } + switch (imgActual) { + case 0: + if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) {// arriba - izquierda h + if ( is_connected ) return connect_vec[0].type; + connect_vec[1].type = is_other_connection_area (get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item); + switch ( connect_vec[1].type ) { + case IN: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case OUT: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[0].type; + } + if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) {//abajo-derecha v + if ( is_connected ) return connect_vec[1].type; + connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16,& _item); + switch ( connect_vec[0].type ) { + case IN: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case OUT: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[1].type; + } + break; + case 1: + if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) {//arriba-derecha v + if (is_connected) return connect_vec[0].type; + connect_vec[1].type = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item); + switch ( connect_vec[1].type ) { + case IN: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case OUT: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[0].type; + } + + if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) {// abajo-izquierda h + if ( is_connected ) return connect_vec[1].type; + connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5, &_item); + switch ( connect_vec[0].type ) { + case IN: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case OUT: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[1].type; + } + break; + case 2: + if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) {//arriba-izquierda v + if ( is_connected ) return connect_vec[1].type; + connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item); + switch ( connect_vec[0].type ) { + case IN: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case OUT: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[1].type; + } + + if ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) {// abajo-derecha h + if (is_connected ) return connect_vec[0].type; + connect_vec[1].type = is_other_connection_area( get_position_x() + 16, get_position_y() - 5,& _item); + switch ( connect_vec[1].type ) { + case IN: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case OUT: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[0].type; + } + break; + case 3: + if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) {//arriba-derecha h + if ( is_connected ) return connect_vec[1].type; + connect_vec[0].type = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item); + switch ( connect_vec[0].type ) { + case IN: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case OUT: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[1].type; + } + + if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) {// abajo-izquierda v + if ( is_connected ) return connect_vec[0].type; + connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item); + switch ( connect_vec[1].type ) { + case IN: + connect_vec[0].type = IN; + connect_vec[1].type = OUT; + break; + case OUT: + connect_vec[0].type = OUT; + connect_vec[1].type = IN; + break; + case UNDEF: + return UNDEF; + } + is_connected = true; + return connect_vec[0].type; + } } return UNDEF; } diff --git a/Model/src/conduct.cpp b/Model/src/conduct.cpp index 3628ac6..e4a89d0 100644 --- a/Model/src/conduct.cpp +++ b/Model/src/conduct.cpp @@ -53,7 +53,14 @@ void Conduct::recieve_msg(int msg, IConector *who, void *data) void Conduct::update(int dir) { // Si ya me actualice, no lo tengo que hacer de nuevo - if (updated) return; + if (updated) { + std::list::iterator i = in_list.begin(); + if (i != in_list.end()) { + PlantItem *o = (PlantItem *)(*i); + set_color( o->get_color() ); + } + return; + } // Seteo mi actualizar en true para evitar entrar de nuevo actual_flow = 99999; updated = true; @@ -70,11 +77,6 @@ void Conduct::simulate() return; } - std::list::iterator i = in_list.begin(); - if (i != in_list.end()) { - PlantItem *o = (PlantItem *)(*i); - set_color( o->get_color() ); - } #ifdef DEBUG std::cout << name << "::Flujo actual = " << actual_flow << " de " << max_flow << std::endl; #endif diff --git a/Model/src/exclusa.cpp b/Model/src/exclusa.cpp index cc61519..8e56006 100644 --- a/Model/src/exclusa.cpp +++ b/Model/src/exclusa.cpp @@ -23,6 +23,11 @@ Exclusa::~Exclusa() void Exclusa::update(int dir) { + std::list::iterator i = in_list.begin(); + if (i != in_list.end()) { + PlantItem *o = (PlantItem *)(*i); + set_color( o->get_color() ); + } // Primero me fijo si la entrada esta operando, es decir // si hay alguien conectado para automatizar. if (input->is_operational()) { @@ -34,11 +39,6 @@ void Exclusa::update(int dir) void Exclusa::simulate() { - std::list::iterator i = in_list.begin(); - if (i != in_list.end()) { - PlantItem *o = (PlantItem *)(*i); - set_color( o->get_color() ); - } #ifdef DEBUG std::cout << name << ": " << ((is_open)?"Abierta":"Cerrada") << std::endl; #endif diff --git a/Model/src/simulator.cpp b/Model/src/simulator.cpp index f910c85..b6a77d3 100644 --- a/Model/src/simulator.cpp +++ b/Model/src/simulator.cpp @@ -151,6 +151,9 @@ void Simulator::simulate() (*i1)->update(); std::list::iterator i2; + for(i2=items.begin(); i2!=items.end(); i2++) + (*i2)->update(); + for(i2=items.begin(); i2!=items.end(); i2++) (*i2)->simulate(); diff --git a/Model/src/union.cpp b/Model/src/union.cpp index 58bc8e1..f581a67 100644 --- a/Model/src/union.cpp +++ b/Model/src/union.cpp @@ -95,7 +95,41 @@ void Union::recieve_msg(int msg, IConector *who, void *data) void Union::update(int dir) { // Si ya me actualice, no lo tengo que hacer de nuevo - if (updated) return; + RGB c_in1, c_in2; + unsigned r=0,g=0,b=0; + float c_f1, c_f2; // para ver los flujos de cada uno + + if (updated) { + std::list::iterator i = in_list.begin(); + if (i != in_list.end()) { + PlantItem *o = (PlantItem *)(*i); + c_in1 = o->get_color(); + c_f1 = o->get_actual_flow(); + i++; + o = (PlantItem *)(*i); + c_in2 = o->get_color(); + c_f2 = o->get_actual_flow(); + } + + set_color( RGB(r,g,b) ); + if ((c_f1 != 0) && (c_f2 != 0)) { + // Si ambas entradas traen flujo, sumo sus colores + int total = c_f1+c_f2; + r = ((int)((c_in1.r()*c_f1/total+c_in2.r()*c_f2/total)))%256; + g = ((int)((c_in1.g()*c_f1/total+c_in2.g()*c_f2/total)))%256; + b = ((int)((c_in1.b()*c_f1/total+c_in2.b()*c_f2/total)))%256; + set_color(RGB(r,g,b)); + } else { + // Veo que entrada trae color + if (c_f1 != 0) { + set_color( c_in1 ); + } + if (c_f2 != 0) { + set_color( c_in2 ); + } + } + return; + } // Seteo mi actualizar en true para evitar entrar de nuevo // FIXME : 99999 == INFINITO!! actual_flow = 99999; @@ -111,41 +145,8 @@ void Union::update(int dir) void Union::simulate() { - RGB c_in1, c_in2; - unsigned r=0,g=0,b=0; - float c_f1, c_f2; // para ver los flujos de cada uno - - if (!updated) { - return; - } - std::list::iterator i = in_list.begin(); - if (i != in_list.end()) { - PlantItem *o = (PlantItem *)(*i); - c_in1 = o->get_color(); - c_f1 = o->get_actual_flow(); - i++; - o = (PlantItem *)(*i); - c_in2 = o->get_color(); - c_f2 = o->get_actual_flow(); - } + if (!updated) return; - set_color( RGB(r,g,b) ); - if ((c_f1 != 0) && (c_f2 != 0)) { - // Si ambas entradas traen flujo, sumo sus colores - r = ((c_in1.r()+c_in2.r())/2)%256; - g = ((c_in1.g()+c_in2.g())/2)%256; - b = ((c_in1.b()+c_in2.b())/2)%256; - set_color(RGB(r,g,b)); - } else { - // Veo que entrada trae color - if (c_f1 != 0) { - set_color( c_in1 ); - } - if (c_f2 != 0) { - set_color( c_in2 ); - } - } - #ifdef DEBUG std::cout << name << "::Flujo actual = " << actual_flow << std::endl; #endif