diff --git a/EXE.h b/EXE.h index 56f0671..fa1b90b 100644 --- a/EXE.h +++ b/EXE.h @@ -31,3 +31,6 @@ ILogger* GetLogger( void) ; ILogger* GetCmdLogger( void) ; bool SetCmdLog( bool bVal) ; bool IsCmdLog( void) ; + +//---------------------------------------------------------------------------- +bool ExeIsDuploBase( IGeomDB* pGeomDB, int nId) ; diff --git a/EXE_Const.h b/EXE_Const.h index c249b5a..fd0dcab 100644 --- a/EXE_Const.h +++ b/EXE_Const.h @@ -51,3 +51,6 @@ const std::string NST_SHEET_OUTREG = "SheetOut" ; const std::string NST_REFERENCE_REG = "RefReg" ; const std::string NST_DAMAGED_REG = "DmgReg" ; const std::string KEY_NST_OFF = "Off" ; + +// Per duplicati di pezzi (gruppo radice) +const std::string DUPLO_BASE = "DuploBase" ; diff --git a/EXE_GdbObjects.cpp b/EXE_GdbObjects.cpp index a675d19..5113817 100644 --- a/EXE_GdbObjects.cpp +++ b/EXE_GdbObjects.cpp @@ -419,6 +419,22 @@ ExeErase( const INTVECTOR& vIds) for ( size_t i = 0 ; i < vIds.size() ; ++ i) { int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; while ( nId != GDB_ID_NULL) { + // se pezzo con duplicati, cancello anche questi + if ( ExeIsPart( nId)) { + INTVECTOR vnRef ; + pGeomDB->GetInfo( nId, GDB_SI_DUPLIST, vnRef) ; + for ( int nDupId : vnRef) + pGeomDB->Erase( nDupId) ; + } + // se altrimenti duplicato di pezzo, lo tolgo da lista duplicati nell'originale + else if ( ExeIsDuplo( nId)) { + int nOrigId ; + pGeomDB->GetInfo( nId, GDB_SI_DUPSOU, nOrigId) ; + INTVECTOR vnRef ; + pGeomDB->GetInfo( nOrigId, GDB_SI_DUPLIST, vnRef) ; + vnRef.erase( remove( vnRef.begin(), vnRef.end(), nId), vnRef.end()) ; + pGeomDB->SetInfo( nOrigId, GDB_SI_DUPLIST, vnRef) ; + } // cancello if ( ! pGeomDB->Erase( nId)) bOk = false ; diff --git a/EXE_GdbPartLayers.cpp b/EXE_GdbPartLayers.cpp index 76decad..1b730cb 100644 --- a/EXE_GdbPartLayers.cpp +++ b/EXE_GdbPartLayers.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "EXE.h" +#include "EXE_Const.h" #include "EXE_Macro.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EgkCurve.h" @@ -614,4 +615,204 @@ ExeSelectPathObjs( int nId, bool bHaltOnFork) } // restituisco risultato return bOk ; -} \ No newline at end of file +} + +//---------------------------------------------------------------------------- +bool +ExeIsDuploBase( IGeomDB* pGeomDB, int nId) +{ + if ( pGeomDB == nullptr) + return false ; + int nLevel ; + string sName ; + return ( pGeomDB->GetLevel( nId, nLevel) && nLevel == GDB_LV_SYSTEM && + pGeomDB->GetName( nId, sName) && sName == DUPLO_BASE) ; +} + +//----------------------------------------------------------------------------- +static int +GetDuploBase( IGeomDB* pGeomDB, bool bCreate = false) +{ + // verifica collegamento a DB geometrico + if ( pGeomDB == nullptr) + return GDB_ID_NULL ; + // cerco il gruppo di base dei duplicati nella radice + int nId = pGeomDB->GetFirstGroupInGroup( GDB_ID_ROOT) ; + while ( nId != GDB_ID_NULL) { + // verifico se gruppo cercato + if ( ExeIsDuploBase( pGeomDB, nId)) + return nId ; + // passo al successivo + nId = pGeomDB->GetNextGroup( nId) ; + } + // non trovato, se non richiesta creazione ritorno + if ( ! bCreate) + return GDB_ID_NULL ; + // devo creare il gruppo di base delle lavorazioni + int nDuploBaseId = pGeomDB->InsertGroup( GDB_ID_NULL, GDB_ID_ROOT, GDB_FIRST_SON, GLOB_FRM) ; + if ( nDuploBaseId == GDB_ID_NULL) + return GDB_ID_NULL ; + // imposto nome del gruppo + pGeomDB->SetName( nDuploBaseId, DUPLO_BASE) ; + // imposto livello del gruppo a System + pGeomDB->SetLevel( nDuploBaseId, GDB_LV_SYSTEM) ; + // imposto visualizzazione a nascosto + pGeomDB->SetStatus( nDuploBaseId, GDB_ST_OFF) ; + return nDuploBaseId ; +} + +//----------------------------------------------------------------------------- +int +ExeDuploNew( int nSouId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // Verifico sia un pezzo + if ( ! ExeIsPart( nSouId)) + return GDB_ID_NULL ; + // Recupero il gruppo base dei duplicati + int nDuploBaseId = GetDuploBase( pGeomDB, true) ; + if ( nDuploBaseId == GDB_ID_NULL) + return GDB_ID_NULL ; + // Eseguo la copia del pezzo + int nNewId = pGeomDB->Copy( nSouId, GDB_ID_NULL, nDuploBaseId) ; + if ( nNewId == GDB_ID_NULL) + return GDB_ID_NULL ; + // Aggiorno info del sorgente + INTVECTOR vnRef ; + pGeomDB->GetInfo( nSouId, GDB_SI_DUPLIST, vnRef) ; + if ( find( vnRef.begin(), vnRef.end(), nNewId) == vnRef.end()) { + vnRef.push_back( nNewId) ; + pGeomDB->SetInfo( nSouId, GDB_SI_DUPLIST, vnRef) ; + } + // Aggiorno info del duplicato + pGeomDB->SetInfo( nNewId, GDB_SI_DUPSOU, nSouId) ; + pGeomDB->RemoveInfo( nNewId, GDB_SI_DUPLIST) ; + + return nNewId ; +} + +//----------------------------------------------------------------------------- +bool +ExeDuploCount( int nSouId, int& nCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Verifico sia un pezzo + if ( ! ExeIsPart( nSouId)) + return false ; + // Recupero info del sorgente + INTVECTOR vnRef ; + pGeomDB->GetInfo( nSouId, GDB_SI_DUPLIST, vnRef) ; + nCount = int( vnRef.size()) ; + return true ; +} + +//----------------------------------------------------------------------------- +bool +ExeDuploList( int nSouId, INTVECTOR& vnRef) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Verifico sia un pezzo + if ( ! ExeIsPart( nSouId)) + return false ; + // Recupero info del sorgente + pGeomDB->GetInfo( nSouId, GDB_SI_DUPLIST, vnRef) ; + return true ; +} + +//----------------------------------------------------------------------------- +bool +ExeDuploSetModified( int nSouId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Verifico sia un pezzo + if ( ! ExeIsPart( nSouId)) + return false ; + // Imposto il flag di modificato + return pGeomDB->SetInfo( nSouId, GDB_SI_DUPMODIF, true) ; +} + +//----------------------------------------------------------------------------- +bool +ExeDuploUpdate( int nSouId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Verifico sia un pezzo + if ( ! ExeIsPart( nSouId)) + return false ; + // Verifico se modificato da ultimo update + bool bModif = false ; + pGeomDB->GetInfo( nSouId, GDB_SI_DUPMODIF, bModif) ; + if ( ! bModif) + return true ; + // Recupero il gruppo base dei duplicati + int nDuploBaseId = GetDuploBase( pGeomDB) ; + if ( nDuploBaseId == GDB_ID_NULL) + return false ; + // recupero le copie + INTVECTOR vnRef ; + pGeomDB->GetInfo( nSouId, GDB_SI_DUPLIST, vnRef) ; + // verifico siano aggiornabili + bool bAllOk = true ; + for ( int nCopyId : vnRef) { + if ( pGeomDB->GetParentId( nCopyId) != nDuploBaseId) + bAllOk = false ; + } + if ( ! bAllOk) + return false ; + // eseguo gli aggiornamenti + for ( int nCopyId : vnRef) { + pGeomDB->Erase( nCopyId) ; + int nNewId = pGeomDB->Copy( nSouId, nCopyId, nDuploBaseId) ; + pGeomDB->SetInfo( nNewId, GDB_SI_DUPSOU, nSouId) ; + pGeomDB->RemoveInfo( nNewId, GDB_SI_DUPLIST) ; + pGeomDB->RemoveInfo( nNewId, GDB_SI_DUPMODIF) ; + } + // reset flag di modificato + pGeomDB->RemoveInfo( nSouId, GDB_SI_DUPMODIF) ; + return true ; +} + +//----------------------------------------------------------------------------- +bool +ExeIsDuplo( int nDupId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Recupero il gruppo base dei duplicati + int nDuploBaseId = GetDuploBase( pGeomDB) ; + if ( nDuploBaseId == GDB_ID_NULL) + return false ; + // Verifico sia un duplicato (gruppo sotto quello dei duplicati con riferimento a originale) + if ( pGeomDB->GetGdbType( nDupId) == GDB_TY_GROUP && + pGeomDB->GetParentId( nDupId) == nDuploBaseId && + pGeomDB->ExistsInfo( nDupId, GDB_SI_DUPSOU)) + return true ; + else + return false ; +} + +//----------------------------------------------------------------------------- +int +ExeDuploGetOriginal( int nDupId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // Recupero il gruppo base dei duplicati + int nDuploBaseId = GetDuploBase( pGeomDB) ; + if ( nDuploBaseId == GDB_ID_NULL) + return GDB_ID_NULL ; + // Verifico sia un duplicato (gruppo sotto quello dei duplicati con riferimento a originale) + if ( pGeomDB->GetGdbType( nDupId) != GDB_TY_GROUP || + pGeomDB->GetParentId( nDupId) != nDuploBaseId || + ! pGeomDB->ExistsInfo( nDupId, GDB_SI_DUPSOU)) + return GDB_ID_NULL ; + // Recupero l'indice dell'originale + int nOrigId = GDB_ID_NULL ; + pGeomDB->GetInfo( nDupId, GDB_SI_DUPSOU, nOrigId) ; + return nOrigId ; +} diff --git a/LUA_GdbPartLayers.cpp b/LUA_GdbPartLayers.cpp index dca84a0..3be51d9 100644 --- a/LUA_GdbPartLayers.cpp +++ b/LUA_GdbPartLayers.cpp @@ -401,6 +401,122 @@ LuaSelectPathObjs( lua_State* L) return 1 ; } +//------------------------------------------------------------------------------- +static int +LuaDuploNew( lua_State* L) +{ + // 1 parametro : nSouId + int nSouId ; + LuaCheckParam( L, 1, nSouId) + LuaClearStack( L) ; + // creo il duplicato + int nNewId = ExeDuploNew( nSouId) ; + // restituisco il risultato + LuaSetParam( L, nNewId) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaDuploCount( lua_State* L) +{ + // 1 parametro : nSouId + int nSouId ; + LuaCheckParam( L, 1, nSouId) + LuaClearStack( L) ; + // recupero il numero di duplicati + int nCount ; + bool bOk = ExeDuploCount( nSouId, nCount) ; + // restituisco il risultato + if ( bOk) + LuaSetParam( L, nCount) ; + else + LuaSetParam( L) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaDuploList( lua_State* L) +{ + // 1 parametro : nSouId + int nSouId ; + LuaCheckParam( L, 1, nSouId) + LuaClearStack( L) ; + // recupero l'elenco dei duplicati + INTVECTOR vnRef ; + bool bOk = ExeDuploList( nSouId, vnRef) ; + // restituisco il risultato + if ( bOk) + LuaSetParam( L, vnRef) ; + else + LuaSetParam( L) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaDuploSetModified( lua_State* L) +{ + // 1 parametro : nSouId + int nSouId ; + LuaCheckParam( L, 1, nSouId) + LuaClearStack( L) ; + // dichiaro che il pezzo è modificato + bool bOk = ExeDuploSetModified( nSouId) ; + // restituisco il risultato + LuaSetParam( L, bOk) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaDuploUpdate( lua_State* L) +{ + // 1 parametro : nSouId + int nSouId ; + LuaCheckParam( L, 1, nSouId) + LuaClearStack( L) ; + // aggiorno i duplicati del pezzo + bool bOk = ExeDuploUpdate( nSouId) ; + // restituisco il risultato + LuaSetParam( L, bOk) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaIsDuplo( lua_State* L) +{ + // 1 parametro : nDouId + int nDouId ; + LuaCheckParam( L, 1, nDouId) + LuaClearStack( L) ; + // verifico se è un duplicato + bool bOk = ExeIsDuplo( nDouId) ; + // restituisco il risultato + LuaSetParam( L, bOk) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaDuploGetOriginal( lua_State* L) +{ + // 1 parametro : nDouId + int nDouId ; + LuaCheckParam( L, 1, nDouId) + LuaClearStack( L) ; + // verifico se è un duplicato + int nOrigId = ExeDuploGetOriginal( nDouId) ; + // restituisco il risultato + if ( nOrigId != GDB_ID_NULL) + LuaSetParam( L, nOrigId) ; + else + LuaSetParam( L) ; + return 1 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbPartLayer( LuaMgr& luaMgr) @@ -429,5 +545,12 @@ LuaInstallGdbPartLayer( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtSelectLayerObjs", LuaSelectLayerObjs) ; bOk = bOk && luaMgr.RegisterFunction( "EgtDeselectLayerObjs", LuaDeselectLayerObjs) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSelectPathObjs", LuaSelectPathObjs) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploNew", LuaDuploNew) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploCount", LuaDuploCount) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploList", LuaDuploList) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploSetModified", LuaDuploSetModified) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploUpdate", LuaDuploUpdate) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtIsDuplo", LuaIsDuplo) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploGetOriginal", LuaDuploGetOriginal) ; return bOk ; }