EgtGeomKernel 1.6k1 :
- aggiunto offset di regioni - migliorato offset di curve - migliorata creazione di regioni.
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : SurfFlatRegionOffset.cpp Data : 01.11.15 Versione : 1.6k1
|
||||
// Contenuto : Implementazione della funzione offset per SurfFlatRegion.
|
||||
//
|
||||
//
|
||||
//
|
||||
// Modifiche : 01.11.15 DS Creazione modulo.
|
||||
//
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
//--------------------------- Include ----------------------------------------
|
||||
#include "stdafx.h"
|
||||
#include "SurfFlatRegion.h"
|
||||
#include "/EgtDev/Include/EgkOffsetCurve.h"
|
||||
#include "/EgtDev/Include/EgtPointerOwner.h"
|
||||
|
||||
using namespace std ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfFlatRegion::Offset( double dDist, int nType)
|
||||
{
|
||||
// recupero il numero dei chunk
|
||||
int nChunk = GetChunkCount() ;
|
||||
if ( nChunk == 0)
|
||||
return false ;
|
||||
// creo una nuova regione
|
||||
PtrOwner<SurfFlatRegion> pSfr( new SurfFlatRegion) ;
|
||||
if ( IsNull( pSfr))
|
||||
return false ;
|
||||
// ciclo sui chunk
|
||||
bool bFirstCurve = true ;
|
||||
for ( int i = 0 ; i < nChunk ; ++ i) {
|
||||
// ciclo sui loop di ogni chunk
|
||||
int nLoop = GetLoopCount( i) ;
|
||||
for ( int j = 0 ; j < nLoop ; ++ j) {
|
||||
// recupero il loop
|
||||
ICurve* pLoop = GetMyLoop( i, j) ;
|
||||
if ( pLoop == nullptr)
|
||||
return false ;
|
||||
// ne eseguo l'offset
|
||||
OffsetCurve OffsCrv ;
|
||||
bool bOk = OffsCrv.Make( pLoop, dDist, nType) ;
|
||||
// recupero le curve di offset
|
||||
PtrOwner<ICurve> pOffs( OffsCrv.GetCurve()) ;
|
||||
while ( bOk && ! IsNull( pOffs)) {
|
||||
// se prima curva esterna in assoluto, è il primo contorno esterno della nuova regione
|
||||
if ( bFirstCurve && j == 0) {
|
||||
if ( ! pSfr->AddExtLoop( Release( pOffs)))
|
||||
return false ;
|
||||
bFirstCurve = false ;
|
||||
}
|
||||
// altrimenti aggiungo o sottraggo la regione della curva alla nuova regione
|
||||
else if ( ! bFirstCurve) {
|
||||
// se loop interno, inverto la curva
|
||||
if ( j != 0)
|
||||
pOffs->Invert() ;
|
||||
// creo la regione
|
||||
PtrOwner<SurfFlatRegion> pSfr2( new SurfFlatRegion) ;
|
||||
if ( IsNull( pSfr2) || ! pSfr2->AddExtLoop( Release( pOffs)))
|
||||
return false ;
|
||||
// se era loop esterno, lo aggiungo alla nuova regione
|
||||
if ( j == 0) {
|
||||
if ( ! pSfr->Add( *Get( pSfr2)))
|
||||
return false ;
|
||||
}
|
||||
// altrimenti loop interno, lo sottraggo alla nuova regione
|
||||
else {
|
||||
if ( ! pSfr->Subtract( *Get( pSfr2)))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
// passo alla successiva
|
||||
pOffs.Set( OffsCrv.GetCurve()) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// pulisco la superficie corrente
|
||||
for ( auto& pLoop : m_vpLoop)
|
||||
delete pLoop ;
|
||||
m_vpLoop.clear() ;
|
||||
|
||||
// sposto i dati della nuova superficie in quella corrente
|
||||
m_vExtInd = pSfr->m_vExtInd ;
|
||||
m_vpLoop = pSfr->m_vpLoop ;
|
||||
for ( auto& pLoop : pSfr->m_vpLoop)
|
||||
pLoop = nullptr ;
|
||||
m_nStatus = pSfr->m_nStatus ;
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
ResetAuxSurf() ;
|
||||
m_OGrMgr.Reset() ;
|
||||
return true ;
|
||||
}
|
||||
Reference in New Issue
Block a user