diff --git a/Chiseling.cpp b/Chiseling.cpp index e606838..3efbd0a 100644 --- a/Chiseling.cpp +++ b/Chiseling.cpp @@ -84,6 +84,7 @@ Chiseling::Clone( void) const pChisel->m_nPhase = m_nPhase ; pChisel->m_Params = m_Params ; pChisel->m_TParams = m_TParams ; + pChisel->m_nStatus = m_nStatus ; pChisel->m_nChisels = m_nChisels ; } catch( ...) { @@ -107,6 +108,7 @@ Chiseling::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nChisels) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -116,7 +118,7 @@ bool Chiseling::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -129,6 +131,8 @@ Chiseling::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nChisels, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -169,7 +173,7 @@ Chiseling::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -177,6 +181,10 @@ Chiseling::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nChisels)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -189,6 +197,7 @@ Chiseling::Chiseling( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nChisels = 0 ; } @@ -227,9 +236,13 @@ Chiseling::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; case MPA_TOOLINVERT : + if ( bVal != m_Params.m_bToolInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bToolInvert = bVal ; return true ; } @@ -244,11 +257,15 @@ Chiseling::SetParam( int nType, int nVal) case MPA_WORKSIDE : if ( ! m_Params.VerifyWorkSide( nVal)) return false ; + if ( nVal != m_Params.m_nWorkSide) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nWorkSide = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; } @@ -262,47 +279,63 @@ Chiseling::SetParam( int nType, double dVal) switch ( nType) { case MPA_FEED : if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_ENDFEED : if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dEndFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dTipFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_OFFSR : if ( abs( m_TParams.m_dOffsR - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsR = UNKNOWN_PAR ; - else - m_Params.m_dOffsR = dVal ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsR) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; case MPA_OFFSL : if ( abs( m_TParams.m_dOffsL - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsL = UNKNOWN_PAR ; - else - m_Params.m_dOffsL = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsL) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsL = dVal ; return true ; + case MPA_DEPTH: { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( abs( dVal - m_Params.m_dStartPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_STEP : + if ( abs( dVal - m_Params.m_dStep) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_RETURNPOS : + if ( abs( dVal - m_Params.m_dReturnPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dReturnPos = dVal ; return true ; case MPA_ENDADDLEN : + if ( abs( dVal - m_Params.m_dEndAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndAddLen = dVal ; return true ; } @@ -318,29 +351,39 @@ Chiseling::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; - } break ; + } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; - default : - return false ; + return true ; } - return true ; + return false ; } //---------------------------------------------------------------------------- @@ -365,6 +408,9 @@ Chiseling::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty() || vIds.empty()) ; } @@ -437,12 +483,29 @@ bool Chiseling::Apply( bool bRecalc, bool bPostApply) { // reset numero scalpellature generate + int nCurrChisels = m_nChisels ; m_nChisels = 0 ; // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2901, "Error in Chiseling : UpdateToolData failed") ; + return false ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nChisels = nCurrChisels ; + LOG_INFO( GetEMkLogger(), "Chiseling apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; bool bChain = false ; @@ -461,12 +524,6 @@ Chiseling::Apply( bool bRecalc, bool bPostApply) bChain = true ; } - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2901, "Error in Chiseling : UpdateToolData failed") ; - return false ; - } - // se necessario, eseguo concatenamento ed inserisco i percorsi sotto la geometria ausiliaria if ( bChain && ! Chain( nAuxId)) { m_pMchMgr->SetLastError( 2907, "Error in Chiseling : Chaining failed") ; @@ -501,7 +558,15 @@ Chiseling::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/Chiseling.h b/Chiseling.h index 09fcdf8..a3dd3fb 100644 --- a/Chiseling.h +++ b/Chiseling.h @@ -39,6 +39,8 @@ class Chiseling : public Machining { return OPER_CHISELING ; } bool IsEmpty( void) const override { return ( m_nChisels == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -91,5 +93,6 @@ class Chiseling : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare ChiselingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nChisels ; // numero di scalpellature generati } ; \ No newline at end of file diff --git a/Disposition.cpp b/Disposition.cpp index c604176..c8bd2c7 100644 --- a/Disposition.cpp +++ b/Disposition.cpp @@ -92,6 +92,7 @@ Disposition::Clone( void) const pDisp->m_sHead = m_sHead ; pDisp->m_nExit = m_nExit ; pDisp->m_sTcPos = m_sTcPos ; + pDisp->m_nStatus = m_nStatus ; pDisp->m_nShifts = m_nShifts ; pDisp->m_bSomeByHand = m_bSomeByHand ; } @@ -109,11 +110,11 @@ bool Disposition::Dump( string& sOut, bool bMM, const char* szNewLine) const { sOut += GetClassName() + "[mm]" + szNewLine ; - sOut += "Tab=" + m_sTabName + ( m_bTabOk ? " (ok)" : " (to verify)") + szNewLine ; - sOut += "Phase=" + ToString( m_nPhase) + szNewLine ; - sOut += "Ref1=(" + ToString( m_ptRef1, 3) + ")" + szNewLine ; - sOut += "Area1=(" + ToString( m_b3Area1, 3) + ")" + szNewLine ; - sOut += "Area1Offs=" + ToString( m_dAreaOffset) + szNewLine ; + sOut += DIS_TABLE + EQUAL + m_sTabName + ( m_bTabOk ? " (ok)" : " (to verify)") + szNewLine ; + sOut += DIS_PHASE + EQUAL + ToString( m_nPhase) + szNewLine ; + sOut += DIS_REF1 + EQUAL + "(" + ToString( m_ptRef1, 3) + ")" + szNewLine ; + sOut += DIS_AREA1 + EQUAL + "(" + ToString( m_b3Area1, 3) + ")" + szNewLine ; + sOut += DIS_AREA1_OFFS + EQUAL + "(" + ToString( m_dAreaOffset) + szNewLine ; for ( const auto& FixData : m_vFixData) { sOut += "FxD=" + FixData.sName + "," + ToString( FixData.nId) + ",(" + @@ -138,11 +139,12 @@ Disposition::Dump( string& sOut, bool bMM, const char* szNewLine) const break ; } } - sOut += "Num=" + ToString( m_nShifts) + szNewLine ; - sOut += "Head=" + m_sHead + szNewLine ; - sOut += "Exit=" + ToString( m_nExit) + szNewLine ; - sOut += "TcPos=" + m_sTcPos + szNewLine ; - sOut += "ByHand=" + ToString( m_bSomeByHand) + szNewLine ; + sOut += DIS_NUM + EQUAL + ToString( m_nShifts) + szNewLine ; + sOut += DIS_HEAD + EQUAL + m_sHead + szNewLine ; + sOut += DIS_EXIT + EQUAL + ToString( m_nExit) + szNewLine ; + sOut += DIS_TCPOS + EQUAL + m_sTcPos + szNewLine ; + sOut += DIS_SOMEBYHAND + EQUAL + ToString( m_bSomeByHand) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -156,7 +158,7 @@ Disposition::Save( int nBaseId, STRVECTOR& vString) const int nFxdLines = 1 + 4 * nFxdTot ; int nMvdTot = int( m_vMvrData.size()) ; int nMvdLines = 1 + 4 * nMvdTot ; - int nOther = 6 ; + int nOther = 7 ; vString.insert( vString.begin(), 4 + nFxdLines + nMvdLines + nOther, "") ; // Nome if ( ! SetVal( DIS_TABLE, m_sTabName, vString[++k])) @@ -203,6 +205,8 @@ Disposition::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( DIS_AREA1_OFFS, m_dAreaOffset, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; } return true ; @@ -289,13 +293,17 @@ Disposition::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! GetVal( vString[++k], DIS_AREA1_OFFS, m_dAreaOffset)) return false ; } + if ( k + 1 < int( vString.size())) { + if ( ! GetVal( vString[++k], KEY_STAT, m_nStatus)) + return false ; + } return true ; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- Disposition::Disposition( void) - : m_bTabOk( false), m_nExit( 0), m_nShifts( 0), m_bSomeByHand( false), m_dAreaOffset({{0,0,0,0}}) + : m_bTabOk( false), m_nExit( 0), m_nStatus( MCH_ST_TO_VERIFY), m_nShifts( 0), m_bSomeByHand( false), m_dAreaOffset({{0,0,0,0}}) { } @@ -594,8 +602,10 @@ Disposition::AddFixture( const string& sName, const Point3d& ptPos, double dAngD } } // se da aggiungere alla lista - if ( bAddToList) + if ( bAddToList) { m_vFixData.emplace_back( sName, nFixtId, ptPos, dAngDeg, dMov) ; + m_nStatus |= MCH_ST_GEO_MODIF ; + } return nFixtId ; } @@ -668,6 +678,8 @@ Disposition::MoveFixture( int nId, const Vector3d& vtMove) break ; } } + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; return true ; } @@ -690,6 +702,8 @@ Disposition::RotateFixture( int nId, double dDeltaAngDeg) break ; } } + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; return true ; } @@ -720,6 +734,8 @@ Disposition::MoveFixtureMobile( int nId, double dDeltaMov) break ; } } + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; return true ; } @@ -813,6 +829,8 @@ Disposition::RemoveFixture( int nId) else m_vFixData.erase( iIter) ; } + // imposto stato a modificato + m_nStatus |= MCH_ST_GEO_MODIF ; return true ; } @@ -859,8 +877,11 @@ Disposition::MoveToCornerRawPart( int nRawId, const Point3d& ptP, int nFlag, boo if ( ! vtTotMove.IsSmall()) m_pGeomDB->TranslateGlob( nRawId, vtTotMove) ; // se da aggiungere alla lista - if ( bAddToList) + if ( bAddToList) { InsertMoveInfoInList( nRawId, MoveRawData::COR, ptP, nFlag) ; + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; + } return true ; } @@ -913,8 +934,11 @@ Disposition::MoveToCenterRawPart( int nRawId, const Point3d& ptP, int nFlag, boo if ( ! vtTotMove.IsSmall()) m_pGeomDB->TranslateGlob( nRawId, vtTotMove) ; // se da aggiungere alla lista - if ( bAddToList) + if ( bAddToList) { InsertMoveInfoInList( nRawId, MoveRawData::CEN, ptP, nFlag) ; + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; + } return true ; } @@ -955,6 +979,8 @@ Disposition::MoveRawPart( int nRawId, const Vector3d& vtMove) m_pGeomDB->TranslateGlob( nRawId, vtMove) ; // aggiorno comando di movimento rTras->ptP += vtMove ; + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; return true ; } @@ -1055,6 +1081,8 @@ Disposition::RotateRawPart( int nRawId, const Vector3d& vtAx, double dAngRotDeg) // aggiungo o modifico nella lista InsertMoveInfoInList( nRawId, MoveRawData::ROT, Point3d( dAngCDeg, dAngADeg, dAngC1Deg), 0) ; } + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; return true ; } @@ -1084,6 +1112,8 @@ Disposition::ApplyRotationToRawPart( int nRawId, double dAngCDeg, double dAngADe if ( bAddToList) { // non ci sono problemi di compensazione della traslazione perchè già processata precedentemente in RotateRawPart InsertMoveInfoInList( nRawId, MoveRawData::ROT, Point3d( dAngCDeg, dAngADeg, dAngC1Deg), 0) ; + // imposto stato a modificato + m_nStatus |= MCH_ST_PARAM_MODIF ; } return true ; } @@ -1163,6 +1193,8 @@ Disposition::RemoveRawPart( int nRawId) else m_vMvrData.erase( iIter) ; } + // imposto stato a modificato + m_nStatus |= MCH_ST_GEO_MODIF ; return true ; } @@ -1211,6 +1243,7 @@ Disposition::SpecialApply( bool bRecalc) // reset m_sHead.clear() ; m_nExit = 0 ; + int nCurrShifts = m_nShifts ; m_nShifts = 0 ; m_bSomeByHand = false ; m_sTcPos.clear() ; @@ -1219,6 +1252,26 @@ Disposition::SpecialApply( bool bRecalc) if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) return false ; + // recupero la macchina corrente + Machine* pMch = m_pMchMgr->GetCurrMachine() ; + if ( pMch == nullptr) + return false ; + + // se non esiste la funzione, non devo fare alcunché + static const string ON_SPECIAL_APPLY = "OnSpecialApplyDisposition" ; + if ( ! pMch->LuaExistsFunction( ON_SPECIAL_APPLY)) { + m_nStatus = MCH_ST_OK ; + return true ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && m_nStatus == MCH_ST_OK) { + m_nShifts = nCurrShifts ; + LOG_INFO( GetEMkLogger(), "Disposition postapply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // costanti static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo static const string EVAR_TABNAME = ".TABNAME" ; // IN (string) nome della tavola macchina @@ -1230,16 +1283,6 @@ Disposition::SpecialApply( bool bRecalc) static const string EVAR_TCPOS = ".TCPOS" ; // OUT (string) nome della posizione nel TC static const string EVAR_SHIFTS = ".SHIFTS" ; // OUT (int) numero di movimenti eseguiti static const string EVAR_SBH = ".SBH" ; // OUT (bool) flag presenza operazioni manuali - static const string ON_SPECIAL_APPLY = "OnSpecialApplyDisposition" ; - - // recupero la macchina corrente - Machine* pMch = m_pMchMgr->GetCurrMachine() ; - if ( pMch == nullptr) - return false ; - - // se non esiste la funzione, non devo fare alcunché - if ( ! pMch->LuaExistsFunction( ON_SPECIAL_APPLY)) - return true ; // eseguo l'azione bool bOk = true ; @@ -1273,7 +1316,13 @@ Disposition::SpecialApply( bool bRecalc) } // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return SpecialUpdate() ; + if ( ! SpecialUpdate()) + return false ; + + // aggiorno stato + m_nStatus = MCH_ST_OK ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/Disposition.h b/Disposition.h index dafeda1..ebb4a54 100644 --- a/Disposition.h +++ b/Disposition.h @@ -62,6 +62,8 @@ class Disposition : public Operation { return OPER_DISP ; } bool IsEmpty( void) const override { return ( m_nShifts == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation const std::string& GetToolName( void) const override ; @@ -126,6 +128,7 @@ class Disposition : public Operation std::string m_sHead ; // eventuale testa usata per muovere i pezzi int m_nExit ; // eventuale uscita sulla testa std::string m_sTcPos ; // eventuale posizione nel cambiautensili + int m_nStatus ; // stato di aggiornamento degli eventuali spostamenti con testa int m_nShifts ; // numero eventuali spostamenti con testa bool m_bSomeByHand ; // presenza di operazioni manuali (anche in aggiunta ad automatiche) } ; diff --git a/Drilling.cpp b/Drilling.cpp index 5d12a58..5e6128d 100644 --- a/Drilling.cpp +++ b/Drilling.cpp @@ -84,6 +84,7 @@ Drilling::Clone( void) const pDri->m_nPhase = m_nPhase ; pDri->m_Params = m_Params ; pDri->m_TParams = m_TParams ; + pDri->m_nStatus = m_nStatus ; pDri->m_nDrillings = m_nDrillings ; } catch( ...) { @@ -107,6 +108,7 @@ Drilling::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nDrillings) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -116,7 +118,7 @@ bool Drilling::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -129,6 +131,8 @@ Drilling::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nDrillings, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -169,7 +173,7 @@ Drilling::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -177,6 +181,10 @@ Drilling::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nDrillings)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -189,6 +197,7 @@ Drilling::Drilling( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nDrillings = 0 ; m_bAggrBottom = false ; m_dDistBottom = 0 ; @@ -229,6 +238,8 @@ Drilling::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; } @@ -241,11 +252,15 @@ Drilling::SetParam( int nType, int nVal) { switch ( nType) { case MPA_SUBTYPE : + if ( nVal != m_Params.m_nSubType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSubType = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; } @@ -261,67 +276,97 @@ Drilling::SetParam( int nType, double dVal) if ( ! m_TParams.VerifySpeed( dVal)) return false ; if ( abs( m_TParams.m_dSpeed - dVal) < EPS_MACH_ANG_PAR) - m_Params.m_dSpeed = 0 ; - else - m_Params.m_dSpeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dSpeed) > EPS_MACH_ANG_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : if ( abs( m_TParams.m_dStartFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dStartFeed = 0 ; - else - m_Params.m_dStartFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dStartFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dEndFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ::ToString( dVal) ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dTipFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; + case MPA_DEPTH : { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( abs( dVal - m_Params.m_dStartPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_STARTSLOWLEN : + if ( abs( dVal - m_Params.m_dStartSlowLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartSlowLen = dVal ; return true ; case MPA_ENDSLOWLEN : + if ( abs( dVal - m_Params.m_dEndSlowLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndSlowLen = dVal ; return true ; case MPA_THROUADDLEN : + if ( abs( dVal - m_Params.m_dThroughAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dThroughAddLen = dVal ; return true ; case MPA_STEP : + if ( abs( dVal - m_Params.m_dStep) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_RETURNPOS : + if ( abs( dVal - m_Params.m_dReturnPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dReturnPos = dVal ; return true ; - case MPA_OVERLAP : - m_Params.m_sOverlap = ::ToString( dVal) ; - return true ; + case MPA_OVERLAP : { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sOverlap) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sOverlap = sVal ; + } return true ; case MPA_STARTADDLEN : + if ( abs( dVal - m_Params.m_dStartAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartAddLen = dVal ; return true ; case MPA_ENDADDLEN : + if ( abs( dVal - m_Params.m_dEndAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndAddLen = dVal ; return true ; - case MPA_OFFSET : - m_Params.m_sOffset = ::ToString( dVal) ; - return true ; + case MPA_OFFSET : { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sOverlap) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sOffset = sVal ; + } return true ; } return false ; } @@ -335,31 +380,47 @@ Drilling::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; return true ; case MPA_OVERLAP_STR : + if ( sVal != m_Params.m_sOverlap) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sOverlap = sVal ; return true ; case MPA_OFFSET_STR : + if ( sVal != m_Params.m_sOffset) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sOffset = sVal ; return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; + return true ; } return false ; } @@ -403,7 +464,9 @@ Drilling::SetGeometry( const SELVECTOR& vIds) m_vId.push_back( vIds[i]) ; } } - // verifico di aver inserito qualcosa + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty()) ; } @@ -451,12 +514,29 @@ bool Drilling::Apply( bool bRecalc, bool bPostApply) { // reset numero forature nella lavorazione + int nCurrDrillings = m_nDrillings ; m_nDrillings = 0 ; // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2101, "Error in Drilling : UpdateToolData failed") ; + return false ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nDrillings = nCurrDrillings ; + LOG_INFO( GetEMkLogger(), "Drilling apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria di lavorazione (Cutter Location) int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ; // se non c'è, lo aggiungo @@ -470,12 +550,6 @@ Drilling::Apply( bool bRecalc, bool bPostApply) else m_pGeomDB->EmptyGroup( nClId) ; - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2101, "Error in Drilling : UpdateToolData failed") ; - return false ; - } - // se lavorazione standard if ( m_Params.m_nSubType == DRI_SUB_STD) { if ( ! StdandardProcess( bRecalc, GDB_ID_NULL, nClId)) @@ -494,7 +568,15 @@ Drilling::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/Drilling.h b/Drilling.h index f72eba1..60dd019 100644 --- a/Drilling.h +++ b/Drilling.h @@ -38,6 +38,8 @@ class Drilling : public Machining { return OPER_DRILLING ; } bool IsEmpty( void) const override { return ( m_nDrillings == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -95,6 +97,7 @@ class Drilling : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare DrillingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nDrillings ; // numero di fori generati bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 0daef95..86a0d38 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/GenMachining.cpp b/GenMachining.cpp index e0efbd2..da2d9c7 100644 --- a/GenMachining.cpp +++ b/GenMachining.cpp @@ -81,8 +81,13 @@ GenMachining::Clone( void) const // eseguo copia dei dati if ( pGenM != nullptr) { try { + pGenM->m_vId = m_vId ; + pGenM->m_pMchMgr = m_pMchMgr ; + pGenM->m_nPhase = m_nPhase ; pGenM->m_Params = m_Params ; pGenM->m_TParams = m_TParams ; + pGenM->m_nStatus = m_nStatus ; + pGenM->m_nMills = m_nMills ; } catch( ...) { delete pGenM ; @@ -105,6 +110,7 @@ GenMachining::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nMills) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -114,7 +120,7 @@ bool GenMachining::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -127,6 +133,8 @@ GenMachining::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nMills, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -167,7 +175,7 @@ GenMachining::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -175,6 +183,10 @@ GenMachining::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nMills)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -187,6 +199,7 @@ GenMachining::GenMachining( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nMills = 0 ; } @@ -225,9 +238,13 @@ GenMachining::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; case MPA_TOOLINVERT : + if ( bVal != m_Params.m_bToolInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bToolInvert = bVal ; return true ; } @@ -242,9 +259,13 @@ GenMachining::SetParam( int nType, int nVal) case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; case MPA_SUBTYPE : + if ( nVal != m_Params.m_nSubType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSubType = nVal ; return true ; } @@ -260,50 +281,62 @@ GenMachining::SetParam( int nType, double dVal) if ( ! m_TParams.VerifySpeed( dVal)) return false ; if ( abs( m_TParams.m_dSpeed - dVal) < EPS_MACH_ANG_PAR) - m_Params.m_dSpeed = 0 ; - else - m_Params.m_dSpeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dSpeed) > EPS_MACH_ANG_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : if ( abs( m_TParams.m_dStartFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dStartFeed = 0 ; - else - m_Params.m_dStartFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dStartFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dEndFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dTipFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_OFFSR : if ( abs( m_TParams.m_dOffsR - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsR = UNKNOWN_PAR ; - else - m_Params.m_dOffsR = dVal ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsR) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; case MPA_OFFSL : if ( abs( m_TParams.m_dOffsL - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsL = UNKNOWN_PAR ; - else - m_Params.m_dOffsL = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsL) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsL = dVal ; return true ; + case MPA_DEPTH: { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( abs( dVal - m_Params.m_dStartPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; } @@ -319,29 +352,39 @@ GenMachining::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; - } break ; + } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; - default : - return false ; + return true ; } - return true ; + return false ; } //---------------------------------------------------------------------------- @@ -366,6 +409,9 @@ GenMachining::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty() || vIds.empty()) ; } @@ -460,6 +506,7 @@ bool GenMachining::Apply( bool bRecalc, bool bPostApply) { // reset numero percorsi di lavoro generati + int nCurrMills = m_nMills ; m_nMills = 0 ; // verifico validità gestore DB geometrico e Id del gruppo @@ -467,11 +514,21 @@ GenMachining::Apply( bool bRecalc, bool bPostApply) return false ; // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { m_pMchMgr->SetLastError( 2801, "Error in GenMachining : UpdateToolData failed") ; return false ; } + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nMills = nCurrMills ; + LOG_INFO( GetEMkLogger(), "GenMachining apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria di lavorazione (Cutter Location) int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ; // se non c'è, lo aggiungo @@ -542,7 +599,15 @@ GenMachining::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/GenMachining.h b/GenMachining.h index 04ab4e3..d0ad5df 100644 --- a/GenMachining.h +++ b/GenMachining.h @@ -37,6 +37,8 @@ class GenMachining : public Machining { return OPER_GENMACHINING ; } bool IsEmpty( void) const override { return ( m_nMills == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -86,5 +88,6 @@ class GenMachining : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare GenMachiningData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nMills ; // numero di percorsi di lavoro generati } ; \ No newline at end of file diff --git a/MachMgrOperations.cpp b/MachMgrOperations.cpp index 6f13b86..30bec39 100644 --- a/MachMgrOperations.cpp +++ b/MachMgrOperations.cpp @@ -352,8 +352,34 @@ MachMgr::SetOperationMode( int nId, bool bActive) // verifico sia una Operazione if ( GetOperationType( nId) == OPER_NULL) return false ; + // recupero lo stato di attivazione corrente + int nMode ; + if ( ! m_pGeomDB->GetMode( nId, nMode)) + return false ; + bool bPrevActive = ( nMode == GDB_MD_STD) ; // eseguo attivazione/disattivazione m_pGeomDB->SetMode( nId, ( bActive ? GDB_MD_STD : GDB_MD_HIDDEN)) ; + // se non cambia l'attivazione, esco + if ( bActive == bPrevActive) + return true ; + // dichiaro da aggiornare questa lavorazione + Operation* pOpe = GetOperation( m_pGeomDB->GetUserObj( nId)) ; + if ( pOpe != nullptr) + pOpe->UpdateStatus( MCH_ST_OTH_MODIF) ; + // da aggiornare post apply della precedente attiva + int nOpeId = GetPrevActiveOperation( nId) ; + if ( nOpeId != GDB_ID_NULL) { + Operation* pOpe = GetOperation( m_pGeomDB->GetUserObj( nOpeId)) ; + if ( pOpe != nullptr) + pOpe->UpdateStatus( MCH_ST_NO_POSTAPPL) ; + } + // forzo aggiornamento della successiva, le altre seguiranno automaticamente + nOpeId = GetNextActiveOperation( nId) ; + if ( nOpeId != GDB_ID_NULL) { + Operation* pOpe = GetOperation( m_pGeomDB->GetUserObj( nOpeId)) ; + if ( pOpe != nullptr) + pOpe->UpdateStatus( MCH_ST_OTH_MODIF) ; + } return true ; } diff --git a/MachiningConst.h b/MachiningConst.h index 78b3ecc..ca00b57 100644 --- a/MachiningConst.h +++ b/MachiningConst.h @@ -25,6 +25,15 @@ const double EPS_MACH_ANG_PAR = 10 * EPS_ANG_SMALL ; // Valore parametro lavorazione non inizializzato const double UNKNOWN_PAR = 9999999 ; +//---------------------------------------------------------------------------- +// Costanti per stato lavorazione +enum Mch_Status { MCH_ST_OK = 0, + MCH_ST_NO_POSTAPPL = 1, + MCH_ST_TO_VERIFY = 2, + MCH_ST_GEO_MODIF = 4, + MCH_ST_PARAM_MODIF = 8, + MCH_ST_OTH_MODIF = 16} ; + //---------------------------------------------------------------------------- inline bool AreSameLenValue( double dLen1, double dLen2) diff --git a/Milling.cpp b/Milling.cpp index cdf645c..ea6577b 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -83,6 +83,7 @@ Milling::Clone( void) const pMill->m_nPhase = m_nPhase ; pMill->m_Params = m_Params ; pMill->m_TParams = m_TParams ; + pMill->m_nStatus = m_nStatus ; pMill->m_nMills = m_nMills ; } catch( ...) { @@ -106,6 +107,7 @@ Milling::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nMills) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -115,7 +117,7 @@ bool Milling::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -128,6 +130,8 @@ Milling::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nMills, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -168,7 +172,7 @@ Milling::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -176,6 +180,10 @@ Milling::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nMills)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -190,6 +198,7 @@ Milling::Milling( void) m_TParams.m_sHead = "*" ; m_dTHoldLen = 0 ; m_dTHoldDiam = 0 ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nMills = 0 ; m_bStepOn = false ; m_nHeadSolCh = MCH_SCC_NONE ; @@ -231,12 +240,18 @@ Milling::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; case MPA_LEAVETAB : + if ( bVal != m_Params.m_bLeaveTab) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bLeaveTab = bVal ; return true ; case MPA_TOOLINVERT : + if ( bVal != m_Params.m_bToolInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bToolInvert = bVal ; return true ; } @@ -251,31 +266,43 @@ Milling::SetParam( int nType, int nVal) case MPA_WORKSIDE : if ( ! m_Params.VerifyWorkSide( nVal)) return false ; + if ( nVal != m_Params.m_nWorkSide) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nWorkSide = nVal ; return true ; case MPA_STEPTYPE : if ( ! m_Params.VerifyStepType( nVal)) return false ; + if ( nVal != m_Params.m_nStepType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nStepType = nVal ; return true ; case MPA_LEADINTYPE : if ( ! m_Params.VerifyLeadInType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadInType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadInType = nVal ; return true ; case MPA_LEADOUTTYPE : if ( ! m_Params.VerifyLeadOutType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadOutType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadOutType = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; case MPA_FACEUSE : if ( ! m_Params.VerifyFaceUse( nVal)) return false ; + if ( nVal != m_Params.m_nFaceUse) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nFaceUse = nVal ; return true ; } @@ -291,86 +318,122 @@ Milling::SetParam( int nType, double dVal) if ( ! m_TParams.VerifySpeed( dVal)) return false ; if ( abs( m_TParams.m_dSpeed - dVal) < EPS_MACH_ANG_PAR) - m_Params.m_dSpeed = 0 ; - else - m_Params.m_dSpeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dSpeed) > EPS_MACH_ANG_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : if ( abs( m_TParams.m_dStartFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dStartFeed = 0 ; - else - m_Params.m_dStartFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dStartFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dEndFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dTipFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_OFFSR : if ( abs( m_TParams.m_dOffsR - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsR = UNKNOWN_PAR ; - else - m_Params.m_dOffsR = dVal ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsR) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; case MPA_OFFSL : if ( abs( m_TParams.m_dOffsL - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsL = UNKNOWN_PAR ; - else - m_Params.m_dOffsL = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsL) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsL = dVal ; return true ; + case MPA_DEPTH : { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( abs( dVal - m_Params.m_dStartPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_OVERL : + if ( abs( dVal - m_Params.m_dOverlap) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dOverlap = dVal ; return true ; case MPA_STEP : + if ( abs( dVal - m_Params.m_dStep) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_STARTADDLEN : + if ( abs( dVal - m_Params.m_dStartAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartAddLen = dVal ; return true ; case MPA_ENDADDLEN : + if ( abs( dVal - m_Params.m_dEndAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndAddLen = dVal ; return true ; case MPA_LITANG : + if ( abs( dVal - m_Params.m_dLiTang) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLiTang = dVal ; return true ; case MPA_LIPERP : + if ( abs( dVal - m_Params.m_dLiPerp) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLiPerp = dVal ; return true ; case MPA_LIELEV : + if ( abs( dVal - m_Params.m_dLiElev) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLiElev = dVal ; return true ; case MPA_LICOMPLEN : + if ( abs( dVal - m_Params.m_dLiCompLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLiCompLen = dVal ; return true ; case MPA_LOTANG : + if ( abs( dVal - m_Params.m_dLoTang) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLoTang = dVal ; return true ; case MPA_LOPERP : + if ( abs( dVal - m_Params.m_dLoPerp) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLoPerp = dVal ; return true ; case MPA_LOELEV : + if ( abs( dVal - m_Params.m_dLoElev) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLoElev = dVal ; return true ; case MPA_LOCOMPLEN : + if ( abs( dVal - m_Params.m_dLoCompLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLoCompLen = dVal ; return true ; } @@ -386,29 +449,39 @@ Milling::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; - } break ; + } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; - default : - return false ; + return true ; } - return true ; + return false ; } //---------------------------------------------------------------------------- @@ -433,6 +506,9 @@ Milling::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty() || vIds.empty()) ; } @@ -472,6 +548,8 @@ Milling::Preview( bool bRecalc) } m_nHeadSolCh = m_pMchMgr->GetCurrMachine()->GetHeadSolCh( m_TParams.m_sHead) ; + // aggiorno anche se non necessario, comunque operazione veloce + // rendo corrente l'utensile usato nella lavorazione if ( ! m_pMchMgr->SetCalcTool( m_TParams.m_sName, m_TParams.m_sHead, m_TParams.m_nExit)) { m_pMchMgr->SetLastError( 2322, "Error in Milling : Tool loading failed") ; @@ -519,12 +597,30 @@ bool Milling::Apply( bool bRecalc, bool bPostApply) { // reset numero percorsi di lavoro generati + int nCurrMills = m_nMills ; m_nMills = 0 ; // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2301, "Error in Milling : UpdateToolData failed") ; + return false ; + } + m_nHeadSolCh = m_pMchMgr->GetCurrMachine()->GetHeadSolCh( m_TParams.m_sHead) ; + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nMills = nCurrMills ; + LOG_INFO( GetEMkLogger(), "Milling apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; bool bChain = false ; @@ -543,13 +639,6 @@ Milling::Apply( bool bRecalc, bool bPostApply) bChain = true ; } - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2301, "Error in Milling : UpdateToolData failed") ; - return false ; - } - m_nHeadSolCh = m_pMchMgr->GetCurrMachine()->GetHeadSolCh( m_TParams.m_sHead) ; - // rendo corrente l'utensile usato nella lavorazione if ( ! m_pMchMgr->SetCalcTool( m_TParams.m_sName, m_TParams.m_sHead, m_TParams.m_nExit)) { m_pMchMgr->SetLastError( 2322, "Error in Milling : Tool loading failed") ; @@ -596,7 +685,15 @@ Milling::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/Milling.h b/Milling.h index 6561d4e..005241d 100644 --- a/Milling.h +++ b/Milling.h @@ -37,6 +37,8 @@ class Milling : public Machining { return OPER_MILLING ; } bool IsEmpty( void) const override { return ( m_nMills == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -130,6 +132,7 @@ class Milling : public Machining ToolData m_TParams ; // parametri utensile double m_dTHoldLen ; // lunghezza del porta-utensile double m_dTHoldDiam ; // diametro del porta-utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nMills ; // numero di percorsi di lavoro generati bool m_bStepOn ; // flag per indicare che effettivamente si lavora a step int m_nHeadSolCh ; // criterio scelta soluzione impostato nella testa diff --git a/Mortising.cpp b/Mortising.cpp index b918520..c8bcc34 100644 --- a/Mortising.cpp +++ b/Mortising.cpp @@ -71,6 +71,7 @@ Mortising::Clone( void) const pMort->m_nPhase = m_nPhase ; pMort->m_Params = m_Params ; pMort->m_TParams = m_TParams ; + pMort->m_nStatus = m_nStatus ; pMort->m_nMortises = m_nMortises ; } catch( ...) { @@ -94,6 +95,7 @@ Mortising::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nMortises) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -103,7 +105,7 @@ bool Mortising::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -116,6 +118,8 @@ Mortising::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nMortises, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -156,7 +160,7 @@ Mortising::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -164,6 +168,10 @@ Mortising::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nMortises)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -176,6 +184,7 @@ Mortising::Mortising( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nMortises = 0 ; } @@ -214,9 +223,13 @@ Mortising::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; case MPA_TOOLINVERT : + if ( bVal != m_Params.m_bToolInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bToolInvert = bVal ; return true ; } @@ -231,21 +244,29 @@ Mortising::SetParam( int nType, int nVal) case MPA_WORKSIDE : if ( ! m_Params.VerifyWorkSide( nVal)) return false ; + if ( nVal != m_Params.m_nWorkSide) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nWorkSide = nVal ; return true ; case MPA_STEPTYPE : if ( ! m_Params.VerifyStepType( nVal)) return false ; + if ( nVal != m_Params.m_nStepType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nStepType = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; case MPA_FACEUSE : if ( ! m_Params.VerifyFaceUse( nVal)) return false ; + if ( nVal != m_Params.m_nFaceUse) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nFaceUse = nVal ; return true ; } @@ -261,59 +282,77 @@ Mortising::SetParam( int nType, double dVal) if ( ! m_TParams.VerifySpeed( dVal)) return false ; if ( abs( m_TParams.m_dSpeed - dVal) < EPS_MACH_ANG_PAR) - m_Params.m_dSpeed = 0 ; - else - m_Params.m_dSpeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dSpeed) > EPS_MACH_ANG_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : if ( abs( m_TParams.m_dStartFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dStartFeed = 0 ; - else - m_Params.m_dStartFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dStartFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dEndFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dTipFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_OFFSR : if ( abs( m_TParams.m_dOffsR - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsR = UNKNOWN_PAR ; - else - m_Params.m_dOffsR = dVal ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsR) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; case MPA_OFFSL : if ( abs( m_TParams.m_dOffsL - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsL = UNKNOWN_PAR ; - else - m_Params.m_dOffsL = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsL) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsL = dVal ; return true ; + case MPA_DEPTH: { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( abs( dVal - m_Params.m_dStartPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_STEP : + if ( abs( dVal - m_Params.m_dStep) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_STARTADDLEN : + if ( abs( dVal - m_Params.m_dStartAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartAddLen = dVal ; return true ; case MPA_ENDADDLEN : + if ( abs( dVal - m_Params.m_dEndAddLen) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndAddLen = dVal ; return true ; } @@ -329,29 +368,39 @@ Mortising::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; - } break ; + } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; - default : - return false ; + return true ; } - return true ; + return false ; } //---------------------------------------------------------------------------- @@ -376,6 +425,9 @@ Mortising::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty() || vIds.empty()) ; } @@ -448,12 +500,29 @@ bool Mortising::Apply( bool bRecalc, bool bPostApply) { // reset numero mortasature generate + int nCurrMortises = m_nMortises ; m_nMortises = 0 ; // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2501, "Error in Mortising : UpdateToolData failed") ; + return false ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nMortises = nCurrMortises ; + LOG_INFO( GetEMkLogger(), "Mortising apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; bool bChain = false ; @@ -472,12 +541,6 @@ Mortising::Apply( bool bRecalc, bool bPostApply) bChain = true ; } - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2501, "Error in Mortising : UpdateToolData failed") ; - return false ; - } - // se necessario, eseguo concatenamento ed inserisco i percorsi sotto la geometria ausiliaria if ( bChain && ! Chain( nAuxId)) { m_pMchMgr->SetLastError( 2507, "Error in Mortising : Chaining failed") ; @@ -512,7 +575,15 @@ Mortising::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/Mortising.h b/Mortising.h index d11a127..e9d6b6f 100644 --- a/Mortising.h +++ b/Mortising.h @@ -38,6 +38,8 @@ class Mortising : public Machining { return OPER_MORTISING ; } bool IsEmpty( void) const override { return ( m_nMortises == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -94,5 +96,6 @@ class Mortising : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare MortisingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nMortises ; // numero di mortasature generate } ; \ No newline at end of file diff --git a/Operation.cpp b/Operation.cpp index ee0fd62..69ef66f 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -83,6 +83,23 @@ Operation::Operation( void) } //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +bool +Operation::UpdateFollowingOperationsStatus(int nModif) +{ + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) + return false ; + // modifico lo stato delle operazioni attive successive + int nOpeId = m_pMchMgr->GetNextActiveOperation( m_nOwnerId) ; + while ( nOpeId != GDB_ID_NULL) { + Operation* pOpe = GetOperation( m_pGeomDB->GetUserObj( nOpeId)) ; + if ( pOpe != nullptr) + pOpe->UpdateStatus( nModif) ; + nOpeId = m_pMchMgr->GetNextActiveOperation( nOpeId) ; + } + return true ; +} + //---------------------------------------------------------------------------- bool Operation::GetElevation( int nPhase, const Point3d& ptP, diff --git a/Operation.h b/Operation.h index a6165d2..dc35f3a 100644 --- a/Operation.h +++ b/Operation.h @@ -45,6 +45,7 @@ class Operation : public IUserObj public : virtual int GetType( void) const = 0 ; virtual bool IsEmpty( void) const = 0 ; + virtual bool UpdateStatus( int nModif) = 0 ; protected : virtual const std::string& GetToolName( void) const = 0 ; @@ -62,6 +63,7 @@ class Operation : public IUserObj Operation( void) ; protected : + bool UpdateFollowingOperationsStatus( int nModif) ; bool GetElevation( int nPhase, const Point3d& ptP, const Vector3d& vtDir, double& dElev) ; bool GetElevation( int nPhase, const Point3d& ptP1, const Point3d& ptP2, diff --git a/Pocketing.cpp b/Pocketing.cpp index 9e9699a..cc4b695 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -96,6 +96,7 @@ Pocketing::Clone( void) const pPock->m_nPhase = m_nPhase ; pPock->m_Params = m_Params ; pPock->m_TParams = m_TParams ; + pPock->m_nStatus = m_nStatus ; pPock->m_nPockets = m_nPockets ; } catch( ...) { @@ -119,6 +120,7 @@ Pocketing::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nPockets) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -128,7 +130,7 @@ bool Pocketing::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -141,6 +143,8 @@ Pocketing::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nPockets, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -181,7 +185,7 @@ Pocketing::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -189,6 +193,10 @@ Pocketing::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nPockets)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -204,6 +212,7 @@ Pocketing::Pocketing( void) m_dTHoldLen = 0 ; m_dTHoldDiam = 0 ; m_dMaxHelixRad = INFINITO ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nPockets = 0 ; m_bAggrBottom = false ; } @@ -243,9 +252,13 @@ Pocketing::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; case MPA_TOOLINVERT : + if ( bVal != m_Params.m_bToolInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bToolInvert = bVal ; return true ; } @@ -260,21 +273,29 @@ Pocketing::SetParam( int nType, int nVal) case MPA_LEADINTYPE : if ( ! m_Params.VerifyLeadInType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadInType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadInType = nVal ; return true ; case MPA_LEADOUTTYPE : if ( ! m_Params.VerifyLeadOutType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadOutType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadOutType = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; case MPA_SUBTYPE : if ( ! m_Params.VerifySubType( nVal)) return false ; + if ( nVal != m_Params.m_nSubType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSubType = nVal ; return true ; } @@ -290,68 +311,92 @@ Pocketing::SetParam( int nType, double dVal) if ( ! m_TParams.VerifySpeed( dVal)) return false ; if ( abs( m_TParams.m_dSpeed - dVal) < EPS_MACH_ANG_PAR) - m_Params.m_dSpeed = 0 ; - else - m_Params.m_dSpeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dSpeed) > EPS_MACH_ANG_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : if ( abs( m_TParams.m_dStartFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dStartFeed = 0 ; - else - m_Params.m_dStartFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dStartFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dEndFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; + dVal = 0 ; + if ( abs( dVal - m_Params.m_dTipFeed) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_OFFSR : if ( abs( m_TParams.m_dOffsR - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsR = UNKNOWN_PAR ; - else - m_Params.m_dOffsR = dVal ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsR) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; case MPA_OFFSL : if ( abs( m_TParams.m_dOffsL - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsL = UNKNOWN_PAR ; - else - m_Params.m_dOffsL = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + dVal = UNKNOWN_PAR ; + if ( abs( dVal - m_Params.m_dOffsL) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsL = dVal ; return true ; + case MPA_DEPTH : { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( abs( dVal - m_Params.m_dStartPos) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_STEP : + if ( abs( dVal - m_Params.m_dStep) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_SIDESTEP : + if ( abs( dVal - m_Params.m_dSideStep) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dSideStep = dVal ; return true ; case MPA_SIDEANGLE : + if ( abs( dVal - m_Params.m_dSideAngle) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dSideAngle = dVal ; return true ; case MPA_LITANG : + if ( abs( dVal - m_Params.m_dLiTang) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLiTang = dVal ; return true ; case MPA_LIELEV : + if ( abs( dVal - m_Params.m_dLiElev) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLiElev = dVal ; return true ; case MPA_LOTANG : + if ( abs( dVal - m_Params.m_dLoTang) > EPS_MACH_LEN_PAR) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dLoTang = dVal ; return true ; } @@ -367,29 +412,39 @@ Pocketing::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; - } break ; + } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; - default : - return false ; + return true ; } - return true ; + return false ; } //---------------------------------------------------------------------------- @@ -414,6 +469,9 @@ Pocketing::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty() || vIds.empty()) ; } @@ -499,6 +557,7 @@ bool Pocketing::Apply( bool bRecalc, bool bPostApply) { // reset numero percorsi di svuotatura generati + int nCurrPockets = m_nPockets ; m_nPockets = 0 ; // reset raggio massimo attacco ad elica nel caso di cerchi @@ -508,6 +567,22 @@ Pocketing::Apply( bool bRecalc, bool bPostApply) if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2401, "Error in Pocketing : UpdateToolData failed") ; + return false ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nPockets = nCurrPockets ; + LOG_INFO( GetEMkLogger(), "Pocketing apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; bool bChain = false ; @@ -526,12 +601,6 @@ Pocketing::Apply( bool bRecalc, bool bPostApply) bChain = true ; } - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2401, "Error in Pocketing : UpdateToolData failed") ; - return false ; - } - // rendo corrente l'utensile usato nella lavorazione if ( ! m_pMchMgr->SetCalcTool( m_TParams.m_sName, m_TParams.m_sHead, m_TParams.m_nExit)) { m_pMchMgr->SetLastError( 2428, "Error in Pocketing : Tool loading failed") ; @@ -580,6 +649,11 @@ Pocketing::Apply( bool bRecalc, bool bPostApply) // eseguo aggiornamento assi macchina e collegamento con operazione precedente if ( ! Update( bPostApply)) return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; return true ; } diff --git a/Pocketing.h b/Pocketing.h index 198c5bb..10eec75 100644 --- a/Pocketing.h +++ b/Pocketing.h @@ -36,6 +36,8 @@ class Pocketing : public Machining { return OPER_POCKETING ; } bool IsEmpty( void) const override { return ( m_nPockets == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -139,6 +141,7 @@ class Pocketing : public Machining double m_dTHoldLen ; // lunghezza del porta-utensile double m_dTHoldDiam ; // diametro del porta-utensile double m_dMaxHelixRad ; // raggio massimo attacco ad elica nel caso di cerchi + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nPockets ; // numero di percorsi di svuotatura generati bool m_bAggrBottom ; // flag di utilizzo dell'aggregato da sotto Vector3d m_vtAggrBottom ; // vettore direzione ausiliaria aggregato da sotto diff --git a/SawFinishing.cpp b/SawFinishing.cpp index 6e267e3..bdc02ab 100644 --- a/SawFinishing.cpp +++ b/SawFinishing.cpp @@ -86,6 +86,7 @@ SawFinishing::Clone( void) const pSaw->m_nPhase = m_nPhase ; pSaw->m_Params = m_Params ; pSaw->m_TParams = m_TParams ; + pSaw->m_nStatus = m_nStatus ; pSaw->m_nCuts = m_nCuts ; } catch( ...) { @@ -109,6 +110,7 @@ SawFinishing::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nCuts) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -118,7 +120,7 @@ bool SawFinishing::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -131,6 +133,8 @@ SawFinishing::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nCuts, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -171,7 +175,7 @@ SawFinishing::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -179,6 +183,10 @@ SawFinishing::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nCuts)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -191,6 +199,7 @@ SawFinishing::SawFinishing( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nCuts = 0 ; } @@ -229,6 +238,8 @@ SawFinishing::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; } @@ -243,26 +254,36 @@ SawFinishing::SetParam( int nType, int nVal) case MPA_HEADSIDE : if ( ! m_Params.VerifyHeadSide( nVal)) return false ; + if ( nVal != m_Params.m_nHeadSide) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nHeadSide = nVal ; return true ; case MPA_STEPTYPE : if ( ! m_Params.VerifyStepType( nVal)) return false ; + if ( nVal != m_Params.m_nStepType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nStepType = nVal ; return true ; case MPA_SUBTYPE : if ( ! m_Params.VerifySubType( nVal)) return false ; + if ( nVal != m_Params.m_nSubType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSubType = nVal ; return true ; case MPA_LEADLINKTYPE : if ( ! m_Params.VerifyLeadLinkType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadLinkType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadLinkType = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; } @@ -277,66 +298,86 @@ SawFinishing::SetParam( int nType, double dVal) case MPA_SPEED : if ( ! m_TParams.VerifySpeed( dVal)) return false ; - if ( abs( m_TParams.m_dSpeed - dVal) < EPS_MACH_ANG_PAR) - m_Params.m_dSpeed = 0 ; - else - m_Params.m_dSpeed = dVal ; + if ( AreSameAngValue( dVal, m_TParams.m_dSpeed)) + dVal = 0 ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : - if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : - if ( abs( m_TParams.m_dStartFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dStartFeed = 0 ; - else - m_Params.m_dStartFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dStartFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dStartFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : - if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dEndFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dEndFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : - if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dTipFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dTipFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_VERTFEED : - if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dVertFeed = 0 ; - else - m_Params.m_dVertFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dVertFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dVertFeed = dVal ; return true ; case MPA_OFFSR : - if ( abs( m_TParams.m_dOffsR - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsR = UNKNOWN_PAR ; - else - m_Params.m_dOffsR = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dOffsR)) + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dOffsR)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; + case MPA_DEPTH: { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( ! AreSameLenValue( dVal, m_Params.m_dStartPos)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_SIDESTEP : + if ( ! AreSameLenValue( dVal, m_Params.m_dSideStep)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dSideStep = dVal ; return true ; case MPA_STEP : + if ( ! AreSameLenValue( dVal, m_Params.m_dStep)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_APPROX : + if ( ! AreSameLenValue( dVal, m_Params.m_dApprox)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dApprox = dVal ; return true ; case MPA_STARTADDLEN : + if ( ! AreSameLenValue( dVal, m_Params.m_dStartAddLen)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartAddLen = dVal ; return true ; case MPA_ENDADDLEN : + if ( ! AreSameLenValue( dVal, m_Params.m_dEndAddLen)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndAddLen = dVal ; return true ; } @@ -352,25 +393,37 @@ SawFinishing::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; + return true ; } return false ; } @@ -396,6 +449,9 @@ SawFinishing::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty()) ; } @@ -412,12 +468,29 @@ bool SawFinishing::Apply( bool bRecalc, bool bPostApply) { // reset numero tagli nella lavorazione + int nCurrCuts = m_nCuts ; m_nCuts = 0 ; // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2701, "Error in SawFinishing : UpdateToolData failed") ; + return false ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nCuts = nCurrCuts ; + LOG_INFO( GetEMkLogger(), "SawFinishing apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; // se non c'è, lo aggiungo @@ -434,12 +507,6 @@ SawFinishing::Apply( bool bRecalc, bool bPostApply) m_pGeomDB->EmptyGroup( nAuxId) ; } - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2701, "Error in SawFinishing : UpdateToolData failed") ; - return false ; - } - // se necessario, preparo geometria e la inserisco sotto la geometria ausiliaria if ( bRecalc && ! AdjustGeometry( nAuxId)) return false ; @@ -475,7 +542,15 @@ SawFinishing::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/SawFinishing.h b/SawFinishing.h index 33d2fe0..0ad2d7e 100644 --- a/SawFinishing.h +++ b/SawFinishing.h @@ -40,6 +40,8 @@ class SawFinishing : public Machining { return OPER_SAWFINISHING ; } bool IsEmpty( void) const override { return ( m_nCuts == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -120,5 +122,6 @@ class SawFinishing : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare SawFinishingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nCuts ; // numero di passate generate } ; diff --git a/SawRoughing.cpp b/SawRoughing.cpp index 84ae3fd..addc1ae 100644 --- a/SawRoughing.cpp +++ b/SawRoughing.cpp @@ -79,6 +79,7 @@ SawRoughing::Clone( void) const pSaw->m_nPhase = m_nPhase ; pSaw->m_Params = m_Params ; pSaw->m_TParams = m_TParams ; + pSaw->m_nStatus = m_nStatus ; pSaw->m_nCuts = m_nCuts ; } catch( ...) { @@ -102,6 +103,7 @@ SawRoughing::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nCuts) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -111,7 +113,7 @@ bool SawRoughing::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -124,6 +126,8 @@ SawRoughing::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nCuts, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -164,7 +168,7 @@ SawRoughing::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -172,6 +176,10 @@ SawRoughing::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nCuts)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -184,6 +192,7 @@ SawRoughing::SawRoughing( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nCuts = 0 ; } @@ -233,21 +242,29 @@ SawRoughing::SetParam( int nType, int nVal) case MPA_HEADSIDE : if ( ! m_Params.VerifyHeadSide( nVal)) return false ; + if ( nVal != m_Params.m_nHeadSide) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nHeadSide = nVal ; return true ; case MPA_STEPTYPE : if ( ! m_Params.VerifyStepType( nVal)) return false ; + if ( nVal != m_Params.m_nStepType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nStepType = nVal ; return true ; case MPA_LEADLINKTYPE : if ( ! m_Params.VerifyLeadLinkType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadLinkType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadLinkType = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; } @@ -262,66 +279,88 @@ SawRoughing::SetParam( int nType, double dVal) case MPA_SPEED : if ( ! m_TParams.VerifySpeed( dVal)) return false ; - if ( abs( m_TParams.m_dSpeed - dVal) < EPS_MACH_ANG_PAR) - m_Params.m_dSpeed = 0 ; - else - m_Params.m_dSpeed = dVal ; + if ( AreSameAngValue( dVal, m_TParams.m_dSpeed)) + dVal = 0 ; + if ( ! AreSameAngValue( dVal, m_Params.m_dSpeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : - if ( abs( m_TParams.m_dFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dFeed = 0 ; - else - m_Params.m_dFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : - if ( abs( m_TParams.m_dStartFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dStartFeed = 0 ; - else - m_Params.m_dStartFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dStartFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dStartFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : - if ( abs( m_TParams.m_dEndFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dEndFeed = 0 ; - else - m_Params.m_dEndFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dEndFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dEndFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : - if ( abs( m_TParams.m_dTipFeed - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dTipFeed = 0 ; - else - m_Params.m_dTipFeed = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dTipFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dTipFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_OFFSR : - if ( abs( m_TParams.m_dOffsR - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsR = UNKNOWN_PAR ; - else - m_Params.m_dOffsR = dVal ; + if ( AreSameLenValue( dVal, m_TParams.m_dOffsR)) + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dOffsR)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; case MPA_OFFSL : - if ( abs( m_TParams.m_dOffsL - dVal) < EPS_MACH_LEN_PAR) - m_Params.m_dOffsL = UNKNOWN_PAR ; - else - m_Params.m_dOffsL = dVal ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dOffsL)) + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dOffsL)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsL = dVal ; return true ; + case MPA_DEPTH: { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( ! AreSameLenValue( dVal, m_Params.m_dStartPos)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_SIDESTEP : + if ( ! AreSameLenValue( dVal, m_Params.m_dSideStep)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dSideStep = dVal ; return true ; case MPA_STEP : + if ( ! AreSameLenValue( dVal, m_Params.m_dStep)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_APPROX : + if ( ! AreSameLenValue( dVal, m_Params.m_dApprox)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dApprox = dVal ; return true ; case MPA_STARTADDLEN : + if ( ! AreSameLenValue( dVal, m_Params.m_dStartAddLen)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartAddLen = dVal ; return true ; case MPA_ENDADDLEN : + if ( ! AreSameLenValue( dVal, m_Params.m_dEndAddLen)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndAddLen = dVal ; return true ; } @@ -337,25 +376,37 @@ SawRoughing::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; + return true ; } return false ; } @@ -381,6 +432,9 @@ SawRoughing::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty()) ; } @@ -397,12 +451,29 @@ bool SawRoughing::Apply( bool bRecalc, bool bPostApply) { // reset numero tagli nella lavorazione + int nCurrCuts = m_nCuts ; m_nCuts = 0 ; // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2601, "Error in SawRoughing : UpdateToolData failed") ; + return false ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nCuts = nCurrCuts ; + LOG_INFO( GetEMkLogger(), "SawRoughing apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; // se non c'è, lo aggiungo @@ -419,12 +490,6 @@ SawRoughing::Apply( bool bRecalc, bool bPostApply) m_pGeomDB->EmptyGroup( nAuxId) ; } - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2601, "Error in SawRoughing : UpdateToolData failed") ; - return false ; - } - // se necessario, preparo geometria e la inserisco sotto la geometria ausiliaria if ( bRecalc && ! AdjustGeometry( nAuxId)) return false ; @@ -451,7 +516,15 @@ SawRoughing::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/SawRoughing.h b/SawRoughing.h index 558ce58..cc21cb1 100644 --- a/SawRoughing.h +++ b/SawRoughing.h @@ -40,6 +40,8 @@ class SawRoughing : public Machining { return OPER_SAWROUGHING ; } bool IsEmpty( void) const override { return ( m_nCuts == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -105,5 +107,6 @@ class SawRoughing : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare SawRoughingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nCuts ; // numero di tagli generati } ; diff --git a/Sawing.cpp b/Sawing.cpp index 0d2c043..0a2b3b7 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -89,6 +89,7 @@ Sawing::Clone( void) const pSaw->m_nPhase = m_nPhase ; pSaw->m_Params = m_Params ; pSaw->m_TParams = m_TParams ; + pSaw->m_nStatus = m_nStatus ; pSaw->m_nCuts = m_nCuts ; } catch( ...) { @@ -112,6 +113,7 @@ Sawing::Dump( string& sOut, bool bMM, const char* szNewLine) const for ( int i = 0 ; i < m_TParams.GetSize() ; ++ i) sOut += m_TParams.ToString( i) + szNewLine ; sOut += KEY_NUM + EQUAL + ToString( m_nCuts) + szNewLine ; + sOut += KEY_STAT + EQUAL + ToString( m_nStatus) + szNewLine ; return true ; } @@ -121,7 +123,7 @@ bool Sawing::Save( int nBaseId, STRVECTOR& vString) const { try { - int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 2 ; + int nSize = 1 + m_Params.GetSize() + m_TParams.GetSize() + 3 ; vString.insert( vString.begin(), nSize, "") ; int k = - 1 ; if ( ! SetVal( KEY_IDS, m_vId, vString[++k])) @@ -134,6 +136,8 @@ Sawing::Save( int nBaseId, STRVECTOR& vString) const return false ; if ( ! SetVal( KEY_NUM, m_nCuts, vString[++k])) return false ; + if ( ! SetVal( KEY_STAT, m_nStatus, vString[++k])) + return false ; } catch( ...) { return false ; @@ -174,7 +178,7 @@ Sawing::Load( const STRVECTOR& vString, int nBaseGdbId) string sKey, sVal ; SplitFirst( vString[++k], "=", sKey, sVal) ; // leggo - if ( sKey == KEY_PHASE){ + if ( sKey == KEY_PHASE) { if ( ! FromString( sVal, m_nPhase)) return false ; } @@ -182,6 +186,10 @@ Sawing::Load( const STRVECTOR& vString, int nBaseGdbId) if ( ! FromString( sVal, m_nCuts)) return false ; } + else if ( sKey == KEY_STAT) { + if ( ! FromString( sVal, m_nStatus)) + return false ; + } } return true ; } @@ -194,6 +202,7 @@ Sawing::Sawing( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_nStatus = MCH_ST_TO_VERIFY ; m_nCuts = 0 ; } @@ -232,6 +241,8 @@ Sawing::SetParam( int nType, bool bVal) { switch ( nType) { case MPA_INVERT : + if ( bVal != m_Params.m_bInvert) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_bInvert = bVal ; return true ; } @@ -246,41 +257,57 @@ Sawing::SetParam( int nType, int nVal) case MPA_WORKSIDE : if ( ! m_Params.VerifyWorkSide( nVal)) return false ; + if ( nVal != m_Params.m_nWorkSide) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nWorkSide = nVal ; return true ; case MPA_HEADSIDE : if ( ! m_Params.VerifyHeadSide( nVal)) return false ; + if ( nVal != m_Params.m_nHeadSide) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nHeadSide = nVal ; return true ; case MPA_STEPTYPE : if ( ! m_Params.VerifyStepType( nVal)) return false ; + if ( nVal != m_Params.m_nStepType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nStepType = nVal ; return true ; case MPA_LEADINTYPE : if ( ! m_Params.VerifyLeadInType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadInType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadInType = nVal ; return true ; case MPA_EXTLINKTYPE : if ( ! m_Params.VerifyExtLinkType( nVal)) return false ; + if ( nVal != m_Params.m_nExtLinkType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nExtLinkType = nVal ; return true ; case MPA_LEADOUTTYPE : if ( ! m_Params.VerifyLeadOutType( nVal)) return false ; + if ( nVal != m_Params.m_nLeadOutType) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nLeadOutType = nVal ; return true ; case MPA_CURVEUSE : if ( ! m_Params.VerifyCurveUse( nVal)) return false ; + if ( nVal != m_Params.m_nCurveUse) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nCurveUse = nVal ; return true ; case MPA_SCC : if ( ! m_Params.VerifySolCh( nVal)) return false ; + if ( nVal != m_Params.m_nSolCh) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_nSolCh = nVal ; return true ; } @@ -295,69 +322,129 @@ Sawing::SetParam( int nType, double dVal) case MPA_SPEED : if ( ! m_TParams.VerifySpeed( dVal)) return false ; - m_Params.m_dSpeed = ( AreSameAngValue( dVal, m_TParams.m_dSpeed) ? 0 : dVal) ; + if ( AreSameAngValue( dVal, m_TParams.m_dSpeed)) + dVal = 0 ; + if ( ! AreSameAngValue( dVal, m_Params.m_dSpeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dSpeed = dVal ; return true ; case MPA_FEED : - m_Params.m_dFeed = ( AreSameLenValue( dVal, m_TParams.m_dFeed) ? 0 : dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dFeed = dVal ; return true ; case MPA_STARTFEED : - m_Params.m_dStartFeed = ( AreSameLenValue( dVal, m_TParams.m_dStartFeed) ? 0 : dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dStartFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dStartFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStartFeed = dVal ; return true ; case MPA_ENDFEED : - m_Params.m_dEndFeed = ( AreSameLenValue( dVal, m_TParams.m_dEndFeed) ? 0 : dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dEndFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dEndFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dEndFeed = dVal ; return true ; case MPA_TIPFEED : - m_Params.m_dTipFeed = ( AreSameLenValue( dVal, m_TParams.m_dTipFeed) ? 0 : dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dTipFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dTipFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dTipFeed = dVal ; return true ; case MPA_BACKFEED : - m_Params.m_dBackFeed = ( AreSameLenValue( dVal, m_TParams.m_dFeed) ? 0 : dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dFeed)) + dVal = 0 ; + if ( ! AreSameLenValue( dVal, m_Params.m_dBackFeed)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dBackFeed = dVal ; return true ; case MPA_OFFSR : - m_Params.m_dOffsR = ( AreSameLenValue( dVal, m_TParams.m_dOffsR) ? UNKNOWN_PAR : dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dOffsR)) + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dOffsR)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsR = dVal ; return true ; case MPA_OFFSL : - m_Params.m_dOffsL = ( AreSameLenValue( dVal, m_TParams.m_dOffsL) ? UNKNOWN_PAR : dVal) ; - return true ; - case MPA_DEPTH : - m_Params.m_sDepth = ToString( dVal) ; + if ( AreSameLenValue( dVal, m_TParams.m_dOffsL)) + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dOffsL)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dOffsL = dVal ; return true ; + case MPA_DEPTH: { + string sVal = ToString( dVal) ; + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_sDepth = sVal ; + } return true ; case MPA_STARTPOS : + if ( ! AreSameLenValue( dVal, m_Params.m_dStartPos)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartPos = dVal ; return true ; case MPA_STEP : + if ( ! AreSameLenValue( dVal, m_Params.m_dStep)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStep = dVal ; return true ; case MPA_STEPBACK : - m_Params.m_dStepBack = ( AreSameLenValue( dVal, m_Params.m_dStep) ? UNKNOWN_PAR : dVal) ; + if ( AreSameLenValue( dVal, m_Params.m_dStep)) + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dStepBack)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStepBack = dVal ; return true ; case MPA_STEPEXTARC : + if ( ! AreSameLenValue( dVal, m_Params.m_dStepExtArc)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStepExtArc = dVal ; return true ; case MPA_STEPINTARC : + if ( ! AreSameLenValue( dVal, m_Params.m_dStepIntArc)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStepIntArc = dVal ; return true ; case MPA_STEPSIDEANG : - m_Params.m_dStepSideAng = ( AreSameLenValue( dVal, m_Params.m_dStep) ? UNKNOWN_PAR : dVal) ; + if ( AreSameLenValue( dVal, m_Params.m_dStep)) + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dStepSideAng)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStepSideAng = dVal ; return true ; case MPA_STEPSIDEANGBACK : if ( AreSameLenValue( dVal, m_Params.m_dStepSideAng) || ( IsUnknownValue( m_Params.m_dStepSideAng) && AreSameLenValue( dVal, m_Params.m_dStep))) - m_Params.m_dStepSideAngBack = UNKNOWN_PAR ; - else - m_Params.m_dStepSideAngBack = dVal ; + dVal = UNKNOWN_PAR ; + if ( ! AreSameLenValue( dVal, m_Params.m_dStepSideAngBack)) + m_nStatus |= MCH_ST_PARAM_MODIF ; + m_Params.m_dStepSideAngBack = dVal ; return true ; case MPA_SIDEANGLE : if ( ! m_Params.VerifySideAngle( dVal)) return false ; + if ( ! AreSameAngValue( dVal, m_Params.m_dSideAngle)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dSideAngle = dVal ; return true ; case MPA_STARTADDLEN : + if ( ! AreSameLenValue( dVal, m_Params.m_dStartAddLen)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dStartAddLen = dVal ; return true ; case MPA_ENDADDLEN : + if ( ! AreSameLenValue( dVal, m_Params.m_dEndAddLen)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dEndAddLen = dVal ; return true ; case MPA_APPROX : + if ( ! AreSameLenValue( dVal, m_Params.m_dApprox)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_dApprox = dVal ; return true ; } @@ -373,25 +460,37 @@ Sawing::SetParam( int nType, const string& sVal) const ToolData* pTdata ; if ( ! m_Params.VerifyTool( m_pMchMgr->GetCurrToolsMgr(), sVal, pTdata)) return false ; + if ( ! SameTool( m_TParams, *pTdata)) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sToolName = sVal ; m_Params.m_ToolUuid = pTdata->m_Uuid ; m_TParams = *pTdata ; } return true ; case MPA_DEPTH_STR : + if ( sVal != m_Params.m_sDepth) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sDepth = sVal ; return true ; case MPA_SYSNOTES : + if ( sVal != m_Params.m_sSysNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sSysNotes = sVal ; - break ; + return true ; case MPA_USERNOTES : + if ( sVal != m_Params.m_sUserNotes) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sUserNotes = sVal ; - break ; + return true ; case MPA_INITANGS : + if ( sVal != m_Params.m_sInitAngs) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sInitAngs = sVal ; - break ; + return true ; case MPA_BLOCKEDAXIS : + if ( sVal != m_Params.m_sBlockedAxis) + m_nStatus |= MCH_ST_PARAM_MODIF ; m_Params.m_sBlockedAxis = sVal ; - break ; + return true ; } return false ; } @@ -418,6 +517,9 @@ Sawing::SetGeometry( const SELVECTOR& vIds) // posso aggiungere alla lista m_vId.emplace_back( Id) ; } + // aggiorno lo stato + m_nStatus |= MCH_ST_GEO_MODIF ; + // restituisco presenza geometria da lavorare return ( ! m_vId.empty() || vIds.empty()) ; } @@ -495,12 +597,29 @@ bool Sawing::Apply( bool bRecalc, bool bPostApply) { // reset numero tagli nella lavorazione + int nCurrCuts = m_nCuts ; m_nCuts = 0 ; // verifico validità gestore DB geometrico e Id del gruppo if ( m_pGeomDB == nullptr || ! m_pGeomDB->ExistsObj( m_nOwnerId)) return false ; + // aggiorno dati geometrici dell'utensile + bool bToolChanged = true ; + if ( ! UpdateToolData( &bToolChanged)) { + m_pMchMgr->SetLastError( 2201, "Error in Sawing : UpdateToolData failed") ; + return false ; + } + + // verifico se necessario continuare nell'aggiornamento + if ( ! bRecalc && ! bToolChanged && + ( m_nStatus == MCH_ST_OK || ( ! bPostApply && m_nStatus == MCH_ST_NO_POSTAPPL))) { + m_nCuts = nCurrCuts ; + LOG_INFO( GetEMkLogger(), "Sawing apply skipped : status already ok") ; + return true ; + } + m_nStatus = MCH_ST_TO_VERIFY ; + // recupero gruppo per geometria ausiliaria int nAuxId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_AUX) ; bool bChain = false ; @@ -519,12 +638,6 @@ Sawing::Apply( bool bRecalc, bool bPostApply) bChain = true ; } - // aggiorno dati geometrici dell'utensile - if ( ! UpdateToolData()) { - m_pMchMgr->SetLastError( 2201, "Error in Sawing : UpdateToolData failed") ; - return false ; - } - // se necessario, eseguo concatenamento ed inserisco i percorsi sotto la geometria ausiliaria if ( bChain && ! Chain( nAuxId)) { m_pMchMgr->SetLastError( 2214, "Error in Sawing : Chaining failed") ; @@ -563,7 +676,15 @@ Sawing::Apply( bool bRecalc, bool bPostApply) CalcAndSetBBox( nClId) ; // eseguo aggiornamento assi macchina e collegamento con operazione precedente - return Update( bPostApply) ; + if ( ! Update( bPostApply)) + return false ; + + // aggiorno stato della lavorazione + m_nStatus = ( bPostApply ? MCH_ST_OK : MCH_ST_NO_POSTAPPL) ; + // dichiaro successiva da aggiornare + UpdateFollowingOperationsStatus( MCH_ST_OTH_MODIF) ; + + return true ; } //---------------------------------------------------------------------------- diff --git a/Sawing.h b/Sawing.h index 807a8ad..fc03887 100644 --- a/Sawing.h +++ b/Sawing.h @@ -41,6 +41,8 @@ class Sawing : public Machining { return OPER_SAWING ; } bool IsEmpty( void) const override { return ( m_nCuts == 0) ; } + bool UpdateStatus( int nModif) override + { m_nStatus |= nModif ; return true ; } protected : // Operation int GetSolCh( void) const override @@ -155,5 +157,6 @@ class Sawing : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare SawingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + int m_nStatus ; // stato di aggiornamento della lavorazione int m_nCuts ; // numero di tagli generati } ;