EgtMachKernel :
- aggiunta funzione SetFixtureMobile - migliorato controllo movimento morse (introdotti minimo e massimo).
This commit is contained in:
+83
-20
@@ -21,6 +21,7 @@
|
||||
#include "/EgtDev/Include/EGkAngle.h"
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
#include "/EgtDev/Include/EGkUserObjFactory.h"
|
||||
#include "/EgtDev/Include/EgtNumUtils.h"
|
||||
#include "/EgtDev/Include/EGnStringKeyVal.h"
|
||||
#include "/EgtDev/Include/EGnFileUtils.h"
|
||||
|
||||
@@ -726,20 +727,26 @@ Disposition::AddFixture( const string& sName, int nId, const Point3d& ptPos, dou
|
||||
return GDB_ID_NULL ;
|
||||
}
|
||||
// muovo eventuale parte mobile
|
||||
double dMovEff = dMov ;
|
||||
int nMobId = m_pGeomDB->GetFirstNameInGroup( nFixtId, FXT_MOBILE) ;
|
||||
if ( nMobId != GDB_ID_NULL) {
|
||||
double dMinVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MINPOS, dMinVal) ;
|
||||
double dMaxVal = INFINITO ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MAXPOS, dMaxVal) ;
|
||||
double dCurrVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_CPOS, dCurrVal) ;
|
||||
if ( abs( dMov - dCurrVal) > EPS_SMALL) {
|
||||
dMovEff = Clamp( dMov, dMinVal, dMaxVal) ;
|
||||
if ( abs( dMovEff - dCurrVal) > EPS_SMALL) {
|
||||
Vector3d vtDir = Z_AX ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MOVEDIR, vtDir) ;
|
||||
m_pGeomDB->TranslateGroup( nMobId, (dMov - dCurrVal) * vtDir) ;
|
||||
m_pGeomDB->SetInfo( nMobId, FXT_MOB_CPOS, dMov) ;
|
||||
m_pGeomDB->TranslateGroup( nMobId, ( dMovEff - dCurrVal) * vtDir) ;
|
||||
m_pGeomDB->SetInfo( nMobId, FXT_MOB_CPOS, dMovEff) ;
|
||||
}
|
||||
}
|
||||
// se da aggiungere alla lista
|
||||
if ( bAddToList) {
|
||||
m_vFixData.emplace_back( sName, nFixtId, ptPos, dAngDeg, dMov) ;
|
||||
m_vFixData.emplace_back( sName, nFixtId, ptPos, dAngDeg, dMovEff) ;
|
||||
m_nStatus |= MCH_ST_GEO_MODIF ;
|
||||
}
|
||||
return nFixtId ;
|
||||
@@ -853,22 +860,72 @@ Disposition::MoveFixtureMobile( int nId, double dDeltaMov)
|
||||
// verifico aggiornamento tavola
|
||||
if ( ! m_bTabOk && ! SetTable( m_sTabName))
|
||||
return false ;
|
||||
// muovo eventuale parte mobile
|
||||
// recupero la parte mobile
|
||||
int nMobId = m_pGeomDB->GetFirstNameInGroup( nId, FXT_MOBILE) ;
|
||||
if ( nMobId != GDB_ID_NULL) {
|
||||
double dCurrVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_CPOS, dCurrVal) ;
|
||||
if ( abs( dDeltaMov) > EPS_SMALL) {
|
||||
Vector3d vtDir = Z_AX ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MOVEDIR, vtDir) ;
|
||||
m_pGeomDB->TranslateGroup( nMobId, dDeltaMov * vtDir) ;
|
||||
m_pGeomDB->SetInfo( nMobId, FXT_MOB_CPOS, ( dCurrVal + dDeltaMov)) ;
|
||||
}
|
||||
}
|
||||
if ( nMobId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// recupero limiti di corsa e posizione
|
||||
double dMinVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MINPOS, dMinVal) ;
|
||||
double dMaxVal = INFINITO ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MAXPOS, dMaxVal) ;
|
||||
double dCurrVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_CPOS, dCurrVal) ;
|
||||
// verifico movimento richiesto e fattibile non nullo
|
||||
double dDeltaEff = Clamp( dCurrVal + dDeltaMov, dMinVal, dMaxVal) - dCurrVal ;
|
||||
if ( abs( dDeltaEff) < EPS_SMALL)
|
||||
return true ;
|
||||
// eseguo il movimento
|
||||
Vector3d vtDir = Z_AX ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MOVEDIR, vtDir) ;
|
||||
m_pGeomDB->TranslateGroup( nMobId, dDeltaEff * vtDir) ;
|
||||
m_pGeomDB->SetInfo( nMobId, FXT_MOB_CPOS, ( dCurrVal + dDeltaEff)) ;
|
||||
// aggiorno la posizione dell'oggetto nel vettore dei comandi
|
||||
for ( auto& FixData : m_vFixData) {
|
||||
if ( FixData.nId == nId) {
|
||||
FixData.dMov += dDeltaMov ;
|
||||
FixData.dMov += dDeltaEff ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
// imposto stato a modificato
|
||||
m_nStatus |= MCH_ST_PARAM_MODIF ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Disposition::SetFixtureMobile( int nId, double dMov)
|
||||
{
|
||||
// verifica validità sottopezzo
|
||||
if ( m_pMchMgr == nullptr || ! m_pMchMgr->VerifyFixtureInGroup( nId, false))
|
||||
return false ;
|
||||
// verifico aggiornamento tavola
|
||||
if ( ! m_bTabOk && ! SetTable( m_sTabName))
|
||||
return false ;
|
||||
// recupero la parte mobile
|
||||
int nMobId = m_pGeomDB->GetFirstNameInGroup( nId, FXT_MOBILE) ;
|
||||
if ( nMobId == GDB_ID_NULL)
|
||||
return false ;
|
||||
// recupero limiti di corsa e posizione
|
||||
double dMinVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MINPOS, dMinVal) ;
|
||||
double dMaxVal = INFINITO ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MAXPOS, dMaxVal) ;
|
||||
double dCurrVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_CPOS, dCurrVal) ;
|
||||
// verifico movimento richiesto e fattibile non nullo
|
||||
double dMovEff = Clamp( dMov, dMinVal, dMaxVal) ;
|
||||
if ( abs( dMovEff - dCurrVal) < EPS_SMALL)
|
||||
return true ;
|
||||
// eseguo il movimento
|
||||
Vector3d vtDir = Z_AX ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MOVEDIR, vtDir) ;
|
||||
m_pGeomDB->TranslateGroup( nMobId, ( dMovEff - dCurrVal) * vtDir) ;
|
||||
m_pGeomDB->SetInfo( nMobId, FXT_MOB_CPOS, dMovEff) ;
|
||||
// aggiorno la posizione dell'oggetto nel vettore dei comandi
|
||||
for ( auto& FixData : m_vFixData) {
|
||||
if ( FixData.nId == nId) {
|
||||
FixData.dMov = dMovEff ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
@@ -916,15 +973,21 @@ Disposition::PlaceFixture( int nId, const Point3d& ptPos, double dAngDeg, double
|
||||
if ( abs( dAngDeg) > EPS_ANG_SMALL)
|
||||
m_pGeomDB->RotateGroup( nId, ORIG, Z_AX, dAngDeg) ;
|
||||
// muovo eventuale parte mobile
|
||||
double dMovEff = dMov ;
|
||||
int nMobId = m_pGeomDB->GetFirstNameInGroup( nId, FXT_MOBILE) ;
|
||||
if ( nMobId != GDB_ID_NULL) {
|
||||
double dMinVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MINPOS, dMinVal) ;
|
||||
double dMaxVal = INFINITO ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MAXPOS, dMaxVal) ;
|
||||
double dCurrVal = 0 ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_CPOS, dCurrVal) ;
|
||||
if ( abs( dMov - dCurrVal) > EPS_SMALL) {
|
||||
dMovEff = Clamp( dMov, dMinVal, dMaxVal) ;
|
||||
if ( abs( dMovEff - dCurrVal) > EPS_SMALL) {
|
||||
Vector3d vtDir = Z_AX ;
|
||||
m_pGeomDB->GetInfo( nMobId, FXT_MOB_MOVEDIR, vtDir) ;
|
||||
m_pGeomDB->TranslateGroup( nMobId, ( dMov - dCurrVal) * vtDir) ;
|
||||
m_pGeomDB->SetInfo( nMobId, FXT_MOB_CPOS, dMov) ;
|
||||
m_pGeomDB->TranslateGroup( nMobId, ( dMovEff - dCurrVal) * vtDir) ;
|
||||
m_pGeomDB->SetInfo( nMobId, FXT_MOB_CPOS, dMovEff) ;
|
||||
}
|
||||
}
|
||||
// aggiorno la posizione dell'oggetto nel vettore dei comandi
|
||||
@@ -932,7 +995,7 @@ Disposition::PlaceFixture( int nId, const Point3d& ptPos, double dAngDeg, double
|
||||
if ( FixData.nId == nId) {
|
||||
FixData.ptPos = ptPos ;
|
||||
FixData.dAng = dAngDeg ;
|
||||
FixData.dMov = dMov ;
|
||||
FixData.dMov = dMovEff ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user