From 614e7a7cc28cb6284764780d409089b88d5b5ed3 Mon Sep 17 00:00:00 2001 From: apo Date: Wed, 5 Oct 2005 14:04:23 +0000 Subject: [PATCH] To customize SpaceMause interaction (introduce magnification functionality) --- src/VVTK/Makefile.in | 1 + src/VVTK/VVTK_Event.h | 44 +++++++++++++++++ src/VVTK/VVTK_InteractorStyle.cxx | 80 ++++++++++++++++++++++++++++++- src/VVTK/VVTK_InteractorStyle.h | 29 +++++++++-- 4 files changed, 147 insertions(+), 7 deletions(-) create mode 100644 src/VVTK/VVTK_Event.h diff --git a/src/VVTK/Makefile.in b/src/VVTK/Makefile.in index 1516f7dc..331be56e 100755 --- a/src/VVTK/Makefile.in +++ b/src/VVTK/Makefile.in @@ -14,6 +14,7 @@ VPATH=.:@srcdir@ # header files EXPORT_HEADERS = \ VVTK.h \ + VVTK_Event.h \ VVTK_ViewManager.h \ VVTK_ViewModel.h \ VVTK_InteractorStyle.h \ diff --git a/src/VVTK/VVTK_Event.h b/src/VVTK/VVTK_Event.h new file mode 100644 index 00000000..793f9b4c --- /dev/null +++ b/src/VVTK/VVTK_Event.h @@ -0,0 +1,44 @@ +// SALOME VTKViewer : build VTK viewer into Salome desktop +// +// Copyright (C) 2003 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. +// +// 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : +// Author : Alexander SLADKOV +// Module : SALOME +// $Header$ + +#ifndef VVTK_Event_h +#define VVTK_Event_h + +#include "SVTK_Event.h" + +namespace VVTK +{ + enum Event + { + SetSMDecreaseMagnificationEvent = SVTK::LastEvent + 100, + SetSMIncreaseMagnificationEvent, + LastEvent + }; +} + +#endif diff --git a/src/VVTK/VVTK_InteractorStyle.cxx b/src/VVTK/VVTK_InteractorStyle.cxx index 31abefa1..43f85d68 100644 --- a/src/VVTK/VVTK_InteractorStyle.cxx +++ b/src/VVTK/VVTK_InteractorStyle.cxx @@ -28,14 +28,17 @@ #include "VVTK_InteractorStyle.h" +#include "SVTK_Selector.h" +#include "VVTK_Event.h" #include #include +#include #include #include #include -#include + //---------------------------------------------------------------------------- vtkStandardNewMacro(VVTK_InteractorStyle); //---------------------------------------------------------------------------- @@ -43,7 +46,9 @@ vtkStandardNewMacro(VVTK_InteractorStyle); VVTK_InteractorStyle ::VVTK_InteractorStyle(): myIsMidButtonDown( false ), - myIsLeftButtonDown( false ) + myIsLeftButtonDown( false ), + mySMDecreaseMagnificationBtn(10), + mySMIncreaseMagnificationBtn(11) { } @@ -215,3 +220,74 @@ void VVTK_InteractorStyle::onFinishOperation() } } } + + +//---------------------------------------------------------------------------- +void +VVTK_InteractorStyle +::SetInteractor( vtkRenderWindowInteractor* theInteractor ) +{ + // register EventCallbackCommand as observer of standard events (keypress, mousemove, etc) + Superclass::SetInteractor( theInteractor ); + + if(theInteractor){ + theInteractor->AddObserver( VVTK::SetSMDecreaseMagnificationEvent, EventCallbackCommand, Priority ); + theInteractor->AddObserver( VVTK::SetSMIncreaseMagnificationEvent, EventCallbackCommand, Priority ); + } +} + +//---------------------------------------------------------------------------- +void +VVTK_InteractorStyle +::ProcessEvents( vtkObject* object, + unsigned long event, + void* clientData, + void* callData ) +{ + if ( clientData ) { + vtkObject* anObject = reinterpret_cast( clientData ); + VVTK_InteractorStyle* self = dynamic_cast( anObject ); + if( self ){ + switch ( event ) { + case VVTK::SetSMDecreaseMagnificationEvent: + self->mySMDecreaseMagnificationBtn = *((int*)callData); + return; + case VVTK::SetSMIncreaseMagnificationEvent: + self->mySMIncreaseMagnificationBtn = *((int*)callData); + return; + } + } + } + + Superclass::ProcessEvents( object, event, clientData, callData ); +} + + +//---------------------------------------------------------------------------- +void +VVTK_InteractorStyle +::onSpaceMouseButton( int button ) +{ + if( mySMDecreaseMagnificationBtn == button ) + DecreaseGaussPointMagnification(); + if( mySMIncreaseMagnificationBtn == button ) + IncreaseGaussPointMagnification(); + + Superclass::onSpaceMouseButton( button ); +} + +//---------------------------------------------------------------------------- +void +VVTK_InteractorStyle +::DecreaseGaussPointMagnification() +{ + printf( "\n--DecreaseGaussPointMagnification() NOT IMPLEMENTED--\n" ); +} + +//---------------------------------------------------------------------------- +void +VVTK_InteractorStyle +::IncreaseGaussPointMagnification() +{ + printf( "\n--IncreaseGaussPointMagnification() NOT IMPLEMENTED--\n" ); +} diff --git a/src/VVTK/VVTK_InteractorStyle.h b/src/VVTK/VVTK_InteractorStyle.h index 245b7f8f..14a9b087 100644 --- a/src/VVTK/VVTK_InteractorStyle.h +++ b/src/VVTK/VVTK_InteractorStyle.h @@ -41,14 +41,19 @@ class VVTK_EXPORT VVTK_InteractorStyle : public SVTK_InteractorStyle // parent. This class should not normally be instantiated by application // programmers. static VVTK_InteractorStyle *New(); - vtkTypeMacro(VVTK_InteractorStyle, vtkInteractorStyle); + vtkTypeMacro(VVTK_InteractorStyle,SVTK_InteractorStyle); + // redefined in order to add an observer (callback) for custorm event (space mouse event) + virtual + void + SetInteractor( vtkRenderWindowInteractor* ); protected: VVTK_InteractorStyle(); ~VVTK_InteractorStyle(); - VVTK_InteractorStyle(const VVTK_InteractorStyle&) {}; - void operator=(const VVTK_InteractorStyle&) {}; + + VVTK_InteractorStyle(const VVTK_InteractorStyle&); // Not implemented + void operator=(const VVTK_InteractorStyle&); // Not implemented // Generic event bindings must be overridden in subclasses virtual void OnLeftButtonDown(int ctrl, int shift, int x, int y); @@ -58,10 +63,24 @@ class VVTK_EXPORT VVTK_InteractorStyle : public SVTK_InteractorStyle virtual void OnKeyDown(); virtual void onFinishOperation(); - private: + // Main process VTK event method + static + void + ProcessEvents(vtkObject* object, + unsigned long event, + void* clientData, + void* callData ); + + virtual void onSpaceMouseButton( int button ); + void DecreaseGaussPointMagnification(); + void IncreaseGaussPointMagnification(); + + // SpaceMouse short cuts + int mySMDecreaseMagnificationBtn; + int mySMIncreaseMagnificationBtn; + bool myIsMidButtonDown; bool myIsLeftButtonDown; - }; #endif -- 2.39.2