Creaccion de manager topologia
parent
fde9722153
commit
704edec152
|
|
@ -682,7 +682,25 @@ void CartoBase::setNameIa( char *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 )
|
||||
{
|
||||
return cb->get(ind[i]);
|
||||
|
|
@ -692,4 +710,4 @@ int FiterCartoBase::getNumberEntities()
|
|||
{
|
||||
return ind.n;
|
||||
}
|
||||
//*****************************************************************************************
|
||||
//*****************************************************************************************
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -106,6 +107,8 @@ public:
|
|||
virtual bool IaGetVal( int refEnt, int icol, int* v );
|
||||
virtual bool IaFinW(){return true;}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
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;
|
||||
}MapDataInt;
|
||||
#pragma pack(16)
|
||||
#define MAX_THREAD_LEE 8
|
||||
#define MAX_THREAD_LEE 24
|
||||
//matixFloat---------------------------------------------
|
||||
class UTILES_EXPORT CmapRowFloat
|
||||
{
|
||||
|
|
|
|||
|
|
@ -248,6 +248,7 @@ copy $(OutDir)utiles.lib ..\lib\$(IntDir)</Command>
|
|||
<ClCompile Include="CartoBaseDBFManager.cpp" />
|
||||
<ClCompile Include="CartoBaseElements.cpp" />
|
||||
<ClCompile Include="CartoBaseShpManager.cpp" />
|
||||
<ClCompile Include="CartoBaseTopologyManager.cpp" />
|
||||
<ClCompile Include="CartoElements.cpp" />
|
||||
<ClCompile Include="cola_asincrona.cpp" />
|
||||
<ClCompile Include="control_usu_con.cpp" />
|
||||
|
|
@ -307,6 +308,7 @@ copy $(OutDir)utiles.lib ..\lib\$(IntDir)</Command>
|
|||
<ClInclude Include="CartoBaseDef.h" />
|
||||
<ClInclude Include="CartoBaseElements.h" />
|
||||
<ClInclude Include="CartoBaseShpManager.h" />
|
||||
<ClInclude Include="CartoBaseTopologyManager.h" />
|
||||
<ClInclude Include="CartoElements.h" />
|
||||
<ClInclude Include="cola_asincrona.h" />
|
||||
<ClInclude Include="control_usu_con.h" />
|
||||
|
|
|
|||
|
|
@ -210,6 +210,9 @@
|
|||
<ClCompile Include="GeometryFunction.cpp">
|
||||
<Filter>Source Files\carto</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CartoBaseTopologyManager.cpp">
|
||||
<Filter>Source Files\carto</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="utiles.def">
|
||||
|
|
@ -395,6 +398,9 @@
|
|||
<ClInclude Include="GeometryFunction.h">
|
||||
<Filter>Header Files\carto</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CartoBaseTopologyManager.h">
|
||||
<Filter>Header Files\carto</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="utiles.rc">
|
||||
|
|
|
|||
Loading…
Reference in New Issue