From ea83cb985deb93ddd4b438055521a7633ee9f061 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 26 Aug 2024 16:52:12 +0200 Subject: [PATCH] =?UTF-8?q?EgtExecutor=20:=20-=20aggiunte=20funzioni=20per?= =?UTF-8?q?=20l'approssimaizone=20di=20curve=20di=20bezier=20-=20aggiunta?= =?UTF-8?q?=20la=20possibilit=C3=A0=20di=20scegliere=20il=20grado=20nella?= =?UTF-8?q?=20conversione=20da=20curva=20generica=20a=20curva=20di=20bezie?= =?UTF-8?q?r.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EXE_GdbCreateCurve.cpp | 5 +- EXE_GdbCreateSurf.cpp | 2 +- EXE_GdbGetCurve.cpp | 2 +- EXE_GdbModifyCurve.cpp | 181 +++++++++++++++++++++++++++++++++++++++++ LUA_GdbCreateCurve.cpp | 7 +- LUA_GdbModifyCurve.cpp | 36 ++++++++ 6 files changed, 226 insertions(+), 7 deletions(-) diff --git a/EXE_GdbCreateCurve.cpp b/EXE_GdbCreateCurve.cpp index 2bf5b42..1f68fd7 100644 --- a/EXE_GdbCreateCurve.cpp +++ b/EXE_GdbCreateCurve.cpp @@ -2637,7 +2637,7 @@ MyCreateCurveBezierForm( int nParentId, int nCrvId) //------------------------------------------------------------------------------- int -ExeCreateCurveBezierForm( int nParentId, int nCrvId) +ExeCreateCurveBezierForm( int nParentId, int nCrvId, int nDeg) { // eseguo int nId = MyCreateCurveBezierForm( nParentId, nCrvId) ; @@ -2645,7 +2645,8 @@ ExeCreateCurveBezierForm( int nParentId, int nCrvId) // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCurveBezierForm(" + IdToString( nParentId) + "," + - IdToString( nCrvId) + "," + + IdToString( nCrvId) + "," + + ToString( nDeg) + ")" " -- Id=" + ToString( nId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } diff --git a/EXE_GdbCreateSurf.cpp b/EXE_GdbCreateSurf.cpp index 37cc691..18179ca 100644 --- a/EXE_GdbCreateSurf.cpp +++ b/EXE_GdbCreateSurf.cpp @@ -1,4 +1,4 @@ -//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- // EgalTech 2014-2015 //---------------------------------------------------------------------------- // File : EXE_GdbCreateSurf.cpp Data : 04.05.15 Versione : 1.6e1 diff --git a/EXE_GdbGetCurve.cpp b/EXE_GdbGetCurve.cpp index 68c9674..b332f65 100644 --- a/EXE_GdbGetCurve.cpp +++ b/EXE_GdbGetCurve.cpp @@ -745,7 +745,7 @@ ExeShowCurveBezierControlPoints( int nCrvId, int nDestGrpId, int* pnCount) VERIFY_GEOMDB( pGeomDB, false) // recupero la curva di bezier IGeoObj* pGeoObj = pGeomDB->GetGeoObj( nCrvId) ; - if ( pGeoObj->GetType() != CRV_BEZIER) + if ( pGeoObj->GetType() != CRV_BEZIER && pGeoObj->GetType() != CRV_COMPO) return GDB_ID_NULL ; // recupero il riferimento della curva Frame3d frCrv ; diff --git a/EXE_GdbModifyCurve.cpp b/EXE_GdbModifyCurve.cpp index 39bd86b..379c330 100644 --- a/EXE_GdbModifyCurve.cpp +++ b/EXE_GdbModifyCurve.cpp @@ -2990,5 +2990,186 @@ ExeCurveBezierDecreaseDegree( int nCrvId, double dTol) LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +ExeCurveBezierApproxToNonRat( int nCrvId, double dTol) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la curva + const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nCrvId)) ; + if ( pCrv == nullptr) + return false ; + //// recupero il riferimento della curva + //Frame3d frCrv ; + //if ( ! pGeomDB->GetGlobFrame( nCrvId, frCrv)) + // return GDB_ID_NULL ; + + // controllo che il tipo sia giusto + if( pCrv->GetType() != CRV_BEZIER) { + if( pCrv->GetType() != CRV_COMPO) + return false ; + else { + const ICurveComposite* pCC = GetCurveComposite( pCrv) ; + for ( int i = 0 ; i < pCC->GetCurveCount() ; ++i) { + const ICurve* pSubCrv = pCC->GetCurve( i) ; + if( pSubCrv->GetType() != CRV_BEZIER) + return false ; + } + } + } + bool bOk = true ; + if( pCrv->GetType() == CRV_BEZIER) { + const ICurveBezier* pCrvBez = GetCurveBezier( pCrv) ; + if( ! pCrvBez->IsRational()) + return true ; + + // approssimo la curva con una corrispettiva non razionale + PtrOwner pCrvBezierNew ( pCrvBez->Clone()) ; + bOk = bOk && pCrvBezierNew->MakeNonRational( dTol) ; + PtrOwner pCrvNew ; + if ( ! bOk) { + pCrvNew.Set( ApproxBezierWithCubics( pCrvBezierNew, dTol)) ; + bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ; + } + else + pCrvNew.Set( Release( pCrvBezierNew)) ; + bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ; + Vector3d vtExtr ; + if ( bOk && pCrv->GetExtrusion( vtExtr)) + pCrvNew->SetExtrusion( vtExtr) ; + double dThick = 0 ; + if ( bOk && pCrv->GetThickness( dThick)) + pCrvNew->SetThickness(dThick) ; + // sostituisco la vecchia curva con la nuova + bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCrvNew)) ; + } + else { + const ICurveComposite* pCC = GetCurveComposite( pCrv) ; + PtrOwner pCCNew( CreateCurveComposite()) ; + for( int i = 0 ; i < pCC->GetCurveCount() ; ++i) { + const ICurveBezier* pCrvBez = GetCurveBezier( pCC->GetCurve( i)) ; + if( ! pCrvBez->IsRational()) { + continue ; + } + + // approssimo la curva con una corrispettiva non razionale + PtrOwner pCrvBezierNew ( pCrvBez->Clone()) ; + bOk = bOk && pCrvBezierNew->MakeNonRational( dTol) ; + PtrOwner pCrvNew ; + if ( ! bOk) { + pCrvNew.Set( ApproxBezierWithCubics( pCrvBezierNew, dTol)) ; + bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ; + } + else + pCrvNew.Set( Release( pCrvBezierNew)) ; + bOk = bOk && ! IsNull( pCrvNew) && pCrvNew->IsValid() ; + Vector3d vtExtr ; + if ( bOk && pCrv->GetExtrusion( vtExtr)) + pCrvNew->SetExtrusion( vtExtr) ; + double dThick = 0 ; + if ( bOk && pCrv->GetThickness( dThick)) + pCrvNew->SetThickness(dThick) ; + if( bOk) + pCCNew->AddCurve( Release(pCrvNew)) ; + else + break ; + } + // sostituisco la vecchia curva con la nuova + bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCCNew)) ; + } + ExeSetModified() ; + + if ( IsCmdLog()) { + string sLua = "EgtCurveBezierApproxToNonRat(" + ToString( nCrvId) + ", " + + ToString( dTol) + ")" + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +ExeCurveBezierApproxWithCubicBeziers( int nCrvId, double dTol) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la curva + const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nCrvId)) ; + if ( pCrv == nullptr) + return false ; + + // controllo che il tipo sia giusto + if( pCrv->GetType() != CRV_BEZIER) { + if( pCrv->GetType() != CRV_COMPO) + return false ; + else { + const ICurveComposite* pCC = GetCurveComposite( pCrv) ; + for ( int i = 0 ; i < pCC->GetCurveCount() ; ++i) { + const ICurve* pSubCrv = pCC->GetCurve( i) ; + if( pSubCrv->GetType() != CRV_BEZIER) + return false ; + } + } + } + + // converto in bezier cubiche + bool bOk = true ; + if( pCrv->GetType() == CRV_BEZIER) { + const ICurveBezier* pCrvBez = GetCurveBezier( pCrv) ; + + // approssimo la curva con una serie di bezier + PtrOwner pCrvBezierNew ( ApproxBezierWithCubics( pCrvBez, dTol)) ; + bOk = bOk && ! IsNull( pCrvBezierNew) && pCrvBezierNew->IsValid() ; + Vector3d vtExtr ; + if ( bOk && pCrv->GetExtrusion( vtExtr)) + pCrvBezierNew->SetExtrusion( vtExtr) ; + double dThick = 0 ; + if ( bOk && pCrv->GetThickness( dThick)) + pCrvBezierNew->SetThickness(dThick) ; + // sostituisco la vecchia curva con la nuova + bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCrvBezierNew)) ; + } + else { + const ICurveComposite* pCC = GetCurveComposite( pCrv) ; + PtrOwner pCCNew( CreateCurveComposite()) ; + for( int i = 0 ; i < pCC->GetCurveCount() ; ++i) { + const ICurveBezier* pCrvBez = GetCurveBezier( pCC->GetCurve( i)) ; + if( ! pCrvBez->IsRational()) { + continue ; + } + + // approssimo la curva con una serie di bezier + PtrOwner pCrvBezierNew ( ApproxBezierWithCubics( pCrvBez, dTol)) ; + bOk = bOk && ! IsNull( pCrvBezierNew) && pCrvBezierNew->IsValid() ; + Vector3d vtExtr ; + if ( bOk && pCrv->GetExtrusion( vtExtr)) + pCrvBezierNew->SetExtrusion( vtExtr) ; + double dThick = 0 ; + if ( bOk && pCrv->GetThickness( dThick)) + pCrvBezierNew->SetThickness(dThick) ; + if( bOk) + pCCNew->AddCurve( Release(pCrvBezierNew)) ; + else + break ; + } + // sostituisco la vecchia curva con la nuova + bOk = bOk && pGeomDB->ReplaceGeoObj( nCrvId, Release( pCCNew)) ; + } + + ExeSetModified() ; + + if ( IsCmdLog()) { + string sLua = "EgtCurveBezierApproxWithCubicBeziers(" + ToString( nCrvId) + ", " + + ToString( dTol) + ")" + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; } \ No newline at end of file diff --git a/LUA_GdbCreateCurve.cpp b/LUA_GdbCreateCurve.cpp index 856098a..1e60182 100644 --- a/LUA_GdbCreateCurve.cpp +++ b/LUA_GdbCreateCurve.cpp @@ -1095,14 +1095,15 @@ LuaCreateCirclesAlongCurve( lua_State* L) static int LuaCreateCurveBezierForm( lua_State* L) { - // 2 parametri : ParentId, nCrvId + // 2 o 3 parametri : ParentId, nCrvId [, nDeg] int nParentId ; LuaCheckParam( L, 1, nParentId) int nCrvId ; LuaCheckParam( L, 2, nCrvId) - + int nDeg = 3 ; + LuaGetParam( L, 3, nDeg) ; // creo la versione bezier della curva - int nId = ExeCreateCurveBezierForm( nParentId, nCrvId) ; + int nId = ExeCreateCurveBezierForm( nParentId, nCrvId, nDeg) ; // restituisco il risultato if ( nId != GDB_ID_NULL) LuaSetParam( L, nId) ; diff --git a/LUA_GdbModifyCurve.cpp b/LUA_GdbModifyCurve.cpp index 4c24935..04d5224 100644 --- a/LUA_GdbModifyCurve.cpp +++ b/LUA_GdbModifyCurve.cpp @@ -1195,6 +1195,40 @@ LuaCurveBezierDecreaseDegree( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaCurveBezierApproxToNonRat( lua_State* L) +{ + // 1 o 2 parametri : CrvId [, dTol] + int nId ; + LuaCheckParam( L, 1, nId) + double dTol = 10 * EPS_SMALL ; + LuaGetParam( L, 2, dTol) ; + LuaClearStack( L) ; + // eseguo + bool bOk = ExeCurveBezierApproxToNonRat( nId, dTol) ; + LuaSetParam( L, bOk) ; + + return 1 ; +} + +//---------------------------------------------------------------------------- +static int +LuaCurveBezierApproxWithCubicBeziers( lua_State* L) +{ + // 1 o 2 parametri : CrvId [, dTol] + int nId ; + LuaCheckParam( L, 1, nId) + double dTol = 10 * EPS_SMALL ; + LuaGetParam( L, 2, dTol) ; + LuaClearStack( L) ; + // eseguo + bool bOk = ExeCurveBezierApproxWithCubicBeziers( nId, dTol) ; + LuaSetParam( L, bOk) ; + + return 1 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbModifyCurve( LuaMgr& luaMgr) @@ -1261,5 +1295,7 @@ LuaInstallGdbModifyCurve( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtProjectCurveOnSurfBzExt", LuaProjectCurveOnSurfBzExt) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveBezierIncreaseDeg", LuaCurveBezierIncreaseDegree) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveBezierDecreaseDeg", LuaCurveBezierDecreaseDegree) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtCurveBezierApproxToNonRat", LuaCurveBezierApproxToNonRat) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtApproxBezierWithCubics", LuaCurveBezierApproxWithCubicBeziers) ; return bOk ; }