From cf2ae4ffb891fae768802f234dffb2fe0312d356 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 17 Feb 2025 18:27:16 +0100 Subject: [PATCH] Python: Add support for manipulation of camera position * Remove debug output in the views function * Add scripting support for Mat4d * Add scripting support to camera * Separate updates for background color and font size --- .../Application/RiaGuiApplication.cpp | 2 +- .../ProjectDataModel/Rim3dView.cpp | 65 +++++++++++++++---- .../ProjectDataModel/Rim3dView.h | 13 ++-- ...cafPdmFieldScriptingCapabilityCvfVec3d.cpp | 50 ++++++++++++++ .../cafPdmFieldScriptingCapabilityCvfVec3d.h | 15 +++++ .../cafPdmScripting/cafPdmPythonGenerator.cpp | 1 + GrpcInterface/Python/rips/case.py | 1 - GrpcInterface/RiaGrpcPdmObjectService.cpp | 7 +- 8 files changed, 131 insertions(+), 23 deletions(-) diff --git a/ApplicationLibCode/Application/RiaGuiApplication.cpp b/ApplicationLibCode/Application/RiaGuiApplication.cpp index caaae80e68..9d646fac08 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.cpp +++ b/ApplicationLibCode/Application/RiaGuiApplication.cpp @@ -1456,7 +1456,7 @@ void RiaGuiApplication::applyGuiPreferences( const RiaPreferences* ( applySettingsToAllViews || rim3dView->backgroundColor() == oldPreferences->defaultViewerBackgroundColor() ) ) { rim3dView->setBackgroundColor( m_preferences->defaultViewerBackgroundColor() ); - rim3dView->applyBackgroundColorAndFontChanges(); + rim3dView->applyFontChanges(); } if ( oldPreferences && ( applySettingsToAllViews || rim3dView->scaleZ() == oldPreferences->defaultScaleFactorZ() ) ) diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp index d299ad553a..7148d9fbd1 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp @@ -57,6 +57,7 @@ #include "cafFrameAnimationControl.h" #include "cafPdmFieldScriptingCapability.h" #include "cafPdmFieldScriptingCapabilityCvfColor3.h" +#include "cafPdmFieldScriptingCapabilityCvfVec3d.h" #include "cafPdmUiComboBoxEditor.h" #include "cvfCamera.h" #include "cvfModelBasicList.h" @@ -112,6 +113,17 @@ Rim3dView::Rim3dView() CAF_PDM_InitField( &m_cameraPointOfInterest, "CameraPointOfInterest", cvf::Vec3d::ZERO, "" ); m_cameraPointOfInterest.uiCapability()->setUiHidden( true ); + CAF_PDM_InitScriptableFieldWithScriptKeywordNoDefault( &m_cameraPositionProxy, "CameraPositionProxy", "CameraMatrix", "Camera Matrix" ); + m_cameraPositionProxy.registerGetMethod( this, &Rim3dView::cameraPosition ); + m_cameraPositionProxy.registerSetMethod( this, &Rim3dView::setCameraPosition ); + + CAF_PDM_InitScriptableFieldWithScriptKeywordNoDefault( &m_cameraPointOfInterestProxy, + "CameraPointOfInterestProxy", + "CameraPointOfInterest", + "Camera Point of Interest" ); + m_cameraPointOfInterestProxy.registerGetMethod( this, &Rim3dView::cameraPointOfInterest ); + m_cameraPointOfInterestProxy.registerSetMethod( this, &Rim3dView::setCameraPointOfInterest ); + CAF_PDM_InitScriptableField( &isPerspectiveView, "PerspectiveProjection", true, "Perspective Projection" ); double defaultScaleFactor = preferences->defaultScaleFactorZ(); @@ -829,6 +841,8 @@ void Rim3dView::setupBeforeSave() { if ( m_viewer ) { + // The update of these fields is also done in cameraPosition() and cameraPointOfInterest(). When the + // project is saved to file, these functions are not used, so we need to update the fields here. m_cameraPosition = m_viewer->mainCamera()->viewMatrix(); m_cameraPointOfInterest = m_viewer->pointOfInterest(); } @@ -993,17 +1007,22 @@ void Rim3dView::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const m_viewer->update(); } } - else if ( changedField == &m_backgroundColor || changedField == &m_fontSize ) + else if ( changedField == &m_backgroundColor ) { - if ( changedField == &m_fontSize ) + if ( viewer() != nullptr ) { - auto fontHolderChildren = descendantsOfType(); - for ( auto fontHolder : fontHolderChildren ) - { - fontHolder->updateFonts(); - } + viewer()->mainCamera()->viewport()->setClearColor( cvf::Color4f( backgroundColor() ) ); } - this->applyBackgroundColorAndFontChanges(); + this->scheduleCreateDisplayModelAndRedraw(); + } + else if ( changedField == &m_fontSize ) + { + auto fontHolderChildren = descendantsOfType(); + for ( auto fontHolder : fontHolderChildren ) + { + fontHolder->updateFonts(); + } + this->applyFontChanges(); this->updateConnectedEditors(); } else if ( changedField == &maximumFrameRate ) @@ -1035,6 +1054,13 @@ void Rim3dView::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const m_viewer->update(); } } + else if ( changedField == &m_cameraPositionProxy || changedField == &m_cameraPointOfInterestProxy ) + { + if ( m_viewer ) + { + m_viewer->repaint(); + } + } } //-------------------------------------------------------------------------------------------------- @@ -1342,11 +1368,10 @@ void Rim3dView::setShowGridBox( bool showGridBox ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void Rim3dView::applyBackgroundColorAndFontChanges() +void Rim3dView::applyFontChanges() { if ( viewer() != nullptr ) { - viewer()->mainCamera()->viewport()->setClearColor( cvf::Color4f( backgroundColor() ) ); viewer()->updateFonts( fontSize() ); } updateGridBoxData(); @@ -1370,7 +1395,7 @@ int Rim3dView::fontSize() const //-------------------------------------------------------------------------------------------------- void Rim3dView::updateFonts() { - applyBackgroundColorAndFontChanges(); + applyFontChanges(); } //-------------------------------------------------------------------------------------------------- @@ -1510,6 +1535,11 @@ QList Rim3dView::calculateValueOptions( const caf::PdmFi //-------------------------------------------------------------------------------------------------- cvf::Mat4d Rim3dView::cameraPosition() const { + if ( m_viewer && m_viewer->mainCamera() ) + { + m_cameraPosition = m_viewer->mainCamera()->viewMatrix(); + } + return m_cameraPosition(); } @@ -1518,6 +1548,11 @@ cvf::Mat4d Rim3dView::cameraPosition() const //-------------------------------------------------------------------------------------------------- cvf::Vec3d Rim3dView::cameraPointOfInterest() const { + if ( m_viewer ) + { + m_cameraPointOfInterest = m_viewer->pointOfInterest(); + } + return m_cameraPointOfInterest(); } @@ -1545,6 +1580,10 @@ QWidget* Rim3dView::viewWidget() void Rim3dView::setCameraPosition( const cvf::Mat4d& cameraPosition ) { m_cameraPosition = cameraPosition; + if ( m_viewer && m_viewer->mainCamera() ) + { + m_viewer->mainCamera()->setViewMatrix( m_cameraPosition ); + } } //-------------------------------------------------------------------------------------------------- @@ -1553,6 +1592,10 @@ void Rim3dView::setCameraPosition( const cvf::Mat4d& cameraPosition ) void Rim3dView::setCameraPointOfInterest( const cvf::Vec3d& cameraPointOfInterest ) { m_cameraPointOfInterest = cameraPointOfInterest; + if ( m_viewer ) + { + m_viewer->setPointOfInterest( m_cameraPointOfInterest ); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.h b/ApplicationLibCode/ProjectDataModel/Rim3dView.h index 7b77fa9d97..ea601cdc64 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.h +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.h @@ -133,10 +133,10 @@ public: void setBackgroundColor( const cvf::Color3f& newBackgroundColor ); cvf::Color3f backgroundColor() const override; // Implementation of RiuViewerToViewInterface - void applyBackgroundColorAndFontChanges(); int fontSize() const override; void updateFonts() override; + void applyFontChanges(); void disableLighting( bool disable ); bool isLightingDisabled() const; @@ -281,7 +281,6 @@ protected: cvf::ref m_screenSpaceModel; caf::PdmField m_scaleZ; - caf::PdmField m_customScaleZ; caf::PdmChildField m_annotationCollection; @@ -329,13 +328,19 @@ private: caf::PdmField m_id; caf::PdmChildField m_nameConfig; caf::PdmField m_disableLighting; - caf::PdmField m_cameraPosition; - caf::PdmField m_cameraPointOfInterest; caf::PdmField m_backgroundColor; caf::PdmField m_showGridBox; caf::PdmField m_showZScaleLabel; caf::PdmPtrField m_comparisonView; + // Camera position and point of interest. The member variables are mutable to allow for setting them from const methods. + // The camera position and point of interest can change rapidly as the user interacts with the 3D view. Only update the Pdm field values + // when the application requests the camera position or point of interest. + mutable caf::PdmField m_cameraPosition; + mutable caf::PdmField m_cameraPointOfInterest; + caf::PdmProxyValueField m_cameraPointOfInterestProxy; + caf::PdmProxyValueField m_cameraPositionProxy; + caf::PdmField m_useCustomAnnotationStrategy; caf::PdmField> m_annotationStrategy; caf::PdmField m_annotationCountHint; diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.cpp b/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.cpp index e5ef4211b4..39492f1caf 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.cpp +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.cpp @@ -80,3 +80,53 @@ void PdmFieldScriptingCapabilityIOHandler>::readFromField( PdmFieldScriptingCapabilityIOHandler>::readFromField( fieldVectorValue, outputStream, quoteStrings ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmFieldScriptingCapabilityIOHandler>::writeToField( cvf::Matrix4& fieldValue, + QTextStream& inputStream, + caf::PdmScriptIOMessages* errorMessageContainer, + bool stringsAreQuoted ) +{ + std::vector fieldVectorValue; + PdmFieldScriptingCapabilityIOHandler>::writeToField( fieldVectorValue, + inputStream, + errorMessageContainer, + stringsAreQuoted ); + if ( fieldVectorValue.size() == 16u ) + { + for ( int row = 0; row < 4; ++row ) + { + for ( int col = 0; col < 4; ++col ) + { + fieldValue( row, col ) = fieldVectorValue[row * 4 + col]; + } + } + } + else + { + QString errMsg = QString( "Expected 16 values, got %1" ).arg( fieldVectorValue.size() ); + errorMessageContainer->addError( errMsg ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void PdmFieldScriptingCapabilityIOHandler>::readFromField( const cvf::Matrix4& fieldValue, + QTextStream& outputStream, + bool quoteStrings, + bool quoteNonBuiltin ) +{ + std::vector fieldVectorValue( 16u ); + for ( int row = 0; row < 4; ++row ) + { + for ( int col = 0; col < 4; ++col ) + { + fieldVectorValue[row * 4 + col] = fieldValue( row, col ); + } + } + + PdmFieldScriptingCapabilityIOHandler>::readFromField( fieldVectorValue, outputStream, quoteStrings ); +} diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.h b/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.h index 7be7a058b7..7f239bc619 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.h +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapabilityCvfVec3d.h @@ -37,6 +37,7 @@ #include "cafPdmFieldScriptingCapability.h" +#include "cvfMatrix4.h" #include "cvfVector3.h" namespace caf @@ -53,4 +54,18 @@ struct PdmFieldScriptingCapabilityIOHandler> bool quoteStrings = true, bool quoteNonBuiltins = false ); }; + +template <> +struct PdmFieldScriptingCapabilityIOHandler> +{ + static void writeToField( cvf::Matrix4& fieldValue, + QTextStream& inputStream, + PdmScriptIOMessages* errorMessageContainer, + bool stringsAreQuoted = true ); + static void readFromField( const cvf::Matrix4& fieldValue, + QTextStream& outputStream, + bool quoteStrings = true, + bool quoteNonBuiltins = false ); +}; + } // namespace caf diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp b/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp index a1f2773def..094193f302 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp @@ -560,6 +560,7 @@ QString PdmPythonGenerator::dataTypeString( const PdmFieldHandle* field, bool us #ifndef CAF_EXCLUDE_CVF builtins[QString::fromStdString( typeid( cvf::Vec3d ).name() )] = "List[float]"; builtins[QString::fromStdString( typeid( cvf::Color3f ).name() )] = "str"; + builtins[QString::fromStdString( typeid( cvf::Mat4d ).name() )] = "List[float]"; #endif bool foundBuiltin = false; diff --git a/GrpcInterface/Python/rips/case.py b/GrpcInterface/Python/rips/case.py index 2aee07b09c..522c52cce3 100644 --- a/GrpcInterface/Python/rips/case.py +++ b/GrpcInterface/Python/rips/case.py @@ -344,7 +344,6 @@ def views(self): views = project.views() views_for_case = [] for view_object in views: - view_object.print_object_info() if view_object.id == self.id: views_for_case.append(view_object) return views_for_case diff --git a/GrpcInterface/RiaGrpcPdmObjectService.cpp b/GrpcInterface/RiaGrpcPdmObjectService.cpp index de2a0aff45..f489b5dbd7 100644 --- a/GrpcInterface/RiaGrpcPdmObjectService.cpp +++ b/GrpcInterface/RiaGrpcPdmObjectService.cpp @@ -22,7 +22,6 @@ #include "RiaGrpcCallbacks.h" #include "RiaGrpcHelper.h" -#include "Rim3dView.h" #include "RimEclipseResultDefinition.h" #include "RimProject.h" @@ -31,6 +30,7 @@ #include "cafPdmObjectMethod.h" #include "cafPdmObjectScriptingCapability.h" #include "cafPdmObjectScriptingCapabilityRegister.h" +#include "cafPdmProxyValueField.h" using namespace rips; @@ -448,11 +448,6 @@ grpc::Status RiaGrpcPdmObjectService::UpdateExistingPdmObject( grpc::ServerConte matchingObject->updateAllRequiredEditors(); RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); - Rim3dView* view = dynamic_cast( matchingObject ); - if ( view ) - { - view->applyBackgroundColorAndFontChanges(); - } return grpc::Status::OK; } return grpc::Status( grpc::NOT_FOUND, "PdmObject not found" );