EgtMachKernel :
- migliorie nella verifica collisioni della simulazione.
This commit is contained in:
+24
-14
@@ -65,6 +65,7 @@ Simulator::Simulator( void)
|
||||
m_nAuxETot = 0 ;
|
||||
m_nAuxEInd = 0 ;
|
||||
m_nExit = 0 ;
|
||||
m_dTDiam = 0 ;
|
||||
m_dVmTdOffs = 0 ;
|
||||
m_dVmAdOffs = 0 ;
|
||||
m_dSafeDist = SAFEDIST_STD ;
|
||||
@@ -124,6 +125,9 @@ Simulator::Start( bool bFirst)
|
||||
|
||||
// Reset utensile, interpolazione e assi correnti
|
||||
m_sTool.clear() ;
|
||||
m_sHead.clear() ;
|
||||
m_nExit = 0 ;
|
||||
m_dTDiam = 0 ;
|
||||
ResetInterpolation() ;
|
||||
ResetAxes() ;
|
||||
ResetAuxAxes() ;
|
||||
@@ -444,6 +448,7 @@ Simulator::UpdateTool( bool bFirst)
|
||||
m_sTool = sTool ;
|
||||
m_sHead = sHead ;
|
||||
m_nExit = nExit ;
|
||||
m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, m_dTDiam) ;
|
||||
// aggiorno gli assi macchina
|
||||
if ( ! UpdateAxes())
|
||||
return false ;
|
||||
@@ -488,6 +493,7 @@ Simulator::UpdateTool( bool bFirst)
|
||||
m_sTool = sTool ;
|
||||
m_sHead = sHead ;
|
||||
m_nExit = nExit ;
|
||||
m_pMchMgr->TdbGetCurrToolParam( TPA_DIAM, m_dTDiam) ;
|
||||
// aggiorno gli assi macchina
|
||||
if ( ! UpdateAxes())
|
||||
return false ;
|
||||
@@ -928,7 +934,8 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
|
||||
double dPrevCoeff = m_dCoeff ;
|
||||
double dDist = sqrt( dSqDist) ;
|
||||
if ( dDist > EPS_SMALL) {
|
||||
int nStep = int( max( dDist / ( ( nMoveType == 0 ? 2 : 1) * m_dStep), 1.)) ;
|
||||
double dStep = min( ( nMoveType == 0 ? 2 : 1) * m_dStep, MAX_STEP) ;
|
||||
int nStep = int( max( dDist / dStep, 1.)) ;
|
||||
m_dCoeff += 1. / nStep ;
|
||||
if ( m_dCoeff > 1)
|
||||
m_dCoeff = 1 ;
|
||||
@@ -948,7 +955,7 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
|
||||
if ( nMoveType != 2 && nMoveType != 3) {
|
||||
// se attivo CollisionCheck approssimo movimento con più step
|
||||
int nStep = 1 ;
|
||||
if ( ! m_VmId.empty() || NeedCollisionCheck()) {
|
||||
if ( NeedCollisionCheck()) {
|
||||
const double LEN_STEP = 10. ;
|
||||
nStep = max( int( dDist / LEN_STEP), 1) ;
|
||||
}
|
||||
@@ -964,17 +971,17 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
|
||||
double dVal = m_AuxAxesVal[j] * ( 1 - dCurrCoeff) + m_AuxAxesEnd[j] * dCurrCoeff ;
|
||||
m_pMachine->SetAxisPos( m_AuxAxesName[j], dVal) ;
|
||||
}
|
||||
// eseguo eventuale Vmill
|
||||
Point3d ptNoseF ; Vector3d vtDirF ; Vector3d vtAuxF ;
|
||||
bool bOkF = GetHeadCurrPosDirAux( ptNoseF, vtDirF, vtAuxF) ;
|
||||
for ( int j = 0 ; j < int( m_VmId.size()) ; ++ j) {
|
||||
Frame3d frVzmF ;
|
||||
bOkF = m_pGeomDB->GetGlobFrame( m_VmId[j], frVzmF) && bOkF ;
|
||||
ExecLineVmill( m_VmId[j], ptNoseI, vtDirI, vtAuxI, vFrVzmI[j], ptNoseF, vtDirF, vtAuxF, frVzmF) ;
|
||||
}
|
||||
// eseguo eventuale collision check
|
||||
bCollCheck = bCollCheck && ExecCollisionCheck( nCdInd, nObjInd) ;
|
||||
}
|
||||
// eseguo eventuale Vmill
|
||||
Point3d ptNoseF ; Vector3d vtDirF ; Vector3d vtAuxF ;
|
||||
bool bOkF = GetHeadCurrPosDirAux( ptNoseF, vtDirF, vtAuxF) ;
|
||||
for ( int j = 0 ; j < int( m_VmId.size()) ; ++ j) {
|
||||
Frame3d frVzmF ;
|
||||
bOkF = m_pGeomDB->GetGlobFrame( m_VmId[j], frVzmF) && bOkF ;
|
||||
ExecLineVmill( m_VmId[j], ptNoseI, vtDirI, vtAuxI, vFrVzmI[j], ptNoseF, vtDirF, vtAuxF, frVzmF) ;
|
||||
}
|
||||
}
|
||||
// Eseguo movimento su arco
|
||||
else {
|
||||
@@ -990,8 +997,10 @@ Simulator::ManageSingleMove( int& nStatus, double& dMove)
|
||||
// se attivi Vmill o CollisionCheck approssimo movimento con più step
|
||||
int nStep = 1 ;
|
||||
if ( ! m_VmId.empty() || NeedCollisionCheck()) {
|
||||
const double LEN_STEP = 2. ;
|
||||
nStep = max( int( abs( dDiffAng * DEGTORAD * dRad) / LEN_STEP), 1) ;
|
||||
const double MIN_LEN_STEP = 2. ;
|
||||
const double MAX_LEN_STEP = 10. ;
|
||||
double dLenStep = Clamp( 0.1 * m_dTDiam, MIN_LEN_STEP, MAX_LEN_STEP) ;
|
||||
nStep = max( int( abs( dDiffAng * DEGTORAD * dRad) / dLenStep), 1) ;
|
||||
const double ANG_STEP = 5. ;
|
||||
if ( abs( dDiffAng) / nStep > ANG_STEP)
|
||||
nStep = int( abs( dDiffAng) / ANG_STEP) ;
|
||||
@@ -1149,7 +1158,7 @@ Simulator::ExecLineVmill( int nVmId, const Point3d& ptHi, const Vector3d& vtHi,
|
||||
bool
|
||||
Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd)
|
||||
{
|
||||
// se non ci sono oggetti da controllare o non ci sono i grezzi o equivalenti, tutto bene
|
||||
// se non ci sono oggetti da controllare o non ci sono grezzi o equivalenti, tutto bene
|
||||
if ( ! NeedCollisionCheck())
|
||||
return true ;
|
||||
// ciclo sui grezzi o equivalenti
|
||||
@@ -1169,7 +1178,6 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd)
|
||||
Frame3d frCd ; m_pGeomDB->GetGlobFrame( m_CdId[i], frCd) ;
|
||||
// ciclo sugli oggetti con cui verificare
|
||||
for ( int j = 0 ; j < int( m_CollObj.size()) ; ++ j) {
|
||||
bool bOk = true ;
|
||||
// se modo hidden è da saltare
|
||||
int nMode ;
|
||||
if ( m_pGeomDB->GetCalcMode( m_CollObj[j].nFrameId, nMode) && nMode == GDB_MD_HIDDEN)
|
||||
@@ -1185,6 +1193,8 @@ Simulator::ExecCollisionCheck( int& nCdInd, int& nObjInd)
|
||||
const IGeoFrame3d* pGeoFrame = GetGeoFrame3d( m_pGeomDB->GetGeoObj( m_CollObj[j].nFrameId)) ;
|
||||
if ( pGeoFrame == nullptr)
|
||||
continue ;
|
||||
// esecuzione controlli di collisione
|
||||
bool bOk = true ;
|
||||
Frame3d frObj = pGeoFrame->GetFrame() ;
|
||||
Frame3d frParent ; m_pGeomDB->GetGlobFrame( m_CollObj[j].nFrameId, frParent) ;
|
||||
frObj.LocToLoc( frParent, frCd) ;
|
||||
|
||||
Reference in New Issue
Block a user