EgtMachKernel :

- prime modifiche per la gestione della direzione singolare nei centri di lavoro (con angolo di apertura del cono di coincidenza).
This commit is contained in:
Dario Sassi
2025-09-05 19:39:27 +02:00
parent be7d023031
commit bd03f0f259
10 changed files with 150 additions and 119 deletions
+28 -4
View File
@@ -371,7 +371,9 @@ Machine::ResetCurrTool( void)
m_nCalcHeadId = GDB_ID_NULL ;
m_nCalcExitId = GDB_ID_NULL ;
m_nCalcToolId = GDB_ID_NULL ;
m_dCalcRot1W = 1 ;
m_dCalcRot1W = ROT1_WEIGHT_DFLT ;
m_dSingConeAng = SING_CONE_ANG_DFLT ;
m_bCalcMaxDeltaR2On1 = true ;
m_nCalcSolCh = MCH_SCC_NONE ;
m_dCalcTLen = 0 ;
m_dCalcTRad = 0 ;
@@ -1224,8 +1226,30 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
vtDirI1.Rotate( vtAx1, dAngA1) ;
}
// verifica per direzione singolare (direzione fresa molto vicina a direzione primo asse rotante)
if ( nNumRotAx == 2 && nStat == 2 && abs( dAngB2 - dAngB1) < 2 * m_dSingConeAng) {
nStat = 1 ;
bDet1 = false ;
dAngB1 = ( dAngB1 + dAngB2) / 2 ;
// ripristino direzioni fresa e ausiliaria su testa
vtDirH1.Rotate( vtAx1, -dAngA1) ;
vtDirI1.Rotate( vtAx1, -dAngA1) ;
// provo a determinare primo angolo con la direzione ausiliaria
bool bDetX ;
Vector3d vtSccDir ;
bool bSccDir = GetSccDir( m_nCalcSolCh, vtDirAn, vtSccDir) ;
vtDirI1.GetRotation( vtSccDir, vtAx1, dAngA1, bDetX) ;
if ( bDetX)
bDet1 = bSccDir ;
else
dAngA1 = 0 ;
// aggiornamento direzioni fresa e ausiliaria su testa
vtDirH1.Rotate( vtAx1, dAngA1) ;
vtDirI1.Rotate( vtAx1, dAngA1) ;
}
// verifiche per criterio scelta soluzione
if ( nStat >= 2) {
if ( nStat == 2) {
if ( ! VerifyScc( vtDirI2, vtDirAn, m_nCalcSolCh, m_bSolChExact))
-- nStat ;
}
@@ -1241,7 +1265,7 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
}
// verifiche dei limiti di corsa
if ( nStat >= 2) {
if ( nStat == 2) {
// se non riesco ad aggiustare, elimino
if ( ! AdjustAngleInStroke( RotAx1.stroke, dAngA2) ||
( nNumRotAx == 2 && ! AdjustAngleInStroke( RotAx2.stroke, dAngB2)))
@@ -1261,7 +1285,7 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
}
// modifico stato per angolo indeterminato
if ( ( nStat >= 2 && ! bDet2) || ( nStat >= 1 && ! bDet1))
if ( ( nStat == 2 && ! bDet2) || ( nStat >= 1 && ! bDet1))
nStat = - nStat ;
return true ;