diff --git a/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.cpp b/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.cpp index 4157ee7df9..9d920eebd1 100644 --- a/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.cpp +++ b/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.cpp @@ -48,6 +48,8 @@ cvf::ref const cvf::BoundingBox& wellPathClipBoundingBox, const std::vector& resultValues, const std::vector& resultMds, + double minResultValue, + double maxResultValue, double planeAngle, double planeOffsetFromWellPathCenter, double planeWidth) const @@ -57,6 +59,8 @@ cvf::ref createCurveVerticesAndIndices(resultValues, resultMds, + minResultValue, + maxResultValue, planeAngle, planeOffsetFromWellPathCenter, planeWidth, @@ -89,6 +93,8 @@ cvf::ref //-------------------------------------------------------------------------------------------------- void Riv3dWellLogCurveGeometryGenerator::createCurveVerticesAndIndices(const std::vector& resultValues, const std::vector& resultMds, + double minResultValue, + double maxResultValue, double planeAngle, double planeOffsetFromWellPathCenter, double planeWidth, @@ -104,6 +110,11 @@ void Riv3dWellLogCurveGeometryGenerator::createCurveVerticesAndIndices(const std if (resultValues.empty()) return; CVF_ASSERT(resultValues.size() == resultMds.size()); + if (maxResultValue - minResultValue < 1.0e-6) + { + return; + } + RimWellPathCollection* wellPathCollection = nullptr; m_wellPath->firstAncestorOrThisOfTypeAsserted(wellPathCollection); @@ -145,20 +156,27 @@ void Riv3dWellLogCurveGeometryGenerator::createCurveVerticesAndIndices(const std std::vector resultValuesForInterpolatedPoints(resultValues.end() - interpolatedWellPathPoints.size(), resultValues.end()); - double maxResult = -HUGE_VAL; - double minResult = HUGE_VAL; + double maxClampedResult = -HUGE_VAL; + double minClampedResult = HUGE_VAL; - for (double result : resultValuesForInterpolatedPoints) + for (double& result : resultValuesForInterpolatedPoints) { if (!RigCurveDataTools::isValidValue(result, false)) continue; - maxResult = std::max(result, maxResult); - minResult = std::min(result, minResult); + result = cvf::Math::clamp(result, minResultValue, maxResultValue); + + maxClampedResult = std::max(result, maxClampedResult); + minClampedResult = std::min(result, minClampedResult); + } + + if (minClampedResult >= maxClampedResult) + { + return; } vertices->resize(interpolatedWellPathPoints.size()); - double plotRangeToResultRangeFactor = planeWidth / (maxResult - minResult); + double plotRangeToResultRangeFactor = planeWidth / (maxClampedResult - minClampedResult); for (size_t i = 0; i < interpolatedCurveNormals.size(); i++) { @@ -167,7 +185,7 @@ void Riv3dWellLogCurveGeometryGenerator::createCurveVerticesAndIndices(const std if (RigCurveDataTools::isValidValue(resultValuesForInterpolatedPoints[i], false)) { scaledResult = - planeOffsetFromWellPathCenter + (resultValuesForInterpolatedPoints[i] - minResult) * plotRangeToResultRangeFactor; + planeOffsetFromWellPathCenter + (resultValuesForInterpolatedPoints[i] - minClampedResult) * plotRangeToResultRangeFactor; } (*vertices)[i] = cvf::Vec3f(interpolatedWellPathPoints[i] + scaledResult * interpolatedCurveNormals[i]); diff --git a/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.h b/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.h index bc4c90a733..eaa2df0404 100644 --- a/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.h +++ b/ApplicationCode/ModelVisualization/Riv3dWellLogCurveGeomertyGenerator.h @@ -51,10 +51,14 @@ public: const std::vector& resultMds, double planeAngle, double planeOffsetFromWellPathCenter, - double planeWidth) const; + double planeWidth, + double minResultValue, + double maxResultValue) const; private: void createCurveVerticesAndIndices(const std::vector& resultValues, const std::vector& resultMds, + double minResultValue, + double maxResultValue, double planeAngle, double planeOffsetFromWellPathCenter, double planeWidth, diff --git a/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp b/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp index 8cccfe30d7..33f541ebc9 100644 --- a/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp +++ b/ApplicationCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp @@ -107,6 +107,8 @@ void Riv3dWellLogPlanePartMgr::append3dWellLogCurvesToModel(cvf::ModelBasicList* wellPathClipBoundingBox, resultValues, resultMds, + rim3dWellLogCurve->minCurveValue(), + rim3dWellLogCurve->maxCurveValue(), planeAngle(curveCollection, rim3dWellLogCurve), wellPathCenterToPlotStartOffset(curveCollection, rim3dWellLogCurve), planeWidth()); diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp index a668a297ac..75b3f2a0a5 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp @@ -18,9 +18,16 @@ #include "Rim3dWellLogCurve.h" +#include "RigCurveDataTools.h" + #include "Rim3dWellLogCurveCollection.h" #include "RimProject.h" +#include "cafPdmUiDoubleSliderEditor.h" + +#include +#include // Needed for HUGE_VAL on Linux + //================================================================================================== /// /// @@ -45,11 +52,17 @@ namespace caf /// //-------------------------------------------------------------------------------------------------- Rim3dWellLogCurve::Rim3dWellLogCurve() + : m_minCurveDataValue(-HUGE_VAL) + , m_maxCurveDataValue(HUGE_VAL) { CAF_PDM_InitObject("3d Well Log Curve", ":/WellLogCurve16x16.png", "", ""); CAF_PDM_InitField(&m_showCurve, "Show3dWellLogCurve", true, "Show 3d Well Log Curve", "", "", ""); m_showCurve.uiCapability()->setUiHidden(true); + CAF_PDM_InitField(&m_minCurveValue, "MinCurveValue", -HUGE_VAL, "Minimum Curve Value", "", "Clip curve values below this.", ""); + CAF_PDM_InitField(&m_maxCurveValue, "MaxCurveValue", HUGE_VAL, "Maximum Curve Value", "", "Clip curve values above this.", ""); + m_minCurveValue.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); + m_maxCurveValue.uiCapability()->setUiEditorTypeName(caf::PdmUiDoubleSliderEditor::uiEditorTypeName()); CAF_PDM_InitField(&m_drawPlane, "DrawPlane", DrawPlaneEnum(VERTICAL_ABOVE), "Draw Plane", "", "", ""); CAF_PDM_InitField(&m_color, "CurveColor", cvf::Color3f(0.0f, 0.0f, 0.0f), "Curve Color", "", "", ""); @@ -106,6 +119,22 @@ void Rim3dWellLogCurve::setColor(const cvf::Color3f& color) m_color = color; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double Rim3dWellLogCurve::minCurveValue() const +{ + return m_minCurveValue(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double Rim3dWellLogCurve::maxCurveValue() const +{ + return m_maxCurveValue(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -147,6 +176,8 @@ void Rim3dWellLogCurve::configurationUiOrdering(caf::PdmUiOrdering& uiOrdering) caf::PdmUiGroup* configurationGroup = uiOrdering.addNewGroup("Curve Configuration"); configurationGroup->add(&m_drawPlane); configurationGroup->add(&m_color); + configurationGroup->add(&m_minCurveValue); + configurationGroup->add(&m_maxCurveValue); } QList Rim3dWellLogCurve::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) @@ -177,3 +208,66 @@ QList Rim3dWellLogCurve::calculateValueOptions(const caf } return options; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void Rim3dWellLogCurve::defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) +{ + caf::PdmUiDoubleSliderEditorAttribute* sliderAttribute = dynamic_cast(attribute); + if (sliderAttribute) + { + if (m_minCurveDataValue == -HUGE_VAL && + m_maxCurveDataValue == HUGE_VAL) + { + this->resetMinMaxValues(); + } + if (field == &m_minCurveValue) + { + sliderAttribute->m_minimum = m_minCurveDataValue; + sliderAttribute->m_maximum = m_maxCurveDataValue; + } + else if (field == &m_maxCurveValue) + { + sliderAttribute->m_minimum = m_minCurveDataValue; + sliderAttribute->m_maximum = m_maxCurveDataValue; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void Rim3dWellLogCurve::resetMinMaxValuesAndUpdateUI() +{ + this->resetMinMaxValues(); + this->updateConnectedEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void Rim3dWellLogCurve::resetMinMaxValues() +{ + std::vector values; + std::vector measuredDepths; + this->curveValuesAndMds(&values, &measuredDepths); + double foundMinValue = HUGE_VAL; + double foundMaxValue = -HUGE_VAL; + for (double value : values) + { + if (RigCurveDataTools::isValidValue(value, false)) + { + foundMinValue = std::min(foundMinValue, value); + foundMaxValue = std::max(foundMaxValue, value); + } + } + + // Update data boundaries + m_minCurveDataValue = foundMinValue; + m_maxCurveDataValue = foundMaxValue; + + // Update selected GUI boundaries + m_minCurveValue = m_minCurveDataValue; + m_maxCurveValue = m_maxCurveDataValue; +} diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h index e12ebe3e2c..2702a3289a 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h +++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h @@ -54,19 +54,29 @@ public: virtual void curveValuesAndMds(std::vector* values, std::vector* measuredDepthValues) const = 0; void setColor(const cvf::Color3f& color); + + double minCurveValue() const; + double maxCurveValue() const; + void resetMinMaxValuesAndUpdateUI(); protected: virtual caf::PdmFieldHandle* objectToggleField() override; virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; virtual caf::PdmFieldHandle* userDescriptionField() override; void configurationUiOrdering(caf::PdmUiOrdering& uiOrdering); virtual QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) override; - + virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute); +private: + void resetMinMaxValues(); protected: caf::PdmField m_name; caf::PdmField> m_drawPlane; caf::PdmField m_color; - + caf::PdmField m_minCurveValue; + caf::PdmField m_maxCurveValue; + double m_minCurveDataValue; + double m_maxCurveDataValue; private: caf::PdmField m_showCurve; + }; diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp index 7458ca7872..c556075a34 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp @@ -96,6 +96,19 @@ void Rim3dWellLogFileCurve::curveValuesAndMds(std::vector* values, std:: } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void Rim3dWellLogFileCurve::fieldChangedByUi(const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue) +{ + if (changedField == &m_wellLogFile || changedField == &m_wellLogChannnelName) + { + this->resetMinMaxValuesAndUpdateUI(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h index b05f2fa4b1..502f9da1bd 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h +++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h @@ -41,6 +41,11 @@ public: void setDefaultFileCurveDataInfo(); virtual void curveValuesAndMds(std::vector* values, std::vector* measuredDepthValues) const override; +protected: + virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue) override; + private: virtual QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override; diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp index 33c50ce9a3..ef684ba127 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp +++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp @@ -76,6 +76,19 @@ void Rim3dWellLogRftCurve::curveValuesAndMds(std::vector* values, std::v *measuredDepthValues = curveData->measuredDepths(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void Rim3dWellLogRftCurve::fieldChangedByUi(const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue) +{ + if (changedField == &m_wellLogChannelName) + { + this->resetMinMaxValuesAndUpdateUI(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h index 638c573aa1..286fe072a4 100644 --- a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h +++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h @@ -44,6 +44,11 @@ public: virtual void curveValuesAndMds(std::vector* values, std::vector* measuredDepthValues) const override; +protected: + virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue) override; + private: virtual QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly) override; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp index 30e3821ca9..e92be876d5 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -342,6 +342,7 @@ void RimEclipseResultDefinition::updateAnyFieldHasChanged() this->firstAncestorOrThisOfType(rim3dWellLogCurve); if (rim3dWellLogCurve) { + rim3dWellLogCurve->resetMinMaxValuesAndUpdateUI(); rim3dWellLogCurve->updateConnectedEditors(); } }