From 04f793c19d2b9e9ed008f5e670e957a96c6b67b9 Mon Sep 17 00:00:00 2001
From: Gaute Lindkvist <lindkvis@gmail.com>
Date: Fri, 27 Apr 2018 15:30:34 +0200
Subject: [PATCH] #2782 Auto name for 3d Well Log Curves

---
 .../ProjectDataModel/CMakeLists_files.cmake   |   2 +
 .../Rim3dWellLogCurveCollection.cpp           |   1 +
 .../ProjectDataModel/Rim3dWellLogCurve.cpp    |  45 ++-
 .../ProjectDataModel/Rim3dWellLogCurve.h      |  13 +-
 .../Rim3dWellLogExtractionCurve.cpp           | 120 +++++++-
 .../Rim3dWellLogExtractionCurve.h             |   8 +-
 .../Rim3dWellLogFileCurve.cpp                 |  82 +++++-
 .../ProjectDataModel/Rim3dWellLogFileCurve.h  |   6 +-
 .../ProjectDataModel/Rim3dWellLogRftCurve.cpp |  61 +++-
 .../ProjectDataModel/Rim3dWellLogRftCurve.h   |   6 +
 .../RimWellLogCurveNameConfig.cpp             | 274 ++++++++++++++++++
 .../RimWellLogCurveNameConfig.h               | 115 ++++++++
 12 files changed, 693 insertions(+), 40 deletions(-)
 create mode 100644 ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.cpp
 create mode 100644 ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.h

diff --git a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake
index f1781a8b9e..0851d05385 100644
--- a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake
+++ b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake
@@ -104,6 +104,7 @@ ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogExtractionCurve.h
 ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogRftCurve.h
 ${CMAKE_CURRENT_LIST_DIR}/RimVirtualPerforationResults.h
 ${CMAKE_CURRENT_LIST_DIR}/RimLegendConfig.h
+${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurveNameConfig.h
 )
 
 
@@ -212,6 +213,7 @@ ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogExtractionCurve.cpp
 ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogRftCurve.cpp
 ${CMAKE_CURRENT_LIST_DIR}/RimVirtualPerforationResults.cpp
 ${CMAKE_CURRENT_LIST_DIR}/RimLegendConfig.cpp
+${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurveNameConfig.cpp
 )
 
 list(APPEND CODE_HEADER_FILES
diff --git a/ApplicationCode/ProjectDataModel/Completions/Rim3dWellLogCurveCollection.cpp b/ApplicationCode/ProjectDataModel/Completions/Rim3dWellLogCurveCollection.cpp
index fbf49270d9..bb5524a750 100644
--- a/ApplicationCode/ProjectDataModel/Completions/Rim3dWellLogCurveCollection.cpp
+++ b/ApplicationCode/ProjectDataModel/Completions/Rim3dWellLogCurveCollection.cpp
@@ -85,6 +85,7 @@ void Rim3dWellLogCurveCollection::add3dWellLogCurve(Rim3dWellLogCurve* curve)
         size_t index = m_3dWellLogCurves.size();
         curve->setColor(RiaColorTables::wellLogPlotPaletteColors().cycledColor3f(index));
         m_3dWellLogCurves.push_back(curve);
+        curve->createCurveAutoName();
     }
 }
 
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp
index ead33dd23f..9d3d75f0b0 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.cpp
@@ -69,8 +69,6 @@ Rim3dWellLogCurve::Rim3dWellLogCurve()
 
     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", "", "", "");
-    CAF_PDM_InitField(&m_name, "Name", QString("3D Well Log Curve"), "3d Well Log Curve", "", "", "");
-    m_name.uiCapability()->setUiHidden(true);
 }
 
 //--------------------------------------------------------------------------------------------------
@@ -90,14 +88,6 @@ void Rim3dWellLogCurve::updateCurveIn3dView()
     proj->createDisplayModelAndRedrawAllViews();
 }
 
-//--------------------------------------------------------------------------------------------------
-///
-//--------------------------------------------------------------------------------------------------
-const QString& Rim3dWellLogCurve::name() const
-{
-    return m_name();
-}
-
 //--------------------------------------------------------------------------------------------------
 ///
 //--------------------------------------------------------------------------------------------------
@@ -171,14 +161,6 @@ void Rim3dWellLogCurve::fieldChangedByUi(const caf::PdmFieldHandle* changedField
     }
 }
 
