EgtMachKernel :

- in WaterJet correzioni per gestire tratti piccoli.
This commit is contained in:
SaraP
2025-10-03 16:17:22 +02:00
parent bd1e7e04ee
commit da8ba3a23f
+60 -36
View File
@@ -2230,7 +2230,7 @@ WaterJetting::AdjustPathForInternalAngles( ICurveComposite* pCompo)
double dExtraLen = dSlowLen + INTANG_ROT_LEN - dLen ;
if ( dExtraLen > 0) {
// se entità successiva è in tangenza e abbastanza lunga, allungo la corrente a scapito della successiva
if ( ! bNextIntAng && dNextLen > dExtraLen) {
if ( abs( dNextAng) < EPS_ANG_SMALL && dNextLen > dExtraLen) {
double dU ; Point3d ptP ;
if ( pCrvN->GetParamAtLength( dExtraLen, dU) &&
pCrvN->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP))
@@ -2247,7 +2247,7 @@ WaterJetting::AdjustPathForInternalAngles( ICurveComposite* pCompo)
double dExtraLen = dSlowLen + INTANG_ROT_LEN - dLen ;
if ( dExtraLen > 0) {
// se entità precedente è in tangenza e abbastanza lunga, allungo la corrente a scapito della precedente
if ( ! bPrevIntAng && dPrevLen > dExtraLen) {
if ( abs( dPrevAng) < EPS_ANG_SMALL && dPrevLen > dExtraLen) {
double dU ; Point3d ptP ;
if ( pCrvP->GetParamAtLength( dPrevLen - dExtraLen, dU) &&
pCrvP->GetPointD1D2( dU, ICurve::FROM_MINUS, ptP))
@@ -2266,6 +2266,8 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
{
// numero punti di accelerazione/decelerazione
const int ACC_PNT_NUM = 7 ;
// lunghezza minima per poter suddividere con punti di accelerazione/decelerazione
const double MIN_ACC_LEN = 1.0 ;
// valori limite per gestione degli angoli
const double LEN_TOL = 100 * EPS_SMALL ;
@@ -2355,31 +2357,42 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
return false ;
// anello
bool bLoopOk = true ;
PtrOwner<ICurve> pCrvA( GetArc2PVN( ptPe, ptPs, vtEnd, vtN)) ;
if ( ! IsNull( pCrvA) && pCrvA->GetType() == CRV_ARC) {
// suddivido l'anello in due parti per forzare il passaggio dalla posizione vtTool = Z_AX
PtrOwner<ICurveComposite> pCompoArc( ConvertCurveToComposite( Release( ( pCrvA)))) ;
if ( IsNull( pCompoArc))
return false ;
if ( pCompoArc->AddJoint( 0.5)) {
// aggiungo il primo tratto
Vector3d vtCorr = CalcCorrDir( pCompoArc, 1) ;
SetToolCorrAuxDir( Z_AX, vtCorr) ;
if ( AddCurveMove( pCompoArc->GetCurve(0), bSplitArcs) == GDB_ID_NULL)
// verifico che l'anello non interferisca con la curva di lavoro
IntersCurveCurve intAC( *pCrvA, *pCompo) ;
if ( intAC.GetIntersCount() == 0) {
// suddivido l'anello in due parti per forzare il passaggio dalla posizione vtTool = Z_AX
PtrOwner<ICurveComposite> pCompoArc( ConvertCurveToComposite( Release( ( pCrvA)))) ;
if ( IsNull( pCompoArc))
return false ;
// aggiungo secondo tratto
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
if ( AddCurveMove( pCompoArc->GetCurve(1), bSplitArcs) == GDB_ID_NULL)
return false ;
if ( pCompoArc->AddJoint( 0.5)) {
// aggiungo il primo tratto
Vector3d vtCorr = CalcCorrDir( pCompoArc, 1) ;
SetToolCorrAuxDir( Z_AX, vtCorr) ;
if ( AddCurveMove( pCompoArc->GetCurve(0), bSplitArcs) == GDB_ID_NULL)
return false ;
// aggiungo secondo tratto
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
if ( AddCurveMove( pCompoArc->GetCurve(1), bSplitArcs) == GDB_ID_NULL)
return false ;
}
else {
// se non è possibile suddividere anello
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
if ( AddCurveMove( pCompoArc, bSplitArcs) == GDB_ID_NULL)
return false ;
}
}
else {
// se non è possibile suddividere anello
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
if ( AddCurveMove( pCompoArc, bSplitArcs) == GDB_ID_NULL)
return false ;
}
else
bLoopOk = false ;
}
else {
else
bLoopOk = false ;
// se anello non possibile
if ( ! bLoopOk) {
CalcAndSetToolCorrAuxDir( pCompo, i + 0.5) ;
if ( AddLinearMove( ptPs, bSplitArcs) == GDB_ID_NULL)
return false ;
@@ -2398,8 +2411,9 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
// Feed ridotta
double dMinFeed = GetActualReducedFeed() ;
// ciclo sui punti di accelerazione
for ( int j = 1 ; j <= ACC_PNT_NUM ; ++ j) {
double dCoeff = j / double( ACC_PNT_NUM) ;
int nAccPntNum = dAccLen > MIN_ACC_LEN - EPS_SMALL ? ACC_PNT_NUM : 1 ;
for ( int j = 1 ; j <= nAccPntNum ; ++ j) {
double dCoeff = j / double( nAccPntNum) ;
double dU = dUprev ; pCrvC->GetParamAtLength( dCoeff * dAccLen, dU) ;
if ( abs( dU - dUprev) < EPS_SMALL)
continue ;
@@ -2443,15 +2457,19 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
}
}
if ( ! bSlowFull) {
dAccLen = min( dFreeLen / 2 - EXTRA_ACC_LEN, ( bReduceFeed ? m_Params.m_dCornerSlowLen : INTANG_ROT_LEN)) ;
double dMinLen = dFreeLen / 2 - EXTRA_ACC_LEN ;
if ( dMinLen < EPS_SMALL && abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL)
dMinLen = dFreeLen / 2 ;
dAccLen = min( dMinLen, ( bReduceFeed ? m_Params.m_dCornerSlowLen : INTANG_ROT_LEN)) ;
if ( m_Params.m_dSideAngle > 0) {
// verifico sia rispettata la lunghezza minima per non rovinare l'angolo
double dW = m_dElev * sin( m_Params.m_dSideAngle * DEGTORAD) ;
double dSlowLen = dW / tan( ( 180 - abs( dAng)) / 2 * DEGTORAD) ;
if ( dSlowLen > dFreeLen - EXTRA_ACC_LEN) {
if ( dSlowLen > dFreeLen + EPS_SMALL) {
m_pMchMgr->SetLastError( 3204, "Error in WaterJetting : entity too small near inside corner") ;
return false ;
}
dAccLen = min( dSlowLen + m_Params.m_dCornerSlowLen, dFreeLen - EXTRA_ACC_LEN) ;
dAccLen = max( dAccLen, dSlowLen) ;
}
}
@@ -2462,9 +2480,10 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
double dUend ; pCrvC->GetParamAtLength( dAccLen, dUend) ;
Vector3d vtTp = CalcToolDir( pCompo, i + dUsta) ;
Vector3d vtTn = CalcToolDir( pCompo, i + dUend) ;
int nAccPntNum = dAccLen > MIN_ACC_LEN - EPS_SMALL ? ACC_PNT_NUM : 1 ;
// ciclo sui punti di accelerazione
for ( int j = 1 ; j <= ACC_PNT_NUM ; ++ j) {
double dCoeff = j / double( ACC_PNT_NUM) ;
for ( int j = 1 ; j <= nAccPntNum ; ++ j) {
double dCoeff = j / double( nAccPntNum) ;
double dU = dUprev ; pCrvC->GetParamAtLength( dCoeff * dAccLen, dU) ;
if ( abs( dUprev - dU) < EPS_SMALL)
continue ;
@@ -2510,8 +2529,9 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
// Feed ridotta
double dMinFeed = GetActualReducedFeed() ;
// ciclo sui punti di decelerazione
for ( int j = 0 ; j < ACC_PNT_NUM ; ++ j) {
double dCoeff = j / double( ACC_PNT_NUM) ;
int nAccPntNum = dAccLen > MIN_ACC_LEN - EPS_SMALL ? ACC_PNT_NUM : 1 ;
for ( int j = 0 ; j < nAccPntNum ; ++ j) {
double dCoeff = j / double( nAccPntNum) ;
double dU = dUprev ; pCrvC->GetParamAtLength( dLen - ( 1 - dCoeff) * dAccLen, dU) ;
if ( abs( dUprev - dU) < EPS_SMALL)
continue ;
@@ -2569,15 +2589,18 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
// sfrutto tutta la lunghezza a disposizone
dAccLen = dFreeLen ;
else {
dAccLen = min( dFreeLen - EXTRA_ACC_LEN, ( bReduceFeed ? m_Params.m_dCornerSlowLen : INTANG_ROT_LEN)) ;
double dMinLen = dFreeLen - EXTRA_ACC_LEN ;
if ( dMinLen < EPS_SMALL && abs( m_Params.m_dSideAngle) > EPS_ANG_SMALL)
dMinLen = dFreeLen ;
dAccLen = min( dMinLen, ( bReduceFeed ? m_Params.m_dCornerSlowLen : INTANG_ROT_LEN)) ;
if ( m_Params.m_dSideAngle > 0) {
double dW = m_dElev * sin( m_Params.m_dSideAngle * DEGTORAD) ;
double dSlowLen = dW / tan( ( 180 - abs( dAng)) / 2 * DEGTORAD) ;
if ( dSlowLen > dFreeLen - EXTRA_ACC_LEN) {
if ( dSlowLen > dFreeLen + EPS_SMALL) {
m_pMchMgr->SetLastError( 3204, "Error in WaterJetting : entity too small near inside corner") ;
return false ;
}
dAccLen = min( dSlowLen + m_Params.m_dCornerSlowLen, dFreeLen - EXTRA_ACC_LEN) ;
dAccLen = max( dAccLen, dSlowLen) ;
}
}
@@ -2588,9 +2611,10 @@ WaterJetting::AddStandardWj( const ICurveComposite* pCompo, const Vector3d& vtTo
double dUend = 1 ;
Vector3d vtTp = CalcToolDir( pCompo, i + dUsta) ;
Vector3d vtTn = CalcToolDir( pCompo, i + dUend) ;
int nAccPntNum = dAccLen > MIN_ACC_LEN - EPS_SMALL ? ACC_PNT_NUM : 1 ;
// ciclo sui punti di decelerazione
for ( int j = 0 ; j < ACC_PNT_NUM ; ++ j) {
double dCoeff = j / double( ACC_PNT_NUM) ;
for ( int j = 0 ; j < nAccPntNum ; ++ j) {
double dCoeff = j / double( nAccPntNum) ;
double dU = dUprev ; pCrvC->GetParamAtLength( dLen - ( 1 - dCoeff) * dAccLen, dU) ;
if ( abs( dUprev - dU) < EPS_SMALL)
continue ;