EgtGeomKernel 2.2f4 :
- aggiunta gestione secondo colore in operazioni booleane tra superfici trimesh.
This commit is contained in:
@@ -117,7 +117,7 @@ GetHSVFromColor( const Color& cCol)
|
||||
double dDelta = dMax - dMin ;
|
||||
|
||||
if ( dDelta < EPS_ZERO)
|
||||
return HSV( dMax, 0, 0) ;
|
||||
return HSV( 0, 0, dMax) ;
|
||||
|
||||
if ( dMax < EPS_ZERO)
|
||||
return HSV( 0, 0, 0) ;
|
||||
|
||||
Binary file not shown.
@@ -22,6 +22,8 @@ class ObjGraphicsMgr
|
||||
public :
|
||||
ObjGraphicsMgr( void) : m_pOGr( nullptr) {}
|
||||
~ObjGraphicsMgr( void)
|
||||
{ Clear() ; }
|
||||
void Clear( void)
|
||||
{ if ( m_pOGr != nullptr)
|
||||
delete m_pOGr ;
|
||||
m_pOGr = nullptr ; }
|
||||
|
||||
+45
-9
@@ -38,7 +38,7 @@ GEOOBJ_REGISTER( SRF_TRIMESH, NGE_S_TRM, SurfTriMesh) ;
|
||||
SurfTriMesh::SurfTriMesh( void)
|
||||
: m_nStatus( TO_VERIFY), m_dLinTol( STM_STD_LIN_TOL), m_dBoundaryAng( STM_STD_BOUNDARY_ANG),
|
||||
m_dSmoothAng( STM_STD_SMOOTH_ANG), m_bOriented( false), m_bClosed( false), m_bFaceted( false),
|
||||
m_nTimeStamp( 0), m_nTempProp( 0), m_pHGrd3d( nullptr), m_nParts( -1)
|
||||
m_nTimeStamp( 0), m_nTempProp( 0), m_nMaxTFlag( 0), m_nParts( -1), m_pHGrd3d( nullptr)
|
||||
{
|
||||
m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ;
|
||||
m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ;
|
||||
@@ -76,6 +76,8 @@ SurfTriMesh::Init( int nNumVert, int nNumTria, int nNumFacet)
|
||||
// completo inizializzazione
|
||||
m_nStatus = OK ;
|
||||
m_bClosed = false ;
|
||||
m_nMaxTFlag = 0 ;
|
||||
m_nParts = -1 ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -127,7 +129,7 @@ SurfTriMesh::SetVertex( int nInd, const StmVert& vV)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
SurfTriMesh::AddTriangle( const int nIdVert[3])
|
||||
SurfTriMesh::AddTriangle( const int nIdVert[3], int nTFlag)
|
||||
{
|
||||
// verifico che i tre indici siano diversi
|
||||
if ( nIdVert[0] == nIdVert[1] ||
|
||||
@@ -160,8 +162,10 @@ SurfTriMesh::AddTriangle( const int nIdVert[3])
|
||||
m_OGrMgr.Reset() ;
|
||||
ResetHashGrids3d() ;
|
||||
// inserisco il triangolo
|
||||
try { m_vTria.emplace_back( nIdVert) ;}
|
||||
try { m_vTria.emplace_back( nIdVert, nTFlag) ;}
|
||||
catch(...) { return SVT_NULL ;}
|
||||
// aggiorno massimo TFlag
|
||||
m_nMaxTFlag = max( m_nMaxTFlag, nTFlag) ;
|
||||
// ne determino l'indice
|
||||
return int( m_vTria.size() - 1) ;
|
||||
}
|
||||
@@ -193,6 +197,8 @@ SurfTriMesh::SetTriangle( int nInd, const StmTria& tT)
|
||||
}
|
||||
// inserisco il triangolo
|
||||
m_vTria[nInd] = tT ;
|
||||
// aggiorno massimo TFlag
|
||||
m_nMaxTFlag = max( m_nMaxTFlag, tT.nTFlag) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -368,14 +374,28 @@ SurfTriMesh::GetVertexCount( void) const
|
||||
int
|
||||
SurfTriMesh::GetTriangleCount( void) const
|
||||
{
|
||||
// calcolo il numero dei triangoli cancellati
|
||||
int nErased = 0 ;
|
||||
// calcolo il numero dei triangoli validi
|
||||
int nCount = 0 ;
|
||||
for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) {
|
||||
if ( m_vTria[nId].nIdVert[0] == SVT_DEL)
|
||||
++ nErased ;
|
||||
if ( m_vTria[nId].nIdVert[0] != SVT_DEL)
|
||||
++ nCount ;
|
||||
}
|
||||
|
||||
return ( GetTriangleSize() - nErased) ;
|
||||
return nCount ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
SurfTriMesh::GetTriangleCount( int nTFlag) const
|
||||
{
|
||||
// calcolo il numero dei triangoli con flag indicato e non cancellati
|
||||
int nCount = 0 ;
|
||||
for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) {
|
||||
if ( m_vTria[nId].nIdVert[0] != SVT_DEL && m_vTria[nId].nTFlag == nTFlag)
|
||||
++ nCount ;
|
||||
}
|
||||
|
||||
return nCount ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -466,6 +486,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -492,6 +513,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
// ritorno indice triangolo corrente
|
||||
return nId ;
|
||||
}
|
||||
@@ -508,6 +530,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3dEx& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
GetTriangleBoundaryEdges( nId, const_cast<TriFlags3d&>( Tria.GetTriFlags())) ;
|
||||
GetTriangleSmoothNormals( nId, const_cast<TriNormals3d&>( Tria.GetTriNormals())) ;
|
||||
return true ;
|
||||
@@ -536,6 +559,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3dEx& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
GetTriangleBoundaryEdges( nId, const_cast<TriFlags3d&>( Tria.GetTriFlags())) ;
|
||||
GetTriangleSmoothNormals( nId, const_cast<TriNormals3d&>( Tria.GetTriNormals())) ;
|
||||
// ritorno indice triangolo corrente
|
||||
@@ -987,6 +1011,7 @@ SurfTriMesh::CopyFrom( const SurfTriMesh& stmSrc)
|
||||
m_vFacet = stmSrc.m_vFacet ;
|
||||
m_nTimeStamp = stmSrc.m_nTimeStamp ;
|
||||
m_nTempProp = stmSrc.m_nTempProp ;
|
||||
m_nMaxTFlag = stmSrc.m_nMaxTFlag ;
|
||||
m_nParts = stmSrc.m_nParts ;
|
||||
return true ;
|
||||
}
|
||||
@@ -1114,6 +1139,7 @@ SurfTriMesh::Load( NgeReader& ngeIn)
|
||||
{
|
||||
// imposto ricalcolo della grafica, della connessione e di hashgrids3d
|
||||
m_OGrMgr.Reset() ;
|
||||
m_nMaxTFlag = 0 ;
|
||||
m_nParts = -1 ;
|
||||
ResetHashGrids3d() ;
|
||||
// leggo la prossima linea ( 2 parametri : dLinTol e dSmoothAng)
|
||||
@@ -3601,7 +3627,7 @@ SurfTriMesh::ClonePart( int nPart) const
|
||||
int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[0]].ptP),
|
||||
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[1]].ptP),
|
||||
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[2]].ptP)} ;
|
||||
if ( pSurfTM->AddTriangle( nNewInd) == SVT_NULL)
|
||||
if ( pSurfTM->AddTriangle( nNewInd, m_vTria[i].nTFlag) == SVT_NULL)
|
||||
return nullptr ;
|
||||
}
|
||||
}
|
||||
@@ -3612,3 +3638,13 @@ SurfTriMesh::ClonePart( int nPart) const
|
||||
// Restituisco la nuova superficie
|
||||
return Release( pSurfTM) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfTriMesh::ResetTFlags( void)
|
||||
{
|
||||
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i)
|
||||
m_vTria[i].nTFlag = 0 ;
|
||||
m_nMaxTFlag = 0 ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
+11
-3
@@ -47,6 +47,9 @@ class StmTria
|
||||
StmTria( const int nIdV[3]) : vtN(), nIdFacet( SVT_NULL), nTFlag( 0), nEFlag( 0), nPart( SVT_NULL), nTemp( 0)
|
||||
{ nIdVert[0] = nIdV[0] ; nIdVert[1] = nIdV[1] ; nIdVert[2] = nIdV[2] ;
|
||||
nIdAdjac[0] = SVT_NULL ; nIdAdjac[1] = SVT_NULL ; nIdAdjac[2] = SVT_NULL ; }
|
||||
StmTria( const int nIdV[3], int nTF) : vtN(), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( 0), nPart( SVT_NULL), nTemp( 0)
|
||||
{ nIdVert[0] = nIdV[0] ; nIdVert[1] = nIdV[1] ; nIdVert[2] = nIdV[2] ;
|
||||
nIdAdjac[0] = SVT_NULL ; nIdAdjac[1] = SVT_NULL ; nIdAdjac[2] = SVT_NULL ; }
|
||||
StmTria( const int nIdV[3], const int nIdA[3], const Vector3d& vtV, int nTF, int nEF)
|
||||
: vtN( vtV), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( nEF), nPart( SVT_NULL), nTemp( 0)
|
||||
{ nIdVert[0] = nIdV[0] ; nIdVert[1] = nIdV[1] ; nIdVert[2] = nIdV[2] ;
|
||||
@@ -166,7 +169,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
|
||||
m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ;
|
||||
m_OGrMgr.Reset() ; }
|
||||
int AddVertex( const Point3d& ptVert) override ;
|
||||
int AddTriangle( const int nIdVert[3]) override ;
|
||||
int AddTriangle( const int nIdVert[3], int nTFlag = 0) override ;
|
||||
bool RemoveTriangle( int nId) override ;
|
||||
bool AdjustTopology( void) override ;
|
||||
bool CreateByFlatContour( const PolyLine& PL) override ;
|
||||
@@ -182,13 +185,14 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
|
||||
bool DoSewing( const ISurfTriMesh& stmOther, const Frame3d& frOther = GLOB_FRM) override ;
|
||||
int GetVertexCount( void) const override ;
|
||||
int GetTriangleCount( void) const override ;
|
||||
int GetTriangleCount( int nTFlag) const override ;
|
||||
int GetVertexSize( void) const override
|
||||
{ return int( m_vVert.size()) ; }
|
||||
int GetTriangleSize( void) const override
|
||||
{ return int( m_vTria.size()) ; }
|
||||
double GetLinearTolerance( void) override
|
||||
double GetLinearTolerance( void) const override
|
||||
{ return m_dLinTol ; }
|
||||
double GetSmoothAngle( void) override
|
||||
double GetSmoothAngle( void) const override
|
||||
{ return m_dSmoothAng ; }
|
||||
bool GetVertex( int nId, Point3d& ptP) const override ;
|
||||
int GetFirstVertex( Point3d& ptP) const override ;
|
||||
@@ -238,6 +242,9 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
|
||||
int GetPartCount( void) const override ;
|
||||
bool RemovePart( int nPart) override ;
|
||||
SurfTriMesh* ClonePart( int nPart) const override ;
|
||||
int GetMaxTFlag( void) const override
|
||||
{ return m_nMaxTFlag ; }
|
||||
bool ResetTFlags( void) override ;
|
||||
|
||||
public : // IGeoObjRW
|
||||
int GetNgeId( void) const override ;
|
||||
@@ -326,6 +333,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
|
||||
INTVECTOR m_vFacet ; // vettore delle sfaccettature
|
||||
mutable int m_nTimeStamp ; // orologio locale
|
||||
int m_nTempProp ; // proprietà temporanea
|
||||
int m_nMaxTFlag ; // massimo valore dei TFlag dei triangoli
|
||||
mutable int m_nParts ; // numero di parti connesse (-1 se da calcolare)
|
||||
mutable HashGrids3d* m_pHGrd3d ; // Hash Grid 3d nel suo riferimento
|
||||
mutable BBox3d m_b3HGrd3d ; // Box3d collegato a Hash Grid 3d
|
||||
|
||||
+31
-9
@@ -2040,15 +2040,16 @@ SurfTriMesh::RemoveTJunctions(void)
|
||||
PNTVECTOR vPt ;
|
||||
INTVECTOR vTr ;
|
||||
if ( Triangulate().Make( Polygon, vPt, vTr)) {
|
||||
// Rimuovo il triangolo originale
|
||||
// Rimuovo il triangolo originale e salvo il suo flag
|
||||
int nTFlag = m_vTria[nT].nTFlag ;
|
||||
RemoveTriangle( nT) ;
|
||||
// Inserisco i nuovi triangoli che lo sostituiscono
|
||||
// Inserisco i nuovi triangoli che lo sostituiscono e asegno loro lo stesso flag
|
||||
for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) {
|
||||
int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ;
|
||||
int nNewId[3] = { AddVertex( vPt[nNewTriaVertId[0]]),
|
||||
AddVertex( vPt[nNewTriaVertId[1]]),
|
||||
AddVertex( vPt[nNewTriaVertId[2]])} ;
|
||||
AddTriangle( nNewId) ;
|
||||
AddTriangle( nNewId, nTFlag) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2171,13 +2172,22 @@ SurfTriMesh::ScanForTripleTriangles( bool& bModified)
|
||||
nAdjTriaContactEdge[(nAdjTria - 1) / 2] = nAdjEdge ;
|
||||
}
|
||||
}
|
||||
// Elimino i triangoli
|
||||
// Elimino i triangoli e salvo i loro Flag
|
||||
int vnTFlag[3] ;
|
||||
for ( int nTria = 0 ; nTria < 3 ; ++ nTria) {
|
||||
vnTFlag[nTria] = m_vTria[vTriaIndex[nTria]].nTFlag ;
|
||||
RemoveTriangle( vTriaIndex[nTria]) ;
|
||||
}
|
||||
// Aggiungo il novo triangolo
|
||||
// Aggiungo il nuovo triangolo con il flag
|
||||
int nNewTFlag ;
|
||||
if ( vnTFlag[0] == vnTFlag[1])
|
||||
nNewTFlag = vnTFlag[1] ;
|
||||
else if ( vnTFlag[0] == vnTFlag[2] || vnTFlag[1] == vnTFlag[2])
|
||||
nNewTFlag = vnTFlag[2] ;
|
||||
else
|
||||
nNewTFlag = 0 ;
|
||||
int nNewVert[3] = { vVertAndAdjTria[0], vVertAndAdjTria[2], vVertAndAdjTria[4] } ;
|
||||
int nNewTriaId = AddTriangle( nNewVert) ;
|
||||
int nNewTriaId = AddTriangle( nNewVert, nNewTFlag) ;
|
||||
if ( nNewTriaId != SVT_NULL) {
|
||||
// Sistemo le adiacenze
|
||||
m_vTria[nNewTriaId].nIdAdjac[0] = vVertAndAdjTria[1] ;
|
||||
@@ -2256,6 +2266,7 @@ SurfTriMesh::FlipTriangles( int nTA, int nTB)
|
||||
bool
|
||||
SurfTriMesh::Add( const ISurfTriMesh& Other)
|
||||
{
|
||||
m_OGrMgr.Clear() ;
|
||||
SurfTriMesh SurfB ;
|
||||
SurfB.CopyFrom( &Other) ;
|
||||
IntersectTriMeshTriangle( SurfB) ;
|
||||
@@ -2266,6 +2277,7 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
|
||||
if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == - 2)
|
||||
RemoveTriangle( nTA) ;
|
||||
}
|
||||
int nPrevMaxTFlag = m_nMaxTFlag ;
|
||||
int nTriaNumB = SurfB.GetTriangleSize() ;
|
||||
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
|
||||
if ( SurfB.m_vTria[nTB].nTempPart == - 1) {
|
||||
@@ -2273,7 +2285,9 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
|
||||
for ( int nV = 0 ; nV < 3 ; ++ nV) {
|
||||
nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ;
|
||||
}
|
||||
AddTriangle( nNewVert) ;
|
||||
if ( nPrevMaxTFlag == m_nMaxTFlag)
|
||||
++ m_nMaxTFlag ;
|
||||
AddTriangle( nNewVert, m_nMaxTFlag) ;
|
||||
}
|
||||
}
|
||||
if ( ! AdjustVertices() || ! DoCompacting())
|
||||
@@ -2289,6 +2303,7 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
|
||||
bool
|
||||
SurfTriMesh::Intersect( const ISurfTriMesh& Other)
|
||||
{
|
||||
m_OGrMgr.Clear() ;
|
||||
SurfTriMesh SurfB ;
|
||||
SurfB.CopyFrom( &Other) ;
|
||||
IntersectTriMeshTriangle( SurfB) ;
|
||||
@@ -2299,6 +2314,7 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
|
||||
if ( m_vTria[nTA].nTempPart == - 1 || m_vTria[nTA].nTempPart == - 2)
|
||||
RemoveTriangle( nTA) ;
|
||||
}
|
||||
int nPrevMaxTFlag = m_nMaxTFlag ;
|
||||
int nTriaNumB = SurfB.GetTriangleSize() ;
|
||||
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
|
||||
if ( SurfB.m_vTria[nTB].nTempPart == 1) {
|
||||
@@ -2306,7 +2322,9 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
|
||||
for ( int nV = 0 ; nV < 3 ; ++ nV) {
|
||||
nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ;
|
||||
}
|
||||
AddTriangle( nNewVert) ;
|
||||
if ( nPrevMaxTFlag == m_nMaxTFlag)
|
||||
++ m_nMaxTFlag ;
|
||||
AddTriangle( nNewVert, m_nMaxTFlag) ;
|
||||
}
|
||||
}
|
||||
if ( ! AdjustVertices() || ! DoCompacting())
|
||||
@@ -2322,6 +2340,7 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
|
||||
bool
|
||||
SurfTriMesh::Subtract( const ISurfTriMesh& Other)
|
||||
{
|
||||
m_OGrMgr.Clear() ;
|
||||
SurfTriMesh SurfB ;
|
||||
SurfB.CopyFrom( &Other) ;
|
||||
IntersectTriMeshTriangle( SurfB) ;
|
||||
@@ -2332,6 +2351,7 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other)
|
||||
if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == 2)
|
||||
RemoveTriangle( nTA) ;
|
||||
}
|
||||
int nPrevMaxTFlag = m_nMaxTFlag ;
|
||||
int nTriaNumB = SurfB.GetTriangleSize() ;
|
||||
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
|
||||
if ( SurfB.m_vTria[nTB].nTempPart == 1) {
|
||||
@@ -2340,7 +2360,9 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other)
|
||||
nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ;
|
||||
}
|
||||
swap( nNewVert[1], nNewVert[2]) ;
|
||||
AddTriangle( nNewVert) ;
|
||||
if ( nPrevMaxTFlag == m_nMaxTFlag)
|
||||
++ m_nMaxTFlag ;
|
||||
AddTriangle( nNewVert, m_nMaxTFlag) ;
|
||||
}
|
||||
}
|
||||
if ( ! AdjustVertices() || ! DoCompacting())
|
||||
|
||||
Reference in New Issue
Block a user