EgtMachKernel 1.8e5 :

- gestione da parametri lavorazione di angoli iniziali suggeriti e asse rotante bloccato
- in fresatura, svuotatura, incisione e lav. generica aggiunta possibilità di invertire direzione utensile
- in fresatura aggiunto parametro per tipo lavorazione faccia (perpendicolare, parallela, ...)
- differenziata distanza sicurezza standard da distanza sicurezza per rinvio da sotto
- migliorati approcci e retrazioni con rinvio da sotto
- migliorata segnalazione errori.
This commit is contained in:
Dario Sassi
2017-05-31 14:18:11 +00:00
parent c9ab1c76ed
commit 6c7a60b60a
48 changed files with 1214 additions and 234 deletions
+23 -29
View File
@@ -270,11 +270,12 @@ Operation::GetDistanceFromRawSide( int nPhase, const Point3d& ptP, const Vector3
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Pnt.OverlapsXY( b3Raw)) {
// porto il punto nel riferimento del grezzo
// porto il punto nel riferimento del grezzo (a Z=0 perchè ivi è il contorno)
Frame3d frRaw ;
m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw) ;
Point3d ptPL = ptP ;
ptPL.ToLoc( frRaw) ;
ptPL.z = 0 ;
// verifica con il contorno
int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_OUTLINE) ;
const ICurve* pCurve = GetCurve( m_pGeomDB->GetGeoObj( nOutCrvId)) ;
@@ -338,11 +339,12 @@ Operation::GetMinDistanceFromRawSide( int nPhase, const Point3d& ptP, double& dD
BBox3d b3Raw ;
int nRawSolidId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ;
if ( m_pGeomDB->GetGlobalBBox( nRawSolidId, b3Raw) && b3Pnt.OverlapsXY( b3Raw)) {
// porto il punto nel riferimento del grezzo
// porto il punto nel riferimento del grezzo (a Z=0 perchè ivi è il contorno)
Frame3d frRaw ;
m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw) ;
Point3d ptPL = ptP ;
ptPL.ToLoc( frRaw) ;
ptPL.z = 0 ;
// verifica con il contorno
int nOutCrvId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_OUTLINE) ;
const ICurve* pCurve = GetCurve( m_pGeomDB->GetGeoObj( nOutCrvId)) ;
@@ -626,25 +628,6 @@ Operation::ExtractHint( const std::string& sNotes)
return sHint ;
}
//----------------------------------------------------------------------------
string
Operation::ExtractSurf( const std::string& sNotes)
{
const string KEY_SURF = "Surf:" ;
string sHint ;
STRVECTOR vsCmd ;
Tokenize( sNotes, ";", vsCmd) ;
for each (const auto& sCmd in vsCmd) {
// se per assi rotanti
if ( sCmd.find( KEY_SURF) != string::npos) {
sHint = sCmd ;
ReplaceString( sHint, KEY_SURF, "") ;
break ;
}
}
return sHint ;
}
//----------------------------------------------------------------------------
bool
Operation::CalculateAxesValues( const string& sHint)
@@ -1672,6 +1655,8 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
// Aggancio bloccaggi alla tavola corrente
for ( const auto nFxtId : vFxtId)
pMch->LinkFixtureToGroup( nFxtId, sTable) ;
// distanza di sicurezza
double dSafeDist = m_pMchMgr->GetCurrMachiningsMgr()->GetSafeZ() - 10 * EPS_SMALL ;
// Vado nelle posizioni da controllare
const int COLL_STEP = 16 ;
bool bCollide = false ;
@@ -1682,16 +1667,23 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
double dPos = ( 1 - dCoeff) * vAxStart[j] + dCoeff * vAxEnd[j] ;
pMch->SetAxisPos( vAxName[j], dPos) ;
}
// Determino sottobox e box della testa
// Determino sottobox e box della testa e degli altri oggetti da considerare per la collisione
BOXIVECTOR vbiSH ;
BBox3d b3Head ;
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) ;
INTVECTOR vCollId ;
pMch->GetCurrHeadCollGroups( vCollId) ;
for each ( int nCId in vCollId) {
int nHId = m_pGeomDB->GetFirstInGroup( nCId) ;
while ( nHId != GDB_ID_NULL) {
BBox3d b3Tmp ;
m_pGeomDB->GetGlobalBBox( nHId, b3Tmp, BBF_ONLY_VISIBLE) ;
if ( ! b3Tmp.IsEmpty()) {
b3Tmp.Expand( dSafeDist) ;
b3Head.Add( b3Tmp) ;
vbiSH.emplace_back( b3Tmp, nHId) ;
}
nHId = m_pGeomDB->GetNext( nHId) ;
}
}
// Li confronto con i grezzi
for ( const auto nRawId : vRawId) {
@@ -1708,6 +1700,7 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
// sottobox testa nel riferimento del solido
BBox3d b3Hsol ;
m_pGeomDB->GetRefBBox( biSH.second, frSolid, b3Hsol) ;
b3Hsol.Expand( dSafeDist) ;
// solido
const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nRawSolidId)) ;
// verifica di collisione tra sottobox e solido
@@ -1721,6 +1714,7 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
break ;
}
}
// Se non trovata collisione, li confronto con i bloccaggi
if ( ! bCollide) {
for ( const auto nFxtId : vFxtId) {
// verifico i box