Files
EgtGeomKernel/SurfFlatRegionOffset.cpp
T
Dario Sassi ba71993098 EgtGeomKernel 1.6k1 :
- aggiunto offset di regioni
- migliorato offset di curve
- migliorata creazione di regioni.
2015-11-03 21:24:31 +00:00

98 lines
3.4 KiB
C++

//----------------------------------------------------------------------------
// 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 ;
}