From 87b822a80f873c799cdeb9d66cd5918456d92e1c Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 20 Apr 2022 14:25:47 +0200 Subject: [PATCH] Curve Style : Add support for curve fitting for non-solid line styles --- .../ProjectDataModel/RimPlotCurve.cpp | 7 +++ .../RimPlotCurveAppearance.cpp | 55 +++++++++++-------- .../ProjectDataModel/RimPlotCurveAppearance.h | 4 ++ .../UserInterface/RiuPlotCurve.h | 2 + .../UserInterface/RiuQtChartsPlotCurve.cpp | 8 +++ .../UserInterface/RiuQtChartsPlotCurve.h | 1 + .../UserInterface/RiuQwtPlotCurve.cpp | 25 +++++++++ .../UserInterface/RiuQwtPlotCurve.h | 2 + ThirdParty/qwt | 2 +- 9 files changed, 83 insertions(+), 23 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp index 19e34c3760..f5108e91c3 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp @@ -914,6 +914,13 @@ void RimPlotCurve::updateCurveAppearance() legendIconSize.setWidth( width ); m_plotCurve->setLegendIconSize( legendIconSize ); } + + double tolerance = 0.0; + if ( m_curveAppearance->lineStyle() != RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ) + { + tolerance = m_curveAppearance->curveFittingTolerance(); + } + m_plotCurve->setCurveFittingTolerance( tolerance ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.cpp index 62d84becd4..08e96ad8fe 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.cpp @@ -106,6 +106,13 @@ RimPlotCurveAppearance::RimPlotCurveAppearance() "Minimum pixel distance between symbols", "" ); + CAF_PDM_InitField( &m_curveFittingTolerance, + "CurveFittingTolerance", + 1.0f, + "Curve Fitting Tolerance", + "", + "Value above 0 : Curve fitting tolerance (default 1.0), 0 : disable curve fitting" ); + CAF_PDM_InitFieldNoDefault( &m_symbolLabel, "SymbolLabel", "Symbol Label" ); CAF_PDM_InitField( &m_symbolSize, "SymbolSize", 6, "Symbol Size" ); @@ -126,30 +133,23 @@ void RimPlotCurveAppearance::fieldChangedByUi( const caf::PdmFieldHandle* change const QVariant& oldValue, const QVariant& newValue ) { - if ( &m_curveColor == changedField || &m_curveThickness == changedField || &m_pointSymbol == changedField || - &m_lineStyle == changedField || &m_symbolSkipPixelDistance == changedField || - &m_curveInterpolation == changedField || &m_symbolSize == changedField || &m_symbolEdgeColor == changedField || - &m_fillStyle == changedField || &m_fillColor == changedField ) + if ( &m_pointSymbol == changedField ) { - if ( &m_pointSymbol == changedField ) - { - m_symbolSize.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuPlotCurveSymbol::SYMBOL_NONE ); - m_symbolSkipPixelDistance.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuPlotCurveSymbol::SYMBOL_NONE ); - } - else if ( &m_lineStyle == changedField ) - { - m_curveThickness.uiCapability()->setUiReadOnly( m_lineStyle() == - RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); - m_curveInterpolation.uiCapability()->setUiReadOnly( m_lineStyle() == - RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); - } - else if ( &m_fillColor == changedField ) - { - fillColorChanged.send(); - } - - appearanceChanged.send(); + m_symbolSize.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuPlotCurveSymbol::SYMBOL_NONE ); + m_symbolSkipPixelDistance.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuPlotCurveSymbol::SYMBOL_NONE ); } + else if ( &m_lineStyle == changedField ) + { + m_curveThickness.uiCapability()->setUiReadOnly( m_lineStyle() == RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + m_curveInterpolation.uiCapability()->setUiReadOnly( m_lineStyle() == + RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + } + else if ( &m_fillColor == changedField ) + { + fillColorChanged.send(); + } + + appearanceChanged.send(); } //-------------------------------------------------------------------------------------------------- @@ -198,6 +198,9 @@ void RimPlotCurveAppearance::defineUiOrdering( QString uiConfigName, caf::PdmUiO uiOrdering.add( &m_lineStyle ); uiOrdering.add( &m_curveThickness ); + uiOrdering.add( &m_curveFittingTolerance ); + m_curveFittingTolerance.uiCapability()->setUiReadOnly( m_lineStyle() == + RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); uiOrdering.add( &m_fillStyle ); m_fillStyle.uiCapability()->setUiHidden( !m_fillOptionsVisible ); @@ -422,6 +425,14 @@ cvf::Color3f RimPlotCurveAppearance::fillColor() const return m_fillColor; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +float RimPlotCurveAppearance::curveFittingTolerance() const +{ + return m_curveFittingTolerance(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h index 1159649f2e..f251c52c92 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h @@ -84,6 +84,8 @@ public: void setFillColor( const cvf::Color3f& fillColor ); cvf::Color3f fillColor() const; + float curveFittingTolerance() const; + void setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum ); RiuQwtPlotCurveDefines::CurveInterpolationEnum interpolation() const; @@ -109,6 +111,8 @@ protected: caf::PdmField m_curveThickness; caf::PdmField m_symbolSkipPixelDistance; + caf::PdmField m_curveFittingTolerance; + caf::PdmField m_pointSymbol; caf::PdmField m_lineStyle; caf::PdmField m_fillStyle; diff --git a/ApplicationLibCode/UserInterface/RiuPlotCurve.h b/ApplicationLibCode/UserInterface/RiuPlotCurve.h index f770b52fa4..44cca14c3a 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotCurve.h +++ b/ApplicationLibCode/UserInterface/RiuPlotCurve.h @@ -129,6 +129,8 @@ public: virtual RiuPlotCurveSymbol* createSymbol( RiuPlotCurveSymbol::PointSymbolEnum symbol ) const = 0; + virtual void setCurveFittingTolerance( double tolerance ) = 0; + protected: virtual void setSamplesInPlot( const std::vector& xValues, const std::vector& yValues ) = 0; diff --git a/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp b/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp index 8faf157f69..aeb5ba98aa 100644 --- a/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp +++ b/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.cpp @@ -581,6 +581,14 @@ RiuPlotCurveSymbol* RiuQtChartsPlotCurve::createSymbol( RiuPlotCurveSymbol::Poin return new RiuQtChartsPlotCurveSymbol( symbol ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQtChartsPlotCurve::setCurveFittingTolerance( double tolerance ) +{ + // Not supported +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.h b/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.h index d42e86192e..e312a35deb 100644 --- a/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.h +++ b/ApplicationLibCode/UserInterface/RiuQtChartsPlotCurve.h @@ -80,6 +80,7 @@ public: void updateLineAndAreaSeries(); RiuPlotCurveSymbol* createSymbol( RiuPlotCurveSymbol::PointSymbolEnum symbol ) const override; + void setCurveFittingTolerance( double tolerance ) override; void updateScatterSeries(); diff --git a/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.cpp b/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.cpp index fa7782ec86..29954f5cc0 100644 --- a/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.cpp +++ b/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.cpp @@ -35,6 +35,7 @@ #include "qwt_point_mapper.h" #include "qwt_scale_map.h" #include "qwt_symbol.h" +#include "qwt_weeding_curve_fitter.h" #include #include @@ -520,3 +521,27 @@ RiuPlotCurveSymbol* RiuQwtPlotCurve::createSymbol( RiuPlotCurveSymbol::PointSymb { return new RiuQwtSymbol( symbol ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuQwtPlotCurve::setCurveFittingTolerance( double tolerance ) +{ + bool enableCurveFitting = ( tolerance > 0.0 ); + if ( !enableCurveFitting ) + { + setCurveAttribute( QwtPlotCurve::Fitted, false ); + } + else + { + auto cf = dynamic_cast( curveFitter() ); + if ( !cf ) + { + cf = new QwtWeedingCurveFitter; + setCurveFitter( cf ); + } + setCurveAttribute( QwtPlotCurve::Fitted, true ); + + cf->setTolerance( tolerance ); + } +} diff --git a/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.h b/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.h index 1bf1e5b673..5654fe4d57 100644 --- a/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.h +++ b/ApplicationLibCode/UserInterface/RiuQwtPlotCurve.h @@ -81,6 +81,8 @@ public: void setSymbol( RiuPlotCurveSymbol* symbol ) override; RiuPlotCurveSymbol* createSymbol( RiuPlotCurveSymbol::PointSymbolEnum symbol ) const override; + void setCurveFittingTolerance( double tolerance ) override; + protected: void drawCurve( QPainter* p, int style, diff --git a/ThirdParty/qwt b/ThirdParty/qwt index a7272f8e85..886436d422 160000 --- a/ThirdParty/qwt +++ b/ThirdParty/qwt @@ -1 +1 @@ -Subproject commit a7272f8e852d2e5113f58fb5d1f50946330bf68b +Subproject commit 886436d42226eb2f978735717da03d4e1a912d55