diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp index ee8b662b0b..11e19d67cb 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp @@ -403,7 +403,7 @@ bool RifReaderEclipseOutput::open(const QString& fileName, RigEclipseCaseData* e } { - auto task = progress.task("Reading faults", 10); + auto task = progress.task("Reading faults", 5); if (isFaultImportEnabled()) { @@ -417,9 +417,9 @@ bool RifReaderEclipseOutput::open(const QString& fileName, RigEclipseCaseData* e } { - auto task = progress.task("Reading EQUIL", 10); + auto task = progress.task("Reading EQUIL", 5); - importEquilData(fileSet); + importEquilData(fileSet, eclipseCase); } m_eclipseCase = eclipseCase; @@ -632,7 +632,7 @@ void RifReaderEclipseOutput::importFaults(const QStringList& fileSet, cvf::Colle //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifReaderEclipseOutput::importEquilData(const QStringList& fileSet) +void RifReaderEclipseOutput::importEquilData(const QStringList& fileSet, RigEclipseCaseData* eclipseCase) { QString dataFileName; @@ -675,7 +675,7 @@ void RifReaderEclipseOutput::importEquilData(const QStringList& fileSet) equilItems.push_back(equilRec); } - m_eclipseCase->setEquilData(equilItems); + eclipseCase->setEquilData(equilItems); } } } diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.h b/ApplicationCode/FileInterface/RifReaderEclipseOutput.h index 9a1504f691..a3a0696e39 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.h +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.h @@ -80,7 +80,7 @@ private: RigWellResultPoint createWellResultPoint(const RigGridBase* grid, const well_conn_type* ert_connection, int ertBranchId, int ertSegmentId, const char* wellName); void importFaults(const QStringList& fileSet, cvf::Collection* faults); - void importEquilData(const QStringList& fileSet); + void importEquilData(const QStringList& fileSet, RigEclipseCaseData* eclipseCase); void openInitFile(); diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp b/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp index d86c0f71ce..9402e9c8f3 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp @@ -18,6 +18,26 @@ #include "RimPlotAxisAnnotation.h" +#include "RigEclipseCaseData.h" +#include "RigEquil.h" + +#include "RimEclipseCase.h" +#include "RimRiuQwtPlotOwnerInterface.h" +#include "RimTools.h" +#include "RimViewWindow.h" + +namespace caf +{ +template<> +void RimPlotAxisAnnotation::ExportKeywordEnum::setUp() +{ + addItem(RimPlotAxisAnnotation::PL_USER_DEFINED, "User Defined", "User Defined"); + addItem(RimPlotAxisAnnotation::PL_EQUIL_WATER_OIL_CONTACT, "PL_EQUIL_WATER_OIL_CONTACT", "PL_EQUIL_WATER_OIL_CONTACT"); + addItem(RimPlotAxisAnnotation::PL_EQUIL_GAS_OIL_CONTACT, "PL_EQUIL_GAS_OIL_CONTACT", "PL_EQUIL_GAS_OIL_CONTACT"); + setDefault(RimPlotAxisAnnotation::PL_USER_DEFINED); +} +} // namespace caf + CAF_PDM_SOURCE_INIT(RimPlotAxisAnnotation, "RimPlotAxisAnnotation"); //-------------------------------------------------------------------------------------------------- @@ -32,6 +52,11 @@ RimPlotAxisAnnotation::RimPlotAxisAnnotation() CAF_PDM_InitFieldNoDefault(&m_name, "Name", "Name", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_value, "Value", "Value", "", "", ""); + + CAF_PDM_InitFieldNoDefault(&m_annotationType, "AnnotationType", "AnnotationType", "", "", ""); + + CAF_PDM_InitFieldNoDefault(&m_sourceCase, "Associated3DCase", "Eclipse Case", "", "", ""); + CAF_PDM_InitFieldNoDefault(&m_equilNum, "m_equilNum", "equil Num", "", "", ""); } //-------------------------------------------------------------------------------------------------- @@ -55,6 +80,17 @@ void RimPlotAxisAnnotation::setValue(double value) //-------------------------------------------------------------------------------------------------- QString RimPlotAxisAnnotation::name() const { + if (m_annotationType() == PL_EQUIL_WATER_OIL_CONTACT) + { + QString text = QString("WOC %1").arg(value()); + return text; + } + else if (m_annotationType() == PL_EQUIL_GAS_OIL_CONTACT) + { + QString text = QString("GOC %1").arg(value()); + return text; + } + return m_name(); } @@ -63,6 +99,15 @@ QString RimPlotAxisAnnotation::name() const //-------------------------------------------------------------------------------------------------- double RimPlotAxisAnnotation::value() const { + if (m_annotationType() == PL_EQUIL_WATER_OIL_CONTACT) + { + return selectedItem().waterOilContactDepth(); + } + else if (m_annotationType() == PL_EQUIL_GAS_OIL_CONTACT) + { + return selectedItem().gasOilContactDepth(); + } + return m_value(); } @@ -81,3 +126,100 @@ caf::PdmFieldHandle* RimPlotAxisAnnotation::objectToggleField() { return &m_isActive; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotAxisAnnotation::fieldChangedByUi(const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue) +{ + /* + RimViewWindow* viewWindow = nullptr; + this->firstAncestorOrThisOfType(viewWindow); + if (viewWindow) + { + viewWindow->loadDataAndUpdate(); + } + */ + RimRiuQwtPlotOwnerInterface* parentPlot = nullptr; + this->firstAncestorOrThisOfType(parentPlot); + if (parentPlot) + { + parentPlot->updateAxisDisplay(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimPlotAxisAnnotation::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly) +{ + QList options; + + if (fieldNeedingOptions == &m_sourceCase) + { + RimTools::caseOptionItems(&options); + } + else if (fieldNeedingOptions == &m_equilNum) + { + for (const auto& eq : equilItems()) + { + QString uiText = QString("%1").arg(eq.liveOilInitConstantRs()); + options.push_back(caf::PdmOptionItemInfo(uiText, eq.liveOilInitConstantRs())); + } + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotAxisAnnotation::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) +{ + uiOrdering.add(&m_annotationType); + + if (m_annotationType() == PL_USER_DEFINED) + { + uiOrdering.add(&m_name); + uiOrdering.add(&m_value); + } + else + { + uiOrdering.add(&m_sourceCase); + uiOrdering.add(&m_equilNum); + } + + uiOrdering.skipRemainingFields(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigEquil RimPlotAxisAnnotation::selectedItem() const +{ + for (auto eq : equilItems()) + { + if (eq.liveOilInitConstantRs() == m_equilNum()) + { + return eq; + } + } + + return RigEquil::defaultObject(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimPlotAxisAnnotation::equilItems() const +{ + if (m_sourceCase && m_sourceCase->eclipseCaseData()) + { + return m_sourceCase->eclipseCaseData()->equilData(); + } + + return std::vector(); +} diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.h b/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.h index 3200558479..834b05d37d 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.h +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.h @@ -21,9 +21,13 @@ #include "cafAppEnum.h" #include "cafPdmField.h" #include "cafPdmObject.h" +#include "cafPdmPtrField.h" #include +class RimEclipseCase; +class RigEquil; + //================================================================================================== /// /// @@ -33,20 +37,45 @@ class RimPlotAxisAnnotation : public caf::PdmObject CAF_PDM_HEADER_INIT; public: + enum PlotAxisAnnotationType + { + PL_USER_DEFINED, + PL_EQUIL_WATER_OIL_CONTACT, + PL_EQUIL_GAS_OIL_CONTACT + }; + typedef caf::AppEnum ExportKeywordEnum; + RimPlotAxisAnnotation(); void setName(const QString& name); void setValue(double value); QString name() const; - double value() const; + double value() const; caf::PdmFieldHandle* userDescriptionField() override; caf::PdmFieldHandle* objectToggleField() override; -private: - caf::PdmField m_isActive; + void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; + QList calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly) override; + +protected: + virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; + +private: + RigEquil selectedItem() const; + std::vector equilItems() const; + +private: + caf::PdmField m_annotationType; + + caf::PdmField m_isActive; caf::PdmField m_name; - caf::PdmField m_value; + caf::PdmField m_value; + + caf::PdmPtrField m_sourceCase; + caf::PdmField m_equilNum; + }; diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp index 645633c916..186b01c7cc 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisProperties.cpp @@ -95,6 +95,7 @@ RimPlotAxisProperties::RimPlotAxisProperties() m_annotations.uiCapability()->setUiHidden(true); m_annotations.push_back(new RimPlotAxisAnnotation); + m_annotations.push_back(new RimPlotAxisAnnotation); updateOptionSensitivity(); } diff --git a/ApplicationCode/ReservoirDataModel/RigEquil.cpp b/ApplicationCode/ReservoirDataModel/RigEquil.cpp index 2866b5b1f2..b2e6bf5b62 100644 --- a/ApplicationCode/ReservoirDataModel/RigEquil.cpp +++ b/ApplicationCode/ReservoirDataModel/RigEquil.cpp @@ -29,8 +29,8 @@ RigEquil::RigEquil(double datumDepth, double waterOilContactCapillaryPressure, double gasOilContactDepth, double gasOilContactCapillaryPressure, - bool liveOilInitConstantRs, - bool wetGasInitConstantRv, + int liveOilInitConstantRs, + int wetGasInitConstantRv, int initializationTargetAccuracy) : datum_depth(datumDepth) , datum_depth_ps(datumDepthPressure) @@ -74,12 +74,12 @@ double RigEquil::gasOilContactCapillaryPressure() const return this->gas_oil_contact_capillary_pressure; } -bool RigEquil::liveOilInitConstantRs() const +int RigEquil::liveOilInitConstantRs() const { return this->live_oil_init_proc; } -bool RigEquil::wetGasInitConstantRv() const +int RigEquil::wetGasInitConstantRv() const { return this->wet_gas_init_proc; } @@ -89,6 +89,32 @@ int RigEquil::initializationTargetAccuracy() const return this->init_target_accuracy; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigEquil RigEquil::defaultObject() +{ + double datumDepth = 0.0; + double datuDepthPressure = 0.0; + double waterOilContactDepth = 0.0; + double waterOilContactCapillaryPressure = 0.0; + double gasOilContactDepth = 0.0; + double gasOilContactCapillaryPressure = 0.0; + int liveOilInitConstantRs = -1; + int wetGasInitConstantRv = -1; + int initializationTargetAccuracy = -5; + + return RigEquil(datumDepth, + datuDepthPressure, + waterOilContactDepth, + waterOilContactCapillaryPressure, + gasOilContactDepth, + gasOilContactCapillaryPressure, + liveOilInitConstantRs, + wetGasInitConstantRv, + initializationTargetAccuracy); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -100,8 +126,8 @@ RigEquil RigEquil::parseString(const QString& keywordData) double waterOilContactCapillaryPressure = 0.0; double gasOilContactDepth = 0.0; double gasOilContactCapillaryPressure = 0.0; - bool liveOilInitConstantRs = false; - bool wetGasInitConstantRv = false; + int liveOilInitConstantRs = 0; + int wetGasInitConstantRv = 0; int initializationTargetAccuracy = -5; QString line(keywordData); @@ -135,11 +161,11 @@ RigEquil RigEquil::parseString(const QString& keywordData) } if (items.size() > 6) { - liveOilInitConstantRs = items.at(6).toInt() > 0 ? true : false; + liveOilInitConstantRs = items.at(6).toInt(); } if (items.size() > 7) { - wetGasInitConstantRv = items.at(7).toInt() > 0 ? true : false; + wetGasInitConstantRv = items.at(7).toInt(); } if (items.size() > 8) { diff --git a/ApplicationCode/ReservoirDataModel/RigEquil.h b/ApplicationCode/ReservoirDataModel/RigEquil.h index 6a955ca433..69a11f061b 100644 --- a/ApplicationCode/ReservoirDataModel/RigEquil.h +++ b/ApplicationCode/ReservoirDataModel/RigEquil.h @@ -34,8 +34,8 @@ public: double waterOilContactCapillaryPressure, double gasOilContactDepth, double gasOilContactCapillaryPressure, - bool liveOilInitConstantRs, - bool wetGasInitConstantRv, + int liveOilInitConstantRs, + int wetGasInitConstantRv, int initializationTargetAccuracy); double datumDepth() const; @@ -45,10 +45,11 @@ public: double gasOilContactDepth() const; double gasOilContactCapillaryPressure() const; - bool liveOilInitConstantRs() const; - bool wetGasInitConstantRv() const; - int initializationTargetAccuracy() const; + int liveOilInitConstantRs() const; + int wetGasInitConstantRv() const; + int initializationTargetAccuracy() const; + static RigEquil defaultObject(); static RigEquil parseString(const QString& keywordData); private: @@ -59,7 +60,7 @@ private: double gas_oil_contact_depth; double gas_oil_contact_capillary_pressure; - bool live_oil_init_proc; - bool wet_gas_init_proc; - int init_target_accuracy; + int live_oil_init_proc; + int wet_gas_init_proc; + int init_target_accuracy; };