EgtMachKernel :

- aggiunta lavorazione di mortasatura
- aggiunt agestione angolo indeterminato su secondo asse rotante.
This commit is contained in:
Dario Sassi
2018-02-28 09:35:51 +00:00
parent 1536d42f31
commit 6d324ba067
17 changed files with 2502 additions and 59 deletions
+48 -12
View File
@@ -577,8 +577,10 @@ Machine::GetKinematicRotAxisBlocked( int nInd, string& sName, double& dVal) cons
//----------------------------------------------------------------------------
bool
Machine::SetSolCh( int nScc)
Machine::SetSolCh( int nScc, bool bExact)
{
// imposto se richiesta verifica esatta
m_bSolChExact = bExact ;
// se standard o nullo o suo opposto
if ( nScc == MCH_SCC_STD || nScc == MCH_SCC_NONE || nScc == MCH_SCC_OPPOSITE) {
// recupero i dati della testa
@@ -781,6 +783,16 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
vtAx2.Invert() ;
// calcolo secondo angolo di rotazione
nStat = GetRotationComponent( vtDirHn, dCompTSuAxR1, vtAx1, vtAx2, dAngB1, dAngB2, bDet) ;
// se indeterminato con richiesta direzione ausiliaria esatta, ricalcolo con direzione aux
if ( nStat >= 1 && ! bDet && m_bSolChExact) {
// componente versore ausiliario desiderato su direzione primo asse rotante
Vector3d vtSccDir ;
if ( GetSccDir( m_nCalcSolCh, vtDirAn, vtSccDir)) {
double dCompASuAxR1 = vtSccDir * vtAx1 ;
// ricalcolo secondo angolo di rotazione
nStat = GetRotationComponent( vtDirIn, dCompASuAxR1, vtAx1, vtAx2, dAngB1, dAngB2, bDet) ;
}
}
// aggiornamento direzioni fresa e ausiliaria su testa
if ( nStat >= 1) {
// se indeterminato lo azzero
@@ -867,11 +879,11 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
// verifiche per criterio scelta soluzione
if ( nStat >= 2) {
if ( ! VerifyScc( vtDirI2, vtDirAn, m_nCalcSolCh))
if ( ! VerifyScc( vtDirI2, vtDirAn, m_nCalcSolCh, m_bSolChExact))
-- nStat ;
}
if ( nStat >= 1) {
if ( ! VerifyScc( vtDirI1, vtDirAn, m_nCalcSolCh)) {
if ( ! VerifyScc( vtDirI1, vtDirAn, m_nCalcSolCh, m_bSolChExact)) {
-- nStat ;
// riloco eventuale soluzione rimasta
if ( nStat >= 1) {
@@ -1165,27 +1177,51 @@ Machine::GetSccDir( int nSolCh, const Vector3d& vtDirA, Vector3d& vtDirScc) cons
//----------------------------------------------------------------------------
bool
Machine::VerifyScc( const Vector3d& vtDirI, const Vector3d& vtDirA, int nSolCh) const
Machine::VerifyScc( const Vector3d& vtDirI, const Vector3d& vtDirA, int nSolCh, bool bExact) const
{
switch ( nSolCh) {
default :
return true ;
case MCH_SCC_ADIR_XP :
return ( vtDirI.x > - EPS_ZERO) ;
if ( bExact)
return vtDirI.IsXplus() ;
else
return ( vtDirI.x > - EPS_ZERO) ;
case MCH_SCC_ADIR_XM :
return ( vtDirI.x < EPS_ZERO) ;
if ( bExact)
return vtDirI.IsXminus() ;
else
return ( vtDirI.x < EPS_ZERO) ;
case MCH_SCC_ADIR_YP :
return ( vtDirI.y > - EPS_ZERO) ;
if ( bExact)
return vtDirI.IsYplus() ;
else
return ( vtDirI.y > - EPS_ZERO) ;
case MCH_SCC_ADIR_YM :
return ( vtDirI.y < EPS_ZERO) ;
if ( bExact)
return vtDirI.IsYminus() ;
else
return ( vtDirI.y < EPS_ZERO) ;
case MCH_SCC_ADIR_ZP :
return ( vtDirI.z > - EPS_ZERO) ;
if ( bExact)
return vtDirI.IsZplus() ;
else
return ( vtDirI.z > - EPS_ZERO) ;
case MCH_SCC_ADIR_ZM :
return ( vtDirI.z < EPS_ZERO) ;
if ( bExact)
return vtDirI.IsZminus() ;
else
return ( vtDirI.z < EPS_ZERO) ;
case MCH_SCC_ADIR_NEAR :
return ( vtDirA.IsSmall() || ( vtDirI * vtDirA) > cos( 60 * DEGTORAD)) ;
if ( bExact)
return ( ! vtDirA.IsSmall() && ( vtDirI * vtDirA) > cos( 0.1 * DEGTORAD)) ;
else
return ( vtDirA.IsSmall() || ( vtDirI * vtDirA) > cos( 60 * DEGTORAD)) ;
case MCH_SCC_ADIR_FAR :
return ( vtDirA.IsSmall() || ( vtDirI * vtDirA) < cos( 120 * DEGTORAD)) ;
if ( bExact)
return ( ! vtDirA.IsSmall() && ( vtDirI * vtDirA) < cos( 179.1 * DEGTORAD)) ;
else
return ( vtDirA.IsSmall() || ( vtDirI * vtDirA) < cos( 120 * DEGTORAD)) ;
}
}