//---------------------------------------------------------------------------- // EgalTech 2015-2015 //---------------------------------------------------------------------------- // File : EXE_ModifySurf.cpp Data : 04.05.15 Versione : 1.6e1 // Contenuto : Funzioni di modifica delle superfici per EXE. // // // // Modifiche : 09.03.15 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "EXE.h" #include "EXE_Macro.h" #include "AuxTools.h" #include "GeoTools.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EgkCurveComposite.h" #include "/EgtDev/Include/EgkSurfTriMesh.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EgtPointerOwner.h" using namespace std ; //---------------------------------------------------------------------------- bool ExeInvertSurface( const INTVECTOR& vIds) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // eseguo inversione bool bOk = true ; for ( size_t i = 0 ; i < vIds.size() && bOk ; ++ i) { int nId = (( vIds[i] != GDB_ID_SEL) ? vIds[i] : pGeomDB->GetFirstSelectedObj()) ; while ( nId != GDB_ID_NULL && bOk) { // recupero la superficie e la inverto ISurf* pSurf = GetSurf( pGeomDB->GetGeoObj( nId)) ; if ( pSurf != nullptr && ! pSurf->Invert()) bOk = false ; // passo alla successiva nId = (( vIds[i] != GDB_ID_SEL) ? GDB_ID_NULL : pGeomDB->GetNextSelectedObj()) ; } } ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtInvertSurf({" + IdListToString( vIds) + "})" + " -- Ok=" + ToString( bOk) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return bOk ; } //---------------------------------------------------------------------------- int ExeExtractSurfTmFacetLoops( int nId, int nFacet, int nDestGrpId, 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) ; // 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 i loop come polilinee POLYLINEVECTOR vPL ; bOk = bOk && pStm->GetFacetLoops( nFacet, vPL) ; // dalle polilinee creo le curve e le inserisco nel DB int nFirstId = GDB_ID_NULL ; int nCount = 0 ; for ( size_t i = 0 ; i < vPL.size() ; ++ i) { // creo la curva PtrOwner pCrvCompo( CreateCurveComposite()) ; bOk = bOk && pCrvCompo->FromPolyLine( vPL[i]) ; // 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) ; if ( bOk && nFirstId == GDB_ID_NULL) nFirstId = nNewId ; if ( bOk) ++ nCount ; } ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtExtractSurfTmFacetLoops(" + ToString( nId) + ",{" + ToString( nFacet) + "," + ToString( nDestGrpId) + ")" + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultati if ( pnCount != nullptr) *pnCount = nCount ; return nFirstId ; } //------------------------------------------------------------------------------- int ExeExplodeSurfTm( 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 = ( bOk ? pStm->GetFacetNum() : 0) ; 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) ; ExeSetModified() ; // 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 ; }