From d084847e0ebfb3eb79084c4a31cddeaa8c0e18d6 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 4 Jun 2020 15:49:44 +0000 Subject: [PATCH] EgtExecutor 2.2f2 : - aggiunta funzione Exe e Lua CurveIsACircle. --- EXE_GdbGetCurve.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++ EgtExecutor.rc | Bin 16176 -> 16176 bytes LUA_GdbGetCurve.cpp | 25 ++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/EXE_GdbGetCurve.cpp b/EXE_GdbGetCurve.cpp index d8f8894..19ede39 100644 --- a/EXE_GdbGetCurve.cpp +++ b/EXE_GdbGetCurve.cpp @@ -21,6 +21,7 @@ #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGkCurve.h" #include "/EgtDev/Include/EGkCurveArc.h" +#include "/EgtDev/Include/EGkCurveBezier.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkIntersCurves.h" @@ -127,6 +128,50 @@ ExeCurveIsFlat( int nId, Plane3d& Plane, bool bUseExtrusion, double dToler) return ( pCurve != nullptr && pCurve->IsFlat( Plane, bUseExtrusion, dToler)) ; } +//---------------------------------------------------------------------------- +bool +ExeCurveIsACircle( int nId, Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW, double dToler) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // verifico i parametri + if ( &ptCen == nullptr || &vtN == nullptr || &dRad == nullptr || &bCCW == nullptr) + return false ; + // recupero l'oggetto + IGeoObj* pGObj = pGeomDB->GetGeoObj( nId) ; + if ( pGObj == nullptr) + return false ; + // analizzo tipi di curve candidabili + switch ( pGObj->GetType()) { + case CRV_ARC : + { ICurveArc* pArc = GetCurveArc( pGObj) ; + if ( pArc->IsACircle()) { + ptCen = pArc->GetCenter() ; + vtN = pArc->GetNormVersor() ; + dRad = pArc->GetRadius() ; + bCCW = ( pArc->GetAngCenter() > 0) ; + return true ; + } + } + case CRV_COMPO : + { ICurveComposite* pCompo = GetCurveComposite( pGObj) ; + return pCompo->IsACircle( dToler, ptCen, vtN, dRad, bCCW) ; + } + case CRV_BEZIER : + { ICurveBezier* pBezier = GetCurveBezier( pGObj) ; + PolyArc PA ; + if ( ! pBezier->ApproxWithArcs( dToler, ANG_TOL_STD_DEG, PA)) + return false ; + PtrOwner pCompo( CreateCurveComposite()) ; + if ( IsNull( pCompo) || ! pCompo->FromPolyArc( PA)) + return false ; + return pCompo->IsACircle( dToler, ptCen, vtN, dRad, bCCW) ; + } + } + + return false ; +} + //---------------------------------------------------------------------------- bool ExeCurveAreaXY( int nId, double& dArea) diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 80809214342484bcc6d2ad42f0cc27829f69ba8f..9e204f58fa138a44aaa936650476d860288192f2 100644 GIT binary patch delta 79 zcmdl`x1nysFE&P_&A-`PnSqoe*K!sx?>N)s4T4pSMw1=6k~jAW*?>e(i-FY$N+HxV MD8kglDP58Q0C_7LTL1t6 delta 79 zcmdl`x1nysFE&QQ&A-`PnSqoe*K!sx?>N)s4T4pShLat+k~jAW*?>e(i-FY$N+HxV MD8kglDP58Q0C(RTQvd(} diff --git a/LUA_GdbGetCurve.cpp b/LUA_GdbGetCurve.cpp index fbdf590..09b5aa4 100644 --- a/LUA_GdbGetCurve.cpp +++ b/LUA_GdbGetCurve.cpp @@ -90,6 +90,30 @@ LuaCurveIsFlat( lua_State* L) return 3 ; } +//---------------------------------------------------------------------------- +static int +LuaCurveIsACircle( lua_State* L) +{ + // 1 o 2 parametri : Id [, dToler] + int nId ; + LuaCheckParam( L, 1, nId) + double dToler = EPS_SMALL ; + LuaGetParam( L, 2, dToler) ; + LuaClearStack( L) ; + // verifico se curva è equivalente ad una circonferenza + Point3d ptCen ; + Vector3d vtN ; + double dRad ; + bool bCCW ; + bool bCircle = ExeCurveIsACircle( nId, ptCen, vtN, dRad, bCCW, dToler) ; + LuaSetParam( L, bCircle) ; + LuaSetParam( L, ptCen) ; + LuaSetParam( L, vtN) ; + LuaSetParam( L, dRad) ; + LuaSetParam( L, bCCW) ; + return 5 ; +} + //---------------------------------------------------------------------------- static int LuaCurveAreaXY( lua_State* L) @@ -369,6 +393,7 @@ LuaInstallGdbGetCurve( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtCurveLength", LuaCurveLength) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveIsClosed", LuaCurveIsClosed) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveIsFlat", LuaCurveIsFlat) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtCurveIsACircle", LuaCurveIsACircle) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveAreaXY", LuaCurveAreaXY) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveArea", LuaCurveArea) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveExtrusion", LuaCurveExtrusion) ;