Últimos cambios para detectar nodos a distinta elevación

Gerardo/estandarizacion
Elena 2023-02-07 23:50:51 +01:00
parent ad248325eb
commit 0647ffd070
8 changed files with 146 additions and 35 deletions

View File

@ -391,7 +391,7 @@ void COlivia::prueba()
/////////////////// ///////////////////
//solo para debug elena olivia //solo para debug elena olivia
i=1; i=2;
if(fin) if(fin)
{ {
@ -423,6 +423,19 @@ void COlivia::prueba()
"/path_data:D:\\Proyectos\\Olivia\\Instal3.0\\data_prueba_2\\data_T00_A0405_20230111_233224.shp "\ "/path_data:D:\\Proyectos\\Olivia\\Instal3.0\\data_prueba_2\\data_T00_A0405_20230111_233224.shp "\
"/path_nw:D:\\Proyectos\\Olivia\\Instal3.0\\data_prueba_2\\nw_20230111_233224.shp "); "/path_nw:D:\\Proyectos\\Olivia\\Instal3.0\\data_prueba_2\\nw_20230111_233224.shp ");
break; break;
case 2:
sprintf_s(config, max_char_cap, "/CONFIG_PLANIF /campo_capaci:CAPACIDAD /kg_max:7500 /campo_kgrecog:KGRECO /campo_uds:UNIDADES /recogida_kg:200 /carga_cont:0 "\
"/densidad:-1 /t_conv:480 /t_descan:30 /t_vacia:90 /t_descarg:40 /t_sallleg:25 /h_inicio:420 /trafico:80 "\
"/n_ptsctrl:3 /n_secdef:3 /anch_vehi:0 /giro_vehi:175 /coor_inst_x:544038,5064 /coor_inst_y:4624375,9191 "\
"/coor_desc_x:543887,2812 /coor_desc_y:4623093,8184 "\
"/sens_id:0 /sens_url:0 /sens_fechai:0 /sens_fechaf:0 /md_pet:0 /aislados:1 /lateralidad:0 "\
"/cons_onew:ONEWAY /cons_kph:KPH /cons_fow:FOW /cons_name:NAME "\
"/atr_TF:TF /atr_FT:FT /atr_N:N /atr_pedes:14 /str_tto:Resto "\
"/Camp_sector:SECTOR /Camp_secuencia:SECUENCIA /Camp_objectid:FID "\
"/Giro_max_vehiculo:175 /Desv_max_rel:0.15 /Desv_max_abs:1000 "\
"/path_data:D:\\Proyectos\\Olivia\\Instal3.0\\data_prueba_put_1\\data_F01_C01_20230207_112246.shp "\
"/path_nw:D:\\Proyectos\\Olivia\\Instal3.0\\data_prueba_put_1\\nw_20230207_112246.shp ");
break;
case 3://nw de arcmap case 3://nw de arcmap
sprintf_s(config, max_char_cap, "/CONFIG /t_tto:2900 /restr_cir:0 /u_tto:3 /v_despl:5 /t_conv:480 /t_descan:30 /t_despl:25 /t_carg:40 "\ sprintf_s(config, max_char_cap, "/CONFIG /t_tto:2900 /restr_cir:0 /u_tto:3 /v_despl:5 /t_conv:480 /t_descan:30 /t_despl:25 /t_carg:40 "\
"/h_inicio:450 /trafico:80 /n_ptsctrl:3 /n_secdef:3 /anch_med:2 /coor_inst_x:0 /coor_inst_y:0 /aislados:1 /cons_obser:OBSERVACIONES "\ "/h_inicio:450 /trafico:80 /n_ptsctrl:3 /n_secdef:3 /anch_med:2 /coor_inst_x:0 /coor_inst_y:0 /aislados:1 /cons_obser:OBSERVACIONES "\
@ -431,7 +444,7 @@ void COlivia::prueba()
"/atr_TF:TF /atr_FT:FT /atr_N:N /atr_pedes:14 /str_tto:Barrido_man "\ "/atr_TF:TF /atr_FT:FT /atr_N:N /atr_pedes:14 /str_tto:Barrido_man "\
"/path_data:D:\\Proyectos\\Olivia\\Instal2.0\\data\\data_T00_A04050607_NNivel7_20220327_155737.shp /path_nw:D:\\Proyectos\\Olivia\\Instal2.0\\data\\nw_20220327_170516.shp "); "/path_data:D:\\Proyectos\\Olivia\\Instal2.0\\data\\data_T00_A04050607_NNivel7_20220327_155737.shp /path_nw:D:\\Proyectos\\Olivia\\Instal2.0\\data\\nw_20220327_170516.shp ");
break; break;
case 2://orig arcmap case 5://orig arcmap
sprintf_s(config, max_char_cap, "/CONFIG /t_tto:2900 /restr_cir:0 /u_tto:3 /v_despl:5 /t_conv:480 /t_descan:30 /t_despl:25 /t_carg:40 "\ sprintf_s(config, max_char_cap, "/CONFIG /t_tto:2900 /restr_cir:0 /u_tto:3 /v_despl:5 /t_conv:480 /t_descan:30 /t_despl:25 /t_carg:40 "\
"/h_inicio:420 /trafico:80 /n_ptsctrl:3 /n_secdef:3 /anch_med:2 /coor_inst_x:0 /coor_inst_y:0 /aislados:0 /cons_obser:OBSERVACIONES "\ "/h_inicio:420 /trafico:80 /n_ptsctrl:3 /n_secdef:3 /anch_med:2 /coor_inst_x:0 /coor_inst_y:0 /aislados:0 /cons_obser:OBSERVACIONES "\
"/cons_anch_tip:ANCHO_TIPO /cons_tipolo:TIPOLOGIA /cons_tip_ent:NOM_TIPO_ENTIDAD /atr_aparc:Banda Aparcamiento /atr_bord:Bordillo Libre "\ "/cons_anch_tip:ANCHO_TIPO /cons_tipolo:TIPOLOGIA /cons_tip_ent:NOM_TIPO_ENTIDAD /atr_aparc:Banda Aparcamiento /atr_bord:Bordillo Libre "\

View File

@ -89,7 +89,7 @@ public:
std::map<int,Info_aso2> iaso; ///<Map con mismos elementos que entidades la carto, con la información asociada 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<Info_tramos> *tramos;
std::map<int, Info_aso_nw_elev> iaso_elev; ///<Map con mismos elementos que la nw, con la info de elevación de los nodos std::vector<Info_aso_nw_elev> iaso_elev; ///<Map con mismos elementos que la nw, con la info de elevación de los nodos
//************************************************************************************* //*************************************************************************************
//Funciones //Funciones

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <float.h> #include <float.h>
#include <vector> #include <vector>
#include <map>
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////// //////////////////////////////////////////////////
@ -579,4 +580,29 @@ typedef struct Info_aso_conj_elev_aux
typedef struct Info_aso_conj_elev typedef struct Info_aso_conj_elev
{ {
std::vector<Info_aso_conj_elev_aux> conj_nw[N_ELEV]; //dos maps con las entidades de la nw que están a nivel 0 y a nivel 1 en la misma conjunción std::vector<Info_aso_conj_elev_aux> conj_nw[N_ELEV]; //dos maps con las entidades de la nw que están a nivel 0 y a nivel 1 en la misma conjunción
char key_coord[64]; //indica la key de la coordenada
}Info_aso_conj_elev; }Info_aso_conj_elev;
/*
* Estructura para almacenar los id de los nodos a los que llegan ent de la nw con distinta elevación de cada subthread
*/
typedef struct th_param_dist_elev_thr
{
std::vector<Info_aso_conj_elev> conj_elev_i; //la clave son las coordenadas x-y en formato texto
}th_param_dist_elev_thr;
/**
* Parametros de los thead que buscan nodos a dist elev
*/
typedef struct th_param_dist_elev
{
BOOL pirate;//indica a los thread que hay que irse
BOOL abs;
int id_curro;//id de curro
int modo;//indica el modo de curro
long nth;//numero de thread currando
long nth_tot;
int id_th;//indica al thread el id que tiene
int n_nw;
int milis_sleep;
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

@ -24,6 +24,7 @@
#include <map> #include <map>
UINT th_planificacion(LPVOID pp); UINT th_planificacion(LPVOID pp);
UINT th_busca_elev_dist(LPVOID pp);
/** /**
* @file olv_limp_thr.cpp * @file olv_limp_thr.cpp
* Archivo de implementaciones del thread de control de la utilidad de limpieza viaria del programa Olivia. * Archivo de implementaciones del thread de control de la utilidad de limpieza viaria del programa Olivia.
@ -1239,22 +1240,23 @@ void Colv_limp_thr::rellena_elev_nw()
n = 0; n = 0;
CartoBaseInfoEntity ient; CartoBaseInfoEntity ient;
int npts; int npts;
Info_aso_nw_elev info;
while (idd == 1) while (idd == 1)
{ {
//inicia //inicia
olv_limp->iaso_elev[n].inod_check[FROM] = olv_limp->iaso_elev[n].inod_check[TO] = false; info.inod_check[FROM] = info.inod_check[TO] = false;
olv_limp->iaso_elev[n].i_nw = n; info.i_nw = n;
//conj //conj
olv_limp->iaso_elev[n].inod[TO] = -1; info.inod[TO] = -1;
olv_limp->iaso_elev[n].inod[FROM] = -1; info.inod[FROM] = -1;
ient = olv_limp->carto.getEntity(n + olv_limp->n_amb); ient = olv_limp->carto.getEntity(n + olv_limp->n_amb);
npts = ient.getNumberPtos(); npts = ient.getNumberPtos();
memcpy(olv_limp->iaso_elev[n].coord[FROM], ient.getPto(0), 3 * sizeof(double)); memcpy(info.coord[FROM], ient.getPto(0), 3 * sizeof(double));
memcpy(olv_limp->iaso_elev[n].coord[TO], ient.getPto(npts - 1), 3 * sizeof(double)); memcpy(info.coord[TO], ient.getPto(npts - 1), 3 * sizeof(double));
//elev //elev
olv_limp->iaso_elev[n].elev[TO] = dbf.getI(ic_elev_to); info.elev[TO] = dbf.getI(ic_elev_to);
olv_limp->iaso_elev[n].elev[FROM] = dbf.getI(ic_elev_from); info.elev[FROM] = dbf.getI(ic_elev_from);
olv_limp->iaso_elev.push_back(info);
n++; n++;
idd = dbf.leeNexRow(); idd = dbf.leeNexRow();
@ -1294,30 +1296,98 @@ BOOL Colv_limp_thr::revisa_elev_nw()
std::vector<Info_aso_conj_elev> Colv_limp_thr::busca_elev_nw() std::vector<Info_aso_conj_elev> Colv_limp_thr::busca_elev_nw()
{ {
std::vector<Info_aso_conj_elev> conj_elev; std::vector<Info_aso_conj_elev> conj_elev;
int nthr = n_subthr;
th_param_dist_elev thp;
memset(&thp, 0, sizeof(thp));
thp.milis_sleep = 1;
thp.abs = TRUE;
thp.nth_tot = nthr;
thp.n_nw = olv_limp->n_nw;
thp.conj_th = (th_param_dist_elev_thr*)malloc(sizeof(th_param_dist_elev_thr) * nthr);
memset(thp.conj_th, 0, sizeof(th_param_dist_elev_thr) * nthr);
thp.iaso_elev = olv_limp->iaso_elev;
olvlog(LOG_TODO, "olv_limp_t", "Buscando nodos con elevaciones distintas");
for (int i = 0; i < nthr; i++)
{
thp.id_th = i;
lck_sum_atm(&thp.nth, 1);
AfxBeginThread(th_busca_elev_dist, (LPVOID)&thp, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
while (thp.id_th >= 0)
Sleep(1);
}
while (thp.nth > 0)
Sleep(10);
////////////////////////////////////////////////
//reune toda la información
//recorre el array de todos los threads, buscando repetidos
std::vector<Info_aso_conj_elev>::iterator it2;
int i1;
bool ya_esta = false;
for (int i = 0; i < nthr; i++)
{
for(i1=0;i1< thp.conj_th[i].conj_elev_i.size();i1++)
{
ya_esta = false;
//busca que no esté esta coordenada ya en el array
it2 = conj_elev.begin();
while (it2 != conj_elev.end() && !ya_esta)
{
if (strcmp(thp.conj_th[i].conj_elev_i[i1].key_coord, it2->key_coord) == 0)
ya_esta = true;
it2++;
}
if (!ya_esta)
{
//la almacena en el vector
conj_elev.push_back(thp.conj_th[i].conj_elev_i[i1]);
}
}
}
if (thp.conj_th)
{
free(thp.conj_th);
}
return conj_elev;
}
//*************************************************************************************
/**
* Thread para cálculo multiproceso de búsqueda de nodos a distinta elevación
*/
UINT th_busca_elev_dist(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 conj_elev_i1;
Info_aso_conj_elev_aux conj_elev_nw_i1, conj_elev_nw_i2; Info_aso_conj_elev_aux conj_elev_nw_i1, conj_elev_nw_i2;
std::map<int, Info_aso_nw_elev>::iterator it1; int i1, i2,elev1,elev2,it2;
std::map<int, Info_aso_nw_elev>::iterator it2;
int i1, i2,elev1,elev2;
Info_aso_nw_elev* info1, * info2; Info_aso_nw_elev* info1, * info2;
std::vector<Info_aso_conj_elev> conj_elev_i;
it1 = olv_limp->iaso_elev.begin(); int n_desp = (int)ceil(1.0 * p->n_nw / p->nth_tot);
while (it1 != olv_limp->iaso_elev.end()) int n_ini = min(ithr * n_desp, p->n_nw);
int n_fin = min((ithr + 1) * n_desp, p->n_nw);
//avisa de que ya empieza
p->id_th = -1;
for (int in = n_ini; in < n_fin && !p->pirate; in++)
{ {
info1 = &it1->second; info1 = &((p->iaso_elev)[in]);
for (i1 = 0; i1 < N_NODOS; i1++) for (i1 = 0; i1 < N_NODOS; i1++)
{ {
if (info1->inod_check[i1]) //si ya se ha comprobado, pasa if (info1->inod_check[i1]) //si ya se ha comprobado, pasa
continue; continue;
conj_elev_i1.conj_nw[MISMA_ELEV].clear(); conj_elev_i1.conj_nw[MISMA_ELEV].clear();
conj_elev_i1.conj_nw[DIST_ELEV].clear(); conj_elev_i1.conj_nw[DIST_ELEV].clear();
it2 = olv_limp->iaso_elev.begin(); for (it2 = 0; it2 < p->n_nw && !p->pirate; it2++)
while (it2 != olv_limp->iaso_elev.end())
{ {
info2 = &it2->second; info2 = &((p->iaso_elev)[it2]);
if (info2->i_nw == info1->i_nw) if (info2->i_nw == info1->i_nw)
{ {
it2++;
continue;//mismo elemento continue;//mismo elemento
} }
for (i2 = 0; i2 < N_NODOS; i2++) for (i2 = 0; i2 < N_NODOS; i2++)
@ -1339,10 +1409,10 @@ std::vector<Info_aso_conj_elev> Colv_limp_thr::busca_elev_nw()
//misma elev //misma elev
conj_elev_i1.conj_nw[MISMA_ELEV].push_back(conj_elev_nw_i2); conj_elev_i1.conj_nw[MISMA_ELEV].push_back(conj_elev_nw_i2);
} }
info2->inod_check[i2] = true;
} }
} }
/////////////////////////////////////// ///////////////////////////////////////
it2++;
} }
info1->inod_check[i1] = true; info1->inod_check[i1] = true;
//solo los almacena si tiene alguno en dist elev, si todos son la misma, no //solo los almacena si tiene alguno en dist elev, si todos son la misma, no
@ -1351,14 +1421,16 @@ std::vector<Info_aso_conj_elev> Colv_limp_thr::busca_elev_nw()
//se añade a sí mismo //se añade a sí mismo
conj_elev_nw_i1.set(info1->i_nw, i1); conj_elev_nw_i1.set(info1->i_nw, i1);
conj_elev_i1.conj_nw[MISMA_ELEV].push_back(conj_elev_nw_i1); conj_elev_i1.conj_nw[MISMA_ELEV].push_back(conj_elev_nw_i1);
conj_elev.push_back(conj_elev_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);
} }
} }
it1++;
} }
p->conj_th[ithr].conj_elev_i = conj_elev_i;
//salida de thread-------------------------
lck_sum_atm(&p->nth, -1);
return conj_elev; return 0;
} }
//************************************************************************************* //*************************************************************************************
#define MUEVE_COOR_METROS 5 #define MUEVE_COOR_METROS 5
@ -1967,7 +2039,7 @@ BOOL Colv_limp_thr::busca_inw_dmin(int i_amb)
prime_ptos = prime_ptos_f; prime_ptos = prime_ptos_f;
//necesita una función que dé la distancia media de prime_ptos a ientnw //necesita una función que dé la distancia media de prime_ptos a ientnw
daux=prime_ptos.disMedLines(&ientnw,&desv); //coge la dis media para quedarse con la min daux=prime_ptos.disMedLines(&ientnw,&desv, olv_limp->revisa_elev); //coge la dis media para quedarse con la min
ientnw.DisPtoLine(prime_ptos.getPto(0),&ip, &lamb, olv_limp->revisa_elev); //coge el punto donde se da la min ientnw.DisPtoLine(prime_ptos.getPto(0),&ip, &lamb, olv_limp->revisa_elev); //coge el punto donde se da la min
} }
else if(KK==OLV_AMB_PUN) else if(KK==OLV_AMB_PUN)

