966885645e
- primo rilascio (esecutore e lua da EgtInterface).
451 lines
15 KiB
C++
451 lines
15 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2015-2015
|
|
//----------------------------------------------------------------------------
|
|
// File : EXE_GdbPartLayers.cpp Data : 04.05.15 Versione : 1.6e1
|
|
// Contenuto : Funzioni di gestione pezzi e layer relativi per EXE.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 29.01.15 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "EXE.h"
|
|
#include "EXE_Macro.h"
|
|
#include "/EgtDev/Include/EXeExecutor.h"
|
|
#include "/EgtDev/Include/EgkCurve.h"
|
|
#include "/EgtDev/Include/EgkChainCurves.h"
|
|
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
|
|
|
using namespace std ;
|
|
|
|
//-------------------------------------------------------------------------------
|
|
static bool
|
|
ExeIsUserObj( IGeomDB* pGeomDB, int nId)
|
|
{
|
|
int nLev ;
|
|
return ( pGeomDB->GetCalcLevel( nId, nLev) && nLev == GDB_LV_USER) ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
static bool
|
|
ExeIsVisibleObj( IGeomDB* pGeomDB, int nId)
|
|
{
|
|
int nStat ;
|
|
return ( pGeomDB->GetCalcStatus( nId, nStat) && nStat != GDB_ST_OFF) ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
static int
|
|
ExeVerifyOrNext( IGeomDB* pGeomDB, int nId, bool bOnlyVisible)
|
|
{
|
|
while ( nId != GDB_ID_NULL) {
|
|
if ( ExeIsUserObj( pGeomDB, nId) &&
|
|
( ! bOnlyVisible || ExeIsVisibleObj( pGeomDB, nId)))
|
|
return nId ;
|
|
nId = pGeomDB->GetNextGroup( nId) ;
|
|
}
|
|
return GDB_ID_NULL ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
bool
|
|
ExeIsPart( int nPartId)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, false)
|
|
// verifico sia un pezzo (gruppo sotto la radice con livello utente)
|
|
if ( pGeomDB->GetGdbType( nPartId) == GDB_TY_GROUP &&
|
|
pGeomDB->GetParentId( nPartId) == GDB_ID_ROOT &&
|
|
ExeIsUserObj( pGeomDB, nPartId))
|
|
return true ;
|
|
else
|
|
return false ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
bool
|
|
ExeIsLayer( int nLayerId)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, false)
|
|
// verifico sia un layer (gruppo sotto un pezzo con livello utente)
|
|
if ( pGeomDB->GetGdbType( nLayerId) == GDB_TY_GROUP &&
|
|
ExeIsPart( pGeomDB->GetParentId( nLayerId)) &&
|
|
ExeIsUserObj( pGeomDB, nLayerId))
|
|
return true ;
|
|
else
|
|
return false ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
int
|
|
ExeGetCurrPart( void)
|
|
{
|
|
GseContext* pGseCtx = GetCurrGseContext() ;
|
|
VERIFY_CTX_GEOMDB( pGseCtx, GDB_ID_NULL)
|
|
// recupero il pezzo corrente
|
|
return pGseCtx->m_nCurrPart ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
int
|
|
ExeGetCurrLayer( void)
|
|
{
|
|
GseContext* pGseCtx = GetCurrGseContext() ;
|
|
VERIFY_CTX_GEOMDB( pGseCtx, GDB_ID_NULL)
|
|
// recupero il pezzo corrente
|
|
return pGseCtx->m_nCurrLayer ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
bool
|
|
ExeSetCurrPartLayer( int nPartId, int nLayerId)
|
|
{
|
|
GseContext* pGseCtx = GetCurrGseContext() ;
|
|
VERIFY_CTX_GEOMDB( pGseCtx, false)
|
|
IGeomDB* pGeomDB = pGseCtx->m_pGeomDB ;
|
|
bool bOk = true ;
|
|
// verifico validità e visibilità pezzo
|
|
if ( pGeomDB->GetParentId( nPartId) == GDB_ID_ROOT &&
|
|
ExeIsUserObj( pGeomDB, nPartId) &&
|
|
ExeIsVisibleObj( pGeomDB, nPartId)) {
|
|
if ( nPartId != pGseCtx->m_nCurrPart)
|
|
pGseCtx->m_nCurrLayer = GDB_ID_NULL ;
|
|
pGseCtx->m_nCurrPart = nPartId ;
|
|
}
|
|
else {
|
|
if ( nPartId == pGseCtx->m_nCurrPart || nPartId == GDB_ID_NULL) {
|
|
pGseCtx->m_nCurrPart = GDB_ID_NULL ;
|
|
pGseCtx->m_nCurrLayer = GDB_ID_NULL ;
|
|
}
|
|
bOk = false ;
|
|
}
|
|
// verifico validità e visibilità layer
|
|
if ( pGeomDB->GetParentId( nLayerId) == nPartId &&
|
|
ExeIsUserObj( pGeomDB, nLayerId) &&
|
|
ExeIsVisibleObj( pGeomDB, nLayerId)) {
|
|
pGseCtx->m_nCurrLayer = nLayerId ;
|
|
}
|
|
else {
|
|
if ( nLayerId == pGseCtx->m_nCurrLayer || nLayerId == GDB_ID_NULL)
|
|
pGseCtx->m_nCurrLayer = GDB_ID_NULL ;
|
|
bOk = false ;
|
|
}
|
|
// se richiesto, salvo il comando Lua equivalente
|
|
if ( IsCmdLog()) {
|
|
string sLua = "EgtSetCurrPartLayer(" + ToString( nPartId) + "," +
|
|
ToString( nLayerId) + ")" +
|
|
" -- Ok=" + ToString( bOk) ;
|
|
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
|
}
|
|
// restituisco il risultato
|
|
return bOk ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
bool
|
|
ExeResetCurrPartLayer( void)
|
|
{
|
|
GseContext* pGseCtx = GetCurrGseContext() ;
|
|
VERIFY_CTX_GEOMDB( pGseCtx, false)
|
|
IGeomDB* pGeomDB = pGseCtx->m_pGeomDB ;
|
|
// reset
|
|
pGseCtx->m_nCurrPart = GDB_ID_NULL ;
|
|
pGseCtx->m_nCurrLayer = GDB_ID_NULL ;
|
|
// cerco il primo pezzo con un layer visibile
|
|
int nPartId = ExeGetFirstPart( true) ;
|
|
while ( nPartId != GDB_ID_NULL) {
|
|
// cerco il primo layer visibile del pezzo
|
|
int nLayerId = ExeGetFirstLayer( nPartId, true) ;
|
|
if ( nLayerId != GDB_ID_NULL) {
|
|
// assegno il pezzo corrente
|
|
pGseCtx->m_nCurrPart = nPartId ;
|
|
// assegno il layer corrente
|
|
pGseCtx->m_nCurrLayer = nLayerId ;
|
|
// esco dal ciclo di ricerca
|
|
break ;
|
|
}
|
|
nPartId = ExeGetNextPart( nPartId, true) ;
|
|
}
|
|
// se non ho trovato layer visibile mi accontento del primo pezzo visibile
|
|
if ( pGseCtx->m_nCurrPart == GDB_ID_NULL)
|
|
pGseCtx->m_nCurrPart = ExeGetFirstPart( true) ;
|
|
// se richiesto, salvo il comando Lua equivalente
|
|
if ( IsCmdLog()) {
|
|
string sLua = "EgtResetCurrPartLayer()"
|
|
" -- Ids=" + ToString( pGseCtx->m_nCurrPart) + "," + ToString( pGseCtx->m_nCurrLayer) ;
|
|
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
|
}
|
|
// restituisco il risultato
|
|
return true ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
int
|
|
ExeGetPartNbr( bool bOnlyVisible)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, 0)
|
|
// conto i pezzi, considerando richiesta di visibilità
|
|
int nCount = 0 ;
|
|
int nPartId = ExeGetFirstPart( bOnlyVisible) ;
|
|
while ( nPartId != GDB_ID_NULL) {
|
|
++ nCount ;
|
|
nPartId = ExeGetNextPart( nPartId, bOnlyVisible) ;
|
|
}
|
|
return nCount ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
int
|
|
ExeGetFirstPart( bool bOnlyVisible)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
|
|
// recupero il primo gruppo sotto la radice
|
|
int nPartId = pGeomDB->GetFirstGroupInGroup( GDB_ID_ROOT) ;
|
|
// verifico oppure passo al primo successivo valido
|
|
return ExeVerifyOrNext( pGeomDB, nPartId, bOnlyVisible) ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
int
|
|
ExeGetNextPart( int nId, bool bOnlyVisible)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
|
|
// recupero il successivo gruppo
|
|
int nPartId = pGeomDB->GetNextGroup( nId) ;
|
|
// verifico oppure passo al primo successivo valido
|
|
return ExeVerifyOrNext( pGeomDB, nPartId, bOnlyVisible) ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
int
|
|
ExeGetFirstLayer( int nPartId, bool bOnlyVisible)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
|
|
// verifico il pezzo (livello utente e se richiesto visibile)
|
|
if ( ! ExeIsUserObj( pGeomDB, nPartId) ||
|
|
( bOnlyVisible && ! ExeIsVisibleObj( pGeomDB, nPartId)))
|
|
return GDB_ID_NULL ;
|
|
// recupero il primo layer nel pezzo
|
|
int nLayerId = pGeomDB->GetFirstGroupInGroup( nPartId) ;
|
|
// verifico oppure passo al primo successivo valido
|
|
return ExeVerifyOrNext( pGeomDB, nLayerId, bOnlyVisible) ;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------
|
|
int
|
|
ExeGetNextLayer( int nId, bool bOnlyVisible)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
|
|
// recupero il successivo gruppo
|
|
int nLayerId = pGeomDB->GetNextGroup( nId) ;
|
|
// verifico sia visibile oppure passo al primo successivo visibile
|
|
return ExeVerifyOrNext( pGeomDB, nLayerId, bOnlyVisible) ;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool
|
|
ExeSelectPartObjs( int nPartId)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, false)
|
|
bool bOk = true ;
|
|
// verifico sia veramente un pezzo
|
|
if ( ExeIsPart( nPartId)) {
|
|
// ciclo sugli oggetti del pezzo
|
|
int nId = pGeomDB->GetFirstInGroup( nPartId) ;
|
|
while ( nId != GDB_ID_NULL) {
|
|
// se è gruppo seleziono i suoi componenti
|
|
if ( pGeomDB->GetGdbType( nId) == GDB_TY_GROUP)
|
|
pGeomDB->SelectGroupObjs( nId) ;
|
|
// altrimenti lo seleziono direttamente
|
|
else
|
|
pGeomDB->SelectObj( nId) ;
|
|
// passo al successivo
|
|
nId = pGeomDB->GetNext( nId) ;
|
|
}
|
|
}
|
|
else
|
|
bOk = false ;
|
|
// se richiesto, salvo il comando Lua equivalente
|
|
if ( IsCmdLog()) {
|
|
string sLua = "EgtSelectPartObjs(" + ToString( nPartId) + ")" +
|
|
" -- Ok=" + ToString( bOk) ;
|
|
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
|
}
|
|
// restituisco risultato
|
|
return bOk ;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool
|
|
ExeDeselectPartObjs( int nPartId)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, false)
|
|
bool bOk = true ;
|
|
// verifico sia veramente un pezzo
|
|
if ( ExeIsPart( nPartId)) {
|
|
// ciclo sugli oggetti del pezzo
|
|
int nId = pGeomDB->GetFirstInGroup( nPartId) ;
|
|
while ( nId != GDB_ID_NULL) {
|
|
// se è gruppo deseleziono i suoi componenti
|
|
if ( pGeomDB->GetGdbType( nId) == GDB_TY_GROUP)
|
|
pGeomDB->DeselectGroupObjs( nId) ;
|
|
// altrimenti lo deseleziono direttamente
|
|
else
|
|
pGeomDB->DeselectObj( nId) ;
|
|
// passo al successivo
|
|
nId = pGeomDB->GetNext( nId) ;
|
|
}
|
|
}
|
|
else
|
|
bOk = false ;
|
|
// se richiesto, salvo il comando Lua equivalente
|
|
if ( IsCmdLog()) {
|
|
string sLua = "EgtDeselectPartObjs(" + ToString( nPartId) + ")" +
|
|
" -- Ok=" + ToString( bOk) ;
|
|
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
|
}
|
|
// restituisco risultato
|
|
return bOk ;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool
|
|
ExeSelectLayerObjs( int nLayerId)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, false)
|
|
bool bOk = true ;
|
|
// verifico sia veramente un layer
|
|
if ( ExeIsLayer( nLayerId)) {
|
|
// ciclo sugli oggetti del layer
|
|
int nId = pGeomDB->GetFirstInGroup( nLayerId) ;
|
|
while ( nId != GDB_ID_NULL) {
|
|
// seleziono
|
|
pGeomDB->SelectObj( nId) ;
|
|
// passo al successivo
|
|
nId = pGeomDB->GetNext( nId) ;
|
|
}
|
|
}
|
|
else
|
|
bOk = false ;
|
|
// se richiesto, salvo il comando Lua equivalente
|
|
if ( IsCmdLog()) {
|
|
string sLua = "EgtSelectLayerObjs(" + ToString( nLayerId) + ")" +
|
|
" -- Ok=" + ToString( bOk) ;
|
|
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
|
}
|
|
// restituisco risultato
|
|
return bOk ;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool
|
|
ExeDeselectLayerObjs( int nLayerId)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, false)
|
|
bool bOk = true ;
|
|
// verifico sia veramente un layer
|
|
if ( ExeIsLayer( nLayerId)) {
|
|
// ciclo sugli oggetti del layer
|
|
int nId = pGeomDB->GetFirstInGroup( nLayerId) ;
|
|
while ( nId != GDB_ID_NULL) {
|
|
// deseleziono
|
|
pGeomDB->DeselectObj( nId) ;
|
|
// passo al successivo
|
|
nId = pGeomDB->GetNext( nId) ;
|
|
}
|
|
}
|
|
else
|
|
bOk = false ;
|
|
// se richiesto, salvo il comando Lua equivalente
|
|
if ( IsCmdLog()) {
|
|
string sLua = "EgtDeselectLayerObjs(" + ToString( nLayerId) + ")" +
|
|
" -- Ok=" + ToString( bOk) ;
|
|
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
|
}
|
|
// restituisco risultato
|
|
return bOk ;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool
|
|
ExeSelectPathObjs( int nId, bool bHaltOnFork)
|
|
{
|
|
IGeomDB* pGeomDB = GetCurrGeomDB() ;
|
|
VERIFY_GEOMDB( pGeomDB, false)
|
|
// verifico appartenga ad un layer
|
|
int nIdLayer = pGeomDB->GetParentId( nId) ;
|
|
int nIdPart = pGeomDB->GetParentId( nIdLayer) ;
|
|
bool bOk = ( nIdLayer != GDB_ID_NULL && nIdPart != GDB_ID_NULL && ExeIsLayer( nIdLayer)) ;
|
|
// seleziono percorso a partire da entità indicata usando tutte le curve del pezzo
|
|
const int CHAIN_SIZE = 1000 ;
|
|
const double CHAIN_TOLER = 10 * EPS_SMALL ;
|
|
Point3d ptNear ;
|
|
ChainCurves chainC ;
|
|
bOk = bOk && chainC.Init( true, CHAIN_TOLER, CHAIN_SIZE) ;
|
|
// ciclo sui layer del pezzo
|
|
for ( int nLayId = pGeomDB->GetFirstGroupInGroup( nIdPart) ;
|
|
nLayId != GDB_ID_NULL ;
|
|
nLayId = pGeomDB->GetNextGroup( nLayId)) {
|
|
// ciclo sulle entità del layer
|
|
for ( int nEntId = pGeomDB->GetFirstInGroup( nLayId) ;
|
|
nEntId != GDB_ID_NULL ;
|
|
nEntId = pGeomDB->GetNext( nEntId)) {
|
|
// non deve essere nascosta
|
|
int nEntStat ;
|
|
pGeomDB->GetCalcStatus( nEntId, nEntStat) ;
|
|
if ( nEntStat == GDB_ST_OFF)
|
|
continue ;
|
|
// recupero la curva e il suo riferimento
|
|
ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nEntId)) ;
|
|
if ( pCrv == nullptr)
|
|
continue ;
|
|
Frame3d frCrv ;
|
|
if ( ! pGeomDB->GetGlobFrame( nEntId, frCrv))
|
|
continue ;
|
|
// recupero i dati della curva necessari al concatenamento e li assegno
|
|
Point3d ptStart, ptEnd ;
|
|
Vector3d vtStart, vtEnd ;
|
|
if ( ! pCrv->GetStartPoint( ptStart) || ! pCrv->GetStartDir( vtStart) ||
|
|
! pCrv->GetEndPoint( ptEnd) || ! pCrv->GetEndDir( vtEnd))
|
|
return GDB_ID_NULL ;
|
|
ptStart.ToGlob( frCrv) ;
|
|
vtStart.ToGlob( frCrv) ;
|
|
ptEnd.ToGlob( frCrv) ;
|
|
vtEnd.ToGlob( frCrv) ;
|
|
if ( nEntId == nId)
|
|
ptNear = ptStart + vtStart ;
|
|
if ( ! chainC.AddCurve( nEntId, ptStart, vtStart, ptEnd, vtEnd))
|
|
continue ;
|
|
}
|
|
}
|
|
// recupero il primo percorso concatenato
|
|
int nFirstId = GDB_ID_NULL ;
|
|
INTVECTOR vId2s ;
|
|
bOk = bOk && chainC.GetChainFromNear( ptNear, ( bHaltOnFork != FALSE), vId2s) ;
|
|
for ( size_t i = 0 ; i < vId2s.size() ; ++i) {
|
|
pGeomDB->SetStatus( abs( vId2s[i]), GDB_ST_SEL) ;
|
|
}
|
|
// se richiesto, salvo il comando Lua equivalente
|
|
if ( IsCmdLog()) {
|
|
string sLua = "EgtSelectPathObjs(" + ToString( nId) + "," +
|
|
( bHaltOnFork ? "true" : "false") + ")" +
|
|
" -- Ok=" + ToString( bOk) ;
|
|
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
|
|
}
|
|
// restituisco risultato
|
|
return bOk ;
|
|
} |