EgtGeomKernel :
- correzione euristica su Vmill a 5assi, in attesa di soluzione definitiva in sviluppo
This commit is contained in:
+30
-18
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user