EgtGeomKernel :

- aggiunta controlli e correzione al VM 5 assi in caso di movimento a perno sulla punta del tool.
This commit is contained in:
Daniele Bariletti
2026-01-07 12:26:13 +01:00
parent 913d5f60ca
commit 0d62cd9bbd
+393 -381
View File
@@ -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<SurfBezForInters> vSurfBez( nTotSurf) ;
double dSide = 0 ;
int nSurfInd = 0 ;
vector<SurfBezForInters> 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<PNTVECTOR> vvPtCtrl ;
// superficie laterale sinistra
CurveLine cLineLeftStart ; cLineLeftStart.Set( vPntTipStartFront.back(), vPntTopStartFront.back()) ;
PtrOwner<CurveBezier> cBezLeftStart( GetBasicCurveBezier( LineToBezierCurve( &cLineLeftStart, nDegU, bRat))) ;
CurveLine cLineLeftEnd ; cLineLeftEnd.Set( vPntTipEndFront.back(), vPntTopEndFront.back()) ;
PtrOwner<CurveBezier> 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<CurveBezier> cBezRightStart( GetBasicCurveBezier( LineToBezierCurve( &cLineRightStart, nDegU, bRat))) ;
CurveLine cLineRightEnd ; cLineRightEnd.Set( vPntTopEndFront.front(), vPntTipEndFront.front()) ;
PtrOwner<CurveBezier> 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<CurveBezier> cBezTipStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF2, nDegU, bRat)));
PtrOwner<CurveBezier> 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<CurveBezier> cBezTipStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB2, nDegU, bRat)));
PtrOwner<CurveBezier> 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<CurveBezier> cBezTopStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF2, nDegU, bRat)));
PtrOwner<CurveBezier> 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<CurveBezier> cBezTopStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB2, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopEndB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB2, nDegU, bRat)));
// !!!! DA SISTEMARE !!!!
if ( IsNull( cBezTopStartB1) || IsNull( cBezTopEndB1) || IsNull( cBezTopStartB2) || IsNull( cBezTopEndB2))
return true ;
vector<PNTVECTOR> vvPtCtrl ;
// superficie laterale sinistra
CurveLine cLineLeftStart ; cLineLeftStart.Set( vPntTipStartFront.back(), vPntTopStartFront.back()) ;
PtrOwner<CurveBezier> cBezLeftStart( GetBasicCurveBezier( LineToBezierCurve( &cLineLeftStart, nDegU, bRat))) ;
CurveLine cLineLeftEnd ; cLineLeftEnd.Set( vPntTipEndFront.back(), vPntTopEndFront.back()) ;
PtrOwner<CurveBezier> 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<CurveBezier> cBezRightStart( GetBasicCurveBezier( LineToBezierCurve( &cLineRightStart, nDegU, bRat))) ;
CurveLine cLineRightEnd ; cLineRightEnd.Set( vPntTopEndFront.front(), vPntTipEndFront.front()) ;
PtrOwner<CurveBezier> 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<CurveBezier> cBezTipStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF2, nDegU, bRat)));
PtrOwner<CurveBezier> 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<CurveBezier> cBezTipStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTipStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB2, nDegU, bRat)));
PtrOwner<CurveBezier> 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<CurveBezier> cBezTopStartF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF2, nDegU, bRat)));
PtrOwner<CurveBezier> 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<CurveBezier> cBezTopStartB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB1, nDegU, bRat)));
PtrOwner<CurveBezier> cBezTopStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB2, nDegU, bRat)));
PtrOwner<CurveBezier> 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<future<bool>> vRes( m_nMapNum) ;