#3757 Add selection of text annotations by picking

This commit is contained in:
Jacob Støren 2018-12-03 10:53:40 +01:00
parent e984b06ea6
commit a13201e42e
4 changed files with 98 additions and 52 deletions

View File

@ -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<RimTextAnnotation*>( this->object() );
}

View File

@ -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);

View File

@ -100,6 +100,11 @@
#include <QStatusBar>
#include <array>
#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<RicDefaultPickEventHandler*> RiuViewerCommands::sm_defaultPickEventHandlers;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -522,12 +526,14 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM
std::vector<RiuPickItemInfo> 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<RimFracture*>(rivObjectSourceInfo->object());
if ( fracture )
{
bool blockSelectionOfFracture = false;
if (fracture)
{
std::vector<caf::PdmUiItem*> uiItems;
RiuMainWindow::instance()->projectTreeView()->selectedUiItems(uiItems);
bool blockSelectionOfFracture = false;
if (uiItems.size() == 1)
{
auto selectedFractureTemplate = dynamic_cast<RimFractureTemplate*>(uiItems[0]);
std::vector<caf::PdmUiItem*> uiItems;
RiuMainWindow::instance()->projectTreeView()->selectedUiItems(uiItems);
if (selectedFractureTemplate != nullptr && selectedFractureTemplate == fracture->fractureTemplate())
if ( uiItems.size() == 1 )
{
blockSelectionOfFracture = true;
auto selectedFractureTemplate = dynamic_cast<RimFractureTemplate*>(uiItems[0]);
if ( selectedFractureTemplate != nullptr && selectedFractureTemplate == fracture->fractureTemplate() )
{
blockSelectionOfFracture = true;
}
}
}
if ( !blockSelectionOfFracture )
{
RiuMainWindow::instance()->selectAsCurrentItem(fracture);
}
}
if (!blockSelectionOfFracture)
RimStimPlanFractureTemplate* stimPlanTempl = fracture ? dynamic_cast<RimStimPlanFractureTemplate*>(fracture->fractureTemplate()) : nullptr;
RimEllipseFractureTemplate* ellipseTempl = fracture ? dynamic_cast<RimEllipseFractureTemplate*>(fracture->fractureTemplate()) : nullptr;
if ( stimPlanTempl || ellipseTempl )
{
RiuMainWindow::instance()->selectAsCurrentItem(fracture);
// Set fracture resultInfo text
QString resultInfoText;
cvf::ref<caf::DisplayCoordTransform> transForm = m_reservoirView->displayCoordTransform();
cvf::Vec3d domainCoord = transForm->transformToDomainCoord(globalIntersectionPoint);
RimEclipseView* eclView = dynamic_cast<RimEclipseView*>(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<RimStimPlanFractureTemplate*>(fracture->fractureTemplate()) : nullptr;
RimEllipseFractureTemplate* ellipseTempl = fracture ? dynamic_cast<RimEllipseFractureTemplate*>(fracture->fractureTemplate()) : nullptr;
if (stimPlanTempl || ellipseTempl)
RimTextAnnotation* textAnnot = dynamic_cast<RimTextAnnotation*>(rivObjectSourceInfo->object());
if (textAnnot)
{
// Set fracture resultInfo text
QString resultInfoText;
cvf::ref<caf::DisplayCoordTransform> transForm = m_reservoirView->displayCoordTransform();
cvf::Vec3d domainCoord = transForm->transformToDomainCoord(globalIntersectionPoint);
RimEclipseView* eclView = dynamic_cast<RimEclipseView*>(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<Part> partCollection;
scene->allParts(&partCollection);
ref<Ray> 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<DrawableText*> (partCollection[pIdx]->drawable());
if (textDrawable)
{
cvf::Vec3d ppoint;
if (textDrawable->rayIntersect(*ray, *( m_viewer->mainCamera()), &ppoint))
{
cvf::ref<HitItem> hitItem = new HitItem(0, ppoint);
hitItem->setPart(partCollection[pIdx].p());
hitItems->add(hitItem.p());
}
}
}
}
hitItems->sort();
}

View File

@ -89,4 +89,5 @@ private:
static RicPickEventHandler* sm_overridingPickHandler;
static std::vector<RicDefaultPickEventHandler*> sm_defaultPickEventHandlers;
void handleTextPicking(int winPosX, int winPosY, cvf::HitItemCollection* hitItems);
};