From 3817cea3cff355ff8ac6a64341cdf57c937bc88f Mon Sep 17 00:00:00 2001 From: Jon Jenssen Date: Wed, 23 Aug 2023 18:46:05 +0200 Subject: [PATCH] Fix grid generation. Add model thickness parameter. Add support for reloading INP files from recent files Add working directory field to fault reactivation model and put INP export there. --- .../Application/RiaApplication.cpp | 2 +- ApplicationLibCode/Application/RiaDefines.cpp | 4 +++ ApplicationLibCode/Application/RiaDefines.h | 2 ++ .../RicExportInpFileFeature.cpp | 5 +-- .../RicNewFaultReactModelingFeature.cpp | 9 ++++- .../FileInterface/RifInpExportTools.h | 2 +- .../Faults/RimFaultReactivationModel.cpp | 24 +++++++++++++ .../Faults/RimFaultReactivationModel.h | 6 ++++ .../RimFaultReactivationModelCollection.cpp | 4 ++- .../RimFaultReactivationModelCollection.h | 2 +- .../RigFaultReactivationModel.cpp | 17 ++++++++-- .../RigFaultReactivationModel.h | 3 ++ .../ReservoirDataModel/RigGriddedPart3d.cpp | 34 +++++++++++-------- .../ReservoirDataModel/RigGriddedPart3d.h | 9 +++-- 14 files changed, 96 insertions(+), 27 deletions(-) diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index 469404b433..bf30591147 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -353,7 +353,7 @@ bool RiaApplication::openFile( const QString& fileName ) { loadingSucceded = loadProject( fileName ); } - else if ( fileType == RiaDefines::ImportFileType::GEOMECH_ODB_FILE ) + else if ( int( fileType ) & int( RiaDefines::ImportFileType::ANY_GEOMECH_FILE ) ) { loadingSucceded = openOdbCaseFromFile( fileName ); lastUsedDialogTag = "GEOMECH_MODEL"; diff --git a/ApplicationLibCode/Application/RiaDefines.cpp b/ApplicationLibCode/Application/RiaDefines.cpp index 9dd8939ade..da3dcdda27 100644 --- a/ApplicationLibCode/Application/RiaDefines.cpp +++ b/ApplicationLibCode/Application/RiaDefines.cpp @@ -297,6 +297,10 @@ RiaDefines::ImportFileType RiaDefines::obtainFileTypeFromFileName( const QString { return ImportFileType::GEOMECH_ODB_FILE; } + else if ( fileName.endsWith( "INP", Qt::CaseInsensitive ) ) + { + return ImportFileType::GEOMECH_INP_FILE; + } else if ( fileName.endsWith( ".rsp", Qt::CaseInsensitive ) || fileName.endsWith( ".rip", Qt::CaseInsensitive ) ) { return ImportFileType::RESINSIGHT_PROJECT_FILE; diff --git a/ApplicationLibCode/Application/RiaDefines.h b/ApplicationLibCode/Application/RiaDefines.h index 27481879ea..3591116eff 100644 --- a/ApplicationLibCode/Application/RiaDefines.h +++ b/ApplicationLibCode/Application/RiaDefines.h @@ -133,8 +133,10 @@ enum class ImportFileType GEOMECH_ODB_FILE = 0x10, RESINSIGHT_PROJECT_FILE = 0x20, ROFF_FILE = 0x30, + GEOMECH_INP_FILE = 0x40, ECLIPSE_RESULT_GRID = ECLIPSE_GRID_FILE | ECLIPSE_EGRID_FILE, ANY_ECLIPSE_FILE = ECLIPSE_RESULT_GRID | ECLIPSE_INPUT_FILE | ECLIPSE_SUMMARY_FILE | ROFF_FILE, + ANY_GEOMECH_FILE = GEOMECH_ODB_FILE | GEOMECH_INP_FILE, ANY_IMPORT_FILE = 0xFF }; diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportInpFileFeature.cpp b/ApplicationLibCode/Commands/ExportCommands/RicExportInpFileFeature.cpp index 16b32372e2..b22493301b 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportInpFileFeature.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportInpFileFeature.cpp @@ -27,6 +27,7 @@ #include #include +#include CAF_CMD_SOURCE_INIT( RicExportInpFileFeature, "RicExportInpFileFeature" ); @@ -46,8 +47,8 @@ void RicExportInpFileFeature::onActionTriggered( bool isChecked ) auto faultReactivationModel = caf::SelectionManager::instance()->selectedItemOfType(); if ( faultReactivationModel ) { - std::string exportFile = "/tmp/faultreactivation.inp"; - RifFaultReactivationModelExporter::exportToFile( exportFile, *faultReactivationModel->model() ); + QString exportFile = faultReactivationModel->baseDir() + "/faultreactivation.inp"; + RifFaultReactivationModelExporter::exportToFile( exportFile.toStdString(), *faultReactivationModel->model() ); } } diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactModelingFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactModelingFeature.cpp index 07a12f3683..17f0b7ffec 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactModelingFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactModelingFeature.cpp @@ -22,6 +22,7 @@ #include "RiaPreferencesGeoMech.h" #include "Riu3DMainWindowTools.h" +#include "RiuFileDialogTools.h" #include "RiuViewer.h" #include "Rim3dView.h" @@ -102,8 +103,14 @@ void RicNewFaultReactModelingFeature::onActionTriggered( bool isChecked ) if ( camPos.pointDistance( candidate2 ) < camPos.pointDistance( candidate1 ) ) target2 = candidate2; - RimFaultReactivationModel* model = eclView->faultReactivationModelCollection()->addNewModel( rimFault, target1, target2 ); + // get base directory for our work, should be a new, empty folder somewhere + QString defaultDir = + RiaApplication::instance()->lastUsedDialogDirectoryWithFallbackToProjectFolder( "FAULT_REACTIVATION_MODELING" ); + QString baseDir = RiuFileDialogTools::getExistingDirectory( nullptr, tr( "Select Working Directory" ), defaultDir ); + if ( baseDir.isNull() || baseDir.isEmpty() ) return; + + auto model = eclView->faultReactivationModelCollection()->addNewModel( rimFault, target1, target2, baseDir ); if ( model != nullptr ) { view->updateAllRequiredEditors(); diff --git a/ApplicationLibCode/FileInterface/RifInpExportTools.h b/ApplicationLibCode/FileInterface/RifInpExportTools.h index a66071f5fb..a0a0b5f0b1 100644 --- a/ApplicationLibCode/FileInterface/RifInpExportTools.h +++ b/ApplicationLibCode/FileInterface/RifInpExportTools.h @@ -20,7 +20,7 @@ #include "cvfVector3.h" -//#include +// #include #include #include #include diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.cpp index 8f1a8a9afa..13c29a8deb 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.cpp @@ -58,6 +58,10 @@ RimFaultReactivationModel::RimFaultReactivationModel() CAF_PDM_InitField( &m_userDescription, "UserDescription", QString( "Model" ), "Name" ); + CAF_PDM_InitFieldNoDefault( &m_baseDir, "BaseDirectory", "Working folder" ); + + CAF_PDM_InitField( &m_modelThickness, "ModelThickness", 100.0, "Model Cell Thickness" ); + CAF_PDM_InitField( &m_extentHorizontal, "HorizontalExtent", 1000.0, "Horizontal Extent" ); CAF_PDM_InitField( &m_extentVerticalAbove, "VerticalExtentAbove", 200.0, "Vertical Extent Above Anchor" ); m_extentVerticalAbove.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); @@ -249,6 +253,8 @@ void RimFaultReactivationModel::updateVisualization() m_numberOfCellsVertUp, m_numberOfCellsVertMid, m_numberOfCellsVertLow ); + m_modelPlane->setThickness( m_modelThickness ); + m_modelPlane->updateRects(); view->scheduleCreateDisplayModelAndRedraw(); @@ -349,6 +355,7 @@ void RimFaultReactivationModel::defineUiOrdering( QString uiConfigName, caf::Pdm auto genGrp = uiOrdering.addNewGroup( "General" ); genGrp->add( &m_userDescription ); genGrp->add( &m_fault ); + genGrp->add( &m_baseDir ); auto faultGrp = uiOrdering.addNewGroup( "Fault Plane" ); @@ -368,6 +375,7 @@ void RimFaultReactivationModel::defineUiOrdering( QString uiConfigName, caf::Pdm auto gridModelGrp = modelGrp->addNewGroup( "Grid" ); + gridModelGrp->add( &m_modelThickness ); gridModelGrp->add( &m_numberOfCellsHorzPart1 ); gridModelGrp->add( &m_numberOfCellsHorzPart2 ); gridModelGrp->add( &m_numberOfCellsVertUp ); @@ -448,3 +456,19 @@ RimEclipseCase* RimFaultReactivationModel::eclipseCase() } return nullptr; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFaultReactivationModel::setBaseDir( QString path ) +{ + m_baseDir = path; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimFaultReactivationModel::baseDir() const +{ + return m_baseDir().path(); +} diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.h index 498a6f2795..2ad061a90d 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.h +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModel.h @@ -86,6 +86,9 @@ public: cvf::ref model() const; bool showModel() const; + QString baseDir() const; + void setBaseDir( QString path ); + protected: caf::PdmFieldHandle* userDescriptionField() override; QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override; @@ -103,6 +106,9 @@ private: cvf::ref m_partMgr; + caf::PdmField m_baseDir; + caf::PdmField m_modelThickness; + caf::PdmField m_userDescription; caf::PdmPtrField m_fault; caf::PdmChildArrayField m_targets; diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.cpp index bd929403bb..82fc498747 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.cpp @@ -60,10 +60,12 @@ RimFaultReactivationModelCollection::~RimFaultReactivationModelCollection() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimFaultReactivationModel* RimFaultReactivationModelCollection::addNewModel( RimFaultInView* fault, cvf::Vec3d target1, cvf::Vec3d target2 ) +RimFaultReactivationModel* + RimFaultReactivationModelCollection::addNewModel( RimFaultInView* fault, cvf::Vec3d target1, cvf::Vec3d target2, QString baseDir ) { auto newModel = new RimFaultReactivationModel(); newModel->setFault( fault ); + newModel->setBaseDir( baseDir ); newModel->setUserDescription( fault->name() ); newModel->setTargets( target1, target2 ); diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.h index ca9a5ab0de..0089a6b0e7 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationModelCollection.h @@ -50,7 +50,7 @@ public: RimFaultReactivationModelCollection(); ~RimFaultReactivationModelCollection() override; - RimFaultReactivationModel* addNewModel( RimFaultInView* fault, cvf::Vec3d target1, cvf::Vec3d target2 ); + RimFaultReactivationModel* addNewModel( RimFaultInView* fault, cvf::Vec3d target1, cvf::Vec3d target2, QString baseDir ); bool empty(); int size(); diff --git a/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.cpp b/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.cpp index 91c0dbbd2d..c14d82aab1 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.cpp @@ -34,6 +34,7 @@ RigFaultReactivationModel::RigFaultReactivationModel() , m_cellCountVertUpper( 1 ) , m_cellCountVertMiddle( 1 ) , m_cellCountVertLower( 1 ) + , m_thickness( 1.0 ) { for ( auto part : allModelParts() ) @@ -167,6 +168,16 @@ void RigFaultReactivationModel::setCellCounts( int horzPart1, int horzPart2, int reset(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFaultReactivationModel::setThickness( double thickness ) +{ + m_thickness = thickness; + + reset(); +} + //-------------------------------------------------------------------------------------------------- /// 7 /// 3----------|----------- 11 @@ -289,12 +300,14 @@ void RigFaultReactivationModel::generateGrids( cvf::Vec3dArray points ) m_cellCountHorzPart1, m_cellCountVertLower, m_cellCountVertMiddle, - m_cellCountVertUpper ); + m_cellCountVertUpper, + m_thickness ); m_3dparts[GridPart::PART2]->generateGeometry( { points[8], points[9], points[10], points[11], points[4], points[5], points[6], points[7] }, m_cellCountHorzPart2, m_cellCountVertLower, m_cellCountVertMiddle, - m_cellCountVertUpper ); + m_cellCountVertUpper, + m_thickness ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.h b/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.h index d327a3c3b9..323def2263 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.h +++ b/ApplicationLibCode/ReservoirDataModel/RigFaultReactivationModel.h @@ -80,6 +80,7 @@ public: void setMaxExtentFromAnchor( double maxExtentHorz, double minZ, double maxZ ); void setCellCounts( int horzPart1, int horzPart2, int vertUpper, int vertMiddle, int vertLower ); + void setThickness( double thickness ); void updateRects(); @@ -105,6 +106,8 @@ private: double m_minZ; double m_maxZ; + double m_thickness; + int m_cellCountHorzPart1; int m_cellCountHorzPart2; int m_cellCountVertUpper; diff --git a/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.cpp b/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.cpp index 876582b4b8..e899b66db9 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.cpp @@ -24,7 +24,6 @@ /// //-------------------------------------------------------------------------------------------------- RigGriddedPart3d::RigGriddedPart3d() - : m_thickness( 10.0 ) { } @@ -78,7 +77,12 @@ cvf::Vec3d RigGriddedPart3d::stepVector( cvf::Vec3d start, cvf::Vec3d stop, int /// /// //-------------------------------------------------------------------------------------------------- -void RigGriddedPart3d::generateGeometry( std::vector inputPoints, int nHorzCells, int nVertCellsLower, int nVertCellsMiddle, int nVertCellsUpper ) +void RigGriddedPart3d::generateGeometry( std::vector inputPoints, + int nHorzCells, + int nVertCellsLower, + int nVertCellsMiddle, + int nVertCellsUpper, + double thickness ) { reset(); @@ -94,12 +98,13 @@ void RigGriddedPart3d::generateGeometry( std::vector inputPoints, in cvf::Vec3d tVec = step0to4 ^ step0to1; tVec.normalize(); - tVec *= m_thickness; + tVec *= thickness; + const std::vector m_thicknessFactors = { -1.0, 0.0, 1.0 }; const int nThicknessCells = 2; const int nVertCells = nVertCellsLower + nVertCellsMiddle + nVertCellsUpper; - const std::vector vertCells = { nVertCellsLower, nVertCellsMiddle, nVertCellsUpper + 1 }; + const std::vector vertLines = { nVertCellsLower, nVertCellsMiddle, nVertCellsUpper + 1 }; const std::vector firstSteps = { step0to1, step1to2, step2to3 }; const std::vector lastSteps = { step4to5, step5to6, step6to7 }; @@ -107,27 +112,26 @@ void RigGriddedPart3d::generateGeometry( std::vector inputPoints, in m_vertices.reserve( (size_t)( ( nVertCells + 1 ) * ( nHorzCells + 1 ) ) ); - cvf::Vec3d p = inputPoints[0]; - cvf::Vec3d pLast = inputPoints[4]; + cvf::Vec3d pFrom = inputPoints[0]; + cvf::Vec3d pTo = inputPoints[4]; - for ( int i = 0; i < (int)vertCells.size(); i++ ) + for ( int i = 0; i < (int)vertLines.size(); i++ ) { - for ( int v = 0; v < vertCells[i]; v++ ) + for ( int v = 0; v < vertLines[i]; v++ ) { - cvf::Vec3d stepHorz = stepVector( p, pLast, nHorzCells ); - cvf::Vec3d p2 = p; + cvf::Vec3d stepHorz = stepVector( pFrom, pTo, nHorzCells ); + cvf::Vec3d p = pFrom; for ( int h = 0; h <= nHorzCells; h++ ) { for ( int t = 0; t < (int)m_thicknessFactors.size(); t++ ) { - m_vertices.push_back( p2 + m_thicknessFactors[t] * tVec ); + m_vertices.push_back( p + m_thicknessFactors[t] * tVec ); } - p2 += stepHorz; - pLast = p2; + p += stepHorz; } - p += firstSteps[i]; - pLast += lastSteps[i]; + pFrom += firstSteps[i]; + pTo += lastSteps[i]; } } diff --git a/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.h b/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.h index f6ad4daf49..c63331bd04 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.h +++ b/ApplicationLibCode/ReservoirDataModel/RigGriddedPart3d.h @@ -44,7 +44,12 @@ public: void reset(); - void generateGeometry( std::vector inputPoints, int nHorzCells, int nVertCellsLower, int nVertCellsMiddle, int nVertCellsUpper ); + void generateGeometry( std::vector inputPoints, + int nHorzCells, + int nVertCellsLower, + int nVertCellsMiddle, + int nVertCellsUpper, + double thickness ); const std::vector& vertices() const; const std::vector>& elementIndices() const; @@ -60,6 +65,4 @@ private: std::vector> m_elementIndices; std::map> m_borderSurfaceElements; std::vector> m_meshLines; - - double m_thickness; };