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 8080921..9e204f5 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ 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) ;