From 969f1266e7649ff8c2bf8f2be71201a0a9e0c72d Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 30 May 2025 10:59:40 +0200 Subject: [PATCH] EgtGeomKernel : - correzione euristica su Vmill a 5assi, in attesa di soluzione definitiva in sviluppo --- VolZmapVolume.cpp | 48 +++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index cd8f7d8..323ed2a 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -910,38 +910,50 @@ bool VolZmap::MillingGeneralMotionStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d& vtAs, const Point3d& ptPe, const Vector3d& vtDe, const Vector3d& vtAe) { - // Calcolo angoli di rotazione utensile longitudinale e trasversale rispetto al movimento + // Deve essere definito l'utensile corrente + if ( m_nCurrTool < 0 || m_nCurrTool >= int( m_vTool.size())) + return false ; + // Calcolo angoli di rotazione utensile longitudinale e trasversale rispetto al movimento per eventuale suddivisione double dAlongAngDeg, dAcrossAngDeg ; GetAlongAcrossRotation( vtDs, vtDe, ptPe - ptPs, dAlongAngDeg, dAcrossAngDeg) ; - // Divido il movimento in tratti con direzione utensile costante - // !!! Per errori riscontrati si eliminano i movimenti e si lasciano solo le posizioni utensile !!! - // !!! In attesa dell'algoritmo esatto !!! const double ANG_ACROSS_STEP = 0.04 ; const double ANG_ALONG_STEP = 1.0 ; int nStepCnt = int( max( { abs( dAlongAngDeg) / ANG_ALONG_STEP, abs( dAcrossAngDeg) / ANG_ACROSS_STEP, 1.})) ; + // Calcolo coefficiente di riduzione movimenti con direzione costante per evitare extra tagli + // !!! In attesa dell'algoritmo esatto !!! + double dToolLen = m_vTool[m_nCurrTool].GetHeigth() ; + double dToolCrad = m_vTool[m_nCurrTool].GetCornRadius() ; + Vector3d vtBase = ptPe - ptPs ; + double dBaseLen = vtBase.Len() ; + Vector3d vtTip = ptPe - dToolLen * vtDe - ( ptPs - dToolLen * vtDs) ; + double dTipLen = vtTip.Len() ; + double dK = ( vtBase * vtTip > EPS_SMALL ? dTipLen / dBaseLen : 0) ; + if ( dTipLen / nStepCnt < 0.1 * dToolCrad) + dK = 0 ; + // Divido il movimento in tratti con direzione utensile costante bool bOk = true ; - Point3d ptSt = ptPs ; for ( int i = 0 ; i <= nStepCnt && bOk ; ++ i) { - double dPosCoeff, dDirCoeff ; - if ( i < nStepCnt) { - dPosCoeff = ( i + 0.5) / nStepCnt ; + double dStCoeff, dEnCoeff, dDirCoeff ; + if ( i == 0) { + dStCoeff = 0 ; + dEnCoeff = dK / nStepCnt ; + dDirCoeff = 0 ; + } + else if ( i < nStepCnt) { + dStCoeff = ( i - dK) / nStepCnt ; + dEnCoeff = ( i + dK) / nStepCnt ; dDirCoeff = double( i) / nStepCnt ; } else { - dPosCoeff = 1 ; + dStCoeff = ( nStepCnt - dK) / nStepCnt ; + dEnCoeff = 1 ; dDirCoeff = 1 ; } - Point3d ptEn = Media( ptPs, ptPe, dPosCoeff) ; + Point3d ptSt = Media( ptPs, ptPe, dStCoeff) ; + Point3d ptEn = Media( ptPs, ptPe, dEnCoeff) ; Vector3d vtD = Media( vtDs, vtDe, dDirCoeff) ; vtD.Normalize() ; Vector3d vtA = Media( vtAs, vtAe, dDirCoeff) ; vtA.Normalize() ; - if ( i == 0) - bOk = bOk && MillingTranslationStep( ptSt, ptSt, vtD, vtA) ; - else if ( i < nStepCnt) { - Point3d ptMid = Media( ptSt, ptEn) ; - bOk = bOk && MillingTranslationStep( ptMid, ptMid, vtD, vtA) ; - } - else - bOk = bOk && MillingTranslationStep( ptEn, ptEn, vtD, vtA) ; + bOk = bOk && MillingTranslationStep( ptSt, ptEn, vtD, vtA) ; // aggiorno prossimo inizio ptSt = ptEn ; }