diff --git a/BiArcs.cpp b/BiArcs.cpp index 6023a39..573162e 100644 --- a/BiArcs.cpp +++ b/BiArcs.cpp @@ -202,7 +202,7 @@ CalcJCurve( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dD double dDeltaAngDeg = - dDir0RelDeg + dDir1RelDeg ; // se non è nella regione, prendo l'altra parte di arco if ( ! AngleInSpan( dDirStartRelDeg, dDir0RelDeg, dDeltaAngDeg)) - pArc->ToAdditional() ; + pArc->ToExplementary() ; // inverto per avere parametrizzazione crescente allontanandosi da Dir0 e avvicinandosi a Dir1 pArc->Invert() ; return ::Release( pArc) ; diff --git a/CurveArc.cpp b/CurveArc.cpp index a7ac49c..0eec806 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -1793,7 +1793,7 @@ CurveArc::ChangeStartPoint( double dU) //---------------------------------------------------------------------------- bool -CurveArc::ToAdditional( void) +CurveArc::ToExplementary( void) { // la curva deve essere validata if ( m_nStatus != OK) diff --git a/CurveArc.h b/CurveArc.h index aedb19f..08a86e7 100644 --- a/CurveArc.h +++ b/CurveArc.h @@ -102,6 +102,8 @@ class CurveArc : public ICurveArc, public IGeoObjRW { return CurveGetAreaXY( *this, dArea) ; } virtual bool ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const ; virtual bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const ; + virtual bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const + { return ApproxWithArcs( dLinTol, dAngTolDeg, PA) ; } virtual ICurve* CopyParamRange( double dUStart, double dUEnd) const ; virtual bool Invert( void) ; virtual bool SimpleOffset( double dDist, int nType = OFF_FILLET) ; @@ -163,7 +165,7 @@ class CurveArc : public ICurveArc, public IGeoObjRW virtual bool ChangeDeltaN( double dNewDeltaN) ; virtual bool ChangeStartPoint( double dU) ; virtual bool ExtendedOffset( double dDist, int nType = OFF_FILLET) ; - virtual bool ToAdditional( void) ; + virtual bool ToExplementary( void) ; virtual bool Flip( void) ; public : // IGeoObjRW diff --git a/CurveBezier.h b/CurveBezier.h index 5ba4297..24f599a 100644 --- a/CurveBezier.h +++ b/CurveBezier.h @@ -103,6 +103,8 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW { return CurveGetAreaXY( *this, dArea) ; } virtual bool ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const ; virtual bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const ; + virtual bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const + { return ApproxWithArcs( dLinTol, dAngTolDeg, PA) ; } virtual ICurve* CopyParamRange( double dUStart, double dUEnd) const ; virtual bool Invert( void) ; virtual bool SimpleOffset( double dDist, int nType = OFF_FILLET) diff --git a/CurveByApprox.cpp b/CurveByApprox.cpp index 803d6e0..b782b16 100644 --- a/CurveByApprox.cpp +++ b/CurveByApprox.cpp @@ -55,16 +55,42 @@ CurveByApprox::AddPoint( const Point3d& ptP) ICurve* CurveByApprox::GetCurve( int nType, double dLinTol, double dAngTolDeg, double dLinFea) { + // se da approssimare con archi + if ( nType == ARCS_CORNER) { + // calcolo approssimazione + PolyArc PA ; + if ( ! GetArcs( dLinTol, dAngTolDeg, dLinFea, PA)) + return false ; + // creo la composita formata da questa approssimazione + PtrOwner pCC( CreateBasicCurveComposite()) ; + if ( ! pCC->FromPolyArc( PA)) + return nullptr ; + // eventuale fusione di curve compatibili + pCC->MergeCurves( dLinTol, dAngTolDeg) ; + // restituisco la curva + return Release( pCC) ; + } + // altrimenti con curve di Bezier cubiche + // !!! NON ANCORA IMPLEMENTATA !!! + return nullptr ; +} + +//---------------------------------------------------------------------------- +bool +CurveByApprox::GetArcs( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) +{ + // pulisco il poliarco + PA.Clear() ; + // calcolo le tangenti if ( ! CalcAkimaTangents( true)) - return nullptr ; + return false ; // divido in tratti (rettilinei o tra spigoli) if ( ! CalcSplitPoints( dLinTol, dAngTolDeg, dLinFea)) - return nullptr ; + return false ; // approssimo ogni singolo tratto - PolyArc PA ; int nPrev = 0 ; int nSplits = int( m_vSplits.size()) ; for ( int i = 0 ; i < nSplits ; ++ i) { @@ -74,18 +100,11 @@ CurveByApprox::GetCurve( int nType, double dLinTol, double dAngTolDeg, double dL PL.AddUPoint( j, m_vPnt[j]) ; // eseguo l'approssimazione con archi if ( ! BiArcOrSplit( 0, PL, dLinTol, dAngTolDeg, PA)) - return nullptr ; + return false ; // salvo fine come prox inizio nPrev = m_vSplits[i] ; } - // creo la composita formata da questa approssimazione - PtrOwner pCC( CreateBasicCurveComposite()) ; - if ( ! pCC->FromPolyArc( PA)) - return nullptr ; - // eventuale fusione di curve compatibili - pCC->MergeCurves( dLinTol, dAngTolDeg) ; - - return Release( pCC) ; + return true ; } //---------------------------------------------------------------------------- diff --git a/CurveComposite.cpp b/CurveComposite.cpp index c89a2a2..7fbff3c 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -24,6 +24,7 @@ #include "GeoObjFactory.h" #include "NgeWriter.h" #include "NgeReader.h" +#include "/EgtDev/Include/EGkCurveByApprox.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include @@ -1288,12 +1289,12 @@ CurveComposite::ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) PolyArc PASmpl ; if ( ! pCrv->ApproxWithArcs( dLinTol, dAngTolDeg, PASmpl)) return false ; - // ripristino estrusione e spessore della curva semplice (annullandoli) - pCrv->SetExtrusion( V_NULL) ; - pCrv->SetThickness( 0) ; // la accodo opportunamente a quella della curva composita if ( ! PA.Join( PASmpl, dStartPar)) return false ; + // ripristino estrusione e spessore della curva semplice (annullandoli) + pCrv->SetExtrusion( V_NULL) ; + pCrv->SetThickness( 0) ; // incremento inizio parametro per prossima curva semplice dStartPar += 1 ; } @@ -1304,6 +1305,85 @@ CurveComposite::ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) return true ; } +//---------------------------------------------------------------------------- +bool +CurveComposite::ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const +{ + // pulisco il poliarco + PA.Clear() ; + + // verifico lo stato + if ( m_nStatus != OK) + return false ; + + // preparazione per approssimazione di multilinee + bool bMultiLine = false ; + double dMlStartPar = 0 ; + CurveByApprox crvByApprox ; + + // eseguo approssimazione + double dStartPar = 0 ; + for ( auto& pCrv : m_CrvSmplS) { + // assegno estrusione e spessore della curva composita + pCrv->SetExtrusion( m_VtExtr) ; + pCrv->SetThickness( m_dThick) ; + // se segmento di linea non feature + double dLen ; + if ( pCrv->GetType() == CRV_LINE && pCrv->GetLength( dLen) && dLen < dLinFea) { + CurveLine* pLine = GetBasicCurveLine( pCrv) ; + // se inizio di approx multilinea + if ( ! bMultiLine) { + bMultiLine = true ; + dMlStartPar = dStartPar ; + crvByApprox.Reset() ; + crvByApprox.AddPoint( pLine->GetStart()) ; + } + // aggiungo il punto finale + crvByApprox.AddPoint( pLine->GetEnd()) ; + } + // altrimenti + else { + // se in corso approx multilinee + if ( bMultiLine) { + bMultiLine = false ; + PolyArc PASmpl ; + if ( ! crvByApprox.GetArcs( dLinTol, dAngTolDeg, dLinFea, PASmpl)) + return false ; + // la accodo opportunamente a quella della curva composita + if ( ! PA.Join( PASmpl, dMlStartPar)) + return false ; + } + // recupero approssimazione per curva semplice + PolyArc PASmpl ; + if ( ! pCrv->ApproxWithArcs( dLinTol, dAngTolDeg, PASmpl)) + return false ; + // la accodo opportunamente a quella della curva composita + if ( ! PA.Join( PASmpl, dStartPar)) + return false ; + } + // ripristino estrusione e spessore della curva semplice (annullandoli) + pCrv->SetExtrusion( V_NULL) ; + pCrv->SetThickness( 0) ; + // incremento inizio parametro per prossima curva semplice + dStartPar += 1 ; + } + // se approssimazione multiline ancora aperta + if ( bMultiLine) { + bMultiLine = false ; + PolyArc PASmpl ; + if ( ! crvByApprox.GetArcs( dLinTol, dAngTolDeg, dLinFea, PASmpl)) + return false ; + // la accodo opportunamente a quella della curva composita + if ( ! PA.Join( PASmpl, dMlStartPar)) + return false ; + } + + // assegno estrusione della curva composita + PA.SetExtrusion( m_VtExtr) ; + + return true ; +} + //---------------------------------------------------------------------------- ICurve* CurveComposite::CopyParamRange( double dUStart, double dUEnd) const diff --git a/CurveComposite.h b/CurveComposite.h index f26c238..26f9090 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -99,6 +99,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW { return CurveGetAreaXY( *this, dArea) ; } virtual bool ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const ; virtual bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const ; + virtual bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const ; virtual ICurve* CopyParamRange( double dUStart, double dUEnd) const ; virtual bool Invert( void) ; virtual bool SimpleOffset( double dDist, int nType = OFF_FILLET) ; diff --git a/CurveLine.h b/CurveLine.h index 5fa95d9..4632f1b 100644 --- a/CurveLine.h +++ b/CurveLine.h @@ -103,6 +103,8 @@ class CurveLine : public ICurveLine, public IGeoObjRW { return false ; } virtual bool ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLine& PL) const ; virtual bool ApproxWithArcs( double dLinTol, double dAngTolDeg, PolyArc& PA) const ; + virtual bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const + { return ApproxWithArcs( dLinTol, dAngTolDeg, PA) ; } virtual ICurve* CopyParamRange( double dUStart, double dUEnd) const ; virtual bool Invert( void) ; virtual bool SimpleOffset( double dDist, int nType = OFF_FILLET) ; diff --git a/ExtText.cpp b/ExtText.cpp index 831dfef..fe4060e 100644 --- a/ExtText.cpp +++ b/ExtText.cpp @@ -809,10 +809,6 @@ ExtText::Mir( bool bOnLen) { // imposto ricalcolo della grafica m_OGrMgr.Reset() ; - // imposto il font corrente e i suoi dati - FontManager& fntMgr = FontManager::GetFontManager() ; - if ( ! fntMgr.SetCurrFont( m_sFont, m_nWeight, m_bItalic, m_dHeight, m_dRatio, m_dAddAdvance)) - return false ; // se auto-mirror sulla lunghezza del testo if ( bOnLen) { diff --git a/GdbExecutor.cpp b/GdbExecutor.cpp index ad48a0f..c3a454f 100644 --- a/GdbExecutor.cpp +++ b/GdbExecutor.cpp @@ -934,9 +934,9 @@ GdbExecutor::ExecuteCurveArc( const string& sCmd2, const STRVECTOR& vsParams) // cambio del deltaN else if ( sCmd2 == "CHDN" || sCmd2 == "CHANGEDELTAN") return CurveArcChangeDeltaN( vsParams) ; - // trasformazione nell'arco complementare - else if ( sCmd2 == "TA" || sCmd2 == "TOADDITIONAL") - return CurveArcToAdditional( vsParams) ; + // trasformazione nell'arco esplementare + else if ( sCmd2 == "TE" || sCmd2 == "TOEXPLEMENTARY") + return CurveArcToExplementary( vsParams) ; // flip dell'arco else if ( sCmd2 == "F" || sCmd2 == "FLIP") return CurveArcFlip( vsParams) ; @@ -1457,7 +1457,7 @@ GdbExecutor::CurveArcChangeDeltaN( const STRVECTOR& vsParams) //---------------------------------------------------------------------------- bool -GdbExecutor::CurveArcToAdditional( const STRVECTOR& vsParams) +GdbExecutor::CurveArcToExplementary( const STRVECTOR& vsParams) { // 1 parametro : Id if ( vsParams.size() != 1) @@ -1467,7 +1467,7 @@ GdbExecutor::CurveArcToAdditional( const STRVECTOR& vsParams) if ( pCrvArc == nullptr) return false ; // eseguo l'operazione - return pCrvArc->ToAdditional() ; + return pCrvArc->ToExplementary() ; } //---------------------------------------------------------------------------- @@ -1862,7 +1862,7 @@ GdbExecutor::CurveCompoFromCurveApproximation( const STRVECTOR& vsParams) } else { // con bi-archi PolyArc PA ; - if ( ! CrvLoc.Get()->ApproxWithArcs( dLinTol, ANG_TOL_STD_DEG, PA) || + if ( ! CrvLoc.Get()->ApproxWithArcsEx( dLinTol, ANG_TOL_STD_DEG, LIN_FEA_LEN_STD, PA) || ! pCC->FromPolyArc( PA)) return false ; } diff --git a/GdbExecutor.h b/GdbExecutor.h index 4c816b3..4f4772c 100644 --- a/GdbExecutor.h +++ b/GdbExecutor.h @@ -85,7 +85,7 @@ class GdbExecutor : public IGdbExecutor bool CurveArcInvertNormal( const STRVECTOR& vsParams) ; bool CurveArcChangeRadius( const STRVECTOR& vsParams) ; bool CurveArcChangeDeltaN( const STRVECTOR& vsParams) ; - bool CurveArcToAdditional( const STRVECTOR& vsParams) ; + bool CurveArcToExplementary( const STRVECTOR& vsParams) ; bool CurveArcFlip( const STRVECTOR& vsParams) ; bool ExecuteCurveBez( const std::string& sCmd2, const STRVECTOR& vsParams) ; bool ExecuteCurveCompo( const std::string& sCmd2, const STRVECTOR& vsParams) ; diff --git a/GeoConst.h b/GeoConst.h index 24fcce2..9ef5425 100644 --- a/GeoConst.h +++ b/GeoConst.h @@ -17,7 +17,7 @@ //----------------- Costanti generali ---------------------------------------- #include "/EgtDev/Include/EGkGeoConst.h" -//----------------- Costanti per approssimazioni con polilinee --------------- +//----------- Costanti per approssimazioni con polilinee o poliarchi -------- // tolleranza lineare minima in approssimazioni lineari const double LIN_TOL_MIN = 0.001 ; // deviazione angolare minima (in gradi) in approssimazioni lineari @@ -32,6 +32,8 @@ const double ANG_TOL_APPROX_DEG = 45 ; const double LIN_TOL_STD = 0.1 ; // deviazione angolare standard (in gradi) const double ANG_TOL_STD_DEG = 15 ; +// lunghezza minima feature lineare +const double LIN_FEA_LEN_STD = 20 ; //----------------- Costanti per archi come curve di Bezier ------------------ // massimo angolo al centro di un arco espresso tramite curva di Bezier diff --git a/PointGrid3d.cpp b/PointGrid3d.cpp index 4f23c55..d63428a 100644 --- a/PointGrid3d.cpp +++ b/PointGrid3d.cpp @@ -274,7 +274,7 @@ PointGrid3d::FindNearest( const Point3d& ptTest, INTVECTOR& vnIds) bool bFound = false ; double dMinDist ; double dSqMinDist ; - for ( int m = 0 ; m < nMaxSteps ; ++ m) { + for ( int m = 0 ; m <= nMaxSteps ; ++ m) { // determino il range di celle sui tre assi IBox iBox ; if ( ! Get3dRangeNbr( ptTest, dRad, iBox))