EgtMachKernel :
- correzioni per svuotatura a spirale ottimizzata.
This commit is contained in:
+51
-8
@@ -4175,7 +4175,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Vector3d& vtD
|
||||
|
||||
// calcolo percorso di svuotatura
|
||||
// se lati obliqui sono entrambi chiusi e dimensione svuotatura è minore di 2 * diamentro fresa gestione speciale
|
||||
if ( vnProp[0] != 0 && vnProp[3] == 0 && vnProp[1] == 0 && max( dLen0, dLen2) < 2 * m_TParams.m_dDiam + EPS_SMALL) {
|
||||
if ( vnProp[0] != 0 && vnProp[2] != 0 && vnProp[3] == 0 && vnProp[1] == 0 && max( dLen0, dLen2) < 2 * m_TParams.m_dDiam + EPS_SMALL) {
|
||||
if ( ! SpecialAdjustTrapezoidSpiralForAngles( pMCrv, pCrvPocket)) {
|
||||
pMCrv->Clear() ;
|
||||
return false ;
|
||||
@@ -4498,22 +4498,65 @@ Pocketing::SpecialAdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const
|
||||
// calcolo gli offset dei lati obliqui
|
||||
PtrOwner<ICurveLine> pLineS( GetCurveLine( pCrvPocket->GetCurve( 3)->Clone())) ;
|
||||
pLineS->SimpleOffset( - 0.5 * m_TParams.m_dDiam - GetOffsR()) ;
|
||||
pLineS->Invert() ;
|
||||
PtrOwner<ICurveLine> pLineE( GetCurveLine( pCrvPocket->GetCurve( 1)->Clone())) ;
|
||||
pLineE->SimpleOffset( - 0.5 * m_TParams.m_dDiam - GetOffsR()) ;
|
||||
|
||||
pLineE->Invert() ;
|
||||
|
||||
Point3d ptS, ptE ;
|
||||
pLineS->GetEndPoint( ptS) ;
|
||||
pLineE->GetStartPoint( ptE) ;
|
||||
Vector3d vtS, vtE ;
|
||||
pLineS->GetStartDir( vtS) ;
|
||||
pLineE->GetStartDir( vtE) ;
|
||||
|
||||
PtrOwner<ICurveLine> pLineLink( CreateCurveLine()) ;
|
||||
pLineLink->Set( ptS, ptE) ;
|
||||
|
||||
pMCrv->Clear() ;
|
||||
if ( ! pMCrv->AddCurve( Release( pLineS)))
|
||||
return false ;
|
||||
Point3d ptP ;
|
||||
pLineE->GetStartPoint( ptP) ;
|
||||
if ( ! pMCrv->AddLine( ptP))
|
||||
return false ;
|
||||
|
||||
// creo raccordi
|
||||
bool bUseBiArcs = false ;
|
||||
Vector3d vtDir, vtDir2 ;
|
||||
pLineLink->GetStartDir( vtDir) ;
|
||||
pCrvPocket->GetStartDir( vtDir2) ;
|
||||
|
||||
if ( Dist( ptS, ptE) > 500 * EPS_SMALL && AreSameOrOppositeVectorApprox( vtDir, vtDir2)) {
|
||||
|
||||
Point3d ptCrv1, ptCrv2 ;
|
||||
pLineLink->GetPointD1D2( 0.3, ICurve::FROM_MINUS, ptCrv1) ;
|
||||
pLineLink->GetPointD1D2( 0.7, ICurve::FROM_MINUS, ptCrv2) ;
|
||||
|
||||
// primo raccordo
|
||||
double dAng ;
|
||||
vtS.GetAngleXY( X_AX, dAng) ;
|
||||
PtrOwner<ICurve> pBiArc1( GetBiArc( ptS, - dAng, ptCrv1, 0, 0.5)) ;
|
||||
|
||||
// secondo raccordo
|
||||
vtE.GetAngleXY( X_AX, dAng) ;
|
||||
PtrOwner<ICurve> pBiArc2( GetBiArc( ptE, dAng, ptCrv2, 180, 0.5)) ;
|
||||
pBiArc2->Invert() ;
|
||||
|
||||
if ( ! IsNull( pBiArc1) && ! IsNull( pBiArc2)) {
|
||||
bUseBiArcs = true ;
|
||||
pMCrv->AddCurve( Release( pBiArc1)) ;
|
||||
pMCrv->AddLine( ptCrv2) ;
|
||||
pMCrv->AddCurve( Release( pBiArc2)) ;
|
||||
}
|
||||
}
|
||||
|
||||
// se non è stato possibile creare raccordo, unisco linearmente
|
||||
if ( ! bUseBiArcs)
|
||||
pMCrv->AddCurve( Release( pLineLink)) ;
|
||||
|
||||
if ( ! pMCrv->AddCurve( Release( pLineE)))
|
||||
return false ;
|
||||
|
||||
|
||||
// setto temp prop per ricordare curve aggiuntive per pulire angoli
|
||||
pMCrv->SetCurveTempProp( 0, 1) ;
|
||||
pMCrv->SetCurveTempProp( 2, 1) ;
|
||||
pMCrv->SetCurveTempProp( pMCrv->GetCurveCount() - 1, 1) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user