-//--------------------------------------------------------------------------------------------------
-/// 
-//--------------------------------------------------------------------------------------------------
-caf::PdmFieldHandle* Rim3dWellLogCurve::userDescriptionField()
-{
-    return &m_name;
-}
-
 //--------------------------------------------------------------------------------------------------
 /// 
 //--------------------------------------------------------------------------------------------------
@@ -246,6 +228,14 @@ void Rim3dWellLogCurve::defineEditorAttribute(const caf::PdmFieldHandle* field,
     }
 }
 
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+void Rim3dWellLogCurve::initAfterRead()
+{
+    this->createCurveAutoName();
+}
+
 //--------------------------------------------------------------------------------------------------
 /// 
 //--------------------------------------------------------------------------------------------------
@@ -255,11 +245,9 @@ void Rim3dWellLogCurve::resetMinMaxValuesAndUpdateUI()
     this->updateConnectedEditors();
 }
 
-void Rim3dWellLogCurve::setGeometryGenerator(Riv3dWellLogCurveGeometryGenerator* generator)
-{
-    m_geometryGenerator = generator;
-}
-
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
 bool Rim3dWellLogCurve::findClosestPointOnCurve(const cvf::Vec3d& globalIntersection,
                                                 cvf::Vec3d*       closestPoint,
                                                 double*           measuredDepthAtPoint,
@@ -272,6 +260,17 @@ bool Rim3dWellLogCurve::findClosestPointOnCurve(const cvf::Vec3d& globalIntersec
     return false;
 }
 
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+void Rim3dWellLogCurve::setGeometryGenerator(Riv3dWellLogCurveGeometryGenerator* generator)
+{
+    m_geometryGenerator = generator;
+}
+
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
 cvf::ref<Riv3dWellLogCurveGeometryGenerator> Rim3dWellLogCurve::geometryGenerator()
 {
     return m_geometryGenerator;
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h
index 5d1e100338..1b3f68ad47 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogCurve.h
@@ -23,17 +23,19 @@
 #include "cafPdmObject.h"
 
 #include "cafPdmFieldCvfColor.h"
-
+#include "cafPdmChildField.h"
 #include "cvfObject.h"
 #include "cvfVector3.h"
 
+#include "RimWellLogCurveNameConfig.h"
+
 class Riv3dWellLogCurveGeometryGenerator;
 
 //==================================================================================================
 ///
 ///
 //==================================================================================================
-class Rim3dWellLogCurve : public caf::PdmObject
+class Rim3dWellLogCurve : public caf::PdmObject, public RimCurveNameConfigHolderInterface
 {
     CAF_PDM_HEADER_INIT;
 
@@ -52,7 +54,7 @@ public:
 
     void updateCurveIn3dView();
 
-    const QString&  name() const;
+    virtual QString name() const = 0;
     virtual QString resultPropertyString() const = 0;
     DrawPlane       drawPlane() const;
     cvf::Color3f    color() const;
@@ -72,18 +74,17 @@ public:
 
     void setGeometryGenerator(Riv3dWellLogCurveGeometryGenerator* generator);
     cvf::ref<Riv3dWellLogCurveGeometryGenerator> geometryGenerator();
-    
+
 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<caf::PdmOptionItemInfo>   calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) override;
     virtual void                            defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute);    
+    virtual void                            initAfterRead();
 private:
     void                                    resetMinMaxValues();
 protected:
-    caf::PdmField<QString>                          m_name;
     caf::PdmField<caf::AppEnum<DrawPlane>>          m_drawPlane;
     caf::PdmField<cvf::Color3f>                     m_color;
     caf::PdmField<double>                           m_minCurveValue;
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.cpp b/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.cpp
index 30f6b27928..8d02ef6745 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.cpp
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.cpp
@@ -21,10 +21,17 @@
 #include "RigWellLogFile.h"
 
 #include "RiaExtractionTools.h"
+#include "RigEclipseCaseData.h"
+#include "RigGeoMechCaseData.h"
 #include "RigEclipseWellLogExtractor.h"
 #include "RigGeoMechWellLogExtractor.h"
 #include "RigResultAccessorFactory.h"
+#include "RigCaseCellResultsData.h"
+#include "RigFemPartResultsCollection.h"
+#include "RimEclipseCase.h"
+#include "RimGeoMechCase.h"
 #include "Rim3dView.h"
+#include "RimWellLogCurveNameConfig.h"
 #include "RimCase.h"
 #include "RimEclipseCase.h"
 #include "RimEclipseCellColors.h"
@@ -71,7 +78,8 @@ Rim3dWellLogExtractionCurve::Rim3dWellLogExtractionCurve()
     m_geomResultDefinition.uiCapability()->setUiTreeChildrenHidden(true);
     m_geomResultDefinition = new RimGeoMechResultDefinition;
 
-    m_name = "3D Well Log Curve";
+    CAF_PDM_InitFieldNoDefault(&m_nameConfig, "NameGenerator", "", "", "", "");
+    m_nameConfig = new RimWellLogExtractionCurveNameConfig(this);    
 }
 
 //--------------------------------------------------------------------------------------------------
