#4578 Add commands for create and clone view

This commit is contained in:
Gaute Lindkvist 2019-08-23 11:25:00 +02:00
parent 3f6d0db07a
commit 2e49670f40
22 changed files with 368 additions and 29 deletions

View File

@ -31,6 +31,8 @@ ${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.h
${CMAKE_CURRENT_LIST_DIR}/RicfExportFlowCharacteristics.h
${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.h
${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.h
${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.h
${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.h
)
set (SOURCE_GROUP_SOURCE_FILES
@ -65,6 +67,8 @@ ${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfExportFlowCharacteristics.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.cpp
${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.cpp
)
list(APPEND CODE_HEADER_FILES

View File

@ -0,0 +1,80 @@
#include "RicfCloneView.h"
#include "RiaApplication.h"
#include "RiaLogging.h"
#include "RicfCreateView.h"
#include "Rim3dView.h"
#include "RimEclipseCase.h"
#include "RimEclipseView.h"
#include "RimGeoMechCase.h"
#include "RimGeoMechView.h"
#include "RimProject.h"
#include "Riu3DMainWindowTools.h"
#include "cafSelectionManager.h"
#include <QAction>
CAF_PDM_SOURCE_INIT(RicfCloneView, "cloneView");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCloneView::RicfCloneView()
{
RICF_InitField(&m_viewId, "viewId", -1, "View Id", "", "", "");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCommandResponse RicfCloneView::execute()
{
RimProject* project = RiaApplication::instance()->project();
std::vector<Rim3dView*> allViews;
project->descendantsIncludingThisOfType(allViews);
for (Rim3dView* view : allViews)
{
if (view->id() == m_viewId())
{
const RimEclipseView* eclipseView = dynamic_cast<const RimEclipseView*>(view);
const RimGeoMechView* geoMechView = dynamic_cast<const RimGeoMechView*>(view);
int newViewId = -1;
if (eclipseView)
{
RimEclipseCase* eclipseCase = eclipseView->eclipseCase();
RimEclipseView* newEclipseView = eclipseCase->createCopyAndAddView(eclipseView);
newViewId = newEclipseView->id();
newEclipseView->loadDataAndUpdate();
eclipseCase->updateConnectedEditors();
Riu3DMainWindowTools::setExpanded(newEclipseView);
}
else if (geoMechView)
{
RimGeoMechCase* geoMechCase = geoMechView->geoMechCase();
RimGeoMechView* newGeoMechView = geoMechCase->createCopyAndAddView(geoMechView);
newViewId = newGeoMechView->id();
view->loadDataAndUpdate();
geoMechCase->updateConnectedEditors();
Riu3DMainWindowTools::setExpanded(view);
}
if (newViewId)
{
RicfCommandResponse response;
response.setResult(new RicfCreateViewResult(newViewId));
return response;
}
}
}
QString error = QString("cloneView: Could not clone view with id %1").arg(m_viewId());
RiaLogging::error(error);
return RicfCommandResponse(RicfCommandResponse::COMMAND_ERROR, error);
}

View File

@ -0,0 +1,41 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RicfCommandObject.h"
#include "cafPdmField.h"
//==================================================================================================
//
//
//
//==================================================================================================
class RicfCloneView : public RicfCommandObject
{
CAF_PDM_HEADER_INIT;
public:
RicfCloneView();
RicfCommandResponse execute() override;
private:
caf::PdmField<int> m_viewId;
};

View File

@ -0,0 +1,85 @@
#include "RicfCreateView.h"
#include "RiaApplication.h"
#include "RiaLogging.h"
#include "Rim3dView.h"
#include "RimEclipseCase.h"
#include "RimEclipseView.h"
#include "RimGeoMechCase.h"
#include "RimGeoMechView.h"
#include "RimProject.h"
#include "Riu3DMainWindowTools.h"
#include "cafSelectionManager.h"
#include <QAction>
CAF_PDM_SOURCE_INIT(RicfCreateViewResult, "createViewResult");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCreateViewResult::RicfCreateViewResult(int viewId /*= -1*/)
{
CAF_PDM_InitObject("view_result", "", "", "");
CAF_PDM_InitField(&this->viewId, "viewId", viewId, "", "", "", "");
}
CAF_PDM_SOURCE_INIT(RicfCreateView, "createView");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCreateView::RicfCreateView()
{
RICF_InitField(&m_caseId, "caseId", -1, "Case Id", "", "", "");
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfCommandResponse RicfCreateView::execute()
{
RimProject* project = RiaApplication::instance()->project();
std::vector<RimCase*> allCases;
project->allCases(allCases);
for (RimCase* rimCase : allCases)
{
if (rimCase->caseId == m_caseId())
{
int viewId = -1;
RimEclipseCase* eclipseCase = dynamic_cast<RimEclipseCase*>(rimCase);
RimGeoMechCase* geoMechCase = dynamic_cast<RimGeoMechCase*>(rimCase);
if (eclipseCase)
{
RimEclipseView* view = eclipseCase->createAndAddReservoirView();
viewId = view->id();
view->loadDataAndUpdate();
eclipseCase->updateConnectedEditors();
Riu3DMainWindowTools::setExpanded(view);
}
else if (geoMechCase)
{
RimGeoMechView* view = geoMechCase->createAndAddReservoirView();
viewId = view->id();
view->loadDataAndUpdate();
geoMechCase->updateConnectedEditors();
Riu3DMainWindowTools::setExpanded(view);
}
if (viewId >= 0)
{
RicfCommandResponse response;
response.setResult(new RicfCreateViewResult(viewId));
return response;
}
}
}
QString error = QString("createView: Could not create view for case id %1").arg(m_caseId());
RiaLogging::error(error);
return RicfCommandResponse(RicfCommandResponse::COMMAND_ERROR, error);
}

View File

@ -0,0 +1,52 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2019- Equinor 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RicfCommandObject.h"
#include "cafPdmField.h"
class RicfCreateViewResult : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
RicfCreateViewResult(int viewId = -1);
public:
caf::PdmField<int> viewId;
};
//==================================================================================================
//
//
//
//==================================================================================================
class RicfCreateView : public RicfCommandObject
{
CAF_PDM_HEADER_INIT;
public:
RicfCreateView();
RicfCommandResponse execute() override;
private:
caf::PdmField<int> m_caseId;
};

View File

@ -70,7 +70,6 @@ RicfCommandResponse RicfLoadCase::execute()
return RicfCommandResponse(RicfCommandResponse::COMMAND_ERROR, error);
}
CAF_ASSERT(fileCaseIdMap.size() == 1u);
RicfLoadCaseResult result;
RicfCommandResponse response;
response.setResult(new RicfLoadCaseResult(fileCaseIdMap.begin()->second));
return response;

View File

@ -256,6 +256,16 @@ message ExportFlowInfoRequest
double aquiferCellThreshold = 7;
}
message CreateViewRequest
{
int32 caseId = 1;
}
message CloneViewRequest
{
int32 viewId = 1;
}
/* CommandParams handles both command name and parameters in one.
* The message type and content is used as parameters and
* the name of the variable is used to find the command name. */
@ -296,8 +306,8 @@ message CommandParams
CreateGridCaseGroupRequest createGridCaseGroup = 27;
CreateStatisticsCaseRequest createStatisticsCase = 28;
ExportFlowInfoRequest exportFlowCharacteristics = 29;
CreateViewRequest createView = 30;
CloneViewRequest cloneView = 31;
}
}
@ -312,6 +322,11 @@ message CreateStatisticsCaseResult
int32 caseId = 1;
}
message CreateViewResult
{
int32 viewId = 1;
}
/* Command reply handles the return values for the generic command
* The name of the variable is used to map to the cafPdmObject classKeyword */
message CommandReply
@ -322,6 +337,7 @@ message CommandReply
CaseRequest loadCaseResult = 2;
GridCaseGroupResult createGridCaseGroupResult = 3;
CreateStatisticsCaseResult createStatisticsCaseResult = 4;
CreateViewResult createViewResult = 5;
}
}

View File

@ -1,10 +1,11 @@
import grpc
import os
import sys
from .Grid import Grid
from .Properties import Properties
from .PdmObject import PdmObject
from .View import View
from rips.Commands import Commands
from rips.Grid import Grid
from rips.Properties import Properties
from rips.PdmObject import PdmObject
from rips.View import View
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'generated'))
@ -156,3 +157,8 @@ class Case (PdmObject):
return viewObject
return None
def createView(self):
"""Create a new view in the current case"""
viewId = Commands(self.channel).createView(self.id)
return self.view(viewId)

