diff --git a/EXE_GdbModifySurf.cpp b/EXE_GdbModifySurf.cpp index 080e743..c5c1a16 100644 --- a/EXE_GdbModifySurf.cpp +++ b/EXE_GdbModifySurf.cpp @@ -163,6 +163,123 @@ ExeExplodeSurface( int nId, int* pnCount) return nFirstId ; } +//---------------------------------------------------------------------------- +bool +ExeSurfFrAdd( int nId1, int nId2) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la prima superficie FlatRegion + ISurfFlatRegion* pSfr1 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId1)) ; + bool bOk = ( pSfr1 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf1 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId1, frSurf1) ; + // recupero la seconda superficie FlatRegion + const ISurfFlatRegion* pSfr2 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId2)) ; + bOk = bOk && ( pSfr2 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf2 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId2, frSurf2) ; + // se riferimenti diversi, porto una copia della seconda nel riferimento della prima + const ISurfFlatRegion* pSfr2L = pSfr2 ; + PtrOwnerpTmp ; + if ( ! AreSameFrame( frSurf1, frSurf2)) { + pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + bOk = bOk && ! IsNull( pTmp) ; + pSfr2L = Get( pTmp) ; + } + // eseguo l'unione tra le due superfici + bOk = bOk && pSfr1->Add( *pSfr2L) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtSurfFrAdd(" + ToString( nId1) + "," + + ToString( nId2) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +ExeSurfFrSubtract( int nId1, int nId2) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la prima superficie FlatRegion + ISurfFlatRegion* pSfr1 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId1)) ; + bool bOk = ( pSfr1 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf1 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId1, frSurf1) ; + // recupero la seconda superficie FlatRegion + const ISurfFlatRegion* pSfr2 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId2)) ; + bOk = bOk && ( pSfr2 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf2 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId2, frSurf2) ; + // se riferimenti diversi, porto una copia della seconda nel riferimento della prima + const ISurfFlatRegion* pSfr2L = pSfr2 ; + PtrOwnerpTmp ; + if ( ! AreSameFrame( frSurf1, frSurf2)) { + pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + bOk = bOk && ! IsNull( pTmp) ; + pSfr2L = Get( pTmp) ; + } + // eseguo la sottrazione della seconda superficie dalla prima + bOk = bOk && pSfr1->Subtract( *pSfr2L) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtSurfFrSubtract(" + ToString( nId1) + "," + + ToString( nId2) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +ExeSurfFrIntersect( int nId1, int nId2) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la prima superficie FlatRegion + ISurfFlatRegion* pSfr1 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId1)) ; + bool bOk = ( pSfr1 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf1 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId1, frSurf1) ; + // recupero la seconda superficie FlatRegion + const ISurfFlatRegion* pSfr2 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId2)) ; + bOk = bOk && ( pSfr2 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf2 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId2, frSurf2) ; + // se riferimenti diversi, porto una copia della seconda nel riferimento della prima + const ISurfFlatRegion* pSfr2L = pSfr2 ; + PtrOwnerpTmp ; + if ( ! AreSameFrame( frSurf1, frSurf2)) { + pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + bOk = bOk && ! IsNull( pTmp) ; + pSfr2L = Get( pTmp) ; + } + // eseguo l'intersezione tra le due superfici + bOk = bOk && pSfr1->Intersect( *pSfr2L) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtSurfFrIntersect(" + ToString( nId1) + "," + + ToString( nId2) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; +} + //---------------------------------------------------------------------------- int ExeExtractSurfFrChunkLoops( int nId, int nChunk, int nDestGrpId, int* pnCount) @@ -203,7 +320,7 @@ ExeExtractSurfFrChunkLoops( int nId, int nChunk, int nDestGrpId, int* pnCount) ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { - string sLua = "EgtExtractSurfFrChunkLoops(" + ToString( nId) + ",{" + + string sLua = "EgtExtractSurfFrChunkLoops(" + ToString( nId) + "," + ToString( nChunk) + "," + ToString( nDestGrpId) + ")" + " -- Id=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; @@ -257,7 +374,7 @@ ExeExtractSurfTmFacetLoops( int nId, int nFacet, int nDestGrpId, int* pnCount) ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { - string sLua = "EgtExtractSurfTmFacetLoops(" + ToString( nId) + ",{" + + string sLua = "EgtExtractSurfTmFacetLoops(" + ToString( nId) + "," + ToString( nFacet) + "," + ToString( nDestGrpId) + ")" + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; diff --git a/EXE_Nesting.cpp b/EXE_Nesting.cpp index c7233c2..c6593c9 100644 --- a/EXE_Nesting.cpp +++ b/EXE_Nesting.cpp @@ -242,7 +242,7 @@ CreateFlatPartsByRegions( int nLay) // conservo solo le parti interne for ( int k = 0 ; k < int( ccClass.size()) ; ++ k) { if ( ccClass[k].nClass != CRVC_IN) - inCrv.Remove( ccClass[k].dParS, ccClass[k].dParE) ; + inCrv.Subtract( ccClass[k].dParS, ccClass[k].dParE) ; } // tratti di curva rimasti int nNum = inCrv.GetCount() ; @@ -410,7 +410,7 @@ VerifyAndAdjustFlatParts( void) // conservo solo le parti interne for ( int k = 0 ; k < int( ccClass.size()) ; ++ k) { if ( ccClass[k].nClass != CRVC_IN) - inCrv.Remove( ccClass[k].dParS, ccClass[k].dParE) ; + inCrv.Subtract( ccClass[k].dParS, ccClass[k].dParE) ; } } // tratti di curva rimasti diff --git a/EgtExecutor.rc b/EgtExecutor.rc index e663075..36a1933 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GdbModifySurf.cpp b/LUA_GdbModifySurf.cpp index 92a5f4d..76f7623 100644 --- a/LUA_GdbModifySurf.cpp +++ b/LUA_GdbModifySurf.cpp @@ -56,6 +56,54 @@ LuaExplodeSurf( lua_State* L) return 2 ; } +//------------------------------------------------------------------------------- +static int +LuaSurfFrAdd( lua_State* L) +{ + // 2 parametro : Id1, Id2 + int nId1 ; + LuaCheckParam( L, 1, nId1) + int nId2 ; + LuaCheckParam( L, 2, nId2) + LuaClearStack( L) ; + // unisco alla prima regione la seconda + bool bOk = ExeSurfFrAdd( nId1, nId2) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaSurfFrSubtract( lua_State* L) +{ + // 2 parametro : Id1, Id2 + int nId1 ; + LuaCheckParam( L, 1, nId1) + int nId2 ; + LuaCheckParam( L, 2, nId2) + LuaClearStack( L) ; + // sottraggo dalla prima regione la seconda + bool bOk = ExeSurfFrSubtract( nId1, nId2) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaSurfFrIntersect( lua_State* L) +{ + // 2 parametro : Id1, Id2 + int nId1 ; + LuaCheckParam( L, 1, nId1) + int nId2 ; + LuaCheckParam( L, 2, nId2) + LuaClearStack( L) ; + // interseco la prima regione con la seconda + bool bOk = ExeSurfFrIntersect( nId1, nId2) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + //---------------------------------------------------------------------------- static int LuaExtractSurfFrChunkLoops( lua_State* L) @@ -111,6 +159,9 @@ LuaInstallGdbModifySurf( LuaMgr& luaMgr) bool bOk = ( &luaMgr != nullptr) ; bOk = bOk && luaMgr.RegisterFunction( "EgtInvertSurf", LuaInvertSurf) ; bOk = bOk && luaMgr.RegisterFunction( "EgtExplodeSurf", LuaExplodeSurf) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrAdd", LuaSurfFrAdd) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrSubtract", LuaSurfFrSubtract) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrIntersect", LuaSurfFrIntersect) ; bOk = bOk && luaMgr.RegisterFunction( "EgtExtractSurfFrChunkLoops", LuaExtractSurfFrChunkLoops) ; bOk = bOk && luaMgr.RegisterFunction( "EgtExtractSurfTmFacetLoops", LuaExtractSurfTmFacetLoops) ; return bOk ;