EgtMachKernel :
- in WaterJet correzioni per gestire tratti piccoli.
This commit is contained in:
+60
-36
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user