View File

@ -14,7 +14,7 @@
<LocalDebuggerWorkingDirectory>..\bin\$(IntDir)</LocalDebuggerWorkingDirectory> <LocalDebuggerWorkingDirectory>..\bin\$(IntDir)</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommand>C:\Desa\v2017\Olivia\bin\$(IntDir)$(TargetFileName)</LocalDebuggerCommand> <LocalDebuggerCommand>C:\Desa\v2017\Olivia\bin\$(IntDir)$(TargetFileName)</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>/tipo:0 /ip:192.168.2.61 /port:19995 /tout:20 /path_temp:D:\Proyectos\Olivia\Instal3.0\temp\ /path_cfgeo: /debug</LocalDebuggerCommandArguments> <LocalDebuggerCommandArguments>/tipo:1 /ip:192.168.2.61 /port:19995 /tout:20 /path_temp:D:\Proyectos\Olivia\Instal3.0\temp\ /path_cfgeo: /debug</LocalDebuggerCommandArguments>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LocalDebuggerWorkingDirectory>..\bin\$(IntDir)</LocalDebuggerWorkingDirectory> <LocalDebuggerWorkingDirectory>..\bin\$(IntDir)</LocalDebuggerWorkingDirectory>

View File

@ -111,7 +111,7 @@ public:
void* getIa(); void* getIa();
double getLong(); double getLong();
double disMedLines(SetPtsR *line2, double l_avan, double *desv=NULL); double disMedLines(SetPtsR *line2, double l_avan, double *desv=NULL);
double disMedLines(SetPtsR *line2, double *desv=NULL); double disMedLines(SetPtsR *line2, double *desv=NULL, BOOL usa_z = FALSE);
double DisPtoLine(double*p, int* idpto=NULL, double *lamb=NULL, BOOL usa_z=FALSE); double DisPtoLine(double*p, int* idpto=NULL, double *lamb=NULL, BOOL usa_z=FALSE);
SetPtsW *GetNPrimePtos(SetPtsW *ldst, int nptos, double dis, BOOL avanza); SetPtsW *GetNPrimePtos(SetPtsW *ldst, int nptos, double dis, BOOL avanza);
bool DivLine(SetPtsW* ldst1, SetPtsW* ldst2, int ip, double lamb); bool DivLine(SetPtsW* ldst1, SetPtsW* ldst2, int ip, double lamb);

