diff --git a/EXE_GdbGetSurf.cpp b/EXE_GdbGetSurf.cpp index 5cda347..ac52675 100644 --- a/EXE_GdbGetSurf.cpp +++ b/EXE_GdbGetSurf.cpp @@ -21,6 +21,7 @@ #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" +#include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkCurveBezier.h" #include "/EgtDev/Include/EGkCurveComposite.h" @@ -1657,6 +1658,38 @@ ExeSurfBezierGetCurveV( int nSurfId, double dU, int nDestGrpId) return nNewId ; } +//---------------------------------------------------------------------------- +bool +ExeSurfBezParamsFromPoint( int nSurfId, const Point3d& ptOnSurf, int nDestGrpId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie di Bezier + const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; + if ( pSbz == nullptr) + return false ; + Point3d ptParam, ptBez ; + bool bOk = pSbz->UnprojectPoint( ptOnSurf, ptParam, P_INVALID) ; + Vector3d vtNorm, vtDerU, vtDerV ; + pSbz->GetPointNrmD1D2( ptParam.x, ptParam.y, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptBez, vtNorm, &vtDerU, &vtDerV) ; + if ( ! AreSamePointEpsilon( ptBez, ptOnSurf, 100 * EPS_SMALL)) + return false ; + PtrOwner vtGeoNorm( CreateGeoVector3d()) ; vtGeoNorm->Set( vtNorm, ptOnSurf) ; + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( vtGeoNorm)) ; + INTVECTOR vIds ; vIds.push_back( nId) ; + ExeSetColor( vIds, Color(255,0,0), false) ; + PtrOwner vtGeoDerU( CreateGeoVector3d()) ; vtGeoDerU->Set( vtDerU, ptOnSurf) ; + nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( vtGeoDerU)) ; + vIds.clear() ; vIds.push_back( nId) ; + ExeSetColor( vIds, Color(0,128,192), false) ; + PtrOwner vtGeoDerV( CreateGeoVector3d()) ; vtGeoDerV->Set( vtDerV, ptOnSurf) ; + nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( vtGeoDerV)) ; + vIds.clear() ; vIds.push_back( nId) ; + ExeSetColor( vIds, Color(255,128,0), false) ; + + return bOk ; +} + //---------------------------------------------------------------------------- bool ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, int& nSpanU, int& nSpanV, bool& bIsRat, bool& bTrimmed) diff --git a/LUA_GdbGetSurf.cpp b/LUA_GdbGetSurf.cpp index 9dd7459..7d3c78f 100644 --- a/LUA_GdbGetSurf.cpp +++ b/LUA_GdbGetSurf.cpp @@ -1140,6 +1140,25 @@ LuaSurfBezierGetCurveV( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaSurfBezParamsFromPoint( lua_State* L) +{ + // 3 parametri : nSurfId, ptOnSurf, nDestGrp + int nSurfId ; + LuaCheckParam( L, 1, nSurfId) + Point3d ptOnSurf ; + LuaCheckParam( L, 2, ptOnSurf) + int nDestGrp ; + LuaCheckParam( L, 3, nDestGrp) + LuaClearStack( L) ; + // recupero la curva + bool bOk = ExeSurfBezParamsFromPoint( nSurfId, ptOnSurf, nDestGrp) ; + LuaSetParam( L) ; + + return 1 ; +} + //---------------------------------------------------------------------------- static int LuaSurfBezierGetInfo( lua_State* L) @@ -1312,6 +1331,7 @@ LuaInstallGdbGetSurf( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetPointNrmD1", LuaSurfBezierGetPointNrmD1) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetCurveU", LuaSurfBezierGetCurveU) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetCurveV", LuaSurfBezierGetCurveV) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezParamsFromPoint", LuaSurfBezParamsFromPoint) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetInfo", LuaSurfBezierGetInfo) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetControlCurveU", LuaSurfBezierGetControlCurveU) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetControlCurveV", LuaSurfBezierGetControlCurveV) ;