From 2001c94a3935512730a90a890761c0b8da52d9e4 Mon Sep 17 00:00:00 2001 From: jonjenssen <69144954+jonjenssen@users.noreply.github.com> Date: Mon, 18 Mar 2024 14:31:06 +0100 Subject: [PATCH] Polygon updates (#11298) * Make menus similar for polygon and polygonInView * Crash fix: Iterator might be invalidated by erase, reorder operations. * Update pick editor after reload * Do not enable edit if polygon is read only * Make sure filter and intersection geometry is updated after a reload * Make sure other pick editors are updated when polygon in view is changed --- .../RicNewPolygonFilterFeature.cpp | 2 +- .../CellFilters/RimPolygonFilter.cpp | 1 + .../ProjectDataModel/Polygons/RimPolygon.cpp | 24 ++++++++++++------- .../ProjectDataModel/Polygons/RimPolygon.h | 4 +++- .../Polygons/RimPolygonCollection.cpp | 12 ++++++++-- .../Polygons/RimPolygonCollection.h | 2 ++ .../Polygons/RimPolygonFile.cpp | 2 ++ .../Polygons/RimPolygonInView.cpp | 9 ++++++- .../Polygons/RimPolygonInViewCollection.cpp | 10 +++++++- .../Polygons/RimPolygonInViewCollection.h | 1 + 10 files changed, 53 insertions(+), 14 deletions(-) diff --git a/ApplicationLibCode/Commands/CellFilterCommands/RicNewPolygonFilterFeature.cpp b/ApplicationLibCode/Commands/CellFilterCommands/RicNewPolygonFilterFeature.cpp index 8ffa493ef8..dab91b8510 100644 --- a/ApplicationLibCode/Commands/CellFilterCommands/RicNewPolygonFilterFeature.cpp +++ b/ApplicationLibCode/Commands/CellFilterCommands/RicNewPolygonFilterFeature.cpp @@ -78,5 +78,5 @@ void RicNewPolygonFilterFeature::onActionTriggered( bool isChecked ) void RicNewPolygonFilterFeature::setupActionLook( QAction* actionToSetup ) { actionToSetup->setIcon( QIcon( ":/CellFilter_Polygon.png" ) ); - actionToSetup->setText( "New Polygon Filter" ); + actionToSetup->setText( "Create Polygon Filter" ); } diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp index 965c5bb2b6..b8a28f811f 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp @@ -885,6 +885,7 @@ caf::PickEventHandler* RimPolygonFilter::pickEventHandler() const if ( filterColl && !filterColl->isActive() ) return nullptr; if ( !isActive() ) return nullptr; + if ( !isPolygonDefinedLocally() && m_cellFilterPolygon && m_cellFilterPolygon()->isReadOnly() ) return nullptr; return m_pickTargetsEventHandler.get(); } diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp index e160e457d9..3865b86be9 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.cpp @@ -84,14 +84,7 @@ 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"; + RimPolygon::appendPolygonMenuItems( menuBuilder ); } //-------------------------------------------------------------------------------------------------- @@ -251,6 +244,21 @@ void RimPolygon::onColorTagClicked( const SignalEmitter* emitter, size_t index ) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolygon::appendPolygonMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) +{ + menuBuilder << "RicNewPolygonIntersectionFeature"; + menuBuilder << "RicNewPolygonFilterFeature"; + menuBuilder << "Separator"; + menuBuilder << "RicDuplicatePolygonFeature"; + menuBuilder << "RicSimplifyPolygonFeature"; + menuBuilder << "Separator"; + menuBuilder << "RicExportPolygonCsvFeature"; + menuBuilder << "RicExportPolygonPolFeature"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h index f0eaa16c53..0d607c7424 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygon.h @@ -61,10 +61,12 @@ public: cvf::ref polyLinesData() const override; void uiOrderingForLocalPolygon( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ); - void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override; void onColorTagClicked( const SignalEmitter* emitter, size_t index ); + static void appendPolygonMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ); + private: + void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override; void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp index 3905598723..ee52064c39 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.cpp @@ -147,6 +147,15 @@ std::vector RimPolygonCollection::allPolygons() const return allPolygons; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolygonCollection::appendPolygonMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) +{ + menuBuilder << "RicCreatePolygonFeature"; + menuBuilder << "RicImportPolygonFileFeature"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -169,8 +178,7 @@ void RimPolygonCollection::childFieldChangedByUi( const caf::PdmFieldHandle* cha //-------------------------------------------------------------------------------------------------- void RimPolygonCollection::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const { - menuBuilder << "RicCreatePolygonFeature"; - menuBuilder << "RicImportPolygonFileFeature"; + RimPolygonCollection::appendPolygonMenuItems( menuBuilder ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h index aad69d97dc..3c0b163582 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonCollection.h @@ -47,6 +47,8 @@ public: std::vector polygonFiles() const; std::vector allPolygons() const; + static void appendPolygonMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ); + private: void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector& referringObjects ) override; void childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonFile.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonFile.cpp index 2b3aeb4519..d09e29af02 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonFile.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonFile.cpp @@ -69,6 +69,8 @@ void RimPolygonFile::loadData() auto projectPoly = m_polygons()[i]; auto filePoly = polygonsFromFile[i]; projectPoly->setPointsInDomainCoords( filePoly->pointsInDomainCoords() ); + projectPoly->coordinatesChanged.send(); // updates editors + projectPoly->objectChanged.send(); // updates filters delete filePoly; } } diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp index 713077d2c1..e3f4776779 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInView.cpp @@ -233,6 +233,13 @@ void RimPolygonInView::updatePolygonFromTargets() points.push_back( target->targetPointXYZ() ); } m_polygon->setPointsInDomainCoords( points ); + + // update other pick editors, make sure we don't update ourselves + m_polygon->coordinatesChanged.block( this ); + m_polygon->coordinatesChanged.send(); + m_polygon->coordinatesChanged.unblock( this ); + + m_polygon->objectChanged.send(); } } @@ -374,7 +381,7 @@ void RimPolygonInView::uiOrderingForLocalPolygon( QString uiConfigName, caf::Pdm //-------------------------------------------------------------------------------------------------- void RimPolygonInView::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const { - if ( m_polygon() ) m_polygon->appendMenuItems( menuBuilder ); + RimPolygon::appendPolygonMenuItems( menuBuilder ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp index d964417218..15ba10d72c 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.cpp @@ -123,6 +123,14 @@ void RimPolygonInViewCollection::fieldChangedByUi( const caf::PdmFieldHandle* ch } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolygonInViewCollection::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const +{ + RimPolygonCollection::appendPolygonMenuItems( menuBuilder ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -222,8 +230,8 @@ void RimPolygonInViewCollection::syncPolygonsWithView() if ( it != existingPolygonsInView.end() ) { newPolygonsInView.push_back( *it ); - existingPolygonsInView.erase( it ); ( *it )->updateTargetsFromPolygon(); + existingPolygonsInView.erase( it ); } else { diff --git a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.h b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.h index bee9b066b3..a320ef3a63 100644 --- a/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Polygons/RimPolygonInViewCollection.h @@ -45,6 +45,7 @@ public: private: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const override; void setPolygonFile( RimPolygonFile* polygonFile ); RimPolygonFile* polygonFile() const;