Several RFT plot adjustments

* #9923 Call loadDataAndUpdate() after visibility of curves is updated
This will ensure that all zoom ranges are recalculated based on visible curves.

* #9923 Put new segment plots in RFT Plot collection
* #9923 Add "Create Rft Sement Plot" to RFT plot collection
* #9923 Make sure the main window is displayed when required
Make sure the main window is opened and views updated when a grid model is opened from a summary case.

* #9923 Make sure fieldChanged is triggered when required
Exclude field having the target state. If these fields are included, the one and only call to setValueWithFieldChanged() can contain a field with the target state value. When setting a value to a field with the same value, nothing happens and the UI will get an inconsistent state (some curves toggled off are still visible in a plot).
This commit is contained in:
Magne Sjaastad
2023-03-08 07:35:27 +01:00
committed by GitHub
parent 51331facac
commit e2e239fd07
12 changed files with 122 additions and 25 deletions

View File

@@ -20,6 +20,10 @@
#include "RiaGuiApplication.h" #include "RiaGuiApplication.h"
#include "Rim3dView.h"
#include "RimCase.h"
#include "RimProject.h"
#include "RiuMainWindow.h" #include "RiuMainWindow.h"
#include <QAction> #include <QAction>
@@ -51,6 +55,23 @@ void RicShowMainWindowFeature::showMainWindow()
{ {
RiaGuiApplication* app = RiaGuiApplication::instance(); RiaGuiApplication* app = RiaGuiApplication::instance();
app->getOrCreateAndShowMainWindow(); app->getOrCreateAndShowMainWindow();
// When the main window is created, make sure all the views are loaded and displayed
std::vector<RimCase*> allGridModels;
RimProject::current()->allCases( allGridModels );
for ( RimCase* gridModel : allGridModels )
{
if ( gridModel )
{
std::vector<Rim3dView*> views = gridModel->views();
for ( Rim3dView* view : views )
{
if ( view ) view->loadDataAndUpdate();
}
}
}
} }
} }

View File

