]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Issue 0020938: EDF 1450 GEOM: center of zoom
authorouv <ouv@opencascade.com>
Tue, 12 Oct 2010 14:35:11 +0000 (14:35 +0000)
committerouv <ouv@opencascade.com>
Tue, 12 Oct 2010 14:35:11 +0000 (14:35 +0000)
30 files changed:
doc/salome/gui/images/image157.png
doc/salome/gui/images/occviewer_toolbar.png
doc/salome/gui/images/pref12.png
doc/salome/gui/input/occ_3d_viewer.doc
doc/salome/gui/input/salome_preferences.doc
doc/salome/gui/input/vtk_3d_viewer.doc
src/LightApp/LightApp_Application.cxx
src/LightApp/resources/LightApp.xml
src/LightApp/resources/LightApp_msg_en.ts
src/OCCViewer/Makefile.am
src/OCCViewer/OCCViewer_ViewModel.cxx
src/OCCViewer/OCCViewer_ViewModel.h
src/OCCViewer/OCCViewer_ViewPort3d.cxx
src/OCCViewer/OCCViewer_ViewPort3d.h
src/OCCViewer/OCCViewer_ViewWindow.cxx
src/OCCViewer/OCCViewer_ViewWindow.h
src/OCCViewer/resources/OCCViewer_images.ts
src/OCCViewer/resources/OCCViewer_msg_en.ts
src/OCCViewer/resources/occ_view_zooming_style_switch.png [new file with mode: 0755]
src/SVTK/Makefile.am
src/SVTK/SVTK_InteractorStyle.cxx
src/SVTK/SVTK_InteractorStyle.h
src/SVTK/SVTK_ViewModel.cxx
src/SVTK/SVTK_ViewModel.h
src/SVTK/SVTK_ViewWindow.cxx
src/SVTK/SVTK_ViewWindow.h
src/SVTK/resources/SVTK_images.ts
src/SVTK/resources/SVTK_msg_en.ts
src/SVTK/resources/vtk_view_zooming_style_switch.png [new file with mode: 0755]
src/SalomeApp/resources/SalomeApp.xml

index dec5836f9145a7163d595a2cd7867d52e3ae0945..3c4b5040bc9c8ba5800295471a26bef8c78bcadc 100644 (file)
Binary files a/doc/salome/gui/images/image157.png and b/doc/salome/gui/images/image157.png differ
index 3e87ca31b20b181e19ee259b842f29a0542527b3..0cc7d3e80db6864f35ccf2b3cbd2c730d7f67a79 100644 (file)
Binary files a/doc/salome/gui/images/occviewer_toolbar.png and b/doc/salome/gui/images/occviewer_toolbar.png differ
index 5bea82dc130751062dc605345e67f6c66499b088..bfbc61685ac58ba2ccb2a52c83f04d1f2e88c8f9 100755 (executable)
Binary files a/doc/salome/gui/images/pref12.png and b/doc/salome/gui/images/pref12.png differ
index 5bd68e8862b50bc0f43889cecfe13e3b16dffde6..6bc18820e37e1e6c5836a16d77123fb4fe7d0b65 100644 (file)
@@ -24,6 +24,12 @@ left mouse button, panning - by middle mouse button, zooming - by left and middl
 mouse buttons pressed simultaneously.</center>
 <hr>
 
+\image html image111.png
+\n <center><b>Zooming style switch</b> - allows to switch between standard
+(zooming at the center of the view) and advanced (zooming at the current cursor
+position) zooming styles.</center>
+<hr>
+
 \image html image88.png
 \n <center><b>Show/Hide Trihedron</b> - shows or hides coordinate axes.</center>
 <hr>
index 19688a32baaf8aafa571734259dabfa08143e0ab..cab6274df06f298f84575ee4fd3afa0104959937 100644 (file)
@@ -97,6 +97,13 @@ operations are assigned to the buttons differently: rotation is made
 with the left button, translation with the right and zoom with both
 pressed in the same time.</li>
 </ul>
+<li><b>Zooming mode</b> - this option allows to choose a zooming mode.</li>
+<ul>
+<li><b>Relative to the view's center</b> - allows to zoom the view 
+relatively to its center.</li>
+<li><b>Relative to the cursor</b> - allows to zoom the view
+relatively to the current cursor position..</li>
+</ul>
 <li><b>[+]/[-] Speed Increment</b> - defines the number of units by
 which the speed increases or respectively decreases after pressing [+]
 or [-] keyboard buttons.</li>
index a33ab8e162fcc471f130d1637eea2403e639804e..e5b73f2943b0ac6eeabe82af3988da11d4a5df3f 100644 (file)
@@ -24,6 +24,13 @@ left mouse button, panning - by middle mouse button, zooming - by left and middl
 mouse buttons pressed simultaneously.</center>
 <hr>
 
