From fe01fe275122bc214b83a1f466cca50603ae38fe Mon Sep 17 00:00:00 2001 From: astridkbjorke Date: Thu, 16 Mar 2017 12:02:07 +0100 Subject: [PATCH] #1274 - pre-proto - showing stimPlan mesh --- .../RivFaultGeometryGenerator.h | 3 +- .../RivWellFracturePartMgr.cpp | 138 ++++++++++++++++-- .../RivWellFracturePartMgr.h | 14 +- .../RimStimPlanFractureTemplate.cpp | 4 +- .../RimStimPlanFractureTemplate.h | 1 + 5 files changed, 143 insertions(+), 17 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivFaultGeometryGenerator.h b/ApplicationCode/ModelVisualization/RivFaultGeometryGenerator.h index 59e14a4bfd..948ba2b1cb 100644 --- a/ApplicationCode/ModelVisualization/RivFaultGeometryGenerator.h +++ b/ApplicationCode/ModelVisualization/RivFaultGeometryGenerator.h @@ -58,9 +58,10 @@ public: cvf::ref createMeshDrawable(); cvf::ref createOutlineMeshDrawable(double creaseAngle); -private: static cvf::ref lineIndicesFromQuadVertexArray(const cvf::Vec3fArray* vertexArray); +private: + void computeArrays(); private: diff --git a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp index b6ac8cdc15..59badb67e1 100644 --- a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp @@ -41,6 +41,7 @@ #include "cvfPrimitiveSetIndexedUInt.h" #include "cvfScalarMapperContinuousLinear.h" #include "cvfRenderStateDepth.h" +#include "RivFaultGeometryGenerator.h" //-------------------------------------------------------------------------------------------------- @@ -166,6 +167,7 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor m_part->setDrawable(geo.p()); generateFractureOutlinePolygonPart(displayCoordTransform); + generateStimPlanMeshPart(displayCoordTransform); float opacityLevel = activeView->stimPlanColors->opacityLevel(); if (legendConfig) @@ -244,6 +246,80 @@ void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(caf::DisplayCoor m_polygonPart->setEffect(eff.p()); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivWellFracturePartMgr::generateStimPlanMeshPart(caf::DisplayCoordTransform* displayCoordTransform) +{ + + if (!m_rimFracture->attachedFractureDefinition()) return; + + RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast(m_rimFracture->attachedFractureDefinition()); + if (!stimPlanFracTemplate) return; + + cvf::ref stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, displayCoordTransform); + + + // From cvf::ref RivFaultGeometryGenerator::createMeshDrawable() + + + + m_StimPlanMeshPart = new cvf::Part; + m_StimPlanMeshPart->setDrawable(stimPlanMeshGeo.p()); + + m_StimPlanMeshPart->updateBoundingBox(); + m_StimPlanMeshPart->setPriority(RivPartPriority::PartType::TransparentMeshLines); + + caf::MeshEffectGenerator lineEffGen(cvf::Color3::BLACK); + lineEffGen.setLineWidth(1.0f); + cvf::ref eff = lineEffGen.generateCachedEffect(); + + m_StimPlanMeshPart->setEffect(eff.p()); + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RivWellFracturePartMgr::createStimPlanMeshDrawable(RimStimPlanFractureTemplate* stimPlanFracTemplate, caf::DisplayCoordTransform* displayCoordTransform) +{ + std::vector depthCoords = stimPlanFracTemplate->adjustedDepthCoordsAroundWellPathPosition(); + std::vector xCoords = stimPlanFracTemplate->getNegAndPosXcoords(); + + std::vector stimPlanMeshVertices; + for (int i = 0; i < xCoords.size() - 1; i++) + { + for (int j = 0; j < depthCoords.size() - 1; j++) + { + if (stimPlanCellTouchesPolygon(xCoords[i], xCoords[i + 1], depthCoords[j], depthCoords[j + 1])) + { + stimPlanMeshVertices.push_back(cvf::Vec3f(static_cast(xCoords[i]), static_cast(depthCoords[j]), 0.0f)); + stimPlanMeshVertices.push_back(cvf::Vec3f(static_cast(xCoords[i + 1]), static_cast(depthCoords[j]), 0.0f)); + stimPlanMeshVertices.push_back(cvf::Vec3f(static_cast(xCoords[i + 1]), static_cast(depthCoords[j + 1]), 0.0f)); + stimPlanMeshVertices.push_back(cvf::Vec3f(static_cast(xCoords[i]), static_cast(depthCoords[j + 1]), 0.0f)); + } + } + } + + cvf::Mat4f m = m_rimFracture->transformMatrix(); + std::vector stimPlanMeshVerticesDisplayCoords = transfromToFractureDisplayCoords(stimPlanMeshVertices, m, displayCoordTransform); + + cvf::Vec3fArray* stimPlanMeshVertexList; + stimPlanMeshVertexList = new cvf::Vec3fArray; + stimPlanMeshVertexList->assign(stimPlanMeshVerticesDisplayCoords); + + cvf::ref stimPlanMeshGeo = new cvf::DrawableGeo; + stimPlanMeshGeo->setVertexArray(stimPlanMeshVertexList); + cvf::ref indices = RivFaultGeometryGenerator::lineIndicesFromQuadVertexArray(stimPlanMeshVertexList); + cvf::ref prim = new cvf::PrimitiveSetIndexedUInt(cvf::PT_LINES); + prim->setIndices(indices.p()); + + stimPlanMeshGeo->addPrimitiveSet(prim.p()); + + + return stimPlanMeshGeo; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -252,25 +328,17 @@ cvf::ref RivWellFracturePartMgr::createPolygonDrawable(caf::Di std::vector polygon = m_rimFracture->attachedFractureDefinition()->fracturePolygon(m_rimFracture->fractureUnit); - //Transform to model coordinates and then display coords - std::vector polygonInDisplayCoords; cvf::Mat4f m = m_rimFracture->transformMatrix(); - for (cvf::Vec3f v : polygon) - { - v.transformPoint(m); - cvf::Vec3d nodeCoordsDouble = static_cast(v); - cvf::Vec3d displayCoordsDouble = displayCoordTransform->transformToDisplayCoord(nodeCoordsDouble); - polygonInDisplayCoords.push_back(static_cast(displayCoordsDouble)); + std::vector polygonDisplayCoords = transfromToFractureDisplayCoords(polygon, m, displayCoordTransform); - } std::vector lineIndices; std::vector vertices; - for (size_t i = 0; i < polygonInDisplayCoords.size(); ++i) + for (size_t i = 0; i < polygonDisplayCoords.size(); ++i) { - vertices.push_back(cvf::Vec3f(polygonInDisplayCoords[i])); - if (i < polygonInDisplayCoords.size() - 1) + vertices.push_back(cvf::Vec3f(polygonDisplayCoords[i])); + if (i < polygonDisplayCoords.size() - 1) { lineIndices.push_back(static_cast(i)); lineIndices.push_back(static_cast(i + 1)); @@ -294,6 +362,23 @@ cvf::ref RivWellFracturePartMgr::createPolygonDrawable(caf::Di return polygonGeo; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RivWellFracturePartMgr::transfromToFractureDisplayCoords(std::vector coordinatesVector, cvf::Mat4f m, caf::DisplayCoordTransform* displayCoordTransform) +{ + std::vector polygonInDisplayCoords; + for (cvf::Vec3f v : coordinatesVector) + { + v.transformPoint(m); + cvf::Vec3d nodeCoordsDouble = static_cast(v); + cvf::Vec3d displayCoordsDouble = displayCoordTransform->transformToDisplayCoord(nodeCoordsDouble); + polygonInDisplayCoords.push_back(static_cast(displayCoordsDouble)); + + } + return polygonInDisplayCoords; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -329,6 +414,14 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod if (dynamic_cast(m_rimFracture->attachedFractureDefinition())) { updatePartGeometryTexture(displayCoordTransform); + + RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast(m_rimFracture->attachedFractureDefinition()); + if (stimPlanFracTemplate->showStimPlanMesh() && m_StimPlanMeshPart.notNull()) + { + model->addPart(m_StimPlanMeshPart.p()); + } + + } else { @@ -372,3 +465,24 @@ cvf::ref RivWellFracturePartMgr::createGeo(const std::vector polygon = m_rimFracture->attachedFractureDefinition()->fracturePolygon(m_rimFracture->fractureUnit); + + for (cvf::Vec3f v : polygon) + { + if (v.x() > xMin && v.x() < xMax) + { + if (v.y() > yMin && v.y() < yMax) + { + return true; + } + } + } + + return false; +} + diff --git a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h index ad946aad95..08e6a528b4 100644 --- a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h +++ b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h @@ -19,6 +19,7 @@ #pragma once #include "cvfBase.h" +#include "cvfMatrix4.h" #include "cvfObject.h" #include "cvfVector3.h" @@ -38,9 +39,8 @@ namespace caf class DisplayCoordTransform; } - class RimFracture; - +class RimStimPlanFractureTemplate; //-------------------------------------------------------------------------------------------------- /// @@ -59,14 +59,22 @@ private: void updatePartGeometryTexture(caf::DisplayCoordTransform* displayCoordTransform); void generateFractureOutlinePolygonPart(caf::DisplayCoordTransform* displayCoordTransform); + void generateStimPlanMeshPart(caf::DisplayCoordTransform* displayCoordTransform); cvf::ref createPolygonDrawable(caf::DisplayCoordTransform* displayCoordTransform); + cvf::ref createStimPlanMeshDrawable(RimStimPlanFractureTemplate* stimPlanFracTemplate, caf::DisplayCoordTransform* displayCoordTransform); + std::vector transfromToFractureDisplayCoords(std::vector polygon, cvf::Mat4f m, caf::DisplayCoordTransform* displayCoordTransform); + bool stimPlanCellTouchesPolygon(double xMin, double xMax, double yMin, double yMax); + std::vector mirrorDataAtSingleDepth(std::vector depthData); static cvf::ref createGeo(const std::vector& triangleIndices, const std::vector& nodeCoords); - + + private: caf::PdmPointer m_rimFracture; cvf::ref m_part; cvf::ref m_polygonPart; + cvf::ref m_StimPlanMeshPart; + }; diff --git a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp index ba84a26dde..93d0c44e76 100644 --- a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp +++ b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.cpp @@ -59,6 +59,7 @@ RimStimPlanFractureTemplate::RimStimPlanFractureTemplate(void) CAF_PDM_InitField(¶meterForPolygon, "parameterForPolyton", QString(""), "Parameter", "", "", ""); CAF_PDM_InitField(×tepForPolygon, "timestepForPolygon", 0, "TimeStep", "", "", ""); + CAF_PDM_InitField(&showStimPlanMesh, "showStimPlanMesh", true, "Show StimPlan Mesh", "", "", "") } @@ -83,7 +84,7 @@ void RimStimPlanFractureTemplate::fieldChangedByUi(const caf::PdmFieldHandle* ch setDefaultsBasedOnXMLfile(); } - if (&wellPathDepthAtFracture == changedField || ¶meterForPolygon == changedField || ×tepForPolygon == changedField) + if (&wellPathDepthAtFracture == changedField || ¶meterForPolygon == changedField || ×tepForPolygon == changedField || &showStimPlanMesh == changedField) { RimProject* proj; this->firstAncestorOrThisOfType(proj); @@ -838,6 +839,7 @@ void RimStimPlanFractureTemplate::defineUiOrdering(QString uiConfigName, caf::Pd RimFractureTemplate::defineUiOrdering(uiConfigName, uiOrdering); uiOrdering.add(&name); + uiOrdering.add(&showStimPlanMesh); caf::PdmUiGroup* fileGroup = uiOrdering.addNewGroup("File"); fileGroup->add(&m_stimPlanFileName); diff --git a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h index 57bfb6d18e..54448ea0b3 100644 --- a/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h +++ b/ApplicationCode/ProjectDataModel/RimStimPlanFractureTemplate.h @@ -52,6 +52,7 @@ public: caf::PdmField parameterForPolygon; caf::PdmField timestepForPolygon; + caf::PdmField showStimPlanMesh; virtual void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override;