#7818 Modeled Well Path : Update location of completions

This commit is contained in:
Magne Sjaastad 2021-06-28 13:10:57 +02:00
parent 73f8046353
commit e06e0116d8
27 changed files with 184 additions and 17 deletions

View File

@ -18,12 +18,15 @@
#include "RicCreateMultipleWellPathLaterals.h" #include "RicCreateMultipleWellPathLaterals.h"
#include "RicNewWellPathLateralAtDepthFeature.h"
#include "RigWellPath.h" #include "RigWellPath.h"
#include "RimModeledWellPath.h" #include "RimModeledWellPath.h"
#include "RimProject.h" #include "RimProject.h"
#include "RimTools.h" #include "RimTools.h"
#include "RimWellPathCollection.h" #include "RimWellPathCollection.h"
#include "RimWellPathCompletions.h"
#include "RimWellPathGeometryDef.h" #include "RimWellPathGeometryDef.h"
#include "RimWellPathTarget.h" #include "RimWellPathTarget.h"
#include "RimWellPathTieIn.h" #include "RimWellPathTieIn.h"
@ -133,9 +136,12 @@ void RicCreateMultipleWellPathLaterals::slotAppendFractures()
RimModeledWellPath* sourceLateral = m_ui->sourceLateral(); RimModeledWellPath* sourceLateral = m_ui->sourceLateral();
if ( !sourceLateral ) return; if ( !sourceLateral ) return;
if ( !sourceLateral->wellPathTieIn()->parentWell() ) return;
auto parentWellPath = sourceLateral->wellPathTieIn()->parentWell();
if ( !parentWellPath ) return;
auto sourceLocationOfFirstWellTarget = sourceLateral->geometryDefinition()->firstActiveTarget()->targetPointXYZ(); auto sourceLocationOfFirstWellTarget = sourceLateral->geometryDefinition()->firstActiveTarget()->targetPointXYZ();
auto sourceTieInMeasuredDepth = sourceLateral->wellPathTieIn()->tieInMeasuredDepth();
RimWellPathCollection* wellPathCollection = RimTools::wellPathCollection(); RimWellPathCollection* wellPathCollection = RimTools::wellPathCollection();
if ( wellPathCollection ) if ( wellPathCollection )
@ -146,8 +152,10 @@ void RicCreateMultipleWellPathLaterals::slotAppendFractures()
RimModeledWellPath* newModeledWellPath = dynamic_cast<RimModeledWellPath*>( RimModeledWellPath* newModeledWellPath = dynamic_cast<RimModeledWellPath*>(
sourceLateral->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); sourceLateral->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) );
QString name = sourceLateral->name() + QString( " (# %1)" ).arg( index++ ); auto nameOfNewWell =
newModeledWellPath->setName( name ); RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSideStep( parentWellPath );
newModeledWellPath->setName( nameOfNewWell );
newModeledWellPath->wellPathTieIn()->setTieInMeasuredDepth( measuredDepth ); newModeledWellPath->wellPathTieIn()->setTieInMeasuredDepth( measuredDepth );
wellPathCollection->addWellPath( newModeledWellPath, false ); wellPathCollection->addWellPath( newModeledWellPath, false );
@ -156,12 +164,16 @@ void RicCreateMultipleWellPathLaterals::slotAppendFractures()
newModeledWellPath->updateReferencePoint(); newModeledWellPath->updateReferencePoint();
updateLocationOfTargets( newModeledWellPath, sourceLocationOfFirstWellTarget ); updateLocationOfTargets( newModeledWellPath, sourceLocationOfFirstWellTarget );
updateLocationOfCompletions( newModeledWellPath, sourceTieInMeasuredDepth );
newModeledWellPath->updateWellPathVisualization(); newModeledWellPath->updateWellPathVisualization();
} }
wellPathCollection->rebuildWellPathNodes();
wellPathCollection->uiCapability()->updateConnectedEditors(); wellPathCollection->uiCapability()->updateConnectedEditors();
Riu3DMainWindowTools::selectAsCurrentItem( sourceLateral );
RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews();
m_ui->updateConnectedEditors(); m_ui->updateConnectedEditors();
@ -191,3 +203,18 @@ void RicCreateMultipleWellPathLaterals::updateLocationOfTargets( RimModeledWellP
wellTarget->setPointXYZ( newTargetLocationXYZ ); wellTarget->setPointXYZ( newTargetLocationXYZ );
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicCreateMultipleWellPathLaterals::updateLocationOfCompletions( RimModeledWellPath* newModeledWellPath,
const double sourceTieInMeasuredDepth )
{
auto tieInMeasuredDepth = newModeledWellPath->wellPathTieIn()->tieInMeasuredDepth();
auto diffMD = tieInMeasuredDepth - sourceTieInMeasuredDepth;
for ( auto completion : newModeledWellPath->completions()->allCompletionsNoConst() )
{
completion->applyOffset( diffMD );
}
}

View File

@ -44,9 +44,12 @@ protected:
private slots: private slots:
void slotAppendFractures(); void slotAppendFractures();
private:
void updateLocationOfTargets( RimModeledWellPath* newModeledWellPath, void updateLocationOfTargets( RimModeledWellPath* newModeledWellPath,
const cvf::Vec3d& sourceLocationOfFirstWellTarget ); const cvf::Vec3d& sourceLocationOfFirstWellTarget );
void updateLocationOfCompletions( RimModeledWellPath* newModeledWellPath, const double sourceTieInMeasuredDepth );
private: private:
std::unique_ptr<RicCreateMultipleWellPathLateralsUi> m_ui; std::unique_ptr<RicCreateMultipleWellPathLateralsUi> m_ui;
}; };

