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:
+22
-7
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user