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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user