diff --git a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp index 6e83b1856d..972b1afb48 100644 --- a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.cpp @@ -20,6 +20,7 @@ #include "RivWellPathPartMgr.h" +#include "RiaColorTables.h" #include "RiaGuiApplication.h" #include "RigEclipseCaseData.h" @@ -36,6 +37,8 @@ #include "RimFishbonesMultipleSubs.h" #include "RimPerforationCollection.h" #include "RimPerforationInterval.h" +#include "RimWellMeasurement.h" +#include "RimWellMeasurementCollection.h" #include "RimWellPath.h" #include "RimWellPathAttribute.h" #include "RimWellPathAttributeCollection.h" @@ -66,7 +69,7 @@ #include "cvfFont.h" #include "cvfModelBasicList.h" #include "cvfPart.h" -#include "cvfScalarMapperDiscreteLinear.h" +#include "cvfScalarMapperContinuousLinear.h" #include "cvfTransform.h" #include "cvfqtUtils.h" @@ -249,6 +252,81 @@ void RivWellPathPartMgr::appendWellPathAttributesToModel( cvf::ModelBasicList* } } +cvf::Color3f RivWellPathPartMgr::mapWellMeasurementToColor( const QString& measurementKind, double value ) +{ + if ( measurementKind == "TH" ) return cvf::Color3f::RED; + if ( measurementKind == "LE" ) return cvf::Color3f::BLUE; + if ( measurementKind == "BA" ) return cvf::Color3f::GREEN; + if ( measurementKind == "CORE" ) return cvf::Color3f::BLACK; + + QStringList rangeBasedMeasurements; + rangeBasedMeasurements << "XLOT" + << "LOT" + << "FIT" + << "MCF" + << "MNF" + << "PPG"; + if ( rangeBasedMeasurements.contains( measurementKind ) ) + { + cvf::ScalarMapperContinuousLinear mapper; + mapper.setColors( RiaColorTables::normalPaletteColors().color3ubArray() ); + mapper.setRange( 1.0, 3.0 ); + cvf::Color3ub color = mapper.mapToColor( value ); + return cvf::Color3f( color ); + } + + return cvf::Color3f::RED; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivWellPathPartMgr::appendWellMeasurementsToModel( cvf::ModelBasicList* model, + const caf::DisplayCoordTransform* displayCoordTransform, + double characteristicCellSize ) +{ + if ( !m_rimWellPath ) return; + + if ( !m_rimWellPath->measurementCollection()->isChecked() ) return; + + RivPipeGeometryGenerator geoGenerator; + std::vector wellMeasurements = m_rimWellPath->measurementCollection()->measurements(); + + for ( RimWellMeasurement* wellMeasurement : wellMeasurements ) + { + double wellPathRadius = this->wellPathRadius( characteristicCellSize, this->wellPathCollection() ); + double startMD = wellMeasurement->MD() - wellPathRadius * 0.5; + double endMD = wellMeasurement->MD() + wellPathRadius * 0.5; + + std::vector displayCoords; + displayCoords.push_back( displayCoordTransform->transformToDisplayCoord( + m_rimWellPath->wellPathGeometry()->interpolatedPointAlongWellPath( startMD ) ) ); + displayCoords.push_back( displayCoordTransform->transformToDisplayCoord( + m_rimWellPath->wellPathGeometry()->interpolatedPointAlongWellPath( startMD ) ) ); + displayCoords.push_back( displayCoordTransform->transformToDisplayCoord( + m_rimWellPath->wellPathGeometry()->interpolatedPointAlongWellPath( endMD ) ) ); + displayCoords.push_back( displayCoordTransform->transformToDisplayCoord( + m_rimWellPath->wellPathGeometry()->interpolatedPointAlongWellPath( endMD ) ) ); + + std::vector radii; + radii.push_back( wellPathRadius ); + radii.push_back( wellPathRadius * 2.5 ); + radii.push_back( wellPathRadius * 2.5 ); + radii.push_back( wellPathRadius ); + + cvf::ref objectSourceInfo = new RivObjectSourceInfo( wellMeasurement ); + + cvf::Collection parts; + cvf::Color3f color = mapWellMeasurementToColor( wellMeasurement->kind(), wellMeasurement->value() ); + geoGenerator.tubeWithCenterLinePartsAndVariableWidth( &parts, displayCoords, radii, color ); + for ( auto part : parts ) + { + part->setSourceInfo( objectSourceInfo.p() ); + model->addPart( part.p() ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -711,6 +789,7 @@ void RivWellPathPartMgr::appendStaticGeometryPartsToModel( cvf::ModelBasicList* appendFishboneSubsPartsToModel( model, displayCoordTransform, characteristicCellSize ); appendImportedFishbonesToModel( model, displayCoordTransform, characteristicCellSize ); appendWellPathAttributesToModel( model, displayCoordTransform, characteristicCellSize ); + appendWellMeasurementsToModel( model, displayCoordTransform, characteristicCellSize ); RimGridView* gridView = dynamic_cast( m_rimView.p() ); if ( !gridView ) return; diff --git a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.h b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.h index fd2bc04cbc..d77f207b20 100644 --- a/ApplicationCode/ModelVisualization/RivWellPathPartMgr.h +++ b/ApplicationCode/ModelVisualization/RivWellPathPartMgr.h @@ -93,6 +93,10 @@ private: const caf::DisplayCoordTransform* displayCoordTransform, double characteristicCellSize ); + void appendWellMeasurementsToModel( cvf::ModelBasicList* model, + const caf::DisplayCoordTransform* displayCoordTransform, + double characteristicCellSize ); + void appendImportedFishbonesToModel( cvf::ModelBasicList* model, const caf::DisplayCoordTransform* displayCoordTransform, double characteristicCellSize ); @@ -125,6 +129,8 @@ private: bool isWellPathWithinBoundingBox( const cvf::BoundingBox& wellPathClipBoundingBox ) const; + static cvf::Color3f mapWellMeasurementToColor( const QString& measurementKind, double value ); + private: caf::PdmPointer m_rimWellPath; caf::PdmPointer m_rimView;