+\image html image111.png
+\n <center><b>Zooming style switch</b> - allows to switch between standard
+(zooming at the center of the view) and advanced (zooming at the current cursor
+position) zooming styles. The second mode is available only for parallel
+(non-perspective) view's mode.</center>
+<hr>
+
 \image html image88.png
 \n <center><b>Show/Hide Trihedron</b> - shows or hides coordinate axes.</center>
 <hr>
index 88c744fc7312d65a07a04720cbeffc7d396497f6..f6c5c1752765e1358ed823663e6b8df9f9b61d7d 100644 (file)
@@ -1355,6 +1355,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
     v = resMgr->integerValue( "OCCViewer", "iso_number_v", v );
     vm->setIsos( u, v );
     vm->setInteractionStyle( resMgr->integerValue( "OCCViewer", "navigation_mode", vm->interactionStyle() ) );
+    vm->setZoomingStyle( resMgr->integerValue( "OCCViewer", "zooming_mode", vm->zoomingStyle() ) );
     viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
     new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
   }
@@ -1377,6 +1378,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
                             resMgr->booleanValue( "VTKViewer", "relative_size", vm->trihedronRelative() ) );
       vm->setStaticTrihedronVisible( resMgr->booleanValue( "VTKViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
       vm->setInteractionStyle( resMgr->integerValue( "VTKViewer", "navigation_mode", vm->interactionStyle() ) );
+      vm->setZoomingStyle( resMgr->integerValue( "VTKViewer", "zooming_mode", vm->zoomingStyle() ) );
       vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
                                resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
       vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
@@ -1968,6 +1970,15 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "strings", aStyleModeList, occStyleMode );
   pref->setItemProperty( "indexes", aModeIndexesList, occStyleMode );
 
+  int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), occGroup,
+                                                 LightApp_Preferences::Selector, "OCCViewer", "zooming_mode" );
+  QStringList aZoomingStyleModeList;
+  aZoomingStyleModeList.append( tr("PREF_ZOOMING_AT_CENTER") );
+  aZoomingStyleModeList.append( tr("PREF_ZOOMING_AT_CURSOR") );
+
+  pref->setItemProperty( "strings", aZoomingStyleModeList, occZoomingStyleMode );
+  pref->setItemProperty( "indexes", aModeIndexesList, occZoomingStyleMode );
+
   // VTK Viewer
   int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
   pref->setItemProperty( "columns", 2, vtkGen );
@@ -1998,7 +2009,11 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "strings", aStyleModeList, vtkStyleMode );
   pref->setItemProperty( "indexes", aModeIndexesList, vtkStyleMode );
 
-  pref->addPreference( "", vtkGroup, LightApp_Preferences::Space );
+  int vtkZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), vtkGen,
+                                                 LightApp_Preferences::Selector, "VTKViewer", "zooming_mode" );
+
+  pref->setItemProperty( "strings", aZoomingStyleModeList, vtkZoomingStyleMode );
+  pref->setItemProperty( "indexes", aModeIndexesList, vtkZoomingStyleMode );
 
   int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
                                       LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
