EgtMachKernel 1.6r8 :
- aggiunta gestione SCC (Solution Choice Criterion) nelle lavorazioni - possibilità di calcolo Tip con dimensioni massime anzichè quelle di lavoro - migliorato controllo pezzi prima di inserimento nei grezzi - migliorato caricamento tavola al cambio di gruppo di lavoro - aggiunta prima versione di risalita tra i percorsi di lavorazione in base a controllo collisioni (ora solo box) - in simulazione imposto variabile nome tavola prima di OnDispositionStart.
This commit is contained in:
+95
-29
@@ -476,6 +476,9 @@ Operation::CalculateAxesValues( void)
|
||||
// applico eventuali blocchi di assi rotanti
|
||||
m_pMchMgr->ApplyRotAxisBlock() ;
|
||||
|
||||
// applico il criterio di scelta della soluzione quando molteplici
|
||||
m_pMchMgr->SetCalcSolCh( GetSolCh()) ;
|
||||
|
||||
// recupero gruppo della geometria di lavorazione (Cutter Location)
|
||||
int nClId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_CL) ;
|
||||
if ( nClId == GDB_ID_NULL)
|
||||
@@ -682,7 +685,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
|
||||
const int NUM_VERIF_STEP = 16 ;
|
||||
Point3d ptCen = pCamData->GetAxesCen() ;
|
||||
double dAngCenStep = pCamData->GetAxesAngCen() / NUM_VERIF_STEP ;
|
||||
Vector3d vtN = pCamData->GetAxisNormDir() ;
|
||||
Vector3d vtN = pCamData->GetAxesNormDir() ;
|
||||
Vector3d vtCurr = Point3d( dXprec, dYprec, dZprec) - ptCen ;
|
||||
for ( int i = 1 ; i < NUM_VERIF_STEP ; ++ i) {
|
||||
vtCurr.Rotate( vtN, dAngCenStep) ;
|
||||
@@ -744,6 +747,7 @@ Operation::AdjustStartEndMovements(void)
|
||||
|
||||
// determino posizione precedente assi
|
||||
DBLVECTOR vAxVal ;
|
||||
bool bHomeZ = false ;
|
||||
// se primo utensile, uso la posizione home
|
||||
if ( sPrevTool.empty()) {
|
||||
// imposto l'utensile per i calcoli macchina
|
||||
@@ -752,6 +756,8 @@ Operation::AdjustStartEndMovements(void)
|
||||
// recupero posizione home
|
||||
if ( ! m_pMchMgr->GetAllCalcAxesHomePos( vAxVal))
|
||||
return false ;
|
||||
// si parte da HomeZ
|
||||
bHomeZ = true ;
|
||||
}
|
||||
// se utensile non cambiato o su diversa uscita della stessa testa, uso posizione finale della lavorazione precedente
|
||||
else if ( ! ToolChangeNeeded( *pPrevOp, *this)) {
|
||||
@@ -764,21 +770,30 @@ Operation::AdjustStartEndMovements(void)
|
||||
DBLVECTOR vAxIni ;
|
||||
if ( ! pPrevOp->GetFinalAxesValues( vAxVal) || ! GetInitialAxesValues( vAxIni))
|
||||
return false ;
|
||||
// verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
|
||||
if ( ! TestCollisionAvoid( vAxVal, vAxIni)) {
|
||||
if ( ! pPrevOp->AddRise( vAxVal))
|
||||
return false ;
|
||||
}
|
||||
// determino delta Z rispetto a posizione finale
|
||||
if ( vAxVal.size() >= 4 && vAxIni.size() >= 4) {
|
||||
// verifico se movimento assi rotanti richiede una risalita parziale
|
||||
double dDelta = 0 ;
|
||||
if ( ! CalcDeltaZForHeadRotation( vAxVal, vAxIni, dDelta))
|
||||
return false ;
|
||||
// se necessaria, aggiungo risalita parziale
|
||||
if ( dDelta > EPS_SMALL) {
|
||||
if ( ! pPrevOp->AddRise( vAxVal, dDelta))
|
||||
return false ;
|
||||
// aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito)
|
||||
vAxIni[2] = vAxVal[2] ;
|
||||
}
|
||||
}
|
||||
// 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))
|
||||
return false ;
|
||||
// si parte da HomeZ
|
||||
bHomeZ = true ;
|
||||
}
|
||||
}
|
||||
// altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa
|
||||
else {
|
||||
@@ -792,6 +807,8 @@ Operation::AdjustStartEndMovements(void)
|
||||
// imposto l'utensile per i calcoli macchina
|
||||
if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()))
|
||||
return false ;
|
||||
// si parte da HomeZ
|
||||
bHomeZ = true ;
|
||||
}
|
||||
|
||||
// aggiusto l'inizio di ogni percorso di lavoro
|
||||
@@ -799,8 +816,9 @@ Operation::AdjustStartEndMovements(void)
|
||||
int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ;
|
||||
while ( bOk && nClPathId != GDB_ID_NULL) {
|
||||
// sistemo inizio
|
||||
if ( ! AdjustOneStartMovement( nClPathId, vAxVal))
|
||||
if ( ! AdjustOneStartMovement( nClPathId, vAxVal, bHomeZ))
|
||||
bOk = false ;
|
||||
bHomeZ = false ;
|
||||
// recupero nuovi finali
|
||||
if ( ! GetClPathFinalAxesValues( nClPathId, vAxVal))
|
||||
bOk = false ;
|
||||
@@ -817,7 +835,7 @@ Operation::AdjustStartEndMovements(void)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev)
|
||||
Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bHomeZ)
|
||||
{
|
||||
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
@@ -830,23 +848,8 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev)
|
||||
// recupero i valori degli assi
|
||||
DBLVECTOR vAxCurr ;
|
||||
vAxCurr = pCamData->GetAxesVal() ;
|
||||
// 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 {
|
||||
// se provengo da HomeZ (ovvero Z massima)
|
||||
if ( bHomeZ) {
|
||||
// copio l'entità
|
||||
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
|
||||
return false ;
|
||||
@@ -857,6 +860,68 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev)
|
||||
pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ;
|
||||
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)
|
||||
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) ;
|
||||
}
|
||||
}
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -1074,8 +1139,8 @@ Operation::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR
|
||||
// determino le variazioni di ciascun asse
|
||||
double dR1Delta = dR1End - dR1Start ;
|
||||
double dR2Delta = dR2End - dR2Start ;
|
||||
// divido il movimento in step di massimo 15 gradi
|
||||
int nStep = int( max( abs( dR1Delta), abs( dR2Delta)) / 15.0) + 1 ;
|
||||
// divido il movimento in step di massimo 5 gradi
|
||||
int nStep = int( max( abs( dR1Delta), abs( dR2Delta)) / 5.0) + 1 ;
|
||||
double dR1Step = dR1Delta / nStep ;
|
||||
double dR2Step = dR2Delta / nStep ;
|
||||
// calcolo
|
||||
@@ -1087,7 +1152,7 @@ Operation::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR
|
||||
double dR1 = dR1Start + i * dR1Step ;
|
||||
double dR2 = dR2Start + i * dR2Step ;
|
||||
Point3d ptTip ;
|
||||
if ( ! m_pMchMgr->GetCalcTipFromPositions( dL1, dL2, dL3, dR1, dR2, true, ptTip))
|
||||
if ( ! m_pMchMgr->GetCalcTipFromPositions( dL1, dL2, dL3, dR1, dR2, true, true, ptTip))
|
||||
return false ;
|
||||
if ( i == 0) {
|
||||
dZStart = ptTip.z ;
|
||||
@@ -1162,7 +1227,8 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
|
||||
}
|
||||
for ( const auto nFxtId : vFxtId) {
|
||||
BBox3d b3Fxt ;
|
||||
if ( m_pGeomDB->GetGlobalBBox( nFxtId, b3Fxt) && b3Head.Overlaps( 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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user