From 311ed3e3278aa8812df019f55493c18ae7e51301 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Sun, 27 Sep 2020 17:14:12 +0000 Subject: [PATCH] EgtExecutor 2.2i5 : - migliorata ExeCreateOutRegion rettangolare per Nesting manuale - aggiunta funzione Exe e Lua SurfTmCut. --- EXE_GdbModifySurf.cpp | 79 ++++++++++++++++++++++++++++++++++++++++- EXE_NstPartNesting.cpp | 25 ++++++------- EgtExecutor.rc | Bin 16176 -> 16176 bytes LUA_GdbModifySurf.cpp | 23 +++++++++++- 4 files changed, 113 insertions(+), 14 deletions(-) diff --git a/EXE_GdbModifySurf.cpp b/EXE_GdbModifySurf.cpp index 938c22b..1136f47 100644 --- a/EXE_GdbModifySurf.cpp +++ b/EXE_GdbModifySurf.cpp @@ -631,7 +631,7 @@ ExeSurfTmResetTwoColors( int nId) //---------------------------------------------------------------------------- static ISurfTriMesh* -MyCreateSubSurfTm( const ISurfTriMesh* pStm, const INTVECTOR& vTria) +MyCreateSubSurfTm( const ISurfTriMesh* pStm, const INTVECTOR& vTria, const INTVECTOR& vTria2) { StmFromTriangleSoup StmFts ; if ( ! StmFts.Start()) @@ -642,6 +642,12 @@ MyCreateSubSurfTm( const ISurfTriMesh* pStm, const INTVECTOR& vTria) ! StmFts.AddTriangle( Tria)) return nullptr ; } + for ( int nT : vTria2) { + Triangle3d Tria ; + if ( ! pStm->GetTriangle( nT, Tria) || + ! StmFts.AddTriangle( Tria)) + return nullptr ; + } // valido la superficie e calcolo le adiacenze if ( ! StmFts.End()) return nullptr ; @@ -649,6 +655,14 @@ MyCreateSubSurfTm( const ISurfTriMesh* pStm, const INTVECTOR& vTria) return StmFts.GetSurf() ; } +//---------------------------------------------------------------------------- +static ISurfTriMesh* +MyCreateSubSurfTm( const ISurfTriMesh* pStm, const INTVECTOR& vTria) +{ + INTVECTOR vNull ; + return MyCreateSubSurfTm( pStm, vTria, vNull) ; +} + //---------------------------------------------------------------------------- static int MySurfTmSplit( int nId, int nSplitterId, int& nCount) @@ -721,3 +735,66 @@ ExeSurfTmSplit( int nId, int nSplitterId, int* pnCount) *pnCount = nCount ; return nFirstId ; } + +//---------------------------------------------------------------------------- +static bool +MySurfTmCut( int nId, int nSplitterId, bool bInVsOut, bool bSaveOnEq) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la superficie TriMesh da dividere in parti + ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + if ( pStm == nullptr) + return false ; + // recupero il riferimento della superficie + Frame3d frSurf ; + if ( ! pGeomDB->GetGlobFrame( nId, frSurf)) + return false ; + // recupero la superficie TriMesh divisore in locale alla prima + SurfLocal SurfCLoc( pGeomDB, nSplitterId, frSurf) ; + const ISurfTriMesh* pStmCLoc = GetSurfTriMesh( SurfCLoc) ; + if ( pStmCLoc == nullptr) + return false ; + // eseguo la classificazione + INTVECTOR vTriaIn, vTriaOut, vTriaOnP, vTriaOnM, vTriaIndef ; + if ( ! pStm->GetSurfClassification( *pStmCLoc, vTriaIn, vTriaOut, vTriaOnP, vTriaOnM, vTriaIndef)) + return false ; + // costruisco la nuova superficie + PtrOwner pStmNew ; + if ( bInVsOut) { + if ( bSaveOnEq) + pStmNew.Set( MyCreateSubSurfTm( pStm, vTriaIn, vTriaOnP)) ; + else + pStmNew.Set( MyCreateSubSurfTm( pStm, vTriaIn)) ; + } + else { + if ( bSaveOnEq) + pStmNew.Set( MyCreateSubSurfTm( pStm, vTriaOut, vTriaOnM)) ; + else + pStmNew.Set( MyCreateSubSurfTm( pStm, vTriaOut)) ; + } + if ( IsNull( pStmNew)) + return false ; + // la sostituisco alla superficie originale + if ( ! pGeomDB->ReplaceGeoObj( nId, Release( pStmNew))) + return false ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +ExeSurfTmCut( int nId, int nCutterId, bool bInVsOut, bool bSaveOnEq) +{ + bool bOk = MySurfTmCut( nId, nCutterId, bInVsOut, bSaveOnEq) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtSurfTmCut(" + ToString( nId) + "," + + ToString( nCutterId) + "," + + ToString( bInVsOut) + "," + + ToString( bSaveOnEq) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; +} diff --git a/EXE_NstPartNesting.cpp b/EXE_NstPartNesting.cpp index ee405a2..1ad649f 100644 --- a/EXE_NstPartNesting.cpp +++ b/EXE_NstPartNesting.cpp @@ -87,8 +87,9 @@ ExeCreateOutRegion( int nParentId, double dXmin, double dYmin, double dXmax, dou VERIFY_GEOMDB( pGeomDB, false) // Verifiche sui parametri - if ( dXmax < dXmin + EPS_SMALL || - dYmax < dYmin + EPS_SMALL) + const double GAP = 5 * EPS_SMALL ; + if ( dXmax < dXmin + GAP + 2 * EPS_SMALL || + dYmax < dYmin + GAP + 2 * EPS_SMALL) return false ; // se già esiste, posso uscire @@ -96,21 +97,21 @@ ExeCreateOutRegion( int nParentId, double dXmin, double dYmin, double dXmax, dou if ( nBoxId != GDB_ID_NULL) return true ; + // gap per garantire simile risoluzione tra spazio parametrico e spazio geometrico + double dGap = GAP * max( 1.0, ( 4 * ( dXmax - dXmin) + 4 * ( dYmax - dYmin)) * EPS_PARAM / EPS_SMALL) ; + // creo polilinea attorno al box (avvolta a serpente) - const double DELTA = 1 ; PolyLine PL ; - PL.AddUPoint( 0, Point3d( dXmin, dYmin, dZ)) ; - PL.AddUPoint( 1, Point3d( dXmin, dYmax, dZ)) ; - PL.AddUPoint( 2, Point3d( dXmax, dYmax, dZ)) ; - PL.AddUPoint( 3, Point3d( dXmax, dYmin + DELTA + 2 * EPS_SMALL, dZ)) ; - PL.AddUPoint( 4, Point3d( dXmax + SPESS, dYmin + DELTA + 2 * EPS_SMALL, dZ)) ; - PL.AddUPoint( 5, Point3d( dXmax + SPESS, dYmax + SPESS, dZ)) ; + PL.AddUPoint( 0, Point3d( dXmax, dYmax - dGap, dZ)) ; + PL.AddUPoint( 1, Point3d( dXmax, dYmin, dZ)) ; + PL.AddUPoint( 2, Point3d( dXmin, dYmin, dZ)) ; + PL.AddUPoint( 3, Point3d( dXmin, dYmax, dZ)) ; + PL.AddUPoint( 4, Point3d( dXmax - dGap, dYmax, dZ)) ; + PL.AddUPoint( 5, Point3d( dXmax - dGap + SPESS, dYmax + SPESS, dZ)) ; PL.AddUPoint( 6, Point3d( dXmin - SPESS, dYmax + SPESS, dZ)) ; PL.AddUPoint( 7, Point3d( dXmin - SPESS, dYmin - SPESS, dZ)) ; PL.AddUPoint( 8, Point3d( dXmax + SPESS, dYmin - SPESS, dZ)) ; - PL.AddUPoint( 9, Point3d( dXmax + SPESS, dYmin + DELTA, dZ)) ; - PL.AddUPoint( 10, Point3d( dXmax, dYmin + DELTA, dZ)) ; - PL.AddUPoint( 11, Point3d( dXmax, dYmin, dZ)) ; + PL.AddUPoint( 9, Point3d( dXmax + SPESS, dYmax - dGap + SPESS, dZ)) ; PL.Close() ; // la converto in curva composita PtrOwner pCompo( CreateCurveComposite()) ; diff --git a/EgtExecutor.rc b/EgtExecutor.rc index f69159da224836ccfd80d23d9d06a4ddf16b9f39..2929ded4d6b6e07d18c85972bb79da6cd61c4352 100644 GIT binary patch delta 79 zcmdl`x1nysFE&Qg&A-`PnSqoe*K!sx?>N)s4T4pSrjs4Hk~jAW*?>e(i-FY$N+HxV MD8kglDP58Q0DTV|a{vGU delta 79 zcmdl`x1nysFE&P#&A-`PnSqoe*K!sx?>N)s4T4pSCX*exk~jAW*?>e(i-FY$N+HxV MD8kglDP58Q0DHq5YXATM diff --git a/LUA_GdbModifySurf.cpp b/LUA_GdbModifySurf.cpp index 8a74401..5f1732f 100644 --- a/LUA_GdbModifySurf.cpp +++ b/LUA_GdbModifySurf.cpp @@ -290,7 +290,7 @@ LuaSurfTmResetTwoColors( lua_State* L) static int LuaSurfTmSplit( lua_State* L) { - // 2 parametro : nId, nSplitterId + // 2 parametri : nId, nSplitterId int nId ; LuaCheckParam( L, 1, nId) int nSplitterId ; @@ -307,6 +307,26 @@ LuaSurfTmSplit( lua_State* L) return 2 ; } +//------------------------------------------------------------------------------- +static int +LuaSurfTmCut( lua_State* L) +{ + // 4 parametri : nId, nCutterId, bInVsOut, bOn + int nId ; + LuaCheckParam( L, 1, nId) + int nCutterId ; + LuaCheckParam( L, 2, nCutterId) + bool bInVsOut ; + LuaCheckParam( L, 3, bInVsOut) + bool bOn ; + LuaCheckParam( L, 4, bOn) + LuaClearStack( L) ; + // taglio la prima superficie in base alla seconda + bool bOk = ExeSurfTmCut( nId, nCutterId, bInVsOut, bOn) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbModifySurf( LuaMgr& luaMgr) @@ -328,5 +348,6 @@ LuaInstallGdbModifySurf( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmIntersect", LuaSurfTmIntersect) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmResetTwoColors", LuaSurfTmResetTwoColors) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmSplit", LuaSurfTmSplit) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmCut", LuaSurfTmCut) ; return bOk ; }