EgtMachKernel 2.1j7 :

- in lavorazione Wj gestione inclinazione su bisettrice di angoli interni.
This commit is contained in:
Dario Sassi
2019-10-28 15:47:14 +00:00
parent 6c585ddb56
commit 44eeaabbab
3 changed files with 90 additions and 27 deletions
BIN
View File
Binary file not shown.
+89 -27
View File
@@ -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 ;
}
}
+1
View File
@@ -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) ;