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.
This commit is contained in:
Jon Jenssen 2023-08-23 18:46:05 +02:00 committed by Kristian Bendiksen
parent 6845c09c0c
commit 3817cea3cf
14 changed files with 96 additions and 27 deletions

View File

@ -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";

View File

@ -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;

View File

@ -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
};

View File

@ -27,6 +27,7 @@
#include <QAction>
#include <QFile>
#include <QString>
CAF_CMD_SOURCE_INIT( RicExportInpFileFeature, "RicExportInpFileFeature" );
@ -46,8 +47,8 @@ void RicExportInpFileFeature::onActionTriggered( bool isChecked )
auto faultReactivationModel = caf::SelectionManager::instance()->selectedItemOfType<RimFaultReactivationModel>();
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() );
}
}

View File

@ -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();

View File

@ -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();
}

View File

@ -86,6 +86,9 @@ public:
cvf::ref<RigFaultReactivationModel> model() const;
bool showModel() const;
QString baseDir() const;
void setBaseDir( QString path );
protected:
caf::PdmFieldHandle* userDescriptionField() override;
QList<caf::PdmOptionItemInfo> calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions ) override;
@ -103,6 +106,9 @@ private:
cvf::ref<RivFaultReactivationModelPartMgr> m_partMgr;
caf::PdmField<caf::FilePath> m_baseDir;
caf::PdmField<double> m_modelThickness;
caf::PdmField<QString> m_userDescription;
caf::PdmPtrField<RimFaultInView*> m_fault;
caf::PdmChildArrayField<RimPolylineTarget*> m_targets;

View File

@ -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 );

View File

@ -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();

View File

@ -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 );
}
//--------------------------------------------------------------------------------------------------

View File

@ -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;

View File

@ -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<cvf::Vec3d> inputPoints, int nHorzCells, int nVertCellsLower, int nVertCellsMiddle, int nVertCellsUpper )
void RigGriddedPart3d::generateGeometry( std::vector<cvf::Vec3d> inputPoints,
int nHorzCells,
int nVertCellsLower,
int nVertCellsMiddle,
int nVertCellsUpper,
double thickness )
{
reset();
@ -94,12 +98,13 @@ void RigGriddedPart3d::generateGeometry( std::vector<cvf::Vec3d> inputPoints, in
cvf::Vec3d tVec = step0to4 ^ step0to1;
tVec.normalize();
tVec *= m_thickness;
tVec *= thickness;
const std::vector<double> m_thicknessFactors = { -1.0, 0.0, 1.0 };
const int nThicknessCells = 2;
const int nVertCells = nVertCellsLower + nVertCellsMiddle + nVertCellsUpper;
const std::vector<int> vertCells = { nVertCellsLower, nVertCellsMiddle, nVertCellsUpper + 1 };
const std::vector<int> vertLines = { nVertCellsLower, nVertCellsMiddle, nVertCellsUpper + 1 };
const std::vector<cvf::Vec3d> firstSteps = { step0to1, step1to2, step2to3 };
const std::vector<cvf::Vec3d> lastSteps = { step4to5, step5to6, step6to7 };
@ -107,27 +112,26 @@ void RigGriddedPart3d::generateGeometry( std::vector<cvf::Vec3d> 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];
}
}

View File

@ -44,7 +44,12 @@ public:
void reset();
void generateGeometry( std::vector<cvf::Vec3d> inputPoints, int nHorzCells, int nVertCellsLower, int nVertCellsMiddle, int nVertCellsUpper );
void generateGeometry( std::vector<cvf::Vec3d> inputPoints,
int nHorzCells,
int nVertCellsLower,
int nVertCellsMiddle,
int nVertCellsUpper,
double thickness );
const std::vector<cvf::Vec3d>& vertices() const;
const std::vector<std::vector<unsigned int>>& elementIndices() const;
@ -60,6 +65,4 @@ private:
std::vector<std::vector<unsigned int>> m_elementIndices;
std::map<BorderSurface, std::vector<unsigned int>> m_borderSurfaceElements;
std::vector<std::vector<cvf::Vec3d>> m_meshLines;
double m_thickness;
};