From 41ae0f33c3f45c274e72fcbea0793fe2141edbe2 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 19 May 2014 20:05:42 +0000 Subject: [PATCH] EgtExchange 1.5e4 : - aggiunto fattore di scalatura a ImportDxf - introdotto utilizzo dell'oggetto StmFromTriangleSoup in import STL. --- EgtExchange.rc | Bin 11478 -> 11478 bytes ExcExecutor.cpp | 10 +++-- ImportDxf.cpp | 9 ++++- ImportDxf.h | 5 ++- ImportDxfEnts.cpp | 40 ++++++++++++++++++ ImportStl.cpp | 101 +++++++++++++++------------------------------- ImportStl.h | 5 +-- 7 files changed, 92 insertions(+), 78 deletions(-) diff --git a/EgtExchange.rc b/EgtExchange.rc index 8165de46368c8433c6898b5d65b7291b784f4dfe..3149eb23bd34d4c144991ce7061bbc40346374a6 100644 GIT binary patch delta 94 zcmcZ>c`b6oH#SC-&4O|VnIc`b6oH#SD&&4O|VnIGetIdParam( 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 IImportDxf* pImpDxf = CreateImportDxf() ; @@ -133,7 +137,7 @@ ExcExecutor::ExecuteImportDxf( const string& sCmd2, const STRVECTOR& vsParams) return false ; } // eseguo l'importazione - bool bOk = pImpDxf->Import( sFile, m_pGDB, nId) ; + bool bOk = pImpDxf->Import( sFile, m_pGDB, nId, dScaleFactor) ; // cancello l'importatore delete pImpDxf ; diff --git a/ImportDxf.cpp b/ImportDxf.cpp index f2c8fc6..1a15073 100644 --- a/ImportDxf.cpp +++ b/ImportDxf.cpp @@ -33,13 +33,14 @@ ImportDxf::ImportDxf( void) { m_pGDB = nullptr ; m_nIdGroup = GDB_ID_NULL ; + m_dScaleFactor = 1 ; m_bUnGet = false ; m_nCurrCode = CODE_NULL ; } //---------------------------------------------------------------------------- bool -ImportDxf::Import( const string& sFile, IGeomDB* pGDB, int nIdGroup) +ImportDxf::Import( const string& sFile, IGeomDB* pGDB, int nIdGroup, double dScaleFactor) { // inizializzo lo scanner if ( ! m_theScanner.Init( sFile, nullptr, false)) { @@ -65,6 +66,12 @@ ImportDxf::Import( const string& sFile, IGeomDB* pGDB, int nIdGroup) LOG_ERROR( GetEExLogger(), "ImportDxf : Error on Group Frame3d") return false ; } + // verifico il fattore di scala + if ( dScaleFactor < EPS_SMALL) { + LOG_ERROR( GetEExLogger(), "ImportDxf : Error on ScaleFactor too small (minimum 0.001).") + return false ; + } + m_dScaleFactor = dScaleFactor ; // ciclo di lettura bool bOk = true ; diff --git a/ImportDxf.h b/ImportDxf.h index da2e2a6..357d1f7 100644 --- a/ImportDxf.h +++ b/ImportDxf.h @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- // EgalTech 2014-2014 //---------------------------------------------------------------------------- -// File : ImportDxf.h Data : 16.04.14 Versione : 1.5d4 +// File : ImportDxf.h Data : 19.05.14 Versione : 1.5e4 // Contenuto : Dichiarazione della classe ImportDxf. // // @@ -23,7 +23,7 @@ class ImportDxf : public IImportDxf { public : - virtual bool Import( const std::string& sFile, IGeomDB* pGDB, int nIdGroup) ; + virtual bool Import( const std::string& sFile, IGeomDB* pGDB, int nIdGroup, double dScaleFactor = 1) ; public : ImportDxf( void) ; @@ -70,6 +70,7 @@ class ImportDxf : public IImportDxf private : IGeomDB* m_pGDB ; int m_nIdGroup ; + double m_dScaleFactor ; Frame3d m_frGroup ; Scanner m_theScanner ; bool m_bUnGet ; diff --git a/ImportDxfEnts.cpp b/ImportDxfEnts.cpp index a70a884..eca294b 100644 --- a/ImportDxfEnts.cpp +++ b/ImportDxfEnts.cpp @@ -244,6 +244,11 @@ ImportDxf::Read3dFace( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + ptP0 *= m_dScaleFactor ; + ptP1 *= m_dScaleFactor ; + ptP2 *= m_dScaleFactor ; + ptP3 *= m_dScaleFactor ; // gestisco il riferimento del gruppo di inserimento ptP0.ToLoc( m_frGroup) ; ptP1.ToLoc( m_frGroup) ; @@ -345,6 +350,9 @@ ImportDxf::ReadArc( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + ptCen *= m_dScaleFactor ; + dRadius *= m_dScaleFactor ; // calcolo l'angolo al centro (archi sempre CCW in DXF) double dCentAng ; if ( fabs( dEndAng - dStartAng) > ( 360. - EPS_ANG_SMALL)) @@ -446,6 +454,9 @@ ImportDxf::ReadCircle( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + ptCen *= m_dScaleFactor ; + dRadius *= m_dScaleFactor ; // se il cerchio è nullo, non lo inserisco ma proseguo senza errore if ( dRadius < EPS_SMALL) return true ; @@ -551,6 +562,9 @@ ImportDxf::ReadEllipse( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + ptCen *= m_dScaleFactor ; + vtMajorAx *= m_dScaleFactor ; // calcolo il semiasse maggiore double dMajorAx = vtMajorAx.Len() ; vtMajorAx.Normalize() ; @@ -655,6 +669,9 @@ ImportDxf::ReadLine( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + ptStart *= m_dScaleFactor ; + ptEnd *= m_dScaleFactor ; // se la linea è nulla, non la inserisco ma proseguo senza errore if ( AreSamePointNear( ptStart, ptEnd)) return true ; @@ -769,6 +786,10 @@ ImportDxf::ReadLwPolyLine( bool& bFileEnd) vVert.push_back( vVert[0]) ; ++ nNumVert ; } + // aggiusto per il fattore di scala + dElevation *= m_dScaleFactor ; + for ( int i = 0 ; i < nNumVert ; ++i) + vVert[i].second *= m_dScaleFactor ; // aggiusto i punti per elevazione, eventuale OCS e riferimento del gruppo di inserimento Frame3d frOCS ; if ( ! AreSameVectorExact( vtExtr, Z_AX)) { @@ -854,6 +875,8 @@ ImportDxf::ReadPoint( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + ptP *= m_dScaleFactor ; // gestisco il riferimento del gruppo di inserimento ptP.ToLoc( m_frGroup) ; // inserisco il punto nel DB geometrico @@ -932,6 +955,8 @@ ImportDxf::ReadPolyLine( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + dElevation *= m_dScaleFactor ; // Se Polygon Mesh if ( ( nFlag & 16) != 0) return CompletePolygonMesh( sLayer, nColor, nFlag, dElevation, vtExtr, nNumVertM, nNumVertN, bFileEnd) ; @@ -995,6 +1020,9 @@ ImportDxf::CompletePolyLine( const string& sLayer, int nColor, int nFlag, double vVert.push_back( vVert[0]) ; ++ nNumVert ; } + // aggiusto per il fattore di scala + for ( int i = 0 ; i < nNumVert ; ++i) + vVert[i].second *= m_dScaleFactor ; // aggiusto i punti per elevazione, eventuale OCS e riferimento del gruppo di inserimento Frame3d frOCS ; if ( ! bIs3d && ! AreSameVectorExact( vtExtr, Z_AX)) { @@ -1116,6 +1144,8 @@ ImportDxf::CompletePolygonMesh( const string& sLayer, int nColor, int nFlag, dou // leggo il punto if ( ! ReadPolygonMeshVertex( ptP, bFileEnd)) bOkLoc = false ; + // aggiusto per il fattore di scala + ptP *= m_dScaleFactor ; // sistemazioni per elevazione, eventuale OCS e riferimento del gruppo di inserimento ptP.z += dElevation ; ptP.ToGlob( frOCS) ; @@ -1255,6 +1285,8 @@ ImportDxf::CompletePolyfaceMesh( const string& sLayer, int nColor, int nFlag, do bOkLoc = false ; switch ( nStat) { case 0 : // è un vertice + // aggiusto per il fattore di scala + ptP *= m_dScaleFactor ; // sistemazioni per elevazione, eventuale OCS e riferimento del gruppo di inserimento ptP.z += dElevation ; ptP.ToGlob( frOCS) ; @@ -1463,6 +1495,11 @@ ImportDxf::ReadSolid( bool& bFileEnd) UngetItem() ; // eventuale aggiustamento del nome del layer per caratteri non ammessi ValidateName( sLayer) ; + // aggiusto per il fattore di scala + ptP0 *= m_dScaleFactor ; + ptP1 *= m_dScaleFactor ; + ptP2 *= m_dScaleFactor ; + ptP3 *= m_dScaleFactor ; // gestisco eventuale OCS if ( ! AreSameVectorExact( vtExtr, Z_AX)) { Frame3d frOCS ; @@ -1586,6 +1623,9 @@ ImportDxf::ReadSpline( bool& bFileEnd) // Verifico il numero di punti di controllo if ( vCPnt.size() != nCPntNbr || nCPntNbr < 2) return false ; + // aggiusto per il fattore di scala + for ( int i = 0 ; i < nCPntNbr ; ++i) + vCPnt[i] *= m_dScaleFactor ; // gestisco il riferimento del gruppo di inserimento for ( int i = 0 ; i < nCPntNbr ; ++i) vCPnt[i].ToLoc( m_frGroup) ; diff --git a/ImportStl.cpp b/ImportStl.cpp index 45167cc..042612f 100644 --- a/ImportStl.cpp +++ b/ImportStl.cpp @@ -19,9 +19,9 @@ #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" +#include "/EgtDev/Include/EGkStmFromTriangleSoup.h" using namespace std ; @@ -152,26 +152,25 @@ ImportStl::LoadSolid( Scanner& TheScanner, bool& bEnd) if ( vsParams.size() >= 2) sName = vsParams[1] ; - // preparo l'oggetto TriMesh - PtrOwner pSTM( CreateSurfTriMesh()) ; - if ( ! IsValid( pSTM)) { - LOG_ERROR( GetEExLogger(), "ImportStl : Error allocating SurfTriMesh") + // Costruttore di trimesh da insieme disordinato di triangoli + StmFromTriangleSoup StmFts ; + if ( ! StmFts.Start()) { + LOG_ERROR( GetEExLogger(), "ImportStl : Error initialising StmFromTriangleSoup") return false ; } - if ( ! pSTM->Init( 3, 1)) { - LOG_ERROR( GetEExLogger(), "ImportStl : Error initialising SurfTriMesh") - return false ; - } - - // Grid dei vertici - PointGrid3d VertGrid ; - VertGrid.Init( GRID_NUM_BUCKETS) ; // ciclo di lettura dei triangoli + Triangle3d Tria ; bool bOk = true ; bool bTEnd = false ; do { - if ( ! LoadTriangle( TheScanner, Get( pSTM), VertGrid, bTEnd)) { + // leggo i dati del triangolo + if ( LoadTriangle( TheScanner, Tria, bTEnd)) { + // se letto, aggiungo il triangolo + if ( ! bTEnd && ! StmFts.AddTriangle( Tria)) + bOk = false ; + } + else { bOk = false ; string sOut = "ImportStl : Error on line " + ToString( TheScanner.GetCurrLineNbr()) ; LOG_ERROR( GetEExLogger(), sOut.c_str()) @@ -191,12 +190,13 @@ ImportStl::LoadSolid( Scanner& TheScanner, bool& bEnd) return false ; // valido la superficie e calcolo le adiacenze - if ( ! pSTM->AdjustTopology()) { + if ( ! StmFts.End()) { LOG_ERROR( GetEExLogger(), "ImportStl : Error adjusting topology in SurfTriMesh") return false ; } // inserisco l'oggetto nel DB geometrico - int nIdNew = m_pGDB->AddGeoObj( GDB_ID_NULL, m_nIdGroup, Release( pSTM)) ; + ISurfTriMesh* pSTM = StmFts.GetSurf() ; + int nIdNew = m_pGDB->AddGeoObj( GDB_ID_NULL, m_nIdGroup, pSTM) ; // se previsto il nome, lo assegno if ( ! sName.empty()) m_pGDB->SetName( nIdNew, sName) ; @@ -207,7 +207,7 @@ ImportStl::LoadSolid( Scanner& TheScanner, bool& bEnd) //---------------------------------------------------------------------------- bool -ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PointGrid3d& VertGrid, bool& bEnd) +ImportStl::LoadTriangle( Scanner& TheScanner, Triangle3d& Tria, bool& bEnd) { string sLine ; STRVECTOR vsParams ; @@ -241,7 +241,6 @@ ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PointGrid3d& V return false ; // ciclo sui tre vertici - int nIdV[3] ; for ( int i = 0 ; i < 3 ; ++ i) { // recupero una linea if ( ! TheScanner.GetLine( sLine)) @@ -262,22 +261,8 @@ ImportStl::LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PointGrid3d& V return false ; // scalo il vertice ptP *= m_dScaleFactor ; - // verifico se vertice già presente - int nId ; - if ( ! VertGrid.Find( ptP, 2 * EPS_SMALL, nId)) { - // aggiungo il vertice - if ( ( nIdV[i] = pSTM->AddVertex( ptP)) == SVT_NULL) - return false ; - VertGrid.InsertPoint( ptP, nIdV[i]) ; - } - else - nIdV[i] = nId ; - } - - // se i vertici sono tutti diversi tra loro, inserisco il triangolo - if ( nIdV[0] != nIdV[1] && nIdV[0] != nIdV[2] && nIdV[1] != nIdV[2]) { - if ( pSTM->AddTriangle( nIdV) == SVT_NULL) - return false ; + // inserisco il vertice nel triangolo + Tria.SetP( i, ptP) ; } // nuova linea @@ -332,20 +317,12 @@ ImportStl::ImportBinary( const string& sFile) if ( InFile.gcount() != LEN_INT) return false ; - // preparo l'oggetto TriMesh - PtrOwner pSTM( CreateSurfTriMesh()) ; - if ( ! IsValid( pSTM)) { - LOG_ERROR( GetEExLogger(), "ImportStl : Error allocating SurfTriMesh") + // Costruttore di trimesh da insieme disordinato di triangoli + StmFromTriangleSoup StmFts ; + if ( ! StmFts.Start()) { + LOG_ERROR( GetEExLogger(), "ImportStl : Error initialising StmFromTriangleSoup") return false ; } - if ( ! pSTM->Init( 3, 1)) { - LOG_ERROR( GetEExLogger(), "ImportStl : Error initialising SurfTriMesh") - return false ; - } - - // Grid dei vertici - PointGrid3d VertGrid ; - VertGrid.Init( GRID_NUM_BUCKETS) ; // lettura dei triangoli for ( int j = 0 ; j < uTria.i ; ++ j) { @@ -355,34 +332,19 @@ ImportStl::ImportBinary( const string& sFile) InFile.read( cNorm, LEN_NRM) ; if ( InFile.gcount() != LEN_NRM) return false ; - // ciclo sui tre vertici - int nIdV[3] ; + // recupero i tre vertici + Triangle3d Tria ; for ( int i = 0 ; i < 3 ; ++ i) { const int LEN_3F = 12 ; union { float f[3]; char c[LEN_3F]; } ufP ; InFile.read( ufP.c, LEN_3F) ; 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 - int nId ; - if ( ! VertGrid.Find( ptP, 2 * EPS_SMALL, nId)) { - // aggiungo il vertice - if ( ( nIdV[i] = pSTM->AddVertex( ptP)) == SVT_NULL) - return false ; - VertGrid.InsertPoint( ptP, nIdV[i]) ; - } - else - nIdV[i] = nId ; - } - - // se i vertici sono tutti diversi tra loro, inserisco il triangolo - if ( nIdV[0] != nIdV[1] && nIdV[0] != nIdV[2] && nIdV[1] != nIdV[2]) { - if ( pSTM->AddTriangle( nIdV) == SVT_NULL) - return false ; + Tria.SetP( i, Point3d( ufP.f[0] * m_dScaleFactor, ufP.f[1] * m_dScaleFactor, ufP.f[2] * m_dScaleFactor)) ; } + // aggiungo il triangolo + if ( ! StmFts.AddTriangle( Tria)) + return false ; // salto 2 byte const int LEN_SKI = 2 ; char cSkip[LEN_SKI] ; @@ -392,12 +354,13 @@ ImportStl::ImportBinary( const string& sFile) } // valido la superficie e calcolo le adiacenze - if ( ! pSTM->AdjustTopology()) { + if ( ! StmFts.End()) { LOG_ERROR( GetEExLogger(), "ImportStl : Error adjusting topology in SurfTriMesh") return false ; } // inserisco l'oggetto nel DB geometrico - int nIdNew = m_pGDB->AddGeoObj( GDB_ID_NULL, m_nIdGroup, Release( pSTM)) ; + ISurfTriMesh* pSTM = StmFts.GetSurf() ; + int nIdNew = m_pGDB->AddGeoObj( GDB_ID_NULL, m_nIdGroup, pSTM) ; // chiusura del file InFile.close() ; diff --git a/ImportStl.h b/ImportStl.h index b637c77..2238828 100644 --- a/ImportStl.h +++ b/ImportStl.h @@ -17,8 +17,7 @@ #include "/EgtDev/Include/EgkPoint3d.h" class Scanner ; -class ISurfTriMesh ; -class PointGrid3d ; +class Triangle3d ; //---------------------------------------------------------------------------- @@ -32,7 +31,7 @@ class ImportStl : public IImportStl int StlType( const std::string& sFile) ; bool ImportASCII( const std::string& sFile) ; bool LoadSolid( Scanner& TheScanner, bool& bEnd) ; - bool LoadTriangle( Scanner& TheScanner, ISurfTriMesh* pSTM, PointGrid3d& VertGrid, bool& bEnd) ; + bool LoadTriangle( Scanner& TheScanner, Triangle3d& Tria, bool& bEnd) ; bool ImportBinary( const std::string& sFile) ; private :