diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 32b19ec..658b32c 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Milling.cpp b/Milling.cpp index dd088be..e96f4c6 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -935,7 +935,7 @@ Milling::ProcessPath( int nPathId, int nPvId, int nClId) pCompo->GetStartPoint( ptStart) ; // eventuale allungamento/accorciamento dell'inizio - if ( abs( m_Params.m_dStartAddLen) > EPS_SMALL) { + if ( ! pCompo->IsClosed() && abs( m_Params.m_dStartAddLen) > EPS_SMALL) { if ( m_Params.m_dStartAddLen > 0) { if ( ! pCompo->ExtendStartByLen( m_Params.m_dStartAddLen)) return false ; @@ -947,7 +947,7 @@ Milling::ProcessPath( int nPathId, int nPvId, int nClId) } // eventuale allungamento/accorciamento della fine - if ( abs( m_Params.m_dEndAddLen) > EPS_SMALL) { + if ( ! pCompo->IsClosed() && abs( m_Params.m_dEndAddLen) > EPS_SMALL) { if ( m_Params.m_dEndAddLen > 0) { if ( ! pCompo->ExtendEndByLen( m_Params.m_dEndAddLen)) return false ; @@ -1194,7 +1194,7 @@ Milling::GenerateMillingPv( int nPathId, const ICurveComposite* pCompo) return false ; // calcolo la regione PtrOwner pSfr ; - pSfr.Set( GetSurfFlatRegionFromFatCurve( Release( pCrv), 0.5 * m_TParams.m_dDiam, false, true)) ; + pSfr.Set( GetSurfFlatRegionFromFatCurve( Release( pCrv), 0.5 * m_TParams.m_dDiam, false, false)) ; if ( IsNull( pSfr)) return false ; // ne recupero il contorno diff --git a/Operation.cpp b/Operation.cpp index 2af68d2..e4ec419 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -24,6 +24,7 @@ #include "/EgtDev/Include/EgkIntersCurves.h" #include "/EgtDev/Include/EGkIntersLineSurfTm.h" #include "/EgtDev/Include/EGkGeomDB.h" +#include "/EgtDev/Include/EGkCDBoxPolyhedron.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EgtPointerOwner.h" @@ -666,12 +667,12 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, // scelgo la soluzione più vicina ai precedenti double dDelta1 = 0 ; double dDelta2 = 0 ; - bool bFirst = true ; for ( size_t i = 0 ; i < vAng1.size() ; ++ i) { // ignoro gli assi bloccati if ( m_pMchMgr->IsKinematicRotAxisBlocked( int( i))) continue ; // calcolo i delta asse con eventuale peso + bool bFirst = ( i == 0) ; dDelta1 += fabs( vAng1[i] - vAxRotPrec[i]) * ( bFirst ? dRot1W : 1) ; dDelta2 += fabs( vAng2[i] - vAxRotPrec[i]) * ( bFirst ? dRot1W : 1) ; } @@ -980,65 +981,73 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool pCamData->SetFlag( 2) ; } // verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola - else if ( ! TestCollisionAvoid( vAxPrev, vAxCurr)) { - // recupero HomeZ - Machine* pMch = m_pMchMgr->GetCurrMachine() ; - double dHomeZ ; - if ( pMch == nullptr || ! pMch->GetCurrAxisHomePos( 2, dHomeZ)) - return false ; - // risalita sopra fine percorso precedente - // copio l'entità - int nNew1Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ; - CamData* pNew1CamData = GetCamData( m_pGeomDB->GetUserObj( nNew1Id)) ; - if ( pNew1CamData == nullptr) - return false ; - // modifico questa entità - DBLVECTOR vAxNew1 = vAxPrev ; - vAxNew1[2] = dHomeZ ; - pNew1CamData->SetAxes( CamData::AS_OK, vAxNew1) ; - pNew1CamData->ChangeAxesMask( CamData::MSK_L3) ; - pNew1CamData->SetFlag( 0) ; - // spostamento sopra inizio percorso corrente - // copio l'entità - int nNew2Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ; - CamData* pNew2CamData = GetCamData( m_pGeomDB->GetUserObj( nNew2Id)) ; - if ( pNew2CamData == nullptr) - return false ; - // modifico quella originale (è la prima del percorso) - DBLVECTOR vAxNew2 = vAxCurr ; - vAxNew2[2] = dHomeZ ; - pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ; - pNew2CamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ; - pNew2CamData->SetFlag( 2) ; - } - // altrimenti else { - // se Z pressochè uguali non devo fare alcunché - if ( fabs( vAxCurr[2] - vAxPrev[2]) < 10 * EPS_SMALL) - return true ; - // se Z corrente maggiore della precedente - else if ( vAxCurr[2] > vAxPrev[2]) { - // copio l'entità - if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) + // determino la Z più alta tra le due posizioni + double dZtop = max( vAxPrev[2], vAxCurr[2]) ; + // per il test uso posizioni temporanee con questa Z + DBLVECTOR vAxPrevZtop = vAxPrev ; vAxPrevZtop[2] = dZtop ; + DBLVECTOR vAxCurrZtop = vAxCurr ; vAxCurrZtop[2] = dZtop ; + // se interferisce + if ( ! TestCollisionAvoid( vAxPrevZtop, vAxCurrZtop)) { + // recupero HomeZ + Machine* pMch = m_pMchMgr->GetCurrMachine() ; + double dHomeZ ; + if ( pMch == nullptr || ! pMch->GetCurrAxisHomePos( 2, dHomeZ)) return false ; - // modifico quella originale (è la prima del percorso) - DBLVECTOR vAxNew = vAxPrev ; - vAxNew[2] = vAxCurr[2] ; - pCamData->SetAxes( CamData::AS_OK, vAxNew) ; - pCamData->ChangeAxesMask( CamData::MSK_L3) ; - pCamData->SetFlag( 0) ; + // risalita sopra fine percorso precedente + // copio l'entità + int nNew1Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ; + CamData* pNew1CamData = GetCamData( m_pGeomDB->GetUserObj( nNew1Id)) ; + if ( pNew1CamData == nullptr) + return false ; + // modifico questa entità + DBLVECTOR vAxNew1 = vAxPrev ; + vAxNew1[2] = dHomeZ ; + pNew1CamData->SetAxes( CamData::AS_OK, vAxNew1) ; + pNew1CamData->ChangeAxesMask( CamData::MSK_L3) ; + pNew1CamData->SetFlag( 0) ; + // spostamento sopra inizio percorso corrente + // copio l'entità + int nNew2Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ; + CamData* pNew2CamData = GetCamData( m_pGeomDB->GetUserObj( nNew2Id)) ; + if ( pNew2CamData == nullptr) + return false ; + // modifico quella originale (è la prima del percorso) + DBLVECTOR vAxNew2 = vAxCurr ; + vAxNew2[2] = dHomeZ ; + pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ; + pNew2CamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ; + pNew2CamData->SetFlag( 2) ; } - // altrimenti Z corrente minore della precedente + // altrimenti else { - // copio l'entità - if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) - return false ; - // modifico quella originale (è la prima del percorso) - DBLVECTOR vAxNew = vAxCurr ; - vAxNew[2] = vAxPrev[2] ; - pCamData->SetAxes( CamData::AS_OK, vAxNew) ; - pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ; - pCamData->SetFlag( 2) ; + // se Z pressochè uguali non devo fare alcunché + if ( fabs( vAxCurr[2] - vAxPrev[2]) < 10 * EPS_SMALL) + return true ; + // se Z corrente maggiore della precedente + else if ( vAxCurr[2] > vAxPrev[2]) { + // copio l'entità + if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) + return false ; + // modifico quella originale (è la prima del percorso) + DBLVECTOR vAxNew = vAxPrev ; + vAxNew[2] = vAxCurr[2] ; + pCamData->SetAxes( CamData::AS_OK, vAxNew) ; + pCamData->ChangeAxesMask( CamData::MSK_L3) ; + pCamData->SetFlag( 0) ; + } + // altrimenti Z corrente minore della precedente + else { + // copio l'entità + if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) + return false ; + // modifico quella originale (è la prima del percorso) + DBLVECTOR vAxNew = vAxCurr ; + vAxNew[2] = vAxPrev[2] ; + pCamData->SetAxes( CamData::AS_OK, vAxNew) ; + pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ; + pCamData->SetFlag( 2) ; + } } } @@ -1340,7 +1349,16 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn BBox3d b3Raw ; int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Head.Overlaps( b3Raw)) { - bCollide = true ; + // box testa nel riferimento del solido + Frame3d frSolid ; + m_pGeomDB->GetGlobFrame( nRawSolidId, frSolid) ; + BBox3d b3Hsol ; + m_pGeomDB->GetRefBBox( pMch->GetCurrHead(), frSolid, b3Hsol) ; + // solido + const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nRawSolidId)) ; + // verifica di collisione tra box e solido + if ( pStm == nullptr || CDBoxPolyhedron( b3Hsol, *pStm)) + bCollide = true ; break ; } } @@ -1352,9 +1370,6 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn break ; } } - //int nRes = 1 ; - //while ( nRes != 0) - // nRes = ExeProcessEvents( 0, 5) ; } // Riporto la macchina in home pMch->ResetAllAxesPos() ;