#969, #2240 Summary curve axis. New fields, scaleFactor and numberOfDigits

This commit is contained in:
Bjørn Erik Jensen 2017-12-11 11:37:31 +01:00
parent 09c09a7386
commit ca91409002
3 changed files with 77 additions and 28 deletions

View File

@ -21,6 +21,10 @@
#include "RimSummaryPlot.h" #include "RimSummaryPlot.h"
#include "RiaDefines.h" #include "RiaDefines.h"
#include "cafPdmUiSliderEditor.h"
#include <cmath>
namespace caf namespace caf
{ {
@ -72,6 +76,11 @@ RimSummaryAxisProperties::RimSummaryAxisProperties()
CAF_PDM_InitField(&visibleRangeMin, "VisibleRangeMin", RiaDefines::minimumDefaultValuePlot(), "Min", "", "", ""); CAF_PDM_InitField(&visibleRangeMin, "VisibleRangeMin", RiaDefines::minimumDefaultValuePlot(), "Min", "", "", "");
CAF_PDM_InitFieldNoDefault(&numberFormat, "NumberFormat", "Number Format", "", "", ""); CAF_PDM_InitFieldNoDefault(&numberFormat, "NumberFormat", "Number Format", "", "", "");
CAF_PDM_InitField(&numberOfDecimals, "Decimals", 2, "Number of Decimals", "", "", "");
CAF_PDM_InitField(&scaleFactor, "ScaleFactor", 1.0, "Scale Factor", "", "", "");
numberOfDecimals.uiCapability()->setUiEditorTypeName(caf::PdmUiSliderEditor::uiEditorTypeName());
CAF_PDM_InitField(&isLogarithmicScaleEnabled, "LogarithmicScale", false, "Logarithmic Scale", "", "", ""); CAF_PDM_InitField(&isLogarithmicScaleEnabled, "LogarithmicScale", false, "Logarithmic Scale", "", "", "");
@ -109,6 +118,18 @@ QList<caf::PdmOptionItemInfo> RimSummaryAxisProperties::calculateValueOptions(co
options.push_back(caf::PdmOptionItemInfo(text, value)); options.push_back(caf::PdmOptionItemInfo(text, value));
} }
} }
else if (fieldNeedingOptions == &scaleFactor)
{
for (int exp = -12; exp <= 12; exp += 3)
{
QString uiText =
exp == 0 ? "1" :
QString("10 ^ %1").arg(exp);
double value = std::pow(10, exp);
options.push_back(caf::PdmOptionItemInfo(uiText, value));
}
}
return options; return options;
} }
@ -127,9 +148,17 @@ void RimSummaryAxisProperties::defineUiOrdering(QString uiConfigName, caf::PdmUi
caf::PdmUiGroup& scaleGroup = *(uiOrdering.addNewGroup("Axis Values")); caf::PdmUiGroup& scaleGroup = *(uiOrdering.addNewGroup("Axis Values"));
scaleGroup.add(&isLogarithmicScaleEnabled); scaleGroup.add(&isLogarithmicScaleEnabled);
scaleGroup.add(&numberFormat); scaleGroup.add(&numberFormat);
if (numberFormat() != NUMBER_FORMAT_AUTO)
{
scaleGroup.add(&numberOfDecimals);
scaleGroup.add(&scaleFactor);
}
scaleGroup.add(&visibleRangeMin); scaleGroup.add(&visibleRangeMin);
scaleGroup.add(&visibleRangeMax); scaleGroup.add(&visibleRangeMax);
uiOrdering.skipRemainingFields(true);
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -70,6 +70,8 @@ public:
caf::PdmField<double> visibleRangeMax; caf::PdmField<double> visibleRangeMax;
caf::PdmField< caf::AppEnum< NumberFormatType > > numberFormat; caf::PdmField< caf::AppEnum< NumberFormatType > > numberFormat;
caf::PdmField<int> numberOfDecimals;
caf::PdmField<double> scaleFactor;
caf::PdmField<bool> isLogarithmicScaleEnabled; caf::PdmField<bool> isLogarithmicScaleEnabled;

View File

@ -46,51 +46,58 @@
class DecimalScaleDraw : public QwtScaleDraw class DecimalScaleDraw : public QwtScaleDraw
{ {
public: public:
DecimalScaleDraw(double scaleFactor, int numberOfDecimals)
{
m_scaleFactor = scaleFactor;
m_numberOfDecimals = numberOfDecimals;
}
virtual QwtText label(double value) const override virtual QwtText label(double value) const override
{ {
if (qFuzzyCompare(value + 1.0, 1.0)) if (qFuzzyCompare(scaledValue(value) + 1.0, 1.0))
value = 0.0; value = 0.0;
int precision = DecimalScaleDraw::calculatePrecision(value); return QString::number(scaledValue(value), 'f', m_numberOfDecimals);
return QString::number(value, 'f', precision);
} }
private: private:
static int calculatePrecision(double value) double scaledValue(double value) const
{ {
double absVal = fabs(value); return value / m_scaleFactor;
const int numberOfDigits = 2;
if (1e-16 < absVal && absVal < 1.0e3)
{
int logVal = static_cast<int>(log10(absVal));
int numDigitsAfterPoint = abs(logVal - numberOfDigits);
return numDigitsAfterPoint;
}
else
{
return numberOfDigits;
}
} }
};
double m_scaleFactor;
int m_numberOfDecimals;
};
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
class ScientificScaleDraw : public QwtScaleDraw class ScientificScaleDraw : public QwtScaleDraw
{ {
public: public:
ScientificScaleDraw(double scaleFactor, int numberOfDecimals)
{
m_scaleFactor = scaleFactor;
m_numberOfDecimals = numberOfDecimals;
}
virtual QwtText label(double value) const override virtual QwtText label(double value) const override
{ {
if (qFuzzyCompare(value + 1.0, 1.0)) if (qFuzzyCompare(scaledValue(value) + 1.0, 1.0))
value = 0.0; value = 0.0;
return QString::number(value, 'e', 2); return QString::number(scaledValue(value), 'e', m_numberOfDecimals);
} }
private:
double scaledValue(double value) const
{
return value / m_scaleFactor;
}
double m_scaleFactor;
int m_numberOfDecimals;
}; };
@ -108,7 +115,6 @@ RimSummaryPlotYAxisFormatter::RimSummaryPlotYAxisFormatter(RimSummaryAxisPropert
{ {
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -156,13 +162,14 @@ void RimSummaryPlotYAxisFormatter::applyYAxisPropertiesToPlot(RiuSummaryQwtPlot*
} }
else if (m_axisProperties->numberFormat == RimSummaryAxisProperties::NUMBER_FORMAT_DECIMAL) else if (m_axisProperties->numberFormat == RimSummaryAxisProperties::NUMBER_FORMAT_DECIMAL)
{ {
qwtPlot->setAxisScaleDraw(m_axisProperties->qwtPlotAxisType(), new DecimalScaleDraw); qwtPlot->setAxisScaleDraw(m_axisProperties->qwtPlotAxisType(),
new DecimalScaleDraw(m_axisProperties->scaleFactor(), m_axisProperties->numberOfDecimals()));
} }
else if (m_axisProperties->numberFormat == RimSummaryAxisProperties::NUMBER_FORMAT_SCIENTIFIC) else if (m_axisProperties->numberFormat == RimSummaryAxisProperties::NUMBER_FORMAT_SCIENTIFIC)
{ {
qwtPlot->setAxisScaleDraw(m_axisProperties->qwtPlotAxisType(), new ScientificScaleDraw()); qwtPlot->setAxisScaleDraw(m_axisProperties->qwtPlotAxisType(),
new ScientificScaleDraw(m_axisProperties->scaleFactor(), m_axisProperties->numberOfDecimals()));
} }
} }
{ {
@ -214,6 +221,17 @@ QString RimSummaryPlotYAxisFormatter::autoAxisTitle() const
} }
QString assembledYAxisText; QString assembledYAxisText;
QString scaleFactorText = "";
if (m_axisProperties->numberFormat() != RimSummaryAxisProperties::NUMBER_FORMAT_AUTO)
{
if (m_axisProperties->scaleFactor() != 1.0)
{
int exponent = std::log10(m_axisProperties->scaleFactor());
scaleFactorText = QString(" x 10<sup>%1</sup> ").arg(QString::number(exponent));
}
}
for ( auto unitIt : unitToQuantityNameMap ) for ( auto unitIt : unitToQuantityNameMap )
{ {
@ -221,7 +239,7 @@ QString RimSummaryPlotYAxisFormatter::autoAxisTitle() const
{ {
assembledYAxisText += QString::fromStdString(quantIt) + " "; assembledYAxisText += QString::fromStdString(quantIt) + " ";
} }
assembledYAxisText += "[" + QString::fromStdString(unitIt.first) + "] "; assembledYAxisText += "[" + QString::fromStdString(unitIt.first) + scaleFactorText + "] ";
} }
if (m_timeHistoryCurveQuantities.size() > 0) if (m_timeHistoryCurveQuantities.size() > 0)