Bläddra i källkod

Merge branch jcfr/ctkVTKSliceView

Jean-Christophe Fillion-Robin 15 år sedan
förälder
incheckning
a2e1eb3113

+ 7 - 0
Libs/Visualization/VTK/Widgets/Testing/Cpp/CMakeLists.txt

@@ -16,6 +16,10 @@ SET(TEST_SOURCES
 # Tests expecting CTKData to be set
 #
 IF(EXISTS "${CTKData_DIR}")
+  LIST(APPEND TEST_SOURCES
+    ctkVTKSliceViewTest1.cpp
+    ctkVTKRenderViewTest1.cpp
+    )
 ENDIF()
 
 CREATE_TEST_SOURCELIST(Tests ${KIT}CppTests.cpp
@@ -56,4 +60,7 @@ SIMPLE_TEST( ctkTransferFunctionViewTest5 )
 # Add Tests expecting CTKData to be set
 #
 IF(EXISTS "${CTKData_DIR}")
+  #
+  SIMPLE_TEST( ctkVTKSliceViewTest1 )
+  SIMPLE_TEST( ctkVTKRenderViewTest1 )
 ENDIF()

+ 88 - 0
Libs/Visualization/VTK/Widgets/Testing/Cpp/ctkVTKRenderViewTest1.cpp

@@ -0,0 +1,88 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) 2010  Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QApplication>
+#include <QTimer>
+#include <QGroupBox>
+#include <QDebug>
+
+// VTK includes
+#include <vtkSmartPointer.h>
+#include <vtkRenderer.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkSphereSource.h>
+
+// CTK includes
+#include "ctkVTKRenderView.h"
+#include "ctkCommandLineParser.h"
+
+// STD includes
+#include <iostream>
+
+// Convenient macro
+#define VTK_CREATE(type, name) \
+  vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
+
+//-----------------------------------------------------------------------------
+int ctkVTKRenderViewTest1(int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+
+  // Test arguments
+  bool interactive = false;
+  QString data_directory;
+
+  // Command line parser
+  ctkCommandLineParser parser;
+  parser.addBooleanArgument(0, "-I", &interactive);
+  parser.addStringArgument(0, "-D", &data_directory);
+  if (!parser.parseArguments(app.arguments()))
+    {
+    std::cerr << qPrintable(parser.errorString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  // Instanciate widget
+  ctkVTKRenderView renderView;
+  renderView.resize(300, 300);
+  renderView.setBackgroundColor(QColor(Qt::red));
+  renderView.setCornerAnnotationText("CTK Rocks !");
+  renderView.show();
+
+  // Instanciate VTK objects
+  VTK_CREATE(vtkSphereSource, sphere);
+  VTK_CREATE(vtkPolyDataMapper, sphereMapper);
+  VTK_CREATE(vtkActor, sphereActor);
+
+  // Configure actor
+  sphere->SetRadius(0.25);
+  sphereMapper->SetInputConnection(sphere->GetOutputPort());
+  sphereActor->SetMapper(sphereMapper);
+
+  // Add actor
+  renderView.renderer()->AddActor(sphereActor);
+
+  if (!interactive)
+    {
+    QTimer::singleShot(1000, &app, SLOT(quit()));
+    }
+  return app.exec();
+}

+ 96 - 0
Libs/Visualization/VTK/Widgets/Testing/Cpp/ctkVTKSliceViewTest1.cpp

@@ -0,0 +1,96 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) 2010  Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QApplication>
+#include <QTimer>
+#include <QDebug>
+
+// CTK includes
+#include "ctkCommandLineParser.h"
+#include "ctkVTKSliceView.h"
+
+// VTK includes
+#include <vtkImageReader2Factory.h>
+#include <vtkImageReader2.h>
+#include <vtkImageData.h>
+#include <vtkSmartPointer.h>
+#include <vtkInteractorStyleImage.h>
+#include <vtkRenderWindowInteractor.h>
+
+// STD includes
+#include <iostream>
+
+//-----------------------------------------------------------------------------
+int ctkVTKSliceViewTest1(int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+
+  // Test arguments
+  bool interactive = false;
+  QString data_directory;
+  QString filename = "HeadMRVolume.mhd";
+
+  // Command line parser
+  ctkCommandLineParser parser;
+  parser.addBooleanArgument(0, "-I", &interactive);
+  parser.addStringArgument(0, "-D", &data_directory);
+  if (!parser.parseArguments(app.arguments()))
+    {
+    std::cerr << qPrintable(parser.errorString()) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  QString imageFilename = data_directory + "/" + filename;
+
+  // Instanciate the reader factory
+  vtkSmartPointer<vtkImageReader2Factory> imageFactory =
+      vtkSmartPointer<vtkImageReader2Factory>::New();
+
+  // Instanciate an image reader
+  vtkSmartPointer<vtkImageReader2> imageReader;
+  imageReader.TakeReference(imageFactory->CreateImageReader2(imageFilename.toLatin1()));
+  if (!imageReader)
+    {
+    std::cerr << "Failed to instanciate image reader using: " 
+              << qPrintable(imageFilename) << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  // Read image
+  imageReader->SetFileName(imageFilename.toLatin1());
+  imageReader->Update();
+  vtkSmartPointer<vtkImageData> image = imageReader->GetOutput();
+
+  ctkVTKSliceView sliceView;
+  sliceView.resize(300, 300);
+  sliceView.setImageData(image);
+  sliceView.setRenderWindowLayout(4, 4);
+  sliceView.setHighlighted(0, 0, true);
+  sliceView.setCornerAnnotationText("CTK");
+  sliceView.scheduleRender();
+  sliceView.show();
+
+  if (!interactive)
+    {
+    QTimer::singleShot(1000, &app, SLOT(quit()));
+    }
+  return app.exec();
+}

+ 22 - 0
Libs/Visualization/VTK/Widgets/ctkVTKRenderView.cpp

@@ -25,12 +25,17 @@
 // CTK includes
 #include "ctkVTKRenderView.h"
 #include "ctkVTKRenderView_p.h"
+#include "ctkLogger.h"
 
 // VTK includes
 #include <vtkRendererCollection.h>
 #include <vtkRenderWindowInteractor.h>
 #include <vtkTextProperty.h>
 
+//--------------------------------------------------------------------------
+static ctkLogger logger("org.commontk.visualization.vtk.widgets.ctkVTKRenderView");
+//--------------------------------------------------------------------------
+
 // --------------------------------------------------------------------------
 // ctkVTKRenderViewPrivate methods
 
@@ -49,6 +54,7 @@ ctkVTKRenderViewPrivate::ctkVTKRenderViewPrivate()
 // --------------------------------------------------------------------------
 void ctkVTKRenderViewPrivate::setupCornerAnnotation()
 {
+  logger.trace("setupCornerAnnotation");
   if (!this->Renderer->HasViewProp(this->CornerAnnotation))
     {
     this->Renderer->AddViewProp(this->CornerAnnotation);
@@ -62,6 +68,7 @@ void ctkVTKRenderViewPrivate::setupCornerAnnotation()
 //---------------------------------------------------------------------------
 void ctkVTKRenderViewPrivate::setupRendering()
 {
+  logger.trace("setupRendering");
   Q_ASSERT(this->RenderWindow);
   this->RenderWindow->SetAlphaBitPlanes(1);
   this->RenderWindow->SetMultiSamples(0);
@@ -81,6 +88,7 @@ void ctkVTKRenderViewPrivate::setupRendering()
 //---------------------------------------------------------------------------
 void ctkVTKRenderViewPrivate::setupDefaultInteractor()
 {
+  logger.trace("setupDefaultInteractor");
   CTK_P(ctkVTKRenderView);
   p->setInteractor(this->RenderWindow->GetInteractor());
 }
@@ -113,6 +121,10 @@ ctkVTKRenderView::~ctkVTKRenderView()
 void ctkVTKRenderView::scheduleRender()
 {
   CTK_D(ctkVTKRenderView);
+
+  logger.trace(QString("scheduleRender - RenderEnabled: %1 - RenderPending: %2").
+               arg(d->RenderEnabled).arg(d->RenderPending));
+
   if (!d->RenderEnabled)
     {
     return;
@@ -128,6 +140,9 @@ void ctkVTKRenderView::scheduleRender()
 void ctkVTKRenderView::forceRender()
 {
   CTK_D(ctkVTKRenderView);
+
+  logger.trace(QString("forceRender - RenderEnabled: %1").arg(d->RenderEnabled));
+
   if (!d->RenderEnabled)
     {
     return;
@@ -146,6 +161,9 @@ CTK_GET_CXX(ctkVTKRenderView, vtkRenderWindowInteractor*, interactor, CurrentInt
 void ctkVTKRenderView::setInteractor(vtkRenderWindowInteractor* newInteractor)
 {
   CTK_D(ctkVTKRenderView);
+
+  logger.trace("setInteractor");
+
   d->RenderWindow->SetInteractor(newInteractor);
   d->Orientation->SetOrientationMarker(d->Axes);
   d->Orientation->SetInteractor(newInteractor);
@@ -172,6 +190,7 @@ vtkInteractorObserver* ctkVTKRenderView::interactorStyle()
 void ctkVTKRenderView::setCornerAnnotationText(const QString& text)
 {
   CTK_D(ctkVTKRenderView);
+  logger.trace(QString("setCornerAnnotationText: %1").arg(text));
   d->CornerAnnotation->ClearAllTexts();
   d->CornerAnnotation->SetText(2, text.toLatin1());
 }
@@ -188,6 +207,8 @@ void ctkVTKRenderView::setBackgroundColor(const QColor& newBackgroundColor)
 {
   CTK_D(ctkVTKRenderView);
 
+  logger.trace(QString("setBackgroundColor: %1").arg(newBackgroundColor.name()));
+
   d->Renderer->SetBackground(newBackgroundColor.redF(),
                              newBackgroundColor.greenF(),
                              newBackgroundColor.blueF());
@@ -220,6 +241,7 @@ vtkCamera* ctkVTKRenderView::activeCamera()
 void ctkVTKRenderView::resetCamera()
 {
   CTK_D(ctkVTKRenderView);
+  logger.trace("resetCamera");
   d->Renderer->ResetCamera();
 }
 

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

@@ -48,10 +48,11 @@ public:
   explicit ctkVTKRenderView(QWidget* parent = 0);
   virtual ~ctkVTKRenderView();
 
+public slots:
+
   /// If a render has already been scheduled, this called is a no-op
   void scheduleRender();
 
-public slots:
   /// Force a render even if a render is already ocurring
   void forceRender();
 

+ 9 - 0
Libs/Visualization/VTK/Widgets/ctkVTKSliceView.cpp

@@ -528,6 +528,7 @@ void ctkVTKSliceView::setRenderWindowLayout(int rowCount, int columnCount)
   d->RenderWindowColumnCount = columnCount;
 
   d->setupRendering();
+  d->setupCornerAnnotation();
 
   if (d->ImageData)
     {
@@ -574,3 +575,11 @@ void ctkVTKSliceView::setImageData(vtkImageData* newImageData)
   d->ImageData = newImageData;
 }
 
+
+//----------------------------------------------------------------------------
+void ctkVTKSliceView::resizeEvent(QResizeEvent * event)
+{
+  this->QWidget::resizeEvent(event);
+  emit this->resized(event);
+}
+

+ 10 - 3
Libs/Visualization/VTK/Widgets/ctkVTKSliceView.h

@@ -63,6 +63,9 @@ public slots:
   /// Force a render even if a render is already ocurring
   void forceRender();
 
+  /// Reset cameras associated with all renderWindowItem
+  void resetCamera();
+
 public:
 
   /// Get underlying RenderWindow
@@ -89,9 +92,6 @@ public:
 
   /// Set actice camera
   void setActiveCamera(vtkCamera* newActiveCamera);
-
-  /// Reset cameras associated with all renderWindowItem
-  void resetCamera();
   
   /// Return number of underlying renderer
   int rendererCount();
@@ -146,6 +146,13 @@ public:
   /// Set image data
   void setImageData(vtkImageData* newImageData);
   
+
+signals:
+  void resized(QResizeEvent*);
+
+protected:
+  virtual void resizeEvent(QResizeEvent * event);
+
 private:
   CTK_DECLARE_PRIVATE(ctkVTKSliceView);
 };