diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 01e3d38..a59b382 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Operation.cpp b/Operation.cpp index 748b2f8..ebe96f1 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -2042,17 +2042,33 @@ Operation::AdjustOneStartMovement( int nClPathId, int nPrevClPathId, Operation* double dHomeZ ; if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ)) return false ; - // riprovo con una Z intermedia + bool bPartRise = false ; double dSafeZ = dHomeZ ; - double dUnsafeZ = dTopZ ; - for ( int i = 1 ; i <= 3 ; ++ i) { - double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ; - vAxPrevTmp[2] = dTestSafeZ ; - vAxCurrTmp[2] = dTestSafeZ ; - if ( ! bForcedZMax && TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp)) - dSafeZ = dTestSafeZ ; - else - dUnsafeZ = dTestSafeZ ; + // se non forzata Zmax + if ( ! bForcedZMax) { + // riprovo con una Z intermedia + double dUnsafeZ = dTopZ ; + for ( int i = 1 ; i <= 3 ; ++ i) { + double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ; + vAxPrevTmp[2] = dTestSafeZ ; + vAxCurrTmp[2] = dTestSafeZ ; + if ( TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp)) { + bPartRise = true ; + dSafeZ = dTestSafeZ ; + } + else + dUnsafeZ = dTestSafeZ ; + } + // se necessario, riprovo appena prima di Zmax + if ( ! bPartRise) { + double dOffsZ = 5 * ( bZHomeDown ? 1 : -1) ; + vAxPrevTmp[2] = dHomeZ + dOffsZ ; + vAxCurrTmp[2] = dHomeZ + dOffsZ ; + if ( TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp)) { + bPartRise = true ; + dSafeZ = dHomeZ + dOffsZ ; + } + } } // risalita sopra fine percorso precedente DBLVECTOR vAxNew1 ; @@ -2074,7 +2090,7 @@ Operation::AdjustOneStartMovement( int nClPathId, int nPrevClPathId, Operation* DBLVECTOR vAxNew = vAxCurr ; vAxNew[2] = vAxNew1[2] ; int nFlagNew = 2 ; - int nFlag2New = 1 ; + int nFlag2New = ( bPartRise ? 0 : 1) ; // eventuali aggiustamenti speciali dipendenti dalla macchina Vector3d vtTool = pCamData->GetToolDir() ; DBLVECTOR vAxTmp = vAxNew ;