From 7bdf2e9c7f99852b7af42ece6dae6bd802b7478e Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 19 Aug 2014 20:22:28 +0000 Subject: [PATCH] EgtExchange 1.5h5 : - export DXF di curve di Bezier piane ora come archi - export DXF di STM ora POLYMESH se vert. e facce < 16567, altrimenti 3DFACE - import DXF migliorato controlli su SPLINE collassate in un punto. --- EgtExchange.rc | Bin 11478 -> 11478 bytes ExportDxf.cpp | 198 ++++++++++++++++++++++++++++---------------- ExportStl.cpp | 4 +- ImportDxfBlocks.cpp | 8 +- ImportDxfEnts.cpp | 44 +++++----- 5 files changed, 154 insertions(+), 100 deletions(-) diff --git a/EgtExchange.rc b/EgtExchange.rc index 2b87cacb3ed644a54b498f574869c1585048d47d..f87b0942995456c35f25ce49285d5be64df4d7ca 100644 GIT binary patch delta 110 zcmcZ>c`b6oH#SDo&4O|VnIc`b6oH#SC-&4O|VnI pIter( CreateGdbIterator( pGDB)) ; - if ( ! ::IsValid( pIter)) + if ( IsNull( pIter)) return false ; pIter->GoTo( nId) ; // eseguo la ricerca @@ -259,7 +259,7 @@ ExportDxf::FindLayers( const IGdbIterator& iIter, const string& sLay, LAYDATVECT vLayDat.push_back( make_pair( sNewLay, nCol)) ; // scandisco il gruppo alla ricerca di sottogruppi PtrOwner pIter( CreateGdbIterator( iIter.GetGDB())) ; - if ( ! ::IsValid( pIter)) + if ( IsNull( pIter)) return false ; bool bOk = true ; for ( bool bNext = pIter->GoToFirstInGroup( iIter) ; @@ -304,7 +304,7 @@ ExportDxf::ExportEntities( IGeomDB* pGDB, int nId) // creo un iteratore PtrOwner pIter( CreateGdbIterator( pGDB)) ; - if ( ! ::IsValid( pIter)) + if ( IsNull( pIter)) return false ; pIter->GoTo( nId) ; // esporto l'oggetto e i suoi eventuali figli @@ -400,7 +400,7 @@ ExportDxf::ExportGdbGroup( const IGdbIterator& iIter, const string& sLay) { // creo un iteratore PtrOwner pIter( CreateGdbIterator( iIter.GetGDB())) ; - if ( ! ::IsValid( pIter)) + if ( IsNull( pIter)) return false ; // aggiorno nome layer string sNewLay = UpdateLayerName( iIter, sLay) ; @@ -482,6 +482,13 @@ ExportDxf::ExportCrvBezier( const string& sLay, int nCol, const IGeoObj* pGeoObj const ICurveBezier* pCBez = GetCurveBezier( pGeoObj) ; if ( pCBez == nullptr) return false ; + // verifico se piana + Plane3d plPlane ; + if ( pCBez->IsFlat( plPlane)) { + Frame3d frPlane ; + frPlane.Set( ( ORIG + plPlane.dDist * plPlane.vtN), plPlane.vtN) ; + return WriteCurve2d( sLay, nCol, pCBez, frPlane, frFrame) ; + } // esporto come polilinea 3d return WriteCurve3d( sLay, nCol, pCBez, frFrame) ; } @@ -513,88 +520,133 @@ ExportDxf::ExportSTM( const string& sLay, int nCol, const IGeoObj* pGeoObj, cons const ISurfTriMesh* pSTM = GetSurfTriMesh( pGeoObj) ; if ( pSTM == nullptr) return false ; - // identificativo entità - if ( ! WriteItem( 0, "POLYLINE")) - return false ; - // layer - if ( ! WriteItem( 8, sLay)) - return false ; - // colore - if ( ! WriteItem( 62, nCol)) - return false ; - // flag segnalazione entità successive dipendenti (vertex) - if ( ! WriteItem( 66, 1)) - return false ; - // punto inutile ma obbligatorio - if ( ! WriteItem( 10, 0) || - ! WriteItem( 20, 0) || - ! WriteItem( 30, 0)) - return false ; - // flag (polyface mesh 3d) - if ( ! WriteItem( 70, 64)) - return false ; - // numero di vertici - if ( ! WriteItem( 71, pSTM->GetVertexNum())) - return false ; - // numero di facce - if ( ! WriteItem( 72, pSTM->GetTriangleNum())) - return false ; - // ciclo sui vertici - Point3d ptP ; - for ( int nId = pSTM->GetFirstVertex( ptP) ; - nId != SVT_NULL ; - nId = pSTM->GetNextVertex( nId, ptP)) { - // entità vertice - if ( ! WriteItem( 0, "VERTEX")) + // posso esportare come unica polymesh solo se il numero dei vertici e dei triangoli è inferiore a 32767 + if ( pSTM->GetVertexNum() < SHRT_MAX && pSTM->GetTriangleNum() < SHRT_MAX) { + // identificativo entità + if ( ! WriteItem( 0, "POLYLINE")) return false ; // layer if ( ! WriteItem( 8, sLay)) return false ; - // punto corrente - ptP.ToGlob( frFrame) ; - if ( ! WriteItem( 10, ptP.x) || - ! WriteItem( 20, ptP.y) || - ! WriteItem( 30, ptP.z)) - return false ; - // flag (3d polygon mesh + polyface mesh vertex) - if ( ! WriteItem( 70, 64 + 128)) - return false ; - } - // ciclo sui triangoli - int nIdVert[3] ; - for ( int nId = pSTM->GetFirstTriangle( nIdVert) ; - nId != SVT_NULL ; - nId = pSTM->GetNextTriangle( nId, nIdVert)) { - // entità vertice - if ( ! WriteItem( 0, "VERTEX")) - return false ; - // layer - if ( ! WriteItem( 8, sLay)) - return false ; - // colore (unico colore riconosciuto) + // colore if ( ! WriteItem( 62, nCol)) return false ; + // flag segnalazione entità successive dipendenti (vertex) + if ( ! WriteItem( 66, 1)) + return false ; // punto inutile ma obbligatorio if ( ! WriteItem( 10, 0) || ! WriteItem( 20, 0) || ! WriteItem( 30, 0)) return false ; - // flag (polyface mesh vertex) - if ( ! WriteItem( 70, 128)) + // flag (polyface mesh 3d) + if ( ! WriteItem( 70, 64)) return false ; - // indici dei vertici (1-based) - if ( ! WriteItem( 71, nIdVert[0] + 1) || - ! WriteItem( 72, nIdVert[1] + 1) || - ! WriteItem( 73, nIdVert[2] + 1)) + // numero di vertici + if ( ! WriteItem( 71, pSTM->GetVertexNum())) return false ; + // numero di facce + if ( ! WriteItem( 72, pSTM->GetTriangleNum())) + return false ; + // ciclo sui vertici + Point3d ptP ; + for ( int nId = pSTM->GetFirstVertex( ptP) ; + nId != SVT_NULL ; + nId = pSTM->GetNextVertex( nId, ptP)) { + // entità vertice + if ( ! WriteItem( 0, "VERTEX")) + return false ; + // layer + if ( ! WriteItem( 8, sLay)) + return false ; + // punto corrente + ptP.ToGlob( frFrame) ; + if ( ! WriteItem( 10, ptP.x) || + ! WriteItem( 20, ptP.y) || + ! WriteItem( 30, ptP.z)) + return false ; + // flag (3d polygon mesh + polyface mesh vertex) + if ( ! WriteItem( 70, 64 + 128)) + return false ; + } + // ciclo sui triangoli + int nIdVert[3] ; + for ( int nId = pSTM->GetFirstTriangle( nIdVert) ; + nId != SVT_NULL ; + nId = pSTM->GetNextTriangle( nId, nIdVert)) { + // entità vertice + if ( ! WriteItem( 0, "VERTEX")) + return false ; + // layer + if ( ! WriteItem( 8, sLay)) + return false ; + // colore (unico colore riconosciuto) + if ( ! WriteItem( 62, nCol)) + return false ; + // punto inutile ma obbligatorio + if ( ! WriteItem( 10, 0) || + ! WriteItem( 20, 0) || + ! WriteItem( 30, 0)) + return false ; + // flag (polyface mesh vertex) + if ( ! WriteItem( 70, 128)) + return false ; + // indici dei vertici (1-based) + if ( ! WriteItem( 71, nIdVert[0] + 1) || + ! WriteItem( 72, nIdVert[1] + 1) || + ! WriteItem( 73, nIdVert[2] + 1)) + return false ; + } + // entità termine dei vertici + if ( ! WriteItem( 0, "SEQEND")) + return false ; + // layer + if ( ! WriteItem( 8, sLay)) + return false ; + return true ; + } + // altrimenti devo esportare come insieme di facce triangolari + else { + // ciclo sui triangoli + Triangle3d Tria ; + for ( int nId = pSTM->GetFirstTriangle( Tria) ; + nId != SVT_NULL ; + nId = pSTM->GetNextTriangle( nId, Tria)) { + // entità 3dface + if ( ! WriteItem( 0, "3DFACE")) + return false ; + // layer + if ( ! WriteItem( 8, sLay)) + return false ; + // colore (unico colore riconosciuto) + if ( ! WriteItem( 62, nCol)) + return false ; + // primo vertice + if ( ! WriteItem( 10, Tria.GetP(0).x) || + ! WriteItem( 20, Tria.GetP(0).y) || + ! WriteItem( 30, Tria.GetP(0).z)) + return false ; + // secondo vertice + if ( ! WriteItem( 11, Tria.GetP(1).x) || + ! WriteItem( 21, Tria.GetP(1).y) || + ! WriteItem( 31, Tria.GetP(1).z)) + return false ; + // terzo vertice + if ( ! WriteItem( 12, Tria.GetP(2).x) || + ! WriteItem( 22, Tria.GetP(2).y) || + ! WriteItem( 32, Tria.GetP(2).z)) + return false ; + // quarto vertice (ripete il terzo) + if ( ! WriteItem( 13, Tria.GetP(2).x) || + ! WriteItem( 23, Tria.GetP(2).y) || + ! WriteItem( 33, Tria.GetP(2).z)) + return false ; + // flag (default) + if ( ! WriteItem( 70, 0)) + return false ; + } + return true ; } - // entità termine dei vertici - if ( ! WriteItem( 0, "SEQEND")) - return false ; - // layer - if ( ! WriteItem( 8, sLay)) - return false ; - return true ; } //---------------------------------------------------------------------------- @@ -773,7 +825,7 @@ ExportDxf::WriteCurve2d( const string& sLay, int nCol, const ICurve* pCrv, if ( ! AreSameFrame( frPlane, GLOB_FRM)) { // creo una copia della curva (da buttare alla fine) PtrOwner pModCrv( pCrv->Clone()) ; - if ( ! IsValid( pModCrv)) + if ( IsNull( pModCrv)) return false ; // eseguo la trasformazione pModCrv->ToLoc( frPlane) ; diff --git a/ExportStl.cpp b/ExportStl.cpp index 39a1797..67919ed 100644 --- a/ExportStl.cpp +++ b/ExportStl.cpp @@ -65,7 +65,7 @@ ExportStl::Export( IGeomDB* pGDB, int nId, const string& sFile) // creo un iteratore PtrOwner pIter( CreateGdbIterator( pGDB)) ; - if ( ! ::IsValid( pIter)) + if ( IsNull( pIter)) return false ; pIter->GoTo( nId) ; // esporto l'oggetto e i suoi eventuali figli @@ -200,7 +200,7 @@ ExportStl::ScanGroup( const IGdbIterator& iIter, ofstream& OutFile) { // creo un iteratore PtrOwner pIter( CreateGdbIterator( iIter.GetGDB())) ; - if ( ! ::IsValid( pIter)) + if ( IsNull( pIter)) return false ; // scandisco il gruppo bool bOk = true ; diff --git a/ImportDxfBlocks.cpp b/ImportDxfBlocks.cpp index 3aff69c..ea3749e 100644 --- a/ImportDxfBlocks.cpp +++ b/ImportDxfBlocks.cpp @@ -173,10 +173,10 @@ ImportDxf::SolveBlockReferences( void) { // creo gli iteratori PtrOwner pIBlo( CreateGdbIterator( m_pGDB)) ; - if ( ! IsValid( pIBlo)) + if ( IsNull( pIBlo)) return false ; PtrOwner pIEnt( CreateGdbIterator( m_pGDB)) ; - if ( ! IsValid( pIEnt)) + if ( IsNull( pIEnt)) return false ; // si ripete più volte, fino a completa soluzione o max iterazioni @@ -283,7 +283,7 @@ ImportDxf::InsertBlockInBlock( int nIdDest, int nIdIns, const InsertData& insDat } // copio tutte le entità del blocco, trasformandole opportunamente PtrOwner pIEnt( CreateGdbIterator( m_pGDB)) ; - if ( ! IsValid( pIEnt)) + if ( IsNull( pIEnt)) return false ; bool bFound = pIEnt->GoToFirstInGroup( nIdIns) ; while ( bFound) { @@ -296,7 +296,7 @@ ImportDxf::InsertBlockInBlock( int nIdDest, int nIdIns, const InsertData& insDat continue ; } PtrOwner pGeo( pGeoS->Clone()) ; - if ( ! IsValid( pGeo)) + if ( IsNull( pGeo)) return false ; // inserisco l'entità nel DB int nIdE = m_pGDB->InsertGeoObj( GDB_ID_NULL, nIdDest, GDB_BEFORE, Release( pGeo)) ; diff --git a/ImportDxfEnts.cpp b/ImportDxfEnts.cpp index ed804ee..5ea45f5 100644 --- a/ImportDxfEnts.cpp +++ b/ImportDxfEnts.cpp @@ -362,7 +362,7 @@ ImportDxf::Read3dFace( bool& bFileEnd) // inserisco la faccia nel DB geometrico // creo la trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; - if ( ! IsValid( pSTM)) + if ( IsNull( pSTM)) return false ; // costruisco la geometria della trimesh if ( ! pSTM->Init( 4, 2)) @@ -495,7 +495,7 @@ ImportDxf::ReadArc( bool& bFileEnd) // inserisco l'arco nel DB geometrico // creo l'arco PtrOwner pCrvArc( CreateCurveArc()) ; - if ( ! IsValid( pCrvArc)) + if ( IsNull( pCrvArc)) return false ; // setto l'arco if ( ! pCrvArc->Set( ptCen, vtExtr, dRadius, vtStart, dCentAng, 0)) @@ -595,7 +595,7 @@ ImportDxf::ReadCircle( bool& bFileEnd) // inserisco il cerchio nel DB geometrico // creo il cerchio PtrOwner pCrvArc( CreateCurveArc()) ; - if ( ! IsValid( pCrvArc)) + if ( IsNull( pCrvArc)) return false ; // setto il cerchio if ( ! pCrvArc->Set( ptCen, vtExtr, dRadius)) @@ -716,7 +716,7 @@ ImportDxf::ReadEllipse( bool& bFileEnd) // inserisco l'arco nel DB geometrico // creo l'arco PtrOwner pCrvArc( CreateCurveArc()) ; - if ( ! IsValid( pCrvArc)) + if ( IsNull( pCrvArc)) return false ; // setto l'arco if ( ! pCrvArc->Set( ptCen, vtExtr, dMajorAx, vtStart, dCentAng, 0)) @@ -856,7 +856,7 @@ ImportDxf::ReadInsert( bool& bFileEnd) Vector3d vtMove = insData.ptP - ptBase ; // copio tutte le entità del blocco, trasformandole opportunamente PtrOwner pIter( CreateGdbIterator( m_pGDB)) ; - if ( ! IsValid( pIter)) + if ( IsNull( pIter)) return false ; bool bFound = pIter->GoToFirstInGroup( nIdBlock) ; while ( bFound) { @@ -865,7 +865,7 @@ ImportDxf::ReadInsert( bool& bFileEnd) if ( pGeoS == nullptr) return false ; PtrOwner pGeo( pGeoS->Clone()) ; - if ( ! IsValid( pGeo)) + if ( IsNull( pGeo)) return false ; // inserisco l'entità nel DB int nId = m_pGDB->AddGeoObj( GDB_ID_NULL, GetGroupId( insData.sLayer), Release( pGeo)) ; @@ -1020,7 +1020,7 @@ ImportDxf::ReadLine( bool& bFileEnd) // inserisco la linea nel DB geometrico // creo la linea PtrOwner pCrvLine( CreateCurveLine()) ; - if ( ! IsValid( pCrvLine)) + if ( IsNull( pCrvLine)) return false ; // setto la linea if ( ! pCrvLine->Set( ptStart, ptEnd)) @@ -1108,7 +1108,7 @@ ImportDxf::ReadRayXline( bool bIsRay, bool& bFileEnd) // inserisco la linea nel DB geometrico // creo la linea PtrOwner pCrvLine( CreateCurveLine()) ; - if ( ! IsValid( pCrvLine)) + if ( IsNull( pCrvLine)) return false ; // setto la linea Point3d ptStart = ptRef ; @@ -1235,7 +1235,7 @@ ImportDxf::ReadLwPolyLine( bool& bFileEnd) PA.ToLoc( m_frGroup) ; // Creo la curva composita PtrOwner pCrvCompo( CreateCurveComposite()) ; - if ( ! IsValid( pCrvCompo)) + if ( IsNull( pCrvCompo)) return false ; // Inserisco i punti con bulge nella curva composita come linee e archi if ( ! pCrvCompo->FromPolyArc( PA)) @@ -1328,7 +1328,7 @@ ImportDxf::ReadPoint( bool& bFileEnd) if ( fabs( dThick) < EPS_SMALL) { // creo il punto PtrOwner pGeoPnt( CreateGeoPoint3d()) ; - if ( ! IsValid( pGeoPnt)) + if ( IsNull( pGeoPnt)) return false ; // setto il punto if ( ! pGeoPnt->Set( ptP)) @@ -1339,7 +1339,7 @@ ImportDxf::ReadPoint( bool& bFileEnd) else { // creo il vettore con punto base PtrOwner pGeoVect( CreateGeoVector3d()) ; - if ( ! IsValid( pGeoVect)) + if ( IsNull( pGeoVect)) return false ; // setto il punto if ( ! pGeoVect->Set( dThick * vtExtr, ptP)) @@ -1513,7 +1513,7 @@ ImportDxf::CompletePolyLine( const string& sLayer, int nColor, int nFlag, bool b PA.ToLoc( m_frGroup) ; // Creo la curva composita PtrOwner pCrvCompo( CreateCurveComposite()) ; - if ( ! IsValid( pCrvCompo)) + if ( IsNull( pCrvCompo)) return false ; // Inserisco i punti con bulge nella curva composita come linee e archi if ( ! pCrvCompo->FromPolyArc( PA)) @@ -1576,7 +1576,7 @@ ImportDxf::CompletePolygonMesh( const string& sLayer, int nColor, int nFlag, boo { // creo la superficie PtrOwner pSTM( CreateSurfTriMesh()) ; - if ( ! IsValid( pSTM)) + if ( IsNull( pSTM)) return false ; // la inizializzo int nNumVert = nNumVertM * nNumVertN ; @@ -1728,7 +1728,7 @@ ImportDxf::CompletePolyfaceMesh( const string& sLayer, int nColor, int nFlag, bo { // creo la superficie PtrOwner pSTM( CreateSurfTriMesh()) ; - if ( ! IsValid( pSTM)) + if ( IsNull( pSTM)) return false ; // la inizializzo if ( ! pSTM->Init( 3, 1)) @@ -2009,7 +2009,7 @@ ImportDxf::ReadSolid( bool& bFileEnd) // inserisco la faccia nel DB geometrico // creo la trimesh PtrOwner pSTM( CreateSurfTriMesh()) ; - if ( ! IsValid( pSTM)) + if ( IsNull( pSTM)) return false ; // costruisco la geometria della trimesh if ( ! pSTM->Init( 4, 2)) @@ -2177,7 +2177,7 @@ ImportDxf::ReadSpline( bool& bFileEnd) crvByInterp.AddPoint( vIntPnt[i]) ; crvByInterp.End() ; PtrOwner pCrv( crvByInterp.GetCurve( CurveByInterp::BESSEL, CurveByInterp::CUBIC_BEZIERS)) ; - if ( ! ::IsValid( pCrv)) + if ( IsNull( pCrv)) return false ; // Inserisco la curva nel DB int nId = m_pGDB->AddGeoObj( GDB_ID_NULL, GetGroupId( sLayer), Release( pCrv)) ; @@ -2214,11 +2214,13 @@ ImportDxf::ReadSpline( bool& bFileEnd) if ( ! NurbsCurveCanonicalize( cnData)) return false ; // creo la curva equivalente alla Nurbs - ICurve* pCrv = NurbsToBezierCurve( cnData) ; - if ( pCrv == nullptr) + PtrOwner pCrv( NurbsToBezierCurve( cnData)) ; + if ( IsNull( pCrv)) return false ; + if ( ! pCrv->IsValid()) + return true ; // Inserisco la curva composita nel DB - int nId = m_pGDB->AddGeoObj( GDB_ID_NULL, GetGroupId( sLayer), pCrv) ; + int nId = m_pGDB->AddGeoObj( GDB_ID_NULL, GetGroupId( sLayer), Release( pCrv)) ; if ( nId == GDB_ID_NULL) return false ; // eventuale assegnazione del colore @@ -2344,7 +2346,7 @@ ImportDxf::ReadText( int nGroupId, bool& bFileEnd) // inserisco il testo nel DB geometrico // creo il testo PtrOwner pTXT( CreateExtText()) ; - if ( ! IsValid( pTXT)) + if ( IsNull( pTXT)) return false ; // setto il testo if ( ! pTXT->Set( sText, ptP, vtExtr, vtDir, sFont, 400, false, dH, dRat, 0, ETXT_IPBL)) @@ -2549,7 +2551,7 @@ ImportDxf::ReadMText( bool& bFileEnd) // inserisco il testo nel DB geometrico // creo il testo PtrOwner pTXT( CreateExtText()) ; - if ( ! IsValid( pTXT)) + if ( IsNull( pTXT)) return false ; // setto il testo if ( ! pTXT->Set( sText, ptP, vtExtr, vtDirG, sFont, 400, false, dH, dRatStyle, 0, nInsPos))