From eb97ee0de8fa6f6381f0bdd932bb7ec6986515a7 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Thu, 27 Feb 2020 13:35:14 +0100 Subject: [PATCH] #5583 Add data model object and ui for RimElementVectorResult. --- .../ProjectDataModel/CMakeLists_files.cmake | 2 + .../ProjectDataModel/RimEclipseView.cpp | 26 ++ .../ProjectDataModel/RimEclipseView.h | 3 + .../RimElementVectorResult.cpp | 412 ++++++++++++++++++ .../ProjectDataModel/RimElementVectorResult.h | 112 +++++ 5 files changed, 555 insertions(+) create mode 100644 ApplicationCode/ProjectDataModel/RimElementVectorResult.cpp create mode 100644 ApplicationCode/ProjectDataModel/RimElementVectorResult.h diff --git a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake index 061a931b4f..dd554c5096 100644 --- a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake @@ -151,6 +151,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilter.h ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInViewCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInView.h ${CMAKE_CURRENT_LIST_DIR}/RimWellDiskConfig.h +${CMAKE_CURRENT_LIST_DIR}/RimElementVectorResult.h ) @@ -306,6 +307,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilter.cpp ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInViewCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInView.cpp ${CMAKE_CURRENT_LIST_DIR}/RimWellDiskConfig.cpp +${CMAKE_CURRENT_LIST_DIR}/RimElementVectorResult.cpp ) list(APPEND CODE_HEADER_FILES diff --git a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp index a8713cec14..82d0f58784 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp @@ -51,6 +51,7 @@ #include "RimEclipsePropertyFilter.h" #include "RimEclipsePropertyFilterCollection.h" #include "RimEclipseResultDefinition.h" +#include "RimElementVectorResult.h" #include "RimExtrudedCurveIntersection.h" #include "RimFaultInViewCollection.h" #include "RimFlowCharacteristicsPlot.h" @@ -137,6 +138,15 @@ RimEclipseView::RimEclipseView() m_cellEdgeResult = new RimCellEdgeColors(); m_cellEdgeResult.uiCapability()->setUiHidden( true ); + CAF_PDM_InitFieldNoDefault( &m_elementVectorResult, + "ElementVectorResult", + "Element Vector Result", + ":/CellResult.png", + "", + "" ); + m_elementVectorResult = new RimElementVectorResult; + m_elementVectorResult.uiCapability()->setUiHidden( true ); + CAF_PDM_InitFieldNoDefault( &m_faultResultSettings, "FaultResultSettings", "Separate Fault Result", "", "", "" ); m_faultResultSettings = new RimEclipseFaultColors(); m_faultResultSettings.uiCapability()->setUiHidden( true ); @@ -198,6 +208,7 @@ RimEclipseView::~RimEclipseView() delete this->faultResultSettings(); delete this->cellResult(); delete this->cellEdgeResult(); + delete this->elementVectorResult(); delete m_propertyFilterCollection; delete wellCollection(); @@ -225,6 +236,14 @@ RimCellEdgeColors* RimEclipseView::cellEdgeResult() const return m_cellEdgeResult; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimElementVectorResult* RimEclipseView::elementVectorResult() const +{ + return m_elementVectorResult; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1305,6 +1324,12 @@ void RimEclipseView::onUpdateLegends() } } + if ( this->elementVectorResult()->showResult() ) + { + this->elementVectorResult()->updateLegendRangesTextAndVisibility( nativeOrOverrideViewer(), + isUsingOverrideViewer() ); + } + { bool hasAnyVisibleFractures = false; { @@ -1757,6 +1782,7 @@ void RimEclipseView::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin uiTreeOrdering.add( cellResult() ); uiTreeOrdering.add( cellEdgeResult() ); + uiTreeOrdering.add( elementVectorResult() ); uiTreeOrdering.add( faultResultSettings() ); uiTreeOrdering.add( &m_intersectionResultDefCollection ); uiTreeOrdering.add( &m_surfaceResultDefCollection ); diff --git a/ApplicationCode/ProjectDataModel/RimEclipseView.h b/ApplicationCode/ProjectDataModel/RimEclipseView.h index 9835a2d3f6..bce9b202fa 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseView.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseView.h @@ -62,6 +62,7 @@ class RivReservoirViewPartMgr; class RimRegularLegendConfig; class RimTernaryLegendConfig; class RimEclipseResultDefinition; +class RimElementVectorResult; namespace cvf { @@ -85,6 +86,7 @@ public: RimEclipseCellColors* cellResult() const; RimCellEdgeColors* cellEdgeResult() const; + RimElementVectorResult* elementVectorResult() const; RimEclipseFaultColors* faultResultSettings() const; RimStimPlanColors* fractureColors() const; RimSimWellInViewCollection* wellCollection() const; @@ -202,6 +204,7 @@ private: caf::PdmChildField m_cellResult; caf::PdmChildField m_cellEdgeResult; + caf::PdmChildField m_elementVectorResult; caf::PdmChildField m_faultResultSettings; caf::PdmChildField m_fractureColors; caf::PdmChildField m_virtualPerforationResult; diff --git a/ApplicationCode/ProjectDataModel/RimElementVectorResult.cpp b/ApplicationCode/ProjectDataModel/RimElementVectorResult.cpp new file mode 100644 index 0000000000..fd17f70409 --- /dev/null +++ b/ApplicationCode/ProjectDataModel/RimElementVectorResult.cpp @@ -0,0 +1,412 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimElementVectorResult.h" + +#include "RigCaseCellResultsData.h" +#include "RigEclipseCaseData.h" +#include "RigEclipseResultAddress.h" + +#include "Rim3dView.h" +#include "RimEclipseCase.h" +#include "RimEclipseView.h" + +#include "RiuViewer.h" + +#include "cafAppEnum.h" +#include "cafPdmUiListEditor.h" +#include "cafPdmUiTreeOrdering.h" + +CAF_PDM_SOURCE_INIT( RimElementVectorResult, "RimElementVectorResult" ); + +namespace caf +{ +template <> +void AppEnum::setUp() +{ + addItem( RimElementVectorResult::RESULT_COLORS, "RESULT_COLORS", "Result Colors" ); + addItem( RimElementVectorResult::UNIFORM_COLOR, "UNIFORM_COLOR", "Uniform" ); + + setDefault( RimElementVectorResult::RESULT_COLORS ); +} + +template <> +void AppEnum::setUp() +{ + addItem( RimElementVectorResult::RESULT, "RESULT", "Result" ); + addItem( RimElementVectorResult::CONSTANT, "CONSTANT", "Constant" ); + + setDefault( RimElementVectorResult::RESULT ); +} +} // namespace caf + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimElementVectorResult::RimElementVectorResult() +{ + CAF_PDM_InitObject( "Element Vector Result", ":/CellResult.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); + m_legendConfig = new RimRegularLegendConfig(); + m_legendConfig.uiCapability()->setUiHidden( true ); + + CAF_PDM_InitField( &m_resultName, "ResultVariable", QString( "Oil" ), "Value", "", "", "" ); + m_resultName.uiCapability()->setUiEditorTypeName( caf::PdmUiListEditor::uiEditorTypeName() ); + m_resultName.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + + CAF_PDM_InitField( &m_showResult, "ShowResult", false, "", "", "", "" ); + + CAF_PDM_InitField( &m_showVectorI, "ShowVectorI", true, "I", "", "", "" ); + CAF_PDM_InitField( &m_showVectorJ, "ShowVectorJ", true, "J", "", "", "" ); + CAF_PDM_InitField( &m_showVectorK, "ShowVectorK", true, "K", "", "", "" ); + CAF_PDM_InitField( &m_threshold, "Threshold", 0.0f, "Threshold", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_vectorColor, "VectorColor", "Color", "", "", "" ); + cvf::Color3f defaultUniformColor = cvf::Color3f::BLACK; + CAF_PDM_InitField( &m_uniformVectorColor, "UniformVectorColor", defaultUniformColor, "Uniform Vector Color", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_scaleMethod, "ScaleMethod", "Scale Method", "", "", "" ); + CAF_PDM_InitField( &m_sizeScale, "SizeScale", 1.0f, "Size Scale", "", "", "" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimElementVectorResult::~RimElementVectorResult() +{ + delete m_legendConfig; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimElementVectorResult::setShowResult( bool enableResult ) +{ + m_showResult = enableResult; + + updateConnectedEditors(); + updateUiIconFromState( enableResult ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimElementVectorResult::showResult() const +{ + return m_showResult(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimElementVectorResult::showVectorI() const +{ + return m_showVectorI(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimElementVectorResult::showVectorJ() const +{ + return m_showVectorJ(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- + +bool RimElementVectorResult::showVectorK() const +{ + return m_showVectorK(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +float RimElementVectorResult::threshold() const +{ + return m_threshold(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +float RimElementVectorResult::sizeScale() const +{ + return m_sizeScale(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimElementVectorResult::TensorColors RimElementVectorResult::vectorColors() const +{ + return m_vectorColor(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimElementVectorResult::ScaleMethod RimElementVectorResult::scaleMethod() const +{ + return m_scaleMethod(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const cvf::Color3f& RimElementVectorResult::getUniformVectorColor() const +{ + return m_uniformVectorColor(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimElementVectorResult::mappingRange( double& min, double& max ) const +{ + min = cvf::UNDEFINED_DOUBLE; + max = cvf::UNDEFINED_DOUBLE; + + Rim3dView* view = nullptr; + firstAncestorOrThisOfType( view ); + + int currentTimeStep = view->currentTimeStep(); + + RigEclipseResultAddress resVarAddr = resultAddressCombined(); + if ( !resVarAddr.isValid() ) return; + + RimEclipseView* eclipseView = dynamic_cast( view ); + RigCaseCellResultsData* resultsData = + eclipseView->eclipseCase()->eclipseCaseData()->results( RiaDefines::MATRIX_MODEL ); + + resultsData->ensureKnownResultLoaded( resVarAddr ); + + if ( m_legendConfig->rangeMode() == RimRegularLegendConfig::AUTOMATIC_ALLTIMESTEPS ) + { + resultsData->minMaxCellScalarValues( resVarAddr, min, max ); + } + else if ( m_legendConfig->rangeMode() == RimRegularLegendConfig::AUTOMATIC_CURRENT_TIMESTEP ) + { + resultsData->minMaxCellScalarValues( resVarAddr, currentTimeStep, min, max ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimElementVectorResult::updateLegendRangesTextAndVisibility( RiuViewer* nativeOrOverrideViewer, + bool isUsingOverrideViewer ) +{ + m_legendConfig->setTitle( QString( "Element Vector Result: \n" ) + resultName() ); + + double minResultValue; + double maxResultValue; + mappingRange( minResultValue, maxResultValue ); + m_legendConfig->setAutomaticRanges( minResultValue, maxResultValue, minResultValue, maxResultValue ); + + double posClosestToZero = HUGE_VAL; + double negClosestToZero = -HUGE_VAL; + m_legendConfig->setClosestToZeroValues( posClosestToZero, negClosestToZero, posClosestToZero, negClosestToZero ); + nativeOrOverrideViewer->addColorLegendToBottomLeftCorner( m_legendConfig->titledOverlayFrame(), isUsingOverrideViewer ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RimRegularLegendConfig* RimElementVectorResult::legendConfig() const +{ + return m_legendConfig(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimElementVectorResult::resultName() const +{ + return m_resultName(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimElementVectorResult::getResultMetaDataForUIFieldSetting() +{ + std::vector fieldNames; + fieldNames.push_back( "Oil" ); + fieldNames.push_back( "Water" ); + fieldNames.push_back( "Gas" ); + + return fieldNames; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimElementVectorResult::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + if ( changedField == &m_showResult ) + { + setShowResult( m_showResult ); + } + + RimEclipseView* view; + firstAncestorOrThisOfType( view ); + view->loadDataAndUpdate(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimElementVectorResult::objectToggleField() +{ + return &m_showResult; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RimElementVectorResult::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + *useOptionsOnly = true; + + if ( fieldNeedingOptions == &m_resultName ) + { + std::vector fieldCompNames = getResultMetaDataForUIFieldSetting(); + + for ( size_t oIdx = 0; oIdx < fieldCompNames.size(); ++oIdx ) + { + options.push_back( caf::PdmOptionItemInfo( QString::fromStdString( fieldCompNames[oIdx] ), + QString::fromStdString( fieldCompNames[oIdx] ) ) ); + } + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimElementVectorResult::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_resultName ); + + caf::PdmUiGroup* visibilityGroup = uiOrdering.addNewGroup( "Visibility" ); + visibilityGroup->add( &m_showVectorI ); + visibilityGroup->add( &m_showVectorJ ); + visibilityGroup->add( &m_showVectorK ); + visibilityGroup->add( &m_threshold ); + + caf::PdmUiGroup* vectorColorsGroup = uiOrdering.addNewGroup( "Vector Colors" ); + vectorColorsGroup->add( &m_vectorColor ); + if ( m_vectorColor == UNIFORM_COLOR ) + { + vectorColorsGroup->add( &m_uniformVectorColor ); + } + + caf::PdmUiGroup* vectorSizeGroup = uiOrdering.addNewGroup( "Vector Size" ); + vectorSizeGroup->add( &m_sizeScale ); + vectorSizeGroup->add( &m_scaleMethod ); + + uiOrdering.skipRemainingFields( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimElementVectorResult::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_resultName ) + { + caf::PdmUiListEditorAttribute* listEditAttr = dynamic_cast( attribute ); + if ( listEditAttr ) + { + listEditAttr->m_heightHint = 50; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigEclipseResultAddress RimElementVectorResult::resultAddressCombined() const +{ + if ( resultName() == "Oil" ) + { + return RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, RiaDefines::combinedOilFluxResultName() ); + } + else if ( resultName() == "Gas" ) + { + return RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, RiaDefines::combinedGasFluxResultName() ); + } + else if ( resultName() == "Water" ) + { + return RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, RiaDefines::combinedWaterFluxResultName() ); + } + + return RigEclipseResultAddress(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimElementVectorResult::resultAddressIJK( std::vector& addresses ) const +{ + addresses.clear(); + + // TODO: use enum?? + if ( resultName() == "Oil" ) + { + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLROILI+" ) ); + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLROILJ+" ) ); + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLROILK+" ) ); + return true; + } + else if ( resultName() == "Gas" ) + { + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLRGASI+" ) ); + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLRGASJ+" ) ); + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLRGASK+" ) ); + return true; + } + else if ( resultName() == "Water" ) + { + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLRWATI+" ) ); + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLRWATJ+" ) ); + addresses.push_back( RigEclipseResultAddress( RiaDefines::DYNAMIC_NATIVE, "FLRWATK+" ) ); + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimElementVectorResult::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) +{ + uiTreeOrdering.add( &m_legendConfig ); + uiTreeOrdering.skipRemainingChildren(); +} diff --git a/ApplicationCode/ProjectDataModel/RimElementVectorResult.h b/ApplicationCode/ProjectDataModel/RimElementVectorResult.h new file mode 100644 index 0000000000..d772ff4fd6 --- /dev/null +++ b/ApplicationCode/ProjectDataModel/RimElementVectorResult.h @@ -0,0 +1,112 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmChildField.h" +#include "cafPdmField.h" +#include "cafPdmFieldCvfColor.h" // Include to make Pdm work for cvf::Color +#include "cafPdmObject.h" + +#include "RigEclipseResultAddress.h" + +#include "RimRegularLegendConfig.h" + +#include + +#include + +class RimRegularLegendConfig; + +class RiuViewer; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimElementVectorResult : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + enum TensorColors + { + UNIFORM_COLOR, + RESULT_COLORS + }; + + enum ScaleMethod + { + RESULT, + CONSTANT + }; + +public: + RimElementVectorResult(); + ~RimElementVectorResult() override; + + void setShowResult( bool enableResult ); + bool showResult() const; + bool showVectorI() const; + bool showVectorJ() const; + bool showVectorK() const; + float threshold() const; + float sizeScale() const; + TensorColors vectorColors() const; + ScaleMethod scaleMethod() const; + + const cvf::Color3f& getUniformVectorColor() const; + const RimRegularLegendConfig* legendConfig() const; + + void mappingRange( double& min, double& max ) const; + + RigEclipseResultAddress resultAddressCombined() const; + bool resultAddressIJK( std::vector& addresses ) const; + + QString resultName() const; + + void updateLegendRangesTextAndVisibility( RiuViewer* nativeOrOverrideViewer, bool isUsingOverrideViewer ); + +private: + std::vector getResultMetaDataForUIFieldSetting(); + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + caf::PdmFieldHandle* objectToggleField() override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; + + static QString fieldNameFromUi( const QString& uiFieldName ); + +private: + caf::PdmField m_showResult; + caf::PdmField m_resultName; + caf::PdmField m_showVectorI; + caf::PdmField m_showVectorJ; + caf::PdmField m_showVectorK; + caf::PdmField m_threshold; + caf::PdmField> m_vectorColor; + caf::PdmField m_uniformVectorColor; + caf::PdmField> m_scaleMethod; + caf::PdmField m_sizeScale; + caf::PdmField m_rangeMode; + caf::PdmChildField m_legendConfig; +};