From 3cda97534eeb52b99cfd5a11158aab11b637181c Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Thu, 4 Jan 2024 09:35:14 +0100 Subject: [PATCH] EgtMachKernel : -piccola modifica. --- Pocketing.cpp | 48 ++++++++++++++++++++++++++++++++++++++++-------- Pocketing.h | 3 ++- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/Pocketing.cpp b/Pocketing.cpp index 0ce3efc..3f1127f 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -2052,7 +2052,6 @@ Pocketing::AdjustPocketingSideForVolumePart( ISurfTriMesh* pStmVolPart, const Ve bool Pocketing::ProcessPath( int nPathId, int nPvId, int nClId) { - // recupero gruppo per geometria temporanea ( Gruppo Temp) const string GRP_TEMP = "Temp" ; int nTempId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, GRP_TEMP) ; @@ -2105,7 +2104,7 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId) if ( ! AdjustPocketingSideForVolumePart( pStm_PartVolume, vtTool)) return false ; - // devo calcolare l'Elevazione... + // devo calcolare l'Elevazione... ( devo tenere conto del grezzo, non solo della parte) Frame3d frElevation ; frElevation.Set( ptC, vtTool) ; if ( ! frElevation.IsValid()) @@ -2113,11 +2112,39 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId) pStm_PartVolume->ToLoc( frElevation) ; // ricavo quindi il Box BBox3d BBox ; pStm_PartVolume->GetLocalBBox( BBox) ; - // il su cui iniziare a svuotare è quello che si trova a Z minima + // il piano su cui iniziare a svuotare è quello che si trova a Z minima double dZ_min = BBox.GetMin().z ; + // riporto in globale pStm_PartVolume->ToGlob( frElevation) ; - // calcolo l'elevazione massima ( è la lunghezza Z del Box con asse Z uguale a vtTool) - double dElev = BBox.GetDimZ() ; + // calcolo l'elevazione massima su ogni faccia del volume con normale circa - vtTool ( il volume è interno) + double dElev = 0. ; + pStm_PartVolume->Invert() ; // ho curve e normali orientate correttamente + for ( int i = 0 ; i < pStm_PartVolume->GetFacetCount() ; ++ i) { + Vector3d vtN_f ; + if ( ! pStm_PartVolume->GetFacetNormal( i, vtN_f)) + return false ; + if ( ! AreSameVectorEpsilon( vtTool, vtN_f, 5 * EPS_SMALL)) + continue ; + // ricavo le polyLine di bordo + POLYLINEVECTOR vPL ; + if ( ! pStm_PartVolume->GetFacetLoops( i, vPL) || + vPL.empty()) + return false ; + // ricavo le curve Composite associate e calcolo l'elevazione + for ( int j = 0 ; j < int( vPL.size()) ; ++ j) { + PtrOwner pCompo( CreateCurveComposite()) ; + double dCurrElev = 0. ; + if ( IsNull( pCompo) || + ! pCompo->FromPolyLine( vPL[j]) || + ! pCompo->IsValid() || + ! CalcRegionElevation( pCompo, vtTool, 0., + 0.5 * ( m_dDiam_Prec > 0 ? m_dDiam_Prec : m_TParams.m_dDiam), + m_dLen_Prec > 0 ? m_dLen_Prec : m_TParams.m_dLen, dCurrElev)) + return false ; + dElev = max( dElev, dCurrElev) ; + } + } + pStm_PartVolume->Invert() ; // riporto come in orginale // eventuale imposizione massima elevazione da note utente double dMaxElev ; if ( FromString( ExtractInfo( m_Params.m_sUserNotes, "MaxElev="), dMaxElev) && dElev > dMaxElev) @@ -3317,7 +3344,7 @@ Pocketing::CalcRegionElevation( const ICurveComposite* pCompo, const Vector3d& v // ordino il vettore secondo l'elevazione crescente sort( vRawElev.begin(), vRawElev.end(), []( const INTDBL& a, const INTDBL& b) { return a.second < b.second ; }) ; - // box dell'insieme delle posizioni utensile all'inizioe + // box dell'insieme delle posizioni utensile all'inizio const double MAX_DIST_RAW = 200.0 ; BBox3d b3Tool ; pgFacet.GetLocalBBox( b3Tool) ; @@ -9377,8 +9404,13 @@ Pocketing::AdjustOpenEdge( const ICurveComposite* pCrvCompo, const ICRVCOMPOPOVE // L'algoritmo di allargamento presso i lati aperti è Euristico; io mi estendo a seconda della geometria del // lato aperto al di fuori del volume di svuotatura... Devo controllare di non rovinare delle zone al di fuori di // esso ! - if ( ! pSfrInc->Subtract( *pSfrLimit)) - return false ; + + m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrInc->Clone()) ; + m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSfrLimit->Clone()) ; + + if ( pSfrLimit->IsValid()) + if ( ! pSfrInc->Subtract( *pSfrLimit)) + return false ; // controllo se la curva è un'isola bool bIsIsland = false ; diff --git a/Pocketing.h b/Pocketing.h index a2d2bc1..8c95ff6 100644 --- a/Pocketing.h +++ b/Pocketing.h @@ -317,7 +317,8 @@ class Pocketing : public Machining double m_dDiam_Prec = 0.0 ; // diametro utensile per precedente svuotatura double m_dOffsetR_Prec = 0.0 ; // offset radiale della svuotatura precedente double m_dSideStep_Prec = 0.0 ; // side Step della svuotatura precedente + double m_dLen_Prec = 0.0 ; // Lunghezza del tool precedente bool m_bOrderStepZ = true ; // parametro per ordinare gli step Extra per Z decrescente o meno - bool m_bPocketPlane = true ; // flag per svuotare solo la rimanenza sullo Step Extra + bool m_bPocketPlane = false ; // flag per svuotare solo la rimanenza sullo Step Extra } ; \ No newline at end of file