EgtExecutor 2.1l3 :
- aggiunta funzione Exe/Lua SurfTmSplit.
This commit is contained in:
+103
-17
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user