mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#1842 RFT Plot. First visible RFT curve
This commit is contained in:
@@ -19,7 +19,6 @@
|
|||||||
#include "RiaDateStringParser.h"
|
#include "RiaDateStringParser.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
const std::string MONTH_NAMES[] =
|
const std::string MONTH_NAMES[] =
|
||||||
{
|
{
|
||||||
@@ -40,14 +39,15 @@ const std::string MONTH_NAMES[] =
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
QDate RiaDateStringParser::parseDateString(const std::string& dateString)
|
QDateTime RiaDateStringParser::parseDateString(const QString& dateString)
|
||||||
{
|
{
|
||||||
int year, month, day;
|
int year, month, day;
|
||||||
|
std::string s = dateString.toStdString();
|
||||||
bool parsedOk =
|
bool parsedOk =
|
||||||
tryParseYearFirst(dateString, year, month, day) ||
|
tryParseYearFirst(s, year, month, day) ||
|
||||||
tryParseDayFirst(dateString, year, month, day);
|
tryParseDayFirst(s, year, month, day);
|
||||||
|
|
||||||
return parsedOk ? QDate(year, month, day) : QDate();
|
return parsedOk ? QDateTime(QDate(year, month, day)) : QDateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -18,8 +18,9 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QDate>
|
#include <QDateTime>
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
//
|
//
|
||||||
@@ -29,7 +30,7 @@
|
|||||||
class RiaDateStringParser
|
class RiaDateStringParser
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static QDate parseDateString(const std::string& dateString);
|
static QDateTime parseDateString(const QString& dateString);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool tryParseYearFirst(const std::string& s, int& year, int& month, int& day);
|
static bool tryParseYearFirst(const std::string& s, int& year, int& month, int& day);
|
||||||
|
|||||||
@@ -53,6 +53,9 @@
|
|||||||
#include "SummaryPlotCommands/RicSummaryCurveCreatorUiKeywords.h"
|
#include "SummaryPlotCommands/RicSummaryCurveCreatorUiKeywords.h"
|
||||||
#include "cafPdmChildArrayField.h"
|
#include "cafPdmChildArrayField.h"
|
||||||
#include "RimWellRftAddress.h"
|
#include "RimWellRftAddress.h"
|
||||||
|
#include "RiaDateStringParser.h"
|
||||||
|
#include "RimTools.h"
|
||||||
|
#include "RimWellLogFileCurve.h"
|
||||||
|
|
||||||
CAF_PDM_SOURCE_INIT(RimWellRftPlot, "WellRftPlot");
|
CAF_PDM_SOURCE_INIT(RimWellRftPlot, "WellRftPlot");
|
||||||
|
|
||||||
@@ -160,11 +163,22 @@ void RimWellRftPlot::updateWidgetTitleWindowTitle()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimWellRftPlot::loadDataAndUpdatePlot()
|
void RimWellRftPlot::loadDataAndUpdatePlot()
|
||||||
{
|
{
|
||||||
auto wellLogFiles = getWellLogFilesWithPressure();
|
auto track = m_wellLogPlot->trackByIndex(0);
|
||||||
|
track->detachAllCurves();
|
||||||
|
|
||||||
for (const auto& wellLogFile : wellLogFiles)
|
for (const auto& selectedCurveDef : selectedCurveDefs())
|
||||||
{
|
{
|
||||||
|
auto wPath = wellPath(m_wellName, selectedCurveDef.second);
|
||||||
|
if (wPath != nullptr)
|
||||||
|
{
|
||||||
|
auto wellLogFile = wPath->wellLogFile();
|
||||||
|
auto pressureChannels = getPressureChannelsFromWellPath(wPath);
|
||||||
|
auto curve = new RimWellLogFileCurve();
|
||||||
|
track->addCurve(curve);
|
||||||
|
curve->setWellPath(wPath);
|
||||||
|
curve->setWellLogChannelName(pressureChannels.front()->name());
|
||||||
|
curve->loadDataAndUpdate(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,9 +194,9 @@ bool RimWellRftPlot::isPressureChannel(RimWellLogFileChannel* channel)
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::vector<RimWellLogFile*> RimWellRftPlot::getWellLogFilesWithPressure() const
|
std::vector<RimWellPath*> RimWellRftPlot::getWellPathsWithPressure(const QString& wellName) const
|
||||||
{
|
{
|
||||||
std::vector<RimWellLogFile*> wellLogFiles;
|
std::vector<RimWellPath*> wellPaths;
|
||||||
auto project = RiaApplication::instance()->project();
|
auto project = RiaApplication::instance()->project();
|
||||||
|
|
||||||
for (RimOilField* oilField : project->oilFields)
|
for (RimOilField* oilField : project->oilFields)
|
||||||
@@ -194,6 +208,8 @@ std::vector<RimWellLogFile*> RimWellRftPlot::getWellLogFilesWithPressure() const
|
|||||||
const auto& wellLogFile = wellPath->wellLogFile();
|
const auto& wellLogFile = wellPath->wellLogFile();
|
||||||
const auto& wellLogChannels = wellLogFile->wellLogChannelNames();
|
const auto& wellLogChannels = wellLogFile->wellLogChannelNames();
|
||||||
|
|
||||||
|
if (QString::compare(wellLogFile->wellName(), wellName) != 0) continue;
|
||||||
|
|
||||||
for (const auto& wellLogChannel : *wellLogChannels)
|
for (const auto& wellLogChannel : *wellLogChannels)
|
||||||
{
|
{
|
||||||
// Todo: add more criterias
|
// Todo: add more criterias
|
||||||
@@ -204,33 +220,86 @@ std::vector<RimWellLogFile*> RimWellRftPlot::getWellLogFilesWithPressure() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPressure)
|
if (hasPressure)
|
||||||
wellLogFiles.push_back(wellLogFile);
|
wellPaths.push_back(wellPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return wellLogFiles;
|
return wellPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::vector<RimWellLogFileChannel*> RimWellRftPlot::getPressureChannelsFromWellLogFile(const RimWellLogFile* wellLogFile) const
|
std::vector<RimWellLogFileChannel*> RimWellRftPlot::getPressureChannelsFromWellPath(const RimWellPath* wellPath) const
|
||||||
{
|
{
|
||||||
std::vector<RimWellLogFileChannel*> channels;
|
std::vector<RimWellLogFileChannel*> channels;
|
||||||
|
|
||||||
for (const auto& wellLogFile : getWellLogFilesWithPressure())
|
auto wellLogFile = wellPath->wellLogFile();
|
||||||
|
for (const auto& channel : wellLogFile->wellLogChannels())
|
||||||
{
|
{
|
||||||
for (const auto& channel : *wellLogFile->wellLogChannelNames())
|
// Todo: add more criterias
|
||||||
|
if (isPressureChannel(channel))
|
||||||
{
|
{
|
||||||
// Todo: add more criterias
|
channels.push_back(channel);
|
||||||
if (isPressureChannel(channel))
|
|
||||||
{
|
|
||||||
channels.push_back(channel);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return channels;
|
return channels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RimWellPath* RimWellRftPlot::wellPath(const QString& wellName, const QDateTime& date) const
|
||||||
|
{
|
||||||
|
auto wellPaths = getWellPathsWithPressure(wellName);
|
||||||
|
for (const auto& wellPath : wellPaths)
|
||||||
|
{
|
||||||
|
auto wellLogFile = wellPath->wellLogFile();
|
||||||
|
auto wName = wellLogFile->wellName();
|
||||||
|
auto wDate = RiaDateStringParser::parseDateString(wellLogFile->date());
|
||||||
|
if (wName == wellName && wDate == date)
|
||||||
|
{
|
||||||
|
return wellPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector < std::pair<RimWellRftAddress, QDateTime>> RimWellRftPlot::selectedCurveDefs() const
|
||||||
|
{
|
||||||
|
std::vector<std::pair<RimWellRftAddress, QDateTime>> curveDefs;
|
||||||
|
|
||||||
|
for (const auto& selectedDate : m_selectedTimeSteps())
|
||||||
|
{
|
||||||
|
for (const auto& rftAddr : m_selectedSources())
|
||||||
|
{
|
||||||
|
if (rftAddr.sourceType() == RftSourceType::RFT)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (rftAddr.sourceType() == RftSourceType::GRID)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (rftAddr.sourceType() == RftSourceType::OBSERVED)
|
||||||
|
{
|
||||||
|
auto wellPaths = getWellPathsWithPressure(m_wellName);
|
||||||
|
for (const auto& wellPath : wellPaths)
|
||||||
|
{
|
||||||
|
auto wellLogFile = wellPath->wellLogFile();
|
||||||
|
if (RiaDateStringParser::parseDateString(wellLogFile->date()) == selectedDate)
|
||||||
|
{
|
||||||
|
curveDefs.push_back(std::make_pair(rftAddr, selectedDate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return curveDefs;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -288,10 +357,10 @@ QList<caf::PdmOptionItemInfo> RimWellRftPlot::calculateValueOptions(const caf::P
|
|||||||
|
|
||||||
options.push_back(caf::PdmOptionItemInfo::createHeader(RimWellRftAddress::sourceTypeUiText(RftSourceType::GRID), true));
|
options.push_back(caf::PdmOptionItemInfo::createHeader(RimWellRftAddress::sourceTypeUiText(RftSourceType::GRID), true));
|
||||||
|
|
||||||
options.push_back(caf::PdmOptionItemInfo("Test", "Test"));
|
options.push_back(caf::PdmOptionItemInfo("Dummy", "Dummy"));
|
||||||
|
|
||||||
options.push_back(caf::PdmOptionItemInfo::createHeader(RimWellRftAddress::sourceTypeUiText(RftSourceType::OBSERVED), true));
|
options.push_back(caf::PdmOptionItemInfo::createHeader(RimWellRftAddress::sourceTypeUiText(RftSourceType::OBSERVED), true));
|
||||||
calculateValueOptionsForObservedData(options, 1);
|
calculateValueOptionsForObservedData(m_wellName, options);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (fieldNeedingOptions == &m_selectedTimeSteps)
|
else if (fieldNeedingOptions == &m_selectedTimeSteps)
|
||||||
@@ -300,10 +369,15 @@ QList<caf::PdmOptionItemInfo> RimWellRftPlot::calculateValueOptions(const caf::P
|
|||||||
{
|
{
|
||||||
if (selection == RimWellRftAddress(RftSourceType::OBSERVED))
|
if (selection == RimWellRftAddress(RftSourceType::OBSERVED))
|
||||||
{
|
{
|
||||||
for (const auto& wellLogFile : getWellLogFilesWithPressure())
|
for (const auto& wellPath : getWellPathsWithPressure(m_wellName))
|
||||||
{
|
{
|
||||||
auto item = caf::PdmOptionItemInfo(wellLogFile->date(), wellLogFile->date());
|
auto wellLogFile = wellPath->wellLogFile();
|
||||||
options.push_back(item);
|
auto date = RiaDateStringParser::parseDateString(wellLogFile->date());
|
||||||
|
if(date.isValid())
|
||||||
|
{
|
||||||
|
auto item = caf::PdmOptionItemInfo(date.toString(RimTools::dateFormatString()), date);
|
||||||
|
options.push_back(item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -389,16 +463,13 @@ void RimWellRftPlot::calculateValueOptionsForWells(QList<caf::PdmOptionItemInfo>
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimWellRftPlot::calculateValueOptionsForObservedData(QList<caf::PdmOptionItemInfo>& options, int level)
|
void RimWellRftPlot::calculateValueOptionsForObservedData(const QString& wellName, QList<caf::PdmOptionItemInfo>& options)
|
||||||
{
|
{
|
||||||
if (getWellLogFilesWithPressure().size() > 0)
|
if (getWellPathsWithPressure(wellName).size() > 0)
|
||||||
{
|
{
|
||||||
auto addr = RimWellRftAddress(RftSourceType::OBSERVED);
|
auto addr = RimWellRftAddress(RftSourceType::OBSERVED);
|
||||||
auto item = caf::PdmOptionItemInfo(addr.uiText(), QVariant::fromValue(addr));
|
auto item = caf::PdmOptionItemInfo(addr.uiText(), QVariant::fromValue(addr));
|
||||||
if (level > 0)
|
item.setLevel(1);
|
||||||
{
|
|
||||||
item.setLevel(level);
|
|
||||||
}
|
|
||||||
options.push_back(item);
|
options.push_back(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,8 +40,7 @@ class RimWellLogTrack;
|
|||||||
class RimTofAccumulatedPhaseFractionsPlot;
|
class RimTofAccumulatedPhaseFractionsPlot;
|
||||||
class RigSingleWellResultsData;
|
class RigSingleWellResultsData;
|
||||||
class RimWellLogFileChannel;
|
class RimWellLogFileChannel;
|
||||||
class RimWellLogFile;
|
class RimWellPath;
|
||||||
//class RimWellRftAddress;
|
|
||||||
|
|
||||||
namespace cvf {
|
namespace cvf {
|
||||||
class Color3f;
|
class Color3f;
|
||||||
@@ -97,7 +96,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void calculateValueOptionsForWells(QList<caf::PdmOptionItemInfo>& options);
|
void calculateValueOptionsForWells(QList<caf::PdmOptionItemInfo>& options);
|
||||||
void calculateValueOptionsForObservedData(QList<caf::PdmOptionItemInfo>& options, int level);
|
void calculateValueOptionsForObservedData(const QString& wellName, QList<caf::PdmOptionItemInfo>& options);
|
||||||
|
|
||||||
void updateFromWell();
|
void updateFromWell();
|
||||||
void updateWidgetTitleWindowTitle();
|
void updateWidgetTitleWindowTitle();
|
||||||
@@ -105,8 +104,12 @@ private:
|
|||||||
void loadDataAndUpdatePlot();
|
void loadDataAndUpdatePlot();
|
||||||
|
|
||||||
static bool isPressureChannel(RimWellLogFileChannel* channel);
|
static bool isPressureChannel(RimWellLogFileChannel* channel);
|
||||||
std::vector<RimWellLogFile*> getWellLogFilesWithPressure() const;
|
std::vector<RimWellPath*> getWellPathsWithPressure(const QString& wellName) const;
|
||||||
std::vector<RimWellLogFileChannel*> getPressureChannelsFromWellLogFile(const RimWellLogFile* wellLogFile) const;
|
std::vector<RimWellLogFileChannel*> getPressureChannelsFromWellPath(const RimWellPath* wellPath) const;
|
||||||
|
|
||||||
|
RimWellPath* wellPath(const QString& wellName, const QDateTime& date) const;
|
||||||
|
|
||||||
|
std::vector < std::pair<RimWellRftAddress, QDateTime>> selectedCurveDefs() const;
|
||||||
|
|
||||||
// RimViewWindow overrides
|
// RimViewWindow overrides
|
||||||
|
|
||||||
@@ -122,7 +125,7 @@ private:
|
|||||||
caf::PdmField<QString> m_wellName;
|
caf::PdmField<QString> m_wellName;
|
||||||
caf::PdmField<std::vector<RimWellRftAddress>> m_selectedSources;
|
caf::PdmField<std::vector<RimWellRftAddress>> m_selectedSources;
|
||||||
|
|
||||||
caf::PdmField<std::vector<QString>> m_selectedTimeSteps;
|
caf::PdmField<std::vector<QDateTime>> m_selectedTimeSteps;
|
||||||
|
|
||||||
QPointer<RiuWellRftPlot> m_wellLogPlotWidget;
|
QPointer<RiuWellRftPlot> m_wellLogPlotWidget;
|
||||||
|
|
||||||
|
|||||||
@@ -176,3 +176,16 @@ QString RimWellLogFile::date() const
|
|||||||
{
|
{
|
||||||
return m_date;
|
return m_date;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<RimWellLogFileChannel*> RimWellLogFile::wellLogChannels() const
|
||||||
|
{
|
||||||
|
std::vector<RimWellLogFileChannel*> channels;
|
||||||
|
for (const auto& channel : m_wellLogChannelNames)
|
||||||
|
{
|
||||||
|
channels.push_back(channel);
|
||||||
|
}
|
||||||
|
return channels;
|
||||||
|
}
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ public:
|
|||||||
|
|
||||||
const caf::PdmChildArrayField<RimWellLogFileChannel*>* wellLogChannelNames() const { return &m_wellLogChannelNames; }
|
const caf::PdmChildArrayField<RimWellLogFileChannel*>* wellLogChannelNames() const { return &m_wellLogChannelNames; }
|
||||||
|
|
||||||
|
std::vector<RimWellLogFileChannel*> wellLogChannels() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
caf::PdmChildArrayField<RimWellLogFileChannel*> m_wellLogChannelNames;
|
caf::PdmChildArrayField<RimWellLogFileChannel*> m_wellLogChannelNames;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user