diff --git a/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp b/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp index 244247bce3..0ac351084e 100644 --- a/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.cpp @@ -90,10 +90,10 @@ void RivFishbonesSubsPartMgr::buildParts(caf::DisplayCoordTransform* displayCoor m_rimFishbonesSubs->firstAncestorOrThisOfTypeAsserted(wellPath); RigWellPath* rigWellPath = wellPath->wellPathGeometry(); - + RivPipeGeometryGenerator geoGenerator; geoGenerator.setRadius(m_rimFishbonesSubs->tubingRadius()); - + for (size_t instanceIndex = 0; instanceIndex < locationOfSubs.size(); instanceIndex++) { double measuredDepth = locationOfSubs[instanceIndex]; @@ -114,7 +114,15 @@ void RivFishbonesSubsPartMgr::buildParts(caf::DisplayCoordTransform* displayCoor cvf::Vec3d lateralDirection; { cvf::Vec3d alongWellPath = (p2 - p1).getNormalized(); + cvf::Vec3d lateralInitialDirection = cvf::Vec3d::Z_AXIS; + + if (RivFishbonesSubsPartMgr::closestMainAxis(alongWellPath) == cvf::Vec3d::Z_AXIS) + { + // Use x-axis if well path is heading close to z-axis + lateralInitialDirection = cvf::Vec3d::X_AXIS; + } + { double intialRotationAngle = m_rimFishbonesSubs->rotationAngle(instanceIndex); double lateralOffsetDegrees = 360.0 / lateralLengths.size(); @@ -231,3 +239,36 @@ void RivFishbonesSubsPartMgr::cylinderWithCenterLineParts(cvf::Collection maxValue) + { + maxComponent = 1; + maxValue = cvf::Math::abs(vec.y()); + } + + if (cvf::Math::abs(vec.z()) > maxValue) + { + maxComponent = 2; + maxValue = cvf::Math::abs(vec.z()); + } + + if (maxComponent == 0) + { + return cvf::Vec3d::X_AXIS; + } + else if (maxComponent == 1) + { + return cvf::Vec3d::Y_AXIS; + } + else if (maxComponent == 2) + { + return cvf::Vec3d::Z_AXIS; + } +} + diff --git a/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.h b/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.h index 8a28a7bc07..e09e1faef6 100644 --- a/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.h +++ b/ApplicationCode/ModelVisualization/RivFishbonesSubsPartMgr.h @@ -61,6 +61,8 @@ private: static void cylinderWithCenterLineParts(cvf::Collection* destinationParts, const std::vector& centerCoords, const cvf::Color3f& color, double radius); + static cvf::Vec3d closestMainAxis(const cvf::Vec3d& vec); + private: caf::PdmPointer m_rimFishbonesSubs; cvf::Collection m_parts;