From 6d936dede47f530bda76d21e5f330e282fda0064 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 31 Oct 2024 18:31:49 +0100 Subject: [PATCH] EgtMachKernel : - aggiunta funzione SetFixtureMobile - migliorato controllo movimento morse (introdotti minimo e massimo). --- Disposition.cpp | 103 +++++++++++++++++++++++++++++++++++--------- Disposition.h | 1 + MachMgr.h | 1 + MachMgrFixtures.cpp | 12 ++++++ 4 files changed, 97 insertions(+), 20 deletions(-) diff --git a/Disposition.cpp b/Disposition.cpp index 5724dc4..89220dd 100644 --- a/Disposition.cpp +++ b/Disposition.cpp @@ -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 ; } } diff --git a/Disposition.h b/Disposition.h index 6b7ca6d..ce7cdea 100644 --- a/Disposition.h +++ b/Disposition.h @@ -109,6 +109,7 @@ class Disposition : public Operation bool MoveFixture( int nId, const Vector3d& vtMove) ; bool RotateFixture( int nId, double dDeltaAngDeg) ; bool MoveFixtureMobile( int nId, double dDeltaMov) ; + bool SetFixtureMobile( int nId, double dMov) ; bool PlaceFixture( int nId, const Point3d& ptPos, double dAngDeg, double dMov) ; bool RemoveFixture( int nId) ; bool MoveToCornerRawPart( int nRawId, const Point3d& ptP, int nFlag, bool bAddToList = true, bool bVerify = true) ; diff --git a/MachMgr.h b/MachMgr.h index c564bd4..e4d76bd 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -168,6 +168,7 @@ class MachMgr : public IMachMgr bool MoveFixture( int nId, const Vector3d& vtMove) override ; bool RotateFixture( int nId, double dDeltaAngDeg) override ; bool MoveFixtureMobile( int nId, double dDeltaMov) override ; + bool SetFixtureMobile( int nId, double dMov) override ; // Tools DataBase bool TdbGetToolNewName( std::string& sName) const override ; bool TdbAddTool( const std::string& sName, int nType) override ; diff --git a/MachMgrFixtures.cpp b/MachMgrFixtures.cpp index 50ddf00..d577329 100644 --- a/MachMgrFixtures.cpp +++ b/MachMgrFixtures.cpp @@ -312,6 +312,18 @@ MachMgr::MoveFixtureMobile( int nId, double dDeltaMov) return pDisp->MoveFixtureMobile( nId, dDeltaMov) ; } +//---------------------------------------------------------------------------- +bool +MachMgr::SetFixtureMobile( int nId, double dMov) +{ + // recupero l'oggetto disposizione corrente + Disposition* pDisp = ::GetDisposition( m_pGeomDB->GetUserObj( m_nCurrDispId)) ; + if ( pDisp == nullptr) + return false ; + // eseguo l'operazione + return pDisp->SetFixtureMobile( nId, dMov) ; +} + //---------------------------------------------------------------------------- bool MachMgr::VerifyFixtureInGroup( int nFxtId, bool bLinkedAllowed) const