From 5217ab5c8b2c7b59c5268bc814320e0892e0b0f5 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Mon, 4 Mar 2024 07:23:26 +0100 Subject: [PATCH] Use signal to notify listeners when coordinates of a polygon changes --- .../ProjectDataModel/Polygons/RimPolygon.cpp | 12 ++++-- .../ProjectDataModel/Polygons/RimPolygon.h | 1 + .../Polygons/RimPolygonCollection.cpp | 12 +++++- .../Polygons/RimPolygonCollection.h | 1 + .../Polygons/RimPolygonInView.cpp | 40 ++++++++++++------- .../Polygons/RimPolygonInView.h | 4 +- .../Polygons/RimPolygonInViewCollection.cpp | 1 + 7 files changed, 52 insertions(+), 19 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp index ab5d4ac234..e160e457d9 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp @@ -41,6 +41,7 @@ CAF_PDM_SOURCE_INIT( RimPolygon, "RimPolygon" ); //-------------------------------------------------------------------------------------------------- RimPolygon::RimPolygon() : objectChanged( this ) + , coordinatesChanged( this ) { CAF_PDM_InitObject( "Polygon", ":/PolylinesFromFile16x16.png" ); @@ -83,8 +84,14 @@ void RimPolygon::uiOrderingForLocalPolygon( QString uiConfigName, caf::PdmUiOrde //-------------------------------------------------------------------------------------------------- void RimPolygon::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const { + menuBuilder << "RicDuplicatePolygonFeature"; menuBuilder << "RicNewPolygonIntersectionFeature"; menuBuilder << "RicNewPolygonFilterFeature"; + menuBuilder << "Separator"; + menuBuilder << "RicExportPolygonCsvFeature"; + menuBuilder << "RicExportPolygonPolFeature"; + menuBuilder << "Separator"; + menuBuilder << "RicSimplifyPolygonFeature"; } //-------------------------------------------------------------------------------------------------- @@ -93,8 +100,6 @@ void RimPolygon::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) cons void RimPolygon::setPointsInDomainCoords( const std::vector& points ) { m_pointsInDomainCoords = points; - - objectChanged.send(); } //-------------------------------------------------------------------------------------------------- @@ -187,13 +192,14 @@ void RimPolygon::fieldChangedByUi( const caf::PdmFieldHandle* changedField, cons { if ( changedField == &m_pointsInDomainCoords ) { + coordinatesChanged.send(); objectChanged.send(); } if ( changedField == &m_editPolygonButton ) { auto activeView = RiaApplication::instance()->activeReservoirView(); - RimPolygonTools::selectAndActivatePolygonInView( this, activeView ); + RimPolygonTools::activate3dEditOfPolygonInView( this, activeView ); m_editPolygonButton = false; diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h index 2df12c2d3b..f0eaa16c53 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h @@ -40,6 +40,7 @@ class RimPolygon : public RimNamedObject, public RimPolylinesDataInterface public: caf::Signal<> objectChanged; + caf::Signal<> coordinatesChanged; public: RimPolygon(); diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp index 9b0d843515..3905598723 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp @@ -52,10 +52,20 @@ void RimPolygonCollection::loadData() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimPolygon* RimPolygonCollection::appendUserDefinedPolygon() +RimPolygon* RimPolygonCollection::createUserDefinedPolygon() { auto newPolygon = new RimPolygon(); newPolygon->setName( "Polygon " + QString::number( userDefinedPolygons().size() + 1 ) ); + + return newPolygon; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPolygon* RimPolygonCollection::appendUserDefinedPolygon() +{ + auto newPolygon = createUserDefinedPolygon(); addUserDefinedPolygon( newPolygon ); return newPolygon; diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h index 7898cf20c1..aad69d97dc 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h @@ -36,6 +36,7 @@ public: RimPolygonCollection(); void loadData(); + RimPolygon* createUserDefinedPolygon(); RimPolygon* appendUserDefinedPolygon(); void addUserDefinedPolygon( RimPolygon* polygon ); void deleteUserDefinedPolygons(); diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp index 570f530590..713077d2c1 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp @@ -90,18 +90,10 @@ RimPolygon* RimPolygonInView::polygon() const //-------------------------------------------------------------------------------------------------- void RimPolygonInView::setPolygon( RimPolygon* polygon ) { - if ( m_polygon ) - { - m_polygon->objectChanged.disconnect( this ); - } - - if ( polygon ) - { - polygon->objectChanged.connect( this, &RimPolygonInView::onObjectChanged ); - } - m_polygon = polygon; + connectSignals(); + updateTargetsFromPolygon(); } @@ -244,6 +236,18 @@ void RimPolygonInView::updatePolygonFromTargets() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolygonInView::connectSignals() +{ + if ( m_polygon ) + { + m_polygon->objectChanged.connect( this, &RimPolygonInView::onObjectChanged ); + m_polygon->coordinatesChanged.connect( this, &RimPolygonInView::onCoordinatesChanged ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -381,15 +385,23 @@ void RimPolygonInView::onObjectChanged( const caf::SignalEmitter* emitter ) updateVisualization(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolygonInView::onCoordinatesChanged( const caf::SignalEmitter* emitter ) +{ + updateTargetsFromPolygon(); + + updateConnectedEditors(); + updateVisualization(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimPolygonInView::initAfterRead() { - if ( m_polygon ) - { - m_polygon->objectChanged.connect( this, &RimPolygonInView::onObjectChanged ); - } + connectSignals(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.h b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.h index 545da480ed..dbe5d07a96 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.h +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.h @@ -51,6 +51,7 @@ public: RimPolygon* polygon() const; void setPolygon( RimPolygon* polygon ); + void updateTargetsFromPolygon(); void appendPartsToModel( cvf::ModelBasicList* model, const caf::DisplayCoordTransform* scaleTransform, const cvf::BoundingBox& boundingBox ); void enablePicking( bool enable ); @@ -80,13 +81,14 @@ protected: void defineCustomContextMenu( const caf::PdmFieldHandle* fieldNeedingMenu, QMenu* menu, QWidget* fieldEditorWidget ) override; void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override; void onObjectChanged( const caf::SignalEmitter* emitter ); + void onCoordinatesChanged( const caf::SignalEmitter* emitter ); void initAfterRead() override; private: void updateNameField(); void updatePolygonFromTargets(); - void updateTargetsFromPolygon(); + void connectSignals(); private: caf::PdmPtrField m_polygon; diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp index f6c6fda1e1..d964417218 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp @@ -223,6 +223,7 @@ void RimPolygonInViewCollection::syncPolygonsWithView() { newPolygonsInView.push_back( *it ); existingPolygonsInView.erase( it ); + ( *it )->updateTargetsFromPolygon(); } else {