///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2016- Statoil 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 "RimSummaryCase.h" #include "RiaSummaryTools.h" #include "RicfCommandObject.h" #include "RifSummaryReaderInterface.h" #include "RimMainPlotCollection.h" #include "RimObservedDataCollection.h" #include "RimObservedSummaryData.h" #include "RimOilField.h" #include "RimProject.h" #include "RimSummaryCaseCollection.h" #include "RimSummaryCaseMainCollection.h" #include "RimSummaryPlotCollection.h" #include "cafPdmFieldIOScriptability.h" #include "cvfAssert.h" #include CAF_PDM_ABSTRACT_SOURCE_INIT( RimSummaryCase, "SummaryCase" ); const QString RimSummaryCase::DEFAULT_DISPLAY_NAME = "Display Name"; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimSummaryCase::RimSummaryCase() { CAF_PDM_InitScriptableObject( "Summary Case", ":/SummaryCase16x16.png", "", "The Base Class for all Summary Cases" ); CAF_PDM_InitScriptableFieldWithIO( &m_shortName, "ShortName", QString( "Display Name" ), DEFAULT_DISPLAY_NAME, "", "", "" ); CAF_PDM_InitScriptableFieldWithIO( &m_useAutoShortName, "AutoShortyName", false, "Use Auto Display Name", "", "", "" ); CAF_PDM_InitScriptableFieldWithIONoDefault( &m_summaryHeaderFilename, "SummaryHeaderFilename", "Summary Header File", "", "", "" ); m_summaryHeaderFilename.uiCapability()->setUiReadOnly( true ); CAF_PDM_InitScriptableFieldWithIO( &m_caseId, "Id", -1, "Case ID", "", "", "" ); m_caseId.registerKeywordAlias( "CaseId" ); m_caseId.uiCapability()->setUiReadOnly( true ); m_caseId.capability()->setIOWriteable( false ); m_isObservedData = false; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimSummaryCase::~RimSummaryCase() { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCase::summaryHeaderFilename() const { return m_summaryHeaderFilename().path(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::setSummaryHeaderFileName( const QString& fileName ) { m_summaryHeaderFilename = fileName; this->updateAutoShortName(); this->updateTreeItemName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RimSummaryCase::isObservedData() { return m_isObservedData; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::setCaseRealizationParameters( const std::shared_ptr& crlParameters ) { m_crlParameters = crlParameters; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::shared_ptr RimSummaryCase::caseRealizationParameters() const { return m_crlParameters; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RimSummaryCase::hasCaseRealizationParameters() const { return m_crlParameters != nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimSummaryCaseCollection* RimSummaryCase::ensemble() const { RimSummaryCaseCollection* e; firstAncestorOrThisOfType( e ); return e && e->isEnsemble() ? e : nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::copyFrom( const RimSummaryCase& rhs ) { m_shortName = rhs.m_shortName; m_useAutoShortName = rhs.m_useAutoShortName; m_summaryHeaderFilename = rhs.m_summaryHeaderFilename; m_isObservedData = rhs.m_isObservedData; this->updateTreeItemName(); this->updateOptionSensitivity(); } //-------------------------------------------------------------------------------------------------- /// Sorting operator for sets and maps. Sorts by summary case short name. //-------------------------------------------------------------------------------------------------- bool RimSummaryCase::operator<( const RimSummaryCase& rhs ) const { return this->caseName() < rhs.caseName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) { if ( changedField == &m_useAutoShortName ) { this->updateAutoShortName(); } else if ( changedField == &m_shortName ) { updateTreeItemName(); } RimSummaryPlotCollection* summaryPlotColl = RiaSummaryTools::summaryPlotCollection(); summaryPlotColl->updateSummaryNameHasChanged(); updateOptionSensitivity(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::updateOptionSensitivity() { m_shortName.uiCapability()->setUiReadOnly( m_useAutoShortName ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RifReaderRftInterface* RimSummaryCase::rftReader() { return nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCase::errorMessagesFromReader() { return QString(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName /*= ""*/ ) { updateTreeItemName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::updateTreeItemName() { if ( caseName() != displayCaseName() ) this->setUiName( caseName() + " (" + displayCaseName() + ")" ); else this->setUiName( caseName() ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCase::displayCaseName() const { return m_shortName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCase::nativeCaseName() const { return caseName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaEclipseUnitTools::UnitSystemType RimSummaryCase::unitsSystem() { RifSummaryReaderInterface* reader = summaryReader(); if ( reader ) { return reader->unitSystem(); } return RiaEclipseUnitTools::UnitSystem::UNITS_UNKNOWN; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::initAfterRead() { if ( m_caseId() == -1 ) { RimProject::current()->assignCaseIdToSummaryCase( this ); } updateOptionSensitivity(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RimSummaryCase::uniqueShortNameForCase( RimSummaryCase* summaryCase ) { RimOilField* oilField = nullptr; summaryCase->firstAncestorOrThisOfType( oilField ); CVF_ASSERT( oilField ); std::set allAutoShortNames; std::vector allCases = oilField->summaryCaseMainCollection->allSummaryCases(); std::vector observedDataCases = oilField->observedDataCollection->allObservedSummaryData(); for ( auto observedData : observedDataCases ) { allCases.push_back( observedData ); } for ( RimSummaryCase* sumCase : allCases ) { if ( sumCase && sumCase != summaryCase ) { allAutoShortNames.insert( sumCase->displayCaseName() ); } } bool foundUnique = false; QString caseName = summaryCase->caseName(); QString shortName; if ( caseName.size() > 2 ) { QString candidate; candidate += caseName[0]; for ( int i = 1; i < caseName.size(); ++i ) { if ( allAutoShortNames.count( candidate + caseName[i] ) == 0 ) { shortName = candidate + caseName[i]; foundUnique = true; break; } } } else { shortName = caseName.left( 2 ); if ( allAutoShortNames.count( shortName ) == 0 ) { foundUnique = true; } } int autoNumber = 0; while ( !foundUnique ) { QString candidate = shortName + QString::number( autoNumber++ ); if ( allAutoShortNames.count( candidate ) == 0 ) { shortName = candidate; foundUnique = true; } } return shortName; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::updateAutoShortName() { if ( m_useAutoShortName ) { m_shortName = RimSummaryCase::uniqueShortNameForCase( this ); } else if ( m_shortName() == DEFAULT_DISPLAY_NAME ) { m_shortName = caseName(); } updateTreeItemName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::resetAutoShortName() { m_shortName = DEFAULT_DISPLAY_NAME; updateAutoShortName(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimSummaryCase::setCaseId( int caseId ) { m_caseId = caseId; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- int RimSummaryCase::caseId() const { return m_caseId(); }