#5779 Create Well Path : Add auto generated target at sea level

This commit is contained in:
Magne Sjaastad 2020-04-07 15:07:52 +02:00 committed by Gaute Lindkvist
parent 5a561054bf
commit 5a7129ffdf
4 changed files with 66 additions and 58 deletions

View File

@ -45,18 +45,6 @@
#include "cafPdmUiTreeOrdering.h"
#include "cvfGeometryTools.h"
namespace caf
{
template <>
void caf::AppEnum<RimWellPathGeometryDef::WellStartType>::setUp()
{
addItem( RimWellPathGeometryDef::START_AT_FIRST_TARGET, "START_AT_FIRST_TARGET", "Start at First Target" );
addItem( RimWellPathGeometryDef::START_AT_SURFACE, "START_AT_SURFACE", "Start at Surface" );
setDefault( RimWellPathGeometryDef::START_AT_SURFACE );
}
} // namespace caf
CAF_PDM_SOURCE_INIT( RimWellPathGeometryDef, "WellPathGeometryDef" );
//--------------------------------------------------------------------------------------------------
@ -79,10 +67,19 @@ RimWellPathGeometryDef::RimWellPathGeometryDef()
m_wellTargets.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP );
m_wellTargets.uiCapability()->setCustomContextMenuEnabled( true );
CAF_PDM_InitField( &m_useAutoGeneratedTargetAtSeaLevel,
"UseAutoGeneratedTargetAtSeaLevel",
true,
"Generate Target at Sea Level",
"",
"",
"" );
CAF_PDM_InitField( &m_pickPointsEnabled, "m_pickPointsEnabled", false, "", "", "", "" );
caf::PdmUiPushButtonEditor::configureEditorForField( &m_pickPointsEnabled );
CAF_PDM_InitFieldNoDefault( &m_wellStartType, "WellStartType", "Start Type", "", "", "" );
m_autoTargetAtSeaLevel.reset( new RimWellPathTarget );
m_autoTargetAtSeaLevel->setEnabled( false );
}
//--------------------------------------------------------------------------------------------------
@ -151,6 +148,8 @@ cvf::ref<RigWellPath> RimWellPathGeometryDef::createWellPathGeometry()
{
cvf::ref<RigWellPath> wellPathGeometry = new RigWellPath;
updateTargetAtSeaLevel();
RiaLineArcWellPathCalculator wellPathCalculator = lineArcWellPathCalculator();
if ( wellPathCalculator.lineArcEndpoints().size() < 2 ) return wellPathGeometry;
@ -167,32 +166,6 @@ cvf::ref<RigWellPath> RimWellPathGeometryDef::createWellPathGeometry()
wellPathGeometry->setDatumElevation( m_airGap );
}
if ( m_wellStartType == START_AT_SURFACE && !wellPathGeometry->m_wellPathPoints.empty() )
{
cvf::Vec3d mslPoint = wellPathGeometry->m_wellPathPoints.front();
mslPoint.z() = 0.0;
double depthDiff = mslPoint.z() - wellPathGeometry->m_wellPathPoints.front().z();
if ( std::abs( depthDiff ) > 1.0e-8 )
{
CAF_ASSERT( wellPathGeometry->m_wellPathPoints.size() == wellPathGeometry->m_measuredDepths.size() );
std::vector<cvf::Vec3d> newPoints;
newPoints.reserve( wellPathGeometry->m_wellPathPoints.size() + 1 );
std::vector<double> newMds;
newMds.reserve( wellPathGeometry->m_measuredDepths.size() + 1 );
newPoints.push_back( mslPoint );
newMds.push_back( 0.0 );
for ( size_t i = 0; i < wellPathGeometry->m_wellPathPoints.size(); ++i )
{
newPoints.push_back( wellPathGeometry->m_wellPathPoints[i] );
newMds.push_back( wellPathGeometry->m_measuredDepths[i] + depthDiff );
}
wellPathGeometry->m_wellPathPoints.swap( newPoints );
wellPathGeometry->m_measuredDepths.swap( newMds );
}
}
return wellPathGeometry;
}
//--------------------------------------------------------------------------------------------------
@ -336,14 +309,6 @@ QList<caf::PdmOptionItemInfo>
{
QList<caf::PdmOptionItemInfo> options;
if ( fieldNeedingOptions == &m_wellStartType )
{
options.push_back( caf::PdmOptionItemInfo( "Start at Surface", RimWellPathGeometryDef::START_AT_SURFACE ) );
options.push_back(
caf::PdmOptionItemInfo( "Start at First Target", RimWellPathGeometryDef::START_AT_FIRST_TARGET ) );
}
return options;
}
@ -371,13 +336,14 @@ void RimWellPathGeometryDef::fieldChangedByUi( const caf::PdmFieldHandle* change
//--------------------------------------------------------------------------------------------------
void RimWellPathGeometryDef::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering )
{
uiOrdering.add( &m_wellStartType );
uiOrdering.add( &m_referencePointUtmXyd );
uiOrdering.add( &m_airGap );
if ( m_wellStartType == START_AT_FIRST_TARGET )
if ( !m_useAutoGeneratedTargetAtSeaLevel() )
{
uiOrdering.add( &m_mdAtFirstTarget );
}
uiOrdering.add( &m_useAutoGeneratedTargetAtSeaLevel );
uiOrdering.add( &m_wellTargets );
uiOrdering.add( &m_pickPointsEnabled );
uiOrdering.skipRemainingFields( true );
@ -397,6 +363,12 @@ void RimWellPathGeometryDef::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTre
std::vector<RimWellPathTarget*> RimWellPathGeometryDef::activeWellTargets() const
{
std::vector<RimWellPathTarget*> active;
if ( m_useAutoGeneratedTargetAtSeaLevel() && !m_wellTargets.empty() )
{
active.push_back( m_autoTargetAtSeaLevel.get() );
}
for ( const auto& wt : m_wellTargets )
{
if ( wt->isEnabled() )
@ -455,6 +427,35 @@ RiaLineArcWellPathCalculator RimWellPathGeometryDef::lineArcWellPathCalculator()
return wellPathCalculator;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellPathGeometryDef::updateTargetAtSeaLevel()
{
if ( m_useAutoGeneratedTargetAtSeaLevel && !m_wellTargets.empty() )
{
cvf::Vec3d newPos = cvf::Vec3d::ZERO;
auto firstTarget = m_wellTargets[0];
cvf::Vec3d targetTangent = firstTarget->tangent();
double radius = firstTarget->radius1();
cvf::Vec3d tangentInHorizontalPlane = targetTangent;
tangentInHorizontalPlane[2] = 0.0;
tangentInHorizontalPlane.normalize();
RiaOffshoreSphericalCoords sphTangent( targetTangent );
double inc = sphTangent.inc();
double horizontalLengthFromTarget = radius - radius * cvf::Math::cos( inc );
newPos = firstTarget->targetPointXYZ() - horizontalLengthFromTarget * tangentInHorizontalPlane;
newPos.z() = -referencePointXyz().z();
m_autoTargetAtSeaLevel->setAsPointXYZAndTangentTarget( {newPos[0], newPos[1], newPos[2]}, 0, 0 );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -552,6 +553,6 @@ void RimWellPathGeometryDef::initAfterRead()
{
if ( RiaApplication::instance()->project()->isProjectFileVersionEqualOrOlderThan( "2019.12.1" ) )
{
m_wellStartType = START_AT_FIRST_TARGET;
m_autoTargetAtSeaLevel = false;
}
}

View File

@ -19,12 +19,14 @@
#include "RiaLineArcWellPathCalculator.h"
#include "RiaWellPlanCalculator.h"
#include "cafAppEnum.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmField.h"
#include "cafPdmFieldCvfVec3d.h"
#include "cafPdmObject.h"
#include "cafPdmPtrField.h"
#include "cvfObject.h"
class RimWellPath;
@ -41,12 +43,6 @@ public:
RimWellPathGeometryDef();
~RimWellPathGeometryDef() override;
enum WellStartType
{
START_AT_FIRST_TARGET,
START_AT_SURFACE,
};
cvf::Vec3d referencePointXyz() const;
void setReferencePointXyz( const cvf::Vec3d& refPointXyz );
@ -92,6 +88,8 @@ private:
RiaLineArcWellPathCalculator lineArcWellPathCalculator() const;
void updateTargetAtSeaLevel();
private:
caf::PdmField<cvf::Vec3d> m_referencePointUtmXyd;
@ -99,10 +97,10 @@ private:
caf::PdmField<double> m_mdAtFirstTarget;
caf::PdmChildArrayField<RimWellPathTarget*> m_wellTargets;
caf::PdmField<bool> m_useAutoGeneratedTargetAtSeaLevel;
caf::PdmField<bool> m_pickPointsEnabled;
caf::PdmField<caf::AppEnum<WellStartType>> m_wellStartType;
std::shared_ptr<RicCreateWellTargetsPickEventHandler> m_pickTargetsEventHandler;
std::unique_ptr<RimWellPathTarget> m_autoTargetAtSeaLevel;
};

View File

@ -70,6 +70,14 @@ RimWellPathTarget::~RimWellPathTarget()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellPathTarget::setEnabled( bool enable )
{
m_isEnabled = enable;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -33,6 +33,7 @@ public:
RimWellPathTarget();
~RimWellPathTarget() override;
void setEnabled( bool enable );
bool isEnabled() const;
void setAsPointTargetXYD( const cvf::Vec3d& point );