Support for copying GeoMech case settings using new input (#6471)

* Support copy and replace geomech case, to support importing another data file, but keep the view setup

* Make sure surfaces and intersections get updated with the correct separate result, too

* Simplify/refactor code

* Better naming
This commit is contained in:
jonjenssen authored and GitHub committed 2020-09-10 12:54:43 +02:00
1 parent 5eae17551f
commit bc82166151
15 files changed
+294 -48

No files matched your search

@@ -273,6 +273,8 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
menuBuilder << "Separator";
menuBuilder << "RicImportElementPropertyFeature";
menuBuilder << "Separator";
menuBuilder << "RicGeoMechCopyCaseFeature";
menuBuilder << "Separator";
}
else if ( dynamic_cast<RimIdenticalGridCaseGroup*>( firstUiItem ) )
{
@@ -301,6 +301,26 @@ RimGeoMechView* RimGeoMechCase::createCopyAndAddView( const RimGeoMechView* sour
return rimGeoMechView;
}
RimGeoMechCase* RimGeoMechCase::createCopy( const QString& newInputFileName )
{
RiaApplication* app = RiaApplication::instance();
RimProject* project = app->project();
RimGeoMechCase* copycase = dynamic_cast<RimGeoMechCase*>(
this->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) );
CVF_ASSERT( copycase );
QFileInfo filenameInfo( newInputFileName );
QString newCaseName = filenameInfo.completeBaseName();
copycase->caseUserDescription.setValue( newCaseName + " (copy of " + caseUserDescription.value() + ")" );
copycase->setGridFileName( newInputFileName );
project->assignCaseIdToCase( copycase );
return copycase;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -466,12 +486,9 @@ void RimGeoMechCase::initAfterRead()
{
RimCase::initAfterRead();
size_t j;
for ( j = 0; j < geoMechViews().size(); j++ )
for ( RimGeoMechView* riv : geoMechViews() )
{
RimGeoMechView* riv = geoMechViews()[j];
CVF_ASSERT( riv );
riv->setGeoMechCase( this );
}
@@ -72,6 +72,8 @@ public:
CaseOpenStatus openGeoMechCase( std::string* errorMessage );
RimGeoMechCase* createCopy( const QString& newInputFileName );
RigGeoMechCaseData* geoMechData();
const RigGeoMechCaseData* geoMechData() const;
@@ -19,7 +19,14 @@
#include "RimGeoMechModels.h"
#include "RiaLogging.h"
#include "RimGeoMechCase.h"
#include "RimGeoMechView.h"
#include "RimGridView.h"
#include "RimIntersectionCollection.h"
#include "RimIntersectionResultDefinition.h"
#include "RimIntersectionResultsDefinitionCollection.h"
CAF_PDM_SOURCE_INIT( RimGeoMechModels, "ResInsightGeoMechModels" );
//--------------------------------------------------------------------------------------------------
@@ -29,8 +36,8 @@ RimGeoMechModels::RimGeoMechModels( void )
{
CAF_PDM_InitObject( "Geomechanical Models", ":/GeoMechCases48x48.png", "", "" );
CAF_PDM_InitFieldNoDefault( &cases, "Cases", "", "", "", "" );
cases.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_cases, "Cases", "", "", "", "" );
m_cases.uiCapability()->setUiHidden( true );
}
//--------------------------------------------------------------------------------------------------
@@ -38,5 +45,74 @@ RimGeoMechModels::RimGeoMechModels( void )
//--------------------------------------------------------------------------------------------------
RimGeoMechModels::~RimGeoMechModels( void )
{
cases.deleteAllChildObjects();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimGeoMechCase*> RimGeoMechModels::cases() const
{
return m_cases.childObjects();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimGeoMechModels::addCase( RimGeoMechCase* thecase )
{
m_cases.push_back( thecase );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimGeoMechModels::removeCase( RimGeoMechCase* thecase )
{
m_cases.removeChildObject( thecase );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimGeoMechCase* RimGeoMechModels::copyCase( RimGeoMechCase* thecase, const QString& newInputFileName )
{
std::vector<RimGeoMechCase*> newcases;
RimGeoMechCase* copy = thecase->createCopy( newInputFileName );
if ( !copy )
{
RiaLogging::warning( "Could not create a copy of the geomech case" + thecase->caseUserDescription() +
" using the new input file " + newInputFileName );
return nullptr;
}
m_cases.push_back( copy );
copy->resolveReferencesRecursively();
copy->updateConnectedEditors();
this->updateConnectedEditors();
for ( auto riv : copy->views() )
{
RimGridView* rgv = dynamic_cast<RimGridView*>( riv );
if ( rgv )
{
rgv->loadDataAndUpdate();
rgv->scheduleCreateDisplayModelAndRedraw();
rgv->intersectionCollection()->scheduleCreateDisplayModelAndRedraw2dIntersectionViews();
for ( auto coll : rgv->separateIntersectionResultsCollection()->intersectionResultsDefinitions() )
{
coll->update2dIntersectionViews();
}
for ( auto coll : rgv->separateSurfaceResultsCollection()->intersectionResultsDefinitions() )
{
coll->update2dIntersectionViews();
}
}
}
return copy;
}
@@ -38,7 +38,12 @@ public:
RimGeoMechModels( void );
~RimGeoMechModels( void ) override;
caf::PdmChildArrayField<RimGeoMechCase*> cases;
RimGeoMechCase* copyCase( RimGeoMechCase* thecase, const QString& newInputFileName );
void removeCase( RimGeoMechCase* thecase );
void addCase( RimGeoMechCase* thecase );
std::vector<RimGeoMechCase*> cases() const;
private:
caf::PdmChildArrayField<RimGeoMechCase*> m_cases;
};
@@ -145,14 +145,6 @@ RimGridView::~RimGridView( void )
proj->uiCapability()->updateConnectedEditors();
}
delete this->m_overlayInfoConfig();
delete m_wellMeasurementCollection;
delete m_rangeFilterCollection;
delete m_overrideRangeFilterCollection;
delete m_intersectionCollection;
delete m_gridCollection;
}
//--------------------------------------------------------------------------------------------------
@@ -97,17 +97,25 @@ bool RimIntersectionResultDefinition::isActive() const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimIntersectionResultDefinition::autoName() const
void RimIntersectionResultDefinition::assignCaseIfMissing() const
{
QString timestepName;
QString caseName = "Default undefined source";
if ( !m_case )
{
RimCase* ownerCase = nullptr;
this->firstAncestorOrThisOfType( ownerCase );
const_cast<RimIntersectionResultDefinition*>( this )->setActiveCase( ownerCase );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimIntersectionResultDefinition::autoName() const
{
QString timestepName;
QString caseName = "Default undefined source";
assignCaseIfMissing();
if ( m_case )
{
@@ -129,6 +137,7 @@ QString RimIntersectionResultDefinition::autoName() const
}
else if ( geomCase )
{
m_geomResultDefinition->setGeoMechCase( geomCase );
resultVarUiName = m_geomResultDefinition->resultFieldUiName() + ":" +
m_geomResultDefinition->resultComponentUiName();
}
@@ -150,11 +159,7 @@ RimCase* RimIntersectionResultDefinition::activeCase() const
void RimIntersectionResultDefinition::setActiveCase( RimCase* activeCase )
{
m_case = activeCase;
RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>( m_case.value() );
m_geomResultDefinition->setGeoMechCase( geomCase );
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( m_case.value() );
m_eclipseResultDefinition->setEclipseCase( eclipseCase );
updateCaseInResultDefinitions();
}
//--------------------------------------------------------------------------------------------------
@@ -234,6 +239,8 @@ void RimIntersectionResultDefinition::updateLegendRangesTextAndVisibility( const
RiuViewer* nativeOrOverrideViewer,
bool isUsingOverrideViewer )
{
assignCaseIfMissing();
if ( !this->isInAction() ) return;
if ( ( this->isEclipseResultDefinition() && m_eclipseResultDefinition()->hasCategoryResult() ) ||
@@ -316,12 +323,18 @@ void RimIntersectionResultDefinition::fieldChangedByUi( const caf::PdmFieldHandl
const QVariant& oldValue,
const QVariant& newValue )
{
bool reDraw = false;
assignCaseIfMissing();
if ( changedField == &m_case )
{
RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>( m_case.value() );
m_geomResultDefinition->setGeoMechCase( geomCase );
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( m_case.value() );
m_eclipseResultDefinition->setEclipseCase( eclipseCase );
reDraw = true;
}
this->updateConnectedEditors();
@@ -339,6 +352,11 @@ void RimIntersectionResultDefinition::fieldChangedByUi( const caf::PdmFieldHandl
obj->updateConnectedEditors();
}
reDraw = true;
}
if ( reDraw )
{
RimGridView* gridView = nullptr;
this->firstAncestorOrThisOfType( gridView );
if ( gridView ) gridView->scheduleCreateDisplayModelAndRedraw();
@@ -355,6 +373,7 @@ void RimIntersectionResultDefinition::fieldChangedByUi( const caf::PdmFieldHandl
void RimIntersectionResultDefinition::update2dIntersectionViews()
{
// Update 2D Intersection views
updateCaseInResultDefinitions();
std::vector<RimExtrudedCurveIntersection*> intersections;
this->objectsWithReferringPtrFieldsOfType( intersections );
@@ -443,21 +462,28 @@ void RimIntersectionResultDefinition::defineUiTreeOrdering( caf::PdmUiTreeOrderi
//--------------------------------------------------------------------------------------------------
void RimIntersectionResultDefinition::initAfterRead()
{
RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>( m_case.value() );
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( m_case.value() );
if ( eclipseCase )
{
m_eclipseResultDefinition->setEclipseCase( eclipseCase );
}
else if ( geomCase )
{
m_geomResultDefinition->setGeoMechCase( geomCase );
}
updateCaseInResultDefinitions();
this->updateUiIconFromToggleField();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimIntersectionResultDefinition::updateCaseInResultDefinitions()
{
if ( m_geomResultDefinition->geoMechCase() == nullptr )
{
RimGeoMechCase* geomCase = dynamic_cast<RimGeoMechCase*>( m_case.value() );
m_geomResultDefinition->setGeoMechCase( geomCase );
}
if ( m_eclipseResultDefinition->eclipseCase() == nullptr )
{
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>( m_case.value() );
m_eclipseResultDefinition->setEclipseCase( eclipseCase );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -58,6 +58,8 @@ public:
RiuViewer* nativeOrOverrideViewer,
bool isUsingOverrideViewer );
void update2dIntersectionViews();
protected:
virtual caf::PdmFieldHandle* userDescriptionField() override;
virtual caf::PdmFieldHandle* objectToggleField() override;
@@ -73,7 +75,8 @@ protected:
virtual void initAfterRead() override;
private:
void update2dIntersectionViews();
void assignCaseIfMissing() const;
void updateCaseInResultDefinitions();
caf::PdmField<bool> m_isActive;
caf::PdmProxyValueField<QString> m_autoName;
@@ -98,11 +98,8 @@ void RimIntersectionResultsDefinitionCollection::fieldChangedByUi( const caf::Pd
RimGridView* gridView = nullptr;
this->firstAncestorOrThisOfType( gridView );
if ( gridView )
{
gridView->scheduleCreateDisplayModelAndRedraw();
gridView->intersectionCollection()->scheduleCreateDisplayModelAndRedraw2dIntersectionViews();
}
if ( gridView ) gridView->scheduleCreateDisplayModelAndRedraw();
if ( intersectionResultsDefinitions().size() > 0 ) intersectionResultsDefinitions()[0]->update2dIntersectionViews();
}
//--------------------------------------------------------------------------------------------------
@@ -688,9 +688,9 @@ void RimProject::allCases( std::vector<RimCase*>& cases ) const
RimGeoMechModels* geomModels = oilField->geoMechModels();
if ( geomModels )
{
for ( size_t caseIdx = 0; caseIdx < geomModels->cases.size(); caseIdx++ )
for ( auto acase : geomModels->cases() )
{
cases.push_back( geomModels->cases[caseIdx] );
cases.push_back( acase );
}
}
}
@@ -1223,9 +1223,9 @@ std::vector<RimGeoMechCase*> RimProject::geoMechCases() const
RimGeoMechModels* geomModels = oilField->geoMechModels();
if ( geomModels )
{
for ( size_t caseIdx = 0; caseIdx < geomModels->cases.size(); caseIdx++ )
for ( auto acase : geomModels->cases() )
{
cases.push_back( geomModels->cases[caseIdx] );
cases.push_back( acase );
}
}
}