EgtGeomKernel 2.5b2 :
- in CurveComposite aggiunta funzione StraightArcsToLines - in OffsetCurve filtraggio prima dell'esecuzione anche con la funzione precedente.
This commit is contained in:
+4
-4
@@ -226,14 +226,14 @@ MyAdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst)
|
||||
Point3d ptEnd2 ; pCrvCo2->GetEndPoint( ptEnd2) ;
|
||||
// se aperta, verifico se concatenabile alla principale
|
||||
if ( ! AreSamePointEpsilon( ptStart2, ptEnd2, 10 * EPS_SMALL)) {
|
||||
if ( AreSamePointEpsilon( ptEnd, ptStart2, 10 * EPS_SMALL)) {
|
||||
pCrvCo->AddCurve( pCrvCo2, true, 10 * EPS_SMALL) ;
|
||||
if ( AreSamePointEpsilon( ptEnd, ptStart2, 100 * EPS_SMALL)) {
|
||||
pCrvCo->AddCurve( pCrvCo2, true, 100 * EPS_SMALL) ;
|
||||
CrvLst.erase( iIter2) ;
|
||||
ptEnd = ptEnd2 ;
|
||||
iIter2 = next( iIter) ;
|
||||
}
|
||||
else if ( AreSamePointEpsilon( ptEnd2, ptStart, 10 * EPS_SMALL)) {
|
||||
pCrvCo->AddCurve( pCrvCo2, false, 10 * EPS_SMALL) ;
|
||||
else if ( AreSamePointEpsilon( ptEnd2, ptStart, 100 * EPS_SMALL)) {
|
||||
pCrvCo->AddCurve( pCrvCo2, false, 100 * EPS_SMALL) ;
|
||||
CrvLst.erase( iIter2) ;
|
||||
ptStart = ptStart2 ;
|
||||
iIter2 = next( iIter) ;
|
||||
|
||||
+35
-2
@@ -2039,7 +2039,7 @@ CurveComposite::ModifyCurveToArc( int nCrv, const Point3d& ptMid)
|
||||
if ( nCrv < 0 || nCrv > nCrvCount - 1)
|
||||
return false ;
|
||||
// recupero la curva corrente
|
||||
ICurve* pCrv = *(m_CrvSmplS.begin() + nCrv) ;
|
||||
ICurve* pCrv = m_CrvSmplS[nCrv] ;
|
||||
// recupero gli estremi
|
||||
Point3d ptStart, ptEnd ;
|
||||
if ( ! pCrv->GetStartPoint( ptStart) || ! pCrv->GetEndPoint( ptEnd))
|
||||
@@ -2072,7 +2072,7 @@ CurveComposite::ModifyCurveToLine( int nCrv)
|
||||
if ( nCrv < 0 || nCrv > nCrvCount - 1)
|
||||
return false ;
|
||||
// recupero la curva corrente
|
||||
ICurve* pCrv = *(m_CrvSmplS.begin() + nCrv) ;
|
||||
ICurve* pCrv = m_CrvSmplS[nCrv] ;
|
||||
// se già linea non devo fare alcunchè
|
||||
if ( pCrv->GetType() == CRV_LINE)
|
||||
return true ;
|
||||
@@ -2880,6 +2880,39 @@ CurveComposite::ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDe
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
CurveComposite::StraightArcsToLines( double dLinTol, double dAngTolDeg)
|
||||
{
|
||||
// controllo le tolleranze
|
||||
dLinTol = max( dLinTol, EPS_SMALL) ;
|
||||
dAngTolDeg = Clamp( dAngTolDeg, EPS_ANG_SMALL, ANG_RIGHT) ;
|
||||
// verifico le singole curve
|
||||
for ( auto Iter = m_CrvSmplS.begin() ; Iter != m_CrvSmplS.end() ; ++ Iter) {
|
||||
CurveArc* pArc = GetBasicCurveArc( *Iter) ;
|
||||
if ( pArc != nullptr &&
|
||||
abs( pArc->GetAngCenter()) < dAngTolDeg &&
|
||||
pArc->GetRadius() * ( 1 - cos( pArc->GetAngCenter() / 2 * DEGTORAD)) < dLinTol) {
|
||||
// recupero gli estremi
|
||||
Point3d ptStart, ptEnd ;
|
||||
if ( ! pArc->GetStartPoint( ptStart) || ! pArc->GetEndPoint( ptEnd))
|
||||
return false ;
|
||||
// creo la linea
|
||||
PtrOwner<CurveLine> pLine( CreateBasicCurveLine()) ;
|
||||
if ( IsNull( pLine) || ! pLine->Set( ptStart, ptEnd))
|
||||
return false ;
|
||||
// elimino la curva originale e la sostituisco con la nuova
|
||||
delete (*Iter) ;
|
||||
(*Iter) = Release( pLine) ;
|
||||
}
|
||||
}
|
||||
|
||||
// imposto ricalcolo della grafica
|
||||
m_OGrMgr.Reset() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static int
|
||||
MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAngTol, bool bNeedSameProp)
|
||||
|
||||
@@ -156,6 +156,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
|
||||
bool ModifyCurveToLine( int nCrv) override ;
|
||||
bool ArcsToBezierCurves( void) override ;
|
||||
bool ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDeg) override ;
|
||||
bool StraightArcsToLines( double dLinTol, double dAngTolDeg) override ;
|
||||
bool MergeCurves( double dLinTol, double dAngTolDeg, bool bStartEnd = true, bool bNeedSameProp = false) override ;
|
||||
bool RemoveSmallDefects( double dLinTol, double dAngTolDeg, bool bAlsoSpikes = false) override ;
|
||||
bool RemoveUndercutOnY( double dLinTol, double dAngTolDeg) override ;
|
||||
|
||||
Binary file not shown.
+8
-2
@@ -161,10 +161,16 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
|
||||
bool bClosed = ccCopy.IsClosed() && ( nType & ICurve::OFF_FORCE_OPEN) == 0 ;
|
||||
|
||||
// elimino eventuali piccole Z
|
||||
RemoveCurveSmallZs( &ccCopy, 10 * EPS_SMALL) ;
|
||||
if ( ! RemoveCurveSmallZs( &ccCopy, 10 * EPS_SMALL))
|
||||
return false ;
|
||||
|
||||
// converto archi diritti in segmenti di retta
|
||||
if ( ! ccCopy.StraightArcsToLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG))
|
||||
return false ;
|
||||
|
||||
// unisco parti allineate (tranne gli estremi)
|
||||
ccCopy.MergeCurves( 10 * EPS_SMALL, ANG_TOL_STD_DEG, false) ;
|
||||
if ( ! ccCopy.MergeCurves( 10 * EPS_SMALL, ANG_TOL_STD_DEG, false))
|
||||
return false ;
|
||||
|
||||
// calcolo le lunghezze delle diverse entità
|
||||
DBLVECTOR vLens ;
|
||||
|
||||
Reference in New Issue
Block a user