diff --git a/CurveComposite.cpp b/CurveComposite.cpp index c0ffe14..fd59aec 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -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 ; } diff --git a/SurfBezier.cpp b/SurfBezier.cpp index b12274c..5987782 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -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