EgtExecutor :
- aggiunta gestione copia di pezzo (Duplo*) in Exe e Lua.
This commit is contained in:
@@ -31,3 +31,6 @@ ILogger* GetLogger( void) ;
|
||||
ILogger* GetCmdLogger( void) ;
|
||||
bool SetCmdLog( bool bVal) ;
|
||||
bool IsCmdLog( void) ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool ExeIsDuploBase( IGeomDB* pGeomDB, int nId) ;
|
||||
|
||||
@@ -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" ;
|
||||
|
||||
@@ -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
@@ -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 ;
|
||||
}
|
||||
|
||||
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user