diff --git a/Milling.cpp b/Milling.cpp index 3c30822..bac72d5 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -2358,9 +2358,10 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo Vector3d vtAppr2 = ptP1 - ptStart ; if ( ! vtAppr2.Normalize()) vtAppr2 = CalcCorrDir( pCompo, i) ; + double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawStartElev1 = -1, dSawStartElev2 = -1 ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtAppr1, dSawStartElev1) ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtAppr2, dSawStartElev2) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtAppr1, dSawStartElev1) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtAppr2, dSawStartElev2) ; if ( dSawStartElev1 > -EPS_SMALL && dSawStartElev2 > -EPS_SMALL) { bool bFirst = ( dSawStartElev1 < dSawStartElev2) ; vtAppr = ( bFirst ? vtAppr1 : vtAppr2) ; @@ -2522,9 +2523,10 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo Vector3d vtRetr2 = ptP1 - ptEnd ; if ( ! vtRetr2.Normalize()) vtRetr2 = CalcCorrDir( pCompo, i + 1) ; + double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawEndElev1, dSawEndElev2 ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtRetr1, dSawEndElev1) ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtRetr2, dSawEndElev2) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtRetr1, dSawEndElev1) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtRetr2, dSawEndElev2) ; if ( dSawEndElev1 > -EPS_SMALL && dSawEndElev2 > -EPS_SMALL) { bool bFirst = ( dSawEndElev1 < dSawEndElev2) ; vtRetr = ( bFirst ? vtRetr1 : vtRetr2) ; @@ -2702,9 +2704,10 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool Vector3d vtAppr2 = ptP1 - ptStart ; if ( ! vtAppr2.Normalize()) vtAppr2 = CalcCorrDir( pCompo, i) ; + double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawStartElev1 = -1, dSawStartElev2 = -1 ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtAppr1, dSawStartElev1) ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtAppr2, dSawStartElev2) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtAppr1, dSawStartElev1) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtAppr2, dSawStartElev2) ; if ( dSawStartElev1 > -EPS_SMALL && dSawStartElev2 > -EPS_SMALL) { bool bFirst = ( dSawStartElev1 < dSawStartElev2) ; vtAppr = ( bFirst ? vtAppr1 : vtAppr2) ; @@ -2864,9 +2867,10 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool Vector3d vtRetr2 = ptP1 - ptEnd ; if ( ! vtRetr2.Normalize()) vtRetr2 = CalcCorrDir( pCompo, i + 1) ; + double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawEndElev1, dSawEndElev2 ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtRetr1, dSawEndElev1) ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtRetr2, dSawEndElev2) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtRetr1, dSawEndElev1) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtRetr2, dSawEndElev2) ; if ( dSawEndElev1 > -EPS_SMALL && dSawEndElev2 > -EPS_SMALL) { bool bFirst = ( dSawEndElev1 < dSawEndElev2) ; vtRetr = ( bFirst ? vtRetr1 : vtRetr2) ; @@ -3151,18 +3155,18 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool bUnderStart = m_bAboveHead && GetAhPointUnderRaw( ptP1, vtTool, m_TParams.m_dTDiam / 2, GetRadiusForStartEndElevation( false), m_TParams.m_dLen, true, dSafeZ, vtAppr, dSawStartElev) ; - } // se non sono sotto, verifico se posso allontanarmi nel piano lama (meglio se in orizzontale) if ( ! bUnderStart) { - Point3d ptTest = ptP1 - MIN_SAFEDIST * ( m_bAboveHead ? Z_AX : -Z_AX) ; + Point3d ptTest = ptP1 - MIN_SAFEDIST * vtTool ; Vector3d vtAppr1 = FromNearestHorizontalOrtho( vtTool, ptP1 - ptStart) ; Vector3d vtAppr2 = ptP1 - ptStart ; if ( ! vtAppr2.Normalize()) vtAppr2 = CalcCorrDir( pCompo, i) ; + double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawStartElev1 = -1, dSawStartElev2 = -1 ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtAppr1, dSawStartElev1) ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtAppr2, dSawStartElev2) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick + 2 * MIN_SAFEDIST, vtAppr1, dSawStartElev1) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick + 2 * MIN_SAFEDIST, vtAppr2, dSawStartElev2) ; if ( dSawStartElev1 > -EPS_SMALL && dSawStartElev2 > -EPS_SMALL) { bool bFirst = ( dSawStartElev1 < dSawStartElev2) ; vtAppr = ( bFirst ? vtAppr1 : vtAppr2) ; @@ -3325,9 +3329,10 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool Vector3d vtRetr2 = ptP1 - ptEnd ; if ( ! vtRetr2.Normalize()) vtRetr2 = CalcCorrDir( pCompo, i + 1) ; + double dThick = ( m_TParams.m_nType == TT_MILL_NOTIP ? m_TParams.m_dMaxMat : m_TParams.m_dThick) ; double dSawEndElev1, dSawEndElev2 ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtRetr1, dSawEndElev1) ; - GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, vtRetr2, dSawEndElev2) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtRetr1, dSawEndElev1) ; + GetElevation( m_nPhase, ptTest, vtTool, 0.5 * m_TParams.m_dDiam, dThick, vtRetr2, dSawEndElev2) ; if ( dSawEndElev1 > -EPS_SMALL && dSawEndElev2 > -EPS_SMALL) { bool bFirst = ( dSawEndElev1 < dSawEndElev2) ; vtRetr = ( bFirst ? vtRetr1 : vtRetr2) ; diff --git a/Operation.cpp b/Operation.cpp index 66c7f2c..802d27b 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -440,6 +440,23 @@ Operation::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, return true ; } +//---------------------------------------------------------------------------- +bool +Operation::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad, double dLen, + const Vector3d& vtDir, double& dElev) const +{ + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) + return false ; + // sopra e sotto + double dElev1, dElev2 ; + if ( ! GetElevation( nPhase, ptP, vtTool, dRad, vtDir, dElev1)) + return false ; + if ( ! GetElevation( nPhase, ptP + dLen * vtTool, vtTool, dRad, vtDir, dElev2)) + return false ; + dElev = max( dElev1, dElev2) ; + return true ; +} + //---------------------------------------------------------------------------- bool Operation::GetAhPointUnderRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev, diff --git a/Operation.h b/Operation.h index 84bb986..25a2efc 100644 --- a/Operation.h +++ b/Operation.h @@ -81,6 +81,8 @@ class Operation : public IUserObj const Vector3d& vtDir, double& dElev) const ; bool GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad, const Vector3d& vtDir, double& dElev) const ; + bool GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad, double dLen, + const Vector3d& vtDir, double& dElev) const ; bool GetAhPointUnderRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev, double dToolLen, bool bIsSaw, double dSafeZ, const Vector3d& vtDir, double& dElev) const ; bool GetUhPointAboveRaw( const Point3d& ptP, const Vector3d& vtTool, double dToolRad, double dToolRadForElev, diff --git a/Pocketing.cpp b/Pocketing.cpp index 185f20b..4962f77 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -5576,14 +5576,18 @@ Pocketing::AdjustContourWithOpenEdges( ICurveComposite* pCompo) pJCrv->ToGlob( frPocket) ; vpCrvs[i]->ToGlob( frPocket) ; // taglio opportunamente le curve + bool bFound = false ; + IntCrvCrvInfo aInfo ; if ( intCC.GetIntersCount() > 0) { // cerco la prima intersezione che entra nella curva aperta - IntCrvCrvInfo aInfo ; for ( int j = 0 ; j < intCC.GetIntersCount() ; ++ j) { if ( intCC.GetIntCrvCrvInfo( j, aInfo) && aInfo.IciA[0].nPrevTy == ICCT_OUT) { + bFound = true ; break ; } } + } + if ( bFound) { pJCrv->TrimEndAtParam( aInfo.IciA[0].dU) ; vpCrvs[i]->TrimStartAtParam( aInfo.IciB[0].dU) ; pCompo->AddCurve( ::Release( pJCrv), true, 10 * EPS_SMALL) ; diff --git a/Sawing.cpp b/Sawing.cpp index d231dc7..f3e7a8a 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -1478,7 +1478,7 @@ Sawing::ProcessPath( int nPathId, int nPvId, int nClId) ICurveComposite* pCompo = GetCurveComposite( m_pGeomDB->GetGeoObj( nCopyId)) ; // unisco le parti allineate - if ( ! pCompo->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL)) + if ( ! pCompo->MergeCurves( 100 * EPS_SMALL, 100 * EPS_ANG_SMALL)) return false ; // eventuale inversione percorso @@ -3812,29 +3812,40 @@ bool Sawing::CalculateToolAndCorrVersors( const Vector3d& vtTang, int nHeadSide, int nWorkSide, double dSideAng, Vector3d& vtTool, Vector3d& vtCorr) { - // Versore fresa : annullo la componente in Z e normalizzo - vtTool = vtTang ; - vtTool.z = 0 ; - if ( ! vtTool.Normalize()) + // Direzione tangente nel piano XY + Vector3d vtXYTg = vtTang ; + vtXYTg.z = 0 ; + double dLenXYTg = vtXYTg.Len() ; + if ( dLenXYTg < EPS_SMALL) return false ; - // ruoto attorno a Zglob+ a seconda del lato mandrino + vtXYTg /= dLenXYTg ; + // se direzione tangente inclinata in Z e SideAng non nullo devo calcolare la vera tangente nel piano XY + if ( abs( vtTang.z) > EPS_SMALL && abs( dSideAng) > EPS_ANG_SMALL) { + double dSinDelta = vtTang.z * tan( dSideAng * DEGTORAD) / dLenXYTg ; + double dCosDelta = sqrt( 1 - dSinDelta * dSinDelta) ; + if ( nHeadSide == SAW_HS_LEFT) + vtXYTg.Rotate( Z_AX, dCosDelta, dSinDelta) ; + else + vtXYTg.Rotate( Z_AX, dCosDelta, -dSinDelta) ; + } + + // Versore fresa : ruoto direzione nel piano XY attorno a Zglob+ a seconda del lato mandrino + vtTool = vtXYTg ; if ( nHeadSide == SAW_HS_LEFT) vtTool.Rotate( Z_AX, 0, 1) ; else vtTool.Rotate( Z_AX, 0, -1) ; - // Versore correzione + // Versore correzione : se lama sbandata devo aggiustare vtCorr = Z_AX ; - - // Se lama sbandata if ( abs( dSideAng) > EPS_ANG_SMALL) { if ( nWorkSide == SAW_WS_RIGHT) { - vtTool.Rotate( vtTang, - dSideAng) ; - vtCorr.Rotate( vtTang, - dSideAng) ; + vtTool.Rotate( vtXYTg, - dSideAng) ; + vtCorr.Rotate( vtXYTg, - dSideAng) ; } else { - vtTool.Rotate( vtTang, dSideAng) ; - vtCorr.Rotate( vtTang, dSideAng) ; + vtTool.Rotate( vtXYTg, dSideAng) ; + vtCorr.Rotate( vtXYTg, dSideAng) ; } }