Creaccion de manager topologia
parent
fde9722153
commit
704edec152
|
|
@ -682,7 +682,25 @@ void CartoBase::setNameIa( char *name )
|
||||||
strcpy(iaName, name);
|
strcpy(iaName, name);
|
||||||
}
|
}
|
||||||
//*****************************************************************************************
|
//*****************************************************************************************
|
||||||
|
/*bool CartoBase::DivideLineVirtual(CartoBaseEntity* entity, int ipun)
|
||||||
|
{
|
||||||
|
if (entity->type != CartoBaseTypes::Line)
|
||||||
|
return false;
|
||||||
|
CartoBaseLine *lin = _lines.get(entity->id);
|
||||||
|
CartoBaseLine nlin;
|
||||||
|
CartoBaseEntity nent;
|
||||||
|
|
||||||
|
nent = *entity;
|
||||||
|
nlin.ini = lin->ini + ipun;
|
||||||
|
nlin.n = lin->n - ipun;
|
||||||
|
lin->n = ipun + 1;
|
||||||
|
nent.id = add(&nlin);
|
||||||
|
|
||||||
|
if (nent.id < 0)
|
||||||
|
return false;
|
||||||
|
return (add(&nent) >= 0);
|
||||||
|
}*/
|
||||||
|
//*****************************************************************************************
|
||||||
CartoBaseInfoEntity FiterCartoBase::getEntity( int i )
|
CartoBaseInfoEntity FiterCartoBase::getEntity( int i )
|
||||||
{
|
{
|
||||||
return cb->get(ind[i]);
|
return cb->get(ind[i]);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ class UTILES_EXPORT CartoBase: public SetEntities, public SetPtsR, public DataIa
|
||||||
friend class CartoBaseInfoBuilder;
|
friend class CartoBaseInfoBuilder;
|
||||||
friend class CartoPto;
|
friend class CartoPto;
|
||||||
friend class CartoLine;
|
friend class CartoLine;
|
||||||
|
friend class CartoBaseTopologyManager;
|
||||||
private:
|
private:
|
||||||
//info interna-------------------------------
|
//info interna-------------------------------
|
||||||
int ref;//referencia para el siguiente elemento
|
int ref;//referencia para el siguiente elemento
|
||||||
|
|
@ -106,6 +107,8 @@ public:
|
||||||
virtual bool IaGetVal( int refEnt, int icol, int* v );
|
virtual bool IaGetVal( int refEnt, int icol, int* v );
|
||||||
virtual bool IaFinW(){return true;}
|
virtual bool IaFinW(){return true;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int add(CartoBaseEntity* src);
|
int add(CartoBaseEntity* src);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,198 @@
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include "CartoBaseTopologyManager.h"
|
||||||
|
#include <GeometryFunction.h>
|
||||||
|
|
||||||
|
CartoBaseTopologyManager::CartoBaseTopologyManager(void)
|
||||||
|
{
|
||||||
|
tolerancia = 0.01;
|
||||||
|
ncorrecciones = 0;
|
||||||
|
terminado = true;
|
||||||
|
nthread = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CartoBaseTopologyManager::~CartoBaseTopologyManager(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CartoBaseTopologyManager::DivideLineVirtual(int ie, int ipun)
|
||||||
|
{
|
||||||
|
CartoBaseEntity* entity = cad->_entities.get(ie);
|
||||||
|
if (entity->type != CartoBaseTypes::Line)
|
||||||
|
return false;
|
||||||
|
CartoBaseLine* lin = cad->_lines.get(entity->id);
|
||||||
|
CartoBaseLine nlin;
|
||||||
|
CartoBaseEntity nent;
|
||||||
|
|
||||||
|
nent = *entity;
|
||||||
|
nlin.ini = lin->ini + ipun;
|
||||||
|
nlin.n = lin->n - ipun;
|
||||||
|
lin->n = ipun + 1;
|
||||||
|
nent.id = cad->add(&nlin);
|
||||||
|
|
||||||
|
if (nent.id < 0)
|
||||||
|
return false;
|
||||||
|
int nn = cad->add(&nent);
|
||||||
|
if (nn >= 0)
|
||||||
|
{
|
||||||
|
referencias[cad->_entities.get(nn)->ref] = entity->ref;
|
||||||
|
//cad->_entities.get(nn)->ref = entity->ref;//pisa la referencia (ojo peligorso)
|
||||||
|
}
|
||||||
|
return (nn >= 0);
|
||||||
|
}
|
||||||
|
bool CartoBaseTopologyManager::DivideLine(int ie, int ipun)
|
||||||
|
{
|
||||||
|
CartoBaseEntity* rawEntity = cad->_entities.get(ie);
|
||||||
|
CartoBaseInfoEntity entity = cad->getEntity(ie);
|
||||||
|
if (!entity.line() )
|
||||||
|
return false;
|
||||||
|
CartoBaseLine* lin = cad->_lines.get(rawEntity->id);
|
||||||
|
linebuff.set(&entity);
|
||||||
|
linebuff.ia = rawEntity->ia;
|
||||||
|
linebuff.pts.remove(0, ipun);
|
||||||
|
|
||||||
|
lin->n = ipun + 1;
|
||||||
|
return cad->add(linebuff);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CartoBaseTopologyManager::RevisaTopo(int ini, int fin)
|
||||||
|
{
|
||||||
|
bool res = true;
|
||||||
|
CartoBaseInfoEntity ent;
|
||||||
|
for (int i = ini; i < fin; i++)
|
||||||
|
{
|
||||||
|
ent=cad->getEntity(i);
|
||||||
|
if (!ent.line())
|
||||||
|
continue;
|
||||||
|
res=revisa(&ent);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (!res)
|
||||||
|
{
|
||||||
|
lcorreccines.entro();
|
||||||
|
conErrores = false;
|
||||||
|
lcorreccines.salgo();
|
||||||
|
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CartoBaseTopologyManager::revisa(CartoBaseInfoEntity* ent)
|
||||||
|
{
|
||||||
|
CartoBaseInfoEntity enta=cad->get(0);
|
||||||
|
double* pto1 = ent->getPto(0);
|
||||||
|
double* pto2 = ent->getPto(ent->getNumberPtos()-1);
|
||||||
|
double* aux;
|
||||||
|
while (enta.isValid())
|
||||||
|
{
|
||||||
|
if (enta.line())
|
||||||
|
{
|
||||||
|
int n = enta.getNumberPtos()-1;
|
||||||
|
|
||||||
|
for (int ii = 1; ii < n; ii++)
|
||||||
|
{
|
||||||
|
aux= enta.getPto(ii);
|
||||||
|
if (GeometryFunction::Dist2d(aux, pto1) < tolerancia || GeometryFunction::Dist2d(aux, pto2) < tolerancia)
|
||||||
|
{
|
||||||
|
if (!AddCorreccion(enta.i_entity, ii))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enta = enta.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool CartoBaseTopologyManager::AddCorreccion(int ie, int pto)
|
||||||
|
{
|
||||||
|
lcorreccines.entro();
|
||||||
|
ncorrecciones++;
|
||||||
|
Cgarray_ord<int, int>* pts;
|
||||||
|
if (correcciones.find(ie) == correcciones.end())
|
||||||
|
{
|
||||||
|
pts = new Cgarray_ord<int, int>();
|
||||||
|
pts->f_ord = &comint;
|
||||||
|
pts->fcomp = &comint;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pts = correcciones[ie];
|
||||||
|
}
|
||||||
|
bool res = (*pts) + pto;
|
||||||
|
correcciones[ie] = pts;
|
||||||
|
if (!res)
|
||||||
|
strcpy(error, "Error al añadir corrección de topologia.");
|
||||||
|
|
||||||
|
lcorreccines.salgo();
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
void CartoBaseTopologyManager::AplicaCorrecciones()
|
||||||
|
{
|
||||||
|
if (ncorrecciones <= 0 || conErrores)
|
||||||
|
return;
|
||||||
|
std::map<int, Cgarray_ord<int, int>*>::iterator elem;
|
||||||
|
int ult = -1;
|
||||||
|
cad->_entities += ncorrecciones;//pide memoria extra que va a necesitar en total
|
||||||
|
bool res = true;
|
||||||
|
for (elem = correcciones.begin(); elem != correcciones.end(); ++elem) {
|
||||||
|
ult = -1;
|
||||||
|
for (int ii=0; ii<elem->second->ind.n; ii++)
|
||||||
|
{
|
||||||
|
CartoBaseEntity *e=cad->_entities.get(elem->first);
|
||||||
|
int pt = *elem->second->get(elem->second->ind.n-1-ii);//divide de mayor a menor
|
||||||
|
if (pt != ult)
|
||||||
|
{
|
||||||
|
res = res && DivideLineVirtual(elem->first, pt);
|
||||||
|
ult = pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Cgarray_ord<int, int>* pts = correcciones[elem->first];
|
||||||
|
correcciones[elem->first] = NULL;
|
||||||
|
delete pts;
|
||||||
|
}
|
||||||
|
if (!res)
|
||||||
|
{
|
||||||
|
conErrores = true;
|
||||||
|
strcpy(error, "Error alaplicar correcciones de topologia.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool CartoBaseTopologyManager::revisaTopologia(CartoBase* carto, int numthread)
|
||||||
|
{
|
||||||
|
error[0] = 0;
|
||||||
|
nthread = numthread;
|
||||||
|
cad = carto;
|
||||||
|
terminado = false;
|
||||||
|
conErrores = false;
|
||||||
|
referencias.clear();
|
||||||
|
int ne = cad->getNumberEntities();
|
||||||
|
int nt = (int)(ne * 1. / numthread);
|
||||||
|
if (!(ne % numthread))
|
||||||
|
nt = nt + 1;
|
||||||
|
|
||||||
|
CthRevisaTopologia* th = new CthRevisaTopologia[numthread];
|
||||||
|
int ini = 0;
|
||||||
|
correcciones.clear();
|
||||||
|
ncorrecciones = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < numthread; i++)
|
||||||
|
{
|
||||||
|
th[i].ini = i * nt;
|
||||||
|
th[i].fin = min(th[i].ini + nt, ne);
|
||||||
|
th[i].topo = this;
|
||||||
|
th[i].lanza();
|
||||||
|
}
|
||||||
|
while (nthread > 0)
|
||||||
|
Sleep(100);
|
||||||
|
while (!terminado)
|
||||||
|
{
|
||||||
|
Sleep(100);
|
||||||
|
}
|
||||||
|
//delete th;
|
||||||
|
|
||||||
|
return !conErrores;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef CartoBaseTopologyManager_H
|
||||||
|
#define CartoBaseTopologyManager_H
|
||||||
|
#include "base_head.h"
|
||||||
|
#include "garray_ord.h"
|
||||||
|
#include "CartoBase.h"
|
||||||
|
#include "th.h"
|
||||||
|
class UTILES_EXPORT CartoBaseTopologyManager
|
||||||
|
{
|
||||||
|
CartoBase* cad;
|
||||||
|
CartoLine linebuff;
|
||||||
|
std::map<int, Cgarray_ord<int, int>*> correcciones;
|
||||||
|
|
||||||
|
long ncorrecciones;
|
||||||
|
Clock lcorreccines;
|
||||||
|
public:
|
||||||
|
std::map<int, int> referencias;
|
||||||
|
long nthread;
|
||||||
|
double tolerancia;
|
||||||
|
bool terminado;
|
||||||
|
bool conErrores;
|
||||||
|
char error[128];
|
||||||
|
static int comint(int* i1, int* i2)
|
||||||
|
{
|
||||||
|
return *i1 - *i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
CartoBaseTopologyManager(void);
|
||||||
|
~CartoBaseTopologyManager(void);
|
||||||
|
|
||||||
|
//funciones topologicas--------------------
|
||||||
|
bool revisaTopologia(CartoBase* carto, int nthread);
|
||||||
|
|
||||||
|
|
||||||
|
//funciones topologicas aux--------------------------------------------
|
||||||
|
bool DivideLineVirtual(int ie, int ipun);
|
||||||
|
bool DivideLine(int ie, int ipun);
|
||||||
|
bool RevisaTopo(int ini, int fin);
|
||||||
|
bool revisa(CartoBaseInfoEntity* ent);
|
||||||
|
|
||||||
|
bool AddCorreccion(int ie, int pto);
|
||||||
|
|
||||||
|
void AplicaCorrecciones();
|
||||||
|
};
|
||||||
|
|
||||||
|
class UTILES_EXPORT CthRevisaTopologia : public Cth
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CartoBaseTopologyManager* topo;
|
||||||
|
int ini, fin;
|
||||||
|
bool resul;
|
||||||
|
virtual void run()
|
||||||
|
{
|
||||||
|
resul=topo->RevisaTopo(ini, fin);
|
||||||
|
if (!lck_sum_atm(&topo->nthread, -1))
|
||||||
|
{
|
||||||
|
//finalizada revision, toca aplicar correccion
|
||||||
|
topo->AplicaCorrecciones();
|
||||||
|
topo->terminado = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
@ -32,7 +32,7 @@ typedef struct MapDataInt{
|
||||||
int v;
|
int v;
|
||||||
}MapDataInt;
|
}MapDataInt;
|
||||||
#pragma pack(16)
|
#pragma pack(16)
|
||||||
#define MAX_THREAD_LEE 8
|
#define MAX_THREAD_LEE 24
|
||||||
//matixFloat---------------------------------------------
|
//matixFloat---------------------------------------------
|
||||||
class UTILES_EXPORT CmapRowFloat
|
class UTILES_EXPORT CmapRowFloat
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,7 @@ copy $(OutDir)utiles.lib ..\lib\$(IntDir)</Command>
|
||||||
<ClCompile Include="CartoBaseDBFManager.cpp" />
|
<ClCompile Include="CartoBaseDBFManager.cpp" />
|
||||||
<ClCompile Include="CartoBaseElements.cpp" />
|
<ClCompile Include="CartoBaseElements.cpp" />
|
||||||
<ClCompile Include="CartoBaseShpManager.cpp" />
|
<ClCompile Include="CartoBaseShpManager.cpp" />
|
||||||
|
<ClCompile Include="CartoBaseTopologyManager.cpp" />
|
||||||
<ClCompile Include="CartoElements.cpp" />
|
<ClCompile Include="CartoElements.cpp" />
|
||||||
<ClCompile Include="cola_asincrona.cpp" />
|
<ClCompile Include="cola_asincrona.cpp" />
|
||||||
<ClCompile Include="control_usu_con.cpp" />
|
<ClCompile Include="control_usu_con.cpp" />
|
||||||
|
|
@ -307,6 +308,7 @@ copy $(OutDir)utiles.lib ..\lib\$(IntDir)</Command>
|
||||||
<ClInclude Include="CartoBaseDef.h" />
|
<ClInclude Include="CartoBaseDef.h" />
|
||||||
<ClInclude Include="CartoBaseElements.h" />
|
<ClInclude Include="CartoBaseElements.h" />
|
||||||
<ClInclude Include="CartoBaseShpManager.h" />
|
<ClInclude Include="CartoBaseShpManager.h" />
|
||||||
|
<ClInclude Include="CartoBaseTopologyManager.h" />
|
||||||
<ClInclude Include="CartoElements.h" />
|
<ClInclude Include="CartoElements.h" />
|
||||||
<ClInclude Include="cola_asincrona.h" />
|
<ClInclude Include="cola_asincrona.h" />
|
||||||
<ClInclude Include="control_usu_con.h" />
|
<ClInclude Include="control_usu_con.h" />
|
||||||
|
|
|
||||||
|
|
@ -210,6 +210,9 @@
|
||||||
<ClCompile Include="GeometryFunction.cpp">
|
<ClCompile Include="GeometryFunction.cpp">
|
||||||
<Filter>Source Files\carto</Filter>
|
<Filter>Source Files\carto</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="CartoBaseTopologyManager.cpp">
|
||||||
|
<Filter>Source Files\carto</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="utiles.def">
|
<None Include="utiles.def">
|
||||||
|
|
@ -395,6 +398,9 @@
|
||||||
<ClInclude Include="GeometryFunction.h">
|
<ClInclude Include="GeometryFunction.h">
|
||||||
<Filter>Header Files\carto</Filter>
|
<Filter>Header Files\carto</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="CartoBaseTopologyManager.h">
|
||||||
|
<Filter>Header Files\carto</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="utiles.rc">
|
<ResourceCompile Include="utiles.rc">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue