EgtMachKernel 2.6d1 :
- se robot sempre spezzatura - spezzatura movimenti per robot - in tagli con lama, tolto da Apply preview.
This commit is contained in:
+57
-26
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user