From dc1e675b3716b6c2fc73603f187aa11226e51d59 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Thu, 8 Feb 2024 10:07:42 +0100 Subject: [PATCH] Move findActiveTargetsAroundInsertionPoint to base class --- .../RicNewPolylineTargetFeature.cpp | 55 ++++++++----------- .../RimUserDefinedPolylinesAnnotation.cpp | 25 --------- .../RimUserDefinedPolylinesAnnotation.h | 2 - .../ProjectDataModel/CMakeLists_files.cmake | 1 + .../RimPolylinePickerInterface.cpp | 48 ++++++++++++++++ .../RimPolylinePickerInterface.h | 2 + 6 files changed, 75 insertions(+), 58 deletions(-) create mode 100644 ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.cpp diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicNewPolylineTargetFeature.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicNewPolylineTargetFeature.cpp index 013eadff30..eec85c6ce3 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/RicNewPolylineTargetFeature.cpp +++ b/ApplicationLibCode/Commands/WellPathCommands/RicNewPolylineTargetFeature.cpp @@ -21,21 +21,23 @@ CAF_CMD_SOURCE_INIT( RicNewPolylineTargetFeature, "RicNewPolylineTargetFeature" #include "RimCase.h" #include "RimGridView.h" +#include "RimPolylinePickerInterface.h" #include "RimPolylineTarget.h" #include "RimProject.h" -#include "RimUserDefinedPolylinesAnnotation.h" + #include "cafSelectionManager.h" -#include #include "cvfBoundingBox.h" +#include + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RicNewPolylineTargetFeature::isCommandEnabled() const { { - std::vector objects; + std::vector objects; caf::SelectionManager::instance()->objectsByType( &objects ); if ( !objects.empty() ) @@ -66,7 +68,7 @@ void RicNewPolylineTargetFeature::onActionTriggered( bool isChecked ) if ( !selectedTargets.empty() ) { auto firstTarget = selectedTargets.front(); - RimUserDefinedPolylinesAnnotation* polylineDef = firstTarget->firstAncestorOrThisOfTypeAsserted(); + auto polylineDef = firstTarget->firstAncestorOrThisOfTypeAsserted(); auto afterBeforePair = polylineDef->findActiveTargetsAroundInsertionPoint( firstTarget ); @@ -109,49 +111,40 @@ void RicNewPolylineTargetFeature::onActionTriggered( bool isChecked ) return; } - std::vector polylineDefs; + std::vector polylineDefs; caf::SelectionManager::instance()->objectsByType( &polylineDefs ); if ( !polylineDefs.empty() ) { auto* polylineDef = polylineDefs[0]; std::vector activeTargets = polylineDef->activeTargets(); + cvf::Vec3d newPos = cvf::Vec3d::ZERO; + size_t targetCount = activeTargets.size(); - - if ( targetCount == 0 ) + if ( targetCount > 1 ) + { + newPos = activeTargets[targetCount - 1]->targetPointXYZ(); + cvf::Vec3d nextLastToLast = newPos - activeTargets[targetCount - 2]->targetPointXYZ(); + newPos += 0.5 * nextLastToLast; + } + else if ( targetCount > 0 ) + { + newPos = activeTargets[targetCount - 1]->targetPointXYZ() + cvf::Vec3d( 0, 0, 200 ); + } + else { - auto defaultPos = cvf::Vec3d::ZERO; - - // Set decent position std::vector gridViews; RimProject::current()->allVisibleGridViews( gridViews ); if ( !gridViews.empty() ) { auto minPos = gridViews.front()->ownerCase()->allCellsBoundingBox().min(); - defaultPos = minPos; + newPos = minPos; } - - polylineDef->appendTarget( defaultPos ); } - else - { - cvf::Vec3d newPos = cvf::Vec3d::ZERO; - if ( targetCount > 1 ) - { - newPos = activeTargets[targetCount - 1]->targetPointXYZ(); - cvf::Vec3d nextLastToLast = newPos - activeTargets[targetCount - 2]->targetPointXYZ(); - newPos += 0.5 * nextLastToLast; - } - else if ( targetCount > 0 ) - { - newPos = activeTargets[targetCount - 1]->targetPointXYZ() + cvf::Vec3d( 0, 0, 200 ); - } - - auto* newTarget = new RimPolylineTarget; - newTarget->setAsPointTargetXYD( { newPos[0], newPos[1], -newPos[2] } ); - polylineDef->insertTarget( nullptr, newTarget ); - } + auto* newTarget = new RimPolylineTarget; + newTarget->setAsPointTargetXYD( { newPos[0], newPos[1], -newPos[2] } ); + polylineDef->insertTarget( nullptr, newTarget ); polylineDef->updateEditorsAndVisualization(); } diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.cpp index 82916de56c..95ce19c8b3 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.cpp @@ -152,31 +152,6 @@ void RimUserDefinedPolylinesAnnotation::deleteTarget( RimPolylineTarget* targetT delete targetToDelete; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::pair - RimUserDefinedPolylinesAnnotation::findActiveTargetsAroundInsertionPoint( const RimPolylineTarget* targetToInsertBefore ) -{ - RimPolylineTarget* before = nullptr; - RimPolylineTarget* after = nullptr; - - bool foundTarget = false; - for ( const auto& wt : m_targets ) - { - if ( wt == targetToInsertBefore ) - { - foundTarget = true; - } - - if ( wt->isEnabled() && !after && foundTarget ) after = wt; - - if ( wt->isEnabled() && !foundTarget ) before = wt; - } - - return { before, after }; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.h index 9afb83e562..000a2492e2 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimUserDefinedPolylinesAnnotation.h @@ -60,8 +60,6 @@ public: void appendTarget( const cvf::Vec3d& defaultPos = cvf::Vec3d::ZERO ); - std::pair findActiveTargetsAroundInsertionPoint( const RimPolylineTarget* targetToInsertBefore ); - void enablePicking( bool enable ); protected: diff --git a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake index 6b50a735aa..d3366768f1 100644 --- a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake @@ -267,6 +267,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimResultSelectionUi.cpp ${CMAKE_CURRENT_LIST_DIR}/RimPlotRectAnnotation.cpp ${CMAKE_CURRENT_LIST_DIR}/RimEmCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinePickerInterface.cpp ) if(RESINSIGHT_USE_QT_CHARTS) diff --git a/ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.cpp b/ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.cpp new file mode 100644 index 0000000000..9ca78cfffd --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.cpp @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020 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 "RimPolylinePickerInterface.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair + RimPolylinePickerInterface::findActiveTargetsAroundInsertionPoint( const RimPolylineTarget* targetToInsertBefore ) +{ + auto targets = activeTargets(); + + RimPolylineTarget* before = nullptr; + RimPolylineTarget* after = nullptr; + + bool foundTarget = false; + for ( const auto& wt : targets ) + { + if ( wt == targetToInsertBefore ) + { + foundTarget = true; + } + + if ( wt->isEnabled() && !after && foundTarget ) after = wt; + + if ( wt->isEnabled() && !foundTarget ) before = wt; + } + + return { before, after }; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.h b/ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.h index 5a99bed648..26e53beaf9 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.h +++ b/ApplicationLibCode/ProjectDataModel/RimPolylinePickerInterface.h @@ -33,4 +33,6 @@ public: virtual std::vector activeTargets() const = 0; virtual bool pickingEnabled() const = 0; virtual caf::PickEventHandler* pickEventHandler() const = 0; + + std::pair findActiveTargetsAroundInsertionPoint( const RimPolylineTarget* targetToInsertBefore ); };