View File

@ -7,7 +7,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'generated'))
from Definitions_pb2 import Empty
import Commands_pb2 as Cmd
import Commands_pb2_grpc as CmdRpc
from .Case import Case
import rips.Case
class Commands:
"""Command executor which can run ResInsight Command File commands nearly verbatim
@ -65,7 +65,7 @@ class Commands:
"""
commandReply = self.__execute(loadCase=Cmd.FilePathRequest(path=path))
return Case(self.channel, commandReply.loadCaseResult.id)
return rips.Case(self.channel, commandReply.loadCaseResult.id)
def replaceCase(self, newGridFile, caseId=0):
"""Replace the given case with a new case loaded from file
@ -276,3 +276,9 @@ class Commands:
fileName=fileName,
minimumCommunication = minimumCommunication,
aquiferCellThreshold = aquiferCellThreshold))
def createView(self, caseId):
return self.__execute(createView=Cmd.CreateViewRequest(caseId=caseId)).createViewResult.viewId
def cloneView(self, viewId):
return self.__execute(cloneView=Cmd.CloneViewRequest(viewId=viewId)).createViewResult.viewId

View File

@ -1,8 +1,8 @@
import grpc
import os
import sys
from .PdmObject import PdmObject
from .View import View
from rips.PdmObject import PdmObject
from rips.View import View
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'generated'))

View File

@ -12,8 +12,8 @@ from Definitions_pb2 import Empty
import RiaVersionInfo
from .Commands import Commands
from .Project import Project
from rips.Commands import Commands
from rips.Project import Project
class Instance:
"""The ResInsight Instance class. Use to launch or find existing ResInsight instances

