diff --git a/Pocketing.cpp b/Pocketing.cpp index a518e5b..97fdd3d 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -738,7 +738,7 @@ Pocketing::Update( bool bPostApply) return true ; } - // elimino le entit� CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo) + // elimino le entità CLIMB, RISE e HOME della lavorazione, potrebbero falsare i calcoli degli assi (in ogni casi vengono riaggiunte dopo) RemoveClimbRiseHome() ; // imposto eventuale asse bloccato da lavorazione @@ -1368,7 +1368,7 @@ Pocketing::SetCurveAllTempProp( int nCrvId, bool bForcedClose, ICurve* pCurve, b return false ; if ( pbSomeOpen != nullptr) *pbSomeOpen = false ; - // reset propriet� temporanee + // reset proprietà temporanee ResetCurveAllTempProp( pCurve) ; // se forzato chiuso o non presenti info per lati aperti, esco if ( bForcedClose || ! m_pGeomDB->ExistsInfo( nCrvId, KEY_OPEN)) @@ -1397,6 +1397,17 @@ Pocketing::SetCurveAllTempProp( int nCrvId, bool bForcedClose, ICurve* pCurve, b return true ; } +//---------------------------------------------------------------------------- +bool +Pocketing::GetForcedClosed( void) +{ + int nOpen ; + if ( FromString( ExtractInfo( m_Params.m_sUserNotes, "Open="), nOpen) && nOpen == 0) + return true ; + else + return false ; +} + //---------------------------------------------------------------------------- bool Pocketing::ResetCurveAllTempProp( ICurve* pCurve) @@ -1583,11 +1594,10 @@ Pocketing::ProcessPath( int nAuxId, int nPvId, int nClId) while ( nPathId != GDB_ID_NULL) { // Scorro tutte le curve concatenate per creare la superficie da lavorare - int nPi = m_pGeomDB->GetFirstInGroup( nPathId) ; - const IGeoObj* pGObj = m_pGeomDB->GetGeoObj( nPi) ; - if ( pGObj == nullptr) + int nPi = m_pGeomDB->GetFirstInGroup( nPathId) ; //nCrvId + if ( m_pGeomDB->GetGeoType( nPi) != CRV_COMPO) return false ; - const ICurve* pOriCurve = ::GetCurve( pGObj) ; + const ICurve* pOriCurve = ::GetCurve( m_pGeomDB->GetGeoObj( nPi)) ; if ( pOriCurve == nullptr) return false ; PtrOwner pCompoOriCrv( GetCurveComposite( pOriCurve->Clone())) ; @@ -1598,25 +1608,12 @@ Pocketing::ProcessPath( int nAuxId, int nPvId, int nClId) nProp0 = pCompoOriCrv->GetTempProp( 0) ; // id selezionato nProp1 = pCompoOriCrv->GetTempProp( 1) ; // lato adiancente per Trimesh - bool bSomeOpen = m_pGeomDB->ExistsInfo( nPi, KEY_OPEN) ; - if ( bSomeOpen) { - int nOpen ; - if ( FromString( ExtractInfo( m_Params.m_sUserNotes, "Open="), nOpen) && nOpen == 0) - bSomeOpen = false ; - } - // annullo i flag di tratto aperto for ( int i = 0 ; i < int( pCompoOriCrv->GetCurveCount()) ; ++i) pCompoOriCrv->SetCurveTempProp( i, 0, 0) ; // alla sottocurva - // aggiorno flag per lati aperti - if ( bSomeOpen) { - INTVECTOR vOpen ; - m_pGeomDB->GetInfo( nPi, KEY_OPEN, vOpen) ; - for ( int j : vOpen) - pCompoOriCrv->SetCurveTempProp( j, 1, 0) ; // alla sottocurva - } - + bool bSomeOpen ; // = m_pGeomDB->ExistsInfo( nPi, KEY_OPEN) ; + SetCurveAllTempProp( nPi, GetForcedClosed(), pCompoOriCrv, &bSomeOpen) ; // unisco le parti allineate (tranne inizio-fine se chiusa) if ( ! pCompoOriCrv->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL, false, true)) return false ; @@ -3321,8 +3318,7 @@ Pocketing::OptimizedZigZag( ISurfFlatRegion* pSrf, const Vector3d& vtTool, doubl // setto proprietà sulle curve if ( ! bSrfOriIsCut) - SetCurveAllTempProp( nCrvId, pCrvPocket) ; - SetCurveAllTempProp( nCrvId, GetForcedClosed(), pCrvPocket) ; + SetCurveAllTempProp( nCrvId, GetForcedClosed(), pCrvPocket) ; pCrvPocket->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL) ; // sistemo senso antiorario visto dalla direzione di estrusione @@ -5070,6 +5066,13 @@ Pocketing::CalcSpiral( const ISurfFlatRegion* pSrfPock, int& nReg, Point3d& ptSt else return true ; } + bool bSomeOpen = false ; + int nTmpProp0 = -1 ; + for ( int u = 0 ; u < pCrvOEWithFlags->GetCurveCount() && !bSomeOpen; ++ u) { + pCrvOEWithFlags->GetCurveTempProp( u, nTmpProp0, 0) ; + bSomeOpen = ( nTmpProp0 == 1) ; + } + // caso trapezoide pCrvOEWithFlags->MergeCurves( 10 * EPS_SMALL, 10 * EPS_ANG_SMALL, true, true) ; Point3d pt ; Vector3d vtB1, vtL1, vtB2 ; @@ -5086,9 +5089,11 @@ Pocketing::CalcSpiral( const ISurfFlatRegion* pSrfPock, int& nReg, Point3d& ptSt double dPocketSize = vtOrtho.Len() ; double dMaxOptSize ; FromString( ExtractInfo( m_Params.m_sUserNotes, "MaxOptSize="), dMaxOptSize) ; - if ( dPocketSize < m_TParams.m_dDiam + EPS_SMALL && + if ( ( ( bSomeOpen && dPocketSize < m_TParams.m_dDiam + EPS_SMALL) || + abs( dPocketSize - m_TParams.m_dDiam) < EPS_SMALL) && ( ! FromString( ExtractInfo( m_Params.m_sUserNotes, "MaxOptSize="), dMaxOptSize) || - dPocketSize < dMaxOptSize)) { + dPocketSize < dMaxOptSize)) + { if ( nReg == 0) { CalcTrapezoidSpiral( pCrvOEWithFlags, vtDir, dPocketSize, pMCrv, pRCrv, bOptimizedTrap) ; if ( bOptimizedTrap) { diff --git a/Pocketing.h b/Pocketing.h index ebb0b8f..7a15e1d 100644 --- a/Pocketing.h +++ b/Pocketing.h @@ -71,6 +71,7 @@ class Pocketing : public Machining private : bool VerifyGeometry( SelData Id, int& nSubs, int& nType) ; bool GetCurves( SelData Id, ICURVEPLIST& lstPC) ; + bool GetForcedClosed( void) ; bool SetCurveAllTempProp( int nCrvId, bool bForcedClose, ICurve* pCurve, bool* pbSomeOpen = nullptr) ; bool ResetCurveAllTempProp( ICurve* pCurve) ; bool Chain( int nGrpDestId) ;