EgtMachKernel 1.8g5 :
- migliorata segnalazione extra corse.
This commit is contained in:
+91
-97
@@ -237,18 +237,22 @@ Operation::GetElevation( int nPhase, const Point3d& ptP,
|
||||
{
|
||||
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
// considero il punto
|
||||
// considero il punto centrale
|
||||
if ( ! GetElevation( nPhase, ptP, vtDir, dElev))
|
||||
return false ;
|
||||
// considero 8 punti sulla circonferenza
|
||||
// considero 8 direzioni sulla circonferenza
|
||||
const int N_STEP = 8 ;
|
||||
Vector3d vtRad = FromUprightOrtho( vtDir) * dRad ;
|
||||
for ( int i = 0 ; i < N_STEP ; ++ i) {
|
||||
double dElevT ;
|
||||
// esploro 4 posizioni sulle direzioni
|
||||
for ( int j = 1 ; j <= 8 ; j *= 2) {
|
||||
double dElevT = 0 ;
|
||||
if ( ! GetElevation( nPhase, ptP + vtRad / j, vtDir, dElevT))
|
||||
return false ;
|
||||
dElev = max( dElev, dElevT) ;
|
||||
}
|
||||
// passo alla direzione successiva
|
||||
vtRad.Rotate( vtDir, ANG_FULL / N_STEP) ;
|
||||
if ( ! GetElevation( nPhase, ptP + vtRad, vtDir, dElevT))
|
||||
return false ;
|
||||
dElev = max( dElev, dElevT) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
@@ -901,7 +905,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
|
||||
vAxVal.emplace_back( dAng) ;
|
||||
// verifico i limiti di corsa degli assi
|
||||
int nStat ;
|
||||
bool bOsOk = m_pMchMgr->VerifyOutstroke( dX, dY, dZ, vAng1, nStat) ;
|
||||
bool bOsOk = m_pMchMgr->VerifyOutstroke( dX, dY, dZ, vAng1, false, nStat) ;
|
||||
if ( ! bOsOk || nStat != 0) {
|
||||
bOk = false ;
|
||||
pCamData->SetAxes( CamData::AS_OUTSTROKE, vAxVal) ;
|
||||
@@ -1015,7 +1019,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
|
||||
for ( size_t i = 0 ; i < vAng1.size() ; ++ i)
|
||||
vAng[i] = vAxRotPrec[i] * ( 1 - dCoeff) + vAng1[i] * dCoeff ;
|
||||
int nStat ;
|
||||
bool bOsOk = m_pMchMgr->VerifyOutstroke( ptCurr.x, ptCurr.y, ptCurr.z, vAng, nStat) ;
|
||||
bool bOsOk = m_pMchMgr->VerifyOutstroke( ptCurr.x, ptCurr.y, ptCurr.z, vAng, false, nStat) ;
|
||||
if ( ! bOsOk || nStat != 0) {
|
||||
bOk = false ;
|
||||
pCamData->SetAxes( CamData::AS_OUTSTROKE, vAxVal) ;
|
||||
@@ -1109,18 +1113,18 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
if ( ! GetInitialAxesValues( vAxIni))
|
||||
return false ;
|
||||
// aggiungo eventuale delta Z
|
||||
double dDelta = 0 ;
|
||||
double dDeltaZ = 0 ;
|
||||
// determino delta Z rispetto a posizione finale
|
||||
if ( vAxVal.size() >= 4 && vAxIni.size() >= 4) {
|
||||
// verifico se movimento assi rotanti richiede una risalita parziale
|
||||
if ( ! CalcDeltaZForHeadRotation( vAxVal, vAxIni, dDelta))
|
||||
if ( ! CalcDeltaZForHeadRotation( vAxVal, vAxIni, dDeltaZ))
|
||||
return false ;
|
||||
}
|
||||
// confronto con eventuale risalita di inizio lavorazione
|
||||
dDelta = max( dDelta, ( vAxIni[2] - vAxVal[2])) ;
|
||||
dDeltaZ = max( dDeltaZ, ( vAxIni[2] - vAxVal[2])) ;
|
||||
// se necessaria, aggiungo risalita parziale
|
||||
if ( dDelta > 100 * EPS_SMALL) {
|
||||
if ( ! pPrevOp->AddRise( vAxVal, dDelta))
|
||||
if ( dDeltaZ > 100 * EPS_SMALL) {
|
||||
if ( ! pPrevOp->AddRise( vAxVal, dDeltaZ))
|
||||
return false ;
|
||||
// aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito)
|
||||
vAxIni[2] = vAxVal[2] ;
|
||||
@@ -1193,24 +1197,24 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
bMaxZ = true ;
|
||||
}
|
||||
|
||||
// elimino vecchie risalite alla fine della lavorazione
|
||||
RemoveRise() ;
|
||||
|
||||
// se richiesta verifica collegamento con lavorazione precedente, aggiusto l'inizio di ogni percorso di lavoro
|
||||
// aggiusto l'inizio di ogni percorso di lavoro
|
||||
bool bOk = true ;
|
||||
if ( bVerifyPreviousLink) {
|
||||
int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ;
|
||||
while ( bOk && nClPathId != GDB_ID_NULL) {
|
||||
// sistemo inizio
|
||||
if ( ! AdjustOneStartMovement( nClPathId, vAxVal, bMaxZ))
|
||||
int nPrevClPathId = GDB_ID_NULL ;
|
||||
int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ;
|
||||
while ( bOk && nClPathId != GDB_ID_NULL) {
|
||||
// se richiesta verifica collegamento con lavorazione precedente, sistemo inizio
|
||||
if ( bVerifyPreviousLink) {
|
||||
if ( ! AdjustOneStartMovement( nClPathId, nPrevClPathId, vAxVal, bMaxZ))
|
||||
bOk = false ;
|
||||
bMaxZ = false ;
|
||||
// recupero nuovi finali
|
||||
if ( ! GetClPathFinalAxesValues( nClPathId, vAxVal))
|
||||
bOk = false ;
|
||||
// passo al successivo
|
||||
nClPathId = m_pGeomDB->GetNextGroup( nClPathId) ;
|
||||
}
|
||||
bMaxZ = false ;
|
||||
// recupero nuovi finali
|
||||
RemoveRise( nClPathId) ;
|
||||
if ( ! GetClPathFinalAxesValues( nClPathId, vAxVal))
|
||||
bOk = false ;
|
||||
// passo al successivo
|
||||
nPrevClPathId = nClPathId ;
|
||||
nClPathId = m_pGeomDB->GetNextGroup( nClPathId) ;
|
||||
}
|
||||
|
||||
// aggiungo risalita finale
|
||||
@@ -1227,7 +1231,7 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bMaxZ)
|
||||
Operation::AdjustOneStartMovement( int nClPathId, int nPrevClPathId, const DBLVECTOR& vAxPrev, bool bMaxZ)
|
||||
{
|
||||
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
@@ -1250,7 +1254,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
|
||||
m_pGeomDB->SetName( nEntId, MCH_CL_CLIMB) ;
|
||||
DBLVECTOR vAxNew = vAxCurr ;
|
||||
vAxNew[2] = vAxPrev[2] ;
|
||||
// eventuale aggiustamenti speciali dipendenti dalla macchina
|
||||
// eventuali aggiustamenti speciali dipendenti dalla macchina
|
||||
Vector3d vtTool = pCamData->GetToolDir() ;
|
||||
DBLVECTOR vAxTmp = vAxNew ;
|
||||
bool bModif ;
|
||||
@@ -1260,7 +1264,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
|
||||
pCamData->SetToolDir( vtTool) ;
|
||||
vAxNew = vAxTmp ;
|
||||
}
|
||||
// applico le modifiche
|
||||
// applico le modifiche (non forzo emissione della Z che è già massima)
|
||||
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
|
||||
pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2 | CamData::MSK_R3) ;
|
||||
pCamData->SetFlag( 2) ;
|
||||
@@ -1291,80 +1295,52 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
|
||||
dUnsafeZ = dTestSafeZ ;
|
||||
}
|
||||
// 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)
|
||||
DBLVECTOR vAxNew1 ;
|
||||
if ( ! AddRise( vAxNew1, dSafeZ - vAxPrev[2], nPrevClPathId))
|
||||
return false ;
|
||||
// modifico questa entità
|
||||
m_pGeomDB->SetName( nNew1Id, MCH_CL_CLIMB) ;
|
||||
DBLVECTOR vAxNew1 = vAxPrev ;
|
||||
vAxNew1[2] = dSafeZ ;
|
||||
int nMask = CamData::MSK_L3 ;
|
||||
// aggiungo posizione elevata prima dell'inizio del percorso corrente
|
||||
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// modifico l'entità originale (è la prima del percorso)
|
||||
m_pGeomDB->SetName( nEntId, MCH_CL_CLIMB) ;
|
||||
DBLVECTOR vAxNew = vAxCurr ;
|
||||
vAxNew[2] = vAxNew1[2] ;
|
||||
// eventuali aggiustamenti speciali dipendenti dalla macchina
|
||||
Vector3d vtTool = pNew1CamData->GetToolDir() ;
|
||||
DBLVECTOR vAxTmp = vAxNew1 ;
|
||||
Vector3d vtTool = pCamData->GetToolDir() ;
|
||||
DBLVECTOR vAxTmp = vAxNew ;
|
||||
bool bModif ;
|
||||
if ( ! SpecialMoveZup( vtTool, vAxTmp, bModif))
|
||||
return false ;
|
||||
if ( bModif) {
|
||||
pNew1CamData->SetToolDir( vtTool) ;
|
||||
if ( vAxNew1.size() >= 4 && abs( vAxTmp[3] - vAxNew1[3]) > EPS_ANG_SMALL) {
|
||||
vAxCurr[3] = vAxNew1[3] ;
|
||||
nMask |= CamData::MSK_R1 ;
|
||||
}
|
||||
if ( vAxNew1.size() >= 5 && abs( vAxTmp[4] - vAxNew1[4]) > EPS_ANG_SMALL) {
|
||||
vAxCurr[4] = vAxNew1[4] ;
|
||||
nMask |= CamData::MSK_R2 ;
|
||||
}
|
||||
if ( vAxNew1.size() >= 6 && abs( vAxTmp[5] - vAxNew1[5]) > EPS_ANG_SMALL) {
|
||||
vAxCurr[5] = vAxNew1[5] ;
|
||||
nMask |= CamData::MSK_R3 ;
|
||||
}
|
||||
vAxNew1 = vAxTmp ;
|
||||
pCamData->SetToolDir( vtTool) ;
|
||||
vAxNew = vAxTmp ;
|
||||
}
|
||||
// applico le modifiche
|
||||
pNew1CamData->SetAxes( CamData::AS_OK, vAxNew1) ;
|
||||
pNew1CamData->ChangeAxesMask( nMask) ;
|
||||
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 ;
|
||||
// la modifico
|
||||
m_pGeomDB->SetName( nNew2Id, MCH_CL_CLIMB) ;
|
||||
DBLVECTOR vAxNew2 = vAxCurr ;
|
||||
vAxNew2[2] = dSafeZ ;
|
||||
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) ;
|
||||
// applico le modifiche (non forzo emissione della Z che è già alta)
|
||||
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
|
||||
pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2 | CamData::MSK_R3) ;
|
||||
pCamData->SetFlag( 2) ;
|
||||
}
|
||||
// altrimenti
|
||||
else {
|
||||
// se Z pressochè uguali non devo fare alcunché
|
||||
if ( fabs( vAxCurr[2] - vAxPrev[2]) < 100 * EPS_SMALL)
|
||||
if ( fabs( vAxCurr[2] - vAxPrev[2]) <= 100 * 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)
|
||||
// devo essere sulla stessa lavorazione
|
||||
if ( nPrevClPathId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// aggiungo risalita alla fine del precedente percorso
|
||||
DBLVECTOR vAxNew ;
|
||||
if ( ! AddRise( vAxNew, vAxCurr[2] - vAxPrev[2], nPrevClPathId))
|
||||
return false ;
|
||||
// modifico quella originale (è la prima del percorso)
|
||||
m_pGeomDB->SetName( nEntId, MCH_CL_CLIMB) ;
|
||||
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à
|
||||
// aggiungo posizione elevata prima dell'inizio del percorso corrente
|
||||
if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL)
|
||||
return false ;
|
||||
// modifico quella originale (è la prima del percorso)
|
||||
// modifico l'entità originale (è la prima del percorso)
|
||||
m_pGeomDB->SetName( nEntId, MCH_CL_CLIMB) ;
|
||||
DBLVECTOR vAxNew = vAxCurr ;
|
||||
vAxNew[2] = vAxPrev[2] ;
|
||||
@@ -1378,7 +1354,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool
|
||||
pCamData->SetToolDir( vtTool) ;
|
||||
vAxNew = vAxTmp ;
|
||||
}
|
||||
// applico le modifiche
|
||||
// applico le modifiche (non forzo emissione della Z che è già alta)
|
||||
pCamData->SetAxes( CamData::AS_OK, vAxNew) ;
|
||||
pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2 | CamData::MSK_R3) ;
|
||||
pCamData->SetFlag( 2) ;
|
||||
@@ -1426,7 +1402,7 @@ Operation::RemoveClimb( int nClPathId)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::AddRise( DBLVECTOR& vAxVal, double dDelta)
|
||||
Operation::AddRise( DBLVECTOR& vAxVal, double dDelta, int nClPathId)
|
||||
{
|
||||
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
@@ -1434,10 +1410,19 @@ Operation::AddRise( DBLVECTOR& vAxVal, double dDelta)
|
||||
int nClId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_CL) ;
|
||||
if ( nClId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// recupero l'ultimo percorso
|
||||
int nLastPxClId = m_pGeomDB->GetLastGroupInGroup( nClId) ;
|
||||
// se percorso CL specificato, verifico appartenga al gruppo sopra ricavato
|
||||
if ( nClPathId != GDB_ID_NULL) {
|
||||
if ( m_pGeomDB->GetParentId( nClPathId) != nClId)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti, recupero l'ultimo percorso CL della operazione
|
||||
else {
|
||||
nClPathId = m_pGeomDB->GetLastGroupInGroup( nClId) ;
|
||||
if ( nClPathId == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// recupero l'ultima entità del percorso
|
||||
int nEntId = m_pGeomDB->GetLastInGroup( nLastPxClId) ;
|
||||
int nEntId = m_pGeomDB->GetLastInGroup( nClPathId) ;
|
||||
if ( nEntId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// ne recupero i dati Cam
|
||||
@@ -1451,7 +1436,7 @@ Operation::AddRise( DBLVECTOR& vAxVal, double dDelta)
|
||||
// assegno le coordinate del punto
|
||||
pGP->Set( pCamData->GetEndPoint()) ;
|
||||
// inserisco l'oggetto nel DB geometrico
|
||||
int nId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nLastPxClId, Release( pGP)) ;
|
||||
int nId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nClPathId, Release( pGP)) ;
|
||||
if ( nId == GDB_ID_NULL)
|
||||
return false ;
|
||||
m_pGeomDB->SetName( nId, MCH_CL_RISE) ;
|
||||
@@ -1496,7 +1481,7 @@ Operation::AddRise( DBLVECTOR& vAxVal, double dDelta)
|
||||
for ( int i = 0 ; i < int( vAxVal.size()) - 3 ; ++ i)
|
||||
vAng.emplace_back( vAxVal[i+3]) ;
|
||||
int nStat ;
|
||||
bool bOk = ( m_pMchMgr->VerifyOutstroke( dL1, dL2, dL3, vAng, nStat) && nStat == 0) ;
|
||||
bool bOk = ( m_pMchMgr->VerifyOutstroke( dL1, dL2, dL3, vAng, false, nStat) && nStat == 0) ;
|
||||
// assegno i dati
|
||||
pCam->SetAxes( (bOk ? CamData::AS_OK : CamData::AS_OUTSTROKE), vAxVal) ;
|
||||
pCam->SetMoveType( 0) ;
|
||||
@@ -1510,7 +1495,7 @@ Operation::AddRise( DBLVECTOR& vAxVal, double dDelta)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Operation::RemoveRise( void)
|
||||
Operation::RemoveRise( int nClPathId)
|
||||
{
|
||||
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
|
||||
return false ;
|
||||
@@ -1518,15 +1503,24 @@ Operation::RemoveRise( void)
|
||||
int nClId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_CL) ;
|
||||
if ( nClId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// recupero l'ultimo percorso CL
|
||||
int nClPathId = m_pGeomDB->GetLastGroupInGroup( nClId) ;
|
||||
// se percorso CL specificato, verifico appartenga al gruppo sopra ricavato
|
||||
if ( nClPathId != GDB_ID_NULL) {
|
||||
if ( m_pGeomDB->GetParentId( nClPathId) != nClId)
|
||||
return false ;
|
||||
}
|
||||
// altrimenti, recupero l'ultimo percorso CL della operazione
|
||||
else {
|
||||
nClPathId = m_pGeomDB->GetLastGroupInGroup( nClId) ;
|
||||
if ( nClPathId == GDB_ID_NULL)
|
||||
return false ;
|
||||
}
|
||||
// elimino tutte le entità RISE alla fine del percorso
|
||||
int nId = m_pGeomDB->GetFirstNameInGroup( nClPathId, MCH_CL_RISE) ;
|
||||
while ( nId != GDB_ID_NULL) {
|
||||
m_pGeomDB->Erase( nId) ;
|
||||
nId = m_pGeomDB->GetFirstNameInGroup( nClPathId, MCH_CL_RISE) ;
|
||||
}
|
||||
// elimino a maggior ragione le entità HOME
|
||||
// elimino a maggior ragione eventuali entità HOME
|
||||
nId = m_pGeomDB->GetFirstNameInGroup( nClPathId, MCH_CL_HOME) ;
|
||||
while ( nId != GDB_ID_NULL) {
|
||||
m_pGeomDB->Erase( nId) ;
|
||||
@@ -1716,7 +1710,7 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
|
||||
for ( const auto nFxtId : vFxtId)
|
||||
pMch->LinkFixtureToGroup( nFxtId, sTable) ;
|
||||
// distanza di sicurezza
|
||||
double dSafeDist = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() - 10 * EPS_SMALL ;
|
||||
double dSafeDist = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() - 100 * EPS_SMALL ;
|
||||
// Vado nelle posizioni da controllare
|
||||
const int COLL_STEP = 16 ;
|
||||
bool bCollide = false ;
|
||||
|
||||
Reference in New Issue
Block a user