Files
ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h
T
Kristian Bendiksen 4ed6d70b73 CellFilters: Add case-level Data Filters with per-view wrappers
Introduce RimDataFilterCollection on RimEclipseCase to hold filter
configuration that is shared across all views of the case. Each
RimEclipseView gets a RimDataFilterInViewCollection of
RimDataFilterInView wrappers that auto-sync with the case-level list
and expose an independent on/off toggle per view. The wrapper's
applyToCellVisibility delegates to the wrapped RimCellFilter via the
existing unified virtual, so property, range, and combined filters all
work uniformly.

RimDataFilterCollection is built on caf::PdmObjectCollection<RimCellFilter>
and emits a filtersChanged signal on add/remove/reorder/child changes.
The wrapper collection mirrors RimSurfaceInViewCollection's sync pattern:
new wrappers default to checked, removed sources drop their wrappers,
and the wrapper list follows the case order. Per-view wrappers feed into
RivReservoirViewPartMgr::computePropertyVisibility after the existing
view-level property-filter loop.

The RicNew*Feature commands now route into a selected RimDataFilterCollection,
and the existing combined-filter path is generalized to allow combined
filters living under either a per-view RimEclipsePropertyFilterCollection
or the new case-level collection. Several Asserted ancestor lookups in
RimEclipsePropertyFilter, RimCellFilter and RimEclipseResultDefinition
that assumed a Rim3dView ancestor were relaxed to the non-asserting
variant with graceful fallbacks, so case-level filters can be created
and edited without a host view.

Backwards compatible: empty Data Filter collection is a no-op,
existing per-view RimEclipsePropertyFilterCollection and
RimCellFilterCollection paths are unchanged. GeoMech parity deferred.
2026-05-15 08:37:46 +02:00

