diff --git a/Drilling.cpp b/Drilling.cpp index a76b160..0559e51 100644 --- a/Drilling.cpp +++ b/Drilling.cpp @@ -692,16 +692,16 @@ Drilling::Apply( bool bRecalc, bool bPostApply) // assegno ingombri dei vari percorsi di lavorazione e della lavorazione nel suo complesso CalcAndSetBBox( nClId) ; - // eseguo aggiornamento assi macchina e collegamento con operazione precedente - if ( ! Update( bPostApply)) - return false ; - // se lavorazione in doppio, aggiungo geometria della parte simmetrica if ( ! CalcMirrorByDouble( nClId, m_Params.m_sUserNotes)) { m_pMchMgr->SetLastError( 2115, "Error in Drilling : Mirror for Double calculation failed") ; return false ; } + // 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 @@ -758,6 +758,34 @@ Drilling::Update( bool bPostApply) return false ; } + // se lavorazione in doppio, calcolo assi e movimenti di approccio e retrazione relativi + if ( GetDoubleType( m_Params.m_sUserNotes) != 0) { + // elimino le entitĂ  CLIMB, RISE e HOME della lavorazione in doppio + RemoveClimbRiseHome( false) ; + // recupero i dati della testa in doppio e la imposto + string sDblTool ; string sDblHead ; int nDblExit ; + bool bOk = GetDoubleToolData( sDblTool, sDblHead, nDblExit) && + m_pMchMgr->SetCalcTool( sDblTool, sDblHead, nDblExit) ; + // imposto eventuale asse bloccato da lavorazione + SetBlockedRotAxis( m_Params.m_sBlockedAxis, true) ; + // eseguo il calcolo + if ( bOk) { + if ( ! CalculateDoubleAxesValues( sHint)) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2109, "Error in Drilling : axes values not calculable for double") ; + else + m_pMchMgr->SetLastError( 2110, "Error in Drilling : double outstroke ") ; + bOk = false ; + } + } + // ripristino testa principale + m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()) ; + // in caso di errore, esco + if ( ! bOk) + return false ; + } + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Machining.cpp b/Machining.cpp index d6f155a..396df02 100644 --- a/Machining.cpp +++ b/Machining.cpp @@ -392,34 +392,32 @@ Machining::ToolPreview( int nEntId, int nStep) const return nEntId ; } +//---------------------------------------------------------------------------- +int +Machining::GetDoubleType( const string& sUserNotes) +{ + int nDouble ; + if ( ! GetValInNotes( sUserNotes, UN_DOUBLE, nDouble) || + ( nDouble != 1 && nDouble != 2 && nDouble != 3)) + return 0 ; + else + return nDouble ; +} + //---------------------------------------------------------------------------- bool -Machining::CalcMirrorByDouble( int nClId, const string& sUserNotes) +Machining::GetDoubleToolData( string& sDblTool, string& sDblHead, int& nDblExit) { if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr) return false ; - // recupero macchina corrente - Machine* pMch = m_pMchMgr->GetCurrMachine() ; - if ( pMch == nullptr) - return false ; // recupero il gestore DB utensili della macchina corrente ToolsMgr* pTMgr = m_pMchMgr->GetCurrToolsMgr() ; if ( pTMgr == nullptr) return false ; - - // verifico se prevista lavorazione in doppio - int nDouble ; - if ( ! GetValInNotes( sUserNotes, UN_DOUBLE, nDouble) || - ( nDouble != 1 && nDouble != 2 && nDouble != 3)) - return true ; - // recupero dati utensile principale - string sMainTool ; string sMainHead ; int nMainExit ; - if ( ! pMch->GetCurrTool( sMainTool) || ! pMch->GetCurrHead( sMainHead) || ! pMch->GetCurrExit( nMainExit)) - return false ; // recupero dati utensile in doppio - string sDblTool ; string sDblHead ; int nDblExit ; string sDblTcPos ; if ( ! GetValInNotes( GetToolData().m_sUserNotes, "DOUBLE", sDblTool)) return false ; + string sDblTcPos ; if ( ! m_pMchMgr->GetCurrSetupMgr().GetToolData( sDblTool, sDblTcPos, sDblHead, nDblExit)) { const ToolData* pTdata = pTMgr->GetTool( sDblTool) ; if ( pTdata == nullptr) @@ -427,6 +425,20 @@ Machining::CalcMirrorByDouble( int nClId, const string& sUserNotes) sDblHead = pTdata->m_sHead ; nDblExit = pTdata->m_nExit ; } + return true ; +} + +//---------------------------------------------------------------------------- +bool +Machining::CalcMirrorByDouble( int nClId, const string& sUserNotes) +{ + if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr) + return false ; + + // verifico se prevista lavorazione in doppio + int nDouble = GetDoubleType( sUserNotes) ; + if ( nDouble == 0) + return true ; // assegno Id entitŕ originali int nPathId = m_pGeomDB->GetFirstNameInGroup( nClId, MCH_PATH + "*") ; @@ -499,24 +511,6 @@ Machining::CalcMirrorByDouble( int nClId, const string& sUserNotes) if ( GetValInNotes( sUserNotes, UN_DELTAZ, dDeltaZ) && abs( dDeltaZ) > EPS_SMALL) m_pGeomDB->TranslateGlob( nDblId, Vector3d( 0, 0, dDeltaZ)) ; - // elimino approcci e retrazioni (CLIMB e RISE) - RemoveClimbRiseHome( false) ; - - // imposto testa in doppio - if ( ! pMch->SetCurrTool( sDblTool, sDblHead, nDblExit)) - return false ; - - // calcolo gli assi macchina - string sHint = ExtractHint( sUserNotes) ; - string sInitAngs ; - if ( GetParam( MPA_INITANGS, sInitAngs) && ! sInitAngs.empty()) - sHint = sInitAngs ; - if ( ! CalculateDoubleAxesValues( sHint)) - return false ; - - // ripristino testa principale - pMch->SetCurrTool( sMainTool, sMainHead, nMainExit) ; - return true ; } diff --git a/Machining.h b/Machining.h index 473b5e4..f33183e 100644 --- a/Machining.h +++ b/Machining.h @@ -53,12 +53,14 @@ class Machining : public Operation bool RemoveToolPreview( void) const ; int GetToolPreviewStepCount( void) const ; int ToolPreview( int nEntId, int nStep) const ; - bool CalcMirrorByDouble( int nClId, const std::string& sUserNotes) ; - bool ActivateDrillingUnit( int nHeadId, const INTVECTOR& vActExit) const ; protected : Machining( void) ; bool PostApply( std::string& sErr) ; + int GetDoubleType( const std::string& sUserNotes) ; + bool GetDoubleToolData( std::string& sDblTool, std::string& sDblHead, int& nDblExit) ; + bool CalcMirrorByDouble( int nClId, const std::string& sUserNotes) ; + bool ActivateDrillingUnit( int nHeadId, const INTVECTOR& vActExit) const ; private : int GetToolPreviewNext( int nEntId, int nParentId, int nStId) const ; diff --git a/Milling.cpp b/Milling.cpp index df08242..035d302 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -850,16 +850,16 @@ Milling::Apply( bool bRecalc, bool bPostApply) // assegno ingombri dei vari percorsi di lavorazione e della lavorazione nel suo complesso CalcAndSetBBox( nClId) ; - // eseguo aggiornamento assi macchina e collegamento con operazione precedente - if ( ! Update( bPostApply)) - return false ; - // se lavorazione in doppio, aggiungo geometria della parte simmetrica if ( ! CalcMirrorByDouble( nClId, m_Params.m_sUserNotes)) { m_pMchMgr->SetLastError( 2325, "Error in Milling : Mirror for Double calculation failed") ; return false ; } + // 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 @@ -916,6 +916,34 @@ Milling::Update( bool bPostApply) return false ; } + // se lavorazione in doppio, calcolo assi e movimenti di approccio e retrazione relativi + if ( GetDoubleType( m_Params.m_sUserNotes) != 0) { + // elimino le entitĂ  CLIMB, RISE e HOME della lavorazione in doppio + RemoveClimbRiseHome( false) ; + // recupero i dati della testa in doppio e la imposto + string sDblTool ; string sDblHead ; int nDblExit ; + bool bOk = GetDoubleToolData( sDblTool, sDblHead, nDblExit) && + m_pMchMgr->SetCalcTool( sDblTool, sDblHead, nDblExit) ; + // imposto eventuale asse bloccato da lavorazione + SetBlockedRotAxis( m_Params.m_sBlockedAxis, true) ; + // eseguo il calcolo + if ( bOk) { + if ( ! CalculateDoubleAxesValues( sHint)) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2317, "Error in Milling : axes values not calculable for double") ; + else + m_pMchMgr->SetLastError( 2318, "Error in Milling : double outstroke ") ; + bOk = false ; + } + } + // ripristino testa principale + m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()) ; + // in caso di errore, esco + if ( ! bOk) + return false ; + } + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/Operation.cpp b/Operation.cpp index 760ec0b..fa70a3a 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -1723,15 +1723,17 @@ Operation::ExtractHint( const string& sNotes) const //---------------------------------------------------------------------------- bool -Operation::SetBlockedRotAxis( const string& sBlockedAxis) const +Operation::SetBlockedRotAxis( const string& sBlockedAxis, bool bToolSetOk) const { if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) return false ; // cancello bloccaggio attuale m_pMchMgr->ClearRotAxisBlock() ; - // imposto l'utensile per i calcoli macchina - if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr())) - return false ; + // se richiesto, imposto l'utensile per i calcoli macchina + if ( ! bToolSetOk) { + if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr())) + return false ; + } // se non ci sono bloccaggi, esco if ( sBlockedAxis.empty()) return true ; diff --git a/Operation.h b/Operation.h index f2b06ef..ece8d93 100644 --- a/Operation.h +++ b/Operation.h @@ -175,7 +175,7 @@ class Operation : public IUserObj std::string ExtractInfo( const std::string& sNotes, const std::string& sKey) const ; std::string ExtractHint( const std::string& sNotes) const ; - bool SetBlockedRotAxis( const std::string& sBlockedAxis) const ; + bool SetBlockedRotAxis( const std::string& sBlockedAxis, bool bToolSetOk = false) const ; bool CalculateAxesValues( const std::string& sHint, bool bSolChExact = false, double dSingConeAng = 0) ; bool CalculateDoubleAxesValues( const std::string& sHint, bool bSolChExact = false, double dSingConeAng = 0) ; bool AdjustStartEndMovements( bool bVerifyPreviousLink = true) ; diff --git a/Pocketing.cpp b/Pocketing.cpp index 2bb250f..58e1ffa 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -721,15 +721,15 @@ Pocketing::Apply( bool bRecalc, bool bPostApply) // assegno ingombri dei vari percorsi di lavorazione e della lavorazione nel suo complesso CalcAndSetBBox( nClId) ; - // eseguo aggiornamento assi macchina e collegamento con operazione precedente - if ( ! Update( bPostApply)) - return false ; - // se lavorazione in doppio, aggiungo geometria della parte simmetrica if ( ! CalcMirrorByDouble( nClId, m_Params.m_sUserNotes)) { m_pMchMgr->SetLastError( 2432, "Error in Pocketing : Mirror for Double calculation failed") ; return false ; } + + // 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) ; @@ -787,6 +787,34 @@ Pocketing::Update( bool bPostApply) return false ; } + // se lavorazione in doppio, calcolo assi e movimenti di approccio e retrazione relativi + if ( GetDoubleType( m_Params.m_sUserNotes) != 0) { + // elimino le entitĂ  CLIMB, RISE e HOME della lavorazione in doppio + RemoveClimbRiseHome( false) ; + // recupero i dati della testa in doppio e la imposto + string sDblTool ; string sDblHead ; int nDblExit ; + bool bOk = GetDoubleToolData( sDblTool, sDblHead, nDblExit) && + m_pMchMgr->SetCalcTool( sDblTool, sDblHead, nDblExit) ; + // imposto eventuale asse bloccato da lavorazione + SetBlockedRotAxis( m_Params.m_sBlockedAxis, true) ; + // eseguo il calcolo + if ( bOk) { + if ( ! CalculateDoubleAxesValues( sHint)) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2423, "Error in Pocketing : axes values not calculable for double") ; + else + m_pMchMgr->SetLastError( 2424, "Error in Pocketing : double outstroke ") ; + bOk = false ; + } + } + // ripristino testa principale + m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()) ; + // in caso di errore, esco + if ( ! bOk) + return false ; + } + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) { diff --git a/PocketingNT.cpp b/PocketingNT.cpp index d98b643..3a35eda 100644 --- a/PocketingNT.cpp +++ b/PocketingNT.cpp @@ -790,15 +790,15 @@ PocketingNT::MyApply( bool bRecalc, bool bPostApply) // assegno ingombri dei vari percorsi di lavorazione e della lavorazione nel suo complesso CalcAndSetBBox( nClId) ; - // eseguo aggiornamento assi macchina e collegamento con operazione precedente - if ( ! Update( bPostApply)) - return false ; - // se lavorazione in doppio, aggiungo geometria della parte simmetrica if ( ! CalcMirrorByDouble( nClId, m_Params.m_sUserNotes)) { m_pMchMgr->SetLastError( 2432, "Error in PocketingNT : Mirror for Double calculation failed") ; return false ; } + + // 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) ; @@ -861,6 +861,34 @@ PocketingNT::Update( bool bPostApply) return false ; } + // se lavorazione in doppio, calcolo assi e movimenti di approccio e retrazione relativi + if ( GetDoubleType( m_Params.m_sUserNotes) != 0) { + // elimino le entitĂ  CLIMB, RISE e HOME della lavorazione in doppio + RemoveClimbRiseHome( false) ; + // recupero i dati della testa in doppio e la imposto + string sDblTool ; string sDblHead ; int nDblExit ; + bool bOk = GetDoubleToolData( sDblTool, sDblHead, nDblExit) && + m_pMchMgr->SetCalcTool( sDblTool, sDblHead, nDblExit) ; + // imposto eventuale asse bloccato da lavorazione + SetBlockedRotAxis( m_Params.m_sBlockedAxis, true) ; + // eseguo il calcolo + if ( bOk) { + if ( ! CalculateDoubleAxesValues( sHint)) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2423, "Error in PocketingNT : axes values not calculable for double") ; + else + m_pMchMgr->SetLastError( 2424, "Error in PocketingNT : double outstroke ") ; + bOk = false ; + } + } + // ripristino testa principale + m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()) ; + // in caso di errore, esco + if ( ! bOk) + return false ; + } + // esecuzione eventuali personalizzazioni string sErr ; if ( bPostApply && ! PostApply( sErr)) {