From 55898a7ac9f47214cc13c12009356522bd5c00e1 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 27 Apr 2015 08:27:14 +0000 Subject: [PATCH] EgtInterface 1.6d5 : - aggiunta EgtApproxCurveArc - trasformata EgtExplodeCurveBezier in EgtApproxCurvebezier - aggiunta EgtExplodeSurfTm. --- API_GdbModifyCurve.cpp | 73 +++++++++++++++++++++++++++-------------- API_GdbModifySurf.cpp | 45 +++++++++++++++++++++++++ EgtInterface.rc | Bin 11718 -> 11718 bytes LUA_GdbModifyCurve.cpp | 28 +++++++++++++--- LUA_GdbModifySurf.cpp | 20 +++++++++++ 5 files changed, 137 insertions(+), 29 deletions(-) diff --git a/API_GdbModifyCurve.cpp b/API_GdbModifyCurve.cpp index e2602c0..99c7644 100644 --- a/API_GdbModifyCurve.cpp +++ b/API_GdbModifyCurve.cpp @@ -737,11 +737,9 @@ __stdcall EgtExplodeCurveCompo( int nId, int* pnCount) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - bool bOk = true ; // recupero la curva composita ICurveComposite* pCompo = GetCurveComposite( pGeomDB->GetGeoObj( nId)) ; - if ( pCompo == nullptr) - bOk = false ; + bool bOk = ( pCompo != nullptr) ; // estraggo tutte le curve int nFirstId = GDB_ID_NULL ; int nCount = 0 ; @@ -777,34 +775,59 @@ __stdcall EgtExplodeCurveCompo( int nId, int* pnCount) //------------------------------------------------------------------------------- int -__stdcall EgtExplodeCurveBezier( int nId, BOOL bArcsVsLines, double dLinTol) +__stdcall EgtApproxCurveArc( int nId, double dLinTol) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero l'arco + ICurveArc* pArc = GetCurveArc( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pArc != nullptr) ; + // eseguo l'approssimazione con segmenti di linea + const double ANG_TOL_STD_DEG = 15 ; + PtrOwner pCC( CreateCurveComposite()) ; + bOk = bOk && ! IsNull( pCC) ; + PolyLine PL ; + bOk = bOk && pArc->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL) && pCC->FromPolyLine( PL) ; + // inserisco la curva composita nello stesso posto del GeomDB + int nCrvId = ( bOk ? pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pCC)) : GDB_ID_NULL) ; + bOk = bOk && ( nCrvId != GDB_ID_NULL) ; + // copio gli attributi + bOk = bOk && pGeomDB->CopyAttributes( nId, nCrvId) ; + // elimino l'arco + bOk = bOk && pGeomDB->Erase( nId) ; + EgtSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtApproxCurveArc(" + ToString( nId) + "," + + ToString( dLinTol) + ")" + + " -- Id=" + ToString( nCrvId) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultato + return nCrvId ; +} + +//------------------------------------------------------------------------------- +int +__stdcall EgtApproxCurveBezier( int nId, BOOL bArcsVsLines, double dLinTol) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - bool bOk = true ; // recupero la curva di Bezier ICurveBezier* pCBezier = GetCurveBezier( pGeomDB->GetGeoObj( nId)) ; - if ( pCBezier == nullptr) - bOk = false ; + bool bOk = ( pCBezier != nullptr) ; // eseguo l'approssimazione const double ANG_TOL_STD_DEG = 15 ; PtrOwner pCC( CreateCurveComposite()) ; - if ( ! IsNull( pCC)) { - if ( bArcsVsLines) { // con bi-archi - PolyArc PA ; - if ( ! pCBezier->ApproxWithArcs( dLinTol, ANG_TOL_STD_DEG, PA) || - ! pCC->FromPolyArc( PA)) - bOk = false ; - } - else { // con linee - PolyLine PL ; - if ( ! pCBezier->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL) || - ! pCC->FromPolyLine( PL)) - bOk = false ; - } + bOk = bOk && ! IsNull( pCC) ; + if ( bArcsVsLines) { // con bi-archi + PolyArc PA ; + bOk = bOk && pCBezier->ApproxWithArcs( dLinTol, ANG_TOL_STD_DEG, PA) && pCC->FromPolyArc( PA) ; + } + else { // con linee + PolyLine PL ; + bOk = bOk && pCBezier->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL) && pCC->FromPolyLine( PL) ; } - else - bOk = false ; // inserisco la curva composita nello stesso posto del GeomDB int nCrvId = ( bOk ? pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, Release( pCC)) : GDB_ID_NULL) ; bOk = bOk && ( nCrvId != GDB_ID_NULL) ; @@ -815,9 +838,9 @@ __stdcall EgtExplodeCurveBezier( int nId, BOOL bArcsVsLines, double dLinTol) EgtSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { - string sLua = "EgtExplodeCurveBezier(" + ToString( nId) + "," + - ( bArcsVsLines ? "GDB_CA.ARCS" : "GDB_CA.LINES") + "," + - ToString( dLinTol) + ")" + + string sLua = "EgtApproxCurveBezier(" + ToString( nId) + "," + + ( bArcsVsLines ? "GDB_CA.ARCS" : "GDB_CA.LINES") + "," + + ToString( dLinTol) + ")" + " -- Id=" + ToString( nCrvId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } diff --git a/API_GdbModifySurf.cpp b/API_GdbModifySurf.cpp index 24b588e..1e51cef 100644 --- a/API_GdbModifySurf.cpp +++ b/API_GdbModifySurf.cpp @@ -114,3 +114,48 @@ __stdcall EgtExtractSurfTmFacetLoops( int nId, int nFacet, int nDestGrpId, int* *pnCount = nCount ; return nFirstId ; } + +//------------------------------------------------------------------------------- +int +__stdcall EgtExplodeSurfTm( int nId, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pStm != nullptr) ; + // copio tutte le facce + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + int nFacet = pStm->GetFacetNum() ; + for ( int i = 0 ; i < nFacet ; ++ i) { + ISurfTriMesh* pFac = pStm->CloneFacet( i) ; + if ( pFac == nullptr) + continue ; + // inserisco la superficie nello stesso gruppo e nello stesso posto del GeomDB + int nFacId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, pFac) ; + bOk = bOk && ( nFacId != GDB_ID_NULL) ; + // copio gli attributi + bOk = bOk && pGeomDB->CopyAttributes( nId, nFacId) ; + // aggiorno contatori + if ( bOk) { + if ( nFirstId == GDB_ID_NULL) + nFirstId = nFacId ; + ++ nCount ; + } + } + nFirstId = ( bOk ? nFirstId : GDB_ID_NULL) ; + // elimino la superficie + bOk = bOk && pGeomDB->Erase( nId) ; + EgtSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtExplodeSurfTm(" + ToString( nId) + ")" + + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} diff --git a/EgtInterface.rc b/EgtInterface.rc index f7c498113fdfeed3d8570aaae3e2c3cd6f17da0b..56b0432dcf716c4a109905561af1f06f785c6279 100644 GIT binary patch delta 111 zcmX>WeJpyzFE&Qg%^&$rGEF|hS;uHP`Jtfh<^rw;7OzIAO+TQQ4Xt~E@c}o08AGs#sB~S delta 111 zcmX>WeJpyzFE&P#%^&$rGEF|hS;uHH`Jtfh<^rw;7OzIAO+TQQ4Xt~E@c}o07@$;z5oCK diff --git a/LUA_GdbModifyCurve.cpp b/LUA_GdbModifyCurve.cpp index 4c40d45..3f2becf 100644 --- a/LUA_GdbModifyCurve.cpp +++ b/LUA_GdbModifyCurve.cpp @@ -326,7 +326,26 @@ LuaExplodeCurveCompo( lua_State* L) //------------------------------------------------------------------------------- static int -LuaExplodeCurveBezier( lua_State* L) +LuaApproxCurveArc( lua_State* L) +{ + // 1 o 2 parametri : Id [, dLinTol] + int nId ; + LuaCheckParam( L, 1, nId) + double dLinTol = 0.01 ; + LuaGetParam( L, 2, dLinTol) ; + LuaClearStack( L) ; + // approssimazione dell'arco con rette + int nNewId = EgtApproxCurveArc( nId, dLinTol) ; + if ( nNewId != GDB_ID_NULL) + LuaSetReturn( L, nNewId) ; + else + LuaSetReturn( L) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaApproxCurveBezier( lua_State* L) { // 2 o 3 parametri : Id, nArcsVsLines [, dLinTol] int nId ; @@ -337,8 +356,8 @@ LuaExplodeCurveBezier( lua_State* L) double dLinTol = 0.01 ; LuaGetParam( L, 3, dLinTol) ; LuaClearStack( L) ; - // esplosione della curva composita - int nNewId = EgtExplodeCurveBezier( nId, bArcsVsLines, dLinTol) ; + // approssimazione della curva di Bezier con archi o rette + int nNewId = EgtApproxCurveBezier( nId, bArcsVsLines, dLinTol) ; if ( nNewId != GDB_ID_NULL) LuaSetReturn( L, nNewId) ; else @@ -368,6 +387,7 @@ LuaInstallGdbModifyCurve( void) bOk = bOk && LuaRegisterFunction( "EgtSplitCurveAtPoint", LuaSplitCurveAtPoint) ; bOk = bOk && LuaRegisterFunction( "EgtModifyCurveArcRadius", LuaModifyCurveArcRadius) ; bOk = bOk && LuaRegisterFunction( "EgtExplodeCurveCompo", LuaExplodeCurveCompo) ; - bOk = bOk && LuaRegisterFunction( "EgtExplodeCurveBezier", LuaExplodeCurveBezier) ; + bOk = bOk && LuaRegisterFunction( "EgtApproxCurveArc", LuaApproxCurveArc) ; + bOk = bOk && LuaRegisterFunction( "EgtApproxCurveBezier", LuaApproxCurveBezier) ; return bOk ; } diff --git a/LUA_GdbModifySurf.cpp b/LUA_GdbModifySurf.cpp index 27072eb..391ccd0 100644 --- a/LUA_GdbModifySurf.cpp +++ b/LUA_GdbModifySurf.cpp @@ -63,6 +63,25 @@ LuaExtractSurfTmFacetLoops( lua_State* L) return 2 ; } +//------------------------------------------------------------------------------- +static int +LuaExplodeSurfTm( lua_State* L) +{ + // 1 parametro : Id + int nId ; + LuaCheckParam( L, 1, nId) + LuaClearStack( L) ; + // esplosione della superficie trimesh + int nCount ; + int nFirstId = EgtExplodeSurfTm( nId, &nCount) ; + if ( nFirstId != GDB_ID_NULL) + LuaSetReturn( L, nFirstId) ; + else + LuaSetReturn( L) ; + LuaSetReturn( L, nCount) ; + return 2 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbModifySurf( void) @@ -70,5 +89,6 @@ LuaInstallGdbModifySurf( void) bool bOk = true ; bOk = bOk && LuaRegisterFunction( "EgtInvertSurf", LuaInvertSurf) ; bOk = bOk && LuaRegisterFunction( "EgtExtractSurfTmFacetLoops", LuaExtractSurfTmFacetLoops) ; + bOk = bOk && LuaRegisterFunction( "EgtExplodeSurfTm", LuaExplodeSurfTm) ; return bOk ; }