From b16dd260d800ce1cd5ad74db3b59c9e630e6bddf Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Thu, 15 May 2025 16:23:53 +0200 Subject: [PATCH] EgtGEomKernel : - In CalcPocketing aggiunto controllo lunghezza dei lati aperti, aggiunto parametro MaxOptSize e aggiunte migliorie a percorsi Conformal. --- CalcPocketing.cpp | 53 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 3ac91fb..5213465 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -1229,7 +1229,6 @@ AdjustOpenEdge( const ICurveComposite* pCrvCompo, const ICRVCOMPOPOVECTOR& vCrvI /* parametri : pCrvCompo -> curva originaria di bordo vCrvIsland -> vettore delle isole all'interno di pCrvCompo - pCrvOpenOffs -> tratto aperto corrente già Offsettato verso l'esterno dParS -> parametro sulla pCrvCompo per l'inizio del tratto aperto dParE -> parametro sulla pCrvCompo per la fine del tratto aperto vtTanS -> vettore di tangenza finale tratto chiuso precedente @@ -1240,8 +1239,6 @@ AdjustOpenEdge( const ICurveComposite* pCrvCompo, const ICRVCOMPOPOVECTOR& vCrvI questa curva sarà l'estensione del lato aperto, adattandosi alla geometria dei chiusi ( non posso vedere solo i chiusi adiacenti all'aperto, devo considerare TUTTI i chiusi della pCrvCompo - pStmVol -> Volume di svuotatura - pStm_Part -> Part corrente */ // controllo la validità dei parametri @@ -1567,17 +1564,24 @@ AdjustContourWithOpenEdges( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vCrvI double dParE = dParS + 1. * vpCrvs[i]->GetCurveCount() ; // se aperta if ( nCurrTmpProp == TEMP_PROP_OPEN_EDGE) { - // ricavo la tangenze dei lati chiusi agli estremi di questa curva - Vector3d vtTanS = V_INVALID ; - Vector3d vtTanE = V_INVALID ; - if ( i != 0) { - if ( ! vpCrvs[i-1]->GetEndDir( vtTanS) || // tangente finale del chiuso precedente - ! vpCrvs[( i + 1) % int( vpCrvs.size())]->GetStartDir( vtTanE)) // tangente iniziale del chiuso successivo... + // controllo che sia almeno lungo quanto il diametro utensile + double dLen = 0. ; + vpCrvs[i]->GetLength( dLen) ; + if ( dLen > PockParams.dRad * 2 - 5 * EPS_SMALL) { + // ricavo la tangenze dei lati chiusi agli estremi di questa curva + Vector3d vtTanS = V_INVALID ; + Vector3d vtTanE = V_INVALID ; + if ( i != 0) { + if ( ! vpCrvs[i-1]->GetEndDir( vtTanS) || // tangente finale del chiuso precedente + ! vpCrvs[( i + 1) % int( vpCrvs.size())]->GetStartDir( vtTanE)) // tangente iniziale del chiuso successivo... + return false ; + vtTanE.Invert() ; // invertita + } + if ( ! AdjustOpenEdge( pCrvCompo, vCrvIsl, dParS, dParE, vtTanS, vtTanE, dRad, dDiamJ, PockParams, vpCrvs[i])) return false ; - vtTanE.Invert() ; // invertita } - if ( ! AdjustOpenEdge( pCrvCompo, vCrvIsl, dParS, dParE, vtTanS, vtTanE, dRad, dDiamJ, PockParams, vpCrvs[i])) - return false ; + else + nCurrTmpProp = TEMP_PROP_CLOSE_EDGE ; } // assegno le proprietà di lato Aperto/Chiuso per la curva corrente for ( int u = 0 ; u < vpCrvs[i]->GetCurveCount() ; ++ u) @@ -3574,7 +3578,8 @@ GetSpiralOptimizedCurves( const ISurfFlatRegion* pSfrChunk, const PocketParams& Frame3d frTrap ; double dPocketSize ; int nBase, nSecondBase ; - bool bOkTrap = ( GetTrapezoidFromShape( pCrvBorder, pCrvTrap, frTrap, PockParam, dPocketSize, nBase, nSecondBase)) ; + bool bOkTrap = ( GetTrapezoidFromShape( pCrvBorder, pCrvTrap, frTrap, PockParam, dPocketSize, nBase, nSecondBase) && + dPocketSize < PockParam.dMaxOptSize + 10 * EPS_SMALL) ; if ( bOkTrap && pCrvTrap->IsValid()) { pCrvTrap->SetExtrusion( Z_AX) ; CalcTrapezoidSpiral( pCrvTrap, frTrap, dPocketSize, nBase, nSecondBase, PockParam, pCrvRes, bOkTrap) ; @@ -7743,8 +7748,6 @@ OrderAndExtendConformalPaths( ICRVCOMPOPOVECTOR& vCrvPaths, const ISurfFlatRegio if ( pSfrChunk == nullptr || ! pSfrChunk->IsValid() || pSfrOrig == nullptr || ! pSfrOrig->IsValid()) return false ; - if ( int( vCrvPaths.size()) < 2) - return true ; // superficie di controllo per parti isolate PtrOwner pSfrToRemove( CloneSurfFlatRegion( pSfrChunk)) ; @@ -8417,7 +8420,7 @@ AddConformal( ISurfFlatRegion* pSfrPock, const ISurfFlatRegion* pSfrOrig, else { // ricavo gli Offset ( se possibili) dei tratti chiusi del Chunk VICRVCOMPOPOVECTOR vvCrvOffs ; - if ( ! GetConformalOffsets( pSfrChunk, pSfrPock, pSfrOrig, PockParams, vvCrvOffs)) + if ( ! GetConformalOffsets( pSfrChunk, pSfrChunk, pSfrOrig, PockParams, vvCrvOffs)) return false ; // se non ottengo Curve di Offset, lavoro in SpiralIn ( il Chunk ha dei lati aperti) if ( vvCrvOffs.empty()) { @@ -8566,7 +8569,8 @@ SmoothExtensionLinesByIntersection( ICRVCOMPOPOVECTOR& vCrvPaths, const PocketPa bool CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double dStep, double dAngle, double dOpenMinSafe, int nType, bool bSmooth, bool bInvert, bool bAvoidOpt, bool bAllowZigZagOneWayBorders, - bool bCalcFeed, const Point3d& ptEndPrec, const ISurfFlatRegion* pSfrLimit, bool bAllOffs, ICRVCOMPOPOVECTOR& vCrvCompoRes) + bool bCalcFeed, const Point3d& ptEndPrec, const ISurfFlatRegion* pSfrLimit, bool bAllOffs, + double dMaxOptSize, ICRVCOMPOPOVECTOR& vCrvCompoRes) { // controllo dei parametri if ( pSfr == nullptr || ! pSfr->IsValid() || @@ -8592,6 +8596,7 @@ CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double myParams.bCalcFeed = bCalcFeed ; myParams.bAllowZigZagOneWayBorders = bAllowZigZagOneWayBorders ; myParams.bOptOffsets = ( ! bAllOffs) ; + myParams.dMaxOptSize = dMaxOptSize ; if ( ptEndPrec.IsValid()) myParams.ptStart = ptEndPrec ; if ( pSfrLimit != nullptr && pSfrLimit->IsValid()) @@ -9004,4 +9009,18 @@ CalcZigZagInfill( const ISurfFlatRegion* pSfr, double dStep, bool bSmooth, bool } return true ; +} + +//---------------------------------------------------------------------------- +bool +CalcSmoothCurve( ICurveComposite* pCrv, double dRightLen, double dLeftLen, bool bAsParam) +{ + // controllo dei parametri + if ( pCrv == nullptr || ! pCrv->IsValid()) + return false ; + + // definisco i parametri + PocketParams myPockParams ; + myPockParams.bSmooth = true ; + return ModifyCurveToSmoothed( pCrv, myPockParams, dRightLen, dLeftLen, bAsParam) ; } \ No newline at end of file