From 0d62cd9bbd88e27b1e130744855c43dba23703cc Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Wed, 7 Jan 2026 12:26:13 +0100 Subject: [PATCH] EgtGeomKernel : - aggiunta controlli e correzione al VM 5 assi in caso di movimento a perno sulla punta del tool. --- VolZmapVolume.cpp | 774 +++++++++++++++++++++++----------------------- 1 file changed, 393 insertions(+), 381 deletions(-) diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 2fa726a..e1b835f 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -1549,429 +1549,441 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c { // tolgo il volume spazzato dal tool durante il movimento // Verifica sull'interferenza con lo Zmap - int nStartI, nStartJ, nEndI, nEndJ ; - if ( ! TestCompoBBox( nGrid, ptS, ptE, vtLs, vtLe, dMaxRad, dMinRad, dHeight, nStartI, nStartJ, nEndI, nEndJ)) - return true ; + int nStartI, nStartJ, nEndI, nEndJ ; + if ( ! TestCompoBBox( nGrid, ptS, ptE, vtLs, vtLe, dMaxRad, dMinRad, dHeight, nStartI, nStartJ, nEndI, nEndJ)) + return true ; // vettori di riferimento per trovare i punti ausiliari - int nDegU = 3 ; int nDegV = 1 ; - int nSpanU = 1 ; int nSpanV = 1 ; - bool bRat = false ; + int nDegU = 3 ; int nDegV = 1 ; + int nSpanU = 1 ; int nSpanV = 1 ; + bool bRat = false ; - int nSub = 2 ; // numero di bezier di grado 3x1 con cui approssimare il (quasi) semi-cilindro ellissoide che descrive il volume della punta e della cima del tool - PNTVECTOR d ; - Vector3d q = Z_AX ; + int nSub = 2 ; // numero di bezier di grado 3x1 con cui approssimare il (quasi) semi-cilindro ellissoide che descrive il volume della punta e della cima del tool + PNTVECTOR d ; + Vector3d q = Z_AX ; - int nTotSurf = 4 ; - if ( n5AxisType == Move5Axis::NO_BASE_INTERS) - nTotSurf = 2 + nSub * 2 + nSub * 2 + 8 ; // sup laterali, sup superiori e inferiori, superfici verticali di inizio e fine, superfici di base dei tool - else if ( n5AxisType == Move5Axis::ACROSS) - nTotSurf = 2 + nSub * 4 + nSub * 2 + 16 ; // come sopra + int nTotSurf = 4 ; + if ( n5AxisType == Move5Axis::NO_BASE_INTERS) + nTotSurf = 2 + nSub * 2 + nSub * 2 + 8 ; // sup laterali, sup superiori e inferiori, superfici verticali di inizio e fine, superfici di base dei tool + else if ( n5AxisType == Move5Axis::ACROSS) + nTotSurf = 2 + nSub * 4 + nSub * 2 + 16 ; // come sopra - int nSurfInd = 0 ; - vector vSurfBez( nTotSurf) ; - double dSide = 0 ; + int nSurfInd = 0 ; + vector vSurfBez( nTotSurf) ; + double dSide = 0 ; // punti di riferimento sul tool // tip del tool - Point3d ptP1T ; - Point3d ptP2T ; - // determino la posizione della punta del tool nella posizione iniziale e in quella finale - ptP1T = ptS - dHeight * vtLs ; - ptP2T = ptE - dHeight * vtLe ; - // determino la direzione di movimento del top del tool e della punta del tool - Vector3d vtDirTop = ptE - ptS ; - Vector3d vtDirTip = ptP2T - ptP1T ; + Point3d ptP1T ; + Point3d ptP2T ; + // determino la posizione della punta del tool nella posizione iniziale e in quella finale + ptP1T = ptS - dHeight * vtLs ; + ptP2T = ptE - dHeight * vtLe ; + // determino la direzione di movimento del top del tool e della punta del tool + Vector3d vtDirTop = ptE - ptS ; + Vector3d vtDirTip = ptP2T - ptP1T ; + bool bTopIsPivot = vtDirTop.IsSmall() ; + bool bTipIsPivot = vtDirTip.IsSmall() ; + bool bTopAndTipAreEquiverse = vtDirTop * vtDirTip > 0 ; // box dell'intero volume spazzato, nel riferimento object oriented - BBox3d bbVol ; - Frame3d frVol ; frVol.Set(ptS, vtLs, vtDirTop) ; + BBox3d bbVol ; + Frame3d frVol ; frVol.Set(ptS, vtLs, vtDirTop) ; - // punti sul top e tip del tool che servono per costruire le bilineare di congiunzione tra step - PNTVECTOR vPntTipStartFront(3) ; - PNTVECTOR vPntTipEndFront(3) ; - PNTVECTOR vPntTopStartFront(3) ; - PNTVECTOR vPntTopEndFront(3) ; - // punti addizionali che servono nei casi che rischiedono più superfici bilineari ( tutti tranne NO_BASE_INTERS) - PNTVECTOR vPntTipStartBack(3) ; - PNTVECTOR vPntTipEndBack(3) ; - PNTVECTOR vPntTopStartBack(3) ; - PNTVECTOR vPntTopEndBack(3) ; - if ( nSub > 1) { - // determino in che modo collegare il cilindro iniziale con quello finale - Vector3d vtTopBaseEnd = vtDirTop - (( vtDirTop * vtLe) * vtLe) ; - vtTopBaseEnd.Normalize() ; - vtTopBaseEnd *= dMaxRad ; - Point3d ptRefEnd = ptE - vtTopBaseEnd ; - Vector3d vtTopBaseStart = vtDirTop - (( vtDirTop * vtLs) * vtLs) ; - vtTopBaseStart.Normalize() ; - vtTopBaseStart *= dMaxRad ; - Point3d ptRefStart = ptS + vtTopBaseStart ; - dSide = ( ptRefEnd - ptRefStart) * vtLs ; + // punti sul top e tip del tool che servono per costruire le bilineare di congiunzione tra step + PNTVECTOR vPntTipStartFront(3) ; + PNTVECTOR vPntTipEndFront(3) ; + PNTVECTOR vPntTopStartFront(3) ; + PNTVECTOR vPntTopEndFront(3) ; + // punti addizionali che servono nei casi che rischiedono più superfici bilineari ( tutti tranne NO_BASE_INTERS) + PNTVECTOR vPntTipStartBack(3) ; + PNTVECTOR vPntTipEndBack(3) ; + PNTVECTOR vPntTopStartBack(3) ; + PNTVECTOR vPntTopEndBack(3) ; + if ( nSub > 1) { + if( bTopIsPivot) + vtDirTop = vtDirTip ; + if( bTipIsPivot) + vtDirTip = vtDirTop ; + // determino in che modo collegare il cilindro iniziale con quello finale + Vector3d vtTopBaseEnd = vtDirTop - (( vtDirTop * vtLe) * vtLe) ; + vtTopBaseEnd.Normalize() ; + vtTopBaseEnd *= dMaxRad ; + Point3d ptRefEnd = ptE - vtTopBaseEnd ; + Vector3d vtTopBaseStart = vtDirTop - (( vtDirTop * vtLs) * vtLs) ; + vtTopBaseStart.Normalize() ; + vtTopBaseStart *= dMaxRad ; + Point3d ptRefStart = ptS + vtTopBaseStart ; + dSide = ( ptRefEnd - ptRefStart) * vtLs ; - // calcolo anche i vettori per le basi inferiori - Vector3d vtTipBaseStart = -( vtLs ^ vtDirTip) ; - vtTipBaseStart.Normalize() ; - vtTipBaseStart *= dMinRad ; - Vector3d vtTipBaseEnd = -( vtLe ^ vtDirTip) ; - vtTipBaseEnd.Normalize() ; - vtTipBaseEnd *= dMinRad ; - // aggiungo il primo punto per ognuno dei gruppi - vtTopBaseStart.Rotate( vtLs, 90) ; - vtTopBaseEnd.Rotate( vtLe, 90) ; - vPntTopStartFront[0] = ptS - vtTopBaseStart ; - vPntTopEndFront[0] = ptE - vtTopBaseEnd ; - vPntTipStartFront[0] = ptP1T + vtTipBaseStart ; - vPntTipEndFront[0] = ptP2T + vtTipBaseEnd ; + // calcolo anche i vettori per le basi inferiori + Vector3d vtTipBaseStart = -( vtLs ^ vtDirTip) ; + vtTipBaseStart.Normalize() ; + vtTipBaseStart *= dMinRad ; + Vector3d vtTipBaseEnd = -( vtLe ^ vtDirTip) ; + vtTipBaseEnd.Normalize() ; + vtTipBaseEnd *= dMinRad ; + // aggiungo il primo punto per ognuno dei gruppi + vtTopBaseStart.Rotate( vtLs, 90) ; + vtTopBaseEnd.Rotate( vtLe, 90) ; + vPntTopStartFront[0] = ptS - vtTopBaseStart ; + vPntTopEndFront[0] = ptE - vtTopBaseEnd ; + vPntTipStartFront[0] = ptP1T + vtTipBaseStart ; + vPntTipEndFront[0] = ptP2T + vtTipBaseEnd ; - // punti addizionali per superfici bilineari - vPntTopStartBack[0] = ptS + vtTopBaseStart ; - vPntTopEndBack[0] = ptE + vtTopBaseEnd ; - vPntTipStartBack[0] = ptP1T - vtTipBaseStart ; - vPntTipEndBack[0] = ptP2T - vtTipBaseEnd ; - double dSubAng = 90 ; - // girano tutti in verso CCW rispetto alla normale del tool - for ( int i = 1; i < 3; ++i) { - // punti sulla base superiore dei cilindri - // start - // frontale - vPntTopStartFront[i] = vPntTopStartFront[i - 1] ; - vPntTopStartFront[i].Rotate( ptS, vtLs, dSubAng) ; - // posteriore - vPntTopStartBack[i] = vPntTopStartBack[i - 1]; - vPntTopStartBack[i].Rotate( ptS, vtLs, dSubAng) ; - // end - // frontale - vPntTopEndFront[i] = vPntTopEndFront[i - 1] ; - vPntTopEndFront[i].Rotate( ptE, vtLe, dSubAng) ; - // posteriore - vPntTopEndBack[i] = vPntTopEndBack[i - 1] ; - vPntTopEndBack[i].Rotate( ptE, vtLe, dSubAng) ; + // punti addizionali per superfici bilineari + vPntTopStartBack[0] = ptS + vtTopBaseStart ; + vPntTopEndBack[0] = ptE + vtTopBaseEnd ; + vPntTipStartBack[0] = ptP1T - vtTipBaseStart ; + vPntTipEndBack[0] = ptP2T - vtTipBaseEnd ; + double dSubAng = 90 ; + // girano tutti in verso CCW rispetto alla normale del tool + for ( int i = 1; i < 3; ++i) { + // punti sulla base superiore dei cilindri + // start + // frontale + vPntTopStartFront[i] = vPntTopStartFront[i - 1] ; + vPntTopStartFront[i].Rotate( ptS, vtLs, dSubAng) ; + // posteriore + vPntTopStartBack[i] = vPntTopStartBack[i - 1]; + vPntTopStartBack[i].Rotate( ptS, vtLs, dSubAng) ; + // end + // frontale + vPntTopEndFront[i] = vPntTopEndFront[i - 1] ; + vPntTopEndFront[i].Rotate( ptE, vtLe, dSubAng) ; + // posteriore + vPntTopEndBack[i] = vPntTopEndBack[i - 1] ; + vPntTopEndBack[i].Rotate( ptE, vtLe, dSubAng) ; - // punti sulla base inferiore dei cilindri - vPntTipStartFront[i] = vPntTipStartFront[i - 1] ; - vPntTipStartFront[i].Rotate( ptP1T, vtLs, dSubAng) ; - vPntTipStartBack[i] = vPntTipStartBack[i - 1] ; - vPntTipStartBack[i].Rotate( ptP1T, vtLs, dSubAng) ; + // punti sulla base inferiore dei cilindri + vPntTipStartFront[i] = vPntTipStartFront[i - 1] ; + vPntTipStartFront[i].Rotate( ptP1T, vtLs, dSubAng) ; + vPntTipStartBack[i] = vPntTipStartBack[i - 1] ; + vPntTipStartBack[i].Rotate( ptP1T, vtLs, dSubAng) ; - vPntTipEndFront[i] = vPntTipEndFront[i - 1] ; - vPntTipEndFront[i].Rotate( ptP2T, vtLe, dSubAng) ; - vPntTipEndBack[i] = vPntTipEndBack[i - 1] ; - vPntTipEndBack[i].Rotate( ptP2T, vtLe, dSubAng) ; - } - } + vPntTipEndFront[i] = vPntTipEndFront[i - 1] ; + vPntTipEndFront[i].Rotate( ptP2T, vtLe, dSubAng) ; + vPntTipEndBack[i] = vPntTipEndBack[i - 1] ; + vPntTipEndBack[i].Rotate( ptP2T, vtLe, dSubAng) ; + } + } - vector vvPtCtrl ; - // superficie laterale sinistra - CurveLine cLineLeftStart ; cLineLeftStart.Set( vPntTipStartFront.back(), vPntTopStartFront.back()) ; - PtrOwner cBezLeftStart( GetBasicCurveBezier( LineToBezierCurve( &cLineLeftStart, nDegU, bRat))) ; - CurveLine cLineLeftEnd ; cLineLeftEnd.Set( vPntTipEndFront.back(), vPntTopEndFront.back()) ; - PtrOwner cBezLeftEnd( GetBasicCurveBezier( LineToBezierCurve( &cLineLeftEnd, nDegU, bRat))) ; - vvPtCtrl.emplace_back( cBezLeftStart->GetAllControlPoints()) ; - PNTVECTOR vPntLeft = cBezLeftEnd->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntLeft.begin(), vPntLeft.end()) ; - // superficie laterale destra - CurveLine cLineRightStart ; cLineRightStart.Set( vPntTopStartFront.front(), vPntTipStartFront.front()) ; - PtrOwner cBezRightStart( GetBasicCurveBezier( LineToBezierCurve( &cLineRightStart, nDegU, bRat))) ; - CurveLine cLineRightEnd ; cLineRightEnd.Set( vPntTopEndFront.front(), vPntTipEndFront.front()) ; - PtrOwner cBezRightEnd( GetBasicCurveBezier( LineToBezierCurve( &cLineRightEnd, nDegU, bRat))) ; - vvPtCtrl.emplace_back( cBezRightStart->GetAllControlPoints()) ; - PNTVECTOR vPntRight = cBezRightEnd->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntRight.begin(), vPntRight.end()) ; - if ( nSub == 1) { - // superficie inferiore - vvPtCtrl.emplace_back( PNTVECTOR( { vPntTipStartFront.front(), vPntTipStartFront.back(), vPntTipEndFront.front(), vPntTipEndFront.back() })) ; - // superficie superiore - vvPtCtrl.emplace_back( PNTVECTOR( { vPntTopStartFront.back(), vPntTopStartFront.front(), vPntTopEndFront.back(), vPntTopEndFront.front() })) ; - } - else { - // costruisco tutti gli archi subito - // archi inferiori front - CurveArc cArcTipStartF1, cArcTipEndF1, cArcTipStartF2, cArcTipEndF2 ; - cArcTipStartF1.SetC2PN(ptP1T, vPntTipStartFront[0], vPntTipStartFront[1], vtLs); - cArcTipEndF1.SetC2PN(ptP2T, vPntTipEndFront[0], vPntTipEndFront[1], vtLe); - cArcTipStartF2.SetC2PN(ptP1T, vPntTipStartFront[1], vPntTipStartFront[2], vtLs); - cArcTipEndF2.SetC2PN(ptP2T, vPntTipEndFront[1], vPntTipEndFront[2], vtLe); - PtrOwner cBezTipStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF1, nDegU, bRat))); - PtrOwner cBezTipEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF1, nDegU, bRat))); - PtrOwner cBezTipStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF2, nDegU, bRat))); - PtrOwner cBezTipEndF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF2, nDegU, bRat))); - // !!!! DA SISTEMARE !!!! - if ( IsNull( cBezTipStartF1) || IsNull( cBezTipEndF1) || IsNull( cBezTipStartF2) || IsNull( cBezTipEndF2)) - return true ; - // archi inferiori back - CurveArc cArcTipStartB1, cArcTipEndB1, cArcTipStartB2, cArcTipEndB2; - cArcTipStartB1.SetC2PN(ptP1T, vPntTipStartBack[0], vPntTipStartBack[1], vtLs); - cArcTipEndB1.SetC2PN(ptP2T, vPntTipEndBack[0], vPntTipEndBack[1], vtLe); - cArcTipStartB2.SetC2PN(ptP1T, vPntTipStartBack[1], vPntTipStartBack[2], vtLs); - cArcTipEndB2.SetC2PN(ptP2T, vPntTipEndBack[1], vPntTipEndBack[2], vtLe); - PtrOwner cBezTipStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB1, nDegU, bRat))); - PtrOwner cBezTipEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB1, nDegU, bRat))); - PtrOwner cBezTipStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB2, nDegU, bRat))); - PtrOwner cBezTipEndB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB2, nDegU, bRat))); - // !!!! DA SISTEMARE !!!! - if ( IsNull( cBezTipStartB1) || IsNull( cBezTipEndB1) || IsNull( cBezTipStartB2) || IsNull( cBezTipEndB2)) - return true ; - // archi superiori front - CurveArc cArcTopStartF1, cArcTopEndF1, cArcTopStartF2, cArcTopEndF2; - cArcTopStartF1.SetC2PN(ptS, vPntTopStartFront[0], vPntTopStartFront[1], vtLs); - cArcTopEndF1.SetC2PN(ptE, vPntTopEndFront[0], vPntTopEndFront[1], vtLe); - cArcTopStartF2.SetC2PN(ptS, vPntTopStartFront[1], vPntTopStartFront[2], vtLs); - cArcTopEndF2.SetC2PN(ptE, vPntTopEndFront[1], vPntTopEndFront[2], vtLe); - PtrOwner cBezTopStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF1, nDegU, bRat))); - PtrOwner cBezTopEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF1, nDegU, bRat))); - PtrOwner cBezTopStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF2, nDegU, bRat))); - PtrOwner cBezTopEndF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF2, nDegU, bRat))); - // !!!! DA SISTEMARE !!!! - if ( IsNull( cBezTopStartF1) || IsNull( cBezTopEndF1) || IsNull( cBezTopStartF2) || IsNull( cBezTopEndF2)) - return true ; - // archi superiori back - CurveArc cArcTopStartB1, cArcTopEndB1, cArcTopStartB2, cArcTopEndB2; - cArcTopStartB1.SetC2PN(ptS, vPntTopStartBack[0], vPntTopStartBack[1], vtLs); - cArcTopEndB1.SetC2PN(ptE, vPntTopEndBack[0], vPntTopEndBack[1], vtLe); - cArcTopStartB2.SetC2PN(ptS, vPntTopStartBack[1], vPntTopStartBack[2], vtLs); - cArcTopEndB2.SetC2PN(ptE, vPntTopEndBack[1], vPntTopEndBack[2], vtLe); - PtrOwner cBezTopStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB1, nDegU, bRat))); - PtrOwner cBezTopEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB1, nDegU, bRat))); - PtrOwner cBezTopStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB2, nDegU, bRat))); - PtrOwner cBezTopEndB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB2, nDegU, bRat))); - // !!!! DA SISTEMARE !!!! - if ( IsNull( cBezTopStartB1) || IsNull( cBezTopEndB1) || IsNull( cBezTopStartB2) || IsNull( cBezTopEndB2)) - return true ; + vector vvPtCtrl ; + // superficie laterale sinistra + CurveLine cLineLeftStart ; cLineLeftStart.Set( vPntTipStartFront.back(), vPntTopStartFront.back()) ; + PtrOwner cBezLeftStart( GetBasicCurveBezier( LineToBezierCurve( &cLineLeftStart, nDegU, bRat))) ; + CurveLine cLineLeftEnd ; cLineLeftEnd.Set( vPntTipEndFront.back(), vPntTopEndFront.back()) ; + PtrOwner cBezLeftEnd( GetBasicCurveBezier( LineToBezierCurve( &cLineLeftEnd, nDegU, bRat))) ; + vvPtCtrl.emplace_back( cBezLeftStart->GetAllControlPoints()) ; + PNTVECTOR vPntLeft = cBezLeftEnd->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntLeft.begin(), vPntLeft.end()) ; + // superficie laterale destra + CurveLine cLineRightStart ; cLineRightStart.Set( vPntTopStartFront.front(), vPntTipStartFront.front()) ; + PtrOwner cBezRightStart( GetBasicCurveBezier( LineToBezierCurve( &cLineRightStart, nDegU, bRat))) ; + CurveLine cLineRightEnd ; cLineRightEnd.Set( vPntTopEndFront.front(), vPntTipEndFront.front()) ; + PtrOwner cBezRightEnd( GetBasicCurveBezier( LineToBezierCurve( &cLineRightEnd, nDegU, bRat))) ; + vvPtCtrl.emplace_back( cBezRightStart->GetAllControlPoints()) ; + PNTVECTOR vPntRight = cBezRightEnd->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntRight.begin(), vPntRight.end()) ; + if ( nSub == 1) { + // superficie inferiore + vvPtCtrl.emplace_back( PNTVECTOR( { vPntTipStartFront.front(), vPntTipStartFront.back(), vPntTipEndFront.front(), vPntTipEndFront.back() })) ; + // superficie superiore + vvPtCtrl.emplace_back( PNTVECTOR( { vPntTopStartFront.back(), vPntTopStartFront.front(), vPntTopEndFront.back(), vPntTopEndFront.front() })) ; + } + else { + // costruisco tutti gli archi subito + // archi inferiori front + CurveArc cArcTipStartF1, cArcTipEndF1, cArcTipStartF2, cArcTipEndF2 ; + if ( ! cArcTipStartF1.SetC2PN(ptP1T, vPntTipStartFront[0], vPntTipStartFront[1], vtLs) || + ! cArcTipEndF1.SetC2PN(ptP2T, vPntTipEndFront[0], vPntTipEndFront[1], vtLe) || + ! cArcTipStartF2.SetC2PN(ptP1T, vPntTipStartFront[1], vPntTipStartFront[2], vtLs) || + ! cArcTipEndF2.SetC2PN(ptP2T, vPntTipEndFront[1], vPntTipEndFront[2], vtLe)) + return false ; + PtrOwner cBezTipStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF1, nDegU, bRat))); + PtrOwner cBezTipEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF1, nDegU, bRat))); + PtrOwner cBezTipStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF2, nDegU, bRat))); + PtrOwner cBezTipEndF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF2, nDegU, bRat))); + // archi inferiori back + CurveArc cArcTipStartB1, cArcTipEndB1, cArcTipStartB2, cArcTipEndB2; + if ( ! cArcTipStartB1.SetC2PN(ptP1T, vPntTipStartBack[0], vPntTipStartBack[1], vtLs) || + ! cArcTipEndB1.SetC2PN(ptP2T, vPntTipEndBack[0], vPntTipEndBack[1], vtLe) || + ! cArcTipStartB2.SetC2PN(ptP1T, vPntTipStartBack[1], vPntTipStartBack[2], vtLs) || + ! cArcTipEndB2.SetC2PN(ptP2T, vPntTipEndBack[1], vPntTipEndBack[2], vtLe)) + return false ; + PtrOwner cBezTipStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB1, nDegU, bRat))); + PtrOwner cBezTipEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB1, nDegU, bRat))); + PtrOwner cBezTipStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB2, nDegU, bRat))); + PtrOwner cBezTipEndB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB2, nDegU, bRat))); + if ( IsNull( cBezTipStartB1) || IsNull( cBezTipEndB1) || IsNull( cBezTipStartB2) || IsNull( cBezTipEndB2)) + return false ; + // archi superiori front + CurveArc cArcTopStartF1, cArcTopEndF1, cArcTopStartF2, cArcTopEndF2; + if ( ! cArcTopStartF1.SetC2PN(ptS, vPntTopStartFront[0], vPntTopStartFront[1], vtLs) || + ! cArcTopEndF1.SetC2PN(ptE, vPntTopEndFront[0], vPntTopEndFront[1], vtLe) || + ! cArcTopStartF2.SetC2PN(ptS, vPntTopStartFront[1], vPntTopStartFront[2], vtLs) || + ! cArcTopEndF2.SetC2PN(ptE, vPntTopEndFront[1], vPntTopEndFront[2], vtLe)) + return false ; + PtrOwner cBezTopStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF1, nDegU, bRat))); + PtrOwner cBezTopEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF1, nDegU, bRat))); + PtrOwner cBezTopStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF2, nDegU, bRat))); + PtrOwner cBezTopEndF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF2, nDegU, bRat))); + if ( IsNull( cBezTopStartF1) || IsNull( cBezTopEndF1) || IsNull( cBezTopStartF2) || IsNull( cBezTopEndF2)) + return false ; + // archi superiori back + CurveArc cArcTopStartB1, cArcTopEndB1, cArcTopStartB2, cArcTopEndB2; + if ( ! cArcTopStartB1.SetC2PN(ptS, vPntTopStartBack[0], vPntTopStartBack[1], vtLs) || + ! cArcTopEndB1.SetC2PN(ptE, vPntTopEndBack[0], vPntTopEndBack[1], vtLe) || + ! cArcTopStartB2.SetC2PN(ptS, vPntTopStartBack[1], vPntTopStartBack[2], vtLs) || + ! cArcTopEndB2.SetC2PN(ptE, vPntTopEndBack[1], vPntTopEndBack[2], vtLe)) + return false ; + PtrOwner cBezTopStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB1, nDegU, bRat))); + PtrOwner cBezTopEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB1, nDegU, bRat))); + PtrOwner cBezTopStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB2, nDegU, bRat))); + PtrOwner cBezTopEndB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB2, nDegU, bRat))); + if ( IsNull( cBezTopStartB1) || IsNull( cBezTopEndB1) || IsNull( cBezTopStartB2) || IsNull( cBezTopEndB2)) + return false ; - if ( n5AxisType == Move5Axis::NO_BASE_INTERS || n5AxisType == Move5Axis::ACROSS) { + if ( n5AxisType == Move5Axis::NO_BASE_INTERS || n5AxisType == Move5Axis::ACROSS) { + if ( ! bTipIsPivot) { // inferiori - CurveArc cArcTipStart1, cArcTipEnd1, cArcTipStart2, cArcTipEnd2 ; if ( dSide > 0) { - vvPtCtrl.emplace_back(cBezTipStartF1->GetAllControlPoints()); - PNTVECTOR vPntTipEnd1 = cBezTipEndF1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd1.begin(), vPntTipEnd1.end()); - vvPtCtrl.emplace_back(cBezTipStartF2->GetAllControlPoints()); - PNTVECTOR vPntTipEnd2 = cBezTipEndF2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd2.begin(), vPntTipEnd2.end()); + vvPtCtrl.emplace_back(cBezTipStartF1->GetAllControlPoints()); + PNTVECTOR vPntTipEnd1 = cBezTipEndF1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd1.begin(), vPntTipEnd1.end()); + vvPtCtrl.emplace_back(cBezTipStartF2->GetAllControlPoints()); + PNTVECTOR vPntTipEnd2 = cBezTipEndF2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd2.begin(), vPntTipEnd2.end()); } else { - PNTVECTOR vPntTipEnd01 = cBezTipStartB1->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTipEnd01.rbegin(), vPntTipEnd01.rend()); - PNTVECTOR vPntTipEnd1 = cBezTipEndB1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd1.rbegin(), vPntTipEnd1.rend()); - PNTVECTOR vPntTipEnd02 = cBezTipStartB2->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTipEnd02.rbegin(), vPntTipEnd02.rend()); - PNTVECTOR vPntTipEnd2 = cBezTipEndB2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd2.rbegin(), vPntTipEnd2.rend()); + PNTVECTOR vPntTipEnd01 = cBezTipStartB1->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTipEnd01.rbegin(), vPntTipEnd01.rend()); + PNTVECTOR vPntTipEnd1 = cBezTipEndB1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd1.rbegin(), vPntTipEnd1.rend()); + PNTVECTOR vPntTipEnd02 = cBezTipStartB2->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTipEnd02.rbegin(), vPntTipEnd02.rend()); + PNTVECTOR vPntTipEnd2 = cBezTipEndB2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTipEnd2.rbegin(), vPntTipEnd2.rend()); } + } + if ( ! bTopIsPivot) { // superiori if ( dSide > 0) { - vvPtCtrl.emplace_back(cBezTopStartB1->GetAllControlPoints()); - PNTVECTOR vPntTopEnd1 = cBezTopEndB1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd1.begin(), vPntTopEnd1.end()); - vvPtCtrl.emplace_back(cBezTopStartB2->GetAllControlPoints()); - PNTVECTOR vPntTopEnd2 = cBezTopEndB2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd2.begin(), vPntTopEnd2.end()); + vvPtCtrl.emplace_back(cBezTopStartB1->GetAllControlPoints()); + PNTVECTOR vPntTopEnd1 = cBezTopEndB1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd1.begin(), vPntTopEnd1.end()); + vvPtCtrl.emplace_back(cBezTopStartB2->GetAllControlPoints()); + PNTVECTOR vPntTopEnd2 = cBezTopEndB2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd2.begin(), vPntTopEnd2.end()); } else { - PNTVECTOR vPntTopEnd01 = cBezTopStartF1->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTopEnd01.rbegin(), vPntTopEnd01.rend()); - PNTVECTOR vPntTopEnd1 = cBezTopEndF1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd1.rbegin(), vPntTopEnd1.rend()); - PNTVECTOR vPntTopEnd02 = cBezTopStartF2->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTopEnd02.rbegin(), vPntTopEnd02.rend()); - PNTVECTOR vPntTopEnd2 = cBezTopEndF2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd2.rbegin(), vPntTopEnd2.rend()); + PNTVECTOR vPntTopEnd01 = cBezTopStartF1->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTopEnd01.rbegin(), vPntTopEnd01.rend()); + PNTVECTOR vPntTopEnd1 = cBezTopEndF1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd1.rbegin(), vPntTopEnd1.rend()); + PNTVECTOR vPntTopEnd02 = cBezTopStartF2->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTopEnd02.rbegin(), vPntTopEnd02.rend()); + PNTVECTOR vPntTopEnd2 = cBezTopEndF2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTopEnd2.rbegin(), vPntTopEnd2.rend()); + } + } + + // aggiungo le superfici bilineari anche nell'altro verso sia per il top che per il tip + if ( n5AxisType == Move5Axis::ACROSS) { + if ( ! bTipIsPivot) { + // inferiori + if ( dSide > 0) { + PNTVECTOR vPntTip01 = cBezTipStartB1->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTip01.rbegin(), vPntTip01.rend()); + PNTVECTOR vPntTip1 = cBezTipEndB1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip1.rbegin(), vPntTip1.rend()); + PNTVECTOR vPntTip02 = cBezTipStartB2->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTip02.rbegin(), vPntTip02.rend()); + PNTVECTOR vPntTip2 = cBezTipEndB2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip2.rbegin(), vPntTip2.rend()); + } + else { + vvPtCtrl.emplace_back(cBezTipStartF1->GetAllControlPoints()); + PNTVECTOR vPntTip1 = cBezTipEndF1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip1.begin(), vPntTip1.end()); + vvPtCtrl.emplace_back(cBezTipStartF2->GetAllControlPoints()); + PNTVECTOR vPntTip2 = cBezTipEndF2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip2.begin(), vPntTip2.end()); + } } - // aggiungo le superfici bilineari anche nell'altro verso sia per il top che per il tip - if ( n5AxisType == Move5Axis::ACROSS) { - // inferiori - if ( dSide > 0) { - PNTVECTOR vPntTip01 = cBezTipStartB1->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTip01.rbegin(), vPntTip01.rend()); - PNTVECTOR vPntTip1 = cBezTipEndB1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip1.rbegin(), vPntTip1.rend()); - PNTVECTOR vPntTip02 = cBezTipStartB2->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTip02.rbegin(), vPntTip02.rend()); - PNTVECTOR vPntTip2 = cBezTipEndB2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip2.rbegin(), vPntTip2.rend()); - } - else { - vvPtCtrl.emplace_back(cBezTipStartF1->GetAllControlPoints()); - PNTVECTOR vPntTip1 = cBezTipEndF1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip1.begin(), vPntTip1.end()); - vvPtCtrl.emplace_back(cBezTipStartF2->GetAllControlPoints()); - PNTVECTOR vPntTip2 = cBezTipEndF2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTip2.begin(), vPntTip2.end()); - } - - // superiori - if ( dSide > 0) { - PNTVECTOR vPntTop01 = cBezTopStartF1->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTop01.rbegin(), vPntTop01.rend()); - PNTVECTOR vPntTop1 = cBezTopEndF1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop1.rbegin(), vPntTop1.rend()); - PNTVECTOR vPntTop02 = cBezTopStartF2->GetAllControlPoints(); - vvPtCtrl.emplace_back(vPntTop02.rbegin(), vPntTop02.rend()); - PNTVECTOR vPntTop2 = cBezTopEndF2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop2.rbegin(), vPntTop2.rend()); - } - else { - vvPtCtrl.emplace_back(cBezTopStartB1->GetAllControlPoints()); - PNTVECTOR vPntTop1 = cBezTopEndB1->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop1.begin(), vPntTop1.end()); - vvPtCtrl.emplace_back(cBezTopStartB2->GetAllControlPoints()); - PNTVECTOR vPntTop2 = cBezTopEndB2->GetAllControlPoints(); - vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop2.begin(), vPntTop2.end()); - } + if( ! bTopIsPivot) { + // superiori + if ( dSide > 0) { + PNTVECTOR vPntTop01 = cBezTopStartF1->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTop01.rbegin(), vPntTop01.rend()); + PNTVECTOR vPntTop1 = cBezTopEndF1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop1.rbegin(), vPntTop1.rend()); + PNTVECTOR vPntTop02 = cBezTopStartF2->GetAllControlPoints(); + vvPtCtrl.emplace_back(vPntTop02.rbegin(), vPntTop02.rend()); + PNTVECTOR vPntTop2 = cBezTopEndF2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop2.rbegin(), vPntTop2.rend()); + } + else { + vvPtCtrl.emplace_back(cBezTopStartB1->GetAllControlPoints()); + PNTVECTOR vPntTop1 = cBezTopEndB1->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop1.begin(), vPntTop1.end()); + vvPtCtrl.emplace_back(cBezTopStartB2->GetAllControlPoints()); + PNTVECTOR vPntTop2 = cBezTopEndB2->GetAllControlPoints(); + vvPtCtrl.back().insert(vvPtCtrl.back().end(), vPntTop2.begin(), vPntTop2.end()); + } } - } + } + } - // chiudo il volume con le superfici verticali e le basi dei tool + // chiudo il volume con le superfici verticali e le basi dei tool - // chiudo il volume con le superici verticali end 1 - vvPtCtrl.emplace_back( cBezTipEndF1->GetAllControlPoints()) ; - PNTVECTOR vPntEnd1 = cBezTopEndF1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntEnd1.begin(), vPntEnd1.end()) ; - // chiudo il volume con le superici verticali end 2 - vvPtCtrl.emplace_back( cBezTipEndF2->GetAllControlPoints()) ; - PNTVECTOR vPntEnd2 = cBezTopEndF2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntEnd2.begin(), vPntEnd2.end()) ; + // chiudo il volume con le superici verticali end 1 + vvPtCtrl.emplace_back( cBezTipEndF1->GetAllControlPoints()) ; + PNTVECTOR vPntEnd1 = cBezTopEndF1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntEnd1.begin(), vPntEnd1.end()) ; + // chiudo il volume con le superici verticali end 2 + vvPtCtrl.emplace_back( cBezTipEndF2->GetAllControlPoints()) ; + PNTVECTOR vPntEnd2 = cBezTopEndF2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntEnd2.begin(), vPntEnd2.end()) ; - // chiudo il volume con le superici verticali start 1 - vvPtCtrl.emplace_back( cBezTipStartB1->GetAllControlPoints()) ; - PNTVECTOR vPntStart1 = cBezTopStartB1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntStart1.begin(), vPntStart1.end()) ; - // chiudo il volume con le superfici verticali start 2 - vvPtCtrl.emplace_back( cBezTipStartB2->GetAllControlPoints()) ; - PNTVECTOR vPntStart2 = cBezTopStartB2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntStart2.begin(), vPntStart2.end()) ; + // chiudo il volume con le superici verticali start 1 + vvPtCtrl.emplace_back( cBezTipStartB1->GetAllControlPoints()) ; + PNTVECTOR vPntStart1 = cBezTopStartB1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntStart1.begin(), vPntStart1.end()) ; + // chiudo il volume con le superfici verticali start 2 + vvPtCtrl.emplace_back( cBezTipStartB2->GetAllControlPoints()) ; + PNTVECTOR vPntStart2 = cBezTopStartB2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntStart2.begin(), vPntStart2.end()) ; - // superfici di base dei tool - if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide < 0)) { - // start back tip - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; - PNTVECTOR vPntTipStartBack1 = cBezTipStartB1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartBack1.begin(), vPntTipStartBack1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; - PNTVECTOR vPntTipStartBack2 = cBezTipStartB2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartBack2.begin(), vPntTipStartBack2.end()) ; - // start front tip - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; - PNTVECTOR vPntTipStartFront1 = cBezTipStartF1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartFront1.begin(), vPntTipStartFront1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; - PNTVECTOR vPntTipStartFront2 = cBezTipStartF2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartFront2.begin(), vPntTipStartFront2.end()) ; - } - if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide > 0)) { - // end front tip - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; - PNTVECTOR vPntTipEndFront1 = cBezTipEndF1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndFront1.begin(), vPntTipEndFront1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; - PNTVECTOR vPntTipEndFront2 = cBezTipEndF2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndFront2.begin(), vPntTipEndFront2.end()) ; - // end back tip - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; - PNTVECTOR vPntTipEndBack1 = cBezTipEndB1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndBack1.begin(), vPntTipEndBack1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; - PNTVECTOR vPntTipEndBack2 = cBezTipEndB2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndBack2.begin(), vPntTipEndBack2.end()) ; - } + // superfici di base dei tool + if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide < 0)) { + // start back tip + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; + PNTVECTOR vPntTipStartBack1 = cBezTipStartB1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartBack1.begin(), vPntTipStartBack1.end()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; + PNTVECTOR vPntTipStartBack2 = cBezTipStartB2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartBack2.begin(), vPntTipStartBack2.end()) ; + // start front tip + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; + PNTVECTOR vPntTipStartFront1 = cBezTipStartF1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartFront1.begin(), vPntTipStartFront1.end()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T }) ; + PNTVECTOR vPntTipStartFront2 = cBezTipStartF2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartFront2.begin(), vPntTipStartFront2.end()) ; + } + if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide > 0)) { + // end front tip + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; + PNTVECTOR vPntTipEndFront1 = cBezTipEndF1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndFront1.begin(), vPntTipEndFront1.end()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; + PNTVECTOR vPntTipEndFront2 = cBezTipEndF2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndFront2.begin(), vPntTipEndFront2.end()) ; + // end back tip + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; + PNTVECTOR vPntTipEndBack1 = cBezTipEndB1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndBack1.begin(), vPntTipEndBack1.end()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T }) ; + PNTVECTOR vPntTipEndBack2 = cBezTipEndB2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndBack2.begin(), vPntTipEndBack2.end()) ; + } - if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide > 0)) { - // start back top - vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; - PNTVECTOR vPntTopStartBack1 = cBezTopStartB1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartBack1.rbegin(), vPntTopStartBack1.rend()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; - PNTVECTOR vPntTopStartBack2 = cBezTopStartB2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartBack2.rbegin(), vPntTopStartBack2.rend()) ; - // start front top - vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; - PNTVECTOR vPntTopStartFront1 = cBezTopStartF1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartFront1.rbegin(), vPntTopStartFront1.rend()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; - PNTVECTOR vPntTopStartFront2 = cBezTopStartF2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartFront2.rbegin(), vPntTopStartFront2.rend()) ; - } - if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide < 0)) { - // end front top - vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; - PNTVECTOR vPntTopEndFront1 = cBezTopEndF1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndFront1.rbegin(), vPntTopEndFront1.rend()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; - PNTVECTOR vPntTopEndFront2 = cBezTopEndF2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndFront2.rbegin(), vPntTopEndFront2.rend()) ; - // end back top - vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; - PNTVECTOR vPntTopEndBack1 = cBezTopEndB1->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndBack1.rbegin(), vPntTopEndBack1.rend()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; - PNTVECTOR vPntTopEndBack2 = cBezTopEndB2->GetAllControlPoints() ; - vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndBack2.rbegin(), vPntTopEndBack2.rend()) ; - } - } + if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide > 0)) { + // start back top + vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; + PNTVECTOR vPntTopStartBack1 = cBezTopStartB1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartBack1.rbegin(), vPntTopStartBack1.rend()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; + PNTVECTOR vPntTopStartBack2 = cBezTopStartB2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartBack2.rbegin(), vPntTopStartBack2.rend()) ; + // start front top + vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; + PNTVECTOR vPntTopStartFront1 = cBezTopStartF1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartFront1.rbegin(), vPntTopStartFront1.rend()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptS, ptS, ptS, ptS }) ; + PNTVECTOR vPntTopStartFront2 = cBezTopStartF2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartFront2.rbegin(), vPntTopStartFront2.rend()) ; + } + if ( ! ( n5AxisType == Move5Axis::NO_BASE_INTERS && dSide < 0)) { + // end front top + vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; + PNTVECTOR vPntTopEndFront1 = cBezTopEndF1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndFront1.rbegin(), vPntTopEndFront1.rend()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; + PNTVECTOR vPntTopEndFront2 = cBezTopEndF2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndFront2.rbegin(), vPntTopEndFront2.rend()) ; + // end back top + vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; + PNTVECTOR vPntTopEndBack1 = cBezTopEndB1->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndBack1.rbegin(), vPntTopEndBack1.rend()) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptE, ptE, ptE, ptE }) ; + PNTVECTOR vPntTopEndBack2 = cBezTopEndB2->GetAllControlPoints() ; + vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopEndBack2.rbegin(), vPntTopEndBack2.rend()) ; + } + } - // inizializzo le superfici bilineari e i parametri per le intersezioni - for ( int z = 0 ; z < int( vvPtCtrl.size()) ; ++z) { - vSurfBez[nSurfInd].sBez.Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 0, vvPtCtrl[z][0]) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 1, vvPtCtrl[z][1]) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 2, vvPtCtrl[z][2]) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 3, vvPtCtrl[z][3]) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 4, vvPtCtrl[z][4]) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 5, vvPtCtrl[z][5]) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 6, vvPtCtrl[z][6]) ; - vSurfBez[nSurfInd].sBez.SetControlPoint( 7, vvPtCtrl[z][7]) ; + // inizializzo le superfici bilineari e i parametri per le intersezioni + for ( int z = 0 ; z < int( vvPtCtrl.size()) ; ++z) { + vSurfBez[nSurfInd].sBez.Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 0, vvPtCtrl[z][0]) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 1, vvPtCtrl[z][1]) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 2, vvPtCtrl[z][2]) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 3, vvPtCtrl[z][3]) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 4, vvPtCtrl[z][4]) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 5, vvPtCtrl[z][5]) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 6, vvPtCtrl[z][6]) ; + vSurfBez[nSurfInd].sBez.SetControlPoint( 7, vvPtCtrl[z][7]) ; - Vector3d A = vvPtCtrl[z][4] - vvPtCtrl[z][0] ; - Vector3d B = vvPtCtrl[z][5] - vvPtCtrl[z][1] ; - Vector3d C = vvPtCtrl[z][6] - vvPtCtrl[z][2] ; - Vector3d D = vvPtCtrl[z][7] - vvPtCtrl[z][3] ; - Vector3d E = vvPtCtrl[z][0] - ORIG ; - Vector3d F = vvPtCtrl[z][1] - ORIG ; - Vector3d G = vvPtCtrl[z][2] - ORIG ; - Vector3d H = vvPtCtrl[z][3] - ORIG ; + Vector3d A = vvPtCtrl[z][4] - vvPtCtrl[z][0] ; + Vector3d B = vvPtCtrl[z][5] - vvPtCtrl[z][1] ; + Vector3d C = vvPtCtrl[z][6] - vvPtCtrl[z][2] ; + Vector3d D = vvPtCtrl[z][7] - vvPtCtrl[z][3] ; + Vector3d E = vvPtCtrl[z][0] - ORIG ; + Vector3d F = vvPtCtrl[z][1] - ORIG ; + Vector3d G = vvPtCtrl[z][2] - ORIG ; + Vector3d H = vvPtCtrl[z][3] - ORIG ; - vSurfBez[nSurfInd].a3 = -A + 3 * B - 3 * C + D ; - vSurfBez[nSurfInd].a2 = 3 * A - 6 * B + 3 * C ; - vSurfBez[nSurfInd].a1 = -3 * A + 3 * B ; - vSurfBez[nSurfInd].a0 = A ; + vSurfBez[nSurfInd].a3 = -A + 3 * B - 3 * C + D ; + vSurfBez[nSurfInd].a2 = 3 * A - 6 * B + 3 * C ; + vSurfBez[nSurfInd].a1 = -3 * A + 3 * B ; + vSurfBez[nSurfInd].a0 = A ; - vSurfBez[nSurfInd].b3 = -E + 3 * F - 3 * G + H ; - vSurfBez[nSurfInd].b2 = 3 * E - 6 * F + 3 * G ; - vSurfBez[nSurfInd].b1 = -3 * E + 3 * F ; - vSurfBez[nSurfInd].b0 = E ; + vSurfBez[nSurfInd].b3 = -E + 3 * F - 3 * G + H ; + vSurfBez[nSurfInd].b2 = 3 * E - 6 * F + 3 * G ; + vSurfBez[nSurfInd].b1 = -3 * E + 3 * F ; + vSurfBez[nSurfInd].b0 = E ; - Vector3d vtDirZ = vvPtCtrl[z][4] - vvPtCtrl[z][0] ; - Vector3d vtDirX = vvPtCtrl[z][3] - vvPtCtrl[z][0] ; + Vector3d vtDirZ = vvPtCtrl[z][4] - vvPtCtrl[z][0] ; + Vector3d vtDirX = vvPtCtrl[z][3] - vvPtCtrl[z][0] ; - // devo gestire il caso in cui uno dei due vettori sia == 0 - if (vtDirZ.IsSmall()) { - vtDirZ = vvPtCtrl[z][7] - vvPtCtrl[z][4]; - } - if (vtDirX.IsSmall()) { - vtDirX = vvPtCtrl[z][7] - vvPtCtrl[z][3]; - } - - // calcolo il box in un riferimento che usi come asse x la direzione P10 - P00 o P11 - P01 ( proiettata sul piano perperndicolare a Z) - if ( vSurfBez[nSurfInd].frBox.Set( ORIG, vtDirZ, vtDirX)) { - // porto tutti i punti in quel riferimento e calcolo il box - PNTVECTOR vPtCtrlLoc = vvPtCtrl[z] ; - for ( int p = 0 ; p < int( vPtCtrlLoc.size()) ; ++p) - vPtCtrlLoc[p].ToLoc( vSurfBez[nSurfInd].frBox) ; - vSurfBez[nSurfInd].bbSurfOriented.Add( vPtCtrlLoc) ; - } + // devo gestire il caso in cui uno dei due vettori sia == 0 + if (vtDirZ.IsSmall()) { + vtDirZ = vvPtCtrl[z][7] - vvPtCtrl[z][4]; + } + if (vtDirX.IsSmall()) { + vtDirX = vvPtCtrl[z][7] - vvPtCtrl[z][3]; + } + + // calcolo il box in un riferimento che usi come asse x la direzione P10 - P00 o P11 - P01 ( proiettata sul piano perperndicolare a Z) + if ( vSurfBez[nSurfInd].frBox.Set( ORIG, vtDirZ, vtDirX)) { + // porto tutti i punti in quel riferimento e calcolo il box + PNTVECTOR vPtCtrlLoc = vvPtCtrl[z] ; + for ( int p = 0 ; p < int( vPtCtrlLoc.size()) ; ++p) + vPtCtrlLoc[p].ToLoc( vSurfBez[nSurfInd].frBox) ; + vSurfBez[nSurfInd].bbSurfOriented.Add( vPtCtrlLoc) ; + } - // aggiungo i punti al box del volume spazzato - PNTVECTOR vPtCtrlLoc = vvPtCtrl[z] ; - for (int p = 0; p < int(vPtCtrlLoc.size()); ++p) - vPtCtrlLoc[p].ToLoc(frVol); - bbVol.Add(vPtCtrlLoc) ; + // aggiungo i punti al box del volume spazzato + PNTVECTOR vPtCtrlLoc = vvPtCtrl[z] ; + for (int p = 0; p < int(vPtCtrlLoc.size()); ++p) + vPtCtrlLoc[p].ToLoc(frVol); + bbVol.Add(vPtCtrlLoc) ; - ++ nSurfInd ; - } + ++ nSurfInd ; + } // scorro tutti gli spilloni interessati int j = 0 ; @@ -2386,7 +2398,7 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co InitializePointsAndVectors( ptSti, ptEni, vtDSi, vtDEi, ptLs, ptLe, vtLs, vtLe) ; // Standard è multithread - constexpr bool MULTITHREAD = true ; + constexpr bool MULTITHREAD = false ; if ( MULTITHREAD) { // Ciclo sulle mappe vector> vRes( m_nMapNum) ;