@@ -81,6 +89,7 @@ Rim3dWellLogExtractionCurve::~Rim3dWellLogExtractionCurve()
 {
     delete m_geomResultDefinition;
     delete m_eclipseResultDefinition;
+    delete m_nameConfig;
 }
 
 //--------------------------------------------------------------------------------------------------
@@ -174,6 +183,88 @@ void Rim3dWellLogExtractionCurve::curveValuesAndMds(std::vector<double>* values,
     }
 }
 
+QString Rim3dWellLogExtractionCurve::name() const
+{
+    return m_nameConfig()->name();
+}
+
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+QString Rim3dWellLogExtractionCurve::createCurveAutoName() const
+{
+    RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>(m_case.value());
+    RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(m_case.value());
+
+    QStringList generatedCurveName;
+    
+    if (m_nameConfig->addWellName())
+    {
+        RimWellPath* wellPath;
+        this->firstAncestorOrThisOfTypeAsserted(wellPath);
+        if (!wellPath->name().isEmpty())
+        {
+            generatedCurveName += wellPath->name();
+        }
+    }
+
+    if (m_nameConfig->addCaseName() && m_case())
+    {
+        generatedCurveName.push_back(m_case->caseUserDescription());
+    }
+
+    if (m_nameConfig->addProperty() && !resultPropertyString().isEmpty())
+    {
+        generatedCurveName.push_back(resultPropertyString());
+    }
+
+    if (m_nameConfig->addTimeStep() || m_nameConfig->addDate())
+    {
+        size_t maxTimeStep = 0;
+
+        if (eclipseCase)
+        {
+            RigEclipseCaseData* data = eclipseCase->eclipseCaseData();
+            if (data)
+            {
+                maxTimeStep = data->results(m_eclipseResultDefinition->porosityModel())->maxTimeStepCount();
+            }
+        }
+        else if (geomCase)
+        {
+            RigGeoMechCaseData* data = geomCase->geoMechData();
+            if (data)
+            {
+                maxTimeStep = data->femPartResults()->frameCount();
+            }
+        }
+
+        if (m_nameConfig->addDate())
+        {
+            QString dateString = wellDate();
+            if (!dateString.isEmpty())
+            {
+                generatedCurveName.push_back(dateString);
+            }
+        }
+
+        if (m_nameConfig->addTimeStep())
+        {
+            generatedCurveName.push_back(QString("[%1/%2]").arg(m_timeStep()).arg(maxTimeStep));
+        }
+    }
+
+    return generatedCurveName.join(", ");
+}
+
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+caf::PdmFieldHandle* Rim3dWellLogExtractionCurve::userDescriptionField()
+{
+    return m_nameConfig()->nameField();
+}
+
 //--------------------------------------------------------------------------------------------------
 ///
 //--------------------------------------------------------------------------------------------------
@@ -237,6 +328,8 @@ void Rim3dWellLogExtractionCurve::defineUiOrdering(QString uiConfigName, caf::Pd
 
     Rim3dWellLogCurve::configurationUiOrdering(uiOrdering);
 
+    caf::PdmUiGroup* nameGroup = m_nameConfig()->createUiGroup(uiConfigName, uiOrdering);
+
     uiOrdering.skipRemainingFields(true);
 }
 
@@ -251,3 +344,28 @@ void Rim3dWellLogExtractionCurve::initAfterRead()
     m_eclipseResultDefinition->setEclipseCase(eclipseCase);
     m_geomResultDefinition->setGeoMechCase(geomCase);
 }
