From 9297c5888ce08ceab9d2115b07a516f84eb44f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Mon, 26 Nov 2018 14:06:17 +0100 Subject: [PATCH] #3724, #3723 Several polyline annotation updates Renamed from polyline to polylines. Split into PolylinesFromFile and UserDefinedPolylines Add import of polylines from file --- ApplicationCode/CMakeLists.txt | 1 + .../AnnotationCommands/CMakeLists_files.cmake | 25 ++ .../RicImportPolylinesAnnotationFeature.cpp | 93 ++++++ .../RicImportPolylinesAnnotationFeature.h | 37 +++ .../Commands/RicNewAnnotationFeature.cpp | 4 +- .../ModelVisualization/CMakeLists_files.cmake | 4 +- .../RivAnnotationsPartMgr.cpp | 3 +- .../RivPolylineAnnotationPartMgr.cpp | 145 ++------- .../RivPolylineAnnotationPartMgr.h | 20 +- ...p => RivPolylinesAnnotationSourceInfo.cpp} | 8 +- ...o.h => RivPolylinesAnnotationSourceInfo.h} | 10 +- .../ProjectDataModel/CMakeLists_files.cmake | 4 +- .../RimAnnotationCollection.cpp | 146 +++++++-- .../RimAnnotationCollection.h | 36 ++- .../RimContextCommandBuilder.cpp | 1 + .../ProjectDataModel/RimPolylineAnnotation.h | 70 ----- .../RimPolylinesAnnotation.cpp | 278 ++++++++++++++++++ .../ProjectDataModel/RimPolylinesAnnotation.h | 139 +++++++++ .../ProjectDataModel/RimProject.cpp | 12 +- ApplicationCode/ProjectDataModel/RimProject.h | 4 +- 20 files changed, 774 insertions(+), 266 deletions(-) create mode 100644 ApplicationCode/Commands/AnnotationCommands/CMakeLists_files.cmake create mode 100644 ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.cpp create mode 100644 ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.h rename ApplicationCode/ModelVisualization/{RivPolylineAnnotationSourceInfo.cpp => RivPolylinesAnnotationSourceInfo.cpp} (84%) rename ApplicationCode/ModelVisualization/{RivPolylineAnnotationSourceInfo.h => RivPolylinesAnnotationSourceInfo.h} (77%) delete mode 100644 ApplicationCode/ProjectDataModel/RimPolylineAnnotation.h create mode 100644 ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.cpp create mode 100644 ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.h diff --git a/ApplicationCode/CMakeLists.txt b/ApplicationCode/CMakeLists.txt index 1fabac1f27..45d155ad02 100644 --- a/ApplicationCode/CMakeLists.txt +++ b/ApplicationCode/CMakeLists.txt @@ -103,6 +103,7 @@ list( APPEND REFERENCED_CMAKE_FILES Commands/CMakeLists_files.cmake Commands/ApplicationCommands/CMakeLists_files.cmake + Commands/AnnotationCommands/CMakeLists_files.cmake Commands/CompletionCommands/CMakeLists_files.cmake Commands/CompletionExportCommands/CMakeLists_files.cmake Commands/CrossSectionCommands/CMakeLists_files.cmake diff --git a/ApplicationCode/Commands/AnnotationCommands/CMakeLists_files.cmake b/ApplicationCode/Commands/AnnotationCommands/CMakeLists_files.cmake new file mode 100644 index 0000000000..30f0e11302 --- /dev/null +++ b/ApplicationCode/Commands/AnnotationCommands/CMakeLists_files.cmake @@ -0,0 +1,25 @@ + +set (SOURCE_GROUP_HEADER_FILES +${CMAKE_CURRENT_LIST_DIR}/RicImportPolylinesAnnotationFeature.h + +) + +set (SOURCE_GROUP_SOURCE_FILES +${CMAKE_CURRENT_LIST_DIR}/RicImportPolylinesAnnotationFeature.cpp + +) + +list(APPEND CODE_HEADER_FILES +${SOURCE_GROUP_HEADER_FILES} +) + +list(APPEND CODE_SOURCE_FILES +${SOURCE_GROUP_SOURCE_FILES} +) + +set (QT_MOC_HEADERS +${QT_MOC_HEADERS} +) + + +source_group( "CommandFeature\\AnnotationCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.cpp b/ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.cpp new file mode 100644 index 0000000000..40432f9c66 --- /dev/null +++ b/ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.cpp @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2018- equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicImportPolylinesAnnotationFeature.h" + +#include "RiaApplication.h" + +#include "RimOilField.h" +#include "RimProject.h" +#include "RimAnnotationCollection.h" +#include "RimPolylinesAnnotation.h" + +#include "Riu3DMainWindowTools.h" + +#include +#include + + +CAF_CMD_SOURCE_INIT(RicImportPolylinesAnnotationFeature, "RicImportPolylinesAnnotationFeature"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicImportPolylinesAnnotationFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportPolylinesAnnotationFeature::onActionTriggered(bool isChecked) +{ + RiaApplication* app = RiaApplication::instance(); + QString defaultDir = app->lastUsedDialogDirectory("BINARY_GRID"); + QStringList fileNames = QFileDialog::getOpenFileNames(Riu3DMainWindowTools::mainWindowWidget(), + "Import Poly Lines Annotation", + defaultDir, + "Text File (*.txt);Polylines (*.dat);All Files (*.*)"); + + if (fileNames.isEmpty()) return; + + // Remember the path to next time + app->setLastUsedDialogDirectory("BINARY_GRID", QFileInfo(fileNames.last()).absolutePath()); + + // Find or create the AnnotationsCollection + + RimProject* proj = RiaApplication::instance()->project(); + RimAnnotationCollection* annotColl = proj->activeOilField()->annotationCollection(); + + if (!annotColl) + { + annotColl = new RimAnnotationCollection; + proj->activeOilField()->annotationCollection = annotColl; + } + + // For each file, + + RimPolyLinesFromFileAnnotation* lastCreatedOrUpdated = annotColl->importOrUpdatePolylinesFromFile(fileNames); + + proj->updateConnectedEditors(); + + if (lastCreatedOrUpdated) + { + Riu3DMainWindowTools::selectAsCurrentItem(lastCreatedOrUpdated); + } + + annotColl->scheduleRedrawOfRelevantViews(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportPolylinesAnnotationFeature::setupActionLook(QAction* actionToSetup) +{ + actionToSetup->setIcon(QIcon(":/FormationCollection16x16.png")); + actionToSetup->setText("Import Poly Lines Annotation"); +} diff --git a/ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.h b/ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.h new file mode 100644 index 0000000000..8dd73be8ab --- /dev/null +++ b/ApplicationCode/Commands/AnnotationCommands/RicImportPolylinesAnnotationFeature.h @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2018- equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicImportPolylinesAnnotationFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + // Overrides + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; + + diff --git a/ApplicationCode/Commands/RicNewAnnotationFeature.cpp b/ApplicationCode/Commands/RicNewAnnotationFeature.cpp index 3de59e284a..3f000ef61f 100644 --- a/ApplicationCode/Commands/RicNewAnnotationFeature.cpp +++ b/ApplicationCode/Commands/RicNewAnnotationFeature.cpp @@ -22,7 +22,7 @@ #include "RimTextAnnotation.h" #include "RimReachCircleAnnotation.h" -#include "RimPolylineAnnotation.h" +#include "RimPolylinesAnnotation.h" #include "RimAnnotationCollection.h" #include "RimProject.h" #include "RimOilField.h" @@ -132,7 +132,7 @@ void RicNewPolylineAnnotationFeature::onActionTriggered(bool isChecked) auto coll = annotationCollection(); if (coll) { - auto newAnnotation = new RimPolylineAnnotation(); + auto newAnnotation = new RimUserDefinedPolyLinesAnnotation(); coll->addAnnotation(newAnnotation); coll->updateConnectedEditors(); RiuMainWindow::instance()->selectAsCurrentItem(newAnnotation); diff --git a/ApplicationCode/ModelVisualization/CMakeLists_files.cmake b/ApplicationCode/ModelVisualization/CMakeLists_files.cmake index e6eb50442d..f248013042 100644 --- a/ApplicationCode/ModelVisualization/CMakeLists_files.cmake +++ b/ApplicationCode/ModelVisualization/CMakeLists_files.cmake @@ -52,7 +52,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationPartMgr.h ${CMAKE_CURRENT_LIST_DIR}/RivPolylineAnnotationPartMgr.h ${CMAKE_CURRENT_LIST_DIR}/RivTextAnnotationSourceInfo.h ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivPolylineAnnotationSourceInfo.h +${CMAKE_CURRENT_LIST_DIR}/RivPolylinesAnnotationSourceInfo.h ${CMAKE_CURRENT_LIST_DIR}/RivPolylineGenerator.h ) @@ -104,7 +104,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationPartMgr.cpp ${CMAKE_CURRENT_LIST_DIR}/RivPolylineAnnotationPartMgr.cpp ${CMAKE_CURRENT_LIST_DIR}/RivTextAnnotationSourceInfo.cpp ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivPolylineAnnotationSourceInfo.cpp +${CMAKE_CURRENT_LIST_DIR}/RivPolylinesAnnotationSourceInfo.cpp ${CMAKE_CURRENT_LIST_DIR}/RivPolylineGenerator.cpp ) diff --git a/ApplicationCode/ModelVisualization/RivAnnotationsPartMgr.cpp b/ApplicationCode/ModelVisualization/RivAnnotationsPartMgr.cpp index 6c5589c510..0fe767a41f 100644 --- a/ApplicationCode/ModelVisualization/RivAnnotationsPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivAnnotationsPartMgr.cpp @@ -32,7 +32,7 @@ #include "RimTextAnnotation.h" #include "RimReachCircleAnnotation.h" -#include "RimPolylineAnnotation.h" +#include "RimPolylinesAnnotation.h" #include "RimAnnotationInViewCollection.h" #include "RimEclipseCase.h" #include "RimEclipseView.h" @@ -138,6 +138,7 @@ void RivAnnotationsPartMgr::createAnnotationPartManagers() // m_mapFromViewToIndex[wellPath] = wppm; } } + } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp b/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp index 82d41693e6..32ecb72f3b 100644 --- a/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.cpp @@ -1,8 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2011- Statoil ASA -// Copyright (C) 2013- Ceetron Solutions AS -// Copyright (C) 2011-2012 Ceetron AS +// Copyright (C) 2018- equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,51 +16,29 @@ // ///////////////////////////////////////////////////////////////////////////////// - - #include "RivPolylineAnnotationPartMgr.h" -#include "RiaApplication.h" - -#include "RigActiveCellInfo.h" -#include "RigCell.h" -#include "RigEclipseCaseData.h" -#include "RigMainGrid.h" -#include "RigSimWellData.h" - -//#include "RimAnnotationInView.h" -#include "RimPolylineAnnotation.h" +#include "RimPolylinesAnnotation.h" #include "RimAnnotationInViewCollection.h" -#include "RimEclipseCase.h" -#include "RimEclipseView.h" -#include "RimSimWellInViewCollection.h" -#include "RimSimWellInView.h" - -#include "RivPipeGeometryGenerator.h" #include "RivPolylineGenerator.h" #include "RivPartPriority.h" -#include "RivPolylineAnnotationSourceInfo.h" +#include "RivPolylinesAnnotationSourceInfo.h" #include "cafEffectGenerator.h" -#include "cvfArrowGenerator.h" #include "cvfDrawableGeo.h" #include "cvfDrawableText.h" -#include "cvfGeometryBuilderFaceList.h" #include "cvfModelBasicList.h" #include "cvfPart.h" #include "cvfTransform.h" -#include "cvfqtUtils.h" #include "cafDisplayCoordTransform.h" -#include "RivSectionFlattner.h" - static RimSimWellInViewCollection* simWellInViewCollection() { return nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RivPolylineAnnotationPartMgr::RivPolylineAnnotationPartMgr(RimPolylineAnnotation* annotation) +RivPolylineAnnotationPartMgr::RivPolylineAnnotationPartMgr(RimPolylinesAnnotation* annotation) : m_rimAnnotation(annotation) { } @@ -78,41 +54,36 @@ RivPolylineAnnotationPartMgr::~RivPolylineAnnotationPartMgr() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivPolylineAnnotationPartMgr::buildPolygonAnnotationParts(const caf::DisplayCoordTransform* displayXf, bool doFlatten, double xOffset) +void RivPolylineAnnotationPartMgr::buildPolygonAnnotationParts(const caf::DisplayCoordTransform* displayXf) { clearAllGeometry(); - cvf::ref sourceInfo = new RivPolylineAnnotationSourceInfo(m_rimAnnotation); - - const auto& points = m_rimAnnotation->points(); - - if (!points.empty()) + if (!m_rimAnnotation->isEmpty()) { - // textPosition.z() += 1.2 * arrowLength; + const auto& points = m_rimAnnotation->polyLinesData(); - cvf::Font* font = RiaApplication::instance()->customFont(); + auto linesInDisplayCoords = points->polyLines(); - cvf::ref drawableGeo = RivPolylineGenerator::createLineAlongPolylineDrawable(points); - - //drawableGeo-> - //drawableText->setCheckPosVisible(false); - //drawableText->setDrawBorder(false); - //drawableText->setDrawBackground(false); - //drawableText->setVerticalAlignment(cvf::TextDrawer::CENTER); - //drawableText->setTextColor(cvf::Color3f::BLACK); // simWellInViewCollection()->wellLabelColor()); - - //cvf::Vec3f textCoord(textPosition); - //drawableText->addText(cvfString, textCoord); + for (auto& line : linesInDisplayCoords) + { + for ( cvf::Vec3d& point : line) + { + point = displayXf->transformToDisplayCoord(point); + } + } + cvf::ref drawableGeo = RivPolylineGenerator::createLineAlongPolylineDrawable(linesInDisplayCoords); cvf::ref part = new cvf::Part; //part->setName("RivAnnotationPartMgr: text " + cvfString); part->setDrawable(drawableGeo.p()); - caf::SurfaceEffectGenerator colorEffgen(cvf::Color3f::RED, caf::PO_NONE); - cvf::ref eff = colorEffgen.generateUnCachedEffect(); + caf::MeshEffectGenerator colorEffgen(cvf::Color3f::RED); + cvf::ref eff = colorEffgen.generateCachedEffect(); part->setEffect(eff.p()); - part->setPriority(RivPartPriority::PartType::MeshLines); + part->setPriority(RivPartPriority::PartType::MeshLines); + + cvf::ref sourceInfo = new RivPolylinesAnnotationSourceInfo(m_rimAnnotation); part->setSourceInfo(sourceInfo.p()); m_part = part; @@ -134,79 +105,9 @@ void RivPolylineAnnotationPartMgr::appendDynamicGeometryPartsToModel(cvf::ModelB const caf::DisplayCoordTransform * displayXf) { if (m_rimAnnotation.isNull()) return; - if (!validateAnnotation(m_rimAnnotation)) return; + if (m_rimAnnotation->isEmpty()) return; - buildPolygonAnnotationParts(displayXf, false, 0.0); + buildPolygonAnnotationParts(displayXf); model->addPart(m_part.p()); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivPolylineAnnotationPartMgr::appendFlattenedDynamicGeometryPartsToModel(cvf::ModelBasicList* model, - size_t frameIndex, - const caf::DisplayCoordTransform * displayXf, - double xOffset) -{ - /////////////////////////////////////////// - caf::PdmPointer m_rimWell; - cvf::ref m_wellHeadPipeSurfacePart; - cvf::ref m_wellHeadPipeCenterPart; - cvf::ref m_wellHeadArrowPart; - cvf::ref m_wellHeadLabelPart; - /////////////////////////////////////////// - - if (m_rimWell.isNull()) return; - if (!viewWithSettings()) return; - - if (!m_rimWell->isWellPipeVisible(frameIndex)) return; - - //buildParts(displayXf, true, xOffset); - - // Always add pipe part of well head - if (m_wellHeadPipeCenterPart.notNull()) model->addPart(m_wellHeadPipeCenterPart.p()); - if (m_wellHeadPipeSurfacePart.notNull()) model->addPart(m_wellHeadPipeSurfacePart.p()); - - if (m_rimWell->showWellLabel() && - m_wellHeadLabelPart.notNull()) - { - model->addPart(m_wellHeadLabelPart.p()); - } - - if (m_rimWell->showWellHead() && - m_wellHeadArrowPart.notNull()) - { - model->addPart(m_wellHeadArrowPart.p()); - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -Rim3dView* RivPolylineAnnotationPartMgr::viewWithSettings() -{ - Rim3dView* view = nullptr; - if (m_rimAnnotation) m_rimAnnotation->firstAncestorOrThisOfType(view); - - return view; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimAnnotationInViewCollection* RivPolylineAnnotationPartMgr::annotatationInViewCollection() -{ - RimAnnotationInViewCollection* coll = nullptr; - if (m_rimAnnotation) m_rimAnnotation->firstAncestorOrThisOfType(coll); - - return coll; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RivPolylineAnnotationPartMgr::validateAnnotation(const RimPolylineAnnotation* annotation) const -{ - return m_rimAnnotation->points().size() > 1; -} - diff --git a/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.h b/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.h index 453f73bd97..4ea666fe3b 100644 --- a/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.h +++ b/ApplicationCode/ModelVisualization/RivPolylineAnnotationPartMgr.h @@ -36,7 +36,7 @@ namespace caf } class Rim3dView; -class RimPolylineAnnotation; +class RimPolylinesAnnotation; class RimAnnotationInViewCollection; class RimSimWellInView; class RimSimWellInViewCollection; @@ -44,29 +44,17 @@ class RimSimWellInViewCollection; class RivPolylineAnnotationPartMgr : public cvf::Object { public: - RivPolylineAnnotationPartMgr( RimPolylineAnnotation* annotation); + RivPolylineAnnotationPartMgr( RimPolylinesAnnotation* annotation); ~RivPolylineAnnotationPartMgr() override; void appendDynamicGeometryPartsToModel(cvf::ModelBasicList* model, const caf::DisplayCoordTransform * displayXf); - void appendFlattenedDynamicGeometryPartsToModel(cvf::ModelBasicList* model, - size_t frameIndex, - const caf::DisplayCoordTransform * displayXf, - double xOffset); - - - private: - void buildPolygonAnnotationParts(const caf::DisplayCoordTransform* displayXf, - bool doFlatten, - double xOffset); + void buildPolygonAnnotationParts(const caf::DisplayCoordTransform* displayXf); void clearAllGeometry(); - Rim3dView* viewWithSettings(); - RimAnnotationInViewCollection* annotatationInViewCollection(); - bool validateAnnotation(const RimPolylineAnnotation* annotation) const; - caf::PdmPointer m_rimAnnotation; + caf::PdmPointer m_rimAnnotation; cvf::ref m_part; }; diff --git a/ApplicationCode/ModelVisualization/RivPolylineAnnotationSourceInfo.cpp b/ApplicationCode/ModelVisualization/RivPolylinesAnnotationSourceInfo.cpp similarity index 84% rename from ApplicationCode/ModelVisualization/RivPolylineAnnotationSourceInfo.cpp rename to ApplicationCode/ModelVisualization/RivPolylinesAnnotationSourceInfo.cpp index 8a6aff85c4..732213249e 100644 --- a/ApplicationCode/ModelVisualization/RivPolylineAnnotationSourceInfo.cpp +++ b/ApplicationCode/ModelVisualization/RivPolylinesAnnotationSourceInfo.cpp @@ -17,16 +17,16 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RivPolylineAnnotationSourceInfo.h" +#include "RivPolylinesAnnotationSourceInfo.h" #include "RimEclipseView.h" #include "RimAnnotationInViewCollection.h" -#include "RimPolylineAnnotation.h" +#include "RimPolylinesAnnotation.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RivPolylineAnnotationSourceInfo::RivPolylineAnnotationSourceInfo(RimPolylineAnnotation* annotation) +RivPolylinesAnnotationSourceInfo::RivPolylinesAnnotationSourceInfo(RimPolylinesAnnotation* annotation) : m_annotation(annotation) { } @@ -34,7 +34,7 @@ RivPolylineAnnotationSourceInfo::RivPolylineAnnotationSourceInfo(RimPolylineAnno //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimPolylineAnnotation* RivPolylineAnnotationSourceInfo::annotation() const +RimPolylinesAnnotation* RivPolylinesAnnotationSourceInfo::annotation() const { return m_annotation.p(); } diff --git a/ApplicationCode/ModelVisualization/RivPolylineAnnotationSourceInfo.h b/ApplicationCode/ModelVisualization/RivPolylinesAnnotationSourceInfo.h similarity index 77% rename from ApplicationCode/ModelVisualization/RivPolylineAnnotationSourceInfo.h rename to ApplicationCode/ModelVisualization/RivPolylinesAnnotationSourceInfo.h index 041e5e6566..82b0c7b847 100644 --- a/ApplicationCode/ModelVisualization/RivPolylineAnnotationSourceInfo.h +++ b/ApplicationCode/ModelVisualization/RivPolylinesAnnotationSourceInfo.h @@ -23,15 +23,15 @@ #include "cvfObject.h" #include "cafPdmPointer.h" -class RimPolylineAnnotation; +class RimPolylinesAnnotation; -class RivPolylineAnnotationSourceInfo : public cvf::Object +class RivPolylinesAnnotationSourceInfo : public cvf::Object { public: - RivPolylineAnnotationSourceInfo(RimPolylineAnnotation* annotation); + RivPolylinesAnnotationSourceInfo(RimPolylinesAnnotation* annotation); - RimPolylineAnnotation* annotation() const; + RimPolylinesAnnotation* annotation() const; private: - caf::PdmPointer m_annotation; + caf::PdmPointer m_annotation; }; diff --git a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake index 9e1ecfe62e..9638683bbe 100644 --- a/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationCode/ProjectDataModel/CMakeLists_files.cmake @@ -123,7 +123,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimContourMapViewCollection.h ${CMAKE_CURRENT_LIST_DIR}/RimContourMapNameConfig.h ${CMAKE_CURRENT_LIST_DIR}/RimScaleLegendConfig.h ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylineAnnotation.h +${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotation.h ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationInView.h @@ -255,7 +255,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RimContourMapViewCollection.cpp ${CMAKE_CURRENT_LIST_DIR}/RimContourMapNameConfig.cpp ${CMAKE_CURRENT_LIST_DIR}/RimScaleLegendConfig.cpp ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPolylineAnnotation.cpp +${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationInView.cpp diff --git a/ApplicationCode/ProjectDataModel/RimAnnotationCollection.cpp b/ApplicationCode/ProjectDataModel/RimAnnotationCollection.cpp index d4fd26330b..47cc5aeaef 100644 --- a/ApplicationCode/ProjectDataModel/RimAnnotationCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimAnnotationCollection.cpp @@ -1,8 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2011- Statoil ASA -// Copyright (C) 2013- Ceetron Solutions AS -// Copyright (C) 2011-2012 Ceetron AS +// Copyright (C) 2018- equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -22,22 +20,16 @@ #include "RimTextAnnotation.h" #include "RimReachCircleAnnotation.h" -#include "RimPolylineAnnotation.h" +#include "RimPolylinesAnnotation.h" +#include "RimProject.h" +#include "RimGridView.h" +#include "RimAnnotationInViewCollection.h" + +#include "QMessageBox" #include -namespace caf -{ - // template<> - // void RimWellPathCollection::WellVisibilityEnum::setUp() - // { - // addItem(RimWellPathCollection::FORCE_ALL_OFF, "FORCE_ALL_OFF", "Off"); - // addItem(RimWellPathCollection::ALL_ON, "ALL_ON", "Individual"); - // addItem(RimWellPathCollection::FORCE_ALL_ON, "FORCE_ALL_ON", "On"); - // } -} - CAF_PDM_SOURCE_INIT(RimAnnotationCollection, "RimAnnotationCollection"); @@ -49,11 +41,14 @@ RimAnnotationCollection::RimAnnotationCollection() CAF_PDM_InitObject("Annotations", ":/WellCollection.png", "", ""); CAF_PDM_InitFieldNoDefault(&m_textAnnotations, "TextAnnotations", "Text Annotations", "", "", ""); - CAF_PDM_InitFieldNoDefault(&m_reachCircleAnnotations, "ReachCircleAnnotations", "Reach Circle Annotations", "", "", ""); - CAF_PDM_InitFieldNoDefault(&m_polylineAnnotations, "PolylineAnnotations", "Polyline Annotations", "", "", ""); m_textAnnotations.uiCapability()->setUiHidden(true); + CAF_PDM_InitFieldNoDefault(&m_reachCircleAnnotations, "ReachCircleAnnotations", "Reach Circle Annotations", "", "", ""); m_reachCircleAnnotations.uiCapability()->setUiHidden(true); + CAF_PDM_InitFieldNoDefault(&m_polylineAnnotations, "PolylineAnnotations", "Polyline Annotations", "", "", ""); m_polylineAnnotations.uiCapability()->setUiHidden(true); + CAF_PDM_InitFieldNoDefault(&m_polylineFromFileAnnotations, "PolylineFromFileAnnotations", "Polylines From File", "", "", ""); + m_polylineFromFileAnnotations.uiCapability()->setUiHidden(true); + } @@ -84,7 +79,7 @@ void RimAnnotationCollection::addAnnotation(RimReachCircleAnnotation* annotation //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimAnnotationCollection::addAnnotation(RimPolylineAnnotation* annotation) +void RimAnnotationCollection::addAnnotation(RimPolylinesAnnotation* annotation) { m_polylineAnnotations.push_back(annotation); } @@ -108,7 +103,120 @@ std::vector RimAnnotationCollection::reachCircleAnnot //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimAnnotationCollection::polylineAnnotations() const +std::vector RimAnnotationCollection::polylineAnnotations() const { return m_polylineAnnotations.childObjects(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimAnnotationCollection::polylinesFromFileAnnotations() const +{ + return m_polylineFromFileAnnotations.childObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPolyLinesFromFileAnnotation* RimAnnotationCollection::importOrUpdatePolylinesFromFile(const QStringList& fileNames) +{ + QStringList newFileNames; + std::vector polyLinesObjsToReload; + size_t formationListBeforeImportCount = m_polylineFromFileAnnotations.size(); + + for(const QString& newFileName : fileNames) + { + bool isFound = false; + for(RimPolyLinesFromFileAnnotation* polyLinesAnnot: m_polylineFromFileAnnotations) + { + if(polyLinesAnnot->fileName() == newFileName) + { + polyLinesObjsToReload.push_back(polyLinesAnnot); + isFound = true; + break; + } + } + + if(!isFound) + { + newFileNames.push_back(newFileName); + } + } + + for(const QString& newFileName : newFileNames) + { + RimPolyLinesFromFileAnnotation* newPolyLinesAnnot = new RimPolyLinesFromFileAnnotation; + newPolyLinesAnnot->setFileName(newFileName); + m_polylineFromFileAnnotations.push_back(newPolyLinesAnnot); + polyLinesObjsToReload.push_back(newPolyLinesAnnot); + newPolyLinesAnnot->setDescriptionFromFileName(); + } + + QString totalErrorMessage; + + for (RimPolyLinesFromFileAnnotation* polyLinesAnnot: polyLinesObjsToReload) + { + QString errormessage; + + polyLinesAnnot->readPolyLinesFile(&errormessage); + if (!errormessage.isEmpty()) + { + totalErrorMessage += "\nError in: " + polyLinesAnnot->fileName() + + "\n\t" + errormessage; + } + } + + if (!totalErrorMessage.isEmpty()) + { + QMessageBox::warning(nullptr, "Import Formation Names", totalErrorMessage); + } + + if (m_polylineFromFileAnnotations.size() > formationListBeforeImportCount) + { + return m_polylineFromFileAnnotations[m_polylineFromFileAnnotations.size() - 1]; + } + else + { + return nullptr; + } + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimAnnotationCollection::scheduleRedrawOfRelevantViews() +{ + // Todo: Do a Bounding Box check to see if this annotation actually is relevant for the view + + auto views = gridViewsContainingAnnotations(); + if ( !views.empty() ) + { + for ( auto& view : views ) + { + view->scheduleCreateDisplayModelAndRedraw(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimAnnotationCollection::gridViewsContainingAnnotations() const +{ + std::vector views; + RimProject* project = nullptr; + this->firstAncestorOrThisOfType(project); + + if (!project) return views; + + std::vector visibleGridViews; + project->allVisibleGridViews(visibleGridViews); + + for (auto& gridView : visibleGridViews) + { + if (gridView->annotationCollection()->isActive()) views.push_back(gridView); + } + return views; +} diff --git a/ApplicationCode/ProjectDataModel/RimAnnotationCollection.h b/ApplicationCode/ProjectDataModel/RimAnnotationCollection.h index ff878238c6..d81912911d 100644 --- a/ApplicationCode/ProjectDataModel/RimAnnotationCollection.h +++ b/ApplicationCode/ProjectDataModel/RimAnnotationCollection.h @@ -1,8 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2011- Statoil ASA -// Copyright (C) 2013- Ceetron Solutions AS -// Copyright (C) 2011-2012 Ceetron AS +// Copyright (C) 2018- equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -26,19 +24,13 @@ #include "cafPdmField.h" #include "cafPdmObject.h" #include "cafPdmPointer.h" -#include "cafAppEnum.h" - -// Include to make Pdm work for cvf::Color -#include "cafPdmFieldCvfColor.h" -#include "cafPdmChildField.h" - -#include "cvfObject.h" class QString; class RimTextAnnotation; class RimReachCircleAnnotation; -class RimPolylineAnnotation; - +class RimPolylinesAnnotation; +class RimPolyLinesFromFileAnnotation; +class RimGridView; //================================================================================================== /// @@ -53,14 +45,20 @@ public: void addAnnotation(RimTextAnnotation* annotation); void addAnnotation(RimReachCircleAnnotation* annotation); - void addAnnotation(RimPolylineAnnotation* annotation); + void addAnnotation(RimPolylinesAnnotation* annotation); - std::vector textAnnotations() const; - std::vector reachCircleAnnotations() const; - std::vector polylineAnnotations() const; + std::vector textAnnotations() const; + std::vector reachCircleAnnotations() const; + std::vector polylineAnnotations() const; + std::vector polylinesFromFileAnnotations() const; + + RimPolyLinesFromFileAnnotation* importOrUpdatePolylinesFromFile(const QStringList& fileNames ); + void scheduleRedrawOfRelevantViews(); + std::vector gridViewsContainingAnnotations() const; private: - caf::PdmChildArrayField m_textAnnotations; - caf::PdmChildArrayField m_reachCircleAnnotations; - caf::PdmChildArrayField m_polylineAnnotations; + caf::PdmChildArrayField m_textAnnotations; + caf::PdmChildArrayField m_reachCircleAnnotations; + caf::PdmChildArrayField m_polylineAnnotations; + caf::PdmChildArrayField m_polylineFromFileAnnotations; }; diff --git a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp index 4de69e6834..2153a1e686 100644 --- a/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -682,6 +682,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } else if (dynamic_cast(uiItem)) { + menuBuilder << "RicImportPolylinesAnnotationFeature"; menuBuilder << "RicNewTextAnnotationFeature"; menuBuilder << "RicNewReachCircleAnnotationFeature"; menuBuilder << "RicNewPolygonAnnotationFeature"; diff --git a/ApplicationCode/ProjectDataModel/RimPolylineAnnotation.h b/ApplicationCode/ProjectDataModel/RimPolylineAnnotation.h deleted file mode 100644 index 9a2bee887a..0000000000 --- a/ApplicationCode/ProjectDataModel/RimPolylineAnnotation.h +++ /dev/null @@ -1,70 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) 2011- Statoil ASA -// Copyright (C) 2013- Ceetron Solutions AS -// Copyright (C) 2011-2012 Ceetron AS -// -// ResInsight is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. -// -// See the GNU General Public License at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#pragma once - -#include "cafPdmChildArrayField.h" -#include "cafPdmField.h" -#include "cafPdmObject.h" -#include "cafPdmPointer.h" -#include "cafAppEnum.h" -#include "cafPdmUiOrdering.h" - -// Include to make Pdm work for cvf::Color -#include "cafPdmFieldCvfColor.h" -#include "cafPdmChildField.h" -#include "cafPdmFieldCvfVec3d.h" - -#include "cvfObject.h" -#include "cvfVector3.h" - -#include - -class QString; -class RimGridView; - - -//================================================================================================== -/// -/// -//================================================================================================== -class RimPolylineAnnotation : public caf::PdmObject -{ - using Vec3d = cvf::Vec3d; - - CAF_PDM_HEADER_INIT; - -public: - RimPolylineAnnotation(); - ~RimPolylineAnnotation(); - - void setPoints(const std::vector& points); - const std::vector& points() const; - -protected: - void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; - void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; - -private: - std::vector gridViewsContainingAnnotations() const; - -private: - caf::PdmField> m_points; -}; diff --git a/ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.cpp b/ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.cpp new file mode 100644 index 0000000000..e4de0642d1 --- /dev/null +++ b/ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.cpp @@ -0,0 +1,278 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2018- equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimPolylinesAnnotation.h" + +#include "RimAnnotationInViewCollection.h" +#include "RimGridView.h" +#include "RimProject.h" +#include "RimTools.h" +#include "QFile" +#include "RimAnnotationCollection.h" +#include "QFileInfo" + +CAF_PDM_ABSTRACT_SOURCE_INIT(RimPolylinesAnnotation, "RimPolylinesAnnotation"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPolylinesAnnotation::RimPolylinesAnnotation() +{ + CAF_PDM_InitObject("PolylineAnnotation", ":/WellCollection.png", "", ""); + + CAF_PDM_InitField(&m_isActive, "IsActive", true, "Is Active", "", "", ""); + m_isActive.uiCapability()->setUiHidden(true); + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPolylinesAnnotation::~RimPolylinesAnnotation() +{ + +} + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimPolylinesAnnotation::objectToggleField() +{ + return &m_isActive; +} + +CAF_PDM_SOURCE_INIT(RimUserDefinedPolyLinesAnnotation, "UserDefinedPolyLinesAnnotation"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimUserDefinedPolyLinesAnnotation::RimUserDefinedPolyLinesAnnotation() +{ + CAF_PDM_InitObject("PolyLines Annotation", ":/WellCollection.png", "", ""); + + CAF_PDM_InitField(&m_points, "Points", {}, "", "", "", ""); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimUserDefinedPolyLinesAnnotation::~RimUserDefinedPolyLinesAnnotation() +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RimUserDefinedPolyLinesAnnotation::polyLinesData() +{ + cvf::ref pld = new RigPolyLinesData; + std::vector > lines; + lines.push_back(m_points()); + pld->setPolyLines(lines); + + return pld; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimUserDefinedPolyLinesAnnotation::isEmpty() +{ + return m_points().empty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimUserDefinedPolyLinesAnnotation::defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) +{ + uiOrdering.add(&m_points); + + uiOrdering.skipRemainingFields(true); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimUserDefinedPolyLinesAnnotation::fieldChangedByUi(const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue) +{ + RimAnnotationCollection* annColl = nullptr; + this->firstAncestorOrThisOfType(annColl); + if (annColl) + { + annColl->scheduleRedrawOfRelevantViews(); + } +} + + +#include "cafPdmUiFilePathEditor.h" + +CAF_PDM_SOURCE_INIT(RimPolyLinesFromFileAnnotation, "PolyLinesFromFileAnnotation"); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPolyLinesFromFileAnnotation::RimPolyLinesFromFileAnnotation() +{ + CAF_PDM_InitObject("PolyLines Annotation", ":/WellCollection.png", "", ""); + + CAF_PDM_InitField(&m_polyLinesFileName, "PolyLineFilePath", QString(""), "File Path", "", "", ""); + m_polyLinesFileName.uiCapability()->setUiEditorTypeName(caf::PdmUiFilePathEditor::uiEditorTypeName()); + CAF_PDM_InitField(&m_userDescription, "PolyLineDescription", QString(""), "Name", "", "", ""); + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPolyLinesFromFileAnnotation::~RimPolyLinesFromFileAnnotation() +{ + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolyLinesFromFileAnnotation::setFileName(const QString& fileName) +{ + m_polyLinesFileName = fileName; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const QString& RimPolyLinesFromFileAnnotation::fileName() +{ + return m_polyLinesFileName(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolyLinesFromFileAnnotation::readPolyLinesFile(QString * errorMessage) +{ + QFile dataFile(m_polyLinesFileName()); + + if (!dataFile.open(QFile::ReadOnly)) + { + if (errorMessage) (*errorMessage) += "Could not open the File: " + (m_polyLinesFileName()) + "\n"; + return; + } + + m_polyLinesData = new RigPolyLinesData; + + std::vector< std::vector< cvf::Vec3d > > polylines(1); + + QTextStream stream(&dataFile); + int lineNumber = 1; + while (!stream.atEnd()) + { + QString line = stream.readLine(); + QStringList commentLineSegs = line.split("#", QString::KeepEmptyParts); + if(commentLineSegs.size() == 0) continue; // Empty line + + + QStringList lineSegs = commentLineSegs[0].split(QRegExp("\\s+"), QString::SkipEmptyParts); + + if(lineSegs.size() == 0) continue; // No data + if(lineSegs.size() != 3) + { + if (errorMessage) (*errorMessage) += "Unexpected number of words on line: " + QString::number(lineNumber) + "\n"; + continue; + } + + if (lineSegs.size() == 3) // Normal case + { + bool isNumberParsingOk = true; + bool isOk = true; + double x = lineSegs[0].toDouble(&isOk); isNumberParsingOk &= isOk; + double y = lineSegs[1].toDouble(&isOk); isNumberParsingOk &= isOk; + double z = lineSegs[2].toDouble(&isOk); isNumberParsingOk &= isOk; + + if (!isNumberParsingOk) + { + if (errorMessage) (*errorMessage) += "Could not read the point at line: " + QString::number(lineNumber) + "\n"; + continue; + } + + if (x == 999.0 && y == 999.0 && z == 999.0) // New PolyLine + { + polylines.push_back(std::vector()); + continue; + } + + cvf::Vec3d point(x, y, -z); + polylines.back().push_back(point); + + } + + ++lineNumber; + } + + if ( polylines.back().empty() ) + { + polylines.pop_back(); + } + + m_polyLinesData->setPolyLines(polylines); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimPolyLinesFromFileAnnotation::isEmpty() +{ + bool isThisEmpty = true; + for (const std::vector & line :m_polyLinesData->polyLines()) + { + if (!line.empty()) return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolyLinesFromFileAnnotation::updateFilePathsFromProjectPath(const QString& newProjectPath, const QString& oldProjectPath) +{ + m_polyLinesFileName = RimTools::relocateFile(m_polyLinesFileName(), newProjectPath, oldProjectPath, nullptr, nullptr); + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPolyLinesFromFileAnnotation::setDescriptionFromFileName() +{ + QFileInfo fileInfo(m_polyLinesFileName()); + m_userDescription = fileInfo.fileName(); + +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimPolyLinesFromFileAnnotation::userDescriptionField() +{ + return &m_userDescription; +} diff --git a/ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.h b/ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.h new file mode 100644 index 0000000000..b67054fbc7 --- /dev/null +++ b/ApplicationCode/ProjectDataModel/RimPolylinesAnnotation.h @@ -0,0 +1,139 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2018- equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmChildArrayField.h" +#include "cafPdmField.h" +#include "cafPdmObject.h" +#include "cafPdmPointer.h" +#include "cafAppEnum.h" +#include "cafPdmUiOrdering.h" + +// Include to make Pdm work for cvf::Color +#include "cafPdmFieldCvfColor.h" +#include "cafPdmChildField.h" +#include "cafPdmFieldCvfVec3d.h" + +#include "cvfObject.h" +#include "cvfVector3.h" + +#include + +class QString; +class RimGridView; +class RigPolyLinesData; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimPolylinesAnnotation : public caf::PdmObject +{ + using Vec3d = cvf::Vec3d; + + CAF_PDM_HEADER_INIT; + +public: + RimPolylinesAnnotation(); + ~RimPolylinesAnnotation(); + + virtual cvf::ref polyLinesData() = 0; + virtual bool isEmpty() = 0; + +protected: + virtual caf::PdmFieldHandle* objectToggleField() override; + +private: + caf::PdmField> m_points; + caf::PdmField m_isActive; +}; + +//================================================================================================== +/// +/// +//================================================================================================== + +class RimUserDefinedPolyLinesAnnotation : public RimPolylinesAnnotation +{ + using Vec3d = cvf::Vec3d; + + CAF_PDM_HEADER_INIT; +public: + RimUserDefinedPolyLinesAnnotation(); + ~RimUserDefinedPolyLinesAnnotation(); + + cvf::ref polyLinesData() override; + virtual bool isEmpty() override; + +protected: + void defineUiOrdering(QString uiConfigName, caf::PdmUiOrdering& uiOrdering) override; + void fieldChangedByUi(const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue) override; + +private: + caf::PdmField> m_points; +}; + +//================================================================================================== +/// +/// +//================================================================================================== + + +class RimPolyLinesFromFileAnnotation : public RimPolylinesAnnotation +{ + CAF_PDM_HEADER_INIT; +public: + RimPolyLinesFromFileAnnotation(); + ~RimPolyLinesFromFileAnnotation(); + + void setFileName(const QString& fileName); + const QString& fileName(); + void readPolyLinesFile(QString * errorMessage); + + + cvf::ref polyLinesData() override { return m_polyLinesData;} + virtual bool isEmpty() override; + + void updateFilePathsFromProjectPath(const QString& newProjectPath, const QString& oldProjectPath); + void setDescriptionFromFileName(); + +private: + virtual caf::PdmFieldHandle* userDescriptionField() override; + + caf::PdmField m_userDescription; + caf::PdmField m_polyLinesFileName; + cvf::ref m_polyLinesData; +}; + + +//================================================================================================== +/// +/// +//================================================================================================== +class RigPolyLinesData : public cvf::Object +{ +public: + RigPolyLinesData() {} + + const std::vector >& polyLines() const { return m_polylines;} + void setPolyLines(const std::vector >& polyLines) { m_polylines = polyLines;} + +private: + std::vector > m_polylines; +}; \ No newline at end of file diff --git a/ApplicationCode/ProjectDataModel/RimProject.cpp b/ApplicationCode/ProjectDataModel/RimProject.cpp index 096e3e07c3..9c65aca32b 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationCode/ProjectDataModel/RimProject.cpp @@ -31,6 +31,8 @@ #include "RigGridBase.h" #include "RimAnnotationCollection.h" +#include "RimPolylinesAnnotation.h" + #include "RimCalcScript.h" #include "RimCase.h" #include "RimCaseCollection.h" @@ -995,9 +997,9 @@ std::vector RimProject::reachCircleAnnotations() cons //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimProject::polylineAnnotations() const +std::vector RimProject::polylineAnnotations() const { - std::vector annotations; + std::vector annotations; for (const auto& oilField : oilFields()) { auto annotationColl = oilField->annotationCollection(); @@ -1005,6 +1007,12 @@ std::vector RimProject::polylineAnnotations() const { annotations.push_back(annotation); } + + for (const auto& annotation : annotationColl->polylinesFromFileAnnotations()) + { + annotations.push_back(annotation); + } + } return annotations; } diff --git a/ApplicationCode/ProjectDataModel/RimProject.h b/ApplicationCode/ProjectDataModel/RimProject.h index ba2697a364..4a9c87ea3c 100644 --- a/ApplicationCode/ProjectDataModel/RimProject.h +++ b/ApplicationCode/ProjectDataModel/RimProject.h @@ -37,7 +37,7 @@ class RigWellPath; class RimTextAnnotation; class RimReachCircleAnnotation; -class RimPolylineAnnotation; +class RimPolylinesAnnotation; class RimSummaryCalculationCollection; class RimCase; class RimCommandObject; @@ -147,7 +147,7 @@ public: std::vector allWellPaths() const; std::vector textAnnotations() const; std::vector reachCircleAnnotations() const; - std::vector polylineAnnotations() const; + std::vector polylineAnnotations() const; std::vector geoMechCases() const;