diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index c77292e..137d57c 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -1311,7 +1311,7 @@ VolZmap::GenTool_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& return true ; } -#if false +#if true //debug #define TEST static vector vGeo ; @@ -1346,6 +1346,9 @@ SortGroupInters( PNTVEC3DVECTOR& vInters, INTINTVECTOR& vStartEnds, const Vector bAtStart = (vInters[0].first.x - vInters[1].first.x) < EPS_SMALL ; bAtEnd = (vInters.back().first.x - vInters.end()[-2].first.x) < EPS_SMALL ; } + if( bAtStart && vInters.size() == 2) + return ; + if( bAtStart) swap( vInters[0].second, vInters[1].second) ; else if( bAtEnd) @@ -1409,15 +1412,6 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, bbox.ToLoc( frRot) ; // verifico che lo spillone faccia interferenza con il box della superficie if ( bbox.SqDistFromPointXY( r) < EPS_ZERO) { - //const Vector3d& a3 = srf.a3 ; - //const Vector3d& a2 = srf.a2 ; - //const Vector3d& a1 = srf.a1 ; - //const Vector3d& a0 = srf.a0 ; - //const Vector3d& b3 = srf.b3 ; - //const Vector3d& b2 = srf.b2 ; - //const Vector3d& b1 = srf.b1 ; - //const Vector3d& b0 = srf.b0 ; - // se la linea è parallela all'asse X o Y allora ruoto tutto di 45 gradi rispetto a Z Vector3d a3, a2, a1, a0, b3, b2, b1, b0 ; if ( ! bNeedToRot) { @@ -1480,7 +1474,7 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, q.y*q.z*(a2.z*b0.x + a1.z*b1.x + a0.z*b2.x) - q.z*q.z*(a2.y*b0.x + a1.y*b1.x + a0.y*b2.x) // 4 - r.x*q.y*q.z*a2.z + r.x*q.z*q.z*a2.y + // 4 q.z*q.z*(a2.x*b0.y + a1.x*b1.y + a0.x*b2.y) - q.y*q.z*(a2.x*b0.z + a1.x*b1.z + a0.x*b2.z) // 5 - - q.x*q.z*(a2.z*b0.y + a1.z*b1.y + a0.z*b2.y) - q.x*q.y*(a2.z*b0.z + a1.z*b1.z + a0.z*b2.z)// 5 + - q.x*q.z*(a2.z*b0.y + a1.z*b1.y + a0.z*b2.y) + q.x*q.y*(a2.z*b0.z + a1.z*b1.z + a0.z*b2.z)// 5 - r.y*q.z*q.z*a2.x + r.z*q.y*q.z*a2.x + r.y*q.x*q.z*a2.z - r.z*q.x*q.y*a2.z, // 5 // c3 @@ -1489,7 +1483,7 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, q.y*q.z*(a3.z*b0.x + a2.z*b1.x + a1.z*b2.x + a0.z*b3.x) - q.z*q.z*(a3.y*b0.x + a2.y*b1.x + a1.y*b2.x + a0.y*b3.x) // 4 - r.x*q.y*q.z*a3.z + r.x*q.z*q.z*a3.y + // 4 q.z*q.z*(a3.x*b0.y + a2.x*b1.y + a1.x*b2.y + a0.x*b3.y) - q.y*q.z*(a3.x*b0.z + a2.x*b1.z + a1.x*b2.z + a0.x*b3.z) // 5 - - q.x*q.z*(a3.z*b0.y + a2.z*b1.y + a1.z*b2.y + a0.z*b3.y) - q.x*q.y*(a3.z*b0.z + a2.z*b1.z + a1.z*b2.z + a0.z*b3.z)// 5 + - q.x*q.z*(a3.z*b0.y + a2.z*b1.y + a1.z*b2.y + a0.z*b3.y) + q.x*q.y*(a3.z*b0.z + a2.z*b1.z + a1.z*b2.z + a0.z*b3.z)// 5 - r.y*q.z*q.z*a3.x + r.z*q.y*q.z*a3.x + r.y*q.x*q.z*a3.z - r.z*q.x*q.y*a3.z, // 5 // c4 @@ -1506,7 +1500,7 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, // c6 q.x*q.z*a3.y*b3.z - q.x*q.y*a3.z*b3.z + // 3 - q.y*q.z*a3.z*b3.z - q.z*q.z*a3.y*b3.x + // 4 + q.y*q.z*a3.z*b3.x - q.z*q.z*a3.y*b3.x + // 4 q.z*q.z*a3.x*b3.y - q.y*q.z*a3.x*b3.z - q.x*q.z*a3.z*b3.y + q.x*q.y*a3.z*b3.z} ; // 5 int nRoots = PolynomialRoots( 6, vdCoeff, vdRoots) ; for( int w = 0 ; w < nRoots ; ++w) { @@ -1520,7 +1514,13 @@ IntersLineBezierSurfSet( const Point3d& ptLineStart, const Vector3d& vtLineDir, if( ! bAlreadyFound) { Vector3d vAlpha = a3 * pow(dU, 3) + a2 * pow( dU, 2) + a1 * dU + a0 ; Vector3d vBeta = b3 * pow(dU, 3) + b2 * pow( dU, 2) + b1 * dU + b0 ; - dV = - ( vBeta.x - r.x) / vAlpha.x ; + double dDen = ( vAlpha.x * q.z - vAlpha.z * q.x) ; + if ( dDen > EPS_ZERO) + dV = ( ( vBeta.z - r.z) * q.x - ( vBeta.x - r.x ) * q.z) / dDen ; + else { + double dDen2 = ( vAlpha.y * q.z - vAlpha.z * q.y) ; + dV = ( ( vBeta.z - r.z) * q.y - ( vBeta.y - r.y ) * q.z) / dDen2 ; + } if ( dV > - EPS_ZERO && dV < 1 + EPS_ZERO) { Point3d ptBez ; Vector3d vtN ; @@ -1560,6 +1560,11 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt 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 ; + + //debug + if( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX || n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) + n5AxisType = VolZmap::Move5Axis::NO_BASE_INTERS ; + //debug int nTotSurf = 4; if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) @@ -1866,10 +1871,10 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { // superfici CurveArc cArcTopStart1, cArcTopEnd1, cArcTopStart2, cArcTopEnd2 ; - cArcTopStart1.SetC2PN( ptS[s], vPntTopStartExF[1], vPntTopStartExF[0], vtLs[s]) ; - cArcTopEnd1.SetC2PN( ptE[s], vPntTopEndExF[1], vPntTopEndExF[0], vtLe[s]) ; - cArcTopStart2.SetC2PN( ptS[s], vPntTopStartExF[2], vPntTopStartExF[1], vtLs[s]) ; - cArcTopEnd2.SetC2PN( ptE[s], vPntTopEndExF[2], vPntTopEndExF[1], vtLe[s]) ; + cArcTopStart1.SetC2PN( ptS[s], vPntTopStartFront[1], vPntTopStartFront[0], vtLs[s]) ; + cArcTopEnd1.SetC2PN( ptE[s], vPntTopEndFront[1], vPntTopEndFront[0], vtLe[s]) ; + cArcTopStart2.SetC2PN( ptS[s], vPntTopStartFront[2], vPntTopStartFront[1], vtLs[s]) ; + cArcTopEnd2.SetC2PN( ptE[s], vPntTopEndFront[2], vPntTopEndFront[1], vtLe[s]) ; // superfici superiori 1 PtrOwner cBezTopStart1( GetBasicCurveBezier(ArcToBezierCurve( &cArcTopStart1, nDegU, bRat))) ; PtrOwner cBezTopEnd1( GetBasicCurveBezier(ArcToBezierCurve( &cArcTopEnd1, nDegU, bRat))) ; @@ -1884,10 +1889,10 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTop2.begin(), vPntTop2.end()) ; // superfici CurveArc cArcTopStart3, cArcTopEnd3, cArcTopStart4, cArcTopEnd4 ; - cArcTopStart3.SetC2PN( ptS[s], vPntTopStartExB[0], vPntTopStartExB[1], vtLs[s]) ; - cArcTopEnd3.SetC2PN( ptE[s], vPntTopEndExB[0], vPntTopEndExB[1], vtLe[s]) ; - cArcTopStart4.SetC2PN( ptS[s], vPntTopStartExB[1], vPntTopStartExB[2], vtLs[s]) ; - cArcTopEnd4.SetC2PN( ptE[s], vPntTopEndExB[1], vPntTopEndExB[2], vtLe[s]) ; + cArcTopStart3.SetC2PN( ptS[s], vPntTopStartBack[0], vPntTopStartBack[1], vtLs[s]) ; + cArcTopEnd3.SetC2PN( ptE[s], vPntTopEndBack[0], vPntTopEndBack[1], vtLe[s]) ; + cArcTopStart4.SetC2PN( ptS[s], vPntTopStartBack[1], vPntTopStartBack[2], vtLs[s]) ; + cArcTopEnd4.SetC2PN( ptE[s], vPntTopEndBack[1], vPntTopEndBack[2], vtLe[s]) ; // superfici superiori indietro 1 PtrOwner cBezTopStart3( GetBasicCurveBezier(ArcToBezierCurve( &cArcTopStart3, nDegU, bRat))) ; PtrOwner cBezTopEnd3( GetBasicCurveBezier(ArcToBezierCurve( &cArcTopEnd3, nDegU, bRat))) ; @@ -1902,9 +1907,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTop4.begin(), vPntTop4.end()) ; // superfici inferiori semplici - CurveLine cLineStart ; cLineStart.Set( vPntTipStartBack[s], vPntTipStartBack[s]) ; + CurveLine cLineStart ; cLineStart.Set( vPntTipStartBack.front(), vPntTipStartBack.back()) ; PtrOwner cBezTipStart( GetBasicCurveBezier( LineToBezierCurve( &cLineStart, nDegU, bRat))) ; - CurveLine cLineEnd ; cLineEnd.Set( vPntTipEndBack[s], vPntTipEndBack[s]) ; + CurveLine cLineEnd ; cLineEnd.Set( vPntTipEndBack.front(), vPntTipEndBack.back()) ; PtrOwner cBezTipEnd( GetBasicCurveBezier( LineToBezierCurve( &cLineEnd, nDegU, bRat))) ; vvPtCtrl.emplace_back( cBezTipStart->GetAllControlPoints()) ; PNTVECTOR vPntTip = cBezTipEnd->GetAllControlPoints() ; @@ -1949,9 +1954,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTip4.begin(), vPntTip4.end()) ; // superfici superiori semplici - CurveLine cLineStart ; cLineStart.Set( vPntTopStartBack[s], vPntTopStartBack[s]) ; + CurveLine cLineStart ; cLineStart.Set( vPntTopStartBack.back(), vPntTopStartBack.front()) ; PtrOwner cBezTopStart( GetBasicCurveBezier( LineToBezierCurve( &cLineStart, nDegU, bRat))) ; - CurveLine cLineEnd ; cLineEnd.Set( vPntTopEndBack[s], vPntTopEndBack[s]) ; + CurveLine cLineEnd ; cLineEnd.Set( vPntTopEndBack.back(), vPntTopEndBack.front()) ; PtrOwner cBezTopEnd( GetBasicCurveBezier( LineToBezierCurve( &cLineEnd, nDegU, bRat))) ; vvPtCtrl.emplace_back( cBezTopStart->GetAllControlPoints()) ; PNTVECTOR vPntTop = cBezTopEnd->GetAllControlPoints() ; @@ -2005,10 +2010,10 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt cArcTipStartBack2.SetC2PN( ptP1TEx, vPntTipStartExB[1], vPntTipStartExB[2], vtLs.front()) ; PtrOwner cBezTipStartBack1( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipStartBack1, nDegU, bRat))) ; PtrOwner cBezTipStartBack2( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipStartBack2, nDegU, bRat))) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1TEx, ptP1TEx, ptP1TEx, ptP1TEx}) ; PNTVECTOR vPntTipStartBack1 = cBezTipStartBack1->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartBack1.begin(), vPntTipStartBack1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1TEx, ptP1TEx, ptP1TEx, ptP1TEx}) ; PNTVECTOR vPntTipStartBack2 = cBezTipStartBack2->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartBack2.begin(), vPntTipStartBack2.end()) ; if( n5AxisType != VolZmap::Move5Axis::ALONG_CONVEX) { @@ -2018,10 +2023,10 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt cArcTipStartFront2.SetC2PN( ptP1TEx, vPntTipStartExF[1], vPntTipStartExF[2], vtLs.front()) ; PtrOwner cBezTipStartFront1( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipStartFront1, nDegU, bRat))) ; PtrOwner cBezTipStartFront2( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipStartFront2, nDegU, bRat))) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1TEx, ptP1TEx, ptP1TEx, ptP1TEx}) ; PNTVECTOR vPntTipStartFront1 = cBezTipStartFront1->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartFront1.begin(), vPntTipStartFront1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP1T, ptP1T, ptP1T, ptP1T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP1TEx, ptP1TEx, ptP1TEx, ptP1TEx}) ; PNTVECTOR vPntTipStartFront2 = cBezTipStartFront2->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipStartFront2.begin(), vPntTipStartFront2.end()) ; } @@ -2034,10 +2039,10 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt cArcTipEndFront2.SetC2PN( ptP2TEx, vPntTipEndExF[1], vPntTipEndExF[2], vtLe.back()) ; PtrOwner cBezTipEndFront1( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipEndFront1, nDegU, bRat))) ; PtrOwner cBezTipEndFront2( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipEndFront2, nDegU, bRat))) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2TEx, ptP2TEx, ptP2TEx, ptP2TEx}) ; PNTVECTOR vPntTipEndFront1 = cBezTipEndFront1->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndFront1.begin(), vPntTipEndFront1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2TEx, ptP2TEx, ptP2TEx, ptP2TEx}) ; PNTVECTOR vPntTipEndFront2 = cBezTipEndFront2->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndFront2.begin(), vPntTipEndFront2.end()) ; if( n5AxisType != VolZmap::Move5Axis::ALONG_CONVEX) { @@ -2047,10 +2052,10 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt cArcTipEndBack2.SetC2PN( ptP2TEx, vPntTipEndExB[1], vPntTipEndExB[2], vtLe.back()) ; PtrOwner cBezTipEndBack1( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipEndBack1, nDegU, bRat))) ; PtrOwner cBezTipEndBack2( GetBasicCurveBezier(ArcToBezierCurve( &cArcTipEndBack2, nDegU, bRat))) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2TEx, ptP2TEx, ptP2TEx, ptP2TEx}) ; PNTVECTOR vPntTipEndBack1 = cBezTipEndBack1->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndBack1.begin(), vPntTipEndBack1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptP2T, ptP2T, ptP2T, ptP2T}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptP2TEx, ptP2TEx, ptP2TEx, ptP2TEx}) ; PNTVECTOR vPntTipEndBack2 = cBezTipEndBack2->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTipEndBack2.begin(), vPntTipEndBack2.end()) ; } @@ -2077,10 +2082,10 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt cArcTopStartFront2.SetC2PN( ptS.front(), vPntTopStartExF[2], vPntTopStartExF[1], vtLs.front()) ; PtrOwner cBezTopStartFront1( GetBasicCurveBezier(ArcToBezierCurve( &cArcTopStartFront1, nDegU, bRat))) ; PtrOwner cBezTopStartFront2( GetBasicCurveBezier(ArcToBezierCurve( &cArcTopStartFront2, nDegU, bRat))) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptS[s], ptS[s], ptS[s], ptS[s]}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptS[0], ptS[0], ptS[0], ptS[0]}) ; PNTVECTOR vPntTopStartFront1 = cBezTopStartFront1->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartFront1.begin(), vPntTopStartFront1.end()) ; - vvPtCtrl.emplace_back( PNTVECTOR{ ptS[s], ptS[s], ptS[s], ptS[s]}) ; + vvPtCtrl.emplace_back( PNTVECTOR{ ptS[0], ptS[0], ptS[0], ptS[0]}) ; PNTVECTOR vPntTopStartFront2 = cBezTopStartFront2->GetAllControlPoints() ; vvPtCtrl.back().insert( vvPtCtrl.back().end(), vPntTopStartFront2.begin(), vPntTopStartFront2.end()) ; } @@ -2211,7 +2216,7 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt if ( ! bForward && vStartEnds.size() > 1) { // salvo la prima intersezione dubbia e comincio a scorrere al contrario per trovare l'ultima e capire se è dello stesso tipo della prima - if( ! bAllSameType) { + if( ! bAllSameType || true) { // DEBUG !!!!!!!!!!! bUseOnlyExtremes = false ; // calcolo le intersezioni anche sugli altri due spilloni passanti per un punto a metà tra due dei vari intervalli // ho almeno due intervalli; prendo un punto a metà tra la fine del primo e l'inzio del secondo @@ -2224,8 +2229,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, vIntersX, vSurfX) ; if( vIntersX.size() > 1) { SortGroupInters( vIntersX, vStartEndsX, X_AX) ; - // se ho più di una intersezione e il punto di studio è compreso tra questi punti allora le info lungo questa direzione mi dicono che sono interno al volume spazzato - bXInclude = vIntersX[vStartEndsX.front().first].first.x < ptLineStart.x && vIntersX[vStartEndsX.back().second].first.x > ptLineStart.x ; + if( vStartEndsX.size() != 0) + // se ho più di una intersezione e il punto di studio è compreso tra questi punti allora le info lungo questa direzione mi dicono che sono interno al volume spazzato + bXInclude = vIntersX[vStartEndsX.front().first].first.x < ptLineStart.x && vIntersX[vStartEndsX.back().second].first.x > ptLineStart.x ; } vtLineStart = Y_AX ; @@ -2236,8 +2242,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt IntersLineBezierSurfSet( ptLineStart, vtLineStart, vSurfBez, vIntersY, vSurfY) ; if ( vIntersY.size() > 1) { SortGroupInters( vIntersY, vStartEndsY, Y_AX) ; - // se ho più di una intersezione e il punto di studio è compreso tra questi punti allora le info lungo questa direzione mi dicono che sono interno al volume spazzato - bYInclude = vIntersY[vStartEndsY.front().first].first.y < ptLineStart.y && vIntersY[vStartEndsY.back().second].first.y > ptLineStart.y ; + if( vStartEndsY.size() != 0) + // se ho più di una intersezione e il punto di studio è compreso tra questi punti allora le info lungo questa direzione mi dicono che sono interno al volume spazzato + bYInclude = vIntersY[vStartEndsY.front().first].first.y < ptLineStart.y && vIntersY[vStartEndsY.back().second].first.y > ptLineStart.y ; } // se anche gli spilloni nelle altre due direzioni fanno intersezione sia a destra che a sinistra rispetto al punto a metà tra gli intervalli, allora sono all'interno del volume @@ -2255,8 +2262,22 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // questo tipo e calcolare solo le intersezioni if ( bUseOnlyExtremes == bFirstAmbiguousCaseType) bAllSameType = true ; + + if( bUseOnlyExtremes != bFirstAmbiguousCaseType && bAllSameType) + return false ; + } + + if( ! bAllSameType) + vIntervalsToSubtr.emplace_back( i, nJToSave, vInters, vStartEnds, bUseOnlyExtremes) ; + else { + bUseOnlyExtremes = bFirstAmbiguousCaseType ; + if ( bUseOnlyExtremes) + SubtractIntervals( nGrid, i, j, vInters.front().first.z, vInters.back().first.z, vInters.front().second, vInters.back().second, nToolNum) ; + else { + for( auto p : vStartEnds) + SubtractIntervals(nGrid, i, j, vInters[p.first].first.z, vInters[p.second].first.z, vInters[p.first].second, vInters[p.second].second, nToolNum) ; + } } - vIntervalsToSubtr.emplace_back( i, nJToSave, vInters, vStartEnds, bUseOnlyExtremes) ; } else { for( auto p : vStartEnds) @@ -2267,8 +2288,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt vStartEnds.push_back(INTINT(0, 1)) ; SubtractIntervals( nGrid, i, j, vInters.front().first.z, vInters.back().first.z, vInters.front().second, vInters.back().second, nToolNum) ; } - else if ( vInters.size() == 1) - return false ; + else if ( vInters.size() == 1) { + // se trovo solo un'intersezione è una tangenza tra spillone e una superficie + } if ( bForward) ++j ; @@ -2553,9 +2575,11 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co // // aggiorno prossimo inizio // ptSt = ptEn ; //} + + //return bOk ; //////// debug - vecchia modalità - + Point3d ptSti = ptPs ; Vector3d vtDSi = vtDs ;