EgtMachKernel :
- aggiunta lavorazione di mortasatura - aggiunt agestione angolo indeterminato su secondo asse rotante.
This commit is contained in:
+48
-12
@@ -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)) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user