EgtMachKernel 2.3a4 :

- corrette GetAxisMin e GetAxisMax di MachMgr perchè restituivano la posizione di Home
- corrette CalcSurfAuxView di Milling e di Mortising perchè potevano andare in loop infinito
- cambiato funzionamento di risalite tra una lavorazione e l'altra quando si imposta ExtraZ (ora valido solo se utensile entro un angolo da Z) e se non ammissibile si va a Zmax.
This commit is contained in:
Dario Sassi
2021-01-15 14:15:54 +00:00
parent 78bc849746
commit 1dece3f2d3
6 changed files with 61 additions and 37 deletions
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -308,7 +308,7 @@ bool
MachMgr::GetAxisMin( const string& sAxis, double& dMin) const
{
Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->GetAxisHomePos( sAxis, dMin) : false) ;
return ( ( pMch != nullptr) ? pMch->GetAxisMin( sAxis, dMin) : false) ;
}
//----------------------------------------------------------------------------
@@ -316,7 +316,7 @@ bool
MachMgr::GetAxisMax( const string& sAxis, double& dMax) const
{
Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->GetAxisHomePos( sAxis, dMax) : false) ;
return ( ( pMch != nullptr) ? pMch->GetAxisMax( sAxis, dMax) : false) ;
}
//----------------------------------------------------------------------------
+6 -8
View File
@@ -1518,14 +1518,12 @@ Milling::CalcSurfAuxView( int nAuxId, int nAuxViewId)
while ( nPathId != GDB_ID_NULL) {
int nCrvId = m_pGeomDB->GetFirstInGroup( nPathId) ;
const ICurve* pCrv = ::GetCurve( m_pGeomDB->GetGeoObj( nCrvId)) ;
if ( pCrv == nullptr)
continue ;
ISurfFlatRegion* pSfr = GetSurfFlatRegionFromFatCurve( pCrv->Clone(), FAT_RAD, false, false) ;
if ( pSfr == nullptr)
continue ;
int nSfrId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nAuxViewId, pSfr) ;
if ( nSfrId == GDB_ID_NULL)
continue ;
if ( pCrv != nullptr) {
ISurfFlatRegion* pSfr = GetSurfFlatRegionFromFatCurve( pCrv->Clone(), FAT_RAD, false, false) ;
if ( pSfr != nullptr) {
int nSfrId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nAuxViewId, pSfr) ;
}
}
nPathId = m_pGeomDB->GetNextGroup( nPathId) ;
}
}
+6 -8
View File
@@ -1112,14 +1112,12 @@ Mortising::CalcSurfAuxView( int nAuxId, int nAuxViewId)
while ( nPathId != GDB_ID_NULL) {
int nCrvId = m_pGeomDB->GetFirstInGroup( nPathId) ;
const ICurve* pCrv = ::GetCurve( m_pGeomDB->GetGeoObj( nCrvId)) ;
if ( pCrv == nullptr)
continue ;
ISurfFlatRegion* pSfr = GetSurfFlatRegionFromFatCurve( pCrv->Clone(), FAT_RAD, false, false) ;
if ( pSfr == nullptr)
continue ;
int nSfrId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nAuxViewId, pSfr) ;
if ( nSfrId == GDB_ID_NULL)
continue ;
if ( pCrv != nullptr) {
ISurfFlatRegion* pSfr = GetSurfFlatRegionFromFatCurve( pCrv->Clone(), FAT_RAD, false, false) ;
if ( pSfr != nullptr) {
int nSfrId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nAuxViewId, pSfr) ;
}
}
nPathId = m_pGeomDB->GetNextGroup( nPathId) ;
}
}
+46 -18
View File
@@ -1729,18 +1729,25 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
vAxIni[2] = vAxVal[2] ;
}
// Verifico non ci sia collisione a HomeZ
bool bToZmax = false ;
double dHomeZ ;
if ( m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ)) {
DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dHomeZ ;
DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dHomeZ ;
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2)) {
double dExtraZ = GetExtraZ( dHomeZ) ;
if ( dExtraZ > EPS_SMALL) {
dHomeZ += dExtraZ ;
vAxVal2[2] = dHomeZ ;
vAxIni2[2] = dHomeZ ;
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2))
return false ;
double dExtraZ, dMaxAngV ;
if ( GetExtraZ( dHomeZ, dExtraZ, dMaxAngV)) {
if ( vAxVal2.size() < 5 || ( abs( vAxVal2[4]) < dMaxAngV && abs( vAxIni2[4]) < dMaxAngV)) {
double dMyHomeZ = dHomeZ + dExtraZ ;
vAxVal2[2] = dMyHomeZ ;
vAxIni2[2] = dMyHomeZ ;
if ( TestCollisionAvoid( vAxVal2, vAxIni2))
dHomeZ = dMyHomeZ ;
else
bToZmax = true ;
}
else
bToZmax = true ;
}
else
return false ;
@@ -1749,11 +1756,11 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
else
return false ;
// Se richiesta risalita a Zmax
if ( ForcedZmax( vAxVal, vAxIni)) {
if ( bToZmax || ForcedZmax( vAxVal, vAxIni)) {
// cancello eventuale risalita parziale della lavorazione precedente
pPrevOp->RemoveRise() ;
// aggiungo risalita a Zmax
if ( ! pPrevOp->AddRise( vAxVal))
if ( ! pPrevOp->AddRise( vAxVal, ( bToZmax && false ? -10000 : -1)))
return false ;
// si parte da Z massima
bMaxZ = true ;
@@ -2146,6 +2153,9 @@ Operation::AddRise( DBLVECTOR& vAxVal, double dDelta, int nClPathId, bool bZHome
m_pMchMgr->GetAllCurrAxesHomePos( vAxHome) ;
vAxVal[2] = vAxHome[2] ;
nFlag = 3 ; // movimento a Zmax
// !!! PROVA !!!
if ( dDelta < -9999)
nFlag = 5 ;
}
// eventuale aggiustamenti speciali dipendenti dalla macchina
Vector3d vtTool = pCam->GetToolDir() ;
@@ -2397,23 +2407,41 @@ Operation::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR
}
//----------------------------------------------------------------------------
double
Operation::GetExtraZ( double dSafeZ) const
bool
Operation::GetExtraZ( double dSafeZ, double& dExtraZ, double& dMaxAngV) const
{
double dExtraZ = 0 ;
// Recupero macchina corrente
Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ;
if ( pMch == nullptr)
return 0 ;
// Se testa con Info ZEXTRA la recupero e la limito alla corsa dell'asse
int nHeadId = pMch->GetCurrHead() ;
double dVal ;
if ( m_pGeomDB->GetInfo( nHeadId, MCH_ZEXTRA, dVal) && dVal > EPS_SMALL) {
double dZmax ;
pMch->GetCurrAxisMax( 2, dZmax) ;
dExtraZ = min( dVal, dZmax - dSafeZ) ;
DBLVECTOR vdVal ;
if ( m_pGeomDB->GetInfo( nHeadId, MCH_ZEXTRA, vdVal) && vdVal.size() >= 1 && vdVal[0] > EPS_SMALL) {
// angolo limite per applicare questo allontanamento extra
dMaxAngV = 30 ;
if ( vdVal.size() >= 2)
dMaxAngV = vdVal[1] ;
// flag per posizione sicura in alto o in basso
bool bZHomeDown ;
if ( ! m_pGeomDB->GetInfo( nHeadId, MCH_ZHOMEDOWN, bZHomeDown))
bZHomeDown = false ;
// se caso standard
if ( ! bZHomeDown) {
double dZmax ;
pMch->GetCurrAxisMax( 2, dZmax) ;
dExtraZ = min( vdVal[0], dZmax - dSafeZ) ;
return ( dExtraZ > EPS_SMALL) ;
}
// altrimenti caso con posizione sicura in basso (teste da sotto)
else {
double dZmin ;
pMch->GetCurrAxisMin( 2, dZmin) ;
dExtraZ = max( vdVal[0], dZmin - dSafeZ) ;
return ( dExtraZ < EPS_SMALL) ;
}
}
return dExtraZ ;
return false ;
}
//----------------------------------------------------------------------------
+1 -1
View File
@@ -110,7 +110,7 @@ class Operation : public IUserObj
bool RemoveRise( int nClPathId = GDB_ID_NULL) ;
bool AddHome( void) ;
bool CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, double& dDeltaZ) const ;
double GetExtraZ( double dSafeZ) const ;
bool GetExtraZ( double dSafeZ, double& dExtraZ, double& dMaxAngV) const ;
bool ForcedZmax( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ;
bool GetZHomeDown( void) const ;
bool TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ;