diff --git a/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.cpp b/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.cpp index 69e0f05812..c8f2c39532 100644 --- a/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.cpp +++ b/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.cpp @@ -1,7 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2015- Statoil ASA -// Copyright (C) 2015- Ceetron Solutions 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 @@ -19,15 +18,13 @@ #include "RivTextAnnotationSourceInfo.h" -#include "RimEclipseView.h" -#include "RimAnnotationInViewCollection.h" #include "RimTextAnnotation.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RivTextAnnotationSourceInfo::RivTextAnnotationSourceInfo(RimTextAnnotation* annotation) - : m_annotation(annotation) + : RivObjectSourceInfo(annotation) { } @@ -36,5 +33,5 @@ RivTextAnnotationSourceInfo::RivTextAnnotationSourceInfo(RimTextAnnotation* anno //-------------------------------------------------------------------------------------------------- RimTextAnnotation* RivTextAnnotationSourceInfo::annotation() const { - return m_annotation.p(); + return dynamic_cast( this->object() ); } diff --git a/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.h b/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.h index cc546fcd49..5421050272 100644 --- a/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.h +++ b/ApplicationCode/ModelVisualization/RivTextAnnotationSourceInfo.h @@ -1,7 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2015- Statoil ASA -// Copyright (C) 2015- Ceetron Solutions 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 @@ -19,14 +18,11 @@ #pragma once -#include "cvfBase.h" -#include "cvfObject.h" -#include "cafPdmPointer.h" +#include "RivObjectSourceInfo.h" -//class RimAnnotationInView; class RimTextAnnotation; -class RivTextAnnotationSourceInfo : public cvf::Object +class RivTextAnnotationSourceInfo : public RivObjectSourceInfo { public: RivTextAnnotationSourceInfo(RimTextAnnotation* annotation); diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.cpp b/ApplicationCode/UserInterface/RiuViewerCommands.cpp index 8076d2b66d..5fd8d323ec 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationCode/UserInterface/RiuViewerCommands.cpp @@ -100,6 +100,11 @@ #include #include +#include "cvfScene.h" +#include "RivPartPriority.h" +#include "cvfDrawableText.h" +#include "cvfRay.h" +#include "RimTextAnnotation.h" @@ -111,7 +116,6 @@ RicPickEventHandler* RiuViewerCommands::sm_overridingPickHandler = nullptr; std::vector RiuViewerCommands::sm_defaultPickEventHandlers; - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -522,12 +526,14 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM std::vector pickItemInfos; { cvf::HitItemCollection hitItems; - if ( m_viewer->rayPick(winPosX, winPosY, &hitItems) ) + m_viewer->rayPick(winPosX, winPosY, &hitItems); + + // Do specialized text pick, since vizfwk does not hit text + handleTextPicking(winPosX, winPosY, &hitItems); + + if ( hitItems.count() ) { - if ( hitItems.count() ) - { - pickItemInfos = RiuPickItemInfo::convertToPickItemInfos(hitItems); - } + pickItemInfos = RiuPickItemInfo::convertToPickItemInfos(hitItems); } } @@ -620,54 +626,62 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM if (rivObjectSourceInfo) { RimFracture* fracture = dynamic_cast(rivObjectSourceInfo->object()); - + if ( fracture ) { - bool blockSelectionOfFracture = false; - if (fracture) { - std::vector uiItems; - RiuMainWindow::instance()->projectTreeView()->selectedUiItems(uiItems); + bool blockSelectionOfFracture = false; - if (uiItems.size() == 1) { - auto selectedFractureTemplate = dynamic_cast(uiItems[0]); + std::vector uiItems; + RiuMainWindow::instance()->projectTreeView()->selectedUiItems(uiItems); - if (selectedFractureTemplate != nullptr && selectedFractureTemplate == fracture->fractureTemplate()) + if ( uiItems.size() == 1 ) { - blockSelectionOfFracture = true; + auto selectedFractureTemplate = dynamic_cast(uiItems[0]); + + if ( selectedFractureTemplate != nullptr && selectedFractureTemplate == fracture->fractureTemplate() ) + { + blockSelectionOfFracture = true; + } } } + + if ( !blockSelectionOfFracture ) + { + RiuMainWindow::instance()->selectAsCurrentItem(fracture); + } } - if (!blockSelectionOfFracture) + + RimStimPlanFractureTemplate* stimPlanTempl = fracture ? dynamic_cast(fracture->fractureTemplate()) : nullptr; + RimEllipseFractureTemplate* ellipseTempl = fracture ? dynamic_cast(fracture->fractureTemplate()) : nullptr; + if ( stimPlanTempl || ellipseTempl ) { - RiuMainWindow::instance()->selectAsCurrentItem(fracture); + // Set fracture resultInfo text + QString resultInfoText; + + cvf::ref transForm = m_reservoirView->displayCoordTransform(); + cvf::Vec3d domainCoord = transForm->transformToDomainCoord(globalIntersectionPoint); + + RimEclipseView* eclView = dynamic_cast(m_reservoirView.p()); + RivWellFracturePartMgr* partMgr = fracture->fracturePartManager(); + if ( eclView ) resultInfoText = partMgr->resultInfoText(*eclView, domainCoord); + + // Set intersection point result text + QString intersectionPointText; + + intersectionPointText.sprintf("Intersection point : Global [E: %.2f, N: %.2f, Depth: %.2f]", domainCoord.x(), domainCoord.y(), -domainCoord.z()); + resultInfoText.append(intersectionPointText); + + // Display result info text + RiuMainWindow::instance()->setResultInfo(resultInfoText); } } - - RimStimPlanFractureTemplate* stimPlanTempl = fracture ? dynamic_cast(fracture->fractureTemplate()) : nullptr; - RimEllipseFractureTemplate* ellipseTempl = fracture ? dynamic_cast(fracture->fractureTemplate()) : nullptr; - if (stimPlanTempl || ellipseTempl) + RimTextAnnotation* textAnnot = dynamic_cast(rivObjectSourceInfo->object()); + if (textAnnot) { - // Set fracture resultInfo text - QString resultInfoText; - - cvf::ref transForm = m_reservoirView->displayCoordTransform(); - cvf::Vec3d domainCoord = transForm->transformToDomainCoord(globalIntersectionPoint); - - RimEclipseView* eclView = dynamic_cast(m_reservoirView.p()); - RivWellFracturePartMgr* partMgr = fracture->fracturePartManager(); - if (eclView) resultInfoText = partMgr->resultInfoText(*eclView, domainCoord); - - // Set intersection point result text - QString intersectionPointText; - - intersectionPointText.sprintf("Intersection point : Global [E: %.2f, N: %.2f, Depth: %.2f]", domainCoord.x(), domainCoord.y(), -domainCoord.z()); - resultInfoText.append(intersectionPointText); - - // Display result info text - RiuMainWindow::instance()->setResultInfo(resultInfoText); + RiuMainWindow::instance()->selectAsCurrentItem(textAnnot, true); } } @@ -1124,3 +1138,41 @@ bool RiuViewerCommands::handleOverlayItemPicking(int winPosX, int winPosY) return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiuViewerCommands::handleTextPicking(int winPosX, int winPosY, cvf::HitItemCollection* hitItems) +{ + using namespace cvf; + + int translatedMousePosX = winPosX; + int translatedMousePosY = m_viewer->height() - winPosY; + + Scene* scene = m_viewer->currentScene(); + Collection partCollection; + scene->allParts(&partCollection); + + ref ray = m_viewer->mainCamera()->rayFromWindowCoordinates(translatedMousePosX, translatedMousePosY); + + for (size_t pIdx = 0; pIdx < partCollection.size(); ++pIdx) + { + if (partCollection[pIdx]->priority() == RivPartPriority::PartType::Text) // Just trying to avoid dyncasting all drawables + { + DrawableText* textDrawable = dynamic_cast (partCollection[pIdx]->drawable()); + if (textDrawable) + { + cvf::Vec3d ppoint; + if (textDrawable->rayIntersect(*ray, *( m_viewer->mainCamera()), &ppoint)) + { + cvf::ref hitItem = new HitItem(0, ppoint); + hitItem->setPart(partCollection[pIdx].p()); + hitItems->add(hitItem.p()); + } + } + } + } + + hitItems->sort(); +} + diff --git a/ApplicationCode/UserInterface/RiuViewerCommands.h b/ApplicationCode/UserInterface/RiuViewerCommands.h index 7ee7e0f410..2d2e317ecc 100644 --- a/ApplicationCode/UserInterface/RiuViewerCommands.h +++ b/ApplicationCode/UserInterface/RiuViewerCommands.h @@ -89,4 +89,5 @@ private: static RicPickEventHandler* sm_overridingPickHandler; static std::vector sm_defaultPickEventHandlers; + void handleTextPicking(int winPosX, int winPosY, cvf::HitItemCollection* hitItems); };