From d259f8f33a24012d655899d18c28e5875439c606 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Thu, 20 Dec 2018 10:38:20 +0100 Subject: [PATCH] Move display transforms from contour map --- .../RivContourMapProjectionPartMgr.cpp | 53 ++++++++++++---- .../RimContourMapProjection.cpp | 51 +++++++-------- .../RimContourMapProjection.h | 63 ++++++++++--------- 3 files changed, 101 insertions(+), 66 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp b/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp index dea9f65149..151ea37150 100644 --- a/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp @@ -153,8 +153,17 @@ cvf::ref RivContourMapProjectionPartMgr::createTextureCoords() //-------------------------------------------------------------------------------------------------- cvf::ref RivContourMapProjectionPartMgr::createProjectionMapDrawable(const caf::DisplayCoordTransform* displayCoordTransform) const { - cvf::ref vertexArray = new cvf::Vec3fArray; - m_contourMapProjection->generateVertices(vertexArray.p(), displayCoordTransform); + std::vector vertices = m_contourMapProjection->generateVertices(); + if (vertices.empty()) return nullptr; + + cvf::ref vertexArray = new cvf::Vec3fArray(vertices.size()); + + for (size_t i = 0; i < vertices.size(); ++i) + { + cvf::Vec3f displayVertexPos (displayCoordTransform->transformToDisplayCoord(vertices[i])); + (*vertexArray)[i] = displayVertexPos; + } + cvf::Vec2ui patchSize = m_contourMapProjection->numberOfVerticesIJ(); // Surface @@ -174,17 +183,26 @@ cvf::ref RivContourMapProjectionPartMgr::createProjectionMapDr //-------------------------------------------------------------------------------------------------- std::vector> RivContourMapProjectionPartMgr::createContourPolygons(const caf::DisplayCoordTransform* displayCoordTransform) const { - RimContourMapProjection::ClosedContourPolygons contourPolygons = m_contourMapProjection->generateContourPolygons(displayCoordTransform); + m_contourMapProjection->generateContourPolygons(); + const std::vector& contourPolygons = m_contourMapProjection->contourPolygons(); std::vector> contourDrawables; for (size_t i = 0; i < contourPolygons.size(); ++i) { for (size_t j = 0; j < contourPolygons[i].size(); ++j) { - cvf::ref vertexArray = contourPolygons[i][j]; + if (contourPolygons[i][j].empty()) continue; + + cvf::ref vertexArray = new cvf::Vec3fArray(contourPolygons[i][j].size()); + for (size_t v = 0; v < contourPolygons[i][j].size(); ++v) + { + cvf::Vec3f displayVertex(displayCoordTransform->transformToDisplayCoord(contourPolygons[i][j][v])); + (*vertexArray)[v] = displayVertex; + } + std::vector indices; - indices.reserve(contourPolygons[i][j]->size()); - for (cvf::uint k = 0; k < contourPolygons[i][j]->size(); ++k) + indices.reserve(vertexArray->size()); + for (cvf::uint k = 0; k < vertexArray->size(); ++k) { indices.push_back(k); } @@ -209,14 +227,25 @@ std::vector> RivContourMapProjectionPartMgr::createCo cvf::ref RivContourMapProjectionPartMgr::createPickPointVisDrawable(const caf::DisplayCoordTransform* displayCoordTransform) const { - cvf::ref geo = nullptr; + std::vector pickPointPolygon = m_contourMapProjection->generatePickPointPolygon(); + if (pickPointPolygon.empty()) + { + return nullptr; + } + cvf::ref vertexArray = new cvf::Vec3fArray(pickPointPolygon.size()); - cvf::ref pickPointPolygon = m_contourMapProjection->generatePickPointPolygon(displayCoordTransform); - if (pickPointPolygon.notNull() && pickPointPolygon->size() > 0u) + for (size_t i = 0; i < pickPointPolygon.size(); ++i) + { + cvf::Vec3f displayPoint(displayCoordTransform->transformToDisplayCoord(pickPointPolygon[i])); + (*vertexArray)[i] = displayPoint; + } + + cvf::ref geo = nullptr; + if (vertexArray->size() > 0u) { std::vector indices; - indices.reserve(pickPointPolygon->size()); - for (cvf::uint j = 0; j < pickPointPolygon->size(); ++j) + indices.reserve(vertexArray->size()); + for (cvf::uint j = 0; j < vertexArray->size(); ++j) { indices.push_back(j); } @@ -228,7 +257,7 @@ cvf::ref geo = new cvf::DrawableGeo; geo->addPrimitiveSet(indexedUInt.p()); - geo->setVertexArray(pickPointPolygon.p()); + geo->setVertexArray(vertexArray.p()); } return geo; } diff --git a/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp b/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp index e434ee103e..c8906f1c75 100644 --- a/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp +++ b/ApplicationCode/ProjectDataModel/RimContourMapProjection.cpp @@ -24,6 +24,7 @@ #include "RimEclipseResultDefinition.h" #include "RimProject.h" #include "RimRegularLegendConfig.h" +#include "RimTextAnnotation.h" #include "cafContourLines.h" #include "cafPdmUiDoubleSliderEditor.h" @@ -84,6 +85,7 @@ RimContourMapProjection::RimContourMapProjection() m_weightingResult.uiCapability()->setUiTreeChildrenHidden(true); m_weightingResult = new RimEclipseResultDefinition; m_weightingResult->findField("MResultType")->uiCapability()->setUiName("Result Type"); + setName("Map Projection"); nameField()->uiCapability()->setUiReadOnly(true); @@ -102,11 +104,10 @@ RimContourMapProjection::~RimContourMapProjection() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimContourMapProjection::generateVertices(cvf::Vec3fArray* vertices, const caf::DisplayCoordTransform* displayCoordTransform) +std::vector RimContourMapProjection::generateVertices() { - CVF_ASSERT(vertices); size_t nVertices = numberOfVertices(); - vertices->resize(nVertices); + std::vector vertices(nVertices, cvf::Vec3d::ZERO); #pragma omp parallel for for (int index = 0; index < static_cast(nVertices); ++index) @@ -117,10 +118,10 @@ void RimContourMapProjection::generateVertices(cvf::Vec3fArray* vertices, const globalPos.x() -= m_sampleSpacing * 0.5; globalPos.y() -= m_sampleSpacing * 0.5; - cvf::Vec3d globalVertexPos(globalPos, m_fullBoundingBox.min().z() - 1.0); - cvf::Vec3f displayVertexPos(displayCoordTransform->transformToDisplayCoord(globalVertexPos)); - (*vertices)[index] = displayVertexPos; + cvf::Vec3d globalVertexPos(globalPos, m_fullBoundingBox.min().z()); + vertices[index] = globalVertexPos; } + return vertices; } @@ -128,9 +129,10 @@ void RimContourMapProjection::generateVertices(cvf::Vec3fArray* vertices, const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimContourMapProjection::ClosedContourPolygons RimContourMapProjection::generateContourPolygons(const caf::DisplayCoordTransform* displayCoordTransform) +void RimContourMapProjection::generateContourPolygons() { - ClosedContourPolygons contourPolygons; + std::vector contourPolygons; + if (minValue() != std::numeric_limits::infinity() && maxValue() != -std::numeric_limits::infinity() && std::fabs(maxValue() - minValue()) > 1.0e-8) @@ -157,12 +159,11 @@ RimContourMapProjection::ClosedContourPolygons RimContourMapProjection::generate { for (size_t j = 0; j < closedContourLines[i].size(); ++j) { - cvf::ref contourPolygon = new cvf::Vec3fArray(closedContourLines[i][j].size()); + ContourPolygon contourPolygon; contourPolygon.reserve(closedContourLines[i][j].size()); for (size_t k = 0; k < closedContourLines[i][j].size(); ++k) { cvf::Vec3d contourPoint3d = cvf::Vec3d(closedContourLines[i][j][k], m_fullBoundingBox.min().z()); - cvf::Vec3d displayPoint3d = displayCoordTransform->transformToDisplayCoord(contourPoint3d); - (*contourPolygon)[k] = cvf::Vec3f(displayPoint3d); + contourPolygon.push_back(contourPoint3d); } contourPolygons[i].push_back(contourPolygon); } @@ -170,21 +171,21 @@ RimContourMapProjection::ClosedContourPolygons RimContourMapProjection::generate } } } - return contourPolygons; + m_contourPolygons = contourPolygons; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -cvf::ref -RimContourMapProjection::generatePickPointPolygon(const caf::DisplayCoordTransform* displayCoordTransform) +std::vector +RimContourMapProjection::generatePickPointPolygon() { - cvf::ref pickPolygon; + std::vector points; + if (!m_pickPoint.isUndefined()) { double zPos = m_fullBoundingBox.min().z(); - std::vector points; { cvf::Vec2d gridorigin(m_fullBoundingBox.min().x(), m_fullBoundingBox.min().y()); @@ -209,16 +210,8 @@ RimContourMapProjection::generatePickPointPolygon(const caf::DisplayCoordTransfo points.push_back(cvf::Vec3d(m_pickPoint - cvf::Vec2d(0.0, 0.5 * m_sampleSpacing), zPos)); points.push_back(cvf::Vec3d(m_pickPoint + cvf::Vec2d(0.0, 0.5 * m_sampleSpacing), zPos)); } - - pickPolygon = new cvf::Vec3fArray(points.size()); - - for (size_t i = 0; i < points.size(); ++i) - { - cvf::Vec3d displayPoint = displayCoordTransform->transformToDisplayCoord(points[i]); - (*pickPolygon)[i] = cvf::Vec3f(displayPoint); - } } - return pickPolygon; + return points; } //-------------------------------------------------------------------------------------------------- @@ -285,6 +278,14 @@ void RimContourMapProjection::generateResults() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimContourMapProjection::contourPolygons() const +{ + return m_contourPolygons; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimContourMapProjection.h b/ApplicationCode/ProjectDataModel/RimContourMapProjection.h index ee65aa233a..7e76c51c8d 100644 --- a/ApplicationCode/ProjectDataModel/RimContourMapProjection.h +++ b/ApplicationCode/ProjectDataModel/RimContourMapProjection.h @@ -60,49 +60,52 @@ public: RESULTS_HC_COLUMN }; typedef caf::AppEnum ResultAggregation; - typedef std::vector>> ClosedContourPolygons; + typedef std::vector ContourPolygon; + typedef std::vector ContourPolygons; RimContourMapProjection(); ~RimContourMapProjection() override; - void generateVertices(cvf::Vec3fArray* vertices, const caf::DisplayCoordTransform* displayCoordTransform); - ClosedContourPolygons generateContourPolygons(const caf::DisplayCoordTransform* displayCoordTransform); - cvf::ref generatePickPointPolygon(const caf::DisplayCoordTransform* displayCoordTransform); - void generateResults(); + std::vector generateVertices(); + void generateContourPolygons(); + std::vector generatePickPointPolygon(); + void generateResults(); - ResultAggregation resultAggregation() const; - double sampleSpacing() const; - double sampleSpacingFactor() const; - bool showContourLines() const; + const std::vector& contourPolygons() const; - QString resultAggregationText() const; - QString resultDescriptionText() const; - QString weightingParameter() const; + ResultAggregation resultAggregation() const; + double sampleSpacing() const; + double sampleSpacingFactor() const; + bool showContourLines() const; - double maxValue() const; - double minValue() const; - double meanValue() const; - double sumAllValues() const; + QString resultAggregationText() const; + QString resultDescriptionText() const; + QString weightingParameter() const; - cvf::Vec2ui numberOfElementsIJ() const; - cvf::Vec2ui numberOfVerticesIJ() const; + double maxValue() const; + double minValue() const; + double meanValue() const; + double sumAllValues() const; - bool isColumnResult() const; + cvf::Vec2ui numberOfElementsIJ() const; + cvf::Vec2ui numberOfVerticesIJ() const; - double valueAtVertex(uint i, uint j) const; - bool hasResultAtVertex(uint i, uint j) const; + bool isColumnResult() const; - RimRegularLegendConfig* legendConfig() const; - void updateLegend(); + double valueAtVertex(uint i, uint j) const; + bool hasResultAtVertex(uint i, uint j) const; - uint numberOfCells() const; - uint numberOfValidCells() const; - size_t numberOfVertices() const; + RimRegularLegendConfig* legendConfig() const; + void updateLegend(); - void updatedWeightingResult(); + uint numberOfCells() const; + uint numberOfValidCells() const; + size_t numberOfVertices() const; - bool checkForMapIntersection(const cvf::Vec3d& localPoint3d, cvf::Vec2d* contourMapPoint, cvf::Vec2ui* contourMapCell, double* valueAtPoint) const; - void setPickPoint(cvf::Vec2d pickedPoint); + void updatedWeightingResult(); + + bool checkForMapIntersection(const cvf::Vec3d& localPoint3d, cvf::Vec2d* contourMapPoint, cvf::Vec2ui* contourMapCell, double* valueAtPoint) const; + void setPickPoint(cvf::Vec2d pickedPoint); protected: void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; @@ -161,6 +164,7 @@ protected: caf::PdmField m_showContourLines; caf::PdmField m_weightByParameter; caf::PdmChildField m_weightingResult; + cvf::ref m_cellGridIdxVisibility; std::vector m_aggregatedResults; @@ -177,4 +181,5 @@ protected: cvf::Vec2ui m_mapSize; cvf::BoundingBox m_fullBoundingBox; double m_sampleSpacing; + std::vector m_contourPolygons; };