EgtExecutor 2.2i5 :

- migliorata ExeCreateOutRegion rettangolare per Nesting manuale
- aggiunta funzione Exe e Lua SurfTmCut.
This commit is contained in:
Dario Sassi
2020-09-27 17:14:12 +00:00
parent 3f724959a8
commit 311ed3e327
4 changed files with 113 additions and 14 deletions
+78 -1
View File
@@ -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<ISurfTriMesh> 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 ;
}