diff --git a/ApplicationLibCode/CommandFileInterface/RicfSetTimeStep.cpp b/ApplicationLibCode/CommandFileInterface/RicfSetTimeStep.cpp index b9bb8a0148..516255811d 100644 --- a/ApplicationLibCode/CommandFileInterface/RicfSetTimeStep.cpp +++ b/ApplicationLibCode/CommandFileInterface/RicfSetTimeStep.cpp @@ -18,13 +18,11 @@ #include "RicfSetTimeStep.h" -#include "Rim3dView.h" -#include "RimEclipseCase.h" -#include "RimEclipseCaseCollection.h" -#include "RimOilField.h" -#include "RimProject.h" +#include "RicfCommandForwarding.h" -#include "RiaLogging.h" +#include "Rim3dView.h" +#include "RimCase.h" +#include "RimcGridView.h" #include "cafPdmFieldScriptingCapability.h" @@ -69,47 +67,31 @@ void RicfSetTimeStep::setTimeStepIndex( int timeStepIndex ) //-------------------------------------------------------------------------------------------------- caf::PdmScriptResponse RicfSetTimeStep::execute() { - RimCase* rimCase = nullptr; + const QString commandName = classKeyword(); + auto rimCase = RicfForwarding::findCase( m_caseId() ); + if ( !rimCase ) return RicfForwarding::errorResponse( rimCase.error(), commandName ); + + // A view id of -1 applies the time step to all views of the case + std::vector views; + if ( m_viewId() == -1 ) { - std::vector allCases = RimProject::current()->allGridCases(); - - bool foundCase = false; - for ( RimCase* c : allCases ) - { - if ( c->caseId() == m_caseId ) - { - rimCase = c; - foundCase = true; - break; - } - } - if ( !foundCase ) - { - QString error = QString( "setTimeStep: Could not find case with ID %1" ).arg( m_caseId() ); - RiaLogging::error( error.toStdString() ); - return caf::PdmScriptResponse( caf::PdmScriptResponse::COMMAND_ERROR, error ); - } + views = rimCase.value()->views(); + } + else + { + auto view = RicfForwarding::findView( rimCase.value(), m_viewId() ); + if ( !view ) return RicfForwarding::errorResponse( view.error(), commandName ); + views.push_back( view.value() ); } - int maxTimeStep = rimCase->timeStepStrings().size() - 1; - if ( m_timeStepIndex() > maxTimeStep ) + for ( Rim3dView* view : views ) { - QString error = QString( "setTimeStep: Step %1 is larger than the maximum of %2 for case %3" ) - .arg( m_timeStepIndex() ) - .arg( maxTimeStep ) - .arg( m_caseId() ); - RiaLogging::error( error.toStdString() ); - return caf::PdmScriptResponse( caf::PdmScriptResponse::COMMAND_ERROR, error ); - } + Rim3dView_setTimeStep method( view ); + method.setTimeStep( m_timeStepIndex() ); - for ( Rim3dView* view : rimCase->views() ) - { - if ( m_viewId() == -1 || view->id() == m_viewId() ) - { - view->setCurrentTimeStepAndUpdate( m_timeStepIndex ); - view->createDisplayModelAndRedraw(); - } + auto result = method.execute(); + if ( !result ) return RicfForwarding::errorResponse( result.error(), commandName ); } return caf::PdmScriptResponse(); diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcCase.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcCase.cpp index 88802bdf4d..81a2d4ec64 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcCase.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcCase.cpp @@ -46,12 +46,19 @@ RimCase_replaceGrid::RimCase_replaceGrid( caf::PdmObjectHandle* self ) { CAF_PDM_InitObject( "Replace Grid", "", "", "Replace the grid file of the case and reload the project" ); - CAF_PDM_InitScriptableField( &m_newGridFile, "NewGridFile", QString(), "New Grid File", "", "Path to the new grid file (EGRID, GRID, GRDECL or ODB)" ); + CAF_PDM_InitScriptableField( &m_newGridFile, + "NewGridFile", + QString(), + "New Grid File", + "", + "", + "Path to the new grid file (EGRID, GRID, GRDECL or ODB)" ); CAF_PDM_InitScriptableField( &m_projectFile, "ProjectFile", QString(), "Project File", "", + "", "Optional project file to reload. Defaults to the current project file." ); } diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.cpp index 169769713f..d1a8a55915 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.cpp @@ -24,6 +24,7 @@ #include "Polygons/RimPolygon.h" #include "Polygons/RimPolygonInViewCollection.h" #include "Rim3dView.h" +#include "RimCase.h" #include "RimEclipseCase.h" #include "RimEclipseView.h" #include "RimGeoMechCase.h" @@ -264,3 +265,50 @@ QString Rim3dView_clone::classKeywordReturnedType() const { return Rim3dView::classKeywordStatic(); } + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( Rim3dView, Rim3dView_setTimeStep, "setTimeStep" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +Rim3dView_setTimeStep::Rim3dView_setTimeStep( caf::PdmObjectHandle* self ) + : caf::PdmVoidObjectMethod( self ) +{ + CAF_PDM_InitObject( "Set Time Step", "", "", "Set the current time step of the view" ); + + CAF_PDM_InitScriptableField( &m_timeStep, "TimeStep", 0, "Time Step", "", "", "Zero-based time step index" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void Rim3dView_setTimeStep::setTimeStep( int timeStep ) +{ + m_timeStep = timeStep; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::expected Rim3dView_setTimeStep::execute() +{ + auto* view = self(); + if ( !view ) return std::unexpected( "No view is available." ); + + RimCase* rimCase = view->ownerCase(); + if ( !rimCase ) return std::unexpected( "The view has no case." ); + + const int maxTimeStep = static_cast( rimCase->timeStepStrings().size() ) - 1; + if ( m_timeStep() < 0 || m_timeStep() > maxTimeStep ) + { + return std::unexpected( QString( "Time step %1 is out of range [0, %2] for case '%3'" ) + .arg( m_timeStep() ) + .arg( maxTimeStep ) + .arg( rimCase->caseUserDescription() ) ); + } + + view->setCurrentTimeStepAndUpdate( m_timeStep() ); + view->createDisplayModelAndRedraw(); + + return nullptr; +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.h b/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.h index 789b769b81..0b56959426 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcGridView.h @@ -109,3 +109,21 @@ public: std::expected execute() override; QString classKeywordReturnedType() const override; }; + +//================================================================================================== +/// Set the current time step of the view and redraw. +//================================================================================================== +class Rim3dView_setTimeStep : public caf::PdmVoidObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + Rim3dView_setTimeStep( caf::PdmObjectHandle* self ); + + void setTimeStep( int timeStep ); + + std::expected execute() override; + +private: + caf::PdmField m_timeStep; +}; diff --git a/GrpcInterface/Python/rips/view.py b/GrpcInterface/Python/rips/view.py index b1f45d94ea..f7e84b47a8 100644 --- a/GrpcInterface/Python/rips/view.py +++ b/GrpcInterface/Python/rips/view.py @@ -82,17 +82,6 @@ def apply_flow_diagnostics_cell_result( cell_result.update() -@add_method(View) -def set_time_step(self, time_step): - """Set the time step for current view""" - case_id = self.case().id - return self._execute_command( - setTimeStep=Cmd.SetTimeStepParams( - caseId=case_id, viewId=self.id, timeStep=time_step - ) - ) - - @add_method(View) def export_sim_well_fracture_completions( self, time_step, simulation_well_names, file_split, compdat_export