#6991 Update file name for replaced case.

Added extra option to choose auto-name option (similar to RimSummaryCase).
This commit is contained in:
Kristian Bendiksen 2020-11-18 14:37:43 +01:00 committed by Magne Sjaastad
parent b8c01eabb6
commit 9e4e8cd353
13 changed files with 279 additions and 82 deletions

View File

@ -604,6 +604,10 @@ bool RiaApplication::loadProject( const QString& projectFileName,
RimCase* cas = casesToLoad[cIdx];
CVF_ASSERT( cas );
// Make sure case name is updated. It can be out-of-sync if the
// user has updated the project file manually.
cas->updateAutoShortName();
caseProgress.setProgressDescription( cas->caseUserDescription() );
std::vector<Rim3dView*> views = cas->views();
{ // To delete the view progress before incrementing the caseProgress

View File

@ -153,6 +153,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimColorLegend.h
${CMAKE_CURRENT_LIST_DIR}/RimColorLegendItem.h
${CMAKE_CURRENT_LIST_DIR}/RimAbstractPlotCollection.h
${CMAKE_CURRENT_LIST_DIR}/RimVfpTableExtractor.h
${CMAKE_CURRENT_LIST_DIR}/RimCaseDisplayNameTools.h
)
@ -309,6 +310,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimColorLegendCollection.cpp
${CMAKE_CURRENT_LIST_DIR}/RimColorLegend.cpp
${CMAKE_CURRENT_LIST_DIR}/RimColorLegendItem.cpp
${CMAKE_CURRENT_LIST_DIR}/RimVfpTableExtractor.cpp
${CMAKE_CURRENT_LIST_DIR}/RimCaseDisplayNameTools.cpp
)
list(APPEND CODE_HEADER_FILES

View File

@ -36,6 +36,8 @@
#include "cafPdmObjectFactory.h"
#include "cafPdmObjectScriptingCapability.h"
#include <QFileInfo>
CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimCase, "Case", "RimCase" );
//--------------------------------------------------------------------------------------------------
@ -49,6 +51,7 @@ RimCase::RimCase()
CAF_PDM_InitScriptableField( &caseUserDescription, "Name", QString(), "Case Name", "", "", "" );
caseUserDescription.registerKeywordAlias( "CaseUserDescription" );
CAF_PDM_InitScriptableFieldNoDefault( &m_displayNameOption, "NameSetting", "Name Setting", "", "", "" );
CAF_PDM_InitScriptableField( &caseId, "Id", -1, "Case ID", "", "", "" );
caseId.registerKeywordAlias( "CaseId" );
@ -92,6 +95,9 @@ RimCase::~RimCase()
void RimCase::setGridFileName( const QString& fileName )
{
m_caseFileName.v().setPath( fileName );
this->updateAutoShortName();
this->updateTreeItemName();
}
//--------------------------------------------------------------------------------------------------
@ -182,6 +188,23 @@ Rim2dIntersectionViewCollection* RimCase::intersectionViewCollection()
return m_2dIntersectionViewCollection;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimCase::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue )
{
if ( changedField == &m_displayNameOption )
{
updateAutoShortName();
}
else if ( changedField == &caseUserDescription )
{
updateTreeItemName();
}
updateOptionSensitivity();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -210,6 +233,14 @@ QList<caf::PdmOptionItemInfo> RimCase::calculateValueOptions( const caf::PdmFiel
return options;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimCase::updateOptionSensitivity()
{
caseUserDescription.uiCapability()->setUiReadOnly( m_displayNameOption != RimCaseDisplayNameTools::DisplayName::CUSTOM );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -219,6 +250,14 @@ void RimCase::initAfterRead()
{
RimProject::current()->assignCaseIdToCase( this );
}
if ( RimProject::current()->isProjectFileVersionEqualOrOlderThan( "2020.10.0" ) )
{
// Don't mess with case names in older projects: the user can have changed the name.
m_displayNameOption = RimCaseDisplayNameTools::DisplayName::CUSTOM;
}
updateOptionSensitivity();
}
//--------------------------------------------------------------------------------------------------
@ -228,3 +267,58 @@ caf::PdmFieldHandle* RimCase::userDescriptionField()
{
return &caseUserDescription;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimCase::updateAutoShortName()
{
if ( m_displayNameOption == RimCaseDisplayNameTools::DisplayName::FULL_CASE_NAME )
{
caseUserDescription = caseName();
}
else if ( m_displayNameOption == RimCaseDisplayNameTools::DisplayName::SHORT_CASE_NAME )
{
caseUserDescription = RimCase::uniqueShortNameCase( this, RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH );
}
updateTreeItemName();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimCase::updateTreeItemName()
{
setUiName( caseUserDescription() );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimCase::caseName() const
{
QFileInfo fileName( gridFileName() );
return fileName.completeBaseName();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimCase::uniqueShortNameCase( RimCase* rimCase, int shortNameLengthLimit )
{
std::set<QString> allAutoShortNames;
std::vector<RimCase*> allCases;
RimProject::current()->descendantsOfType( allCases );
for ( RimCase* rCase : allCases )
{
if ( rCase && rCase != rimCase )
{
allAutoShortNames.insert( rimCase->caseName() );
}
}
QString caseName = rimCase->caseName();
return RimCaseDisplayNameTools::uniqueShortName( caseName, allAutoShortNames, shortNameLengthLimit );
}

View File

@ -19,6 +19,8 @@
#pragma once
#include "RimCaseDisplayNameTools.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmChildField.h"
#include "cafPdmField.h"
@ -46,6 +48,8 @@ class RimCase : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
using DisplayNameEnum = caf::AppEnum<RimCaseDisplayNameTools::DisplayName>;
public:
RimCase();
~RimCase() override;
@ -56,6 +60,10 @@ public:
void setGridFileName( const QString& fileName );
QString gridFileName() const;
void setDisplayNameOption( RimCaseDisplayNameTools::DisplayName displayNameOption );
void updateAutoShortName();
void updateOptionSensitivity();
std::vector<Rim3dView*> views() const;
std::vector<RimGridView*> gridViews() const;
@ -84,16 +92,24 @@ public:
caf::Signal<> settingsChanged;
protected:
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly ) override;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions,
bool* useOptionsOnly ) override;
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
virtual std::vector<Rim3dView*> allSpecialViews() const = 0;
void initAfterRead() override;
void updateTreeItemName();
virtual QString caseName() const;
static QString uniqueShortNameCase( RimCase* rimCase, int shortNameLengthLimit );
private:
caf::PdmFieldHandle* userDescriptionField() override;
protected:
caf::PdmField<caf::FilePath> m_caseFileName;
caf::PdmField<DisplayNameEnum> m_displayNameOption;
caf::PdmChildField<RimTimeStepFilter*> m_timeStepFilter;
caf::PdmChildField<Rim2dIntersectionViewCollection*> m_2dIntersectionViewCollection;
caf::PdmPtrField<RimFormationNames*> m_activeFormationNames;

View File

@ -0,0 +1,95 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2020- Equinor 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RimCaseDisplayNameTools.h"
#include <QString>
#include "cafAppEnum.h"
namespace caf
{
template <>
void AppEnum<RimCaseDisplayNameTools::DisplayName>::setUp()
{
addItem( RimCaseDisplayNameTools::DisplayName::FULL_CASE_NAME, "FULL_CASE_NAME", "Full Case Name" );
addItem( RimCaseDisplayNameTools::DisplayName::SHORT_CASE_NAME, "SHORT_CASE_NAME", "Shortened Case Name" );
addItem( RimCaseDisplayNameTools::DisplayName::CUSTOM, "CUSTOM_NAME", "Custom Name" );
setDefault( RimCaseDisplayNameTools::DisplayName::FULL_CASE_NAME );
}
} // namespace caf
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimCaseDisplayNameTools::uniqueShortName( const QString& caseName,
const std::set<QString>& allAutoShortNames,
int shortNameLengthLimit )
{
bool foundUnique = false;
QString shortName;
if ( caseName.size() > shortNameLengthLimit )
{
QString candidate;
candidate += caseName[0];
for ( int i = 1; i < caseName.size(); ++i )
{
if ( foundUnique && !caseName[i].isLetterOrNumber() )
{
break;
}
candidate += caseName[i];
if ( allAutoShortNames.count( candidate ) == 0 )
{
shortName = candidate;
foundUnique = true;
if ( shortName.length() >= shortNameLengthLimit )
{
break;
}
}
}
}
else
{
shortName = caseName.left( shortNameLengthLimit );
if ( allAutoShortNames.count( shortName ) == 0 )
{
foundUnique = true;
}
}
int autoNumber = 1;
while ( !foundUnique )
{
QString candidate = QString( "%1 %2" ).arg( shortName ).arg( autoNumber++ );
if ( allAutoShortNames.count( candidate ) == 0 )
{
shortName = candidate;
foundUnique = true;
}
}
return shortName;
}

View File

@ -0,0 +1,44 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2020 Equinor 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include <set>
#include <QString>
//==================================================================================================
//
//
//
//==================================================================================================
class RimCaseDisplayNameTools
{
public:
enum class DisplayName
{
FULL_CASE_NAME,
SHORT_CASE_NAME,
CUSTOM
};
static const int CASE_SHORT_NAME_LENGTH = 4;
static QString
uniqueShortName( const QString& caseName, const std::set<QString>& allAutoShortNames, int shortNameLengthLimit );
};

View File

@ -459,6 +459,7 @@ void RimEclipseCase::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
const QVariant& oldValue,
const QVariant& newValue )
{
RimCase::fieldChangedByUi( changedField, oldValue, newValue );
if ( changedField == &m_releaseResultMemory )
{
RimReloadCaseTools::reloadAllEclipseGridData( this );

View File

@ -298,6 +298,7 @@ cvf::ref<RifReaderInterface> RimEclipseInputCase::createMockModel( QString model
void RimEclipseInputCase::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
uiOrdering.add( &caseUserDescription );
uiOrdering.add( &m_displayNameOption );
uiOrdering.add( &caseId );
uiOrdering.add( &m_caseFileName );
uiOrdering.add( &m_additionalFiles );

View File

@ -613,6 +613,7 @@ void RimEclipseResultCase::initAfterRead()
void RimEclipseResultCase::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
uiOrdering.add( &caseUserDescription );
uiOrdering.add( &m_displayNameOption );
uiOrdering.add( &caseId );
uiOrdering.add( &m_caseFileName );
uiOrdering.add( &m_unitSystem );

View File

@ -192,6 +192,9 @@ RimGeoMechCase::RimGeoMechCase( void )
"" );
m_mudWeightWindowParameters = new RimMudWeightWindowParameters;
m_mudWeightWindowParameters.uiCapability()->setUiTreeHidden( true );
m_displayNameOption = RimCaseDisplayNameTools::DisplayName::CUSTOM;
m_displayNameOption.uiCapability()->setUiHidden( true );
}
//--------------------------------------------------------------------------------------------------

View File

@ -36,20 +36,7 @@
#include <QFileInfo>
#include <QRegularExpression>
#define SUMMARY_CASE_SHORT_NAME_LENGTH 4 // TODO: Could make this a preference if required.
CAF_PDM_ABSTRACT_SOURCE_INIT( RimSummaryCase, "SummaryCase" );
namespace caf
{
template <>
void AppEnum<RimSummaryCase::DisplayName>::setUp()
{
addItem( RimSummaryCase::DisplayName::FULL_CASE_NAME, "FULL_CASE_NAME", "Full Case Name" );
addItem( RimSummaryCase::DisplayName::SHORT_CASE_NAME, "SHORT_CASE_NAME", "Shortened Case Name" );
addItem( RimSummaryCase::DisplayName::CUSTOM, "CUSTOM_NAME", "Custom Name" );
setDefault( RimSummaryCase::DisplayName::FULL_CASE_NAME );
}
} // namespace caf
//--------------------------------------------------------------------------------------------------
///
@ -193,7 +180,7 @@ void RimSummaryCase::fieldChangedByUi( const caf::PdmFieldHandle* changedField,
//--------------------------------------------------------------------------------------------------
void RimSummaryCase::updateOptionSensitivity()
{
m_displayName.uiCapability()->setUiReadOnly( m_displayNameOption != DisplayName::CUSTOM );
m_displayName.uiCapability()->setUiReadOnly( m_displayNameOption != RimCaseDisplayNameTools::DisplayName::CUSTOM );
}
//--------------------------------------------------------------------------------------------------
@ -260,7 +247,7 @@ RiaEclipseUnitTools::UnitSystemType RimSummaryCase::unitsSystem()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryCase::setDisplayNameOption( DisplayName displayNameOption )
void RimSummaryCase::setDisplayNameOption( RimCaseDisplayNameTools::DisplayName displayNameOption )
{
m_displayNameOption = displayNameOption;
}
@ -277,7 +264,7 @@ void RimSummaryCase::initAfterRead()
if ( m_useAutoShortName_OBSOLETE )
{
m_displayNameOption = DisplayName::SHORT_CASE_NAME;
m_displayNameOption = RimCaseDisplayNameTools::DisplayName::SHORT_CASE_NAME;
}
updateOptionSensitivity();
@ -333,13 +320,13 @@ QString RimSummaryCase::uniqueShortNameForEnsembleCase( RimSummaryCase* summaryC
if ( !numberGroup.isEmpty() )
{
keyComponent = keyComponent.replace( numberGroup, "" );
QString stem = keyComponent.left( SUMMARY_CASE_SHORT_NAME_LENGTH );
QString stem = keyComponent.left( RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH );
if ( !stem.isEmpty() ) subComponents.push_back( stem );
subComponents.push_back( numberGroup );
}
else
{
subComponents.push_back( keyComponent.left( SUMMARY_CASE_SHORT_NAME_LENGTH ) );
subComponents.push_back( keyComponent.left( RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH ) );
}
shortNameComponents.push_back( subComponents.join( "-" ) );
@ -365,57 +352,9 @@ QString RimSummaryCase::uniqueShortNameForSummaryCase( RimSummaryCase* summaryCa
}
}
bool foundUnique = false;
QString caseName = summaryCase->caseName();
QString shortName;
if ( caseName.size() > SUMMARY_CASE_SHORT_NAME_LENGTH )
{
QString candidate;
candidate += caseName[0];
for ( int i = 1; i < caseName.size(); ++i )
{
if ( foundUnique && !caseName[i].isLetterOrNumber() )
{
break;
}
candidate += caseName[i];
if ( allAutoShortNames.count( candidate ) == 0 )
{
shortName = candidate;
foundUnique = true;
if ( shortName.length() >= SUMMARY_CASE_SHORT_NAME_LENGTH )
{
break;
}
}
}
}
else
{
shortName = caseName.left( SUMMARY_CASE_SHORT_NAME_LENGTH );
if ( allAutoShortNames.count( shortName ) == 0 )
{
foundUnique = true;
}
}
int autoNumber = 1;
while ( !foundUnique )
{
QString candidate = QString( "%1 %2" ).arg( shortName ).arg( autoNumber++ );
if ( allAutoShortNames.count( candidate ) == 0 )
{
shortName = candidate;
foundUnique = true;
}
}
return shortName;
return RimCaseDisplayNameTools::uniqueShortName( summaryCase->caseName(),
allAutoShortNames,
RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH );
}
//--------------------------------------------------------------------------------------------------
@ -423,11 +362,11 @@ QString RimSummaryCase::uniqueShortNameForSummaryCase( RimSummaryCase* summaryCa
//--------------------------------------------------------------------------------------------------
void RimSummaryCase::updateAutoShortName()
{
if ( m_displayNameOption == DisplayName::FULL_CASE_NAME )
if ( m_displayNameOption == RimCaseDisplayNameTools::DisplayName::FULL_CASE_NAME )
{
m_displayName = caseName();
}
else if ( m_displayNameOption == DisplayName::SHORT_CASE_NAME )
else if ( m_displayNameOption == RimCaseDisplayNameTools::DisplayName::SHORT_CASE_NAME )
{
if ( ensemble() )
{

View File

@ -20,6 +20,8 @@
#include "RiaEclipseUnitTools.h"
#include "RigCaseRealizationParameters.h"
#include "RimCaseDisplayNameTools.h"
#include "cafFilePath.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
@ -43,13 +45,7 @@ class RimSummaryCase : public caf::PdmObject
public:
caf::Signal<> nameChanged;
enum class DisplayName
{
FULL_CASE_NAME,
SHORT_CASE_NAME,
CUSTOM
};
using DisplayNameEnum = caf::AppEnum<DisplayName>;
using DisplayNameEnum = caf::AppEnum<RimCaseDisplayNameTools::DisplayName>;
public:
RimSummaryCase();
@ -63,7 +59,7 @@ public:
RiaEclipseUnitTools::UnitSystemType unitsSystem();
void setDisplayNameOption( DisplayName displayNameOption );
void setDisplayNameOption( RimCaseDisplayNameTools::DisplayName displayNameOption );
void updateAutoShortName();
void updateOptionSensitivity();

View File

@ -24,6 +24,7 @@
#include "RifEclipseSummaryTools.h"
#include "RifSummaryCaseRestartSelector.h"
#include "RimCaseDisplayNameTools.h"
#include "RimDerivedEnsembleCaseCollection.h"
#include "RimEclipseResultCase.h"
#include "RimFileSummaryCase.h"
@ -289,7 +290,7 @@ RimSummaryCaseCollection*
summaryCaseCollection->addCase( summaryCase );
if ( isEnsemble )
{
summaryCase->setDisplayNameOption( RimSummaryCase::DisplayName::SHORT_CASE_NAME );
summaryCase->setDisplayNameOption( RimCaseDisplayNameTools::DisplayName::SHORT_CASE_NAME );
}
}