diff --git a/EXE_GdbPartLayers.cpp b/EXE_GdbPartLayers.cpp index 25a66fe..e136caa 100644 --- a/EXE_GdbPartLayers.cpp +++ b/EXE_GdbPartLayers.cpp @@ -773,6 +773,77 @@ ExeDuploGetModified( int nSouId, bool& bModif) return true ; } +//----------------------------------------------------------------------------- +bool +ExeDuploSetLocked( int nDupId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Verifico sia un duplo + if ( ! ExeIsDuplo( nDupId)) + return false ; + // Imposto il flag di bloccato + return pGeomDB->SetInfo( nDupId, GDB_SI_DUPLOCKED, true) ; +} + +//----------------------------------------------------------------------------- +bool +ExeDuploResetLocked( int nDupId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Verifico sia nel gruppo base dei duplicati + int nDuploBaseId = GetDuploBase( pGeomDB) ; + if ( nDuploBaseId == GDB_ID_NULL || pGeomDB->GetParentId( nDupId) != nDuploBaseId) + return false ; + // Verifico abbia un sorgente + int nOrigId ; + if ( ! pGeomDB->GetInfo( nDupId, GDB_SI_DUPSOU, nOrigId) || pGeomDB->GetGdbType( nOrigId) != GDB_TY_GROUP) + return false ; + // Verifico bloccaggio + bool bLocked ; + if ( ! pGeomDB->GetInfo( nDupId, GDB_SI_DUPLOCKED, bLocked)) + bLocked = false ; + pGeomDB->RemoveInfo( nDupId, GDB_SI_DUPLOCKED) ; + if ( ! bLocked) + return true ; + // Verifico necessità di aggiornamento + bool bToUpdate ; + if ( ! pGeomDB->GetInfo( nDupId, GDB_SI_DUPTOUPDATE, bToUpdate)) + bToUpdate = false ; + pGeomDB->RemoveInfo( nDupId, GDB_SI_DUPTOUPDATE) ; + if ( ! bToUpdate) + return true ; + // Eseguo aggiornamento + pGeomDB->Erase( nDupId) ; + int nNewId = pGeomDB->Copy( nOrigId, nDupId, nDuploBaseId) ; + if ( nNewId == GDB_ID_NULL) + return false ; + int nBaseId ; + if ( pGeomDB->GetInfo( nOrigId, GDB_SI_BASE, nBaseId) && + pGeomDB->GetGdbType( nBaseId) == GDB_TY_GROUP) + *pGeomDB->GetGroupFrame( nNewId) = *pGeomDB->GetGroupFrame( nBaseId) ; + pGeomDB->SetInfo( nNewId, GDB_SI_DUPSOU, nOrigId) ; + pGeomDB->RemoveInfo( nNewId, GDB_SI_DUPLIST) ; + pGeomDB->RemoveInfo( nNewId, GDB_SI_DUPMODIF) ; + return true ; +} + +//----------------------------------------------------------------------------- +bool +ExeDuploGetLocked( int nDupId, bool& bLocked) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // Verifico sia un duplo + if ( ! ExeIsDuplo( nDupId)) + return false ; + // Recupero il flag di bloccato + if ( ! pGeomDB->GetInfo( nDupId, GDB_SI_DUPLOCKED, bLocked)) + bLocked = false ; + return true ; +} + //----------------------------------------------------------------------------- bool ExeDuploUpdate( int nSouId) @@ -804,6 +875,13 @@ ExeDuploUpdate( int nSouId) return false ; // eseguo gli aggiornamenti for ( int nCopyId : vnRef) { + // se bloccato, non eseguo aggiornamento + bool bLocked ; + if ( pGeomDB->GetInfo( nCopyId, GDB_SI_DUPLOCKED, bLocked) && bLocked) { + pGeomDB->SetInfo( nCopyId, GDB_SI_DUPTOUPDATE, true) ; + continue ; + } + // aggiorno pGeomDB->Erase( nCopyId) ; int nNewId = pGeomDB->Copy( nSouId, nCopyId, nDuploBaseId) ; if ( nNewId == GDB_ID_NULL) { diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 263c824..a664d90 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GdbPartLayers.cpp b/LUA_GdbPartLayers.cpp index 1ca47e4..dcdea8e 100644 --- a/LUA_GdbPartLayers.cpp +++ b/LUA_GdbPartLayers.cpp @@ -488,6 +488,55 @@ LuaDuploGetModified( lua_State* L) return 1 ; } +//------------------------------------------------------------------------------- +static int +LuaDuploSetLocked( lua_State* L) +{ + // 1 parametro : nDupId + int nDupId ; + LuaCheckParam( L, 1, nDupId) + LuaClearStack( L) ; + // blocco il duplicato (non modificabile) + bool bOk = ExeDuploSetLocked( nDupId) ; + // restituisco il risultato + LuaSetParam( L, bOk) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaDuploResetLocked( lua_State* L) +{ + // 1 parametro : nDupId + int nDupId ; + LuaCheckParam( L, 1, nDupId) + LuaClearStack( L) ; + // sblocco il duplicato (ritorna copia esatta dell'originale) + bool bOk = ExeDuploResetLocked( nDupId) ; + // restituisco il risultato + LuaSetParam( L, bOk) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaDuploGetLocked( lua_State* L) +{ + // 1 parametro : nDupId + int nDupId ; + LuaCheckParam( L, 1, nDupId) + LuaClearStack( L) ; + // recupero lo stato di blocco del duplicato + bool bLocked ; + bool bOk = ExeDuploGetLocked( nDupId, bLocked) ; + // restituisco il risultato + if ( bOk) + LuaSetParam( L, bLocked) ; + else + LuaSetParam( L) ; + return 1 ; +} + //------------------------------------------------------------------------------- static int LuaDuploUpdate( lua_State* L) @@ -569,6 +618,9 @@ LuaInstallGdbPartLayer( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtDuploList", LuaDuploList) ; bOk = bOk && luaMgr.RegisterFunction( "EgtDuploSetModified", LuaDuploSetModified) ; bOk = bOk && luaMgr.RegisterFunction( "EgtDuploGetModified", LuaDuploGetModified) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploSetLocked", LuaDuploSetLocked) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploResetLocked", LuaDuploResetLocked) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtDuploGetLocked", LuaDuploGetLocked) ; bOk = bOk && luaMgr.RegisterFunction( "EgtDuploUpdate", LuaDuploUpdate) ; bOk = bOk && luaMgr.RegisterFunction( "EgtIsDuplo", LuaIsDuplo) ; bOk = bOk && luaMgr.RegisterFunction( "EgtDuploGetOriginal", LuaDuploGetOriginal) ;