From c4288febce0961d88ac90773a8a9bd5b37cf92f4 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 20 Apr 2015 08:39:23 +0000 Subject: [PATCH] EgtMachKernel 1.6d3 : - refactoring e correzioni. --- EgtMachKernel.rc | Bin 11774 -> 11774 bytes EgtMachKernel.vcxproj | 5 +- EgtMachKernel.vcxproj.filters | 11 +- MachMgr.cpp | 1105 --------------------------------- MachMgr.h | 18 +- MachMgrBasic.cpp | 192 ++++++ MachMgrMachGroups.cpp | 307 +++++++++ MachMgrParts.cpp | 273 ++++++++ MachMgrRawParts.cpp | 503 +++++++++++++++ 9 files changed, 1304 insertions(+), 1110 deletions(-) delete mode 100644 MachMgr.cpp create mode 100644 MachMgrBasic.cpp create mode 100644 MachMgrMachGroups.cpp create mode 100644 MachMgrParts.cpp create mode 100644 MachMgrRawParts.cpp diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 86698706460173af8b0052e16a8de34d247cf00e..0cc0023af62b2596f95cbd1daa1335bd0746e162 100644 GIT binary patch delta 97 zcmewt{V#gMFE&Qw&A-`fnHh~IKa|wnoW?bQ1uSxrY4Qod0+^@}R1`^_2jk{d(jGv4 NK<#LXK~l;gTmUD-Bai?9 delta 97 zcmewt{V#gMFE&P_&A-`fnHh~HKa|wnoW?bQ1uSxrY4Qod0+^@}R1`^_2jk{d(jGv4 NK<#LXK~l;gTmU8!BZvS1 diff --git a/EgtMachKernel.vcxproj b/EgtMachKernel.vcxproj index b7b0695..880acf5 100644 --- a/EgtMachKernel.vcxproj +++ b/EgtMachKernel.vcxproj @@ -205,7 +205,10 @@ copy $(TargetPath) \EgtProg\Dll64 - + + + + Create Create diff --git a/EgtMachKernel.vcxproj.filters b/EgtMachKernel.vcxproj.filters index a24850b..0a5dfa0 100644 --- a/EgtMachKernel.vcxproj.filters +++ b/EgtMachKernel.vcxproj.filters @@ -27,7 +27,16 @@ Source Files\General - + + Source Files + + + Source Files + + + Source Files + + Source Files diff --git a/MachMgr.cpp b/MachMgr.cpp deleted file mode 100644 index 622b7d8..0000000 --- a/MachMgr.cpp +++ /dev/null @@ -1,1105 +0,0 @@ -//---------------------------------------------------------------------------- -// EgalTech 2015-2015 -//---------------------------------------------------------------------------- -// File : MachMgr.cpp Data : 23.03.15 Versione : 1.6c6 -// Contenuto : Implementazione della classe MachMgr. -// -// -// -// Modifiche : 23.03.15 DS Creazione modulo. -// -// -//---------------------------------------------------------------------------- - -//--------------------------- Include ---------------------------------------- -#include "stdafx.h" -#include "DllMain.h" -#include "MachMgr.h" -#include "MachConst.h" -#include "/EgtDev/Include/EGkCurveComposite.h" -#include "/EgtDev/Include/EGkGdbIterator.h" -#include "/EgtDev/Include/EGkGeoPoint3d.h" -#include "/EgtDev/Include/EGkStmStandard.h" -#include "/EgtDev/Include/EGkStmFromCurves.h" -#include "/EgtDev/Include/EGkGdbConst.h" -#include "/EgtDev/Include/EGnStringUtils.h" -#include "/EgtDev/Include/EgtKeyCodes.h" -#include "/EgtDev/Include/EgtPointerOwner.h" -#include "/EgtDev/Include/SELkKeyProc.h" -#include - -using namespace std ; - -//---------------------------------------------------------------------------- -IMachMgr* -CreateMachMgr( void) -{ - // verifico la chiave e le opzioni - unsigned int nOpt1, nOpt2 ; - int nOptExpDays ; - int nRet = GetKeyOptions( GetEMkKey(), KEY_BASELIB_PROD, KEY_BASELIB_VER, KEY_BASELIB_LEV, - nOpt1, nOpt2, nOptExpDays) ; - if ( nRet != KEY_OK) { - string sErr = "Error on Key (MKC/" + ToString( nRet) + ")" ; - LOG_ERROR( GetEMkLogger(), sErr.c_str()) ; - return false ; - } - if ( (nOpt1 & KEYOPT_EMK_BASE) == 0 || nOptExpDays < GetCurrDay()) { - string sErr = "Error on Key (MKC/OPT)" ; - LOG_ERROR( GetEMkLogger(), sErr.c_str()) ; - return false ; - } - // creo il MachMgr - return static_cast ( new(nothrow) MachMgr) ; -} - -//---------------------------------------------------------------------------- -// MachMgr -//---------------------------------------------------------------------------- -MachMgr::MachMgr( void) -{ - m_pGeomDB = nullptr ; - m_nMachBaseId = GDB_ID_NULL ; - m_nCurrMGrpId = GDB_ID_NULL ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::Init( IGeomDB* pGeomDB) -{ - m_pGeomDB = pGeomDB ; - m_nMachBaseId = GDB_ID_NULL ; - m_nCurrMGrpId = GDB_ID_NULL ; - return ( m_pGeomDB != nullptr) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::Update( void) -{ - // ricerca del gruppo base per le lavorazioni - m_nMachBaseId = FindMachBase( GDB_ID_ROOT) ; - // imposto gruppo di lavorazione corrente a nessuno - m_nCurrMGrpId = GDB_ID_NULL ; - // verifico i gruppi di lavorazione - int nId = m_pGeomDB->GetFirstGroupInGroup( m_nMachBaseId) ; - while ( nId != GDB_ID_NULL) { - // recupero successivo - int nNextId = m_pGeomDB->GetNextGroup( nId) ; - // se non è gruppo di lavoro, lo elimino - MachGrp mgData ; - if ( ! VerifyMachGroup( nId, mgData)) - m_pGeomDB->Erase( nId) ; - // passo al successivo - nId = nNextId ; - } - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::Insert( int nInsGrp) -{ - // verifica ed eventuale creazione del gruppo base per le lavorazioni - if ( ! CreateMachBase()) - return false ; - // cerco MachBase nel gruppo di inserimento - int nInsMachBaseId = FindMachBase( nInsGrp) ; - if ( nInsMachBaseId == GDB_ID_NULL) - return true ; - // ciclo sui suoi gruppi - int nId = m_pGeomDB->GetFirstGroupInGroup( nInsMachBaseId) ; - while ( nId != GDB_ID_NULL) { - // prossimo gruppo - int nNextId = m_pGeomDB->GetNextGroup( nId) ; - // se gruppo di lavoro - MachGrp mgData ; - if ( VerifyMachGroup( nId, mgData)) { - // recupero il nome e se già presente lo modifico - string sName ; - if ( ! m_pGeomDB->GetName( nId, sName) || - ! GetMachGroupNewName( sName) || - ! m_pGeomDB->SetName( nId, sName)) - return false ; - // sposto il gruppo - if ( ! m_pGeomDB->Relocate( nId, m_nMachBaseId, GDB_LAST_SON)) - return false ; - } - // passo al prossimo - nId = nNextId ; - } - - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::IsMachBase( int nId) const -{ - int nLevel ; - std::string sName ; - return ( m_pGeomDB != nullptr && - m_pGeomDB->GetLevel( nId, nLevel) && nLevel == GDB_LV_SYSTEM && - m_pGeomDB->GetName( nId, sName) && sName == MACH_BASE) ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::FindMachBase( int nGroup) const -{ - // verifica collegamento a DB geometrico - if ( m_pGeomDB == nullptr) - return GDB_ID_NULL ; - // cerco il gruppo di base delle macchinate nel gruppo passato - int nId = m_pGeomDB->GetFirstGroupInGroup( nGroup) ; - while ( nId != GDB_ID_NULL) { - // verifico se gruppo cercato - if ( IsMachBase( nId)) - return nId ; - // passo al successivo - nId = m_pGeomDB->GetNextGroup( nId) ; - } - return GDB_ID_NULL ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::VerifyMachBase( void) const -{ - // verifica collegamento a DB geometrico - if ( m_pGeomDB == nullptr) - return false ; - // verifica validità indice del gruppo base - if ( m_nMachBaseId == GDB_ID_NULL) - return false ; - // verifica esistenza gruppo di base per macchinate - if ( ! IsMachBase( m_nMachBaseId)) { - const_cast( m_nMachBaseId) = GDB_ID_NULL ; - return false ; - } - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::CreateMachBase( void) -{ - // se già esiste, esco con successo - if ( VerifyMachBase()) - return true ; - // non trovato, devo creare il gruppo di base delle lavorazioni - m_nMachBaseId = m_pGeomDB->InsertGroup( GDB_ID_NULL, GDB_ID_ROOT, GDB_FIRST_SON, GLOB_FRM) ; - if ( m_nMachBaseId == GDB_ID_NULL) - return false ; - // imposto nome del gruppo - m_pGeomDB->SetName( m_nMachBaseId, MACH_BASE) ; - // imposto livello del gruppo a System - m_pGeomDB->SetLevel( m_nMachBaseId, GDB_LV_SYSTEM) ; - return true ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::GetMachGroupNbr( void) const -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return 0 ; - // ritorno numero di gruppi di lavorazione - return m_pGeomDB->GetGroupObjs( m_nMachBaseId) ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::GetFirstMachGroup( void) const -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return GDB_ID_NULL ; - // recupero il primo sottogruppo - int nId = m_pGeomDB->GetFirstGroupInGroup( m_nMachBaseId) ; - return nId ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::GetNextMachGroup( int nId) const -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return GDB_ID_NULL ; - // verifico che il gruppo ricevuto sia corretto - if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId) - return GDB_ID_NULL ; - // recupero il successivo sottogruppo - int nNextId = m_pGeomDB->GetNextGroup( nId) ; - return nNextId ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::GetMachGroupNewName( string& sName) const -{ - // il parametro nome deve essere valido - if ( &sName == nullptr) - return false ; - // se gruppo base per le lavorazioni assente - if ( ! VerifyMachBase()) { - if ( sName.empty()) - sName = "Mach01" ; - return true ; - } - // verifico che il nome sia unico - int nCount = 1 ; - string sOrigName = sName ; - while ( GetMachGroupId( sName) != GDB_ID_NULL) { - ++ nCount ; - sName = sOrigName + "_" + ToString( nCount) ; - } - return true ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::AddMachGroup( const string& sName, const string& sMachineName) -{ - // verifica ed eventuale creazione del gruppo base per le lavorazioni - if ( ! CreateMachBase()) - return GDB_ID_NULL ; - // verifico nome non vuoto e non esista già un gruppo con lo stesso nome - if ( sName.empty() || GetMachGroupId( sName) != GDB_ID_NULL) - return GDB_ID_NULL ; - // verifico esistenza della macchina - // !!!! TO DO !!!! - // inserisco il gruppo in coda - int nNewId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nMachBaseId, GLOB_FRM) ; - if ( nNewId == GDB_ID_NULL) - return GDB_ID_NULL ; - // assegno il nome - m_pGeomDB->SetName( nNewId, sName) ; - // assegno la macchina - m_pGeomDB->SetInfo( nNewId, MACH_MACHINE_KEY, sMachineName) ; - // creo il sottogruppo per la macchina - int nGeoMachId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; - m_pGeomDB->SetName( nGeoMachId, MACH_GEOM_GROUP) ; - // creo il sottogruppo per l'attrezzaggio - int nSetupId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; - m_pGeomDB->SetName( nSetupId, MACH_SETUP_GROUP) ; - // creo il sottogruppo per i grezzi - int nRawGroupId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; - m_pGeomDB->SetName( nRawGroupId, MACH_RAW_GROUP) ; - // creo il sottogruppo per le operazioni - int nOperGroupId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; - m_pGeomDB->SetName( nOperGroupId, MACH_OPER_GROUP) ; - // rendo corrente il gruppo - if ( ! SetCurrMachGroup( nNewId)) { - m_pGeomDB->Erase( nNewId) ; - return GDB_ID_NULL ; - } - // restituisco l'identificativo del gruppo - return nNewId ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::RemoveMachGroup( int nId) -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return false ; - // verifico sia veramente un gruppo di lavoro - if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId) - return false ; - // se gruppo corrente, devo definire nuovo corrente - if ( m_nCurrMGrpId == nId) { - // passo al successivo e se non trovato al precedente - int nNextId = m_pGeomDB->GetNextGroup( nId) ; - if ( nNextId == GDB_ID_NULL) - nNextId = m_pGeomDB->GetPrevGroup( nId) ; - // imposto il nuovo corrente (potrebbe essere anche nessuno) - if ( nNextId != GDB_ID_NULL) - SetCurrMachGroup( nNextId) ; - else - ResetCurrMachGroup() ; - } - // eseguo rimozione - m_pGeomDB->Erase( nId) ; - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::VerifyMachGroup( int nId, MachGrp& mgData) const -{ - // verifica del parametro - if ( &mgData == nullptr) - return false ; - // verifica collegamento a DB geometrico - if ( m_pGeomDB == nullptr) - return false ; - // scansiono i sottogruppi - PtrOwner pIter( CreateGdbIterator( m_pGeomDB)) ; - if ( IsNull( pIter)) - return false ; - bool bMGeo = false ; - bool bSetup = false ; - bool bRaw = false ; - bool bOper = false ; - bool bIter = pIter->GoToFirstGroupInGroup( nId) ; - while ( bIter) { - string sName ; - if ( pIter->GetName( sName)) { - if ( sName == MACH_GEOM_GROUP) { - if ( ! bMGeo) - mgData.MGeoGroupId = pIter->GetId() ; - bMGeo = true ; - } - else if ( sName == MACH_SETUP_GROUP) { - if ( ! bSetup) - mgData.SetupGroupId = pIter->GetId() ; - bSetup = true ; - } - else if ( sName == MACH_RAW_GROUP) { - if ( ! bRaw) - mgData.RawGroupId = pIter->GetId() ; - bRaw = true ; - } - else if ( sName == MACH_OPER_GROUP) { - if ( ! bOper) - mgData.OperGroupId = pIter->GetId() ; - bOper = true ; - } - } - // passo al successivo - bIter = pIter->GoToNextGroup() ; - } - return ( bMGeo && bSetup && bRaw && bOper) ; -} - -//---------------------------------------------------------------------------- -string -MachMgr::GetMachGroupName( int nId) const -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return "" ; - // recupero il nome del gruppo riferito - string sName ; - m_pGeomDB->GetName( nId, sName) ; - return sName ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::GetMachGroupId( const string& sName) const -{ - // verifica dei parametri - if ( &sName == nullptr || sName.empty()) - return false ; - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return false ; - // recupero l'identificativo del gruppo con il nome indicato - PtrOwner pIter( CreateGdbIterator( m_pGeomDB)) ; - if ( IsNull( pIter)) - return false ; - bool bIter = pIter->GoToFirstGroupInGroup( m_nMachBaseId) ; - while( bIter) { - // verifico il nome - string sMGroupName ; - if ( pIter->GetName( sMGroupName) && sMGroupName == sName) - return pIter->GetId() ; - // passo al successivo - bIter = pIter->GoToNextGroup() ; - } - return GDB_ID_NULL ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::SetCurrMachGroup( int nId) -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return false ; - // verifico sia veramente un gruppo di lavoro - if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId) - return false ; - // recupero i suoi dati - MachGrp mgData ; - if ( ! VerifyMachGroup( nId, mgData)) { - m_nCurrMGrpId = GDB_ID_NULL ; - return false ; - } - // se esiste gruppo corrente, lo disabilito - if ( m_nCurrMGrpId != GDB_ID_NULL) { - // riporto i pezzi nei grezzi precedenti nella loro posizione standard - SwapParts( false) ; - // nascondo precedente gruppo corrente - m_pGeomDB->SetStatus( m_nCurrMGrpId, GDB_ST_OFF) ; - } - // imposto i dati del nuovo gruppo corrente - m_nCurrMGrpId = nId ; - m_cCurrMGrp = mgData ; - // porto i pezzi dalla loro posizione standard nei grezzi nuovi - SwapParts( true) ; - // nascondo pezzi rimasti sotto la radice - ShowRootParts( false) ; - // rendo visibile il nuovo gruppo corrente - m_pGeomDB->SetStatus( m_nCurrMGrpId, GDB_ST_ON) ; - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::ResetCurrMachGroup( void) -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return false ; - // se non c'è gruppo corrente, posso uscire subito - if ( m_nCurrMGrpId == GDB_ID_NULL) - return true ; - // riporto i pezzi nei grezzi nella loro posizione standard - SwapParts( false) ; - // visualizzo pezzi rimasti sotto la radice - ShowRootParts( true) ; - // nascondo gruppo corrente - m_pGeomDB->SetStatus( m_nCurrMGrpId, GDB_ST_OFF) ; - // dichiaro nessun gruppo corrente - m_nCurrMGrpId = GDB_ID_NULL ; - return true ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::GetCurrMachGroup( void) const -{ - // verifica del gruppo base per le lavorazioni - if ( ! VerifyMachBase()) - return GDB_ID_NULL ; - // recupero l'indice del gruppo corrente - return m_nCurrMGrpId ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::AddRawPart( const Point3d& ptOrig, double dWidth, double dLen, double dHeight, Color cCol) -{ - // recupero il gruppo dei grezzi nella macchinata corrente - int nRawGroupId = GetCurrRawGroupId() ; - if ( nRawGroupId == GDB_ID_NULL) - return GDB_ID_NULL ; - // creo il solido - PtrOwner pStm( GetSurfTriMeshBox( dWidth, dLen, dHeight)) ; - if ( IsNull( pStm)) - return GDB_ID_NULL ; - // inserisco il gruppo del grezzo nella macchinata - int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, Frame3d( ptOrig)) ; - if ( nRawId == GDB_ID_NULL) - return GDB_ID_NULL ; - // assegno il nome al gruppo - bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ; - // inserisco il solido nel gruppo - int nId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pStm)) ; - bOk = bOk && ( nId != GDB_ID_NULL) ; - // assegno il nome al solido - bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ; - // assegno il colore al solido - bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ; - // calcolo il punto centro del solido - bOk = bOk && SetRawPartCenter( nRawId) ; - // se qualcosa è andato storto, cancello tutto - if ( ! bOk) { - m_pGeomDB->Erase( nRawId) ; - return GDB_ID_NULL ; - } - // tutto ok - return nRawId ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol) -{ - // recupero il gruppo dei grezzi nella macchinata corrente - int nRawGroupId = GetCurrRawGroupId() ; - if ( nRawGroupId == GDB_ID_NULL) - return GDB_ID_NULL ; - // recupero l'ingombro della curva in globale - BBox3d b3Crv ; - if ( ! m_pGeomDB->GetGlobalBBox( nCrvId, b3Crv)) - return GDB_ID_NULL ; - // recupero il riferimento della curva - Frame3d frCrv ; - if ( ! m_pGeomDB->GetGlobFrame( nCrvId, frCrv)) - return GDB_ID_NULL ; - // recupero la curva - const ICurve* pCrv = GetCurve( m_pGeomDB->GetGeoObj( nCrvId)) ; - if ( pCrv == nullptr) - return GDB_ID_NULL ; - // copio la curva in una composita - PtrOwner pMyCrv( CreateCurveComposite()) ; - if ( IsNull( pMyCrv) || ! pMyCrv->AddCurve( *pCrv)) - return GDB_ID_NULL ; - // determino il riferimento del grezzo - Point3d ptOrig = b3Crv.GetMin() ; - ptOrig.z = dZmin ; - Frame3d frRaw( ptOrig) ; - // porto la curva in questo riferimento - pMyCrv->LocToLoc( frCrv, frRaw) ; - // la schiaccio a Z = 0 - if ( ! pMyCrv->Scale( Frame3d(), 1, 1, 0)) - return GDB_ID_NULL ; - // se non è chiusa, la chiudo - if ( ! pMyCrv->IsClosed()) - pMyCrv->Close() ; - // la oriento in senso CCW - double dAreaXY ; - if ( ! pMyCrv->GetAreaXY( dAreaXY)) - return GDB_ID_NULL ; - if ( dAreaXY < 0) - pMyCrv->Invert() ; - // ne eseguo l'offset - if ( ! pMyCrv->SimpleOffset( dOverMat, ICurve::OFF_EXTEND)) - return GDB_ID_NULL ; - // creo il solido - PtrOwner pStm( GetSurfTriMeshByExtrusion( Get( pMyCrv), Vector3d(0,0,dHeight), true)) ; - if ( IsNull( pStm)) - return GDB_ID_NULL ; - // inserisco il gruppo del grezzo nella macchinata - int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ; - if ( nRawId == GDB_ID_NULL) - return GDB_ID_NULL ; - // assegno il nome al gruppo - bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ; - // inserisco il solido nel gruppo - int nId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pStm)) ; - bOk = bOk && ( nId != GDB_ID_NULL) ; - // assegno il nome al solido - bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ; - // assegno il colore al solido - bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ; - // calcolo il punto centro del solido - bOk = bOk && SetRawPartCenter( nRawId) ; - // se qualcosa è andato storto, cancello tutto - if ( ! bOk) { - m_pGeomDB->Erase( nRawId) ; - return GDB_ID_NULL ; - } - // tutto ok - return nRawId ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::AddRawPart( int nSurfId, Color cCol) -{ - // recupero il gruppo dei grezzi nella macchinata corrente - int nRawGroupId = GetCurrRawGroupId() ; - if ( nRawGroupId == GDB_ID_NULL) - return GDB_ID_NULL ; - // recupero l'ingombro della superficie in globale - BBox3d b3Crv ; - if ( ! m_pGeomDB->GetGlobalBBox( nSurfId, b3Crv)) - return GDB_ID_NULL ; - // inserisco il gruppo del grezzo nella macchinata - Frame3d frRaw( b3Crv.GetMin()) ; - int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ; - if ( nRawId == GDB_ID_NULL) - return GDB_ID_NULL ; - // assegno il nome al gruppo - bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ; - // copio la superficie nel gruppo - int nId = m_pGeomDB->CopyGlob( nSurfId, GDB_ID_NULL, nRawId) ; - bOk = bOk && ( nId != GDB_ID_NULL) ; - // assegno il nome al solido - bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ; - // assegno il colore al solido - bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ; - // rendo visibile il solido - bOk = bOk && m_pGeomDB->SetStatus( nId, GDB_ST_ON) ; - // calcolo il punto centro del solido - bOk = bOk && SetRawPartCenter( nRawId) ; - // se qualcosa è andato storto, cancello tutto - if ( ! bOk) { - m_pGeomDB->Erase( nRawId) ; - return GDB_ID_NULL ; - } - // nascondo la superficie originale - m_pGeomDB->SetStatus( nSurfId, GDB_ST_OFF) ; - // tutto ok - return nRawId ; -} - -//---------------------------------------------------------------------------- -int -MachMgr::AddRawPartWithPart( int nPartId, int nCrvSrfId, double dOverMat, Color cCol) -{ - // verifico il gruppo dei grezzi nella macchinata corrente - if ( GetCurrRawGroupId() == GDB_ID_NULL) - return GDB_ID_NULL ; - // verifico che il pezzo non sia già usato nella macchinata corrente - if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT) - return GDB_ID_NULL ; - // recupero il tipo di oggetto per definire il grezzo - int nGtype = m_pGeomDB->GetGeoType( nCrvSrfId) ; - // costruzione del grezzo - int nRawId = GDB_ID_NULL ; - // se grezzo da superficie (per ora senza possibilità di offset) - if ( ( nGtype & GEO_SURF) != 0) { - // inserisco il grezzo - nRawId = AddRawPart( nCrvSrfId, cCol) ; - } - // se altrimenti grezzo da contorno - else if ( ( nGtype & GEO_CURVE) != 0) { - // determino l'ingombro del pezzo - BBox3d b3Part ; - if ( ! m_pGeomDB->GetGlobalBBox( nPartId, b3Part)) - return GDB_ID_NULL ; - // inserisco il grezzo - double dZmin = b3Part.GetMin().z ; - double dH = ( b3Part.GetMax() - b3Part.GetMin()).z ; - if ( dH < RAW_MIN_H) - dH = RAW_MIN_H ; - nRawId = AddRawPart( nCrvSrfId, dOverMat, dZmin, dH, cCol) ; - } - // altrimenti grezzo rettangolare da ingombro pezzo - else { - // determino l'ingombro del pezzo - BBox3d b3Part ; - if ( ! m_pGeomDB->GetGlobalBBox( nPartId, b3Part)) - return GDB_ID_NULL ; - // deduco i dati del grezzo - Point3d ptMin = b3Part.GetMin() - Vector3d( dOverMat, dOverMat, 0) ; - Point3d ptMax = b3Part.GetMax() + Vector3d( dOverMat, dOverMat, 0) ; - Vector3d vtDiff = ptMax - ptMin ; - if ( vtDiff.z < RAW_MIN_H) - vtDiff.z = RAW_MIN_H ; - // inserisco il grezzo - nRawId = AddRawPart( ptMin, vtDiff.x, vtDiff.y, vtDiff.z, cCol) ; - } - // verifico il grezzo appena calcolato - if ( nRawId == GDB_ID_NULL) - return GDB_ID_NULL ; - // recupero il riferimento del grezzo - Frame3d frRaw ; - m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw) ; - // determino il riferimento del pezzo rispetto al grezzo - Frame3d frPart ; - m_pGeomDB->GetGroupGlobFrame( nPartId, frPart) ; - frPart.ToLoc( frRaw) ; - // inserisco il pezzo - int nGroup = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawId, frPart) ; - if ( nGroup == GDB_ID_NULL || - ! m_pGeomDB->GroupSwap( nPartId, nGroup, true, true)) - return GDB_ID_NULL ; - // mi assicuro sia visibile il pezzo e nascosto il gruppo - m_pGeomDB->SetStatus( nPartId, GDB_ST_ON) ; - m_pGeomDB->SetStatus( nGroup, GDB_ST_OFF) ; - return nRawId ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::AddPartToRawPart( int nPartId, const Point3d& ptPos, int nRawId) -{ - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // verifico che il pezzo non sia già usato nella macchinata corrente - if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT) - return false ; - // recupero il riferimento del grezzo - Frame3d frRaw ; - m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw) ; - // recupero box del pezzo - BBox3d b3Part ; - if ( ! m_pGeomDB->GetGlobalBBox( nPartId, b3Part)) - return false ; - // recupero il riferimento del pezzo - Frame3d frPart ; - m_pGeomDB->GetGroupGlobFrame( nPartId, frPart) ; - // muovo riferimento del pezzo per posizionare correttamente nel grezzo - Vector3d vtMove = ptPos - b3Part.GetMin() ; - frPart.Translate( vtMove) ; - // esprimo questo riferimento rispetto al grezzo - frPart.ToLoc( frRaw) ; - // inserisco il pezzo - int nGroup = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawId, frPart) ; - if ( nGroup == GDB_ID_NULL || - ! m_pGeomDB->GroupSwap( nPartId, nGroup, true, true)) - return false ; - // mi assicuro sia visibile il pezzo e nascosto il gruppo - m_pGeomDB->SetStatus( nPartId, GDB_ST_ON) ; - m_pGeomDB->SetStatus( nGroup, GDB_ST_OFF) ; - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::ModifyRawPartHeight( int nRawId, double dHeight) -{ - // la nuova altezza non può essere nulla - if ( dHeight < EPS_SMALL) - return false ; - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // recupero il solido del grezzo - int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; - if ( nRawSolId == GDB_ID_NULL) - return false ; - // recupero il box del grezzo - BBox3d b3Raw ; - if ( ! m_pGeomDB->GetLocalBBox( nRawSolId, b3Raw)) - return false ; - // determino il coefficente di scalatura in Z - double dOldH = b3Raw.GetMax().z - b3Raw.GetMin().z ; - if ( dOldH < EPS_SMALL) - return false ; - double dCoeff = dHeight / dOldH ; - // eseguo scalatura - bool bOk = m_pGeomDB->Scale( nRawSolId, Frame3d( b3Raw.GetMin()), 1, 1, dCoeff) ; - // dichiaro centro da ricalcolare - ResetRawPartCenter( nRawId) ; - return bOk ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::RemoveRawPart( int nRawId) -{ - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // devo estrarre i pezzi e riportarli in lista generale - SwapRawPartParts( nRawId, false) ; - // cancello il grezzo - m_pGeomDB->Erase( nRawId) ; - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::VerifyRawPart( int nRawId) const -{ - // recupero il gruppo dei grezzi nella macchinata corrente - int nRawGroupId = GetCurrRawGroupId() ; - if ( nRawGroupId == GDB_ID_NULL) - return false ; - // verifico che questo grezzo ne faccia parte - if ( m_pGeomDB->GetParentId( nRawId) != nRawGroupId) - return false ; - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::TranslateRawPart( int nRawId, const Vector3d& vtMove) -{ - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // eseguo traslazione in globale - return m_pGeomDB->TranslateGlob( nRawId, vtMove) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::RotateRawPart( int nRawId, const Vector3d& vtAx, double dAngRotDeg) -{ - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // recupero centro del grezzo - Point3d ptAx ; - if ( ! GetRawPartCenter( nRawId, ptAx)) - return false ; - // eseguo rotazione in globale attorno al centro del grezzo - return m_pGeomDB->RotateGlob( nRawId, ptAx, vtAx, dAngRotDeg) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::MoveToCornerRawPart( int nRawId, const Point3d& ptP, int nFlag) -{ - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // recupero il solido - int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; - // determino il box del grezzo (solo il solido ovviamente) - BBox3d b3Raw ; - if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw)) - return false ; - // calcolo il movimento necessario - Vector3d vtMove ; - switch ( nFlag) { - case RPCR_TL : - vtMove = ptP - Point3d( b3Raw.GetMin().x, b3Raw.GetMax().y, b3Raw.GetMin().z) ; - break ; - case RPCR_TR : - vtMove = ptP - b3Raw.GetMax() ; - break ; - default : // RPCP_BL - vtMove = ptP - b3Raw.GetMin() ; - break ; - case RPCR_BR : - vtMove = ptP - Point3d( b3Raw.GetMax().x, b3Raw.GetMin().y, b3Raw.GetMin().z) ; - break ; - } - // eseguo traslazione in globale - return m_pGeomDB->TranslateGlob( nRawId, vtMove) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::MoveToCenterRawPart( int nRawId, const Point3d& ptP, int nFlag) -{ - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // recupero il solido - int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; - // determino il box del grezzo (solo il solido ovviamente) - BBox3d b3Raw ; - if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw)) - return false ; - // ricavo il centro dal box (in generale non è il centro geometrico) - Point3d ptCen ; - b3Raw.GetCenter( ptCen) ; - // calcolo il movimento necessario - Vector3d vtMove ; - switch ( nFlag) { - case RPCE_TC : - vtMove = ptP - Point3d( ptCen.x, b3Raw.GetMax().y, ptCen.z) ; - break ; - default : // RPCE_ML - vtMove = ptP - Point3d( b3Raw.GetMin().x, ptCen.y, ptCen.z) ; - break ; - case RPCE_MR : - vtMove = ptP - Point3d( b3Raw.GetMax().x, ptCen.y, ptCen.z) ; - break ; - case RPCE_BC : - vtMove = ptP - Point3d( ptCen.x, b3Raw.GetMin().y, ptCen.z) ; - break ; - case RPCE_MC : - vtMove = ptP - Point3d( ptCen.x, ptCen.y, b3Raw.GetMin().z) ; - break ; - } - // eseguo traslazione in globale - return m_pGeomDB->TranslateGlob( nRawId, vtMove) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::RemovePartFromRawPart( int nPartId) -{ - // verifico DB geometrico - if ( m_pGeomDB == nullptr) - return false ; - // recupero l'indice del grezzo - int nRawId = m_pGeomDB->GetParentId( nPartId) ; - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // devo riportare il pezzo in lista generale - int nBase ; - if ( m_pGeomDB->GetInfo( nPartId, GDB_SI_BASE, nBase)) { - // eseguo lo scambio - m_pGeomDB->GroupSwap( nPartId, nBase, true, true) ; - // mi assicuro sia nascosto - m_pGeomDB->SetStatus( nPartId, GDB_ST_OFF) ; - // cancello il gruppo di riferimento - m_pGeomDB->Erase( nBase) ; - return true ; - } - return false ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::TranslatePartInRawPart( int nPartId, const Vector3d& vtMove) -{ - // verifico DB geometrico - if ( m_pGeomDB == nullptr) - return false ; - // recupero l'indice del grezzo - int nRawId = m_pGeomDB->GetParentId( nPartId) ; - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // eseguo traslazione in globale - return m_pGeomDB->TranslateGlob( nPartId, vtMove) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::RotatePartInRawPart( int nPartId, const Vector3d& vtAx, double dAngRotDeg) -{ - // verifico DB geometrico - if ( m_pGeomDB == nullptr) - return false ; - // recupero l'indice del grezzo - int nRawId = m_pGeomDB->GetParentId( nPartId) ; - // verifica validità grezzo - if ( ! VerifyRawPart( nRawId)) - return false ; - // recupero riferimento globale del pezzo - Frame3d frRef ; - if ( ! m_pGeomDB->GetGroupGlobFrame( nPartId, frRef)) - return false ; - // recupero box del pezzo in locale (non cambia con la giacitura globale) - BBox3d b3Box ; - if ( ! m_pGeomDB->GetLocalBBox( nPartId, b3Box)) - return false ; - // ne calcolo il centro e lo porto in globale - Point3d ptCen ; - b3Box.GetCenter( ptCen) ; - ptCen.ToGlob( frRef) ; - // eseguo rotazione in globale attorno al centro del pezzo - return m_pGeomDB->RotateGlob( nPartId, ptCen, vtAx, dAngRotDeg) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::SetRawPartCenter( int nRawId) -{ - // recupero il solido - int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; - const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nRawSolId)) ; - if ( pStm == nullptr) - return false ; - // recupero il punto centro, se non esiste lo creo - int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; - if ( nGPntId == GDB_ID_NULL) { - PtrOwner pGeoPnt( CreateGeoPoint3d()) ; - nGPntId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pGeoPnt)) ; - m_pGeomDB->SetName( nGPntId, MACH_RAW_CENTER) ; - Color cCol ; - if ( m_pGeomDB->GetCalcMaterial( nRawSolId, cCol)) - m_pGeomDB->SetMaterial( nGPntId, cCol) ; - } - IGeoPoint3d* pGeoPnt = GetGeoPoint3d( m_pGeomDB->GetGeoObj( nGPntId)) ; - if ( pGeoPnt == nullptr) - return false ; - // calcolo il valore del centro - Point3d ptCen ; - if ( ! pStm->GetCentroid( ptCen)) - return false ; - // aggiorno e imposto modo a standard - return ( pGeoPnt->Set( ptCen) && m_pGeomDB->SetMode( nGPntId, GDB_MD_STD)) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::ResetRawPartCenter( int nRawId) -{ - // recupero il punto centro - int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; - if ( nGPntId == GDB_ID_NULL) - return true ; - // imposto modo a bloccato - return m_pGeomDB->SetMode( nGPntId, GDB_MD_LOCKED) ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::GetRawPartCenter( int nRawId, Point3d& ptCen) -{ - // cerco di recuperare l'oggetto - int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; - // ne verifico la validità - int nMode ; - if ( nGPntId == GDB_ID_NULL || - ! m_pGeomDB->GetMode( nGPntId, nMode) || nMode != GDB_MD_STD) { - // provo a crearlo - SetRawPartCenter( nRawId) ; - nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; - // se c'è ancora errore - if ( nGPntId == GDB_ID_NULL) - return false ; - } - // ne recupero il riferimento globale - Frame3d frGPnt ; - if ( ! m_pGeomDB->GetGlobFrame( nGPntId, frGPnt)) - return false ; - // recupero il punto - IGeoPoint3d* pGeoPnt = GetGeoPoint3d( m_pGeomDB->GetGeoObj( nGPntId)) ; - if ( pGeoPnt == nullptr) - return false ; - ptCen = pGeoPnt->GetPoint() ; - ptCen.ToGlob( frGPnt) ; - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::SwapParts( bool bToRawPart) -{ - // recupero il gruppo dei grezzi correnti - int nRawGroupId = GetCurrRawGroupId() ; - if ( nRawGroupId == GDB_ID_NULL) - return true ; - // ciclo sui grezzi - int nRawId = m_pGeomDB->GetFirstGroupInGroup( nRawGroupId) ; - while ( nRawId != GDB_ID_NULL) { - // sistemo i pezzi del grezzo - SwapRawPartParts( nRawId, bToRawPart) ; - // passo al successivo - nRawId = m_pGeomDB->GetNextGroup( nRawId) ; - } - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::SwapRawPartParts( int nRawId, bool bToRawPart) -{ - // ciclo sui gruppi nel grezzo - int nId = m_pGeomDB->GetFirstGroupInGroup( nRawId) ; - while ( nId != GDB_ID_NULL) { - // recupero il successivo - int nNextId = m_pGeomDB->GetNextGroup( nId) ; - // se devo portare i pezzi dalla radice al grezzo - if ( bToRawPart) { - // se è un riferimento al pezzo - int nSou ; - if ( m_pGeomDB->GetInfo( nId, GDB_SI_SOURCE, nSou)) { - m_pGeomDB->GroupSwap( nSou, nId, true, true) ; - // mi assicuro sia visibile - m_pGeomDB->SetStatus( nSou, GDB_ST_ON) ; - } - } - // altrimenti dal grezzo alla radice - else { - // se è un pezzo spostato - int nBase ; - if ( m_pGeomDB->GetInfo( nId, GDB_SI_BASE, nBase)) { - m_pGeomDB->GroupSwap( nId, nBase, true, true) ; - // mi assicuro sia nascosto - m_pGeomDB->SetStatus( nId, GDB_ST_OFF) ; - } - } - // passo al successivo - nId = nNextId ; - } - return true ; -} - -//---------------------------------------------------------------------------- -bool -MachMgr::ShowRootParts( bool bShow) -{ - // ciclo sui gruppi in radice - int nId = m_pGeomDB->GetFirstGroupInGroup( GDB_ID_ROOT) ; - while ( nId != GDB_ID_NULL) { - // se pezzo, lo nascondo - if ( ! IsMachBase( nId)) - m_pGeomDB->SetStatus( nId, ( bShow ? GDB_ST_ON : GDB_ST_OFF)) ; - // passo al successivo - nId = m_pGeomDB->GetNextGroup( nId) ; - } - return true ; -} diff --git a/MachMgr.h b/MachMgr.h index 3e23b2b..ebdc44c 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -36,7 +36,7 @@ struct MachGrp { class MachMgr : public IMachMgr { public : - // General + // Basic virtual bool Init( IGeomDB* pGeomDB) ; virtual bool Update( void) ; virtual bool Insert( int nInsGrp) ; @@ -52,16 +52,23 @@ class MachMgr : public IMachMgr virtual bool SetCurrMachGroup( int nId) ; virtual bool ResetCurrMachGroup( void) ; virtual int GetCurrMachGroup( void) const ; - // RawParts & Parts + // RawParts + virtual int GetRawPartNbr( void) const ; + virtual int GetFirstRawPart( void) const ; + virtual int GetNextRawPart( int nId) const ; virtual int AddRawPart( const Point3d& ptOrig, double dWidth, double dLen, double dHeight, Color cCol) ; virtual int AddRawPartWithPart( int nPartId, int nCrvSrfId, double dOverMat, Color cCol) ; - virtual bool AddPartToRawPart( int nPartId, const Point3d& ptPos, int nRawId) ; virtual bool ModifyRawPartHeight( int nRawId, double dHeight) ; virtual bool RemoveRawPart( int nRawId) ; virtual bool TranslateRawPart( int nRawId, const Vector3d& vtMove) ; virtual bool RotateRawPart( int nRawId, const Vector3d& vtAx, double dAngRotDeg) ; virtual bool MoveToCornerRawPart( int nRawId, const Point3d& ptCorner, int nFlag) ; virtual bool MoveToCenterRawPart( int nRawId, const Point3d& ptCenter, int nFlag) ; + // Parts + virtual int GetPartInRawPartNbr( int nRawId) const ; + virtual int GetFirstPartInRawPart( int nRawId) const ; + virtual int GetNextPartInRawPart( int nId) const ; + virtual bool AddPartToRawPart( int nPartId, const Point3d& ptPos, int nRawId) ; virtual bool RemovePartFromRawPart( int nPartId) ; virtual bool TranslatePartInRawPart( int nPartId, const Vector3d& vtMove) ; virtual bool RotatePartInRawPart( int nPartId, const Vector3d& vtAx, double dAngRotDeg) ; @@ -70,10 +77,12 @@ class MachMgr : public IMachMgr MachMgr( void) ; private : + // Basic inline bool IsMachBase( int nId) const ; int FindMachBase( int nGroupId) const ; bool VerifyMachBase( void) const ; bool CreateMachBase( void) ; + // MachGroups bool VerifyMachGroup( int nId, MachGrp& mgData) const ; int GetCurrMGeoId( void) const { return ( m_pGeomDB == nullptr) ? GDB_ID_NULL : @@ -87,12 +96,15 @@ class MachMgr : public IMachMgr int GetCurrOperId( void) const { return ( m_pGeomDB == nullptr) ? GDB_ID_NULL : (( m_nCurrMGrpId == GDB_ID_NULL) ? GDB_ID_NULL : m_cCurrMGrp.OperGroupId) ; } + // RawParts int AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol) ; int AddRawPart( int nSurfId, Color cCol) ; bool VerifyRawPart( int nRawId) const ; bool SetRawPartCenter( int nRawId) ; bool ResetRawPartCenter( int nRawId) ; bool GetRawPartCenter( int nRawId, Point3d& ptCen) ; + // Parts + bool AddPartToRawPart( int nPartId, int nRawId) ; bool SwapParts( bool bToRawPart) ; bool SwapRawPartParts( int nRawId, bool bToRawPart) ; bool ShowRootParts( bool bShow) ; diff --git a/MachMgrBasic.cpp b/MachMgrBasic.cpp new file mode 100644 index 0000000..099fadd --- /dev/null +++ b/MachMgrBasic.cpp @@ -0,0 +1,192 @@ +//---------------------------------------------------------------------------- +// EgalTech 2015-2015 +//---------------------------------------------------------------------------- +// File : MachMgr.cpp Data : 16.04.15 Versione : 1.6d3 +// Contenuto : Implementazione delle funzionalità base della classe MachMgr. +// +// +// +// Modifiche : 16.04.15 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "DllMain.h" +#include "MachMgr.h" +#include "MachConst.h" +#include "/EgtDev/Include/EGnStringUtils.h" +#include "/EgtDev/Include/EgtKeyCodes.h" +#include "/EgtDev/Include/SELkKeyProc.h" +#include + +using namespace std ; + +//---------------------------------------------------------------------------- +IMachMgr* +CreateMachMgr( void) +{ + // verifico la chiave e le opzioni + unsigned int nOpt1, nOpt2 ; + int nOptExpDays ; + int nRet = GetKeyOptions( GetEMkKey(), KEY_BASELIB_PROD, KEY_BASELIB_VER, KEY_BASELIB_LEV, + nOpt1, nOpt2, nOptExpDays) ; + if ( nRet != KEY_OK) { + string sErr = "Error on Key (MKC/" + ToString( nRet) + ")" ; + LOG_ERROR( GetEMkLogger(), sErr.c_str()) ; + return false ; + } + if ( (nOpt1 & KEYOPT_EMK_BASE) == 0 || nOptExpDays < GetCurrDay()) { + string sErr = "Error on Key (MKC/OPT)" ; + LOG_ERROR( GetEMkLogger(), sErr.c_str()) ; + return false ; + } + // creo il MachMgr + return static_cast ( new(nothrow) MachMgr) ; +} + +//---------------------------------------------------------------------------- +// MachMgr +//---------------------------------------------------------------------------- +MachMgr::MachMgr( void) +{ + m_pGeomDB = nullptr ; + m_nMachBaseId = GDB_ID_NULL ; + m_nCurrMGrpId = GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::Init( IGeomDB* pGeomDB) +{ + m_pGeomDB = pGeomDB ; + m_nMachBaseId = GDB_ID_NULL ; + m_nCurrMGrpId = GDB_ID_NULL ; + return ( m_pGeomDB != nullptr) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::Update( void) +{ + // ricerca del gruppo base per le lavorazioni + m_nMachBaseId = FindMachBase( GDB_ID_ROOT) ; + // imposto gruppo di lavorazione corrente a nessuno + m_nCurrMGrpId = GDB_ID_NULL ; + // verifico i gruppi di lavorazione + int nId = m_pGeomDB->GetFirstGroupInGroup( m_nMachBaseId) ; + while ( nId != GDB_ID_NULL) { + // recupero successivo + int nNextId = m_pGeomDB->GetNextGroup( nId) ; + // se non è gruppo di lavoro, lo elimino + MachGrp mgData ; + if ( ! VerifyMachGroup( nId, mgData)) + m_pGeomDB->Erase( nId) ; + // passo al successivo + nId = nNextId ; + } + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::Insert( int nInsGrp) +{ + // verifica ed eventuale creazione del gruppo base per le lavorazioni + if ( ! CreateMachBase()) + return false ; + // cerco MachBase nel gruppo di inserimento + int nInsMachBaseId = FindMachBase( nInsGrp) ; + if ( nInsMachBaseId == GDB_ID_NULL) + return true ; + // ciclo sui suoi gruppi + int nId = m_pGeomDB->GetFirstGroupInGroup( nInsMachBaseId) ; + while ( nId != GDB_ID_NULL) { + // prossimo gruppo + int nNextId = m_pGeomDB->GetNextGroup( nId) ; + // se gruppo di lavoro + MachGrp mgData ; + if ( VerifyMachGroup( nId, mgData)) { + // recupero il nome e se già presente lo modifico + string sName ; + if ( ! m_pGeomDB->GetName( nId, sName) || + ! GetMachGroupNewName( sName) || + ! m_pGeomDB->SetName( nId, sName)) + return false ; + // sposto il gruppo + if ( ! m_pGeomDB->Relocate( nId, m_nMachBaseId, GDB_LAST_SON)) + return false ; + } + // passo al prossimo + nId = nNextId ; + } + + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::IsMachBase( int nId) const +{ + int nLevel ; + std::string sName ; + return ( m_pGeomDB != nullptr && + m_pGeomDB->GetLevel( nId, nLevel) && nLevel == GDB_LV_SYSTEM && + m_pGeomDB->GetName( nId, sName) && sName == MACH_BASE) ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::FindMachBase( int nGroup) const +{ + // verifica collegamento a DB geometrico + if ( m_pGeomDB == nullptr) + return GDB_ID_NULL ; + // cerco il gruppo di base delle macchinate nel gruppo passato + int nId = m_pGeomDB->GetFirstGroupInGroup( nGroup) ; + while ( nId != GDB_ID_NULL) { + // verifico se gruppo cercato + if ( IsMachBase( nId)) + return nId ; + // passo al successivo + nId = m_pGeomDB->GetNextGroup( nId) ; + } + return GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::VerifyMachBase( void) const +{ + // verifica collegamento a DB geometrico + if ( m_pGeomDB == nullptr) + return false ; + // verifica validità indice del gruppo base + if ( m_nMachBaseId == GDB_ID_NULL) + return false ; + // verifica esistenza gruppo di base per macchinate + if ( ! IsMachBase( m_nMachBaseId)) { + const_cast( m_nMachBaseId) = GDB_ID_NULL ; + return false ; + } + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::CreateMachBase( void) +{ + // se già esiste, esco con successo + if ( VerifyMachBase()) + return true ; + // non trovato, devo creare il gruppo di base delle lavorazioni + m_nMachBaseId = m_pGeomDB->InsertGroup( GDB_ID_NULL, GDB_ID_ROOT, GDB_FIRST_SON, GLOB_FRM) ; + if ( m_nMachBaseId == GDB_ID_NULL) + return false ; + // imposto nome del gruppo + m_pGeomDB->SetName( m_nMachBaseId, MACH_BASE) ; + // imposto livello del gruppo a System + m_pGeomDB->SetLevel( m_nMachBaseId, GDB_LV_SYSTEM) ; + return true ; +} diff --git a/MachMgrMachGroups.cpp b/MachMgrMachGroups.cpp new file mode 100644 index 0000000..e641f5d --- /dev/null +++ b/MachMgrMachGroups.cpp @@ -0,0 +1,307 @@ +//---------------------------------------------------------------------------- +// EgalTech 2015-2015 +//---------------------------------------------------------------------------- +// File : MachMgrMachGroups.cpp Data : 16.04.15 Versione : 1.6d3 +// Contenuto : Implementazione gestione gruppi di lavoro della classe MachMgr. +// +// +// +// Modifiche : 16.04.15 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "DllMain.h" +#include "MachMgr.h" +#include "MachConst.h" +#include "/EgtDev/Include/EGkGdbIterator.h" +#include "/EgtDev/Include/EGnStringUtils.h" +#include "/EgtDev/Include/EgtPointerOwner.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +int +MachMgr::GetMachGroupNbr( void) const +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return 0 ; + // ritorno numero di gruppi di lavorazione + return m_pGeomDB->GetGroupObjs( m_nMachBaseId) ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetFirstMachGroup( void) const +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return GDB_ID_NULL ; + // recupero il primo sottogruppo + int nId = m_pGeomDB->GetFirstGroupInGroup( m_nMachBaseId) ; + return nId ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetNextMachGroup( int nId) const +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return GDB_ID_NULL ; + // verifico che il gruppo ricevuto sia corretto + if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId) + return GDB_ID_NULL ; + // recupero il successivo sottogruppo + int nNextId = m_pGeomDB->GetNextGroup( nId) ; + return nNextId ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::GetMachGroupNewName( string& sName) const +{ + // il parametro nome deve essere valido + if ( &sName == nullptr) + return false ; + // se gruppo base per le lavorazioni assente + if ( ! VerifyMachBase()) { + if ( sName.empty()) + sName = "Mach01" ; + return true ; + } + // verifico che il nome sia unico + int nCount = 1 ; + string sOrigName = sName ; + while ( GetMachGroupId( sName) != GDB_ID_NULL) { + ++ nCount ; + sName = sOrigName + "_" + ToString( nCount) ; + } + return true ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::AddMachGroup( const string& sName, const string& sMachineName) +{ + // verifica ed eventuale creazione del gruppo base per le lavorazioni + if ( ! CreateMachBase()) + return GDB_ID_NULL ; + // verifico nome non vuoto e non esista già un gruppo con lo stesso nome + if ( sName.empty() || GetMachGroupId( sName) != GDB_ID_NULL) + return GDB_ID_NULL ; + // verifico esistenza della macchina + // !!!! TO DO !!!! + // inserisco il gruppo in coda + int nNewId = m_pGeomDB->AddGroup( GDB_ID_NULL, m_nMachBaseId, GLOB_FRM) ; + if ( nNewId == GDB_ID_NULL) + return GDB_ID_NULL ; + // assegno il nome + m_pGeomDB->SetName( nNewId, sName) ; + // assegno la macchina + m_pGeomDB->SetInfo( nNewId, MACH_MACHINE_KEY, sMachineName) ; + // creo il sottogruppo per la macchina + int nGeoMachId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; + m_pGeomDB->SetName( nGeoMachId, MACH_GEOM_GROUP) ; + // creo il sottogruppo per l'attrezzaggio + int nSetupId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; + m_pGeomDB->SetName( nSetupId, MACH_SETUP_GROUP) ; + // creo il sottogruppo per i grezzi + int nRawGroupId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; + m_pGeomDB->SetName( nRawGroupId, MACH_RAW_GROUP) ; + // creo il sottogruppo per le operazioni + int nOperGroupId = m_pGeomDB->AddGroup( GDB_ID_NULL, nNewId, GLOB_FRM) ; + m_pGeomDB->SetName( nOperGroupId, MACH_OPER_GROUP) ; + // rendo corrente il gruppo + if ( ! SetCurrMachGroup( nNewId)) { + m_pGeomDB->Erase( nNewId) ; + return GDB_ID_NULL ; + } + // restituisco l'identificativo del gruppo + return nNewId ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::RemoveMachGroup( int nId) +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return false ; + // verifico sia veramente un gruppo di lavoro + if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId) + return false ; + // se gruppo corrente, devo definire nuovo corrente + if ( m_nCurrMGrpId == nId) { + // passo al successivo e se non trovato al precedente + int nNextId = m_pGeomDB->GetNextGroup( nId) ; + if ( nNextId == GDB_ID_NULL) + nNextId = m_pGeomDB->GetPrevGroup( nId) ; + // imposto il nuovo corrente (potrebbe essere anche nessuno) + if ( nNextId != GDB_ID_NULL) + SetCurrMachGroup( nNextId) ; + else + ResetCurrMachGroup() ; + } + // eseguo rimozione + m_pGeomDB->Erase( nId) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::VerifyMachGroup( int nId, MachGrp& mgData) const +{ + // verifica del parametro + if ( &mgData == nullptr) + return false ; + // verifica collegamento a DB geometrico + if ( m_pGeomDB == nullptr) + return false ; + // scansiono i sottogruppi + PtrOwner pIter( CreateGdbIterator( m_pGeomDB)) ; + if ( IsNull( pIter)) + return false ; + bool bMGeo = false ; + bool bSetup = false ; + bool bRaw = false ; + bool bOper = false ; + bool bIter = pIter->GoToFirstGroupInGroup( nId) ; + while ( bIter) { + string sName ; + if ( pIter->GetName( sName)) { + if ( sName == MACH_GEOM_GROUP) { + if ( ! bMGeo) + mgData.MGeoGroupId = pIter->GetId() ; + bMGeo = true ; + } + else if ( sName == MACH_SETUP_GROUP) { + if ( ! bSetup) + mgData.SetupGroupId = pIter->GetId() ; + bSetup = true ; + } + else if ( sName == MACH_RAW_GROUP) { + if ( ! bRaw) + mgData.RawGroupId = pIter->GetId() ; + bRaw = true ; + } + else if ( sName == MACH_OPER_GROUP) { + if ( ! bOper) + mgData.OperGroupId = pIter->GetId() ; + bOper = true ; + } + } + // passo al successivo + bIter = pIter->GoToNextGroup() ; + } + return ( bMGeo && bSetup && bRaw && bOper) ; +} + +//---------------------------------------------------------------------------- +string +MachMgr::GetMachGroupName( int nId) const +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return "" ; + // recupero il nome del gruppo riferito + string sName ; + m_pGeomDB->GetName( nId, sName) ; + return sName ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetMachGroupId( const string& sName) const +{ + // verifica dei parametri + if ( &sName == nullptr || sName.empty()) + return false ; + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return false ; + // recupero l'identificativo del gruppo con il nome indicato + PtrOwner pIter( CreateGdbIterator( m_pGeomDB)) ; + if ( IsNull( pIter)) + return false ; + bool bIter = pIter->GoToFirstGroupInGroup( m_nMachBaseId) ; + while( bIter) { + // verifico il nome + string sMGroupName ; + if ( pIter->GetName( sMGroupName) && sMGroupName == sName) + return pIter->GetId() ; + // passo al successivo + bIter = pIter->GoToNextGroup() ; + } + return GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::SetCurrMachGroup( int nId) +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return false ; + // verifico sia veramente un gruppo di lavoro + if ( m_pGeomDB->GetParentId( nId) != m_nMachBaseId) + return false ; + // recupero i suoi dati + MachGrp mgData ; + if ( ! VerifyMachGroup( nId, mgData)) { + m_nCurrMGrpId = GDB_ID_NULL ; + return false ; + } + // se esiste gruppo corrente, lo disabilito + if ( m_nCurrMGrpId != GDB_ID_NULL) { + // riporto i pezzi nei grezzi precedenti nella loro posizione standard + SwapParts( false) ; + // nascondo precedente gruppo corrente + m_pGeomDB->SetStatus( m_nCurrMGrpId, GDB_ST_OFF) ; + } + // imposto i dati del nuovo gruppo corrente + m_nCurrMGrpId = nId ; + m_cCurrMGrp = mgData ; + // porto i pezzi dalla loro posizione standard nei grezzi nuovi + SwapParts( true) ; + // nascondo pezzi rimasti sotto la radice + ShowRootParts( false) ; + // rendo visibile il nuovo gruppo corrente + m_pGeomDB->SetStatus( m_nCurrMGrpId, GDB_ST_ON) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::ResetCurrMachGroup( void) +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return false ; + // se non c'è gruppo corrente, posso uscire subito + if ( m_nCurrMGrpId == GDB_ID_NULL) + return true ; + // riporto i pezzi nei grezzi nella loro posizione standard + SwapParts( false) ; + // visualizzo pezzi rimasti sotto la radice + ShowRootParts( true) ; + // nascondo gruppo corrente + m_pGeomDB->SetStatus( m_nCurrMGrpId, GDB_ST_OFF) ; + // dichiaro nessun gruppo corrente + m_nCurrMGrpId = GDB_ID_NULL ; + return true ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetCurrMachGroup( void) const +{ + // verifica del gruppo base per le lavorazioni + if ( ! VerifyMachBase()) + return GDB_ID_NULL ; + // recupero l'indice del gruppo corrente + return m_nCurrMGrpId ; +} diff --git a/MachMgrParts.cpp b/MachMgrParts.cpp new file mode 100644 index 0000000..9d75c72 --- /dev/null +++ b/MachMgrParts.cpp @@ -0,0 +1,273 @@ +//---------------------------------------------------------------------------- +// EgalTech 2015-2015 +//---------------------------------------------------------------------------- +// File : MachMgr.cpp Data : 16.04.15 Versione : 1.6d3 +// Contenuto : Implementazione gestione grezzi e pezzi della classe MachMgr. +// +// +// +// Modifiche : 16.04.15 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "DllMain.h" +#include "MachMgr.h" +#include "MachConst.h" +#include "/EgtDev/Include/EGkGdbIterator.h" +#include "/EgtDev/Include/EgtPointerOwner.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +int +MachMgr::GetPartInRawPartNbr( int nRawId) const +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return 0 ; + // conto i gruppi appartenenti al grezzo (sono i pezzi) + PtrOwner pIter( CreateGdbIterator( m_pGeomDB)) ; + if ( IsNull( pIter)) + return 0 ; + int nPartNbr = 0 ; + bool bIter = pIter->GoToFirstGroupInGroup( nRawId) ; + while ( bIter) { + ++ nPartNbr ; + bIter = pIter->GoToNextGroup() ; + } + // ritorno numero dei pezzi nel grezzo + return nPartNbr ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetFirstPartInRawPart( int nRawId) const +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return GDB_ID_NULL ; + // cerco il primo gruppo appartenente al grezzo + return m_pGeomDB->GetFirstGroupInGroup( nRawId) ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetNextPartInRawPart( int nId) const +{ + // verifico validita GeomDB + if ( m_pGeomDB == nullptr) + return GDB_ID_NULL ; + // verifico che il pezzo appartenga ad un grezzo della macchinata corrente + int nRawId = m_pGeomDB->GetParentId( nId) ; + if ( ! VerifyRawPart( nRawId)) + return GDB_ID_NULL ; + // cerco il prossimo gruppo appartenente allo stesso grezzo + return m_pGeomDB->GetNextGroup( nId) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::AddPartToRawPart( int nPartId, int nRawId) +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // verifico che il pezzo non sia già usato nella macchinata corrente + if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT) + return false ; + // recupero il riferimento del grezzo + Frame3d frRaw ; + m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw) ; + // determino il riferimento del pezzo rispetto al grezzo + Frame3d frPart ; + m_pGeomDB->GetGroupGlobFrame( nPartId, frPart) ; + frPart.ToLoc( frRaw) ; + // inserisco il pezzo + int nGroup = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawId, frPart) ; + if ( nGroup == GDB_ID_NULL || + ! m_pGeomDB->GroupSwap( nPartId, nGroup, true, true)) + return false ; + // mi assicuro sia visibile il pezzo e nascosto il gruppo + m_pGeomDB->SetStatus( nPartId, GDB_ST_ON) ; + m_pGeomDB->SetStatus( nGroup, GDB_ST_OFF) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::AddPartToRawPart( int nPartId, const Point3d& ptPos, int nRawId) +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // verifico che il pezzo non sia già usato nella macchinata corrente + if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT) + return false ; + // recupero il riferimento del grezzo + Frame3d frRaw ; + m_pGeomDB->GetGroupGlobFrame( nRawId, frRaw) ; + // recupero box del pezzo + BBox3d b3Part ; + if ( ! m_pGeomDB->GetGlobalBBox( nPartId, b3Part)) + return false ; + // recupero il riferimento del pezzo + Frame3d frPart ; + m_pGeomDB->GetGroupGlobFrame( nPartId, frPart) ; + // muovo riferimento del pezzo per posizionare correttamente nel grezzo + Vector3d vtMove = ptPos - b3Part.GetMin() ; + frPart.Translate( vtMove) ; + // esprimo questo riferimento rispetto al grezzo + frPart.ToLoc( frRaw) ; + // inserisco il pezzo + int nGroup = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawId, frPart) ; + if ( nGroup == GDB_ID_NULL || + ! m_pGeomDB->GroupSwap( nPartId, nGroup, true, true)) + return false ; + // mi assicuro sia visibile il pezzo e nascosto il gruppo + m_pGeomDB->SetStatus( nPartId, GDB_ST_ON) ; + m_pGeomDB->SetStatus( nGroup, GDB_ST_OFF) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::RemovePartFromRawPart( int nPartId) +{ + // verifico DB geometrico + if ( m_pGeomDB == nullptr) + return false ; + // recupero l'indice del grezzo + int nRawId = m_pGeomDB->GetParentId( nPartId) ; + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // devo riportare il pezzo in lista generale + int nBase ; + if ( m_pGeomDB->GetInfo( nPartId, GDB_SI_BASE, nBase)) { + // eseguo lo scambio + m_pGeomDB->GroupSwap( nPartId, nBase, true, true) ; + // mi assicuro sia nascosto + m_pGeomDB->SetStatus( nPartId, GDB_ST_OFF) ; + // cancello il gruppo di riferimento + m_pGeomDB->Erase( nBase) ; + return true ; + } + return false ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::TranslatePartInRawPart( int nPartId, const Vector3d& vtMove) +{ + // verifico DB geometrico + if ( m_pGeomDB == nullptr) + return false ; + // recupero l'indice del grezzo + int nRawId = m_pGeomDB->GetParentId( nPartId) ; + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // eseguo traslazione in globale + return m_pGeomDB->TranslateGlob( nPartId, vtMove) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::RotatePartInRawPart( int nPartId, const Vector3d& vtAx, double dAngRotDeg) +{ + // verifico DB geometrico + if ( m_pGeomDB == nullptr) + return false ; + // recupero l'indice del grezzo + int nRawId = m_pGeomDB->GetParentId( nPartId) ; + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // recupero riferimento globale del pezzo + Frame3d frRef ; + if ( ! m_pGeomDB->GetGroupGlobFrame( nPartId, frRef)) + return false ; + // recupero box del pezzo in locale (non cambia con la giacitura globale) + BBox3d b3Box ; + if ( ! m_pGeomDB->GetLocalBBox( nPartId, b3Box)) + return false ; + // ne calcolo il centro e lo porto in globale + Point3d ptCen ; + b3Box.GetCenter( ptCen) ; + ptCen.ToGlob( frRef) ; + // eseguo rotazione in globale attorno al centro del pezzo + return m_pGeomDB->RotateGlob( nPartId, ptCen, vtAx, dAngRotDeg) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::SwapParts( bool bToRawPart) +{ + // recupero il gruppo dei grezzi correnti + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return true ; + // ciclo sui grezzi + int nRawId = m_pGeomDB->GetFirstGroupInGroup( nRawGroupId) ; + while ( nRawId != GDB_ID_NULL) { + // sistemo i pezzi del grezzo + SwapRawPartParts( nRawId, bToRawPart) ; + // passo al successivo + nRawId = m_pGeomDB->GetNextGroup( nRawId) ; + } + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::SwapRawPartParts( int nRawId, bool bToRawPart) +{ + // ciclo sui gruppi nel grezzo + int nId = m_pGeomDB->GetFirstGroupInGroup( nRawId) ; + while ( nId != GDB_ID_NULL) { + // recupero il successivo + int nNextId = m_pGeomDB->GetNextGroup( nId) ; + // se devo portare i pezzi dalla radice al grezzo + if ( bToRawPart) { + // se è un riferimento al pezzo + int nSou ; + if ( m_pGeomDB->GetInfo( nId, GDB_SI_SOURCE, nSou)) { + m_pGeomDB->GroupSwap( nSou, nId, true, true) ; + // mi assicuro sia visibile + m_pGeomDB->SetStatus( nSou, GDB_ST_ON) ; + } + } + // altrimenti dal grezzo alla radice + else { + // se è un pezzo spostato + int nBase ; + if ( m_pGeomDB->GetInfo( nId, GDB_SI_BASE, nBase)) { + m_pGeomDB->GroupSwap( nId, nBase, true, true) ; + // mi assicuro sia nascosto + m_pGeomDB->SetStatus( nId, GDB_ST_OFF) ; + } + } + // passo al successivo + nId = nNextId ; + } + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::ShowRootParts( bool bShow) +{ + // ciclo sui gruppi in radice + int nId = m_pGeomDB->GetFirstGroupInGroup( GDB_ID_ROOT) ; + while ( nId != GDB_ID_NULL) { + // se pezzo, lo nascondo + if ( ! IsMachBase( nId)) + m_pGeomDB->SetStatus( nId, ( bShow ? GDB_ST_ON : GDB_ST_OFF)) ; + // passo al successivo + nId = m_pGeomDB->GetNextGroup( nId) ; + } + return true ; +} diff --git a/MachMgrRawParts.cpp b/MachMgrRawParts.cpp new file mode 100644 index 0000000..224d2fc --- /dev/null +++ b/MachMgrRawParts.cpp @@ -0,0 +1,503 @@ +//---------------------------------------------------------------------------- +// EgalTech 2015-2015 +//---------------------------------------------------------------------------- +// File : MachMgr.cpp Data : 16.04.15 Versione : 1.6d3 +// Contenuto : Implementazione gestione grezzi e pezzi della classe MachMgr. +// +// +// +// Modifiche : 16.04.15 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "DllMain.h" +#include "MachMgr.h" +#include "MachConst.h" +#include "/EgtDev/Include/EGkCurveComposite.h" +#include "/EgtDev/Include/EGkGdbIterator.h" +#include "/EgtDev/Include/EGkGeoPoint3d.h" +#include "/EgtDev/Include/EGkStmStandard.h" +#include "/EgtDev/Include/EGkStmFromCurves.h" +#include "/EgtDev/Include/EgtPointerOwner.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +int +MachMgr::GetRawPartNbr( void) const +{ + // recupero il gruppo dei grezzi nella macchinata corrente + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return 0 ; + // ritorno numero dei grezzi della macchinata + return m_pGeomDB->GetGroupObjs( nRawGroupId) ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetFirstRawPart( void) const +{ + // recupero il gruppo dei grezzi nella macchinata corrente + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return GDB_ID_NULL ; + // recupero il primo sottogruppo + int nId = m_pGeomDB->GetFirstGroupInGroup( nRawGroupId) ; + return nId ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::GetNextRawPart( int nId) const +{ + // recupero il gruppo dei grezzi nella macchinata corrente + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return GDB_ID_NULL ; + // verifico che il gruppo ricevuto sia corretto + if ( m_pGeomDB->GetParentId( nId) != nRawGroupId) + return GDB_ID_NULL ; + // recupero il successivo sottogruppo + int nNextId = m_pGeomDB->GetNextGroup( nId) ; + return nNextId ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::AddRawPart( const Point3d& ptOrig, double dWidth, double dLen, double dHeight, Color cCol) +{ + // recupero il gruppo dei grezzi nella macchinata corrente + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return GDB_ID_NULL ; + // creo il solido + PtrOwner pStm( GetSurfTriMeshBox( dWidth, dLen, dHeight)) ; + if ( IsNull( pStm)) + return GDB_ID_NULL ; + // inserisco il gruppo del grezzo nei grezzi della macchinata + int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, Frame3d( ptOrig)) ; + if ( nRawId == GDB_ID_NULL) + return GDB_ID_NULL ; + // assegno il nome al gruppo + bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ; + // inserisco il solido nel gruppo + int nId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pStm)) ; + bOk = bOk && ( nId != GDB_ID_NULL) ; + // assegno il nome al solido + bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ; + // assegno il colore al solido + bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ; + // calcolo il punto centro del solido + bOk = bOk && SetRawPartCenter( nRawId) ; + // se qualcosa è andato storto, cancello tutto + if ( ! bOk) { + m_pGeomDB->Erase( nRawId) ; + return GDB_ID_NULL ; + } + // tutto ok + return nRawId ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::AddRawPart( int nCrvId, double dOverMat, double dZmin, double dHeight, Color cCol) +{ + // recupero il gruppo dei grezzi nella macchinata corrente + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return GDB_ID_NULL ; + // recupero l'ingombro della curva in globale + BBox3d b3Crv ; + if ( ! m_pGeomDB->GetGlobalBBox( nCrvId, b3Crv)) + return GDB_ID_NULL ; + // recupero il riferimento della curva + Frame3d frCrv ; + if ( ! m_pGeomDB->GetGlobFrame( nCrvId, frCrv)) + return GDB_ID_NULL ; + // recupero la curva + const ICurve* pCrv = GetCurve( m_pGeomDB->GetGeoObj( nCrvId)) ; + if ( pCrv == nullptr) + return GDB_ID_NULL ; + // copio la curva in una composita + PtrOwner pMyCrv( CreateCurveComposite()) ; + if ( IsNull( pMyCrv) || ! pMyCrv->AddCurve( *pCrv)) + return GDB_ID_NULL ; + // determino il riferimento del grezzo + Point3d ptOrig = b3Crv.GetMin() ; + ptOrig.z = dZmin ; + Frame3d frRaw( ptOrig) ; + // porto la curva in questo riferimento + pMyCrv->LocToLoc( frCrv, frRaw) ; + // la schiaccio a Z = 0 + if ( ! pMyCrv->Scale( Frame3d(), 1, 1, 0)) + return GDB_ID_NULL ; + // se non è chiusa, la chiudo + if ( ! pMyCrv->IsClosed()) + pMyCrv->Close() ; + // la oriento in senso CCW + double dAreaXY ; + if ( ! pMyCrv->GetAreaXY( dAreaXY)) + return GDB_ID_NULL ; + if ( dAreaXY < 0) + pMyCrv->Invert() ; + // ne eseguo l'offset + if ( ! pMyCrv->SimpleOffset( dOverMat, ICurve::OFF_EXTEND)) + return GDB_ID_NULL ; + // creo il solido + PtrOwner pStm( GetSurfTriMeshByExtrusion( Get( pMyCrv), Vector3d(0,0,dHeight), true)) ; + if ( IsNull( pStm)) + return GDB_ID_NULL ; + // inserisco il gruppo del grezzo nella macchinata + int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ; + if ( nRawId == GDB_ID_NULL) + return GDB_ID_NULL ; + // assegno il nome al gruppo + bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ; + // inserisco il solido nel gruppo + int nId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pStm)) ; + bOk = bOk && ( nId != GDB_ID_NULL) ; + // assegno il nome al solido + bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ; + // assegno il colore al solido + bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ; + // calcolo il punto centro del solido + bOk = bOk && SetRawPartCenter( nRawId) ; + // se qualcosa è andato storto, cancello tutto + if ( ! bOk) { + m_pGeomDB->Erase( nRawId) ; + return GDB_ID_NULL ; + } + // tutto ok + return nRawId ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::AddRawPart( int nSurfId, Color cCol) +{ + // recupero il gruppo dei grezzi nella macchinata corrente + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return GDB_ID_NULL ; + // recupero l'ingombro della superficie in globale + BBox3d b3Crv ; + if ( ! m_pGeomDB->GetGlobalBBox( nSurfId, b3Crv)) + return GDB_ID_NULL ; + // inserisco il gruppo del grezzo nella macchinata + Frame3d frRaw( b3Crv.GetMin()) ; + int nRawId = m_pGeomDB->AddGroup( GDB_ID_NULL, nRawGroupId, frRaw) ; + if ( nRawId == GDB_ID_NULL) + return GDB_ID_NULL ; + // assegno il nome al gruppo + bool bOk = m_pGeomDB->SetName( nRawId, MACH_RAW_PART) ; + // copio la superficie nel gruppo + int nId = m_pGeomDB->CopyGlob( nSurfId, GDB_ID_NULL, nRawId) ; + bOk = bOk && ( nId != GDB_ID_NULL) ; + // assegno il nome al solido + bOk = bOk && m_pGeomDB->SetName( nId, MACH_RAW_SOLID) ; + // assegno il colore al solido + bOk = bOk && m_pGeomDB->SetMaterial( nId, cCol) ; + // rendo visibile il solido + bOk = bOk && m_pGeomDB->SetStatus( nId, GDB_ST_ON) ; + // calcolo il punto centro del solido + bOk = bOk && SetRawPartCenter( nRawId) ; + // se qualcosa è andato storto, cancello tutto + if ( ! bOk) { + m_pGeomDB->Erase( nRawId) ; + return GDB_ID_NULL ; + } + // nascondo la superficie originale + m_pGeomDB->SetStatus( nSurfId, GDB_ST_OFF) ; + // tutto ok + return nRawId ; +} + +//---------------------------------------------------------------------------- +int +MachMgr::AddRawPartWithPart( int nPartId, int nCrvSrfId, double dOverMat, Color cCol) +{ + // verifico il gruppo dei grezzi nella macchinata corrente + if ( GetCurrRawGroupId() == GDB_ID_NULL) + return GDB_ID_NULL ; + // verifico che il pezzo non sia già usato nella macchinata corrente + if ( m_pGeomDB->GetParentId( nPartId) != GDB_ID_ROOT) + return GDB_ID_NULL ; + // recupero il tipo di oggetto per definire il grezzo + int nGtype = m_pGeomDB->GetGeoType( nCrvSrfId) ; + // costruzione del grezzo + int nRawId = GDB_ID_NULL ; + // se grezzo da superficie (per ora senza possibilità di offset) + if ( ( nGtype & GEO_SURF) != 0) { + // inserisco il grezzo + nRawId = AddRawPart( nCrvSrfId, cCol) ; + } + // se altrimenti grezzo da contorno + else if ( ( nGtype & GEO_CURVE) != 0) { + // determino l'ingombro del pezzo + BBox3d b3Part ; + if ( ! m_pGeomDB->GetGlobalBBox( nPartId, b3Part)) + return GDB_ID_NULL ; + // inserisco il grezzo + double dZmin = b3Part.GetMin().z ; + double dH = ( b3Part.GetMax() - b3Part.GetMin()).z ; + if ( dH < RAW_MIN_H) + dH = RAW_MIN_H ; + nRawId = AddRawPart( nCrvSrfId, dOverMat, dZmin, dH, cCol) ; + } + // altrimenti grezzo rettangolare da ingombro pezzo + else { + // determino l'ingombro del pezzo + BBox3d b3Part ; + if ( ! m_pGeomDB->GetGlobalBBox( nPartId, b3Part)) + return GDB_ID_NULL ; + // deduco i dati del grezzo + Point3d ptMin = b3Part.GetMin() - Vector3d( dOverMat, dOverMat, 0) ; + Point3d ptMax = b3Part.GetMax() + Vector3d( dOverMat, dOverMat, 0) ; + Vector3d vtDiff = ptMax - ptMin ; + if ( vtDiff.z < RAW_MIN_H) + vtDiff.z = RAW_MIN_H ; + // inserisco il grezzo + nRawId = AddRawPart( ptMin, vtDiff.x, vtDiff.y, vtDiff.z, cCol) ; + } + // verifico costruzione grezzo + if ( nRawId == GDB_ID_NULL) + return GDB_ID_NULL ; + // inserisco il pezzo nel grezzo + if ( ! AddPartToRawPart( nPartId, nRawId)) { + RemoveRawPart( nRawId) ; + return GDB_ID_NULL ; + } + return nRawId ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::ModifyRawPartHeight( int nRawId, double dHeight) +{ + // la nuova altezza non può essere nulla + if ( dHeight < EPS_SMALL) + return false ; + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // recupero il solido del grezzo + int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; + if ( nRawSolId == GDB_ID_NULL) + return false ; + // recupero il box del grezzo + BBox3d b3Raw ; + if ( ! m_pGeomDB->GetLocalBBox( nRawSolId, b3Raw)) + return false ; + // determino il coefficente di scalatura in Z + double dOldH = b3Raw.GetMax().z - b3Raw.GetMin().z ; + if ( dOldH < EPS_SMALL) + return false ; + double dCoeff = dHeight / dOldH ; + // eseguo scalatura + bool bOk = m_pGeomDB->Scale( nRawSolId, Frame3d( b3Raw.GetMin()), 1, 1, dCoeff) ; + // dichiaro centro da ricalcolare + ResetRawPartCenter( nRawId) ; + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::RemoveRawPart( int nRawId) +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // devo estrarre i pezzi e riportarli in lista generale + SwapRawPartParts( nRawId, false) ; + // cancello il grezzo + m_pGeomDB->Erase( nRawId) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::VerifyRawPart( int nRawId) const +{ + // recupero il gruppo dei grezzi nella macchinata corrente + int nRawGroupId = GetCurrRawGroupId() ; + if ( nRawGroupId == GDB_ID_NULL) + return false ; + // verifico che questo grezzo ne faccia parte + if ( m_pGeomDB->GetParentId( nRawId) != nRawGroupId) + return false ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::TranslateRawPart( int nRawId, const Vector3d& vtMove) +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // eseguo traslazione in globale + return m_pGeomDB->TranslateGlob( nRawId, vtMove) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::RotateRawPart( int nRawId, const Vector3d& vtAx, double dAngRotDeg) +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // recupero centro del grezzo + Point3d ptAx ; + if ( ! GetRawPartCenter( nRawId, ptAx)) + return false ; + // eseguo rotazione in globale attorno al centro del grezzo + return m_pGeomDB->RotateGlob( nRawId, ptAx, vtAx, dAngRotDeg) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::MoveToCornerRawPart( int nRawId, const Point3d& ptP, int nFlag) +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // recupero il solido + int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; + // determino il box del grezzo (solo il solido ovviamente) + BBox3d b3Raw ; + if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw)) + return false ; + // calcolo il movimento necessario + Vector3d vtMove ; + switch ( nFlag) { + case RPCR_TL : + vtMove = ptP - Point3d( b3Raw.GetMin().x, b3Raw.GetMax().y, b3Raw.GetMin().z) ; + break ; + case RPCR_TR : + vtMove = ptP - b3Raw.GetMax() ; + break ; + default : // RPCP_BL + vtMove = ptP - b3Raw.GetMin() ; + break ; + case RPCR_BR : + vtMove = ptP - Point3d( b3Raw.GetMax().x, b3Raw.GetMin().y, b3Raw.GetMin().z) ; + break ; + } + // eseguo traslazione in globale + return m_pGeomDB->TranslateGlob( nRawId, vtMove) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::MoveToCenterRawPart( int nRawId, const Point3d& ptP, int nFlag) +{ + // verifica validità grezzo + if ( ! VerifyRawPart( nRawId)) + return false ; + // recupero il solido + int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; + // determino il box del grezzo (solo il solido ovviamente) + BBox3d b3Raw ; + if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw)) + return false ; + // ricavo il centro dal box (in generale non è il centro geometrico) + Point3d ptCen ; + b3Raw.GetCenter( ptCen) ; + // calcolo il movimento necessario + Vector3d vtMove ; + switch ( nFlag) { + case RPCE_TC : + vtMove = ptP - Point3d( ptCen.x, b3Raw.GetMax().y, ptCen.z) ; + break ; + default : // RPCE_ML + vtMove = ptP - Point3d( b3Raw.GetMin().x, ptCen.y, ptCen.z) ; + break ; + case RPCE_MR : + vtMove = ptP - Point3d( b3Raw.GetMax().x, ptCen.y, ptCen.z) ; + break ; + case RPCE_BC : + vtMove = ptP - Point3d( ptCen.x, b3Raw.GetMin().y, ptCen.z) ; + break ; + case RPCE_MC : + vtMove = ptP - Point3d( ptCen.x, ptCen.y, b3Raw.GetMin().z) ; + break ; + } + // eseguo traslazione in globale + return m_pGeomDB->TranslateGlob( nRawId, vtMove) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::SetRawPartCenter( int nRawId) +{ + // recupero il solido + int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; + const ISurfTriMesh* pStm = GetSurfTriMesh( m_pGeomDB->GetGeoObj( nRawSolId)) ; + if ( pStm == nullptr) + return false ; + // recupero il punto centro, se non esiste lo creo + int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; + if ( nGPntId == GDB_ID_NULL) { + PtrOwner pGeoPnt( CreateGeoPoint3d()) ; + nGPntId = m_pGeomDB->AddGeoObj( GDB_ID_NULL, nRawId, Release( pGeoPnt)) ; + m_pGeomDB->SetName( nGPntId, MACH_RAW_CENTER) ; + Color cCol ; + if ( m_pGeomDB->GetCalcMaterial( nRawSolId, cCol)) + m_pGeomDB->SetMaterial( nGPntId, cCol) ; + } + IGeoPoint3d* pGeoPnt = GetGeoPoint3d( m_pGeomDB->GetGeoObj( nGPntId)) ; + if ( pGeoPnt == nullptr) + return false ; + // calcolo il valore del centro + Point3d ptCen ; + if ( ! pStm->GetCentroid( ptCen)) + return false ; + // aggiorno e imposto modo a standard + return ( pGeoPnt->Set( ptCen) && m_pGeomDB->SetMode( nGPntId, GDB_MD_STD)) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::ResetRawPartCenter( int nRawId) +{ + // recupero il punto centro + int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; + if ( nGPntId == GDB_ID_NULL) + return true ; + // imposto modo a bloccato + return m_pGeomDB->SetMode( nGPntId, GDB_MD_LOCKED) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::GetRawPartCenter( int nRawId, Point3d& ptCen) +{ + // cerco di recuperare l'oggetto + int nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; + // ne verifico la validità + int nMode ; + if ( nGPntId == GDB_ID_NULL || + ! m_pGeomDB->GetMode( nGPntId, nMode) || nMode != GDB_MD_STD) { + // provo a crearlo + SetRawPartCenter( nRawId) ; + nGPntId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_CENTER) ; + // se c'è ancora errore + if ( nGPntId == GDB_ID_NULL) + return false ; + } + // ne recupero il riferimento globale + Frame3d frGPnt ; + if ( ! m_pGeomDB->GetGlobFrame( nGPntId, frGPnt)) + return false ; + // recupero il punto + IGeoPoint3d* pGeoPnt = GetGeoPoint3d( m_pGeomDB->GetGeoObj( nGPntId)) ; + if ( pGeoPnt == nullptr) + return false ; + ptCen = pGeoPnt->GetPoint() ; + ptCen.ToGlob( frGPnt) ; + return true ; +}