#2618 Tensor Vectors: Add arrow length scaling range option for result

This commit is contained in:
Unknown 2018-03-19 11:16:50 +01:00 committed by Rebecca Cox
parent 0583c7a815
commit af4b35b990
5 changed files with 150 additions and 73 deletions

View File

@ -108,12 +108,18 @@ void RivTensorResultPartMgr::appendDynamicGeometryPartsToModel(cvf::ModelBasicLi
RigFemPartNodes nodes = part->nodes();
double min, max;
resultCollection->minMaxScalarValuesOverAllTensorComponents(address, (int)frameIndex, &min, &max);
if (max == 0) max = 1;
float arrowConstantScaling = 0.5 * m_rimReservoirView->tensorResults()->sizeScale() * part->characteristicElementSize();
float arrowResultScaling = arrowConstantScaling / cvf::Math::abs(max);
double min, max;
m_rimReservoirView->tensorResults()->mappingRange(&min, &max);
double maxAbsResult = 1.0;
if (min != cvf::UNDEFINED_DOUBLE && max != cvf::UNDEFINED_DOUBLE)
{
maxAbsResult = std::max(cvf::Math::abs(max), cvf::Math::abs(min));
}
float arrowResultScaling = arrowConstantScaling / maxAbsResult;
cvf::ref<RivGeoMechPartMgrCache> partMgrCache = m_rimReservoirView->vizLogic()->partMgrCache();
@ -337,7 +343,7 @@ cvf::ref<cvf::Part> RivTensorResultPartMgr::createPart(const std::vector<TensorV
auto vectorColors = m_rimReservoirView->tensorResults()->vectorColors();
if (vectorColors == RimTensorResults::RESULT_COLORS)
{
activeScalerMapper = m_rimReservoirView->tensorResults()->legendConfig()->scalarMapper();
activeScalerMapper = m_rimReservoirView->tensorResults()->arrowColorLegendConfig()->scalarMapper();
createResultColorTextureCoords(lineTexCoords.p(), tensorVisualizations, activeScalerMapper);
}

View File

@ -383,11 +383,11 @@ void RimGeoMechView::updateLegends()
m_viewer->addColorLegendToBottomLeftCorner(cellResult()->legendConfig->legend());
}
updateTensorLegendTextAndRanges(m_tensorResults->legendConfig(), m_currentTimeStep());
updateTensorLegendTextAndRanges(m_tensorResults->arrowColorLegendConfig(), m_currentTimeStep());
if (tensorResults()->vectorColors() == RimTensorResults::RESULT_COLORS && tensorResults()->showTensors())
{
m_viewer->addColorLegendToBottomLeftCorner(m_tensorResults->legendConfig->legend());
m_viewer->addColorLegendToBottomLeftCorner(m_tensorResults->arrowColorLegendConfig->legend());
}
}
}

View File

