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:
+91
-39
@@ -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 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user