diff --git a/EXE_GdbModifySurf.cpp b/EXE_GdbModifySurf.cpp index e9bae67..54215d0 100644 --- a/EXE_GdbModifySurf.cpp +++ b/EXE_GdbModifySurf.cpp @@ -186,7 +186,7 @@ ExeSurfFrAdd( int nId1, int nId2) const ISurfFlatRegion* pSfr2L = pSfr2 ; PtrOwnerpTmp ; if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + pTmp.Set( pSfr2->Clone()) ; bOk = bOk && ! IsNull( pTmp) ; bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; pSfr2L = pTmp ; @@ -226,7 +226,7 @@ ExeSurfFrSubtract( int nId1, int nId2) const ISurfFlatRegion* pSfr2L = pSfr2 ; PtrOwnerpTmp ; if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + pTmp.Set( pSfr2->Clone()) ; bOk = bOk && ! IsNull( pTmp) ; bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; pSfr2L = pTmp ; @@ -269,7 +269,7 @@ ExeSurfFrIntersect( int nId1, int nId2) const ISurfFlatRegion* pSfr2L = pSfr2 ; PtrOwnerpTmp ; if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + pTmp.Set( pSfr2->Clone()) ; bOk = bOk && ! IsNull( pTmp) ; bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; pSfr2L = pTmp ; @@ -390,7 +390,7 @@ ExeSurfFrMoveSimpleNoCollision( int nId1, int nId2, const Vector3d& vtDir, doubl const ISurfFlatRegion* pSfr2L = pSfr2 ; PtrOwnerpTmp ; if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + pTmp.Set( pSfr2->Clone()) ; bOk = bOk && ! IsNull( pTmp) ; bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; pSfr2L = pTmp ; @@ -423,7 +423,7 @@ ExeSurfFrRotateSimpleNoCollision( int nId1, int nId2, const Point3d& ptCen, doub const ISurfFlatRegion* pSfr2L = pSfr2 ; PtrOwnerpTmp ; if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + pTmp.Set( pSfr2->Clone()) ; bOk = bOk && ! IsNull( pTmp) ; bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; pSfr2L = pTmp ; @@ -639,3 +639,37 @@ ExeCopySurfTmFacet( int nId, int nFacet, int nDestGrpId) } return nFacId ; } + +//------------------------------------------------------------------------------- +bool +ExeCutSurfTm( int nId, const Point3d& ptOn, const Vector3d& vtN, bool bSaveOnEq, int nRefType) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh + ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pStm != nullptr) ; + // recupero il riferimento locale + Frame3d frLoc ; + bOk = bOk && pGeomDB->GetGlobFrame( nId, frLoc) ; + // porto in locale il punto e la normale del piano + Point3d ptOnL = GetPointLocal( pGeomDB, ptOn, nRefType, frLoc) ; + Vector3d vtNL = GetVectorLocal( pGeomDB, vtN, nRefType, frLoc) ; + // calcolo il piano di taglio + Plane3d plPlane ; + bOk = bOk && SetPlane( ptOnL, vtNL, plPlane) ; + // eseguo il taglio + bOk = bOk && pStm->Cut( plPlane, bSaveOnEq) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtCutSurfTm(" + ToString( nId) + ",{" + + ToString( ptOn) + "},{" + + ToString( vtN) + "}," + + RefTypeToString( nRefType) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultato + return bOk ; +} diff --git a/EXE_GeoSnap.cpp b/EXE_GeoSnap.cpp index 5562352..200ffb9 100644 --- a/EXE_GeoSnap.cpp +++ b/EXE_GeoSnap.cpp @@ -955,7 +955,7 @@ ExeSurfFrChunkSimpleClassify( int nId1, int nChunk1, int nId2, int nChunk2) const ISurfFlatRegion* pSfr2L = pSfr2 ; PtrOwner pTmp ; if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + pTmp.Set( pSfr2->Clone()) ; bOk = bOk && ! IsNull( pTmp) ; bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; pSfr2L = pTmp ; diff --git a/EXE_NstPartNesting.cpp b/EXE_NstPartNesting.cpp index 62d985d..aa63f90 100644 --- a/EXE_NstPartNesting.cpp +++ b/EXE_NstPartNesting.cpp @@ -1178,7 +1178,7 @@ MySurfFrMoveSimpleNoCollision( int nId1, int nId2, const Vector3d& vtDir, double const ISurfFlatRegion* pSfr2L = pSfr2 ; PtrOwner pTmp ; if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( CloneSurfFlatRegion( pSfr2)) ; + pTmp.Set( pSfr2->Clone()) ; bOk = bOk && ! IsNull( pTmp) ; bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; pSfr2L = pTmp ; diff --git a/EgtExecutor.rc b/EgtExecutor.rc index eb5448d..f4c0b6b 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GdbModifySurf.cpp b/LUA_GdbModifySurf.cpp index 38ca77c..6324516 100644 --- a/LUA_GdbModifySurf.cpp +++ b/LUA_GdbModifySurf.cpp @@ -293,6 +293,29 @@ LuaCopySurfTmFacet( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaCutSurfTm( lua_State* L) +{ + // 4 o 5 parametri : Id, ptOn, vtN, bSaveOnEq [, nRefType] + int nId ; + LuaCheckParam( L, 1, nId) + Point3d ptOn ; + LuaCheckParam( L, 2, ptOn) + Vector3d vtN ; + LuaCheckParam( L, 3, vtN) + bool bSaveOnEq ; + LuaGetParam( L, 4, bSaveOnEq) ; + int nRefType = RTY_DEFAULT ; + LuaGetParam( L, 5, nRefType) ; + LuaClearStack( L) ; + // recupero i contorni della faccetta della superficie + bool bOk = ExeCutSurfTm( nId, ptOn, vtN, bSaveOnEq, nRefType) ; + // restituisco il risultato + LuaSetParam( L, bOk) ; + return 1 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbModifySurf( LuaMgr& luaMgr) @@ -311,5 +334,6 @@ LuaInstallGdbModifySurf( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtGetSurfTmSilhouette", LuaGetSurfTmSilhouette) ; bOk = bOk && luaMgr.RegisterFunction( "EgtExtractSurfTmFacetLoops", LuaExtractSurfTmFacetLoops) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCopySurfTmFacet", LuaCopySurfTmFacet) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtCutSurfTm", LuaCutSurfTm) ; return bOk ; }