+
+QString Rim3dWellLogExtractionCurve::wellDate() const
+{
+    RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>(m_case.value());
+    RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(m_case.value());
+
+    QStringList timeStepNames;
+
+    if (eclipseCase)
+    {
+        if (eclipseCase->eclipseCaseData())
+        {
+            timeStepNames = eclipseCase->timeStepStrings();
+        }
+    }
+    else if (geomCase)
+    {
+        if (geomCase->geoMechData())
+        {
+            timeStepNames = geomCase->timeStepStrings();
+        }
+    }
+
+    return (m_timeStep >= 0 && m_timeStep < timeStepNames.size()) ? timeStepNames[m_timeStep] : "";
+}
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.h b/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.h
index 5ab17dbea6..cdbb90a382 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.h
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogExtractionCurve.h
@@ -28,6 +28,7 @@ class Rim3dView;
 class RimCase;
 class RimGeoMechResultDefinition;
 class RimEclipseResultDefinition;
+class RimWellLogExtractionCurveNameConfig;
 
 //==================================================================================================
 ///
@@ -45,17 +46,22 @@ public:
     virtual QString resultPropertyString() const override;
     virtual void    curveValuesAndMds(std::vector<double>* values, std::vector<double>* measuredDepthValues) const override;
 
+    virtual QString name() const override;
+    virtual QString createCurveAutoName() const override;
+protected:
+    virtual caf::PdmFieldHandle*            userDescriptionField() override;
 private:
     virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions,
                                                                 bool*                      useOptionsOnly) override;
 
     virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
     virtual void initAfterRead() override;
-
+    QString      wellDate() const;
 private:
     caf::PdmPtrField<RimCase*>                      m_case;
     caf::PdmField<int>                              m_timeStep;
 
     caf::PdmChildField<RimEclipseResultDefinition*> m_eclipseResultDefinition;
     caf::PdmChildField<RimGeoMechResultDefinition*> m_geomResultDefinition;
+    caf::PdmChildField<RimWellLogExtractionCurveNameConfig*> m_nameConfig;
 };
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp
index 3f7f7d1835..dcd47d0bca 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp
@@ -20,6 +20,7 @@
 
 #include "RigWellLogFile.h"
 
+#include "RimWellLogCurveNameConfig.h"
 #include "RimWellLogFile.h"
 #include "RimWellLogFileChannel.h"
 #include "RimWellPath.h"
@@ -44,13 +45,17 @@ Rim3dWellLogFileCurve::Rim3dWellLogFileCurve()
 
     CAF_PDM_InitFieldNoDefault(&m_wellLogFile, "WellLogFile", "Well Log File", "", "", "");
 
-    m_name = "3D Well Log LAS Curve";
+    CAF_PDM_InitFieldNoDefault(&m_nameConfig, "NameConfig", "", "", "", "");
+    m_nameConfig = new RimWellLogFileCurveNameConfig(this);
 }
 
 //--------------------------------------------------------------------------------------------------
 ///
 //--------------------------------------------------------------------------------------------------
-Rim3dWellLogFileCurve::~Rim3dWellLogFileCurve() {}
+Rim3dWellLogFileCurve::~Rim3dWellLogFileCurve()
+{
+    delete m_nameConfig;
+}
 
 //--------------------------------------------------------------------------------------------------
 ///
@@ -72,7 +77,6 @@ void Rim3dWellLogFileCurve::setDefaultFileCurveDataInfo()
         if (!fileLogs.empty())
         {
             m_wellLogChannelName = fileLogs[0]->name();
-            m_name                = "LAS: " + m_wellLogChannelName;
         }
     }
 }
@@ -104,6 +108,76 @@ QString Rim3dWellLogFileCurve::resultPropertyString() const
     return m_wellLogChannelName();
 }
 
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+QString Rim3dWellLogFileCurve::name() const
+{
+    return m_nameConfig->name();
+}
+
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+QString Rim3dWellLogFileCurve::createCurveAutoName() const
+{
+    QStringList name;
+    QString unit;
+    bool channelNameAvailable = false;
+
+    RimWellPath* wellPath;
+    this->firstAncestorOrThisOfType(wellPath);
+
+    if (wellPath)
+    {
+        name.push_back(wellPath->name());
+        name.push_back("LAS");
+
+        if (!m_wellLogChannelName().isEmpty())
+        {
+            name.push_back(m_wellLogChannelName);
+            channelNameAvailable = true;
+        }
+
+        RigWellLogFile* wellLogFile = m_wellLogFile ? m_wellLogFile->wellLogFileData() : nullptr;
+
+        if (wellLogFile)
+        {
+            if (channelNameAvailable)
+            {
+             /*   RimWellLogPlot* wellLogPlot;
+                firstAncestorOrThisOfType(wellLogPlot);
+                CVF_ASSERT(wellLogPlot);
+                QString unitName = wellLogFile->wellLogChannelUnitString(m_wellLogChannelName, wellLogPlot->depthUnit());
+
+                if (!unitName.isEmpty())
+                {
+                    name.back() += QString(" [%1]").arg(unitName);
+                } */
+            }
+
+            QString date = wellLogFile->date();
+            if (!date.isEmpty())
+            {
+                name.push_back(wellLogFile->date());
+            }
+
+        }
+
+        return name.join(", ");
+    }
+
+    return "Empty curve";
+}
+
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+caf::PdmFieldHandle* Rim3dWellLogFileCurve::userDescriptionField()
+{
+    return m_nameConfig()->nameField();
+}
+
 //--------------------------------------------------------------------------------------------------
 ///
 //--------------------------------------------------------------------------------------------------