@@ -2254,6 +2269,25 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 #endif
 
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "zooming_mode" ) )
+  {
+    int mode = resMgr->integerValue( "OCCViewer", "zooming_mode", 0 );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setZoomingStyle( mode );
+    }
+  }
+#endif
+
 #ifndef DISABLE_VTKVIEWER
   if ( sec == QString( "VTKViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )) )
   {
@@ -2344,6 +2378,27 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 #endif
 
+#ifndef DISABLE_VTKVIEWER
+  if ( sec == QString( "VTKViewer" ) && param == QString( "zooming_mode" ) )
+  {
+    int mode = resMgr->integerValue( "VTKViewer", "zooming_mode", 0 );
+    QList<SUIT_ViewManager*> lst;
+#ifndef DISABLE_SALOMEOBJECT
+    viewManagers( SVTK_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
+        continue;
+
+      SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
+      if( vtkVM ) vtkVM->setZoomingStyle( mode );
+    }
+#endif
+  }
+#endif
+
 #ifndef DISABLE_VTKVIEWER
   if ( sec == QString( "VTKViewer" ) && param == QString( "show_static_trihedron" ) )
   {
index ba6c4c54e9f7eeb20b495270561e3fbad780f10f..a37ebf1b438818a87c4c14ac1a4b4218323ee9f5 100644 (file)
     <parameter name="iso_number_v"   value="1" />
     <parameter name="trihedron_size" value="100" />
     <parameter name="navigation_mode" value="0" />
+    <parameter name="zooming_mode"   value="0" />
  </section>
  <section name="VTKViewer" >
     <!-- VTK viewer preferences -->
     <parameter name="relative_size"  value="true" />
     <parameter name="use_advanced_selection_algorithm" value="true" />
     <parameter name="navigation_mode" value="0" />
+    <parameter name="zooming_mode" value="0" />
     <parameter name="speed_value" value="10" />
     <parameter name="speed_mode" value="0" />
     <parameter name="show_static_trihedron" value="true" />
index aaa62e00880ba2450ef2ebf69d71ff437b10e44e..419eadaad974d0eb074ce5bffcd7904ed6034976 100644 (file)
@@ -134,6 +134,18 @@ The changes will be applied on the next application session.</translation>
         <source>PREF_KEYFREE_STYLE</source>
         <translation>Keyboard free style</translation>
     </message>
+    <message>
+        <source>PREF_ZOOMING</source>
+        <translation>Zooming:</translation>
+    </message>
+    <message>
+        <source>PREF_ZOOMING_AT_CENTER</source>
+        <translation>Relative to the view's center</translation>
+    </message>
+    <message>
+        <source>PREF_ZOOMING_AT_CURSOR</source>
+        <translation>Relative to the cursor</translation>
+    </message>
     <message>
         <source>PREF_INCREMENTAL_SPEED</source>
         <translation>Speed increment:</translation>
index 4d56e731b0ce9afc015ca386115c0bc02f08dd8b..887374043e28933afd4ea211e47f55da45ba2b64 100755 (executable)
@@ -108,7 +108,9 @@ dist_salomeres_DATA =                               \
        resources/occ_view_top.png              \
        resources/occ_view_triedre.png          \
        resources/occ_view_zoom.png             \
-       resources/occ_view_rotation_point.png
+       resources/occ_view_rotation_point.png   \
+       resources/occ_view_style_switch.png     \
+       resources/occ_view_zooming_style_switch.png
 
 nodist_salomeres_DATA =                \
        OCCViewer_images.qm     \
index caea7732622cc0079fde91928e4af40e6dde6e0a..3e3c962aa2b9ac3a995d28a8fee22ae71a900012 100755 (executable)
@@ -119,6 +119,9 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron, bool DisplayStaticTri
   // set interaction style to standard
   myInteractionStyle = 0;
 
+  // set zooming style to standard
+  myZoomingStyle = 0;
+
   // selection
   mySelectionEnabled = true;
   myMultiSelectionEnabled = true;
@@ -159,6 +162,7 @@ void OCCViewer_Viewer::initView( OCCViewer_ViewWindow* view )
     view->initLayout();
     view->initSketchers();
     view->setInteractionStyle( interactionStyle() );
+    view->setZoomingStyle( zoomingStyle() );
     
     OCCViewer_ViewPort3d* vp3d = view->getViewPort();
     if ( vp3d )
@@ -328,6 +332,34 @@ void OCCViewer_Viewer::setInteractionStyle( const int theStyle )
   }
 }
 
+/*!
+  \return zooming style
+*/
+int OCCViewer_Viewer::zoomingStyle() const
+{
+  return myZoomingStyle;
+}
+
+/*!
+  Sets zooming style: 0 - standard, 1 - advanced (at cursor)
+  \param theStyle - new zooming style
+*/
+void OCCViewer_Viewer::setZoomingStyle( const int theStyle )
+{
+  myZoomingStyle = theStyle;
+  //!! To be done for view windows
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setZoomingStyle( theStyle );
+  }
+}
+
 /*!
   Sets selection enabled status
   \param isEnabled - new status
index fc0463e79e91c73f27af2f1f25f4dfa6a13c6b9a..8a61c8b467b1620f706e1cbc2f10c8bcba3c412e 100755 (executable)
@@ -170,6 +170,9 @@ public:
   int                             interactionStyle() const;
   void                            setInteractionStyle( const int );
 
+  int                             zoomingStyle() const;
+  void                            setZoomingStyle( const int );
+
   void                            enableSelection(bool isEnabled);
   bool                            isSelectionEnabled() const { return mySelectionEnabled; }
 
@@ -217,6 +220,7 @@ private:
   viewAspectList                  myViewAspects;
 
   int                             myInteractionStyle;
+  int                             myZoomingStyle;
 
   bool                            mySelectionEnabled;
   bool                            myMultiSelectionEnabled;
index f590759895ff4aaed69f33c10d4676292c1843d2..e49b93b51d82b27266a6af7283395d0bc50f92f7 100755 (executable)
@@ -59,7 +59,8 @@ OCCViewer_ViewPort3d::OCCViewer_ViewPort3d( QWidget* parent, const Handle( V3d_V
     myScale( 1.0 ),
     myDegenerated( true ),
     myAnimate( false ),
-    myBusy( true )
+    myBusy( true ),
+    myIsAdvancedZoomingEnabled( false )
 {
   selectVisualId();
 
@@ -308,6 +309,15 @@ void OCCViewer_ViewPort3d::fitRect( const QRect& rect )
     activeView()->WindowFit( rect.left(), rect.top(), rect.right(), rect.bottom() );
 }
 
+/*!
+  Inits 'zoom' transformation. [ protected ]
+*/
+void OCCViewer_ViewPort3d::startZoomAtPoint( int x, int y )
+{
+  if ( !activeView().IsNull() && isAdvancedZoomingEnabled() )
+    activeView()->StartZoomAtPoint( x, y );
+}
+
 /*!
   Called at 'zoom' transformation. [ virtual protected ]
 */
@@ -317,7 +327,10 @@ void OCCViewer_ViewPort3d::zoom( int x0, int y0, int x, int y )
     // as OCCT respects a sign of only dx,
     // but we want both signes to be taken into account
     //activeView()->Zoom( x0, y0, x, y );
-    activeView()->Zoom( x0 + y0, 0, x + y, 0 );
+    if ( isAdvancedZoomingEnabled() )
+      activeView()->ZoomAtPoint( x0, y0, x, y );
+    else
+      activeView()->Zoom( x0 + y0, 0, x + y, 0 );
   }
 }
 
