diff --git a/ApplicationCode/Application/RiaPreferences.cpp b/ApplicationCode/Application/RiaPreferences.cpp index 880094ed4e..596bb9f944 100644 --- a/ApplicationCode/Application/RiaPreferences.cpp +++ b/ApplicationCode/Application/RiaPreferences.cpp @@ -125,9 +125,9 @@ RiaPreferences::RiaPreferences( void ) CAF_PDM_InitField( &scriptEditorExecutable, "scriptEditorExecutable", defaultTextEditor, "Script Editor", "", "", "" ); scriptEditorExecutable.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - CAF_PDM_InitField( &octaveExecutable, "octaveExecutable", QString( "octave" ), "Octave Executable Location", "", "", "" ); - octaveExecutable.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - octaveExecutable.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + CAF_PDM_InitField( &m_octaveExecutable, "octaveExecutable", QString( "octave" ), "Octave Executable Location", "", "", "" ); + m_octaveExecutable.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + m_octaveExecutable.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); CAF_PDM_InitField( &octaveShowHeaderInfoWhenExecutingScripts, "octaveShowHeaderInfoWhenExecutingScripts", @@ -138,9 +138,9 @@ RiaPreferences::RiaPreferences( void ) "" ); octaveShowHeaderInfoWhenExecutingScripts.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); - CAF_PDM_InitField( &pythonExecutable, "pythonExecutable", QString( "python" ), "Python Executable Location", "", "", "" ); - pythonExecutable.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - pythonExecutable.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + CAF_PDM_InitField( &m_pythonExecutable, "pythonExecutable", QString( "python" ), "Python Executable Location", "", "", "" ); + m_pythonExecutable.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + m_pythonExecutable.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); CAF_PDM_InitField( &showPythonDebugInfo, "pythonDebugInfo", false, "Show Python Debug Info", "", "", "" ); CAF_PDM_InitField( &ssihubAddress, "ssihubAddress", QString( "http://" ), "SSIHUB Address", "", "", "" ); @@ -555,7 +555,7 @@ void RiaPreferences::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& else if ( uiConfigName == RiaPreferences::tabNameScripting() ) { caf::PdmUiGroup* octaveGroup = uiOrdering.addNewGroup( "Octave" ); - octaveGroup->add( &octaveExecutable ); + octaveGroup->add( &m_octaveExecutable ); octaveGroup->add( &octaveShowHeaderInfoWhenExecutingScripts ); #ifdef ENABLE_GRPC @@ -563,7 +563,7 @@ void RiaPreferences::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& pythonGroup->add( &enableGrpcServer ); pythonGroup->add( &showPythonDebugInfo ); pythonGroup->add( &defaultGrpcPortNumber ); - pythonGroup->add( &pythonExecutable ); + pythonGroup->add( &m_pythonExecutable ); #endif caf::PdmUiGroup* scriptGroup = uiOrdering.addNewGroup( "Script files" ); scriptGroup->add( &scriptDirectories ); @@ -1104,6 +1104,22 @@ bool RiaPreferences::showGridBox() const return m_showGridBox(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaPreferences::pythonExecutable() const +{ + return m_pythonExecutable().trimmed(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaPreferences::octaveExecutable() const +{ + return m_octaveExecutable().trimmed(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/RiaPreferences.h b/ApplicationCode/Application/RiaPreferences.h index c84d840f0a..4ac34795de 100644 --- a/ApplicationCode/Application/RiaPreferences.h +++ b/ApplicationCode/Application/RiaPreferences.h @@ -130,17 +130,17 @@ public: bool showInfoBox() const; bool showGridBox() const; + // Script paths + QString pythonExecutable() const; + QString octaveExecutable() const; + public: // Pdm Fields caf::PdmField enableGrpcServer; caf::PdmField defaultGrpcPortNumber; caf::PdmField scriptDirectories; caf::PdmField scriptEditorExecutable; - - caf::PdmField octaveExecutable; caf::PdmField octaveShowHeaderInfoWhenExecutingScripts; - - caf::PdmField pythonExecutable; caf::PdmField showPythonDebugInfo; caf::PdmField ssihubAddress; @@ -228,6 +228,10 @@ private: caf::PdmField m_searchPlotTemplateFoldersRecursively; caf::PdmField m_defaultPlotTemplate; + // Script paths + caf::PdmField m_octaveExecutable; + caf::PdmField m_pythonExecutable; + // Surface Import caf::PdmField m_surfaceImportResamplingDistance; diff --git a/ApplicationCode/Application/Tools/RiaProjectModifier.cpp b/ApplicationCode/Application/Tools/RiaProjectModifier.cpp index cef659964b..30df42387b 100644 --- a/ApplicationCode/Application/Tools/RiaProjectModifier.cpp +++ b/ApplicationCode/Application/Tools/RiaProjectModifier.cpp @@ -279,14 +279,9 @@ QString RiaProjectModifier::makeFilePathAbsolute( const QString& relOrAbsolutePa //-------------------------------------------------------------------------------------------------- QString RiaProjectModifier::caseNameFromGridFileName( const QString& fullGridFilePathName ) { - QString fn = QDir::fromNativeSeparators( fullGridFilePathName ); + QFileInfo fi( fullGridFilePathName ); - // Extract file name plus the 'deepest' directory - QString deepestDirPlusFileName = fn.section( '/', -2, -1 ); - - deepestDirPlusFileName.replace( "/", "--" ); - - return deepestDirPlusFileName; + return fi.baseName(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp index a0158f92bd..7ce053bf96 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp +++ b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.cpp @@ -169,6 +169,14 @@ std::set RiaSummaryCurveAnalyzer::blocks() const return m_blocks; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::set RiaSummaryCurveAnalyzer::aquifers() const +{ + return m_aquifers; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -229,6 +237,13 @@ std::vector RiaSummaryCurveAnalyzer::identifierTexts( RifEclipseSummary identifierStrings.push_back( QString::fromStdString( conn ) ); } } + else if ( category == RifEclipseSummaryAddress::SUMMARY_AQUIFER ) + { + for ( const auto& aquifer : m_aquifers ) + { + identifierStrings.push_back( QString::number( aquifer ) ); + } + } return identifierStrings; } @@ -284,6 +299,7 @@ void RiaSummaryCurveAnalyzer::clear() m_wellCompletions.clear(); m_wellSegmentNumbers.clear(); m_blocks.clear(); + m_aquifers.clear(); m_quantitiesNoMatchingHistory.clear(); m_quantitiesWithMatchingHistory.clear(); @@ -378,6 +394,10 @@ void RiaSummaryCurveAnalyzer::analyzeSingleAddress( const RifEclipseSummaryAddre auto text = address.blockAsString(); m_blocks.insert( text ); } + else if ( address.category() == RifEclipseSummaryAddress::SUMMARY_AQUIFER ) + { + m_aquifers.insert( address.aquiferNumber() ); + } if ( address.category() != RifEclipseSummaryAddress::SUMMARY_INVALID ) { diff --git a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h index cbe1a67b33..8f8595b9b9 100644 --- a/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h +++ b/ApplicationCode/Application/Tools/RiaSummaryCurveAnalyzer.h @@ -55,6 +55,7 @@ public: std::set wellCompletions( const std::string& wellName ) const; std::set wellSegmentNumbers( const std::string& wellName ) const; std::set blocks() const; + std::set aquifers() const; std::set categories() const; @@ -84,6 +85,7 @@ private: std::set> m_wellCompletions; std::set> m_wellSegmentNumbers; std::set m_blocks; + std::set m_aquifers; std::set m_categories; }; diff --git a/ApplicationCode/Commands/RicCloseCaseFeature.cpp b/ApplicationCode/Commands/RicCloseCaseFeature.cpp index 16711d1680..2fd9ee292b 100644 --- a/ApplicationCode/Commands/RicCloseCaseFeature.cpp +++ b/ApplicationCode/Commands/RicCloseCaseFeature.cpp @@ -198,6 +198,7 @@ void RicCloseCaseFeature::deleteEclipseCase( RimEclipseCase* eclipseCase ) { RimGridSummaryCase* gridSummaryCase = dynamic_cast( summaryCase ); sumCaseColl->convertGridSummaryCasesToFileSummaryCases( gridSummaryCase ); + sumCaseColl->updateConnectedEditors(); } } } diff --git a/ApplicationCode/Commands/RicRecursiveFileSearchDialog.cpp b/ApplicationCode/Commands/RicRecursiveFileSearchDialog.cpp index 54469cfbaa..334196d7b4 100644 --- a/ApplicationCode/Commands/RicRecursiveFileSearchDialog.cpp +++ b/ApplicationCode/Commands/RicRecursiveFileSearchDialog.cpp @@ -20,13 +20,16 @@ #include "RiaFilePathTools.h" #include "RiaGuiApplication.h" +#include "RiaStringListSerializer.h" #include "RiuFileDialogTools.h" #include "RiuTools.h" #include #include +#include #include +#include #include #include #include @@ -35,12 +38,14 @@ #include #include #include +#include #include #include #include #include #include +#include #include #define RECURSIVE_FILESEARCH_DEFAULT_DIALOG_HEIGHT 350 @@ -70,7 +75,31 @@ RicRecursiveFileSearchDialogResult RicRecursiveFileSearchDialog::runRecursiveSea QString pathFilterText = dir; RiaFilePathTools::appendSeparatorIfNo( pathFilterText ); pathFilterText += pathFilter; - dialog.m_pathFilterField->setText( QDir::toNativeSeparators( pathFilterText ) ); + + const QString searchHistoryStringsRegistryKey = + QString( "RicRecursiveFileSearchDialog %1" ).arg( caption ).replace( " ", "_" ); + const int maxItemsInRegistry = 10; + { + RiaStringListSerializer stringListSerializer( searchHistoryStringsRegistryKey ); + QStringList files = stringListSerializer.textStrings(); + + int numRecentFiles = std::min( files.size(), maxItemsInRegistry ); + for ( int i = 0; i < numRecentFiles; i++ ) + { + dialog.m_pathFilterField->addItem( files[i] ); + } + } + + QSettings settings; + const QString useRealizationStarRegistryKey = "RecursiveFileSearchDialog_use_realization"; + + bool isChecked = settings.value( useRealizationStarRegistryKey, true ).toBool(); + dialog.m_useRealizationStarCheckBox->setChecked( isChecked ); + + dialog.m_pathFilterField->addItem( QDir::toNativeSeparators( pathFilterText ) ); + dialog.m_pathFilterField->setCurrentText( QDir::toNativeSeparators( pathFilterText ) ); + + dialog.m_pathFilterField->setEditable( true ); dialog.m_fileFilterField->setText( fileNameFilter ); dialog.m_fileExtensions = trimLeftStrings( fileExtensions, "." ); @@ -81,6 +110,14 @@ RicRecursiveFileSearchDialogResult RicRecursiveFileSearchDialog::runRecursiveSea dialog.resize( 800, 150 ); dialog.exec(); + if ( dialog.result() == QDialog::Accepted ) + { + RiaStringListSerializer stringListSerializer( searchHistoryStringsRegistryKey ); + stringListSerializer.addString( dialog.m_pathFilterField->currentText(), maxItemsInRegistry ); + + settings.setValue( useRealizationStarRegistryKey, dialog.m_useRealizationStarCheckBox->isChecked() ); + } + return RicRecursiveFileSearchDialogResult( dialog.result() == QDialog::Accepted, dialog.m_foundFiles, dialog.rootDirWithEndSeparator(), @@ -95,9 +132,13 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) : QDialog( parent, RiuTools::defaultDialogFlags() ) { // Create widgets - m_browseButton = new QPushButton(); + m_browseButton = new QPushButton(); + + m_useRealizationStarCheckBox = new QCheckBox( "Use 'realization-*' in filter" ); + connect( m_useRealizationStarCheckBox, SIGNAL( clicked() ), this, SLOT( slotUseRealizationStarClicked() ) ); + m_pathFilterLabel = new QLabel(); - m_pathFilterField = new QLineEdit(); + m_pathFilterField = new QComboBox(); m_fileFilterLabel = new QLabel(); m_fileFilterField = new QLineEdit(); m_effectiveFilterLabel = new QLabel(); @@ -110,7 +151,15 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) m_buttons = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel ); // Connect to signals - connect( m_pathFilterField, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotFilterChanged( const QString& ) ) ); + connect( m_pathFilterField, + SIGNAL( currentTextChanged( const QString& ) ), + this, + SLOT( slotFilterChanged( const QString& ) ) ); + connect( m_pathFilterField, + SIGNAL( editTextChanged( const QString& ) ), + this, + SLOT( slotFilterChanged( const QString& ) ) ); + connect( m_fileFilterField, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotFilterChanged( const QString& ) ) ); connect( m_fileListWidget, @@ -159,9 +208,10 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) inputGridLayout->addWidget( m_browseButton, 0, 3 ); inputGridLayout->addWidget( m_fileFilterLabel, 1, 0 ); inputGridLayout->addWidget( m_fileFilterField, 1, 1, 1, 2 ); - inputGridLayout->addWidget( m_effectiveFilterLabel, 2, 0 ); - inputGridLayout->addWidget( m_effectiveFilterContentLabel, 2, 1 ); - inputGridLayout->addWidget( m_findOrCancelButton, 2, 2, 1, 2 ); + inputGridLayout->addWidget( m_useRealizationStarCheckBox, 2, 1 ); + inputGridLayout->addWidget( m_effectiveFilterLabel, 3, 0 ); + inputGridLayout->addWidget( m_effectiveFilterContentLabel, 3, 1 ); + inputGridLayout->addWidget( m_findOrCancelButton, 3, 2, 1, 2 ); inputGroup->setLayout( inputGridLayout ); @@ -221,10 +271,16 @@ RicRecursiveFileSearchDialog::~RicRecursiveFileSearchDialog() //-------------------------------------------------------------------------------------------------- QString RicRecursiveFileSearchDialog::cleanTextFromPathFilterField() const { - QString pathFilterText = m_pathFilterField->text().trimmed(); + QString pathFilterText = m_pathFilterField->currentText().trimmed(); pathFilterText = RiaFilePathTools::toInternalSeparator( pathFilterText ); pathFilterText = RiaFilePathTools::removeDuplicatePathSeparators( pathFilterText ); pathFilterText.replace( QString( "**" ), QString( "*" ) ); + + if ( m_useRealizationStarCheckBox->isChecked() ) + { + pathFilterText = replaceWithRealizationStar( pathFilterText ); + } + return pathFilterText; } @@ -489,6 +545,20 @@ QStringList RicRecursiveFileSearchDialog::createFileNameFilterList() return nameFilter; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RicRecursiveFileSearchDialog::replaceWithRealizationStar( const QString& text ) +{ + const QString pattern = "realization-\\d+"; + QRegExp regexp( pattern, Qt::CaseInsensitive ); + + QString textWithStar = text; + textWithStar.replace( regexp, "realization-*" ); + + return textWithStar; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -715,7 +785,19 @@ void RicRecursiveFileSearchDialog::slotBrowseButtonClicked() QString folder = RiuFileDialogTools::getExistingDirectory( this, "Select folder", rootDirWithEndSeparator() ); RiaFilePathTools::appendSeparatorIfNo( folder ); folder += "*"; - if ( !folder.isEmpty() ) m_pathFilterField->setText( QDir::toNativeSeparators( folder ) ); + if ( !folder.isEmpty() ) + { + m_pathFilterField->addItem( QDir::toNativeSeparators( folder ) ); + m_pathFilterField->setCurrentText( QDir::toNativeSeparators( folder ) ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRecursiveFileSearchDialog::slotUseRealizationStarClicked() +{ + updateEffectiveFilter(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/Commands/RicRecursiveFileSearchDialog.h b/ApplicationCode/Commands/RicRecursiveFileSearchDialog.h index c66c63a1e1..70341d9a5e 100644 --- a/ApplicationCode/Commands/RicRecursiveFileSearchDialog.h +++ b/ApplicationCode/Commands/RicRecursiveFileSearchDialog.h @@ -32,6 +32,8 @@ class QPushButton; class QMainWindow; class QListWidget; class QGroupBox; +class QComboBox; +class QCheckBox; class RicRecursiveFileSearchDialogResult; @@ -79,16 +81,18 @@ private: // File search methods - QStringList findMatchingFiles(); - void buildDirectoryListRecursiveSimple( const QString& currentDir, - const QString& currentPathFilter, - QStringList* accumulatedDirs ); - QStringList findFilesInDirs( const QStringList& dirs ); - QStringList createFileNameFilterList(); + QStringList findMatchingFiles(); + void buildDirectoryListRecursiveSimple( const QString& currentDir, + const QString& currentPathFilter, + QStringList* accumulatedDirs ); + QStringList findFilesInDirs( const QStringList& dirs ); + QStringList createFileNameFilterList(); + static QString replaceWithRealizationStar( const QString& text ); private slots: void slotFilterChanged( const QString& text ); void slotBrowseButtonClicked(); + void slotUseRealizationStarClicked(); void slotFindOrCancelButtonClicked(); void slotFileListCustomMenuRequested( const QPoint& point ); @@ -102,8 +106,9 @@ private slots: private: QLabel* m_pathFilterLabel; - QLineEdit* m_pathFilterField; + QComboBox* m_pathFilterField; QPushButton* m_browseButton; + QCheckBox* m_useRealizationStarCheckBox; QLabel* m_fileFilterLabel; QLineEdit* m_fileFilterField; @@ -153,4 +158,4 @@ public: QString rootDir; QString pathFilter; QString fileNameFilter; -}; \ No newline at end of file +}; diff --git a/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp index bf7dc07583..21918dc2b6 100644 --- a/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReloadSummaryCaseFeature.cpp @@ -20,6 +20,7 @@ #include "RiaLogging.h" #include "RiaSummaryTools.h" +#include "RicReplaceSummaryCaseFeature.h" #include "RimMainPlotCollection.h" #include "RimObservedDataCollection.h" @@ -61,6 +62,8 @@ void RicReloadSummaryCaseFeature::onActionTriggered( bool isChecked ) summaryCase->createSummaryReaderInterface(); summaryCase->createRftReaderInterface(); + RicReplaceSummaryCaseFeature::updateRequredCalculatedCurves( summaryCase ); + RiaLogging::info( QString( "Reloaded data for %1" ).arg( summaryCase->summaryHeaderFilename() ) ); } diff --git a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp index 9bac9b6750..dd39a039a9 100644 --- a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp +++ b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.cpp @@ -46,6 +46,26 @@ CAF_CMD_SOURCE_INIT( RicReplaceSummaryCaseFeature, "RicReplaceSummaryCaseFeature" ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicReplaceSummaryCaseFeature::updateRequredCalculatedCurves( RimSummaryCase* sourceSummaryCase ) +{ + RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); + + for ( RimSummaryCalculation* summaryCalculation : calcColl->calculations() ) + { + bool needsUpdate = + RicReplaceSummaryCaseFeature::checkIfCalculationNeedsUpdate( summaryCalculation, sourceSummaryCase ); + if ( needsUpdate ) + { + summaryCalculation->parseExpression(); + summaryCalculation->calculate(); + summaryCalculation->updateDependentCurvesAndPlots(); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -74,19 +94,17 @@ void RicReplaceSummaryCaseFeature::onActionTriggered( bool isChecked ) summaryCase->createRftReaderInterface(); RiaLogging::info( QString( "Replaced summary data for %1" ).arg( oldSummaryHeaderFilename ) ); - RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); + RicReplaceSummaryCaseFeature::updateRequredCalculatedCurves( summaryCase ); // Find and update all changed calculations - std::set ids; + std::set ids; + RimSummaryCalculationCollection* calcColl = RimProject::current()->calculationCollection(); for ( RimSummaryCalculation* summaryCalculation : calcColl->calculations() ) { bool needsUpdate = checkIfCalculationNeedsUpdate( summaryCalculation, summaryCase ); if ( needsUpdate ) { ids.insert( summaryCalculation->id() ); - summaryCalculation->parseExpression(); - summaryCalculation->calculate(); - summaryCalculation->updateDependentCurvesAndPlots(); } } @@ -174,7 +192,7 @@ void RicReplaceSummaryCaseFeature::setupActionLook( QAction* actionToSetup ) /// //-------------------------------------------------------------------------------------------------- bool RicReplaceSummaryCaseFeature::checkIfCalculationNeedsUpdate( const RimSummaryCalculation* summaryCalculation, - const RimFileSummaryCase* summaryCase ) + const RimSummaryCase* summaryCase ) { std::vector variables = summaryCalculation->allVariables(); for ( RimSummaryCalculationVariable* variable : variables ) diff --git a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h index 0d60497cb1..5f16574a1e 100644 --- a/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h +++ b/ApplicationCode/Commands/RicReplaceSummaryCaseFeature.h @@ -21,17 +21,20 @@ #include "cafCmdFeature.h" class RimSummaryCalculation; -class RimFileSummaryCase; +class RimSummaryCase; class RicReplaceSummaryCaseFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; +public: + static void updateRequredCalculatedCurves( RimSummaryCase* sourceSummaryCase ); + protected: bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; - bool checkIfCalculationNeedsUpdate( const RimSummaryCalculation* summaryCalculation, - const RimFileSummaryCase* summaryCase ); + static bool checkIfCalculationNeedsUpdate( const RimSummaryCalculation* summaryCalculation, + const RimSummaryCase* summaryCase ); }; diff --git a/ApplicationCode/FileInterface/RifEnsembleStatisticsReader.cpp b/ApplicationCode/FileInterface/RifEnsembleStatisticsReader.cpp index 85236847b6..e7460cd09c 100644 --- a/ApplicationCode/FileInterface/RifEnsembleStatisticsReader.cpp +++ b/ApplicationCode/FileInterface/RifEnsembleStatisticsReader.cpp @@ -18,7 +18,9 @@ #include "RifEnsembleStatisticsReader.h" +#include "RimEnsembleCurveSet.h" #include "RimEnsembleStatisticsCase.h" +#include "RimSummaryCaseCollection.h" static const std::vector EMPTY_TIME_STEPS_VECTOR; @@ -80,7 +82,23 @@ bool RifEnsembleStatisticsReader::values( const RifEclipseSummaryAddress& result //-------------------------------------------------------------------------------------------------- std::string RifEnsembleStatisticsReader::unitName( const RifEclipseSummaryAddress& resultAddress ) const { - return ""; + std::string retval; + + // The stat case does not have a unit set, so pick up the unit from one of the input cases, if possible + auto cases = m_ensembleStatCase->curveSet()->summaryCaseCollection()->allSummaryCases(); + if ( cases.size() > 0 ) + { + // get rid of the stats part of the quantity name + QString qName = QString::fromStdString( resultAddress.quantityName() ); + std::string orgQName = qName.split( ":" )[1].toStdString(); + + RifEclipseSummaryAddress address = RifEclipseSummaryAddress( resultAddress ); + address.setQuantityName( orgQName ); + + retval = cases[0]->summaryReader()->unitName( address ); + } + + return retval; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/GrpcInterface/Python/rips/tests/test_cases.py b/ApplicationCode/GrpcInterface/Python/rips/tests/test_cases.py index 02a616dcf0..04b6b3096e 100644 --- a/ApplicationCode/GrpcInterface/Python/rips/tests/test_cases.py +++ b/ApplicationCode/GrpcInterface/Python/rips/tests/test_cases.py @@ -163,14 +163,14 @@ def test_replaceCase(rips_instance, initialize_test): case.replace(new_grid_file=case_path) # Check that the case object has been changed - assert(case.name == "Real0--BRUGGE_0000.EGRID") + assert(case.name == "BRUGGE_0000") assert(case.id == 0) cases = rips_instance.project.cases() assert(len(cases) is 1) # Check that retrieving the case object again will yield the changed object case = project.case(case_id=0) - assert(case.name == "Real0--BRUGGE_0000.EGRID") + assert(case.name == "BRUGGE_0000") assert(case.id == 0) diff --git a/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp b/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp index 7e4967f86c..3901848568 100644 --- a/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp @@ -127,8 +127,12 @@ void RivContourMapProjectionPartMgr::appendContourLinesToModel( const cvf::Camer cvf::ScalarMapper* mapper = m_contourMapProjection->legendConfig()->scalarMapper(); std::vector> labelBBoxes; - std::vector> labelDrawables = - createContourLabels( camera, displayCoordTransform, &labelBBoxes ); + std::vector> labelDrawables; + + if ( m_contourMapProjection->showContourLabels() ) + { + labelDrawables = createContourLabels( camera, displayCoordTransform, &labelBBoxes ); + } std::vector>> contourDrawablesForAllLevels = createContourPolygons( displayCoordTransform, labelBBoxes ); @@ -163,14 +167,18 @@ void RivContourMapProjectionPartMgr::appendContourLinesToModel( const cvf::Camer } } } - for ( auto labelDrawableRef : labelDrawables ) + + if ( m_contourMapProjection->showContourLabels() ) { - cvf::ref part = new cvf::Part; - part->setDrawable( labelDrawableRef.p() ); - part->setEffect( m_labelEffect.p() ); - part->setPriority( RivPartPriority::Text ); - part->setSourceInfo( new RivMeshLinesSourceInfo( m_contourMapProjection.p() ) ); - model->addPart( part.p() ); + for ( auto labelDrawableRef : labelDrawables ) + { + cvf::ref part = new cvf::Part; + part->setDrawable( labelDrawableRef.p() ); + part->setEffect( m_labelEffect.p() ); + part->setPriority( RivPartPriority::Text ); + part->setSourceInfo( new RivMeshLinesSourceInfo( m_contourMapProjection.p() ) ); + model->addPart( part.p() ); + } } } } @@ -295,46 +303,49 @@ std::vector>> lineBBox.add( displayVertex2 ); bool addOriginalSegment = true; - for ( const cvf::BoundingBox& existingBBox : labelBBoxes[i] ) + if ( labelBBoxes.size() > 0 ) { - if ( lineBBox.intersects( existingBBox ) ) + for ( const cvf::BoundingBox& existingBBox : labelBBoxes[i] ) { - if ( existingBBox.contains( displayVertex1 ) && existingBBox.contains( displayVertex2 ) ) + if ( lineBBox.intersects( existingBBox ) ) { - addOriginalSegment = false; - } - else - { - cvf::Vec3d dir = displayVertex2 - displayVertex1; - - cvf::Ray ray; - ray.setOrigin( displayVertex1 ); - ray.setDirection( dir.getNormalized() ); - ray.setMaximumDistance( dir.length() ); - - if ( !existingBBox.contains( displayVertex1 ) ) + if ( existingBBox.contains( displayVertex1 ) && existingBBox.contains( displayVertex2 ) ) { - cvf::Vec3d intersection; - bool hit = ray.boxIntersect( existingBBox, &intersection ); - if ( hit ) - { - displayLines.push_back( cvf::Vec3f( displayVertex1 ) ); - displayLines.push_back( cvf::Vec3f( intersection ) ); - addOriginalSegment = false; - } + addOriginalSegment = false; } - - if ( !existingBBox.contains( displayVertex2 ) ) + else { - ray.setOrigin( displayVertex2 ); - ray.setDirection( -ray.direction() ); - cvf::Vec3d intersection; - bool hit = ray.boxIntersect( existingBBox, &intersection ); - if ( hit ) + cvf::Vec3d dir = displayVertex2 - displayVertex1; + + cvf::Ray ray; + ray.setOrigin( displayVertex1 ); + ray.setDirection( dir.getNormalized() ); + ray.setMaximumDistance( dir.length() ); + + if ( !existingBBox.contains( displayVertex1 ) ) { - displayLines.push_back( cvf::Vec3f( intersection ) ); - displayLines.push_back( cvf::Vec3f( displayVertex2 ) ); - addOriginalSegment = false; + cvf::Vec3d intersection; + bool hit = ray.boxIntersect( existingBBox, &intersection ); + if ( hit ) + { + displayLines.push_back( cvf::Vec3f( displayVertex1 ) ); + displayLines.push_back( cvf::Vec3f( intersection ) ); + addOriginalSegment = false; + } + } + + if ( !existingBBox.contains( displayVertex2 ) ) + { + ray.setOrigin( displayVertex2 ); + ray.setDirection( -ray.direction() ); + cvf::Vec3d intersection; + bool hit = ray.boxIntersect( existingBBox, &intersection ); + if ( hit ) + { + displayLines.push_back( cvf::Vec3f( intersection ) ); + displayLines.push_back( cvf::Vec3f( displayVertex2 ) ); + addOriginalSegment = false; + } } } } diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp index ceb36dfeb8..0d8d440589 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp @@ -467,6 +467,13 @@ void RimGridCrossPlotDataSet::onLoadDataAndUpdate( bool updateParentPlot ) return; } + if ( legendConfig()->mappingMode() == RimRegularLegendConfig::MappingType::LINEAR_CONTINUOUS || + legendConfig()->mappingMode() == RimRegularLegendConfig::MappingType::LOG10_CONTINUOUS ) + { + // Avoid continuous modes + legendConfig()->setMappingMode( RimRegularLegendConfig::MappingType::LINEAR_DISCRETE ); + } + RigEclipseResultAddress xAddress( m_xAxisProperty->resultType(), m_xAxisProperty->resultVariable() ); RigEclipseResultAddress yAddress( m_yAxisProperty->resultType(), m_yAxisProperty->resultVariable() ); RigEclipseResultAddress groupAddress( m_groupingProperty->resultType(), m_groupingProperty->resultVariable() ); @@ -531,8 +538,6 @@ void RimGridCrossPlotDataSet::assignCurveDataGroups( const RigEclipseCrossPlotRe } else { - std::vector tickValues; - if ( groupingByCategoryResult() ) { for ( size_t i = 0; i < result.xValues.size(); ++i ) @@ -550,20 +555,24 @@ void RimGridCrossPlotDataSet::assignCurveDataGroups( const RigEclipseCrossPlotRe } else { + std::vector tickValues; legendConfig()->scalarMapper()->majorTickValues( &tickValues ); - for ( size_t i = 0; i < result.xValues.size(); ++i ) + if ( !tickValues.empty() ) { - auto upperBoundIt = - std::lower_bound( tickValues.begin(), tickValues.end(), result.groupValuesContinuous[i] ); - int upperBoundIndex = static_cast( upperBoundIt - tickValues.begin() ); - int categoryNum = std::min( (int)tickValues.size() - 2, std::max( 0, upperBoundIndex - 1 ) ); - m_groupedResults[categoryNum].xValues.push_back( result.xValues[i] ); - m_groupedResults[categoryNum].yValues.push_back( result.yValues[i] ); - if ( !result.groupValuesContinuous.empty() ) - m_groupedResults[categoryNum].groupValuesContinuous.push_back( result.groupValuesContinuous[i] ); - if ( !result.groupValuesDiscrete.empty() ) - m_groupedResults[categoryNum].groupValuesDiscrete.push_back( result.groupValuesDiscrete[i] ); + for ( size_t i = 0; i < result.xValues.size(); ++i ) + { + auto upperBoundIt = + std::lower_bound( tickValues.begin(), tickValues.end(), result.groupValuesContinuous[i] ); + int upperBoundIndex = static_cast( upperBoundIt - tickValues.begin() ); + int categoryNum = std::min( (int)tickValues.size() - 2, std::max( 0, upperBoundIndex - 1 ) ); + m_groupedResults[categoryNum].xValues.push_back( result.xValues[i] ); + m_groupedResults[categoryNum].yValues.push_back( result.yValues[i] ); + if ( !result.groupValuesContinuous.empty() ) + m_groupedResults[categoryNum].groupValuesContinuous.push_back( result.groupValuesContinuous[i] ); + if ( !result.groupValuesDiscrete.empty() ) + m_groupedResults[categoryNum].groupValuesDiscrete.push_back( result.groupValuesDiscrete[i] ); + } } } } @@ -614,7 +623,14 @@ void RimGridCrossPlotDataSet::createCurves( const RigEclipseCrossPlotResult& res } else { - curve->setColor( cvf::Color3f( legendConfig()->scalarMapper()->mapToColor( tickValues[it->first] ) ) ); + if ( it->first < static_cast( tickValues.size() ) ) + { + curve->setColor( cvf::Color3f( legendConfig()->scalarMapper()->mapToColor( tickValues[it->first] ) ) ); + } + else + { + curve->setColor( cvf::Color3f( legendConfig()->scalarMapper()->mapToColor( it->first ) ) ); + } } curve->setSymbolEdgeColor( curve->color() ); curve->setSamples( it->second.xValues, it->second.yValues ); @@ -705,9 +721,13 @@ QString RimGridCrossPlotDataSet::createGroupName( size_t groupIndex ) const { std::vector tickValues; legendConfig()->scalarMapper()->majorTickValues( &tickValues ); - double lowerLimit = tickValues[groupIndex]; - double upperLimit = groupIndex + 1u < tickValues.size() ? tickValues[groupIndex + 1u] - : std::numeric_limits::infinity(); + + double lowerLimit = std::numeric_limits::infinity(); + if ( groupIndex < tickValues.size() ) lowerLimit = tickValues[groupIndex]; + + double upperLimit = std::numeric_limits::infinity(); + if ( groupIndex + 1u < tickValues.size() ) upperLimit = tickValues[groupIndex + 1u]; + return QString( "%1 [%2, %3]" ).arg( groupParameter() ).arg( lowerLimit ).arg( upperLimit ); } } diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index 6562de5d42..e174203b6c 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -714,6 +714,8 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicImportEnsembleFeature"; menuBuilder << "RicNewDerivedEnsembleFeature"; menuBuilder << "RicNewDerivedSummaryFeature"; + menuBuilder << "Separator"; + menuBuilder << "RicShowSummaryCurveCalculatorFeature"; } else if ( dynamic_cast( firstUiItem ) ) { diff --git a/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp b/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp index 8ec7f03ad8..c2d7ddf4fa 100644 --- a/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp +++ b/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp @@ -239,6 +239,14 @@ bool RimContourMapProjection::showContourLines() const return m_showContourLines(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimContourMapProjection::showContourLabels() const +{ + return m_showContourLabels(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimContourMapProjection.h b/ApplicationCode/ProjectDataModel/RimContourMapProjection.h index be9aef2255..5bfac7d219 100644 --- a/ApplicationCode/ProjectDataModel/RimContourMapProjection.h +++ b/ApplicationCode/ProjectDataModel/RimContourMapProjection.h @@ -89,6 +89,7 @@ public: double sampleSpacingFactor() const; void setSampleSpacingFactor( double spacingFactor ); bool showContourLines() const; + bool showContourLabels() const; QString resultAggregationText() const; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp index 0e3a111c20..3ffbcfdcfb 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -1890,6 +1890,7 @@ void RimEclipseResultDefinition::updateRangesForExplicitLegends( RimRegularLegen if ( !eclipseCaseData ) return; RigCaseCellResultsData* cellResultsData = eclipseCaseData->results( this->porosityModel() ); + cellResultsData->ensureKnownResultLoaded( this->eclipseResultAddress() ); double globalMin, globalMax; double globalPosClosestToZero, globalNegClosestToZero; diff --git a/ApplicationCode/ProjectDataModel/RimModeledWellPath.cpp b/ApplicationCode/ProjectDataModel/RimModeledWellPath.cpp index 5fe3d116c4..9dc6883ccc 100644 --- a/ApplicationCode/ProjectDataModel/RimModeledWellPath.cpp +++ b/ApplicationCode/ProjectDataModel/RimModeledWellPath.cpp @@ -58,6 +58,7 @@ RimModeledWellPath::RimModeledWellPath() // Required, as these settings are set in RimWellPath() m_name.uiCapability()->setUiReadOnly( false ); + m_name.uiCapability()->setUiHidden( false ); m_name.xmlCapability()->setIOReadable( true ); m_name.xmlCapability()->setIOWritable( true ); } @@ -182,3 +183,12 @@ void RimModeledWellPath::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrd uiTreeOrdering.add( m_geometryDefinition() ); RimWellPath::defineUiTreeOrdering( uiTreeOrdering, uiConfigName ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimModeledWellPath::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_name ); + RimWellPath::defineUiOrdering( uiConfigName, uiOrdering ); +} diff --git a/ApplicationCode/ProjectDataModel/RimModeledWellPath.h b/ApplicationCode/ProjectDataModel/RimModeledWellPath.h index 839c1d9230..52d6aec1c8 100644 --- a/ApplicationCode/ProjectDataModel/RimModeledWellPath.h +++ b/ApplicationCode/ProjectDataModel/RimModeledWellPath.h @@ -41,6 +41,7 @@ public: private: void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; caf::PdmChildField m_geometryDefinition; }; diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp index e510790ac4..cc6d5b2070 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotAxisFormatter.cpp @@ -184,8 +184,12 @@ QString RimSummaryPlotAxisFormatter::autoAxisTitle() const auto addToUnitToQuantityMap =[&]( const std::string& unitText, const RifEclipseSummaryAddress& sumAddress ) { + // remove any stats prefix from the quantity name + size_t cutPos = sumAddress.quantityName().find(':'); + if (cutPos == std::string::npos) cutPos = -1; + std::string quantityNameForDisplay; - const std::string& quantityName = sumAddress.quantityName(); + const std::string& quantityName = sumAddress.quantityName().substr(cutPos+1); if ( sumAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) { @@ -225,11 +229,7 @@ QString RimSummaryPlotAxisFormatter::autoAxisTitle() const RifEclipseSummaryAddress sumAddress; std::string unitText; - if ( rimCurve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) - { - continue; - } - else if ( m_axisProperties->plotAxisType() == RiaDefines::PlotAxis::PLOT_AXIS_BOTTOM ) + if ( m_axisProperties->plotAxisType() == RiaDefines::PlotAxis::PLOT_AXIS_BOTTOM ) { sumAddress = rimCurve->summaryAddressX(); unitText = rimCurve->unitNameX(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp index de6490cd6f..039ac6a925 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.cpp @@ -71,6 +71,7 @@ RimSummaryPlotSourceStepping::RimSummaryPlotSourceStepping() CAF_PDM_InitFieldNoDefault( &m_cellBlock, "CellBlock", "Block", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_segment, "Segment", "Segment", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_completion, "Completion", "Completion", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_aquifer, "Aquifer", "Aquifer", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_ensemble, "Ensemble", "Ensemble", "", "", "" ); @@ -312,6 +313,10 @@ QList secondaryIdentifier = m_wellName().toStdString(); category = RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION; } + else if ( fieldNeedingOptions == &m_aquifer ) + { + category = RifEclipseSummaryAddress::SUMMARY_AQUIFER; + } std::vector identifierTexts; @@ -496,6 +501,10 @@ void RimSummaryPlotSourceStepping::fieldChangedByUi( const caf::PdmFieldHandle* { summaryCategoryToModify = RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION; } + else if ( changedField == &m_aquifer ) + { + summaryCategoryToModify = RifEclipseSummaryAddress::SUMMARY_AQUIFER; + } if ( summaryCategoryToModify != RifEclipseSummaryAddress::SUMMARY_INVALID ) { @@ -737,6 +746,7 @@ std::vector RimSummaryPlotSourceStepping::computeVisibleFi m_cellBlock.uiCapability()->setUiHidden( true ); m_segment.uiCapability()->setUiHidden( true ); m_completion.uiCapability()->setUiHidden( true ); + m_aquifer.uiCapability()->setUiHidden( true ); std::vector fields; @@ -858,6 +868,14 @@ std::vector RimSummaryPlotSourceStepping::computeVisibleFi fieldsCommonForAllCurves.push_back( &m_completion ); } + if ( analyzer.aquifers().size() == 1 ) + { + m_aquifer = *( analyzer.aquifers().begin() ); + m_aquifer.uiCapability()->setUiHidden( false ); + + fieldsCommonForAllCurves.push_back( &m_aquifer ); + } + if ( !analyzer.quantityNameForTitle().empty() ) { QString txt = QString::fromStdString( analyzer.quantityNameForTitle() ); @@ -972,6 +990,18 @@ bool RimSummaryPlotSourceStepping::updateAddressIfMatching( const QVariant& return true; } } + else if ( category == RifEclipseSummaryAddress::SUMMARY_AQUIFER ) + { + int oldInt = oldValue.toInt(); + int newInt = newValue.toInt(); + + if ( adr->aquiferNumber() == oldInt ) + { + adr->setAquiferNumber( newInt ); + + return true; + } + } else if ( category == RifEclipseSummaryAddress::SUMMARY_WELL_GROUP ) { std::string oldString = oldValue.toString().toStdString(); diff --git a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h index 40c26c28c6..f9bde2f3c5 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h +++ b/ApplicationCode/ProjectDataModel/Summary/RimSummaryPlotSourceStepping.h @@ -120,6 +120,8 @@ private: caf::PdmField m_segment; caf::PdmField m_completion; + caf::PdmField m_aquifer; + caf::PdmField m_includeEnsembleCasesForCaseStepping; SourceSteppingType m_sourceSteppingType; diff --git a/ApplicationCode/UserInterface/RiuScalarMapperLegendFrame.cpp b/ApplicationCode/UserInterface/RiuScalarMapperLegendFrame.cpp index e2be50ea9f..d6bbf0f14c 100644 --- a/ApplicationCode/UserInterface/RiuScalarMapperLegendFrame.cpp +++ b/ApplicationCode/UserInterface/RiuScalarMapperLegendFrame.cpp @@ -17,6 +17,8 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RiuScalarMapperLegendFrame.h" +#include "cvfScalarMapperDiscreteLinear.h" +#include "cvfScalarMapperDiscreteLog.h" #include "cvfString.h" #include "cvfqtUtils.h" @@ -162,8 +164,16 @@ void RiuScalarMapperLegendFrame::renderRect( QPainter* painter, const LayoutInfo int rectIndexFromBottom = rectCount() - rectIndex - 1; cvf::Color3ub startColor = m_scalarMapper->mapToColor( m_tickValues[rectIndexFromBottom] ); cvf::Color3ub endColor = m_scalarMapper->mapToColor( m_tickValues[rectIndexFromBottom + 1] ); - QColor startQColor( startColor.r(), startColor.g(), startColor.b() ); - QColor endQColor( endColor.r(), endColor.g(), endColor.b() ); + + if ( dynamic_cast( m_scalarMapper.p() ) || + dynamic_cast( m_scalarMapper.p() ) ) + { + // Do not draw gradient for discrete legends + endColor = startColor; + } + + QColor startQColor( startColor.r(), startColor.g(), startColor.b() ); + QColor endQColor( endColor.r(), endColor.g(), endColor.b() ); QRectF gradientRect( QPointF( layout.tickStartX, layout.colorBarRect.bottom() - layout.tickYPixelPos[rectIndexFromBottom] + 1 ), diff --git a/ApplicationCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp b/ApplicationCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp index 6e76d5ae67..683caf4597 100644 --- a/ApplicationCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp +++ b/ApplicationCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp @@ -55,15 +55,12 @@ RiuSummaryQuantityNameInfoProvider::RiuSummaryQuantityInfo else if ( quantity.size() > 1 && quantity[1] == 'U' ) { // User defined vector name + // The summary type is given by the first letter, and U defines user-defined + // FU : field user defined name + // WU : well user defined name + // ..... - std::string key = quantity.substr( 0, 2 ); - - it = m_summaryToDescMap.find( key ); - - if ( it != m_summaryToDescMap.end() ) - { - return it->second; - } + return RiuSummaryQuantityInfo(); } else if ( quantity.size() > 5 ) { diff --git a/ResInsightVersion.cmake b/ResInsightVersion.cmake index 4332176038..f307873d7d 100644 --- a/ResInsightVersion.cmake +++ b/ResInsightVersion.cmake @@ -10,7 +10,7 @@ set(RESINSIGHT_VERSION_TEXT "-dev") # Must be unique and increasing within one combination of major/minor/patch version # The uniqueness of this text is independent of RESINSIGHT_VERSION_TEXT # Format of text must be ".xx" -set(RESINSIGHT_DEV_VERSION ".01") +set(RESINSIGHT_DEV_VERSION ".02") # https://github.com/CRAVA/crava/tree/master/libs/nrlib set(NRLIB_GITHUB_SHA "ba35d4359882f1c6f5e9dc30eb95fe52af50fd6f")