#2380 AppFwk: Move fieldsByType to RimProject

This commit is contained in:
Rebecca Cox 2018-01-19 12:52:50 +01:00
parent ed930da11d
commit 56188c8f3f
3 changed files with 61 additions and 9 deletions

View File

@ -28,7 +28,6 @@
#include "RigGridBase.h"
#include "RimCalcScript.h"
#include "RimSummaryCalculationCollection.h"
#include "RimCase.h"
#include "RimCaseCollection.h"
#include "RimCommandObject.h"
@ -38,6 +37,7 @@
#include "RimEclipseCaseCollection.h"
#include "RimFlowPlotCollection.h"
#include "RimFormationNamesCollection.h"
#include "RimSummaryCalculationCollection.h"
#ifdef USE_PROTOTYPE_FEATURE_FRACTURES
#include "RimFractureTemplateCollection.h"
@ -47,6 +47,7 @@
#include "RimGeoMechCase.h"
#include "RimGeoMechModels.h"
#include "RimGridSummaryCase.h"
#include "RimGridView.h"
#include "RimIdenticalGridCaseGroup.h"
#include "RimMainPlotCollection.h"
#include "RimMultiSnapshotDefinition.h"
@ -58,7 +59,7 @@
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryCrossPlotCollection.h"
#include "RimSummaryPlotCollection.h"
#include "RimGridView.h"
#include "RimTools.h"
#include "RimViewLinker.h"
#include "RimViewLinkerCollection.h"
#include "RimWellLogFile.h"
@ -67,15 +68,15 @@
#include "RimWellPathCollection.h"
#include "RimWellPathImport.h"
#include "RiuMainWindow.h"
#include "RiuMainPlotWindow.h"
#include "RiuMainWindow.h"
#include "OctaveScriptCommands/RicExecuteScriptForCasesFeature.h"
#include "cafCmdFeature.h"
#include "cafCmdFeatureManager.h"
#include "cafPdmUiTreeOrdering.h"
#include "cafCmdFeatureMenuBuilder.h"
#include "cafPdmUiTreeOrdering.h"
#include "cvfBoundingBox.h"
#include <QDir>
@ -440,6 +441,18 @@ void RimProject::setProjectFileNameAndUpdateDependencies(const QString& fileName
QFileInfo fileInfoOld(oldProjectFileName);
QString oldProjectPath = fileInfoOld.path();
std::vector<caf::FilePath*> filePaths;
fieldsByType(this, filePaths);
for (caf::FilePath* filePath : filePaths)
{
bool foundFile = false;
std::vector<QString> searchedPaths;
QString newFilePath = RimTools::relocateFile(filePath->path(), newProjectPath, oldProjectPath, &foundFile, &searchedPaths);
filePath->setPath(newFilePath);
}
// Loop over all cases and update file path

View File

@ -151,6 +151,10 @@ protected:
virtual void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "");
private:
template <typename T>
void fieldsByType(caf::PdmObjectHandle* object, std::vector<T*>& typedFields);
private:
caf::PdmField<QString> m_projectFileVersionString;
@ -166,3 +170,39 @@ private:
caf::PdmChildArrayField<RimEclipseCase*> casesObsolete; // obsolete
caf::PdmChildArrayField<RimIdenticalGridCaseGroup*> caseGroupsObsolete; // obsolete
};
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template <typename T>
void RimProject::fieldsByType(caf::PdmObjectHandle* object, std::vector<T*>& typedFields)
{
if (!object) return;
std::vector<caf::PdmFieldHandle*> allFieldsInObject;
object->fields(allFieldsInObject);
std::vector<caf::PdmObjectHandle*> children;
for (const auto& field : allFieldsInObject)
{
caf::PdmField<T>* typedField = dynamic_cast<caf::PdmField<T>*>(field);
if (typedField) typedFields.push_back(&typedField->v());
caf::PdmField< std::vector<T> >* typedFieldInVector = dynamic_cast<caf::PdmField< std::vector<T> >*>(field);
if (typedFieldInVector)
{
for (T& typedFieldFromVector : typedFieldInVector->v())
{
typedFields.push_back(&typedFieldFromVector);
}
}
field->childObjects(&children);
}
for (const auto& child : children)
{
fieldsByType(child, typedFields);
}
}

View File

@ -16,9 +16,8 @@
///
//--------------------------------------------------------------------------------------------------
template <typename T>
void fieldsByType(caf::PdmObjectHandle* object, std::vector<T*>* typedFields)
void fieldsByType(caf::PdmObjectHandle* object, std::vector<T*>& typedFields)
{
if (!typedFields) return;
if (!object) return;
std::vector<caf::PdmFieldHandle*> allFieldsInObject;
@ -29,14 +28,14 @@ void fieldsByType(caf::PdmObjectHandle* object, std::vector<T*>* typedFields)
for (const auto& field : allFieldsInObject)
{
caf::PdmField<T>* typedField = dynamic_cast<caf::PdmField<T>*>(field);
if (typedField) typedFields->push_back(&typedField->v());
if (typedField) typedFields.push_back(&typedField->v());
caf::PdmField< std::vector<T> >* typedFieldInVector = dynamic_cast<caf::PdmField< std::vector<T> >*>(field);
if (typedFieldInVector)
{
for (T& typedFieldFromVector : typedFieldInVector->v())
{
typedFields->push_back(&typedFieldFromVector);
typedFields.push_back(&typedFieldFromVector);
}
}
@ -65,7 +64,7 @@ TEST(RimRelocatePathTest, findPathsInProjectFile)
std::vector< caf::FilePath* > filePaths;
fieldsByType(&project, &filePaths);
fieldsByType(&project, filePaths);
for (auto filePath : filePaths)
{