diff --git a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp index 14bef87f7d..d7d971ab9c 100644 --- a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.cpp @@ -91,8 +91,14 @@ void RivWellFracturePartMgr::updatePartGeometry(caf::DisplayCoordTransform* disp displayCoords.push_back(static_cast(displayCoordsDouble)); } - cvf::ref geo = createGeo(triangleIndices, displayCoords); + if (triangleIndices.size() == 0 || displayCoords.size() == 0) + { + return; + } + cvf::ref geo = createGeo(triangleIndices, displayCoords); + CVF_ASSERT(geo.notNull()); + m_part = new cvf::Part; m_part->setDrawable(geo.p()); @@ -139,22 +145,15 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor } } - // Note : If no legend is found, draw geo using a single color - - RimFractureTemplate * fracTemplate = m_rimFracture->attachedFractureDefinition(); - RimStimPlanFractureTemplate* stimPlanFracTemplate; - - if (dynamic_cast(fracTemplate)) + RimFractureTemplate* fracTemplate = m_rimFracture->attachedFractureDefinition(); + RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast(fracTemplate); + if (!stimPlanFracTemplate) { - stimPlanFracTemplate = dynamic_cast(fracTemplate); + return; } - else return; - - int timeStepIndex = m_rimFracture->stimPlanTimeIndexToPlot; - std::vector > dataToPlot = stimPlanFracTemplate->getDataAtTimeIndex(activeView->stimPlanColors->resultName(), activeView->stimPlanColors->unit(), timeStepIndex); const std::vector& nodeCoords = m_rimFracture->nodeCoords(); - const std::vector& triangleIndices = m_rimFracture->triangleIndices(); + std::vector displayCoords; for (size_t i = 0; i < nodeCoords.size(); i++) @@ -164,7 +163,14 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor displayCoords.push_back(static_cast(displayCoordsDouble)); } + const std::vector& triangleIndices = m_rimFracture->triangleIndices(); + if (triangleIndices.size() == 0 || displayCoords.size() == 0) + { + return; + } + cvf::ref geo = createGeo(triangleIndices, displayCoords); + CVF_ASSERT(geo.notNull()); m_part = new cvf::Part; m_part->setDrawable(geo.p()); @@ -180,6 +186,9 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor cvf::ref textureCoords = new cvf::Vec2fArray; textureCoords->resize(nodeCoords.size()); + int timeStepIndex = m_rimFracture->stimPlanTimeIndexToPlot; + std::vector > dataToPlot = stimPlanFracTemplate->getDataAtTimeIndex(activeView->stimPlanColors->resultName(), activeView->stimPlanColors->unit(), timeStepIndex); + int i = 0; for (std::vector depthData : dataToPlot) { @@ -234,19 +243,24 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor //-------------------------------------------------------------------------------------------------- void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(caf::DisplayCoordTransform* displayCoordTransform) { + m_polygonPart = nullptr; + cvf::ref polygonGeo = createPolygonDrawable(displayCoordTransform); - m_polygonPart = new cvf::Part; - m_polygonPart->setDrawable(polygonGeo.p()); + if (polygonGeo.notNull()) + { + m_polygonPart = new cvf::Part; + m_polygonPart->setDrawable(polygonGeo.p()); - m_polygonPart->updateBoundingBox(); - m_polygonPart->setPriority(RivPartPriority::PartType::TransparentMeshLines); + m_polygonPart->updateBoundingBox(); + m_polygonPart->setPriority(RivPartPriority::PartType::TransparentMeshLines); - caf::MeshEffectGenerator lineEffGen(cvf::Color3::MAGENTA); - lineEffGen.setLineWidth(3.0f); - cvf::ref eff = lineEffGen.generateCachedEffect(); + caf::MeshEffectGenerator lineEffGen(cvf::Color3::MAGENTA); + lineEffGen.setLineWidth(3.0f); + cvf::ref eff = lineEffGen.generateCachedEffect(); - m_polygonPart->setEffect(eff.p()); + m_polygonPart->setEffect(eff.p()); + } } //-------------------------------------------------------------------------------------------------- @@ -254,6 +268,7 @@ void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(caf::DisplayCoor //-------------------------------------------------------------------------------------------------- void RivWellFracturePartMgr::generateStimPlanMeshPart(caf::DisplayCoordTransform* displayCoordTransform) { + m_stimPlanMeshPart = nullptr; if (!m_rimFracture->attachedFractureDefinition()) return; @@ -261,24 +276,20 @@ void RivWellFracturePartMgr::generateStimPlanMeshPart(caf::DisplayCoordTransform if (!stimPlanFracTemplate) return; cvf::ref stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, displayCoordTransform); + if (stimPlanMeshGeo.notNull()) + { + m_stimPlanMeshPart = new cvf::Part; + m_stimPlanMeshPart->setDrawable(stimPlanMeshGeo.p()); + m_stimPlanMeshPart->updateBoundingBox(); + m_stimPlanMeshPart->setPriority(RivPartPriority::PartType::TransparentMeshLines); - // 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()); + caf::MeshEffectGenerator lineEffGen(cvf::Color3::BLACK); + lineEffGen.setLineWidth(1.0f); + cvf::ref eff = lineEffGen.generateCachedEffect(); + m_stimPlanMeshPart->setEffect(eff.p()); + } } //-------------------------------------------------------------------------------------------------- @@ -305,6 +316,11 @@ cvf::ref RivWellFracturePartMgr::createStimPlanMeshDrawable(Ri } } + if (stimPlanMeshVertices.size() == 0) + { + return nullptr; + } + cvf::Mat4f m = m_rimFracture->transformMatrix(); std::vector stimPlanMeshVerticesDisplayCoords = transfromToFractureDisplayCoords(stimPlanMeshVertices, m, displayCoordTransform); @@ -352,27 +368,27 @@ void RivWellFracturePartMgr::getPolygonBB(float &polygonXmin, float &polygonXmax //-------------------------------------------------------------------------------------------------- cvf::ref RivWellFracturePartMgr::createPolygonDrawable(caf::DisplayCoordTransform* displayCoordTransform) { - - std::vector polygon = m_rimFracture->attachedFractureDefinition()->fracturePolygon(m_rimFracture->fractureUnit()); - - cvf::Mat4f m = m_rimFracture->transformMatrix(); - std::vector polygonDisplayCoords = transfromToFractureDisplayCoords(polygon, m, displayCoordTransform); - - std::vector lineIndices; std::vector vertices; - for (size_t i = 0; i < polygonDisplayCoords.size(); ++i) { - vertices.push_back(cvf::Vec3f(polygonDisplayCoords[i])); - if (i < polygonDisplayCoords.size() - 1) + std::vector polygon = m_rimFracture->attachedFractureDefinition()->fracturePolygon(m_rimFracture->fractureUnit()); + + cvf::Mat4f m = m_rimFracture->transformMatrix(); + std::vector polygonDisplayCoords = transfromToFractureDisplayCoords(polygon, m, displayCoordTransform); + + for (size_t i = 0; i < polygonDisplayCoords.size(); ++i) { - lineIndices.push_back(static_cast(i)); - lineIndices.push_back(static_cast(i + 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)); + } } } - if (vertices.size() == 0) return NULL; + if (vertices.size() == 0) return nullptr; cvf::ref vx = new cvf::Vec3fArray; vx->assign(vertices); @@ -401,8 +417,8 @@ std::vector RivWellFracturePartMgr::transfromToFractureDisplayCoords cvf::Vec3d nodeCoordsDouble = static_cast(v); cvf::Vec3d displayCoordsDouble = displayCoordTransform->transformToDisplayCoord(nodeCoordsDouble); polygonInDisplayCoords.push_back(static_cast(displayCoordsDouble)); - } + return polygonInDisplayCoords; } @@ -423,8 +439,6 @@ std::vector RivWellFracturePartMgr::mirrorDataAtSingleDepth(std::vector< return mirroredValuesAtGivenDepth; } - - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -443,9 +457,9 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod updatePartGeometryTexture(displayCoordTransform); RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast(m_rimFracture->attachedFractureDefinition()); - if (stimPlanFracTemplate->showStimPlanMesh() && m_StimPlanMeshPart.notNull()) + if (stimPlanFracTemplate->showStimPlanMesh() && m_stimPlanMeshPart.notNull()) { - model->addPart(m_StimPlanMeshPart.p()); + model->addPart(m_stimPlanMeshPart.p()); } } else @@ -474,6 +488,8 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod void RivWellFracturePartMgr::clearGeometryCache() { m_part = nullptr; + m_polygonPart = nullptr; + m_stimPlanMeshPart = nullptr; } //-------------------------------------------------------------------------------------------------- @@ -481,6 +497,9 @@ void RivWellFracturePartMgr::clearGeometryCache() //-------------------------------------------------------------------------------------------------- cvf::ref RivWellFracturePartMgr::createGeo(const std::vector& triangleIndices, const std::vector& nodeCoords) { + CVF_ASSERT(triangleIndices.size() > 0); + CVF_ASSERT(nodeCoords.size() > 0); + cvf::ref geo = new cvf::DrawableGeo; cvf::ref indices = new cvf::UIntArray(triangleIndices); diff --git a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h index 0c4f5f8981..5ce70cd545 100644 --- a/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h +++ b/ApplicationCode/ModelVisualization/RivWellFracturePartMgr.h @@ -76,9 +76,8 @@ private: private: caf::PdmPointer m_rimFracture; + cvf::ref m_part; cvf::ref m_polygonPart; - - cvf::ref m_StimPlanMeshPart; - + cvf::ref m_stimPlanMeshPart; };