2012-05-18 02:45:23 -05:00
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2011-2012 Statoil ASA, Ceetron AS
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
2013-05-06 03:55:00 -05:00
# include "RimWellCollection.h"
2012-05-18 02:45:23 -05:00
2013-10-01 04:13:23 -05:00
# include "RiaApplication.h"
# include "RiaPreferences.h"
2014-07-24 03:11:43 -05:00
# include "RigSingleWellResultsData.h"
# include "RimReservoirView.h"
# include "RimWell.h"
# include "RivReservoirViewPartMgr.h"
2013-05-06 03:55:00 -05:00
2012-05-18 02:45:23 -05:00
namespace caf
{
template < >
void RimWellCollection : : WellVisibilityEnum : : setUp ( )
{
2013-04-22 02:13:37 -05:00
addItem ( RimWellCollection : : PIPES_FORCE_ALL_OFF , " FORCE_ALL_OFF " , " All Off " ) ;
addItem ( RimWellCollection : : PIPES_INDIVIDUALLY , " ALL_ON " , " Individual " ) ;
addItem ( RimWellCollection : : PIPES_OPEN_IN_VISIBLE_CELLS , " OPEN_IN_VISIBLE_CELLS " , " Visible cells filtered " ) ;
addItem ( RimWellCollection : : PIPES_FORCE_ALL_ON , " FORCE_ALL_ON " , " All On " ) ;
}
}
namespace caf
{
template < >
void RimWellCollection : : WellCellsRangeFilterEnum : : setUp ( )
{
2013-10-23 09:04:12 -05:00
addItem ( RimWellCollection : : RANGE_ADD_NONE , " FORCE_ALL_OFF " , " All Off " ) ;
2013-04-22 02:13:37 -05:00
addItem ( RimWellCollection : : RANGE_ADD_INDIVIDUAL , " ALL_ON " , " Individually " ) ;
2013-10-23 09:04:12 -05:00
addItem ( RimWellCollection : : RANGE_ADD_ALL , " FORCE_ALL_ON " , " All On " ) ;
2012-05-18 02:45:23 -05:00
}
}
namespace caf
{
template < >
void RimWellCollection : : WellFenceEnum : : setUp ( )
{
addItem ( RimWellCollection : : K_DIRECTION , " K_DIRECTION " , " K - Direction " ) ;
addItem ( RimWellCollection : : J_DIRECTION , " J_DIRECTION " , " J - Direction " ) ;
addItem ( RimWellCollection : : I_DIRECTION , " I_DIRECTION " , " I - Direction " ) ;
setDefault ( RimWellCollection : : K_DIRECTION ) ;
}
}
2013-08-26 14:56:40 -05:00
namespace caf
{
template < >
void RimWellCollection : : WellHeadPositionEnum : : setUp ( )
{
addItem ( RimWellCollection : : WELLHEAD_POS_ACTIVE_CELLS_BB , " WELLHEAD_POS_ACTIVE_CELLS_BB " , " Top of active cells BB " ) ;
addItem ( RimWellCollection : : WELLHEAD_POS_TOP_COLUMN , " WELLHEAD_POS_TOP_COLUMN " , " Top of active cells IJ-column " ) ;
setDefault ( RimWellCollection : : WELLHEAD_POS_TOP_COLUMN ) ;
}
}
2012-05-18 02:45:23 -05:00
CAF_PDM_SOURCE_INIT ( RimWellCollection , " Wells " ) ;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimWellCollection : : RimWellCollection ( )
{
CAF_PDM_InitObject ( " Wells " , " :/WellCollection.png " , " " , " " ) ;
2013-08-26 14:56:40 -05:00
CAF_PDM_InitField ( & isActive , " Active " , true , " Active " , " " , " " , " " ) ;
isActive . setUiHidden ( true ) ;
2013-04-25 02:07:29 -05:00
2012-05-18 02:45:23 -05:00
CAF_PDM_InitField ( & showWellHead , " ShowWellHead " , true , " Show well heads " , " " , " " , " " ) ;
2013-04-24 03:38:50 -05:00
CAF_PDM_InitField ( & showWellLabel , " ShowWellLabel " , true , " Show well labels " , " " , " " , " " ) ;
CAF_PDM_InitField ( & wellHeadScaleFactor , " WellHeadScale " , 1.0 , " Well head scale " , " " , " " , " " ) ;
2013-08-26 14:56:40 -05:00
CAF_PDM_InitField ( & wellHeadPosition , " WellHeadPosition " , WellHeadPositionEnum ( WELLHEAD_POS_TOP_COLUMN ) , " Well head position " , " " , " " , " " ) ;
2013-10-01 04:13:23 -05:00
cvf : : Color3f defWellLabelColor = RiaApplication : : instance ( ) - > preferences ( ) - > defaultWellLabelColor ( ) ;
CAF_PDM_InitField ( & wellLabelColor , " WellLabelColor " , defWellLabelColor , " Well label color " , " " , " " , " " ) ;
2012-05-18 02:45:23 -05:00
2013-04-30 07:55:59 -05:00
CAF_PDM_InitField ( & wellPipeVisibility , " GlobalWellPipeVisibility " , WellVisibilityEnum ( PIPES_OPEN_IN_VISIBLE_CELLS ) , " Global well pipe visibility " , " " , " " , " " ) ;
2012-06-26 09:10:41 -05:00
2013-04-24 03:38:50 -05:00
CAF_PDM_InitField ( & pipeRadiusScaleFactor , " WellPipeRadiusScale " , 0.1 , " Pipe radius scale " , " " , " " , " " ) ;
2012-06-26 09:10:41 -05:00
CAF_PDM_InitField ( & pipeCrossSectionVertexCount , " WellPipeVertexCount " , 12 , " Pipe vertex count " , " " , " " , " " ) ;
pipeCrossSectionVertexCount . setUiHidden ( true ) ;
2012-05-18 02:45:23 -05:00
2013-04-22 02:13:37 -05:00
CAF_PDM_InitField ( & wellCellsToRangeFilterMode , " GlobalWellCellVisibility " , WellCellsRangeFilterEnum ( RANGE_ADD_NONE ) , " Add cells to range filter " , " " , " " , " " ) ;
2013-04-24 03:38:50 -05:00
CAF_PDM_InitField ( & showWellCellFences , " ShowWellFences " , false , " Use well fence " , " " , " " , " " ) ;
CAF_PDM_InitField ( & wellCellFenceType , " DefaultWellFenceDirection " , WellFenceEnum ( K_DIRECTION ) , " Well Fence direction " , " " , " " , " " ) ;
2012-05-18 02:45:23 -05:00
CAF_PDM_InitField ( & wellCellTransparencyLevel , " WellCellTransparency " , 0.5 , " Well cell transparency " , " " , " " , " " ) ;
2012-06-26 09:10:41 -05:00
CAF_PDM_InitField ( & isAutoDetectingBranches , " IsAutoDetectingBranches " , true , " Geometry based branch detection " , " " , " Toggle wether the well pipe visualization will try to detect when a part of the well \n is really a branch, and thus is starting from wellhead " , " " ) ;
2012-05-18 02:45:23 -05:00
CAF_PDM_InitFieldNoDefault ( & wells , " Wells " , " Wells " , " " , " " , " " ) ;
m_reservoirView = NULL ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimWellCollection : : ~ RimWellCollection ( )
{
2012-06-26 09:10:41 -05:00
wells . deleteAllChildObjects ( ) ;
2012-05-18 02:45:23 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimWell * RimWellCollection : : findWell ( QString name )
{
for ( size_t i = 0 ; i < this - > wells ( ) . size ( ) ; + + i )
{
if ( this - > wells ( ) [ i ] - > name ( ) = = name )
{
return this - > wells ( ) [ i ] ;
}
}
return NULL ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimWellCollection : : hasVisibleWellCells ( )
{
2013-08-26 14:56:40 -05:00
if ( ! this - > isActive ( ) ) return false ;
2013-04-22 02:13:37 -05:00
if ( this - > wellCellsToRangeFilterMode ( ) = = RANGE_ADD_NONE ) return false ;
2012-05-18 02:45:23 -05:00
if ( this - > wells ( ) . size ( ) = = 0 ) return false ;
bool hasCells = false ;
for ( size_t i = 0 ; ! hasCells & & i < this - > wells ( ) . size ( ) ; + + i )
{
RimWell * well = this - > wells ( ) [ i ] ;
2013-09-06 08:45:21 -05:00
if ( well & & well - > wellResults ( ) & & ( ( well - > showWell ( ) & & well - > showWellCells ( ) ) | | this - > wellCellsToRangeFilterMode ( ) = = RANGE_ADD_ALL ) )
2012-05-18 02:45:23 -05:00
{
for ( size_t tIdx = 0 ; ! hasCells & & tIdx < well - > wellResults ( ) - > m_wellCellsTimeSteps . size ( ) ; + + tIdx )
{
const RigWellResultFrame & wellResultFrame = well - > wellResults ( ) - > m_wellCellsTimeSteps [ tIdx ] ;
for ( size_t wsIdx = 0 ; ! hasCells & & wsIdx < wellResultFrame . m_wellResultBranches . size ( ) ; + + wsIdx )
{
2013-08-26 07:03:01 -05:00
if ( wellResultFrame . m_wellResultBranches [ wsIdx ] . m_branchResultPoints . size ( ) > 0 ) hasCells = true ;
2012-05-18 02:45:23 -05:00
}
}
}
}
if ( ! hasCells ) return false ;
2013-04-22 02:13:37 -05:00
if ( this - > wellCellsToRangeFilterMode ( ) = = RANGE_ADD_INDIVIDUAL | | this - > wellCellsToRangeFilterMode ( ) = = RANGE_ADD_ALL ) return true ;
2012-05-18 02:45:23 -05:00
// Todo: Handle range filter intersection
return true ;
}
//--------------------------------------------------------------------------------------------------
/// Used to know if we need animation of timesteps due to the wells
//--------------------------------------------------------------------------------------------------
bool RimWellCollection : : hasVisibleWellPipes ( )
{
2013-08-26 14:56:40 -05:00
if ( ! this - > isActive ( ) ) return false ;
2013-04-22 02:13:37 -05:00
if ( this - > wellPipeVisibility ( ) = = PIPES_FORCE_ALL_OFF ) return false ;
2012-05-18 02:45:23 -05:00
if ( this - > wells ( ) . size ( ) = = 0 ) return false ;
2013-04-22 02:13:37 -05:00
if ( this - > wellPipeVisibility ( ) = = PIPES_FORCE_ALL_ON ) return true ;
2012-05-18 02:45:23 -05:00
return true ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellCollection : : fieldChangedByUi ( const caf : : PdmFieldHandle * changedField , const QVariant & oldValue , const QVariant & newValue )
{
2013-08-26 14:56:40 -05:00
if ( & showWellLabel = = changedField | | & isActive = = changedField )
2012-05-18 02:45:23 -05:00
{
2013-08-26 14:56:40 -05:00
this - > updateUiIconFromState ( isActive ) ;
2013-04-25 04:09:34 -05:00
2012-05-18 02:45:23 -05:00
if ( m_reservoirView )
{
2013-08-26 14:56:40 -05:00
m_reservoirView - > scheduleGeometryRegen ( RivReservoirViewPartMgr : : VISIBLE_WELL_CELLS ) ;
2013-09-08 15:59:46 -05:00
m_reservoirView - > scheduleCreateDisplayModelAndRedraw ( ) ;
2012-05-18 02:45:23 -05:00
}
}
2013-04-22 02:13:37 -05:00
if ( & wellCellsToRangeFilterMode = = changedField )
2012-05-18 02:45:23 -05:00
{
if ( m_reservoirView )
{
m_reservoirView - > scheduleGeometryRegen ( RivReservoirViewPartMgr : : VISIBLE_WELL_CELLS ) ;
2013-09-08 15:59:46 -05:00
m_reservoirView - > scheduleCreateDisplayModelAndRedraw ( ) ;
2012-05-18 02:45:23 -05:00
}
}
else if ( & showWellCellFences = = changedField )
{
if ( m_reservoirView )
{
m_reservoirView - > scheduleGeometryRegen ( RivReservoirViewPartMgr : : VISIBLE_WELL_CELLS ) ;
2013-09-08 15:59:46 -05:00
m_reservoirView - > scheduleCreateDisplayModelAndRedraw ( ) ;
2012-05-18 02:45:23 -05:00
}
}
else if ( & wellCellTransparencyLevel = = changedField )
{
if ( m_reservoirView )
{
2013-09-08 15:59:46 -05:00
m_reservoirView - > scheduleCreateDisplayModelAndRedraw ( ) ;
2012-05-18 02:45:23 -05:00
}
}
else if ( & wellCellFenceType = = changedField )
{
if ( m_reservoirView )
{
m_reservoirView - > scheduleGeometryRegen ( RivReservoirViewPartMgr : : VISIBLE_WELL_CELLS ) ;
2013-09-08 15:59:46 -05:00
m_reservoirView - > scheduleCreateDisplayModelAndRedraw ( ) ;
2012-05-18 02:45:23 -05:00
}
}
else if ( & wellPipeVisibility = = changedField )
{
if ( m_reservoirView )
{
2013-09-08 15:59:46 -05:00
m_reservoirView - > scheduleCreateDisplayModelAndRedraw ( ) ;
2012-05-18 02:45:23 -05:00
}
}
2012-06-26 09:10:41 -05:00
else if ( & pipeCrossSectionVertexCount = = changedField
| | & pipeRadiusScaleFactor = = changedField
| | & wellHeadScaleFactor = = changedField
| | & showWellHead = = changedField
2013-08-26 14:56:40 -05:00
| | & isAutoDetectingBranches = = changedField
2013-10-01 04:13:23 -05:00
| | & wellHeadPosition = = changedField
| | & wellLabelColor = = changedField )
2012-05-18 02:45:23 -05:00
{
if ( m_reservoirView )
{
m_reservoirView - > schedulePipeGeometryRegen ( ) ;
2013-09-08 15:59:46 -05:00
m_reservoirView - > scheduleCreateDisplayModelAndRedraw ( ) ;
2012-05-18 02:45:23 -05:00
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellCollection : : setReservoirView ( RimReservoirView * ownerReservoirView )
{
m_reservoirView = ownerReservoirView ;
}
2013-04-24 03:38:50 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellCollection : : defineUiOrdering ( QString uiConfigName , caf : : PdmUiOrdering & uiOrdering )
{
2013-10-23 08:51:30 -05:00
caf : : PdmUiGroup * filterGroup = uiOrdering . addNewGroup ( " Well range filter " ) ;
2013-04-24 03:38:50 -05:00
filterGroup - > add ( & wellCellsToRangeFilterMode ) ;
filterGroup - > add ( & showWellCellFences ) ;
filterGroup - > add ( & wellCellFenceType ) ;
caf : : PdmUiGroup * wellHeadGroup = uiOrdering . addNewGroup ( " Well head " ) ;
wellHeadGroup - > add ( & showWellHead ) ;
wellHeadGroup - > add ( & wellHeadScaleFactor ) ;
wellHeadGroup - > add ( & showWellLabel ) ;
2013-09-06 08:45:21 -05:00
wellHeadGroup - > add ( & wellHeadPosition ) ;
2013-10-01 04:13:23 -05:00
wellHeadGroup - > add ( & wellLabelColor ) ;
2013-04-24 03:38:50 -05:00
caf : : PdmUiGroup * wellPipe = uiOrdering . addNewGroup ( " Well pipe " ) ;
wellPipe - > add ( & wellPipeVisibility ) ;
wellPipe - > add ( & pipeRadiusScaleFactor ) ;
2013-04-24 23:33:37 -05:00
caf : : PdmUiGroup * advancedGroup = uiOrdering . addNewGroup ( " Advanced " ) ;
advancedGroup - > add ( & wellCellTransparencyLevel ) ;
advancedGroup - > add ( & isAutoDetectingBranches ) ;
2013-04-24 03:38:50 -05:00
}
2013-04-25 02:07:29 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
caf : : PdmFieldHandle * RimWellCollection : : objectToggleField ( )
{
2013-08-26 14:56:40 -05:00
return & isActive ;
2013-04-25 04:09:34 -05:00
}
2013-04-26 09:46:38 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std : : vector < cvf : : ubyte > & RimWellCollection : : isWellPipesVisible ( size_t frameIndex )
{
calculateIsWellPipesVisible ( frameIndex ) ;
return m_isWellPipesVisible [ frameIndex ] ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellCollection : : scheduleIsWellPipesVisibleRecalculation ( )
{
m_isWellPipesVisible . clear ( ) ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellCollection : : calculateIsWellPipesVisible ( size_t frameIndex )
{
if ( m_isWellPipesVisible . size ( ) > frameIndex & & m_isWellPipesVisible [ frameIndex ] . size ( ) ) return ;
if ( m_isWellPipesVisible . size ( ) < = frameIndex )
m_isWellPipesVisible . resize ( frameIndex + 1 ) ;
if ( m_isWellPipesVisible [ frameIndex ] . size ( ) < = wells ( ) . size ( ) )
m_isWellPipesVisible [ frameIndex ] . resize ( wells ( ) . size ( ) , false ) ;
for ( size_t i = 0 ; i < wells ( ) . size ( ) ; + + i )
{
m_isWellPipesVisible [ frameIndex ] [ i ] = wells [ i ] - > calculateWellPipeVisibility ( frameIndex ) ;
}
}