diff --git a/EXE_GdbGetSurf.cpp b/EXE_GdbGetSurf.cpp index 463529d..3fc2408 100644 --- a/EXE_GdbGetSurf.cpp +++ b/EXE_GdbGetSurf.cpp @@ -1115,6 +1115,59 @@ ExeExtractSurfTmFacetLoops( int nId, int nFacet, int nDestGrpId, int* pnCount) return nFirstId ; } +//---------------------------------------------------------------------------- +int +ExeExtractSurfTmTriaLoop( int nId, int nT, int nDestGrpId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + if ( pStm == nullptr) + return GDB_ID_NULL ; + bool bOk = true ; + // recupero il riferimento della superficie + Frame3d frSurf ; + bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; + // recupero il riferimento di destinazione + Frame3d frDest ; + bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; + // recupero la normale del trinagolo (da usare come estrusione della curva) + Triangle3d tria ; pStm->GetTriangle(nT, tria) ; + Vector3d vtN = tria.GetN() ; + // creo il loop come poliline + PolyLine PL ; + for ( int i = 0 ; i < 3 ; ++i) + PL.AddUPoint( i, tria.GetP(i)) ; + PL.Close() ; + // dalla polilinea creo la curva e la inserisco nel DB + // creo la curva + PtrOwner pCrvCompo( CreateCurveComposite()) ; + bOk = bOk && pCrvCompo->FromPolyLine( PL) ; + // imposto estrusione + bOk = bOk && pCrvCompo->SetExtrusion( vtN) ; + // la porto nel riferimento destinazione + bOk = bOk && pCrvCompo->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCompo)) : GDB_ID_NULL) ; + bOk = bOk && ( nNewId != GDB_ID_NULL) ; + // copio il materiale + if ( ! pGeomDB->CopyMaterial( nId, nNewId)) + return GDB_ID_NULL ; + + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtExtractSurfTmTriaLoop(" + ToString( nId) + "," + + ToString( nT) + "," + + ToString( nDestGrpId) + ")" + + " -- Id=" + ToString( nNewId) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco il risultato + return nNewId ; +} + //------------------------------------------------------------------------------- int ExeCopySurfTmFacet( int nId, int nFacet, int nDestGrpId) diff --git a/LUA_GdbGetSurf.cpp b/LUA_GdbGetSurf.cpp index f78fb23..5bf326e 100644 --- a/LUA_GdbGetSurf.cpp +++ b/LUA_GdbGetSurf.cpp @@ -904,6 +904,28 @@ LuaExtractSurfTmFacetLoops( lua_State* L) return 2 ; } +//---------------------------------------------------------------------------- +static int +LuaExtractSurfTmTriaLoop( lua_State* L) +{ + // 3 parametri : nId, nT, nDestGrpId + int nId ; + LuaCheckParam( L, 1, nId) + int nT ; + LuaCheckParam( L, 2, nT) + int nDestGrpId ; + LuaCheckParam( L, 3, nDestGrpId) + LuaClearStack( L) ; + // recupero i contorni della superficie + int nNewId = ExeExtractSurfTmTriaLoop( nId, nT, nDestGrpId) ; + // restituisco il risultato + if ( nNewId != GDB_ID_NULL) + LuaSetParam( L, nNewId) ; + else + LuaSetParam( L) ; + return 2 ; +} + //---------------------------------------------------------------------------- static int LuaCopySurfTmFacet( lua_State* L) @@ -1255,6 +1277,7 @@ LuaInstallGdbGetSurf( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtGetSurfTmSilhouette", LuaGetSurfTmSilhouette) ; bOk = bOk && luaMgr.RegisterFunction( "EgtGetSurfTmParSilhouettes", LuaGetSurfTmParSilhouettes) ; bOk = bOk && luaMgr.RegisterFunction( "EgtExtractSurfTmFacetLoops", LuaExtractSurfTmFacetLoops) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtExtractSurfTmTriaLoop", LuaExtractSurfTmTriaLoop) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCopySurfTmFacet", LuaCopySurfTmFacet) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmGetEdges", LuaSurfTmGetEdges) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetPoint", LuaSurfBezierGetPoint) ;