EgtGeomKernel :
- In CalcPocketing correzione entrate per utensili grandi su contorni aperti piccoli.
This commit is contained in:
+24
-7
@@ -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<ICurveComposite> 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
|
||||
|
||||
Reference in New Issue
Block a user