diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 5ca33c8..01e3d38 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Operation.cpp b/Operation.cpp index aa0f140..748b2f8 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -1840,7 +1840,7 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) dSafeZ = dUnsafeZ ; } else { - for ( int i = 1 ; i <= 4 ; ++ i) { + for ( int i = 1 ; i <= 3 ; ++ i) { double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ; vAxVal2[2] = dTestSafeZ ; vAxIni2[2] = dTestSafeZ ; @@ -1853,6 +1853,16 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) } } } + // se necessario, riprovo appena prima di Zmax + if ( ! bPartRise) { + double dOffsZ = 5 * ( bZHomeDown ? 1 : -1) ; + vAxVal2[2] = dHomeZ + dOffsZ ; + vAxIni2[2] = dHomeZ + dOffsZ ; + if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { + bPartRise = true ; + dSafeZ = dHomeZ + dOffsZ ; + } + } if ( ! bPartRise) { // cancello eventuale risalita parziale della lavorazione precedente pPrevOp->RemoveRise() ; @@ -2035,7 +2045,7 @@ Operation::AdjustOneStartMovement( int nClPathId, int nPrevClPathId, Operation* // riprovo con una Z intermedia double dSafeZ = dHomeZ ; double dUnsafeZ = dTopZ ; - for ( int i = 1 ; i <= 4 ; ++ i) { + for ( int i = 1 ; i <= 3 ; ++ i) { double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ; vAxPrevTmp[2] = dTestSafeZ ; vAxCurrTmp[2] = dTestSafeZ ; @@ -2656,7 +2666,7 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn INTVECTOR vCollId ; pMch->GetCurrHeadCollGroups( vCollId) ; // distanza di sicurezza - const double TOL_SAFEDIST = 10.0 ; + const double TOL_SAFEDIST = 5.0 ; const double MIN_SAFEDIST = 10.0 ; double dSafeDist = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() ; dSafeDist = max( dSafeDist - TOL_SAFEDIST, MIN_SAFEDIST) ; diff --git a/Pocketing.cpp b/Pocketing.cpp index 3ce754c..f4931cc 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -2090,8 +2090,9 @@ Pocketing::AddZigZag( const ISurfFlatRegion* pSrf, const Vector3d& vtTool, const double dStElev ; if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev)) dStElev = j * dStep ; - bool bUnderRaw = GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; - if ( bUnderRaw == m_bAboveHead) + bool bUnderRaw = m_bAboveHead && ! m_bAggrBottom && + GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; + if ( bUnderRaw) dStElev = max( dStElev, j * dStep) ; dStElev -= ( ptP1 - ptStart) * vtExtr ; // se inizio, approccio globale al punto iniziale @@ -2246,7 +2247,7 @@ Pocketing::AddZigZag( const ISurfFlatRegion* pSrf, const Vector3d& vtTool, const if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev)) dStElev = dElev ; bool bUnderStart = m_bAboveHead && GetPointUnderRaw( ptP1, vtTool, 0, - GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; + GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; if ( bUnderStart) dStElev = max( dStElev, dElev) ; dStElev -= ( ptP1 - ptStart) * vtExtr ; @@ -2672,8 +2673,9 @@ Pocketing::AddOneWay( const ISurfFlatRegion* pSrf, const Vector3d& vtTool, const double dStElev ; if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev)) dStElev = dStep ; - bool bUnderRaw = GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; - if ( bUnderRaw == m_bAboveHead) + bool bUnderRaw = m_bAboveHead && ! m_bAggrBottom && + GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; + if ( bUnderRaw) dStElev = max( dStElev, dStep) ; dStElev -= ( ptP1 - ptStart) * vtExtr ; // se attacco a zigzag o a spirale o a scivolo, l'elevazione va nell'attacco @@ -2828,8 +2830,9 @@ Pocketing::AddOneWay( const ISurfFlatRegion* pSrf, const Vector3d& vtTool, const double dStElev ; if ( ! GetElevation( m_nPhase, ptS - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev)) dStElev = j * dStep ; - bool bUnderRaw = GetPointUnderRaw( ptP, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; - if ( bUnderRaw == m_bAboveHead) + bool bUnderRaw = m_bAboveHead && ! m_bAggrBottom && + GetPointUnderRaw( ptP, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; + if ( bUnderRaw) dStElev = max( dStElev, j * dStep) ; dStElev -= ( ptP - ptS) * vtExtr ; // sempre approccio di collegamento @@ -2977,8 +2980,9 @@ Pocketing::AddSpiralIn( const ISurfFlatRegion* pSrf, const Vector3d& vtTool, con double dStElev ; if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev)) dStElev = dStep ; - bool bUnderRaw = GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; - if ( bUnderRaw == m_bAboveHead) + bool bUnderRaw = m_bAboveHead && ! m_bAggrBottom && + GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; + if ( bUnderRaw) dStElev = max( dStElev, dStep) ; dStElev -= ( ptP1 - ptStart) * vtExtr ; @@ -3160,8 +3164,9 @@ Pocketing::AddSpiralOut( const ISurfFlatRegion* pSrf, const Vector3d& vtTool, co double dStElev ; if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), vtTool, dStElev)) dStElev = dStep ; - bool bUnderRaw = GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; - if ( bUnderRaw == m_bAboveHead) + bool bUnderRaw = m_bAboveHead && ! m_bAggrBottom && + GetPointUnderRaw( ptP1, vtTool, 0, GetRadiusForStartEndElevation(), m_TParams.m_dLen, false, dSafeZ, dStElev) ; + if ( bUnderRaw) dStElev = max( dStElev, dStep) ; dStElev -= ( ptP1 - ptStart) * vtExtr ; // se attacco a zigzag o a spirale o a scivolo, l'elevazione va nell'attacco diff --git a/SurfFinishing.cpp b/SurfFinishing.cpp index f328878..5d57601 100644 --- a/SurfFinishing.cpp +++ b/SurfFinishing.cpp @@ -840,28 +840,39 @@ bool SurfFinishing::VerifyGeometry( SelData Id, int& nSubs) { // ammessi : curve o superfici - - // per ora accetto solo curve - const ICurve* pCurve = nullptr ; const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( Id.nId) ; - // se direttamente la curva - if ( Id.nSub == SEL_SUB_ALL) { - pCurve = ::GetCurve( pGObj) ; - if ( pCurve != nullptr) { - if ( pCurve->GetType() == CRV_COMPO) - nSubs = ::GetCurveComposite( pCurve)->GetCurveCount() ; - else - nSubs = 0 ; + if ( pGObj == nullptr) + return false ; + // se curva + if ( ( pGObj->GetType() & GEO_CURVE) != 0) { + const ICurve* pCurve = nullptr ; + // se direttamente la curva + if ( Id.nSub == SEL_SUB_ALL) { + pCurve = ::GetCurve( pGObj) ; + if ( pCurve != nullptr) { + if ( pCurve->GetType() == CRV_COMPO) + nSubs = ::GetCurveComposite( pCurve)->GetCurveCount() ; + else + nSubs = 0 ; + } } + // altrimenti sottocurva di composita + else { + const ICurveComposite* pCompo = GetCurveComposite( pGObj) ; + if ( pCompo != nullptr) + pCurve = pCompo->GetCurve( Id.nSub) ; + nSubs = 0 ; + } + return ( pCurve != nullptr) ; } - // altrimenti sottocurva di composita - else { - const ICurveComposite* pCompo = GetCurveComposite( pGObj) ; - if ( pCompo != nullptr) - pCurve = pCompo->GetCurve( Id.nSub) ; - nSubs = 0 ; + // se altrimenti è superficie trimesh + else if ( pGObj->GetType() == SRF_TRIMESH) { + const ISurfTriMesh* pSurf = ::GetSurfTriMesh( pGObj) ; + return ( pSurf != nullptr && pSurf->GetFacetCount() >= 1) ; } - return ( pCurve != nullptr) ; + // altrimenti errore + else + return false ; } //---------------------------------------------------------------------------- @@ -921,6 +932,10 @@ SurfFinishing::GetCurves( SelData Id, ICURVEPLIST& lstPC) lstPC.emplace_back( Release( pCurve)) ; return true ; } + // se altrimenti superficie + else if ( pGObj->GetType() == SRF_TRIMESH) + return true ; + // altrimenti errore else return false ; } @@ -1222,7 +1237,16 @@ SurfFinishing::GetActiveSurfaces( INTVECTOR& vSurfId) const // verifiche if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) return false ; - // ciclo sui grezzi attivi nella fase + // cerco tra gli oggetti selezionati + for ( const auto& Id : m_vId) { + int nEntId = Id.nId ; + if ( m_pGeomDB->GetGeoType( nEntId) == SRF_TRIMESH) + vSurfId.emplace_back( nEntId) ; + } + // se trovate superfici, considero solo queste ed esco + if ( ! vSurfId.empty()) + return true ; + // altrimenti considero tutte le superfici dei pezzi nei grezzi attivi della fase int nRawId = m_pMchMgr->GetFirstRawPart() ; while ( nRawId != GDB_ID_NULL) { if ( m_pMchMgr->VerifyRawPartPhase(nRawId, m_nPhase)) {