EgtMachKernel 2.4b3 :

- altre modifiche a svuotature zigzag ottimizzate.
This commit is contained in:
DarioS
2022-02-15 08:20:11 +01:00
parent ea0ab12521
commit 360d116eab
2 changed files with 30 additions and 20 deletions
BIN
View File
Binary file not shown.
+30 -20
View File
@@ -2611,7 +2611,7 @@ Pocketing::OptimizedZigZag( int nPathId, Frame3d& frPocket, bool& bOptimizedZigZ
bool
Pocketing::ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClosedId, bool& bOptimizedZigZag)
{
// verifico sia una linea
// verifico che il lato chiuso sia una linea
PtrOwner<ICurveLine> pCrv( CloneCurveLine( pCrvPocket->GetCurve( nClosedId))) ;
if ( IsNull( pCrv))
return true ;
@@ -2621,7 +2621,7 @@ Pocketing::ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClose
pCrvPocket->GetExtrusion( vtExtr) ;
pCrv->SetExtrusion( vtExtr) ;
pCrv->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv->ExtendStartByLen( 100) ;
pCrv->ExtendEndByLen( 100) ;
@@ -2637,10 +2637,9 @@ Pocketing::ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClose
bool
Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag, bool& bOpposite)
{
// recupero le due curve chiuse
// verifico che i lati chiusi siano linee
PtrOwner<ICurveLine> pCrv1( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[0]))) ;
PtrOwner<ICurveLine> pCrv2( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[1]))) ;
// verifico siano linee
if ( IsNull( pCrv1) || IsNull( pCrv2))
return true ;
// verifico abbiano direzioni opposte
@@ -2677,19 +2676,17 @@ Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INT
// taglio per ultima la curva più lunga
if ( dLen1 > dLen2) {
PtrOwner<ICurveLine> pTmp( Release( pCrv1)) ;
pCrv1.Set( Release( pCrv2)) ;
pCrv2.Set( Release( pTmp)) ;
swap( pCrv1, pCrv2) ;
}
pCrv1->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv1->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv1->ExtendStartByLen( 100) ;
pCrv1->ExtendEndByLen( 100) ;
if ( ! CutCurveWithLine( pCrvPocket, pCrv1))
return false ;
// sarà la prima curva del percorso
pCrv2->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv2->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv2->ExtendStartByLen( 100) ;
pCrv2->ExtendEndByLen( 100) ;
if ( ! CutCurveWithLine( pCrvPocket, pCrv2))
@@ -2703,14 +2700,15 @@ Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INT
bool
Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag)
{
// recupero le tre curve chiuse
// verifico che i lati chiusi siano linee
PtrOwner<ICurveLine> pCrv1( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[0]))) ;
PtrOwner<ICurveLine> pCrv2( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[1]))) ;
PtrOwner<ICurveLine> pCrv3( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[2]))) ;
// verifico siano linee
if ( IsNull( pCrv1) || IsNull( pCrv2) || IsNull( pCrv3))
return true ;
// verifico siano consecutive
// verifico siano consecutivi
Point3d ptStart1 ;
pCrv1->GetStartPoint( ptStart1) ;
Point3d ptEnd1 ;
pCrv1->GetEndPoint( ptEnd1) ;
Point3d ptStart2 ;
@@ -2719,14 +2717,26 @@ Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const I
pCrv2->GetEndPoint( ptEnd2) ;
Point3d ptStart3 ;
pCrv3->GetStartPoint( ptStart3) ;
if ( ! AreSamePointApprox( ptEnd1, ptStart2) || ! AreSamePointApprox( ptEnd2, ptStart3))
Point3d ptEnd3 ;
pCrv3->GetEndPoint( ptEnd3) ;
if ( AreSamePointApprox( ptEnd1, ptStart2) && AreSamePointApprox( ptEnd2, ptStart3))
;
else if ( AreSamePointApprox( ptEnd2, ptStart3) && AreSamePointApprox( ptEnd3, ptStart1)) {
swap( pCrv1, pCrv2) ;
swap( pCrv2, pCrv3) ;
}
else if ( AreSamePointApprox( ptEnd3, ptStart1) && AreSamePointApprox( ptEnd1, ptStart2)) {
swap( pCrv1, pCrv3) ;
swap( pCrv3, pCrv2) ;
}
else
return true ;
// verifico che primo e terzo non siano troppo lunghe
// verifico che primo e terzo non siano troppo lunghi
double dLen1 ;
pCrv1->GetLength( dLen1) ;
double dLen2 ;
pCrv2->GetLength( dLen2) ;
if ( dLen1 > 1.5 * m_TParams.m_dDiam || dLen2 > 1.5 * m_TParams.m_dDiam)
double dLen3 ;
pCrv3->GetLength( dLen3) ;
if ( dLen1 > 1.5 * m_TParams.m_dDiam || dLen3 > 1.5 * m_TParams.m_dDiam)
return true ;
// setto il vettore estrusione per eseguire correttamente offset
@@ -2736,20 +2746,20 @@ Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const I
pCrv2->SetExtrusion( vtExtr) ;
pCrv3->SetExtrusion( vtExtr) ;
pCrv1->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv1->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv1->ExtendStartByLen( 100) ;
pCrv1->ExtendEndByLen( 100) ;
if ( ! CutCurveWithLine( pCrvPocket, pCrv1))
return false ;
pCrv3->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv3->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv3->ExtendStartByLen( 100) ;
pCrv3->ExtendEndByLen( 100) ;
if ( ! CutCurveWithLine( pCrvPocket, pCrv3))
return false ;
// sarà la prima curva del percorso
pCrv2->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv2->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ;
pCrv2->ExtendStartByLen( 100) ;
pCrv2->ExtendEndByLen( 100) ;
if ( ! CutCurveWithLine( pCrvPocket, pCrv2))