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