diff --git a/CurveAux.cpp b/CurveAux.cpp index 4bc1c70..a47fb8e 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -2043,13 +2043,14 @@ CalcCurvesMedialAxis( const CICURVEPVECTOR& vCrvC, ICURVEPOVECTOR& vCrvs, int nS //---------------------------------------------------------------------------- bool -CalcCurveFatCurve( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, double dRadius, bool bSquareEnds, bool bSquareMids) +CalcCurveFatCurve( const ICurve& crvC, ICURVEPOVECTOR& vCrvs, double dRadius, bool bSquareEnds, bool bSquareMids, + bool bMergeOnlySameProps) { Voronoi* pVoronoiObj = GetCurveVoronoi( crvC) ; if ( pVoronoiObj == nullptr) return false ; - return pVoronoiObj->CalcFatCurve( vCrvs, dRadius, bSquareEnds, bSquareMids) ; + return pVoronoiObj->CalcFatCurve( vCrvs, dRadius, bSquareEnds, bSquareMids, bMergeOnlySameProps) ; } //---------------------------------------------------------------------------- diff --git a/SfrCreate.cpp b/SfrCreate.cpp index cc18437..4535e90 100644 --- a/SfrCreate.cpp +++ b/SfrCreate.cpp @@ -115,7 +115,8 @@ GetSurfFlatRegionDisk( double dRadius) //------------------------------------------------------------------------------- ISurfFlatRegion* -GetSurfFlatRegionFromFatCurve( ICurve* pCrv, double dRadius, bool bSquareEnds, bool bSquareMids, double dOffsLinTol) +GetSurfFlatRegionFromFatCurve( ICurve* pCrv, double dRadius, bool bSquareEnds, bool bSquareMids, double dOffsLinTol, + bool bMergeOnlySameProps) { // metodo di calcolo impostato da USE_VORONOI @@ -330,7 +331,7 @@ GetSurfFlatRegionFromFatCurve( ICurve* pCrv, double dRadius, bool bSquareEnds, b else { // calcolo la fat curve con Voronoi ICURVEPOVECTOR vFatCurves ; - if ( ! CalcCurveFatCurve( *pCurve, vFatCurves, dRadius, bSquareEnds, bSquareMids)) + if ( ! CalcCurveFatCurve( *pCurve, vFatCurves, dRadius, bSquareEnds, bSquareMids, bMergeOnlySameProps)) return nullptr ; // costruisco la superficie a partire dalle curve diff --git a/Voronoi.cpp b/Voronoi.cpp index 8321f49..4feb971 100644 --- a/Voronoi.cpp +++ b/Voronoi.cpp @@ -847,18 +847,19 @@ Voronoi::CalcSpecialPointOffset( PNTVECTVECTOR& vResult, double dOffs) //---------------------------------------------------------------------------- bool -Voronoi::CalcFatCurve( ICURVEPOVECTOR& vCrvs, double dOffs, bool bSquareEnds, bool bSquareMids) +Voronoi::CalcFatCurve( ICURVEPOVECTOR& vCrvs, double dOffs, bool bSquareEnds, bool bSquareMids, + bool bMergeOnlySameProps) { vCrvs.clear() ; if ( ! IsValid()) - return false ; - - // se offset nullo errore - if ( abs( dOffs) < EPS_SMALL) return false ; - ICRVCOMPOPLIST OffsList ; + // se offset nullo errore + if ( abs( dOffs) < EPS_SMALL) + return false ; + + ICRVCOMPOPLIST OffsList ; if ( ! CalcVroniOffset( OffsList, abs( dOffs))) return false ; @@ -873,7 +874,7 @@ Voronoi::CalcFatCurve( ICURVEPOVECTOR& vCrvs, double dOffs, bool bSquareEnds, bo // identifico i raccordi da modificare if ( bClosed && bSquareMids) { // se curva è chiusa tutti i raccordi rispondono a bSquareMids - IdentifyFillets( pCrvOffs, dOffs) ; + IdentifyFillets( pCrvOffs, dOffs) ; } else if ( ! bClosed && ( bSquareMids || bSquareEnds)) { // se curva è aperta devo distinguere i raccordi interni da quelli relativi agli estremi e @@ -889,9 +890,9 @@ Voronoi::CalcFatCurve( ICURVEPOVECTOR& vCrvs, double dOffs, bool bSquareEnds, bo } // unisco le parti allineate - pCrvOffs->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG, true, true) ; + pCrvOffs->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG, true, bMergeOnlySameProps) ; // aggiungo al vettore finale - vCrvs.emplace_back( pCrvOffs) ; + vCrvs.emplace_back( pCrvOffs) ; } // sistemo i raccordi diff --git a/Voronoi.h b/Voronoi.h index 8f6e1fc..d0f033b 100644 --- a/Voronoi.h +++ b/Voronoi.h @@ -57,7 +57,7 @@ class Voronoi bool CalcOffset( ICURVEPOVECTOR& vOffs, double dOffs, int nType) ; bool CalcSingleCurvesOffset( ICURVEPOVECTOR& vOffs, double dOffs) ; bool CalcSpecialPointOffset( PNTVECTVECTOR& vResult, double dOffs) ; - bool CalcFatCurve( ICURVEPOVECTOR& vOffs, double dOffs, bool bSquareEnds, bool bSquareMids) ; + bool CalcFatCurve( ICURVEPOVECTOR& vOffs, double dOffs, bool bSquareEnds, bool bSquareMids, bool bMergeOnlySameProps = true) ; bool CalcMedialAxis( ICURVEPOVECTOR& vCrvs, int nSide) ; bool CalcLimitOffset( int nCrv, bool bLeft, double& dOffs) ;