index 469ce17cb1777cd981bbe318d705bd29d98b9e92..125fcfa938082e75d0c7cff44c4ace48a565ed39 100755 (executable)
@@ -69,6 +69,7 @@ public:
   virtual void          pan( int , int );
   virtual void          setCenter( int , int );
   virtual void          fitRect( const QRect& );
+  virtual void          startZoomAtPoint( int, int );
   virtual void          zoom( int, int, int, int );
   virtual void          fitAll( bool keepScale = false, bool withZ = true, bool upd = true );
 
@@ -77,6 +78,9 @@ public:
   virtual void          endRotation();
   bool                  isBusy() {return myBusy;} // check that View Port is fully initialized
 
+  void                  setAdvancedZoomingEnabled( const bool theState ) { myIsAdvancedZoomingEnabled = theState; }
+  bool                  isAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; }
+
 protected:
     // EVENTS
   virtual void          paintEvent( QPaintEvent* );
@@ -100,6 +104,7 @@ private:
   bool                  myAnimate;
   bool                  myBusy;
   double                myScale;
+  bool                  myIsAdvancedZoomingEnabled;
 };
 
 #ifdef WIN32
index 3f542c61def99f06bcc5548e65b0a0e22025d671..c52efe0caf6c3dafc37bca2610881de99bfd509d 100755 (executable)
@@ -385,20 +385,26 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
     break;
 
   case ZOOMVIEW:
-    if ( theEvent->button() == Qt::LeftButton )
+    if ( theEvent->button() == Qt::LeftButton ) {
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
       emit vpTransformationStarted ( ZOOMVIEW );
+    }
     break;
 
   case PANVIEW:
-    if ( aSwitchToZoom )
+    if ( aSwitchToZoom ) {
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
       activateZoom();
+    }
     else if ( theEvent->button() == Qt::LeftButton )
       emit vpTransformationStarted ( PANVIEW );
     break;
 
   case ROTATE:
-    if ( aSwitchToZoom )
+    if ( aSwitchToZoom ) {
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
       activateZoom();
+    }
     else if ( theEvent->button() == Qt::LeftButton ) {
       myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
       emit vpTransformationStarted ( ROTATE );
@@ -409,7 +415,8 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
   /*  Try to activate a transformation */
     switch ( getButtonState(theEvent, anInteractionStyle) ) {
     case ZOOMVIEW:
-            activateZoom();
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
+      activateZoom();
       break;
     case PANVIEW:
             activatePanning();
@@ -1160,12 +1167,20 @@ void OCCViewer_ViewWindow::createActions()
   toolMgr()->registerAction( aAction, AmbientId );
 
   // Switch between interaction styles
-  aAction = new QtxAction(tr("MNU_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_SVTK_STYLE_SWITCH" ) ),
+  aAction = new QtxAction(tr("MNU_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_STYLE_SWITCH" ) ),
                           tr( "MNU_STYLE_SWITCH" ), 0, this);
   aAction->setStatusTip(tr("DSC_STYLE_SWITCH"));
   aAction->setCheckable(true);
   connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchInteractionStyle(bool)));
   toolMgr()->registerAction( aAction, SwitchInteractionStyleId );
