Creaccion de manager topologia

master
Gerardo 2023-11-12 22:28:13 +01:00
parent fde9722153
commit 704edec152
7 changed files with 294 additions and 2 deletions

View File

@ -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]);
@ -692,4 +710,4 @@ int FiterCartoBase::getNumberEntities()
{ {
return ind.n; return ind.n;
} }
//***************************************************************************************** //*****************************************************************************************

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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