From ea87fc0746d8991b3b2f3baf96d5fa4129c2b8cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A5l=20Hagen?= Date: Tue, 18 Aug 2015 16:36:37 +0200 Subject: [PATCH] (#339) Added RicExecuteScriptForCasesFeature --- .../Commands/CMakeLists_files.cmake | 4 +- ...pp => RicExecuteScriptForCasesFeature.cpp} | 13 ++-- ...re.h => RicExecuteScriptForCasesFeature.h} | 2 +- .../ProjectDataModel/RimProject.cpp | 73 ++++++++++++++++++- ApplicationCode/ProjectDataModel/RimProject.h | 3 + .../ProjectDataModel/RimUiTreeView.cpp | 1 + .../UserInterface/RiuMainWindow.cpp | 43 +++++++++++ ApplicationCode/UserInterface/RiuMainWindow.h | 1 + 8 files changed, 129 insertions(+), 11 deletions(-) rename ApplicationCode/Commands/{RicEclipseCaseExecuteScriptFeature.cpp => RicExecuteScriptForCasesFeature.cpp} (78%) rename ApplicationCode/Commands/{RicEclipseCaseExecuteScriptFeature.h => RicExecuteScriptForCasesFeature.h} (95%) diff --git a/ApplicationCode/Commands/CMakeLists_files.cmake b/ApplicationCode/Commands/CMakeLists_files.cmake index 0879b75241..98027d48d7 100644 --- a/ApplicationCode/Commands/CMakeLists_files.cmake +++ b/ApplicationCode/Commands/CMakeLists_files.cmake @@ -6,7 +6,7 @@ endif() set (SOURCE_GROUP_HEADER_FILES ${CEE_CURRENT_LIST_DIR}RicCloseCaseFeature.h -${CEE_CURRENT_LIST_DIR}RicEclipseCaseExecuteScriptFeature.h +${CEE_CURRENT_LIST_DIR}RicExecuteScriptForCasesFeature.h ${CEE_CURRENT_LIST_DIR}RicEclipseCaseNewGroupFeature.h ${CEE_CURRENT_LIST_DIR}RicEclipseCaseNewGroupExec.h ${CEE_CURRENT_LIST_DIR}RicEclipseCasePasteFeature.h @@ -49,7 +49,7 @@ ${CEE_CURRENT_LIST_DIR}RicDeleteItemFeature.h set (SOURCE_GROUP_SOURCE_FILES ${CEE_CURRENT_LIST_DIR}RicCloseCaseFeature.cpp -${CEE_CURRENT_LIST_DIR}RicEclipseCaseExecuteScriptFeature.cpp +${CEE_CURRENT_LIST_DIR}RicExecuteScriptForCasesFeature.cpp ${CEE_CURRENT_LIST_DIR}RicEclipseCaseNewGroupFeature.cpp ${CEE_CURRENT_LIST_DIR}RicEclipseCaseNewGroupExec.cpp ${CEE_CURRENT_LIST_DIR}RicEclipseCasePasteFeature.cpp diff --git a/ApplicationCode/Commands/RicEclipseCaseExecuteScriptFeature.cpp b/ApplicationCode/Commands/RicExecuteScriptForCasesFeature.cpp similarity index 78% rename from ApplicationCode/Commands/RicEclipseCaseExecuteScriptFeature.cpp rename to ApplicationCode/Commands/RicExecuteScriptForCasesFeature.cpp index 79d0f5d21c..59316c4840 100644 --- a/ApplicationCode/Commands/RicEclipseCaseExecuteScriptFeature.cpp +++ b/ApplicationCode/Commands/RicExecuteScriptForCasesFeature.cpp @@ -17,7 +17,7 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RicEclipseCaseExecuteScriptFeature.h" +#include "RicExecuteScriptForCasesFeature.h" #include "RimCase.h" @@ -25,12 +25,12 @@ #include -CAF_CMD_SOURCE_INIT(RicEclipseCaseExecuteScriptFeature, "RicEclipseCaseExecuteScriptFeature"); +CAF_CMD_SOURCE_INIT(RicExecuteScriptForCasesFeature, "RicExecuteScriptForCasesFeature"); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RicEclipseCaseExecuteScriptFeature::isCommandEnabled() +bool RicExecuteScriptForCasesFeature::isCommandEnabled() { std::vector selection; caf::SelectionManager::instance()->objectsByType(&selection); @@ -48,14 +48,15 @@ bool RicEclipseCaseExecuteScriptFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicEclipseCaseExecuteScriptFeature::onActionTriggered(bool isChecked) +void RicExecuteScriptForCasesFeature::onActionTriggered(bool isChecked) { + // Dummy - handled by RiuMainWindow::slotExecuteScriptForSelectedCases() } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicEclipseCaseExecuteScriptFeature::setupActionLook(QAction* actionToSetup) +void RicExecuteScriptForCasesFeature::setupActionLook(QAction* actionToSetup) { - actionToSetup->setText("Execute Script"); + actionToSetup->setText("Execute script"); } diff --git a/ApplicationCode/Commands/RicEclipseCaseExecuteScriptFeature.h b/ApplicationCode/Commands/RicExecuteScriptForCasesFeature.h similarity index 95% rename from ApplicationCode/Commands/RicEclipseCaseExecuteScriptFeature.h rename to ApplicationCode/Commands/RicExecuteScriptForCasesFeature.h index 28ddb6637a..1ed3d82454 100644 --- a/ApplicationCode/Commands/RicEclipseCaseExecuteScriptFeature.h +++ b/ApplicationCode/Commands/RicExecuteScriptForCasesFeature.h @@ -25,7 +25,7 @@ //================================================================================================== /// //================================================================================================== -class RicEclipseCaseExecuteScriptFeature : public caf::CmdFeature +class RicExecuteScriptForCasesFeature : public caf::CmdFeature { CAF_CMD_HEADER_INIT; diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index b0b99773d9..d443545437 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -41,6 +41,9 @@ #include "RimWellPathImport.h" #include "RimCalcScript.h" +#include "RiuMainWindow.h" +#include "RiaApplication.h" + #include "cafPdmUiTreeOrdering.h" #include @@ -579,13 +582,14 @@ void RimProject::actionsBasedOnSelection(QMenu& contextMenu) commandIds << "RicCloseCaseFeature"; commandIds << "RicNewViewFeature"; commandIds << "RicEclipseCaseNewGroupFeature"; - //commandIds << "RicEclipseCaseExecuteScript"; + commandIds << "RicExecuteScriptForCasesFeature"; } else if (dynamic_cast(uiItem)) { commandIds << "RicPasteGeoMechViewsFeature"; commandIds << "RicNewViewFeature"; commandIds << "RicCloseCaseFeature"; + commandIds << "RicExecuteScriptForCasesFeature"; } else if (dynamic_cast(uiItem)) { @@ -663,7 +667,6 @@ void RimProject::actionsBasedOnSelection(QMenu& contextMenu) commandIds << "RicToggleItemsFeature"; } - caf::CmdFeatureManager* commandManager = caf::CmdFeatureManager::instance(); for (int i = 0; i < commandIds.size(); i++) { @@ -671,6 +674,42 @@ void RimProject::actionsBasedOnSelection(QMenu& contextMenu) { contextMenu.addSeparator(); } + else if (commandIds[i] == "RicExecuteScriptForCasesFeature") + { + // Execute script on selection of cases + RiuMainWindow* ruiMainWindow = RiuMainWindow::instance(); + if (ruiMainWindow) + { + std::vector cases; + ruiMainWindow->selectedCases(cases); + + if (cases.size() > 0) + { + QMenu* executeMenu = contextMenu.addMenu("Execute script"); + + RiaApplication* app = RiaApplication::instance(); + RimProject* proj = app->project(); + if (proj && proj->scriptCollection()) + { + RimScriptCollection* rootScriptCollection = proj->scriptCollection(); + + // Root script collection holds a list of subdirectories of user defined script folders + for (size_t i = 0; i < rootScriptCollection->subDirectories.size(); i++) + { + RimScriptCollection* subDir = rootScriptCollection->subDirectories[i]; + + if (subDir) + { + appendScriptItems(executeMenu, subDir); + } + } + } + + contextMenu.addSeparator(); + contextMenu.addMenu(executeMenu); + } + } + } else { caf::CmdFeature* feature = commandManager->getCommandFeature(commandIds[i].toStdString()); @@ -685,6 +724,36 @@ void RimProject::actionsBasedOnSelection(QMenu& contextMenu) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimProject::appendScriptItems(QMenu* menu, RimScriptCollection* scriptCollection) +{ + CVF_ASSERT(menu); + + QDir dir(scriptCollection->directory); + QMenu* subMenu = menu->addMenu(dir.dirName()); + + RiuMainWindow* mainWindow = RiuMainWindow::instance(); + + for (size_t i = 0; i < scriptCollection->calcScripts.size(); i++) + { + RimCalcScript* calcScript = scriptCollection->calcScripts[i]; + QFileInfo fi(calcScript->absolutePath()); + + QString menuText = fi.baseName(); + QAction* scriptAction = subMenu->addAction(menuText, mainWindow, SLOT(slotExecuteScriptForSelectedCases())); + + scriptAction->setData(QVariant(calcScript->absolutePath())); + } + + for (size_t i = 0; i < scriptCollection->subDirectories.size(); i++) + { + RimScriptCollection* subDir = scriptCollection->subDirectories[i]; + + appendScriptItems(subMenu, subDir); + } +} //-------------------------------------------------------------------------------------------------- /// diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index eca5ecbc9c..903ad98f6e 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -91,6 +91,9 @@ protected: virtual void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = ""); +private: + void appendScriptItems(QMenu* menu, RimScriptCollection* scriptCollection); + private: caf::PdmField m_projectFileVersionString; diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp index 7696137980..2e97ef5265 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeView.cpp @@ -628,6 +628,7 @@ void RimUiTreeView::slotExecuteScript() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +// OBSOLETE - see RicExecuteScriptFeature void RimUiTreeView::slotExecuteScriptForSelectedCases() { QAction* action = qobject_cast(sender()); diff --git a/ApplicationCode/UserInterface/RiuMainWindow.cpp b/ApplicationCode/UserInterface/RiuMainWindow.cpp index 1e750d3502..2bb53c3dc1 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationCode/UserInterface/RiuMainWindow.cpp @@ -2253,3 +2253,46 @@ void RiuMainWindow::customMenuRequested(const QPoint& pos) menu.exec(globalPos); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuMainWindow::slotExecuteScriptForSelectedCases() +{ + QAction* action = qobject_cast(sender()); + if (!action) return; + + QString scriptAbsolutePath = action->data().toString(); + + RiaApplication* app = RiaApplication::instance(); + QString octavePath = app->octavePath(); + if (!octavePath.isEmpty()) + { + // TODO: Must rename RimCalcScript::absolutePath to absoluteFileName, as the code below is confusing + // absolutePath() is a function in QFileInfo + + QFileInfo fi(scriptAbsolutePath); + QString octaveFunctionSearchPath = fi.absolutePath(); + + QStringList arguments = app->octaveArguments(); + arguments.append("--path"); + arguments << octaveFunctionSearchPath; + arguments << scriptAbsolutePath; + + std::vector selection; + caf::SelectionManager::instance()->objectsByType(&selection); + + // Get case ID from selected cases in selection model + std::vector caseIdsInSelection; + for (size_t i = 0; i < selection.size(); i++) + { + RimCase* casePtr = selection[i]; + caseIdsInSelection.push_back(casePtr->caseId); + } + + if (caseIdsInSelection.size() > 0) + { + RiaApplication::instance()->launchProcessForMultipleCases(octavePath, arguments, caseIdsInSelection); + } + } +} diff --git a/ApplicationCode/UserInterface/RiuMainWindow.h b/ApplicationCode/UserInterface/RiuMainWindow.h index 9e0fe370e6..586d8734a5 100644 --- a/ApplicationCode/UserInterface/RiuMainWindow.h +++ b/ApplicationCode/UserInterface/RiuMainWindow.h @@ -283,6 +283,7 @@ private slots: void selectedObjectsChanged(); void customMenuRequested(const QPoint& pos); + void slotExecuteScriptForSelectedCases(); // Animation slots