+
+  // Switch between zooming styles
+  aAction = new QtxAction(tr("MNU_ZOOMING_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH" ) ),
+                          tr( "MNU_ZOOMING_STYLE_SWITCH" ), 0, this);
+  aAction->setStatusTip(tr("DSC_ZOOMING_STYLE_SWITCH"));
+  aAction->setCheckable(true);
+  connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool)));
+  toolMgr()->registerAction( aAction, SwitchZoomingStyleId );
 }
 
 /*!
@@ -1177,6 +1192,7 @@ void OCCViewer_ViewWindow::createToolBar()
 
   toolMgr()->append( DumpId, tid );
   toolMgr()->append( SwitchInteractionStyleId, tid );
+  toolMgr()->append( SwitchZoomingStyleId, tid );
   if( myModel->trihedronActivated() ) 
     toolMgr()->append( TrihedronShowId, tid );
 
@@ -1566,6 +1582,19 @@ void OCCViewer_ViewWindow::onSwitchInteractionStyle( bool on )
     a->setChecked( on );
 }
 
+/*!
+  \brief Toogles advanced zooming style (relatively to the cursor position) on/off
+*/
+void OCCViewer_ViewWindow::onSwitchZoomingStyle( bool on )
+{
+  myViewPort->setAdvancedZoomingEnabled( on );
+
+  // update action state if method is called outside
+  QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchZoomingStyleId ) );
+  if ( a->isChecked() != on )
+    a->setChecked( on );
+}
+
 /*!
   \brief Get current interaction style
   \return interaction style
@@ -1584,6 +1613,24 @@ void OCCViewer_ViewWindow::setInteractionStyle( const int theStyle )
   onSwitchInteractionStyle( theStyle == (int)SUIT_ViewModel::KEY_FREE );
 }
 
+/*!
+  \brief Get current zooming style
+  \return zooming style
+*/
+int OCCViewer_ViewWindow::zoomingStyle() const
+{
+  return myViewPort->isAdvancedZoomingEnabled() ? 1 : 0;
+}
+
+/*!
+  \brief Set current zooming style
+  \param theStyle zooming style
+*/
+void OCCViewer_ViewWindow::setZoomingStyle( const int theStyle )
+{
+  onSwitchZoomingStyle( theStyle == 1 );
+}
+
 /*!
   \brief Dump view window contents to the pixmap.
   \return pixmap containing all scene rendered in the window
index 02300ef18aa6e7f647addfef69c74adbfaae2dbc..3850bb2a58c8341d72e3b98648a6f66829561409 100755 (executable)
@@ -51,7 +51,7 @@ public:
   enum { DumpId, FitAllId, FitRectId, ZoomId, PanId, GlobalPanId,
          ChangeRotationPointId, RotationId,
          FrontId, BackId, TopId, BottomId, LeftId, RightId, ResetId, CloneId, ClippingId, MemId, RestoreId,
-         TrihedronShowId, AxialScaleId, GraduatedAxesId, AmbientId, SwitchInteractionStyleId };
+         TrihedronShowId, AxialScaleId, GraduatedAxesId, AmbientId, SwitchInteractionStyleId, SwitchZoomingStyleId };
 
   enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, 
                       PANGLOBAL, WINDOWFIT, FITALLVIEW, RESETVIEW,
@@ -90,6 +90,9 @@ public:
   int                     interactionStyle() const;
   void                    setInteractionStyle( const int );
  
+  int                     zoomingStyle() const;
+  void                    setZoomingStyle( const int );
   void setTransformEnabled( const OperationType, const bool );
   bool transformEnabled( const OperationType ) const;
 
@@ -119,6 +122,7 @@ public slots:
   void onTrihedronShow();
   void setRestoreFlag();
   void onSwitchInteractionStyle( bool on );
+  void onSwitchZoomingStyle( bool on );
 
   void activateSetRotationGravity();
   void activateSetRotationSelected( double theX, double theY, double theZ );
index bcc888b208a90cf8899c4a7902d5e16907b5fffc..429a1ad1bccd6ff66510d62168ace1c16d684498 100644 (file)
         <source>ICON_OCCVIEWER_STYLE_SWITCH</source>
         <translation>occ_view_style_switch.png</translation>
     </message>
+    <message>
+        <source>ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH</source>
+        <translation>occ_view_zooming_style_switch.png</translation>
+    </message>
 </context>
 </TS>
index aea134ee6cb04865dca17317b3f8c51cfcba71a2..c19bb5d053752216dea9dc8e6e9382d994b27fbe 100644 (file)
         <source>MNU_STYLE_SWITCH</source>
         <translation>Interaction style switch</translation>
     </message>
+    <message>
+        <source>DSC_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zooming style switch</translation>
+    </message>
+    <message>
+        <source>MNU_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zooming style switch</translation>
+    </message>
     <message>
         <source>OCC_IMAGE_FILES</source>
         <translation>Images Files (*.bmp *.png *.jpg *.jpeg)</translation>
diff --git a/src/OCCViewer/resources/occ_view_zooming_style_switch.png b/src/OCCViewer/resources/occ_view_zooming_style_switch.png
new file mode 100755 (executable)
index 0000000..8f3a486
Binary files /dev/null and b/src/OCCViewer/resources/occ_view_zooming_style_switch.png differ
index 3842a639f648364983a395d892007ed9cad74a7f..232e9ef8354ae17caf9e5ca925764cabbdc1a120 100755 (executable)
@@ -128,6 +128,7 @@ dist_salomeres_DATA=\
        resources/vtk_view_perspective.png \
        resources/vtk_view_parameters.png \
        resources/vtk_view_style_switch.png \
+       resources/vtk_view_zooming_style_switch.png \
        resources/vtk_view_recording_start.png \
        resources/vtk_view_recording_play.png \
        resources/vtk_view_recording_pause.png \
index b9cd1aec049192d1333e833e98d0e8a6dc6c7d9d..ec679bdcb1e093efaa15bdffd82f80ea3e019eee 100644 (file)
@@ -93,7 +93,8 @@ SVTK_InteractorStyle::SVTK_InteractorStyle():
   myControllerIncrement(SVTK_ControllerIncrement::New()),
   myControllerOnKeyDown(SVTK_ControllerOnKeyDown::New()),
   myHighlightSelectionPointActor(SVTK_Actor::New()),
-  myRectBand(0)
+  myRectBand(0),
+  myIsAdvancedZoomingEnabled(false)
 {
   myPointPicker->Delete();
 
@@ -289,8 +290,22 @@ void SVTK_InteractorStyle::DollyXY(int dx, int dy)
   double zoomFactor = pow((double)1.1, dxf + dyf);
   
   vtkCamera *aCam = GetCurrentRenderer()->GetActiveCamera();
-  if (aCam->GetParallelProjection())
+  if (aCam->GetParallelProjection()) {
+    int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
+    if( IsAdvancedZoomingEnabled() ) { // zoom relatively to the cursor
+      int* aSize = GetCurrentRenderer()->GetRenderWindow()->GetSize();
+      int w = aSize[0];
+      int h = aSize[1];
+      x0 = w / 2;
+      y0 = h / 2;
+      x1 = myOtherPoint.x();
+      y1 = h - myOtherPoint.y();
+      TranslateView( x0, y0, x1, y1 );
+    }
     aCam->SetParallelScale(aCam->GetParallelScale()/zoomFactor);
+    if( IsAdvancedZoomingEnabled() )
+      TranslateView( x1, y1, x0, y0 );
+  }
   else{
     aCam->Dolly(zoomFactor); // Move camera in/out along projection direction
     GetCurrentRenderer()->ResetCameraClippingRange(); 
index 51bb52657bb64af18e714aa6ce37f77ea4927c07..f002752e5a61e307969d3d8fc937a1de0bb2e90c 100644 (file)
@@ -228,6 +228,9 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
 
   int   CurrentState() const { return State; }
 
+  void SetAdvancedZoomingEnabled( const bool theState ) { myIsAdvancedZoomingEnabled = theState; }
+  bool IsAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; }
+
   protected:
   SVTK_InteractorStyle();
   ~SVTK_InteractorStyle();
@@ -350,6 +353,8 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   bool                            myBBFirstCheck;
 
   QRubberBand*                    myRectBand; //!< selection rectangle rubber band
+
+  bool                            myIsAdvancedZoomingEnabled;
 };
 
 #ifdef WIN32
index 35c168563f9cd3980c9b897a508f84bab3c2b293..58d4e47d86df71669c2c964cad2d23c3aa8d01af 100644 (file)
@@ -80,6 +80,7 @@ SVTK_Viewer::SVTK_Viewer()
   myIncrementMode = 0;
   myProjMode = 0;
   myStyle = 0;
+  myZoomingStyle = 0;
   mySpaceBtn[0] = 1;
   mySpaceBtn[1] = 2;
   mySpaceBtn[2] = 9;
@@ -134,6 +135,7 @@ SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop )
   aViewWindow->SetStaticTrihedronVisible( isStaticTrihedronVisible() );
   aViewWindow->SetProjectionMode( projectionMode() );
   aViewWindow->SetInteractionStyle( interactionStyle() );
+  aViewWindow->SetZoomingStyle( zoomingStyle() );
   aViewWindow->SetIncrementalSpeed( incrementalSpeed(), incrementalSpeedMode() );
   aViewWindow->SetSpacemouseButtons( spacemouseBtn(1), spacemouseBtn(2), spacemouseBtn(3) );
 
@@ -262,6 +264,32 @@ void SVTK_Viewer::setInteractionStyle( const int theStyle )
   }
 }
 
+/*!
+  \return zooming style
+*/
+int SVTK_Viewer::zoomingStyle() const
+{
+  return myZoomingStyle;
+}
+
+/*!
+  Sets zooming style: 0 - standard, 1 - advanced (at cursor)
+  \param theStyle - new zooming style
+*/
+void SVTK_Viewer::setZoomingStyle( const int theStyle )
+{
+  myZoomingStyle = theStyle;
+  
+  if (SUIT_ViewManager* aViewManager = getViewManager()) {
+    QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
+    for ( uint i = 0; i < aViews.count(); i++ )
+    {
+      if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
+        aView->SetZoomingStyle( theStyle );
+    }
+  }
+}
+
 /*!
   \return incremental speed value
 */
