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:
+46
-10
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user