View File

@ -147,13 +147,13 @@ RiuWellPathSelectionItem* RicNewWellPathLateralAtDepthFeature::wellPathSelection
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentwWellPath ) QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentWellPath )
{ {
if ( !parentwWellPath ) return ""; if ( !parentWellPath ) return "";
QString nameOfNewWell; QString nameOfNewWell;
auto topLevelWell = parentwWellPath->topLevelWellPath(); auto topLevelWell = parentWellPath->topLevelWellPath();
QStringList allNames; QStringList allNames;
{ {
@ -175,7 +175,7 @@ QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSide
if ( allNames.size() == 1 ) if ( allNames.size() == 1 )
{ {
QString name = parentwWellPath->name(); QString name = parentWellPath->name();
if ( name.contains( "Y1" ) ) if ( name.contains( "Y1" ) )
{ {
@ -183,7 +183,7 @@ QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSide
} }
else else
{ {
parentwWellPath->setNameNoUpdateOfExportName( name + " Y1" ); parentWellPath->setNameNoUpdateOfExportName( name + " Y1" );
nameOfNewWell = name + " Y2"; nameOfNewWell = name + " Y2";
} }

View File

@ -36,8 +36,8 @@ public:
void setupActionLook( QAction* actionToSetup ) override; void setupActionLook( QAction* actionToSetup ) override;
static RimWellPath* createLateralAtMeasuredDepth( RimWellPath* parentWellPath, double parentWellMD ); static RimWellPath* createLateralAtMeasuredDepth( RimWellPath* parentWellPath, double parentWellMD );
static QString updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentWellPath );
private: private:
static RiuWellPathSelectionItem* wellPathSelectionItem(); static RiuWellPathSelectionItem* wellPathSelectionItem();
static QString updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentwWellPath );
}; };

View File

@ -535,6 +535,14 @@ double RimFishbones::endMD() const
return measuredDepth; return measuredDepth;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimFishbones::applyOffset( double offsetMD )
{
m_valveLocations->applyOffset( offsetMD );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -109,6 +109,7 @@ public:
cvf::Color3f defaultComponentColor() const override; cvf::Color3f defaultComponentColor() const override;
double startMD() const override; double startMD() const override;
double endMD() const override; double endMD() const override;
void applyOffset( double offsetMD ) override;
public: public:
caf::PdmField<cvf::Color3f> fishbonesColor; caf::PdmField<cvf::Color3f> fishbonesColor;

View File

@ -217,6 +217,17 @@ void RimMultipleValveLocations::initFields( LocationType locationT
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimMultipleValveLocations::applyOffset( double offset )
{
m_rangeStart = m_rangeStart + offset;
m_rangeEnd = m_rangeEnd + offset;
computeRangesAndLocations();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -55,6 +55,8 @@ public:
int valveCount, int valveCount,
const std::vector<double>& locationOfValves ); const std::vector<double>& locationOfValves );
void applyOffset( double offset );
protected: protected:
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;

View File

@ -141,6 +141,21 @@ std::vector<const RimPerforationInterval*> RimPerforationCollection::perforation
return myPerforations; return myPerforations;
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimPerforationInterval*> RimPerforationCollection::perforationsNoConst() const
{
std::vector<RimPerforationInterval*> myPerforations;
for ( const auto& perforation : m_perforations )
{
myPerforations.push_back( perforation );
}
return myPerforations;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -46,6 +46,7 @@ public:
const RimNonDarcyPerforationParameters* nonDarcyParameters() const; const RimNonDarcyPerforationParameters* nonDarcyParameters() const;
void appendPerforation( RimPerforationInterval* perforation ); void appendPerforation( RimPerforationInterval* perforation );
std::vector<const RimPerforationInterval*> perforations() const; std::vector<const RimPerforationInterval*> perforations() const;
std::vector<RimPerforationInterval*> perforationsNoConst() const;
std::vector<const RimPerforationInterval*> activePerforations() const; std::vector<const RimPerforationInterval*> activePerforations() const;
private: private:

View File

@ -305,6 +305,15 @@ double RimPerforationInterval::endMD() const
return m_endMD(); return m_endMD();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimPerforationInterval::applyOffset( double offsetMD )
{
m_startMD = m_startMD + offsetMD;
m_endMD = m_endMD + offsetMD;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -76,6 +76,7 @@ public:
cvf::Color3f defaultComponentColor() const override; cvf::Color3f defaultComponentColor() const override;
double startMD() const override; double startMD() const override;
double endMD() const override; double endMD() const override;
void applyOffset( double offsetMD ) override;
protected: protected:
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;

View File

@ -155,6 +155,14 @@ bool RimSimWellFracture::isEnabled() const
return isChecked(); return isChecked();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSimWellFracture::applyOffset( double offsetMD )
{
m_location = m_location + offsetMD;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -52,6 +52,8 @@ public:
bool isEnabled() const override; // RimWellPathCompletionsInterface override bool isEnabled() const override; // RimWellPathCompletionsInterface override
void applyOffset( double offsetMD ) override;
protected: protected:
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;

View File

@ -171,6 +171,35 @@ std::vector<RimWellPathFracture*> RimWellPathCompletions::activeFractures() cons
return {}; return {};
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RimWellPathComponentInterface*> RimWellPathCompletions::allCompletionsNoConst() const
{
std::vector<RimWellPathComponentInterface*> completions;
for ( RimWellPathFracture* fracture : m_fractureCollection->allFractures() )
{
completions.push_back( fracture );
}
for ( RimFishbones* fishbones : m_fishbonesCollection->allFishbonesSubs() )
{
completions.push_back( fishbones );
}
for ( RimPerforationInterval* perforation : m_perforationCollection->perforationsNoConst() )
{
completions.push_back( perforation );
}
std::vector<RimWellPathValve*> allValves = valves();
for ( RimWellPathValve* valve : allValves )
{
completions.push_back( valve );
}
return completions;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -50,6 +50,7 @@ public:
RimWellPathFractureCollection* fractureCollection() const; RimWellPathFractureCollection* fractureCollection() const;
RimStimPlanModelCollection* stimPlanModelCollection() const; RimStimPlanModelCollection* stimPlanModelCollection() const;
std::vector<RimWellPathComponentInterface*> allCompletionsNoConst() const;
std::vector<const RimWellPathComponentInterface*> allCompletions() const; std::vector<const RimWellPathComponentInterface*> allCompletions() const;
bool hasCompletions() const; bool hasCompletions() const;
void setUnitSystemSpecificDefaults(); void setUnitSystemSpecificDefaults();

View File

@ -30,11 +30,12 @@
class RimWellPathComponentInterface class RimWellPathComponentInterface
{ {
public: public:
virtual bool isEnabled() const = 0; virtual bool isEnabled() const = 0;
virtual RiaDefines::WellPathComponentType componentType() const = 0; virtual RiaDefines::WellPathComponentType componentType() const = 0;
virtual QString componentLabel() const = 0; virtual QString componentLabel() const = 0;
virtual QString componentTypeLabel() const = 0; virtual QString componentTypeLabel() const = 0;
virtual cvf::Color3f defaultComponentColor() const = 0; virtual cvf::Color3f defaultComponentColor() const = 0;
virtual double startMD() const = 0; virtual double startMD() const = 0;
virtual double endMD() const = 0; virtual double endMD() const = 0;
virtual void applyOffset( double offsetMD ) = 0;
}; };

View File

@ -310,3 +310,11 @@ void RimWellPathFracture::triangleGeometry( std::vector<cvf::Vec3f>* nodeCoords,
{ {
m_fractureTemplate->fractureTriangleGeometry( nodeCoords, triangleIndices, m_wellPathDepthAtFracture ); m_fractureTemplate->fractureTriangleGeometry( nodeCoords, triangleIndices, m_wellPathDepthAtFracture );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellPathFracture::applyOffset( double offsetMD )
{
m_measuredDepth = m_measuredDepth + offsetMD;
}

View File

@ -57,6 +57,8 @@ public:
void triangleGeometry( std::vector<cvf::Vec3f>* nodeCoords, std::vector<cvf::uint>* triangleIndices ) const override; void triangleGeometry( std::vector<cvf::Vec3f>* nodeCoords, std::vector<cvf::uint>* triangleIndices ) const override;
void applyOffset( double offsetMD ) override;
protected: protected:
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
void defineEditorAttribute( const caf::PdmFieldHandle* field, void defineEditorAttribute( const caf::PdmFieldHandle* field,

View File

@ -434,6 +434,14 @@ double RimWellPathValve::endMD() const
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellPathValve::applyOffset( double offsetMD )
{
m_measuredDepth = m_measuredDepth + offsetMD;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -75,6 +75,7 @@ public:
cvf::Color3f defaultComponentColor() const override; cvf::Color3f defaultComponentColor() const override;
double startMD() const override; double startMD() const override;
double endMD() const override; double endMD() const override;
void applyOffset( double offsetMD ) override;
void templateUpdated(); void templateUpdated();

View File

@ -239,6 +239,14 @@ cvf::Color3f RimWellPath::defaultComponentColor() const
return RiaColorTables::wellPathComponentColors()[componentType()]; return RiaColorTables::wellPathComponentColors()[componentType()];
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellPath::applyOffset( double offsetMD )
{
// Nothing to do here, as the offset is intended for well path completions
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -153,6 +153,7 @@ public:
QString componentLabel() const override; QString componentLabel() const override;
QString componentTypeLabel() const override; QString componentTypeLabel() const override;
cvf::Color3f defaultComponentColor() const override; cvf::Color3f defaultComponentColor() const override;
void applyOffset( double offsetMD ) override;
void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray,
std::vector<caf::PdmObjectHandle*>& referringObjects ) override; std::vector<caf::PdmObjectHandle*>& referringObjects ) override;

View File

@ -153,6 +153,15 @@ double RimWellPathAttribute::endMD() const
return m_endMD(); return m_endMD();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellPathAttribute::applyOffset( double offsetMD )
{
m_startMD = m_startMD + offsetMD;
m_endMD = m_endMD + offsetMD;
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -54,6 +54,7 @@ public:
cvf::Color3f defaultComponentColor() const override; cvf::Color3f defaultComponentColor() const override;
double startMD() const override; double startMD() const override;
double endMD() const override; double endMD() const override;
void applyOffset( double offsetMD ) override;
private: private:
static std::set<double> supportedDiameters( RiaDefines::WellPathComponentType type ); static std::set<double> supportedDiameters( RiaDefines::WellPathComponentType type );

View File

@ -475,6 +475,14 @@ double RimStimPlanModel::endMD() const
return m_MD(); return m_MD();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimStimPlanModel::applyOffset( double offsetMD )
{
// Nothing to do here, this operation is inteded for well path completions
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -145,7 +145,9 @@ public:
cvf::Color3f defaultComponentColor() const override; cvf::Color3f defaultComponentColor() const override;
double startMD() const override; double startMD() const override;
double endMD() const override; double endMD() const override;
bool isEnabled() const override; void applyOffset( double offsetMD ) override;
bool isEnabled() const override;
RimWellPath* wellPath() const; RimWellPath* wellPath() const;