EgtMachKernel 2.7h1 :
- in simulazione corretta segnalazione extracorsa per robot - aggiunta gestione suggerimento angoli iniziali come home con comando "Home".
This commit is contained in:
+20
-9
@@ -1849,11 +1849,14 @@ Operation::CalculateAxesValues( const string& sHint, bool bRotContOnNext, bool b
|
||||
for ( int i = 0 ; i < nRotAxes ; ++ i)
|
||||
vAxRotHome[i] = vAxHome[nLinAxes + i] ;
|
||||
|
||||
// Verifico se nei suggerimenti viene richiesta Home per gli assi
|
||||
bool bHintHome = ( sHint.find( "Home") != string::npos) ;
|
||||
|
||||
// Assegno gli angoli iniziali
|
||||
DBLVECTOR vAxRotPrec( nRotAxes, 0.) ;
|
||||
DBLVECTOR vAxVal ;
|
||||
// se non richiesti angoli Home e utensile non cambiato, uso gli angoli finali della lavorazione precedente
|
||||
if ( GetUserNotesZmax() != 2 && ! sPrevTool.empty() && ! ToolChangeNeeded( *pPrevOp, *this) &&
|
||||
if ( ! bHintHome && GetUserNotesZmax() != 2 && ! sPrevTool.empty() && ! ToolChangeNeeded( *pPrevOp, *this) &&
|
||||
pPrevOp->GetFinalAxesValues( true, vAxVal)) {
|
||||
for ( int i = 0 ; i < nRotAxes ; ++ i)
|
||||
vAxRotPrec[i] = vAxVal[nLinAxes + i] ;
|
||||
@@ -1863,7 +1866,7 @@ Operation::CalculateAxesValues( const string& sHint, bool bRotContOnNext, bool b
|
||||
vAxRotPrec = vAxRotHome ;
|
||||
}
|
||||
// se ci sono suggerimenti validi per gli assi rotanti, li applico
|
||||
if ( ! sHint.empty()) {
|
||||
if ( ! bHintHome && ! sHint.empty()) {
|
||||
STRVECTOR vsTok ;
|
||||
Tokenize( sHint, ",;", vsTok) ;
|
||||
for ( const auto& sTok : vsTok) {
|
||||
@@ -2763,8 +2766,16 @@ Operation::CalculateRobotAxesValues( bool bFirst, const Point3d& ptP, const Vect
|
||||
}
|
||||
}
|
||||
// Scelgo la soluzione più vicina
|
||||
// se esiste solo la prima
|
||||
if ( vAng2.empty())
|
||||
vAxVal = vAng1 ;
|
||||
// evito passaggio per lo zero di R5 (per evitare passaggio attraverso direzione singolare)
|
||||
else if ( vAng1[4] * vAxRotPrec[4] >= 0 && vAng2[4] * vAxRotPrec[4] < 0)
|
||||
vAxVal = vAng1 ;
|
||||
else if ( vAng1[4] * vAxRotPrec[4] < 0 && vAng2[4] * vAxRotPrec[4] >= 0)
|
||||
vAxVal = vAng2 ;
|
||||
// minimizzo rotazione polso
|
||||
if ( vAng2.empty() || abs( vAng1[3] - vAxRotPrec[3]) < abs( vAng2[3] - vAxRotPrec[3]) + 10 * EPS_ANG_SMALL)
|
||||
else if ( abs( vAng1[3] - vAxRotPrec[3]) < abs( vAng2[3] - vAxRotPrec[3]) + 10 * EPS_ANG_SMALL)
|
||||
vAxVal = vAng1 ;
|
||||
else
|
||||
vAxVal = vAng2 ;
|
||||
@@ -2822,8 +2833,10 @@ Operation::VerifyRobotLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDir
|
||||
dLinTol = max( dLinTol, 2 * EPS_SMALL) ;
|
||||
bool bInTol = ( dDist <= dLinTol) ;
|
||||
if ( ExeGetDebugLevel() >= 5) {
|
||||
string sOut = "Midpoint dist = " + ToString( dDist, -4) +
|
||||
string sOut = "Midpoint dist=" + ToString( dDist, -4) +
|
||||
( nMoveType == 0 ? " (G0" : " (G1") + " Cnt=" + ToString( nCnt) + ") " + ( bInTol ? "Ok" : "Split") ;
|
||||
if ( ! bInTol)
|
||||
sOut += " - Ap=" + ToString( vAxPrec, -2) + " An=" + ToString( vAxVal, -2) ;
|
||||
LOG_INFO( GetEMkLogger(), sOut.c_str())
|
||||
}
|
||||
|
||||
@@ -2887,13 +2900,11 @@ Operation::VerifyRobotLineMidPoint( const Point3d& ptPrec, const Vector3d& vtDir
|
||||
pMidCamData->SetFlag2( -1) ;
|
||||
pMidCamData->SetToolShow( bToolShow && nCnt < 4) ;
|
||||
// calcolo gli assi per il punto medio
|
||||
DBLVECTOR vAxRotHome( vAxVal.size()) ;
|
||||
DBLVECTOR vAxRotPrec( vAxVal.size()) ;
|
||||
for ( int i = 0 ; i < int( vAxVal.size()) ; ++ i)
|
||||
vAxRotPrec[i] = vAxVal[i] ;
|
||||
DBLVECTOR vAxRotHome( vAxMid.size()) ;
|
||||
DBLVECTOR vAxRotPrec( vAxMid) ;
|
||||
if ( ! CalculateRobotAxesValues( false, ptMid, vtDirMid, vtAuxMid,
|
||||
true, INFINITO, vAxRotHome, vAxRotPrec, vAxMid)) {
|
||||
pMidCamData->SetAxes( CamData::AS_ERR, vAxVal) ;
|
||||
pMidCamData->SetAxes( CamData::AS_ERR, vAxMid) ;
|
||||
return false ;
|
||||
}
|
||||
// verifico di essere nelle corse degli assi
|
||||
|
||||
Reference in New Issue
Block a user