EgtExecutor 2.1l3 :

- aggiunta funzione Exe/Lua SurfTmSplit.
This commit is contained in:
Dario Sassi
2019-12-07 11:17:37 +00:00
parent 8c8d6a909d
commit 2ebc04c1e1
3 changed files with 125 additions and 17 deletions
+103 -17
View File
@@ -25,6 +25,7 @@
#include "/EgtDev/Include/EGkSurfFlatRegion.h"
#include "/EgtDev/Include/EGkSurfTriMesh.h"
#include "/EgtDev/Include/EGkSurfLocal.h"
#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
#include "/EgtDev/Include/EGkCAvSimpleSurfFrMove.h"
#include "/EgtDev/Include/EGkStringUtils3d.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
@@ -63,7 +64,7 @@ ExeInvertSurface( const INTVECTOR& vIds)
//-------------------------------------------------------------------------------
static int
MyExplodeSurfTriMesh( int nId, int* pnCount)
MyExplodeSurfTriMesh( int nId, int& nCount)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
@@ -76,7 +77,7 @@ MyExplodeSurfTriMesh( int nId, int* pnCount)
// se ci sono più parti, separo queste
if ( nParts > 1) {
int nFirstId = GDB_ID_NULL ;
int nCount = 0 ;
nCount = 0 ;
for ( int i = 0 ; i < nParts ; ++ i) {
ISurfTriMesh* pFac = pStm->ClonePart( i) ;
if ( pFac == nullptr)
@@ -96,8 +97,6 @@ MyExplodeSurfTriMesh( int nId, int* pnCount)
// elimino la superficie originale
pGeomDB->Erase( nId) ;
// restituisco risultati
if ( pnCount != nullptr)
*pnCount = nCount ;
return nFirstId ;
}
// recupero il numero di facce
@@ -106,7 +105,7 @@ MyExplodeSurfTriMesh( int nId, int* pnCount)
if ( nFacets > 1) {
// copio tutte le facce
int nFirstId = GDB_ID_NULL ;
int nCount = 0 ;
nCount = 0 ;
for ( int i = 0 ; i < nFacets ; ++ i) {
ISurfTriMesh* pFac = pStm->CloneFacet( i) ;
if ( pFac == nullptr)
@@ -126,19 +125,16 @@ MyExplodeSurfTriMesh( int nId, int* pnCount)
// elimino la superficie originale
pGeomDB->Erase( nId) ;
// restituisco risultati
if ( pnCount != nullptr)
*pnCount = nCount ;
return nFirstId ;
}
// non devo fare alcunché
if ( pnCount != nullptr)
*pnCount = 1 ;
nCount = 1 ;
return nId ;
}
//-------------------------------------------------------------------------------
static int
MyExplodeSurfFlatRegion( int nId, int* pnCount)
MyExplodeSurfFlatRegion( int nId, int& nCount)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
@@ -150,13 +146,12 @@ MyExplodeSurfFlatRegion( int nId, int* pnCount)
int nChunk = pSfr->GetChunkCount() ;
// se c'è un solo componente, non devo fare alcunché
if ( nChunk == 1) {
if ( pnCount != nullptr)
*pnCount = 1 ;
nCount = 1 ;
return nId ;
}
// copio tutti i componenti connessi (chunk)
int nFirstId = GDB_ID_NULL ;
int nCount = 0 ;
nCount = 0 ;
for ( int i = 0 ; i < nChunk ; ++ i) {
ISurfFlatRegion* pChk = pSfr->CloneChunk( i) ;
if ( pChk == nullptr)
@@ -176,8 +171,6 @@ MyExplodeSurfFlatRegion( int nId, int* pnCount)
// elimino la superficie
pGeomDB->Erase( nId) ;
// restituisco risultati
if ( pnCount != nullptr)
*pnCount = nCount ;
return nFirstId ;
}
@@ -192,10 +185,10 @@ ExeExplodeSurface( int nId, int* pnCount)
int nCount = 0 ;
switch ( pGeomDB->GetGeoType( nId)) {
case SRF_TRIMESH :
nFirstId = MyExplodeSurfTriMesh( nId, &nCount) ;
nFirstId = MyExplodeSurfTriMesh( nId, nCount) ;
break ;
case SRF_FLATRGN :
nFirstId = MyExplodeSurfFlatRegion( nId, &nCount) ;
nFirstId = MyExplodeSurfFlatRegion( nId, nCount) ;
break ;
}
ExeSetModified() ;
@@ -845,3 +838,96 @@ ExeSurfTmIntersect( int nId1, int nId2)
}
return bOk ;
}
//----------------------------------------------------------------------------
static ISurfTriMesh*
MyCreateSubSurfTm( const ISurfTriMesh* pStm, const INTVECTOR& vTria)
{
StmFromTriangleSoup StmFts ;
if ( ! StmFts.Start())
return nullptr ;
for ( int nT : vTria) {
Triangle3d Tria ;
if ( ! pStm->GetTriangle( nT, Tria) ||
! StmFts.AddTriangle( Tria))
return nullptr ;
}
// valido la superficie e calcolo le adiacenze
if ( ! StmFts.End())
return nullptr ;
// restituisco la superficie
return StmFts.GetSurf() ;
}
//----------------------------------------------------------------------------
static int
MySurfTmSplit( int nId, int nSplitterId, int& nCount)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
// recupero la superficie TriMesh da dividere in parti
ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ;
if ( pStm == nullptr)
return GDB_ID_NULL ;
// recupero il riferimento della superficie
Frame3d frSurf ;
if ( ! pGeomDB->GetGlobFrame( nId, frSurf))
return GDB_ID_NULL ;
// recupero la superficie TriMesh divisore in locale alla prima
SurfLocal SurfCLoc( pGeomDB, nSplitterId, frSurf) ;
const ISurfTriMesh* pStmCLoc = GetSurfTriMesh( SurfCLoc) ;
if ( pStmCLoc == nullptr)
return GDB_ID_NULL ;
// eseguo la classificazione
INTVECTOR vTriaIn, vTriaOut, vTriaOnP, vTriaOnM, vTriaIndef ;
if ( ! pStm->GetSurfClassification( *pStmCLoc, vTriaIn, vTriaOut, vTriaOnP, vTriaOnM, vTriaIndef))
return GDB_ID_NULL ;
// costruisco le diverse superfici
PtrOwner<ISurfTriMesh> pStmIn( MyCreateSubSurfTm( pStm, vTriaIn)) ;
PtrOwner<ISurfTriMesh> pStmOut( MyCreateSubSurfTm( pStm, vTriaOut)) ;
PtrOwner<ISurfTriMesh> pStmOnP( MyCreateSubSurfTm( pStm, vTriaOnP)) ;
PtrOwner<ISurfTriMesh> pStmOnM( MyCreateSubSurfTm( pStm, vTriaOnM)) ;
PtrOwner<ISurfTriMesh> pStmIndef( MyCreateSubSurfTm( pStm, vTriaIndef)) ;
if ( IsNull( pStmIn) || IsNull( pStmOut) || IsNull( pStmOnP) || IsNull( pStmOnM) || IsNull( pStmIndef))
return GDB_ID_NULL ;
// le inserisco nel DB geometrico
int nStmIn = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmIn)) ;
int nStmOut = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmOut)) ;
int nStmOnP = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmOnP)) ;
int nStmOnM = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmOnM)) ;
int nStmIndef = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pStmIndef)) ;
// se tutto ok
if ( nStmIn != GDB_ID_NULL && nStmOut != GDB_ID_NULL && nStmOnP != GDB_ID_NULL && nStmOnM != GDB_ID_NULL && nStmIndef != GDB_ID_NULL) {
pGeomDB->Erase( nId) ;
nCount = 5 ;
return nStmIn ;
}
else {
pGeomDB->Erase( nStmIn) ;
pGeomDB->Erase( nStmOut) ;
pGeomDB->Erase( nStmOnP) ;
pGeomDB->Erase( nStmOnM) ;
pGeomDB->Erase( nStmIndef) ;
nCount = 0 ;
return GDB_ID_NULL ;
}
}
//----------------------------------------------------------------------------
int
ExeSurfTmSplit( int nId, int nSplitterId, int* pnCount)
{
int nCount ;
int nFirstId = MySurfTmSplit( nId, nSplitterId, nCount) ;
ExeSetModified() ;
// se richiesto, salvo il comando Lua equivalente
if ( IsCmdLog()) {
string sLua = "EgtSurfTmSplit(" + ToString( nId) + "," +
ToString( nSplitterId) + ")" +
" -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
if ( pnCount != nullptr)
*pnCount = nCount ;
return nFirstId ;
}