mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-03-27 06:38:37 +05:00
334 lines
10 KiB
C++
Executable File
334 lines
10 KiB
C++
Executable File
// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
|
|
//
|
|
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
|
|
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// This library 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
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
|
|
//
|
|
|
|
// GEOM GEOMGUI : GUI for Geometry component
|
|
// File : MeasureGUI_AnnotationInteractor.cxx
|
|
// Author : Anton POLETAEV, Open CASCADE S.A.S.
|
|
|
|
#include "MeasureGUI_AnnotationInteractor.h"
|
|
|
|
// SALOME includes
|
|
#include <GeometryGUI.h>
|
|
#include <OCCViewer_ViewManager.h>
|
|
#include <OCCViewer_ViewPort3d.h>
|
|
#include <OCCViewer_ViewWindow.h>
|
|
#include <SUIT_ViewManager.h>
|
|
#include <SUIT_ViewWindow.h>
|
|
#include <SUIT_Desktop.h>
|
|
#include <SalomeApp_Application.h>
|
|
|
|
// Qt includes
|
|
#include <QMouseEvent>
|
|
|
|
// OCCT includes
|
|
#include <V3d_View.hxx>
|
|
|
|
//=================================================================================
|
|
// function : Constructor
|
|
// purpose :
|
|
//=================================================================================
|
|
MeasureGUI_AnnotationInteractor::MeasureGUI_AnnotationInteractor( GeometryGUI* theGUI,
|
|
QObject* theParent )
|
|
: QObject( theParent ),
|
|
myGeomGUI( theGUI ),
|
|
myIsEnabled( false ),
|
|
myVM( NULL ),
|
|
myViewer( NULL ),
|
|
myActiveViewPort( NULL )
|
|
{
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : Deactivate
|
|
// purpose :
|
|
//=================================================================================
|
|
MeasureGUI_AnnotationInteractor::~MeasureGUI_AnnotationInteractor()
|
|
{
|
|
if ( myActiveViewPort )
|
|
{
|
|
myActiveViewPort->releaseMouse();
|
|
myActiveViewPort = NULL;
|
|
}
|
|
|
|
Disable();
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : Enable
|
|
// purpose : Enables event processing and interaction handlers.
|
|
//=================================================================================
|
|
void MeasureGUI_AnnotationInteractor::Enable()
|
|
{
|
|
if ( myIsEnabled )
|
|
{
|
|
return;
|
|
}
|
|
|
|
myIsEnabled = true;
|
|
|
|
// install event filtering on viewer windows
|
|
SalomeApp_Application* anApp = myGeomGUI->getApp();
|
|
if ( !anApp )
|
|
{
|
|
return;
|
|
}
|
|
|
|
myVM = (OCCViewer_ViewManager*) anApp->getViewManager( OCCViewer_Viewer::Type(), false );
|
|
myViewer = (OCCViewer_Viewer*) myVM->getViewModel();
|
|
if ( !myVM || !myViewer )
|
|
{
|
|
return;
|
|
}
|
|
|
|
connect( myVM, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), SLOT( OnViewCreated( SUIT_ViewWindow* ) ) );
|
|
connect( myVM, SIGNAL( deleteView ( SUIT_ViewWindow* ) ), SLOT( OnViewRemoved( SUIT_ViewWindow* ) ) );
|
|
|
|
QVector<SUIT_ViewWindow*> aViews = myVM->getViews();
|
|
QVector<SUIT_ViewWindow*>::iterator aViewIt = aViews.begin();
|
|
for ( ; aViewIt != aViews.end(); ++aViewIt )
|
|
{
|
|
ConnectView( *aViewIt );
|
|
}
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : Disable
|
|
// purpose : Disables event processing and interaction handlers.
|
|
//=================================================================================
|
|
void MeasureGUI_AnnotationInteractor::Disable()
|
|
{
|
|
if ( !myIsEnabled )
|
|
{
|
|
return;
|
|
}
|
|
|
|
myIsEnabled = false;
|
|
|
|
// remove event filtering from viewer windows
|
|
QVector<SUIT_ViewWindow*> aViews = myVM->getViews();
|
|
QVector<SUIT_ViewWindow*>::iterator aViewIt = aViews.begin();
|
|
for ( ; aViewIt != aViews.end(); ++aViewIt )
|
|
{
|
|
DisconnectView( *aViewIt );
|
|
}
|
|
|
|
if ( myActiveViewPort )
|
|
{
|
|
myActiveViewPort->releaseMouse();
|
|
myActiveViewPort = NULL;
|
|
}
|
|
|
|
if ( !myActiveIO.IsNull() )
|
|
{
|
|
emit SignalInteractionFinished( myActiveIO );
|
|
myActiveIO.Nullify();
|
|
}
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : ConnectView
|
|
// purpose : Connect interactor's event handler to the view window given.
|
|
//=================================================================================
|
|
void MeasureGUI_AnnotationInteractor::ConnectView( SUIT_ViewWindow* theView )
|
|
{
|
|
( (OCCViewer_ViewWindow*) theView )->getViewPort()->installEventFilter( this );
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : DisconnectView
|
|
// purpose : Disconnect interactor's event handler from the view window given.
|
|
//=================================================================================
|
|
void MeasureGUI_AnnotationInteractor::DisconnectView( SUIT_ViewWindow* theView )
|
|
{
|
|
( (OCCViewer_ViewWindow*) theView )->getViewPort()->removeEventFilter( this );
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : OnViewCreated
|
|
// purpose : Handler for signal coming from GUI layer.
|
|
//=================================================================================
|
|
void MeasureGUI_AnnotationInteractor::OnViewCreated( SUIT_ViewWindow* theView )
|
|
{
|
|
ConnectView( theView );
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : OnViewRemoved
|
|
// purpose : Handler for signal coming from GUI layer.
|
|
//=================================================================================
|
|
void MeasureGUI_AnnotationInteractor::OnViewRemoved( SUIT_ViewWindow* theView )
|
|
{
|
|
DisconnectView( theView );
|
|
}
|
|
|
|
//=================================================================================
|
|
// function : eventFilter
|
|
// purpose : Hooks and process events from OCCT viewer prior to their coming into the base viewer class.
|
|
//=================================================================================
|
|
bool MeasureGUI_AnnotationInteractor::eventFilter( QObject* theObject, QEvent* theEvent )
|
|
{
|
|
OCCViewer_ViewPort3d* aViewPort = (OCCViewer_ViewPort3d*)theObject;
|
|
|
|
const Handle(V3d_View) aView3d = aViewPort->getView();
|
|
|
|
switch( theEvent->type() )
|
|
{
|
|
// ------------------------------------------------------------------------
|
|
// Start dragging ("grab") event
|
|
// ------------------------------------------------------------------------
|
|
case QEvent::MouseButtonPress :
|
|
{
|
|
QMouseEvent* aMouseEv = dynamic_cast<QMouseEvent*>( theEvent );
|
|
|
|
if ( myEditEntry.isEmpty() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( !( aMouseEv->buttons() & Qt::LeftButton ) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
const Handle(AIS_InteractiveContext) anAISContext = myViewer->getAISContext();
|
|
|
|
anAISContext->MoveTo( aMouseEv->x(), aMouseEv->y(), aView3d );
|
|
|
|
if ( !anAISContext->HasDetected() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
const Handle(SelectMgr_EntityOwner) aDetected = anAISContext->DetectedOwner();
|
|
|
|
if( aDetected.IsNull() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
const Handle(GEOM_Annotation) aAnnotation =
|
|
Handle(GEOM_Annotation)::DownCast( aDetected->Selectable() );
|
|
|
|
if ( aAnnotation.IsNull() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
const Handle(SALOME_InteractiveObject) anIO =
|
|
Handle(SALOME_InteractiveObject)::DownCast( aAnnotation->GetOwner() );
|
|
|
|
if ( anIO.IsNull() || anIO->getEntry() != myEditEntry )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
myStartPoint = aMouseEv->pos();
|
|
mySelection.Clear();
|
|
|
|
for ( anAISContext->InitSelected(); anAISContext->MoreSelected(); anAISContext->NextSelected() )
|
|
{
|
|
mySelection.Append( anAISContext->SelectedOwner() );
|
|
}
|
|
|
|
anAISContext->ClearSelected( Standard_False );
|
|
anAISContext->Unhilight( myActiveIO, Standard_True );
|
|
|
|
myActiveViewPort = aViewPort;
|
|
myActiveViewPort->grabMouse();
|
|
myActiveIO = aAnnotation;
|
|
myActiveIO->BeginDrag();
|
|
|
|
emit SignalInteractionStarted( myActiveIO );
|
|
|
|
return true;
|
|
}
|
|
|
|
// ------------------------------------------------------------------------
|
|
// Perform dragging operation
|
|
// ------------------------------------------------------------------------
|
|
case QEvent::MouseMove :
|
|
{
|
|
QMouseEvent* aMouseEv = (QMouseEvent*) theEvent;
|
|
|
|
if ( !myActiveIO.IsNull() )
|
|
{
|
|
const Handle(AIS_InteractiveContext) anAISContext = myViewer->getAISContext();
|
|
|
|
if ( anAISContext->IsHilighted( myActiveIO ) )
|
|
{
|
|
anAISContext->Unhilight( myActiveIO, Standard_False );
|
|
}
|
|
|
|
const QPoint aDelta = aMouseEv->pos() - myStartPoint;
|
|
myActiveIO->Drag( aDelta.x(), (-aDelta.y()), aView3d );
|
|
anAISContext->Update( myActiveIO, Standard_False );
|
|
anAISContext->UpdateCurrentViewer();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ------------------------------------------------------------------------
|
|
// Stop dragging operation
|
|
// ------------------------------------------------------------------------
|
|
case QEvent::FocusOut :
|
|
case QEvent::MouseButtonRelease :
|
|
{
|
|
QMouseEvent* aMouseEv = (QMouseEvent*) theEvent;
|
|
|
|
if ( myActiveViewPort )
|
|
{
|
|
myActiveViewPort->releaseMouse();
|
|
myActiveViewPort = NULL;
|
|
}
|
|
if ( !myActiveIO.IsNull() )
|
|
{
|
|
myActiveIO->EndDrag();
|
|
|
|
const Handle(AIS_InteractiveContext) anAISContext = myViewer->getAISContext();
|
|
|
|
anAISContext->ClearSelected( Standard_False );
|
|
SelectMgr_SequenceOfOwner::Iterator anIt( mySelection );
|
|
for( ; anIt.More(); anIt.Next() )
|
|
{
|
|
anAISContext->AddOrRemoveSelected( anIt.Value(), Standard_False );
|
|
}
|
|
|
|
anAISContext->Update( myActiveIO, Standard_False );
|
|
anAISContext->UpdateCurrentViewer();
|
|
anAISContext->MoveTo( aMouseEv->pos().x(), aMouseEv->pos().y(), aView3d );
|
|
|
|
emit SignalInteractionFinished( myActiveIO );
|
|
|
|
mySelection.Clear();
|
|
myActiveIO.Nullify();
|
|
return (theEvent->type() == QEvent::MouseButtonRelease);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
default: return false;
|
|
}
|
|
}
|