From 58b119c68f2b0b6ca289de0b1045241dc0a72042 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Tue, 16 Jan 2024 13:32:56 +0100 Subject: [PATCH] EgtMachKernel : - LeadIn/Out tool non cilindrici, casi ottimizzati a trapezio. --- Pocketing.cpp | 120 ++++++++++++++++++++++++++++++++++++++------------ Pocketing.h | 2 + 2 files changed, 93 insertions(+), 29 deletions(-) diff --git a/Pocketing.cpp b/Pocketing.cpp index f077c0b..63e9024 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -2974,9 +2974,6 @@ Pocketing::CheckSideAngleForVolume( const ISurfTriMesh* pStmVol_Above, const ISu // NB. Anche la lunghezza del Tool va ad influire... non è detto che un angolo ammissibile presenti // una faccia sufficientemente corta lungo Z da non intersecare il Tool ( per SideAngle < 0) - // inverto il volume per trovare gli angoli corretti tra le facce - //pStmVol->Invert() ; - m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pStmVol->Clone()) ; // vettore dei triangoli da proiettare INTVECTOR vInd_TriaToProj ; // per ogni faccia da controllare @@ -3014,22 +3011,31 @@ Pocketing::CheckSideAngleForVolume( const ISurfTriMesh* pStmVol_Above, const ISu if ( ! pStmVol->GetFacetsContact( vnFaces[f], nFlag, bAdjac, ptP1, ptP2, dAng)) return false ; bool bProj = false ; // flag di proiezione della faccia + // se la lunghezza del lato lungo Z supera quella del Tool, allora proietto + BBox3d BBox ; + if ( ! pStmVol->GetFacetBBox( nFlag, GLOB_FRM, BBox)) + return false ; + // se il SideAngle è negativo... if ( m_TParams.m_dSideAng < 0) { - // se la lunghezza del lato lungo Z supera quella del Tool, allora proietto - BBox3d BBox ; - if ( ! pStmVol->GetFacetBBox( nFlag, GLOB_FRM, BBox)) - return false ; bProj = BBox.GetDimZ() > m_TParams.m_dLen ; if ( ! bProj) // se la lunghezza della faccia è valida, allora controllo la relazione con gli angoli bProj = dAng > ANG_RIGHT - m_TParams.m_dSideAng + 2500 * EPS_ANG_SMALL ; // determino di quanto devo uscire if ( ! bProj && dAng > ANG_RIGHT) - if ( abs( m_TParams.m_dSideAng + ANG_RIGHT) > 100 * EPS_SMALL) - dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan( - m_TParams.m_dSideAng * DEGTORAD)) ; + if ( abs( m_TParams.m_dSideAng + ANG_RIGHT) > 100 * EPS_ANG_SMALL) + dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan((dAng - ANG_RIGHT) * DEGTORAD)) ; + } + // se il SideAngle è positivo... + else if ( dAng > 0 && dAng > ANG_RIGHT - m_TParams.m_dSideAng - 2500 * EPS_ANG_SMALL) { + bProj = dAng > ANG_RIGHT ; + if ( ! bProj) { + double dLenOut = BBox.GetDimZ() * tan(( ANG_RIGHT - dAng) * DEGTORAD) ; + dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan( m_TParams.m_dSideAng * DEGTORAD) - dLenOut) ; + } + else + dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan( m_TParams.m_dSideAng * DEGTORAD)) ; } - else if ( m_TParams.m_dSideAng < 0 && dAng > ANG_RIGHT - m_TParams.m_dSideAng + 2500 * EPS_ANG_SMALL) - bProj = true ; // se la faccia è da proiettare if ( bProj) { @@ -3049,19 +3055,23 @@ Pocketing::CheckSideAngleForVolume( const ISurfTriMesh* pStmVol_Above, const ISu } } - // se non ho nessun triangolo da proiettare, allora non faccio nulla - if ( vInd_TriaToProj.empty()) + // se tutti i triangoli non vanno proiettati, allora non faccio nulla + if ( int( vInd_TriaToProj.size()) == 0) return true ; - // Dal volume rimouovo i triangoli ottenuti - PtrOwner pStmToProj( CloneSurfTriMesh( pStmVol)) ; - if ( IsNull( pStmToProj) || ! pStmToProj->IsValid()) - return false ; - for ( int t = 0 ; t < int( vInd_TriaToProj.size()) ; ++ t) - if ( ! pStmToProj->RemoveTriangle( vInd_TriaToProj[t])) + // creo una TriMesh con i triangoli da proiettare + StmFromTriangleSoup StmSoup ; + StmSoup.Start() ; + for ( int t = 0 ; t < int( vInd_TriaToProj.size()) ; ++ t) { + Triangle3dEx Tria ; + if ( ! pStmVol->GetTriangle( vInd_TriaToProj[t], Tria) || + ! StmSoup.AddTriangle( Tria)) return false ; - pStmToProj->DoCompacting() ; - if ( ! pStmToProj->IsValid()) + } + StmSoup.End() ; + + PtrOwner pStmToProj( StmSoup.GetSurf()) ; + if ( IsNull( pStmToProj) || ! pStmToProj->IsValid() || ! pStmToProj->DoCompacting()) return false ; // proietto questa superficie sul piano Z = Z_min @@ -3258,6 +3268,7 @@ Pocketing::ProjectVolume( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_ if ( pSfr_ExtendProjection->IsValid()) if ( ! pSfr->Add( *pSfr_ExtendProjection)) return false ; + // 2) ricavo la superficie da svuotare come sottrazione tra la ( *pSfr) e la ( *pSfrProjection) if ( pSfr->IsValid() && pSfrProjection->IsValid()) if ( ! pSfr->Subtract( *pSfrProjection)) @@ -3424,12 +3435,6 @@ Pocketing::ModifySurfByOpenEdges( ISurfFlatRegion* pSfr, const ISurfFlatRegion* m_dDiam_Prec > 0 ? m_dOffsetR_Prec : GetOffsR(), m_dDiam_Prec > 0 ? m_dSideStep_Prec : GetSideStep(), pSfrLimit)) { - for ( int u = 0 ; u < pCrvEL->GetCurveCount() ; ++ u) { - int nProp0 ; pCrvEL->GetCurveTempProp( u, nProp0, 0) ; - int nProp1 ; pCrvEL->GetCurveTempProp( u, nProp1, 1) ; - int aaa = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvEL->GetCurve( u)->Clone()) ; - m_pGeomDB->SetMaterial( aaa, nProp0 == 0 ? BLUE : RED) ; - } m_pMchMgr->SetLastError( 2430, "Error in Pocketing : adjust open edges failed") ; return false ; } @@ -5926,6 +5931,57 @@ Pocketing::AddOneWay( ISURFFRPOVECTOR& vSfr, const std::vectorGetTempProp( 0) ; + double dExtension = 0. ; + if ( GetLeadInType() == POCKET_LI_HELIX) + dExtension = min( 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam), m_dMaxHelixRad) ; + else if ( GetLeadInType() == POCKET_LI_ZIGZAG) + dExtension = 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; + else if ( GetLeadInType() == POCKET_LI_GLIDE) + dExtension = m_Params.m_dLiTang ; + dExtension += dExtraLenInOut + m_TParams.m_dDiam * 0.5 ; + + m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pMCrv->Clone()) ; + + if ( m_TParams.m_dSideAng < 0) { + // se tutto chiuso + if ( nTmpProp == 0) { + m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; + return false ; + } + // se un lato aperto + else if ( nTmpProp & 1 || nTmpProp & 4 || nTmpProp == 10) { // almeno 1 base aperta o entrambi i lati obliqui aperti + if ( nOutsideRaw == 2) + return true ; + if ( nOutsideRaw == 0) + pMCrv->ExtendStartByLen( dExtension) ; + + pMCrv->ExtendEndByLen( dExtension) ; + return true ; + } + else if ( nTmpProp == 2 || nTmpProp == 8) { // 1 lato obliquo aperto e tutti gli altri chiusi + if ( nTmpProp == 2 && nOutsideRaw == 0) + pMCrv->Invert() ; + + pMCrv->Close() ; + + if ( nOutsideRaw == 0) { + pMCrv->ExtendStartByLen( dExtension) ; + pMCrv->ExtendEndByLen( dExtension) ; + } + return true ; + } + } + else { + + } + return true ; +} //---------------------------------------------------------------------------- bool @@ -6114,7 +6170,7 @@ Pocketing::AddSpiralIn( ISURFFRPOVECTOR& vSfr, const vector& if ( GetLeadInType() == POCKET_LI_HELIX) dLenCheck = min( 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam), m_dMaxHelixRad) ; - else if ( GetLeadInType() ==POCKET_LI_ZIGZAG) + else if ( GetLeadInType() == POCKET_LI_ZIGZAG) dLenCheck = 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; else if ( GetLeadInType() == POCKET_LI_GLIDE) dLenCheck = m_Params.m_dLiTang ; @@ -6144,6 +6200,11 @@ Pocketing::AddSpiralIn( ISURFFRPOVECTOR& vSfr, const vector& if ( bOptimizedTrap) { AdjustTrapezoidSpiralForLeadInLeadOut( pMCrv, pRCrv, vtTool, dDepth, nOutsideRaw) ; bOutStart = ( nOutsideRaw > 0) ; + // controllo geometria del tool + if ( m_TParams.m_dSideAng != 0) { + if ( ! AdjustTrapezoidSpiralLeadInLeadOutForSideAngle( pMCrv, dExtraLenInOut, nOutsideRaw)) + return false ; + } // aggiorno la curva per eventuali inversioni SDStepCurr.vMCrv.back().Set( pMCrv->Clone()) ; } @@ -10547,6 +10608,7 @@ Pocketing::VerifyLeadInZigZag( ISurfFlatRegion* pSrfChunk, const Point3d& ptPa, for ( int c = 0 ; c < pSrfChunk->GetChunkCount() ; c++) { for ( int l = 0 ; l < pSrfChunk->GetLoopCount( c) ; l++) { vCrv.emplace_back( GetCurveComposite( pSrfChunk->GetLoop( c, l))) ; + m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, vCrv.back()->Clone()) ; } } if ( vCrv.size() == 0) @@ -12258,7 +12320,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTr swap( vnProp[1], vnProp[3]) ; } // segno i lati aperti come temp prop della curva - int nOpenEdges = vnProp[0] + vnProp[1] * 2 + vnProp[3] * 8 ; + int nOpenEdges = vnProp[0] + vnProp[1] * 2 + vnProp[2] * 4 + vnProp[3] * 8 ; pMCrv->SetTempProp( nOpenEdges, 0) ; pMCrv->SetExtrusion( vtExtr) ; diff --git a/Pocketing.h b/Pocketing.h index af18bea..24ea268 100644 --- a/Pocketing.h +++ b/Pocketing.h @@ -97,6 +97,8 @@ class Pocketing : public Machining bool GetSpecialElevation( const ISurfFlatRegion* pSfr, const ICurveLine* pLine, const bool bInVsOut, double& dElev) ; + bool AdjustTrapezoidSpiralLeadInLeadOutForSideAngle( ICurveComposite* pMCrv, const double dExtraLenInOut, + const int nOutsideRaw) ; bool GetRaw( ISurfTriMesh* pStmRaw) ; bool SliceVolume( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_Part, const ISurfTriMesh* pSt_Raw, ISURFFRPOVECTOR& vSrfSliced, ISURFFRPOVECTOR& vSfrLimit, std::vector& vCrvOEWithFlags,