From de36914af3a099bec866ee01f0940be6405ad43a Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 3 Jan 2019 08:01:59 +0000 Subject: [PATCH] EgtExecutor : - esplosione SurfTriMesh innanzitutto come parti connesse. --- EXE_GdbModifySurf.cpp | 88 +++++++++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/EXE_GdbModifySurf.cpp b/EXE_GdbModifySurf.cpp index 7ae2864..aa22f54 100644 --- a/EXE_GdbModifySurf.cpp +++ b/EXE_GdbModifySurf.cpp @@ -70,39 +70,69 @@ MyExplodeSurfTriMesh( int nId, int* pnCount) const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; if ( pStm == nullptr) return GDB_ID_NULL ; - // recupero il numero di facce - int nFacet = pStm->GetFacetCount() ; - // se c'è una sola faccia, non devo fare alcunché - if ( nFacet == 1) { + // recupero il numero di componenti connesse + int nParts = pStm->GetPartCount() ; + // se ci sono più parti, separo queste + if ( nParts > 1) { + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( int i = 0 ; i < nParts ; ++ i) { + ISurfTriMesh* pFac = pStm->ClonePart( i) ; + if ( pFac == nullptr) + continue ; + // inserisco la superficie nello stesso gruppo e nello stesso posto del GeomDB + int nNewId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, pFac) ; + if ( nNewId == GDB_ID_NULL) + return GDB_ID_NULL ; + // copio gli attributi + if ( ! pGeomDB->CopyAttributes( nId, nNewId)) + return GDB_ID_NULL ; + // aggiorno contatori + if ( nFirstId == GDB_ID_NULL) + nFirstId = nNewId ; + ++ nCount ; + } + // elimino la superficie originale + pGeomDB->Erase( nId) ; + // restituisco risultati if ( pnCount != nullptr) - *pnCount = 1 ; - return nId ; + *pnCount = nCount ; + return nFirstId ; } - // copio tutte le facce - int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; - for ( int i = 0 ; i < nFacet ; ++ i) { - ISurfTriMesh* pFac = pStm->CloneFacet( i) ; - if ( pFac == nullptr) - continue ; - // inserisco la superficie nello stesso gruppo e nello stesso posto del GeomDB - int nFacId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, pFac) ; - if ( nFacId == GDB_ID_NULL) - return GDB_ID_NULL ; - // copio gli attributi - if ( ! pGeomDB->CopyAttributes( nId, nFacId)) - return GDB_ID_NULL ; - // aggiorno contatori - if ( nFirstId == GDB_ID_NULL) - nFirstId = nFacId ; - ++ nCount ; + // recupero il numero di facce + int nFacets = pStm->GetFacetCount() ; + // se ci sono più facce, separo queste + if ( nFacets > 1) { + // copio tutte le facce + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( int i = 0 ; i < nFacets ; ++ i) { + ISurfTriMesh* pFac = pStm->CloneFacet( i) ; + if ( pFac == nullptr) + continue ; + // inserisco la superficie nello stesso gruppo e nello stesso posto del GeomDB + int nNewId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, pFac) ; + if ( nNewId == GDB_ID_NULL) + return GDB_ID_NULL ; + // copio gli attributi + if ( ! pGeomDB->CopyAttributes( nId, nNewId)) + return GDB_ID_NULL ; + // aggiorno contatori + if ( nFirstId == GDB_ID_NULL) + nFirstId = nNewId ; + ++ nCount ; + } + // elimino la superficie originale + pGeomDB->Erase( nId) ; + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; } - // elimino la superficie originale - pGeomDB->Erase( nId) ; - // restituisco risultati + // non devo fare alcunché if ( pnCount != nullptr) - *pnCount = nCount ; - return nFirstId ; + *pnCount = 1 ; + return nId ; } //-------------------------------------------------------------------------------