EgtMachKernel 2.6d1 :

- se robot sempre spezzatura
- spezzatura movimenti per robot
- in tagli con lama, tolto da Apply preview.
This commit is contained in:
Dario Sassi
2024-04-02 15:37:22 +02:00
parent 4e3079e504
commit f8d2f26692
23 changed files with 473 additions and 255 deletions
+57 -26
View File
@@ -1242,7 +1242,7 @@ Operation::ApproxWithArcsIfUseful( ICurveComposite* pCompo, bool bCareTempProp)
//----------------------------------------------------------------------------
bool
Operation::ApproxWithLines( ICurveComposite* pCompo, double dMaxLen) const
Operation::ApproxWithLines( ICurveComposite* pCompo, bool bFeed) const
{
// recupero estrusione e spessore
Vector3d vtExtr = Z_AX ;
@@ -1251,10 +1251,12 @@ Operation::ApproxWithLines( ICurveComposite* pCompo, double dMaxLen) const
pCompo->GetThickness( dThick) ;
// calcolo approssimazione lineare
PolyLine PL ;
if ( ! pCompo->ApproxWithLines( 50 * EPS_SMALL, ANG_TOL_MAX_DEG, ICurve::APL_SPECIAL, PL))
double dLinTol = GetApproxLinTol() ;
if ( ! pCompo->ApproxWithLines( dLinTol, ANG_TOL_MID_DEG, ICurve::APL_SPECIAL, PL))
return false ;
// se prevista massima lunghezza
if ( dMaxLen > 100 * EPS_SMALL)
double dMaxLen = GetMaxSplitLen( true, bFeed) ;
if ( dMaxLen > 99 * EPS_SMALL)
PL.AdjustForMaxSegmentLen( dMaxLen) ;
// sostituisco le linee alle curve originali
pCompo->Clear() ;
@@ -2281,21 +2283,45 @@ Operation::CalculateClPathRobotAxesValues( int nClPathId, int nLinAxes, int nRot
pCamData->SetAxes( CamData::AS_ERR, vAxVal) ;
return false ;
}
// se inizio, scelgo la prima soluzione
// se inizio
if ( bFirst) {
vAxVal = vAng1 ;
// porto gli angoli ai valori più vicini ai precedenti con offset di uno o più giri
for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) {
m_pMchMgr->GetNearestAngleInStroke( i, vAxRotPrec[i], vAng1[i]) ;
if ( abs( vAng1[i] - vAxRotPrec[i]) > dAngDeltaMinForHome)
m_pMchMgr->GetNearestAngleInStroke( i, vAxRotHome[i], vAng1[i]) ;
}
for ( int i = 0 ; i < int( vAng2.size()) ; ++ i) {
m_pMchMgr->GetNearestAngleInStroke( i, vAxRotPrec[i], vAng2[i]) ;
if ( abs( vAng2[i] - vAxRotPrec[i]) > dAngDeltaMinForHome)
m_pMchMgr->GetNearestAngleInStroke( i, vAxRotHome[i], vAng2[i]) ;
}
bFirst = false ;
}
// altrimenti, scelgo la soluzione più vicina
// altrimenti movimenti successivi
else {
// minimizzo rotazione polso
if ( abs( vAng1[3] - vAxRotPrec[3]) < abs( vAng2[3] - vAxRotPrec[3]) + 10 * EPS_ANG_SMALL)
vAxVal = vAng1 ;
else
vAxVal = vAng2 ;
// controllo continuità di R6 dalla posizione precedente
m_pMchMgr->GetNearestAngleInStroke( 5, vAxRotPrec[5], vAxVal[5]) ;
// porto gli angoli ai valori più vicini ai precedenti con offset di uno o più giri
for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) {
if ( bRotContOnNext)
vAng1[i] = AngleNearAngle( vAng1[i], vAxRotPrec[i]) ;
else
m_pMchMgr->GetNearestAngleInStroke( i, vAxRotPrec[i], vAng1[i]) ;
}
for ( int i = 0 ; i < int( vAng2.size()) ; ++ i) {
if ( bRotContOnNext)
vAng2[i] = AngleNearAngle( vAng2[i], vAxRotPrec[i]) ;
else
m_pMchMgr->GetNearestAngleInStroke( i, vAxRotPrec[i], vAng2[i]) ;
}
}
// Scelgo la soluzione più vicina
// minimizzo rotazione polso
if ( vAng2.empty() || abs( vAng1[3] - vAxRotPrec[3]) < abs( vAng2[3] - vAxRotPrec[3]) + 10 * EPS_ANG_SMALL)
vAxVal = vAng1 ;
else
vAxVal = vAng2 ;
// controllo continuità di R6 dalla posizione precedente
m_pMchMgr->GetNearestAngleInStroke( 5, vAxRotPrec[5], vAxVal[5]) ;
// verifico di essere nelle corse degli assi
int nStat ;
bool bOsOk = m_pMchMgr->VerifyOutstroke( 0, 0, 0, vAxVal, false, nStat) ;
@@ -3435,18 +3461,23 @@ Operation::CalcRobotAxesAbovePos( const Point3d& ptP, const Vector3d& vtT, const
if ( vAx.size() < 6) {
vAx = vAng1 ;
}
// altrimenti, scelgo la soluzione più vicina
else {
// salvo precedente R6
double dPrevR6 = vAx[5] ;
// minimizzo rotazione polso
if ( abs( vAng1[3] - vAx[3]) < abs( vAng2[3] - vAx[3]) + 10 * EPS_ANG_SMALL)
vAx = vAng1 ;
else
vAx = vAng2 ;
// controllo continuità di R6 dalla posizione precedente
m_pMchMgr->GetNearestAngleInStroke( 5, dPrevR6, vAx[5]) ;
}
// altrimenti, scelgo la soluzione più vicina
else {
// porto gli angoli ai valori più vicini ai precedenti con offset di uno o più giri
for ( int i = 0 ; i < int( vAng1.size()) ; ++ i)
m_pMchMgr->GetNearestAngleInStroke( i, vAx[i], vAng1[i]) ;
for ( int i = 0 ; i < int( vAng2.size()) ; ++ i)
m_pMchMgr->GetNearestAngleInStroke( i, vAx[i], vAng2[i]) ;
// salvo precedente R6
double dPrevR6 = vAx[5] ;
// minimizzo rotazione polso
if ( vAng2.empty() || abs( vAng1[3] - vAx[3]) < abs( vAng2[3] - vAx[3]) + 10 * EPS_ANG_SMALL)
vAx = vAng1 ;
else
vAx = vAng2 ;
// controllo continuità di R6 dalla posizione precedente
m_pMchMgr->GetNearestAngleInStroke( 5, dPrevR6, vAx[5]) ;
}
// verifico di essere nelle corse degli assi
int nStat ;
if ( ! m_pMchMgr->VerifyOutstroke( 0, 0, 0, vAx, false, nStat) || nStat != 0)
@@ -3754,7 +3785,7 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
return false ;
// Recupero assi correnti e ne verifico la costanza
STRVECTOR vAxName ;
pMch->GetAllCurrAxesName( vAxName) ;
pMch->GetAllCurrAxesNames( vAxName) ;
if ( vAxName.size() != vAxStart.size() || vAxName.size() != vAxEnd.size())
return false ;
// Porto la macchina in home