diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index 124e2ea..acf481d 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -1748,16 +1748,12 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX){ if ( bOnBottomBase1) bUpdate1 = dBottomBaseSide1 < 0 ; - else if ( bOnTopBase1) { - bApproxedSideTop = dTopBaseSide1 < 0 ; - bUpdate1 = dTopBaseSide1 > 0 ; - } + else if ( bOnTopBase1) + bApproxedSideTop = true ; } - else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE ) { - if ( bOnBottomBase1) { - bApproxedSideBottom = dBottomBaseSide1 < 0 ; - bUpdate1 = dBottomBaseSide1 > 0 ; - } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + if ( bOnBottomBase1) + bApproxedSideBottom = true ; else if ( bOnTopBase1) bUpdate1 = dTopBaseSide1 < 0 ; } @@ -1766,11 +1762,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub) + 1) ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = (pt1 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; - if ( dSide > 0) - bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt1 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; + if ( dSide > 0) + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide1 > 0) { + // in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + dDist = (pt1 - frStartCyl.Orig()) * ( - vvtTipStartAux[(nSub + 1) - nSector]) ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //dDist = (pt1 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + } } // base superiore else if( bOnTopBase1 && bApproxedSideTop) { @@ -1778,11 +1790,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt1 - ( frStartCyl.Orig() + frStartCyl.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; - if( dSide < 0) - bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt1 - ( frStartCyl.Orig() + frStartCyl.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; + if( dSide < 0) + bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base top avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide1 > 0) { + // in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + dDist = (pt1 - frStartCyl.Orig()) * ( - vvtTipStartAux[(nSub + 1) - nSector]) ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //dDist = (pt1 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + } } else if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase1 && dSide < 0) || ( bOnBottomBase1 && dSide > 0))) bUpdate1 = true ; @@ -1818,16 +1846,12 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX){ if ( bOnBottomBase2) bUpdate2 = dBottomBaseSide2 < 0 ; - else if ( bOnTopBase2) { - bApproxedSideTop = dTopBaseSide2 < 0 ; - bUpdate2 = dTopBaseSide2 > 0 ; - } + else if ( bOnTopBase2) + bApproxedSideTop = true ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { - if ( bOnBottomBase2) { - bApproxedSideBottom = dBottomBaseSide2 < 0 ; - bUpdate2 = dBottomBaseSide2 > 0 ; - } + if ( bOnBottomBase2) + bApproxedSideBottom = true ; else if ( bOnTopBase2) bUpdate2 = dTopBaseSide2 < 0 ; } @@ -1836,12 +1860,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt2 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; - if ( dSide > 0) - bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; - + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt2 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; + if ( dSide > 0) + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide2 > 0) { + // in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + dDist = (pt2 - frStartCyl.Orig()) * ( - vvtTipStartAux[(nSub + 1) - nSector]) ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //dDist = (pt2 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } + } } // base superiore else if( bOnTopBase2 && bApproxedSideTop) { @@ -1849,11 +1888,26 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt2 - ( frStartCyl.Orig() + frStartCyl.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; - if ( dSide < 0) - bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; - else { - bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt2 - ( frStartCyl.Orig() + frStartCyl.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; + if( dSide < 0) + bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base top avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide2 > 0) { + // in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + dDist = (pt2 - frStartCyl.Orig()) * ( - vvtTipStartAux[(nSub + 1) - nSector]) ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //dDist = (pt2 - frStartCyl.Orig()) * vvtTipStartAux[nSector] ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } } } else if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase2 && dSide < 0) || ( bOnBottomBase2 && dSide > 0))) @@ -1908,16 +1962,12 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX){ if ( bOnBottomBase1) bUpdate1 = dBottomBaseSide1 > 0 ; - else if ( bOnTopBase1) { - bApproxedSideTop = dTopBaseSide1 > 0 ; - bUpdate1 = dTopBaseSide1 < 0 ; - } + else if ( bOnTopBase1) + bApproxedSideTop = true ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE ) { - if ( bOnBottomBase1) { - bApproxedSideBottom = dBottomBaseSide1 > 0 ; - bUpdate1 = dBottomBaseSide1 < 0 ; - } + if ( bOnBottomBase1) + bApproxedSideBottom = true ; else if ( bOnTopBase1) bUpdate1 = dTopBaseSide1 > 0 ; } @@ -1926,11 +1976,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = (pt1 - frEndCyl.Orig()) * vvtTipEndAux[nSector] ; - if ( dSide < 0) - bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt1 - frEndCyl.Orig()) * vvtTipEndAux[nSector] ; + if ( dSide < 0) + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide1 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt1 - frEndCyl.Orig()) * ( - vvtTipEndAux[(nSub + 1) - nSector]) ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + else { + dDist = (pt1 - frEndCyl.Orig()) * vvtTipEndAux[nSector] ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } // base superiore else if( bOnTopBase1 && bApproxedSideTop) { @@ -1938,11 +2004,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt1 - ( frEndCyl.Orig() + frEndCyl.VersZ() * dHeight)) * vvtTopEndAux[nSector] ; - if ( dSide > 0) - bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt1 - ( frEndCyl.Orig() + frEndCyl.VersZ() * dHeight)) * vvtTopEndAux[nSector] ; + if( dSide > 0) + bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base top avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide1 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt1 - frEndCyl.Orig()) * ( - vvtTipEndAux[(nSub + 1) - nSector]) ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + else { + dDist = (pt1 - frEndCyl.Orig()) * vvtTipEndAux[nSector] ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } else if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase1 && dSide > 0) || ( bOnBottomBase1 && dSide < 0))) bUpdate1 = true ; @@ -1978,16 +2060,12 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX){ if ( bOnBottomBase2) bUpdate2 = dBottomBaseSide2 > 0 ; - else if ( bOnTopBase2) { - bApproxedSideTop = dTopBaseSide2 > 0 ; - bUpdate2 = dTopBaseSide2 < 0 ; - } + else if ( bOnTopBase2) + bApproxedSideTop = true ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { - if ( bOnBottomBase2) { - bApproxedSideBottom = dBottomBaseSide2 > 0 ; - bUpdate2 = dBottomBaseSide2 < 0 ; - } + if ( bOnBottomBase2) + bApproxedSideBottom = true ; else if ( bOnTopBase2) bUpdate2 = dTopBaseSide2 > 0 ; } @@ -1996,11 +2074,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = (pt2 - frEndCyl.Orig()) * vvtTipEndAux[nSector] ; - if ( dSide < 0) - bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt2 - frEndCyl.Orig()) * vvtTipEndAux[nSector] ; + if ( dSide < 0) + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide2 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt2 - frEndCyl.Orig()) * ( - vvtTipEndAux[(nSub + 1) - nSector]) ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } + else { + dDist = (pt2 - frEndCyl.Orig()) * vvtTipEndAux[nSector] ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } // base superiore else if( bOnTopBase2 && bApproxedSideTop) { @@ -2008,11 +2102,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt2 - ( frEndCyl.Orig() + frEndCyl.VersZ() * dHeight)) * vvtTopEndAux[nSector] ; - if ( dSide > 0) - bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; - else - bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt2 - ( frEndCyl.Orig() + frEndCyl.VersZ() * dHeight)) * vvtTopEndAux[nSector] ; + if( dSide > 0) + bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base top avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide2 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt2 - frEndCyl.Orig()) * ( - vvtTopEndAux[(nSub + 1) - nSector]) ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } + else { + dDist = (pt2 - frEndCyl.Orig()) * vvtTopEndAux[nSector] ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } else if ( (n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase2 && dSide > 0) || ( bOnBottomBase2 && dSide < 0)))) bUpdate2 = true ; @@ -2050,48 +2160,60 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt double dSectorAng = 0 ; bool bApproxedSideBottom = false ; bool bApproxedSideTop = false ; - double dBottomBaseSide2 = ( pt2 - frStartCon.Orig()) * vtDirTipStartEx ; - double dTopBaseSide2 = ( pt2 - ( frStartCon.Orig() + frStartCon.VersZ() * dHeight))* vtDirTopStartEx ; + double dBottomBaseSide1 = ( pt1 - frStartCon.Orig()) * vtDirTipStartEx ; + double dTopBaseSide1 = ( pt1 - ( frStartCon.Orig() + frStartCon.VersZ() * dHeight))* vtDirTopStartEx ; if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { if ( dSide < 0) { - bApproxedSideBottom = dBottomBaseSide2 < 0 ; - bApproxedSideTop = dTopBaseSide2 > 0 ; + bApproxedSideBottom = dBottomBaseSide1 < 0 ; + bApproxedSideTop = dTopBaseSide1 > 0 ; } else { - bApproxedSideBottom = dBottomBaseSide2 > 0 ; - bApproxedSideTop = dTopBaseSide2 < 0 ; + bApproxedSideBottom = dBottomBaseSide1 > 0 ; + bApproxedSideTop = dTopBaseSide1 < 0 ; } } else if ( n5AxisType == VolZmap::Move5Axis::ACROSS) { - bApproxedSideBottom = dBottomBaseSide2 < 0 ; - bApproxedSideTop = dTopBaseSide2 < 0 ; + bApproxedSideBottom = dBottomBaseSide1 < 0 ; + bApproxedSideTop = dTopBaseSide1 < 0 ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX){ - if ( bOnBottomBase2) - bUpdate2 = dBottomBaseSide2 < 0 ; - else if ( bOnTopBase2) { - bApproxedSideTop = dTopBaseSide2 < 0 ; - bUpdate2 = dTopBaseSide2 > 0 ; - } + if ( bOnBottomBase1) + bUpdate1 = dBottomBaseSide1 < 0 ; + else if ( bOnTopBase1) + bApproxedSideTop = true ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { - if ( bOnBottomBase2) { - bApproxedSideBottom = dBottomBaseSide2 < 0 ; - bUpdate2 = dBottomBaseSide2 > 0 ; - } - else if ( bOnTopBase2) - bUpdate2 = dTopBaseSide2 < 0 ; + if ( bOnBottomBase1) + bApproxedSideBottom = true ; + else if ( bOnTopBase1) + bUpdate1 = dTopBaseSide1 < 0 ; } if ( bOnBottomBase1 && bApproxedSideBottom) { vvtTipStartAux.front().GetAngle(pt1 - frStartCon.Orig(), dSectorAng) ; // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub) + 1) ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = (pt1 - frStartCon.Orig()) * vvtTipStartAux[nSector] ; - if ( dSide > 0) - bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt1 - frStartCon.Orig()) * vvtTipStartAux[nSector] ; + if ( dSide > 0) + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide1 > 0) { + // in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + dDist = (pt1 - frStartCon.Orig()) * ( - vvtTipStartAux[(nSub + 1) - nSector]) ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //dDist = (pt1 - frStartCon.Orig()) * vvtTipStartAux[nSector] ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + } } // base superiore else if( bOnTopBase1 && bApproxedSideTop) { @@ -2099,11 +2221,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt1 - ( frStartCon.Orig() + frStartCon.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; - if( dSide < 0) - bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt1 - ( frStartCon.Orig() + frStartCon.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; + if( dSide < 0) + bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base top avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide1 > 0) { + dDist = (pt1 - frStartCon.Orig()) * ( - vvtTopStartAux[(nSub + 1) - nSector]) ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt1 - frStartCon.Orig()) * vvtTopStartAux[nSector] ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + } } else if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase1 && dSide < 0) || ( bOnBottomBase1 && dSide > 0))) bUpdate1 = true ; @@ -2140,11 +2278,11 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt if ( bOnBottomBase2) bUpdate2 = dBottomBaseSide2 < 0 ; else if ( bOnTopBase2) - bApproxedSideTop = dTopBaseSide2 < 0 ; + bApproxedSideTop = true ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { if ( bOnBottomBase2) - bApproxedSideBottom = dBottomBaseSide2 < 0 ; + bApproxedSideBottom = true ; else if ( bOnTopBase2) bUpdate2 = dTopBaseSide2 < 0 ; } @@ -2153,11 +2291,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt2 - frStartCon.Orig()) * vvtTipStartAux[nSector] ; - if ( dSide > 0) - bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt2 - frStartCon.Orig()) * vvtTipStartAux[nSector] ; + if ( dSide > 0) + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide2 > 0) { + // in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + dDist = (pt2 - frStartCon.Orig()) * ( - vvtTipStartAux[(nSub + 1) - nSector]) ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //dDist = (pt2 - frStartCon.Orig()) * vvtTipStartAux[nSector] ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } + } } // base superiore @@ -2166,11 +2320,26 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt2 - ( frStartCon.Orig() + frStartCon.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; - if ( dSide < 0) - bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; - else { - bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt2 - ( frStartCon.Orig() + frStartCon.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; + if( dSide < 0) + bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide2 > 0) { + dDist = (pt2 - frStartCon.Orig()) * ( - vvtTopStartAux[(nSub + 1) - nSector]) ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + else { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt2 - frStartCon.Orig()) * vvtTopStartAux[nSector] ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } } } else if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase2 && dSide < 0) || ( bOnBottomBase2 && dSide > 0))) @@ -2225,16 +2394,12 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX){ if ( bOnBottomBase1) bUpdate1 = dBottomBaseSide1 > 0 ; - else if ( bOnTopBase1) { - bApproxedSideTop = dTopBaseSide1 > 0 ; - bUpdate1 = dTopBaseSide1 < 0 ; - } + else if ( bOnTopBase1) + bApproxedSideTop = true ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE ) { - if ( bOnBottomBase1) { - bApproxedSideBottom = dBottomBaseSide1 > 0 ; - bUpdate1 = dBottomBaseSide1 < 0 ; - } + if ( bOnBottomBase1) + bApproxedSideBottom = true ; else if ( bOnTopBase1) bUpdate1 = dTopBaseSide1 > 0 ; } @@ -2243,11 +2408,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = (pt1 - frEndCon.Orig()) * vvtTipStartAux[nSector] ; - if ( dSide < 0) - bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt1 - frEndCon.Orig()) * vvtTipEndAux[nSector] ; + if ( dSide < 0) + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide1 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt1 - frEndCon.Orig()) * ( - vvtTipEndAux[(nSub + 1) - nSector]) ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + else { + dDist = (pt1 - frEndCon.Orig()) * vvtTipEndAux[nSector] ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } // base superiore else if( bOnTopBase1 && bApproxedSideTop) { @@ -2255,11 +2436,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt1 - ( frEndCon.Orig() + frEndCon.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; - if ( dSide > 0) - bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; - else - bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt1 - ( frEndCon.Orig() + frEndCon.VersZ() * dHeight)) * vvtTopEndAux[nSector] ; + if( dSide > 0) + bUpdate1 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate1 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base top avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide1 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt1 - frEndCon.Orig()) * ( - vvtTopEndAux[(nSub + 1) - nSector]) ; + //bUpdate1 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate1 = true ; + } + else { + dDist = (pt1 - frEndCon.Orig()) * vvtTopEndAux[nSector] ; + bUpdate1 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } else if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase1 && dSide > 0) || ( bOnBottomBase1 && dSide < 0))) bUpdate1 = true ; @@ -2295,16 +2492,12 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX){ if ( bOnBottomBase2) bUpdate2 = dBottomBaseSide2 > 0 ; - else if ( bOnTopBase2) { - bApproxedSideTop = dTopBaseSide2 > 0 ; - bUpdate2 = dTopBaseSide2 < 0 ; - } + else if ( bOnTopBase2) + bApproxedSideTop = true ; } else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { - if ( bOnBottomBase2) { - bApproxedSideBottom = dBottomBaseSide2 > 0 ; - bUpdate2 = dBottomBaseSide2 < 0 ; - } + if ( bOnBottomBase2) + bApproxedSideBottom = true ; else if ( bOnTopBase2) bUpdate2 = dTopBaseSide2 > 0 ; } @@ -2313,11 +2506,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = (pt2 - frEndCon.Orig()) * vvtTipStartAux[nSector] ; - if ( dSide < 0) - bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; - else - bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = (pt2 - frEndCon.Orig()) * vvtTipEndAux[nSector] ; + if ( dSide < 0) + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) { + double dDist = 0 ; + // per il caso ALONG_CONCAVE dovrei avere dSide < 0, quindi sulla base bottom avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dBottomBaseSide2 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt2 - frEndCon.Orig()) * ( - vvtTipEndAux[(nSub + 1) - nSector]) ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } + else { + dDist = (pt2 - frEndCon.Orig()) * vvtTipEndAux[nSector] ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } // base superiore else if( bOnTopBase2 && bApproxedSideTop) { @@ -2325,11 +2534,27 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt // determino in quale settore del semicerchio approssimato mi trovo int nSector = int( dSectorAng / ( 180. / nSub)) + 1 ; // verifico se l'intersezione linea-base è interna o esterna - double dDist = ( pt2 - ( frEndCon.Orig() + frEndCon.VersZ() * dHeight)) * vvtTopStartAux[nSector] ; - if ( dSide > 0) - bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; - else - bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) { + double dDist = ( pt2 - ( frEndCon.Orig() + frEndCon.VersZ() * dHeight)) * vvtTopEndAux[nSector] ; + if( dSide > 0) + bUpdate2 = dDist < dMaxRadApprox - EPS_SMALL ; + else + bUpdate2 = dDist > dMaxRadApprox - EPS_SMALL && dDist < dMaxRad ; + } + else if ( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) { + double dDist = 0 ; + // per il caso ALONG_CONVEX dovrei avere dSide > 0, quindi sulla base top avere i punti ausiliari nella parte posteriore del cerchio di base + if ( dTopBaseSide2 > 0) { + //// in questo caso devo prendere il vettore Aux dell'angolo supplementare e con segno opposto + //dDist = (pt2 - frEndCon.Orig()) * ( - vvtTopEndAux[(nSub + 1) - nSector]) ; + //bUpdate2 = dDist > dMinRadApprox - EPS_SMALL && dDist < dMinRad ; + bUpdate2 = true ; + } + else { + dDist = (pt2 - frEndCon.Orig()) * vvtTopEndAux[nSector] ; + bUpdate2 = dDist < dMinRadApprox - EPS_SMALL ; + } + } } else if ( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS && ((bOnTopBase2 && dSide > 0) || ( bOnBottomBase2 && dSide < 0))) bUpdate2 = true ; @@ -2347,52 +2572,56 @@ VolZmap::Comp_5AxisMilling( int nGrid, const PNTVECTOR& ptS, const PNTVECTOR& pt } } + //if ( vInters.size() != 0 ) { + // // se ho un numero dispari di intersezioni devo migliorare la gestione + + // // riordino le intersezioni rispetto alla loro z + // sort( vInters.begin(), vInters.end(), []( PNTVECT& a, PNTVECT& b){ return a.first.z < b.first.z ;}) ; + // if ( vInters.size() > 2) { + // INTVECTOR vErase ; + // bool bStartNewInterval = true ; + // // elimino eventuali doppioni di punti + // for ( int w = 0 ; w < int( vInters.size()) ; ++w) { + // // se è l'ultimo punto esco + // if ( w == int( vInters.size() - 1)) + // break ; + // // se sono due punti vicino tolgo il secondo se sto cercando l'inizio di un intervallo + // // mentre se sto cercando la fine tolgo il primo + // if ( vInters[w + 1].first.z - vInters[w].first.z < 1) { + // if ( bStartNewInterval) { + // // se sto cercando l'inizio, ma sono gli ultimi due punti e sono vicini allora tolgo entrambi ed esco + // if ( w == int( vInters.size() - 2)) { + // // serve che siano in quest'ordine + // vErase.push_back( w) ; + // vErase.push_back( w + 1) ; + // break ; + // } + // else + // vErase.push_back( w + 1) ; + // ++w ; + // } + // else { + // vErase.push_back( w) ; + // ++w ; + // } + // } + // bStartNewInterval = ! bStartNewInterval ; + // } + + // // elimino i doppioni + // for ( int w = vErase.size() - 1 ; w >= 0 ; --w) + // vInters.erase( vInters.begin() + vErase[w]) ; + // } + // if ( vInters.size() % 2 == 0) { + // for( int z = 0 ; z < int( vInters.size()) ; z += 2) + // SubtractIntervals( nGrid, i, j, vInters[z].first.z, vInters[z+1].first.z, vInters[z].second, vInters[z+1].second, nToolNum) ; + // } + // else if ( vInters.size() == 3) + // SubtractIntervals( nGrid, i, j, vInters.front().first.z, vInters.back().first.z, vInters.front().second, vInters.back().second, nToolNum) ; + //} if ( vInters.size() != 0 ) { - // se ho un numero dispari di intersezioni devo migliorare la gestione - - // riordino le intersezioni rispetto alla loro z sort( vInters.begin(), vInters.end(), []( PNTVECT& a, PNTVECT& b){ return a.first.z < b.first.z ;}) ; - if ( vInters.size() > 2) { - INTVECTOR vErase ; - bool bStartNewInterval = true ; - // elimino eventuali doppioni di punti - for ( int w = 0 ; w < int( vInters.size()) ; ++w) { - // se è l'ultimo punto esco - if ( w == int( vInters.size() - 1)) - break ; - // se sono due punti vicino tolgo il secondo se sto cercando l'inizio di un intervallo - // mentre se sto cercando la fine tolgo il primo - if ( vInters[w + 1].first.z - vInters[w].first.z < 1) { - if ( bStartNewInterval) { - // se sto cercando l'inizio, ma sono gli ultimi due punti e sono vicini allora tolgo entrambi ed esco - if ( w == int( vInters.size() - 2)) { - // serve che siano in quest'ordine - vErase.push_back( w) ; - vErase.push_back( w + 1) ; - break ; - } - else - vErase.push_back( w + 1) ; - ++w ; - } - else { - vErase.push_back( w) ; - ++w ; - } - } - bStartNewInterval = ! bStartNewInterval ; - } - - // elimino i doppioni - for ( int w = vErase.size() - 1 ; w >= 0 ; --w) - vInters.erase( vInters.begin() + vErase[w]) ; - } - if ( vInters.size() % 2 == 0) { - for( int z = 0 ; z < int( vInters.size()) ; z += 2) - SubtractIntervals( nGrid, i, j, vInters[z].first.z, vInters[z+1].first.z, vInters[z].second, vInters[z+1].second, nToolNum) ; - } - else if ( vInters.size() == 3) - SubtractIntervals( nGrid, i, j, vInters.front().first.z, vInters.back().first.z, vInters.front().second, vInters.back().second, nToolNum) ; + SubtractIntervals( nGrid, i, j, vInters.front().first.z, vInters.back().first.z, vInters.front().second, vInters.back().second, nToolNum) ; } } } @@ -2605,7 +2834,7 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co if ( ! vtMaxDir.Normalize()) return false ; vtMaxDir *= dRad ; - if ( vtMaxDir * vtDs > dHStep) { + if ( abs( vtMaxDir * vtDs) > dHStep) { bAcrossInters = true ; bAlongInters = true ; } @@ -2635,6 +2864,19 @@ VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, co n5AxisType = VolZmap::Move5Axis::NO_BASE_INTERS ; } + //debug + string sOut = "" ; + if( n5AxisType == VolZmap::Move5Axis::NO_BASE_INTERS) + sOut = "NO_BASE_INTERS" ; + else if( n5AxisType == VolZmap::Move5Axis::ACROSS) + sOut = "ACROSS" ; + else if( n5AxisType == VolZmap::Move5Axis::ALONG_CONVEX) + sOut = "ALONG_CONVEX" ; + else if( n5AxisType == VolZmap::Move5Axis::ALONG_CONCAVE) + sOut = "ALONG_CONCAVE" ; + LOG_INFO( GetEGkLogger(), sOut.c_str()) + //debug + // Divido il movimento in tratti con direzione utensile costante //////// debug - vecchia modalità