206 lines
7.6 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2011- Statoil ASA
// Copyright (C) 2013- Ceetron Solutions AS
// Copyright (C) 2011-2012 Ceetron AS
//
// 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RiaPorosityModel.h"
#include "RiaDefines.h"
#include "RimCase.h"
#include "RifReaderSettings.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmChildField.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cvfColor3.h"
#include "cvfObject.h"
#include <memory>
#include <set>
class QString;
class RimWellTargetMapping;
class RigCaseCellResultsData;
class RigEclipseCaseData;
class RigFormationNames;
class RigGridBase;
class RigMainGrid;
class RigVirtualPerforationTransmissibilities;
class RimCaseCollection;
class RimDataFilterCollection;
class RimEclipseContourMapView;
class RimEclipseContourMapViewCollection;
class RimEclipseInputPropertyCollection;
class RimEclipseView;
class RimIdenticalGridCaseGroup;
class RimReservoirCellResultsStorage;
class RimEclipseResultAddressCollection;
class RimEclipseViewCollection;
class RimResultNameAlias;
//==================================================================================================
//
// Interface for reservoirs.
//
//==================================================================================================
class RimEclipseCase : public RimCase
{
CAF_PDM_HEADER_INIT;
public:
RimEclipseCase();
~RimEclipseCase() override;
std::vector<RimEclipseView*> reservoirViews() const;
RimEclipseViewCollection* viewCollection() const;
std::vector<QString> filesContainingFaults() const;
void setFilesContainingFaults( const std::vector<QString>& val );
bool ensureReservoirCaseIsOpen();
bool openReservoirCase();
virtual void closeReservoirCase();
virtual bool openEclipseGridFile() = 0;
virtual void reloadEclipseGridFile();
virtual bool importAsciiInputProperties( const QStringList& fileNames );
RigEclipseCaseData* eclipseCaseData();
const RigEclipseCaseData* eclipseCaseData() const;
void ensureDeckIsParsedForEquilData();
cvf::Color3f defaultWellColor( const QString& wellName );
const RigMainGrid* mainGrid() const;
bool isGridSizeEqualTo( const RimEclipseCase* otherCase ) const;
RigCaseCellResultsData* results( RiaDefines::PorosityModelType porosityModel );
const RigCaseCellResultsData* results( RiaDefines::PorosityModelType porosityModel ) const;
RimReservoirCellResultsStorage* resultsStorage( RiaDefines::PorosityModelType porosityModel );
const RimReservoirCellResultsStorage* resultsStorage( RiaDefines::PorosityModelType porosityModel ) const;
RimEclipseView* createAndAddReservoirView( bool useGlobalViewCollection = false );
RimEclipseView* createAndAddReservoirView( RimEclipseViewCollection* viewColl );
RimEclipseView* createCopyAndAddView( const RimEclipseView* sourceView );
const RigVirtualPerforationTransmissibilities* computeAndGetVirtualPerforationTransmissibilities();
virtual QString locationOnDisc() const { return QString(); }
RimCaseCollection* parentCaseCollection();
RimEclipseContourMapViewCollection* contourMapCollection() const;
RimEclipseInputPropertyCollection* inputPropertyCollection() const;
RimDataFilterCollection* dataFilterCollection() const;
QStringList timeStepStrings() const override;
QString timeStepName( int frameIdx ) const override;
std::vector<QDateTime> timeStepDates() const override;
cvf::BoundingBox reservoirBoundingBox() override;
cvf::BoundingBox activeCellsBoundingBox() const override;
cvf::BoundingBox allCellsBoundingBox() const override;
cvf::Vec3d displayModelOffset() const override;
double characteristicCellSize() const override;
std::set<QString> sortedSimWellNames() const;
void loadAndSynchronizeInputProperties( bool importGridOrFaultData );
void ensureFaultDataIsComputed();
bool ensureNncDataIsComputed();
void createDisplayModelAndUpdateAllViews();
void computeActiveCellsBoundingBox();
void setReaderSettings( RifReaderSettings& readerSettings );
RifReaderSettings readerSettings() const;
void addWellTargetMapping( RimWellTargetMapping* wellTargetMapping );
void updateResultAddressCollection();
void setReservoirData( RigEclipseCaseData* eclipseCase );
void addResultAlias( const QString& resultName, const QString& aliasName );
void clearResultAliases();
void updateFormationNamesData() override;
protected:
void initAfterRead() override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void childFieldChangedByUi( const caf::PdmFieldHandle* changedChildField ) override;
void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override;
void resultAliasUiOrdering( caf::PdmUiOrdering& uiOrdering );
void syncResultAliases();
// Internal methods
protected:
void computeCachedData();
std::vector<QString> additionalFiles() const;
RimEclipseViewCollection* globalViewCollection() const;
void addViewsFromViewCollection( std::vector<RimEclipseView*>& views, const RimEclipseViewCollection* viewColl ) const;
private:
void createTimeStepFormatString();
std::vector<Rim3dView*> allSpecialViews() const override;
std::vector<RimEclipseContourMapView*> contourMapViews() const;
void buildResultChildNodes();
const RigFormationNames* effectiveFormationNames() const;
protected:
caf::PdmField<bool> m_flipXAxis;
caf::PdmField<bool> m_flipYAxis;
caf::PdmChildField<RimEclipseInputPropertyCollection*> m_inputPropertyCollection;
caf::PdmChildArrayField<RimResultNameAlias*> m_resultAliasList;
RifReaderSettings m_readerSettings;
private:
caf::PdmField<bool> m_releaseResultMemory;
cvf::ref<RigEclipseCaseData> m_rigEclipseCase;
QString m_timeStepFormatString;
std::map<QString, cvf::Color3f> m_wellToColorMap;
caf::PdmChildArrayField<RimEclipseResultAddressCollection*> m_resultAddressCollections;
caf::PdmChildField<RimReservoirCellResultsStorage*> m_matrixModelResults;
caf::PdmChildField<RimReservoirCellResultsStorage*> m_fractureModelResults;
caf::PdmChildField<RimEclipseViewCollection*> m_viewCollection;
caf::PdmChildField<RimDataFilterCollection*> m_dataFilterCollection;
caf::PdmChildArrayField<RimWellTargetMapping*> m_wellTargetMappings;
caf::PdmField<std::vector<caf::FilePath>> m_filesContainingFaults;
// Obsolete fields:
caf::PdmChildArrayField<RimEclipseView*> m_reservoirViews_OBSOLETE;
caf::PdmChildField<RimEclipseContourMapViewCollection*> m_contourMapCollection_OBSOLETE;
};