EgtMachKernel 2.1j7 :
- in lavorazione Wj gestione inclinazione su bisettrice di angoli interni.
This commit is contained in:
Binary file not shown.
+89
-27
@@ -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 ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) ;
|
||||
|
||||
Reference in New Issue
Block a user