EgtMachKernel 1.6v1 :

- in fresatura non si allungano estremi di percorsi chiusi (c'è già overlap)
- migliorata preview di fresatura (angoli interni ora con raggio fresa)
- migliorata gestione verifica collisioni sui collegamenti
- corretto utilizzo peso delta primo asse rotante per scelta soluzione più vicina a precedente.
This commit is contained in:
Dario Sassi
2016-10-06 10:29:57 +00:00
parent d7234d57d1
commit af60c946b7
3 changed files with 78 additions and 63 deletions
+75 -60
View File
@@ -24,6 +24,7 @@
#include "/EgtDev/Include/EgkIntersCurves.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
#include "/EgtDev/Include/EGkGeomDB.h"
#include "/EgtDev/Include/EGkCDBoxPolyhedron.h"
#include "/EgtDev/Include/EXeConst.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
@@ -666,12 +667,12 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
// scelgo la soluzione più vicina ai precedenti
double dDelta1 = 0 ;
double dDelta2 = 0 ;
bool bFirst = true ;
for ( size_t i = 0 ; i < vAng1.size() ; ++ i) {
// ignoro gli assi bloccati
if ( m_pMchMgr->IsKinematicRotAxisBlocked( int( i)))
continue ;
// calcolo i delta asse con eventuale peso
bool bFirst = ( i == 0) ;
dDelta1 += fabs( vAng1[i] - vAxRotPrec[i]) * ( bFirst ? dRot1W : 1) ;
dDelta2 += fabs( vAng2[i] - vAxRotPrec[i]) * ( bFirst ? dRot1W : 1) ;
}
@@ -980,65 +981,73 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
pCamData->SetFlag( 2) ;
}
// verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
else if ( ! TestCollisionAvoid( vAxPrev, vAxCurr)) {
// recupero HomeZ
Machine* pMch = m_pMchMgr->GetCurrMachine() ;
double dHomeZ ;
if ( pMch == nullptr || ! pMch->GetCurrAxisHomePos( 2, dHomeZ))
return false ;
// risalita sopra fine percorso precedente
// copio l'entità
int nNew1Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ;
CamData* pNew1CamData = GetCamData( m_pGeomDB->GetUserObj( nNew1Id)) ;
if ( pNew1CamData == nullptr)
return false ;
// modifico questa entità
DBLVECTOR vAxNew1 = vAxPrev ;
vAxNew1[2] = dHomeZ ;
pNew1CamData->SetAxes( CamData::AS_OK, vAxNew1) ;
pNew1CamData->ChangeAxesMask( CamData::MSK_L3) ;
pNew1CamData->SetFlag( 0) ;
// spostamento sopra inizio percorso corrente
// copio l'entità
int nNew2Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ;
CamData* pNew2CamData = GetCamData( m_pGeomDB->GetUserObj( nNew2Id)) ;
if ( pNew2CamData == nullptr)
return false ;
// modifico quella originale (è la prima del percorso)
DBLVECTOR vAxNew2 = vAxCurr ;
vAxNew2[2] = dHomeZ ;
pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ;
pNew2CamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ;
pNew2CamData->SetFlag( 2) ;
}
// altrimenti
else {
// se Z pressochè uguali non devo fare alcunché
if ( fabs( vAxCurr[2] - vAxPrev[2]) < 10 * EPS_SMALL)
return true ;
// se Z corrente maggiore della precedente
else if ( vAxCurr[2] > vAxPrev[2]) {
// copio l'entità
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
// determino la Z più alta tra le due posizioni
double dZtop = max( vAxPrev[2], vAxCurr[2]) ;
// per il test uso posizioni temporanee con questa Z
DBLVECTOR vAxPrevZtop = vAxPrev ; vAxPrevZtop[2] = dZtop ;
DBLVECTOR vAxCurrZtop = vAxCurr ; vAxCurrZtop[2] = dZtop ;
// se interferisce
if ( ! TestCollisionAvoid( vAxPrevZtop, vAxCurrZtop)) {
// recupero HomeZ
Machine* pMch = m_pMchMgr->GetCurrMachine() ;
double dHomeZ ;
if ( pMch == nullptr || ! pMch->GetCurrAxisHomePos( 2, dHomeZ))
return false ;
// modifico quella originale (è la prima del percorso)
DBLVECTOR vAxNew = vAxPrev ;
vAxNew[2] = vAxCurr[2] ;
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
pCamData->ChangeAxesMask( CamData::MSK_L3) ;
pCamData->SetFlag( 0) ;
// risalita sopra fine percorso precedente
// copio l'entità
int nNew1Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ;
CamData* pNew1CamData = GetCamData( m_pGeomDB->GetUserObj( nNew1Id)) ;
if ( pNew1CamData == nullptr)
return false ;
// modifico questa entità
DBLVECTOR vAxNew1 = vAxPrev ;
vAxNew1[2] = dHomeZ ;
pNew1CamData->SetAxes( CamData::AS_OK, vAxNew1) ;
pNew1CamData->ChangeAxesMask( CamData::MSK_L3) ;
pNew1CamData->SetFlag( 0) ;
// spostamento sopra inizio percorso corrente
// copio l'entità
int nNew2Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ;
CamData* pNew2CamData = GetCamData( m_pGeomDB->GetUserObj( nNew2Id)) ;
if ( pNew2CamData == nullptr)
return false ;
// modifico quella originale (è la prima del percorso)
DBLVECTOR vAxNew2 = vAxCurr ;
vAxNew2[2] = dHomeZ ;
pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ;
pNew2CamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ;
pNew2CamData->SetFlag( 2) ;
}
// altrimenti Z corrente minore della precedente
// altrimenti
else {
// copio l'entità
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
return false ;
// modifico quella originale (è la prima del percorso)
DBLVECTOR vAxNew = vAxCurr ;
vAxNew[2] = vAxPrev[2] ;
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ;
pCamData->SetFlag( 2) ;
// se Z pressochè uguali non devo fare alcunché
if ( fabs( vAxCurr[2] - vAxPrev[2]) < 10 * EPS_SMALL)
return true ;
// se Z corrente maggiore della precedente
else if ( vAxCurr[2] > vAxPrev[2]) {
// copio l'entità
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
return false ;
// modifico quella originale (è la prima del percorso)
DBLVECTOR vAxNew = vAxPrev ;
vAxNew[2] = vAxCurr[2] ;
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
pCamData->ChangeAxesMask( CamData::MSK_L3) ;
pCamData->SetFlag( 0) ;
}
// altrimenti Z corrente minore della precedente
else {
// copio l'entità
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
return false ;
// modifico quella originale (è la prima del percorso)
DBLVECTOR vAxNew = vAxCurr ;
vAxNew[2] = vAxPrev[2] ;
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ;
pCamData->SetFlag( 2) ;
}
}
}
@@ -1340,7 +1349,16 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Head.Overlaps( b3Raw)) {
bCollide = true ;
// box testa nel riferimento del solido
Frame3d frSolid ;
m_pGeomDB->GetGlobFrame( nRawSolidId, frSolid) ;
BBox3d b3Hsol ;
m_pGeomDB->GetRefBBox( pMch->GetCurrHead(), frSolid, b3Hsol) ;
// solido
const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nRawSolidId)) ;
// verifica di collisione tra box e solido
if ( pStm == nullptr || CDBoxPolyhedron( b3Hsol, *pStm))
bCollide = true ;
break ;
}
}
@@ -1352,9 +1370,6 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
break ;
}
}
//int nRes = 1 ;
//while ( nRes != 0)
// nRes = ExeProcessEvents( 0, 5) ;
}
// Riporto la macchina in home
pMch->ResetAllAxesPos() ;