diff --git a/Machining.cpp b/Machining.cpp index ec6d97e..f6eabfa 100644 --- a/Machining.cpp +++ b/Machining.cpp @@ -47,10 +47,12 @@ Machining::Machining( void) m_nLookFlag = MCH_LOOK_TAB_HEAD ; m_nPreviewHeadId = GDB_ID_NULL ; m_nPreviewHeadIdDBL = GDB_ID_NULL ; + m_nPreviewExitId = GDB_ID_NULL ; + m_nPreviewExitIdDBL = GDB_ID_NULL ; m_nPreviewToolTip = GDB_ID_NULL ; m_nPreviewToolTipDBL = GDB_ID_NULL ; m_vPreviewAxisIds = {} ; - m_vPreviewAxisIdsBBL = {} ; + m_vPreviewAxisIdsDBL = {} ; } //---------------------------------------------------------------------------- @@ -59,10 +61,12 @@ Machining::~Machining( void) m_nLookFlag = MCH_LOOK_NONE ; m_nPreviewHeadId = GDB_ID_NULL ; m_nPreviewHeadIdDBL = GDB_ID_NULL ; + m_nPreviewExitId = GDB_ID_NULL ; + m_nPreviewExitIdDBL = GDB_ID_NULL ; m_nPreviewToolTip = GDB_ID_NULL ; m_nPreviewToolTipDBL = GDB_ID_NULL ; m_vPreviewAxisIds.clear() ; - m_vPreviewAxisIdsBBL.clear() ; + m_vPreviewAxisIdsDBL.clear() ; } //---------------------------------------------------------------------------- @@ -165,17 +169,20 @@ Machining::MyChangeToolPreviewShow( int nLookFlag, bool bDouble) // se non esiste il gruppo di Preview, errore int nCurrStdId = GDB_ID_NULL ; int nCurrHeadId = GDB_ID_NULL ; + int nCurrExitId = GDB_ID_NULL ; if ( ! bDouble) { nCurrStdId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_ST) ; if ( nCurrStdId == GDB_ID_NULL || m_nPreviewHeadId == GDB_ID_NULL) return false ; nCurrHeadId = m_nPreviewHeadId ; + nCurrExitId = m_nPreviewExitId ; } else { nCurrStdId = m_pGeomDB->GetFirstNameInGroup( GetOwner(), MCH_ST_DBL) ; if ( nCurrStdId == GDB_ID_NULL || m_nPreviewHeadIdDBL == GDB_ID_NULL) return false ; nCurrHeadId = m_nPreviewHeadIdDBL ; + nCurrExitId = m_nPreviewExitIdDBL ; } // recupero la macchina corrente @@ -198,8 +205,14 @@ Machining::MyChangeToolPreviewShow( int nLookFlag, bool bDouble) int nIter = 0 ; // se devo visualizzare solamente il gruppo della testa corrente if ( nLookFlag == MCH_LOOK_TAB_TOOL) { - // la testa diventa visibile + // la testa diventa visibile ( solamente il gruppo dell'uscita corrente) m_pGeomDB->SetStatus( nCurrHeadId, GDB_ST_ON) ; + int nHeadChildId = m_pGeomDB->GetFirstGroupInGroup( nCurrHeadId) ; + while ( nHeadChildId != GDB_ID_NULL) { + if ( nHeadChildId != nCurrExitId) + m_pGeomDB->SetStatus( nHeadChildId, GDB_ST_OFF) ; + nHeadChildId = m_pGeomDB->GetNext( nHeadChildId) ; + } // tutti i gruppi che contengono la testa diventano visibili fino a "ST", l'unico loro // figlio visibile deve essere quello che contiene la testa corrente int nCurrId = nCurrHeadId ; @@ -249,10 +262,17 @@ Machining::MyChangeToolPreviewShow( int nLookFlag, bool bDouble) } } else { + // visualizzo tutti i gruppi in coda for ( auto Iter = dqHierarchy.begin() ; Iter != dqHierarchy.end() ; ++ Iter) { if ( m_pGeomDB->GetGdbType( *Iter) == GDB_TY_GROUP) m_pGeomDB->SetStatus( *Iter, GDB_ST_ON) ; } + // visualizzo tutti i sottogruppi della testa + int nHeadChild = m_pGeomDB->GetFirstGroupInGroup( nCurrHeadId) ; + while ( nHeadChild != GDB_ID_NULL) { + m_pGeomDB->SetStatus( nHeadChild, GDB_ST_ON) ; + nHeadChild = m_pGeomDB->GetNextGroup( nHeadChild) ; + } } ++ nIter ; } @@ -379,7 +399,7 @@ Machining::MyPrepareToolPreview( bool bDouble) if ( ! bDouble) m_vPreviewAxisIds.push_back( nNewTabRotAxisId) ; else - m_vPreviewAxisIdsBBL.push_back( nNewTabRotAxisId) ; + m_vPreviewAxisIdsDBL.push_back( nNewTabRotAxisId) ; // aggiungo il versore invertito int nChildId = m_pGeomDB->GetFirstInGroup( nParentId) ; while ( nChildId != GDB_ID_NULL) { @@ -478,7 +498,7 @@ Machining::MyPrepareToolPreview( bool bDouble) if ( ! bDouble) m_vPreviewAxisIds.push_back( nNewParentId) ; else - m_vPreviewAxisIdsBBL.push_back( nNewParentId) ; + m_vPreviewAxisIdsDBL.push_back( nNewParentId) ; // memorizzo la sua posizione iniziale double dAxisPos = 0. ; bOk = bOk && pMch->GetAxisPos( sParentName, dAxisPos) && @@ -551,10 +571,14 @@ Machining::MyPrepareToolPreview( bool bDouble) bOk = bOk && m_pGeomDB->GetName( nExitGrpId, sExitGrpName) ; int nFrId = GDB_ID_NULL ; if ( bOk) { - if ( ! bDouble) + if ( ! bDouble) { nFrId = m_pGeomDB->GetFirstNameInGroup( m_nPreviewHeadId, "_" + sExitGrpName) ; - else + m_nPreviewExitId = m_pGeomDB->GetFirstNameInGroup( m_nPreviewHeadId, sExitGrpName) ; + } + else { nFrId = m_pGeomDB->GetFirstNameInGroup( m_nPreviewHeadIdDBL, "_" + sExitGrpName) ; + m_nPreviewExitIdDBL = m_pGeomDB->GetFirstNameInGroup( m_nPreviewHeadIdDBL, sExitGrpName) ; + } } bOk = bOk && ( nFrId != GDB_ID_NULL) ; const IGeoFrame3d* frExit = ( bOk ? GetGeoFrame3d( m_pGeomDB->GetGeoObj( nFrId)) : nullptr) ; @@ -631,7 +655,7 @@ Machining::PrepareToolPreview( void) m_nPreviewToolTip = GDB_ID_NULL ; m_nPreviewToolTipDBL = GDB_ID_NULL ; m_vPreviewAxisIds.clear() ; - m_vPreviewAxisIdsBBL.clear() ; + m_vPreviewAxisIdsDBL.clear() ; // preparo l'anteprima per il gruppo ST bool bOk = true ; @@ -680,10 +704,12 @@ Machining::RemoveToolPreview( void) // reset delle variabili membro m_nPreviewHeadId = GDB_ID_NULL ; m_nPreviewHeadIdDBL = GDB_ID_NULL ; + m_nPreviewExitId = GDB_ID_NULL ; + m_nPreviewExitIdDBL = GDB_ID_NULL ; m_nPreviewToolTip = GDB_ID_NULL ; m_nPreviewToolTipDBL = GDB_ID_NULL ; m_vPreviewAxisIds.clear() ; - m_vPreviewAxisIdsBBL.clear() ; + m_vPreviewAxisIdsDBL.clear() ; return true ; } @@ -750,8 +776,10 @@ Machining::GetToolPreviewNext( int nEntId, int nParentId, int nStId) const // se prima entità, eventuale attivazione uscite di gruppo a forare if ( nEntId == GDB_ID_NULL && m_pGeomDB->ExistsInfo( nNewParentId, KEY_DRACEX)) { INTVECTOR vActExit ; - if ( m_pGeomDB->GetInfo( nNewParentId, KEY_DRACEX, vActExit)) + if ( m_pGeomDB->GetInfo( nNewParentId, KEY_DRACEX, vActExit)) { ActivateDrillingUnit( m_nPreviewHeadId, vActExit) ; + MyShowMultiDrillingTool( vActExit) ; + } } return nNewId ; } @@ -760,8 +788,10 @@ Machining::GetToolPreviewNext( int nEntId, int nParentId, int nStId) const // eventuale attivazione uscite di gruppo a forare if ( m_pGeomDB->ExistsInfo( nNewParentId, KEY_DRACEX)) { INTVECTOR vActExit ; - if ( m_pGeomDB->GetInfo( nNewParentId, KEY_DRACEX, vActExit)) + if ( m_pGeomDB->GetInfo( nNewParentId, KEY_DRACEX, vActExit)) { ActivateDrillingUnit( m_nPreviewHeadId, vActExit) ; + MyShowMultiDrillingTool( vActExit) ; + } } // recupero la prima entità del successivo gruppo nNewId = m_pGeomDB->GetFirstInGroup( nNewParentId) ; @@ -793,8 +823,10 @@ Machining::GetToolPreviewPrev( int nEntId, int nParentId, int nStId) const // eventuale attivazione uscite di gruppo a forare if ( m_pGeomDB->ExistsInfo( nNewParentId, KEY_DRACEX)) { INTVECTOR vActExit ; - if ( m_pGeomDB->GetInfo( nNewParentId, KEY_DRACEX, vActExit)) + if ( m_pGeomDB->GetInfo( nNewParentId, KEY_DRACEX, vActExit)) { ActivateDrillingUnit( m_nPreviewHeadId, vActExit) ; + MyShowMultiDrillingTool( vActExit) ; + } } // recupero l'ultima entità del precedente gruppo nNewId = m_pGeomDB->GetLastInGroup( nNewParentId) ; @@ -852,7 +884,7 @@ Machining::MyToolPreview( int nEntId, bool bDouble) const } // scorro gli assi dentro al gruppo "ST" ( considero solo quelli rotativi) - const INTVECTOR& vCurrPreviewAxisIds = ( ! bDouble ? m_vPreviewAxisIds : m_vPreviewAxisIdsBBL) ; + const INTVECTOR& vCurrPreviewAxisIds = ( ! bDouble ? m_vPreviewAxisIds : m_vPreviewAxisIdsDBL) ; for ( auto Iter = vCurrPreviewAxisIds.begin() ; Iter != vCurrPreviewAxisIds.end() ; ++ Iter) { // recupero l'Id dell'asse corrente int nAxisId = *Iter ; @@ -1169,6 +1201,43 @@ Machining::CalcMirrorByDouble( int nClId, const string& sUserNotes) return true ; } +//---------------------------------------------------------------------------- +bool +Machining::MyShowMultiDrillingTool( const INTVECTOR& vActExit) const +{ + // verifico validità del Flag + if ( m_nLookFlag != MCH_LOOK_NONE && m_nLookFlag != MCH_LOOK_TAB_TOOL && m_nLookFlag != MCH_LOOK_TAB_HEAD) + return false ; + // se non ho visibilità solo utensile, non faccio nulla + if ( m_nLookFlag != MCH_LOOK_TAB_TOOL) + return false ; + + // verifico che il gruppo di preview della testa sia valido + if ( m_nPreviewHeadId == GDB_ID_NULL) + return false ; + + // recupero i nomi delle uscite da visualizzare nella preview + STRVECTOR vsExit ; vsExit.resize( vActExit.size()) ; + for ( int i = 0 ; i < ssize( vActExit) ; ++ i) + vsExit[i] = MCH_EXIT + ToString( vActExit[i]) ; + + // rendo visibili solo i gruppi nella preview inerenti + int nChildHeadId = m_pGeomDB->GetFirstInGroup( m_nPreviewHeadId) ; + while ( nChildHeadId != GDB_ID_NULL) { + // recupero il nome del gruppo corrente + string sName ; + m_pGeomDB->GetName( nChildHeadId, sName) ; + // verifico se attivare o meno il gruppo corrente + bool bStatusOn = ( find_if( vsExit.begin(), vsExit.end(), [&]( const string& sExitName) { + return EqualNoCase( sExitName, sName) ; }) != vsExit.end()) ; + m_pGeomDB->SetStatus( nChildHeadId, bStatusOn ? GDB_ST_ON : GDB_ST_OFF) ; + // passo al gruppo successivo + nChildHeadId = m_pGeomDB->GetNextGroup( nChildHeadId) ; + } + + return true ; +} + //---------------------------------------------------------------------------- bool Machining::ActivateDrillingUnit( int nHeadId, const INTVECTOR& vActExit) const diff --git a/Machining.h b/Machining.h index ea81632..c944a9b 100644 --- a/Machining.h +++ b/Machining.h @@ -72,17 +72,20 @@ class Machining : public Operation bool MyPrepareToolPreview( bool bDouble) ; bool MyChangeToolPreviewShow( int nLookFlag, bool bDouble) ; bool MyToolPreview( int nEntId, bool bDouble) const ; + bool MyShowMultiDrillingTool( const INTVECTOR& vActExit) const ; private : int m_nLookFlag ; // flag di Visualizzazione per Preview // lavorazione singola - int m_nPreviewHeadId ; // Id del gruppo testa di Preview + int m_nPreviewHeadId ; // Id del gruppo della testa di Preview + int m_nPreviewExitId ; // Id del gruppo dell'uscita di Preview int m_nPreviewToolTip ; // Id del gruppo contenente il punto ToolTip INTVECTOR m_vPreviewAxisIds ; // indici degli assi di Preview // lavorazione in doppio - int m_nPreviewHeadIdDBL ; // Id della testa di Preview + int m_nPreviewHeadIdDBL ; // Id del gruppo della testa di Preview + int m_nPreviewExitIdDBL ; // Id del gruppo dell'uscita di Preview int m_nPreviewToolTipDBL ; // Id del gruppo contenente il punto di ToolTip - INTVECTOR m_vPreviewAxisIdsBBL ; // indici degli assi di Preview + INTVECTOR m_vPreviewAxisIdsDBL ; // indici degli assi di Preview } ; //----------------------------------------------------------------------------