EgtExecutor 2.7l2 :

- Modificate le funzioni di Offset per superfici TriMesh aperte
- Aggiunta la funzione per la creazione di Shell per TriMesh.
This commit is contained in:
Riccardo Elitropi
2025-12-15 11:32:21 +01:00
parent ea4cc8a368
commit 740d3817de
4 changed files with 125 additions and 1 deletions
+100
View File
@@ -1832,6 +1832,106 @@ ExeCreateSurfTmByVolZmap( int nParentId, int nZmapId, int nPart)
return nNewId ;
}
//----------------------------------------------------------------------------
static double
GetStmOffsPrec( double dOffs, double dLinTol)
{
return max( min( abs( dOffs) / 4., 10. * max( dLinTol, EPS_SMALL)), 0.5) ;
}
//-------------------------------------------------------------------------------
int
ExeCreateSurfShell( int nParentId, int nSurfId, double dThick, double dLinTol)
{
// Verifica del DB geometrico
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
nParentId = AdjustId( nParentId) ;
// Sistemo lo spessore ( diretto in direzione opposta alla normale della superficie) e ala tolleranza lineare
bool bOk = ( abs( dThick) > 10. * EPS_SMALL) ;
double dOffs = ( - abs( dThick)) ;
double dMyLinTol = max( EPS_SMALL, dLinTol) ;
// Recupero la superficie
const ISurf* pSurf = GetSurf( pGeomDB->GetGeoObj( nSurfId)) ;
bOk = bOk && ( pSurf != nullptr && pSurf->IsValid()) ;
// Recupero il riferimento del gruppo di destinazione
Frame3d frDest ;
bOk = bOk && ( pGeomDB->GetGroupGlobFrame( nParentId, frDest)) ;
// Definisco la TriMesh risultate
PtrOwner<ISurfTriMesh> pStmRes( CreateSurfTriMesh()) ;
bOk = bOk && ( ! IsNull( pStmRes)) ;
// Definisco la Shell in base al tipo di superficie
if ( bOk) {
switch ( pSurf->GetType()) {
case SRF_TRIMESH : {
// Recupero la superficie TriMesh ( deve essere aperta)
const ISurfTriMesh* pStm = GetSurfTriMesh( pSurf) ;
bOk = ( pStm != nullptr && pStm->IsValid() && ! pStm->IsClosed()) ;
if ( bOk) {
double dPrec = GetStmOffsPrec( dOffs, dMyLinTol) ;
bOk = ( pStmRes.Set( CreateSurfTriMeshShell( pStm, dOffs, dPrec))) ;
bOk = bOk && ( ! IsNull( pStmRes) && pStmRes->IsValid()) ;
}
}
break ;
case SRF_BEZIER : {
// Recupero la superficie di Bezier
const ISurfBezier* pSBz = GetSurfBezier( pSurf) ;
bOk = ( pSBz != nullptr && pSBz->IsValid()) ;
// TODO :
bOk = false ; // <---
}
break ;
case SRF_FLATRGN : {
// Recupero la superficie piana
const ISurfFlatRegion* pSfr = GetSurfFlatRegion( pSurf) ;
bOk = ( pSfr != nullptr && pSfr->IsValid()) ;
// Definisco la superficie di estrusione dai Loops della regione piana
CICURVEPVECTOR vLoops ;
for ( int nChunk = 0 ; bOk && nChunk < pSfr->GetChunkCount() ; ++ nChunk) {
for ( int nLoop = 0 ; bOk && nLoop < pSfr->GetLoopCount( nChunk) ; ++ nLoop)
bOk = ( vLoops.emplace_back( pSfr->GetLoop( nChunk, nLoop)) && vLoops.back()->IsValid()) ;
}
bOk = bOk && pStmRes.Set( GetSurfTriMeshByRegionExtrusion( vLoops, - dOffs * pSfr->GetNormVersor(), dMyLinTol)) ;
}
default :
bOk = false ;
break ;
}
}
// Verifico che la superficie risultante sia valida
bOk = bOk && ( ! IsNull( pStmRes) && pStmRes->IsValid()) ;
// Porto la superficie risultante nel frame di destinazione
bOk = bOk && ( pStmRes->ToLoc( frDest)) ;
// Inserisco la superficie trimesh nel DB
int nNewId = GDB_ID_NULL ;
if ( bOk) {
nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pStmRes)) ;
bOk = ( nNewId != GDB_ID_NULL) ;
}
ExeSetModified() ;
// se richiesto, salvo il comando Lua equivalente
if ( IsCmdLog()) {
string sLua = "EgtSurfTmShell(" + IdToString( nParentId) + "," +
IdToString( nSurfId) + "," +
ToString( dThick) + "," +
ToString( dLinTol) + ")" +
" -- Id=" + ToString( nNewId) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
// restituisco il risultato
return nNewId ;
}
//-------------------------------------------------------------------------------
int
ExeCreateSurfBezier( int nParentId, int nDegU, int nDegV, int nSpanU, int nSpanV, const PNTVECTOR& vPnt, int nRefType)