index cf4ca31fe06ab50ffd0db1e647d7e387a8cead7c..5e038d2c79d3f92d4531c729ed71044b243c6b7a 100644 (file)
@@ -96,6 +96,12 @@ public:
   //! Sets interaction style
   void setInteractionStyle( const int );
 
+  //! Gets zooming style
+  int zoomingStyle() const;
+
+  //! Sets zooming style
+  void setZoomingStyle( const int );
+
   //! Get incremental speed (see #SVTK_InteractorStyle::ControllerIncrement)
   int incrementalSpeed() const;
 
@@ -175,6 +181,7 @@ private:
   int    myIncrementMode;
   int    myProjMode;
   int    myStyle;
+  int    myZoomingStyle;
   int    mySpaceBtn[3];
 };
 
index 440bf08cedf48ba3edf07fc020545093c48138f6..a0118be865f5ac2373de72d6313b144dd8746e9d 100755 (executable)
@@ -171,9 +171,9 @@ void SVTK_ViewWindow::Initialize(SVTK_ViewModelBase* theModel)
   myViewParameterDlg = new SVTK_ViewParameterDlg
     ( getAction( ViewParametersId ), this, "SVTK_ViewParameterDlg" );
   
-  SVTK_InteractorStyle* aStyle = SVTK_InteractorStyle::New();
-  myInteractor->PushInteractorStyle(aStyle);
-  aStyle->Delete();
+  myDefaultInteractorStyle = SVTK_InteractorStyle::New();
+  myInteractor->PushInteractorStyle(myDefaultInteractorStyle);
+  myDefaultInteractorStyle->Delete();
   
   myRecorder = SVTK_Recorder::New();
   