View File

@ -2,11 +2,11 @@ import grpc
import os
import sys
from .Case import Case
from .Commands import Commands
from .GridCaseGroup import GridCaseGroup
from .PdmObject import PdmObject
from .View import View
from rips.Case import Case
from rips.Commands import Commands
from rips.GridCaseGroup import GridCaseGroup
from rips.PdmObject import PdmObject
from rips.View import View
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'generated'))

View File

@ -1,5 +1,6 @@
###################################################################################
# This example will connect to ResInsight, retrieve a list of cases and print info
# Also creates a new view for all cases
###################################################################################
# Import the ResInsight Processing Server Module
@ -15,4 +16,7 @@ if resInsight is not None:
for case in cases:
print("Case name: " + case.name)
print("Case grid path: " + case.gridPath())
# Create a new view
view = case.createView()

View File

@ -1,6 +1,7 @@
#############################################################
# This example will alter the views of all cases
# By setting the background color and toggle the grid box
# Also clones the first view
#############################################################
import rips
# Connect to ResInsight instance
@ -18,4 +19,9 @@ if resInsight is not None:
view.setShowGridBox(not view.showGridBox())
view.setBackgroundColor("#3388AA")
# Update the view in ResInsight
view.update()
view.update()
# Clone the first view
newView = views[0].clone()
view.setShowGridBox(False)
newView.setBackgroundColor("#FFAA33")
newView.update()

View File

