diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 920a9e1..8304a11 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/SurfFlatRegion.cpp b/SurfFlatRegion.cpp index 16d6be9..6a67476 100644 --- a/SurfFlatRegion.cpp +++ b/SurfFlatRegion.cpp @@ -527,8 +527,15 @@ SurfFlatRegion::GetLocalBBox( BBox3d& b3Loc, int nFlag) const // verifico lo stato if ( m_nStatus != OK || m_vpLoop.empty()) return false ; - // è il bounding box del loop esterno - return m_vpLoop[0]->GetBBox( m_frF, b3Loc, nFlag) ; + // reset del bbox + b3Loc.Reset() ; + // è il bounding box dei loop esterni + for ( auto i : m_vExtInd) { + BBox3d b3Tmp ; + if ( m_vpLoop[i]->GetBBox( m_frF, b3Loc, nFlag)) + b3Loc.Add( b3Tmp) ; + } + return ( ! b3Loc.IsEmpty()) ; } //---------------------------------------------------------------------------- @@ -540,8 +547,15 @@ SurfFlatRegion::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const return false ; // frame composito Frame3d frCompo = m_frF * frRef ; - // è il bounding box del loop esterno - return m_vpLoop[0]->GetBBox( frCompo, b3Ref, nFlag) ; + // reset del bbox + b3Ref.Reset() ; + // è il bounding box dei loop esterni + for ( auto i : m_vExtInd) { + BBox3d b3Tmp ; + if ( m_vpLoop[i]->GetBBox( frCompo, b3Ref, nFlag)) + b3Ref.Add( b3Tmp) ; + } + return ( ! b3Ref.IsEmpty()) ; } //---------------------------------------------------------------------------- diff --git a/SurfFlatRegionOffset.cpp b/SurfFlatRegionOffset.cpp index 215185f..4204192 100644 --- a/SurfFlatRegionOffset.cpp +++ b/SurfFlatRegionOffset.cpp @@ -31,9 +31,14 @@ SurfFlatRegion::Offset( double dDist, int nType) PtrOwner pSfr( new SurfFlatRegion) ; if ( IsNull( pSfr)) return false ; + bool bFirstRegion = true ; // ciclo sui chunk - bool bFirstCurve = true ; for ( int i = 0 ; i < nChunk ; ++ i) { + // creo la regione del chunk + PtrOwner pSfrChk( new SurfFlatRegion) ; + if ( IsNull( pSfrChk)) + return false ; + bool bFirstCurve = true ; // ciclo sui loop di ogni chunk int nLoop = GetLoopCount( i) ; for ( int j = 0 ; j < nLoop ; ++ j) { @@ -47,9 +52,9 @@ SurfFlatRegion::Offset( double dDist, int nType) // recupero le curve di offset PtrOwner 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))) + // se prima curva esterna, è il primo contorno esterno della nuova regione + if ( j == 0 && bFirstCurve) { + if ( ! pSfrChk->AddExtLoop( Release( pOffs))) return false ; bFirstCurve = false ; } @@ -64,12 +69,12 @@ SurfFlatRegion::Offset( double dDist, int nType) return false ; // se era loop esterno, lo aggiungo alla nuova regione if ( j == 0) { - if ( ! pSfr->Add( *Get( pSfr2))) + if ( ! pSfrChk->Add( *Get( pSfr2))) return false ; } // altrimenti loop interno, lo sottraggo alla nuova regione else { - if ( ! pSfr->Subtract( *Get( pSfr2))) + if ( ! pSfrChk->Subtract( *Get( pSfr2))) return false ; } } @@ -77,6 +82,23 @@ SurfFlatRegion::Offset( double dDist, int nType) pOffs.Set( OffsCrv.GetCurve()) ; } } + // se regione di chunk valida + if ( ! bFirstCurve) { + // se prima regione di chunk, ne sposto i dati nella nuova regione + if ( bFirstRegion) { + pSfr->m_vExtInd = pSfrChk->m_vExtInd ; + pSfr->m_vpLoop = pSfrChk->m_vpLoop ; + for ( auto& pLoop : pSfrChk->m_vpLoop) + pLoop = nullptr ; + pSfr->m_nStatus = pSfrChk->m_nStatus ; + bFirstRegion = false ; + } + // altrimenti la aggiungo alla nuova regione + else { + if ( ! pSfr->Add( *Get( pSfrChk))) + return false ; + } + } } // pulisco la superficie corrente