#1570 Improve robustness and readability

Add tests for empty geometry
Clear all parts in clearGeometryCache
This commit is contained in:
Magne Sjaastad 2017-06-07 14:46:54 +02:00
parent df57298d57
commit 10b7aa4e32
2 changed files with 75 additions and 57 deletions

View File

@ -91,7 +91,13 @@ void RivWellFracturePartMgr::updatePartGeometry(caf::DisplayCoordTransform* disp
displayCoords.push_back(static_cast<cvf::Vec3f>(displayCoordsDouble)); displayCoords.push_back(static_cast<cvf::Vec3f>(displayCoordsDouble));
} }
if (triangleIndices.size() == 0 || displayCoords.size() == 0)
{
return;
}
cvf::ref<cvf::DrawableGeo> geo = createGeo(triangleIndices, displayCoords); cvf::ref<cvf::DrawableGeo> geo = createGeo(triangleIndices, displayCoords);
CVF_ASSERT(geo.notNull());
m_part = new cvf::Part; m_part = new cvf::Part;
m_part->setDrawable(geo.p()); 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 = dynamic_cast<RimStimPlanFractureTemplate*>(fracTemplate);
RimFractureTemplate * fracTemplate = m_rimFracture->attachedFractureDefinition(); if (!stimPlanFracTemplate)
RimStimPlanFractureTemplate* stimPlanFracTemplate;
if (dynamic_cast<RimStimPlanFractureTemplate*>(fracTemplate))
{ {
stimPlanFracTemplate = dynamic_cast<RimStimPlanFractureTemplate*>(fracTemplate); return;
} }
else return;
int timeStepIndex = m_rimFracture->stimPlanTimeIndexToPlot;
std::vector<std::vector<double> > dataToPlot = stimPlanFracTemplate->getDataAtTimeIndex(activeView->stimPlanColors->resultName(), activeView->stimPlanColors->unit(), timeStepIndex);
const std::vector<cvf::Vec3f>& nodeCoords = m_rimFracture->nodeCoords(); const std::vector<cvf::Vec3f>& nodeCoords = m_rimFracture->nodeCoords();
const std::vector<cvf::uint>& triangleIndices = m_rimFracture->triangleIndices();
std::vector<cvf::Vec3f> displayCoords; std::vector<cvf::Vec3f> displayCoords;
for (size_t i = 0; i < nodeCoords.size(); i++) for (size_t i = 0; i < nodeCoords.size(); i++)
@ -164,7 +163,14 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor
displayCoords.push_back(static_cast<cvf::Vec3f>(displayCoordsDouble)); displayCoords.push_back(static_cast<cvf::Vec3f>(displayCoordsDouble));
} }
const std::vector<cvf::uint>& triangleIndices = m_rimFracture->triangleIndices();
if (triangleIndices.size() == 0 || displayCoords.size() == 0)
{
return;
}
cvf::ref<cvf::DrawableGeo> geo = createGeo(triangleIndices, displayCoords); cvf::ref<cvf::DrawableGeo> geo = createGeo(triangleIndices, displayCoords);
CVF_ASSERT(geo.notNull());
m_part = new cvf::Part; m_part = new cvf::Part;
m_part->setDrawable(geo.p()); m_part->setDrawable(geo.p());
@ -180,6 +186,9 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor
cvf::ref<cvf::Vec2fArray> textureCoords = new cvf::Vec2fArray; cvf::ref<cvf::Vec2fArray> textureCoords = new cvf::Vec2fArray;
textureCoords->resize(nodeCoords.size()); textureCoords->resize(nodeCoords.size());
int timeStepIndex = m_rimFracture->stimPlanTimeIndexToPlot;
std::vector<std::vector<double> > dataToPlot = stimPlanFracTemplate->getDataAtTimeIndex(activeView->stimPlanColors->resultName(), activeView->stimPlanColors->unit(), timeStepIndex);
int i = 0; int i = 0;
for (std::vector<double> depthData : dataToPlot) for (std::vector<double> depthData : dataToPlot)
{ {
@ -234,8 +243,12 @@ void RivWellFracturePartMgr::updatePartGeometryTexture(caf::DisplayCoordTransfor
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(caf::DisplayCoordTransform* displayCoordTransform) void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(caf::DisplayCoordTransform* displayCoordTransform)
{ {
m_polygonPart = nullptr;
cvf::ref<cvf::DrawableGeo> polygonGeo = createPolygonDrawable(displayCoordTransform); cvf::ref<cvf::DrawableGeo> polygonGeo = createPolygonDrawable(displayCoordTransform);
if (polygonGeo.notNull())
{
m_polygonPart = new cvf::Part; m_polygonPart = new cvf::Part;
m_polygonPart->setDrawable(polygonGeo.p()); m_polygonPart->setDrawable(polygonGeo.p());
@ -247,6 +260,7 @@ void RivWellFracturePartMgr::generateFractureOutlinePolygonPart(caf::DisplayCoor
cvf::ref<cvf::Effect> eff = lineEffGen.generateCachedEffect(); cvf::ref<cvf::Effect> 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) void RivWellFracturePartMgr::generateStimPlanMeshPart(caf::DisplayCoordTransform* displayCoordTransform)
{ {
m_stimPlanMeshPart = nullptr;
if (!m_rimFracture->attachedFractureDefinition()) return; if (!m_rimFracture->attachedFractureDefinition()) return;
@ -261,24 +276,20 @@ void RivWellFracturePartMgr::generateStimPlanMeshPart(caf::DisplayCoordTransform
if (!stimPlanFracTemplate) return; if (!stimPlanFracTemplate) return;
cvf::ref<cvf::DrawableGeo> stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, displayCoordTransform); cvf::ref<cvf::DrawableGeo> stimPlanMeshGeo = createStimPlanMeshDrawable(stimPlanFracTemplate, displayCoordTransform);
if (stimPlanMeshGeo.notNull())
{
m_stimPlanMeshPart = new cvf::Part;
m_stimPlanMeshPart->setDrawable(stimPlanMeshGeo.p());
m_stimPlanMeshPart->updateBoundingBox();
// From cvf::ref<cvf::DrawableGeo> RivFaultGeometryGenerator::createMeshDrawable() m_stimPlanMeshPart->setPriority(RivPartPriority::PartType::TransparentMeshLines);
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); caf::MeshEffectGenerator lineEffGen(cvf::Color3::BLACK);
lineEffGen.setLineWidth(1.0f); lineEffGen.setLineWidth(1.0f);
cvf::ref<cvf::Effect> eff = lineEffGen.generateCachedEffect(); cvf::ref<cvf::Effect> eff = lineEffGen.generateCachedEffect();
m_StimPlanMeshPart->setEffect(eff.p()); m_stimPlanMeshPart->setEffect(eff.p());
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -305,6 +316,11 @@ cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createStimPlanMeshDrawable(Ri
} }
} }
if (stimPlanMeshVertices.size() == 0)
{
return nullptr;
}
cvf::Mat4f m = m_rimFracture->transformMatrix(); cvf::Mat4f m = m_rimFracture->transformMatrix();
std::vector<cvf::Vec3f> stimPlanMeshVerticesDisplayCoords = transfromToFractureDisplayCoords(stimPlanMeshVertices, m, displayCoordTransform); std::vector<cvf::Vec3f> stimPlanMeshVerticesDisplayCoords = transfromToFractureDisplayCoords(stimPlanMeshVertices, m, displayCoordTransform);
@ -352,16 +368,15 @@ void RivWellFracturePartMgr::getPolygonBB(float &polygonXmin, float &polygonXmax
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createPolygonDrawable(caf::DisplayCoordTransform* displayCoordTransform) cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createPolygonDrawable(caf::DisplayCoordTransform* displayCoordTransform)
{ {
std::vector<cvf::uint> lineIndices;
std::vector<cvf::Vec3f> vertices;
{
std::vector<cvf::Vec3f> polygon = m_rimFracture->attachedFractureDefinition()->fracturePolygon(m_rimFracture->fractureUnit()); std::vector<cvf::Vec3f> polygon = m_rimFracture->attachedFractureDefinition()->fracturePolygon(m_rimFracture->fractureUnit());
cvf::Mat4f m = m_rimFracture->transformMatrix(); cvf::Mat4f m = m_rimFracture->transformMatrix();
std::vector<cvf::Vec3f> polygonDisplayCoords = transfromToFractureDisplayCoords(polygon, m, displayCoordTransform); std::vector<cvf::Vec3f> polygonDisplayCoords = transfromToFractureDisplayCoords(polygon, m, displayCoordTransform);
std::vector<cvf::uint> lineIndices;
std::vector<cvf::Vec3f> vertices;
for (size_t i = 0; i < polygonDisplayCoords.size(); ++i) for (size_t i = 0; i < polygonDisplayCoords.size(); ++i)
{ {
vertices.push_back(cvf::Vec3f(polygonDisplayCoords[i])); vertices.push_back(cvf::Vec3f(polygonDisplayCoords[i]));
@ -371,8 +386,9 @@ cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createPolygonDrawable(caf::Di
lineIndices.push_back(static_cast<cvf::uint>(i + 1)); lineIndices.push_back(static_cast<cvf::uint>(i + 1));
} }
} }
}
if (vertices.size() == 0) return NULL; if (vertices.size() == 0) return nullptr;
cvf::ref<cvf::Vec3fArray> vx = new cvf::Vec3fArray; cvf::ref<cvf::Vec3fArray> vx = new cvf::Vec3fArray;
vx->assign(vertices); vx->assign(vertices);
@ -401,8 +417,8 @@ std::vector<cvf::Vec3f> RivWellFracturePartMgr::transfromToFractureDisplayCoords
cvf::Vec3d nodeCoordsDouble = static_cast<cvf::Vec3d>(v); cvf::Vec3d nodeCoordsDouble = static_cast<cvf::Vec3d>(v);
cvf::Vec3d displayCoordsDouble = displayCoordTransform->transformToDisplayCoord(nodeCoordsDouble); cvf::Vec3d displayCoordsDouble = displayCoordTransform->transformToDisplayCoord(nodeCoordsDouble);
polygonInDisplayCoords.push_back(static_cast<cvf::Vec3f>(displayCoordsDouble)); polygonInDisplayCoords.push_back(static_cast<cvf::Vec3f>(displayCoordsDouble));
} }
return polygonInDisplayCoords; return polygonInDisplayCoords;
} }
@ -423,8 +439,6 @@ std::vector<double> RivWellFracturePartMgr::mirrorDataAtSingleDepth(std::vector<
return mirroredValuesAtGivenDepth; return mirroredValuesAtGivenDepth;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -443,9 +457,9 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod
updatePartGeometryTexture(displayCoordTransform); updatePartGeometryTexture(displayCoordTransform);
RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast<RimStimPlanFractureTemplate*>(m_rimFracture->attachedFractureDefinition()); RimStimPlanFractureTemplate* stimPlanFracTemplate = dynamic_cast<RimStimPlanFractureTemplate*>(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 else
@ -474,6 +488,8 @@ void RivWellFracturePartMgr::appendGeometryPartsToModel(cvf::ModelBasicList* mod
void RivWellFracturePartMgr::clearGeometryCache() void RivWellFracturePartMgr::clearGeometryCache()
{ {
m_part = nullptr; m_part = nullptr;
m_polygonPart = nullptr;
m_stimPlanMeshPart = nullptr;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -481,6 +497,9 @@ void RivWellFracturePartMgr::clearGeometryCache()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createGeo(const std::vector<cvf::uint>& triangleIndices, const std::vector<cvf::Vec3f>& nodeCoords) cvf::ref<cvf::DrawableGeo> RivWellFracturePartMgr::createGeo(const std::vector<cvf::uint>& triangleIndices, const std::vector<cvf::Vec3f>& nodeCoords)
{ {
CVF_ASSERT(triangleIndices.size() > 0);
CVF_ASSERT(nodeCoords.size() > 0);
cvf::ref<cvf::DrawableGeo> geo = new cvf::DrawableGeo; cvf::ref<cvf::DrawableGeo> geo = new cvf::DrawableGeo;
cvf::ref<cvf::UIntArray> indices = new cvf::UIntArray(triangleIndices); cvf::ref<cvf::UIntArray> indices = new cvf::UIntArray(triangleIndices);

View File

@ -76,9 +76,8 @@ private:
private: private:
caf::PdmPointer<RimFracture> m_rimFracture; caf::PdmPointer<RimFracture> m_rimFracture;
cvf::ref<cvf::Part> m_part; cvf::ref<cvf::Part> m_part;
cvf::ref<cvf::Part> m_polygonPart; cvf::ref<cvf::Part> m_polygonPart;
cvf::ref<cvf::Part> m_stimPlanMeshPart;
cvf::ref<cvf::Part> m_StimPlanMeshPart;
}; };