diff --git a/EXE_GdbModifySurf.cpp b/EXE_GdbModifySurf.cpp index d82ad1b..fc1dd40 100644 --- a/EXE_GdbModifySurf.cpp +++ b/EXE_GdbModifySurf.cpp @@ -25,6 +25,7 @@ #include "/EgtDev/Include/EGkSurfFlatRegion.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkSurfLocal.h" +#include "/EgtDev/Include/EGkStmFromTriangleSoup.h" #include "/EgtDev/Include/EGkCAvSimpleSurfFrMove.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EgtPointerOwner.h" @@ -63,7 +64,7 @@ ExeInvertSurface( const INTVECTOR& vIds) //------------------------------------------------------------------------------- static int -MyExplodeSurfTriMesh( int nId, int* pnCount) +MyExplodeSurfTriMesh( int nId, int& nCount) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) @@ -76,7 +77,7 @@ MyExplodeSurfTriMesh( int nId, int* pnCount) // se ci sono più parti, separo queste if ( nParts > 1) { int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; + nCount = 0 ; for ( int i = 0 ; i < nParts ; ++ i) { ISurfTriMesh* pFac = pStm->ClonePart( i) ; if ( pFac == nullptr) @@ -96,8 +97,6 @@ MyExplodeSurfTriMesh( int nId, int* pnCount) // elimino la superficie originale pGeomDB->Erase( nId) ; // restituisco risultati - if ( pnCount != nullptr) - *pnCount = nCount ; return nFirstId ; } // recupero il numero di facce @@ -106,7 +105,7 @@ MyExplodeSurfTriMesh( int nId, int* pnCount) if ( nFacets > 1) { // copio tutte le facce int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; + nCount = 0 ; for ( int i = 0 ; i < nFacets ; ++ i) { ISurfTriMesh* pFac = pStm->CloneFacet( i) ; if ( pFac == nullptr) @@ -126,19 +125,16 @@ MyExplodeSurfTriMesh( int nId, int* pnCount) // elimino la superficie originale pGeomDB->Erase( nId) ; // restituisco risultati - if ( pnCount != nullptr) - *pnCount = nCount ; return nFirstId ; } // non devo fare alcunché - if ( pnCount != nullptr) - *pnCount = 1 ; + nCount = 1 ; return nId ; } //------------------------------------------------------------------------------- static int -MyExplodeSurfFlatRegion( int nId, int* pnCount) +MyExplodeSurfFlatRegion( int nId, int& nCount) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) @@ -150,13 +146,12 @@ MyExplodeSurfFlatRegion( int nId, int* pnCount) int nChunk = pSfr->GetChunkCount() ; // se c'è un solo componente, non devo fare alcunché if ( nChunk == 1) { - if ( pnCount != nullptr) - *pnCount = 1 ; + nCount = 1 ; return nId ; } // copio tutti i componenti connessi (chunk) int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; + nCount = 0 ; for ( int i = 0 ; i < nChunk ; ++ i) { ISurfFlatRegion* pChk = pSfr->CloneChunk( i) ; if ( pChk == nullptr) @@ -176,8 +171,6 @@ MyExplodeSurfFlatRegion( int nId, int* pnCount) // elimino la superficie pGeomDB->Erase( nId) ; // restituisco risultati - if ( pnCount != nullptr) - *pnCount = nCount ; return nFirstId ; } @@ -192,10 +185,10 @@ ExeExplodeSurface( int nId, int* pnCount) int nCount = 0 ; switch ( pGeomDB->GetGeoType( nId)) { case SRF_TRIMESH : - nFirstId = MyExplodeSurfTriMesh( nId, &nCount) ; + nFirstId = MyExplodeSurfTriMesh( nId, nCount) ; break ; case SRF_FLATRGN : - nFirstId = MyExplodeSurfFlatRegion( nId, &nCount) ; + nFirstId = MyExplodeSurfFlatRegion( nId, nCount) ; break ; } ExeSetModified() ; @@ -845,3 +838,96 @@ ExeSurfTmIntersect( int nId1, int nId2) } return bOk ; } + +//---------------------------------------------------------------------------- +static ISurfTriMesh* +MyCreateSubSurfTm( const ISurfTriMesh* pStm, const INTVECTOR& vTria) +{ + StmFromTriangleSoup StmFts ; + if ( ! StmFts.Start()) + return nullptr ; + for ( int nT : vTria) { + Triangle3d Tria ; + if ( ! pStm->GetTriangle( nT, Tria) || + ! StmFts.AddTriangle( Tria)) + return nullptr ; + } + // valido la superficie e calcolo le adiacenze + if ( ! StmFts.End()) + return nullptr ; + // restituisco la superficie + return StmFts.GetSurf() ; +} + +//---------------------------------------------------------------------------- +static int +MySurfTmSplit( int nId, int nSplitterId, int& nCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh da dividere in parti + ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + if ( pStm == nullptr) + return GDB_ID_NULL ; + // recupero il riferimento della superficie + Frame3d frSurf ; + if ( ! pGeomDB->GetGlobFrame( nId, frSurf)) + return GDB_ID_NULL ; + // recupero la superficie TriMesh divisore in locale alla prima + SurfLocal SurfCLoc( pGeomDB, nSplitterId, frSurf) ; + const ISurfTriMesh* pStmCLoc = GetSurfTriMesh( SurfCLoc) ; + if ( pStmCLoc == nullptr) + return GDB_ID_NULL ; + // eseguo la classificazione + INTVECTOR vTriaIn, vTriaOut, vTriaOnP, vTriaOnM, vTriaIndef ; + if ( ! pStm->GetSurfClassification( *pStmCLoc, vTriaIn, vTriaOut, vTriaOnP, vTriaOnM, vTriaIndef)) + return GDB_ID_NULL ; + // costruisco le diverse superfici + PtrOwner pStmIn( MyCreateSubSurfTm( pStm, vTriaIn)) ; + PtrOwner pStmOut( MyCreateSubSurfTm( pStm, vTriaOut)) ; + PtrOwner pStmOnP( MyCreateSubSurfTm( pStm, vTriaOnP)) ; + PtrOwner pStmOnM( MyCreateSubSurfTm( pStm, vTriaOnM)) ; + PtrOwner pStmIndef( MyCreateSubSurfTm( pStm, vTriaIndef)) ; + if ( IsNull( pStmIn) || IsNull( pStmOut) || IsNull( pStmOnP) || IsNull( pStmOnM) || IsNull( pStmIndef)) + return GDB_ID_NULL ; + // le inserisco nel DB geometrico + int nStmIn = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmIn)) ; + int nStmOut = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmOut)) ; + int nStmOnP = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmOnP)) ; + int nStmOnM = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmOnM)) ; + int nStmIndef = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmIndef)) ; + // se tutto ok + if ( nStmIn != GDB_ID_NULL && nStmOut != GDB_ID_NULL && nStmOnP != GDB_ID_NULL && nStmOnM != GDB_ID_NULL && nStmIndef != GDB_ID_NULL) { + pGeomDB->Erase( nId) ; + nCount = 5 ; + return nStmIn ; + } + else { + pGeomDB->Erase( nStmIn) ; + pGeomDB->Erase( nStmOut) ; + pGeomDB->Erase( nStmOnP) ; + pGeomDB->Erase( nStmOnM) ; + pGeomDB->Erase( nStmIndef) ; + nCount = 0 ; + return GDB_ID_NULL ; + } +} + +//---------------------------------------------------------------------------- +int +ExeSurfTmSplit( int nId, int nSplitterId, int* pnCount) +{ + int nCount ; + int nFirstId = MySurfTmSplit( nId, nSplitterId, nCount) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtSurfTmSplit(" + ToString( nId) + "," + + ToString( nSplitterId) + ")" + + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} diff --git a/EgtExecutor.rc b/EgtExecutor.rc index add0c1c..81a1b11 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GdbModifySurf.cpp b/LUA_GdbModifySurf.cpp index 4ed44fe..ec339fb 100644 --- a/LUA_GdbModifySurf.cpp +++ b/LUA_GdbModifySurf.cpp @@ -448,6 +448,27 @@ LuaSurfTmIntersect( lua_State* L) return 1 ; } +//------------------------------------------------------------------------------- +static int +LuaSurfTmSplit( lua_State* L) +{ + // 2 parametro : nId, nSplitterId + int nId ; + LuaCheckParam( L, 1, nId) + int nSplitterId ; + LuaCheckParam( L, 2, nSplitterId) + LuaClearStack( L) ; + // divido la prima superficie in base alla seconda + int nCount ; + int nFirstId = ExeSurfTmSplit( nId, nSplitterId, &nCount) ; + if ( nFirstId != GDB_ID_NULL) + LuaSetParam( L, nFirstId) ; + else + LuaSetParam( L) ; + LuaSetParam( L, nCount) ; + return 2 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbModifySurf( LuaMgr& luaMgr) @@ -474,5 +495,6 @@ LuaInstallGdbModifySurf( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmAdd", LuaSurfTmAdd) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmSubtract", LuaSurfTmSubtract) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmIntersect", LuaSurfTmIntersect) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmSplit", LuaSurfTmSplit) ; return bOk ; }