From 70700321204b99741cbba86c4a7b407b341c872b Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 6 May 2024 15:34:25 +0200 Subject: [PATCH 1/2] EgtExecutor : - funzioni per la conversione di curve generiche in curve di Bezier. - funzione per mostrare i punti di controllo di una curva di Bezier. --- EXE_GdbCreateCurve.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++ EXE_GdbGetCurve.cpp | 34 +++++++++++++++++++++ LUA_GdbCreateCurve.cpp | 21 +++++++++++++ LUA_GdbGetCurve.cpp | 23 ++++++++++++++ 4 files changed, 147 insertions(+) diff --git a/EXE_GdbCreateCurve.cpp b/EXE_GdbCreateCurve.cpp index d9a9c25..6d10514 100644 --- a/EXE_GdbCreateCurve.cpp +++ b/EXE_GdbCreateCurve.cpp @@ -45,6 +45,8 @@ #include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkCurveLocal.h" +#include "/EgtDev/Include/EGkCurveAux.h" +#include "/EgtDev/Include/EGkCurve.h" #include "/EgtDev/Include/EgtPointerOwner.h" using namespace std ; @@ -2584,3 +2586,70 @@ CalcExtrusion( IGeomDB* pGeomDB, int nParentId, int nRefType) vtExtr.LocToLoc( pGeomDB->GetGridFrame(), frEnt) ; return vtExtr ; } + +//------------------------------------------------------------------------------- +static int +MyCreateCurveBezierForm( int nParentId, int nCrvId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + nParentId = AdjustId( nParentId) ; + // recupero il riferimento della curva + Frame3d frCrv ; + if ( ! pGeomDB->GetGlobFrame( nCrvId, frCrv)) + return GDB_ID_NULL ; + // recupero il riferimento di destinazione + Frame3d frLoc ; + if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frLoc)) + return GDB_ID_NULL ; + // recupero la curva + const ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nCrvId)) ; + if ( pCurve == nullptr || ! pCurve->IsValid()) + return GDB_ID_NULL ; + // recupero il vettore estrusione della curva e lo porto in locale al gruppo destinazione + Vector3d vtExtr ; + pCurve->GetExtrusion( vtExtr) ; + vtExtr.LocToLoc( frCrv, frLoc) ; + int nType = pCurve->GetType() ; + PtrOwner pCrv ; + switch ( nType ) { + case CRV_LINE : + pCrv.Set( LineToBezierCurve( GetCurveLine( pCurve))) ; + break ; + case CRV_ARC : + pCrv.Set( ArcToBezierCurve( GetCurveArc( pCurve))) ; + break ; + case CRV_BEZIER : + pCrv.Set( BezierToBasicBezierCurve( GetCurveBezier( pCurve))) ; + //pCrv.Set( BezierDecreaseDegree( GetCurveBezier( pCurve), 1)) ; + break ; + case CRV_COMPO : + pCrv.Set( CompositeToBezierCurve( GetCurveComposite( pCurve))) ; + break ; + default : + break ; + } + // setto l'estrusione + pCrv->SetExtrusion( vtExtr) ; + // aggiungo la curva in forma di Bezier al DB + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pCrv)) ; + return nId ; +} + +//------------------------------------------------------------------------------- +int +ExeCreateCurveBezierForm( int nParentId, int nCrvId) +{ + // eseguo + int nId = MyCreateCurveBezierForm( nParentId, nCrvId) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtCreateCurveBezierForm(" + IdToString( nParentId) + "," + + IdToString( nCrvId) + "," + + " -- Id=" + ToString( nId) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco l'identificativo della nuova entità + return nId ; +} diff --git a/EXE_GdbGetCurve.cpp b/EXE_GdbGetCurve.cpp index 8a68b7f..f42490d 100644 --- a/EXE_GdbGetCurve.cpp +++ b/EXE_GdbGetCurve.cpp @@ -27,6 +27,7 @@ #include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkIntersCurves.h" #include "/EgtDev/Include/EGkSurfFlatRegion.h" +#include "/EgtDev/Include/EGkGeoPoint3d.h" //---------------------------------------------------------------------------- bool @@ -677,3 +678,36 @@ ExeCurveCompoNormVersor( int nId, int nSimpCrv, int nRefId, Vector3d& vtNorm) // gestione trasformazione ( eventuale) return TransformVector( pGeomDB, nId, nRefId, vtNorm) ; } + +//---------------------------------------------------------------------------- +bool +ExeShowBezierCurveControlPoints( int nCrvId, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la curva di bezier + const ICurveBezier* pCrvBezier = GetCurveBezier( pGeomDB->GetGeoObj( nCrvId)) ; + if ( pCrvBezier == nullptr || pCrvBezier->GetType() != CRV_BEZIER) + return false ; + int nParent = pGeomDB->GetParentId( nCrvId) ; + int nDeg = pCrvBezier->GetDegree() ; + bool bRat = pCrvBezier->IsRational() ; + int nFirstId = -1 ; + int nCount = 0 ; + for ( int i = 0 ; i < nDeg + 1 ; ++i) { + IGeoPoint3d* pGeoPt( CreateGeoPoint3d()) ; + if ( ! bRat) + pGeoPt->Set( pCrvBezier->GetControlPoint( i)) ; + else + pGeoPt->Set( pCrvBezier->GetControlPoint( i) * pCrvBezier->GetControlWeight( i)) ; + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParent, pGeoPt) ; + if ( nFirstId == GDB_ID_NULL) + nFirstId = nId ; + if ( nId != GDB_ID_NULL) + ++nCount ; + } + // restituisco i risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} diff --git a/LUA_GdbCreateCurve.cpp b/LUA_GdbCreateCurve.cpp index bef8eec..856098a 100644 --- a/LUA_GdbCreateCurve.cpp +++ b/LUA_GdbCreateCurve.cpp @@ -1091,6 +1091,26 @@ LuaCreateCirclesAlongCurve( lua_State* L) return 2 ; } +//------------------------------------------------------------------------------- +static int +LuaCreateCurveBezierForm( lua_State* L) +{ + // 2 parametri : ParentId, nCrvId + int nParentId ; + LuaCheckParam( L, 1, nParentId) + int nCrvId ; + LuaCheckParam( L, 2, nCrvId) + + // creo la versione bezier della curva + int nId = ExeCreateCurveBezierForm( nParentId, nCrvId) ; + // restituisco il risultato + if ( nId != GDB_ID_NULL) + LuaSetParam( L, nId) ; + else + LuaSetParam( L) ; + return 1 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbCreateCurve( LuaMgr& luaMgr) @@ -1135,5 +1155,6 @@ LuaInstallGdbCreateCurve( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtPolygonFromApothem", LuaCreatePolygonFromApothem) ; bOk = bOk && luaMgr.RegisterFunction( "EgtPolygonFromSide", LuaCreatePolygonFromSide) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCirclesAlongCurve", LuaCreateCirclesAlongCurve) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtCurveBezierForm", LuaCreateCurveBezierForm) ; return bOk ; } diff --git a/LUA_GdbGetCurve.cpp b/LUA_GdbGetCurve.cpp index 112d39d..dcb05cc 100644 --- a/LUA_GdbGetCurve.cpp +++ b/LUA_GdbGetCurve.cpp @@ -531,6 +531,28 @@ LuaCurveCompoNormVersor( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaShowBezierCurveControlPoint( lua_State* L) +{ + // 1 parametro : nCrvId + int nCrvId ; + LuaCheckParam( L, 1, nCrvId) + LuaClearStack( L) ; + int nCount = 0 ; + int nId = ExeShowBezierCurveControlPoints( nCrvId, &nCount) ; + // restituisco il risultato + if ( nId != GDB_ID_NULL) { + LuaSetParam( L, nId) ; + LuaSetParam( L, nCount) ; + } + else { + LuaSetParam( L) ; + LuaSetParam( L) ; + } + return 2 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbGetCurve( LuaMgr& luaMgr) @@ -562,5 +584,6 @@ 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( "EgtShowBezierControlPoints", LuaShowBezierCurveControlPoint) ; return bOk ; } From fb0b4f962128ebe562e09fc69f8b1c206c7e411e Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 7 May 2024 09:53:21 +0200 Subject: [PATCH 2/2] EgtExecutor : - tolto un commento. --- EXE_GdbCreateCurve.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/EXE_GdbCreateCurve.cpp b/EXE_GdbCreateCurve.cpp index 6d10514..95daf41 100644 --- a/EXE_GdbCreateCurve.cpp +++ b/EXE_GdbCreateCurve.cpp @@ -2621,7 +2621,6 @@ MyCreateCurveBezierForm( int nParentId, int nCrvId) break ; case CRV_BEZIER : pCrv.Set( BezierToBasicBezierCurve( GetCurveBezier( pCurve))) ; - //pCrv.Set( BezierDecreaseDegree( GetCurveBezier( pCurve), 1)) ; break ; case CRV_COMPO : pCrv.Set( CompositeToBezierCurve( GetCurveComposite( pCurve))) ;