diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 51abec2..d2fbc95 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -889,14 +889,21 @@ CurveComposite::Validate( void) //---------------------------------------------------------------------------- bool -CurveComposite::TestClosure( void) +CurveComposite::TestClosure( double dLinTol) { - // se non è chiusa, esco subito - if ( ! IsClosed()) + // se non valida o vuota, esco subito + if ( m_nStatus != OK || m_CrvSmplS.empty()) + return true ; + // se non è chiusa entro la tolleranza, esco subito + Point3d ptStart, ptEnd ; + if ( ! m_CrvSmplS.front()->GetStartPoint( ptStart) || + ! m_CrvSmplS.back()->GetEndPoint( ptEnd) || + ! AreSamePointEpsilon( ptStart, ptEnd, dLinTol)) + return true ; + // se singola retta, esco subito + if ( m_CrvSmplS.size() == 1 && m_CrvSmplS.front()->GetType() == CRV_LINE) return true ; // verifico ed eventualmente aggiusto coincidenza punti estremi - Point3d ptStart ; m_CrvSmplS.front()->GetStartPoint( ptStart) ; - Point3d ptEnd ; m_CrvSmplS.back()->GetEndPoint( ptEnd) ; // se distanza superiore al limite ridotto forzo i punti a coincidere if ( ! AreSamePointEpsilon( ptStart, ptEnd, EPS_CONNECT)) { // se un solo arco diff --git a/CurveComposite.h b/CurveComposite.h index cc07fdf..f202bd4 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -198,13 +198,13 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW return *this ; } bool RelocateFrom( CurveComposite& ccSrc) ; bool GetApproxLength( double& dLen) const ; + bool TestClosure( double dLinTol = EPS_SMALL) ; Voronoi* GetVoronoiObject( void) const ; void ResetVoronoiObject( void) const ; private : bool CopyFrom( const CurveComposite& ccSrc) ; bool Validate( void) ; - bool TestClosure( void) ; bool AddCurveByRelocate( CurveComposite& ccSrc, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ; bool AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ; bool GetIndSCurveAndLocPar( double dU, Side nS, int& nSCrv, double& dLocU) const ; diff --git a/VolZmapCalculus.cpp b/VolZmapCalculus.cpp index 178f2ae..bb57461 100644 --- a/VolZmapCalculus.cpp +++ b/VolZmapCalculus.cpp @@ -3177,6 +3177,7 @@ VolZmap::GetPlaneIntersection( const Plane3d& plPlane, ICURVEPOVECTOR& vpLoop) c if ( ! pLoop->AddCurve( vLine[i - 1], true, 10 * EPS_SMALL)) return false ; } + pLoop->TestClosure( 10 * EPS_SMALL) ; pLoop->SetExtrusion( plPlane.GetVersN()) ; pLoop->MergeCurves( 10 * EPS_SMALL, ANG_TOL_STD_DEG) ; // Inserisco la curva composita nella raccolta da ritornare