(#646) Show selected cells in geo mech view

This commit is contained in:
Magne Sjaastad 2015-11-11 13:38:54 +01:00
parent a13376a8bf
commit 6063ca1b54
6 changed files with 141 additions and 30 deletions

View File

@ -68,7 +68,6 @@ ref<DrawableGeo> RivFemPartGeometryGenerator::generateSurface()
//--------------------------------------------------------------------------------------------------
ref<DrawableGeo> RivFemPartGeometryGenerator::createMeshDrawable()
{
if (!(m_quadVertices.notNull() && m_quadVertices->size() != 0)) return NULL;
ref<DrawableGeo> geo = new DrawableGeo;
@ -265,3 +264,57 @@ void RivFemPartGeometryGenerator::setElementVisibility(const cvf::UByteArray* ce
m_elmVisibility = cellVisibility;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RivFemPartGeometryGenerator::createMeshDrawableFromSingleElement(const RigFemPart* part, size_t elmIdx)
{
cvf::ref<cvf::Vec3fArray> quadVertices;
{
std::vector<Vec3f> vertices;
const std::vector<cvf::Vec3f>& nodeCoordinates = part->nodes().coordinates;
RigElementType eType = part->elementType(elmIdx);
int faceCount = RigFemTypes::elmentFaceCount(eType);
int elmQuadCount = 0;
const int* elmNodeIndices = part->connectivities(elmIdx);
for (int lfIdx = 0; lfIdx < faceCount; ++lfIdx)
{
int elmNeighbor = part->elementNeighbor(static_cast<int>(elmIdx), lfIdx);
int faceNodeCount = 0;
const int* localElmNodeIndicesForFace = RigFemTypes::localElmNodeIndicesForFace(eType, lfIdx, &faceNodeCount);
if (faceNodeCount == 4)
{
vertices.push_back(nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[0]]]);
vertices.push_back(nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[1]]]);
vertices.push_back(nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[2]]]);
vertices.push_back(nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[3]]]);
}
else
{
// Handle triangles and 6 node and 8 node faces
}
}
quadVertices = new cvf::Vec3fArray;
quadVertices->assign(vertices);
}
if (!(quadVertices.notNull() && quadVertices->size() != 0)) return NULL;
ref<DrawableGeo> geo = new DrawableGeo;
geo->setVertexArray(quadVertices.p());
ref<UIntArray> indices = lineIndicesFromQuadVertexArray(quadVertices.p());
ref<PrimitiveSetIndexedUInt> prim = new PrimitiveSetIndexedUInt(PT_LINES);
prim->setIndices(indices.p());
geo->addPrimitiveSet(prim.p());
return geo;
}

View File

@ -64,6 +64,8 @@ public:
RivFemPartTriangleToElmMapper* triangleToElementMapper() { return m_triangleMapper.p();}
static cvf::ref<cvf::DrawableGeo> createMeshDrawableFromSingleElement(const RigFemPart* grid, size_t elementIndex);
private:
static cvf::ref<cvf::UIntArray>
lineIndicesFromQuadVertexArray(const cvf::Vec3fArray* vertexArray);

View File

@ -20,6 +20,12 @@
#include "RivSingleCellPartGenerator.h"
#include "RigCaseData.h"
#include "RigFemPartCollection.h"
#include "RigGeoMechCaseData.h"
#include "RimGeoMechCase.h"
#include "RivFemPartGeometryGenerator.h"
#include "cafEffectGenerator.h"
#include "cvfPart.h"
@ -33,7 +39,19 @@
RivSingleCellPartGenerator::RivSingleCellPartGenerator(RigCaseData* rigCaseData, size_t gridIndex, size_t cellIndex)
: m_rigCaseData(rigCaseData),
m_gridIndex(gridIndex),
m_cellIndex(cellIndex)
m_cellIndex(cellIndex),
m_geoMechCase(NULL)
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RivSingleCellPartGenerator::RivSingleCellPartGenerator(RimGeoMechCase* rimGeoMechCase, size_t gridIndex, size_t cellIndex)
: m_geoMechCase(rimGeoMechCase),
m_gridIndex(gridIndex),
m_cellIndex(cellIndex),
m_rigCaseData(NULL)
{
}
@ -56,6 +74,8 @@ cvf::ref<cvf::Part> RivSingleCellPartGenerator::createPart(const cvf::Color3f co
part->setEffect(eff.p());
part->setPriority(10000);
return part;
}
@ -64,11 +84,20 @@ cvf::ref<cvf::Part> RivSingleCellPartGenerator::createPart(const cvf::Color3f co
//--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RivSingleCellPartGenerator::createMeshDrawable()
{
if (m_rigCaseData &&
m_cellIndex != cvf::UNDEFINED_SIZE_T)
if (m_rigCaseData && m_cellIndex != cvf::UNDEFINED_SIZE_T)
{
return cvf::StructGridGeometryGenerator::createMeshDrawableFromSingleCell(m_rigCaseData->grid(m_gridIndex), m_cellIndex);
}
else if (m_geoMechCase && m_cellIndex != cvf::UNDEFINED_SIZE_T)
{
CVF_ASSERT(m_geoMechCase->geoMechData());
CVF_ASSERT(m_geoMechCase->geoMechData()->femParts()->partCount() > m_gridIndex);
RigFemPart* femPart = m_geoMechCase->geoMechData()->femParts()->part(m_gridIndex);
CVF_ASSERT(femPart);
return RivFemPartGeometryGenerator::createMeshDrawableFromSingleElement(femPart, m_cellIndex);
}
return NULL;
}

View File

@ -28,6 +28,7 @@ namespace cvf
}
class RigCaseData;
class RimGeoMechCase;
//==================================================================================================
///
@ -37,6 +38,7 @@ class RivSingleCellPartGenerator
{
public:
RivSingleCellPartGenerator(RigCaseData* rigCaseData, size_t gridIndex, size_t cellIndex);
RivSingleCellPartGenerator(RimGeoMechCase* rimGeoMechCase, size_t gridIndex, size_t cellIndex);
cvf::ref<cvf::Part> createPart(const cvf::Color3f color);
@ -44,7 +46,8 @@ private:
cvf::ref<cvf::DrawableGeo> createMeshDrawable();
private:
RigCaseData* m_rigCaseData;
size_t m_gridIndex;
size_t m_cellIndex;
RigCaseData* m_rigCaseData;
RimGeoMechCase* m_geoMechCase;
size_t m_gridIndex;
size_t m_cellIndex;
};

