EgtMachKernel :

- correzioni per calcolo posizione utensile fuori pezzo in fresatura
- ora GetElevation può gestire un offset della superficie utensile tramite il parametro dSafeDist.
This commit is contained in:
Dario Sassi
2024-05-24 12:47:03 +02:00
parent a31dfa3378
commit a3511ba89d
7 changed files with 70 additions and 106 deletions
+22 -7
View File
@@ -386,19 +386,34 @@ Operation::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool,
const Vector3d& vtDir, double& dElev) const
{
const double STD_TOOL_LEN = 100 ;
return GetElevation( nPhase, ptP, vtTool, dRad, STD_TOOL_LEN, vtDir, dElev) ;
return GetElevation( nPhase, ptP, vtTool, dRad, STD_TOOL_LEN, 0, vtDir, dElev) ;
}
//----------------------------------------------------------------------------
bool
Operation::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad, double dLen,
const Vector3d& vtDir, double& dElev) const
{
return GetElevation( nPhase, ptP, vtTool, dRad, dLen, 0, vtDir, dElev) ;
}
//----------------------------------------------------------------------------
bool
Operation::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool, double dRad, double dLen, double dSafeDist,
const Vector3d& vtDir, double& dElev) const
{
// risultato di default
dElev = 0 ;
// verifico oggetti base
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
// aggiustamenti per distanza di sicurezza
Point3d ptQ = ptP ;
if ( dSafeDist > EPS_SMALL) {
ptQ += -vtTool * dSafeDist ;
dRad += dSafeDist ;
dLen += 2 * dSafeDist ;
}
// inizializzo elevazioni per ogni grezzo
INTDBLVECTOR vRawElev ;
// ciclo sui grezzi della fase
@@ -414,25 +429,25 @@ Operation::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool,
Frame3d frStm ;
m_pGeomDB->GetGlobFrame( nStmId, frStm) ;
// porto posizione e direzioni in questo riferimento
Point3d ptPL = GetToLoc( ptP, frStm) ;
Point3d ptQL = GetToLoc( ptQ, frStm) ;
Vector3d vtToolL = GetToLoc( vtTool, frStm) ;
Vector3d vtDirL = GetToLoc( vtDir, frStm) ;
// determino quanto allontanarsi
PtrOwner<ICAvToolSurfTm> pCAvTlStm( CreateCAvToolSurfTm()) ;
if ( IsNull( pCAvTlStm))
return false ;
pCAvTlStm->SetStdTool( dLen, dRad, 0) ;
pCAvTlStm->SetStdTool( dLen, dRad, dSafeDist) ;
pCAvTlStm->SetSurfTm( *pStm) ;
double dDist = 0 ;
// non è ammesso un angolo oltre 90deg tra direzione utensile e vettore movimento
if ( vtToolL * vtDirL < 0) {
// il tip utensile è qui il naso mandrino per Collision Avoid
if ( ! pCAvTlStm->TestPosition( ptPL, -vtToolL, vtDirL, dDist))
if ( ! pCAvTlStm->TestPosition( ptQL, -vtToolL, vtDirL, dDist))
return false ;
}
else {
// per Collision Avoid il punto di riferimento non è il tip dell'utensile ma il naso mandrino
if ( ! pCAvTlStm->TestPosition( ptPL + dLen * vtToolL, vtToolL, vtDirL, dDist))
if ( ! pCAvTlStm->TestPosition( ptQL + dLen * vtToolL, vtToolL, vtDirL, dDist))
return false ;
}
if ( dDist > EPS_SMALL)
@@ -449,8 +464,8 @@ Operation::GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtTool,
{ return a.second < b.second ; }) ;
// box dell'utensile nella posizione iniziale
BBox3d b3Tool ;
b3Tool.Add( ptP) ;
b3Tool.Add( ptP + dLen * vtTool) ;
b3Tool.Add( ptQ) ;
b3Tool.Add( ptQ + dLen * vtTool) ;
if ( vtTool.IsX())
b3Tool.Expand( 0, dRad, dRad) ;
else if ( vtTool.IsY())