diff --git a/EXE_GdbGetSurf.cpp b/EXE_GdbGetSurf.cpp index 4451afe..ea2bb9f 100644 --- a/EXE_GdbGetSurf.cpp +++ b/EXE_GdbGetSurf.cpp @@ -29,6 +29,7 @@ #include "/EgtDev/Include/EGkSurfFlatRegion.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkSurfBezier.h" +#include "/EgtDev/Include/EGkDistPointSurfFr.h" #include "/EgtDev/Include/EGkDistPointSurfTm.h" #include "/EgtDev/Include/EGkIntersCurves.h" #include "/EgtDev/Include/EGkIntersLineBox.h" @@ -119,17 +120,19 @@ bool ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) { IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + VERIFY_GEOMDB( pGeomDB, false) // recupero la prima superficie FlatRegion - ISurfFlatRegion* pSfr1 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId1)) ; + const ISurfFlatRegion* pSfr1 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId1)) ; if ( pSfr1 == nullptr) return false ; // se richiesta distanza di sicurezza, ne faccio l'offset - PtrOwner pSfr1O( pSfr1->Clone()) ; - if ( IsNull( pSfr1O)) - return false ; - if ( dMinDist > 10 * EPS_SMALL) - pSfr1O->Offset( dMinDist, ICurve::OFF_FILLET) ; + PtrOwner pSfr1O ; + if ( abs( dMinDist) > 5 * EPS_SMALL) { + pSfr1O.Set( pSfr1->Clone()) ; + if ( IsNull( pSfr1O) || ! pSfr1O->Offset( dMinDist, ICurve::OFF_FILLET)) + return false ; + pSfr1 = Get( pSfr1O) ; + } // recupero il riferimento della superficie Frame3d frSurf1 ; if ( ! pGeomDB->GetGlobFrame( nId1, frSurf1)) @@ -144,9 +147,9 @@ ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) if ( pSfr2L == nullptr) return false ; // eseguo il test di intersezione tra le due regioni - for ( int i = 0 ; i < pSfr1O->GetChunkCount() ; ++ i) { + for ( int i = 0 ; i < pSfr1->GetChunkCount() ; ++ i) { for ( int j = 0 ; j < pSfr2L->GetChunkCount() ; ++ j) { - if ( pSfr1O->GetChunkSimpleClassification( i, *pSfr2L, j) != REGC_OUT) + if ( pSfr1->GetChunkSimpleClassification( i, *pSfr2L, j) != REGC_OUT) return false ; } } @@ -160,8 +163,8 @@ ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) if ( pCrv2L == nullptr) return false ; // eseguo il test di intersezione tra regione e curva - for ( int i = 0 ; i < pSfr1O->GetChunkCount() ; ++ i) { - PtrOwner pCrv1( pSfr1O->GetLoop( i, 0)) ; + for ( int i = 0 ; i < pSfr1->GetChunkCount() ; ++ i) { + PtrOwner pCrv1( pSfr1->GetLoop( i, 0)) ; if ( pCrv1 == nullptr) return false ; IntersCurveCurve ccInt( *pCrv1, *pCrv2L) ; @@ -169,7 +172,8 @@ ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) if ( ! ccInt.GetCurveClassification( 1, EPS_SMALL, vcClass) || vcClass.empty()) return false ; for ( auto& cClass : vcClass) { - if ( cClass.nClass == CRVC_IN || cClass.nClass == CRVC_NULL) + if ( cClass.nClass == CRVC_IN || cClass.nClass == CRVC_ON_M || + cClass.nClass == CRVC_ON_P || cClass.nClass == CRVC_NULL) return false ; } } @@ -179,34 +183,17 @@ ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) else if ( nType2 == GEO_PNT3D) { // recupero il punto IGeoPoint3d* pGeoPt = GetGeoPoint3d( pGeomDB->GetGeoObj( nId2)) ; - Point3d pt = pGeoPt->GetPoint() ; + Point3d ptP = pGeoPt->GetPoint() ; // porto il punto in locale Frame3d frPt ; if ( ! pGeomDB->GetGlobFrame( nId2, frPt)) return false ; - pt.LocToLoc( frPt, frSurf1) ; - - for ( int i = 0 ; i < pSfr1O->GetChunkCount() ; i ++) { - // verifico se è contenuto nel loop esterno - PtrOwner pCrv( pSfr1O->GetLoop( i, 0)) ; - PolyLine PL ; - pCrv->ApproxWithLines( 10 * EPS_SMALL, 15, ICurve::APL_STD, PL) ; - if ( IsPointInsidePolyLine( pt, PL, EPS_SMALL)) { - bool bInsideHole = false ; - // verifico se è contenuto in un loop interno - for ( int j = 1 ; j < pSfr1O->GetLoopCount( i) ; j ++) { - PtrOwner pCrv( pSfr1O->GetLoop( i, j)) ; - pCrv->ApproxWithLines( 10 * EPS_SMALL, 15, ICurve::APL_STD, PL) ; - PL.Invert() ; - if ( IsPointInsidePolyLine( pt, PL, EPS_SMALL)) - bInsideHole = true ; - } - // se è contenuto nel loop esterno ma non è contenuto in nessuno dei loop interni allora il punto è interno - if ( ! bInsideHole) - return false ; - } - } - return true ; + ptP.LocToLoc( frPt, frSurf1) ; + // determino se interno (comprende la frontiera) + bool bInside ; + if ( ! IsPointInsideSurfFr( ptP, pSfr1, 0, bInside)) + return false ; + return ( ! bInside) ; } // altrimenti non valida else diff --git a/EXE_GdbModifySurf.cpp b/EXE_GdbModifySurf.cpp index 4e4d3cf..4bbbc5f 100644 --- a/EXE_GdbModifySurf.cpp +++ b/EXE_GdbModifySurf.cpp @@ -324,7 +324,7 @@ ExeSurfFrSubtract( int nId1, int nId2) // eseguo la sottrazione della seconda superficie dalla prima bOk = bOk && pSfr1->Subtract( *pSfr2L) ; // se il risultato è vuoto, cancello la FlatRegion - if ( bOk && ! pSfr1->IsValid()) + if ( bOk && ! pSfr1->IsValid()) pGeomDB->Erase( nId1) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente @@ -356,7 +356,7 @@ ExeSurfFrIntersect( int nId1, int nId2) // eseguo l'intersezione tra le due superfici bOk = bOk && pSfr1->Intersect( *pSfr2L) ; // se il risultato è vuoto, cancello la FlatRegion - if ( bOk && ! pSfr1->IsValid()) + if ( bOk && ! pSfr1->IsValid()) pGeomDB->Erase( nId1) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente @@ -381,7 +381,7 @@ ExeSurfFrOffset( int nId, double dDist, int nType) // eseguo l'offset bOk = bOk && pSfr->Offset( dDist, nType) ; // se il risultato è vuoto, cancello la FlatRegion - if ( bOk && ! pSfr->IsValid()) + if ( bOk && ! pSfr->IsValid()) pGeomDB->Erase( nId) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente @@ -400,7 +400,7 @@ bool ExeSurfFrOffsetAdv( int nId, double dDist, int nType, int& nNewId) { IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + VERIFY_GEOMDB( pGeomDB, false) // recupero la superficie FlatRegion ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId)) ; if ( pSfr == nullptr) @@ -421,6 +421,32 @@ ExeSurfFrOffsetAdv( int nId, double dDist, int nType, int& nNewId) return true ; } +//---------------------------------------------------------------------------- +bool +ExeSurfFrEraseChunk( int nId, int nChunk) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la superficie FlatRegion + ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId)) ; + if ( pSfr == nullptr) + return false ; + // elimino il chunk indicato + bool bOk = pSfr->EraseChunk( nChunk) ; + // se il risultato è vuoto, cancello la FlatRegion + if ( bOk && ! pSfr->IsValid()) + pGeomDB->Erase( nId) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtSurfFrEraseChunk(" + ToString( nId) + "," + + ToString( nChunk) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; +} + //---------------------------------------------------------------------------- bool ExeSurfFrMoveSimpleNoCollision( int nId1, int nId2, const Vector3d& vtDir, double& dLen, int nRefType) diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 983c7e1..758211a 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GdbModifySurf.cpp b/LUA_GdbModifySurf.cpp index 34802cd..fd7c10e 100644 --- a/LUA_GdbModifySurf.cpp +++ b/LUA_GdbModifySurf.cpp @@ -165,6 +165,24 @@ LuaSurfFrOffsetAdv( lua_State* L) return 1 ; } +//------------------------------------------------------------------------------- +static int +LuaSurfFrEraseChunk( lua_State* L) +{ + // 2 parametri : Id, nChunk + int nId ; + LuaCheckParam( L, 1, nId) + int nChunk ; + LuaCheckParam( L, 2, nChunk) + LuaClearStack( L) ; + // eseguo l'offset della regione + int nNewId = GDB_ID_NULL ; + bool bOk = ExeSurfFrEraseChunk( nId, nChunk) ; + LuaSetParam( L, bOk) ; + + return 1 ; +} + //---------------------------------------------------------------------------- static int LuaSurfTmMoveVertex( lua_State* L) @@ -611,6 +629,7 @@ LuaInstallGdbModifySurf( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrIntersect", LuaSurfFrIntersect) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrOffset", LuaSurfFrOffset) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrOffsetAdv", LuaSurfFrOffsetAdv) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfFrEraseChunk", LuaSurfFrEraseChunk) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmMoveVertex", LuaSurfTmMoveVertex) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmMoveFacet", LuaSurfTmMoveFacet) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmToTriangles", LuaSurfTmToTriangles) ;