EgtGeomKernel :

- correzione euristica su Vmill a 5assi, in attesa di soluzione definitiva in sviluppo
This commit is contained in:
Dario Sassi
2025-05-30 10:59:40 +02:00
parent fa680b7799
commit 969f1266e7
+30 -18
View File
@@ -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 ;
}