diff --git a/Operation.cpp b/Operation.cpp index d11937e..00776f8 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -777,10 +777,17 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, // porto gli angoli ai valori pił vicini ai precedenti con offset di uno o pił giri for ( size_t i = 0 ; i < vAng1.size() ; ++ i) m_pMchMgr->GetNearestAngleInStroke( int( i), vAxRotPrec[i], vAng1[i]) ; - // se sol.ne indeterminata (sempre il primo asse), assegno il precedente, limitandolo alla corsa + // se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente, limitandolo alla corsa if ( nRStat < 0 && vAng1.size() >= 1) { - vAng1[0] = vAxRotPrec[0] ; - m_pMchMgr->LimitAngleToStroke( 0, vAng1[0]) ; + for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) { + // ignoro gli assi bloccati + if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) + continue ; + // assegno il precedente + vAng1[i] = vAxRotPrec[i] ; + m_pMchMgr->LimitAngleToStroke( i, vAng1[i]) ; + break ; + } } } // per movimenti successivi @@ -788,9 +795,15 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, // scelgo gli angoli pił vicini, per continuitą non applico offset per stare nelle corse for ( size_t i = 0 ; i < vAng1.size() ; ++ i) vAng1[i] = AngleNearAngle( vAng1[i], vAxRotPrec[i]) ; - // se sol.ne indeterminata (sempre il primo asse), assegno il precedente + // se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente if ( nRStat < 0 && vAng1.size() >= 1) { - vAng1[0] = vAxRotPrec[0] ; + for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) { + // ignoro gli assi bloccati + if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) + continue ; + // assegno il precedente + vAng1[i] = vAxRotPrec[i] ; + } } } } @@ -802,11 +815,17 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, m_pMchMgr->GetNearestAngleInStroke( int( i), vAxRotPrec[i], vAng1[i]) ; m_pMchMgr->GetNearestAngleInStroke( int( i), vAxRotPrec[i], vAng2[i]) ; } - // se sol.ne indeterminata (sempre il primo asse), assegno il precedente, limitandolo alla corsa + // se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente, limitandolo alla corsa if ( nRStat < 0 && vAng1.size() >= 1) { - vAng1[0] = vAxRotPrec[0] ; - m_pMchMgr->LimitAngleToStroke( 0, vAng1[0]) ; - vAng2[0] = vAng1[0] ; + for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) { + // ignoro gli assi bloccati + if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) + continue ; + // assegno il precedente + vAng1[i] = vAxRotPrec[i] ; + m_pMchMgr->LimitAngleToStroke( i, vAng1[i]) ; + vAng2[i] = vAng1[i] ; + } } } else { @@ -814,14 +833,20 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, for ( size_t i = 0 ; i < vAng1.size() ; ++ i) { vAng1[i] = AngleNearAngle( vAng1[i], vAxRotPrec[i]) ; vAng2[i] = AngleNearAngle( vAng2[i], vAxRotPrec[i]) ; - // se sol.ne indeterminata (sempre il primo asse), assegno il precedente + // se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente if ( nRStat < 0 && vAng1.size() >= 1) { - vAng1[0] = vAxRotPrec[0] ; - vAng2[0] = vAng1[0] ; + for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) { + // ignoro gli assi bloccati + if ( m_pMchMgr->IsKinematicRotAxisBlocked( i)) + continue ; + // assegno il precedente + vAng1[i] = vAxRotPrec[i] ; + vAng2[i] = vAng1[i] ; + } } } } - // scelgo la soluzione pił vicina ai precedenti + // scelgo la soluzione pił vicina alla precedente double dDelta1 = 0 ; double dDelta2 = 0 ; for ( size_t i = 0 ; i < vAng1.size() ; ++ i) {