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