diff --git a/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.cpp b/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.cpp index 6d5424577f..3831f42c2c 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.cpp +++ b/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.cpp @@ -99,7 +99,8 @@ std::vector RicNewStimPlanFractureTemplateFeature: /// //-------------------------------------------------------------------------------------------------- std::vector - RicNewStimPlanFractureTemplateFeature::createNewTemplatesFromFiles( const std::vector& fileNames ) + RicNewStimPlanFractureTemplateFeature::createNewTemplatesFromFiles( const std::vector& fileNames, + bool reuseExistingTemplatesWithMatchingNames ) { if ( fileNames.empty() ) return std::vector(); @@ -112,14 +113,19 @@ std::vector RimFractureTemplateCollection* fracDefColl = oilfield->fractureDefinitionCollection(); if ( !fracDefColl ) return std::vector(); + auto findTemplateByName = []( RimFractureTemplateCollection* coll, + const QString& name ) -> RimStimPlanFractureTemplate* { + for ( auto t : coll->fractureTemplates() ) + if ( t->name() == name ) return dynamic_cast( t ); + + return nullptr; + }; + std::vector newFractures; for ( auto fileName : fileNames ) { if ( fileName.isEmpty() ) continue; - RimStimPlanFractureTemplate* fractureDef = new RimStimPlanFractureTemplate(); - fracDefColl->addFractureTemplate( fractureDef ); - QFileInfo stimplanfileFileInfo( fileName ); QString name = stimplanfileFileInfo.baseName(); if ( name.isEmpty() ) @@ -127,7 +133,15 @@ std::vector name = "StimPlan Fracture Template"; } - fractureDef->setName( name ); + RimStimPlanFractureTemplate* fractureDef = nullptr; + if ( reuseExistingTemplatesWithMatchingNames ) fractureDef = findTemplateByName( fracDefColl, name ); + + if ( fractureDef == nullptr ) + { + fractureDef = new RimStimPlanFractureTemplate(); + fracDefColl->addFractureTemplate( fractureDef ); + fractureDef->setName( name ); + } fractureDef->setFileName( fileName ); fractureDef->loadDataAndUpdate(); diff --git a/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.h b/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.h index 475595494e..80b4d33ace 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.h +++ b/ApplicationLibCode/Commands/FractureCommands/RicNewStimPlanFractureTemplateFeature.h @@ -35,7 +35,9 @@ class RicNewStimPlanFractureTemplateFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; static void createNewTemplateForFractureAndUpdate( RimFracture* fracture ); static void selectFractureTemplateAndUpdate( RimFractureTemplate* fractureTemplate ); - static std::vector createNewTemplatesFromFiles( const std::vector& fileNames ); + static std::vector + createNewTemplatesFromFiles( const std::vector& fileNames, + bool reuseExistingTemplatesWithMatchingNames = false ); protected: static std::vector createNewTemplates(); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp index a56c189197..ec57f0e3ae 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp @@ -30,6 +30,10 @@ #include "RigStatisticsMath.h" #include "RigStimPlanFractureDefinition.h" +#include "RimFractureTemplateCollection.h" +#include "RimProject.h" +#include "RimStimPlanFractureTemplate.h" + #include "RifCsvDataTableFormatter.h" #include "RifEnsembleFractureStatisticsExporter.h" #include "RifStimPlanXmlReader.h" @@ -250,7 +254,19 @@ void RimEnsembleFractureStatistics::fieldChangedByUi( const caf::PdmFieldHandle* { m_computeStatistics = false; std::vector filePaths = computeStatistics(); - RicNewStimPlanFractureTemplateFeature::createNewTemplatesFromFiles( filePaths ); + + // Create (or reuse matching) templates for the statistics + auto updatedTemplates = RicNewStimPlanFractureTemplateFeature::createNewTemplatesFromFiles( filePaths, true ); + + // Update views + if ( !updatedTemplates.empty() ) + { + RimFractureTemplateCollection* templateCollection = nullptr; + updatedTemplates.front()->firstAncestorOrThisOfTypeAsserted( templateCollection ); + templateCollection->updateConnectedEditors(); + + RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); + } } }