From 44eeaabbab3aa6a698da2542e327187f3622f144 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 28 Oct 2019 15:47:14 +0000 Subject: [PATCH] EgtMachKernel 2.1j7 : - in lavorazione Wj gestione inclinazione su bisettrice di angoli interni. --- EgtMachKernel.rc | Bin 11782 -> 11782 bytes WaterJetting.cpp | 116 ++++++++++++++++++++++++++++++++++++----------- WaterJetting.h | 1 + 3 files changed, 90 insertions(+), 27 deletions(-) diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 205fca1dad037313995502e20afbef7f58203c04..96de4e8fbda59203cde578be2269efc7e8ff31b6 100644 GIT binary patch delta 97 zcmZpRX^YwLhmFyE^ItYwW=8YLj>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHRjnXm delta 97 zcmZpRX^YwLhmFx}^ItYwW=6Bgj>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHR2d*z diff --git a/WaterJetting.cpp b/WaterJetting.cpp index 6e22bef..f53713c 100644 --- a/WaterJetting.cpp +++ b/WaterJetting.cpp @@ -1936,9 +1936,8 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo if ( AddLinearMove( ptP) == GDB_ID_NULL) return false ; } - // se altrimenti richiesto rallentamento esterno o interno e angolo dello stesso tipo, eseguo accelerazione - else if ( ( m_Params.m_nExtCornerType == WJET_EC_SLOW && IsExternalAngle( dAng)) || - ( m_Params.m_nIntCornerType == WJET_IC_SLOW && IsInternalAngle( dAng))) { + // se altrimenti richiesto rallentamento esterno e angolo esterno, eseguo accelerazione + else if ( m_Params.m_nExtCornerType == WJET_EC_SLOW && IsExternalAngle( dAng)) { // lunghezza entità double dLen ; pCrvC->GetLength( dLen) ; // lunghezza di accelerazione @@ -1956,6 +1955,31 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo return false ; } } + // se richiesto rallentamento interno e angolo interno, eseguo accelerazione e interpolazione direzione utensile + if ( m_Params.m_nIntCornerType == WJET_IC_SLOW && IsInternalAngle( dAng)) { + // lunghezza entità + double dLen ; pCrvC->GetLength( dLen) ; + // lunghezza di accelerazione + double dAccLen = min( m_Params.m_dCornerSlowLen, dLen / 2 - 0.1) ; + // Feed minima + double dMinFeed = m_Params.m_nCornerSlowPerc / 100. * GetFeed() ; + // Direzioni utensile nell'angolo e finale + Vector3d vtTp = CalcToolDir( pCompo, i) ; + Vector3d vtTn = CalcToolDir( pCompo, i + 0.5) ; + // ciclo sui punti di accelerazione + for ( int j = 1 ; j <= ACC_PNT_NUM ; ++ j) { + double dCoeff = j / double( ACC_PNT_NUM) ; + double dU ; pCrvC->GetParamAtLength( dCoeff * dAccLen, dU) ; + Point3d ptP ; pCrvC->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP) ; + Vector3d vtTool = ( 1 - dCoeff) * vtTp + dCoeff * vtTn ; + vtTool.Normalize() ; + Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ; + SetToolCorrAuxDir( vtTool, vtCorr) ; + SetFeed( ( 1 - dCoeff) * dMinFeed + dCoeff * GetFeed()) ; + if ( AddLinearMove( ptP) == GDB_ID_NULL) + return false ; + } + } } // se non è l'ultima entità, verifico se dopo c'è un angolo interno double dNextFeed = GetFeed() ; @@ -1973,9 +1997,8 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo Vector3d vtStart ; pCrvN->GetStartDir( vtStart) ; // angolo tra le direzioni double dAng ; vtEnd.GetAngleXY( vtStart, dAng) ; - // se altrimenti richiesto rallentamento esterno o interno e angolo dello stesso tipo, aggiungo decelerazione - if ( ( m_Params.m_nExtCornerType == WJET_EC_SLOW && IsExternalAngle( dAng)) || - ( m_Params.m_nIntCornerType == WJET_IC_SLOW && IsInternalAngle( dAng))) { + // se richiesto rallentamento esterno e angolo esterno, aggiungo decelerazione + if ( m_Params.m_nExtCornerType == WJET_EC_SLOW && IsExternalAngle( dAng)) { // lunghezza entità double dLen ; pCrvC->GetLength( dLen) ; // lunghezza di accelerazione @@ -1994,6 +2017,32 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo } dNextFeed = dMinFeed ; } + // se richiesto rallentamento interno e angolo interno, aggiungo decelerazione e interpolazione direzione utensile + if ( m_Params.m_nIntCornerType == WJET_IC_SLOW && IsInternalAngle( dAng)) { + // lunghezza entità + double dLen ; pCrvC->GetLength( dLen) ; + // lunghezza di accelerazione + double dAccLen = min( m_Params.m_dCornerSlowLen, dLen / 2 - 0.1) ; + // Feed minima + double dMinFeed = m_Params.m_nCornerSlowPerc / 100. * GetFeed() ; + // Direzioni utensile iniziale e nell'angolo + Vector3d vtTp = CalcToolDir( pCompo, i + 0.5) ; + Vector3d vtTn = CalcToolDir( pCompo, i + 1) ; + // ciclo sui punti di decelerazione + for ( int j = 0 ; j < ACC_PNT_NUM ; ++ j) { + double dCoeff = j / double( ACC_PNT_NUM) ; + double dU ; pCrvC->GetParamAtLength( dLen - ( 1 - dCoeff) * dAccLen, dU) ; + Point3d ptP ; pCrvC->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP) ; + Vector3d vtTool = ( 1 - dCoeff) * vtTp + dCoeff * vtTn ; + vtTool.Normalize() ; + Vector3d vtCorr = CalcCorrDir( pCompo, i + dU) ; + SetToolCorrAuxDir( vtTool, vtCorr) ; + SetFeed( ( 1 - dCoeff) * GetFeed() + dCoeff * dMinFeed) ; + if ( AddLinearMove( ptP) == GDB_ID_NULL) + return false ; + } + dNextFeed = dMinFeed ; + } } // imposto versore correzione e ausiliario del punto di arrivo CalcAndSetToolCorrAuxDir( pCompo, i + 1) ; @@ -2302,20 +2351,10 @@ WaterJetting::GetPointAboveRaw( const Point3d& ptP) const //---------------------------------------------------------------------------- bool -WaterJetting::CalcAndSetToolCorrAuxDir( const ICurveComposite* pCompo, double dU) +WaterJetting::SetToolCorrAuxDir( const Vector3d& vtTool, const Vector3d& vtCorr) { - // verifico curva - if ( pCompo == nullptr) - return false ; - // se utensile centrato, direzione di correzione nulla - if ( m_Params.m_nWorkSide == WJET_WS_CENTER) - return true ; - // calcolo del versore fresa - Vector3d vtTool = CalcToolDir( pCompo, dU) ; // imposto il versore fresa SetToolDir( vtTool) ; - // calcolo del versore correzione - Vector3d vtCorr = CalcCorrDir( pCompo, dU) ; // imposto versore correzione SetCorrDir( vtCorr) ; // se impostato uso direttamente da lavorazione, imposto anche come versore aux @@ -2330,6 +2369,24 @@ WaterJetting::CalcAndSetToolCorrAuxDir( const ICurveComposite* pCompo, double dU return true ; } +//---------------------------------------------------------------------------- +bool +WaterJetting::CalcAndSetToolCorrAuxDir( const ICurveComposite* pCompo, double dU) +{ + // verifico curva + if ( pCompo == nullptr) + return false ; + // se utensile centrato, direzione di correzione nulla + if ( m_Params.m_nWorkSide == WJET_WS_CENTER) + return true ; + // calcolo del versore fresa + Vector3d vtTool = CalcToolDir( pCompo, dU) ; + // calcolo del versore correzione + Vector3d vtCorr = CalcCorrDir( pCompo, dU) ; + // imposto versori fresa e correzione + return SetToolCorrAuxDir( vtTool, vtCorr) ; +} + //---------------------------------------------------------------------------- Vector3d WaterJetting::CalcToolDir( const ICurveComposite* pCompo, double dU) @@ -2355,18 +2412,18 @@ WaterJetting::CalcToolDir( const ICurveComposite* pCompo, double dU) if ( dU < dUs + EPS_ZERO) { // recupero la tangente dopo Point3d ptP ; - Vector3d vtN ; - pCompo->GetPointTang( dU, ICurve::FROM_PLUS, ptP, vtN) ; - vtTool.Rotate( vtN, dCaRot) ; + Vector3d vtT ; + pCompo->GetPointTang( dU, ICurve::FROM_PLUS, ptP, vtT) ; + vtTool.Rotate( vtT, dCaRot) ; return vtTool ; } // se fine else if ( dU > dUe - EPS_ZERO) { // recupero la tangente prima Point3d ptP ; - Vector3d vtN ; - pCompo->GetPointTang( dU, ICurve::FROM_MINUS, ptP, vtN) ; - vtTool.Rotate( vtN, dCaRot) ; + Vector3d vtT ; + pCompo->GetPointTang( dU, ICurve::FROM_MINUS, ptP, vtT) ; + vtTool.Rotate( vtT, dCaRot) ; return vtTool ; } // altrimenti @@ -2378,8 +2435,7 @@ WaterJetting::CalcToolDir( const ICurveComposite* pCompo, double dU) pCompo->GetPointTang( dU, ICurve::FROM_PLUS, ptP2, vtT2) ; // se coincidono if ( AreSameVectorApprox( vtT1, vtT2)) { - Vector3d vtN = vtT1 ; - vtTool.Rotate( vtN, dCaRot) ; + vtTool.Rotate( vtT1, dCaRot) ; return vtTool ; } // se sono opposte @@ -2388,8 +2444,14 @@ WaterJetting::CalcToolDir( const ICurveComposite* pCompo, double dU) } // altrimenti else { - Vector3d vtN = ( vtT1 + vtT2) / 2 ; - vtTool.Rotate( vtN, dCaRot) ; + Vector3d vtTool1 = Z_AX ; + vtTool1.Rotate( vtT1, dCaRot) ; + Vector3d vtTool2 = Z_AX ; + vtTool2.Rotate( vtT2, dCaRot) ; + vtTool = ( vtTool1 ^ vtT1) ^ ( vtTool2 ^ vtT2) ; + vtTool.Normalize() ; + if ( vtTool * vtTool1 < 0) + vtTool.Invert() ; return vtTool ; } } diff --git a/WaterJetting.h b/WaterJetting.h index 5dc5129..3ec67c8 100644 --- a/WaterJetting.h +++ b/WaterJetting.h @@ -92,6 +92,7 @@ class WaterJetting : public Machining double GetRadiusForStartEndElevation( void) const ; bool GetPointOutOfRaw( const Point3d& ptP, const Vector3d& vtTool, double dElev) const ; bool GetPointAboveRaw( const Point3d& ptP) const ; + bool SetToolCorrAuxDir( const Vector3d& vtTool, const Vector3d& vtCorr) ; bool CalcAndSetToolCorrAuxDir( const ICurveComposite* pCompo, double dU) ; Vector3d CalcToolDir( const ICurveComposite* pCompo, double dU) ; Vector3d CalcCorrDir( const ICurveComposite* pCompo, double dU) ;