diff --git a/EXE_GdbGetCurve.cpp b/EXE_GdbGetCurve.cpp index 54b6702..8db34c9 100644 --- a/EXE_GdbGetCurve.cpp +++ b/EXE_GdbGetCurve.cpp @@ -26,6 +26,7 @@ #include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkIntersCurves.h" #include "/EgtDev/Include/EGkSurfFlatRegion.h" +#include "EgtDev/Include/EGkVoronoi.h" //---------------------------------------------------------------------------- bool @@ -676,3 +677,93 @@ ExeCurveCompoNormVersor( int nId, int nSimpCrv, int nRefId, Vector3d& vtNorm) // gestione trasformazione ( eventuale) return TransformVector( pGeomDB, nId, nRefId, vtNorm) ; } + +//---------------------------------------------------------------------------- +int +ExeCurveGetVoronoi( int nId, int nDestGrpId, int nBound, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la curva + const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nId)) ; + if ( pCrv == nullptr) + return GDB_ID_NULL ; + // recupero il riferimento della curva + Frame3d frCrv ; + if ( ! pGeomDB->GetGlobFrame( nId, frCrv)) + return GDB_ID_NULL ; + // recupero il riferimento di destinazione + Frame3d frDest ; + if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) + return GDB_ID_NULL ; + + // recupero oggetto voronoi e calcolo diagramma di Voronoi + Voronoi* voronoi = pCrv->GetVoronoiObject() ; + if ( voronoi == nullptr) + return GDB_ID_NULL ; + ICURVEPOVECTOR vCrv ; + voronoi->CalcVoronoiDiagram( vCrv, nBound) ; + + // inserisco i risultati nel DB geometrico + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( int i = 0 ; i < int( vCrv.size()) ; i++) { + vCrv[i]->LocToLoc( frCrv, frDest) ; + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( vCrv[i])) ; + if ( nId != GDB_ID_NULL) { + nCount ++ ; + if ( nFirstId == GDB_ID_NULL) + nFirstId = nId ; + } + } + + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} + +//---------------------------------------------------------------------------- +int +ExeCurveGetFatCurve( int nId, int nDestGrpId, double dRad, bool bSquareEnds, bool bSquareMids, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la curva + const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nId)) ; + if ( pCrv == nullptr) + return GDB_ID_NULL ; + // recupero il riferimento della curva + Frame3d frCrv ; + if ( ! pGeomDB->GetGlobFrame( nId, frCrv)) + return GDB_ID_NULL ; + // recupero il riferimento di destinazione + Frame3d frDest ; + if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) + return GDB_ID_NULL ; + + // recupero oggetto voronoi e calcolo la curva ingrossata + Voronoi* voronoi = pCrv->GetVoronoiObject() ; + if ( voronoi == nullptr) + return GDB_ID_NULL ; + ICURVEPOVECTOR vCrv ; + voronoi->CalcFatCurve( vCrv, dRad, bSquareEnds, bSquareMids) ; + + // inserisco i risultati nel DB geometrico + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( int i = 0 ; i < int( vCrv.size()) ; i++) { + vCrv[i]->LocToLoc( frCrv, frDest) ; + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( vCrv[i])) ; + if ( nId != GDB_ID_NULL) { + nCount ++ ; + if ( nFirstId == GDB_ID_NULL) + nFirstId = nId ; + } + } + + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} diff --git a/EgtExecutor.rc b/EgtExecutor.rc index da7c8e9..8d235a8 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GdbGetCurve.cpp b/LUA_GdbGetCurve.cpp index 112d39d..edaa44a 100644 --- a/LUA_GdbGetCurve.cpp +++ b/LUA_GdbGetCurve.cpp @@ -18,6 +18,7 @@ #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGkLuaAux.h" +#include "/EgtDev/Include/EGkVoronoi.h" //---------------------------------------------------------------------------- static int @@ -531,6 +532,58 @@ LuaCurveCompoNormVersor( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaCurveGetVoronoi( lua_State* L) +{ + // 2 o 3 parametri : Id, nDestId [, nBound] + int nId ; + LuaCheckParam( L, 1, nId) + int nDestGrpId ; + LuaCheckParam( L, 2, nDestGrpId) + int nBound = VORONOI_STD_BOUND ; + LuaGetParam( L, 3, nBound) ; + + LuaClearStack( L) ; + int nCount = 0 ; + int nNewId = ExeCurveGetVoronoi( nId, nDestGrpId, nBound, &nCount) ; + if ( nNewId != GDB_ID_NULL) + LuaSetParam( L, nNewId) ; + else + LuaSetParam( L) ; + + LuaSetParam( L, nCount) ; + return 2 ; +} + +//---------------------------------------------------------------------------- +static int +LuaCurveGetFatCurve( lua_State* L) +{ + // 4 o 5 parametri : Id, nDestId, dRad, bSquare [, bSquareMids] + int nId ; + LuaCheckParam( L, 1, nId) + int nDestGrpId ; + LuaCheckParam( L, 2, nDestGrpId) + double dRad ; + LuaCheckParam( L, 3, dRad) + bool bSquareEnds ; + LuaCheckParam( L, 4, bSquareEnds) + bool bSquareMids = bSquareEnds ; + LuaGetParam( L, 5, bSquareMids) ; + + LuaClearStack( L) ; + int nCount = 0 ; + int nNewId = ExeCurveGetFatCurve( nId, nDestGrpId, dRad, bSquareEnds, bSquareMids, &nCount) ; + if ( nNewId != GDB_ID_NULL) + LuaSetParam( L, nNewId) ; + else + LuaSetParam( L) ; + + LuaSetParam( L, nCount) ; + return 2 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbGetCurve( LuaMgr& luaMgr) @@ -562,5 +615,7 @@ LuaInstallGdbGetCurve( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtCurveCompoRadius", LuaCurveCompoRadius) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveCompoAngCenter", LuaCurveCompoAngCenter) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveCompoNormVersor", LuaCurveCompoNormVersor) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtCurveGetVoronoi", LuaCurveGetVoronoi) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtCurveGetFatCurve", LuaCurveGetFatCurve) ; return bOk ; }