retoques version 4.0.0.0

Gerardo/ModosViaje
Gerardo 2024-04-12 22:33:57 +02:00
parent 431578ba46
commit 028928896e
7 changed files with 279 additions and 26 deletions

View File

@ -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"

View File

@ -94,7 +94,7 @@ public:
CartoBase cartoAux;
std::map<int,Info_aso2> iaso; ///<Map con mismos elementos que entidades la carto, con la información asociada
std::vector<Info_tramos> *tramos;
std::vector <Coste_modif> coste_modificado;
std::vector<Info_aso_nw_elev> iaso_elev; ///<Map con mismos elementos que la nw, con la info de elevación de los nodos
double mima[N_COOR_MIMA]; ///<Coordenadas de las cuatro esquinas de la red
//*************************************************************************************

View File

@ -236,6 +236,17 @@ typedef struct Info_aso_nw
double velo; //velocidad de la vía, en km/h
char *nomb; //nombre de la vía
}Info_aso_nw;
/**
* Nueva Estructura que contiene la información asociada de la nw
*/
typedef struct Coste_modif
{
float coste;
int i;
int j;
}Coste_modif;
/**
* Nueva Estructura que contiene la información asociada de las entidades de limpieza (aceras, bordillos, peatonales...)
*/

View File

@ -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;
@ -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;
@ -4067,7 +4081,7 @@ double Colv_limp_thr::dame_ang_conj(int ic, int i, int j)
}
ang=Colv_geom::ang_vect(v[0],v[1]);
if(ang> OLV_PI)
//if(ang> OLV_PI)
ang=OLV_PI-ang;
return ang;
@ -4148,16 +4162,198 @@ void Colv_limp_thr::revisa_calles_cortadas()
// return;
for(ic=0;ic<olv_limp->conjs.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(i<nady && k<nady)
{
//solo tiene una calle por donde volver
olv_limp->ang_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;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)
{
}*
}
}
}
}*/
}
}
//*************************************************************************************
/**
* 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);
@ -4174,6 +4370,31 @@ void Colv_limp_thr::revisa_calles_cortadas()
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;
}

View File

@ -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();

View File

@ -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"

View File

@ -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);