Przeglądaj źródła

ENH: ctkVTKRenderView - Add zoomIn, zoomOut and setZoomFactor method

Jean-Christophe Fillion-Robin 14 lat temu
rodzic
commit
bf0012bef5

+ 44 - 5
Libs/Visualization/VTK/Widgets/ctkVTKRenderView.cpp

@@ -31,6 +31,7 @@
 #include <vtkRendererCollection.h>
 #include <vtkRenderWindowInteractor.h>
 #include <vtkTextProperty.h>
+#include <vtkCamera.h>
 
 //--------------------------------------------------------------------------
 static ctkLogger logger("org.commontk.visualization.vtk.widgets.ctkVTKRenderView");
@@ -49,6 +50,7 @@ ctkVTKRenderViewPrivate::ctkVTKRenderViewPrivate()
   this->CornerAnnotation = vtkSmartPointer<vtkCornerAnnotation>::New();
   this->RenderPending = false;
   this->RenderEnabled = false;
+  this->ZoomFactor = 0.05;
 }
 
 // --------------------------------------------------------------------------
@@ -93,6 +95,24 @@ void ctkVTKRenderViewPrivate::setupDefaultInteractor()
   p->setInteractor(this->RenderWindow->GetInteractor());
 }
 
+//----------------------------------------------------------------------------
+void ctkVTKRenderViewPrivate::zoom(double zoomFactor)
+{
+  Q_ASSERT(this->Renderer->IsActiveCameraCreated());
+  vtkCamera * camera = this->Renderer->GetActiveCamera();
+
+  if (camera->GetParallelProjection())
+    {
+    camera->SetParallelScale(camera->GetParallelScale() / (1 + zoomFactor));
+    }
+  else
+    {
+    camera->Dolly(1 + zoomFactor);
+    this->Renderer->ResetCameraClippingRange();
+    this->Renderer->UpdateLightsGeometryToFollowCamera();
+    }
+}
+
 //---------------------------------------------------------------------------
 // ctkVTKRenderView methods
 
@@ -112,11 +132,6 @@ ctkVTKRenderView::ctkVTKRenderView(QWidget* _parent) : Superclass(_parent)
   d->setupDefaultInteractor();
 }
 
-// --------------------------------------------------------------------------
-ctkVTKRenderView::~ctkVTKRenderView()
-{
-}
-
 //----------------------------------------------------------------------------
 void ctkVTKRenderView::scheduleRender()
 {
@@ -265,3 +280,27 @@ CTK_GET_CXX(ctkVTKRenderView, vtkRenderer*, renderer, Renderer);
 //----------------------------------------------------------------------------
 CTK_SET_CXX(ctkVTKRenderView, bool, setRenderEnabled, RenderEnabled);
 CTK_GET_CXX(ctkVTKRenderView, bool, renderEnabled, RenderEnabled);
+
+//----------------------------------------------------------------------------
+void ctkVTKRenderView::setZoomFactor(double newZoomFactor)
+{
+  CTK_D(ctkVTKRenderView);
+  d->ZoomFactor = qBound(0.0, qAbs(newZoomFactor), 1.0);
+}
+
+//----------------------------------------------------------------------------
+CTK_GET_CXX(ctkVTKRenderView, double, zoomFactor, ZoomFactor);
+
+//----------------------------------------------------------------------------
+void ctkVTKRenderView::zoomIn()
+{
+  CTK_D(ctkVTKRenderView);
+  d->zoom(d->ZoomFactor);
+}
+
+//----------------------------------------------------------------------------
+void ctkVTKRenderView::zoomOut()
+{
+  CTK_D(ctkVTKRenderView);
+  d->zoom(-d->ZoomFactor);
+}

+ 18 - 1
Libs/Visualization/VTK/Widgets/ctkVTKRenderView.h

@@ -44,11 +44,13 @@ class CTK_VISUALIZATION_VTK_WIDGETS_EXPORT ctkVTKRenderView : public QWidget
   Q_PROPERTY(bool renderEnabled READ renderEnabled WRITE setRenderEnabled)
   Q_PROPERTY(bool orientationWidgetVisible READ orientationWidgetVisible
              WRITE setOrientationWidgetVisible)
+  Q_PROPERTY(double zoomFactor READ zoomFactor WRITE setZoomFactor)
+
 public:
   /// Constructors
   typedef QWidget   Superclass;
   explicit ctkVTKRenderView(QWidget* parent = 0);
-  virtual ~ctkVTKRenderView();
+  virtual ~ctkVTKRenderView(){}
 
 public slots:
 
@@ -70,6 +72,18 @@ public slots:
   /// Show/Hide Orientation widget
   void setOrientationWidgetVisible(bool visible);
 
+  /// \brief Set zoom factor
+  /// zoomFactor is a value between 0.0 and 1.0
+  void setZoomFactor(double newZoomFactor);
+
+  /// Zoom in using the \a zoomfactor
+  /// \sa setZoomFactor
+  void zoomIn();
+
+  /// Zoom out using the \a zoomfactor
+  /// \sa setZoomFactor
+  void zoomOut();
+
 public:
   /// Get underlying RenderWindow
   vtkRenderWindow* renderWindow()const;
@@ -101,6 +115,9 @@ public:
 
   /// Return if rendering is enabled
   bool renderEnabled() const;
+
+  /// Return zoom factor
+  double zoomFactor()const;
   
 private:
   CTK_DECLARE_PRIVATE(ctkVTKRenderView);

+ 3 - 0
Libs/Visualization/VTK/Widgets/ctkVTKRenderView_p.h

@@ -50,6 +50,8 @@ class ctkVTKRenderViewPrivate : public QObject,
 public:
   ctkVTKRenderViewPrivate();
 
+  void zoom(double zoomFactor);
+
   /// Convenient setup methods
   void setupCornerAnnotation();
   void setupRendering();
@@ -64,6 +66,7 @@ public:
   vtkSmartPointer<vtkAxesActor>                 Axes;
   vtkSmartPointer<vtkOrientationMarkerWidget>   Orientation;
   vtkSmartPointer<vtkCornerAnnotation>          CornerAnnotation;
+  double                                        ZoomFactor;
 
   vtkWeakPointer<vtkRenderWindowInteractor>     CurrentInteractor;