@@ -18,6 +18,8 @@
#include "RicImportGridModelFromSummaryCaseFeature.h" #include "RicImportGridModelFromSummaryCaseFeature.h"
#include "ApplicationCommands/RicShowMainWindowFeature.h"
#include "RiaEclipseFileNameTools.h" #include "RiaEclipseFileNameTools.h"
#include "RiaImportEclipseCaseTools.h" #include "RiaImportEclipseCaseTools.h"
#include "RiaLogging.h" #include "RiaLogging.h"
@@ -125,6 +127,8 @@ bool RicImportGridModelFromSummaryCaseFeature::findAndActivateFirstView( const R
{ {
if ( !gridCase->gridViews().empty() ) if ( !gridCase->gridViews().empty() )
{ {
RicShowMainWindowFeature::showMainWindow();
Riu3DMainWindowTools::selectAsCurrentItem( gridCase->gridViews().front() ); Riu3DMainWindowTools::selectAsCurrentItem( gridCase->gridViews().front() );
return true; return true;

View File

@@ -99,11 +99,36 @@ bool RicToggleItemsFeatureImpl::isToggleCommandsForSubItems()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection( SelectionToggleType state ) void RicToggleItemsFeatureImpl::setObjectToggleStateForSelection( SelectionToggleType state )
{ {
auto fields = findToggleFieldsFromSelection( state ); auto selectedFields = findToggleFieldsFromSelection( state );
if ( fields.empty() ) return;
auto lastField = fields.back(); std::vector<caf::PdmField<bool>*> fieldsToUpdate;
for ( auto field : fields ) if ( state == TOGGLE_OFF || state == TOGGLE_ON )
{
// Exclude field having the target state. If these fields are included, the one and only call to setValueWithFieldChanged() can
// contain a field with the target state value. When setting a value to a field with the same value, nothing happens and the UI will
// get an inconsistent state (some curves toggled off are still visible in a plot).
const bool targetState = ( state == TOGGLE_ON ) ? true : false;
for ( const auto& field : selectedFields )
{
bool currentValue = field->v();
if ( currentValue != targetState )
{
fieldsToUpdate.push_back( field );
}
}
}
else
{
// All fields will be updated when toggling
fieldsToUpdate = selectedFields;
}
if ( fieldsToUpdate.empty() ) return;
auto lastField = fieldsToUpdate.back();
for ( auto field : fieldsToUpdate )
{ {
bool value = !( field->v() ); bool value = !( field->v() );

View File

@@ -58,11 +58,7 @@ bool RicNewMultiPhaseRftSegmentPlotFeature::isCommandEnabled()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicNewMultiPhaseRftSegmentPlotFeature::onActionTriggered( bool isChecked ) void RicNewMultiPhaseRftSegmentPlotFeature::onActionTriggered( bool isChecked )
{ {
auto rftCase = caf::SelectionManager::instance()->selectedItemOfType<RimRftCase>(); RimSummaryCase* summaryCase = RicNewRftSegmentWellLogPlotFeature::getSelectedOrFirstRftCase();
if ( !rftCase ) return;
RimSummaryCase* summaryCase = nullptr;
rftCase->firstAncestorOfType( summaryCase );
if ( !summaryCase ) return; if ( !summaryCase ) return;
auto rftReader = summaryCase->rftReader(); auto rftReader = summaryCase->rftReader();
@@ -72,7 +68,7 @@ void RicNewMultiPhaseRftSegmentPlotFeature::onActionTriggered( bool isChecked )
return; return;
} }
auto plot = RicNewWellLogPlotFeatureImpl::createHorizontalWellLogPlot(); auto plot = RicNewWellLogPlotFeatureImpl::createRftSegmentPlot();
QString wellName = "Unknown"; QString wellName = "Unknown";

View File

@@ -27,6 +27,7 @@
#include "RiaLogging.h" #include "RiaLogging.h"
#include "RiaPlotWindowRedrawScheduler.h" #include "RiaPlotWindowRedrawScheduler.h"
#include "RiaRftDefines.h" #include "RiaRftDefines.h"
#include "RiaSummaryTools.h"
#include "RifReaderOpmRft.h" #include "RifReaderOpmRft.h"
@@ -58,11 +59,7 @@ bool RicNewRftSegmentWellLogPlotFeature::isCommandEnabled()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicNewRftSegmentWellLogPlotFeature::onActionTriggered( bool isChecked ) void RicNewRftSegmentWellLogPlotFeature::onActionTriggered( bool isChecked )
{ {
auto rftCase = caf::SelectionManager::instance()->selectedItemOfType<RimRftCase>(); RimSummaryCase* summaryCase = RicNewRftSegmentWellLogPlotFeature::getSelectedOrFirstRftCase();
if ( !rftCase ) return;
RimSummaryCase* summaryCase = nullptr;
rftCase->firstAncestorOfType( summaryCase );
if ( !summaryCase ) return; if ( !summaryCase ) return;
auto rftReader = summaryCase->rftReader(); auto rftReader = summaryCase->rftReader();
@@ -72,7 +69,7 @@ void RicNewRftSegmentWellLogPlotFeature::onActionTriggered( bool isChecked )
return; return;
} }
auto plot = RicNewWellLogPlotFeatureImpl::createHorizontalWellLogPlot(); auto plot = RicNewWellLogPlotFeatureImpl::createRftSegmentPlot();
QString wellName = "Unknown"; QString wellName = "Unknown";
auto wellNames = rftReader->wellNames(); auto wellNames = rftReader->wellNames();
@@ -293,6 +290,31 @@ void RicNewRftSegmentWellLogPlotFeature::appendConnectionFactorTrack( RimWellLog
curve->setFillStyle( Qt::SolidPattern ); curve->setFillStyle( Qt::SolidPattern );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryCase* RicNewRftSegmentWellLogPlotFeature::getSelectedOrFirstRftCase()
{
auto rftCase = caf::SelectionManager::instance()->selectedItemOfType<RimRftCase>();
if ( rftCase )
{
RimSummaryCase* summaryCase = nullptr;
rftCase->firstAncestorOfType( summaryCase );
if ( summaryCase ) return summaryCase;
}
auto summaryCases = RiaSummaryTools::singleTopLevelSummaryCases();
for ( const auto& candidateCase : summaryCases )
{
if ( candidateCase && candidateCase->rftReader() )
{
return candidateCase;
}
}
return nullptr;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -40,6 +40,8 @@ public:
static void appendPressureTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase ); static void appendPressureTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase );
static void appendConnectionFactorTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase ); static void appendConnectionFactorTrack( RimWellLogPlot* plot, const QString& wellName, RimSummaryCase* summaryCase );
static RimSummaryCase* getSelectedOrFirstRftCase();
private: private:
bool isCommandEnabled() override; bool isCommandEnabled() override;
void onActionTriggered( bool isChecked ) override; void onActionTriggered( bool isChecked ) override;

View File

@@ -23,6 +23,7 @@
#include "RimEclipseCase.h" #include "RimEclipseCase.h"
#include "RimMainPlotCollection.h" #include "RimMainPlotCollection.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimRftPlotCollection.h"
#include "RimStimPlanModelPlot.h" #include "RimStimPlanModelPlot.h"
#include "RimStimPlanModelPlotCollection.h" #include "RimStimPlanModelPlotCollection.h"
#include "RimWellBoreStabilityPlot.h" #include "RimWellBoreStabilityPlot.h"
@@ -84,9 +85,22 @@ RimWellBoreStabilityPlot* RicNewWellLogPlotFeatureImpl::createWellBoreStabilityP
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RimWellLogPlot* RicNewWellLogPlotFeatureImpl::createHorizontalWellLogPlot() RimWellLogPlot* RicNewWellLogPlotFeatureImpl::createRftSegmentPlot()
{ {
auto plot = createWellLogPlot(); auto rftPlotCollection = RimMainPlotCollection::current()->rftPlotCollection();
CVF_ASSERT( rftPlotCollection );
// Make sure the summary plot window is created
RiaGuiApplication::instance()->getOrCreateMainPlotWindow();
RimWellLogPlot* plot = new RimWellLogPlot();
plot->setAsPlotMdiWindow();
rftPlotCollection->addPlot( plot );
plot->nameConfig()->setCustomName( QString( "RFT Segment Plot %1" ).arg( rftPlotCollection->plotCount() ) );
rftPlotCollection->updateConnectedEditors();
plot->setDepthOrientation( RiaDefines::Orientation::HORIZONTAL ); plot->setDepthOrientation( RiaDefines::Orientation::HORIZONTAL );
plot->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE ); plot->setNamingMethod( RiaDefines::ObjectNamingMethod::TEMPLATE );

View File

@@ -38,7 +38,7 @@ public:
const QString& plotDescription = QString( "" ), const QString& plotDescription = QString( "" ),
const RimWbsParameters* params = nullptr ); const RimWbsParameters* params = nullptr );
static RimWellLogPlot* createHorizontalWellLogPlot(); static RimWellLogPlot* createRftSegmentPlot();
static RimWellLogTrack* createWellLogTrackWithAutoUpdate(); static RimWellLogTrack* createWellLogTrackWithAutoUpdate();
static RimWellLogPlot* createWellLogPlot( bool showAfterCreation = true, const QString& plotDescription = QString( "" ) ); static RimWellLogPlot* createWellLogPlot( bool showAfterCreation = true, const QString& plotDescription = QString( "" ) );

View File

@@ -542,6 +542,8 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection()
else if ( dynamic_cast<RimRftPlotCollection*>( firstUiItem ) ) else if ( dynamic_cast<RimRftPlotCollection*>( firstUiItem ) )
{ {
menuBuilder << "RicNewRftPlotFeature"; menuBuilder << "RicNewRftPlotFeature";
menuBuilder << "RicNewMultiPhaseRftSegmentPlotFeature";
menuBuilder << "RicNewRftSegmentWellLogPlotFeature";
} }
else if ( dynamic_cast<RimPltPlotCollection*>( firstUiItem ) ) else if ( dynamic_cast<RimPltPlotCollection*>( firstUiItem ) )
{ {

View File

@@ -204,8 +204,13 @@ const std::vector<RimWellRftPlot*> RimRftPlotCollection::rftPlots() const
std::vector<RimWellRftPlot*> plots; std::vector<RimWellRftPlot*> plots;
for ( const auto& plot : m_rftPlots ) for ( const auto& plot : m_rftPlots )
{ {
plots.push_back( plot ); auto wellRftPlot = dynamic_cast<RimWellRftPlot*>( plot.p() );
if ( wellRftPlot )
{
plots.push_back( wellRftPlot );
}
} }
return plots; return plots;
} }
@@ -231,7 +236,7 @@ size_t RimRftPlotCollection::plotCount() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimRftPlotCollection::addPlot( gsl::not_null<RimWellRftPlot*> newPlot ) void RimRftPlotCollection::addPlot( gsl::not_null<RimWellLogPlot*> newPlot )
{ {
m_rftPlots.push_back( newPlot ); m_rftPlots.push_back( newPlot );
} }
@@ -239,7 +244,7 @@ void RimRftPlotCollection::addPlot( gsl::not_null<RimWellRftPlot*> newPlot )
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimRftPlotCollection::removePlot( gsl::not_null<RimWellRftPlot*> plot ) void RimRftPlotCollection::removePlot( gsl::not_null<RimWellLogPlot*> plot )
{ {
m_rftPlots.removeChild( plot ); m_rftPlots.removeChild( plot );
updateAllRequiredEditors(); updateAllRequiredEditors();

View File

@@ -66,14 +66,14 @@ public:
void deleteAllExtractors(); void deleteAllExtractors();
const std::vector<RimWellRftPlot*> rftPlots() const; const std::vector<RimWellRftPlot*> rftPlots() const;
void addPlot( gsl::not_null<RimWellRftPlot*> newPlot ); void addPlot( gsl::not_null<RimWellLogPlot*> newPlot );
void removePlot( gsl::not_null<RimWellRftPlot*> plot ); void removePlot( gsl::not_null<RimWellLogPlot*> plot );
void deleteAllPlots() override; void deleteAllPlots() override;
void loadDataAndUpdateAllPlots() override; void loadDataAndUpdateAllPlots() override;
size_t plotCount() const override; size_t plotCount() const override;
private: private:
caf::PdmChildArrayField<RimWellRftPlot*> m_rftPlots; caf::PdmChildArrayField<RimWellLogPlot*> m_rftPlots;
cvf::Collection<RigEclipseWellLogExtractor> m_extractors; cvf::Collection<RigEclipseWellLogExtractor> m_extractors;
cvf::Collection<RigGeoMechWellLogExtractor> m_geomExtractors; cvf::Collection<RigGeoMechWellLogExtractor> m_geomExtractors;
}; };

View File

@@ -712,10 +712,16 @@ void RimWellLogCurveCommonDataSource::applyDataSourceChanges()
this->applyDataSourceChanges( curves, tracks ); this->applyDataSourceChanges( curves, tracks );
// plot->loadDataAndUpdate() has been called in applyDataSourceChanges(), and this is required before the visibility of tracks and
// curves can be updated. However, if the visibility of curves changes, another loadDataAndUpdate() is required to calculate zoom
// based on visible curves.
for ( auto& track : tracks ) for ( auto& track : tracks )
{ {
track->updateCheckStateBasedOnCurveData(); track->updateCheckStateBasedOnCurveData();
} }
parentPlot->loadDataAndUpdate();
} }
} }