From 6063ca1b54f5cdd55181c4f05fa80a9579c5304b Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Wed, 11 Nov 2015 13:38:54 +0100 Subject: [PATCH] (#646) Show selected cells in geo mech view --- .../RivFemPartGeometryGenerator.cpp | 55 ++++++++++++++++++- .../RivFemPartGeometryGenerator.h | 2 + .../RivSingleCellPartGenerator.cpp | 35 +++++++++++- .../RivSingleCellPartGenerator.h | 9 ++- .../ProjectDataModel/RimEclipseView.cpp | 32 ++++------- .../ProjectDataModel/RimGeoMechView.cpp | 38 ++++++++++++- 6 files changed, 141 insertions(+), 30 deletions(-) diff --git a/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp b/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp index 1e18c0a359..52d31a408c 100644 --- a/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp +++ b/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp @@ -68,7 +68,6 @@ ref RivFemPartGeometryGenerator::generateSurface() //-------------------------------------------------------------------------------------------------- ref RivFemPartGeometryGenerator::createMeshDrawable() { - if (!(m_quadVertices.notNull() && m_quadVertices->size() != 0)) return NULL; ref geo = new DrawableGeo; @@ -265,3 +264,57 @@ void RivFemPartGeometryGenerator::setElementVisibility(const cvf::UByteArray* ce m_elmVisibility = cellVisibility; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RivFemPartGeometryGenerator::createMeshDrawableFromSingleElement(const RigFemPart* part, size_t elmIdx) +{ + cvf::ref quadVertices; + + { + std::vector vertices; + + const std::vector& 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(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 geo = new DrawableGeo; + geo->setVertexArray(quadVertices.p()); + + ref indices = lineIndicesFromQuadVertexArray(quadVertices.p()); + ref prim = new PrimitiveSetIndexedUInt(PT_LINES); + prim->setIndices(indices.p()); + + geo->addPrimitiveSet(prim.p()); + return geo; +} + diff --git a/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h b/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h index 464628bd43..d9791721ae 100644 --- a/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h +++ b/ApplicationCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h @@ -64,6 +64,8 @@ public: RivFemPartTriangleToElmMapper* triangleToElementMapper() { return m_triangleMapper.p();} + static cvf::ref createMeshDrawableFromSingleElement(const RigFemPart* grid, size_t elementIndex); + private: static cvf::ref lineIndicesFromQuadVertexArray(const cvf::Vec3fArray* vertexArray); diff --git a/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.cpp b/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.cpp index 20aac2f185..289c86d5d0 100644 --- a/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.cpp +++ b/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.cpp @@ -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 RivSingleCellPartGenerator::createPart(const cvf::Color3f co part->setEffect(eff.p()); + part->setPriority(10000); + return part; } @@ -64,11 +84,20 @@ cvf::ref RivSingleCellPartGenerator::createPart(const cvf::Color3f co //-------------------------------------------------------------------------------------------------- cvf::ref 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; } diff --git a/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.h b/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.h index 703860ca64..93a2fa370b 100644 --- a/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.h +++ b/ApplicationCode/ModelVisualization/RivSingleCellPartGenerator.h @@ -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 createPart(const cvf::Color3f color); @@ -44,7 +46,8 @@ private: cvf::ref 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; }; diff --git a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp index 9d4ae8fda6..398cad5792 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseView.cpp @@ -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(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(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 part = partGen.createPart(eclipseSelItem->m_color); - part->setTransform(this->scaleTransform()); - part->setPriority(10000); + cvf::ref part = partGen.createPart(eclipseSelItem->m_color); + part->setTransform(this->scaleTransform()); - highlightModelBasicList->addPart(part.p()); + highlightModelBasicList->addPart(part.p()); + } } } highlightModelBasicList->updateBoundingBoxesRecursive(); - frameScene->addModel(highlightModelBasicList.p()); } } diff --git a/ApplicationCode/ProjectDataModel/RimGeoMechView.cpp b/ApplicationCode/ProjectDataModel/RimGeoMechView.cpp index 2b1482ce44..a08e71d59a 100644 --- a/ApplicationCode/ProjectDataModel/RimGeoMechView.cpp +++ b/ApplicationCode/ProjectDataModel/RimGeoMechView.cpp @@ -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 -#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 highlightModelBasicList = new cvf::ModelBasicList; + highlightModelBasicList->setName(highlightModelName); + + RiuSelectionManager* riuSelManager = RiuSelectionManager::instance(); + std::vector 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(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 part = partGen.createPart(geomSelItem->m_color); + part->setTransform(this->scaleTransform()); + + highlightModelBasicList->addPart(part.p()); + } + } + } + + highlightModelBasicList->updateBoundingBoxesRecursive(); + frameScene->addModel(highlightModelBasicList.p()); + } } }