@@ -680,6 +680,15 @@ void SVTK_ViewWindow::SetInteractionStyle(const int theStyle)
   onSwitchInteractionStyle( theStyle==1 );
 }
 
+/*!
+  Sets actual zooming style
+  \param theStyle - type of zooming style ( 0 - standard, 1 - advanced (at cursor) )
+*/
+void SVTK_ViewWindow::SetZoomingStyle(const int theStyle)
+{
+  onSwitchZoomingStyle( theStyle==1 );
+}
+
 /*!
   Switches "keyboard free" interaction style on/off
 */
@@ -710,6 +719,22 @@ void SVTK_ViewWindow::onSwitchInteractionStyle(bool theOn)
   if ( a->isChecked() != theOn ) a->setChecked( theOn );
 }
 
+/*!
+  Toogles advanced zooming style (relatively to the cursor position) on/off
+*/
+void SVTK_ViewWindow::onSwitchZoomingStyle( bool theOn )
+{
+  if( myDefaultInteractorStyle.GetPointer() )
+    myDefaultInteractorStyle->SetAdvancedZoomingEnabled( theOn );
+  if( myKeyFreeInteractorStyle.GetPointer() )
+    myKeyFreeInteractorStyle->SetAdvancedZoomingEnabled( theOn );
+
+  // update action state if method is called outside
+  QtxAction* a = getAction( SwitchZoomingStyleId );
+  if ( a->isChecked() != theOn )
+    a->setChecked( theOn );
+}
+
 /*!
   Sets incremental speed
   \param theValue - new incremental speed
@@ -1549,8 +1574,14 @@ void SVTK_ViewWindow::activateStartPointSelection()
 */
 void SVTK_ViewWindow::onPerspectiveMode()
 {
+  bool anIsParallelMode = toolMgr()->action( ParallelModeId )->isChecked();
+
+  // advanced zooming is not available in perspective mode
+  if( QtxAction* anAction = getAction( SwitchZoomingStyleId ) )
+    anAction->setEnabled( anIsParallelMode );
+
   vtkCamera* aCamera = getRenderer()->GetActiveCamera();
-  aCamera->SetParallelProjection(toolMgr()->action( ParallelModeId )->isChecked());
+  aCamera->SetParallelProjection(anIsParallelMode);
   GetInteractor()->GetDevice()->CreateTimer(VTKI_TIMER_FIRST);
 }
 
@@ -1764,6 +1795,15 @@ void SVTK_ViewWindow::createActions(SUIT_ResourceMgr* theResourceMgr)
   connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchInteractionStyle(bool)));
   mgr->registerAction( anAction, SwitchInteractionStyleId );
 
