From 5906253597bb8f28b861c600055ef92c87944ba7 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 30 Oct 2017 19:24:40 +0000 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=20:=20-=20correzione=20offset=20d?= =?UTF-8?q?i=20curve=20aperte=20(quando=20curve=20di=20estremit=C3=A0=20co?= =?UTF-8?q?rte)=20-=20correzione=20a=20Zmap.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CurveComposite.cpp | 4 ++ EgtGeomKernel.vcxproj | 1 + EgtGeomKernel.vcxproj.filters | 3 ++ Intervals.cpp | 41 ++++++++++++++-- OffsetCurve.cpp | 92 ++++++++++++++++++++++++++++++----- VolTriZmapVolume.cpp | 50 +++++-------------- 6 files changed, 138 insertions(+), 53 deletions(-) diff --git a/CurveComposite.cpp b/CurveComposite.cpp index c091462..f508a3c 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -1020,6 +1020,10 @@ CurveComposite::GetDomain( double& dStart, double& dEnd) const bool CurveComposite::GetIndSCurveAndLocPar( double dU, Side nS, int& nSCrv, double& dLocU) const { + // deve esserci almeno una curva semplice + if ( m_CrvSmplS.empty()) + return false ; + // valore massimo del parametro double dMaxU = double( m_CrvSmplS.size()) ; diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index 03332ff..49b616b 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -403,6 +403,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters index a6f8f4a..036dcb1 100644 --- a/EgtGeomKernel.vcxproj.filters +++ b/EgtGeomKernel.vcxproj.filters @@ -806,6 +806,9 @@ File di intestazione\Include + + File di intestazione\Include + diff --git a/Intervals.cpp b/Intervals.cpp index f611bc5..6480ba9 100644 --- a/Intervals.cpp +++ b/Intervals.cpp @@ -176,7 +176,7 @@ Intervals::Intersect( const Intervals& Other) //---------------------------------------------------------------------------- bool -Intervals::GetMinMax( double& dMin, double& dMax) +Intervals::GetMinMax( double& dMin, double& dMax) const { // verifico ci siano intervalli if ( m_lInts.empty()) @@ -189,7 +189,7 @@ Intervals::GetMinMax( double& dMin, double& dMax) //---------------------------------------------------------------------------- bool -Intervals::GetFirst( double& dMin, double& dMax) +Intervals::GetFirst( double& dMin, double& dMax) const { // vado all'inizio m_Iter = m_lInts.begin() ; @@ -204,7 +204,7 @@ Intervals::GetFirst( double& dMin, double& dMax) //---------------------------------------------------------------------------- bool -Intervals::GetNext( double& dMin, double& dMax) +Intervals::GetNext( double& dMin, double& dMax) const { // vado al successivo if ( m_Iter == m_lInts.end()) @@ -218,3 +218,38 @@ Intervals::GetNext( double& dMin, double& dMax) dMax = m_Iter->second ; return true ; } + +//---------------------------------------------------------------------------- +bool +Intervals::GetLast( double& dMin, double& dMax) const +{ + // vado alla fine + m_Iter = m_lInts.end() ; + if ( m_Iter == m_lInts.begin()) + return false ; + -- m_Iter ; + // verifico sia definito + if ( m_Iter == m_lInts.end()) + return false ; + // recupero i dati + dMin = m_Iter->first ; + dMax = m_Iter->second ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +Intervals::GetPrev( double& dMin, double& dMax) const +{ + // vado al precedente + if ( m_Iter == m_lInts.begin()) + return false ; + -- m_Iter ; + // verifico sia definito + if ( m_Iter == m_lInts.end()) + return false ; + // recupero i dati + dMin = m_Iter->first ; + dMax = m_Iter->second ; + return true ; +} diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index 77698db..f3d3669 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -17,9 +17,10 @@ #include "CurveLine.h" #include "CurveArc.h" #include "GeoConst.h" -#include "/EgtDev/Include/EgkOffsetCurve.h" -#include "/EgtDev/Include/EgkIntersCurves.h" +#include "/EgtDev/Include/EGkOffsetCurve.h" +#include "/EgtDev/Include/EGkIntersCurves.h" #include "/EgtDev/Include/EGkDistPointCurve.h" +#include "/EgtDev/Include/EGkIntervals.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include @@ -356,17 +357,84 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) if ( dUPrev > EPS_PARAM) pCompo1->TrimStartAtParam( dUPrev) ; - // sesto passo : elimino le parti che sono troppo vicine al percorso originale + // sesto passo : se curva aperta, elimino i tratti che stanno nella circonferenza di offset dei punti estremi + if ( ! bClosed) { + // ciconferenza sull'estremità iniziale + Point3d ptStart ; ccCopy.GetStartPoint( ptStart) ; + PtrOwner pCircS( CreateBasicCurveArc()) ; + if ( IsNull( pCircS) || ! pCircS->Set( ptStart, Z_AX, abs( dDist))) + return false ; + // circonferenza sull'estremità finale + Point3d ptEnd ; ccCopy.GetEndPoint( ptEnd) ; + PtrOwner pCircE( CreateBasicCurveArc()) ; + if ( IsNull( pCircE) || ! pCircE->Set( ptEnd, Z_AX, abs( dDist))) + return false ; + POCRVVECTOR vpCirc ; + vpCirc.emplace_back( Release( pCircS)) ; + vpCirc.emplace_back( Release( pCircE)) ; + // elimino le parti di offset interne a queste circonferenze + for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ;) { + // recupero la curva e il suo dominio + ICurve* pCrv = *iIter ; + double dStart, dEnd ; + if ( ! pCrv->GetDomain( dStart, dEnd)) + return false ; + // determino gli intervalli da conservare (inizializzo come tutta la curva per poi poter rimuovere parti) + Intervals inOk( EPS_PARAM) ; + inOk.Set( dStart, dEnd) ; + for ( const auto& pCirc : vpCirc) { + IntersCurveCurve ccInt( *pCrv, *pCirc) ; + CRVCVECTOR ccPart ; + if ( ! ccInt.GetCurveClassification( 0, ccPart)) + return false ; + for ( auto& ccOne : ccPart) { + switch ( ccOne.nClass) { + case CRVC_IN : + // intervallo standard + if ( ccOne.dParS < ccOne.dParE - EPS_PARAM) + inOk.Subtract( ccOne.dParS, ccOne.dParE) ; + // intervallo che attraversa punto di chiusura della curva + else { + inOk.Subtract( ccOne.dParS, dEnd) ; + inOk.Subtract( dStart, ccOne.dParE) ; + } + break ; + case CRVC_NULL : + return false ; + } + } + } + // eseguo trim (solo della parte iniziale e/o finale) + double dMin, dMax ; + if ( inOk.GetMinMax( dMin, dMax)) { + if ( dMin > dStart + 100 * EPS_PARAM && dMax < dEnd - 100 * EPS_PARAM) + pCrv->TrimStartEndAtParam( dMin, dMax) ; + else if ( dMin > dStart + 100 * EPS_PARAM) + pCrv->TrimStartAtParam( dMin) ; + else if ( dMax < dEnd - 100 * EPS_PARAM) + pCrv->TrimEndAtParam( dMax) ; + } + else { + delete pCrv ; + iIter = m_CrvLst.erase( iIter) ; + continue ; + } + // passo alla successiva + ++ iIter ; + } + } + + // settimo passo : elimino le parti che sono troppo vicine al percorso originale for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ;) { ICurve* pCrv = *iIter ; // distanza minima di alcuni punti interni della curva dalla curva originale - if ( GetMinDist( 0.5, pCrv, &ccCopy) < fabs( dDist) - 5 * EPS_SMALL || - GetMinDist( 0.25, pCrv, &ccCopy) < fabs( dDist) - 5 * EPS_SMALL || - GetMinDist( 0.75, pCrv, &ccCopy) < fabs( dDist) - 5 * EPS_SMALL || - GetMinDist( 0.125, pCrv, &ccCopy) < fabs( dDist) - 5 * EPS_SMALL || - GetMinDist( 0.875, pCrv, &ccCopy) < fabs( dDist) - 5 * EPS_SMALL || - GetMinDist( 0.0625, pCrv, &ccCopy) < fabs( dDist) - 5 * EPS_SMALL || - GetMinDist( 0.9375, pCrv, &ccCopy) < fabs( dDist) - 5 * EPS_SMALL) { + if ( GetMinDist( 0.5, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || + GetMinDist( 0.25, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || + GetMinDist( 0.75, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || + GetMinDist( 0.125, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || + GetMinDist( 0.875, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || + GetMinDist( 0.0625, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || + GetMinDist( 0.9375, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL) { delete pCrv ; iIter = m_CrvLst.erase( iIter) ; continue ; @@ -375,7 +443,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) ++ iIter ; } - // settimo passo : concateno i percorsi risultanti (senza cambiare verso) + // ottavo passo : concateno i percorsi risultanti (senza cambiare verso) for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ;) { CurveComposite* pCrvCo = GetBasicCurveComposite( *iIter) ; // recupero punti iniziale e finale della curva @@ -408,7 +476,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) ++ iIter ; } - // ottavo passo : se con smusso o estensione, sostituisco i fillet con questi + // nono passo : se con smusso o estensione, sostituisco i fillet con questi if ( ( nType & ICurve::OFF_CHAMFER) != 0 || ( nType & ICurve::OFF_EXTEND) != 0) { for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ; ++ iIter) { // processo le curve semplici della composita diff --git a/VolTriZmapVolume.cpp b/VolTriZmapVolume.cpp index b04552a..b1ad2c3 100644 --- a/VolTriZmapVolume.cpp +++ b/VolTriZmapVolume.cpp @@ -19,6 +19,7 @@ #include "GeoConst.h" #include "IntersLineSurfTm.h" #include "/EgtDev/Include/EgtNumUtils.h" +#include "/EgtDev/Include/EGkStringUtils3d.h" using namespace std ; @@ -179,15 +180,6 @@ VolZmap::SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ if ( nGrid == 0) { - /*INTVECTOR nXBlock ; - INTVECTOR nYBlock ; - nXBlock.emplace_back( min( nI / m_nDexNumPBlock, m_nFracLin[0] - 1)) ; - nYBlock.emplace_back( min( nJ / m_nDexNumPBlock, m_nFracLin[1] - 1)) ; - if ( nI % N_DEXBLOCK == 0 && nXBlock[0] > 0) - nXBlock.emplace_back( nXBlock[0] - 1) ; - if ( nJ % N_DEXBLOCK == 0 && nYBlock[0] > 0) - nYBlock.emplace_back( nYBlock[0] - 1) ;*/ - int nXStop = 1 ; int nYStop = 1 ; @@ -217,7 +209,7 @@ VolZmap::SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ int nMinK = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumZ - 2) ; int nMaxK = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumZ - 2) ; - int nMinZBlock = ( m_nMapNum == 1 ? 0 : max( 0, nMinK / int( m_nVoxNumPerBlock))) ; + int nMinZBlock = ( m_nMapNum == 1 ? 0 : Clamp( nMinK / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[2] - 1))) ; int nMaxZBlock = min( int( m_nFracLin[2] - 1), nMaxK / int( m_nVoxNumPerBlock)) ; for ( int tI = 0 ; tI < nXStop ; ++ tI) { @@ -227,20 +219,11 @@ VolZmap::SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ m_BlockToUpdate[nBlockNum] = true ; } } - } + } } else if ( nGrid == 1) { - - /*INTVECTOR nYBlock ; - INTVECTOR nZBlock ; - nYBlock.emplace_back( min( nI / m_nDexNumPBlock, m_nFracLin[1] - 1)) ; - nZBlock.emplace_back( min( nJ / m_nDexNumPBlock, m_nFracLin[2] - 1)) ; - if ( nI % N_DEXBLOCK == 0 && nYBlock[0] > 0) - nYBlock.emplace_back( nYBlock[0] - 1) ; - if ( nJ % N_DEXBLOCK == 0 && nZBlock[0] > 0) - nZBlock.emplace_back( nZBlock[0] - 1) ;*/ - + int nYStop = 1 ; int nZStop = 1 ; @@ -270,7 +253,7 @@ VolZmap::SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ int nMinI = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumX - 2) ; int nMaxI = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumX - 2) ; - int nMinXBlock = max( 0, nMinI / int( m_nVoxNumPerBlock)) ; + int nMinXBlock = Clamp( nMinI / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[0] - 1)) ; int nMaxXBlock = min( int( m_nFracLin[0] - 1), nMaxI / int( m_nVoxNumPerBlock)) ; for ( int tI = 0 ; tI < nYStop ; ++ tI) { @@ -280,20 +263,11 @@ VolZmap::SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ m_BlockToUpdate[nBlockNum] = true ; } } - } + } } else if ( nGrid == 2) { - /*INTVECTOR nXBlock ; - INTVECTOR nZBlock ; - nXBlock.emplace_back( min( nJ / m_nDexNumPBlock, m_nFracLin[0] - 1)) ; - nZBlock.emplace_back( min( nI / m_nDexNumPBlock, m_nFracLin[2] - 1)) ; - if ( nJ % N_DEXBLOCK == 0 && nXBlock[0] > 0) - nXBlock.emplace_back( nXBlock[0] - 1) ; - if ( nI % N_DEXBLOCK == 0 && nZBlock[0] > 0) - nZBlock.emplace_back( nZBlock[0] - 1) ;*/ - int nXStop = 1 ; int nZStop = 1 ; @@ -318,12 +292,12 @@ VolZmap::SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ } // Numero di voxel lungo Y - int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] / N_DEXVOXRATIO == 0 ? 1 : 2)) ; + int nVoxNumY = int( m_nNy[0] / N_DEXVOXRATIO + ( m_nNy[0] % N_DEXVOXRATIO == 0 ? 1 : 2)) ; int nMinJ = Clamp( int( floor( ( ( dMin - 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) - EPS_SMALL))), 0, nVoxNumY - 2) ; int nMaxJ = Clamp( int( floor( ( ( dMax + 0.5 * m_dStep) / ( N_DEXVOXRATIO * m_dStep) + EPS_SMALL))), 0, nVoxNumY - 2) ; - int nMinYBlock = max( 0, nMinJ / int( m_nVoxNumPerBlock)) ; + int nMinYBlock = Clamp( nMinJ / int( m_nVoxNumPerBlock), 0, int( m_nFracLin[1] - 1)) ; int nMaxYBlock = min( int( m_nFracLin[1] - 1), nMaxJ / int( m_nVoxNumPerBlock)) ; for ( int tI = 0 ; tI < nZStop ; ++ tI) { @@ -333,7 +307,7 @@ VolZmap::SubtractIntervals( unsigned int nGrid, unsigned int nI, unsigned int nJ m_BlockToUpdate[nBlockNum] = true ; } } - } + } } m_OGrMgr.Reset() ; @@ -370,9 +344,8 @@ VolZmap::SubtractIntervals( unsigned int nGrid, const Point3d & ptP, // Controllo che gli indici ottenuti siano nella griglia: // se sono dentro la griglia chiamo l'altra subtract - if ( i >= 0 && i < m_nNx[nGrid] && - j >= 0 && j < m_nNy[nGrid]) - + if ( i >= 0 && i < m_nNx[nGrid] && + j >= 0 && j < m_nNy[nGrid]) return SubtractIntervals( nGrid, i, j, dhMin, dhMax, vtNMin, vtNMax) ; // altrimenti non succede niente else @@ -925,6 +898,7 @@ VolZmap::MillingStep( const Point3d& ptPs, const Vector3d& vtDs, const Vector3d& // Altri casi al momento non gestiti // return false ; } + m_nConnectedCompoCount = - 1 ; return true ; }