@@ -178,5 +252,7 @@ void Rim3dWellLogFileCurve::defineUiOrdering(QString uiConfigName, caf::PdmUiOrd
 
     Rim3dWellLogCurve::configurationUiOrdering(uiOrdering);
 
+    caf::PdmUiGroup* nameGroup = m_nameConfig()->createUiGroup(uiConfigName, uiOrdering);
+
     uiOrdering.skipRemainingFields(true);
 }
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h
index 9f537df3cc..58390e7a7f 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogFileCurve.h
@@ -25,6 +25,7 @@
 #include "cafPdmPtrField.h"
 
 class RimWellLogFile;
+class RimWellLogFileCurveNameConfig;
 
 //==================================================================================================
 ///
@@ -41,8 +42,10 @@ public:
     void            setDefaultFileCurveDataInfo();
     virtual void    curveValuesAndMds(std::vector<double>* values, std::vector<double>* measuredDepthValues) const override;
     virtual QString resultPropertyString() const override;
-
+    virtual QString name() const override;
+    virtual QString createCurveAutoName() const override;
 protected:
+    virtual caf::PdmFieldHandle*            userDescriptionField() override;
     virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField,
                                   const QVariant& oldValue,
                                   const QVariant& newValue) override;
@@ -56,4 +59,5 @@ private:
 private:
     caf::PdmPtrField<RimWellLogFile*> m_wellLogFile;
     caf::PdmField<QString>            m_wellLogChannelName;
+    caf::PdmChildField<RimWellLogFileCurveNameConfig*> m_nameConfig;
 };
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp
index a3eef10699..85ad411929 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp
@@ -18,12 +18,14 @@
 
 #include "Rim3dWellLogRftCurve.h"
 
+#include "RifReaderEclipseRft.h"
+#include "RigWellLogCurveData.h"
+
+#include "RimWellLogCurveNameConfig.h"
+#include "RimEclipseResultCase.h"
+#include "RimTools.h"
 #include "RimWellPath.h"
 #include "RimWellLogCurve.h"
-#include "RigWellLogCurveData.h"
-#include "RimEclipseResultCase.h"
-#include "RifReaderEclipseRft.h"
-#include "RimTools.h"
 
 //==================================================================================================
 ///
@@ -49,7 +51,8 @@ Rim3dWellLogRftCurve::Rim3dWellLogRftCurve()
     m_2dWellLogRftCurve = new RimWellLogRftCurve();
     m_2dWellLogRftCurve.xmlCapability()->disableIO();
 
-    m_name = "3D Well Log RFT Curve";
+    CAF_PDM_InitFieldNoDefault(&m_nameConfig, "NameConfig", "", "", "", "");
+    m_nameConfig = new RimWellLogRftCurveNameConfig(this);
 }
 
 //--------------------------------------------------------------------------------------------------
@@ -57,6 +60,7 @@ Rim3dWellLogRftCurve::Rim3dWellLogRftCurve()
 //--------------------------------------------------------------------------------------------------
 Rim3dWellLogRftCurve::~Rim3dWellLogRftCurve()
 {
+    delete m_nameConfig;
 }
 
 //--------------------------------------------------------------------------------------------------
