EgtExecutor :

- aggiunta gestione copia di pezzo (Duplo*) in Exe e Lua.
This commit is contained in:
Dario Sassi
2021-02-08 08:41:19 +00:00
parent 922dc7912f
commit 541b299948
5 changed files with 347 additions and 1 deletions
+3
View File
@@ -31,3 +31,6 @@ ILogger* GetLogger( void) ;
ILogger* GetCmdLogger( void) ;
bool SetCmdLog( bool bVal) ;
bool IsCmdLog( void) ;
//----------------------------------------------------------------------------
bool ExeIsDuploBase( IGeomDB* pGeomDB, int nId) ;
+3
View File
@@ -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" ;
+16
View File
@@ -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 ;
+202 -1
View File
@@ -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 ;
}
}
//----------------------------------------------------------------------------
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 ;
}
+123
View File
@@ -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 ;
}