diff --git a/EXE_GeoSnap.cpp b/EXE_GeoSnap.cpp index 53633d5..37a3456 100644 --- a/EXE_GeoSnap.cpp +++ b/EXE_GeoSnap.cpp @@ -27,6 +27,7 @@ #include "/EgtDev/Include/EgkSurf.h" #include "/EgtDev/Include/EgkSurfFlatRegion.h" #include "/EgtDev/Include/EgkSurfTriMesh.h" +#include "/EgtDev/Include/EGkSurfLocal.h" #include "/EgtDev/Include/EgkVolZmap.h" #include "/EgtDev/Include/EgkExtText.h" #include "/EgtDev/Include/EgkDistPointCurve.h" @@ -966,6 +967,32 @@ ExeSurfFrChunkSimpleClassify( int nId1, int nChunk1, int nId2, int nChunk2) return nRes ; } +//---------------------------------------------------------------------------- +bool +ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) +{ + 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 in locale alla prima + SurfLocal Surf2Loc( pGeomDB, nId2, frSurf1) ; + const ISurfFlatRegion* pSfr2L = GetSurfFlatRegion( Surf2Loc) ; + bOk = bOk && ( pSfr2L != nullptr) ; + // se richiesta distanza di sicurezza, ne faccio l'offset + PtrOwner pSfr2LO( pSfr2L->Clone()) ; + bOk = bOk && ( ! IsNull( pSfr2LO)) ; + if ( bOk && dMinDist > 10 * EPS_SMALL) + pSfr2LO->Offset( dMinDist, ICurve::OFF_FILLET) ; + // eseguo il test di intersezione tra le due superfici + bOk = bOk && ( pSfr1->GetChunkSimpleClassification( 0, *pSfr2LO, 0) == REGC_OUT) ; + return bOk ; +} + //---------------------------------------------------------------------------- int ExeSurfTmFacetCount( int nId) diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 642acef..380b9e3 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GeoSnap.cpp b/LUA_GeoSnap.cpp index f470135..0a59f17 100644 --- a/LUA_GeoSnap.cpp +++ b/LUA_GeoSnap.cpp @@ -686,6 +686,24 @@ LuaSurfFrChunkSimpleClassify( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaSurfFrTestExternal( lua_State* L) +{ + // 2 o 3 parametri : Id1, Id2 [, dMinDist] + int nId1 ; + LuaCheckParam( L, 1, nId1) + int nId2 ; + LuaCheckParam( L, 2, nId2) + double dMinDist = 0 ; + LuaGetParam( L, 3, dMinDist) ; + LuaClearStack( L) ; + // verifico se le due regioni sono esterne con distanza superiore al minimo + bool bOk = ExeSurfFrTestExternal( nId1, nId2, dMinDist) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + //---------------------------------------------------------------------------- static int LuaSurfTmFacetCount( lua_State* L) @@ -1042,6 +1060,7 @@ LuaInstallGeoSnap( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrGrossArea", LuaSurfFrGrossArea) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrChunkCount", LuaSurfFrChunkCount) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrChunkSimpleClassify", LuaSurfFrChunkSimpleClassify) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrTestExternal", LuaSurfFrTestExternal) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmFacetCount", LuaSurfTmFacetCount) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmFacetAdjacencies", LuaSurfTmFacetAdjacencies) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmFacetNearestEndPoint", LuaSurfTmFacetNearestEndPoint) ;