diff --git a/Olivia/Olivia.rc b/Olivia/Olivia.rc index 91df30a..9f31834 100644 --- a/Olivia/Olivia.rc +++ b/Olivia/Olivia.rc @@ -28,8 +28,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,1,6,0 - PRODUCTVERSION 3,1,6,0 + FILEVERSION 3,4,0,0 + PRODUCTVERSION 3,4,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -46,12 +46,12 @@ BEGIN BEGIN VALUE "CompanyName", "VSM" VALUE "FileDescription", "Librería de la aplicación Olivia" - VALUE "FileVersion", "3.1.6.0" + VALUE "FileVersion", "3.4.0.0" VALUE "InternalName", "Olivia.dll" VALUE "LegalCopyright", "OLIVIA (c) VSM 2020. All rights reserved." VALUE "OriginalFilename", "Olivia.dll" VALUE "ProductName", "OLIVIA" - VALUE "ProductVersion", "3.1.6.0" + VALUE "ProductVersion", "3.4.0.0" END END BLOCK "VarFileInfo" diff --git a/Olivia/olv_limp.h b/Olivia/olv_limp.h index 96a3a7b..4fe517f 100644 --- a/Olivia/olv_limp.h +++ b/Olivia/olv_limp.h @@ -94,7 +94,7 @@ public: CartoBase cartoAux; std::map iaso; /// *tramos; - + std::vector coste_modificado; std::vector iaso_elev; ///iaso[ia].flgs & OLV_LIMP_FLG_CIRC_NONE) || ispedestrian) + if ((olv_limp->iaso[ia].flgs & OLV_LIMP_FLG_CIRC_NONE) || ispedestrian) { s= OLV_LIMP_VELO_CIRC_PEAT; //se le pone velo muy bajita para que intente no ir por ahí, porque son calles prohibidas //a no ser que haya un contenedor @@ -970,6 +970,7 @@ BOOL Colv_limp_thr::rellena_info_nw() { s=dbf.getI(icampv); } + s = dbf.getI(icampv); if(s<=0) { s=OLV_LIMP_VELO_DEF;//pone por def @@ -977,7 +978,7 @@ BOOL Colv_limp_thr::rellena_info_nw() olv_limp->iaso[ia].velReal = 1.0 * s * OLV_KMH2MS;; if(cevita==0) - olv_limp->iaso[ia].inf_n.velo=1.0*s*OLV_KMH2MS; + olv_limp->iaso[ia].inf_n.velo= olv_limp->iaso[ia].velReal; else if(cevita >0) { olv_limp->iaso[ia].inf_n.velo = 1.0 * cevita * s * OLV_KMH2MS; @@ -1195,6 +1196,14 @@ BOOL Colv_limp_thr::rellena_info_amb() if(!olv_limp->barr_mix) olv_limp->barr_mix=(barr_mix & (OLV_LIMP_FLG_AMB_APA | OLV_LIMP_FLG_AMB_BORD)) && (barr_mix & OLV_LIMP_FLG_AMB_ACE); } + else + { + if (olv_limp->uds_tto == OliviaDef::GeneralDef::OlvTipTtoMh_eje) + ancho = 1; + else if (olv_limp->uds_tto == OliviaDef::GeneralDef::OlvTipTtoM2h_eje) + ancho = olv_limp->ancho_via; + olv_limp->iaso[ia].inf_l.ancho = ancho; + } if (icampoid >= 0) { olv_limp->iaso[ia].oid = dbf.getI(icampoid); @@ -1658,12 +1667,10 @@ BOOL Colv_limp_thr::replica_peat() ient=olv_limp->carto.get(i); if(!(olv_limp->iaso[ient.entity()->ref].flgs & OLV_LIMP_FLG_AMB_PEAT)) continue; - //Replica la peatonal if(!ient.getCopy(&peatcp) || !olv_limp->carto.add(peatcp)) break; ientcp=olv_limp->carto.get(olv_limp->carto.getNumberEntities()-1); - //Añade la info aso info_aux.reset(); info_aux.flgs=OLV_LIMP_FLG_PEAT_REP; @@ -1923,7 +1930,7 @@ BOOL Colv_limp_thr::une_amb_nw(int soloi) { pon_mi_msg("Error en la unión de ámbitos a red navegable"); return FALSE; - } + } //Bucle por ámbito for(i=0;in_amb && !pirate; i++) { @@ -1936,6 +1943,7 @@ BOOL Colv_limp_thr::une_amb_nw(int soloi) continue; //Añade los segmentos a clase NW_union + add_uniones_obj(i); } //cuida si ha salido antes por falta de memo @@ -1947,7 +1955,6 @@ BOOL Colv_limp_thr::une_amb_nw(int soloi) if(comp_lejos) //ojo comprueba_aislados(olv_limp->inww_amb); - ///////////////////////////////////////////////////// //si hay algún ámbito asignado a una carretera de prohibido circular //se le quita el flag a la carretera @@ -2134,6 +2141,8 @@ BOOL Colv_limp_thr::busca_inw_dmin_ejes(int i_amb) ientamb=olv_limp->carto.getEntity(i_amb); refamb=ientamb.entity()->ref; npts=ientamb.getNumberPtos(); + double* pi = ientamb.getPto(0); + double* pf = ientamb.getPto(npts-1); //////////////////////////////////////////////////////////////////////// //Bucle por cada carretera de la nw //empiezan donde acaban los ámbitos, y terminan en namb+nnw @@ -2143,9 +2152,14 @@ BOOL Colv_limp_thr::busca_inw_dmin_ejes(int i_amb) refenw=ientnw.entity()->ref; if(!(olv_limp->iaso[refenw].flgs & OLV_LIMP_FLG_NW)) continue; //no debería, pero por si acaso - - if(olv_limp->iaso[refenw].oid==olv_limp->iaso[refamb].oid) + double* ei = ientnw.getPto(0); + double* ef = ientnw.getPto(ientnw.getNumberPtos()-1); + if (ei[0] == pi[0] && ef[0] == pf[0]) break; + /* + if(olv_limp->iaso[refenw].oid==olv_limp->iaso[refamb].oid)//todo a elena + break; + */ } if(inw>=olv_limp->n_amb+olv_limp->n_nw || pirate) return FALSE; @@ -3532,13 +3546,13 @@ BOOL Colv_limp_thr::busca_conjs() if((olv_limp->iaso[refent].flgs & OLV_LIMP_FLG_PEAT_SEG) || (olv_limp->iaso[refent].flgs & OLV_LIMP_FLG_EJE_SEG)) continue; - + for(k=0; k<2; k++) { pto = ient.getPto(k*(npts-1)); if((olv_limp->iaso[refent].flgs & OLV_LIMP_FLG_PEAT_REP) || (olv_limp->iaso[refent].flgs & OLV_LIMP_FLG_EJE)) - { + { //en estos casos replica las conjunciones //llega la segunda vez ic=olv_limp->conjs.n; @@ -3883,7 +3897,7 @@ void Colv_limp_thr::calcula_ang_conj_sub(int ithr) //marca las conjunciones que son adyacentes conjs[i]=1; - for(j=i+1;j OLV_PI) + //if(ang> OLV_PI) ang=OLV_PI-ang; return ang; @@ -4148,23 +4162,131 @@ void Colv_limp_thr::revisa_calles_cortadas() // return; for(ic=0;icconjs.n;ic++) { + Coste_modif coste_old; nady=olv_limp->ang_conj[ic].nady; + /*if (nady == 1) + { + i = 0; + j = 0; + } + else + {*/ + for (i = 0; i < nady; i++) + { + j = -1; + k = nady; + //localiza entrada a ic + if (olv_limp->cost_conj[olv_limp->ang_conj[ic].i_conjs[i]][ic] >= MAYUSCULO) + continue; + //localiza al menos una salida + for (j = 0; j < nady; j++) + { + //if (j == i) La salida puede ser tambien i + // continue; + + if (olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]] < MAYUSCULO && + olv_limp->ang_conj[ic].angs[i][j]) + break; + } + //por cada entrada a ic al menos tiene que tener una salida + if (j >= nady) + { + //pone coste extra de i a ic + // coste_old.i = olv_limp->ang_conj[ic].i_conjs[i]; + coste_old.i = olv_limp->ang_conj[ic].i_conjs[i]; + coste_old.j = ic; + coste_old.coste = olv_limp->cost_conj[olv_limp->ang_conj[ic].i_conjs[i]][ic]; + + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(olv_limp->ang_conj[ic].i_conjs[i], ic, coste_old.coste * 10); + + //por la entrada i a ic es cortada, abre salidas + + for (j = 0; j < nady; j++) + { + + if (olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]] < MAYUSCULO) + { + //abre salidas con un coste extra + olv_limp->ang_conj[ic].angs[i][j] = 1; + + coste_old.i = ic; + coste_old.j = olv_limp->ang_conj[ic].i_conjs[j]; + coste_old.coste = olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]]; + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(ic, olv_limp->ang_conj[ic].i_conjs[j], coste_old.coste * 10); + + + } + + } + } + } + //} + /* + if(iang_conj[ic].angs[i][k] = 1; + if (olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[k]] < MAYUSCULO) + { + coste_old.i = ic; + coste_old.j = olv_limp->ang_conj[ic].i_conjs[k]; + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(ic, olv_limp->ang_conj[ic].i_conjs[k], olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[k]] * 10); + } + if(olv_limp->cost_conj[olv_limp->ang_conj[ic].i_conjs[i]][ic] < MAYUSCULO) + { + coste_old.i = olv_limp->ang_conj[ic].i_conjs[i]; + coste_old.j = ic; + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(olv_limp->ang_conj[ic].i_conjs[i], ic, olv_limp->cost_conj[olv_limp->ang_conj[ic].i_conjs[i]][ic] * 10); + } + } + */ + /*else + { + for (i = 0; i < nady; i++) + { + if (!(olv_limp->cost_conj[olv_limp->ang_conj[ic].i_conjs[i]][ic] < MAYUSCULO)) + continue; + for (j = 0; j < nady; j++) + { + if (j == i) + continue; + if (!(olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]] < MAYUSCULO)) + continue; + } + if (j >= nady) + { + //de la conjunción i no se puede ir a otra que no sea ella misma + } + if (!olv_limp->ang_conj[ic].angs[i][j]) + { + //comprueba si se puede ir de i a j o de j a i + if() + } + } for(i=0;iang_conj[ic].angs[i][j]) { //si el ángulo es prohibido, mira a ver si hay más conjunciones for(k=0;kang_conj[ic].i_conjs[k]<0 || olv_limp->ang_conj[ic].i_conjs[k]>=olv_limp->conjs.n) { olvlog(LOG_TODO,"olv_limp_t","Ojo ang_conj fuera de límites ic %ld, k %ld",ic,k); continue; } - /*if(((k!=i) || (k!=j)) && (olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[k]].n>1)) - break;*/ + /* if(((k!=i) || (k!=j)) && (olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[k]].n>1)) + break; / if((olv_limp->ang_conj[ic].i_conjs[k]!=olv_limp->ang_conj[ic].i_conjs[i]) && (olv_limp->ang_conj[ic].i_conjs[k]!=olv_limp->ang_conj[ic].i_conjs[j]) && (olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[k]]=nady)//estos nodos son los únicos que tiene para entrar y salir { olv_limp->ang_conj[ic].angs[i][j]=1; + //coste en calles cortadas + int rnw = -1; + Coste_modif coste_old; + coste_old.i = ic; + if (olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]] < MAYUSCULO) + { + + coste_old.j = j; + coste_old.coste = olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]]; + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(ic, olv_limp->ang_conj[ic].i_conjs[j], olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]] * 10); + } + if (i!=j && olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[i]] < MAYUSCULO) + { + coste_old.j = i; + coste_old.coste = olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[i]]; + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(ic, olv_limp->ang_conj[ic].i_conjs[i], olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[i]] * 10); + if (olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[i]].n == 1) + rnw = olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[i]].refnw0; + } + /*if (rnw != -1) + { + + }* + } + } + } + }*/ + } +} +//************************************************************************************* +/** + * Resvisa los ángulos, de forma que si hay algún giro "prohibido" de 180º, en caso + * de que sean calles cortadas o sin salida, los pone a ok + */ +void Colv_limp_thr::revisa_calles_cortadas_old() +{ + int ic, i, j, k, nady; + //if(olv_limp->res_circ==OLV_RES_NO) + // return; + for (ic = 0; ic < olv_limp->conjs.n; ic++) + { + nady = olv_limp->ang_conj[ic].nady; + + for (i = 0; i < nady; i++) + { + for (j = 0; j < nady; j++) + { + if (j == i) + continue; + if (!olv_limp->ang_conj[ic].angs[i][j]) + { + //si el ángulo es prohibido, mira a ver si hay más conjunciones + for (k = 0; k < nady; k++) + { + if (k == i || k == j) + continue; + if (olv_limp->ang_conj[ic].i_conjs[k] < 0 || olv_limp->ang_conj[ic].i_conjs[k] >= olv_limp->conjs.n) + { + olvlog(LOG_TODO, "olv_limp_t", "Ojo ang_conj fuera de límites ic %ld, k %ld", ic, k); + continue; + } + /*if(((k!=i) || (k!=j)) && (olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[k]].n>1)) + break;*/ + if ((olv_limp->ang_conj[ic].i_conjs[k] != olv_limp->ang_conj[ic].i_conjs[i]) && + (olv_limp->ang_conj[ic].i_conjs[k] != olv_limp->ang_conj[ic].i_conjs[j]) && + (olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[k]] < MAYUSCULO) && + (olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[k]].n > 1)) + break; + } + if (k >= nady)//estos nodos son los únicos que tiene para entrar y salir + { + olv_limp->ang_conj[ic].angs[i][j] = 1; + //coste en calles cortadas + int rnw = -1; + Coste_modif coste_old; + coste_old.i = ic; + if (olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]] < MAYUSCULO) + { + + coste_old.j = j; + coste_old.coste = olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]]; + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(ic, olv_limp->ang_conj[ic].i_conjs[j], olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[j]] * 10); + } + if (i != j && olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[i]] < MAYUSCULO) + { + coste_old.j = i; + coste_old.coste = olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[i]]; + olv_limp->coste_modificado.push_back(coste_old); + olv_limp->cost_conj.set(ic, olv_limp->ang_conj[ic].i_conjs[i], olv_limp->cost_conj[ic][olv_limp->ang_conj[ic].i_conjs[i]] * 10); + if (olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[i]].n == 1) + rnw = olv_limp->conjs.inc[olv_limp->ang_conj[ic].i_conjs[i]].refnw0; + } + /*if (rnw != -1) + { + + }*/ } } } @@ -7906,7 +8127,6 @@ BOOL Colv_limp_thr::planifica_fin() //Si es barrido mixto hay que copiar la info en las que no se ha sectorizado if(olv_limp->barr_mix) copia_info_barr_mix(); - /////////////////////////////////// //prepara los datos para guardarlos if(!genera_rut_ctrl(olv_limp->nsec, olv_limp->plan, FALSE)) @@ -8037,6 +8257,16 @@ BOOL Colv_limp_thr::genera_planif_aux(int is, Info_sec *ss, Info_planif *pp, int is_uno=FALSE; ref_nw=0; ////////////////////////////////////////////////////////////////// + //recompone costes + /*int cmn = olv_limp->coste_modificado.size(); + for (int i = 0; i < olv_limp->coste_modificado.size(); i++) + { + Coste_modif cm = olv_limp->coste_modificado[i]; + olv_limp->cost_conj.set(cm.i, cm.j, cm.coste); + }*/ + + + if(nsecu==1) { @@ -8223,7 +8453,15 @@ BOOL Colv_limp_thr::genera_planif_aux(int is, Info_sec *ss, Info_planif *pp, int } else//es carretera { + //todo_costes_virtuales ref_nw=ref_j; + if (olv_limp->iaso[ref_nw].inf_n.velo != olv_limp->iaso[ref_nw].velReal && olv_limp->iaso[ref_nw].velReal>0) + { + //poner coste real + cost = ltot / olv_limp->iaso[ref_nw].velReal; + } + + tp=OLV_PLAN_TIP_NW; dt=OLV_DESP; } @@ -8527,7 +8765,7 @@ BOOL Colv_limp_thr::genera_rut_aux(Info_planif *pp, int is, BOOL is_insta, int i lin_parc.pts.n=0; ptos=(double (*)[3])ient.getPto(0); ptos_par=NULL; - + //si es carretera y es de doble sentido, //hace la paralela a una distancia dada para que no se superpongan la ida y la vuelta if((pp->elem[i].tp==OLV_PLAN_TIP_NW) && (olv_limp->iaso[pp->elem[i].refe].flgs & OLV_LIMP_FLG_NW) && diff --git a/Olivia/olv_limp_thr.h b/Olivia/olv_limp_thr.h index f303333..f78d798 100644 --- a/Olivia/olv_limp_thr.h +++ b/Olivia/olv_limp_thr.h @@ -197,6 +197,7 @@ public: //Cálculo del coste entre ámbitos void invierte_nodos(int nn, int KK,Secu_amb * ord_sec, BOOL *pirate); + void revisa_calles_cortadas_old(); BOOL calcula_cost_amb(); BOOL inicia_cost_amb(); BOOL calcula_cost_amb_fin(); diff --git a/OliviaTasks/OliviaTasks.rc b/OliviaTasks/OliviaTasks.rc index 00a78d9..1e67b21 100644 --- a/OliviaTasks/OliviaTasks.rc +++ b/OliviaTasks/OliviaTasks.rc @@ -82,8 +82,8 @@ MAINICON ICON "favicon.ico" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,1,7,0 - PRODUCTVERSION 3,1,7,0 + FILEVERSION 4,0,0,0 + PRODUCTVERSION 4,0,0,0 FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -100,12 +100,12 @@ BEGIN BEGIN VALUE "CompanyName", "VSM" VALUE "FileDescription", "Launcher de la aplicación Olivia" - VALUE "FileVersion", "3.1.7.0" + VALUE "FileVersion", "4.0.0.0" VALUE "InternalName", "OliviaTasks" VALUE "LegalCopyright", "OLIVIA (c) VSM 2020. All rights reserved." VALUE "OriginalFilename", "OliviaTasks.exe" VALUE "ProductName", "OliviaTasks" - VALUE "ProductVersion", "3.1.7.0" + VALUE "ProductVersion", "4.0.0.0" END END BLOCK "VarFileInfo" diff --git a/includes/Utiles/CartoBase.h b/includes/Utiles/CartoBase.h index f5311a7..606ef53 100644 --- a/includes/Utiles/CartoBase.h +++ b/includes/Utiles/CartoBase.h @@ -22,6 +22,7 @@ class UTILES_EXPORT CartoBase: public SetEntities, public SetPtsR, public DataIa friend class CartoBaseInfoBuilder; friend class CartoPto; friend class CartoLine; + friend class CartoBaseTopologyManager; private: //info interna------------------------------- int ref;//referencia para el siguiente elemento @@ -56,7 +57,7 @@ public: CartoBaseInfoEntity get(int i);//acceso a entidad iesima (modo lectura) CartoBaseInfoEntity getRef(int r);//acceso a entidad con referencia r (modo lectura) - + bool compruebaPts(); //añade elementos bool add(CartoEntity& element); bool add(CartoBase& cad); @@ -106,6 +107,8 @@ public: virtual bool IaGetVal( int refEnt, int icol, int* v ); virtual bool IaFinW(){return true;} + + private: int add(CartoBaseEntity* src);