View File

@ -31,7 +31,7 @@ public:
virtual double* getPto(int i){return 0;} virtual double* getPto(int i){return 0;}
virtual int getNumberPtos(){return 0;} virtual int getNumberPtos(){return 0;}
virtual double disMedLines(SetPtsR *line2, double *desv=NULL); virtual double disMedLines(SetPtsR *line2, double *desv=NULL, BOOL usa_z =FALSE);
}; };

View File

@ -34,7 +34,7 @@ public:
//distancia de un punto a una linea //distancia de un punto a una linea
static double DisPtoLine(SetPtsR* line, double*p, int* idpto=NULL, double *lamb=NULL, BOOL usa_z = FALSE); static double DisPtoLine(SetPtsR* line, double*p, int* idpto=NULL, double *lamb=NULL, BOOL usa_z = FALSE);
//distancia media entre dos líneas //distancia media entre dos líneas
static double DisMedLines( SetPtsR* line1, SetPtsR* line2, double *desv=NULL); static double DisMedLines( SetPtsR* line1, SetPtsR* line2, double *desv=NULL, BOOL usa_z =FALSE);
static double DisMedLines( SetPtsR* line1, SetPtsR* line2, double l_avan, double *desv=NULL); static double DisMedLines( SetPtsR* line1, SetPtsR* line2, double l_avan, double *desv=NULL);
//parte una linea en 2 //parte una linea en 2
static bool DivLine(SetPtsR* linesrc, SetPtsW* ldst1, SetPtsW* ldst2, double dis); static bool DivLine(SetPtsR* linesrc, SetPtsW* ldst1, SetPtsW* ldst2, double dis);