EgtMachKernel :

- aggiunto flag in Ini macchina [Machinings] RapidOnOut=1 per abilitare approcci e retrazioni in rapido diretti su estremi fresature 1 passata fuori dal grezzo
- migliorata precisione nella verifica collisioni per link tra lavorazioni con vere geometrie utensile con nome Tool_* (Tool_C, Tool_S,...).
This commit is contained in:
Dario Sassi
2024-07-31 20:30:13 +02:00
parent 5d945b983d
commit 5a4f77030c
6 changed files with 105 additions and 20 deletions
+74 -13
View File
@@ -4050,7 +4050,7 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
DBLVECTOR vAxMid( int( vAxName.size())) ;
// ciclo sugli assi correnti, assegno opportunamente valori a seconda del tipo (testa o tavola)
for ( int i = 0 ; i < int( vAxName.size()) ; ++ i) {
bool bHead ; pMch->GetCurrAxisType( i, bHead) ;
bool bLinear, bHead ; pMch->GetCurrAxisType( i, bLinear, bHead) ;
if ( nHeadOrder == -1)
vAxMid[i] = ( bHead ? vAxEnd[i] : vAxStart[i]) ;
else if ( nHeadOrder == +1) {
@@ -4078,6 +4078,30 @@ Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR&
// Parti di testa e collegati da considerare per la collisione
INTVECTOR vHeadCollId ;
pMch->GetCurrHeadCollGroups( vHeadCollId) ;
if ( vHeadCollId.empty())
return true ;
// Recupero utensili veri e propri e li nascondo
INTVECTOR vCutterId ;
int nExitId = m_pGeomDB->GetFirstGroupInGroup( vHeadCollId[0]) ;
while ( nExitId != GDB_ID_NULL) {
int nExitStat ;
if ( m_pGeomDB->GetStatus( nExitId, nExitStat) && nExitStat != GDB_ST_OFF) {
int nToolId = m_pGeomDB->GetFirstGroupInGroup( nExitId) ;
while ( nToolId != GDB_ID_NULL) {
int nToolStat ;
if ( m_pGeomDB->GetStatus( nToolId, nToolStat) && nToolStat != GDB_ST_OFF) {
int nCutterId = m_pGeomDB->GetFirstNameInGroup( nToolId, TNA_TOOL_START + "*") ;
while ( nCutterId != GDB_ID_NULL) {
vCutterId.emplace_back( nCutterId) ;
m_pGeomDB->SetStatus( nCutterId, GDB_ST_OFF) ;
nCutterId = m_pGeomDB->GetNextName( nCutterId, TNA_TOOL_START + "*") ;
}
}
nToolId = m_pGeomDB->GetNextGroup( nToolId) ;
}
}
nExitId = m_pGeomDB->GetNextGroup( nExitId) ;
}
// distanza di sicurezza
const double TOL_SAFEDIST = 5.0 ;
@@ -4085,11 +4109,18 @@ Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR&
double dSafeDist = GetSafeZ() ;
dSafeDist = max( dSafeDist - TOL_SAFEDIST, MIN_SAFEDIST) ;
// Vado nelle posizioni da controllare
const int COLL_STEP = 16 ;
const int COLL_STEP_MIN = 1 ;
const int COLL_STEP_STD = 16 ;
double dMoveLen = 0 ;
for ( int j = 0 ; j < int( vAxName.size()) ; ++ j) {
bool bLinear, bHead ; pMch->GetCurrAxisType( j, bLinear, bHead) ;
dMoveLen += abs( vAxEnd[j] - vAxStart[j]) * ( bLinear ? 1 : 10) ;
}
int nStep = ( dMoveLen < 10 ? COLL_STEP_MIN : COLL_STEP_STD) ;
bool bCollide = false ;
for ( int i = 0 ; i < COLL_STEP && ! bCollide ; ++ i) {
for ( int i = 0 ; i <= nStep && ! bCollide ; ++ i) {
// Imposto la posizione
double dCoeff = double( i) / COLL_STEP ;
double dCoeff = double( i) / nStep ;
for ( int j = 0 ; j < int( vAxName.size()) ; ++ j) {
double dPos = ( 1 - dCoeff) * vAxStart[j] + dCoeff * vAxEnd[j] ;
pMch->SetAxisPos( vAxName[j], dPos) ;
@@ -4121,10 +4152,28 @@ Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR&
}
// eventuale emissione Log
if ( ExeGetDebugLevel() >= 5) {
string sHead ;
if ( ! m_pGeomDB->GetName( nCId, sHead))
sHead = "---" ;
string sOut = " " + sHead + " : " + ToString( b3Head, 1) ;
string sName ;
if ( ! m_pGeomDB->GetName( nCId, sName))
sName = "---" ;
string sOut = " " + sName + " : " + ToString( b3Head, 1) ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str()) ;
}
}
// Aggiungo eventuali utensili veri e propri
for ( int nCutterId : vCutterId) {
BBox3d b3Tmp ;
m_pGeomDB->GetGlobalBBox( nCutterId, b3Tmp, BBF_STANDARD) ;
if ( ! b3Tmp.IsEmpty()) {
b3Tmp.Expand( dSafeDist) ;
b3Head.Add( b3Tmp) ;
vbiSH.emplace_back( b3Tmp, nCutterId) ;
}
// eventuale emissione Log
if ( ExeGetDebugLevel() >= 5) {
string sName ;
if ( ! m_pGeomDB->GetName( nCutterId, sName))
sName = "---" ;
string sOut = " " + sName + " : " + ToString( b3Head, 1) ;
LOG_DBG_INFO( GetEMkLogger(), sOut.c_str()) ;
}
}
@@ -4153,18 +4202,26 @@ Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR&
// verifico i sottobox
for ( const auto& biSH : vbiSH) {
if ( biSH.first.Overlaps( b3Raw)) {
// box del solido parte della testa
bool bCutter = ( find( vCutterId.begin(), vCutterId.end(), biSH.second) != vCutterId.end()) ;
// box del solido parte della testa (se cutter è nascosto)
BBox3d b3Hsol ;
m_pGeomDB->GetLocalBBox( biSH.second, b3Hsol, BBF_ONLY_VISIBLE) ;
Point3d ptMin ;
Vector3d vtDiag ;
b3Hsol.GetMinDim( ptMin, vtDiag.x, vtDiag.y, vtDiag.z) ;
int nFlag = ( bCutter ? BBF_STANDARD : BBF_ONLY_VISIBLE) ;
m_pGeomDB->GetLocalBBox( biSH.second, b3Hsol, nFlag) ;
// riferimento della parte di testa
Frame3d frHsol ;
if ( m_pGeomDB->GetGdbType( biSH.second) == GDB_TY_GEO)
m_pGeomDB->GetGlobFrame( biSH.second, frHsol) ;
else
m_pGeomDB->GetGroupGlobFrame( biSH.second, frHsol) ;
// se cutter, ruoto riferimento di -90deg attorno a Xlocale (per compensare quanto fatto in LoadTool) quindi box di +90deg
if ( bCutter) {
b3Hsol.Rotate( ORIG, X_AX, 0, 1) ;
frHsol.Rotate( frHsol.Orig(), frHsol.VersX(), 0, -1) ;
}
// dati geometrici del box
Point3d ptMin ;
Vector3d vtDiag ;
b3Hsol.GetMinDim( ptMin, vtDiag.x, vtDiag.y, vtDiag.z) ;
// lo porto nel riferimento del grezzo
frHsol.ToLoc( frSolid) ;
// se utensile cilindrico (faccia XY quadra e origine del riferimento nel suo centro)
@@ -4269,6 +4326,10 @@ Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR&
}
}
// Ripristino visualizzazione utensili veri e propri
for ( int nCutterId : vCutterId)
m_pGeomDB->SetStatus( nCutterId, GDB_ST_ON) ;
return ( ! bCollide) ;
}