+  // Switch between zomming styles
+  anAction = new QtxAction(tr("MNU_SVTK_ZOOMING_STYLE_SWITCH"), 
+                           theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_ZOOMING_STYLE_SWITCH" ) ),
+                           tr( "MNU_SVTK_ZOOMING_STYLE_SWITCH" ), 0, this);
+  anAction->setStatusTip(tr("DSC_SVTK_ZOOMING_STYLE_SWITCH"));
+  anAction->setCheckable(true);
+  connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool)));
+  mgr->registerAction( anAction, SwitchZoomingStyleId );
+
   // Start recording
   myStartAction = new QtxAction(tr("MNU_SVTK_RECORDING_START"), 
                                 theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_RECORDING_START" ) ),
@@ -1809,6 +1849,7 @@ void SVTK_ViewWindow::createToolBar()
   
   mgr->append( DumpId, myToolBar );
   mgr->append( SwitchInteractionStyleId, myToolBar );
+  mgr->append( SwitchZoomingStyleId, myToolBar );
   mgr->append( ViewTrihedronId, myToolBar );
 
   QtxMultiAction* aScaleAction = new QtxMultiAction( this );
index 9d6e2470740f81d3429783504b4c033cc5f673a9..9c2f827009fccb05ea49371907ca9601518f7ebe 100755 (executable)
@@ -59,6 +59,7 @@ class SVTK_NonIsometricDlg;
 class SVTK_UpdateRateDlg;
 class SVTK_CubeAxesDlg;
 class SVTK_SetRotationPointDlg;
+class SVTK_InteractorStyle;
 class SVTK_KeyFreeInteractorStyle;
 class SVTK_ViewParameterDlg;
 class SVTK_Recorder;
@@ -220,6 +221,9 @@ class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow
   //! Redirect the request to #SVTK_MainWindow::SetInteractionStyle
   virtual void SetInteractionStyle( const int );
 
+  //! Redirect the request to #SVTK_MainWindow::SetZoomingStyle
+  virtual void SetZoomingStyle( const int );
+
   //! Redirect the request to #SVTK_MainWindow::SetSpacemouseButtons
   virtual void SetSpacemouseButtons( const int, const int, const int );
 
@@ -294,6 +298,7 @@ public slots:
   void onViewParameters(bool theIsActivate);
 
   void onSwitchInteractionStyle(bool theOn);
+  void onSwitchZoomingStyle(bool theOn);
 
   void onStartRecording();
   void onPlayRecording();
@@ -373,6 +378,7 @@ protected:
          FrontId, BackId, TopId, BottomId, LeftId, RightId, ResetId, 
          ViewTrihedronId, NonIsometric, GraduatedAxes, UpdateRate,
          ParallelModeId, ProjectionModeId, ViewParametersId, SwitchInteractionStyleId,
+         SwitchZoomingStyleId,
          StartRecordingId, PlayRecordingId, PauseRecordingId, StopRecordingId };
 
 
@@ -381,6 +387,7 @@ protected:
   SVTK_ViewModelBase* myModel;
 
   SVTK_RenderWindowInteractor* myInteractor;
+  vtkSmartPointer<SVTK_InteractorStyle> myDefaultInteractorStyle;
   vtkSmartPointer<SVTK_KeyFreeInteractorStyle> myKeyFreeInteractorStyle;
 
   QString myVisualParams; // used for delayed setting of view parameters 
index 2236a59bae8f5b8ae3def0ee936b0f91bcf786a1..6150f90b3501c67ba6c96c9143ab73678d075db5 100644 (file)
         <source>ICON_SVTK_STYLE_SWITCH</source>
         <translation>vtk_view_style_switch.png</translation>
     </message>
+    <message>
+        <source>ICON_SVTK_ZOOMING_STYLE_SWITCH</source>
+        <translation>vtk_view_zooming_style_switch.png</translation>
+    </message>
     <message>
         <source>ICON_SVTK_RECORDING_START</source>
         <translation>vtk_view_recording_start.png</translation>
index 8593ed6fa76aeecb9cf431fef086780c835d639e..643a2aa37692e8a67836ee5b0fc3da7f1308a1ab 100644 (file)
         <source>MNU_SVTK_STYLE_SWITCH</source>
         <translation>Interaction Style Switch</translation>
     </message>
+    <message>
+        <source>DSC_SVTK_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zooming style switch</translation>
+    </message>
+    <message>
+        <source>MNU_SVTK_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zomming style switch</translation>
+    </message>
 </context>
 <context>
     <name>SVTK_FontWidget</name>
diff --git a/src/SVTK/resources/vtk_view_zooming_style_switch.png b/src/SVTK/resources/vtk_view_zooming_style_switch.png
new file mode 100755 (executable)
index 0000000..8f3a486
Binary files /dev/null and b/src/SVTK/resources/vtk_view_zooming_style_switch.png differ
index 0a037a064ba443bc11f330395ae50d2801c10be6..692930817dc2ef98c0ab20844800ceafcd6e4c54 100644 (file)
     <parameter name="iso_number_v"   value="1" />
     <parameter name="trihedron_size" value="100" />
     <parameter name="navigation_mode" value="0"/>
+    <parameter name="zooming_mode"   value="0" />
  </section>
  <section name="VTKViewer" >
     <!-- VTK viewer preferences -->
     <parameter name="group_names_transparency" value="0.5"/>
     <parameter name="projection_mode" value="0"/>
     <parameter name="navigation_mode" value="0"/>
+    <parameter name="zooming_mode" value="0" />
     <parameter name="speed_mode" value="0"/>
     <parameter name="speed_value" value="10"/>
     <parameter name="show_static_trihedron" value="true" />