From ed19f415863336fcf575c8408d3f35b7e9443bf4 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Tue, 14 Jan 2020 10:58:40 +0100 Subject: [PATCH] #5217 Filter well measurements by quality --- .../ModelVisualization/RivWellPathPartMgr.cpp | 5 +- .../RimWellMeasurementFilter.cpp | 14 ++++- .../RimWellMeasurementFilter.h | 5 +- .../RimWellMeasurementInView.cpp | 58 +++++++++++++++++++ .../RimWellMeasurementInView.h | 5 +- .../RimWellMeasurementInViewCollection.cpp | 1 + 6 files changed, 83 insertions(+), 5 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp index d8ba5170ba..002e286ed3 100644 --- a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp @@ -286,13 +286,16 @@ void RivWellPathPartMgr::appendWellMeasurementsToModel( cvf::ModelBasicList* double lowerBound = 0.0; double upperBound = 0.0; wellMeasurementInView->rangeValues( &lowerBound, &upperBound ); + std::vector qualityFilter = wellMeasurementInView->qualityFilter(); + std::vector wellMeasurements = RimWellMeasurementFilter::filterMeasurements( wellMeasurementCollection->measurements(), *wellPathCollection, *m_rimWellPath, measurementKinds, lowerBound, - upperBound ); + upperBound, + qualityFilter ); RivPipeGeometryGenerator geoGenerator; for ( RimWellMeasurement* wellMeasurement : wellMeasurements ) diff --git a/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.cpp b/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.cpp index 3f62e96fb6..c5a69f0d4b 100644 --- a/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.cpp @@ -57,7 +57,8 @@ std::vector const RimWellPath& wellPath, const std::vector& measurementKinds, double lowerBound, - double upperBound ) + double upperBound, + const std::vector& qualityFilter ) { std::vector filteredMeasurementsByKindsAndWellPath = filterMeasurements( measurements, wellPathCollection, @@ -67,7 +68,8 @@ std::vector std::vector filteredMeasurements; for ( auto& measurement : filteredMeasurementsByKindsAndWellPath ) { - if ( RimWellMeasurementFilter::isInsideRange( measurement->value(), lowerBound, upperBound ) ) + if ( RimWellMeasurementFilter::isInsideRange( measurement->value(), lowerBound, upperBound ) && + RimWellMeasurementFilter::hasQuality( measurement->quality(), qualityFilter ) ) { filteredMeasurements.push_back( measurement ); } @@ -114,3 +116,11 @@ bool RimWellMeasurementFilter::isInsideRange( double value, double lowerBound, d return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellMeasurementFilter::hasQuality( int quality, const std::vector& qualityFilter ) +{ + return std::find( qualityFilter.begin(), qualityFilter.end(), quality ) != qualityFilter.end(); +} diff --git a/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.h b/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.h index 13df1261b8..e25336f284 100644 --- a/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.h +++ b/ApplicationCode/ProjectDataModel/RimWellMeasurementFilter.h @@ -38,7 +38,8 @@ public: const RimWellPath& rimWellPath, const std::vector& measurementKinds, double lowerBound, - double upperBound ); + double upperBound, + const std::vector& qualityFilter ); static std::vector filterMeasurements( const std::vector& measurements, const std::vector& measurementKinds ); @@ -47,4 +48,6 @@ private: RimWellMeasurementFilter(); static bool isInsideRange( double value, double lowerBound, double upperBound ); + + static bool hasQuality( int quality, const std::vector& qualityFilter ); }; diff --git a/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.cpp b/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.cpp index 41257c987c..95dc5be032 100644 --- a/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.cpp @@ -65,6 +65,10 @@ RimWellMeasurementInView::RimWellMeasurementInView() CAF_PDM_InitField( &m_upperBound, "UpperBound", HUGE_VAL, "Max", "", "", "" ); m_upperBound.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + CAF_PDM_InitFieldNoDefault( &m_qualityFilter, "QualityFilter", "Quality Filter", "", "", "" ); + m_qualityFilter.uiCapability()->setAutoAddingOptionFromValue( false ); + m_qualityFilter.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); + this->setName( "Well Measurement" ); m_minimumResultValue = cvf::UNDEFINED_DOUBLE; @@ -104,6 +108,8 @@ void RimWellMeasurementInView::defineUiOrdering( QString uiConfigName, caf::PdmU filterGroup.add( &m_upperBound ); } + uiOrdering.add( &m_qualityFilter ); + uiOrdering.skipRemainingFields(); } @@ -154,6 +160,14 @@ void RimWellMeasurementInView::rangeValues( double* lowerBound, double* upperBou *upperBound = m_upperBound; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellMeasurementInView::qualityFilter() const +{ + return m_qualityFilter; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -296,6 +310,26 @@ QList } } } + else if ( fieldNeedingOptions == &m_qualityFilter ) + { + RimWellPathCollection* wellPathCollection = RimTools::wellPathCollection(); + if ( wellPathCollection ) + { + std::vector measurements = wellPathCollection->measurementCollection()->measurements(); + + // Find possible quality values for a given measurement kind + std::set qualityValues; + for ( const auto& measurement : measurements ) + { + if ( measurement->kind() == m_measurementKind ) qualityValues.insert( measurement->quality() ); + } + + for ( const auto& quality : qualityValues ) + { + options.push_back( caf::PdmOptionItemInfo( QString::number( quality ), quality ) ); + } + } + } return options; } @@ -356,3 +390,27 @@ void RimWellMeasurementInView::setAllWellsSelected() } } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellMeasurementInView::setAllQualitiesSelected() +{ + RimWellPathCollection* wellPathCollection = RimTools::wellPathCollection(); + if ( wellPathCollection ) + { + std::vector measurements = wellPathCollection->measurementCollection()->measurements(); + + // Find possible quality values for a given measurement kind + std::set qualityValues; + for ( const auto& measurement : measurements ) + { + if ( measurement->kind() == m_measurementKind ) qualityValues.insert( measurement->quality() ); + } + + for ( const auto& quality : qualityValues ) + { + m_qualityFilter.v().push_back( quality ); + } + } +} diff --git a/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.h b/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.h index c111599983..e82acdf1ca 100644 --- a/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.h +++ b/ApplicationCode/ProjectDataModel/RimWellMeasurementInView.h @@ -46,12 +46,14 @@ public: void setMeasurementKind( const QString& measurementKind ); bool isWellChecked( const QString& wellName ) const; void setAllWellsSelected(); + void setAllQualitiesSelected(); void updateLegendRangesTextAndVisibility( RiuViewer* nativeOrOverrideViewer, bool isUsingOverrideViewer ); bool hasCategoryResult() const; - void rangeValues( double* lowerBound, double* upperBound ) const; + void rangeValues( double* lowerBound, double* upperBound ) const; + std::vector qualityFilter() const; protected: void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; @@ -79,6 +81,7 @@ private: caf::PdmField> m_wells; caf::PdmField m_lowerBound; caf::PdmField m_upperBound; + caf::PdmField> m_qualityFilter; double m_minimumResultValue; double m_maximumResultValue; diff --git a/ApplicationCode/ProjectDataModel/RimWellMeasurementInViewCollection.cpp b/ApplicationCode/ProjectDataModel/RimWellMeasurementInViewCollection.cpp index 156fcf2901..05ec662571 100644 --- a/ApplicationCode/ProjectDataModel/RimWellMeasurementInViewCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimWellMeasurementInViewCollection.cpp @@ -135,6 +135,7 @@ void RimWellMeasurementInViewCollection::syncWithChangesInWellMeasurementCollect measurementInView->setName( kind ); measurementInView->setMeasurementKind( kind ); measurementInView->setAllWellsSelected(); + measurementInView->setAllQualitiesSelected(); m_measurementsInView.push_back( measurementInView ); }