mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-10 15:36:09 -06:00
#906 Las Export: Fixed issue with TVDRKB export and improved UI
This commit is contained in:
parent
929c1d1633
commit
71f1966c1c
@ -55,21 +55,39 @@ void RicExportToLasFileFeature::onActionTriggered(bool isChecked)
|
||||
QString projectFolder = app->currentProjectPath();
|
||||
QString defaultDir = RiaApplication::instance()->lastUsedDialogDirectoryWithFallback("WELL_LOGS_DIR", projectFolder);
|
||||
|
||||
RigLasFileExporter lasExporter(curves);
|
||||
RicExportToLasFileResampleUi featureUi;
|
||||
featureUi.exportFolder = defaultDir;
|
||||
|
||||
{
|
||||
std::vector<QString> wellNames;
|
||||
std::vector<double> rkbDiffs;
|
||||
lasExporter.wellPathsAndRkbDiff(&wellNames, &rkbDiffs);
|
||||
featureUi.setRkbDiffs(wellNames, rkbDiffs);
|
||||
}
|
||||
|
||||
caf::PdmUiPropertyViewDialog propertyDialog(NULL, &featureUi, "Export Curve Data to LAS file(s)", "", QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||
propertyDialog.resize(QSize(400, 200));
|
||||
|
||||
if (propertyDialog.exec() == QDialog::Accepted &&
|
||||
!featureUi.exportFolder().isEmpty())
|
||||
{
|
||||
RigLasFileExporter lasExporter(curves);
|
||||
|
||||
if (featureUi.activateResample)
|
||||
{
|
||||
lasExporter.setResamplingInterval(featureUi.resampleInterval());
|
||||
}
|
||||
|
||||
if (featureUi.exportTvdrkb)
|
||||
{
|
||||
std::vector<QString> wellNames;
|
||||
std::vector<double> rkbDiffs;
|
||||
lasExporter.wellPathsAndRkbDiff(&wellNames, &rkbDiffs);
|
||||
|
||||
std::vector<double> userDefRkbDiff;
|
||||
featureUi.tvdrkbDiffForWellPaths(&userDefRkbDiff);
|
||||
lasExporter.setRkbDiffs(wellNames, userDefRkbDiff);
|
||||
}
|
||||
|
||||
lasExporter.writeToFolder(featureUi.exportFolder());
|
||||
|
||||
// Remember the path to next time
|
||||
|
@ -18,6 +18,20 @@
|
||||
|
||||
#include "RicExportToLasFileResampleUi.h"
|
||||
#include "cafPdmUiFilePathEditor.h"
|
||||
#include "cafPdmUiOrdering.h"
|
||||
#include "cafPdmUiCheckBoxEditor.h"
|
||||
|
||||
CAF_PDM_SOURCE_INIT(RicExportToLasFileObj, "RicExportToLasFileObj");
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RicExportToLasFileObj::RicExportToLasFileObj(void)
|
||||
{
|
||||
CAF_PDM_InitObject("RicExportToLasFileObj", "", "", "");
|
||||
|
||||
CAF_PDM_InitField(&tvdrkbOffset, "tvdrkbOffset", 0.0, "TVDRKB offset (RKB - MSL) [m]", "", "", "");
|
||||
}
|
||||
|
||||
CAF_PDM_SOURCE_INIT(RicExportToLasFileResampleUi, "RicExportToLasFileResampleUi");
|
||||
|
||||
@ -32,11 +46,52 @@ RicExportToLasFileResampleUi::RicExportToLasFileResampleUi(void)
|
||||
exportFolder.uiCapability()->setUiEditorTypeName(caf::PdmUiFilePathEditor::uiEditorTypeName());
|
||||
|
||||
CAF_PDM_InitField(&activateResample, "ActivateResample", false, "Resample Curve Data", "", "", "");
|
||||
activateResample.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
|
||||
|
||||
CAF_PDM_InitField(&resampleInterval, "ResampleInterval", 1.0, "Resample Interval [m]", "", "", "");
|
||||
|
||||
CAF_PDM_InitField(&exportTvdrkb, "ExportTvdrkb", false, "Export TVDRKB", "", "", "");
|
||||
exportTvdrkb.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN);
|
||||
|
||||
CAF_PDM_InitFieldNoDefault(&m_tvdrkbOffsets, "tvdrkbOffsets", "", "", "", "");
|
||||
|
||||
updateFieldVisibility();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RicExportToLasFileResampleUi::~RicExportToLasFileResampleUi()
|
||||
{
|
||||
m_tvdrkbOffsets.deleteAllChildObjects();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicExportToLasFileResampleUi::tvdrkbDiffForWellPaths(std::vector<double>* rkbDiffs)
|
||||
{
|
||||
for (size_t i = 0; i < m_tvdrkbOffsets.size(); i++)
|
||||
{
|
||||
rkbDiffs->push_back(m_tvdrkbOffsets()[i]->tvdrkbOffset);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicExportToLasFileResampleUi::setRkbDiffs(const std::vector<QString>& wellNames, const std::vector<double>& rkbDiffs)
|
||||
{
|
||||
for (size_t i = 0; i < wellNames.size(); i++)
|
||||
{
|
||||
RicExportToLasFileObj* obj = new RicExportToLasFileObj;
|
||||
obj->tvdrkbOffset = rkbDiffs[i];
|
||||
obj->tvdrkbOffset.uiCapability()->setUiName(wellNames[i]);
|
||||
|
||||
m_tvdrkbOffsets.push_back(obj);
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -58,6 +113,15 @@ void RicExportToLasFileResampleUi::defineEditorAttribute(const caf::PdmFieldHand
|
||||
myAttr->m_selectDirectory = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (field == &exportTvdrkb || field == &activateResample)
|
||||
{
|
||||
caf::PdmUiCheckBoxEditorAttribute* myAttr = static_cast<caf::PdmUiCheckBoxEditorAttribute*>(attribute);
|
||||
if (myAttr)
|
||||
{
|
||||
myAttr->m_useNativeCheckBoxLabel = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -73,4 +137,31 @@ void RicExportToLasFileResampleUi::updateFieldVisibility()
|
||||
{
|
||||
resampleInterval.uiCapability()->setUiReadOnly(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RicExportToLasFileResampleUi::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering)
|
||||
{
|
||||
uiOrdering.add(&exportFolder);
|
||||
|
||||
{
|
||||
caf::PdmUiGroup* group = uiOrdering.addNewGroup("Resampling");
|
||||
|
||||
group->add(&activateResample);
|
||||
group->add(&resampleInterval);
|
||||
}
|
||||
|
||||
|
||||
caf::PdmUiGroup* tvdrkbGroup = uiOrdering.addNewGroup("TVDRKB");
|
||||
tvdrkbGroup->add(&exportTvdrkb);
|
||||
|
||||
caf::PdmUiGroup* group = tvdrkbGroup->addNewGroup("Difference between TVDRKB and TVDMSL");
|
||||
for (auto& obj : m_tvdrkbOffsets)
|
||||
{
|
||||
group->add(&obj->tvdrkbOffset);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,6 +20,22 @@
|
||||
|
||||
#include "cafPdmField.h"
|
||||
#include "cafPdmObject.h"
|
||||
#include "cafPdmChildArrayField.h"
|
||||
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
//==================================================================================================
|
||||
class RicExportToLasFileObj : public caf::PdmObject
|
||||
{
|
||||
CAF_PDM_HEADER_INIT;
|
||||
|
||||
public:
|
||||
RicExportToLasFileObj(void);
|
||||
|
||||
caf::PdmField<double> tvdrkbOffset;
|
||||
};
|
||||
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
@ -30,15 +46,28 @@ class RicExportToLasFileResampleUi : public caf::PdmObject
|
||||
|
||||
public:
|
||||
RicExportToLasFileResampleUi(void);
|
||||
~RicExportToLasFileResampleUi();
|
||||
|
||||
caf::PdmField<QString> exportFolder;
|
||||
|
||||
caf::PdmField<bool> activateResample;
|
||||
caf::PdmField<double> resampleInterval;
|
||||
caf::PdmField<QString> exportFolder;
|
||||
|
||||
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue);
|
||||
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute);
|
||||
caf::PdmField<bool> exportTvdrkb;
|
||||
|
||||
void tvdrkbDiffForWellPaths(std::vector<double>* rkbDiffs);
|
||||
void setRkbDiffs(const std::vector<QString>& wellNames, const std::vector<double>& rkbDiffs);
|
||||
|
||||
virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
|
||||
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override;
|
||||
|
||||
protected:
|
||||
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
|
||||
|
||||
private:
|
||||
void updateFieldVisibility();
|
||||
|
||||
private:
|
||||
caf::PdmChildArrayField<RicExportToLasFileObj*> m_tvdrkbOffsets;
|
||||
|
||||
};
|
||||
|
@ -642,8 +642,15 @@ double RimWellLogExtractionCurve::rkbDiff() const
|
||||
{
|
||||
if (m_wellPath && m_wellPath->wellPathGeometry())
|
||||
{
|
||||
return cvf::Math::abs(m_wellPath->wellPathGeometry()->m_measuredDepths[0] - m_wellPath->wellPathGeometry()->m_wellPathPoints[0].z());
|
||||
RigWellPath* geo = m_wellPath->wellPathGeometry();
|
||||
|
||||
if (geo->m_wellPathPoints.size() > 0 && geo->m_measuredDepths.size() > 0)
|
||||
{
|
||||
double diff = cvf::Math::abs(cvf::Math::abs(geo->m_wellPathPoints[0].z()) - geo->m_measuredDepths[0]);
|
||||
|
||||
return diff;
|
||||
}
|
||||
}
|
||||
|
||||
return HUGE_VAL;
|
||||
return -1.0;
|
||||
}
|
||||
|
@ -91,7 +91,8 @@ class SingleLasFileMetaData
|
||||
public:
|
||||
SingleLasFileMetaData()
|
||||
: m_minimumCurveValue(HUGE_VAL),
|
||||
m_rkbDiff(HUGE_VAL)
|
||||
m_rkbDiff(HUGE_VAL),
|
||||
m_exportTvdrkb(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -100,6 +101,11 @@ public:
|
||||
m_wellName = wellName;
|
||||
}
|
||||
|
||||
QString wellName()
|
||||
{
|
||||
return m_wellName;
|
||||
}
|
||||
|
||||
void setCaseName(const QString& caseName)
|
||||
{
|
||||
m_caseName = caseName;
|
||||
@ -115,6 +121,16 @@ public:
|
||||
m_rkbDiff = rkbDiff;
|
||||
}
|
||||
|
||||
void enableTvdrkbExport()
|
||||
{
|
||||
m_exportTvdrkb = true;
|
||||
}
|
||||
|
||||
double rkbDiff()
|
||||
{
|
||||
return m_rkbDiff;
|
||||
}
|
||||
|
||||
void addLogData(const std::string& channelName, const std::string& unit, const std::string& comment, const RigWellLogCurveData* curveData)
|
||||
{
|
||||
m_logCurveData.push_back(SingleChannelData(channelName, unit, comment, curveData));
|
||||
@ -198,7 +214,7 @@ public:
|
||||
{
|
||||
lasFile->AddLog("TVDMSL", "M", "True vertical depth in meters", firstCurveData->tvDepths());
|
||||
|
||||
if (m_rkbDiff != HUGE_VAL)
|
||||
if (m_exportTvdrkb && m_rkbDiff != -1.0)
|
||||
{
|
||||
// Export True Vertical Depth Rotary Kelly Bushing - TVDRKB
|
||||
std::vector<double> tvdrkbValues = firstCurveData->tvDepths();
|
||||
@ -269,7 +285,9 @@ private:
|
||||
QString m_wellName;
|
||||
QString m_caseName;
|
||||
QString m_date;
|
||||
|
||||
double m_rkbDiff;
|
||||
double m_exportTvdrkb;
|
||||
|
||||
RimDefines::DepthUnitType m_depthUnit;
|
||||
std::vector<double> m_depthValues;
|
||||
@ -298,6 +316,49 @@ void RigLasFileExporter::setResamplingInterval(double interval)
|
||||
m_resampledCurveDatas.clear();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigLasFileExporter::wellPathsAndRkbDiff(std::vector<QString>* wellNames, std::vector<double>* rkbDiffs)
|
||||
{
|
||||
std::vector<SingleLasFileMetaData> lasFileDescriptions = createLasFileDescriptions(m_curves);
|
||||
|
||||
std::set<QString> uniqueWellNames;
|
||||
|
||||
for (auto metaData : lasFileDescriptions)
|
||||
{
|
||||
QString wellName = metaData.wellName();
|
||||
if (uniqueWellNames.find(wellName) == uniqueWellNames.end())
|
||||
{
|
||||
uniqueWellNames.insert(wellName);
|
||||
|
||||
wellNames->push_back(wellName);
|
||||
rkbDiffs->push_back(metaData.rkbDiff());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigLasFileExporter::setRkbDiffs(const std::vector<QString>& wellNames, const std::vector<double>& rkbDiffs)
|
||||
{
|
||||
assert(wellNames.size() == rkbDiffs.size());
|
||||
|
||||
std::vector<SingleLasFileMetaData> lasFileDescriptions = createLasFileDescriptions(m_curves);
|
||||
|
||||
for (size_t i = 0; i < wellNames.size(); i++)
|
||||
{
|
||||
for (auto& metaData : lasFileDescriptions)
|
||||
{
|
||||
if (metaData.wellName() == wellNames[i])
|
||||
{
|
||||
m_userDefinedRkbOffsets.push_back(rkbDiffs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -305,6 +366,8 @@ bool RigLasFileExporter::writeToFolder(const QString& exportFolder)
|
||||
{
|
||||
std::vector<SingleLasFileMetaData> lasFileDescriptions = createLasFileDescriptions(m_curves);
|
||||
|
||||
applyUserDefinedRkbOffsets(&lasFileDescriptions);
|
||||
|
||||
for (auto lasFileDescr : lasFileDescriptions)
|
||||
{
|
||||
NRLib::LasWell lasFile;
|
||||
@ -494,6 +557,21 @@ double RigLasFileExporter::rkbDiff(RimWellLogCurve* curve)
|
||||
return extractionCurve->rkbDiff();
|
||||
}
|
||||
|
||||
return HUGE_VAL;
|
||||
return -1.0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigLasFileExporter::applyUserDefinedRkbOffsets(std::vector<SingleLasFileMetaData>* lasFileDescriptions)
|
||||
{
|
||||
if (m_userDefinedRkbOffsets.size() == lasFileDescriptions->size())
|
||||
{
|
||||
for (size_t i = 0; i < m_userDefinedRkbOffsets.size(); i++)
|
||||
{
|
||||
lasFileDescriptions->at(i).setRkbDiff(m_userDefinedRkbOffsets[i]);
|
||||
lasFileDescriptions->at(i).enableTvdrkbExport();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,9 @@ public:
|
||||
|
||||
void setResamplingInterval(double interval);
|
||||
|
||||
void wellPathsAndRkbDiff(std::vector<QString>* wellNames, std::vector<double>* rkbDiffs);
|
||||
void setRkbDiffs(const std::vector<QString>& wellNames, const std::vector<double>& rkbDiffs);
|
||||
|
||||
bool writeToFolder(const QString& exportFolder);
|
||||
|
||||
private:
|
||||
@ -45,8 +48,11 @@ private:
|
||||
QString caseNameFromCurve(RimWellLogCurve* curve);
|
||||
double rkbDiff(RimWellLogCurve* curve);
|
||||
|
||||
void applyUserDefinedRkbOffsets(std::vector<SingleLasFileMetaData>* lasFileDescriptions);
|
||||
|
||||
private:
|
||||
std::vector<RimWellLogCurve*> m_curves;
|
||||
std::vector<double> m_userDefinedRkbOffsets;
|
||||
|
||||
bool m_isResampleActive;
|
||||
double m_resamplingInterval;
|
||||
|
Loading…
Reference in New Issue
Block a user