@ -22,11 +22,13 @@
#include "RiaApplication.h"
#include "RiaColorTables.h"
#include "RiaPreferences.h"
#include "RimCellEdgeColors.h"
#include "RimEclipseCellColors.h"
#include "RimEclipseView.h"
#include "RimGeoMechResultDefinition.h"
#include "RimIntersectionCollection.h"
#include "RimStimPlanColors.h"
#include "RimViewLinker.h"
@ -47,8 +49,6 @@
#include "cvfqtUtils.h"
#include <cmath>
#include "RimIntersectionCollection.h"
#include "RiaPreferences.h"
CAF_PDM_SOURCE_INIT(RimLegendConfig, "Legend");
@ -57,8 +57,8 @@ namespace caf {
template<>
void AppEnum<RimLegendConfig::RangeModeType>::setUp()
{
addItem(RimLegendConfig::AUTOMATIC_ALLTIMESTEPS, "AUTOMATIC_ALLTIMESTEPS", "All Timesteps");
addItem(RimLegendConfig::AUTOMATIC_CURRENT_TIMESTEP,"AUTOMATIC_CURRENT_TIMESTEP", "Current Timestep");
addItem(RimLegendConfig::AUTOMATIC_ALLTIMESTEPS, "AUTOMATIC_ALLTIMESTEPS", "Min and Max for All Timesteps");
addItem(RimLegendConfig::AUTOMATIC_CURRENT_TIMESTEP,"AUTOMATIC_CURRENT_TIMESTEP", "Min and Max for Current Timestep");
addItem(RimLegendConfig::USER_DEFINED, "USER_DEFINED_MAX_MIN", "User Defined Range");
setDefault(RimLegendConfig::AUTOMATIC_ALLTIMESTEPS);
}

View File

@ -19,40 +19,41 @@
#include "RimTensorResults.h"
#include "RigFemResultAddress.h"
#include "RimGeoMechCase.h"
#include "RimGeoMechResultDefinition.h"
#include "RimGeoMechView.h"
#include "RimLegendConfig.h"
#include "RigFemPartResultsCollection.h"
#include "RigGeoMechCaseData.h"
#include "cafAppEnum.h"
#include "cafPdmUiListEditor.h"
#include "cafPdmUiTreeOrdering.h"
CAF_PDM_SOURCE_INIT(RimTensorResults, "RimTensorResults");
namespace caf
{
template<>
void AppEnum< RimTensorResults::TensorColors >::setUp()
{
addItem(RimTensorResults::WHITE_GRAY_BLACK , "WHITE_GRAY_BLACK", "White, Gray, Black");
template<>
void AppEnum<RimTensorResults::TensorColors>::setUp()
{
addItem(RimTensorResults::WHITE_GRAY_BLACK, "WHITE_GRAY_BLACK", "White, Gray, Black");
addItem(RimTensorResults::ORANGE_BLUE_WHITE, "ORANGE_BLUE_WHITE", "Orange, Blue, White");
addItem(RimTensorResults::MAGENTA_BROWN_GRAY, "MAGENTA_BROWN_GRAY", "Magenta, Brown, Gray");
addItem(RimTensorResults::RESULT_COLORS, "RESULT_COLORS", "Result Colors");
setDefault(RimTensorResults::WHITE_GRAY_BLACK);
}
}
template<>
void AppEnum< RimTensorResults::ScaleMethod >::setUp()
{
template<>
void AppEnum<RimTensorResults::ScaleMethod>::setUp()
{
addItem(RimTensorResults::RESULT, "RESULT", "Result");
addItem(RimTensorResults::CONSTANT, "CONSTANT", "Constant");
setDefault(RimTensorResults::RESULT);
}
}
} // namespace caf
//--------------------------------------------------------------------------------------------------
///
@ -61,9 +62,9 @@ RimTensorResults::RimTensorResults()
{
CAF_PDM_InitObject("Element Tensor Results", ":/CellResult.png", "", "");
CAF_PDM_InitFieldNoDefault(&legendConfig, "LegendDefinition", "Legend Definition", "", "", "");
this->legendConfig = new RimLegendConfig();
legendConfig.uiCapability()->setUiHidden(true);
CAF_PDM_InitFieldNoDefault(&arrowColorLegendConfig, "LegendDefinition", "Legend Definition", "", "", "");
this->arrowColorLegendConfig = new RimLegendConfig();
arrowColorLegendConfig.uiCapability()->setUiHidden(true);
CAF_PDM_InitField(&m_resultFieldName, "ResultVariable", QString("ST"), "Value", "", "", "");
m_resultFieldName.uiCapability()->setUiHidden(true);
@ -83,6 +84,13 @@ RimTensorResults::RimTensorResults()
CAF_PDM_InitFieldNoDefault(&m_vectorColor, "VectorColor", "Color", "", "", "");
CAF_PDM_InitFieldNoDefault(&m_scaleMethod, "ScaleMethod", "Scale Method", "", "", "");
CAF_PDM_InitField(&m_sizeScale, "SizeScale", 1.0f, "Size Scale", "", "", "");
CAF_PDM_InitField(&m_rangeMode,
"RangeType",
RimLegendConfig::RangeModeEnum(RimLegendConfig::AUTOMATIC_ALLTIMESTEPS),
"Range Type",
"",
"Switches between automatic and user defined range",
"");
m_resultFieldNameUiField.uiCapability()->setUiEditorTypeName(caf::PdmUiListEditor::uiEditorTypeName());
m_resultFieldNameUiField.uiCapability()->setUiLabelPosition(caf::PdmUiItemInfo::TOP);
@ -91,9 +99,7 @@ RimTensorResults::RimTensorResults()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimTensorResults::~RimTensorResults()
{
}
RimTensorResults::~RimTensorResults() {}
//--------------------------------------------------------------------------------------------------
///
@ -178,6 +184,36 @@ RimTensorResults::ScaleMethod RimTensorResults::scaleMethod() const
return m_scaleMethod();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimTensorResults::mappingRange(double* min, double* max) const
{
*min = cvf::UNDEFINED_DOUBLE;
*max = cvf::UNDEFINED_DOUBLE;
if (scaleMethod() == RESULT)
{
Rim3dView* view = nullptr;
firstAncestorOrThisOfType(view);
int currentTimeStep = view->currentTimeStep();
RimGeoMechView* geoMechView = dynamic_cast<RimGeoMechView*>(view);
RigFemPartResultsCollection* resultCollection = geoMechView->geoMechCase()->geoMechData()->femPartResults();
if (!resultCollection) return;
if (m_rangeMode == RimLegendConfig::AUTOMATIC_ALLTIMESTEPS)
{
resultCollection->minMaxScalarValuesOverAllTensorComponents(selectedTensorResult(), min, max);
}
else if (m_rangeMode == RimLegendConfig::AUTOMATIC_CURRENT_TIMESTEP)
{
resultCollection->minMaxScalarValuesOverAllTensorComponents(selectedTensorResult(), currentTimeStep, min, max);
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -210,13 +246,15 @@ std::vector<std::string> RimTensorResults::getResultMetaDataForUIFieldSetting()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimTensorResults::fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue)
void RimTensorResults::fieldChangedByUi(const caf::PdmFieldHandle* changedField,
const QVariant& oldValue,
const QVariant& newValue)
{
if (changedField == &m_resultFieldNameUiField)
{
m_resultFieldName = fieldNameFromUi(m_resultFieldNameUiField);
}
if (changedField == &m_showTensors)
else if (changedField == &m_showTensors)
{
setShowTensors(m_showTensors);
}
@ -237,7 +275,8 @@ caf::PdmFieldHandle* RimTensorResults::objectToggleField()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList<caf::PdmOptionItemInfo> RimTensorResults::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly)
QList<caf::PdmOptionItemInfo> RimTensorResults::calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly)
{
QList<caf::PdmOptionItemInfo> options;
*useOptionsOnly = true;
@ -248,9 +287,18 @@ QList<caf::PdmOptionItemInfo> RimTensorResults::calculateValueOptions(const caf:
for (size_t oIdx = 0; oIdx < fieldCompNames.size(); ++oIdx)
{
options.push_back(caf::PdmOptionItemInfo(QString::fromStdString(fieldCompNames[oIdx]), QString::fromStdString(fieldCompNames[oIdx])));
options.push_back(caf::PdmOptionItemInfo(QString::fromStdString(fieldCompNames[oIdx]),
QString::fromStdString(fieldCompNames[oIdx])));
}
}
else if (fieldNeedingOptions == &m_rangeMode)
{
options.push_back(caf::PdmOptionItemInfo(RimLegendConfig::RangeModeEnum::uiText(RimLegendConfig::AUTOMATIC_ALLTIMESTEPS),
RimLegendConfig::AUTOMATIC_ALLTIMESTEPS));
options.push_back(
caf::PdmOptionItemInfo(RimLegendConfig::RangeModeEnum::uiText(RimLegendConfig::AUTOMATIC_CURRENT_TIMESTEP),
RimLegendConfig::AUTOMATIC_CURRENT_TIMESTEP));
}
return options;
}
@ -272,8 +320,13 @@ void RimTensorResults::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering
vectorColorsGroup->add(&m_vectorColor);
caf::PdmUiGroup* vectorSizeGroup = uiOrdering.addNewGroup("Vector Size");
vectorSizeGroup->add(&m_scaleMethod);
vectorSizeGroup->add(&m_sizeScale);
vectorSizeGroup->add(&m_scaleMethod);
if (m_scaleMethod == RESULT)
{
vectorSizeGroup->add(&m_rangeMode);
}
uiOrdering.skipRemainingFields(true);
}
@ -289,7 +342,9 @@ void RimTensorResults::initAfterRead()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimTensorResults::defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute)
void RimTensorResults::defineEditorAttribute(const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute)
{
if (field == &m_resultFieldNameUiField)
{
@ -326,3 +381,14 @@ QString RimTensorResults::fieldNameFromUi(const QString& uiFieldName)
return uiFieldName;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimTensorResults::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName)
{
if (m_vectorColor() != RESULT_COLORS)
{
uiTreeOrdering.skipRemainingChildren();
}
}

View File

@ -23,6 +23,7 @@
#include "cafPdmObject.h"
#include "RigFemResultPosEnum.h"
#include "RimLegendConfig.h"
#include <QList>
@ -69,11 +70,13 @@ public:
TensorColors vectorColors() const;
ScaleMethod scaleMethod() const;
void mappingRange(double *min, double* max) const;
static RigFemResultPosEnum resultPositionType();
QString resultFieldName() const;
static QString uiFieldName(const QString& fieldName);
caf::PdmChildField<RimLegendConfig*> legendConfig;
caf::PdmChildField<RimLegendConfig*> arrowColorLegendConfig;
private:
std::vector<std::string> getResultMetaDataForUIFieldSetting();
@ -83,6 +86,7 @@ private:
virtual void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override;
virtual void initAfterRead() override;
virtual void defineEditorAttribute(const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute) override;
virtual void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "") override;
static QString fieldNameFromUi(const QString& uiFieldName);
@ -103,4 +107,5 @@ private:
caf::PdmField<caf::AppEnum<ScaleMethod>> m_scaleMethod;
caf::PdmField<float> m_sizeScale;
caf::PdmField<RimLegendConfig::RangeModeEnum> m_rangeMode;
};