EgtGeomKernel :

- correzione ai CopyFrom di CurveComposite e di SurfBezier.
This commit is contained in:
Daniele Bariletti
2024-09-04 08:57:39 +02:00
parent 9a5fe24781
commit 2267343afe
2 changed files with 38 additions and 12 deletions
+4
View File
@@ -604,6 +604,10 @@ CurveComposite::CopyFrom( const CurveComposite& ccSrc)
if ( ! AddCurve( *pCrv))
return false ;
}
if ( ccSrc.m_nStatus == IS_A_POINT) {
m_ptStart = ccSrc.m_ptStart ;
m_nStatus = IS_A_POINT ;
}
return true ;
}
+34 -12
View File
@@ -632,8 +632,21 @@ SurfBezier::CopyFrom( const SurfBezier& sbSrc)
m_bTrimmed = true ;
m_pTrimReg = sbSrc.m_pTrimReg->Clone() ;
}
if ( sbSrc.m_pSTM != nullptr)
if ( sbSrc.m_pSTM != nullptr) {
m_pSTM = sbSrc.m_pSTM->Clone() ;
for ( int i = 0 ; i < int( sbSrc.m_mCCEdge.size()) ; ++i) {
m_mCCEdge.emplace_back() ;
for ( int j = 0 ; j < int( sbSrc.m_mCCEdge[i].size()) ; ++j ) {
m_mCCEdge.back().emplace_back( sbSrc.m_mCCEdge[i][j]->Clone()) ;
}
}
if( sbSrc.m_bTrimmed) {
for ( int i = 0 ; i < int( sbSrc.m_vCCLoop.size()) ; ++i)
m_vCCLoop.emplace_back( sbSrc.m_vCCLoop[i]->Clone());
}
}
m_bClosedU = sbSrc.m_bClosedU ;
m_bClosedV = sbSrc.m_bClosedV ;
m_nTempProp[0] = sbSrc.m_nTempProp[0] ;
m_nTempProp[1] = sbSrc.m_nTempProp[1] ;
m_dTempParam[0] = sbSrc.m_dTempParam[0] ;
@@ -1883,6 +1896,9 @@ SurfBezier::ResetAuxSurf( void) const
if ( m_pSTM != nullptr)
delete( m_pSTM) ;
m_pSTM = nullptr ;
m_mCCEdge.clear() ;
m_vCCLoop.clear() ;
}
//----------------------------------------------------------------------------
@@ -1896,6 +1912,9 @@ SurfBezier::ResetTrimRegion( void)
m_bTrimmed = false ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
m_mCCEdge.clear() ;
m_vCCLoop.clear() ;
}
//----------------------------------------------------------------------------
@@ -2362,16 +2381,18 @@ SurfBezier::CreateTrimRegionFromCuts( ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVE
// devo verificare se devo aggiungere anche il bordo ( basta verificare se il primo loop chiuso è CCW)
double dArea ;
vpCCClosed[0]->GetAreaXY( dArea) ;
if ( dArea < EPS_SMALL ) {
PolyLine plEdge ;
plEdge.AddUPoint( 0, ORIG) ;
plEdge.AddUPoint( 1, Point3d( m_nSpanU * SBZ_TREG_COEFF, 0)) ;
plEdge.AddUPoint( 2, Point3d( m_nSpanU * SBZ_TREG_COEFF, m_nSpanV * SBZ_TREG_COEFF)) ;
plEdge.AddUPoint( 3, Point3d( 0, m_nSpanV * SBZ_TREG_COEFF)) ;
plEdge.Close() ;
vpCCClosed.emplace_back( CreateCurveComposite()) ;
vpCCClosed.back()->FromPolyLine( plEdge) ;
if( vpCCClosed.size() != 0) {
vpCCClosed[0]->GetAreaXY( dArea) ;
if ( dArea < EPS_SMALL ) {
PolyLine plEdge ;
plEdge.AddUPoint( 0, ORIG) ;
plEdge.AddUPoint( 1, Point3d( m_nSpanU * SBZ_TREG_COEFF, 0)) ;
plEdge.AddUPoint( 2, Point3d( m_nSpanU * SBZ_TREG_COEFF, m_nSpanV * SBZ_TREG_COEFF)) ;
plEdge.AddUPoint( 3, Point3d( 0, m_nSpanV * SBZ_TREG_COEFF)) ;
plEdge.Close() ;
vpCCClosed.emplace_back( CreateCurveComposite()) ;
vpCCClosed.back()->FromPolyLine( plEdge) ;
}
}
// aggiungo i loop chiusi
@@ -2610,7 +2631,8 @@ SurfBezier::UnprojectPointFromStm( int nT, const Point3d& ptI, Point3d& ptSP, in
}
// se ho tre intersezioni vuol dire che un lato è collassato in un punto e il punto di cui voglio la controimmagine è esattamente nel polo
if ( nInters == 3 || ( m_bClosedU && ( vInters[1] == 1 || vInters[3] == 1)) || ( m_bClosedV && ( vInters[1] == 1 || vInters[3] == 1))) {
// oppure sono su un lato di chiusura
if ( nInters == 3 || ( m_bClosedU && ( vInters[1] == 1 || vInters[3] == 1)) || ( m_bClosedV && ( vInters[0] == 1 || vInters[2] == 1))) {
if ( nInters == 3)
bIsPole = true ;
// visto che sono in un polo o su un lato di chiusura devo verificare di aver ricevuto il triangolo giusto