mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Add multiple selected cell edge results
This commit is contained in:
parent
f82c530966
commit
c31bc3e50e
@ -190,33 +190,40 @@ bool RicCreateEnsembleWellLogUi::autoCreateEnsembleWellLogs() const
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::vector<std::pair<QString, RiaDefines::ResultCatType>> RicCreateEnsembleWellLogUi::properties() const
|
std::vector<std::pair<QString, RiaDefines::ResultCatType>>
|
||||||
|
RicCreateEnsembleWellLogUi::properties( const std::vector<QString>& resultNames,
|
||||||
|
const std::vector<RiaDefines::ResultCatType>& resultCategories,
|
||||||
|
const RigEclipseCaseData* caseData )
|
||||||
{
|
{
|
||||||
std::vector<QString> selectedKeyWords = m_selectedKeywords();
|
|
||||||
|
|
||||||
auto findResultCategory = []( const QString& keyword,
|
auto findResultCategory = []( const QString& keyword,
|
||||||
const std::vector<RiaDefines::ResultCatType>& categories,
|
const std::vector<RiaDefines::ResultCatType>& categories,
|
||||||
RigEclipseCaseData* caseData ) {
|
const RigEclipseCaseData* caseData ) {
|
||||||
// Find the result category for a given keyword
|
// Find the result category for a given keyword
|
||||||
RigCaseCellResultsData* resultData = caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
auto resultData = caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
||||||
for ( auto category : categories )
|
for ( auto category : categories )
|
||||||
if ( resultData->hasResultEntry( RigEclipseResultAddress( category, keyword ) ) ) return category;
|
if ( resultData->hasResultEntry( RigEclipseResultAddress( category, keyword ) ) ) return category;
|
||||||
|
|
||||||
return RiaDefines::ResultCatType::UNDEFINED;
|
return RiaDefines::ResultCatType::UNDEFINED;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<RiaDefines::ResultCatType> resultCategories = validResultCategories();
|
|
||||||
|
|
||||||
std::vector<std::pair<QString, RiaDefines::ResultCatType>> props;
|
std::vector<std::pair<QString, RiaDefines::ResultCatType>> props;
|
||||||
for ( auto keyword : selectedKeyWords )
|
for ( auto keyword : resultNames )
|
||||||
{
|
{
|
||||||
auto resultCategory = findResultCategory( keyword, resultCategories, m_caseData );
|
auto resultCategory = findResultCategory( keyword, resultCategories, caseData );
|
||||||
props.push_back( std::make_pair( keyword, resultCategory ) );
|
props.push_back( std::make_pair( keyword, resultCategory ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return props;
|
return props;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<std::pair<QString, RiaDefines::ResultCatType>> RicCreateEnsembleWellLogUi::properties() const
|
||||||
|
{
|
||||||
|
return properties( m_selectedKeywords.value(), validResultCategories(), m_caseData );
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -61,6 +61,11 @@ public:
|
|||||||
|
|
||||||
std::vector<std::pair<QString, RiaDefines::ResultCatType>> properties() const;
|
std::vector<std::pair<QString, RiaDefines::ResultCatType>> properties() const;
|
||||||
|
|
||||||
|
static std::vector<std::pair<QString, RiaDefines::ResultCatType>>
|
||||||
|
properties( const std::vector<QString>& resultNames,
|
||||||
|
const std::vector<RiaDefines::ResultCatType>& resultCategories,
|
||||||
|
const RigEclipseCaseData* caseData );
|
||||||
|
|
||||||
void setCaseData( RigEclipseCaseData* caseData );
|
void setCaseData( RigEclipseCaseData* caseData );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -316,24 +316,7 @@ cvf::ref<RigResultAccessor> RivCellEdgeGeometryUtils::createCellEdgeResultAccess
|
|||||||
{
|
{
|
||||||
cvf::ref<RigCellEdgeResultAccessor> cellEdgeResultAccessor = new RigCellEdgeResultAccessor();
|
cvf::ref<RigCellEdgeResultAccessor> cellEdgeResultAccessor = new RigCellEdgeResultAccessor();
|
||||||
|
|
||||||
if ( cellEdgeResultColors->propertyType() == RimCellEdgeColors::ANY_SINGLE_PROPERTY )
|
auto resultAddresses = cellEdgeResultColors->resultAddresses();
|
||||||
{
|
|
||||||
cvf::ref<RigResultAccessor> daObj =
|
|
||||||
RivCellEdgeGeometryUtils::createCellCenterResultAccessor( cellEdgeResultColors->singleVarEdgeResultColors(),
|
|
||||||
timeStepIndex,
|
|
||||||
eclipseCase,
|
|
||||||
grid );
|
|
||||||
|
|
||||||
for ( size_t cubeFaceIdx = 0; cubeFaceIdx < 6; cubeFaceIdx++ )
|
|
||||||
{
|
|
||||||
cellEdgeResultAccessor->setDataAccessObjectForFace( static_cast<cvf::StructGridInterface::FaceType>( cubeFaceIdx ),
|
|
||||||
daObj.p() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RigEclipseResultAddress resultAddresses[6];
|
|
||||||
cellEdgeResultColors->gridScalarIndices( resultAddresses );
|
|
||||||
|
|
||||||
std::vector<RimCellEdgeMetaData> metaData;
|
std::vector<RimCellEdgeMetaData> metaData;
|
||||||
cellEdgeResultColors->cellEdgeMetaData( &metaData );
|
cellEdgeResultColors->cellEdgeMetaData( &metaData );
|
||||||
@ -357,7 +340,6 @@ cvf::ref<RigResultAccessor> RivCellEdgeGeometryUtils::createCellEdgeResultAccess
|
|||||||
cellEdgeResultAccessor->setDataAccessObjectForFace( static_cast<cvf::StructGridInterface::FaceType>( cubeFaceIdx ),
|
cellEdgeResultAccessor->setDataAccessObjectForFace( static_cast<cvf::StructGridInterface::FaceType>( cubeFaceIdx ),
|
||||||
daObj.p() );
|
daObj.p() );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return cellEdgeResultAccessor;
|
return cellEdgeResultAccessor;
|
||||||
}
|
}
|
||||||
|
@ -20,9 +20,12 @@
|
|||||||
|
|
||||||
#include "RimCellEdgeColors.h"
|
#include "RimCellEdgeColors.h"
|
||||||
|
|
||||||
#include "RigCaseCellResultsData.h"
|
#include "RicCreateEnsembleWellLogUi.h"
|
||||||
#include "RigFlowDiagResults.h"
|
|
||||||
|
|
||||||
|
#include "RigCaseCellResultsData.h"
|
||||||
|
#include "RigEclipseResultAddress.h"
|
||||||
|
|
||||||
|
#include "RimEclipseCase.h"
|
||||||
#include "RimEclipseCellColors.h"
|
#include "RimEclipseCellColors.h"
|
||||||
#include "RimEclipseView.h"
|
#include "RimEclipseView.h"
|
||||||
#include "RimRegularLegendConfig.h"
|
#include "RimRegularLegendConfig.h"
|
||||||
@ -30,8 +33,11 @@
|
|||||||
|
|
||||||
#include "cafPdmUiListEditor.h"
|
#include "cafPdmUiListEditor.h"
|
||||||
#include "cafPdmUiTreeOrdering.h"
|
#include "cafPdmUiTreeOrdering.h"
|
||||||
|
#include "cafPdmUiTreeSelectionEditor.h"
|
||||||
|
|
||||||
#include "cvfMath.h"
|
#include "cvfMath.h"
|
||||||
|
|
||||||
|
#include "RiaLogging.h"
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
namespace caf
|
namespace caf
|
||||||
@ -40,7 +46,8 @@ template <>
|
|||||||
void AppEnum<RimCellEdgeColors::PropertyType>::setUp()
|
void AppEnum<RimCellEdgeColors::PropertyType>::setUp()
|
||||||
{
|
{
|
||||||
addItem( RimCellEdgeColors::MULTI_AXIS_STATIC_PROPERTY, "MULTI_AXIS_STATIC_PROPERTY", "Multi Axis Static Property" );
|
addItem( RimCellEdgeColors::MULTI_AXIS_STATIC_PROPERTY, "MULTI_AXIS_STATIC_PROPERTY", "Multi Axis Static Property" );
|
||||||
addItem( RimCellEdgeColors::ANY_SINGLE_PROPERTY, "ANY_SINGLE_PROPERTY", "Any Single Property" );
|
QStringList aliasList = { "ANY_SINGLE_PROPERTY" };
|
||||||
|
addItem( RimCellEdgeColors::CUSTOM_PROPERTIES, "CUSTOM_PROPERTIES", "Selected Properties", aliasList );
|
||||||
setDefault( RimCellEdgeColors::MULTI_AXIS_STATIC_PROPERTY );
|
setDefault( RimCellEdgeColors::MULTI_AXIS_STATIC_PROPERTY );
|
||||||
}
|
}
|
||||||
} // namespace caf
|
} // namespace caf
|
||||||
@ -65,13 +72,28 @@ RimCellEdgeColors::RimCellEdgeColors()
|
|||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", ":/Legend.png" );
|
CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", ":/Legend.png" );
|
||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault( &m_singleVarEdgeResultColors, "SingleVarEdgeResult", "Result Property", ":/CellResult.png" );
|
CAF_PDM_InitFieldNoDefault( &m_selectedKeywords, "SelectedProperties", "Selected Properties" );
|
||||||
m_singleVarEdgeResultColors = new RimEclipseCellColors();
|
m_selectedKeywords.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() );
|
||||||
|
|
||||||
|
CAF_PDM_InitField( &m_showTextValuesIfItemIsUnchecked,
|
||||||
|
"ShowTextValuesIfItemIsUnchecked",
|
||||||
|
false,
|
||||||
|
"Always Show Values in Result Info Window",
|
||||||
|
"",
|
||||||
|
"Allow display of result values in Result Info window if the Cell Edge object is unchecked in "
|
||||||
|
"Property Editor." );
|
||||||
|
|
||||||
m_resultVariable.uiCapability()->setUiEditorTypeName( caf::PdmUiListEditor::uiEditorTypeName() );
|
m_resultVariable.uiCapability()->setUiEditorTypeName( caf::PdmUiListEditor::uiEditorTypeName() );
|
||||||
|
|
||||||
m_legendConfig = new RimRegularLegendConfig();
|
m_legendConfig = new RimRegularLegendConfig();
|
||||||
|
|
||||||
|
CAF_PDM_InitFieldNoDefault( &m_singleVarEdgeResultColors_OBSOLETE,
|
||||||
|
"SingleVarEdgeResult",
|
||||||
|
"Result Property",
|
||||||
|
":/CellResult.png" );
|
||||||
|
m_singleVarEdgeResultColors_OBSOLETE = new RimEclipseCellColors();
|
||||||
|
m_singleVarEdgeResultColors_OBSOLETE.uiCapability()->setUiHidden( true );
|
||||||
|
|
||||||
m_ignoredResultScalar = cvf::UNDEFINED_DOUBLE;
|
m_ignoredResultScalar = cvf::UNDEFINED_DOUBLE;
|
||||||
resetResultAddresses();
|
resetResultAddresses();
|
||||||
}
|
}
|
||||||
@ -89,7 +111,6 @@ RimCellEdgeColors::~RimCellEdgeColors()
|
|||||||
void RimCellEdgeColors::setReservoirView( RimEclipseView* ownerReservoirView )
|
void RimCellEdgeColors::setReservoirView( RimEclipseView* ownerReservoirView )
|
||||||
{
|
{
|
||||||
m_reservoirView = ownerReservoirView;
|
m_reservoirView = ownerReservoirView;
|
||||||
m_singleVarEdgeResultColors->setReservoirView( ownerReservoirView );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -97,24 +118,47 @@ void RimCellEdgeColors::setReservoirView( RimEclipseView* ownerReservoirView )
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimCellEdgeColors::loadResult()
|
void RimCellEdgeColors::loadResult()
|
||||||
{
|
{
|
||||||
if ( !m_enableCellEdgeColors ) return;
|
|
||||||
if ( !m_reservoirView->currentGridCellResults() ) return;
|
if ( !m_reservoirView->currentGridCellResults() ) return;
|
||||||
|
|
||||||
if ( isUsingSingleVariable() )
|
resetResultAddresses();
|
||||||
{
|
|
||||||
m_singleVarEdgeResultColors->loadResult();
|
|
||||||
;
|
|
||||||
|
|
||||||
RigEclipseResultAddress resultAddr = m_singleVarEdgeResultColors->eclipseResultAddress();
|
if ( isUserDefinedPropertiesActive() )
|
||||||
for ( int cubeFaceIdx = 0; cubeFaceIdx < 6; ++cubeFaceIdx )
|
|
||||||
{
|
{
|
||||||
m_resultNameToAddressPairs[cubeFaceIdx] =
|
std::vector<RiaDefines::ResultCatType> categories = { RiaDefines::ResultCatType::STATIC_NATIVE,
|
||||||
std::make_pair( m_singleVarEdgeResultColors->resultVariable(), resultAddr );
|
RiaDefines::ResultCatType::DYNAMIC_NATIVE,
|
||||||
|
RiaDefines::ResultCatType::INPUT_PROPERTY };
|
||||||
|
|
||||||
|
std::vector<QString> resultNames = m_selectedKeywords();
|
||||||
|
if ( resultNames.size() > 6 )
|
||||||
|
{
|
||||||
|
QString title = "Cell Edge Results";
|
||||||
|
|
||||||
|
QString text =
|
||||||
|
QString( "Selected Cell Edge result property count is %1. Up to 6 results are supported, no "
|
||||||
|
"data will be loaded.\n\nPlease select equal to or less than 6 properties to show data." )
|
||||||
|
.arg( resultNames.size() );
|
||||||
|
|
||||||
|
RiaLogging::errorInMessageBox( nullptr, title, text );
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto properties = RicCreateEnsembleWellLogUi::properties( resultNames,
|
||||||
|
categories,
|
||||||
|
m_reservoirView->eclipseCase()->eclipseCaseData() );
|
||||||
|
|
||||||
|
for ( size_t i = 0; i < properties.size(); i++ )
|
||||||
|
{
|
||||||
|
auto [name, category] = properties[i];
|
||||||
|
RigEclipseResultAddress adr = RigEclipseResultAddress( category, name );
|
||||||
|
|
||||||
|
m_reservoirView->currentGridCellResults()->ensureKnownResultLoaded( adr );
|
||||||
|
|
||||||
|
m_resultNameToAddressPairs[i] = std::make_pair( name, adr );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resetResultAddresses();
|
|
||||||
QStringList vars = findResultVariableNames();
|
QStringList vars = findResultVariableNames();
|
||||||
updateIgnoredScalarValue();
|
updateIgnoredScalarValue();
|
||||||
|
|
||||||
@ -151,8 +195,12 @@ void RimCellEdgeColors::loadResult()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimCellEdgeColors::initAfterRead()
|
void RimCellEdgeColors::initAfterRead()
|
||||||
{
|
{
|
||||||
m_singleVarEdgeResultColors->initAfterRead();
|
|
||||||
this->updateUiIconFromToggleField();
|
this->updateUiIconFromToggleField();
|
||||||
|
|
||||||
|
if ( m_singleVarEdgeResultColors_OBSOLETE->resultVariableUiName() != RiaResultNames::undefinedResultName() )
|
||||||
|
{
|
||||||
|
m_selectedKeywords.v().push_back( m_singleVarEdgeResultColors_OBSOLETE->resultVariableUiName() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -192,6 +240,8 @@ void RimCellEdgeColors::EdgeFaceEnum::setUp()
|
|||||||
|
|
||||||
QList<caf::PdmOptionItemInfo> RimCellEdgeColors::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions )
|
QList<caf::PdmOptionItemInfo> RimCellEdgeColors::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions )
|
||||||
{
|
{
|
||||||
|
QList<caf::PdmOptionItemInfo> options;
|
||||||
|
|
||||||
if ( fieldNeedingOptions == &m_resultVariable )
|
if ( fieldNeedingOptions == &m_resultVariable )
|
||||||
{
|
{
|
||||||
if ( m_reservoirView && m_reservoirView->currentGridCellResults() )
|
if ( m_reservoirView && m_reservoirView->currentGridCellResults() )
|
||||||
@ -202,8 +252,6 @@ QList<caf::PdmOptionItemInfo> RimCellEdgeColors::calculateValueOptions( const ca
|
|||||||
// TODO: Must also handle input properties
|
// TODO: Must also handle input properties
|
||||||
// varList += m_reservoirView->gridCellResults()->resultNames(RiaDefines::INPUT_PROPERTY);
|
// varList += m_reservoirView->gridCellResults()->resultNames(RiaDefines::INPUT_PROPERTY);
|
||||||
|
|
||||||
QList<caf::PdmOptionItemInfo> options;
|
|
||||||
|
|
||||||
std::map<QString, std::array<QString, 6>> varBaseNameToVarsMap;
|
std::map<QString, std::array<QString, 6>> varBaseNameToVarsMap;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@ -258,6 +306,41 @@ QList<caf::PdmOptionItemInfo> RimCellEdgeColors::calculateValueOptions( const ca
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( fieldNeedingOptions == &m_selectedKeywords )
|
||||||
|
{
|
||||||
|
RigCaseCellResultsData* resultData = m_reservoirView->currentGridCellResults();
|
||||||
|
|
||||||
|
std::vector<RiaDefines::ResultCatType> resultCategories = { RiaDefines::ResultCatType::STATIC_NATIVE,
|
||||||
|
RiaDefines::ResultCatType::DYNAMIC_NATIVE,
|
||||||
|
RiaDefines::ResultCatType::INPUT_PROPERTY };
|
||||||
|
|
||||||
|
for ( auto catType : resultCategories )
|
||||||
|
{
|
||||||
|
QList<caf::PdmOptionItemInfo> allOptions =
|
||||||
|
RimEclipseResultDefinition::calcOptionsForVariableUiFieldStandard( catType, resultData );
|
||||||
|
|
||||||
|
bool isFirstOfCategory = true;
|
||||||
|
for ( const caf::PdmOptionItemInfo& option : allOptions )
|
||||||
|
{
|
||||||
|
if ( resultData->hasResultEntry( RigEclipseResultAddress( catType, option.optionUiText() ) ) )
|
||||||
|
{
|
||||||
|
if ( isFirstOfCategory )
|
||||||
|
{
|
||||||
|
// Add the category title only when there is at least one valid result
|
||||||
|
options.push_back(
|
||||||
|
caf::PdmOptionItemInfo::createHeader( caf::AppEnum<RiaDefines::ResultCatType>::uiText( catType ),
|
||||||
|
true ) );
|
||||||
|
isFirstOfCategory = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
options.push_back( option );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
return QList<caf::PdmOptionItemInfo>();
|
return QList<caf::PdmOptionItemInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,11 +349,12 @@ QList<caf::PdmOptionItemInfo> RimCellEdgeColors::calculateValueOptions( const ca
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimCellEdgeColors::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
|
void RimCellEdgeColors::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
|
||||||
{
|
{
|
||||||
|
uiOrdering.add( &m_showTextValuesIfItemIsUnchecked );
|
||||||
uiOrdering.add( &m_propertyType );
|
uiOrdering.add( &m_propertyType );
|
||||||
|
|
||||||
if ( isUsingSingleVariable() )
|
if ( isUserDefinedPropertiesActive() )
|
||||||
{
|
{
|
||||||
m_singleVarEdgeResultColors->uiOrdering( uiConfigName, uiOrdering );
|
uiOrdering.add( &m_selectedKeywords );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -323,13 +407,15 @@ QStringList RimCellEdgeColors::findResultVariableNames()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RimCellEdgeColors::gridScalarIndices( RigEclipseResultAddress resultIndices[6] )
|
std::array<RigEclipseResultAddress, 6> RimCellEdgeColors::resultAddresses() const
|
||||||
{
|
{
|
||||||
int cubeFaceIndex;
|
std::array<RigEclipseResultAddress, 6> adr;
|
||||||
for ( cubeFaceIndex = 0; cubeFaceIndex < 6; ++cubeFaceIndex )
|
for ( int cubeFaceIndex = 0; cubeFaceIndex < 6; ++cubeFaceIndex )
|
||||||
{
|
{
|
||||||
resultIndices[cubeFaceIndex] = RigEclipseResultAddress( m_resultNameToAddressPairs[cubeFaceIndex].second );
|
adr[cubeFaceIndex] = RigEclipseResultAddress( m_resultNameToAddressPairs[cubeFaceIndex].second );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return adr;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -349,9 +435,9 @@ void RimCellEdgeColors::gridScalarResultNames( std::vector<QString>* resultNames
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RimCellEdgeColors::isUsingSingleVariable() const
|
bool RimCellEdgeColors::isUserDefinedPropertiesActive() const
|
||||||
{
|
{
|
||||||
return ( m_propertyType == ANY_SINGLE_PROPERTY );
|
return ( m_propertyType == CUSTOM_PROPERTIES );
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -361,22 +447,22 @@ void RimCellEdgeColors::cellEdgeMetaData( std::vector<RimCellEdgeMetaData>* meta
|
|||||||
{
|
{
|
||||||
CVF_ASSERT( metaDataVector );
|
CVF_ASSERT( metaDataVector );
|
||||||
|
|
||||||
RigEclipseResultAddress resultIndices[6];
|
auto addresses = this->resultAddresses();
|
||||||
this->gridScalarIndices( resultIndices );
|
|
||||||
|
|
||||||
std::vector<QString> resultNames;
|
std::vector<QString> resultNames;
|
||||||
this->gridScalarResultNames( &resultNames );
|
this->gridScalarResultNames( &resultNames );
|
||||||
|
|
||||||
bool isStatic = true;
|
bool isStatic = true;
|
||||||
if ( isUsingSingleVariable() )
|
|
||||||
{
|
|
||||||
isStatic = m_singleVarEdgeResultColors->resultType() == RiaDefines::ResultCatType::STATIC_NATIVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( size_t i = 0; i < 6; i++ )
|
for ( size_t i = 0; i < 6; i++ )
|
||||||
{
|
{
|
||||||
|
if ( isUserDefinedPropertiesActive() )
|
||||||
|
{
|
||||||
|
isStatic = addresses[i].resultCatType() == RiaDefines::ResultCatType::STATIC_NATIVE;
|
||||||
|
}
|
||||||
|
|
||||||
RimCellEdgeMetaData metaData;
|
RimCellEdgeMetaData metaData;
|
||||||
metaData.m_eclipseResultAddress = resultIndices[i];
|
metaData.m_eclipseResultAddress = addresses[i];
|
||||||
metaData.m_resultVariable = resultNames[i];
|
metaData.m_resultVariable = resultNames[i];
|
||||||
metaData.m_isStatic = isStatic;
|
metaData.m_isStatic = isStatic;
|
||||||
|
|
||||||
@ -403,7 +489,17 @@ bool RimCellEdgeColors::hasResult() const
|
|||||||
{
|
{
|
||||||
if ( !m_enableCellEdgeColors() ) return false;
|
if ( !m_enableCellEdgeColors() ) return false;
|
||||||
|
|
||||||
if ( isUsingSingleVariable() && m_singleVarEdgeResultColors->isFlowDiagOrInjectionFlooding() )
|
return showTextResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RimCellEdgeColors::showTextResult() const
|
||||||
|
{
|
||||||
|
if ( !m_enableCellEdgeColors && !m_showTextValuesIfItemIsUnchecked ) return false;
|
||||||
|
|
||||||
|
if ( isUserDefinedPropertiesActive() )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -444,19 +540,7 @@ void RimCellEdgeColors::minMaxCellEdgeValues( double& min, double& max )
|
|||||||
|
|
||||||
if ( m_reservoirView->currentGridCellResults() )
|
if ( m_reservoirView->currentGridCellResults() )
|
||||||
{
|
{
|
||||||
if ( isUsingSingleVariable() && singleVarEdgeResultColors()->isFlowDiagOrInjectionFlooding() )
|
auto resultAddresses = this->resultAddresses();
|
||||||
{
|
|
||||||
int currentTimeStep = m_reservoirView->currentTimeStep();
|
|
||||||
|
|
||||||
RigFlowDiagResults* fldResults = singleVarEdgeResultColors()->flowDiagSolution()->flowDiagResults();
|
|
||||||
RigFlowDiagResultAddress resAddr = singleVarEdgeResultColors()->flowDiagResAddress();
|
|
||||||
|
|
||||||
fldResults->minMaxScalarValues( resAddr, currentTimeStep, &globalMin, &globalMax );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RigEclipseResultAddress resultAddresses[6];
|
|
||||||
this->gridScalarIndices( resultAddresses );
|
|
||||||
|
|
||||||
size_t faceIdx;
|
size_t faceIdx;
|
||||||
for ( faceIdx = 0; faceIdx < 6; faceIdx++ )
|
for ( faceIdx = 0; faceIdx < 6; faceIdx++ )
|
||||||
@ -472,7 +556,6 @@ void RimCellEdgeColors::minMaxCellEdgeValues( double& min, double& max )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
min = globalMin;
|
min = globalMin;
|
||||||
max = globalMax;
|
max = globalMax;
|
||||||
@ -486,8 +569,7 @@ void RimCellEdgeColors::posNegClosestToZero( double& pos, double& neg )
|
|||||||
pos = HUGE_VAL;
|
pos = HUGE_VAL;
|
||||||
neg = -HUGE_VAL;
|
neg = -HUGE_VAL;
|
||||||
|
|
||||||
RigEclipseResultAddress resultAddresses[6];
|
auto resultAddresses = this->resultAddresses();
|
||||||
this->gridScalarIndices( resultAddresses );
|
|
||||||
|
|
||||||
size_t faceIdx;
|
size_t faceIdx;
|
||||||
for ( faceIdx = 0; faceIdx < 6; faceIdx++ )
|
for ( faceIdx = 0; faceIdx < 6; faceIdx++ )
|
||||||
@ -504,22 +586,6 @@ void RimCellEdgeColors::posNegClosestToZero( double& pos, double& neg )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimCellEdgeColors::updateUiFieldsFromActiveResult()
|
|
||||||
{
|
|
||||||
m_singleVarEdgeResultColors->updateUiFieldsFromActiveResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RimCellEdgeColors::setEclipseCase( RimEclipseCase* eclipseCase )
|
|
||||||
{
|
|
||||||
m_singleVarEdgeResultColors->setEclipseCase( eclipseCase );
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -528,49 +594,21 @@ void RimCellEdgeColors::setResultVariable( const QString& variableName )
|
|||||||
m_resultVariable = variableName;
|
m_resultVariable = variableName;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
QString RimCellEdgeColors::resultVariable() const
|
|
||||||
{
|
|
||||||
if ( isUsingSingleVariable() )
|
|
||||||
{
|
|
||||||
return m_singleVarEdgeResultColors->resultVariable();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return m_resultVariable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
QString RimCellEdgeColors::resultVariableUiName() const
|
|
||||||
{
|
|
||||||
if ( isUsingSingleVariable() )
|
|
||||||
{
|
|
||||||
return m_singleVarEdgeResultColors->resultVariableUiName();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return m_resultVariable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
QString RimCellEdgeColors::resultVariableUiShortName() const
|
QString RimCellEdgeColors::resultVariableUiShortName() const
|
||||||
{
|
{
|
||||||
if ( isUsingSingleVariable() )
|
if ( isUserDefinedPropertiesActive() )
|
||||||
{
|
{
|
||||||
return m_singleVarEdgeResultColors->resultVariableUiShortName();
|
if ( m_selectedKeywords().empty() ) return "";
|
||||||
|
|
||||||
|
if ( m_selectedKeywords().size() == 1 ) return m_selectedKeywords().front();
|
||||||
|
|
||||||
|
return "Multiple Properties";
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return m_resultVariable;
|
return m_resultVariable;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -589,35 +627,12 @@ caf::PdmFieldHandle* RimCellEdgeColors::objectToggleField()
|
|||||||
return &m_enableCellEdgeColors;
|
return &m_enableCellEdgeColors;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
bool RimCellEdgeColors::hasCategoryResult() const
|
|
||||||
{
|
|
||||||
return isUsingSingleVariable() && m_singleVarEdgeResultColors->hasCategoryResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RimEclipseCellColors* RimCellEdgeColors::singleVarEdgeResultColors()
|
|
||||||
{
|
|
||||||
return m_singleVarEdgeResultColors;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RimRegularLegendConfig* RimCellEdgeColors::legendConfig()
|
RimRegularLegendConfig* RimCellEdgeColors::legendConfig()
|
||||||
{
|
{
|
||||||
if ( isUsingSingleVariable() )
|
return m_legendConfig();
|
||||||
{
|
|
||||||
return m_singleVarEdgeResultColors->legendConfig();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return m_legendConfig;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -68,39 +68,33 @@ public:
|
|||||||
enum PropertyType
|
enum PropertyType
|
||||||
{
|
{
|
||||||
MULTI_AXIS_STATIC_PROPERTY,
|
MULTI_AXIS_STATIC_PROPERTY,
|
||||||
ANY_SINGLE_PROPERTY
|
CUSTOM_PROPERTIES
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef caf::AppEnum<RimCellEdgeColors::EdgeFaceType> EdgeFaceEnum;
|
typedef caf::AppEnum<RimCellEdgeColors::EdgeFaceType> EdgeFaceEnum;
|
||||||
|
|
||||||
void setReservoirView( RimEclipseView* ownerReservoirView );
|
void setReservoirView( RimEclipseView* ownerReservoirView );
|
||||||
void setEclipseCase( RimEclipseCase* eclipseCase );
|
|
||||||
|
|
||||||
void setResultVariable( const QString& variableName );
|
void setResultVariable( const QString& variableName );
|
||||||
QString resultVariable() const;
|
|
||||||
QString resultVariableUiName() const;
|
|
||||||
QString resultVariableUiShortName() const;
|
QString resultVariableUiShortName() const;
|
||||||
|
|
||||||
void setActive( bool active );
|
void setActive( bool active );
|
||||||
|
|
||||||
double ignoredScalarValue() { return m_ignoredResultScalar; }
|
double ignoredScalarValue() { return m_ignoredResultScalar; }
|
||||||
void gridScalarIndices( RigEclipseResultAddress resultIndices[6] );
|
std::array<RigEclipseResultAddress, 6> resultAddresses() const;
|
||||||
void cellEdgeMetaData( std::vector<RimCellEdgeMetaData>* metaData );
|
void cellEdgeMetaData( std::vector<RimCellEdgeMetaData>* metaData );
|
||||||
|
|
||||||
void loadResult();
|
void loadResult();
|
||||||
bool hasResult() const;
|
bool hasResult() const;
|
||||||
bool hasCategoryResult() const;
|
bool showTextResult() const;
|
||||||
bool isUsingSingleVariable() const;
|
bool isUserDefinedPropertiesActive() const;
|
||||||
|
|
||||||
RimEclipseCellColors* singleVarEdgeResultColors();
|
|
||||||
RimRegularLegendConfig* legendConfig();
|
RimRegularLegendConfig* legendConfig();
|
||||||
PropertyType propertyType() const;
|
PropertyType propertyType() const;
|
||||||
|
|
||||||
void minMaxCellEdgeValues( double& min, double& max );
|
void minMaxCellEdgeValues( double& min, double& max );
|
||||||
void posNegClosestToZero( double& pos, double& neg );
|
void posNegClosestToZero( double& pos, double& neg );
|
||||||
|
|
||||||
void updateUiFieldsFromActiveResult();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initAfterRead() override;
|
void initAfterRead() override;
|
||||||
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
|
||||||
@ -130,5 +124,9 @@ private:
|
|||||||
|
|
||||||
caf::PdmField<caf::AppEnum<PropertyType>> m_propertyType;
|
caf::PdmField<caf::AppEnum<PropertyType>> m_propertyType;
|
||||||
caf::PdmChildField<RimRegularLegendConfig*> m_legendConfig;
|
caf::PdmChildField<RimRegularLegendConfig*> m_legendConfig;
|
||||||
caf::PdmChildField<RimEclipseCellColors*> m_singleVarEdgeResultColors;
|
caf::PdmField<std::vector<QString>> m_selectedKeywords;
|
||||||
|
caf::PdmField<bool> m_showTextValuesIfItemIsUnchecked;
|
||||||
|
|
||||||
|
// Obsolete fields
|
||||||
|
caf::PdmChildField<RimEclipseCellColors*> m_singleVarEdgeResultColors_OBSOLETE;
|
||||||
};
|
};
|
||||||
|
@ -609,7 +609,6 @@ void RimEclipseResultDefinition::loadDataAndUpdate()
|
|||||||
this->firstAncestorOrThisOfType( cellEdgeColors );
|
this->firstAncestorOrThisOfType( cellEdgeColors );
|
||||||
if ( cellEdgeColors )
|
if ( cellEdgeColors )
|
||||||
{
|
{
|
||||||
cellEdgeColors->singleVarEdgeResultColors()->updateLegendCategorySettings();
|
|
||||||
cellEdgeColors->loadResult();
|
cellEdgeColors->loadResult();
|
||||||
|
|
||||||
if ( view )
|
if ( view )
|
||||||
|
@ -1400,11 +1400,6 @@ void RimEclipseView::onUpdateLegends()
|
|||||||
{
|
{
|
||||||
if ( this->cellEdgeResult()->hasResult() )
|
if ( this->cellEdgeResult()->hasResult() )
|
||||||
{
|
{
|
||||||
if ( this->cellEdgeResult()->isUsingSingleVariable() )
|
|
||||||
{
|
|
||||||
this->cellEdgeResult()->singleVarEdgeResultColors()->updateRangesForEmbeddedLegends( m_currentTimeStep );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
double globalMin, globalMax;
|
double globalMin, globalMax;
|
||||||
double globalPosClosestToZero, globalNegClosestToZero;
|
double globalPosClosestToZero, globalNegClosestToZero;
|
||||||
@ -1416,21 +1411,6 @@ void RimEclipseView::onUpdateLegends()
|
|||||||
globalPosClosestToZero,
|
globalPosClosestToZero,
|
||||||
globalNegClosestToZero );
|
globalNegClosestToZero );
|
||||||
this->cellEdgeResult()->legendConfig()->setAutomaticRanges( globalMin, globalMax, globalMin, globalMax );
|
this->cellEdgeResult()->legendConfig()->setAutomaticRanges( globalMin, globalMax, globalMin, globalMax );
|
||||||
|
|
||||||
if ( this->cellEdgeResult()->hasCategoryResult() )
|
|
||||||
{
|
|
||||||
if ( cellEdgeResult()->singleVarEdgeResultColors()->resultType() !=
|
|
||||||
RiaDefines::ResultCatType::FORMATION_NAMES )
|
|
||||||
{
|
|
||||||
cellEdgeResult()->legendConfig()->setIntegerCategories( results->uniqueCellScalarValues(
|
|
||||||
cellEdgeResult()->singleVarEdgeResultColors()->eclipseResultAddress() ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const std::vector<QString> fnVector = eclipseCase->formationNames();
|
|
||||||
cellEdgeResult()->legendConfig()->setNamedCategories( fnVector );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this->cellEdgeResult()->legendConfig()->setTitle( QString( "Edge Results: \n" ) +
|
this->cellEdgeResult()->legendConfig()->setTitle( QString( "Edge Results: \n" ) +
|
||||||
@ -1557,7 +1537,6 @@ void RimEclipseView::setEclipseCase( RimEclipseCase* reservoir )
|
|||||||
faultResultSettings()->customFaultResult()->setEclipseCase( reservoir );
|
faultResultSettings()->customFaultResult()->setEclipseCase( reservoir );
|
||||||
cellFilterCollection()->setCase( reservoir );
|
cellFilterCollection()->setCase( reservoir );
|
||||||
m_streamlineCollection->setEclipseCase( reservoir );
|
m_streamlineCollection->setEclipseCase( reservoir );
|
||||||
cellEdgeResult()->setEclipseCase( reservoir );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -1703,13 +1703,6 @@ void RiuMainWindow::updateUiFieldsFromActiveResult( caf::PdmObjectHandle* object
|
|||||||
{
|
{
|
||||||
eclFaultColors->updateUiFieldsFromActiveResult();
|
eclFaultColors->updateUiFieldsFromActiveResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
RimCellEdgeColors* cellEdgeColors = nullptr;
|
|
||||||
cellEdgeColors = dynamic_cast<RimCellEdgeColors*>( objectToUpdate );
|
|
||||||
if ( cellEdgeColors )
|
|
||||||
{
|
|
||||||
cellEdgeColors->updateUiFieldsFromActiveResult();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -732,28 +732,23 @@ QString RiuResultTextBuilder::cellEdgeResultDetails()
|
|||||||
{
|
{
|
||||||
QString text;
|
QString text;
|
||||||
|
|
||||||
if ( m_viewWithFaultsSettings && m_viewWithFaultsSettings->cellEdgeResult()->hasResult() )
|
if ( m_viewWithFaultsSettings && m_viewWithFaultsSettings->cellEdgeResult()->showTextResult() )
|
||||||
{
|
{
|
||||||
|
m_viewWithFaultsSettings->cellEdgeResult()->loadResult();
|
||||||
|
|
||||||
text += "-- Cell edge result data --\n";
|
text += "-- Cell edge result data --\n";
|
||||||
|
|
||||||
if ( m_viewWithFaultsSettings->cellEdgeResult()->isUsingSingleVariable() )
|
|
||||||
{
|
|
||||||
text += cellResultText( m_viewWithFaultsSettings->cellEdgeResult()->singleVarEdgeResultColors() );
|
|
||||||
text += "\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::vector<RimCellEdgeMetaData> metaData;
|
std::vector<RimCellEdgeMetaData> metaData;
|
||||||
m_viewWithFaultsSettings->cellEdgeResult()->cellEdgeMetaData( &metaData );
|
m_viewWithFaultsSettings->cellEdgeResult()->cellEdgeMetaData( &metaData );
|
||||||
|
|
||||||
std::set<RigEclipseResultAddress> uniqueResultIndices;
|
std::set<RigEclipseResultAddress> uniqueResultAddresses;
|
||||||
|
|
||||||
for ( int idx = 0; idx < 6; idx++ )
|
for ( int idx = 0; idx < 6; idx++ )
|
||||||
{
|
{
|
||||||
RigEclipseResultAddress resultAddr = metaData[idx].m_eclipseResultAddress;
|
RigEclipseResultAddress resultAddr = metaData[idx].m_eclipseResultAddress;
|
||||||
if ( !resultAddr.isValid() ) continue;
|
if ( !resultAddr.isValid() ) continue;
|
||||||
|
|
||||||
if ( uniqueResultIndices.find( resultAddr ) != uniqueResultIndices.end() ) continue;
|
if ( uniqueResultAddresses.find( resultAddr ) != uniqueResultAddresses.end() ) continue;
|
||||||
|
|
||||||
size_t adjustedTimeStep = m_timeStepIndex;
|
size_t adjustedTimeStep = m_timeStepIndex;
|
||||||
if ( metaData[idx].m_isStatic )
|
if ( metaData[idx].m_isStatic )
|
||||||
@ -773,8 +768,7 @@ QString RiuResultTextBuilder::cellEdgeResultDetails()
|
|||||||
double scalarValue = resultAccessor->cellScalar( m_cellIndex );
|
double scalarValue = resultAccessor->cellScalar( m_cellIndex );
|
||||||
text.append( QString( "%1 : %2\n" ).arg( metaData[idx].m_resultVariable ).arg( scalarValue ) );
|
text.append( QString( "%1 : %2\n" ).arg( metaData[idx].m_resultVariable ).arg( scalarValue ) );
|
||||||
|
|
||||||
uniqueResultIndices.insert( resultAddr );
|
uniqueResultAddresses.insert( resultAddr );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user