EgtExchange 1.5e3 :

- aggiunto fattore di scalatura a ImportStl
- uso di PointGrid3d in import STL invece di ordinamento lessicografico.
This commit is contained in:
Dario Sassi
2014-05-18 09:30:03 +00:00
parent e5f28f8de1
commit fca2574f79
4 changed files with 65 additions and 83 deletions
BIN
View File
Binary file not shown.
+7 -3
View File
@@ -82,8 +82,8 @@ ExcExecutor::SetGeomDB( IGeomDB* pGdb)
bool
ExcExecutor::ExecuteImportStl( const string& sCmd2, const STRVECTOR& vsParams)
{
// 2 parametri : nome del file e Id del gruppo
if ( vsParams.size() != 2)
// 2 o 3 parametri : nome del file, Id del gruppo[, ScaleFactor]
if ( vsParams.size() != 2 && vsParams.size() != 3)
return false ;
// eventuale conversione di token nel nome file
string sFile = vsParams[0] ;
@@ -92,6 +92,10 @@ ExcExecutor::ExecuteImportStl( const string& sCmd2, const STRVECTOR& vsParams)
int nId = m_pParser->GetIdParam( vsParams[1]) ;
if ( nId == CMD_ID_ERROR)
return false ;
// gestisco ScaleFactor
double dScaleFactor = 1 ;
if ( vsParams.size() >= 3)
FromString( vsParams[2], dScaleFactor) ;
// preparo l'importatore
IImportStl* pImpStl = CreateImportStl() ;
@@ -100,7 +104,7 @@ ExcExecutor::ExecuteImportStl( const string& sCmd2, const STRVECTOR& vsParams)
return false ;
}
// eseguo l'importazione
bool bOk = pImpStl->Import( sFile, m_pGDB, nId) ;
bool bOk = pImpStl->Import( sFile, m_pGDB, nId, dScaleFactor) ;
// cancello l'importatore
delete pImpStl ;
+51 -51
View File
@@ -19,11 +19,15 @@
#include "/EgtDEv/Include/EGnScan.h"
#include "/EgtDev/Include/EgnStringUtils.h"
#include "/EgtDev/Include/EgnStringConverter.h"
#include "/EgtDev/Include/EGkPointGrid3d.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include "/EgtDev/Include/EGkSurfTriMesh.h"
using namespace std ;
//----------------------------------------------------------------------------
static const int GRID_NUM_BUCKETS = 50000 ;
//----------------------------------------------------------------------------
IImportStl*
CreateImportStl( void)
@@ -33,13 +37,35 @@ CreateImportStl( void)
//----------------------------------------------------------------------------
bool
ImportStl::Import( const string& sFile, IGeomDB* pGDB, int nIdGroup)
ImportStl::Import( const string& sFile, IGeomDB* pGDB, int nIdGroup, double dScaleFactor)
{
// verifico il DB geometrico
if ( pGDB == nullptr) {
LOG_ERROR( GetEExLogger(), "ImportStl : Error on GeomDB")
return false ;
}
m_pGDB = pGDB ;
// verifico l'Id di gruppo
if ( ! m_pGDB->ExistsObj( nIdGroup)) {
LOG_ERROR( GetEExLogger(), "ImportStl : Error on IdGroup")
return false ;
}
m_nIdGroup = nIdGroup ;
// verifico il fattore di scala
if ( dScaleFactor < EPS_SMALL) {
LOG_ERROR( GetEExLogger(), "ImportStl : Error on ScaleFactor too small (minimum 0.001).")
return false ;
}
m_dScaleFactor = dScaleFactor ;
// eseguo l'opportuna importazione
switch ( StlType( sFile)) {
case STL_ASCII :
return ImportASCII( sFile, pGDB, nIdGroup) ;
return ImportASCII( sFile) ;
case STL_BINARY :
return ImportBinary( sFile, pGDB, nIdGroup) ;
return ImportBinary( sFile) ;
default :
return false ;
}
@@ -78,7 +104,7 @@ ImportStl::StlType( const std::string& sFile)
//----------------------------------------------------------------------------
bool
ImportStl::ImportASCII( const string& sFile, IGeomDB* pGDB, int nIdGroup)
ImportStl::ImportASCII( const string& sFile)
{
// inizializzo lo scanner
Scanner TheScanner ;
@@ -87,20 +113,6 @@ ImportStl::ImportASCII( const string& sFile, IGeomDB* pGDB, int nIdGroup)
return false ;
}
// verifico il DB geometrico
if ( pGDB == nullptr) {
LOG_ERROR( GetEExLogger(), "ImportStl : Error on GeomDB")
return false ;
}
m_pGDB = pGDB ;
// verifico l'Id di gruppo
if ( ! m_pGDB->ExistsObj( nIdGroup)) {
LOG_ERROR( GetEExLogger(), "ImportStl : Error on IdGroup")
return false ;
}
m_nIdGroup = nIdGroup ;
// ciclo di lettura degli oggetti
bool bOk = true ;
bool bEnd = false ;
@@ -151,15 +163,15 @@ ImportStl::LoadSolid( Scanner& TheScanner, bool& bEnd)
return false ;
}
// Map dei vertici ( lexicographic -> usare epsilon piccoli)
CmpPnt comp( EPS_SMALL) ;
PntIntMap MapVert( comp) ;
// Grid dei vertici
PointGrid3d VertGrid ;
VertGrid.Init( GRID_NUM_BUCKETS) ;
// ciclo di lettura dei triangoli
bool bOk = true ;
bool bTEnd = false ;
do {
if ( ! LoadTriangle( TheScanner, Get( pSTM), MapVert, bTEnd)) {
if ( ! LoadTriangle( TheScanner, Get( pSTM), VertGrid, bTEnd)) {
bOk = false ;
string sOut = "ImportStl : Error on line " + ToString( TheScanner.GetCurrLineNbr()) ;
LOG_ERROR( GetEExLogger(), sOut.c_str())
@@ -195,7 +207,7 @@ ImportStl::LoadSolid( Scanner& TheScanner, bool& bEnd)
//----------------------------------------------------------------------------
bool
ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PntIntMap& MapVert, bool& bEnd)
ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PointGrid3d& VertGrid, bool& bEnd)
{
string sLine ;
STRVECTOR vsParams ;
@@ -230,7 +242,6 @@ ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PntIntMap& Map
// ciclo sui tre vertici
int nIdV[3] ;
PntIntMap::iterator Iter ;
for ( int i = 0 ; i < 3 ; ++ i) {
// recupero una linea
if ( ! TheScanner.GetLine( sLine))
@@ -249,16 +260,18 @@ ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PntIntMap& Map
! FromString( vsParams[2], ptP.y) ||
! FromString( vsParams[3], ptP.z))
return false ;
// scalo il vertice
ptP *= m_dScaleFactor ;
// verifico se vertice già presente
Iter = MapVert.find( ptP) ;
if ( Iter == MapVert.end()) {
int nId ;
if ( ! VertGrid.Find( ptP, 2 * EPS_SMALL, nId)) {
// aggiungo il vertice
if ( ( nIdV[i] = pSTM->AddVertex( ptP)) == SVT_NULL)
return false ;
MapVert[ptP] = nIdV[i] ;
VertGrid.InsertPoint( ptP, nIdV[i]) ;
}
else
nIdV[i] = Iter->second ;
nIdV[i] = nId ;
}
// se i vertici sono tutti diversi tra loro, inserisco il triangolo
@@ -297,7 +310,7 @@ ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PntIntMap& Map
//----------------------------------------------------------------------------
bool
ImportStl::ImportBinary( const string& sFile, IGeomDB* pGDB, int nIdGroup)
ImportStl::ImportBinary( const string& sFile)
{
// apertura del file di ingresso
ifstream InFile ;
@@ -305,20 +318,6 @@ ImportStl::ImportBinary( const string& sFile, IGeomDB* pGDB, int nIdGroup)
if ( InFile.fail())
return false ;
// verifico il DB geometrico
if ( pGDB == nullptr) {
LOG_ERROR( GetEExLogger(), "ImportStl : Error on GeomDB")
return false ;
}
m_pGDB = pGDB ;
// verifico l'Id di gruppo
if ( ! m_pGDB->ExistsObj( nIdGroup)) {
LOG_ERROR( GetEExLogger(), "ImportStl : Error on IdGroup")
return false ;
}
m_nIdGroup = nIdGroup ;
// lettura dei primi ottanta byte (commento da scartare)
const int LEN_REM = 80 ;
char cRem[LEN_REM] ;
@@ -344,9 +343,9 @@ ImportStl::ImportBinary( const string& sFile, IGeomDB* pGDB, int nIdGroup)
return false ;
}
// Map dei vertici ( lexicographic -> usare epsilon piccoli)
CmpPnt comp( EPS_SMALL) ;
PntIntMap MapVert( comp) ;
// Grid dei vertici
PointGrid3d VertGrid ;
VertGrid.Init( GRID_NUM_BUCKETS) ;
// lettura dei triangoli
for ( int j = 0 ; j < uTria.i ; ++ j) {
@@ -358,7 +357,6 @@ ImportStl::ImportBinary( const string& sFile, IGeomDB* pGDB, int nIdGroup)
return false ;
// ciclo sui tre vertici
int nIdV[3] ;
PntIntMap::iterator Iter ;
for ( int i = 0 ; i < 3 ; ++ i) {
const int LEN_3F = 12 ;
union { float f[3]; char c[LEN_3F]; } ufP ;
@@ -366,16 +364,18 @@ ImportStl::ImportBinary( const string& sFile, IGeomDB* pGDB, int nIdGroup)
if ( InFile.gcount() != LEN_3F)
return false ;
Point3d ptP( ufP.f[0], ufP.f[1], ufP.f[2]) ;
// scalo il vertice
ptP *= m_dScaleFactor ;
// verifico se vertice già presente
Iter = MapVert.find( ptP) ;
if ( Iter == MapVert.end()) {
int nId ;
if ( ! VertGrid.Find( ptP, 2 * EPS_SMALL, nId)) {
// aggiungo il vertice
if ( ( nIdV[i] = pSTM->AddVertex( ptP)) == SVT_NULL)
return false ;
MapVert[ptP] = nIdV[i] ;
VertGrid.InsertPoint( ptP, nIdV[i]) ;
}
else
nIdV[i] = Iter->second ;
nIdV[i] = nId ;
}
// se i vertici sono tutti diversi tra loro, inserisco il triangolo
+7 -29
View File
@@ -1,7 +1,7 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : ImportStl.h Data : 04.04.14 Versione : 1.5d1
// File : ImportStl.h Data : 16.05.14 Versione : 1.5e3
// Contenuto : Dichiarazione della classe ImportStl.
//
//
@@ -15,10 +15,10 @@
#include "/EgtDev/Include/EExImportStl.h"
#include "/EgtDev/Include/EgkPoint3d.h"
#include <map>
class Scanner ;
class ISurfTriMesh ;
class PointGrid3d ;
//----------------------------------------------------------------------------
@@ -26,37 +26,14 @@ class ISurfTriMesh ;
class ImportStl : public IImportStl
{
public :
virtual bool Import( const std::string& sFile, IGeomDB* pGDB, int nIdGroup) ;
private :
class CmpPnt
{
public :
CmpPnt( double dEps = EPS_SMALL) : m_dEps( dEps)
{}
bool operator()( const Point3d& ptP0, const Point3d& ptP1) const
{
if ( fabs( ptP0.x - ptP1.x) <= m_dEps) {
if ( fabs( ptP0.y - ptP1.y) <= m_dEps) {
return ( ptP0.z < ptP1.z - m_dEps) ;
}
else
return ( ptP0.y < ptP1.y - m_dEps) ;
}
else
return ( ptP0.x < ptP1.x - m_dEps) ;
}
private :
double m_dEps ;
} ;
typedef std::map< Point3d, int, CmpPnt> PntIntMap ;
virtual bool Import( const std::string& sFile, IGeomDB* pGDB, int nIdGroup, double dScaleFactor = 1) ;
private :
int StlType( const std::string& sFile) ;
bool ImportASCII( const std::string& sFile, IGeomDB* pGDB, int nIdGroup) ;
bool ImportASCII( const std::string& sFile) ;
bool LoadSolid( Scanner& TheScanner, bool& bEnd) ;
bool LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PntIntMap& MapVert, bool& bEnd) ;
bool ImportBinary( const std::string& sFile, IGeomDB* pGDB, int nIdGroup) ;
bool LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PointGrid3d& VertGrid, bool& bEnd) ;
bool ImportBinary( const std::string& sFile) ;
private :
enum { STL_ERROR = 0, STL_ASCII = 1, STL_BINARY = 2 } ;
@@ -64,4 +41,5 @@ class ImportStl : public IImportStl
private :
IGeomDB* m_pGDB ;
int m_nIdGroup ;
double m_dScaleFactor ;
} ;