View File

@ -677,15 +677,6 @@ void RimEclipseView::updateCurrentTimeStep()
{
// Actions related to highlight items in scene
//
// Removed highlight model by name
// Create new highlight model with name
// Create and add selected parts
// Modify with scaletransform()
// Add parts to model
// Add model to scene
cvf::String highlightModelName = "HighLightModel";
this->removeModelByName(frameScene, highlightModelName);
@ -698,25 +689,26 @@ void RimEclipseView::updateCurrentTimeStep()
riuSelManager->selectedItems(items);
for (size_t i = 0; i < items.size(); i++)
{
RiuEclipseSelectionItem* eclipseSelItem = dynamic_cast<RiuEclipseSelectionItem*>(items[i]);
if (eclipseSelItem &&
eclipseSelItem->m_view)
if (items[i]->type() == RiuSelectionItem::ECLIPSE_SELECTION_OBJECT)
{
CVF_ASSERT(eclipseSelItem->m_view->eclipseCase());
CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()->reservoirData());
RiuEclipseSelectionItem* eclipseSelItem = static_cast<RiuEclipseSelectionItem*>(items[i]);
if (eclipseSelItem &&
eclipseSelItem->m_view)
{
CVF_ASSERT(eclipseSelItem->m_view->eclipseCase());
CVF_ASSERT(eclipseSelItem->m_view->eclipseCase()->reservoirData());
RivSingleCellPartGenerator partGen(eclipseSelItem->m_view->eclipseCase()->reservoirData(), eclipseSelItem->m_gridIndex, eclipseSelItem->m_cellIndex);
RivSingleCellPartGenerator partGen(eclipseSelItem->m_view->eclipseCase()->reservoirData(), eclipseSelItem->m_gridIndex, eclipseSelItem->m_cellIndex);
cvf::ref<cvf::Part> part = partGen.createPart(eclipseSelItem->m_color);
part->setTransform(this->scaleTransform());
part->setPriority(10000);
cvf::ref<cvf::Part> part = partGen.createPart(eclipseSelItem->m_color);
part->setTransform(this->scaleTransform());
highlightModelBasicList->addPart(part.p());
highlightModelBasicList->addPart(part.p());
}
}
}
highlightModelBasicList->updateBoundingBoxesRecursive();
frameScene->addModel(highlightModelBasicList.p());
}
}

View File

@ -34,18 +34,23 @@
#include "RimGeoMechCellColors.h"
#include "RimGeoMechPropertyFilterCollection.h"
#include "RimLegendConfig.h"
#include "RimViewLinker.h"
#include "RiuMainWindow.h"
#include "RiuSelectionManager.h"
#include "RiuViewer.h"
#include "RivGeoMechPartMgr.h"
#include "RivGeoMechPartMgrCache.h"
#include "RivGeoMechVizLogic.h"
#include "RivSingleCellPartGenerator.h"
#include "cafCadNavigation.h"
#include "cafCeetronPlusNavigation.h"
#include "cafFrameAnimationControl.h"
#include "cafPdmUiTreeOrdering.h"
#include "cafProgressInfo.h"
#include "cvfModelBasicList.h"
#include "cvfOverlayScalarMapperLegend.h"
#include "cvfPart.h"
@ -54,9 +59,6 @@
#include "cvfqtUtils.h"
#include <QMessageBox>
#include "RimViewLinker.h"
#include "cafPdmUiTreeOrdering.h"
CAF_PDM_SOURCE_INIT(RimGeoMechView, "GeoMechView");
@ -282,6 +284,36 @@ void RimGeoMechView::updateCurrentTimeStep()
femBBox,
scaleTransform());
frameScene->addModel(wellPathModel.p());
{
cvf::String highlightModelName = "HighLightModel";
cvf::ref<cvf::ModelBasicList> highlightModelBasicList = new cvf::ModelBasicList;
highlightModelBasicList->setName(highlightModelName);
RiuSelectionManager* riuSelManager = RiuSelectionManager::instance();
std::vector<RiuSelectionItem*> items;
riuSelManager->selectedItems(items);
for (size_t i = 0; i < items.size(); i++)
{
if (items[i]->type() == RiuSelectionItem::GEOMECH_SELECTION_OBJECT)
{
RiuGeoMechSelectionItem* geomSelItem = static_cast<RiuGeoMechSelectionItem*>(items[i]);
if (geomSelItem &&
geomSelItem->m_view &&
geomSelItem->m_view->geoMechCase())
{
RivSingleCellPartGenerator partGen(geomSelItem->m_view->geoMechCase(), geomSelItem->m_gridIndex, geomSelItem->m_cellIndex);
cvf::ref<cvf::Part> part = partGen.createPart(geomSelItem->m_color);
part->setTransform(this->scaleTransform());
highlightModelBasicList->addPart(part.p());
}
}
}
highlightModelBasicList->updateBoundingBoxesRecursive();
frameScene->addModel(highlightModelBasicList.p());
}
}
}