Recibe mima nw, th preparado pero no se usa todavía

Gerardo/estandarizacion
Elena 2023-02-17 01:21:11 +01:00
parent 85878bf4ce
commit f01b8b3412
5 changed files with 148 additions and 7 deletions

View File

@ -62,6 +62,7 @@ Colv_limp::Colv_limp(COlivia *olv)
barr_mix=FALSE;
usa_secuen = FALSE;
revisa_elev = TRUE;
memset(mima, 0, N_COOR_MIMA * sizeof(double));
}
//*******************************************************************************************************************************************
Colv_limp::~Colv_limp(void)
@ -472,6 +473,7 @@ int Colv_limp::pon_config(char *config_)
if(!olv->dame_param(token, camps.atr_circ[OLV_ATR_CIRC_PEDES], sizeof(camps.atr_circ[OLV_ATR_CIRC_PEDES])))
break;
}
//anchos de bordillos
else if (strstr(token, OliviaDef::GeneralDef::GTO_anch_peat))
{
if (!olv->dame_param(token, &anchos_def[OLV_ANCH_DEF_PEAT]))
@ -497,6 +499,7 @@ int Colv_limp::pon_config(char *config_)
if (!olv->dame_param(token, &anchos_def[OLV_ANCH_DEF_BORD]))
break;
}
//giros y desv
else if (strstr(token, OliviaDef::GeneralDef::GTO_girmax))
{
double ang;
@ -521,6 +524,7 @@ int Colv_limp::pon_config(char *config_)
if (strlen(camps.campo_oid) > OLV_MAX_COL_SHP)//10 porque el shp solo pasa con 10 caracteres en los nombres de columna
camps.campo_oid[OLV_MAX_COL_SHP] = 0;
}
//campos sect y secuen
else if (strstr(token, OliviaDef::GeneralDef::GTO_camp_sector))
{
if (!olv->dame_param(token, camps.campo_secto, sizeof(camps.campo_secto)))
@ -535,6 +539,26 @@ int Colv_limp::pon_config(char *config_)
if (strlen(camps.campo_secuen) > OLV_MAX_COL_SHP)//10 porque el shp solo pasa con 10 caracteres en los nombres de columna
camps.campo_secuen[OLV_MAX_COL_SHP] = 0;
}
else if (strstr(token, OliviaDef::GeneralDef::GTO_mima_xmin))
{
if (!olv->dame_param(token, &mima[XMIN]))
break;
}
else if (strstr(token, OliviaDef::GeneralDef::GTO_mima_xmax))
{
if (!olv->dame_param(token, &mima[XMAX]))
break;
}
else if (strstr(token, OliviaDef::GeneralDef::GTO_mima_ymin))
{
if (!olv->dame_param(token, &mima[YMIN]))
break;
}
else if (strstr(token, OliviaDef::GeneralDef::GTO_mima_ymax))
{
if (!olv->dame_param(token, &mima[YMAX]))
break;
}
else
{
token = strtok(NULL, OliviaDef::GeneralDef::EjecGeoParamSep);

View File

@ -90,7 +90,7 @@ public:
std::vector<Info_tramos> *tramos;
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
//*************************************************************************************
//Funciones
Colv_limp(COlivia *olv);

View File

@ -535,7 +535,6 @@ typedef struct th_param_planif
/*
* Para revisar la elevación de las carreteras y borrar uniones que no debería haber por estar a distinta elevación
*/
#define INFO_ASO_NW_NO_ELEV 0
enum INFO_ASO_NW_NODOS
{
FROM = 0,
@ -562,6 +561,17 @@ enum INFO_ASO_NW_ELEV
N_ELEV = 2
};
/*
* Para revisar coordenadas min y max
*/
enum COORDENADAS_MIMA
{
XMIN = 0,
XMAX = 1,
YMIN = 2,
YMAX = 3,
N_COOR_MIMA
};
/*
* Estructura para almacenar nodos que están a distinta elevación
*/
typedef struct Info_aso_conj_elev_aux
@ -603,6 +613,7 @@ typedef struct th_param_dist_elev
int id_th;//indica al thread el id que tiene
int n_nw;
int milis_sleep;
double coor_mima[N_COOR_MIMA];
th_param_dist_elev_thr *conj_th;
std::vector<Info_aso_nw_elev> iaso_elev; ///<Map con mismos elementos que la nw, con la info de elevación de los nodos, cada thr su copia
}th_param_dist_elev;

View File

