#4817 #4830 #4832 #4837 #4839 Python commands for WBS creation, well path import and well log file import (#4838)

* Better minimum width for well log tracks

* Fix alignment of scrollbar in Well log plots

* Better Well Log Plot export

* Hide scroll bar before plotting
* Better borders

* Create plots through Python

* #4817 Create WBS plots with Python

* Rebase Summary and WellLogPlot on top of a new RimPlot

* Also Python: Allow setting folder as a parameter to export_snapshots

* #4832 Prepare for well path import command

* Well Path import WIP

* #4830 #4832 Import well paths and well log files from file using Python.

* #4837 Implement import of formation names in Python

* Fix debug build issue

* Fix RiaLogging build issue

* Fix warnings

* Yet another RiaLogging.h import added

* #4839 Import exporting of las and ascii files from well log plots
This commit is contained in:
Gaute Lindkvist
2019-10-09 09:21:28 +02:00
committed by GitHub
parent b24b0932a3
commit 11117383db
106 changed files with 2128 additions and 339 deletions
+24 -8
View File
@@ -765,6 +765,7 @@ bool RiaApplication::openOdbCaseFromFile( const QString& fileName, bool applyTim
geoMechCase->setFileName( fileName ); geoMechCase->setFileName( fileName );
geoMechCase->caseUserDescription = caseName; geoMechCase->caseUserDescription = caseName;
geoMechCase->setApplyTimeFilter( applyTimeStepFilter ); geoMechCase->setApplyTimeFilter( applyTimeStepFilter );
m_project->assignCaseIdToCase( geoMechCase );
RimGeoMechModels* geoMechModelCollection = m_project->activeOilField() ? m_project->activeOilField()->geoMechModels() RimGeoMechModels* geoMechModelCollection = m_project->activeOilField() ? m_project->activeOilField()->geoMechModels()
: nullptr; : nullptr;
@@ -800,12 +801,15 @@ bool RiaApplication::openOdbCaseFromFile( const QString& fileName, bool applyTim
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// Add a list of well path file paths (JSON files) to the well path collection /// Add a list of well path file paths (JSON files) to the well path collection
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaApplication::addWellPathsToModel( QList<QString> wellPathFilePaths ) std::vector<RimFileWellPath*> RiaApplication::addWellPathsToModel( QList<QString> wellPathFilePaths,
QStringList* errorMessages )
{ {
if ( m_project == nullptr || m_project->oilFields.size() < 1 ) return; CAF_ASSERT( errorMessages );
if ( m_project == nullptr || m_project->oilFields.size() < 1 ) return {};
RimOilField* oilField = m_project->activeOilField(); RimOilField* oilField = m_project->activeOilField();
if ( oilField == nullptr ) return; if ( oilField == nullptr ) return {};
if ( oilField->wellPathCollection == nullptr ) if ( oilField->wellPathCollection == nullptr )
{ {
@@ -815,9 +819,15 @@ void RiaApplication::addWellPathsToModel( QList<QString> wellPathFilePaths )
m_project->updateConnectedEditors(); m_project->updateConnectedEditors();
} }
if ( oilField->wellPathCollection ) oilField->wellPathCollection->addWellPaths( wellPathFilePaths ); std::vector<RimFileWellPath*> wellPaths;
if ( oilField->wellPathCollection )
{
wellPaths = oilField->wellPathCollection->addWellPaths( wellPathFilePaths, errorMessages );
}
oilField->wellPathCollection->updateConnectedEditors(); oilField->wellPathCollection->updateConnectedEditors();
return wellPaths;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -848,12 +858,15 @@ void RiaApplication::addWellPathFormationsToModel( QList<QString> wellPathFormat
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// Add a list of well log file paths (LAS files) to the well path collection /// Add a list of well log file paths (LAS files) to the well path collection
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaApplication::addWellLogsToModel( const QList<QString>& wellLogFilePaths ) std::vector<RimWellLogFile*> RiaApplication::addWellLogsToModel( const QList<QString>& wellLogFilePaths,
QStringList* errorMessages )
{ {
if ( m_project == nullptr || m_project->oilFields.size() < 1 ) return; CAF_ASSERT( errorMessages );
if ( m_project == nullptr || m_project->oilFields.size() < 1 ) return {};
RimOilField* oilField = m_project->activeOilField(); RimOilField* oilField = m_project->activeOilField();
if ( oilField == nullptr ) return; if ( oilField == nullptr ) return {};
if ( oilField->wellPathCollection == nullptr ) if ( oilField->wellPathCollection == nullptr )
{ {
@@ -862,9 +875,12 @@ void RiaApplication::addWellLogsToModel( const QList<QString>& wellLogFilePaths
m_project->updateConnectedEditors(); m_project->updateConnectedEditors();
} }
oilField->wellPathCollection->addWellLogs( wellLogFilePaths ); std::vector<RimWellLogFile*> wellLogFiles = oilField->wellPathCollection->addWellLogs( wellLogFilePaths,
errorMessages );
oilField->wellPathCollection->updateConnectedEditors(); oilField->wellPathCollection->updateConnectedEditors();
return wellLogFiles;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
+5 -3
View File
@@ -54,11 +54,13 @@ class RigEclipseCaseData;
class RimCommandObject; class RimCommandObject;
class RimEclipseCase; class RimEclipseCase;
class RimEclipseView; class RimEclipseView;
class RimFileWellPath;
class RimGridView; class RimGridView;
class RimProject; class RimProject;
class RimSummaryPlot; class RimSummaryPlot;
class Rim3dView; class Rim3dView;
class RimViewWindow; class RimViewWindow;
class RimWellLogFile;
class RimWellLogPlot; class RimWellLogPlot;
class RimWellAllocationPlot; class RimWellAllocationPlot;
@@ -137,9 +139,9 @@ public:
bool openOdbCaseFromFile( const QString& fileName, bool applyTimeStepFilter = false ); bool openOdbCaseFromFile( const QString& fileName, bool applyTimeStepFilter = false );
void addWellPathsToModel( QList<QString> wellPathFilePaths ); std::vector<RimFileWellPath*> addWellPathsToModel( QList<QString> wellPathFilePaths, QStringList* errorMessages );
void addWellPathFormationsToModel( QList<QString> wellPathFilePaths ); void addWellPathFormationsToModel( QList<QString> wellPathFilePaths );
void addWellLogsToModel( const QList<QString>& wellLogFilePaths ); std::vector<RimWellLogFile*> addWellLogsToModel( const QList<QString>& wellLogFilePaths, QStringList* errorMessages );
QString scriptDirectories() const; QString scriptDirectories() const;
QString scriptEditorPath() const; QString scriptEditorPath() const;
@@ -210,7 +210,7 @@ void RiaRegressionTestRunner::runRegressionTest()
QString fullPathGeneratedFolder = testCaseFolder.absoluteFilePath( generatedFolderName ); QString fullPathGeneratedFolder = testCaseFolder.absoluteFilePath( generatedFolderName );
RicSnapshotAllViewsToFileFeature::exportSnapshotOfViewsIntoFolder( fullPathGeneratedFolder ); RicSnapshotAllViewsToFileFeature::exportSnapshotOfViewsIntoFolder( fullPathGeneratedFolder );
RicSnapshotAllPlotsToFileFeature::exportSnapshotOfAllPlotsIntoFolder( fullPathGeneratedFolder ); RicSnapshotAllPlotsToFileFeature::exportSnapshotOfPlotsIntoFolder( fullPathGeneratedFolder );
app->closeProject(); app->closeProject();
} }
@@ -33,6 +33,11 @@ ${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.h
${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.h ${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.h
${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.h ${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.h
${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.h ${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.h
${CMAKE_CURRENT_LIST_DIR}/RicfNewWellBoreStabilityPlotFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicfImportWellPaths.h
${CMAKE_CURRENT_LIST_DIR}/RicfImportWellLogFiles.h
${CMAKE_CURRENT_LIST_DIR}/RicfImportFormationNames.h
${CMAKE_CURRENT_LIST_DIR}/RicfExportWellLogPlotData.h
) )
set (SOURCE_GROUP_SOURCE_FILES set (SOURCE_GROUP_SOURCE_FILES
@@ -69,6 +74,11 @@ ${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.cpp ${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.cpp ${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.cpp ${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCreateWellBoreStabilityPlotFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfImportWellPaths.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfImportWellLogFiles.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfImportFormationNames.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfExportWellLogPlotData.cpp
) )
list(APPEND CODE_HEADER_FILES list(APPEND CODE_HEADER_FILES
@@ -26,6 +26,15 @@ RicfCommandResponse::RicfCommandResponse( Status status, const QString& message
updateStatus( status, message ); updateStatus( status, message );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCommandResponse::RicfCommandResponse( caf::PdmObject* ok_result )
: m_status( COMMAND_OK )
, m_result( ok_result )
{
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -35,11 +44,11 @@ RicfCommandResponse::Status RicfCommandResponse::status() const
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// /// The resulting message is sent in HTTP metadata and must not have any newlines.
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QString RicfCommandResponse::message() const QString RicfCommandResponse::sanitizedResponseMessage() const
{ {
return m_messages.join( "\n" ); return m_messages.join( ";;" );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -47,7 +56,7 @@ QString RicfCommandResponse::message() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
caf::PdmObject* RicfCommandResponse::result() const caf::PdmObject* RicfCommandResponse::result() const
{ {
return m_result.p(); return m_result.get();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -55,7 +64,7 @@ caf::PdmObject* RicfCommandResponse::result() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicfCommandResponse::setResult( caf::PdmObject* result ) void RicfCommandResponse::setResult( caf::PdmObject* result )
{ {
m_result = result; m_result.reset( result );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -63,8 +72,11 @@ void RicfCommandResponse::setResult( caf::PdmObject* result )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicfCommandResponse::updateStatus( Status status, const QString& message ) void RicfCommandResponse::updateStatus( Status status, const QString& message )
{ {
QString cleanedMessage = message;
cleanedMessage.replace( '\n', ";;" );
m_status = std::max( m_status, status ); m_status = std::max( m_status, status );
if ( !message.isEmpty() ) m_messages.push_back( QString( "%1:%2" ).arg( statusLabel( status ) ).arg( message ) ); if ( !message.isEmpty() )
m_messages.push_back( QString( "%1: %2" ).arg( statusLabel( status ) ).arg( cleanedMessage ) );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -43,9 +43,10 @@ public:
public: public:
RicfCommandResponse( Status status = COMMAND_OK, const QString& message = "" ); RicfCommandResponse( Status status = COMMAND_OK, const QString& message = "" );
RicfCommandResponse( caf::PdmObject* ok_result );
Status status() const; Status status() const;
QString message() const; QString sanitizedResponseMessage() const;
caf::PdmObject* result() const; caf::PdmObject* result() const;
void setResult( caf::PdmObject* result ); void setResult( caf::PdmObject* result );
void updateStatus( Status status, const QString& message ); void updateStatus( Status status, const QString& message );
@@ -56,5 +57,5 @@ private:
private: private:
Status m_status; Status m_status;
QStringList m_messages; QStringList m_messages;
caf::PdmPointer<caf::PdmObject> m_result; std::unique_ptr<caf::PdmObject> m_result;
}; };
@@ -22,6 +22,11 @@
#include "cafPdmField.h" #include "cafPdmField.h"
//==================================================================================================
//
//
//
//==================================================================================================
class RicfCreateViewResult : public caf::PdmObject class RicfCreateViewResult : public caf::PdmObject
{ {
CAF_PDM_HEADER_INIT; CAF_PDM_HEADER_INIT;
@@ -0,0 +1,99 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicfCreateWellBoreStabilityPlotFeature.h"
#include "RiaApplication.h"
#include "RiaLogging.h"
#include "WellLogCommands/RicNewWellBoreStabilityPlotFeature.h"
#include "RimGeoMechCase.h"
#include "RimGeoMechView.h"
#include "RimProject.h"
#include "RimWellBoreStabilityPlot.h"
#include "RimWellPath.h"
#include <QAction>
CAF_PDM_SOURCE_INIT( RicfCreateWbsPlotResult, "createWbsPlotResult" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCreateWbsPlotResult::RicfCreateWbsPlotResult( int viewId /*= -1*/ )
{
CAF_PDM_InitObject( "wbs_result", "", "", "" );
CAF_PDM_InitField( &this->viewId, "viewId", viewId, "", "", "", "" );
}
CAF_PDM_SOURCE_INIT( RicfCreateWellBoreStabilityPlotFeature, "createWellBoreStabilityPlot" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCreateWellBoreStabilityPlotFeature::RicfCreateWellBoreStabilityPlotFeature()
{
RICF_InitField( &m_caseId, "caseId", -1, "GeoMech Case Id", "", "", "" );
RICF_InitField( &m_wellPath, "wellPath", QString( "" ), "Well Path", "", "", "" );
RICF_InitField( &m_timeStep, "timeStep", -1, "Time Step", "", "", "" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCommandResponse RicfCreateWellBoreStabilityPlotFeature::execute()
{
RimProject* project = RiaApplication::instance()->project();
std::vector<RimGeoMechCase*> geoMechCases;
project->descendantsIncludingThisOfType( geoMechCases );
RimGeoMechCase* chosenCase = nullptr;
for ( RimGeoMechCase* geoMechCase : geoMechCases )
{
if ( geoMechCase->caseId() == m_caseId() )
{
chosenCase = geoMechCase;
break;
}
}
RimWellPath* chosenWellPath = nullptr;
for ( RimWellPath* wellPath : project->allWellPaths() )
{
if ( wellPath->name() == m_wellPath() )
{
chosenWellPath = wellPath;
break;
}
}
if ( chosenCase && chosenWellPath && m_timeStep() >= 0 )
{
RimWellBoreStabilityPlot* wbsPlot = RicNewWellBoreStabilityPlotFeature::createPlot( chosenCase,
chosenWellPath,
m_timeStep() );
RicfCommandResponse response;
response.setResult( new RicfCreateWbsPlotResult( wbsPlot->id() ) );
return response;
}
QString error = QString( "createWellBoreStabilityPlot: Could not find GeoMech case with id %1" ).arg( m_caseId() );
RiaLogging::error( error );
return RicfCommandResponse( RicfCommandResponse::COMMAND_ERROR, error );
}
@@ -0,0 +1,56 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 "RicfCommandObject.h"
#include "cafPdmField.h"
//==================================================================================================
//
//
//
//==================================================================================================
class RicfCreateWbsPlotResult : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
RicfCreateWbsPlotResult( int viewId = -1 );
public:
caf::PdmField<int> viewId;
};
//==================================================================================================
//
//
//
//==================================================================================================
class RicfCreateWellBoreStabilityPlotFeature : public RicfCommandObject
{
CAF_PDM_HEADER_INIT;
public:
RicfCreateWellBoreStabilityPlotFeature();
RicfCommandResponse execute() override;
private:
caf::PdmField<int> m_caseId;
caf::PdmField<QString> m_wellPath;
caf::PdmField<int> m_timeStep;
};
@@ -53,6 +53,7 @@ RicfExportSnapshots::RicfExportSnapshots()
RICF_InitField( &m_prefix, "prefix", QString(), "Prefix", "", "", "" ); RICF_InitField( &m_prefix, "prefix", QString(), "Prefix", "", "", "" );
RICF_InitField( &m_caseId, "caseId", -1, "Case Id", "", "", "" ); RICF_InitField( &m_caseId, "caseId", -1, "Case Id", "", "", "" );
RICF_InitField( &m_viewId, "viewId", -1, "View Id", "", "", "" ); RICF_InitField( &m_viewId, "viewId", -1, "View Id", "", "", "" );
RICF_InitField( &m_exportFolder, "exportFolder", QString(), "Export Folder", "", "", "" );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -74,6 +75,11 @@ RicfCommandResponse RicfExportSnapshots::execute()
QString absolutePathToSnapshotDir = RicfCommandFileExecutor::instance()->getExportPath( QString absolutePathToSnapshotDir = RicfCommandFileExecutor::instance()->getExportPath(
RicfCommandFileExecutor::SNAPSHOTS ); RicfCommandFileExecutor::SNAPSHOTS );
if ( !m_exportFolder().isEmpty() )
{
absolutePathToSnapshotDir = m_exportFolder;
}
if ( absolutePathToSnapshotDir.isNull() ) if ( absolutePathToSnapshotDir.isNull() )
{ {
absolutePathToSnapshotDir = RiaApplication::instance()->createAbsolutePathFromProjectRelativePath( absolutePathToSnapshotDir = RiaApplication::instance()->createAbsolutePathFromProjectRelativePath(
@@ -88,7 +94,9 @@ RicfCommandResponse RicfExportSnapshots::execute()
} }
if ( m_type == RicfExportSnapshots::PLOTS || m_type == RicfExportSnapshots::ALL ) if ( m_type == RicfExportSnapshots::PLOTS || m_type == RicfExportSnapshots::ALL )
{ {
RicSnapshotAllPlotsToFileFeature::exportSnapshotOfAllPlotsIntoFolder( absolutePathToSnapshotDir, m_prefix ); RicSnapshotAllPlotsToFileFeature::exportSnapshotOfPlotsIntoFolder( absolutePathToSnapshotDir,
m_prefix,
m_viewId() );
} }
mainWnd->loadWinGeoAndDockToolBarLayout(); mainWnd->loadWinGeoAndDockToolBarLayout();
@@ -52,4 +52,5 @@ private:
caf::PdmField<QString> m_prefix; caf::PdmField<QString> m_prefix;
caf::PdmField<int> m_caseId; caf::PdmField<int> m_caseId;
caf::PdmField<int> m_viewId; caf::PdmField<int> m_viewId;
caf::PdmField<QString> m_exportFolder;
}; };
@@ -0,0 +1,130 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicfExportWellLogPlotData.h"
#include "RiaApplication.h"
#include "RiaLogging.h"
#include "ExportCommands/RicExportToLasFileFeature.h"
#include "WellLogCommands/RicAsciiExportWellLogPlotFeature.h"
#include "RimProject.h"
#include "RimWellLogPlot.h"
#include <QDir>
#include <QFileInfo>
#include <QStringList>
namespace caf
{
template <>
void RicfExportWellLogPlotData::ExportFormatEnum::setUp()
{
addItem( RicfExportWellLogPlotData::LAS, "LAS", "LAS" );
addItem( RicfExportWellLogPlotData::ASCII, "ASCII", "ASCII" );
setDefault( RicfExportWellLogPlotData::LAS );
}
} // namespace caf
CAF_PDM_SOURCE_INIT( RicfExportWellLogPlotDataResult, "exportWellLogPlotDataResult" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfExportWellLogPlotDataResult::RicfExportWellLogPlotDataResult()
{
CAF_PDM_InitObject( "export_well_data_result", "", "", "" );
CAF_PDM_InitFieldNoDefault( &this->exportedFiles, "exportedFiles", "", "", "", "" );
}
CAF_PDM_SOURCE_INIT( RicfExportWellLogPlotData, "exportWellLogPlotData" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfExportWellLogPlotData::RicfExportWellLogPlotData()
{
RICF_InitFieldNoDefault( &m_format, "exportFormat", "", "", "", "" );
RICF_InitField( &m_viewId, "viewId", -1, "", "", "", "" );
RICF_InitField( &m_folder, "exportFolder", QString(), "", "", "", "" );
RICF_InitField( &m_filePrefix, "filePrefix", QString(), "", "", "", "" );
RICF_InitField( &m_exportTvdRkb, "exportTvdRkb", false, "", "", "", "" );
RICF_InitField( &m_capitalizeFileNames, "capitalizeFileNames", false, "", "", "", "" );
RICF_InitField( &m_resampleInterval, "resampleInterval", 0.0, "", "", "", "" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCommandResponse RicfExportWellLogPlotData::execute()
{
QStringList errorMessages;
RicfCommandResponse response;
if ( QFileInfo::exists( m_folder ) )
{
std::vector<RimWellLogPlot*> plots;
RiaApplication::instance()->project()->descendantsIncludingThisOfType( plots );
for ( RimWellLogPlot* plot : plots )
{
if ( plot->id() == m_viewId() )
{
RicfExportWellLogPlotDataResult* result = new RicfExportWellLogPlotDataResult;
if ( m_format() == ASCII )
{
QString validFileName =
RicAsciiExportWellLogPlotFeature::makeValidExportFileName( plot,
m_folder(),
m_filePrefix(),
m_capitalizeFileNames() );
if ( RicAsciiExportWellLogPlotFeature::exportAsciiForWellLogPlot( validFileName, plot ) )
{
result->exportedFiles.v().push_back( validFileName );
}
}
else
{
std::vector<QString> exportedFiles =
RicExportToLasFileFeature::exportToLasFiles( m_folder(),
m_filePrefix(),
plot,
m_exportTvdRkb(),
m_capitalizeFileNames(),
m_resampleInterval() );
result->exportedFiles.v() = exportedFiles;
}
response.setResult( result );
if ( result->exportedFiles().empty() )
{
errorMessages << "No files exported";
}
}
}
}
else
{
errorMessages << ( m_folder() + " does not exist" );
}
for ( QString errorMessage : errorMessages )
{
response.updateStatus( RicfCommandResponse::COMMAND_ERROR, errorMessage );
}
return response;
}
@@ -0,0 +1,72 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 "RicfCommandObject.h"
#include "cafAppEnum.h"
#include "cafPdmField.h"
//==================================================================================================
//
//
//
//==================================================================================================
class RicfExportWellLogPlotDataResult : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
RicfExportWellLogPlotDataResult();
public:
caf::PdmField<std::vector<QString>> exportedFiles;
};
//==================================================================================================
//
//
//
//==================================================================================================
class RicfExportWellLogPlotData : public RicfCommandObject
{
CAF_PDM_HEADER_INIT;
public:
// Values are exposed in gRPC .proto. Do not change without also changing .proto
enum ExportFormat
{
LAS,
ASCII
};
typedef caf::AppEnum<ExportFormat> ExportFormatEnum;
public:
RicfExportWellLogPlotData();
RicfCommandResponse execute() override;
private:
caf::PdmField<ExportFormatEnum> m_format;
caf::PdmField<int> m_viewId;
caf::PdmField<QString> m_folder;
caf::PdmField<QString> m_filePrefix;
caf::PdmField<bool> m_exportTvdRkb;
caf::PdmField<bool> m_capitalizeFileNames;
caf::PdmField<double> m_resampleInterval;
};
@@ -0,0 +1,99 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicfImportFormationNames.h"
#include "RiaApplication.h"
#include "RicImportFormationNamesFeature.h"
#include "RimCase.h"
#include "RimFormationNames.h"
#include "RimProject.h"
#include <QFileInfo>
CAF_PDM_SOURCE_INIT( RicfImportFormationNames, "importFormationNames" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfImportFormationNames::RicfImportFormationNames()
{
RICF_InitFieldNoDefault( &m_formationFiles, "formationFiles", "", "", "", "" );
RICF_InitField( &m_applyToCaseId, "applyToCaseId", -1, "", "", "", "" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCommandResponse RicfImportFormationNames::execute()
{
QStringList errorMessages, warningMessages;
if ( !m_formationFiles().empty() )
{
QStringList formationFileList;
for ( QString formationFile : m_formationFiles() )
{
if ( QFileInfo::exists( formationFile ) )
{
formationFileList.push_back( formationFile );
}
else
{
errorMessages.push_back( QString( "%1 does not exist" ).arg( formationFile ) );
}
}
RimFormationNames* formationNames = RicImportFormationNamesFeature::importFormationFiles( formationFileList );
if ( formationNames )
{
if ( m_applyToCaseId() != -1 )
{
bool foundCase = false;
std::vector<RimCase*> cases;
RiaApplication::instance()->project()->allCases( cases );
for ( RimCase* rimCase : cases )
{
if ( rimCase->caseId() == m_applyToCaseId() )
{
rimCase->setFormationNames( formationNames );
rimCase->updateConnectedEditors();
foundCase = true;
break;
}
}
if ( !foundCase ) warningMessages << "Could not find the case to apply the formations to";
}
}
}
else
{
errorMessages << "No formation files provided";
}
RicfCommandResponse response;
for ( QString warningMessage : warningMessages )
{
response.updateStatus( RicfCommandResponse::COMMAND_WARNING, warningMessage );
}
for ( QString errorMessage : errorMessages )
{
response.updateStatus( RicfCommandResponse::COMMAND_ERROR, errorMessage );
}
return response;
}
@@ -0,0 +1,43 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 "RicfCommandObject.h"
#include "cafPdmField.h"
#include <QString>
#include <vector>
//==================================================================================================
///
///
//==================================================================================================
class RicfImportFormationNames : public RicfCommandObject
{
CAF_PDM_HEADER_INIT;
public:
RicfImportFormationNames();
RicfCommandResponse execute() override;
private:
caf::PdmField<std::vector<QString>> m_formationFiles;
caf::PdmField<int> m_applyToCaseId;
};
@@ -0,0 +1,115 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicfImportWellLogFiles.h"
#include "WellLogCommands/RicWellLogsImportFileFeature.h"
#include "RimWellLogFile.h"
#include <QDir>
#include <QFileInfo>
#include <QStringList>
CAF_PDM_SOURCE_INIT( RicfImportWellLogFilesResult, "importWellLogFilesResult" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfImportWellLogFilesResult::RicfImportWellLogFilesResult()
{
CAF_PDM_InitObject( "well_log_files_result", "", "", "" );
CAF_PDM_InitFieldNoDefault( &wellPathNames, "wellPathNames", "", "", "", "" );
}
CAF_PDM_SOURCE_INIT( RicfImportWellLogFiles, "importWellLogFiles" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfImportWellLogFiles::RicfImportWellLogFiles()
{
RICF_InitFieldNoDefault( &m_wellLogFileFolder, "wellLogFolder", "", "", "", "" );
RICF_InitFieldNoDefault( &m_wellLogFilePaths, "wellLogFiles", "", "", "", "" );
}
RicfCommandResponse RicfImportWellLogFiles::execute()
{
QStringList errorMessages, warningMessages;
QStringList wellLogFilePaths;
QDir wellPathFolder( m_wellLogFileFolder );
if ( wellPathFolder.exists() )
{
QStringList nameFilters;
nameFilters << RicWellLogsImportFileFeature::wellLogFileNameFilters();
QStringList relativePaths = wellPathFolder.entryList( nameFilters, QDir::Files | QDir::NoDotAndDotDot );
for ( QString relativePath : relativePaths )
{
wellLogFilePaths.push_back( wellPathFolder.absoluteFilePath( relativePath ) );
}
}
else
{
errorMessages << ( m_wellLogFileFolder() + " doesn't exist" );
}
for ( QString wellLogFilePath : m_wellLogFilePaths() )
{
if ( QFileInfo::exists( wellLogFilePath ) )
{
wellLogFilePaths.push_back( wellLogFilePath );
}
else
{
errorMessages << ( wellLogFilePath + " doesn't exist" );
}
}
RicfCommandResponse response;
if ( !wellLogFilePaths.empty() )
{
std::vector<RimWellLogFile*> importedWellLogFiles =
RicWellLogsImportFileFeature::importWellLogFiles( wellLogFilePaths, &warningMessages );
if ( !importedWellLogFiles.empty() )
{
RicfImportWellLogFilesResult* result = new RicfImportWellLogFilesResult;
for ( RimWellLogFile* wellLogFile : importedWellLogFiles )
{
result->wellPathNames.v().push_back( wellLogFile->wellName() );
}
response.setResult( result );
}
}
else
{
warningMessages << "No well log files found";
}
for ( QString warningMessage : warningMessages )
{
response.updateStatus( RicfCommandResponse::COMMAND_WARNING, warningMessage );
}
for ( QString errorMessage : errorMessages )
{
response.updateStatus( RicfCommandResponse::COMMAND_ERROR, errorMessage );
}
return response;
}
@@ -0,0 +1,58 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 "RicfCommandObject.h"
#include "cafPdmField.h"
#include <QString>
#include <vector>
//==================================================================================================
///
///
//==================================================================================================
class RicfImportWellLogFilesResult : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
RicfImportWellLogFilesResult();
public:
caf::PdmField<std::vector<QString>> wellPathNames;
};
//==================================================================================================
///
///
//==================================================================================================
class RicfImportWellLogFiles : public RicfCommandObject
{
CAF_PDM_HEADER_INIT;
public:
RicfImportWellLogFiles();
RicfCommandResponse execute() override;
private:
caf::PdmField<QString> m_wellLogFileFolder;
caf::PdmField<std::vector<QString>> m_wellLogFilePaths;
};
@@ -0,0 +1,116 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RicfImportWellPaths.h"
#include "WellPathCommands/RicWellPathsImportFileFeature.h"
#include "RimFileWellPath.h"
#include <QDir>
#include <QFileInfo>
#include <QStringList>
CAF_PDM_SOURCE_INIT( RicfImportWellPathsResult, "importWellPathsResult" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfImportWellPathsResult::RicfImportWellPathsResult()
{
CAF_PDM_InitObject( "well_path_result", "", "", "" );
CAF_PDM_InitFieldNoDefault( &wellPathNames, "wellPathNames", "", "", "", "" );
}
CAF_PDM_SOURCE_INIT( RicfImportWellPaths, "importWellPaths" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfImportWellPaths::RicfImportWellPaths()
{
RICF_InitFieldNoDefault( &m_wellPathFolder, "wellPathFolder", "", "", "", "" );
RICF_InitFieldNoDefault( &m_wellPathFiles, "wellPathFiles", "", "", "", "" );
}
RicfCommandResponse RicfImportWellPaths::execute()
{
QStringList errorMessages, warningMessages;
QStringList wellPathFiles;
QDir wellPathFolder( m_wellPathFolder );
if ( wellPathFolder.exists() )
{
QStringList nameFilters;
nameFilters << RicWellPathsImportFileFeature::wellPathNameFilters();
QStringList relativePaths = wellPathFolder.entryList( nameFilters, QDir::Files | QDir::NoDotAndDotDot );
for ( QString relativePath : relativePaths )
{
wellPathFiles.push_back( wellPathFolder.absoluteFilePath( relativePath ) );
}
}
else
{
errorMessages << ( m_wellPathFolder() + " does not exist" );
}
for ( QString wellPathFile : m_wellPathFiles() )
{
if ( QFileInfo::exists( wellPathFile ) )
{
wellPathFiles.push_back( wellPathFile );
}
else
{
errorMessages << ( wellPathFile + " does not exist" );
}
}
RicfCommandResponse response;
if ( !wellPathFiles.empty() )
{
std::vector<RimFileWellPath*> importedWellPaths = RicWellPathsImportFileFeature::importWellPaths( wellPathFiles,
&warningMessages );
if ( !importedWellPaths.empty() )
{
RicfImportWellPathsResult* wellPathsResult = new RicfImportWellPathsResult;
for ( RimFileWellPath* wellPath : importedWellPaths )
{
wellPathsResult->wellPathNames.v().push_back( wellPath->name() );
}
response.setResult( wellPathsResult );
}
}
else
{
warningMessages << "No well paths found";
}
for ( QString warningMessage : warningMessages )
{
response.updateStatus( RicfCommandResponse::COMMAND_WARNING, warningMessage );
}
for ( QString errorMessage : errorMessages )
{
response.updateStatus( RicfCommandResponse::COMMAND_ERROR, errorMessage );
}
return response;
}
@@ -0,0 +1,58 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 "RicfCommandObject.h"
#include "cafPdmField.h"
#include <QString>
#include <vector>
//==================================================================================================
///
///
//==================================================================================================
class RicfImportWellPathsResult : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
RicfImportWellPathsResult();
public:
caf::PdmField<std::vector<QString>> wellPathNames;
};
//==================================================================================================
///
///
//==================================================================================================
class RicfImportWellPaths : public RicfCommandObject
{
CAF_PDM_HEADER_INIT;
public:
RicfImportWellPaths();
RicfCommandResponse execute() override;
private:
caf::PdmField<QString> m_wellPathFolder;
caf::PdmField<std::vector<QString>> m_wellPathFiles;
};
@@ -29,6 +29,8 @@
#include "RigWellLogCurveData.h" #include "RigWellLogCurveData.h"
#include "RimWellLogCurve.h" #include "RimWellLogCurve.h"
#include "RimWellLogPlot.h"
#include "RimWellLogTrack.h"
#include "cafPdmUiPropertyViewDialog.h" #include "cafPdmUiPropertyViewDialog.h"
#include "cafSelectionManager.h" #include "cafSelectionManager.h"
@@ -38,6 +40,73 @@
CAF_CMD_SOURCE_INIT( RicExportToLasFileFeature, "RicExportToLasFileFeature" ); CAF_CMD_SOURCE_INIT( RicExportToLasFileFeature, "RicExportToLasFileFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<QString> RicExportToLasFileFeature::exportToLasFiles( const QString& exportFolder,
const QString& exportPrefix,
const RimWellLogPlot* plot,
bool exportTvdRkb,
bool capitalizeFileNames,
double resampleInterval )
{
std::vector<RimWellLogCurve*> allCurves;
std::vector<RimWellLogTrack*> tracks = plot->visibleTracks();
for ( RimWellLogTrack* track : tracks )
{
std::vector<RimWellLogCurve*> curves = track->visibleCurvesVector();
allCurves.insert( allCurves.end(), curves.begin(), curves.end() );
}
std::vector<QString> wellNames;
std::vector<double> rkbDiffs;
{
RigLasFileExporter lasExporter( allCurves );
lasExporter.wellPathsAndRkbDiff( &wellNames, &rkbDiffs );
return exportToLasFiles( exportFolder,
exportPrefix,
allCurves,
wellNames,
rkbDiffs,
capitalizeFileNames,
resampleInterval );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<QString> RicExportToLasFileFeature::exportToLasFiles( const QString& exportFolder,
const QString& filePrefix,
std::vector<RimWellLogCurve*> curves,
const std::vector<QString>& wellNames,
const std::vector<double>& rkbDiffs,
bool capitalizeFileNames,
double resampleInterval )
{
RigLasFileExporter lasExporter( curves );
std::vector<QString> writtenFiles;
if ( resampleInterval > 0.0 )
{
lasExporter.setResamplingInterval( resampleInterval );
}
if ( !rkbDiffs.empty() )
{
lasExporter.setRkbDiffs( wellNames, rkbDiffs );
}
writtenFiles = lasExporter.writeToFolder( exportFolder, filePrefix, capitalizeFileNames );
// Remember the path to next time
RiaApplication::instance()->setLastUsedDialogDirectory( "WELL_LOGS_DIR", exportFolder );
return writtenFiles;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -89,28 +158,33 @@ void RicExportToLasFileFeature::onActionTriggered( bool isChecked )
RicExportFeatureImpl::configureForExport( propertyDialog.dialogButtonBox() ); RicExportFeatureImpl::configureForExport( propertyDialog.dialogButtonBox() );
propertyDialog.resize( QSize( 400, 330 ) ); propertyDialog.resize( QSize( 400, 330 ) );
std::vector<QString> writtenFiles;
if ( propertyDialog.exec() == QDialog::Accepted && !featureUi.exportFolder().isEmpty() ) if ( propertyDialog.exec() == QDialog::Accepted && !featureUi.exportFolder().isEmpty() )
{ {
double resampleInterval = 0.0;
if ( featureUi.activateResample ) if ( featureUi.activateResample )
{ {
lasExporter.setResamplingInterval( featureUi.resampleInterval() ); resampleInterval = featureUi.resampleInterval();
} }
std::vector<QString> wellNames;
std::vector<double> rkbDiffs;
if ( featureUi.exportTvdrkb ) if ( featureUi.exportTvdrkb )
{ {
std::vector<QString> wellNames;
std::vector<double> rkbDiffs;
lasExporter.wellPathsAndRkbDiff( &wellNames, &rkbDiffs ); lasExporter.wellPathsAndRkbDiff( &wellNames, &rkbDiffs );
std::vector<double> userDefRkbDiff; std::vector<double> userDefRkbDiff;
featureUi.tvdrkbDiffForWellPaths( &userDefRkbDiff ); featureUi.tvdrkbDiffForWellPaths( &userDefRkbDiff );
lasExporter.setRkbDiffs( wellNames, userDefRkbDiff ); rkbDiffs = userDefRkbDiff;
} }
lasExporter.writeToFolder( featureUi.exportFolder(), featureUi.filePrefix(), featureUi.capitalizeFileName() ); exportToLasFiles( featureUi.exportFolder(),
featureUi.filePrefix(),
// Remember the path to next time curves,
RiaApplication::instance()->setLastUsedDialogDirectory( "WELL_LOGS_DIR", featureUi.exportFolder() ); wellNames,
rkbDiffs,
featureUi.capitalizeFileName,
resampleInterval );
} }
} }
@@ -21,9 +21,12 @@
#include "cafCmdFeature.h" #include "cafCmdFeature.h"
#include <QString>
#include <vector> #include <vector>
class RimWellLogCurve; class RimWellLogCurve;
class RimWellLogPlot;
//================================================================================================== //==================================================================================================
/// ///
@@ -32,6 +35,22 @@ class RicExportToLasFileFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public:
static std::vector<QString> exportToLasFiles( const QString& exportFolder,
const QString& filePrefix,
const RimWellLogPlot* plot,
bool exportTvdRkb = false,
bool capitalizeFileNames = false,
double resampleInterval = 0.0 );
static std::vector<QString> exportToLasFiles( const QString& exportFolder,
const QString& filePrefix,
std::vector<RimWellLogCurve*> curves,
const std::vector<QString>& wellNames = std::vector<QString>(),
const std::vector<double>& rkbDiffs = std::vector<double>(),
bool capitalizeFileNames = false,
double resampleInterval = 0.0 );
protected: protected:
// Overrides // Overrides
bool isCommandEnabled() override; bool isCommandEnabled() override;
@@ -57,7 +57,7 @@ void RicSnapshotAllPlotsToFileFeature::saveAllPlots()
// Save images in snapshot catalog relative to project directory // Save images in snapshot catalog relative to project directory
QString snapshotFolderName = app->createAbsolutePathFromProjectRelativePath( "snapshots" ); QString snapshotFolderName = app->createAbsolutePathFromProjectRelativePath( "snapshots" );
exportSnapshotOfAllPlotsIntoFolder( snapshotFolderName ); exportSnapshotOfPlotsIntoFolder( snapshotFolderName );
QString text = QString( "Exported snapshots to folder : \n%1" ).arg( snapshotFolderName ); QString text = QString( "Exported snapshots to folder : \n%1" ).arg( snapshotFolderName );
RiaLogging::info( text ); RiaLogging::info( text );
@@ -66,8 +66,9 @@ void RicSnapshotAllPlotsToFileFeature::saveAllPlots()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicSnapshotAllPlotsToFileFeature::exportSnapshotOfAllPlotsIntoFolder( const QString& snapshotFolderName, void RicSnapshotAllPlotsToFileFeature::exportSnapshotOfPlotsIntoFolder( const QString& snapshotFolderName,
const QString& prefix ) const QString& prefix,
int viewId )
{ {
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
@@ -87,7 +88,7 @@ void RicSnapshotAllPlotsToFileFeature::exportSnapshotOfAllPlotsIntoFolder( const
for ( auto viewWindow : viewWindows ) for ( auto viewWindow : viewWindows )
{ {
if ( viewWindow->isMdiWindow() && viewWindow->viewWidget() ) if ( viewWindow->isMdiWindow() && viewWindow->viewWidget() && ( viewId == -1 || viewId == viewWindow->id() ) )
{ {
QString fileName = RicSnapshotFilenameGenerator::generateSnapshotFileName( viewWindow ); QString fileName = RicSnapshotFilenameGenerator::generateSnapshotFileName( viewWindow );
if ( !prefix.isEmpty() ) if ( !prefix.isEmpty() )
@@ -32,7 +32,9 @@ class RicSnapshotAllPlotsToFileFeature : public caf::CmdFeature
public: public:
static void saveAllPlots(); static void saveAllPlots();
static void exportSnapshotOfAllPlotsIntoFolder( const QString& snapshotFolderName, const QString& prefix = "" ); static void exportSnapshotOfPlotsIntoFolder( const QString& snapshotFolderName,
const QString& prefix = "",
int viewId = -1 );
protected: protected:
// Overrides // Overrides
@@ -75,6 +75,8 @@ void RicAddStoredFlowCharacteristicsPlotFeature::onActionTriggered( bool isCheck
sourceObject->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); sourceObject->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) );
CVF_ASSERT( flowCharacteristicsPlot ); CVF_ASSERT( flowCharacteristicsPlot );
RiaApplication::instance()->project()->assignViewIdToView( flowCharacteristicsPlot );
flowPlotColl->addFlowCharacteristicsPlotToStoredPlots( flowCharacteristicsPlot ); flowPlotColl->addFlowCharacteristicsPlotToStoredPlots( flowCharacteristicsPlot );
flowCharacteristicsPlot->resolveReferencesRecursively(); flowCharacteristicsPlot->resolveReferencesRecursively();
@@ -73,6 +73,8 @@ void RicAddStoredWellAllocationPlotFeature::onActionTriggered( bool isChecked )
RimWellAllocationPlot* wellAllocationPlot = dynamic_cast<RimWellAllocationPlot*>( RimWellAllocationPlot* wellAllocationPlot = dynamic_cast<RimWellAllocationPlot*>(
sourceObject->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); sourceObject->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) );
RiaApplication::instance()->project()->assignViewIdToView( wellAllocationPlot );
CVF_ASSERT( wellAllocationPlot ); CVF_ASSERT( wellAllocationPlot );
flowPlotColl->addWellAllocPlotToStoredPlots( wellAllocationPlot ); flowPlotColl->addWellAllocPlotToStoredPlots( wellAllocationPlot );
+32 -27
View File
@@ -169,6 +169,7 @@ RimWellPath* RicWellLogTools::findWellPathWithLogFileFromSelection()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
template <typename ExtractionCurveType> template <typename ExtractionCurveType>
ExtractionCurveType* RicWellLogTools::addExtractionCurve( RimWellLogTrack* plotTrack, ExtractionCurveType* RicWellLogTools::addExtractionCurve( RimWellLogTrack* plotTrack,
RimCase* caseToApply,
Rim3dView* view, Rim3dView* view,
RimWellPath* wellPath, RimWellPath* wellPath,
const RimSimWellInView* simWell, const RimSimWellInView* simWell,
@@ -182,28 +183,26 @@ ExtractionCurveType* RicWellLogTools::addExtractionCurve( RimWellLogTrack*
cvf::Color3f curveColor = RicWellLogPlotCurveFeatureImpl::curveColorFromTable( plotTrack->curveCount() ); cvf::Color3f curveColor = RicWellLogPlotCurveFeatureImpl::curveColorFromTable( plotTrack->curveCount() );
curve->setColor( curveColor ); curve->setColor( curveColor );
RimCase* caseToApply = nullptr; RimWellLogPlot* plot = nullptr;
RimWellLogPlot* plot = nullptr;
plotTrack->firstAncestorOrThisOfTypeAsserted( plot ); plotTrack->firstAncestorOrThisOfTypeAsserted( plot );
RimWellLogCurveCommonDataSource* commonDataSource = plot->commonDataSource(); RimWellLogCurveCommonDataSource* commonDataSource = plot->commonDataSource();
if ( view ) if ( !caseToApply )
{ {
caseToApply = view->ownerCase(); if ( commonDataSource->caseToApply() )
} {
else if ( commonDataSource->caseToApply() ) caseToApply = commonDataSource->caseToApply();
{ }
caseToApply = commonDataSource->caseToApply(); else if ( plotTrack->formationNamesCase() )
} {
else if ( plotTrack->formationNamesCase() ) caseToApply = plotTrack->formationNamesCase();
{ }
caseToApply = plotTrack->formationNamesCase(); else
} {
else std::vector<RimCase*> allCases;
{ RiaApplication::instance()->project()->allCases( allCases );
std::vector<RimCase*> allCases; if ( !allCases.empty() ) caseToApply = allCases.front();
RiaApplication::instance()->project()->allCases( allCases ); }
if ( !allCases.empty() ) caseToApply = allCases.front();
} }
QString ownerSimWellName; QString ownerSimWellName;
@@ -267,7 +266,10 @@ ExtractionCurveType* RicWellLogTools::addExtractionCurve( RimWellLogTrack*
curve->setCase( caseToApply ); curve->setCase( caseToApply );
} }
curve->setPropertiesFromView( view ); if ( view )
{
curve->setPropertiesFromView( view );
}
plotTrack->addCurve( curve ); plotTrack->addCurve( curve );
@@ -370,6 +372,7 @@ RimWellLogFileCurve* RicWellLogTools::addFileCurve( RimWellLogTrack* plotTrack,
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimWellLogExtractionCurve* RicWellLogTools::addWellLogExtractionCurve( RimWellLogTrack* plotTrack, RimWellLogExtractionCurve* RicWellLogTools::addWellLogExtractionCurve( RimWellLogTrack* plotTrack,
RimCase* rimCase,
Rim3dView* view, Rim3dView* view,
RimWellPath* wellPath, RimWellPath* wellPath,
const RimSimWellInView* simWell, const RimSimWellInView* simWell,
@@ -378,6 +381,7 @@ RimWellLogExtractionCurve* RicWellLogTools::addWellLogExtractionCurve( RimWellLo
bool showPlotWindow /*= true */ ) bool showPlotWindow /*= true */ )
{ {
return addExtractionCurve<RimWellLogExtractionCurve>( plotTrack, return addExtractionCurve<RimWellLogExtractionCurve>( plotTrack,
rimCase,
view, view,
wellPath, wellPath,
simWell, simWell,
@@ -389,18 +393,19 @@ RimWellLogExtractionCurve* RicWellLogTools::addWellLogExtractionCurve( RimWellLo
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimWellLogWbsCurve* RicWellLogTools::addWellLogWbsCurve( RimWellLogTrack* plotTrack, RimWellLogWbsCurve* RicWellLogTools::addWellLogWbsCurve( RimWellLogTrack* plotTrack,
Rim3dView* view, RimCase* rimCase,
RimWellPath* wellPath, Rim3dView* view,
const RimSimWellInView* simWell, RimWellPath* wellPath,
int branchIndex, int branchIndex,
bool useBranchDetection, bool useBranchDetection,
bool showPlotWindow /*= true */ ) bool showPlotWindow /*= true */ )
{ {
return addExtractionCurve<RimWellLogWbsCurve>( plotTrack, return addExtractionCurve<RimWellLogWbsCurve>( plotTrack,
rimCase,
view, view,
wellPath, wellPath,
simWell, nullptr,
branchIndex, branchIndex,
useBranchDetection, useBranchDetection,
showPlotWindow ); showPlotWindow );
+10 -7
View File
@@ -22,6 +22,7 @@
#include <vector> #include <vector>
class RimCase;
class RimSimWellInView; class RimSimWellInView;
class Rim3dView; class Rim3dView;
class Rim3dWellLogCurveCollection; class Rim3dWellLogCurveCollection;
@@ -51,23 +52,25 @@ public:
static RimWellLogFileCurve* addFileCurve( RimWellLogTrack* plotTrack, bool showPlotWindow = true ); static RimWellLogFileCurve* addFileCurve( RimWellLogTrack* plotTrack, bool showPlotWindow = true );
static RimWellLogExtractionCurve* addWellLogExtractionCurve( RimWellLogTrack* plotTrack, static RimWellLogExtractionCurve* addWellLogExtractionCurve( RimWellLogTrack* plotTrack,
RimCase* rimCase,
Rim3dView* view, Rim3dView* view,
RimWellPath* wellPath, RimWellPath* wellPath,
const RimSimWellInView* simWell, const RimSimWellInView* simWell,
int branchIndex, int branchIndex,
bool useBranchDetection, bool useBranchDetection,
bool showPlotWindow = true ); bool showPlotWindow = true );
static RimWellLogWbsCurve* addWellLogWbsCurve( RimWellLogTrack* plotTrack, static RimWellLogWbsCurve* addWellLogWbsCurve( RimWellLogTrack* plotTrack,
Rim3dView* view, RimCase* rimCase,
RimWellPath* wellPath, Rim3dView* view,
const RimSimWellInView* simWell, RimWellPath* wellPath,
int branchIndex, int branchIndex,
bool useBranchDetection, bool useBranchDetection,
bool showPlotWindow = true ); bool showPlotWindow = true );
private: private:
template <typename ExtractionCurveType> template <typename ExtractionCurveType>
static ExtractionCurveType* addExtractionCurve( RimWellLogTrack* plotTrack, static ExtractionCurveType* addExtractionCurve( RimWellLogTrack* plotTrack,
RimCase* rimCase,
Rim3dView* view, Rim3dView* view,
RimWellPath* wellPath, RimWellPath* wellPath,
const RimSimWellInView* simWell, const RimSimWellInView* simWell,
@@ -115,7 +115,8 @@ void RicWellPathsImportSsihubFeature::onActionTriggered( bool isChecked )
QStringList wellPaths = wellImportwizard.absoluteFilePathsToWellPaths(); QStringList wellPaths = wellImportwizard.absoluteFilePathsToWellPaths();
if ( wellPaths.size() > 0 ) if ( wellPaths.size() > 0 )
{ {
app->addWellPathsToModel( wellPaths ); QStringList errorMessages;
app->addWellPathsToModel( wellPaths, &errorMessages );
app->project()->scheduleCreateDisplayModelAndRedrawAllViews(); app->project()->scheduleCreateDisplayModelAndRedrawAllViews();
} }
@@ -110,6 +110,21 @@ void RicAsciiExportWellLogPlotFeature::setupActionLook( QAction* actionToSetup )
actionToSetup->setIcon( QIcon( ":/Save.png" ) ); actionToSetup->setIcon( QIcon( ":/Save.png" ) );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RicAsciiExportWellLogPlotFeature::makeValidExportFileName( const RimWellLogPlot* wellLogPlot,
const QString& folder,
const QString& prefix,
bool capitalizeFileName )
{
QString fileName = folder + "/" + prefix + caf::Utils::makeValidFileBasename( wellLogPlot->description() ) + ".ascii";
if ( capitalizeFileName ) fileName = fileName.toUpper();
QDir dir( folder );
return dir.absoluteFilePath( fileName );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -20,6 +20,8 @@
#include "cafCmdFeature.h" #include "cafCmdFeature.h"
#include <QString>
class RimWellLogPlot; class RimWellLogPlot;
//================================================================================================== //==================================================================================================
@@ -29,11 +31,15 @@ class RicAsciiExportWellLogPlotFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public:
static QString makeValidExportFileName( const RimWellLogPlot* wellLogPlot,
const QString& folder,
const QString& prefix,
bool capitalizeFileName );
static bool exportAsciiForWellLogPlot( const QString& fileName, const RimWellLogPlot* wellLogPlot );
protected: protected:
bool isCommandEnabled() override; bool isCommandEnabled() override;
void onActionTriggered( bool isChecked ) override; void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override; void setupActionLook( QAction* actionToSetup ) override;
private:
static bool exportAsciiForWellLogPlot( const QString& fileName, const RimWellLogPlot* wellLogPlot );
}; };
@@ -68,6 +68,8 @@ void RicNewRftPlotFeature::onActionTriggered( bool isChecked )
QString wellName = selectedWellName(); QString wellName = selectedWellName();
RimWellRftPlot* rftPlot = new RimWellRftPlot(); RimWellRftPlot* rftPlot = new RimWellRftPlot();
RiaApplication::instance()->project()->assignViewIdToView( rftPlot );
rftPlot->setSimWellOrWellPathName( wellName ); rftPlot->setSimWellOrWellPathName( wellName );
RimWellLogTrack* plotTrack = new RimWellLogTrack(); RimWellLogTrack* plotTrack = new RimWellLogTrack();
@@ -58,6 +58,63 @@
CAF_CMD_SOURCE_INIT( RicNewWellBoreStabilityPlotFeature, "RicNewWellBoreStabilityPlotFeature" ); CAF_CMD_SOURCE_INIT( RicNewWellBoreStabilityPlotFeature, "RicNewWellBoreStabilityPlotFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimWellBoreStabilityPlot*
RicNewWellBoreStabilityPlotFeature::createPlot( RimGeoMechCase* geoMechCase, RimWellPath* wellPath, int timeStep )
{
caf::ProgressInfo progInfo( 100, "Creating Well Bore Stability Plot" );
RimWellBoreStabilityPlot* plot = RicNewWellLogPlotFeatureImpl::createWellBoreStabilityPlot( false,
"Well Bore Stability" );
{
auto task = progInfo.task( "Creating formation track", 2 );
createFormationTrack( plot, wellPath, geoMechCase );
}
{
auto task = progInfo.task( "Creating well design track", 3 );
createCasingShoeTrack( plot, wellPath, geoMechCase );
}
{
auto task = progInfo.task( "Creating parameters track", 15 );
createParametersTrack( plot, wellPath, geoMechCase, timeStep );
}
{
auto task = progInfo.task( "Creating stability curves track", 60 );
createStabilityCurvesTrack( plot, wellPath, geoMechCase, timeStep );
}
{
auto task = progInfo.task( "Creating angles track", 15 );
createAnglesTrack( plot, wellPath, geoMechCase, timeStep );
}
{
auto task = progInfo.task( "Updating all tracks", 5 );
plot->enableAllAutoNameTags( true );
plot->setPlotTitleVisible( true );
plot->setTrackLegendsVisible( true );
plot->setTrackLegendsHorizontal( true );
plot->setDepthType( RimWellLogPlot::TRUE_VERTICAL_DEPTH );
plot->setDepthAutoZoom( true );
RicNewWellLogPlotFeatureImpl::updateAfterCreation( plot );
}
RiuPlotMainWindowTools::selectAsCurrentItem( plot );
// Make sure the summary plot window is visible
RiuPlotMainWindowTools::showPlotMainWindow();
return plot;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -103,54 +160,14 @@ void RicNewWellBoreStabilityPlotFeature::onActionTriggered( bool isChecked )
RimGeoMechView* geoMechView = dynamic_cast<RimGeoMechView*>( view ); RimGeoMechView* geoMechView = dynamic_cast<RimGeoMechView*>( view );
if ( !geoMechView ) return; if ( !geoMechView ) return;
caf::ProgressInfo progInfo( 100, "Creating Well Bore Stability Plot" ); RimGeoMechCase* geoMechCase = geoMechView->geoMechCase();
RimGeoMechCase* geoMechCase = geoMechView->geoMechCase();
RimWellBoreStabilityPlot* plot = RicNewWellLogPlotFeatureImpl::createWellBoreStabilityPlot( false,
"Well Bore Stability" );
if ( !geoMechCase )
{ {
auto task = progInfo.task( "Creating formation track", 2 ); return;
createFormationTrack( plot, wellPath, geoMechCase );
} }
{ createPlot( geoMechCase, wellPath, view->currentTimeStep() );
auto task = progInfo.task( "Creating well design track", 3 );
createCasingShoeTrack( plot, wellPath, geoMechCase );
}
{
auto task = progInfo.task( "Creating parameters track", 15 );
createParametersTrack( plot, wellPath, geoMechView );
}
{
auto task = progInfo.task( "Creating stability curves track", 60 );
createStabilityCurvesTrack( plot, wellPath, geoMechView );
}
{
auto task = progInfo.task( "Creating angles track", 15 );
createAnglesTrack( plot, wellPath, geoMechView );
}
{
auto task = progInfo.task( "Updating all tracks", 5 );
plot->enableAllAutoNameTags( true );
plot->setPlotTitleVisible( true );
plot->setTrackLegendsVisible( true );
plot->setTrackLegendsHorizontal( true );
plot->setDepthType( RimWellLogPlot::TRUE_VERTICAL_DEPTH );
plot->setDepthAutoZoom( true );
RicNewWellLogPlotFeatureImpl::updateAfterCreation( plot );
}
RiuPlotMainWindowTools::selectAsCurrentItem( plot );
// Make sure the summary plot window is visible
RiuPlotMainWindowTools::showPlotMainWindow();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -203,7 +220,8 @@ void RicNewWellBoreStabilityPlotFeature::createCasingShoeTrack( RimWellBoreStabi
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicNewWellBoreStabilityPlotFeature::createParametersTrack( RimWellBoreStabilityPlot* plot, void RicNewWellBoreStabilityPlotFeature::createParametersTrack( RimWellBoreStabilityPlot* plot,
RimWellPath* wellPath, RimWellPath* wellPath,
RimGeoMechView* geoMechView ) RimGeoMechCase* geoMechCase,
int timeStep )
{ {
RimWellLogTrack* paramCurvesTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false, RimWellLogTrack* paramCurvesTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false,
"WBS Parameters", "WBS Parameters",
@@ -213,7 +231,7 @@ void RicNewWellBoreStabilityPlotFeature::createParametersTrack( RimWellBoreStabi
paramCurvesTrack->setTickIntervals( 0.5, 0.05 ); paramCurvesTrack->setTickIntervals( 0.5, 0.05 );
paramCurvesTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR_AND_MINOR ); paramCurvesTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR_AND_MINOR );
paramCurvesTrack->setFormationWellPath( wellPath ); paramCurvesTrack->setFormationWellPath( wellPath );
paramCurvesTrack->setFormationCase( geoMechView->geoMechCase() ); paramCurvesTrack->setFormationCase( geoMechCase );
paramCurvesTrack->setAnnotationType( RiuPlotAnnotationTool::CURVE_ANNOTATIONS ); paramCurvesTrack->setAnnotationType( RiuPlotAnnotationTool::CURVE_ANNOTATIONS );
paramCurvesTrack->setShowRegionLabels( true ); paramCurvesTrack->setShowRegionLabels( true );
paramCurvesTrack->setVisible( false ); paramCurvesTrack->setVisible( false );
@@ -226,14 +244,15 @@ void RicNewWellBoreStabilityPlotFeature::createParametersTrack( RimWellBoreStabi
const QString& resultName = resultNames[i]; const QString& resultName = resultNames[i];
RigFemResultAddress resAddr( RIG_WELLPATH_DERIVED, resultName.toStdString(), "" ); RigFemResultAddress resAddr( RIG_WELLPATH_DERIVED, resultName.toStdString(), "" );
RimWellLogExtractionCurve* curve = RicWellLogTools::addWellLogExtractionCurve( paramCurvesTrack, RimWellLogExtractionCurve* curve = RicWellLogTools::addWellLogExtractionCurve( paramCurvesTrack,
geoMechView, geoMechCase,
nullptr,
wellPath, wellPath,
nullptr, nullptr,
-1, -1,
false, false,
false ); false );
curve->setGeoMechResultAddress( resAddr ); curve->setGeoMechResultAddress( resAddr );
curve->setCurrentTimeStep( geoMechView->currentTimeStep() ); curve->setCurrentTimeStep( timeStep );
curve->setColor( colors[i % colors.size()] ); curve->setColor( colors[i % colors.size()] );
curve->setLineThickness( 2 ); curve->setLineThickness( 2 );
curve->loadDataAndUpdate( false ); curve->loadDataAndUpdate( false );
@@ -247,7 +266,8 @@ void RicNewWellBoreStabilityPlotFeature::createParametersTrack( RimWellBoreStabi
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicNewWellBoreStabilityPlotFeature::createStabilityCurvesTrack( RimWellBoreStabilityPlot* plot, void RicNewWellBoreStabilityPlotFeature::createStabilityCurvesTrack( RimWellBoreStabilityPlot* plot,
RimWellPath* wellPath, RimWellPath* wellPath,
RimGeoMechView* geoMechView ) RimGeoMechCase* geoMechCase,
int timeStep )
{ {
RimWellLogTrack* stabilityCurvesTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false, RimWellLogTrack* stabilityCurvesTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false,
"Stability Curves", "Stability Curves",
@@ -257,7 +277,7 @@ void RicNewWellBoreStabilityPlotFeature::createStabilityCurvesTrack( RimWellBore
stabilityCurvesTrack->setTickIntervals( 0.5, 0.05 ); stabilityCurvesTrack->setTickIntervals( 0.5, 0.05 );
stabilityCurvesTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR_AND_MINOR ); stabilityCurvesTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR_AND_MINOR );
stabilityCurvesTrack->setFormationWellPath( wellPath ); stabilityCurvesTrack->setFormationWellPath( wellPath );
stabilityCurvesTrack->setFormationCase( geoMechView->geoMechCase() ); stabilityCurvesTrack->setFormationCase( geoMechCase );
stabilityCurvesTrack->setAnnotationType( RiuPlotAnnotationTool::NO_ANNOTATIONS ); stabilityCurvesTrack->setAnnotationType( RiuPlotAnnotationTool::NO_ANNOTATIONS );
stabilityCurvesTrack->setShowRegionLabels( true ); stabilityCurvesTrack->setShowRegionLabels( true );
@@ -274,14 +294,14 @@ void RicNewWellBoreStabilityPlotFeature::createStabilityCurvesTrack( RimWellBore
const QString& resultName = resultNames[i]; const QString& resultName = resultNames[i];
RigFemResultAddress resAddr( RIG_WELLPATH_DERIVED, resultName.toStdString(), "" ); RigFemResultAddress resAddr( RIG_WELLPATH_DERIVED, resultName.toStdString(), "" );
RimWellLogWbsCurve* curve = RicWellLogTools::addWellLogWbsCurve( stabilityCurvesTrack, RimWellLogWbsCurve* curve = RicWellLogTools::addWellLogWbsCurve( stabilityCurvesTrack,
geoMechView, geoMechCase,
wellPath,
nullptr, nullptr,
wellPath,
-1, -1,
false, false,
false ); false );
curve->setGeoMechResultAddress( resAddr ); curve->setGeoMechResultAddress( resAddr );
curve->setCurrentTimeStep( geoMechView->currentTimeStep() ); curve->setCurrentTimeStep( timeStep );
curve->setAutoNameComponents( false, true, false, false, false ); curve->setAutoNameComponents( false, true, false, false, false );
curve->setColor( colors[i % colors.size()] ); curve->setColor( colors[i % colors.size()] );
curve->setLineThickness( 2 ); curve->setLineThickness( 2 );
@@ -297,7 +317,8 @@ void RicNewWellBoreStabilityPlotFeature::createStabilityCurvesTrack( RimWellBore
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicNewWellBoreStabilityPlotFeature::createAnglesTrack( RimWellBoreStabilityPlot* plot, void RicNewWellBoreStabilityPlotFeature::createAnglesTrack( RimWellBoreStabilityPlot* plot,
RimWellPath* wellPath, RimWellPath* wellPath,
RimGeoMechView* geoMechView ) RimGeoMechCase* geoMechCase,
int timeStep )
{ {
RimWellLogTrack* wellPathAnglesTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false, RimWellLogTrack* wellPathAnglesTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false,
"Well Path Angles", "Well Path Angles",
@@ -315,14 +336,15 @@ void RicNewWellBoreStabilityPlotFeature::createAnglesTrack( RimWellBoreStability
const QString& resultName = resultNames[i]; const QString& resultName = resultNames[i];
RigFemResultAddress resAddr( RIG_WELLPATH_DERIVED, resultName.toStdString(), "" ); RigFemResultAddress resAddr( RIG_WELLPATH_DERIVED, resultName.toStdString(), "" );
RimWellLogExtractionCurve* curve = RicWellLogTools::addWellLogExtractionCurve( wellPathAnglesTrack, RimWellLogExtractionCurve* curve = RicWellLogTools::addWellLogExtractionCurve( wellPathAnglesTrack,
geoMechView, geoMechCase,
nullptr,
wellPath, wellPath,
nullptr, nullptr,
-1, -1,
false, false,
false ); false );
curve->setGeoMechResultAddress( resAddr ); curve->setGeoMechResultAddress( resAddr );
curve->setCurrentTimeStep( geoMechView->currentTimeStep() ); curve->setCurrentTimeStep( timeStep );
curve->setCustomName( resultName ); curve->setCustomName( resultName );
curve->setColor( colors[i % colors.size()] ); curve->setColor( colors[i % colors.size()] );
@@ -349,7 +371,7 @@ void RicNewWellBoreStabilityPlotFeature::createAnglesTrack( RimWellBoreStability
wellPathAnglesTrack->setTickIntervals( 90.0, 30.0 ); wellPathAnglesTrack->setTickIntervals( 90.0, 30.0 );
wellPathAnglesTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR_AND_MINOR ); wellPathAnglesTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR_AND_MINOR );
wellPathAnglesTrack->setFormationWellPath( wellPath ); wellPathAnglesTrack->setFormationWellPath( wellPath );
wellPathAnglesTrack->setFormationCase( geoMechView->geoMechCase() ); wellPathAnglesTrack->setFormationCase( geoMechCase );
wellPathAnglesTrack->setAnnotationType( RiuPlotAnnotationTool::NO_ANNOTATIONS ); wellPathAnglesTrack->setAnnotationType( RiuPlotAnnotationTool::NO_ANNOTATIONS );
wellPathAnglesTrack->setShowRegionLabels( false ); wellPathAnglesTrack->setShowRegionLabels( false );
} }
@@ -32,6 +32,9 @@ class RicNewWellBoreStabilityPlotFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public:
static RimWellBoreStabilityPlot* createPlot( RimGeoMechCase* geoMechCase, RimWellPath* wellPath, int timeStep );
protected: protected:
// Overrides // Overrides
bool isCommandEnabled() override; bool isCommandEnabled() override;
@@ -39,9 +42,18 @@ protected:
void setupActionLook( QAction* actionToSetup ) override; void setupActionLook( QAction* actionToSetup ) override;
private: private:
void createFormationTrack( RimWellBoreStabilityPlot* plot, RimWellPath* wellPath, RimGeoMechCase* geoMechCase ); static void createFormationTrack( RimWellBoreStabilityPlot* plot, RimWellPath* wellPath, RimGeoMechCase* geoMechCase );
void createCasingShoeTrack( RimWellBoreStabilityPlot* plot, RimWellPath* wellPath, RimGeoMechCase* geoMechCase ); static void createCasingShoeTrack( RimWellBoreStabilityPlot* plot, RimWellPath* wellPath, RimGeoMechCase* geoMechCase );
void createParametersTrack( RimWellBoreStabilityPlot* plot, RimWellPath* wellPath, RimGeoMechView* geoMechView ); static void createParametersTrack( RimWellBoreStabilityPlot* plot,
void createStabilityCurvesTrack( RimWellBoreStabilityPlot* plot, RimWellPath* wellPath, RimGeoMechView* geoMechView ); RimWellPath* wellPath,
void createAnglesTrack( RimWellBoreStabilityPlot* plot, RimWellPath* wellPath, RimGeoMechView* geoMechView ); RimGeoMechCase* geoMechCase,
int timeStep );
static void createStabilityCurvesTrack( RimWellBoreStabilityPlot* plot,
RimWellPath* wellPath,
RimGeoMechCase* geoMechCase,
int timeStep );
static void createAnglesTrack( RimWellBoreStabilityPlot* plot,
RimWellPath* wellPath,
RimGeoMechCase* geoMechCase,
int timeStep );
}; };
@@ -74,7 +74,7 @@ void RicNewWellLogCurveExtractionFeature::onActionTriggered( bool isChecked )
RimWellLogTrack* wellLogPlotTrack = caf::SelectionManager::instance()->selectedItemOfType<RimWellLogTrack>(); RimWellLogTrack* wellLogPlotTrack = caf::SelectionManager::instance()->selectedItemOfType<RimWellLogTrack>();
if ( wellLogPlotTrack ) if ( wellLogPlotTrack )
{ {
RicWellLogTools::addWellLogExtractionCurve( wellLogPlotTrack, nullptr, nullptr, nullptr, -1, true ); RicWellLogTools::addWellLogExtractionCurve( wellLogPlotTrack, nullptr, nullptr, nullptr, nullptr, -1, true );
} }
else else
{ {
@@ -108,12 +108,15 @@ void RicNewWellLogCurveExtractionFeature::onActionTriggered( bool isChecked )
newWellLogPlotTrack->setFormationBranchDetection( useBranchDetection ); newWellLogPlotTrack->setFormationBranchDetection( useBranchDetection );
} }
RimCase* ownerCase = nullptr;
if ( view ) if ( view )
{ {
ownerCase = view->ownerCase();
newWellLogPlotTrack->setFormationCase( view->ownerCase() ); newWellLogPlotTrack->setFormationCase( view->ownerCase() );
} }
RimWellLogExtractionCurve* plotCurve = RicWellLogTools::addWellLogExtractionCurve( newWellLogPlotTrack, RimWellLogExtractionCurve* plotCurve = RicWellLogTools::addWellLogExtractionCurve( newWellLogPlotTrack,
ownerCase,
view, view,
wellPath, wellPath,
simWell, simWell,
@@ -53,12 +53,8 @@ bool RicNewWellLogPlotFeature::isCommandEnabled()
void RicNewWellLogPlotFeature::onActionTriggered( bool isChecked ) void RicNewWellLogPlotFeature::onActionTriggered( bool isChecked )
{ {
RimWellLogTrack* plotTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack(); RimWellLogTrack* plotTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack();
RimWellLogExtractionCurve* curve = RicWellLogTools::addWellLogExtractionCurve( plotTrack, RimWellLogExtractionCurve* curve =
nullptr, RicWellLogTools::addWellLogExtractionCurve( plotTrack, nullptr, nullptr, nullptr, nullptr, -1, true );
nullptr,
nullptr,
-1,
true );
curve->loadDataAndUpdate( true ); curve->loadDataAndUpdate( true );
RimWellLogPlot* plot = nullptr; RimWellLogPlot* plot = nullptr;
plotTrack->firstAncestorOrThisOfTypeAsserted( plot ); plotTrack->firstAncestorOrThisOfTypeAsserted( plot );
@@ -53,6 +53,7 @@ RimWellBoreStabilityPlot*
RimWellBoreStabilityPlot* plot = new RimWellBoreStabilityPlot(); RimWellBoreStabilityPlot* plot = new RimWellBoreStabilityPlot();
plot->setAsPlotMdiWindow(); plot->setAsPlotMdiWindow();
RiaApplication::instance()->project()->assignViewIdToView( plot );
wellLogPlotColl->wellLogPlots().push_back( plot ); wellLogPlotColl->wellLogPlots().push_back( plot );
@@ -87,6 +88,7 @@ RimWellLogPlot* RicNewWellLogPlotFeatureImpl::createWellLogPlot( bool showAfterC
RimWellLogPlot* plot = new RimWellLogPlot(); RimWellLogPlot* plot = new RimWellLogPlot();
plot->setAsPlotMdiWindow(); plot->setAsPlotMdiWindow();
RiaApplication::instance()->project()->assignViewIdToView( plot );
wellLogPlotColl->wellLogPlots().push_back( plot ); wellLogPlotColl->wellLogPlots().push_back( plot );
@@ -66,7 +66,7 @@ void RicNewWellLogPlotTrackFeature::onActionTriggered( bool isChecked )
plotTrack->setDescription( QString( "Track %1" ).arg( wellLogPlot->trackCount() ) ); plotTrack->setDescription( QString( "Track %1" ).arg( wellLogPlot->trackCount() ) );
RiuPlotMainWindow* plotWindow = RiaGuiApplication::instance()->getOrCreateMainPlotWindow(); RiuPlotMainWindow* plotWindow = RiaGuiApplication::instance()->getOrCreateMainPlotWindow();
RiuWellLogPlot* viewWidget = dynamic_cast<RiuWellLogPlot*>( wellLogPlot->viewWidget() ); RiuWellLogPlot* viewWidget = dynamic_cast<RiuWellLogPlot*>( wellLogPlot->viewWidget() );
RicWellLogTools::addWellLogExtractionCurve( plotTrack, nullptr, nullptr, nullptr, -1, true ); RicWellLogTools::addWellLogExtractionCurve( plotTrack, nullptr, nullptr, nullptr, nullptr, -1, true );
plotWindow->setWidthOfMdiWindow( viewWidget, viewWidget->preferredWidth() ); plotWindow->setWidthOfMdiWindow( viewWidget, viewWidget->preferredWidth() );
wellLogPlot->updateConnectedEditors(); wellLogPlot->updateConnectedEditors();
@@ -20,6 +20,9 @@
#include "RicWellLogsImportFileFeature.h" #include "RicWellLogsImportFileFeature.h"
#include "RiaApplication.h" #include "RiaApplication.h"
#include "RiaGuiApplication.h"
#include "RiaLogging.h"
#include "RimProject.h" #include "RimProject.h"
#include "Riu3DMainWindowTools.h" #include "Riu3DMainWindowTools.h"
@@ -27,9 +30,38 @@
#include <QAction> #include <QAction>
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox>
CAF_CMD_SOURCE_INIT( RicWellLogsImportFileFeature, "RicWellLogsImportFileFeature" ); CAF_CMD_SOURCE_INIT( RicWellLogsImportFileFeature, "RicWellLogsImportFileFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimWellLogFile*> RicWellLogsImportFileFeature::importWellLogFiles( const QStringList& wellLogFilePaths,
QStringList* errorMessages )
{
RiaApplication* app = RiaApplication::instance();
// Remember the path to next time
app->setLastUsedDialogDirectory( "WELL_LOGS_DIR", QFileInfo( wellLogFilePaths.last() ).absolutePath() );
std::vector<RimWellLogFile*> wellLogFiles = app->addWellLogsToModel( wellLogFilePaths, errorMessages );
caf::PdmUiObjectEditorHandle::updateUiAllObjectEditors();
return wellLogFiles;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QStringList RicWellLogsImportFileFeature::wellLogFileNameFilters()
{
QStringList nameFilters;
nameFilters << "*.las";
return nameFilters;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -44,21 +76,29 @@ bool RicWellLogsImportFileFeature::isCommandEnabled()
void RicWellLogsImportFileFeature::onActionTriggered( bool isChecked ) void RicWellLogsImportFileFeature::onActionTriggered( bool isChecked )
{ {
// Open dialog box to select well path files // Open dialog box to select well path files
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
QString defaultDir = app->lastUsedDialogDirectory( "WELL_LOGS_DIR" ); QString defaultDir = app->lastUsedDialogDirectory( "WELL_LOGS_DIR" );
QStringList wellLogFilePaths = QFileDialog::getOpenFileNames( Riu3DMainWindowTools::mainWindowWidget(), QString nameFilterString = QString( "Well Logs (%1);;All Files (*.*)" ).arg( wellLogFileNameFilters().join( " " ) );
QStringList wellLogFilePaths = QFileDialog::getOpenFileNames( Riu3DMainWindowTools::mainWindowWidget(),
"Import Well Logs", "Import Well Logs",
defaultDir, defaultDir,
"Well Logs (*.las);;All Files (*.*)" ); nameFilterString );
if ( wellLogFilePaths.size() < 1 ) return; if ( wellLogFilePaths.size() >= 1 )
{
QStringList errorMessages;
importWellLogFiles( wellLogFilePaths, &errorMessages );
if ( !errorMessages.empty() )
{
QString displayMessage = "Errors opening the LAS files: \n" + errorMessages.join( "\n" );
// Remember the path to next time if ( RiaGuiApplication::isRunning() )
app->setLastUsedDialogDirectory( "WELL_LOGS_DIR", QFileInfo( wellLogFilePaths.last() ).absolutePath() ); {
QMessageBox::warning( Riu3DMainWindowTools::mainWindowWidget(), "File open error", displayMessage );
app->addWellLogsToModel( wellLogFilePaths ); }
RiaLogging::warning( displayMessage );
caf::PdmUiObjectEditorHandle::updateUiAllObjectEditors(); }
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -21,12 +21,19 @@
#include "cafCmdFeature.h" #include "cafCmdFeature.h"
#include <vector>
class RimWellLogFile;
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
class RicWellLogsImportFileFeature : public caf::CmdFeature class RicWellLogsImportFileFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
static std::vector<RimWellLogFile*> importWellLogFiles( const QStringList& wellLogFilePaths,
QStringList* errorMessages );
static QStringList wellLogFileNameFilters();
protected: protected:
// Overrides // Overrides
@@ -20,6 +20,8 @@
#include "RicWellPathsImportFileFeature.h" #include "RicWellPathsImportFileFeature.h"
#include "RiaApplication.h" #include "RiaApplication.h"
#include "RiaGuiApplication.h"
#include "RiaLogging.h"
#include "RimOilField.h" #include "RimOilField.h"
#include "RimProject.h" #include "RimProject.h"
@@ -30,9 +32,56 @@
#include <QAction> #include <QAction>
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox>
CAF_CMD_SOURCE_INIT( RicWellPathsImportFileFeature, "RicWellPathsImportFileFeature" ); CAF_CMD_SOURCE_INIT( RicWellPathsImportFileFeature, "RicWellPathsImportFileFeature" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimFileWellPath*> RicWellPathsImportFileFeature::importWellPaths( const QStringList& wellPathFilePaths,
QStringList* errorMessages )
{
RiaApplication* app = RiaApplication::instance();
// Remember the path to next time
app->setLastUsedDialogDirectory( "WELLPATH_DIR", QFileInfo( wellPathFilePaths.last() ).absolutePath() );
std::vector<RimFileWellPath*> wellPaths = app->addWellPathsToModel( wellPathFilePaths, errorMessages );
RimProject* project = app->project();
if ( project )
{
project->scheduleCreateDisplayModelAndRedrawAllViews();
RimOilField* oilField = project->activeOilField();
if ( oilField && oilField->wellPathCollection->wellPaths().size() > 0 )
{
RimWellPath* wellPath = oilField->wellPathCollection->mostRecentlyUpdatedWellPath();
if ( wellPath )
{
Riu3DMainWindowTools::selectAsCurrentItem( wellPath );
}
}
}
return wellPaths;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QStringList RicWellPathsImportFileFeature::wellPathNameFilters()
{
QStringList nameFilters;
nameFilters << "*.json"
<< "*.asc"
<< " *.asci"
<< "*.ascii"
<< "*.dev";
return nameFilters;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -50,35 +99,28 @@ void RicWellPathsImportFileFeature::onActionTriggered( bool isChecked )
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
QString lastUsedGridFolder = app->lastUsedDialogDirectory( "BINARY_GRID" ); QString lastUsedGridFolder = app->lastUsedDialogDirectory( "BINARY_GRID" );
QString defaultDir = app->lastUsedDialogDirectoryWithFallback( "WELLPATH_DIR", lastUsedGridFolder ); QString defaultDir = app->lastUsedDialogDirectoryWithFallback( "WELLPATH_DIR", lastUsedGridFolder );
QStringList wellPathFilePaths =
QFileDialog::getOpenFileNames( Riu3DMainWindowTools::mainWindowWidget(),
"Import Well Paths",
defaultDir,
"Well Paths (*.json *.asc *.asci *.ascii *.dev);;All Files (*.*)" );
if ( wellPathFilePaths.size() < 1 ) return; QString nameList = QString( "Well Paths (%1);;All Files (*.*)" ).arg( wellPathNameFilters().join( " " ) );
// Remember the path to next time QStringList wellPathFilePaths = QFileDialog::getOpenFileNames( Riu3DMainWindowTools::mainWindowWidget(),
app->setLastUsedDialogDirectory( "WELLPATH_DIR", QFileInfo( wellPathFilePaths.last() ).absolutePath() ); "Import Well Paths",
defaultDir,
nameList );
app->addWellPathsToModel( wellPathFilePaths ); if ( wellPathFilePaths.size() >= 1 )
RimProject* project = app->project();
if ( project )
{ {
project->scheduleCreateDisplayModelAndRedrawAllViews(); QStringList errorMessages;
RimOilField* oilField = project->activeOilField(); importWellPaths( wellPathFilePaths, &errorMessages );
if ( !oilField ) return; if ( !errorMessages.empty() )
if ( oilField->wellPathCollection->wellPaths().size() > 0 )
{ {
RimWellPath* wellPath = oilField->wellPathCollection->mostRecentlyUpdatedWellPath(); QString displayMessage = "Errors loading well path files: \n" + errorMessages.join( "\n" );
if ( wellPath )
if ( RiaGuiApplication::isRunning() )
{ {
Riu3DMainWindowTools::selectAsCurrentItem( wellPath ); QMessageBox::warning( Riu3DMainWindowTools::mainWindowWidget(), "File open error", displayMessage );
} }
RiaLogging::warning( displayMessage );
} }
} }
} }
@@ -21,6 +21,10 @@
#include "cafCmdFeature.h" #include "cafCmdFeature.h"
#include <vector>
class RimFileWellPath;
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
@@ -28,6 +32,11 @@ class RicWellPathsImportFileFeature : public caf::CmdFeature
{ {
CAF_CMD_HEADER_INIT; CAF_CMD_HEADER_INIT;
public:
static std::vector<RimFileWellPath*> importWellPaths( const QStringList& wellPathFilePaths,
QStringList* errorMessages );
static QStringList wellPathNameFilters();
protected: protected:
// Overrides // Overrides
bool isCommandEnabled() override; bool isCommandEnabled() override;
@@ -168,6 +168,7 @@ if (RESINSIGHT_GRPC_PYTHON_EXECUTABLE)
"rips/project.py" "rips/project.py"
"rips/instance.py" "rips/instance.py"
"rips/pdmobject.py" "rips/pdmobject.py"
"rips/plot.py"
"rips/view.py" "rips/view.py"
"rips/PythonExamples/InstanceExample.py" "rips/PythonExamples/InstanceExample.py"
"rips/PythonExamples/CommandExample.py" "rips/PythonExamples/CommandExample.py"
@@ -54,6 +54,7 @@ message ExportSnapshotsRequest
string prefix = 2; string prefix = 2;
int32 caseId = 3; int32 caseId = 3;
int32 viewId = 4; int32 viewId = 4;
string exportFolder = 5;
} }
message ExportPropertyRequest message ExportPropertyRequest
@@ -268,6 +269,48 @@ message CloneViewRequest
int32 viewId = 1; int32 viewId = 1;
} }
message CreateWbsPlotRequest
{
int32 caseId = 1;
string wellPath = 2;
int32 timeStep = 3;
}
message ImportWellPathsRequest
{
string wellPathFolder = 1;
repeated string wellPathFiles = 2;
}
message ImportWellLogFilesRequest
{
string wellLogFolder = 1;
repeated string wellLogFiles = 2;
}
message ImportFormationNamesRequest
{
repeated string formationFiles = 1;
int32 applyToCaseId = 2;
}
enum ExportFormat
{
LAS = 0;
ASCII = 1;
}
message ExportWellLogPlotDataRequest
{
ExportFormat exportFormat = 1;
int32 viewId = 2;
string exportFolder = 3;
string filePrefix = 4;
bool exportTvdRkb = 5;
bool capitalizeFileNames = 6;
double resampleInterval = 7;
}
/* CommandParams handles both command name and parameters in one. /* CommandParams handles both command name and parameters in one.
* The message type and content is used as parameters and * The message type and content is used as parameters and
* the name of the variable is used to find the command name. */ * the name of the variable is used to find the command name. */
@@ -310,6 +353,11 @@ message CommandParams
ExportFlowInfoRequest exportFlowCharacteristics = 29; ExportFlowInfoRequest exportFlowCharacteristics = 29;
CreateViewRequest createView = 30; CreateViewRequest createView = 30;
CloneViewRequest cloneView = 31; CloneViewRequest cloneView = 31;
CreateWbsPlotRequest createWellBoreStabilityPlot = 32;
ImportWellPathsRequest importWellPaths = 33;
ImportWellLogFilesRequest importWellLogFiles = 34;
ImportFormationNamesRequest importFormationNames = 35;
ExportWellLogPlotDataRequest exportWellLogPlotData = 36;
} }
} }
@@ -329,17 +377,41 @@ message CreateViewResult
int32 viewId = 1; int32 viewId = 1;
} }
message CreateWbsPlotResult
{
int32 viewId = 1;
}
message ImportWellPathsResult
{
repeated string wellPathNames = 1;
}
message ImportWellLogFilesResult
{
repeated string wellPathNames = 1;
}
message ExportWellLogPlotDataResult
{
repeated string exportedFiles = 1;
}
/* Command reply handles the return values for the generic command /* Command reply handles the return values for the generic command
* The name of the variable is used to map to the cafPdmObject classKeyword */ * The name of the variable is used to map to the cafPdmObject classKeyword */
message CommandReply message CommandReply
{ {
oneof result oneof result
{ {
Empty emptyResult = 1; Empty emptyResult = 1;
CaseRequest loadCaseResult = 2; CaseRequest loadCaseResult = 2;
GridCaseGroupResult createGridCaseGroupResult = 3; GridCaseGroupResult createGridCaseGroupResult = 3;
CreateStatisticsCaseResult createStatisticsCaseResult = 4; CreateStatisticsCaseResult createStatisticsCaseResult = 4;
CreateViewResult createViewResult = 5; CreateViewResult createViewResult = 5;
CreateWbsPlotResult createWbsPlotResult = 6;
ImportWellPathsResult importWellPathsResult = 7;
ImportWellLogFilesResult importWellLogFilesResult = 8;
ExportWellLogPlotDataResult exportWellLogPlotDataResult = 9;
} }
} }
@@ -14,7 +14,9 @@ if resinsight is not None:
print ("Got " + str(len(cases)) + " cases: ") print ("Got " + str(len(cases)) + " cases: ")
for case in cases: for case in cases:
print("Case id: " + str(case.case_id))
print("Case name: " + case.name) print("Case name: " + case.name)
print("Case type: " + case.type)
print("Case grid path: " + case.grid_path()) print("Case grid path: " + case.grid_path())
timesteps = case.time_steps() timesteps = case.time_steps()
@@ -0,0 +1,30 @@
import os
# Load ResInsight Processing Server Client Library
import rips
# Connect to ResInsight instance
resInsight = rips.Instance.find()
cases = resInsight.project.cases()
well_paths = resInsight.project.import_well_paths(well_path_folder='D:/Projects/ResInsight-regression-test/ModelData/Norne_LessWellPaths')
well_log_files = resInsight.project.import_well_log_files(well_log_folder='D:/Projects/ResInsight-regression-test/ModelData/Norne_PLT_LAS')
if len(well_paths) < 1:
print("No well paths in project")
exit(1)
print(well_paths)
for case in cases:
if case.type == "GeoMechCase":
print (case.case_id)
case_path = case.grid_path()
folder_name = os.path.dirname(case_path)
case.import_formation_names(formation_files=['D:/Projects/ResInsight-regression-test/ModelData/norne/Norne_ATW2013.lyr'])
# create a folder to hold the snapshots
dirname = os.path.join(folder_name, 'snapshots')
print("Exporting to: " + dirname)
for well_path in well_paths:
wbsplot = case.create_well_bore_stability_plot(well_path=well_path, time_step=0)
wbsplot.export_snapshot(export_folder=dirname)
@@ -5,6 +5,7 @@
import rips import rips
import grpc import grpc
import tempfile
resinsight = rips.Instance.find() resinsight = rips.Instance.find()
@@ -14,7 +15,25 @@ case = None
try: try:
case = resinsight.project.load_case("Nonsense") case = resinsight.project.load_case("Nonsense")
except grpc.RpcError as e: except grpc.RpcError as e:
print("Expected Server Exception Received: ", e) print("Expected Server Exception Received while loading case: ", e)
# Try loading well paths from a non-existing folder. We should get a grpc.RpcError exception from the server
try:
well_path_files = resinsight.project.import_well_paths(well_path_folder="NONSENSE/NONSENSE")
except grpc.RpcError as e:
print("Expected Server Exception Received while loading wellpaths: ", e)
# Try loading well paths from an existing but empty folder. We should get a warning.
try:
with tempfile.TemporaryDirectory() as tmpdirname:
well_path_files = resinsight.project.import_well_paths(well_path_folder=tmpdirname)
assert(len(well_path_files) == 0)
assert(resinsight.project.has_warnings())
print("Should get warnings below")
for warning in resinsight.project.warnings():
print (warning)
except grpc.RpcError as e:
print("Unexpected Server Exception caught!!!", e)
case = resinsight.project.case(case_id=0) case = resinsight.project.case(case_id=0)
if case is not None: if case is not None:
@@ -53,5 +72,5 @@ if case is not None:
except IndexError: except IndexError:
print ("Got expected index out of bounds error on client side") print ("Got expected index out of bounds error on client side")
@@ -0,0 +1,18 @@
# Import the tempfile module
import tempfile
# Load ResInsight Processing Server Client Library
import rips
# Connect to ResInsight instance
resInsight = rips.Instance.find()
# Get a list of all plots
plots = resInsight.project.plots()
export_folder = tempfile.mkdtemp()
print("Exporting to: " + export_folder)
for plot in plots:
plot.export_snapshot(export_folder=export_folder)
plot.export_data_as_las(export_folder=export_folder)
plot.export_data_as_ascii(export_folder=export_folder)
@@ -0,0 +1,32 @@
# Load ResInsight Processing Server Client Library
import rips
# Connect to ResInsight instance
resInsight = rips.Instance.find()
well_path_names = resInsight.project.import_well_paths(well_path_folder='D:/Projects/ResInsight-regression-test/ModelData/norne/wellpaths')
if resInsight.project.has_warnings():
for warning in resInsight.project.warnings():
print(warning)
for well_path_name in well_path_names:
print("Imported from folder: " + well_path_name)
well_path_names = resInsight.project.import_well_paths(well_path_files=['D:/Projects/ResInsight-regression-test/ModelData/Norne_WellPaths/E-3H.json',
'D:/Projects/ResInsight-regression-test/ModelData/Norne_WellPaths/C-1H.json'])
if resInsight.project.has_warnings():
for warning in resInsight.project.warnings():
print(warning)
for well_path_name in well_path_names:
print("Imported from indivdual files: " + well_path_name)
well_path_names = resInsight.project.import_well_log_files(well_log_folder='D:/Projects/ResInsight-regression-test/ModelData/Norne_PLT_LAS')
if resInsight.project.has_warnings():
for warning in resInsight.project.warnings():
print(warning)
for well_path_name in well_path_names:
print("Imported well log file for: " + well_path_name)
@@ -9,4 +9,5 @@ from rips.grid import Grid
from rips.instance import Instance from rips.instance import Instance
from rips.pdmobject import PdmObject from rips.pdmobject import PdmObject
from rips.view import View from rips.view import View
from rips.project import Project from rips.project import Project
from rips.plot import Plot
@@ -25,7 +25,7 @@ class Case(PdmObject):
Operate on a ResInsight case specified by a Case Id integer. Operate on a ResInsight case specified by a Case Id integer.
Not meant to be constructed separately but created by one of the following Not meant to be constructed separately but created by one of the following
methods in Project: loadCase, case, allCases, selectedCasesq methods in Project: loadCase, case, allCases, selectedCases
Attributes: Attributes:
id (int): Case Id corresponding to case Id in ResInsight project. id (int): Case Id corresponding to case Id in ResInsight project.
@@ -37,11 +37,12 @@ class Case(PdmObject):
However we need overhead space, so the default is 8160. However we need overhead space, so the default is 8160.
This leaves 256B for overhead. This leaves 256B for overhead.
""" """
def __init__(self, channel, case_id): def __init__(self, channel, case_id, project):
# Private properties # Private properties
self.__channel = channel self.__channel = channel
self.__case_stub = Case_pb2_grpc.CaseStub(channel) self.__case_stub = Case_pb2_grpc.CaseStub(channel)
self.__request = Case_pb2.CaseRequest(id=case_id) self.__request = Case_pb2.CaseRequest(id=case_id)
self.__project = project
info = self.__case_stub.GetCaseInfo(self.__request) info = self.__case_stub.GetCaseInfo(self.__request)
self.__properties_stub = Properties_pb2_grpc.PropertiesStub( self.__properties_stub = Properties_pb2_grpc.PropertiesStub(
@@ -51,7 +52,9 @@ class Case(PdmObject):
# Public properties # Public properties
self.case_id = case_id self.case_id = case_id
self.group_id = info.group_id
self.name = info.name self.name = info.name
self.type = info.type
self.chunk_size = 8160 self.chunk_size = 8160
def __grid_count(self): def __grid_count(self):
@@ -248,16 +251,17 @@ class Case(PdmObject):
self._execute_command(createView=Cmd.CreateViewRequest( self._execute_command(createView=Cmd.CreateViewRequest(
caseId=self.case_id)).createViewResult.viewId) caseId=self.case_id)).createViewResult.viewId)
def export_snapshots_of_all_views(self, prefix=""): def export_snapshots_of_all_views(self, prefix="", export_folder=""):
""" Export snapshots for all views in the case """ Export snapshots for all views in the case
Arguments: Arguments:
prefix (str): Exported file name prefix prefix (str): Exported file name prefix
export_folder(str): The path to export to. By default will use the global export folder
""" """
return self._execute_command( return self._execute_command(
exportSnapshots=Cmd.ExportSnapshotsRequest( exportSnapshots=Cmd.ExportSnapshotsRequest(
type="VIEWS", prefix=prefix, caseId=self.case_id, viewId=-1)) type="VIEWS", prefix=prefix, caseId=self.case_id, viewId=-1, exportFolder=export_folder))
def export_well_path_completions( def export_well_path_completions(
self, self,
@@ -732,3 +736,33 @@ class Case(PdmObject):
undefinedValue=undefined_value, undefinedValue=undefined_value,
exportFile=export_file, exportFile=export_file,
)) ))
def create_well_bore_stability_plot(self, well_path, time_step):
""" Create a new well bore stability plot
Arguments:
well_path(str): well path name
time_step(int): time step
Returns:
A new plot object
"""
plot_result = self._execute_command(createWellBoreStabilityPlot=Cmd.CreateWbsPlotRequest(caseId=self.case_id,
wellPath=well_path,
timeStep=time_step))
return self.__project.plot(view_id=plot_result.createWbsPlotResult.viewId)
def import_formation_names(self, formation_files=None):
""" Import formation names into project and apply it to the current case
Arguments:
formation_files(list): list of files to import
"""
if formation_files is None:
formation_files = []
elif isinstance(formation_files, str):
formation_files = [formation_files]
res = self._execute_command(importFormationNames=Cmd.ImportFormationNamesRequest(formationFiles=formation_files,
applyToCaseId=self.case_id))
@@ -14,14 +14,27 @@ class PdmObject:
""" """
def _execute_command(self, **command_params): def _execute_command(self, **command_params):
return self._commands.Execute(Cmd.CommandParams(**command_params)) self.__warnings = []
response, call = self._commands.Execute.with_call(Cmd.CommandParams(**command_params))
for key, value in call.trailing_metadata():
value = value.replace(';;', '\n')
if key == 'warning':
self.__warnings.append(value)
return response
def __init__(self, pb2_object, channel): def __init__(self, pb2_object, channel):
self._pb2_object = pb2_object self._pb2_object = pb2_object
self._channel = channel self._channel = channel
self._pdm_object_stub = PdmObject_pb2_grpc.PdmObjectServiceStub( self._pdm_object_stub = PdmObject_pb2_grpc.PdmObjectServiceStub(self._channel)
self._channel)
self._commands = CmdRpc.CommandsStub(channel) self._commands = CmdRpc.CommandsStub(channel)
self.__warnings = []
def warnings(self):
return self.__warnings
def has_warnings(self):
return len(self.__warnings) > 0
def pb2_object(self): def pb2_object(self):
""" Private method""" """ Private method"""
@@ -0,0 +1,73 @@
"""
ResInsight 2d plot module
"""
import rips.generated.Commands_pb2 as Cmd
from rips.pdmobject import PdmObject
class Plot(PdmObject):
"""ResInsight plot class
Attributes:
view_id(int): View Id corresponding to the View Id in ResInsight project.
"""
def __init__(self, pdm_object):
PdmObject.__init__(self, pdm_object.pb2_object(), pdm_object.channel())
self.view_id = pdm_object.get_value("ViewId")
def export_snapshot(self, export_folder='', file_prefix='', ):
""" Export snapshot for the current plot
Arguments:
export_folder(str): The path to export to. By default will use the global export folder
prefix (str): Exported file name prefix
"""
return self._execute_command(
exportSnapshots=Cmd.ExportSnapshotsRequest(type='PLOTS',
prefix=file_prefix,
viewId=self.view_id,
exportFolder=export_folder))
def export_data_as_las(self, export_folder, file_prefix='', export_tvdrkb=False, capitalize_file_names=False, resample_interval=0.0):
""" Export LAS file(s) for the current plot
Arguments:
export_folder(str): The path to export to. By default will use the global export folder
file_prefix (str): Exported file name prefix
export_tvdrkb(bool): Export in TVD-RKB format
capitalize_file_names(bool): Make all file names upper case
resample_interval(double): if > 0.0 the files will be resampled
Returns:
A list of files exported
"""
res = self._execute_command(exportWellLogPlotData=Cmd.ExportWellLogPlotDataRequest(exportFormat='LAS',
viewId=self.view_id,
exportFolder=export_folder,
filePrefix=file_prefix,
exportTvdRkb=export_tvdrkb,
capitalizeFileNames=capitalize_file_names,
resampleInterval=resample_interval))
return res.exportWellLogPlotDataResult.exportedFiles
def export_data_as_ascii(self, export_folder, file_prefix='', capitalize_file_names=False):
""" Export LAS file(s) for the current plot
Arguments:
export_folder(str): The path to export to. By default will use the global export folder
file_prefix (str): Exported file name prefix
capitalize_file_names(bool): Make all file names upper case
Returns:
A list of files exported
"""
res = self._execute_command(exportWellLogPlotData=Cmd.ExportWellLogPlotDataRequest(exportFormat='ASCII',
viewId=self.view_id,
exportFolder=export_folder,
filePrefix=file_prefix,
exportTvdRkb=False,
capitalizeFileNames=capitalize_file_names,
resampleInterval=0.0))
return res.exportWellLogPlotDataResult.exportedFiles
@@ -8,6 +8,7 @@ import grpc
from rips.case import Case from rips.case import Case
from rips.gridcasegroup import GridCaseGroup from rips.gridcasegroup import GridCaseGroup
from rips.pdmobject import PdmObject from rips.pdmobject import PdmObject
from rips.plot import Plot
from rips.view import View from rips.view import View
import rips.generated.Commands_pb2 as Cmd import rips.generated.Commands_pb2 as Cmd
@@ -49,7 +50,7 @@ class Project(PdmObject):
""" """
command_reply = self._execute_command(loadCase=Cmd.FilePathRequest( command_reply = self._execute_command(loadCase=Cmd.FilePathRequest(
path=path)) path=path))
return Case(self._channel, command_reply.loadCaseResult.id) return Case(self._channel, command_reply.loadCaseResult.id, self)
def selected_cases(self): def selected_cases(self):
"""Get a list of all cases selected in the project tree """Get a list of all cases selected in the project tree
@@ -60,7 +61,7 @@ class Project(PdmObject):
case_infos = self._project_stub.GetSelectedCases(Empty()) case_infos = self._project_stub.GetSelectedCases(Empty())
cases = [] cases = []
for case_info in case_infos.data: for case_info in case_infos.data:
cases.append(Case(self._channel, case_info.id)) cases.append(Case(self._channel, case_info.id, self))
return cases return cases
def cases(self): def cases(self):
@@ -74,7 +75,7 @@ class Project(PdmObject):
cases = [] cases = []
for case_info in case_infos.data: for case_info in case_infos.data:
cases.append(Case(self._channel, case_info.id)) cases.append(Case(self._channel, case_info.id, self))
return cases return cases
except grpc.RpcError as rpc_error: except grpc.RpcError as rpc_error:
if rpc_error.code() == grpc.StatusCode.NOT_FOUND: if rpc_error.code() == grpc.StatusCode.NOT_FOUND:
@@ -91,7 +92,7 @@ class Project(PdmObject):
A rips Case object A rips Case object
""" """
try: try:
case = Case(self._channel, case_id) case = Case(self._channel, case_id, self)
return case return case
except grpc.RpcError: except grpc.RpcError:
return None return None
@@ -133,7 +134,7 @@ class Project(PdmObject):
"""Get a particular view belonging to a case by providing view id """Get a particular view belonging to a case by providing view id
Arguments: Arguments:
id(int): view id view_id(int): view id
Returns: a view object Returns: a view object
""" """
views = self.views() views = self.views()
@@ -142,6 +143,34 @@ class Project(PdmObject):
return view_object return view_object
return None return None
def plots(self):
"""Get a list of all plots belonging to a project"""
pdm_objects = self.descendants("RimPlot")
plot_list = []
for pdm_object in pdm_objects:
plot_list.append(Plot(pdm_object))
return plot_list
def plot(self, view_id):
"""Get a particular plot by providing view id
Arguments:
view_id(int): view id
Returns: a plot object
"""
plots = self.plots()
for plot_object in plots:
if plot_object.view_id == view_id:
return plot_object
return None
def well_paths(self):
"""Get a list of all the well path names in the project"""
pdm_objects = self.descendants("WellPathBase")
well_path_list = []
for pdm_object in pdm_objects:
well_path_list.append(pdm_object.get_value("WellPathName"))
return well_path_list
def grid_case_groups(self): def grid_case_groups(self):
"""Get a list of all grid case groups in the project""" """Get a list of all grid case groups in the project"""
case_groups = self.descendants("RimIdenticalGridCaseGroup") case_groups = self.descendants("RimIdenticalGridCaseGroup")
@@ -230,3 +259,52 @@ class Project(PdmObject):
return self._execute_command( return self._execute_command(
setFractureContainment=Cmd.SetFracContainmentRequest( setFractureContainment=Cmd.SetFracContainmentRequest(
id=template_id, topLayer=top_layer, baseLayer=base_layer)) id=template_id, topLayer=top_layer, baseLayer=base_layer))
def import_well_paths(self, well_path_files=None, well_path_folder=''):
""" Import well paths into project
Arguments:
well_path_files(list): List of file paths to import
well_path_folder(str): A folder path containing files to import
Returns:
A list of well path names (strings)
"""
if well_path_files is None:
well_path_files = []
res = self._execute_command(importWellPaths=Cmd.ImportWellPathsRequest(wellPathFolder=well_path_folder,
wellPathFiles=well_path_files))
return res.importWellPathsResult.wellPathNames
def import_well_log_files(self, well_log_files=None, well_log_folder=''):
""" Import well log files into project
Arguments:
well_log_files(list): List of file paths to import
well_log_folder(str): A folder path containing files to import
Returns:
A list of well path names (strings) that had logs imported
"""
if well_log_files is None:
well_log_files = []
res = self._execute_command(importWellLogFiles=Cmd.ImportWellLogFilesRequest(wellLogFolder=well_log_folder,
wellLogFiles=well_log_files))
return res.importWellLogFilesResult.wellPathNames
def import_formation_names(self, formation_files=None):
""" Import formation names into project
Arguments:
formation_files(list): list of files to import
"""
if formation_files is None:
formation_files = []
elif isinstance(formation_files, str):
formation_files = [formation_files]
res = self._execute_command(importFormationNames=Cmd.ImportFormationNamesRequest(formationFiles=formation_files,
applyToCaseId=-1))
@@ -11,7 +11,7 @@ class View(PdmObject):
"""ResInsight view class """ResInsight view class
Attributes: Attributes:
id(int): View Id corresponding to the View Id in ResInsight project. view_id(int): View Id corresponding to the View Id in ResInsight project.
""" """
def __init__(self, pdm_object): def __init__(self, pdm_object):
@@ -195,15 +195,17 @@ class View(PdmObject):
viewIds=[self.view_id], viewIds=[self.view_id],
undefinedValue=undefined_value)) undefinedValue=undefined_value))
def export_snapshot(self, prefix=''): def export_snapshot(self, prefix='', export_folder=''):
""" Export snapshot for the current view """ Export snapshot for the current view
Arguments: Arguments:
prefix (str): Exported file name prefix prefix (str): Exported file name prefix
export_folder(str): The path to export to. By default will use the global export folder
""" """
case_id = self.case().case_id case_id = self.case().case_id
return self._execute_command( return self._execute_command(
exportSnapshots=Cmd.ExportSnapshotsRequest(type='VIEWS', exportSnapshots=Cmd.ExportSnapshotsRequest(type='VIEWS',
prefix=prefix, prefix=prefix,
caseId=case_id, caseId=case_id,
viewId=self.view_id)) viewId=self.view_id,
exportFolder=export_folder))
@@ -262,10 +262,9 @@ grpc::Status RiaGrpcCaseService::GetTimeSteps( grpc::ServerContext* context,
{ {
RimCase* rimCase = findCase( request->id() ); RimCase* rimCase = findCase( request->id() );
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( rimCase ); if ( rimCase )
if ( eclipseCase )
{ {
std::vector<QDateTime> timeStepDates = eclipseCase->timeStepDates(); std::vector<QDateTime> timeStepDates = rimCase->timeStepDates();
for ( QDateTime dateTime : timeStepDates ) for ( QDateTime dateTime : timeStepDates )
{ {
rips::TimeStepDate* date = reply->add_dates(); rips::TimeStepDate* date = reply->add_dates();
@@ -278,7 +277,7 @@ grpc::Status RiaGrpcCaseService::GetTimeSteps( grpc::ServerContext* context,
} }
return grpc::Status::OK; return grpc::Status::OK;
} }
return grpc::Status( grpc::NOT_FOUND, "Eclipse Case not found" ); return grpc::Status( grpc::NOT_FOUND, "Case not found" );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -349,11 +348,10 @@ grpc::Status RiaGrpcCaseService::GetPdmObject( grpc::ServerContext* context,
const rips::CaseRequest* request, const rips::CaseRequest* request,
rips::PdmObject* reply ) rips::PdmObject* reply )
{ {
RimCase* rimCase = findCase( request->id() ); RimCase* rimCase = findCase( request->id() );
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( rimCase ); if ( rimCase )
if ( eclipseCase )
{ {
copyPdmObjectFromCafToRips( eclipseCase, reply ); copyPdmObjectFromCafToRips( rimCase, reply );
} }
return grpc::Status::OK; return grpc::Status::OK;
} }
@@ -94,11 +94,11 @@ grpc::Status
RicfCommandResponse response = commandHandle->execute(); RicfCommandResponse response = commandHandle->execute();
if ( response.status() == RicfCommandResponse::COMMAND_ERROR ) if ( response.status() == RicfCommandResponse::COMMAND_ERROR )
{ {
return grpc::Status( grpc::FAILED_PRECONDITION, response.message().toStdString() ); return grpc::Status( grpc::FAILED_PRECONDITION, response.sanitizedResponseMessage().toStdString() );
} }
else if ( response.status() == RicfCommandResponse::COMMAND_WARNING ) else if ( response.status() == RicfCommandResponse::COMMAND_WARNING )
{ {
context->AddInitialMetadata( "warning", response.message().toStdString() ); context->AddTrailingMetadata( "warning", response.sanitizedResponseMessage().toStdString() );
} }
assignResultToReply( response.result(), reply ); assignResultToReply( response.result(), reply );
@@ -243,7 +243,23 @@ void RiaGrpcCommandService::assignGrpcFieldValue( Message* repl
{ {
if ( fieldDescriptor->is_repeated() ) if ( fieldDescriptor->is_repeated() )
{ {
CAF_ASSERT( false && "Assigning vector results to Command Results is not yet implemented" ); auto reflection = reply->GetReflection();
QVariant qValue = pdmValueField->toQVariant();
if ( fieldDescriptor->type() == FieldDescriptor::TYPE_STRING )
{
MutableRepeatedFieldRef<std::string> repeatedField =
reflection->GetMutableRepeatedFieldRef<std::string>( reply, fieldDescriptor );
QStringList stringList = qValue.toStringList();
for ( QString stringValue : stringList )
{
repeatedField.Add( stringValue.toStdString() );
}
}
else
{
CAF_ASSERT( false && "Assigning vector results to Command Results is only implemented for strings" );
}
return;
} }
FieldDescriptor::Type fieldDataType = fieldDescriptor->type(); FieldDescriptor::Type fieldDataType = fieldDescriptor->type();
@@ -72,6 +72,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimMainPlotCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimPlot.h
${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.h ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.h
${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.h ${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.h
${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurve.h ${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurve.h
@@ -211,6 +212,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimMainPlotCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimPlot.cpp
${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.cpp ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.cpp
${CMAKE_CURRENT_LIST_DIR}/RimWellBoreStabilityPlot.cpp ${CMAKE_CURRENT_LIST_DIR}/RimWellBoreStabilityPlot.cpp
${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.cpp ${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.cpp
@@ -366,6 +366,7 @@ QList<caf::PdmOptionItemInfo>
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimFlowCharacteristicsPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimFlowCharacteristicsPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
RimViewWindow::defineUiOrdering( uiConfigName, uiOrdering );
{ {
// Ensure a case is selected if one is available // Ensure a case is selected if one is available
RimProject* proj = nullptr; RimProject* proj = nullptr;
@@ -18,7 +18,10 @@
#include "RimFlowPlotCollection.h" #include "RimFlowPlotCollection.h"
#include "RiaApplication.h"
#include "RimFlowCharacteristicsPlot.h" #include "RimFlowCharacteristicsPlot.h"
#include "RimProject.h"
#include "RimWellAllocationPlot.h" #include "RimWellAllocationPlot.h"
#include "cafProgressInfo.h" #include "cafProgressInfo.h"
@@ -145,6 +148,7 @@ RimWellAllocationPlot* RimFlowPlotCollection::defaultWellAllocPlot()
{ {
m_defaultWellAllocPlot = new RimWellAllocationPlot; m_defaultWellAllocPlot = new RimWellAllocationPlot;
m_defaultWellAllocPlot->setDescription( "Default Flow Diagnostics Plot" ); m_defaultWellAllocPlot->setDescription( "Default Flow Diagnostics Plot" );
RiaApplication::instance()->project()->assignViewIdToView( m_flowCharacteristicsPlot );
} }
this->updateConnectedEditors(); this->updateConnectedEditors();
@@ -160,6 +164,7 @@ RimFlowCharacteristicsPlot* RimFlowPlotCollection::defaultFlowCharacteristicsPlo
if ( !m_flowCharacteristicsPlot() ) if ( !m_flowCharacteristicsPlot() )
{ {
m_flowCharacteristicsPlot = new RimFlowCharacteristicsPlot; m_flowCharacteristicsPlot = new RimFlowCharacteristicsPlot;
RiaApplication::instance()->project()->assignViewIdToView( m_flowCharacteristicsPlot );
} }
this->updateConnectedEditors(); this->updateConnectedEditors();
@@ -419,6 +419,8 @@ void RimGridCrossPlot::onLoadDataAndUpdate()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimGridCrossPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimGridCrossPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
RimViewWindow::defineUiOrdering( uiConfigName, uiOrdering );
uiOrdering.add( &m_showInfoBox ); uiOrdering.add( &m_showInfoBox );
uiOrdering.add( &m_showLegend ); uiOrdering.add( &m_showLegend );
@@ -23,8 +23,8 @@
#include "RiaDefines.h" #include "RiaDefines.h"
#include "RimNameConfig.h" #include "RimNameConfig.h"
#include "RimPlot.h"
#include "RimRiuQwtPlotOwnerInterface.h" #include "RimRiuQwtPlotOwnerInterface.h"
#include "RimViewWindow.h"
#include <QPointer> #include <QPointer>
@@ -49,7 +49,7 @@ protected:
virtual void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; virtual void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
}; };
class RimGridCrossPlot : public RimViewWindow, public RimRiuQwtPlotOwnerInterface, public RimNameConfigHolderInterface class RimGridCrossPlot : public RimPlot, public RimRiuQwtPlotOwnerInterface, public RimNameConfigHolderInterface
{ {
CAF_PDM_HEADER_INIT; CAF_PDM_HEADER_INIT;
@@ -17,7 +17,9 @@
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
#include "RimGridCrossPlotCollection.h" #include "RimGridCrossPlotCollection.h"
#include "RiaApplication.h"
#include "RimGridCrossPlot.h" #include "RimGridCrossPlot.h"
#include "RimProject.h"
CAF_PDM_SOURCE_INIT( RimGridCrossPlotCollection, "RimGridCrossPlotCollection" ); CAF_PDM_SOURCE_INIT( RimGridCrossPlotCollection, "RimGridCrossPlotCollection" );
@@ -60,6 +62,7 @@ RimGridCrossPlot* RimGridCrossPlotCollection::createGridCrossPlot()
{ {
RimGridCrossPlot* plot = new RimGridCrossPlot(); RimGridCrossPlot* plot = new RimGridCrossPlot();
plot->setAsPlotMdiWindow(); plot->setAsPlotMdiWindow();
RiaApplication::instance()->project()->assignViewIdToView( plot );
// plot->setDescription(QString("Summary Cross Plot %1").arg(m_gridCrossPlots.size())); // plot->setDescription(QString("Summary Cross Plot %1").arg(m_gridCrossPlots.size()));
addGridCrossPlot( plot ); addGridCrossPlot( plot );
@@ -18,12 +18,15 @@
#include "RimSaturationPressurePlotCollection.h" #include "RimSaturationPressurePlotCollection.h"
#include "RiaApplication.h"
#include "RigCaseCellResultsData.h" #include "RigCaseCellResultsData.h"
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
#include "RigEclipseResultAddress.h" #include "RigEclipseResultAddress.h"
#include "RigEquil.h" #include "RigEquil.h"
#include "RimEclipseResultCase.h" #include "RimEclipseResultCase.h"
#include "RimProject.h"
#include "RimSaturationPressurePlot.h" #include "RimSaturationPressurePlot.h"
CAF_PDM_SOURCE_INIT( RimSaturationPressurePlotCollection, "RimSaturationPressurePlotCollection" ); CAF_PDM_SOURCE_INIT( RimSaturationPressurePlotCollection, "RimSaturationPressurePlotCollection" );
@@ -89,6 +92,7 @@ std::vector<RimSaturationPressurePlot*>
{ {
RimSaturationPressurePlot* plot = new RimSaturationPressurePlot(); RimSaturationPressurePlot* plot = new RimSaturationPressurePlot();
plot->setAsPlotMdiWindow(); plot->setAsPlotMdiWindow();
RiaApplication::instance()->project()->assignViewIdToView( plot );
// As discussed with Liv Merete, it is not any use for creation of different plots for matrix/fracture. For // As discussed with Liv Merete, it is not any use for creation of different plots for matrix/fracture. For
// now, use hardcoded value for MATRIX // now, use hardcoded value for MATRIX
+1 -21
View File
@@ -127,10 +127,6 @@ Rim3dView::Rim3dView( void )
CAF_PDM_InitField( &m_showZScaleLabel, "ShowZScale", true, "Show Z Scale Label", "", "", "" ); CAF_PDM_InitField( &m_showZScaleLabel, "ShowZScale", true, "Show Z Scale Label", "", "", "" );
RICF_InitField( &m_viewId, "ViewId", -1, "View ID", "", "", "" );
m_viewId.uiCapability()->setUiReadOnly( true );
m_viewId.capability<RicfFieldHandle>()->setIOWriteable( false );
m_crossSectionVizModel = new cvf::ModelBasicList; m_crossSectionVizModel = new cvf::ModelBasicList;
m_crossSectionVizModel->setName( "CrossSectionModel" ); m_crossSectionVizModel->setName( "CrossSectionModel" );
@@ -185,22 +181,6 @@ QString Rim3dView::name() const
return m_nameConfig->customName(); return m_nameConfig->customName();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int Rim3dView::id() const
{
return m_viewId;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void Rim3dView::setId( int id )
{
m_viewId = id;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -304,7 +284,7 @@ void Rim3dView::deleteViewWidget()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void Rim3dView::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void Rim3dView::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
uiOrdering.add( &m_viewId ); RimViewWindow::defineUiOrdering( uiConfigName, uiOrdering );
caf::PdmUiGroup* viewGroup = uiOrdering.addNewGroupWithKeyword( "Viewer", "ViewGroup" ); caf::PdmUiGroup* viewGroup = uiOrdering.addNewGroupWithKeyword( "Viewer", "ViewGroup" );
@@ -109,9 +109,6 @@ public:
void setName( const QString& name ); void setName( const QString& name );
QString name() const; QString name() const;
int id() const;
void setId( int id );
// Implementation of RiuViewerToViewInterface // Implementation of RiuViewerToViewInterface
cvf::Color3f backgroundColor() const override cvf::Color3f backgroundColor() const override
{ {
@@ -290,5 +287,4 @@ private:
caf::PdmField<cvf::Color3f> m_backgroundColor; caf::PdmField<cvf::Color3f> m_backgroundColor;
caf::PdmField<bool> m_showGridBox; caf::PdmField<bool> m_showGridBox;
caf::PdmField<bool> m_showZScaleLabel; caf::PdmField<bool> m_showZScaleLabel;
caf::PdmField<int> m_viewId;
}; };
@@ -43,6 +43,8 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimCase, "RimCase" );
RimCase::RimCase() RimCase::RimCase()
: m_isInActiveDestruction( false ) : m_isInActiveDestruction( false )
{ {
CAF_PDM_InitObject( "Case", ":/Case48x48.png", "", "" );
RICF_InitField( &caseUserDescription, "CaseUserDescription", QString(), "Case Name", "", "", "" ); RICF_InitField( &caseUserDescription, "CaseUserDescription", QString(), "Case Name", "", "", "" );
RICF_InitField( &caseId, "CaseId", -1, "Case ID", "", "", "" ); RICF_InitField( &caseId, "CaseId", -1, "Case ID", "", "", "" );
@@ -173,3 +175,14 @@ QList<caf::PdmOptionItemInfo> RimCase::calculateValueOptions( const caf::PdmFiel
return options; return options;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimCase::initAfterRead()
{
if ( caseId() == -1 )
{
RiaApplication::instance()->project()->assignCaseIdToCase( this );
}
}
@@ -82,6 +82,7 @@ protected:
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly ) override; bool* useOptionsOnly ) override;
virtual std::vector<Rim3dView*> allSpecialViews() const = 0; virtual std::vector<Rim3dView*> allSpecialViews() const = 0;
void initAfterRead() override;
private: private:
caf::PdmFieldHandle* userDescriptionField() override caf::PdmFieldHandle* userDescriptionField() override
@@ -25,6 +25,7 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimCheckableNamedObject, "CheckableNamedObject
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimCheckableNamedObject::RimCheckableNamedObject( void ) RimCheckableNamedObject::RimCheckableNamedObject( void )
{ {
CAF_PDM_InitObject( "Checkable object", "", "", "" );
CAF_PDM_InitField( &m_isChecked, "IsChecked", true, "Active", "", "", "" ); CAF_PDM_InitField( &m_isChecked, "IsChecked", true, "Active", "", "", "" );
m_isChecked.uiCapability()->setUiHidden( true ); m_isChecked.uiCapability()->setUiHidden( true );
} }
@@ -75,6 +75,8 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimEclipseCase, "RimReservoir" );
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimEclipseCase::RimEclipseCase() RimEclipseCase::RimEclipseCase()
{ {
CAF_PDM_InitObject( "EclipseCase", ":/Case48x48.png", "", "" );
CAF_PDM_InitFieldNoDefault( &reservoirViews, "ReservoirViews", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &reservoirViews, "ReservoirViews", "", "", "", "" );
reservoirViews.uiCapability()->setUiHidden( true ); reservoirViews.uiCapability()->setUiHidden( true );
@@ -246,6 +248,8 @@ const RigMainGrid* RimEclipseCase::mainGrid() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEclipseCase::initAfterRead() void RimEclipseCase::initAfterRead()
{ {
RimCase::initAfterRead();
size_t j; size_t j;
for ( j = 0; j < reservoirViews().size(); j++ ) for ( j = 0; j < reservoirViews().size(); j++ )
{ {
@@ -160,6 +160,8 @@ void RimEclipseContourMapView::updateCurrentTimeStepAndRedraw()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEclipseContourMapView::initAfterRead() void RimEclipseContourMapView::initAfterRead()
{ {
RimEclipseView::initAfterRead();
disablePerspectiveProjectionField(); disablePerspectiveProjectionField();
setShowGridBox( false ); setShowGridBox( false );
meshMode.setValue( RiaDefines::NO_MESH ); meshMode.setValue( RiaDefines::NO_MESH );
@@ -12,6 +12,8 @@ CAF_PDM_SOURCE_INIT( RimFileWellPath, "WellPath" );
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimFileWellPath::RimFileWellPath() RimFileWellPath::RimFileWellPath()
{ {
CAF_PDM_InitObject( "File Well Path", ":/Well.png", "", "" );
CAF_PDM_InitFieldNoDefault( &id, "WellPathId", "Id", "", "", "" ); CAF_PDM_InitFieldNoDefault( &id, "WellPathId", "Id", "", "", "" );
id.uiCapability()->setUiReadOnly( true ); id.uiCapability()->setUiReadOnly( true );
id.xmlCapability()->disableIO(); id.xmlCapability()->disableIO();
@@ -23,6 +23,7 @@
#include "RiaLogging.h" #include "RiaLogging.h"
#include "RiaPreferences.h" #include "RiaPreferences.h"
#include "RicfCommandObject.h"
#include "RifOdbReader.h" #include "RifOdbReader.h"
#include "RigFemPartCollection.h" #include "RigFemPartCollection.h"
@@ -63,7 +64,7 @@ RimGeoMechCase::RimGeoMechCase( void )
{ {
CAF_PDM_InitObject( "Geomechanical Case", ":/GeoMechCase48x48.png", "", "" ); CAF_PDM_InitObject( "Geomechanical Case", ":/GeoMechCase48x48.png", "", "" );
CAF_PDM_InitFieldNoDefault( &m_caseFileName, "CaseFileName", "Case File Name", "", "", "" ); RICF_InitFieldNoDefault( &m_caseFileName, "CaseFileName", "Case File Name", "", "", "" );
m_caseFileName.uiCapability()->setUiReadOnly( true ); m_caseFileName.uiCapability()->setUiReadOnly( true );
CAF_PDM_InitFieldNoDefault( &geoMechViews, "GeoMechViews", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &geoMechViews, "GeoMechViews", "", "", "", "" );
geoMechViews.uiCapability()->setUiHidden( true ); geoMechViews.uiCapability()->setUiHidden( true );
@@ -387,6 +388,8 @@ std::vector<QDateTime> RimGeoMechCase::timeStepDates() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimGeoMechCase::initAfterRead() void RimGeoMechCase::initAfterRead()
{ {
RimCase::initAfterRead();
size_t j; size_t j;
for ( j = 0; j < geoMechViews().size(); j++ ) for ( j = 0; j < geoMechViews().size(); j++ )
{ {
@@ -172,6 +172,8 @@ bool RimGeoMechContourMapView::isTimeStepDependentDataVisible() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimGeoMechContourMapView::initAfterRead() void RimGeoMechContourMapView::initAfterRead()
{ {
RimGeoMechView::initAfterRead();
m_gridCollection->setActive( false ); // This is also not added to the tree view, so cannot be enabled. m_gridCollection->setActive( false ); // This is also not added to the tree view, so cannot be enabled.
disablePerspectiveProjectionField(); disablePerspectiveProjectionField();
setShowGridBox( false ); setShowGridBox( false );
@@ -109,6 +109,7 @@ protected:
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, void fieldChangedByUi( const caf::PdmFieldHandle* changedField,
const QVariant& oldValue, const QVariant& oldValue,
const QVariant& newValue ) override; const QVariant& newValue ) override;
void initAfterRead() override;
void createPartCollectionFromSelection( cvf::Collection<cvf::Part>* parts ) override; void createPartCollectionFromSelection( cvf::Collection<cvf::Part>* parts ) override;
void createDisplayModel() override; void createDisplayModel() override;
@@ -130,8 +131,6 @@ private:
void updateTensorLegendTextAndRanges( RimRegularLegendConfig* legendConfig, int timeStepIndex ); void updateTensorLegendTextAndRanges( RimRegularLegendConfig* legendConfig, int timeStepIndex );
void initAfterRead() override;
caf::PdmChildField<RimTensorResults*> m_tensorResults; caf::PdmChildField<RimTensorResults*> m_tensorResults;
caf::PdmChildField<RimGeoMechPropertyFilterCollection*> m_propertyFilterCollection; caf::PdmChildField<RimGeoMechPropertyFilterCollection*> m_propertyFilterCollection;
caf::PdmPointer<RimGeoMechPropertyFilterCollection> m_overridePropertyFilterCollection; caf::PdmPointer<RimGeoMechPropertyFilterCollection> m_overridePropertyFilterCollection;
@@ -0,0 +1,36 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimPlot.h"
CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimPlot, "RimPlot" ); // Do not use. Abstract class
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimPlot::RimPlot()
{
CAF_PDM_InitObject( "Plot", "", "", "" );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* RimPlot::createPlotWidget()
{
return createViewWidget( nullptr );
}
@@ -0,0 +1,31 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 "RimNameConfig.h"
#include "RimViewWindow.h"
class RimPlot : public RimViewWindow
{
CAF_PDM_HEADER_INIT;
public:
RimPlot();
QWidget* createPlotWidget();
};
+34 -18
View File
@@ -73,6 +73,7 @@
#include "RimValveTemplateCollection.h" #include "RimValveTemplateCollection.h"
#include "RimViewLinker.h" #include "RimViewLinker.h"
#include "RimViewLinkerCollection.h" #include "RimViewLinkerCollection.h"
#include "RimViewWindow.h"
#include "RimWellLogFile.h" #include "RimWellLogFile.h"
#include "RimWellLogPlotCollection.h" #include "RimWellLogPlotCollection.h"
#include "RimWellPath.h" #include "RimWellPath.h"
@@ -100,18 +101,11 @@ CAF_PDM_SOURCE_INIT( RimProject, "ResInsightProject" );
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimProject::RimProject( void ) RimProject::RimProject( void )
{ {
CAF_PDM_InitObject( "Project", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_projectFileVersionString, "ProjectFileVersionString", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_projectFileVersionString, "ProjectFileVersionString", "", "", "", "" );
m_projectFileVersionString.uiCapability()->setUiHidden( true ); m_projectFileVersionString.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &nextValidCaseId, "NextValidCaseId", 0, "Next Valid Case ID", "", "", "" );
nextValidCaseId.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &nextValidCaseGroupId, "NextValidCaseGroupId", 0, "Next Valid Case Group ID", "", "", "" );
nextValidCaseGroupId.uiCapability()->setUiHidden( true );
CAF_PDM_InitField( &nextValidViewId, "NextValidViewId", 0, "Next Valid View ID", "", "", "" );
nextValidViewId.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &oilFields, "OilFields", "Oil Fields", "", "", "" ); CAF_PDM_InitFieldNoDefault( &oilFields, "OilFields", "Oil Fields", "", "", "" );
oilFields.uiCapability()->setUiHidden( true ); oilFields.uiCapability()->setUiHidden( true );
@@ -244,9 +238,6 @@ void RimProject::close()
fileName = ""; fileName = "";
nextValidCaseId = 0;
nextValidCaseGroupId = 0;
nextValidViewId = 0;
mainWindowCurrentModelIndexPath = ""; mainWindowCurrentModelIndexPath = "";
mainWindowTreeViewState = ""; mainWindowTreeViewState = "";
plotWindowCurrentModelIndexPath = ""; plotWindowCurrentModelIndexPath = "";
@@ -477,9 +468,17 @@ void RimProject::assignCaseIdToCase( RimCase* reservoirCase )
{ {
if ( reservoirCase ) if ( reservoirCase )
{ {
reservoirCase->caseId = nextValidCaseId; int nextValidCaseId = 0;
nextValidCaseId = nextValidCaseId + 1; std::vector<RimCase*> cases;
this->descendantsIncludingThisOfType( cases );
for ( RimCase* rimCase : cases )
{
nextValidCaseId = std::max( nextValidCaseId, rimCase->caseId() + 1 );
}
reservoirCase->caseId = nextValidCaseId;
} }
} }
@@ -490,21 +489,38 @@ void RimProject::assignIdToCaseGroup( RimIdenticalGridCaseGroup* caseGroup )
{ {
if ( caseGroup ) if ( caseGroup )
{ {
caseGroup->groupId = nextValidCaseGroupId; int nextValidCaseGroupId = 0;
nextValidCaseGroupId = nextValidCaseGroupId + 1; std::vector<RimIdenticalGridCaseGroup*> identicalCaseGroups;
this->descendantsIncludingThisOfType( identicalCaseGroups );
for ( RimIdenticalGridCaseGroup* existingCaseGroup : identicalCaseGroups )
{
nextValidCaseGroupId = std::max( nextValidCaseGroupId, existingCaseGroup->groupId() + 1 );
}
caseGroup->groupId = nextValidCaseGroupId;
} }
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimProject::assignViewIdToView( Rim3dView* view ) void RimProject::assignViewIdToView( RimViewWindow* view )
{ {
if ( view ) if ( view )
{ {
int nextValidViewId = 0;
std::vector<RimViewWindow*> viewWindows;
this->descendantsIncludingThisOfType( viewWindows );
for ( RimViewWindow* existingView : viewWindows )
{
nextValidViewId = std::max( nextValidViewId, existingView->id() + 1 );
}
view->setId( nextValidViewId ); view->setId( nextValidViewId );
nextValidViewId = nextValidViewId + 1;
} }
} }
@@ -59,6 +59,7 @@ class Rim3dView;
class RimGridView; class RimGridView;
class RimViewLinker; class RimViewLinker;
class RimViewLinkerCollection; class RimViewLinkerCollection;
class RimViewWindow;
class RimWellPath; class RimWellPath;
class RimWellPathImport; class RimWellPathImport;
class RimFractureTemplateCollection; class RimFractureTemplateCollection;
@@ -115,7 +116,7 @@ public:
void assignCaseIdToCase( RimCase* reservoirCase ); void assignCaseIdToCase( RimCase* reservoirCase );
void assignIdToCaseGroup( RimIdenticalGridCaseGroup* caseGroup ); void assignIdToCaseGroup( RimIdenticalGridCaseGroup* caseGroup );
void assignViewIdToView( Rim3dView* view ); void assignViewIdToView( RimViewWindow* view );
void allCases( std::vector<RimCase*>& cases ) const; void allCases( std::vector<RimCase*>& cases ) const;
@@ -199,10 +200,6 @@ private:
caf::PdmField<bool> m_subWindowsTiled3DWindow; caf::PdmField<bool> m_subWindowsTiled3DWindow;
caf::PdmField<bool> m_subWindowsTiledPlotWindow; caf::PdmField<bool> m_subWindowsTiledPlotWindow;
caf::PdmField<int> nextValidCaseId; // Unique case ID within a project, used to identify a case from scripts
caf::PdmField<int> nextValidCaseGroupId; // Unique case group ID within a project, used to identify a case group from scripts
caf::PdmField<int> nextValidViewId; // Unique view ID within a project, used to identify a view from scripts
caf::PdmChildArrayField<RimEclipseCase*> casesObsolete; // obsolete caf::PdmChildArrayField<RimEclipseCase*> casesObsolete; // obsolete
caf::PdmChildArrayField<RimIdenticalGridCaseGroup*> caseGroupsObsolete; // obsolete caf::PdmChildArrayField<RimIdenticalGridCaseGroup*> caseGroupsObsolete; // obsolete
}; };
@@ -18,10 +18,13 @@
#include "RimViewWindow.h" #include "RimViewWindow.h"
#include "RiaApplication.h"
#include "RiaFieldHandleTools.h" #include "RiaFieldHandleTools.h"
#include "RiaGuiApplication.h" #include "RiaGuiApplication.h"
#include "RicfCommandObject.h"
#include "RimMdiWindowController.h" #include "RimMdiWindowController.h"
#include "RimProject.h"
#include "cvfAssert.h" #include "cvfAssert.h"
@@ -34,10 +37,16 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimViewWindow, "ViewWindow" ); // Do not use.
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimViewWindow::RimViewWindow( void ) RimViewWindow::RimViewWindow( void )
{ {
CAF_PDM_InitObject( "View window", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_windowController, "WindowController", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_windowController, "WindowController", "", "", "", "" );
m_windowController.uiCapability()->setUiHidden( true ); m_windowController.uiCapability()->setUiHidden( true );
m_windowController.uiCapability()->setUiTreeChildrenHidden( true ); m_windowController.uiCapability()->setUiTreeChildrenHidden( true );
RICF_InitField( &m_viewId, "ViewId", -1, "View ID", "", "", "" );
m_viewId.uiCapability()->setUiReadOnly( true );
m_viewId.capability<RicfFieldHandle>()->setIOWriteable( false );
CAF_PDM_InitField( &m_showWindow, "ShowWindow", true, "Show Window", "", "", "" ); CAF_PDM_InitField( &m_showWindow, "ShowWindow", true, "Show Window", "", "", "" );
m_showWindow.uiCapability()->setUiHidden( true ); m_showWindow.uiCapability()->setUiHidden( true );
@@ -54,6 +63,22 @@ RimViewWindow::~RimViewWindow( void )
if ( m_windowController() ) delete m_windowController(); if ( m_windowController() ) delete m_windowController();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int RimViewWindow::id() const
{
return m_viewId;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimViewWindow::setId( int id )
{
m_viewId = id;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -252,4 +277,16 @@ void RimViewWindow::initAfterRead()
setAsMdiWindow( mainWindowID ); setAsMdiWindow( mainWindowID );
setMdiWindowGeometry( wg ); setMdiWindowGeometry( wg );
} }
if ( m_viewId() == -1 )
{
RiaApplication::instance()->project()->assignViewIdToView( this );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimViewWindow::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
uiOrdering.add( &m_viewId );
} }
@@ -61,6 +61,9 @@ public:
RimViewWindow( void ); RimViewWindow( void );
~RimViewWindow( void ) override; ~RimViewWindow( void ) override;
int id() const;
void setId( int id );
void loadDataAndUpdate(); void loadDataAndUpdate();
void handleMdiWindowClosed(); void handleMdiWindowClosed();
void updateMdiWindowVisibility(); void updateMdiWindowVisibility();
@@ -124,13 +127,17 @@ protected:
const QVariant& oldValue, const QVariant& oldValue,
const QVariant& newValue ) override; const QVariant& newValue ) override;
void initAfterRead() override; void initAfterRead() override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
caf::PdmField<bool> m_showWindow;
private: private:
void setAsMdiWindow( int mainWindowID ); void setAsMdiWindow( int mainWindowID );
protected:
caf::PdmField<bool> m_showWindow;
private:
caf::PdmChildField<RimMdiWindowController*> m_windowController; caf::PdmChildField<RimMdiWindowController*> m_windowController;
caf::PdmField<int> m_viewId;
// Obsoleted field // Obsoleted field
caf::PdmField<std::vector<int>> obsoleteField_windowGeometry; caf::PdmField<std::vector<int>> obsoleteField_windowGeometry;
@@ -125,6 +125,8 @@ double RimWellBoreStabilityPlot::userDefinedUcs() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimWellBoreStabilityPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimWellBoreStabilityPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
RimViewWindow::defineUiOrdering( uiConfigName, uiOrdering );
m_commonDataSource->uiOrdering( uiConfigName, uiOrdering ); m_commonDataSource->uiOrdering( uiConfigName, uiOrdering );
caf::PdmUiGroup* parameterSources = uiOrdering.addNewGroup( "Parameter Sources" ); caf::PdmUiGroup* parameterSources = uiOrdering.addNewGroup( "Parameter Sources" );
@@ -489,6 +489,11 @@ void RimWellLogExtractionCurve::extractData( bool* isUsingPseudoLength,
measuredDepthValues = geomExtractor->cellIntersectionMDs(); measuredDepthValues = geomExtractor->cellIntersectionMDs();
tvDepthValues = geomExtractor->cellIntersectionTVDs(); tvDepthValues = geomExtractor->cellIntersectionTVDs();
if ( measuredDepthValues.empty() )
{
return;
}
findAndLoadWbsParametersFromLasFiles( m_wellPath(), geomExtractor.p() ); findAndLoadWbsParametersFromLasFiles( m_wellPath(), geomExtractor.p() );
RimWellBoreStabilityPlot* wbsPlot; RimWellBoreStabilityPlot* wbsPlot;
this->firstAncestorOrThisOfType( wbsPlot ); this->firstAncestorOrThisOfType( wbsPlot );
@@ -40,6 +40,7 @@
#include <QFileInfo> #include <QFileInfo>
#include <QMessageBox> #include <QMessageBox>
#include <QString>
#include <QStringList> #include <QStringList>
CAF_PDM_SOURCE_INIT( RimWellLogFile, "WellLogFile" ); CAF_PDM_SOURCE_INIT( RimWellLogFile, "WellLogFile" );
@@ -110,33 +111,20 @@ RimWellLogFile::~RimWellLogFile()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimWellLogFile* RimWellLogFile::readWellLogFile( const QString& logFilePath ) RimWellLogFile* RimWellLogFile::readWellLogFile( const QString& logFilePath, QString* errorMessage )
{ {
CAF_ASSERT( errorMessage );
QFileInfo fi( logFilePath ); QFileInfo fi( logFilePath );
RimWellLogFile* wellLogFile = nullptr; RimWellLogFile* wellLogFile = nullptr;
if ( fi.suffix().toUpper().compare( "LAS" ) == 0 ) if ( fi.suffix().toUpper().compare( "LAS" ) == 0 )
{ {
QString errorMessage;
wellLogFile = new RimWellLogFile(); wellLogFile = new RimWellLogFile();
wellLogFile->setFileName( logFilePath ); wellLogFile->setFileName( logFilePath );
if ( !wellLogFile->readFile( &errorMessage ) ) if ( !wellLogFile->readFile( errorMessage ) )
{ {
QString displayMessage = "Could not open the LAS file: \n" + logFilePath;
if ( !errorMessage.isEmpty() )
{
displayMessage += "\n\n";
displayMessage += errorMessage;
}
if ( RiaGuiApplication::isRunning() )
{
QMessageBox::warning( Riu3DMainWindowTools::mainWindowWidget(), "File open error", displayMessage );
}
RiaLogging::warning( errorMessage );
delete wellLogFile; delete wellLogFile;
wellLogFile = nullptr; wellLogFile = nullptr;
} }
@@ -181,15 +169,10 @@ bool RimWellLogFile::readFile( QString* errorMessage )
} }
else if ( !isDateValid( m_date() ) ) else if ( !isDateValid( m_date() ) )
{ {
QMessageBox msgBox; *errorMessage =
QString message =
QString( QString(
"The LAS-file '%1' contains no recognizable date. Please assign a date in the LAS-file property panel" ) "The LAS-file '%1' contains no recognizable date. Please assign a date in the LAS-file property panel" )
.arg( m_name() ); .arg( m_name() );
msgBox.setText( message );
msgBox.setStandardButtons( QMessageBox::Ok );
msgBox.exec();
m_date = DEFAULT_DATE_TIME; m_date = DEFAULT_DATE_TIME;
} }
@@ -46,7 +46,7 @@ public:
RimWellLogFile(); RimWellLogFile();
~RimWellLogFile() override; ~RimWellLogFile() override;
static RimWellLogFile* readWellLogFile( const QString& logFilePath ); static RimWellLogFile* readWellLogFile( const QString& logFilePath, QString* errorMessage );
void setFileName( const QString& fileName ); void setFileName( const QString& fileName );
QString fileName() const QString fileName() const
@@ -176,14 +176,6 @@ RimWellLogPlot::~RimWellLogPlot()
delete m_nameConfig; delete m_nameConfig;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QWidget* RimWellLogPlot::createPlotWidget()
{
return createViewWidget( nullptr );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -283,8 +275,10 @@ QImage RimWellLogPlot::snapshotWindowContent()
if ( m_viewer ) if ( m_viewer )
{ {
m_viewer->setScrollbarVisible( false );
QPixmap pix = m_viewer->grab(); QPixmap pix = m_viewer->grab();
image = pix.toImage(); image = pix.toImage();
m_viewer->setScrollbarVisible( true );
} }
return image; return image;
@@ -795,6 +789,8 @@ void RimWellLogPlot::depthZoomMinMax( double* minimumDepth, double* maximumDepth
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimWellLogPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimWellLogPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
RimViewWindow::defineUiOrdering( uiConfigName, uiOrdering );
m_commonDataSource->uiOrdering( uiConfigName, uiOrdering ); m_commonDataSource->uiOrdering( uiConfigName, uiOrdering );
uiOrderingForDepthAxis( uiOrdering ); uiOrderingForDepthAxis( uiOrdering );
uiOrderingForPlotSettings( uiOrdering ); uiOrderingForPlotSettings( uiOrdering );
@@ -943,7 +939,7 @@ void RimWellLogPlot::setDescription( const QString& description )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QString RimWellLogPlot::description() const QString RimWellLogPlot::description() const
{ {
return createAutoName(); return m_nameConfig->customName();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -975,6 +971,8 @@ void RimWellLogPlot::deleteViewWidget()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimWellLogPlot::initAfterRead() void RimWellLogPlot::initAfterRead()
{ {
RimViewWindow::initAfterRead();
updateCommonDataSource(); updateCommonDataSource();
if ( !m_userName_OBSOLETE().isEmpty() ) if ( !m_userName_OBSOLETE().isEmpty() )
{ {
@@ -26,6 +26,7 @@
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "RiaDefines.h" #include "RiaDefines.h"
#include "RimPlot.h"
#include "RimViewWindow.h" #include "RimViewWindow.h"
#include "RimWellLogPlotNameConfig.h" #include "RimWellLogPlotNameConfig.h"
@@ -42,7 +43,7 @@ class QKeyEvent;
/// ///
/// ///
//================================================================================================== //==================================================================================================
class RimWellLogPlot : public RimViewWindow, public RimNameConfigHolderInterface class RimWellLogPlot : public RimPlot, public RimNameConfigHolderInterface
{ {
CAF_PDM_HEADER_INIT; CAF_PDM_HEADER_INIT;
@@ -70,7 +71,6 @@ public:
RimWellLogPlot& operator=( RimWellLogPlot&& rhs ); RimWellLogPlot& operator=( RimWellLogPlot&& rhs );
QWidget* createPlotWidget();
QWidget* viewWidget() override; QWidget* viewWidget() override;
void setDescription( const QString& description ); void setDescription( const QString& description );
@@ -26,6 +26,8 @@
#include "RiaSimWellBranchTools.h" #include "RiaSimWellBranchTools.h"
#include "RiaWellNameComparer.h" #include "RiaWellNameComparer.h"
#include "RicfCommandObject.h"
#include "RifWellPathFormationsImporter.h" #include "RifWellPathFormationsImporter.h"
#include "RifWellPathImporter.h" #include "RifWellPathImporter.h"
@@ -73,7 +75,7 @@ RimWellPath::RimWellPath()
{ {
CAF_PDM_InitObject( "WellPath", ":/Well.png", "", "" ); CAF_PDM_InitObject( "WellPath", ":/Well.png", "", "" );
CAF_PDM_InitFieldNoDefault( &m_name, "WellPathName", "Name", "", "", "" ); RICF_InitFieldNoDefault( &m_name, "WellPathName", "Name", "", "", "" );
m_name.uiCapability()->setUiReadOnly( true ); m_name.uiCapability()->setUiReadOnly( true );
m_name.uiCapability()->setUiHidden( true ); m_name.uiCapability()->setUiHidden( true );
m_name.xmlCapability()->disableIO(); m_name.xmlCapability()->disableIO();
@@ -198,8 +198,10 @@ void RimWellPathCollection::loadDataAndUpdate()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimWellPathCollection::addWellPaths( QStringList filePaths ) std::vector<RimFileWellPath*> RimWellPathCollection::addWellPaths( QStringList filePaths, QStringList* errorMessages )
{ {
CAF_ASSERT( errorMessages );
std::vector<RimFileWellPath*> wellPathArray; std::vector<RimFileWellPath*> wellPathArray;
for ( QString filePath : filePaths ) for ( QString filePath : filePaths )
@@ -221,6 +223,7 @@ void RimWellPathCollection::addWellPaths( QStringList filePaths )
{ {
// printf("Attempting to open well path JSON file that is already open:\n %s\n", (const char*) filePath.toLocal8Bit()); // printf("Attempting to open well path JSON file that is already open:\n %s\n", (const char*) filePath.toLocal8Bit());
alreadyOpen = true; alreadyOpen = true;
errorMessages->push_back( QString( "%1 is already loaded" ).arg( filePath ) );
break; break;
} }
} }
@@ -254,6 +257,8 @@ void RimWellPathCollection::addWellPaths( QStringList filePaths )
scheduleRedrawAffectedViews(); scheduleRedrawAffectedViews();
updateAllRequiredEditors(); updateAllRequiredEditors();
return wellPathArray;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -315,13 +320,20 @@ void RimWellPathCollection::addWellPaths( const std::vector<RimWellPath*> incomi
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimWellLogFile* RimWellPathCollection::addWellLogs( const QStringList& filePaths ) std::vector<RimWellLogFile*> RimWellPathCollection::addWellLogs( const QStringList& filePaths, QStringList* errorMessages )
{ {
RimWellLogFile* logFileInfo = nullptr; CAF_ASSERT( errorMessages );
std::vector<RimWellLogFile*> logFileInfos;
foreach ( QString filePath, filePaths ) foreach ( QString filePath, filePaths )
{ {
logFileInfo = RimWellLogFile::readWellLogFile( filePath ); QString errorMessage;
RimWellLogFile* logFileInfo = RimWellLogFile::readWellLogFile( filePath, &errorMessage );
if ( !errorMessage.isEmpty() )
{
errorMessages->push_back( errorMessage );
}
if ( logFileInfo ) if ( logFileInfo )
{ {
RimWellPath* wellPath = tryFindMatchingWellPath( logFileInfo->wellName() ); RimWellPath* wellPath = tryFindMatchingWellPath( logFileInfo->wellName() );
@@ -332,13 +344,14 @@ RimWellLogFile* RimWellPathCollection::addWellLogs( const QStringList& filePaths
} }
wellPath->addWellLogFile( logFileInfo ); wellPath->addWellLogFile( logFileInfo );
logFileInfos.push_back( logFileInfo );
} }
} }
this->sortWellsByName(); this->sortWellsByName();
updateAllRequiredEditors(); updateAllRequiredEditors();
return logFileInfo; return logFileInfos;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -88,8 +88,8 @@ public:
caf::PdmChildArrayField<RimWellPath*> wellPaths; caf::PdmChildArrayField<RimWellPath*> wellPaths;
void loadDataAndUpdate(); void loadDataAndUpdate();
void addWellPaths( QStringList filePaths ); std::vector<RimFileWellPath*> addWellPaths( QStringList filePaths, QStringList* errorMessages );
void removeWellPath( RimWellPath* wellPath ); void removeWellPath( RimWellPath* wellPath );
void deleteAllWellPaths(); void deleteAllWellPaths();
@@ -99,11 +99,11 @@ public:
void readWellPathFormationFiles(); void readWellPathFormationFiles();
void reloadAllWellPathFormations(); void reloadAllWellPathFormations();
RimWellPath* wellPathByName( const QString& wellPathName ) const; RimWellPath* wellPathByName( const QString& wellPathName ) const;
RimWellPath* tryFindMatchingWellPath( const QString& wellName ) const; RimWellPath* tryFindMatchingWellPath( const QString& wellName ) const;
void addWellPaths( const std::vector<RimWellPath*> incomingWellPaths ); void addWellPaths( const std::vector<RimWellPath*> incomingWellPaths );
RimWellLogFile* addWellLogs( const QStringList& filePaths ); std::vector<RimWellLogFile*> addWellLogs( const QStringList& filePaths, QStringList* errorMessages );
void addWellPathFormations( const QStringList& filePaths ); void addWellPathFormations( const QStringList& filePaths );
void scheduleRedrawAffectedViews(); void scheduleRedrawAffectedViews();
@@ -52,10 +52,10 @@
#include "RiuSummaryQwtPlot.h" #include "RiuSummaryQwtPlot.h"
#include "cafPdmObject.h" #include "cafPdmObject.h"
#include "cafPdmUiLineEditor.h"
#include "cafPdmUiListEditor.h" #include "cafPdmUiListEditor.h"
#include "cafPdmUiPushButtonEditor.h" #include "cafPdmUiPushButtonEditor.h"
#include "cafPdmUiTreeOrdering.h" #include "cafPdmUiTreeOrdering.h"
#include "cafPdmUiLineEditor.h"
#include "cvfScalarMapper.h" #include "cvfScalarMapper.h"
@@ -112,8 +112,7 @@ RimEnsembleCurveSet::RimEnsembleCurveSet()
CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryAddressUiField, "SelectedVariableDisplayVar", "Vector", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryAddressUiField, "SelectedVariableDisplayVar", "Vector", "", "", "" );
m_yValuesSummaryAddressUiField.xmlCapability()->disableIO(); m_yValuesSummaryAddressUiField.xmlCapability()->disableIO();
m_yValuesSummaryAddressUiField.uiCapability()->setUiEditorTypeName(caf::PdmUiLineEditor::uiEditorTypeName()); m_yValuesSummaryAddressUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() );
CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryAddress, "SummaryAddress", "Summary Address", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryAddress, "SummaryAddress", "Summary Address", "", "", "" );
m_yValuesSummaryAddress.uiCapability()->setUiHidden( true ); m_yValuesSummaryAddress.uiCapability()->setUiHidden( true );
@@ -122,7 +121,7 @@ RimEnsembleCurveSet::RimEnsembleCurveSet()
CAF_PDM_InitFieldNoDefault( &m_yPushButtonSelectSummaryAddress, "SelectAddress", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_yPushButtonSelectSummaryAddress, "SelectAddress", "", "", "", "" );
caf::PdmUiPushButtonEditor::configureEditorForField( &m_yPushButtonSelectSummaryAddress ); caf::PdmUiPushButtonEditor::configureEditorForField( &m_yPushButtonSelectSummaryAddress );
m_yPushButtonSelectSummaryAddress.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::HIDDEN); m_yPushButtonSelectSummaryAddress.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
m_yPushButtonSelectSummaryAddress = false; m_yPushButtonSelectSummaryAddress = false;
CAF_PDM_InitField( &m_colorMode, "ColorMode", caf::AppEnum<ColorMode>( SINGLE_COLOR ), "Coloring Mode", "", "", "" ); CAF_PDM_InitField( &m_colorMode, "ColorMode", caf::AppEnum<ColorMode>( SINGLE_COLOR ), "Coloring Mode", "", "", "" );
@@ -174,9 +173,8 @@ RimEnsembleCurveSet::RimEnsembleCurveSet()
CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryFilter_OBSOLETE, "VarListFilter", "Filter", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryFilter_OBSOLETE, "VarListFilter", "Filter", "", "", "" );
m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeChildrenHidden( true ); m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeChildrenHidden( true );
m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiHidden( true ); m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiHidden( true );
m_yValuesSummaryFilter_OBSOLETE.xmlCapability()->setIOWritable(false); m_yValuesSummaryFilter_OBSOLETE.xmlCapability()->setIOWritable( false );
m_yValuesSummaryFilter_OBSOLETE = new RimSummaryFilter_OBSOLETE; m_yValuesSummaryFilter_OBSOLETE = new RimSummaryFilter_OBSOLETE;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -220,7 +218,7 @@ void RimEnsembleCurveSet::setColor( cvf::Color3f color )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleCurveSet::loadDataAndUpdate( bool updateParentPlot ) void RimEnsembleCurveSet::loadDataAndUpdate( bool updateParentPlot )
{ {
m_yValuesSummaryAddressUiField = m_yValuesSummaryAddress->address(); m_yValuesSummaryAddressUiField = m_yValuesSummaryAddress->address();
updateAllCurves(); updateAllCurves();
@@ -637,10 +635,9 @@ void RimEnsembleCurveSet::defineUiOrdering( QString uiConfigName, caf::PdmUiOrde
caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Summary Vector Y" ); caf::PdmUiGroup* curveDataGroup = uiOrdering.addNewGroup( "Summary Vector Y" );
curveDataGroup->add( &m_yValuesSummaryCaseCollection ); curveDataGroup->add( &m_yValuesSummaryCaseCollection );
curveDataGroup->add( &m_yValuesSummaryAddressUiField ); curveDataGroup->add( &m_yValuesSummaryAddressUiField );
curveDataGroup->add( &m_yPushButtonSelectSummaryAddress, {false, 1, 0}); curveDataGroup->add( &m_yPushButtonSelectSummaryAddress, {false, 1, 0} );
curveDataGroup->add( &m_plotAxis ); curveDataGroup->add( &m_plotAxis );
}
}
caf::PdmUiGroup* colorsGroup = uiOrdering.addNewGroup( "Colors" ); caf::PdmUiGroup* colorsGroup = uiOrdering.addNewGroup( "Colors" );
m_colorMode.uiCapability()->setUiReadOnly( !m_yValuesSummaryCaseCollection() ); m_colorMode.uiCapability()->setUiReadOnly( !m_yValuesSummaryCaseCollection() );
@@ -805,7 +802,7 @@ QList<caf::PdmOptionItemInfo> RimEnsembleCurveSet::calculateValueOptions( const
/// Optimization candidate /// Optimization candidate
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleCurveSet::appendOptionItemsForSummaryAddresses( QList<caf::PdmOptionItemInfo>* options, void RimEnsembleCurveSet::appendOptionItemsForSummaryAddresses( QList<caf::PdmOptionItemInfo>* options,
RimSummaryCaseCollection* summaryCaseGroup) RimSummaryCaseCollection* summaryCaseGroup )
{ {
if ( !summaryCaseGroup ) return; if ( !summaryCaseGroup ) return;
@@ -18,6 +18,8 @@
#include "RimSummaryCrossPlotCollection.h" #include "RimSummaryCrossPlotCollection.h"
#include "RiaApplication.h"
#include "RimProject.h"
#include "RimSummaryCrossPlot.h" #include "RimSummaryCrossPlot.h"
#include "RimSummaryPlot.h" #include "RimSummaryPlot.h"
@@ -87,6 +89,7 @@ RimSummaryPlot* RimSummaryCrossPlotCollection::createSummaryPlot()
{ {
RimSummaryPlot* plot = new RimSummaryCrossPlot(); RimSummaryPlot* plot = new RimSummaryCrossPlot();
plot->setAsPlotMdiWindow(); plot->setAsPlotMdiWindow();
RiaApplication::instance()->project()->assignViewIdToView( plot );
plot->setDescription( QString( "Summary Cross Plot %1" ).arg( m_summaryCrossPlots.size() ) ); plot->setDescription( QString( "Summary Cross Plot %1" ).arg( m_summaryCrossPlots.size() ) );
@@ -1606,6 +1606,8 @@ void RimSummaryPlot::setAsCrossPlot()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimSummaryPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) void RimSummaryPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{ {
RimViewWindow::defineUiOrdering( uiConfigName, uiOrdering );
caf::PdmUiGroup* mainOptions = uiOrdering.addNewGroup( "General Plot Options" ); caf::PdmUiGroup* mainOptions = uiOrdering.addNewGroup( "General Plot Options" );
mainOptions->add( &m_showPlotTitle ); mainOptions->add( &m_showPlotTitle );
@@ -1686,6 +1688,8 @@ void RimSummaryPlot::deleteViewWidget()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimSummaryPlot::initAfterRead() void RimSummaryPlot::initAfterRead()
{ {
RimViewWindow::initAfterRead();
// Move summary curves from obsolete storage to the new curve collection // Move summary curves from obsolete storage to the new curve collection
std::vector<RimSummaryCurve*> curvesToMove; std::vector<RimSummaryCurve*> curvesToMove;
@@ -24,8 +24,8 @@
#include "RifEclipseSummaryAddress.h" #include "RifEclipseSummaryAddress.h"
#include "RimPlot.h"
#include "RimRiuQwtPlotOwnerInterface.h" #include "RimRiuQwtPlotOwnerInterface.h"
#include "RimViewWindow.h"
#include "qwt_plot_textlabel.h" #include "qwt_plot_textlabel.h"
@@ -64,7 +64,7 @@ class QKeyEvent;
/// ///
/// ///
//================================================================================================== //==================================================================================================
class RimSummaryPlot : public RimViewWindow, public RimRiuQwtPlotOwnerInterface class RimSummaryPlot : public RimPlot, public RimRiuQwtPlotOwnerInterface
{ {
CAF_PDM_HEADER_INIT; CAF_PDM_HEADER_INIT;
@@ -18,6 +18,8 @@
#include "RimSummaryPlotCollection.h" #include "RimSummaryPlotCollection.h"
#include "RiaApplication.h"
#include "RimProject.h"
#include "RimSummaryPlot.h" #include "RimSummaryPlot.h"
CAF_PDM_SOURCE_INIT( RimSummaryPlotCollection, "SummaryPlotCollection" ); CAF_PDM_SOURCE_INIT( RimSummaryPlotCollection, "SummaryPlotCollection" );
@@ -48,6 +50,7 @@ RimSummaryPlot* RimSummaryPlotCollection::createSummaryPlotWithAutoTitle()
{ {
RimSummaryPlot* plot = new RimSummaryPlot(); RimSummaryPlot* plot = new RimSummaryPlot();
plot->setAsPlotMdiWindow(); plot->setAsPlotMdiWindow();
RiaApplication::instance()->project()->assignViewIdToView( plot );
plot->enableAutoPlotTitle( true ); plot->enableAutoPlotTitle( true );
summaryPlots.push_back( plot ); summaryPlots.push_back( plot );
@@ -62,6 +65,7 @@ RimSummaryPlot* RimSummaryPlotCollection::createNamedSummaryPlot( const QString&
{ {
RimSummaryPlot* plot = new RimSummaryPlot(); RimSummaryPlot* plot = new RimSummaryPlot();
plot->setAsPlotMdiWindow(); plot->setAsPlotMdiWindow();
RiaApplication::instance()->project()->assignViewIdToView( plot );
summaryPlots.push_back( plot ); summaryPlots.push_back( plot );
plot->setDescription( name ); plot->setDescription( name );
@@ -96,13 +96,16 @@ void RigGeoMechWellLogExtractor::performCurveDataSmoothing( int
interfacePorePressuresDbl[i] = interfacePorePressures[i]; interfacePorePressuresDbl[i] = interfacePorePressures[i];
} }
std::vector<std::vector<double>*> dependentValues = {tvds, &interfaceShValuesDbl, &interfacePorePressuresDbl}; if ( !mds->empty() && !values->empty() )
{
std::vector<std::vector<double>*> dependentValues = {tvds, &interfaceShValuesDbl, &interfacePorePressuresDbl};
std::vector<unsigned char> smoothOrFilterSegments = determineFilteringOrSmoothing( interfacePorePressuresDbl ); std::vector<unsigned char> smoothOrFilterSegments = determineFilteringOrSmoothing( interfacePorePressuresDbl );
filterShortSegments( mds, values, &smoothOrFilterSegments, dependentValues ); filterShortSegments( mds, values, &smoothOrFilterSegments, dependentValues );
filterColinearSegments( mds, values, &smoothOrFilterSegments, dependentValues ); filterColinearSegments( mds, values, &smoothOrFilterSegments, dependentValues );
smoothSegments( mds, tvds, values, interfaceShValuesDbl, smoothOrFilterSegments, smoothingTreshold ); smoothSegments( mds, tvds, values, interfaceShValuesDbl, smoothOrFilterSegments, smoothingTreshold );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -374,10 +374,12 @@ void RigLasFileExporter::setRkbDiffs( const std::vector<QString>& wellNames, con
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RigLasFileExporter::writeToFolder( const QString& exportFolder, std::vector<QString> RigLasFileExporter::writeToFolder( const QString& exportFolder,
const QString& filePrefix /*= ""*/, const QString& filePrefix /*= ""*/,
bool capitalizeFileName /*= false*/ ) bool capitalizeFileName /*= false*/ )
{ {
std::vector<QString> writtenFiles;
std::vector<SingleLasFileMetaData> lasFileDescriptions = createLasFileDescriptions( m_curves ); std::vector<SingleLasFileMetaData> lasFileDescriptions = createLasFileDescriptions( m_curves );
applyUserDefinedRkbOffsets( &lasFileDescriptions ); applyUserDefinedRkbOffsets( &lasFileDescriptions );
@@ -414,9 +416,13 @@ bool RigLasFileExporter::writeToFolder( const QString& exportFolder,
std::vector<std::string> commentHeader; std::vector<std::string> commentHeader;
lasFile.WriteToFile( fullPathName.toStdString(), commentHeader ); lasFile.WriteToFile( fullPathName.toStdString(), commentHeader );
if ( QFileInfo::exists( fullPathName ) )
{
writtenFiles.push_back( fullPathName );
}
} }
return true; return writtenFiles;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -38,7 +38,8 @@ public:
void wellPathsAndRkbDiff( std::vector<QString>* wellNames, std::vector<double>* rkbDiffs ); void wellPathsAndRkbDiff( std::vector<QString>* wellNames, std::vector<double>* rkbDiffs );
void setRkbDiffs( const std::vector<QString>& wellNames, const std::vector<double>& rkbDiffs ); void setRkbDiffs( const std::vector<QString>& wellNames, const std::vector<double>& rkbDiffs );
bool writeToFolder( const QString& exportFolder, const QString& filePrefix = "", bool capitalizeFileName = false ); std::vector<QString>
writeToFolder( const QString& exportFolder, const QString& filePrefix = "", bool capitalizeFileName = false );
private: private:
std::vector<SingleLasFileMetaData> createLasFileDescriptions( const std::vector<RimWellLogCurve*>& curves ); std::vector<SingleLasFileMetaData> createLasFileDescriptions( const std::vector<RimWellLogCurve*>& curves );
@@ -38,9 +38,12 @@
#include "RimPlotAxisProperties.h" #include "RimPlotAxisProperties.h"
#include "RiuPlotAnnotationTool.h" #include "RiuPlotAnnotationTool.h"
#include "qwt_scale_draw.h"
#include "qwt_scale_widget.h"
#include "qwt_text.h" #include "qwt_text.h"
#include "qwt_text_engine.h" #include "qwt_text_engine.h"
#include <QGraphicsDropShadowEffect>
#include <QLabel> #include <QLabel>
#include <QMenu> #include <QMenu>
#include <QResizeEvent> #include <QResizeEvent>
@@ -65,6 +68,22 @@ RiuGridCrossQwtPlot::RiuGridCrossQwtPlot( RimViewWindow* ownerViewWindow, QWidge
m_selectedPointMarker->setSymbol( mySymbol ); m_selectedPointMarker->setSymbol( mySymbol );
m_selectedPointMarker->setLabelAlignment( Qt::AlignRight | Qt::AlignVCenter ); m_selectedPointMarker->setLabelAlignment( Qt::AlignRight | Qt::AlignVCenter );
m_selectedPointMarker->setSpacing( 3 ); m_selectedPointMarker->setSpacing( 3 );
canvas()->setContentsMargins( 0, 0, 0, 0 );
QFrame* canvasFrame = dynamic_cast<QFrame*>( canvas() );
canvasFrame->setFrameShape( QFrame::Box );
canvasFrame->setStyleSheet( "border: 1px solid black" );
QGraphicsDropShadowEffect* dropShadowEffect = new QGraphicsDropShadowEffect( canvas() );
dropShadowEffect->setOffset( 1.0, 1.0 );
dropShadowEffect->setBlurRadius( 3.0 );
dropShadowEffect->setColor( QColor( 60, 60, 60, 60 ) );
canvas()->setGraphicsEffect( dropShadowEffect );
axisScaleDraw( QwtPlot::xBottom )->enableComponent( QwtAbstractScaleDraw::Backbone, false );
axisScaleDraw( QwtPlot::yLeft )->enableComponent( QwtAbstractScaleDraw::Backbone, false );
axisWidget( QwtPlot::xBottom )->setMargin( 0 );
axisWidget( QwtPlot::yLeft )->setMargin( 0 );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -227,6 +246,7 @@ void RiuGridCrossQwtPlot::updateInfoBoxLayout()
} }
} }
QStringList infoText; QStringList infoText;
infoText << QString( "<b>View ID:</b> %1<br/>" ).arg( crossPlot->id() );
if ( curveInfoTexts.size() > 1 ) if ( curveInfoTexts.size() > 1 )
{ {
infoText += QString( "<ol style=\"margin-top: 0px; margin-left: 15px; -qt-list-indent:0;\">" ); infoText += QString( "<ol style=\"margin-top: 0px; margin-left: 15px; -qt-list-indent:0;\">" );
@@ -78,7 +78,7 @@ void RiuQwtPlotCurve::setSamplesFromXValuesAndYValues( const std::vector<double>
ErrorAxis errorAxis ) ErrorAxis errorAxis )
{ {
CVF_ASSERT( xValues.size() == yValues.size() ); CVF_ASSERT( xValues.size() == yValues.size() );
CVF_ASSERT( yErrorValues.empty() || yErrorValues.size() == xValues.size() ); CVF_ASSERT( errorValues.empty() || errorValues.size() == xValues.size() );
bool showErrorBars = m_showErrorBars && !errorValues.empty(); bool showErrorBars = m_showErrorBars && !errorValues.empty();
QPolygonF points; QPolygonF points;
@@ -214,6 +214,14 @@ void RiuWellLogPlot::setTitleVisible( bool visible )
m_plotTitle->setVisible( visible ); m_plotTitle->setVisible( visible );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiuWellLogPlot::setScrollbarVisible( bool visible )
{
m_scrollBar->setVisible( visible );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

Some files were not shown because too many files have changed in this diff Show More