EgtMachKernel :

- si conservano le info delle uscite delle teste al caricamento della macchina
- al caricamento di un utensile su una uscita di una testa si caricano anche tutti gli utensili previsti dall'attrezzaggio sulle altre uscite della stessa testa
- aggiunta gestione attacchi a elica e zigzag nelle contornature
- migliorato controllo collisioni e gestione risalite conseguenti.
This commit is contained in:
Dario Sassi
2017-04-04 07:39:43 +00:00
parent d10c193039
commit 493ff4b9e4
10 changed files with 336 additions and 264 deletions
+91 -39
View File
@@ -690,7 +690,7 @@ Operation::CalculateAxesValues( const string& sHint)
}
// altrimenti uso gli angoli home
else {
m_pMchMgr->GetAllCalcAxesHomePos( vAxVal) ;
m_pMchMgr->GetAllCurrAxesHomePos( vAxVal) ;
for ( int i = 0 ; i < nRotAxes ; ++ i)
vAxRotPrec[i] = vAxVal[nLinAxes + i] ;
}
@@ -1095,7 +1095,7 @@ Operation::AdjustStartEndMovements( void)
if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()))
return false ;
// recupero posizione home
if ( ! m_pMchMgr->GetAllCalcAxesHomePos( vAxVal))
if ( ! m_pMchMgr->GetAllCurrAxesHomePos( vAxVal))
return false ;
// si parte da Z massima
bMaxZ = true ;
@@ -1130,13 +1130,31 @@ Operation::AdjustStartEndMovements( void)
}
// verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
if ( ! TestCollisionAvoid( vAxVal, vAxIni)) {
// cancello eventuale risalita parziale della lavorazione precedente
pPrevOp->RemoveRise() ;
// aggiungo risalita a Zmax
if ( ! pPrevOp->AddRise( vAxVal))
// riprovo con risalita parziale
double dHomeZ ;
if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ))
return false ;
// si parte da Z massima
bMaxZ = true ;
double dSafeZ = ( max( vAxVal[2], vAxIni[2]) + dHomeZ) / 2 ;
DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dSafeZ ;
DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dSafeZ ;
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2)) {
// cancello eventuale risalita parziale della lavorazione precedente
pPrevOp->RemoveRise() ;
// aggiungo risalita a Zmax
if ( ! pPrevOp->AddRise( vAxVal))
return false ;
// si parte da Z massima
bMaxZ = true ;
}
else {
// cancello eventuale risalita parziale della lavorazione precedente
pPrevOp->RemoveRise() ;
// aggiungo risalita a Zsafe
if ( ! pPrevOp->AddRise( vAxVal, dSafeZ - vAxVal[2]))
return false ;
// aggiorno quota iniziale in Z
vAxIni[2] = dSafeZ ;
}
}
}
// altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa
@@ -1151,7 +1169,7 @@ Operation::AdjustStartEndMovements( void)
}
else {
// recupero posizione home
if ( ! m_pMchMgr->GetAllCalcAxesHomePos( vAxVal))
if ( ! m_pMchMgr->GetAllCurrAxesHomePos( vAxVal))
return false ;
}
// imposto l'utensile per i calcoli macchina
@@ -1230,17 +1248,21 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
// verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
else {
// determino la Z più alta tra le due posizioni
double dZtop = max( vAxPrev[2], vAxCurr[2]) ;
double dTopZ = 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 ;
DBLVECTOR vAxPrevTmp = vAxPrev ; vAxPrevTmp[2] = dTopZ ;
DBLVECTOR vAxCurrTmp = vAxCurr ; vAxCurrTmp[2] = dTopZ ;
// se interferisce
if ( ! TestCollisionAvoid( vAxPrevZtop, vAxCurrZtop)) {
if ( ! TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp)) {
// recupero HomeZ
Machine* pMch = m_pMchMgr->GetCurrMachine() ;
double dHomeZ ;
if ( pMch == nullptr || ! pMch->GetCurrAxisHomePos( 2, dHomeZ))
if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ))
return false ;
// riprovo con una Z intermedia
double dSafeZ = ( dTopZ + dHomeZ) / 2 ;
vAxPrevTmp[2] = dSafeZ ;
vAxCurrTmp[2] = dSafeZ ;
bool bSafeOk = TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp) ;
// risalita sopra fine percorso precedente
// copio l'entità
int nNew1Id = m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_BEFORE) ;
@@ -1250,7 +1272,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
// modifico questa entità
m_pGeomDB->RemoveName( nNew1Id) ;
DBLVECTOR vAxNew1 = vAxPrev ;
vAxNew1[2] = dHomeZ ;
vAxNew1[2] = ( bSafeOk ? dSafeZ : dHomeZ) ;
int nMask = CamData::MSK_L3 ;
// eventuali aggiustamenti speciali dipendenti dalla macchina
Vector3d vtTool = pCamData->GetToolDir() ;
@@ -1287,7 +1309,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
// modifico quella originale (è la prima del percorso)
m_pGeomDB->RemoveName( nNew2Id) ;
DBLVECTOR vAxNew2 = vAxCurr ;
vAxNew2[2] = dHomeZ ;
vAxNew2[2] = ( bSafeOk ? dSafeZ : dHomeZ) ;
pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ;
pNew2CamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2 | CamData::MSK_R3) ;
pNew2CamData->SetFlag( 2) ;
@@ -1409,7 +1431,7 @@ Operation::AddRise( DBLVECTOR& vAxVal, double dDelta)
else {
// recupero posizione home
DBLVECTOR vAxHome ;
m_pMchMgr->GetAllCalcAxesHomePos( vAxHome) ;
m_pMchMgr->GetAllCurrAxesHomePos( vAxHome) ;
vAxVal[2] = vAxHome[2] ;
nFlag = 3 ; // movimento a Zmax
}
@@ -1510,7 +1532,7 @@ Operation::AddHome( void)
int nFlag = 4 ;
// recupero coordinate home
DBLVECTOR vAxHome ;
m_pMchMgr->GetAllCalcAxesHomePos( vAxHome) ;
m_pMchMgr->GetAllCurrAxesHomePos( vAxHome) ;
// assegno i dati
pCam->SetAxes( CamData::AS_OK, vAxHome) ;
pCam->SetMoveType( 0) ;
@@ -1614,7 +1636,6 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
// il numero di assi deve essere costante
if ( vAxName.size() != vAxStart.size() || vAxName.size() != vAxEnd.size())
return false ;
// !!! Temporaneo in attesa di gestione attrezzaggio !!!
// Se testa con Info ZMAXONROT != 0 e movimento assi rotanti -> collisione
int nHeadId = pMch->GetCurrHead() ;
int nVal = 0 ;
@@ -1650,39 +1671,70 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
for ( const auto nFxtId : vFxtId)
pMch->LinkFixtureToGroup( nFxtId, sTable) ;
// Vado nelle posizioni da controllare
const int COLL_STEP = 16 ;
bool bCollide = false ;
for ( int i = 1 ; i <= 15 && ! bCollide ; ++ i) {
double dCoeff = double( i) / 16 ;
for ( int i = 1 ; i < COLL_STEP && ! bCollide ; ++ i) {
// Imposto la posizione
double dCoeff = double( i) / COLL_STEP ;
for ( size_t j = 0 ; j < vAxStart.size() ; ++ j) {
double dPos = ( 1 - dCoeff) * vAxStart[j] + dCoeff * vAxEnd[j] ;
pMch->SetAxisPos( vAxName[j], dPos) ;
}
// Eseguo controllo
// Determino sottobox e box della testa
BOXIVECTOR vbiSH ;
BBox3d b3Head ;
m_pGeomDB->GetGlobalBBox( pMch->GetCurrHead(), b3Head, BBF_ONLY_VISIBLE) ;
int nHId = m_pGeomDB->GetFirstGroupInGroup( pMch->GetCurrHead()) ;
while ( nHId != GDB_ID_NULL) {
BBox3d b3Tmp ;
m_pGeomDB->GetGlobalBBox( nHId, b3Tmp, BBF_ONLY_VISIBLE) ;
b3Head.Add( b3Tmp) ;
vbiSH.emplace_back( b3Tmp, nHId) ;
nHId = m_pGeomDB->GetNextGroup( nHId) ;
}
// Li confronto con i grezzi
for ( const auto nRawId : vRawId) {
// verifico i box
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Head.Overlaps( b3Raw)) {
// box testa nel riferimento del solido
// riferimento del grezzo
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 ;
// verifico i sottobox
for ( const auto biSH : vbiSH) {
if ( biSH.first.Overlaps( b3Raw)) {
// sottobox testa nel riferimento del solido
BBox3d b3Hsol ;
m_pGeomDB->GetRefBBox( biSH.second, frSolid, b3Hsol) ;
// solido
const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nRawSolidId)) ;
// verifica di collisione tra sottobox e solido
if ( pStm == nullptr || CDBoxPolyhedron( b3Hsol, *pStm)) {
bCollide = true ;
break ;
}
}
}
if ( bCollide)
break ;
}
}
for ( const auto nFxtId : vFxtId) {
BBox3d b3Fxt ;
int nFlag = BBF_ONLY_VISIBLE | BBF_IGNORE_TEXT | BBF_IGNORE_TEXT ;
if ( m_pGeomDB->GetGlobalBBox( nFxtId, b3Fxt, nFlag) && b3Head.Overlaps( b3Fxt)) {
bCollide = true ;
break ;
if ( ! bCollide) {
for ( const auto nFxtId : vFxtId) {
// verifico i box
BBox3d b3Fxt ;
int nFlag = BBF_ONLY_VISIBLE | BBF_IGNORE_TEXT | BBF_IGNORE_DIM ;
if ( m_pGeomDB->GetGlobalBBox( nFxtId, b3Fxt, nFlag) && b3Head.Overlaps( b3Fxt)) {
// verifico i sottobox
for ( const auto biSH : vbiSH) {
if ( biSH.first.Overlaps( b3Fxt)) {
bCollide = true ;
break ;
}
}
if ( bCollide)
break ;
}
}
}
}