diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index a8155ac..87e3278 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 27c565a..33f3e1c 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -1987,7 +1987,7 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& Point3d pt3DEnd ; pCrv0->GetEndPoint( pt3DEnd) ; bool bThroughEdge = false ; BOOLVECTOR vbThroughEdge ; - if ( ! UnprojectPoint(pt3D, pt2D, pt3DEnd, &bThroughEdge, pPlCut)) + if ( ! UnprojectPoint( pt3D, pt2D, pt3DEnd, &bThroughEdge, pPlCut)) return false ; vbThroughEdge.push_back( bThroughEdge) ; @@ -2034,7 +2034,7 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& return false ; // se il precedente era passato attraverso l'edge ed era un edge di polo allora devo sistemare le coordinate - if( bPrevIsPole){ + if ( bPrevIsPole) { // se il punto precedente era di polo allora devo correggere le sue coordinate 2D if ( bHorizontalPole) pt2DPrev.x = pt2D.x ; @@ -2045,12 +2045,12 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& vtDir.Normalize() ; // se mi accorgo che sto per tracciare un taglio lungo un bordo posso semplicemente evitarlo double dDelta = 10 * EPS_SMALL ; - if ( (1 - abs(vtDir.x) < SQ_EPS_SMALL && (pt2D.y < dDelta || m_nSpanV * SBZ_TREG_COEFF - pt2D.y < dDelta)) || // parallelo agli edge 0 e 2 e su uno di questi - (1 - abs(vtDir.y) < SQ_EPS_SMALL && (pt2D.x < dDelta || m_nSpanU * SBZ_TREG_COEFF - pt2D.x < dDelta))) { // parallello agli edge 1 e 3 e su uno di questi + if ( ( 1 - abs( vtDir.x) < SQ_EPS_SMALL && ( pt2D.y < dDelta || m_nSpanV * SBZ_TREG_COEFF - pt2D.y < dDelta)) || // parallelo agli edge 0 e 2 e su uno di questi + ( 1 - abs( vtDir.y) < SQ_EPS_SMALL && ( pt2D.x < dDelta || m_nSpanU * SBZ_TREG_COEFF - pt2D.x < dDelta))) { // parallello agli edge 1 e 3 e su uno di questi ++ nRejected ; continue ; } - if ( bThroughEdge && vbThroughEdge.back()) { + if ( bThroughEdge && vbThroughEdge.back()) { double dParamH, dParamL ; dParamH = m_nSpanV * SBZ_TREG_COEFF ; dParamL = m_nSpanU * SBZ_TREG_COEFF ; @@ -2058,8 +2058,8 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& // ( i punti per periodicità hanno coordinate diverse anche se dovrebbero averle uguali, quindi il segmento attraversa tutto lo spazio parametrico, anche se in realtà è lungo il bordo di chiusura) // potrei star tracciando un taglio sul bordo di chiusura // controllo se sto tracciando una linea che unisce due lati di chiusura, allora in realtà sdtarei tracciando un taglio sull'edge e quindi posso non tracciarlo - if ( (abs( vtDir.x) > abs( vtDir.y) && Dist( pt2D, pt2DPrev) > dParamL * 0.5) || - (abs( vtDir.y) > abs( vtDir.x) && Dist( pt2D, pt2DPrev) > dParamH * 0.5)) { + if ( ( abs( vtDir.x) > abs( vtDir.y) && Dist( pt2D, pt2DPrev) > dParamL * 0.5) || + ( abs( vtDir.y) > abs( vtDir.x) && Dist( pt2D, pt2DPrev) > dParamH * 0.5)) { ++ nRejected ; continue ; } @@ -2073,12 +2073,14 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& Point3d ptNear ; pCrv0->GetStartPoint( ptNear) ; INTVECTOR vId ; bool bAdded = true ; - while( chainC.GetChainFromNear( pt3D, false, vId)) { + while ( chainC.GetChainFromNear( pt3D, false, vId)) { PtrOwner pCC2D ( CreateCurveComposite()) ; + if ( IsNull( pCC2D)) + return false ; for ( int i = 0 ; i < int( vId.size()) ; ++ i) { // creo un segmento di retta - ICurveLine* pLine( CreateCurveLine()) ; - if ( pLine == nullptr) + PtrOwner pLine( CreateCurveLine()) ; + if ( IsNull( pLine)) return false ; // recupero gli estremi (non vanno mai invertiti per opzione di concatenamento) int nInd = abs( vId[i]) - 1 ; @@ -2086,12 +2088,12 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& Point3d ptEnd = vBPnt[nInd].second ; // provo ad accodarlo alla composita bAdded = ( Dist( ptStart, ptEnd) > dToler / 2 && - pLine->Set( ptStart, ptEnd)) ; - bAdded = bAdded && pCC2D->AddCurve( pLine, true, dToler) ; + pLine->Set( ptStart, ptEnd)) ; + bAdded = bAdded && pCC2D->AddCurve( Release( pLine), true, dToler) ; ptNear = ( bAdded ? ptEnd : ptStart) ; } if ( pCC2D->IsValid()) - vpCC.emplace_back( Release(pCC2D)) ; + vpCC.emplace_back( Release( pCC2D)) ; } return true ; } @@ -2100,31 +2102,31 @@ SurfBezier::UnprojectCurveFromStm( const ICurveComposite* pCC, ICRVCOMPOPVECTOR& bool SurfBezier::AddCurveCompoToCuts( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVECTOR& vpCCClosed, double dToler, const Plane3d* pPlCut) const { - // se lunghezza curva inferiore a 5 volte la tolleranza, la ignoro e sposto il punto finale nel punto di fine della curva che sto ignorando + // se lunghezza curva inferiore a 5 volte la tolleranza, la ignoro e sposto il punto finale nel punto di fine della curva che sto ignorando double dCrvLen ; if ( ! pCrvCompo->GetLength( dCrvLen) || dCrvLen < 5. * dToler) return true ; - // se curva chiusa entro 5 volte la tolleranza ma considerata aperta, la chiudo bene + // se curva chiusa entro 5 volte la tolleranza ma considerata aperta, la chiudo bene Point3d ptStart, ptEnd ; if ( pCrvCompo->GetStartPoint( ptStart) && - pCrvCompo->GetEndPoint( ptEnd) && - AreSamePointEpsilon( ptStart, ptEnd, 5. * dToler) && - ! AreSamePointApprox( ptStart, ptEnd)) { - // porto il punto finale a coincidere esattamente con l'inizio + pCrvCompo->GetEndPoint( ptEnd) && + AreSamePointEpsilon( ptStart, ptEnd, 5 * dToler) && + ! AreSamePointApprox( ptStart, ptEnd)) { + // porto il punto finale a coincidere esattamente con l'inizio pCrvCompo->ModifyEnd( ptStart) ; } - // unisco segmenti allineati + // unisco segmenti allineati pCrvCompo->MergeCurves( 0.5 * dToler, ANG_TOL_STD_DEG) ; - // porto la curva nello spazio parametrico + // porto la curva nello spazio parametrico ICRVCOMPOPVECTOR vCC ; if ( ! UnprojectCurveFromStm( pCrvCompo, vCC, pPlCut)) return false ; for ( int i = 0 ; i < int( vCC.size()); ++i) { - // le curve aperte le tengo da parte per giuntarle alla fine col bordo + // le curve aperte le tengo da parte per giuntarle alla fine col bordo if ( ! vCC[i]->IsClosed() ) vpCCOpen.emplace_back( vCC[i]) ; - // le curve chiuse le metto tutte insieme subito + // le curve chiuse le metto tutte insieme subito else vpCCClosed.emplace_back( vCC[i]) ; }