@@ -84,6 +88,53 @@ QString Rim3dWellLogRftCurve::resultPropertyString() const
     return caf::AppEnum<RifEclipseRftAddress::RftWellLogChannelType>::uiText(m_wellLogChannelName());
 }
 
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+QString Rim3dWellLogRftCurve::name() const
+{
+    return m_nameConfig->name();
+}
+
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+QString Rim3dWellLogRftCurve::createCurveAutoName() const
+{
+    QStringList name;
+
+    if (!wellName().isEmpty())
+    {
+        name.push_back(wellName());
+    }
+
+    name.push_back("RFT");
+
+    if (m_eclipseResultCase)
+    {
+        name.push_back(m_eclipseResultCase->caseUserDescription());
+    }
+    if (m_wellLogChannelName().text() != caf::AppEnum<RifEclipseRftAddress::RftWellLogChannelType>::text(RifEclipseRftAddress::NONE))
+    {
+        RifEclipseRftAddress::RftWellLogChannelType channelNameEnum = m_wellLogChannelName();
+        name.push_back(caf::AppEnum<RifEclipseRftAddress::RftWellLogChannelType>::uiText(channelNameEnum));
+    }
+    if (!m_timeStep().isNull())
+    {
+        name.push_back(m_timeStep().toString(RimTools::dateFormatString()));
+    }
+
+    return name.join(", ");
+}
+
+//--------------------------------------------------------------------------------------------------
+///
+//--------------------------------------------------------------------------------------------------
+caf::PdmFieldHandle* Rim3dWellLogRftCurve::userDescriptionField()
+{
+    return m_nameConfig()->nameField();
+}
+
 //--------------------------------------------------------------------------------------------------
 ///
 //--------------------------------------------------------------------------------------------------
diff --git a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h
index e922d1059a..ee9b157fe0 100644
--- a/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h
+++ b/ApplicationCode/ProjectDataModel/Rim3dWellLogRftCurve.h
@@ -28,6 +28,7 @@
 #include "RimWellLogRftCurve.h"
 
 class RimEclipseResultCase;
+class RimWellLogRftCurveNameConfig;
 class QString;
 
 //==================================================================================================
@@ -45,8 +46,12 @@ public:
     virtual void curveValuesAndMds(std::vector<double>* values, std::vector<double>* measuredDepthValues) const override;
 
     virtual QString resultPropertyString() const override;
+    virtual QString name() const override;
+    virtual QString createCurveAutoName() const override;
 
 protected:
+    virtual caf::PdmFieldHandle*            userDescriptionField() override;
+
     virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField,
                                   const QVariant& oldValue,
                                   const QVariant& newValue) override;
@@ -66,4 +71,5 @@ private:
     caf::PdmField<caf::AppEnum<RifEclipseRftAddress::RftWellLogChannelType>> m_wellLogChannelName;
 
     caf::PdmChildField<RimWellLogRftCurve*> m_2dWellLogRftCurve;
+    caf::PdmChildField<RimWellLogRftCurveNameConfig*> m_nameConfig;
 };
