From 4a618e287bb3a9e5b87c91ac18d94cc1e017ceb8 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 17 Mar 2015 11:10:43 +0000 Subject: [PATCH] EgtInterface : - aggiunta gestione selezione per percorso. --- API_GdbCreateCurve.cpp | 4 +-- API_GdbPartLayers.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++ LUA_GdbPartLayers.cpp | 18 ++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/API_GdbCreateCurve.cpp b/API_GdbCreateCurve.cpp index fc8f202..4f68aa3 100644 --- a/API_GdbCreateCurve.cpp +++ b/API_GdbCreateCurve.cpp @@ -1054,7 +1054,7 @@ __stdcall EgtCreateCurveArc2PVNEx( int nParentId, const double ptStart[3], ToString( Vector3d( vtDirS)) + "},{" + ToString( Vector3d( vtNorm)) + "}," + RefTypeToString( nRefType) + ")" + - " -- Id=" + ToString( nId) ; + " -- Id=" + ToString( nNewId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco l'identificativo della nuova entità @@ -1400,7 +1400,7 @@ MyCreateCurveCompoByChain( int nParentId, const INTVECTOR& vIds, int nFirstId = GDB_ID_NULL ; Point3d ptNearL = GetPointLocal( pGeomDB, ptNear.v, nRefType, frDest) ; INTVECTOR vId2s ; - while ( chainC.GetChainFromNear( ptNearL, vId2s)) { + while ( chainC.GetChainFromNear( ptNearL, false, vId2s)) { // creo una curva composita PtrOwner pCrvCompo( CreateCurveComposite()) ; if ( IsNull( pCrvCompo)) diff --git a/API_GdbPartLayers.cpp b/API_GdbPartLayers.cpp index 0dd2725..4039831 100644 --- a/API_GdbPartLayers.cpp +++ b/API_GdbPartLayers.cpp @@ -16,6 +16,8 @@ #include "API.h" #include "API_Macro.h" #include "/EgtDev/Include/EInAPI.h" +#include "/EgtDev/Include/EgkCurve.h" +#include "/EgtDev/Include/EgkChainCurves.h" #include "/EgtDev/Include/EGkStringUtils3d.h" using namespace std ; @@ -321,3 +323,75 @@ __stdcall EgtDeselectLayerObjs( int nLayerId) // restituisco risultato return ( bOk ? TRUE : FALSE) ; } + +//----------------------------------------------------------------------------- +BOOL +__stdcall EgtSelectPathObjs( int nId, BOOL bHaltOnFork) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + bool bOk = true ; + // verifico appartenga ad un layer + int nIdLayer = pGeomDB->GetParentId( nId) ; + int nIdPart = pGeomDB->GetParentId( nIdLayer) ; + int nIdRoot = pGeomDB->GetParentId( nIdPart) ; + bOk = bOk && ( nIdLayer != GDB_ID_NULL && nIdPart != GDB_ID_NULL && nIdRoot == GDB_ID_ROOT) ; + // 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 ? TRUE : FALSE) ; +} \ No newline at end of file diff --git a/LUA_GdbPartLayers.cpp b/LUA_GdbPartLayers.cpp index 13a4955..c333403 100644 --- a/LUA_GdbPartLayers.cpp +++ b/LUA_GdbPartLayers.cpp @@ -195,6 +195,23 @@ LuaDeselectLayerObjs( lua_State* L) return 1 ; } +//------------------------------------------------------------------------------- +static int +LuaSelectPathObjs( lua_State* L) +{ + // 2 parametri : nId, bHaltOnFork + int nId ; + LuaCheckParam( L, 1, nId) + bool bHaltOnFork ; + LuaCheckParam( L, 2, bHaltOnFork) + LuaClearStack( L) ; + // eseguo la selezione + bool bOk = ( EgtSelectPathObjs( nId, bHaltOnFork) != FALSE) ; + // restituisco il risultato + LuaSetReturn( L, bOk) ; + return 1 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbPartLayer( lua_State* L) @@ -212,6 +229,7 @@ LuaInstallGdbPartLayer( lua_State* L) lua_register( L, "EgtDeselectPartObjs", LuaDeselectPartObjs) ; lua_register( L, "EgtSelectLayerObjs", LuaSelectLayerObjs) ; lua_register( L, "EgtDeselectLayerObjs", LuaDeselectLayerObjs) ; + lua_register( L, "EgtSelectPathObjs", LuaSelectPathObjs) ; } catch ( ...) { return false ;