Curve Style : Add support for curve fitting for non-solid line styles

This commit is contained in:
Magne Sjaastad 2022-04-20 14:25:47 +02:00 committed by GitHub
parent 3a461473d0
commit 87b822a80f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 83 additions and 23 deletions

View File

@ -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 );
}
//--------------------------------------------------------------------------------------------------

View File

@ -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();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -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<int> m_curveThickness;
caf::PdmField<float> m_symbolSkipPixelDistance;
caf::PdmField<float> m_curveFittingTolerance;
caf::PdmField<PointSymbol> m_pointSymbol;
caf::PdmField<LineStyle> m_lineStyle;
caf::PdmField<FillStyle> m_fillStyle;

View File

@ -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<double>& xValues, const std::vector<double>& yValues ) = 0;

View File

@ -581,6 +581,14 @@ RiuPlotCurveSymbol* RiuQtChartsPlotCurve::createSymbol( RiuPlotCurveSymbol::Poin
return new RiuQtChartsPlotCurveSymbol( symbol );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuQtChartsPlotCurve::setCurveFittingTolerance( double tolerance )
{
// Not supported
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -80,6 +80,7 @@ public:
void updateLineAndAreaSeries();
RiuPlotCurveSymbol* createSymbol( RiuPlotCurveSymbol::PointSymbolEnum symbol ) const override;
void setCurveFittingTolerance( double tolerance ) override;
void updateScatterSeries();

View File

@ -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 <cmath>
#include <limits>
@ -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<QwtWeedingCurveFitter*>( curveFitter() );
if ( !cf )
{
cf = new QwtWeedingCurveFitter;
setCurveFitter( cf );
}
setCurveAttribute( QwtPlotCurve::Fitted, true );
cf->setTolerance( tolerance );
}
}

View File

@ -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,

2
ThirdParty/qwt vendored

@ -1 +1 @@
Subproject commit a7272f8e852d2e5113f58fb5d1f50946330bf68b
Subproject commit 886436d42226eb2f978735717da03d4e1a912d55