#4857 Fix Intersection Box 3d manipulator interaction in comparison views

This commit is contained in:
Jacob Støren
2019-10-31 09:49:33 +01:00
parent e62645341c
commit 1ef4d49f14
3 changed files with 40 additions and 9 deletions

View File

@@ -29,6 +29,7 @@
#include "cvfModelBasicList.h" #include "cvfModelBasicList.h"
#include "cvfPart.h" #include "cvfPart.h"
#include "cvfRay.h" #include "cvfRay.h"
#include "cvfRayIntersectSpec.h"
#include <QDebug> #include <QDebug>
#include <QMouseEvent> #include <QMouseEvent>
@@ -50,6 +51,26 @@ RicBoxManipulatorEventHandler::RicBoxManipulatorEventHandler( caf::Viewer* viewe
RicBoxManipulatorEventHandler::~RicBoxManipulatorEventHandler() RicBoxManipulatorEventHandler::~RicBoxManipulatorEventHandler()
{ {
if ( m_viewer ) m_viewer->removeEventFilter( this ); if ( m_viewer ) m_viewer->removeEventFilter( this );
for ( auto viewer : m_otherViewers )
{
if ( viewer )
{
m_viewer->removeEventFilter( this );
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicBoxManipulatorEventHandler::registerInAdditionalViewer( caf::Viewer* viewer )
{
if ( viewer )
{
m_otherViewers.push_back( viewer );
viewer->installEventFilter( this );
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -85,6 +106,10 @@ void RicBoxManipulatorEventHandler::appendPartsToModel( cvf::ModelBasicList* mod
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicBoxManipulatorEventHandler::eventFilter( QObject* obj, QEvent* inputEvent ) bool RicBoxManipulatorEventHandler::eventFilter( QObject* obj, QEvent* inputEvent )
{ {
caf::Viewer* viewer = dynamic_cast<caf::Viewer*>( obj );
if ( !viewer ) return false;
if ( inputEvent->type() == QEvent::MouseButtonPress ) if ( inputEvent->type() == QEvent::MouseButtonPress )
{ {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>( inputEvent ); QMouseEvent* mouseEvent = static_cast<QMouseEvent*>( inputEvent );
@@ -92,7 +117,7 @@ bool RicBoxManipulatorEventHandler::eventFilter( QObject* obj, QEvent* inputEven
if ( mouseEvent->button() == Qt::LeftButton ) if ( mouseEvent->button() == Qt::LeftButton )
{ {
cvf::HitItemCollection hitItems; cvf::HitItemCollection hitItems;
if ( m_viewer->rayPick( mouseEvent->x(), mouseEvent->y(), &hitItems ) ) if ( viewer->rayPick( mouseEvent->x(), mouseEvent->y(), &hitItems ) )
{ {
m_partManager->tryToActivateManipulator( hitItems.firstItem() ); m_partManager->tryToActivateManipulator( hitItems.firstItem() );
@@ -111,16 +136,12 @@ bool RicBoxManipulatorEventHandler::eventFilter( QObject* obj, QEvent* inputEven
{ {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>( inputEvent ); QMouseEvent* mouseEvent = static_cast<QMouseEvent*>( inputEvent );
// qDebug() << "Inside mouse move"; cvf::ref<cvf::RayIntersectSpec> rayIS =
// qDebug() << mouseEvent->pos(); viewer->rayIntersectSpecFromWindowCoordinates( mouseEvent->pos().x(), mouseEvent->pos().y() );
int translatedMousePosX = mouseEvent->pos().x(); if (rayIS.notNull())
int translatedMousePosY = m_viewer->height() - mouseEvent->pos().y();
cvf::ref<cvf::Ray> ray = m_viewer->mainCamera()->rayFromWindowCoordinates( translatedMousePosX,
translatedMousePosY );
{ {
m_partManager->updateManipulatorFromRay( ray.p() ); m_partManager->updateManipulatorFromRay( rayIS->ray() );
cvf::Vec3d origin; cvf::Vec3d origin;
cvf::Vec3d size; cvf::Vec3d size;

View File

@@ -52,6 +52,8 @@ public:
explicit RicBoxManipulatorEventHandler( caf::Viewer* viewer ); explicit RicBoxManipulatorEventHandler( caf::Viewer* viewer );
~RicBoxManipulatorEventHandler() override; ~RicBoxManipulatorEventHandler() override;
void registerInAdditionalViewer( caf::Viewer* viewer);
void setOrigin( const cvf::Vec3d& origin ); void setOrigin( const cvf::Vec3d& origin );
void setSize( const cvf::Vec3d& size ); void setSize( const cvf::Vec3d& size );
@@ -66,6 +68,7 @@ protected:
private: private:
QPointer<caf::Viewer> m_viewer; QPointer<caf::Viewer> m_viewer;
std::vector<QPointer<caf::Viewer>> m_otherViewers;
cvf::ref<caf::BoxManipulatorPartManager> m_partManager; cvf::ref<caf::BoxManipulatorPartManager> m_partManager;
}; };

View File

@@ -311,6 +311,13 @@ void RimIntersectionBox::fieldChangedByUi( const caf::PdmFieldHandle* changedFie
{ {
m_boxManipulator = new RicBoxManipulatorEventHandler( viewer() ); m_boxManipulator = new RicBoxManipulatorEventHandler( viewer() );
Rim3dView* rimView = nullptr;
this->firstAncestorOrThisOfType( rimView );
for (Rim3dView * mainView : rimView->viewsUsingThisAsComparisonView())
{
m_boxManipulator->registerInAdditionalViewer( mainView->viewer());
}
connect( m_boxManipulator, SIGNAL( notifyRedraw() ), this, SLOT( slotScheduleRedraw() ) ); connect( m_boxManipulator, SIGNAL( notifyRedraw() ), this, SLOT( slotScheduleRedraw() ) );
connect( m_boxManipulator, connect( m_boxManipulator,
SIGNAL( notifyUpdate( const cvf::Vec3d&, const cvf::Vec3d& ) ), SIGNAL( notifyUpdate( const cvf::Vec3d&, const cvf::Vec3d& ) ),