diff --git a/ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.cpp b/ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.cpp
new file mode 100644
index 0000000000..7bbc4903b8
--- /dev/null
+++ b/ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.cpp
@@ -0,0 +1,274 @@
+/////////////////////////////////////////////////////////////////////////////////
+//
+//  Copyright (C) 2018-     Statoil ASA
+// 
+//  ResInsight is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+// +		m_addWellName	{m_fieldValue=true m_defaultFieldValue=true }	caf::PdmField<bool>
+
+//  ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
+//  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.
+// 
+//  See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html> 
+//  for more details.
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+#include "RimProject.h"
+#include "RimWellLogCurveNameConfig.h"
+#include "Rim3dWellLogCurve.h"
+
+//==================================================================================================
+///  
+///  
+//==================================================================================================
+
+CAF_PDM_SOURCE_INIT(RimCurveNameConfig, "RimCurveNameGenerator");
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+RimCurveNameConfig::RimCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder /*= nullptr*/)
+    : m_configHolder(configHolder)
+{
+    CAF_PDM_InitObject("Curve Name Generator", "", "", "");
+
+    CAF_PDM_InitField(&m_isUsingAutoName, "IsUsingAutoName", true, "Generate Name Automatically", "", "", "");
+    CAF_PDM_InitFieldNoDefault(&m_customName, "CustomCurveName", "Curve Name", "", "", "");
+    CAF_PDM_InitFieldNoDefault(&m_autoName, "AutoCurveName", "Curve Name", "", "", "");
+    m_autoName.registerGetMethod(this, &RimCurveNameConfig::autoName);
+    m_autoName.registerSetMethod(this, &RimCurveNameConfig::setCustomName);
+    m_autoName.xmlCapability()->disableIO();
+
+    CVF_ASSERT(configHolder);
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+RimCurveNameConfig::~RimCurveNameConfig()
+{
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+bool RimCurveNameConfig::isUsingAutoName() const
+{
+    return m_isUsingAutoName();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+caf::PdmFieldHandle* RimCurveNameConfig::nameField()
+{
+    if (isUsingAutoName())
+    {
+        return &m_autoName;
+    }
+    return &m_customName;
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+QString RimCurveNameConfig::name() const
+{
+    if (isUsingAutoName())
+    {
+        return m_autoName();
+    }
+    return m_customName();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+caf::PdmUiGroup* RimCurveNameConfig::createUiGroup(QString uiConfigName, caf::PdmUiOrdering& uiOrdering)
+{
+    caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup("Curve Name Configuration");
+    nameGroup->add(&m_isUsingAutoName);
+    return nameGroup;
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+void RimCurveNameConfig::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
+{
+    if (changedField == &m_customName)
+    {
+        m_isUsingAutoName = false;        
+    }
+
+    if (changedField == &m_isUsingAutoName && !isUsingAutoName())
+    {
+        m_customName = m_configHolder->createCurveAutoName();
+        m_customName.uiCapability()->updateConnectedEditors();
+    }
+
+    updateAllSettings();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+QString RimCurveNameConfig::autoName() const
+{
+    return m_configHolder->createCurveAutoName();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+void RimCurveNameConfig::setCustomName(const QString& name)
+{
+    m_isUsingAutoName = false;
+    m_customName = name;
+    updateAllSettings();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+void RimCurveNameConfig::updateAllSettings()
+{
+    m_isUsingAutoName.uiCapability()->updateConnectedEditors();
+    m_autoName.uiCapability()->updateConnectedEditors();
+    m_customName.uiCapability()->updateConnectedEditors();
+
+    Rim3dWellLogCurve* curve;
+    this->firstAncestorOrThisOfTypeAsserted(curve);
+    curve->updateConnectedEditors();
+
+}
+
+//==================================================================================================
+///  
+///  
+//==================================================================================================
+
+CAF_PDM_SOURCE_INIT(RimWellLogExtractionCurveNameConfig, "RimWellLogExtractionCurveNameGenerator");
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+RimWellLogExtractionCurveNameConfig::RimWellLogExtractionCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder)
+    : RimCurveNameConfig(configHolder)
+{
+    CAF_PDM_InitObject("Well Log Extraction Curve Name Generator", "", "", "");
+
+    CAF_PDM_InitField(&m_addCaseName, "AddCaseName", false, "Add Case Name To Auto Name", "", "", "");
+    CAF_PDM_InitField(&m_addProperty, "AddProperty", true, "Add Property Type To Auto Name", "", "", "");
+    CAF_PDM_InitField(&m_addWellName, "AddWellName", true, "Add Well Name To Auto Name", "", "", "");
+    CAF_PDM_InitField(&m_addTimestep, "AddTimeStep", true, "Add Time Step To Auto Name", "", "", "");
+    CAF_PDM_InitField(&m_addDate,     "AddDate",     true, "Add Date To Auto Name", "", "", "");
+
+    m_customName = "Extraction Curve";
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+caf::PdmUiGroup* RimWellLogExtractionCurveNameConfig::createUiGroup(QString uiConfigName, caf::PdmUiOrdering& uiOrdering)
+{
+    caf::PdmUiGroup* nameGroup = RimCurveNameConfig::createUiGroup(uiConfigName, uiOrdering);
+    nameGroup->add(&m_addCaseName);
+    nameGroup->add(&m_addProperty);
+    nameGroup->add(&m_addWellName);
+    nameGroup->add(&m_addTimestep);
+    nameGroup->add(&m_addDate);
+    return nameGroup;
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+bool RimWellLogExtractionCurveNameConfig::addCaseName() const
+{
+    return m_addCaseName();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+bool RimWellLogExtractionCurveNameConfig::addProperty() const
+{
+    return m_addProperty();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+bool RimWellLogExtractionCurveNameConfig::addWellName() const
+{
+    return m_addWellName();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+bool RimWellLogExtractionCurveNameConfig::addTimeStep() const
+{
+    return m_addTimestep();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+bool RimWellLogExtractionCurveNameConfig::addDate() const
+{
+    return m_addDate();
+}
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+void RimWellLogExtractionCurveNameConfig::updateAllSettings()
+{
+    m_addCaseName.uiCapability()->setUiReadOnly(!isUsingAutoName());
+    m_addProperty.uiCapability()->setUiReadOnly(!isUsingAutoName());
+    m_addWellName.uiCapability()->setUiReadOnly(!isUsingAutoName());
+    m_addTimestep.uiCapability()->setUiReadOnly(!isUsingAutoName());
+    m_addDate.uiCapability()->setUiReadOnly(!isUsingAutoName());
+
+    RimCurveNameConfig::updateAllSettings();
+}
+
+//==================================================================================================
+///  
+///  
+//==================================================================================================
+
+CAF_PDM_SOURCE_INIT(RimWellLogFileCurveNameConfig, "RimWellLogFileCurveNameGenerator");
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+RimWellLogFileCurveNameConfig::RimWellLogFileCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder)
+    : RimCurveNameConfig(configHolder)
+{
+    CAF_PDM_InitObject("Well Log File Curve Name Generator", "", "", "");
+    m_customName = "Las Curve";
+}
+
+//==================================================================================================
+///  
+///  
+//==================================================================================================
+
+CAF_PDM_SOURCE_INIT(RimWellLogRftCurveNameConfig, "RimWellLogRftCurveNameGenerator");
+
+//--------------------------------------------------------------------------------------------------
+/// 
+//--------------------------------------------------------------------------------------------------
+RimWellLogRftCurveNameConfig::RimWellLogRftCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder)
+    : RimCurveNameConfig(configHolder)
+{
+    CAF_PDM_InitObject("Well Log Rft Curve Name Generator", "", "", "");
+    m_customName = "Rft Curve";
+}
\ No newline at end of file
diff --git a/ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.h b/ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.h
new file mode 100644
index 0000000000..0ad17339e4
--- /dev/null
+++ b/ApplicationCode/ProjectDataModel/RimWellLogCurveNameConfig.h
@@ -0,0 +1,115 @@
+/////////////////////////////////////////////////////////////////////////////////
+//
+//  Copyright (C) 2015-     Statoil ASA
+//
+//  ResInsight is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
+//  WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.
+//
+//  See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
+//  for more details.
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include "cafPdmField.h"
+#include "cafPdmObject.h"
+#include "cafPdmProxyValueField.h"
+
+//==================================================================================================
+///
+///
+//==================================================================================================
+class RimCurveNameConfigHolderInterface
+{
+public:
+    virtual QString createCurveAutoName() const = 0;
+};
+
+//==================================================================================================
+///
+///
+//==================================================================================================
+class RimCurveNameConfig : public caf::PdmObject
+{
+    CAF_PDM_HEADER_INIT;
+
+public:
+    RimCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder = nullptr);
+    virtual ~RimCurveNameConfig();
+    bool                             isUsingAutoName() const;
+    caf::PdmFieldHandle*             nameField();
+    QString                          name() const;
+    virtual caf::PdmUiGroup*         createUiGroup(QString uiConfigName, caf::PdmUiOrdering& uiOrdering);
+
+protected:
+    virtual void                     fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;
+    QString                          autoName() const;
+    void                             setCustomName(const QString& name);
+    virtual void                     updateAllSettings();
+protected:
+    caf::PdmField<bool>              m_isUsingAutoName;
+    caf::PdmField<QString>           m_customName;
+    caf::PdmProxyValueField<QString> m_autoName;
+
+    const RimCurveNameConfigHolderInterface* m_configHolder;
+};
+
+//==================================================================================================
+///
+///
+//==================================================================================================
+class RimWellLogExtractionCurveNameConfig : public RimCurveNameConfig
+{
+    CAF_PDM_HEADER_INIT;
+
+public:
+    RimWellLogExtractionCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder = nullptr);
+    virtual caf::PdmUiGroup* createUiGroup(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
+
+    bool                     addCaseName() const;
+    bool                     addProperty() const;
+    bool                     addWellName() const;
+    bool                     addTimeStep() const;
+    bool                     addDate() const;
+
+protected:
+    virtual void             updateAllSettings();
+
+private:
+    caf::PdmField<bool>              m_addCaseName;
+    caf::PdmField<bool>              m_addProperty;
+    caf::PdmField<bool>              m_addWellName;
+    caf::PdmField<bool>              m_addTimestep;
+    caf::PdmField<bool>              m_addDate;
+};
+
+//==================================================================================================
+///
+///
+//==================================================================================================
+class RimWellLogFileCurveNameConfig : public RimCurveNameConfig
+{
+    CAF_PDM_HEADER_INIT;
+
+public:
+    RimWellLogFileCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder = nullptr);
+};
+
+//==================================================================================================
+///
+///
+//==================================================================================================
+class RimWellLogRftCurveNameConfig : public RimCurveNameConfig
+{
+    CAF_PDM_HEADER_INIT;
+
+public:
+    RimWellLogRftCurveNameConfig(const RimCurveNameConfigHolderInterface* configHolder = nullptr);
+};