@ -25,6 +25,7 @@
UINT th_planificacion(LPVOID pp);
UINT th_busca_elev_dist(LPVOID pp);
BOOL is_pto_dentro(double* pto, double* pto_mima);
/**
* @file olv_limp_thr.cpp
* Archivo de implementaciones del thread de control de la utilidad de limpieza viaria del programa Olivia.
@ -1433,6 +1434,104 @@ UINT th_busca_elev_dist(LPVOID pp)
return 0;
}
//*************************************************************************************
/**
* Thread para cálculo multiproceso de búsqueda de nodos a distinta elevación
*/
UINT th_busca_elev_dist_coor(LPVOID pp)
{
th_param_dist_elev* p = (th_param_dist_elev*)pp;
int ithr = p->id_th;
Info_aso_conj_elev conj_elev_i1;
Info_aso_conj_elev_aux conj_elev_nw_i1, conj_elev_nw_i2;
int i1, i2, elev1, elev2, it2;
Info_aso_nw_elev* info1, * info2;
std::vector<Info_aso_conj_elev> conj_elev_i;
double xdesp = (p->coor_mima[XMAX]-p->coor_mima[XMIN]) / p->nth_tot;
double xmin = min(p->coor_mima[XMIN] + ithr * xdesp, p->coor_mima[XMAX]);
double xmax = min(xmin + xdesp, p->coor_mima[XMAX]);
double pto_mima[N_COOR_MIMA];
pto_mima[XMIN] = xmin;
pto_mima[XMAX] = xmax;
pto_mima[YMIN] = p->coor_mima[YMIN];
pto_mima[YMAX] = p->coor_mima[YMAX];
//avisa de que ya empieza
p->id_th = -1;
for (int in = 0; in < p->n_nw && !p->pirate; in++)
{
info1 = &((p->iaso_elev)[in]);
for (i1 = 0; i1 < N_NODOS; i1++)
{
if (!is_pto_dentro(info1->coord[i1], pto_mima))
continue;
conj_elev_i1.conj_nw[MISMA_ELEV].clear();
conj_elev_i1.conj_nw[DIST_ELEV].clear();
for (it2 = 0; it2 < p->n_nw && !p->pirate; it2++)
{
info2 = &((p->iaso_elev)[it2]);
if (info2->i_nw == info1->i_nw)
{
continue;//mismo elemento
}
for (i2 = 0; i2 < N_NODOS; i2++)
{
if (!is_pto_dentro(info2->coord[i2], pto_mima))
continue;
if ((Colv_geom::pto_equals(info1->coord[i1], info2->coord[i2]))) //if (info1->inod[i1] == info2->inod[i2])
{
//comparten nodo, revisa elevación
conj_elev_nw_i2.set(info2->i_nw, i2);
if (info1->elev[i1] != info2->elev[i2])
{
//distinta elevación
//añade i2
conj_elev_i1.conj_nw[DIST_ELEV].push_back(conj_elev_nw_i2);
}
else
{
//misma elev
conj_elev_i1.conj_nw[MISMA_ELEV].push_back(conj_elev_nw_i2);
}
}
}
///////////////////////////////////////
}
//solo los almacena si tiene alguno en dist elev, si todos son la misma, no
if (conj_elev_i1.conj_nw[DIST_ELEV].size() > 0)
{
//se añade a sí mismo
conj_elev_nw_i1.set(info1->i_nw, i1);
conj_elev_i1.conj_nw[MISMA_ELEV].push_back(conj_elev_nw_i1);
sprintf_s(conj_elev_i1.key_coord, 64, "%lf-%lf", info1->coord[i1][0], info1->coord[i1][1]);
conj_elev_i.push_back(conj_elev_i1);
}
}
}
p->conj_th[ithr].conj_elev_i = conj_elev_i;
//salida de thread-------------------------
lck_sum_atm(&p->nth, -1);
return 0;
}
//*************************************************************************************
/*
* Comprueba si pto está dentro de mima
*/
BOOL is_pto_dentro(double* pto, double* pto_mima)
{
//comprueba x
if (pto[0] >= pto_mima[XMIN] && pto[0] < pto_mima[XMAX])
{
//coprueba y
if (pto[1] >= pto_mima[YMIN] && pto[1] <= pto_mima[YMAX])
return TRUE;
}
return FALSE;
}
//*************************************************************************************
#define MUEVE_COOR_METROS 5
/**
* Mueve las coordenadas de una conjunción de las que tienen distinta elevación
@ -9758,10 +9857,12 @@ BOOL Colv_limp_thr::genera_list_rut_ctrl()
//apunta a otro ámbito de la red, busca carretera
int ref_nw = pp->elem[i].ref_nw;
BOOL sdire=false;
while ((ref_nw>0) && (olv_limp->iaso[ref_nw].flgs & OLV_LIMP_FLG_AMB))
int nveces = 0;
while ((ref_nw>0) && (olv_limp->iaso[ref_nw].flgs & OLV_LIMP_FLG_AMB) && (nveces<5))
{
ref_nw= olv_limp->inww_amb[ref_nw + !sdire * olv_limp->n_amb].refnw;
sdire = !sdire && (olv_limp->tipo_ambit== OLV_AMB_LIN);
nveces++;
}
if((olv_limp->iaso[ref_nw].flgs & OLV_LIMP_FLG_NW) && olv_limp->iaso[ref_nw].inf_n.nomb)
strcpy_s(calle, 1024, olv_limp->iaso[ref_nw].inf_n.nomb);

View File

@ -51,8 +51,8 @@ namespace OliviaDef
public const int ProgrMax = 100;
public const int ProgrStep = 5;
public const int ParamN = 5;
public const int ParamLimpN = 48;
public const int ParamRecoN = 46;
public const int ParamLimpN = 52;
public const int ParamRecoN = 50;
/*
* Define el separador entre parámetros de la llamada al proceso oliviatasks
*/
@ -533,6 +533,11 @@ namespace OliviaDef
public const string GTO_camp_objectid = "Camp_objectid";
public const string GTO_camp_sector = "Camp_sector";
public const string GTO_camp_secuencia = "Camp_secuencia";
//mima
public const string GTO_mima_xmin = "Coor_mima_xmin";
public const string GTO_mima_xmax = "Coor_mima_xmax";
public const string GTO_mima_ymin = "Coor_mima_ymin";
public const string GTO_mima_ymax = "Coor_mima_ymax";
/**
* Define el nombre para mandar a oliviatasks la configuración