diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 64ddd2d..e9ae10c 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -4052,7 +4052,7 @@ GetPocketingOptimizedCurves( ISurfFlatRegion* pSfr, const PocketParams& PockPara //---------------------------------------------------------------------------- static bool -GetParamOnOpenCurve( const ICurveComposite* pCompo, const PocketParams& PockParams, bool& bOutStart, +GetParamOnOpenCurve( const ICurveComposite* pCompo, const PocketParams& PockParams, const Point3d& ptEndPrec, bool& bOutStart, Point3d& ptStart, Vector3d& vtOut) { // controllo dei parametri @@ -4070,22 +4070,34 @@ GetParamOnOpenCurve( const ICurveComposite* pCompo, const PocketParams& PockPara pMyCrv = pCompo->GetNextCurve() ; } + // se ho un punto di riferimento, cambio il punto iniziale della curva, partendo da questa + PtrOwner pMyCompo( CloneCurveComposite( pCompo)) ; + if ( IsNull( pMyCompo) || ! pMyCompo->IsValid()) + return false ; + if ( ptEndPrec.IsValid()) { + double dMinDistPar = 0. ; + int nFlag = 0 ; + DistPointCurve( ptEndPrec, *pMyCompo).GetParamAtMinDistPoint( 0., dMinDistPar, nFlag) ; + if ( dMinDistPar > EPS_PARAM) + pMyCompo->ChangeStartPoint( floor( dMinDistPar)) ; + } + // richiedo lunghezza superiore a diametro utensile più doppio offset radiale double dRefLen = ( bAllOpen ? 0. : ( 2 * PockParams.dRad) + 2 * PockParams.dRadialOffset - EPS_SMALL) ; double dMaxLen = dRefLen ; // ciclo sulle singole curve - bool bFound = false ; - const ICurve* pPrevCrv = pCompo->GetLastCurve() ; + bool bFound = false, bFirst = true ; + const ICurve* pPrevCrv = pMyCompo->GetLastCurve() ; double dLenPrev = 0. ; if ( pPrevCrv != nullptr && pPrevCrv->GetTempProp() == TEMP_PROP_OPEN_EDGE) pPrevCrv->GetLength( dLenPrev) ; - const ICurve* pCrv = pCompo->GetFirstCurve() ; + const ICurve* pCrv = pMyCompo->GetFirstCurve() ; while ( pCrv != nullptr) { // analizzo la curva successiva - const ICurve* pNextCrv = pCompo->GetNextCurve() ; + const ICurve* pNextCrv = pMyCompo->GetNextCurve() ; bool bNextOk = ( pNextCrv != nullptr) ; if ( ! bNextOk) - pNextCrv = pCompo->GetFirstCurve() ; + pNextCrv = pMyCompo->GetFirstCurve() ; double dLenNext = 0. ; if ( pNextCrv != nullptr && pNextCrv->GetTempProp() == TEMP_PROP_OPEN_EDGE) pNextCrv->GetLength( dLenNext) ; @@ -4105,6 +4117,8 @@ GetParamOnOpenCurve( const ICurveComposite* pCompo, const PocketParams& PockPara dLenAgg += max( 0.4, vtEnd * vtNextStart) * dLenNext ; } } + if ( ptEndPrec.IsValid() && bFirst) + dLenAgg += 2. * ( dLenPrev + dLenNext) ; // entità corrente double dLen = 0 ; if ( pCrv->GetLength( dLen)) { @@ -4118,6 +4132,7 @@ GetParamOnOpenCurve( const ICurveComposite* pCompo, const PocketParams& PockPara ( abs( ptTest.z - ptStart.z) < 100 * EPS_SMALL && ptTest.y < ptStart.y - 100 * EPS_SMALL)) { dMaxLen = max( dMaxLen, dLen + dLenAgg) ; ptStart = ptTest ; + bOutStart = true ; // versore ortogonale verso l'esterno pCrv->GetMidDir( vtOut) ; vtOut.Rotate( Z_AX, 0, -1) ; @@ -4130,6 +4145,7 @@ GetParamOnOpenCurve( const ICurveComposite* pCompo, const PocketParams& PockPara // versore ortogonale verso l'esterno vtOut.Normalize() ; vtOut.Rotate( Z_AX, 0, -1) ; + bOutStart = true ; bFound = true ; } } @@ -4141,6 +4157,7 @@ GetParamOnOpenCurve( const ICurveComposite* pCompo, const PocketParams& PockPara // vado alla successiva pPrevCrv = pCrv ; pCrv = ( bNextOk ? pNextCrv : nullptr) ; + bFirst = false ; } return bFound ; @@ -4606,7 +4623,7 @@ SetPtStartForPath( ICurveComposite* pCrvOffs, const PocketParams& PockParams, co } // se punto non trovato precedentemente, tento con una sottocurva OPEN generica if ( ! bMidOut) { - if ( ! GetParamOnOpenCurve( pCrvOffs, PockParams, bMidOut, ptStart, vtMidOut)) + if ( ! GetParamOnOpenCurve( pCrvOffs, PockParams, ptEndPrec, bMidOut, ptStart, vtMidOut)) return false ; } // se queste curve sono troppo corte, analizzo le parti uniformi