EgtExch3dm :

- corretto un errore di esportazione delle superfici di bezier.
- aggiunta la possibilità di eliminare il layer rimasti vuoti durante
l'esportazione.
- aggiunte le facce composte nelle Mesh di un 3dm
- corretta gestione dell'orientazione delle superfici importate
- corretta l'importazione delle curve di trim delle superfici di
rivoluzione ( spazio param diverso da quello della nurbs corrispondente)
- resa più robusta la conversione dei BrepLoop in caso di curve compo
composte da tratti molto corti.
This commit is contained in:
Daniele Bariletti
2023-11-27 12:47:44 +01:00
parent 9ebdf4a8b3
commit 87fec5a111
4 changed files with 222 additions and 57 deletions
+46 -10
View File
@@ -115,10 +115,11 @@ Export3dm::Export( IGeomDB* pGDB, int nId, const string& sFile)
return false ;
pIter->GoTo( nId) ;
// esporto l'oggetto e i suoi eventuali figli
bool bOk = ExportObject( *pIter, 0) ;
bool bAdded = false ;
bool bOk = ExportObject( *pIter, 0, bAdded) ;
// stampo il file
int version = 7 ;
int version = 8 ;
// errors printed to stdout
ON_TextLog error_log ;
// writes model to archive
@@ -131,7 +132,7 @@ Export3dm::Export( IGeomDB* pGDB, int nId, const string& sFile)
//----------------------------------------------------------------------------
bool
Export3dm::ExportObject( const IGdbIterator& iIter, const int& nLayer)
Export3dm::ExportObject( const IGdbIterator& iIter, const int& nLayer, bool& bAdded)
{
// recupero il livello dell'oggetto
int nLev = GDB_LV_USER ;
@@ -164,36 +165,50 @@ Export3dm::ExportObject( const IGdbIterator& iIter, const int& nLayer)
case GEO_PNT3D: {
if ( ! ExportPnt( sName, iIter, frFrame, cCol, nLayer))
return false ;
else
bAdded = true ;
break ;
}
case SRF_BEZIER: {
if ( ! ExportSrfBz( sName, iIter, frFrame, cCol, nLayer))
return false ;
else
bAdded = true ;
break ;
}
case SRF_FLATRGN :
case SRF_TRIMESH :
if ( ! ExportSTM( sName, iIter, frFrame, cCol, nLayer))
return false ;
else
bAdded = true ;
break ;
case CRV_ARC : {
if ( ! ExportCrvArc( sName, iIter, frFrame, cCol, nLayer))
return false ;
else
bAdded = true ;
break ;
}
case CRV_BEZIER : {
if ( ! ExportCrvBezier( sName, iIter, frFrame, cCol, nLayer))
return false ;
else
bAdded = true ;
break ;
}
case CRV_COMPO : {
if ( ! ExportCrvCompo( sName, iIter, frFrame, cCol, nLayer))
return false ;
else
bAdded = true ;
break ;
}
case CRV_LINE : {
if ( ! ExportCrvLine( sName, iIter, frFrame, cCol, nLayer))
return false ;
else
bAdded = true ;
break ;
}
default :
@@ -205,7 +220,8 @@ Export3dm::ExportObject( const IGdbIterator& iIter, const int& nLayer)
int nLayer = iIter.GetId() ;
if ( nLayer == 0) {
m_model.RemoveModelComponent( ON_ModelComponent::Type::Layer, m_model.LayerFromIndex( 0).ModelComponentId()) ;
return ScanGroup( iIter, nLayer) ;
bool bEmpty = false ;
return ScanGroup( iIter, nLayer, bEmpty) ;
}
// creo il layer e setto le proprietà
ON_Layer* layer = new ON_Layer() ;
@@ -236,11 +252,19 @@ Export3dm::ExportObject( const IGdbIterator& iIter, const int& nLayer)
// aggiungo il layer
ON_ModelComponentReference mcr = m_model.AddManagedModelComponent( layer) ;
ON_UUID uuid = mcr.ModelComponentId() ;
int nIndex = mcr.ModelComponentIndex() ;
m_mLayer.insert( pair< int, int>( nLayer, nIndex)) ;
// esploro il gruppo
return ScanGroup( iIter, nIndex) ;
bool bEmpty = false ;
bool bOk = ScanGroup( iIter, nIndex, bEmpty) ;
if ( bEmpty)
;
//m_model.RemoveModelComponent( ON_ModelComponent::Type::Layer, uuid) ; // se si volessero cancellare i layer vuoti
else
bAdded = true ;
return bOk ;
}
default :
return false ;
@@ -434,10 +458,10 @@ Export3dm::ExportSrfBz( const string& sName, const IGdbIterator& iIter, const Fr
// imposto il vettore dei nodi in V
int nKnotCountV = nDegV + nCPV - 1 ;
dKnot = 0 ;
// per costruzione nKnotCount é un multiplo di nDegU
// per costruzione nKnotCount é un multiplo di nDegV
for ( int v = 0 ; v < int ( nKnotCountV / nDegV) ; ++v) {
for ( int p = 0 ; p < nDegV ; ++p)
onNurbsSurf->SetKnot( 0, v * nDegV + p, dKnot) ;
onNurbsSurf->SetKnot( 1, v * nDegV + p, dKnot) ;
++dKnot ;
}
// aggiungo l'oggetto al modello
@@ -482,6 +506,11 @@ Export3dm::ExportSTM( const string& sName, const IGdbIterator& iIter, const Fram
int nIdVert[3] ; pSrfTm->GetTriangle( t, nIdVert) ;
onMesh->SetTriangle( t, nIdVert[0], nIdVert[1], nIdVert[2]) ;
}
ON_MeshVertexFaceMap onMeshVertMap ;
onMeshVertMap.SetFromMesh( onMesh, false) ;
onMesh->AddPlanarNgons( onMeshVertMap.VertexFaceMap(), 0.1, 3, 1, true) ;
onMesh->ComputeFaceNormals() ;
onMesh->Compact() ;
// aggiungo l'oggetto al modello
return AddObjectToModel( iIter, onMesh, nLayer, sName, cCol) ;
}
@@ -689,7 +718,7 @@ Export3dm::ExportCrvLine( const string& sName, const IGdbIterator& iIter, const
//----------------------------------------------------------------------------
bool
Export3dm::ScanGroup( const IGdbIterator& iIter, const int& nLayer)
Export3dm::ScanGroup( const IGdbIterator& iIter, const int& nLayer, bool& bEmpty)
{
// creo un iteratore
PtrOwner<IGdbIterator> pIter( CreateGdbIterator( iIter.GetGDB())) ;
@@ -697,12 +726,19 @@ Export3dm::ScanGroup( const IGdbIterator& iIter, const int& nLayer)
return false ;
// scandisco il gruppo
bool bOk = true ;
int nCount = 0 ;
for ( bool bNext = pIter->GoToFirstInGroup( iIter) ;
bNext ;
bNext = pIter->GoToNext()) {
if ( ! ExportObject( *pIter, nLayer))
bool bAdded = false ;
if ( ! ExportObject( *pIter, nLayer, bAdded))
bOk = false ;
else if ( bAdded)
++ nCount ;
}
if ( nCount == 0)
bEmpty = true ;
return bOk ;
}