From e743a61d5b81181342f80c6a5a5b69afc6fcff38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Jensen?= Date: Wed, 10 Jan 2018 13:55:48 +0100 Subject: [PATCH] #1752. Import multiple summary cases from a directory structure. Take 1 --- .../Commands/CMakeLists_files.cmake | 8 + .../Commands/RicFileHierarchyDialog.cpp | 271 ++++++++++++++++++ .../Commands/RicFileHierarchyDialog.h | 104 +++++++ .../Commands/RicImportSummaryCasesFeature.cpp | 122 ++++++++ .../Commands/RicImportSummaryCasesFeature.h | 42 +++ .../UserInterface/RiuMainPlotWindow.cpp | 1 + .../UserInterface/RiuMainWindow.cpp | 1 + 7 files changed, 549 insertions(+) create mode 100644 ApplicationCode/Commands/RicFileHierarchyDialog.cpp create mode 100644 ApplicationCode/Commands/RicFileHierarchyDialog.h create mode 100644 ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp create mode 100644 ApplicationCode/Commands/RicImportSummaryCasesFeature.h diff --git a/ApplicationCode/Commands/CMakeLists_files.cmake b/ApplicationCode/Commands/CMakeLists_files.cmake index cfda894e19..f11b8143d1 100644 --- a/ApplicationCode/Commands/CMakeLists_files.cmake +++ b/ApplicationCode/Commands/CMakeLists_files.cmake @@ -41,6 +41,7 @@ ${CEE_CURRENT_LIST_DIR}RicWellLogsImportFileFeature.h ${CEE_CURRENT_LIST_DIR}RicTogglePerspectiveViewFeature.h ${CEE_CURRENT_LIST_DIR}RicImportGeoMechCaseFeature.h ${CEE_CURRENT_LIST_DIR}RicImportSummaryCaseFeature.h +${CEE_CURRENT_LIST_DIR}RicImportSummaryCasesFeature.h ${CEE_CURRENT_LIST_DIR}RicImportObservedDataFeature.h ${CEE_CURRENT_LIST_DIR}RicImportObservedDataInMenuFeature.h ${CEE_CURRENT_LIST_DIR}RicExportFeatureImpl.h @@ -61,10 +62,13 @@ ${CEE_CURRENT_LIST_DIR}RicCommandFeature.h ${CEE_CURRENT_LIST_DIR}RicReloadCaseFeature.h ${CEE_CURRENT_LIST_DIR}RicReloadSummaryCaseFeature.h +${CEE_CURRENT_LIST_DIR}RicReloadSummaryCasesFeature.h ${CEE_CURRENT_LIST_DIR}RicFlyToObjectFeature.h ${CEE_CURRENT_LIST_DIR}RicGridStatisticsDialog.h ${CEE_CURRENT_LIST_DIR}RicShowGridStatisticsFeature.h + +${CEE_CURRENT_LIST_DIR}RicFileHierarchyDialog.h ) if (RESINSIGHT_ENABLE_PROTOTYPE_FEATURE_FRACTURES) @@ -118,6 +122,7 @@ ${CEE_CURRENT_LIST_DIR}RicImportElementPropertyFeature.cpp ${CEE_CURRENT_LIST_DIR}RicTogglePerspectiveViewFeature.cpp ${CEE_CURRENT_LIST_DIR}RicImportGeoMechCaseFeature.cpp ${CEE_CURRENT_LIST_DIR}RicImportSummaryCaseFeature.cpp +${CEE_CURRENT_LIST_DIR}RicImportSummaryCasesFeature.cpp ${CEE_CURRENT_LIST_DIR}RicImportObservedDataFeature.cpp ${CEE_CURRENT_LIST_DIR}RicImportObservedDataInMenuFeature.cpp ${CEE_CURRENT_LIST_DIR}RicExportFeatureImpl.cpp @@ -140,6 +145,8 @@ ${CEE_CURRENT_LIST_DIR}RicFlyToObjectFeature.cpp ${CEE_CURRENT_LIST_DIR}RicGridStatisticsDialog.cpp ${CEE_CURRENT_LIST_DIR}RicShowGridStatisticsFeature.cpp + +${CEE_CURRENT_LIST_DIR}RicFileHierarchyDialog.cpp ) @@ -169,6 +176,7 @@ ${SOURCE_GROUP_SOURCE_FILES} list(APPEND QT_MOC_HEADERS ${CEE_CURRENT_LIST_DIR}RicGridStatisticsDialog.h +${CEE_CURRENT_LIST_DIR}RicFileHierarchyDialog.h ) source_group( "CommandFeature" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CEE_CURRENT_LIST_DIR}CMakeLists_files.cmake ) diff --git a/ApplicationCode/Commands/RicFileHierarchyDialog.cpp b/ApplicationCode/Commands/RicFileHierarchyDialog.cpp new file mode 100644 index 0000000000..07aba9a03a --- /dev/null +++ b/ApplicationCode/Commands/RicFileHierarchyDialog.cpp @@ -0,0 +1,271 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicFileHierarchyDialog.h" +#include "ExportCommands/RicSnapshotViewToClipboardFeature.h" +#include "ExportCommands/RicSnapshotViewToFileFeature.h" +#include "ExportCommands/RicSnapshotFilenameGenerator.h" + +#include "RiaApplication.h" + +#include "RimEclipseView.h" +#include "Rim3dOverlayInfoConfig.h" + +#include "RiuMainPlotWindow.h" +#include "RiuSummaryQwtPlot.h" +#include "RiuTools.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +//-------------------------------------------------------------------------------------------------- +/// Internal functions +//-------------------------------------------------------------------------------------------------- +QStringList prefixStrings(const QStringList& strings, const QString& prefix); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicFileHierarchyDialog::RicFileHierarchyDialog(QWidget* parent) + : QDialog(parent, RiuTools::defaultDialogFlags()) +{ + // Create widgets + m_rootDirLabel = new QLabel(); + m_rootDir = new QLineEdit(); + m_browseButton = new QPushButton(); + m_pathFilterLabel = new QLabel(); + m_pathFilter = new QLineEdit(); + m_fileFilterLabel = new QLabel(); + m_fileFilter = new QLineEdit(); + m_fileExtension = new QLabel(); + + m_buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + + // Connect to close button signal + connect(m_buttons, SIGNAL(accepted()), this, SLOT(slotDialogOkClicked())); + connect(m_buttons, SIGNAL(rejected()), this, SLOT(slotDialogCancelClicked())); + connect(m_browseButton, SIGNAL(clicked()), this, SLOT(slotBrowseButtonClicked())); + + // Set widget properties + m_rootDirLabel->setText("Root folder"); + m_pathFilterLabel->setText("Path pattern"); + m_pathFilter->setText("*"); + m_fileFilterLabel->setText("File pattern"); + m_browseButton->setText("..."); + + m_browseButton->setFixedWidth(25); + + // Define layout + QVBoxLayout* dialogLayout = new QVBoxLayout(); + //dialogLayout->addWidget(m_rootDirLabel); + //dialogLayout->addWidget(m_rootDir); + //dialogLayout->addWidget(m_browseButton); + //dialogLayout->addWidget(m_pathFilterLabel); + //dialogLayout->addWidget(m_pathFilter); + //dialogLayout->addWidget(m_fileFilterLabel); + //dialogLayout->addWidget(m_fileFilter); + //dialogLayout->addWidget(m_fileExtension); + //dialogLayout->addWidget(m_buttons); + + QGridLayout* gridLayout = new QGridLayout(); + gridLayout->addWidget(m_rootDirLabel, 0, 0); + gridLayout->addWidget(m_rootDir, 0, 1); + gridLayout->addWidget(m_browseButton, 0, 2); + gridLayout->addWidget(m_pathFilterLabel, 1, 0); + gridLayout->addWidget(m_pathFilter, 1, 1); + gridLayout->addWidget(m_fileFilterLabel, 2, 0); + gridLayout->addWidget(m_fileFilter, 2, 1); + gridLayout->addWidget(m_fileExtension, 2, 2); + + dialogLayout->addLayout(gridLayout); + dialogLayout->addWidget(m_buttons); + + setLayout(dialogLayout); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicFileHierarchyDialog::~RicFileHierarchyDialog() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RicFileHierarchyDialog::files() const +{ + return m_files; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RicFileHierarchyDialog::rootDir() const +{ + return m_rootDir->text(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicFileHierarchyDialogResult RicFileHierarchyDialog::getOpenFileNames(QWidget *parent /*= 0*/, + const QString &caption /*= QString()*/, + const QString &dir /*= QString()*/, + const QString &fileNameFilter /*= QString()*/, + const QStringList &fileExtensions /*= QStringList()*/) +{ + QStringList files; + RicFileHierarchyDialog dialog(parent); + + dialog.setWindowTitle(caption); + + dialog.m_rootDir->setText(dir); + dialog.m_fileFilter->setText(fileNameFilter); + dialog.m_fileExtension->setText(prefixStrings(fileExtensions, ".").join(" | ")); + + dialog.resize(600, 150); + dialog.exec(); + + return RicFileHierarchyDialogResult(dialog.result() == QDialog::Accepted, dialog.files(), dialog.rootDir()); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RicFileHierarchyDialog::findMatchingFiles(const QString& rootDir, const QString& pathFilter, const QString& fileNameFilter, const QStringList& fileExtensions) +{ + QStringList files = findFilesRecursive(rootDir, fileNameFilter, fileExtensions); + return filterByPathFilter(files, pathFilter); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RicFileHierarchyDialog::findFilesRecursive(const QString &dir, const QString &fileNameFilter, const QStringList &fileExtensions) +{ + QStringList allFiles; + + QDir qdir(dir); + QStringList subDirs = qdir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + QStringList files = qdir.entryList(createNameFilterList(fileNameFilter, fileExtensions), QDir::Files); + + for (QString file : files) + { + allFiles.append(qdir.absoluteFilePath(file)); + } + + for (QString subDir : subDirs) + { + allFiles += findFilesRecursive(qdir.absoluteFilePath(subDir), fileNameFilter, fileExtensions); + } + return allFiles; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RicFileHierarchyDialog::createNameFilterList(const QString &fileNameFilter, const QStringList &fileExtensions) +{ + QStringList nameFilter; + QString effectiveFileNameFilter = !fileNameFilter.isEmpty() ? fileNameFilter : "*"; + + if (fileExtensions.size() == 0) + { + nameFilter.append(effectiveFileNameFilter); + } + else + { + for (QString fileExtension : fileExtensions) + { + nameFilter.append(effectiveFileNameFilter + fileExtension); + } + } + return nameFilter; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RicFileHierarchyDialog::filterByPathFilter(const QStringList& files, const QString& pathFilter) +{ + QStringList filteredFiles; + QRegExp regexp(pathFilter, Qt::CaseInsensitive, QRegExp::Wildcard); + + for (QString file : files) + { + QFileInfo fileInfo(file); + QString path = fileInfo.absolutePath(); + + if (regexp.exactMatch(path)) + { + filteredFiles.append(file); + } + } + + return filteredFiles; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicFileHierarchyDialog::slotDialogOkClicked() +{ + m_files = findMatchingFiles(m_rootDir->text(), m_pathFilter->text(), m_fileFilter->text(), m_fileExtension->text().split("|")); + accept(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicFileHierarchyDialog::slotDialogCancelClicked() +{ + m_files = QStringList(); + reject(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicFileHierarchyDialog::slotBrowseButtonClicked() +{ + QString folder = QFileDialog::getExistingDirectory(this, "Select root folder", m_rootDir->text()); + m_rootDir->setText(folder); +} + + +//-------------------------------------------------------------------------------------------------- +/// Internal functions +//-------------------------------------------------------------------------------------------------- +QStringList prefixStrings(const QStringList& strings, const QString& prefix) +{ + QStringList prefixedStrings; + for (auto string : strings) + { + prefixedStrings.append(prefix + string); + } + return prefixedStrings; +} diff --git a/ApplicationCode/Commands/RicFileHierarchyDialog.h b/ApplicationCode/Commands/RicFileHierarchyDialog.h new file mode 100644 index 0000000000..4fa162e433 --- /dev/null +++ b/ApplicationCode/Commands/RicFileHierarchyDialog.h @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "Rim3dOverlayInfoConfig.h" + +#include "cafPdmPointer.h" + +#include + +class QLabel; +class QLineEdit; +class QDialogButtonBox; +class QPushButton; +class QMainWindow; +class RicFileHierarchyDialogResult; + +//================================================================================================== +/// +//================================================================================================== +class RicFileHierarchyDialog : public QDialog +{ + Q_OBJECT + +public: + RicFileHierarchyDialog(QWidget* parent); + ~RicFileHierarchyDialog(); + + QStringList files() const; + QString rootDir() const; + + static RicFileHierarchyDialogResult getOpenFileNames(QWidget *parent = 0, + const QString &caption = QString(), + const QString &dir = QString(), + const QString &fileNameFilter = QString(), + const QStringList &fileExtensions = QStringList()); + +private: + static QStringList findMatchingFiles(const QString &rootDir, + const QString& pathFilter, + const QString &fileNameFilter, + const QStringList &fileExtensions); + + static QStringList findFilesRecursive(const QString &dir, + const QString &fileNameFilter, + const QStringList &fileExtensions); + + static QStringList createNameFilterList(const QString &fileNameFilter, + const QStringList &fileExtensions); + + static QStringList filterByPathFilter(const QStringList& files, const QString& pathFilter); + +private slots: + void slotDialogOkClicked(); + void slotDialogCancelClicked(); + void slotBrowseButtonClicked(); + +private: + QLabel* m_rootDirLabel; + QLineEdit* m_rootDir; + QPushButton* m_browseButton; + + QLabel* m_pathFilterLabel; + QLineEdit* m_pathFilter; + + QLabel* m_fileFilterLabel; + QLineEdit* m_fileFilter; + + QLabel* m_fileExtension; + + QDialogButtonBox* m_buttons; + + QStringList m_files; +}; + + +//================================================================================================== +/// +//================================================================================================== +class RicFileHierarchyDialogResult +{ +public: + RicFileHierarchyDialogResult(bool ok, const QStringList& files, const QString& rootDir) : + ok(ok), files(files), rootDir(rootDir) {} + bool ok; + QStringList files; + QString rootDir; +}; \ No newline at end of file diff --git a/ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp b/ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp new file mode 100644 index 0000000000..6452c40fb9 --- /dev/null +++ b/ApplicationCode/Commands/RicImportSummaryCasesFeature.cpp @@ -0,0 +1,122 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2016- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicImportSummaryCasesFeature.h" + +#include "RiaApplication.h" +#include "RiaPreferences.h" + +#include "RicFileHierarchyDialog.h" + +#include "RimGridSummaryCase.h" +#include "RimMainPlotCollection.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimSummaryCase.h" +#include "RimSummaryCaseMainCollection.h" +#include "RimSummaryPlotCollection.h" + +#include "RiuMainPlotWindow.h" +#include "RiuMainWindow.h" + +#include "SummaryPlotCommands/RicNewSummaryPlotFeature.h" + +#include +#include + +CAF_CMD_SOURCE_INIT(RicImportSummaryCasesFeature, "RicImportSummaryCasesFeature"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicImportSummaryCasesFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportSummaryCasesFeature::onActionTriggered(bool isChecked) +{ + RiaApplication* app = RiaApplication::instance(); + QString defaultDir = app->lastUsedDialogDirectory("INPUT_FILES"); + + RicFileHierarchyDialogResult result = RicFileHierarchyDialog::getOpenFileNames(NULL, "Import Summary Cases", defaultDir, "*", QStringList("SMSPEC")); + + if (!result.ok) return; + + // Remember the path to next time + app->setLastUsedDialogDirectory("INPUT_FILES", QFileInfo(result.rootDir).absoluteFilePath()); + + QStringList fileNames = result.files; + if (fileNames.isEmpty()) return; + + RimProject* proj = app->project(); + RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr; + if (!sumCaseColl) return; + + for (auto f : fileNames) + { + RicImportSummaryCasesFeature::createAndAddSummaryCaseFromFile(f); + } + + std::vector cases; + app->project()->allCases(cases); + + if (cases.size() == 0) + { + RiuMainWindow::instance()->close(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportSummaryCasesFeature::setupActionLook(QAction* actionToSetup) +{ + actionToSetup->setIcon(QIcon(":/SummaryCase48x48.png")); + actionToSetup->setText("Import Summary Cases Recursively"); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicImportSummaryCasesFeature::createAndAddSummaryCaseFromFile(const QString& fileName) +{ + RiaApplication* app = RiaApplication::instance(); + RimProject* proj = app->project(); + RimSummaryCaseMainCollection* sumCaseColl = proj->activeOilField() ? proj->activeOilField()->summaryCaseMainCollection() : nullptr; + if (!sumCaseColl) return false; + + RimSummaryCase* sumCase = sumCaseColl->createAndAddSummaryCaseFromFileName(fileName); + sumCaseColl->updateAllRequiredEditors(); + + RiuMainPlotWindow* mainPlotWindow = app->getOrCreateAndShowMainPlotWindow(); + if (mainPlotWindow) + { + mainPlotWindow->selectAsCurrentItem(sumCase); + + mainPlotWindow->updateSummaryPlotToolBar(); + } + + app->addToRecentFiles(fileName); + + return true; +} + diff --git a/ApplicationCode/Commands/RicImportSummaryCasesFeature.h b/ApplicationCode/Commands/RicImportSummaryCasesFeature.h new file mode 100644 index 0000000000..3d47388bee --- /dev/null +++ b/ApplicationCode/Commands/RicImportSummaryCasesFeature.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2016- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RicImportSummaryCasesFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +public: + static bool createAndAddSummaryCaseFromFile(const QString& fileName); + +protected: + // Overrides + virtual bool isCommandEnabled() override; + virtual void onActionTriggered( bool isChecked ) override; + virtual void setupActionLook( QAction* actionToSetup ) override; +}; + + diff --git a/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp b/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp index df865f785c..0a36a57abd 100644 --- a/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainPlotWindow.cpp @@ -187,6 +187,7 @@ void RiuMainPlotWindow::createMenus() importMenu->addAction(cmdFeatureMgr->action("RicImportEclipseCaseFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportInputEclipseCaseFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCaseFeature")); + importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCasesFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportObservedDataInMenuFeature")); importMenu->addAction(cmdFeatureMgr->action("RicCreateGridCaseGroupFeature")); importMenu->addSeparator(); diff --git a/ApplicationCode/UserInterface/RiuMainWindow.cpp b/ApplicationCode/UserInterface/RiuMainWindow.cpp index cd52715233..2d16aa7388 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainWindow.cpp @@ -362,6 +362,7 @@ void RiuMainWindow::createMenus() importMenu->addSeparator(); #endif importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCaseFeature")); + importMenu->addAction(cmdFeatureMgr->action("RicImportSummaryCasesFeature")); importMenu->addAction(cmdFeatureMgr->action("RicImportObservedDataInMenuFeature")); importMenu->addSeparator();