mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-24 22:27:55 -05:00
Add preference setting to select which dynamic result to show as default (if available)
This commit is contained in:
1 parent
d83a492b14
commit
5293dbe015
13 files changed
+109
-38
No files matched your search
@@ -23,10 +23,12 @@
|
||||
#include "RiaPreferences.h"
|
||||
#include "RiaPreferencesSummary.h"
|
||||
#include "RiaPreferencesSystem.h"
|
||||
#include "RiaResultNames.h"
|
||||
|
||||
#include "RifReaderSettings.h"
|
||||
|
||||
#include "cafPdmUiCheckBoxEditor.h"
|
||||
#include "cafPdmUiComboBoxEditor.h"
|
||||
|
||||
CAF_PDM_SOURCE_INIT( RiaPreferencesGrid, "RifReaderSettings" );
|
||||
|
||||
@@ -90,9 +92,6 @@ RiaPreferencesGrid::RiaPreferencesGrid()
|
||||
"" );
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_autoComputeDepthRelatedProperties );
|
||||
|
||||
CAF_PDM_InitField( &m_loadAndShowSoil, "loadAndShowSoil", true, "Load and Show SOIL" );
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_loadAndShowSoil );
|
||||
|
||||
CAF_PDM_InitField( &m_onlyLoadActiveCells, "onlyLoadActiveCells", false, "Only Load Active Cell Geometry" );
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_onlyLoadActiveCells );
|
||||
|
||||
@@ -100,6 +99,16 @@ RiaPreferencesGrid::RiaPreferencesGrid()
|
||||
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_invalidateLongThinCells );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_radialGridMode, "radialGridMode", "Radial Grid Display Mode" );
|
||||
|
||||
CAF_PDM_InitField( &m_preferredDynamicResult, "preferredDynamicResult", QString( "SOIL" ), "Default Dynamic Result to Show:" );
|
||||
m_preferredDynamicResult.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() );
|
||||
m_preferredDynamicResult.uiCapability()->setAttribute( caf::PdmUiComboBoxEditor::Keys::ENABLE_EDITABLE_CONTENT, true );
|
||||
m_preferredDynamicResult.uiCapability()->setAttribute( caf::PdmUiComboBoxEditor::Keys::ENABLE_AUTO_COMPLETE, false );
|
||||
m_preferredDynamicResult.uiCapability()->setAttribute( caf::PdmUiComboBoxEditor::Keys::ADJUST_WIDTH_TO_CONTENTS, true );
|
||||
|
||||
CAF_PDM_InitField( &m_loadAndShowSoil_OBSOLETE, "loadAndShowSoil", true, "Load and Show SOIL" );
|
||||
m_loadAndShowSoil_OBSOLETE.uiCapability()->setUiHidden( true );
|
||||
m_loadAndShowSoil_OBSOLETE.xmlCapability()->setIOWritable( false );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -117,7 +126,7 @@ void RiaPreferencesGrid::appendItems( caf::PdmUiOrdering& uiOrdering )
|
||||
{
|
||||
auto newCBGroup = uiOrdering.addNewGroup( "Behavior When Loading Data" );
|
||||
newCBGroup->add( &m_autoComputeDepthRelatedProperties );
|
||||
newCBGroup->add( &m_loadAndShowSoil );
|
||||
newCBGroup->add( &m_preferredDynamicResult );
|
||||
newCBGroup->add( &m_invalidateLongThinCells );
|
||||
|
||||
if ( auto prefSummary = RiaPreferencesSummary::current() )
|
||||
@@ -252,9 +261,9 @@ bool RiaPreferencesGrid::skipWellData() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RiaPreferencesGrid::loadAndShowSoil() const
|
||||
QString RiaPreferencesGrid::preferredDynamicResult() const
|
||||
{
|
||||
return m_loadAndShowSoil;
|
||||
return m_preferredDynamicResult();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -344,3 +353,27 @@ RiaGridDefines::RadialGridMode RiaPreferencesGrid::radialGridMode() const
|
||||
{
|
||||
return m_radialGridMode();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QList<caf::PdmOptionItemInfo> RiaPreferencesGrid::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions )
|
||||
{
|
||||
QList<caf::PdmOptionItemInfo> options;
|
||||
|
||||
if ( fieldNeedingOptions == &m_preferredDynamicResult )
|
||||
{
|
||||
static std::vector<QString> resultNameOptions = { RiaResultNames::soil(),
|
||||
RiaResultNames::sgas(),
|
||||
RiaResultNames::swat(),
|
||||
RiaResultNames::pressure(),
|
||||
RiaResultNames::undefinedResultName() };
|
||||
|
||||
for ( auto& name : resultNameOptions )
|
||||
{
|
||||
options.push_back( caf::PdmOptionItemInfo( name, QVariant::fromValue( name ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
@@ -53,10 +53,10 @@ public:
|
||||
QString includeFileAbsolutePathPrefix() const;
|
||||
bool useResultIndexFile() const;
|
||||
bool skipWellData() const;
|
||||
bool loadAndShowSoil() const;
|
||||
bool autoComputeDepthRelatedProperties() const;
|
||||
bool onlyLoadActiveCells() const;
|
||||
bool invalidateLongThinCells() const;
|
||||
QString preferredDynamicResult() const;
|
||||
|
||||
RiaDefines::GridModelReader gridModelReader() const;
|
||||
|
||||
@@ -68,6 +68,9 @@ public:
|
||||
|
||||
void appendItems( caf::PdmUiOrdering& uiOrdering );
|
||||
|
||||
protected:
|
||||
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
|
||||
|
||||
private:
|
||||
caf::PdmField<GridModelEnum> m_gridModelReader;
|
||||
RiaDefines::GridModelReader m_gridModelReaderOverride;
|
||||
@@ -80,9 +83,11 @@ private:
|
||||
caf::PdmField<bool> m_useResultIndexFile;
|
||||
caf::PdmField<bool> m_skipWellData;
|
||||
caf::PdmField<bool> m_autoComputeDepthRelatedProperties;
|
||||
caf::PdmField<bool> m_loadAndShowSoil;
|
||||
caf::PdmField<bool> m_onlyLoadActiveCells;
|
||||
caf::PdmField<bool> m_invalidateLongThinCells;
|
||||
caf::PdmField<QString> m_preferredDynamicResult;
|
||||
|
||||
caf::PdmField<caf::AppEnum<RiaGridDefines::RadialGridMode>> m_radialGridMode;
|
||||
|
||||
caf::PdmField<bool> m_loadAndShowSoil_OBSOLETE;
|
||||
};
|
||||
@@ -488,6 +488,14 @@ QString RiaResultNames::swat()
|
||||
return "SWAT";
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QString RiaResultNames::pressure()
|
||||
{
|
||||
return "PRESSURE";
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -92,6 +92,7 @@ QString rockv();
|
||||
QString soil();
|
||||
QString sgas();
|
||||
QString swat();
|
||||
QString pressure();
|
||||
|
||||
QString sowcr();
|
||||
QString sogcr();
|
||||
|
||||
+4
-2
@@ -24,6 +24,7 @@
|
||||
#include "RiaLogging.h"
|
||||
#include "RiaQDateTimeTools.h"
|
||||
#include "RiaQStringFormatter.h"
|
||||
#include "RiaResultNames.h"
|
||||
#include "RigEclipseResultAddress.h"
|
||||
#include "Summary/RiaSummaryTools.h"
|
||||
|
||||
@@ -160,7 +161,7 @@ std::vector<RigCompletionData>
|
||||
if ( pdParams.performScaling )
|
||||
{
|
||||
RigCaseCellResultsData* results = caseToApply->results( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
||||
results->ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" ) );
|
||||
results->ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() ) );
|
||||
}
|
||||
|
||||
return generateCompdatValuesConst( caseToApply,
|
||||
@@ -234,7 +235,8 @@ std::vector<RigCompletionData>
|
||||
const std::vector<double>* currentMatrixPressures = nullptr;
|
||||
if ( performPressureDepletionScaling )
|
||||
{
|
||||
pressureResultVector = &results->cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" ) );
|
||||
pressureResultVector =
|
||||
&results->cellScalarResults( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() ) );
|
||||
CAF_ASSERT( !pressureResultVector->empty() );
|
||||
|
||||
if ( pdParams.pressureScalingTimeStep < static_cast<int>( pressureResultVector->size() ) )
|
||||
|
||||
+3
-2
@@ -22,7 +22,7 @@
|
||||
#include "RiaGuiApplication.h"
|
||||
#include "RiaLogging.h"
|
||||
#include "RiaPorosityModel.h"
|
||||
#include "RiuMessageDialog.h"
|
||||
#include "RiaResultNames.h"
|
||||
|
||||
#include "RigCaseCellResultsData.h"
|
||||
#include "RigEclipseCaseData.h"
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "RimSaturationPressurePlot.h"
|
||||
#include "RimSaturationPressurePlotCollection.h"
|
||||
|
||||
#include "RiuMessageDialog.h"
|
||||
#include "RiuPlotMainWindow.h"
|
||||
#include "RiuPlotMainWindowTools.h"
|
||||
|
||||
@@ -77,7 +78,7 @@ std::vector<RimSaturationPressurePlot*> RicCreateSaturationPressurePlotsFeature:
|
||||
{
|
||||
RigCaseCellResultsData* resultData = eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
||||
|
||||
if ( !resultData->hasResultEntry( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" ) ) )
|
||||
if ( !resultData->hasResultEntry( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() ) ) )
|
||||
{
|
||||
RiaLogging::error( "CreateSaturationPressurePlots : PRESSURE is not available " );
|
||||
return plots;
|
||||
|
||||
+2
-1
@@ -25,6 +25,7 @@
|
||||
#include "RiaDefines.h"
|
||||
#include "RiaEclipseUnitTools.h"
|
||||
#include "RiaPorosityModel.h"
|
||||
#include "RiaResultNames.h"
|
||||
|
||||
#include "RigCaseCellResultsData.h"
|
||||
#include "RigEclipseCaseData.h"
|
||||
@@ -73,7 +74,7 @@ void RimFaultReactivationDataAccessorPorePressure::updateResultAccessor()
|
||||
{
|
||||
if ( !m_caseData ) return;
|
||||
|
||||
RigEclipseResultAddress resVarAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" );
|
||||
RigEclipseResultAddress resVarAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() );
|
||||
m_eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->ensureKnownResultLoaded( resVarAddress );
|
||||
|
||||
m_resultAccessor =
|
||||
|
||||
+2
-1
@@ -21,6 +21,7 @@
|
||||
#include "RiaEclipseUnitTools.h"
|
||||
#include "RiaInterpolationTools.h"
|
||||
#include "RiaLogging.h"
|
||||
#include "RiaResultNames.h"
|
||||
#include "RiaWellLogUnitTools.h"
|
||||
|
||||
#include "RigCaseCellResultsData.h"
|
||||
@@ -84,7 +85,7 @@ void RimFaultReactivationDataAccessorStressEclipse::updateResultAccessor()
|
||||
{
|
||||
if ( !m_caseData ) return;
|
||||
|
||||
RigEclipseResultAddress resVarAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" );
|
||||
RigEclipseResultAddress resVarAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() );
|
||||
m_eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->ensureKnownResultLoaded( resVarAddress );
|
||||
|
||||
m_resultAccessor =
|
||||
|
||||
@@ -1040,7 +1040,7 @@ void RimEclipseStatisticsCase::populateResultSelection()
|
||||
QStringList varList =
|
||||
caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->resultNames( RiaDefines::ResultCatType::DYNAMIC_NATIVE );
|
||||
if ( varList.contains( RiaResultNames::soil() ) ) m_selectedDynamicProperties.v().push_back( RiaResultNames::soil() );
|
||||
if ( varList.contains( "PRESSURE" ) ) m_selectedDynamicProperties.v().push_back( "PRESSURE" );
|
||||
if ( varList.contains( RiaResultNames::pressure() ) ) m_selectedDynamicProperties.v().push_back( RiaResultNames::pressure() );
|
||||
}
|
||||
|
||||
if ( m_selectedStaticProperties().empty() )
|
||||
@@ -1056,7 +1056,8 @@ void RimEclipseStatisticsCase::populateResultSelection()
|
||||
QStringList varList =
|
||||
caseData->results( RiaDefines::PorosityModelType::FRACTURE_MODEL )->resultNames( RiaDefines::ResultCatType::DYNAMIC_NATIVE );
|
||||
if ( varList.contains( RiaResultNames::soil() ) ) m_selectedFractureDynamicProperties.v().push_back( RiaResultNames::soil() );
|
||||
if ( varList.contains( "PRESSURE" ) ) m_selectedFractureDynamicProperties.v().push_back( "PRESSURE" );
|
||||
if ( varList.contains( RiaResultNames::pressure() ) )
|
||||
m_selectedFractureDynamicProperties.v().push_back( RiaResultNames::pressure() );
|
||||
}
|
||||
|
||||
if ( m_selectedFractureStaticProperties().empty() )
|
||||
|
||||
@@ -309,15 +309,21 @@ void RimWellTargetMapping::updateAllBoundaries()
|
||||
};
|
||||
|
||||
std::tie( m_minimumSaturationOil, m_maximumSaturationOil, m_defaultSaturationOil ) =
|
||||
updateBoundaryValues( resultsData, { RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "SOIL" ) }, timeStepIdx );
|
||||
updateBoundaryValues( resultsData,
|
||||
{ RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::soil() ) },
|
||||
timeStepIdx );
|
||||
m_defaultSaturationOil = 0.3;
|
||||
|
||||
std::tie( m_minimumSaturationGas, m_maximumSaturationGas, m_defaultSaturationGas ) =
|
||||
updateBoundaryValues( resultsData, { RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "SGAS" ) }, timeStepIdx );
|
||||
updateBoundaryValues( resultsData,
|
||||
{ RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() ) },
|
||||
timeStepIdx );
|
||||
m_defaultSaturationGas = 0.3;
|
||||
|
||||
std::tie( m_minimumPressure, m_maximumPressure, m_defaultPressure ) =
|
||||
updateBoundaryValues( resultsData, { RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" ) }, timeStepIdx );
|
||||
updateBoundaryValues( resultsData,
|
||||
{ RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() ) },
|
||||
timeStepIdx );
|
||||
|
||||
std::tie( m_minimumPermeability, m_maximumPermeability, m_defaultPermeability ) =
|
||||
updateBoundaryValues( resultsData, { RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "PERMX" ) }, 0 );
|
||||
|
||||
@@ -840,32 +840,40 @@ RigEclipseResultAddress RigCaseCellResultsData::defaultResult() const
|
||||
auto isCandidateResult = []( const RigEclipseResultAddress& adr, RiaDefines::ResultCatType category )
|
||||
{ return adr.resultCatType() == category && adr.resultName() != RiaResultNames::completionTypeResultName(); };
|
||||
|
||||
auto preferredResult = RiaPreferencesGrid::current()->preferredDynamicResult();
|
||||
if ( preferredResult == RiaResultNames::undefinedResultName() )
|
||||
{
|
||||
return RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::undefinedResultName() );
|
||||
}
|
||||
|
||||
if ( maxTimeStepCount() > 0 )
|
||||
{
|
||||
auto prefs = RiaPreferencesGrid::current();
|
||||
if ( prefs->loadAndShowSoil() && m_ownerCaseData )
|
||||
if ( m_ownerCaseData )
|
||||
{
|
||||
// Use the saturation result matching the available phases, but only if the result exists or can be
|
||||
// computed, i.e. a result entry is present. See issue #10122.
|
||||
// Check which results are available
|
||||
const auto phases = m_ownerCaseData->availablePhases();
|
||||
|
||||
const RigEclipseResultAddress soilAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::soil() );
|
||||
if ( phases.contains( RiaDefines::PhaseType::OIL_PHASE ) && hasResultEntry( soilAddress ) )
|
||||
{
|
||||
return soilAddress;
|
||||
}
|
||||
|
||||
const RigEclipseResultAddress sgasAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::sgas() );
|
||||
if ( phases.contains( RiaDefines::PhaseType::GAS_PHASE ) && hasResultEntry( sgasAddress ) )
|
||||
|
||||
bool soilAvailable = phases.contains( RiaDefines::PhaseType::OIL_PHASE ) && hasResultEntry( soilAddress );
|
||||
bool sgasAvailable = phases.contains( RiaDefines::PhaseType::GAS_PHASE ) && hasResultEntry( sgasAddress );
|
||||
|
||||
if ( preferredResult == RiaResultNames::soil() )
|
||||
{
|
||||
return sgasAddress;
|
||||
if ( soilAvailable ) return soilAddress;
|
||||
if ( sgasAvailable ) return sgasAddress;
|
||||
}
|
||||
else if ( preferredResult == RiaResultNames::sgas() )
|
||||
{
|
||||
if ( sgasAvailable ) return sgasAddress;
|
||||
if ( soilAvailable ) return soilAddress;
|
||||
}
|
||||
|
||||
const RigEclipseResultAddress swatAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::swat() );
|
||||
if ( hasResultEntry( swatAddress ) )
|
||||
{
|
||||
return swatAddress;
|
||||
}
|
||||
const RigEclipseResultAddress defaultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, preferredResult );
|
||||
if ( hasResultEntry( defaultAddress ) ) return defaultAddress;
|
||||
|
||||
RiaLogging::warning( std::format( "Unable to find default dynamic result {}", preferredResult.toStdString() ) );
|
||||
}
|
||||
|
||||
auto dynamicResult = std::find_if( allResults.begin(),
|
||||
|
||||
@@ -116,7 +116,7 @@ void RigWellTargetMapping::generateCandidates( RimEclipseCase* eclips
|
||||
}
|
||||
}
|
||||
|
||||
RigEclipseResultAddress pressureAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" );
|
||||
RigEclipseResultAddress pressureAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() );
|
||||
resultsData->ensureKnownResultLoaded( pressureAddress );
|
||||
data.pressure = resultsData->cellScalarResults( pressureAddress, timeStepIdx );
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
|
||||
#include "RiuPvtPlotUpdater.h"
|
||||
|
||||
#include "RiaResultNames.h"
|
||||
|
||||
#include "RigCaseCellResultsData.h"
|
||||
#include "RigEclipseCaseData.h"
|
||||
#include "RigEclipseResultAddress.h"
|
||||
@@ -91,7 +93,8 @@ bool RiuPvtPlotUpdater::queryDataAndUpdatePlot( const RimEclipseResultDefinition
|
||||
|
||||
cellResultsData->ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "RS" ) );
|
||||
cellResultsData->ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "RV" ) );
|
||||
cellResultsData->ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" ) );
|
||||
cellResultsData->ensureKnownResultLoaded(
|
||||
RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::pressure() ) );
|
||||
cellResultsData->ensureKnownResultLoaded( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, "PVTNUM" ) );
|
||||
|
||||
cvf::ref<RigResultAccessor> rsAccessor =
|
||||
@@ -111,7 +114,8 @@ bool RiuPvtPlotUpdater::queryDataAndUpdatePlot( const RimEclipseResultDefinition
|
||||
gridIndex,
|
||||
porosityModel,
|
||||
timeStepIndex,
|
||||
RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" ) );
|
||||
RigEclipseResultAddress( RiaDefines::ResultCatType::DYNAMIC_NATIVE,
|
||||
RiaResultNames::pressure() ) );
|
||||
cvf::ref<RigResultAccessor> pvtnumAccessor =
|
||||
RigResultAccessorFactory::createFromResultAddress( eclipseCaseData,
|
||||
gridIndex,
|
||||
|
||||
Reference in new issue
Block a user