@ -1,4 +1,6 @@
from .PdmObject import PdmObject
import rips.Case
from rips.Commands import Commands
from rips.PdmObject import PdmObject
class View (PdmObject):
"""ResInsight view class
@ -74,4 +76,18 @@ class View (PdmObject):
if selectionMode == 'FLOW_TR_BY_SELECTION':
cellResult.setValue("SelectedInjectorTracers", injectors)
cellResult.setValue("SelectedProducerTracers", producers)
cellResult.update()
cellResult.update()
def case(self):
"""Get the case the view belongs to"""
pdmCase = self.ancestor("EclipseCase")
if pdmCase is None:
pdmCase = self.ancestor("ResInsightGeoMechCase")
if pdmCase is None:
return None
return rips.Case(self.channel, pdmCase.getValue("CaseId"))
def clone(self):
"""Clone the current view"""
viewId = Commands(self.channel).cloneView(self.id)
return self.case().view(viewId)

View File

@ -3,7 +3,6 @@ from .Case import Case
from .Grid import Grid
from .Properties import Properties
from .Instance import Instance
from .App import App
from .Commands import Commands
from .PdmObject import PdmObject
from .View import View

View File

@ -141,9 +141,6 @@ Rim3dView::Rim3dView(void)
m_measurementPartManager = new RivMeasurementPartMgr(this);
this->setAs3DViewMdiWindow();
RimProject* proj = RiaApplication::instance()->project();
proj->assignViewIdToView(this);
}
//--------------------------------------------------------------------------------------------------

View File

@ -271,6 +271,8 @@ void RimEclipseCase::initAfterRead()
RimEclipseView* RimEclipseCase::createAndAddReservoirView()
{
RimEclipseView* rimEclipseView = new RimEclipseView();
RiaApplication::instance()->project()->assignViewIdToView(rimEclipseView);
rimEclipseView->setEclipseCase(this);
// Set default values
@ -306,7 +308,7 @@ RimEclipseView* RimEclipseCase::createCopyAndAddView(const RimEclipseView* sourc
RimEclipseView* rimEclipseView = dynamic_cast<RimEclipseView*>(
sourceView->xmlCapability()->copyByXmlSerialization(caf::PdmDefaultObjectFactory::instance()));
CVF_ASSERT(rimEclipseView);
RiaApplication::instance()->project()->assignViewIdToView(rimEclipseView);
rimEclipseView->setEclipseCase(this);
caf::PdmDocument::updateUiIconStateRecursively(rimEclipseView);

View File

@ -181,13 +181,38 @@ void RimGeoMechCase::reloadDataAndUpdate()
RimGeoMechView* RimGeoMechCase::createAndAddReservoirView()
{
RimGeoMechView* gmv = new RimGeoMechView();
RiaApplication::instance()->project()->assignViewIdToView(gmv);
gmv->setGeoMechCase(this);
geoMechViews.push_back(gmv);
return gmv;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimGeoMechView* RimGeoMechCase::createCopyAndAddView(const RimGeoMechView* sourceView)
{
RimGeoMechView* rimGeoMechView = dynamic_cast<RimGeoMechView*>(
sourceView->xmlCapability()->copyByXmlSerialization(caf::PdmDefaultObjectFactory::instance()));
CVF_ASSERT(rimGeoMechView);
RiaApplication::instance()->project()->assignViewIdToView(rimGeoMechView);
rimGeoMechView->setGeoMechCase(this);
caf::PdmDocument::updateUiIconStateRecursively(rimGeoMechView);
geoMechViews.push_back(rimGeoMechView);
// Resolve references after reservoir view has been inserted into Rim structures
rimGeoMechView->resolveReferencesRecursively();
rimGeoMechView->initAfterReadRecursively();
return rimGeoMechView;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -67,6 +67,7 @@ public:
void reloadDataAndUpdate();
RimGeoMechView* createAndAddReservoirView();
RimGeoMechView* createCopyAndAddView(const RimGeoMechView* sourceView);
void updateFilePathsFromProjectPath(const QString& projectPath, const QString& oldProjectPath) override;

View File

@ -682,7 +682,7 @@ void RimGeoMechView::convertCameraPositionFromOldProjectFiles()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimGeoMechCase* RimGeoMechView::geoMechCase()
RimGeoMechCase* RimGeoMechView::geoMechCase() const
{
return m_geomechCase;
}

View File

@ -64,7 +64,7 @@ public:
~RimGeoMechView(void) override;
void setGeoMechCase(RimGeoMechCase* gmCase);
RimGeoMechCase* geoMechCase();
RimGeoMechCase* geoMechCase() const;
RimCase* ownerCase() const override;
caf::PdmChildField<RimGeoMechCellColors*> cellResult;