From d864bed4bab5d44f258ab78ba16d22a726e91833 Mon Sep 17 00:00:00 2001 From: Alexandre Gouaillard Date: Wed, 1 Apr 2009 02:05:24 +0000 Subject: [PATCH] ENH: Merging done. git-svn-id: svn+ssh://orchestra.med.harvard.edu/svn/megason/Code/GoFigure2@1152 ef826fda-c0ae-4237-af8e-f8dcbcf7929c --- branches/ColorViewer/CMakeLists.txt | 116 -- branches/ColorViewer/Doxyfile | 316 ---- branches/ColorViewer/Examples/CMakeLists.txt | 1 - .../ColorViewer/Examples/qt/CMakeLists.txt | 7 - .../qt/QColorImagePageView/CMakeLists.txt | 8 - .../ColorImagePageView.cxx | 40 - .../qt/QColorImagePageView/TestColorWidget.ui | 272 --- .../Examples/qt/QGoLUTDialog/CMakeLists.txt | 8 - .../qt/QGoLUTDialog/qgolutdialogtest.cxx | 13 - .../Examples/qt/QImagePageView/CMakeLists.txt | 8 - .../qt/QImagePageView/ImagePageView.cxx | 43 - .../qt/QImagePageView4DTracer/CMakeLists.txt | 11 - .../ImagePageViewTracer.cxx | 16 - .../TestTracerWidget.ui | 272 --- .../qt/QImagePageViewTracer/CMakeLists.txt | 11 - .../ImagePageViewTracer.cxx | 16 - .../QImagePageViewTracer/TestTracerWidget.ui | 272 --- .../ColorViewer/ExternalCode/CMakeLists.txt | 1 - .../ExternalCode/MegaVTK/CMakeLists.txt | 7 - .../ExternalCode/MegaVTK/qt/CMakeLists.txt | 47 - .../MegaVTK/qt/Form/QImageFileDialog.ui | 294 --- .../ExternalCode/MegaVTK/qt/LUTDialog.ui | 144 -- .../MegaVTK/qt/QColorImagePageView.cxx | 737 -------- .../MegaVTK/qt/QColorImagePageView.h | 179 -- .../ExternalCode/MegaVTK/qt/QGoLUTDialog.cxx | 171 -- .../ExternalCode/MegaVTK/qt/QGoLUTDialog.h | 82 - .../MegaVTK/qt/QImagePageView.cxx | 728 -------- .../ExternalCode/MegaVTK/qt/QImagePageView.h | 184 -- .../MegaVTK/qt/QImagePageView4DTracer.cxx | 232 --- .../MegaVTK/qt/QImagePageView4DTracer.h | 99 - .../MegaVTK/qt/QImagePageViewTracer.cxx | 963 ---------- .../MegaVTK/qt/QImagePageViewTracer.h | 217 --- .../MegaVTK/qt/QSplitterchild.cxx | 60 - .../ExternalCode/MegaVTK/qt/QSplitterchild.h | 63 - .../MegaVTK/vtkItk/CMakeLists.txt | 1 - .../MegaVTK/vtkItk/itkImageToVTKImageFilter.h | 104 -- .../vtkItk/itkImageToVTKImageFilter.txx | 140 -- .../MegaVTK/vtkItk/itkVTKImageToImageFilter.h | 107 -- .../vtkItk/itkVTKImageToImageFilter.txx | 144 -- .../MegaVTK/vtkRenderingAddOn/CMakeLists.txt | 23 - .../MegaVTK/vtkRenderingAddOn/lut/Asymmetry.h | 316 ---- .../MegaVTK/vtkRenderingAddOn/lut/Flow.h | 825 -------- .../MegaVTK/vtkRenderingAddOn/lut/GEColor.h | 825 -------- .../MegaVTK/vtkRenderingAddOn/lut/HotMetal.h | 825 -------- .../MegaVTK/vtkRenderingAddOn/lut/LONI.h | 261 --- .../MegaVTK/vtkRenderingAddOn/lut/LONI2.h | 176 -- .../MegaVTK/vtkRenderingAddOn/lut/Spectrum.h | 826 -------- .../vtkFillImageWithPolyData.cxx | 547 ------ .../vtkFillImageWithPolyData.h | 130 -- .../vtkImage3DCroppingBoxCallback.cxx | 127 -- .../vtkImage3DCroppingBoxCallback.h | 107 -- .../vtkImage3DImagePlaneCallback.cxx | 248 --- .../vtkImage3DImagePlaneCallback.h | 147 -- .../vtkImageBlendWithMask.cxx | 340 ---- .../vtkRenderingAddOn/vtkImageBlendWithMask.h | 130 -- .../vtkInteractorStyleImage2D.cxx | 328 ---- .../vtkInteractorStyleImage2D.h | 119 -- .../vtkLookupTableManager.cxx | 420 ----- .../vtkRenderingAddOn/vtkLookupTableManager.h | 158 -- .../vtkOrientationAnnotation.cxx | 115 -- .../vtkOrientationAnnotation.h | 110 -- .../vtkOrientedBoxWidget.cxx | 243 --- .../vtkRenderingAddOn/vtkOrientedBoxWidget.h | 113 -- .../vtkRenderingAddOn/vtkViewColorImage.cxx | 320 ---- .../vtkRenderingAddOn/vtkViewColorImage.h | 295 --- .../vtkRenderingAddOn/vtkViewColorImage2D.cxx | 812 -------- .../vtkRenderingAddOn/vtkViewColorImage2D.h | 271 --- .../vtkViewColorImage2DCollection.cxx | 275 --- .../vtkViewColorImage2DCollection.h | 244 --- .../vtkViewColorImage2DCommand.cxx | 269 --- .../vtkViewColorImage2DCommand.h | 124 -- .../vtkRenderingAddOn/vtkViewColorImage3D.cxx | 507 ----- .../vtkRenderingAddOn/vtkViewColorImage3D.h | 300 --- .../vtkRenderingAddOn/vtkViewImage.cxx | 383 ---- .../MegaVTK/vtkRenderingAddOn/vtkViewImage.h | 340 ---- .../vtkRenderingAddOn/vtkViewImage2D.cxx | 891 --------- .../vtkRenderingAddOn/vtkViewImage2D.h | 280 --- .../vtkViewImage2DCollection.cxx | 313 ---- .../vtkViewImage2DCollection.h | 255 --- .../vtkViewImage2DCommand.cxx | 336 ---- .../vtkRenderingAddOn/vtkViewImage2DCommand.h | 127 -- .../vtkViewImage2DWithContourWidget.cxx | 249 --- .../vtkViewImage2DWithContourWidget.h | 132 -- ...ViewImage2DWithContourWidgetCollection.cxx | 423 ----- ...tkViewImage2DWithContourWidgetCollection.h | 214 --- .../vtkRenderingAddOn/vtkViewImage3D.cxx | 567 ------ .../vtkRenderingAddOn/vtkViewImage3D.h | 335 ---- .../ExternalCode/itkQt/itkQtAdaptor.h | 197 -- .../ExternalCode/itkQt/itkQtProgressBar.cxx | 132 -- .../ExternalCode/itkQt/itkQtProgressBar.h | 95 - .../qticonloader/qticonloader.cxx | 351 ---- .../ExternalCode/qticonloader/qticonloader.h | 44 - .../ColorViewer/ExternalCode/vtkLSM/lzw.h | 150 -- .../ExternalCode/vtkLSM/vtkLSMReader.cxx | 1657 ----------------- .../ExternalCode/vtkLSM/vtkLSMReader.h | 404 ---- branches/ColorViewer/QGoMainWindow.cxx | 728 -------- branches/ColorViewer/QGoMainWindow.h | 187 -- branches/ColorViewer/go.ui | 1541 --------------- branches/ColorViewer/gofigure.cxx | 83 - branches/ColorViewer/resources/axes.qrc | 68 - branches/ColorViewer/resources/fig/4views.png | Bin 261 -> 0 bytes branches/ColorViewer/resources/fig/Hand.png | Bin 337 -> 0 bytes .../ColorViewer/resources/fig/LookupTable.png | Bin 479 -> 0 bytes .../resources/fig/VolumeRendering1.png | Bin 1891 -> 0 bytes .../resources/fig/VolumeRenderingIcon.png | Bin 1852 -> 0 bytes .../resources/fig/camera-photo.png | Bin 1256 -> 0 bytes .../resources/fig/document-open.png | Bin 1123 -> 0 bytes .../ColorViewer/resources/fig/filesave.png | Bin 1245 -> 0 bytes .../ColorViewer/resources/fig/filesaveas.png | Bin 1137 -> 0 bytes branches/ColorViewer/resources/fig/folder.png | Bin 276680 -> 0 bytes .../ColorViewer/resources/fig/page-zoom.png | Bin 1163 -> 0 bytes branches/ColorViewer/resources/fig/quit.png | Bin 9704 -> 0 bytes .../ColorViewer/resources/fig/rotation.png | Bin 1187 -> 0 bytes .../ColorViewer/resources/fig/scalarbar.png | Bin 204 -> 0 bytes .../ColorViewer/resources/fig/scaling.png | Bin 896 -> 0 bytes .../ColorViewer/resources/fig/selection.png | Bin 851 -> 0 bytes .../ColorViewer/resources/fig/selector.png | Bin 211 -> 0 bytes branches/ColorViewer/resources/fig/splash.jpg | Bin 82204 -> 0 bytes branches/ColorViewer/resources/fig/spline.png | Bin 1236 -> 0 bytes .../ColorViewer/resources/fig/system-quit.png | Bin 1466 -> 0 bytes branches/ColorViewer/resources/fig/tracer.png | Bin 1184 -> 0 bytes .../ColorViewer/resources/fig/translation.png | Bin 1089 -> 0 bytes branches/ColorViewer/resources/fig/xy.png | Bin 455 -> 0 bytes branches/ColorViewer/resources/fig/xyz.png | Bin 444 -> 0 bytes branches/ColorViewer/resources/fig/yz.png | Bin 456 -> 0 bytes branches/ColorViewer/resources/fig/zoom.png | Bin 1656 -> 0 bytes branches/ColorViewer/resources/fig/zx.png | Bin 456 -> 0 bytes 127 files changed, 27492 deletions(-) delete mode 100644 branches/ColorViewer/CMakeLists.txt delete mode 100644 branches/ColorViewer/Doxyfile delete mode 100644 branches/ColorViewer/Examples/CMakeLists.txt delete mode 100644 branches/ColorViewer/Examples/qt/CMakeLists.txt delete mode 100644 branches/ColorViewer/Examples/qt/QColorImagePageView/CMakeLists.txt delete mode 100644 branches/ColorViewer/Examples/qt/QColorImagePageView/ColorImagePageView.cxx delete mode 100644 branches/ColorViewer/Examples/qt/QColorImagePageView/TestColorWidget.ui delete mode 100644 branches/ColorViewer/Examples/qt/QGoLUTDialog/CMakeLists.txt delete mode 100644 branches/ColorViewer/Examples/qt/QGoLUTDialog/qgolutdialogtest.cxx delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageView/CMakeLists.txt delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageView/ImagePageView.cxx delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageView4DTracer/CMakeLists.txt delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageView4DTracer/ImagePageViewTracer.cxx delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageView4DTracer/TestTracerWidget.ui delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageViewTracer/CMakeLists.txt delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageViewTracer/ImagePageViewTracer.cxx delete mode 100644 branches/ColorViewer/Examples/qt/QImagePageViewTracer/TestTracerWidget.ui delete mode 100644 branches/ColorViewer/ExternalCode/CMakeLists.txt delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/CMakeLists.txt delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/CMakeLists.txt delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/Form/QImageFileDialog.ui delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/LUTDialog.ui delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.h delete mode 100755 branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.cxx delete mode 100755 branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/CMakeLists.txt delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.txx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.txx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/CMakeLists.txt delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Asymmetry.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Flow.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/GEColor.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/HotMetal.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI2.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Spectrum.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.h delete mode 100755 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.cxx delete mode 100755 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.h delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.cxx delete mode 100644 branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.h delete mode 100644 branches/ColorViewer/ExternalCode/itkQt/itkQtAdaptor.h delete mode 100644 branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.cxx delete mode 100644 branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.h delete mode 100644 branches/ColorViewer/ExternalCode/qticonloader/qticonloader.cxx delete mode 100644 branches/ColorViewer/ExternalCode/qticonloader/qticonloader.h delete mode 100644 branches/ColorViewer/ExternalCode/vtkLSM/lzw.h delete mode 100644 branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.cxx delete mode 100644 branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.h delete mode 100644 branches/ColorViewer/QGoMainWindow.cxx delete mode 100644 branches/ColorViewer/QGoMainWindow.h delete mode 100644 branches/ColorViewer/go.ui delete mode 100644 branches/ColorViewer/gofigure.cxx delete mode 100644 branches/ColorViewer/resources/axes.qrc delete mode 100644 branches/ColorViewer/resources/fig/4views.png delete mode 100644 branches/ColorViewer/resources/fig/Hand.png delete mode 100644 branches/ColorViewer/resources/fig/LookupTable.png delete mode 100644 branches/ColorViewer/resources/fig/VolumeRendering1.png delete mode 100644 branches/ColorViewer/resources/fig/VolumeRenderingIcon.png delete mode 100755 branches/ColorViewer/resources/fig/camera-photo.png delete mode 100644 branches/ColorViewer/resources/fig/document-open.png delete mode 100644 branches/ColorViewer/resources/fig/filesave.png delete mode 100644 branches/ColorViewer/resources/fig/filesaveas.png delete mode 100644 branches/ColorViewer/resources/fig/folder.png delete mode 100644 branches/ColorViewer/resources/fig/page-zoom.png delete mode 100644 branches/ColorViewer/resources/fig/quit.png delete mode 100644 branches/ColorViewer/resources/fig/rotation.png delete mode 100755 branches/ColorViewer/resources/fig/scalarbar.png delete mode 100644 branches/ColorViewer/resources/fig/scaling.png delete mode 100644 branches/ColorViewer/resources/fig/selection.png delete mode 100644 branches/ColorViewer/resources/fig/selector.png delete mode 100755 branches/ColorViewer/resources/fig/splash.jpg delete mode 100644 branches/ColorViewer/resources/fig/spline.png delete mode 100644 branches/ColorViewer/resources/fig/system-quit.png delete mode 100644 branches/ColorViewer/resources/fig/tracer.png delete mode 100644 branches/ColorViewer/resources/fig/translation.png delete mode 100644 branches/ColorViewer/resources/fig/xy.png delete mode 100644 branches/ColorViewer/resources/fig/xyz.png delete mode 100755 branches/ColorViewer/resources/fig/yz.png delete mode 100644 branches/ColorViewer/resources/fig/zoom.png delete mode 100644 branches/ColorViewer/resources/fig/zx.png diff --git a/branches/ColorViewer/CMakeLists.txt b/branches/ColorViewer/CMakeLists.txt deleted file mode 100644 index 32a5b619..00000000 --- a/branches/ColorViewer/CMakeLists.txt +++ /dev/null @@ -1,116 +0,0 @@ -PROJECT( QGOFIGURE ) - -CMAKE_MINIMUM_REQUIRED(VERSION 2.4) - -IF(COMMAND CMAKE_POLICY) - CMAKE_POLICY(VERSION 2.4) - CMAKE_POLICY(SET CMP0005 OLD) - CMAKE_POLICY(SET CMP0003 NEW) -ENDIF(COMMAND CMAKE_POLICY) - -# On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security -# warnings. Copied from ITK CMakeLists. -IF(WIN32) - IF(NOT BORLAND) - IF(NOT CYGWIN) - IF(NOT MINGW) - ADD_DEFINITIONS( - -D_CRT_FAR_MAPPINGS_NO_DEPRECATE - -D_CRT_IS_WCTYPE_NO_DEPRECATE - -D_CRT_MANAGED_FP_NO_DEPRECATE - -D_CRT_NONSTDC_NO_DEPRECATE - -D_CRT_SECURE_NO_DEPRECATE - -D_CRT_SECURE_NO_DEPRECATE_GLOBALS - -D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE - -D_CRT_TIME_FUNCTIONS_NO_DEPRECATE - -D_CRT_VCCLRIT_NO_DEPRECATE - -D_SCL_SECURE_NO_DEPRECATE - ) - ENDIF(NOT MINGW) - ENDIF(NOT CYGWIN) - ENDIF(NOT BORLAND) -ENDIF(WIN32) - -############################ -FIND_PACKAGE( VTK ) -IF( VTK_FOUND ) - INCLUDE( ${VTK_USE_FILE} ) - - IF( VTK_BUILD_SHARED_LIBS ) - SET(LIBS_STYLE "SHARED") - ELSE( VTK_BUILD_SHARED_LIBS ) - SET(LIBS_STYLE "STATIC") - ENDIF( VTK_BUILD_SHARED_LIBS ) - - ############################ - FIND_PACKAGE( ITK ) - IF( ITK_FOUND ) - INCLUDE( ${ITK_USE_FILE} ) - ENDIF( ITK_FOUND ) - - ############################ - # use what QVTK built with - SET(QT_QMAKE_EXECUTABLE ${VTK_QT_QMAKE_EXECUTABLE} CACHE FILEPATH "") - SET(QT_MOC_EXECUTABLE ${VTK_QT_MOC_EXECUTABLE} CACHE FILEPATH "") - SET(QT_UIC_EXECUTABLE ${VTK_QT_UIC_EXECUTABLE} CACHE FILEPATH "") - - FIND_PACKAGE(Qt4 REQUIRED) - - IF(QT_USE_FILE) - SET(QT_USE_QT3SUPPORT TRUE) - INCLUDE(${QT_USE_FILE}) - ELSE(QT_USE_FILE) - SET(QT_LIBRARIES ${QT_QT_LIBRARY}) - ENDIF(QT_USE_FILE) - - INCLUDE_DIRECTORIES( ${QT_INCLUDES} - ${QGOFIGURE_SOURCE_DIR} - ${QGOFIGURE_BINARY_DIR} - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/MegaVTK/vtkItk - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/MegaVTK/qt - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/MegaVTK/vtkRenderingAddOn - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/vtkLSM - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/itkQt - ) - - SET( QGOMAINWINDOW_HDRS QGoMainWindow.h - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/itkQt/itkQtAdaptor.h) - SET( QGOMAINWINDOW_SRC QGoMainWindow.cxx ) - - QT4_WRAP_UI( QGOMAINWINDOW_UI_HDRS go.ui ) - QT4_WRAP_CPP( QGOMAINWINDOW_MOC_SRC ${QGOMAINWINDOW_HDRS} ) - QT4_ADD_RESOURCES( QGOMAINWINDOW_QRC - ${QGOFIGURE_SOURCE_DIR}/resources/axes.qrc) - - SET_SOURCE_FILES_PROPERTIES( ${QGOMAINWINDOW_SRC} PROPERTIES - OBJECT_DEPENDS "${QGOMAINWINDOW_UI_HDRS}" ) - SET_SOURCE_FILES_PROPERTIES( ${QGOMAINWINDOW_MOC_SRC} PROPERTIES - OBJECT_DEPENDS "${QGOMAINWINDOW_UI_HDRS}" ) - - SUBDIRS( ExternalCode ) - SUBDIRS( Examples ) - - ADD_EXECUTABLE( gofigure - #MACOSX_BUNDLE - gofigure.cxx - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/itkQt/itkQtProgressBar.cxx - ${QGOFIGURE_SOURCE_DIR}/ExternalCode/vtkLSM/vtkLSMReader.cxx - ${QGOMAINWINDOW_SRC} - ${QGOMAINWINDOW_MOC_SRC} - ${QGOMAINWINDOW_QRC} ) - - TARGET_LINK_LIBRARIES( gofigure - QMegaVTKAddOn2 - ${QT_LIBRARIES} - QVTK - ITKCommon - ITKIO - ITKBasicFilters - ITKNumerics - vtkImaging - ) - - ADD_TEST( gofigure_TEST ${CXX_TEST_PATH}/gofigure ) -ENDIF( VTK_FOUND ) - - diff --git a/branches/ColorViewer/Doxyfile b/branches/ColorViewer/Doxyfile deleted file mode 100644 index 867c7f52..00000000 --- a/branches/ColorViewer/Doxyfile +++ /dev/null @@ -1,316 +0,0 @@ -# Doxyfile 1.5.6-KDevelop - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = QGO -PROJECT_NUMBER = $VERSION$ -OUTPUT_DIRECTORY = -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = /home/ajg23/ -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -OPTIMIZE_FOR_FORTRAN = NO -OPTIMIZE_OUTPUT_VHDL = NO -BUILTIN_STL_SUPPORT = NO -CPP_CLI_SUPPORT = NO -SIP_SUPPORT = NO -IDL_PROPERTY_SUPPORT = YES -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -TYPEDEF_HIDES_STRUCT = NO -SYMBOL_CACHE_SIZE = 0 -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_GROUP_NAMES = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = NO -SHOW_FILES = YES -SHOW_NAMESPACES = YES -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = /home/ajg23/SVNROOT/Code/gelas/trunk/experimental/go -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.vhd \ - *.vhdl \ - *.C \ - *.CC \ - *.C++ \ - *.II \ - *.I++ \ - *.H \ - *.HH \ - *.H++ \ - *.CS \ - *.PHP \ - *.PHP3 \ - *.M \ - *.MM \ - *.PY \ - *.F90 \ - *.F \ - *.VHD \ - *.VHDL \ - *.C \ - *.H \ - *.tlh \ - *.diff \ - *.patch \ - *.moc \ - *.xpm \ - *.dox -RECURSIVE = yes -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = NO -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -GENERATE_DOCSET = NO -DOCSET_FEEDNAME = "Doxygen generated docs" -DOCSET_BUNDLE_ID = org.doxygen.Project -HTML_DYNAMIC_SECTIONS = NO -CHM_FILE = -HHC_LOCATION = -QTHELP_FILE = -QTHELP_CONFIG = -DOXYGEN2QTHELP_LOC = -GENERATE_CHI = NO -CHM_INDEX_ENCODING = -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NONE -TREEVIEW_WIDTH = 250 -FORMULA_FONTSIZE = 10 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = yes -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = QGO.tag -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -MSCGEN_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -DOT_FONTNAME = FreeSans -DOT_FONTPATH = -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -DOT_GRAPH_MAX_NODES = 50 -MAX_DOT_GRAPH_DEPTH = 1000 -DOT_TRANSPARENT = YES -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO diff --git a/branches/ColorViewer/Examples/CMakeLists.txt b/branches/ColorViewer/Examples/CMakeLists.txt deleted file mode 100644 index 921465ec..00000000 --- a/branches/ColorViewer/Examples/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS( qt ) diff --git a/branches/ColorViewer/Examples/qt/CMakeLists.txt b/branches/ColorViewer/Examples/qt/CMakeLists.txt deleted file mode 100644 index 82d838a4..00000000 --- a/branches/ColorViewer/Examples/qt/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -SUBDIRS( - QColorImagePageView - QImagePageView - QImagePageViewTracer - QImagePageView4DTracer - QGoLUTDialog - ) diff --git a/branches/ColorViewer/Examples/qt/QColorImagePageView/CMakeLists.txt b/branches/ColorViewer/Examples/qt/QColorImagePageView/CMakeLists.txt deleted file mode 100644 index ac495f3b..00000000 --- a/branches/ColorViewer/Examples/qt/QColorImagePageView/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -ADD_EXECUTABLE( ColorImagePageView ColorImagePageView.cxx ) -TARGET_LINK_LIBRARIES( ColorImagePageView - QMegaVTKAddOn2 - ITKCommon - ITKIO - ITKBasicFilters - ITKNumerics -) diff --git a/branches/ColorViewer/Examples/qt/QColorImagePageView/ColorImagePageView.cxx b/branches/ColorViewer/Examples/qt/QColorImagePageView/ColorImagePageView.cxx deleted file mode 100644 index 856ddb55..00000000 --- a/branches/ColorViewer/Examples/qt/QColorImagePageView/ColorImagePageView.cxx +++ /dev/null @@ -1,40 +0,0 @@ -#include - -#include -#include -#include -#include - -#include - -#include "itkImageToVTKImageFilter.h" -#include "QColorImagePageView.h" - -int main( int argc, char** argv ) -{ - const unsigned int Dimension = 3; - typedef itk::RGBPixel< unsigned char > PixelType; - typedef itk::Image< PixelType, Dimension > ImageType; - typedef itk::ImageFileReader< ImageType > ImageReaderType; - typedef ImageReaderType::Pointer ImageReaderPointer; - - ImageReaderPointer reader = ImageReaderType::New(); - reader->SetFileName( argv[1] ); - reader->Update( ); - - typedef itk::ImageToVTKImageFilter< ImageType > ITKVTKConnectorType; - ITKVTKConnectorType::Pointer connector = ITKVTKConnectorType::New(); - connector->SetInput( reader->GetOutput() ); - connector->Update(); - - vtkImageData* image = connector->GetOutput(); - - QApplication app(argc, argv); - QColorImagePageView form; - form.SetImage( image ); - form.SetBackgroundColor( 0., 0., 0. ); - app.setMainWidget( &form ); - form.show( ); - - return app.exec(); -} diff --git a/branches/ColorViewer/Examples/qt/QColorImagePageView/TestColorWidget.ui b/branches/ColorViewer/Examples/qt/QColorImagePageView/TestColorWidget.ui deleted file mode 100644 index bb1d700b..00000000 --- a/branches/ColorViewer/Examples/qt/QColorImagePageView/TestColorWidget.ui +++ /dev/null @@ -1,272 +0,0 @@ - - Form - - - - 0 - 0 - 1434 - 829 - - - - Form - - - - - 10 - 180 - 131 - 111 - - - - Transform - - - true - - - false - - - - - 10 - 20 - 94 - 23 - - - - Translation - - - true - - - - - - 10 - 40 - 94 - 23 - - - - Rotation - - - - - - 10 - 60 - 94 - 23 - - - - Scaling - - - - - - 10 - 80 - 94 - 23 - - - - Copy - - - - - - - 10 - 0 - 131 - 71 - - - - Tracer - - - true - - - - - 10 - 40 - 94 - 23 - - - - Free Line - - - - - - 10 - 20 - 94 - 23 - - - - Polygon - - - true - - - - - - - 10 - 340 - 131 - 101 - - - - Label - - - - - 10 - 60 - 91 - 27 - - - - Validate - - - - - - 10 - 20 - 73 - 29 - - - - - - - Id - - - - - - - - - - - - 90 - 20 - 31 - 27 - - - - - - - - - - - 10 - 80 - 131 - 91 - - - - Edit - - - true - - - false - - - - - 10 - 20 - 94 - 23 - - - - Insert Node - - - true - - - - - - 10 - 40 - 101 - 23 - - - - Delete Node - - - - - - 10 - 60 - 94 - 23 - - - - Move Node - - - - - - - 10 - 300 - 131 - 27 - - - - Add Contour - - - - - - diff --git a/branches/ColorViewer/Examples/qt/QGoLUTDialog/CMakeLists.txt b/branches/ColorViewer/Examples/qt/QGoLUTDialog/CMakeLists.txt deleted file mode 100644 index 1b68aec9..00000000 --- a/branches/ColorViewer/Examples/qt/QGoLUTDialog/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -ADD_EXECUTABLE( qgolutdialog qgolutdialogtest.cxx ) -TARGET_LINK_LIBRARIES( qgolutdialog - QMegaVTKAddOn2 - ITKCommon - ITKIO - ITKBasicFilters - ITKNumerics - ) diff --git a/branches/ColorViewer/Examples/qt/QGoLUTDialog/qgolutdialogtest.cxx b/branches/ColorViewer/Examples/qt/QGoLUTDialog/qgolutdialogtest.cxx deleted file mode 100644 index 0ab1f67d..00000000 --- a/branches/ColorViewer/Examples/qt/QGoLUTDialog/qgolutdialogtest.cxx +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include "QGoLUTDialog.h" - -int main( int argc, char** argv ) -{ - QApplication app(argc, argv); - QGoLUTDialog lut; - - app.setMainWidget( &lut ); - lut.show( ); - - return app.exec(); -} diff --git a/branches/ColorViewer/Examples/qt/QImagePageView/CMakeLists.txt b/branches/ColorViewer/Examples/qt/QImagePageView/CMakeLists.txt deleted file mode 100644 index 098f47fe..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageView/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -ADD_EXECUTABLE( ImagePageView ImagePageView.cxx ) -TARGET_LINK_LIBRARIES( ImagePageView - QMegaVTKAddOn2 - ITKCommon - ITKIO - ITKBasicFilters - ITKNumerics -) diff --git a/branches/ColorViewer/Examples/qt/QImagePageView/ImagePageView.cxx b/branches/ColorViewer/Examples/qt/QImagePageView/ImagePageView.cxx deleted file mode 100644 index 8677b77a..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageView/ImagePageView.cxx +++ /dev/null @@ -1,43 +0,0 @@ -#include - -#include -#include -#include - -#include - -#include "itkImageToVTKImageFilter.h" -#include "QImagePageView.h" - -int main( int argc, char** argv ) -{ - const unsigned int Dimension = 3; - typedef unsigned char PixelType; - typedef itk::Image< PixelType, Dimension > ImageType; - - typedef itk::ImageFileReader< ImageType > ImageReaderType; - typedef ImageReaderType::Pointer ImageReaderPointer; - - ImageReaderPointer reader = ImageReaderType::New(); - reader->SetFileName( argv[1] ); - reader->Update( ); - - typedef itk::ImageToVTKImageFilter< ImageType > ITKVTKConnectorType; - ITKVTKConnectorType::Pointer connector = ITKVTKConnectorType::New(); - connector->SetInput( reader->GetOutput() ); - connector->Update(); - - vtkImageData* image = connector->GetOutput(); - // image->SetExtent( 0, size[0], 0, size[1], 0, size[2] ); - - QApplication app(argc, argv); - QImagePageView form; - form.SetImage( image ); - form.SetBackgroundColor( 0., 0., 0. ); -// form.FullScreenView2(); - app.setMainWidget( &form ); - form.show( ); - //form.SetView4ToVolumeRenderingMode(); - - return app.exec(); -} diff --git a/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/CMakeLists.txt b/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/CMakeLists.txt deleted file mode 100644 index 3c65dc92..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -ADD_EXECUTABLE( ImagePageViewTracer - ImagePageViewTracer.cxx - ../../../ExternalCode/vtkLSM/vtkLSMReader.cxx - ) -TARGET_LINK_LIBRARIES( ImagePageViewTracer - QMegaVTKAddOn2 - ITKCommon - ITKIO - ITKBasicFilters - ITKNumerics -) diff --git a/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/ImagePageViewTracer.cxx b/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/ImagePageViewTracer.cxx deleted file mode 100644 index f07e7147..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/ImagePageViewTracer.cxx +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#include "QImagePageView4DTracer.h" - -int main( int argc, char** argv ) -{ - QApplication app(argc, argv); - QImagePageView4DTracer form; - form.setMinimumSize( 800, 600 ); - form.SetFileName( argv[1] ); - form.SetColorVizu( 0 ); - app.setMainWidget( &form ); - form.show( ); - - return app.exec(); -} diff --git a/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/TestTracerWidget.ui b/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/TestTracerWidget.ui deleted file mode 100644 index bb1d700b..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageView4DTracer/TestTracerWidget.ui +++ /dev/null @@ -1,272 +0,0 @@ - - Form - - - - 0 - 0 - 1434 - 829 - - - - Form - - - - - 10 - 180 - 131 - 111 - - - - Transform - - - true - - - false - - - - - 10 - 20 - 94 - 23 - - - - Translation - - - true - - - - - - 10 - 40 - 94 - 23 - - - - Rotation - - - - - - 10 - 60 - 94 - 23 - - - - Scaling - - - - - - 10 - 80 - 94 - 23 - - - - Copy - - - - - - - 10 - 0 - 131 - 71 - - - - Tracer - - - true - - - - - 10 - 40 - 94 - 23 - - - - Free Line - - - - - - 10 - 20 - 94 - 23 - - - - Polygon - - - true - - - - - - - 10 - 340 - 131 - 101 - - - - Label - - - - - 10 - 60 - 91 - 27 - - - - Validate - - - - - - 10 - 20 - 73 - 29 - - - - - - - Id - - - - - - - - - - - - 90 - 20 - 31 - 27 - - - - - - - - - - - 10 - 80 - 131 - 91 - - - - Edit - - - true - - - false - - - - - 10 - 20 - 94 - 23 - - - - Insert Node - - - true - - - - - - 10 - 40 - 101 - 23 - - - - Delete Node - - - - - - 10 - 60 - 94 - 23 - - - - Move Node - - - - - - - 10 - 300 - 131 - 27 - - - - Add Contour - - - - - - diff --git a/branches/ColorViewer/Examples/qt/QImagePageViewTracer/CMakeLists.txt b/branches/ColorViewer/Examples/qt/QImagePageViewTracer/CMakeLists.txt deleted file mode 100644 index 3c65dc92..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageViewTracer/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -ADD_EXECUTABLE( ImagePageViewTracer - ImagePageViewTracer.cxx - ../../../ExternalCode/vtkLSM/vtkLSMReader.cxx - ) -TARGET_LINK_LIBRARIES( ImagePageViewTracer - QMegaVTKAddOn2 - ITKCommon - ITKIO - ITKBasicFilters - ITKNumerics -) diff --git a/branches/ColorViewer/Examples/qt/QImagePageViewTracer/ImagePageViewTracer.cxx b/branches/ColorViewer/Examples/qt/QImagePageViewTracer/ImagePageViewTracer.cxx deleted file mode 100644 index f07e7147..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageViewTracer/ImagePageViewTracer.cxx +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#include "QImagePageView4DTracer.h" - -int main( int argc, char** argv ) -{ - QApplication app(argc, argv); - QImagePageView4DTracer form; - form.setMinimumSize( 800, 600 ); - form.SetFileName( argv[1] ); - form.SetColorVizu( 0 ); - app.setMainWidget( &form ); - form.show( ); - - return app.exec(); -} diff --git a/branches/ColorViewer/Examples/qt/QImagePageViewTracer/TestTracerWidget.ui b/branches/ColorViewer/Examples/qt/QImagePageViewTracer/TestTracerWidget.ui deleted file mode 100644 index bb1d700b..00000000 --- a/branches/ColorViewer/Examples/qt/QImagePageViewTracer/TestTracerWidget.ui +++ /dev/null @@ -1,272 +0,0 @@ - - Form - - - - 0 - 0 - 1434 - 829 - - - - Form - - - - - 10 - 180 - 131 - 111 - - - - Transform - - - true - - - false - - - - - 10 - 20 - 94 - 23 - - - - Translation - - - true - - - - - - 10 - 40 - 94 - 23 - - - - Rotation - - - - - - 10 - 60 - 94 - 23 - - - - Scaling - - - - - - 10 - 80 - 94 - 23 - - - - Copy - - - - - - - 10 - 0 - 131 - 71 - - - - Tracer - - - true - - - - - 10 - 40 - 94 - 23 - - - - Free Line - - - - - - 10 - 20 - 94 - 23 - - - - Polygon - - - true - - - - - - - 10 - 340 - 131 - 101 - - - - Label - - - - - 10 - 60 - 91 - 27 - - - - Validate - - - - - - 10 - 20 - 73 - 29 - - - - - - - Id - - - - - - - - - - - - 90 - 20 - 31 - 27 - - - - - - - - - - - 10 - 80 - 131 - 91 - - - - Edit - - - true - - - false - - - - - 10 - 20 - 94 - 23 - - - - Insert Node - - - true - - - - - - 10 - 40 - 101 - 23 - - - - Delete Node - - - - - - 10 - 60 - 94 - 23 - - - - Move Node - - - - - - - 10 - 300 - 131 - 27 - - - - Add Contour - - - - - - diff --git a/branches/ColorViewer/ExternalCode/CMakeLists.txt b/branches/ColorViewer/ExternalCode/CMakeLists.txt deleted file mode 100644 index 53352e8f..00000000 --- a/branches/ColorViewer/ExternalCode/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS( MegaVTK ) diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/CMakeLists.txt b/branches/ColorViewer/ExternalCode/MegaVTK/CMakeLists.txt deleted file mode 100644 index 2f99dcd3..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -SUBDIRS( qt ) -SUBDIRS( vtkItk ) -SUBDIRS( vtkRenderingAddOn ) - - - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/CMakeLists.txt b/branches/ColorViewer/ExternalCode/MegaVTK/qt/CMakeLists.txt deleted file mode 100644 index ffee7e0f..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -SET( QMegaVTKAddOn_NAME2 - QGoLUTDialog - QColorImagePageView - QImagePageView - QImagePageViewTracer - QImagePageView4DTracer - QSplitterchild - ) - -SET( QMegaVTKAddOn_SRC2 - QGoLUTDialog.cxx - QColorImagePageView.cxx - QImagePageView.cxx - QImagePageViewTracer.cxx - QImagePageView4DTracer.cxx - QSplitterchild.cxx - ) - -FOREACH( src ${QMegaVTKAddOn_NAME2} ) - QT4_WRAP_CPP( ${src}_MOC_SRC2 ${src}.h ) -ENDFOREACH( src ) - -ADD_LIBRARY( QMegaVTKAddOn2 - ${LIBS_STYLE} - ${QGoLUTDialog_MOC_SRC2} - ${QImagePageView_MOC_SRC2} - ${QImagePageViewTracer_MOC_SRC2} - ${QColorImagePageView_MOC_SRC2} - ${QMegaVTKAddOn_SRC2} - ${QImagePageView4DTracer_MOC_SRC2} - ${QSplitterchild_MOC_SRC2} - ) - -SET( QMegaVTKAddOn2_LIBS - QMegaVTKAddOn2 - vtkRenderingAddOn2 - QVTK - ${QT_LIBRARIES} - ) - -TARGET_LINK_LIBRARIES( QMegaVTKAddOn2 - ${QMegaVTKAddOn2_LIBS} - ) - -INSTALL_TARGETS(/lib QMegaVTKAddOn2) - -INSTALL_FILES(/include "(\\.h|\\.txx)$") diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/Form/QImageFileDialog.ui b/branches/ColorViewer/ExternalCode/MegaVTK/qt/Form/QImageFileDialog.ui deleted file mode 100644 index 51d3ae2e..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/Form/QImageFileDialog.ui +++ /dev/null @@ -1,294 +0,0 @@ - - Form - - - - 0 - 0 - 776 - 491 - - - - Form - - - - - -1 - -1 - 491 - 461 - - - - - - - - - - 100 - 150 - - - - - - - - Qt::Vertical - - - - 20 - 17 - - - - - - - - - - Size - - - - - - - Qt::Horizontal - - - - 20 - 20 - - - - - - - - true - - - QAbstractSpinBox::NoButtons - - - - - - - QAbstractSpinBox::NoButtons - - - - - - - false - - - true - - - true - - - QAbstractSpinBox::NoButtons - - - - - - - Qt::Horizontal - - - - 98 - 20 - - - - - - - - Spacing - - - - - - - Qt::Horizontal - - - - 20 - 20 - - - - - - - - true - - - QAbstractSpinBox::NoButtons - - - - - - - QAbstractSpinBox::NoButtons - - - - - - - false - - - true - - - true - - - QAbstractSpinBox::NoButtons - - - - - - - Qt::Horizontal - - - - 98 - 20 - - - - - - - - Origin - - - - - - - Qt::Horizontal - - - - 20 - 20 - - - - - - - - true - - - QAbstractSpinBox::NoButtons - - - - - - - QAbstractSpinBox::NoButtons - - - - - - - false - - - true - - - true - - - QAbstractSpinBox::NoButtons - - - - - - - Qt::Horizontal - - - - 98 - 20 - - - - - - - - - - Qt::Vertical - - - - 20 - 18 - - - - - - - - - - Additional -Information - - - - - - - - - - - - - - - - QVTKWidget - QWidget -
QVTKWidget.h
-
-
- - -
diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/LUTDialog.ui b/branches/ColorViewer/ExternalCode/MegaVTK/qt/LUTDialog.ui deleted file mode 100644 index cadd530f..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/LUTDialog.ui +++ /dev/null @@ -1,144 +0,0 @@ - - LUTDialog - - - - 0 - 0 - 321 - 203 - - - - Dialog - - - - - 10 - 50 - 301 - 100 - - - - - - - 10 - 10 - 301 - 28 - - - - - - - Lookup Table - - - - - - - Qt::RightToLeft - - - false - - - false - - - -1 - - - true - - - - - - - - - 11 - 161 - 298 - 28 - - - - - - - Qt::Horizontal - - - - 166 - 20 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - false - - - - - - - - - QVTKWidget - QWidget -
QVTKWidget.h
-
-
- - - - buttonBox - accepted() - LUTDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - LUTDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - -
diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.cxx deleted file mode 100644 index 02343ec8..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.cxx +++ /dev/null @@ -1,737 +0,0 @@ -/*========================================================================= - Author: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "QColorImagePageView.h" -#include "QSplitterchild.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -QColorImagePageView::QColorImagePageView( QWidget* parent ) : QWidget( parent ) -{ - IsFullScreen = 0; - SnapshotId = 1; - - Tag = QString( "QColorImagePageView" ); - Image = 0; - - Pool = vtkViewColorImage2DCollection::New(); - View3D = vtkViewColorImage3D::New(); - - setupUi( this ); - QObject::connect( this->slider1, SIGNAL( valueChanged( int ) ), - this, SLOT( SetSlideView1( int ) ) ); - QObject::connect( this->slider2, SIGNAL( valueChanged( int ) ), - this, SLOT( SetSlideView2( int ) ) ); - QObject::connect( this->slider3, SIGNAL( valueChanged( int ) ), - this, SLOT( SetSlideView3( int ) ) ); - - QObject::connect( this->htSplitter, SIGNAL( splitterMoved( int, int ) ), - this->hbSplitter, SLOT( moveSplitter( int, int ) ) ); - QObject::connect(this->hbSplitter, SIGNAL( splitterMoved( int, int ) ), - this->htSplitter, SLOT( moveSplitter( int, int ) ) ); - -} - -QColorImagePageView::~QColorImagePageView() -{ - Pool->Delete(); - View3D->Delete(); -} - -void QColorImagePageView::setupUi( QWidget* parent ) -{ - if(parent->objectName().isEmpty()) - { - parent->resize(800, 800); - } - - QList< int > list_size; - list_size.push_back( 10 ); - list_size.push_back( 10 ); - - this->vSplitter = new QSplitter( Qt::Vertical, parent ); - - this->htSplitter = new QSplitterchild( this->vSplitter ); - this->hbSplitter = new QSplitterchild( this->vSplitter ); - - this->vSplitter->addWidget(this->htSplitter); - this->vSplitter->addWidget(this->hbSplitter); - this->vSplitter->setSizes( list_size ); - this->vSplitter->resize( 800, 800 ); - - this->qvtkWidget_XY = new QVTKWidget; - this->slider1 = new QSlider( Qt::Vertical ); - this->LayOut1 = new QHBoxLayout; - this->LayOut1->addWidget( this->qvtkWidget_XY ); - this->LayOut1->addWidget( this->slider1 ); - this->LayOutWidget1 = new QWidget; - this->LayOutWidget1->setLayout( this->LayOut1 ); - this->htSplitter->addWidget( this->LayOutWidget1 ); - - this->qvtkWidget_2 = new QVTKWidget; - this->slider2 = new QSlider( Qt::Vertical ); - this->LayOut2 = new QHBoxLayout; - this->LayOut2->addWidget( this->qvtkWidget_2 ); - this->LayOut2->addWidget( this->slider2 ); - this->LayOutWidget2 = new QWidget; - this->LayOutWidget2->setLayout( this->LayOut2 ); - this->hbSplitter->addWidget( this->LayOutWidget2 ); -// this->htSplitter->setSizes( list_size ); - - this->qvtkWidget_3 = new QVTKWidget; - this->slider3 = new QSlider( Qt::Vertical ); - this->LayOut3 = new QHBoxLayout; - this->LayOut3->addWidget( this->qvtkWidget_3 ); - this->LayOut3->addWidget( this->slider3 ); - this->LayOutWidget3 = new QWidget; - this->LayOutWidget3->setLayout( this->LayOut3 ); - this->htSplitter->addWidget( this->LayOutWidget3 ); - - this->qvtkWidget_XYZ = new QVTKWidget; - this->Spacer = new QSpacerItem( 27, 10, - QSizePolicy::Minimum, QSizePolicy::Minimum); - this->LayOut4 = new QHBoxLayout; - this->LayOut4->addWidget( this->qvtkWidget_XYZ ); - this->LayOut4->addItem( this->Spacer ); - this->LayOutWidget4 = new QWidget; - this->LayOutWidget4->setLayout( this->LayOut4 ); - this->hbSplitter->addWidget( this->LayOutWidget4 ); - - vtkRenderWindow* renwin4 = this->qvtkWidget_XYZ->GetRenderWindow( ); - View3D->SetRenderWindow( renwin4 ); - - retranslateUi(parent); - - QMetaObject::connectSlotsByName(parent); -} // setupUi - -void QColorImagePageView::retranslateUi(QWidget *parent) -{ - parent->setWindowTitle( this->Tag ); - Q_UNUSED(parent); -} - -bool QColorImagePageView::BuildScreenshotFromImage( vtkImageData* image, - vtkImageData* screenshot, - int size ) -{ - if (!image || !screenshot) - { - return false; - } - - // Empty image, remove thumbnail/screenshot - - int image_dims[3]; - image->GetDimensions(image_dims); - if (image_dims[0] == 0 || - image_dims[1] == 0 || - image_dims[2] == 0) - { - return false; - } - - double factor; - vtkImageData *resample_input, *resample_output; - - // First, let's make sure we are processing the image as it - // is by clipping its UpdateExtent. By doing so, we prevent our resample - // and permute filter the process the image's *whole* extent. - - vtkImageClip *clip = vtkImageClip::New(); - clip->SetInput(image); - clip->SetOutputWholeExtent(image->GetUpdateExtent()); - clip->Update(); - - // Permute, as a convenience - - int clip_dims[3]; - clip->GetOutput()->GetDimensions(clip_dims); - - vtkImagePermute *permute = NULL; - if (clip_dims[2] != 1) - { - permute = vtkImagePermute::New(); - permute->SetInput(clip->GetOutput()); - if (clip_dims[0] == 1) - { - permute->SetFilteredAxes(1, 2, 0); - } - else - { - permute->SetFilteredAxes(0, 2, 1); - } - resample_input = permute->GetOutput(); - } - else - { - resample_input = clip->GetOutput(); - } - - resample_input->Update(); - int resample_input_dims[3];//, resample_output_dims[3]; - - resample_input->GetDimensions(resample_input_dims); - double *resample_input_spacing = resample_input->GetSpacing(); - - int large_dim = 0, small_dim = 1; - if (resample_input_dims[0] < resample_input_dims[1]) - { - large_dim = 1; - small_dim = 0; - } - - if( size != 0 ) - { - vtkImageResample *resample = vtkImageResample::New(); - resample->SetInput(resample_input); - resample->SetInterpolationModeToCubic(); - resample->SetDimensionality(2); - - // Create the screenshot - - factor = static_cast< double >( size ) / - static_cast< double >( resample_input_dims[large_dim] ); - - resample->SetAxisMagnificationFactor(large_dim, factor); - resample->SetAxisMagnificationFactor( - small_dim, factor * (resample_input_spacing[small_dim] / - resample_input_spacing[large_dim])); - resample->Update(); - resample_output = resample->GetOutput(); - - screenshot->ShallowCopy( resample_output ); - resample->Delete(); - } - else - { - screenshot->ShallowCopy( resample_input ); - } - - // Deallocate - clip->Delete(); - - if( permute ) - { - permute->Delete(); - } - - return true; -} - -bool QColorImagePageView::BuildScreenshotFromRenderWindow( - vtkRenderWindow *win, - vtkImageData* screenshot, - int size ) -{ - if( win && screenshot ) - { - vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New(); - filter->ShouldRerenderOff(); - filter->SetInput( win ); - filter->Update(); - bool res = this->BuildScreenshotFromImage( filter->GetOutput(), - screenshot, size ); - filter->Delete(); - return res; - } - return false; -} - -void QColorImagePageView::SnapshotView( QVTKWidget* iWidget, - const SnapshotImageType& iType, - const QString& iBaseName ) -{ - vtkImageData* image = vtkImageData::New(); - BuildScreenshotFromRenderWindow( iWidget->GetRenderWindow(), - image, 0 ); - QString filename = iBaseName; - filename.append( QString( "%1" ).arg( SnapshotId ) ); - - switch( iType ) - { - default: - case BMP: - { - filename.append( ".bmp" ); - vtkBMPWriter* bmp_writer = vtkBMPWriter::New(); - bmp_writer->SetInput( image ); - bmp_writer->SetFileName( filename.toAscii( ).constData( ) ); - bmp_writer->Write(); - bmp_writer->Delete(); - } - break; - case EPS: - { - filename.append( ".eps" ); - vtkPostScriptWriter* eps_writer = vtkPostScriptWriter::New(); - eps_writer->SetInput( image ); - eps_writer->SetFileName( filename.toAscii( ).constData( ) ); - eps_writer->Write(); - eps_writer->Delete(); - } - break; - case JPEG: - { - filename.append( ".jpeg" ); - vtkJPEGWriter* jpeg_writer = vtkJPEGWriter::New(); - jpeg_writer->SetInput( image ); - jpeg_writer->SetFileName( filename.toAscii( ).constData( ) ); - jpeg_writer->Write(); - jpeg_writer->Delete(); - } - break; - case PNG: - { - filename.append( ".png" ); - vtkPNGWriter* png_writer = vtkPNGWriter::New(); - png_writer->SetInput( image ); - png_writer->SetFileName( filename.toAscii( ).constData( ) ); - png_writer->Write(); - png_writer->Delete(); - } - break; - case TIFF: - { - filename.append( ".tiff" ); - vtkTIFFWriter* tiff_writer = vtkTIFFWriter::New(); - tiff_writer->SetInput( image ); - tiff_writer->SetFileName( filename.toAscii( ).constData( ) ); - tiff_writer->Write(); - tiff_writer->Delete(); - } - break; - } - SnapshotId++; - image->Delete(); -} - -void QColorImagePageView::SnapshotViewXY( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_XY, iType, iBaseName ); -} - -void QColorImagePageView::SnapshotView2( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_2, iType, iBaseName ); -} -void QColorImagePageView::SnapshotView3( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_3, iType, iBaseName ); -} -void QColorImagePageView::SnapshotViewXYZ( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_XYZ, iType, iBaseName ); -} - -void QColorImagePageView::SetFullScreenView( const int& iS ) -{ - if( IsFullScreen == iS ) - IsFullScreen = 0; - else - IsFullScreen = iS; - - switch( IsFullScreen ) - { - default: - case 0: - { - LayOutWidget1->show(); - LayOutWidget2->show(); - LayOutWidget3->show(); - LayOutWidget4->show(); - break; - } - case 1: - { - LayOutWidget1->show(); - LayOutWidget2->hide(); - LayOutWidget3->hide(); - LayOutWidget4->hide(); - break; - } - case 2: - { - LayOutWidget1->hide(); - LayOutWidget2->show(); - LayOutWidget3->hide(); - LayOutWidget4->hide(); - break; - } - case 3: - { - LayOutWidget1->hide(); - LayOutWidget2->hide(); - LayOutWidget3->show(); - LayOutWidget4->hide(); - break; - } - case 4: - { - LayOutWidget1->hide(); - LayOutWidget2->hide(); - LayOutWidget3->hide(); - LayOutWidget4->show(); - break; - } - } -} - -int QColorImagePageView::GetFullScreenView( ) const -{ - return IsFullScreen; -} - -double* QColorImagePageView::GetBackgroundColor() -{ - return this->Pool->GetItem( 0 )->GetBackground(); -} - -void QColorImagePageView::GetBackgroundColor( double& r, - double& g, double& b ) -{ - double* rgb = this->Pool->GetItem( 0 )->GetBackground(); - r = rgb[0]; - g = rgb[1]; - b = rgb[2]; -} - -void QColorImagePageView::SetBackgroundColor( const double& r, -const double& g, const double& b ) -{ - double textcolor[3]; - textcolor[0] = 1. - r; - textcolor[1] = 1. - g; - textcolor[2] = 1. - b; - - double rgb[3] = {r, g, b }; - - this->Pool->SyncSetBackground( rgb ); - - vtkTextProperty* property = this->Pool->GetItem( 0 )->GetTextProperty(); -// property->SetFontFamilyToArial(); -// property->SetFontSize( 14 ); - property->SetColor( textcolor ); - this->Pool->SyncSetTextProperty( property ); -} - -void QColorImagePageView::SetBackgroundColor( double rgb[3] ) -{ - double textcolor[3]; - textcolor[0] = 1. - rgb[0]; - textcolor[1] = 1. - rgb[1]; - textcolor[2] = 1. - rgb[2]; - - this->Pool->SyncSetBackground( rgb ); - - vtkTextProperty* property = this->Pool->GetItem( 0 )->GetTextProperty(); -// property->SetFontFamilyToArial(); -// property->SetFontSize( 14 ); - property->SetColor( textcolor ); - this->Pool->SyncSetTextProperty( property ); -} - -void QColorImagePageView::SetBackgroundColor( const QColor& iColor ) -{ - int r, g, b; - iColor.getRgb( &r, &g, &b ); - double rgb[3]; - rgb[0] = static_cast< double >( r ) / 255.; - rgb[1] = static_cast< double >( g ) / 255.; - rgb[2] = static_cast< double >( b ) / 255.; - - double textcolor[3]; - textcolor[0] = 1. - rgb[0]; - textcolor[1] = 1. - rgb[1]; - textcolor[2] = 1. - rgb[2]; - - this->Pool->SyncSetBackground( rgb ); - - vtkTextProperty* property = this->Pool->GetItem( 0 )->GetTextProperty(); -// property->SetFontFamilyToArial(); -// property->SetFontSize( 14 ); - property->SetColor( textcolor ); - this->Pool->SyncSetTextProperty( property ); -} - -QVTKWidget* QColorImagePageView::GetActiveQVTKWidget( ) -{ - - switch(this->IsFullScreen) - { - case 1 : - return qvtkWidget_XY; - case 2 : - return qvtkWidget_2; - case 3 : - return qvtkWidget_3; - default : - return qvtkWidget_XYZ; - } -} - - -vtkViewColorImage* QColorImagePageView::GetActiveView() -{ - switch(this->IsFullScreen) - { - case 1 : - return this->Pool->GetItem(0); - case 2 : - return this->Pool->GetItem(1); - case 3 : - return this->Pool->GetItem(2); - default : - return this->Pool->GetItem(3); - } -} - -void QColorImagePageView::SetLookupTable( vtkLookupTable* lut ) -{ -} - -void QColorImagePageView::quadview() -{ - SetFullScreenView( 0 ); -} - -void QColorImagePageView::FullScreenViewXY () -{ - SetFullScreenView( 1 ); -} - - -void QColorImagePageView::FullScreenView2( ) -{ - SetFullScreenView( 2 ); -} - - -void QColorImagePageView::FullScreenView3( ) -{ - SetFullScreenView( 3 ); -} - - -void QColorImagePageView::FullScreenViewXYZ ( ) -{ - SetFullScreenView( 4 ); -} - -void QColorImagePageView::SetView3DToTriPlanarMode() -{ - View3D->SetTriPlanarRenderingOn(); - View3D->SetVolumeRenderingOff(); - View3D->Render(); -} -// -void QColorImagePageView::SetView3DToVolumeRenderingMode() -{ - View3D->SetTriPlanarRenderingOff(); - View3D->SetVolumeRenderingOn(); - View3D->Render(); -} - -void QColorImagePageView::SetImage( vtkImageData* input ) -{ - if( !input ) - return; - else - { - this->Image = input; - - vtkViewColorImage2D* View1 = - vtkViewColorImage2D::New(); - View1->SetInput( this->Image ); - View1->SetViewConvention( vtkViewColorImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin1 = this->qvtkWidget_XY->GetRenderWindow( ); - View1->SetupInteractor( this->qvtkWidget_XY->GetInteractor() ); - View1->SetRenderWindow( renwin1 ); - View1->SetRenderer( renwin1->GetRenderers()->GetFirstRenderer() ); - View1->SetViewOrientation( vtkViewColorImage2D::VIEW_ORIENTATION_AXIAL ); - this->Pool->AddItem( View1 ); - this->View3D->Add2DPhantom( 0, View1->GetImageActor(), View1->GetSlicePlane() ); - - int *range = View1->GetSliceRange(); - - this->slider1->setMinimum( range[0] ); - this->slider1->setMaximum( range[1] ); - View1->Delete(); - - vtkViewColorImage2D* View2 = - vtkViewColorImage2D::New(); - View2->SetInput( this->Image ); - View2->SetViewConvention( vtkViewColorImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin2 = this->qvtkWidget_2->GetRenderWindow( ); - View2->SetRenderWindow( renwin2 ); - View2->SetRenderer( renwin2->GetRenderers()->GetFirstRenderer() ); - View2->SetupInteractor( this->qvtkWidget_2->GetInteractor() ); - View2->SetViewOrientation (vtkViewColorImage2D::VIEW_ORIENTATION_CORONAL); - this->Pool->AddItem( View2 ); - this->View3D->Add2DPhantom( 1, View2->GetImageActor(), View2->GetSlicePlane() ); - - range = View2->GetSliceRange(); - this->slider2->setMinimum( range[0] ); - this->slider2->setMaximum( range[1] ); - View2->Delete(); - - vtkViewColorImage2D* View3 = - vtkViewColorImage2D::New(); - View3->SetInput( this->Image ); - View3->SetViewConvention( vtkViewColorImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin3 = this->qvtkWidget_3->GetRenderWindow( ); - View3->SetRenderWindow( renwin3 ); - View3->SetRenderer( renwin3->GetRenderers()->GetFirstRenderer() ); - View3->SetupInteractor( this->qvtkWidget_3->GetInteractor() ); - View3->SetViewOrientation (vtkViewColorImage2D::VIEW_ORIENTATION_SAGITTAL); - - this->Pool->AddItem( View3 ); - this->View3D->Add2DPhantom( 2, View3->GetImageActor(), View3->GetSlicePlane() ); - - range = View3->GetSliceRange(); - this->slider3->setMinimum( range[0] ); - this->slider3->setMaximum( range[1] ); - View3->Delete(); - - int size[2] = {400, 400}; - this->Pool->SyncSetSize (size); - - vtkRenderWindow* renwin4 = this->qvtkWidget_XYZ->GetRenderWindow( ); - this->View3D->SetupInteractor( this->qvtkWidget_XYZ->GetInteractor() ); - this->View3D->SetInput( this->Image ); - this->View3D->SetVolumeRenderingOff(); - this->View3D->ResetCamera(); - this->Pool->SetExtraRenderWindow( renwin4 ); - - this->Pool->Initialize(); - this->Pool->SyncSetShowAnnotations( true ); - this->Pool->SyncSetBackground( this->Pool->GetItem(0)->GetBackground() ); - this->Pool->SyncSetTextProperty( this->Pool->GetItem(0)->GetTextProperty()); - this->Pool->SyncRender(); - this->Pool->SyncReset(); - - this->slider1->setValue( (this->slider1->minimum()+this->slider1->maximum())/2 ); - this->slider2->setValue( (this->slider2->minimum()+this->slider2->maximum())/2 ); - this->slider3->setValue( (this->slider3->minimum()+this->slider3->maximum())/2 ); - } -} - -void QColorImagePageView::SetShowAnnotations( const bool& iState ) -{ - this->Pool->SyncSetShowAnnotations( iState ); -} - -void QColorImagePageView::SetTag( const QString& iTag ) -{ - this->Tag = iTag; -} - -QString QColorImagePageView::GetTag( ) const -{ - return this->Tag; -} - -void QColorImagePageView::SetCellId( const unsigned int& iId ) -{ - this->CellId = iId; -} - -unsigned int QColorImagePageView::GetCellId() const -{ - return this->CellId; -} - -void QColorImagePageView::resizeEvent( QResizeEvent* event ) -{ - QWidget::resizeEvent( event ); - vSplitter->resize( event->size() ); -} - - -void QColorImagePageView::ValidateContour( - const int& iId, - const QColor& iColor, - const bool& iSave ) -{ -} - -void QColorImagePageView::ReinitializeContour( ) -{ -} - -void QColorImagePageView::SetSlideView1( const int& iSlice ) -{ - this->Pool->GetItem( 0 )->SetSlice( iSlice ); - this->Pool->SyncRender(); -} - -void QColorImagePageView::SetSlideView2( const int& iSlice ) -{ - this->Pool->GetItem( 1 )->SetSlice( iSlice ); - this->Pool->SyncRender(); -} - -void QColorImagePageView::SetSlideView3( const int& iSlice ) -{ - this->Pool->GetItem( 2 )->SetSlice( iSlice ); - this->Pool->SyncRender(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.h b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.h deleted file mode 100644 index 20c5180a..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QColorImagePageView.h +++ /dev/null @@ -1,179 +0,0 @@ -/*========================================================================= - Authors: Thhe GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __QColorImagePageView -#define __QColorImagePageView - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "vtkViewColorImage3D.h" -#include "vtkViewColorImage2D.h" -#include "vtkViewColorImage2DCollection.h" -#include "QSplitterchild.h" - -/** -\class QColorImagePageView -*/ -class QColorImagePageView : public QWidget -{ - Q_OBJECT -public: - explicit QColorImagePageView( QWidget* parent = 0 ); - ~QColorImagePageView(); - - void SetImage( vtkImageData* input ); - - void setupUi( QWidget *Form ); - void retranslateUi(QWidget *Form); - - int GetFullScreenView( ) const; - - QVTKWidget* GetActiveQVTKWidget( ); - vtkViewColorImage* GetActiveView(); - - enum SnapshotImageType - { - BMP = 0, - EPS, - JPEG, - PNG, - TIFF - }; - - bool BuildScreenshotFromImage(vtkImageData*, vtkImageData*, int); - bool BuildScreenshotFromRenderWindow(vtkRenderWindow*, vtkImageData*, int); - void SnapshotView(QVTKWidget*, const QColorImagePageView::SnapshotImageType&, const QString&); - - void SetTag( const QString& iTag ); - QString GetTag( ) const; - - void SetCellId( const unsigned int& iId ); - unsigned int GetCellId( ) const; - - void GetBackgroundColor( double& r, double& g, double& b ); - double* GetBackgroundColor(); - -public slots: - - void SetBackgroundColor( const double& r, const double& g, const double& b ); - void SetBackgroundColor( double rgb[3] ); - void SetBackgroundColor( const QColor& iColor ); - - void SetLookupTable( vtkLookupTable* lut ); - void SetShowAnnotations( const bool& ); - void SetShowScalarBar( const bool& ) {}; - void SetColorWindow( const double& ) {}; - void SetColorLevel( const double& ) {}; - - void SetFullScreenView( const int& iS ); - void quadview(); - void FullScreenViewXY(); - void FullScreenView2(); - void FullScreenView3(); - void FullScreenViewXYZ(); - void SetView3DToTriPlanarMode(); - void SetView3DToVolumeRenderingMode(); - - void SnapshotViewXY( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotView2( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotView3( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotViewXYZ( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - - void SetSlideView1( const int& ); - void SetSlideView2( const int& ); - void SetSlideView3( const int& ); - - void ValidateContour( - const int& iId, - const QColor& iColor, - const bool& iSave ); - void ReinitializeContour( ); - -protected: - QSplitter* vSplitter; - QSplitterchild* htSplitter; - QSplitterchild* hbSplitter; - - QWidget* LayOutWidget1; - QHBoxLayout* LayOut1; - QSlider* slider1; - QVTKWidget* qvtkWidget_XY; - - QWidget* LayOutWidget2; - QHBoxLayout* LayOut2; - QSlider* slider2; - QVTKWidget* qvtkWidget_2; - - QWidget* LayOutWidget3; - QHBoxLayout* LayOut3; - QSlider* slider3; - QVTKWidget* qvtkWidget_3; - - QWidget* LayOutWidget4; - QHBoxLayout* LayOut4; - QVTKWidget* qvtkWidget_XYZ; - QSpacerItem* Spacer; - vtkViewColorImage3D* View3D; - - vtkImageData* Image; - - vtkViewColorImage2DCollection* Pool; - - QString Tag; - - virtual void resizeEvent( QResizeEvent* event ); - - double BackgroundRGB[3]; - - unsigned int CellId; - unsigned int SnapshotId; - int IsFullScreen; -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.cxx deleted file mode 100644 index 18f51f6e..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.cxx +++ /dev/null @@ -1,171 +0,0 @@ -/*========================================================================= - Authors: the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "QGoLUTDialog.h" - -#include -#include -#include -#include -#include - -QGoLUTDialog::QGoLUTDialog( QWidget* parent ) : QDialog( parent ), LUT( 0 ) -{ - setupUi( this ); - - this->LUT = vtkLookupTableManager::GetBWLookupTable(); - this->Renderer = vtkRenderer::New(); - - vtkRenderWindow* renwin = this->qvtkWidget->GetRenderWindow(); - renwin->AddRenderer( this->Renderer ); - - this->LUTActor = vtkScalarBarActor::New(); - this->LUTActor->SetLookupTable( this->LUT ); - this->LUTActor->SetOrientationToHorizontal(); - this->LUTActor->SetWidth( 0.8 ); - this->LUTActor->SetHeight( 0.9 ); - this->LUTActor->SetPosition( 0.1, 0.1 ); - this->LUTActor->SetTitle( "LUT" ); - - this->Renderer->AddActor2D( this->LUTActor ); - - renwin->Render(); -} - -QGoLUTDialog::~QGoLUTDialog() -{ - this->Renderer->Delete(); - this->LUTActor->Delete(); - this->LUT->Delete(); - delete this->qvtkWidget; -} - -vtkLookupTable* QGoLUTDialog::GetLookupTable( ) -{ - return this->LUT; -} - -void QGoLUTDialog::setupUi( QDialog* LUTDialog ) -{ - if( LUTDialog->objectName().isEmpty() ) - LUTDialog->setObjectName( QString::fromUtf8("LUTDialog") ); - - LUTDialog->resize(321, 183); - LUTDialog->setMinimumSize( 200, 150 ); - LUTDialog->setModal( true ); - - this->verticalLayout = new QVBoxLayout( LUTDialog ); - this->verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); - this->verticalLayout->setContentsMargins(10, 10, 10, 10); - this->verticalLayout->setSpacing( 20 ); - - this->horizontalLayout = new QHBoxLayout; - this->horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); - this->horizontalLayout->setContentsMargins(0, 0, 0, 0); - - this->label = new QLabel; - this->label->setObjectName(QString::fromUtf8("label")); - this->label->setText( tr("Lookup Table") ); - - this->horizontalLayout->addWidget(label); - - this->LUTComboBox = new QComboBox; - this->LUTComboBox->setObjectName(QString::fromUtf8("LUTComboBox")); - this->LUTComboBox->setLayoutDirection(Qt::RightToLeft); - this->LUTComboBox->setAutoFillBackground(false); - this->LUTComboBox->setEditable(false); - this->LUTComboBox->setFrame(true); - - int k = 0; - this->LUTComboBox->insertItem( k++, tr( "B/W" ) ); - this->LUTComboBox->insertItem( k++, tr( "B/W Inverse" ) ); - this->LUTComboBox->insertItem( k++, tr( "Spectrum" ) ); - this->LUTComboBox->insertItem( k++, tr( "Hot Metal" ) ); - this->LUTComboBox->insertItem( k++, tr( "GE Color" ) ); - this->LUTComboBox->insertItem( k++, tr( "Flow" ) ); - this->LUTComboBox->insertItem( k++, tr( "LONI" ) ); - this->LUTComboBox->insertItem( k++, tr( "LONI2" ) ); - this->LUTComboBox->insertItem( k++, tr( "Asymmetry" ) ); - this->LUTComboBox->insertItem( k++, tr( "P-Value" ) ); - - this->horizontalLayout->addWidget(this->LUTComboBox); - - this->verticalLayout->addLayout( this->horizontalLayout ); - - this->qvtkWidget = new QVTKWidget; - this->qvtkWidget->setObjectName(QString::fromUtf8("qvtkWidget")); - this->qvtkWidget->setGeometry(QRect(10, 50, 301, 100)); - - this->verticalLayout->addWidget( this->qvtkWidget ); - - this->horizontalLayout_2 = new QHBoxLayout; - this->horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2")); - this->horizontalLayout_2->setContentsMargins(0, 0, 0, 0); - - this->horizontalSpacer = new QSpacerItem(166, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - this->horizontalLayout_2->addItem(horizontalSpacer); - - this->buttonBox = new QDialogButtonBox; - this->buttonBox->setObjectName( QString::fromUtf8("buttonBox") ); - this->buttonBox->setGeometry(QRect(60, 160, 252, 32)); - this->buttonBox->setOrientation(Qt::Horizontal); - this->buttonBox->setStandardButtons( QDialogButtonBox::Cancel | - QDialogButtonBox::Ok ); - this->buttonBox->setCenterButtons(false); - this->horizontalLayout_2->addWidget(buttonBox); - - this->verticalLayout->addLayout( this->horizontalLayout_2 ); - - LUTDialog->setLayout( this->verticalLayout ); - - QObject::connect( this->buttonBox, SIGNAL(accepted()), - LUTDialog, SLOT(accept()) ); - QObject::connect( this->buttonBox, SIGNAL(rejected()), - LUTDialog, SLOT(reject()) ); - QObject::connect( this->LUTComboBox, SIGNAL( currentIndexChanged( int ) ), - this, SLOT( ChangeLookupTable( int ) ) ); - - LUTComboBox->setCurrentIndex( 0 ); - - QMetaObject::connectSlotsByName(LUTDialog); -} - -void QGoLUTDialog::ChangeLookupTable( const int& idx ) -{ - this->LUT->Delete(); - this->LUT = vtkLookupTableManager::GetLookupTable( idx ); - this->LUTActor->SetLookupTable( this->LUT ); - - this->qvtkWidget->GetRenderWindow()->Render( ) ; -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.h b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.h deleted file mode 100644 index 044c7d99..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QGoLUTDialog.h +++ /dev/null @@ -1,82 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __QGoLUTDialog_h -#define __QGoLUTDialog_h - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "QVTKWidget.h" - -/** - \class QGoLUTDialog - \brief Look-up Table Dialog -*/ -class QGoLUTDialog : public QDialog -{ - Q_OBJECT -public: - explicit QGoLUTDialog( QWidget* parent = 0 ); - virtual ~QGoLUTDialog(); - - vtkLookupTable* GetLookupTable( ); - -public slots: - void ChangeLookupTable( const int& ); - -protected: - vtkLookupTable* LUT; - vtkScalarBarActor* LUTActor; - vtkRenderer* Renderer; - QDialogButtonBox* buttonBox; - QVTKWidget* qvtkWidget; - QHBoxLayout* horizontalLayout; - QHBoxLayout* horizontalLayout_2; - QVBoxLayout* verticalLayout; - QSpacerItem* horizontalSpacer; - QLabel* label; - QComboBox* LUTComboBox; - - void setupUi( QDialog *LUTDialog ); -}; -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.cxx deleted file mode 100644 index c543e5e9..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.cxx +++ /dev/null @@ -1,728 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "QImagePageView.h" -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -QImagePageView::QImagePageView( QWidget* parent ) : QWidget( parent ) -{ - IsFullScreen = 0; - SnapshotId = 1; - - Tag = QString( "QImagePageView" ); - Image = 0; - - Pool = vtkViewImage2DCollection::New(); - View3D = vtkViewImage3D::New(); - - setupUi( this ); -} - -QImagePageView::~QImagePageView() -{ - Pool->Delete(); - View3D->Delete(); - -// delete qvtkWidget_4; -// delete qvtkWidget_3; -// delete qvtkWidget_2; -// delete qvtkWidget_1; -// -// delete htSplitter; -// delete hbSplitter; -// delete vSplitter; -} - -void QImagePageView::setupUi( QWidget* parent ) -{ - if(parent->objectName().isEmpty()) - { - parent->resize(800, 800); - } - - QList< int > list_size; - list_size.push_back( 10 ); - list_size.push_back( 10 ); - - vSplitter = new QSplitter( Qt::Vertical, parent ); - htSplitter = new QSplitter( vSplitter ); - hbSplitter = new QSplitter( vSplitter ); - vSplitter->addWidget(htSplitter); - vSplitter->addWidget(hbSplitter); - vSplitter->setSizes( list_size ); - vSplitter->resize( 800, 800 ); - - qvtkWidget_1 = new QVTKWidget; - slider1 = new QSlider( Qt::Vertical ); - LayOut1 = new QHBoxLayout; - LayOut1->addWidget( qvtkWidget_1 ); - LayOut1->addWidget( slider1 ); - LayOutWidget1 = new QWidget; - LayOutWidget1->setLayout( LayOut1 ); - htSplitter->addWidget( LayOutWidget1 ); - - qvtkWidget_2 = new QVTKWidget; - slider2 = new QSlider( Qt::Vertical ); - LayOut2 = new QHBoxLayout; - LayOut2->addWidget( qvtkWidget_2 ); - LayOut2->addWidget( slider2 ); - LayOutWidget2 = new QWidget; - LayOutWidget2->setLayout( LayOut2 ); - htSplitter->addWidget( LayOutWidget2 ); - htSplitter->setSizes( list_size ); - - qvtkWidget_3 = new QVTKWidget; - slider3 = new QSlider( Qt::Vertical ); - LayOut3 = new QHBoxLayout; - LayOut3->addWidget( qvtkWidget_3 ); - LayOut3->addWidget( slider3 ); - LayOutWidget3 = new QWidget; - LayOutWidget3->setLayout( LayOut3 ); - hbSplitter->addWidget( LayOutWidget3 ); - - qvtkWidget_4 = new QVTKWidget; - Spacer = new QSpacerItem( 27, 10, - QSizePolicy::Minimum, QSizePolicy::Minimum); - LayOut4 = new QHBoxLayout; - LayOut4->addWidget( qvtkWidget_4 ); - LayOut4->addItem( Spacer ); - LayOutWidget4 = new QWidget; - LayOutWidget4->setLayout( LayOut4 ); - hbSplitter->addWidget( LayOutWidget4 ); - hbSplitter->setSizes( list_size ); - - retranslateUi(parent); - - QMetaObject::connectSlotsByName(parent); -} // setupUi - -void QImagePageView::retranslateUi(QWidget *parent) -{ - parent->setWindowTitle( this->Tag ); - Q_UNUSED(parent); -} - -// bool QImagePageView::BuildScreenshotFromImage( vtkImageData* image, -// vtkImageData* screenshot, -// int size ) -// { -// if (!image || !screenshot) -// { -// return false; -// } -// -// // Empty image, remove thumbnail/screenshot -// -// int image_dims[3]; -// image->GetDimensions(image_dims); -// if (image_dims[0] == 0 || -// image_dims[1] == 0 || -// image_dims[2] == 0) -// { -// return false; -// } -// -// double factor; -// vtkImageData *resample_input, *resample_output; -// -// // First, let's make sure we are processing the image as it -// // is by clipping its UpdateExtent. By doing so, we prevent our resample -// // and permute filter the process the image's *whole* extent. -// -// vtkImageClip *clip = vtkImageClip::New(); -// clip->SetInput(image); -// clip->SetOutputWholeExtent(image->GetUpdateExtent()); -// clip->Update(); -// -// // Permute, as a convenience -// -// int clip_dims[3]; -// clip->GetOutput()->GetDimensions(clip_dims); -// -// vtkImagePermute *permute = NULL; -// if (clip_dims[2] != 1) -// { -// permute = vtkImagePermute::New(); -// permute->SetInput(clip->GetOutput()); -// if (clip_dims[0] == 1) -// { -// permute->SetFilteredAxes(1, 2, 0); -// } -// else -// { -// permute->SetFilteredAxes(0, 2, 1); -// } -// resample_input = permute->GetOutput(); -// } -// else -// { -// resample_input = clip->GetOutput(); -// } -// -// resample_input->Update(); -// int resample_input_dims[3];//, resample_output_dims[3]; -// -// resample_input->GetDimensions(resample_input_dims); -// double *resample_input_spacing = resample_input->GetSpacing(); -// -// int large_dim = 0, small_dim = 1; -// if (resample_input_dims[0] < resample_input_dims[1]) -// { -// large_dim = 1; -// small_dim = 0; -// } -// -// if( size != 0 ) -// { -// vtkImageResample *resample = vtkImageResample::New(); -// resample->SetInput(resample_input); -// resample->SetInterpolationModeToCubic(); -// resample->SetDimensionality(2); -// -// // Create the screenshot -// -// factor = static_cast< double >( size ) / -// static_cast< double >( resample_input_dims[large_dim] ); -// -// resample->SetAxisMagnificationFactor(large_dim, factor); -// resample->SetAxisMagnificationFactor( -// small_dim, factor * (resample_input_spacing[small_dim] / -// resample_input_spacing[large_dim])); -// resample->Update(); -// resample_output = resample->GetOutput(); -// // resample_output->GetDimensions(resample_output_dims); -// -// screenshot->ShallowCopy( resample_output ); -// // SetImage( -// // (const unsigned char*) resample_output->GetScalarPointer(), -// // resample_output_dims[0], -// // resample_output_dims[1], -// // 3, -// // 0, -// // vtkKWIcon::ImageOptionFlipVertical); -// resample->Delete(); -// } -// else -// { -// screenshot->ShallowCopy( resample_input ); -// } -// -// // Deallocate -// -// clip->Delete(); -// -// if( permute ) -// { -// permute->Delete(); -// } -// -// return true; -// } -// -// bool QImagePageView::BuildScreenshotFromRenderWindow( -// vtkRenderWindow *win, -// vtkImageData* screenshot, -// int size ) -// { -// if( win && screenshot ) -// { -// vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New(); -// filter->ShouldRerenderOff(); -// filter->SetInput( win ); -// filter->Update(); -// bool res = this->BuildScreenshotFromImage( filter->GetOutput(), -// screenshot, size ); -// filter->Delete(); -// return res; -// } -// return false; -// } -/* -void QImagePageView::SnapshotView( QVTKWidget* iWidget, - const SnapshotImageType& iType, - const QString& iBaseName ) -{ - vtkImageData* image = vtkImageData::New(); - BuildScreenshotFromRenderWindow( iWidget->GetRenderWindow(), - image ); - QString filename = iBaseName; - filename.append( QString( "%1" ).arg( SnapshotId ) ); - - switch( iType ) - { - default: - case BMP: - { - filename.append( ".bmp" ); - vtkBMPWriter* bmp_writer = vtkBMPWriter::New(); - bmp_writer->SetInput( image ); - bmp_writer->SetFileName( filename.toAscii( ).constData( ) ); - bmp_writer->Write(); - bmp_writer->Delete(); - } - break; - case EPS: - { - filename.append( ".eps" ); - vtkPostScriptWriter* eps_writer = vtkPostScriptWriter::New(); - eps_writer->SetInput( image ); - eps_writer->SetFileName( filename.toAscii( ).constData( ) ); - eps_writer->Write(); - eps_writer->Delete(); - } - break; - case JPEG: - { - filename.append( ".jpeg" ); - vtkJPEGWriter* jpeg_writer = vtkJPEGWriter::New(); - jpeg_writer->SetInput( image ); - jpeg_writer->SetFileName( filename.toAscii( ).constData( ) ); - jpeg_writer->Write(); - jpeg_writer->Delete(); - } - break; - case PNG: - { - filename.append( ".png" ); - vtkPNGWriter* png_writer = vtkPNGWriter::New(); - png_writer->SetInput( image ); - png_writer->SetFileName( filename.toAscii( ).constData( ) ); - png_writer->Write(); - png_writer->Delete(); - } - break; - case TIFF: - { - filename.append( ".tiff" ); - vtkTIFFWriter* tiff_writer = vtkTIFFWriter::New(); - tiff_writer->SetInput( image ); - tiff_writer->SetFileName( filename.toAscii( ).constData( ) ); - tiff_writer->Write(); - tiff_writer->Delete(); - } - break; - } - SnapshotId++; - image->Delete(); -} - -void QImagePageView::SnapshotView1( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_1, iType, iBaseName ); -} - -void QImagePageView::SnapshotView2( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_2, iType, iBaseName ); -} -void QImagePageView::SnapshotView3( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_3, iType, iBaseName ); -} -void QImagePageView::SnapshotView4( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_4, iType, iBaseName ); -}*/ - -void QImagePageView::SetFullScreenView( const int& iS ) -{ - if( IsFullScreen == iS ) - IsFullScreen = 0; - else - IsFullScreen = iS; - - switch( IsFullScreen ) - { - default: - case 0: - { - qvtkWidget_1->show(); - qvtkWidget_2->show(); - qvtkWidget_3->show(); - qvtkWidget_4->show(); - break; - } - case 1: - { - qvtkWidget_1->show(); - qvtkWidget_2->hide(); - qvtkWidget_3->hide(); - qvtkWidget_4->hide(); - break; - } - case 2: - { - qvtkWidget_1->hide(); - qvtkWidget_2->show(); - qvtkWidget_3->hide(); - qvtkWidget_4->hide(); - break; - } - case 3: - { - qvtkWidget_1->hide(); - qvtkWidget_2->hide(); - qvtkWidget_3->show(); - qvtkWidget_4->hide(); - break; - } - case 4: - { - qvtkWidget_1->hide(); - qvtkWidget_2->hide(); - qvtkWidget_3->hide(); - qvtkWidget_4->show(); - break; - } - } -} - -int QImagePageView::GetFullScreenView( ) const -{ - return IsFullScreen; -} -// -// void QImagePageView::Render( ) -// { -// this->View1->Render(); -// this->View2->Render(); -// this->View3->Render(); -// this->View4->Render(); -// } - -void QImagePageView::SetBackgroundColor( const double& r, -const double& g, const double& b ) -{ - double textcolor[3]; - textcolor[0] = 1. - r; - textcolor[1] = 1. - g; - textcolor[2] = 1. - b; - -// View1->SetBackground( r, g, b ); -// View1->GetTextProperty()->SetColor( textcolor ); -// -// View2->SetBackground( r, g, b ); -// View1->GetTextProperty()->SetColor( textcolor ); -// -// View3->SetBackground( r, g, b ); -// View3->GetTextProperty()->SetColor( textcolor ); -// -// View4->SetBackground( r, g, b ); -// View4->GetTextProperty()->SetColor( textcolor ); -} - -void QImagePageView::SetBackgroundColor( double rgb[3] ) -{ - double textcolor[3]; - textcolor[0] = 1. - rgb[0]; - textcolor[1] = 1. - rgb[1]; - textcolor[2] = 1. - rgb[2]; - -// View1->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View1->GetTextProperty()->SetColor( textcolor ); -// -// View2->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View2->GetTextProperty()->SetColor( textcolor ); -// -// View3->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View3->GetTextProperty()->SetColor( textcolor ); -// -// View4->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View4->GetTextProperty()->SetColor( textcolor ); -} - -void QImagePageView::SetBackgroundColor( const QColor& iColor ) -{ - int r, g, b; - iColor.getRgb( &r, &g, &b ); - double rgb[3]; - rgb[0] = static_cast< double >( r ) / 255.; - rgb[1] = static_cast< double >( g ) / 255.; - rgb[2] = static_cast< double >( b ) / 255.; - - double textcolor[3]; - textcolor[0] = 1. - rgb[0]; - textcolor[1] = 1. - rgb[1]; - textcolor[2] = 1. - rgb[2]; - -// View1->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View1->GetTextProperty()->SetColor( textcolor ); -// -// View2->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View2->GetTextProperty()->SetColor( textcolor ); -// -// View3->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View3->GetTextProperty()->SetColor( textcolor ); -// -// View4->SetBackground( rgb[0], rgb[1], rgb[2] ); -// View4->GetTextProperty()->SetColor( textcolor ); -} - -QVTKWidget* QImagePageView::GetActiveQVTKWidget( ) -{ - - switch(this->IsFullScreen) - { - case 1 : - return qvtkWidget_1; - case 2 : - return qvtkWidget_2; - case 3 : - return qvtkWidget_3; - default : - return qvtkWidget_4; - } -} - - -vtkViewImage* QImagePageView::GetActiveView() -{ - switch(this->IsFullScreen) - { - case 1 : - return this->Pool->GetItem(0); - case 2 : - return this->Pool->GetItem(1); - case 3 : - return this->Pool->GetItem(2); - default : - return this->Pool->GetItem(3); - } -} - -void QImagePageView::SetLookupTable( vtkLookupTable* lut ) -{ - if( !lut ) - { - return; - } - else - { - this->Pool->SyncSetLookupTable( lut ); - } -} - -void QImagePageView::FullScreenView1 () -{ - SetFullScreenView( 1 ); -} - - -void QImagePageView::FullScreenView2( ) -{ - SetFullScreenView( 2 ); -} - - -void QImagePageView::FullScreenView3( ) -{ - SetFullScreenView( 3 ); -} - - -void QImagePageView::FullScreenView4 ( ) -{ - SetFullScreenView( 4 ); -} - -void QImagePageView::CreateAllViews() -{ -// ConfigureView( this->Pool->GetItem(0), qvtkWidget_1 ); -// ConfigureView( this->Pool->GetItem(1), qvtkWidget_2 ); -// ConfigureView( this->Pool->GetItem(2), qvtkWidget_3 ); -// ConfigureView( this->Pool->GetItem(3), qvtkWidget_4 ); - - this->Pool->GetItem(0)->SetBackground(0.,0.,0.); - this->Pool->GetItem(1)->SetBackground(0.,0.,0.); - this->Pool->GetItem(2)->SetBackground(0.,0.,0.); -// this->Pool->GetItem(3)->SetBackground(0.,0.,0.); - -// this->SetView4ToTriPlanarMode(); -} - -// void QImagePageView::SetView4ToTriPlanarMode() -// { -// View4->SetPlaneWidgetVisibility( true ); -// } -// -// void QImagePageView::SetView4ToVolumeRenderingMode() -// { -// View4->SetPlaneWidgetVisibility( false ); -// } - -#ifdef MegaVTK_USE_ITK -template< class TImage > -void QImagePageView::SetITKImage( TImage::Pointer itkImage ) -{ - if( itkImage.IsNull() ) - { - return; - } - - typedef itk::ImageToVTKImageFilter< TImage > ConverterType; - ConverterType::Pointer myConverter = ConverterType::New(); - myConverter->SetInput ( itkImage ); - myConverter->Update(); - - this->SetImage ( myConverter->GetOutput() ); - - this->ImageConverter = myConverter; -} -#endif - -void QImagePageView::SetImage( vtkImageData* input ) -{ - if( !input ) - return; - else - { - this->Image = input; - - vtkViewImage2D* View1 = vtkViewImage2D::New(); - View1->SetViewConvention( vtkViewImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin1 = this->qvtkWidget_1->GetRenderWindow( ); -// renwin1->GetRenderers()->RemoveAllItems(); - View1->SetupInteractor( this->qvtkWidget_1->GetInteractor() ); - View1->SetRenderWindow( renwin1 ); - View1->SetRenderer( renwin1->GetRenderers()->GetFirstRenderer() ); - View1->SetViewOrientation( vtkViewImage2D::VIEW_ORIENTATION_AXIAL ); - View1->SetInput( this->Image ); - - this->Pool->AddItem( View1 ); - this->View3D->Add2DPhantom( 0, View1->GetImageActor(), View1->GetSlicePlane() ); - View1->Delete(); - - vtkViewImage2D* View2 = vtkViewImage2D::New(); - View2->SetViewConvention( vtkViewImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin2 = this->qvtkWidget_2->GetRenderWindow( ); - View2->SetRenderWindow( renwin2 ); - View2->SetRenderer( renwin2->GetRenderers()->GetFirstRenderer() ); - View2->SetupInteractor( this->qvtkWidget_2->GetInteractor() ); - View2->SetViewOrientation (vtkViewImage2D::VIEW_ORIENTATION_CORONAL); - View2->SetInput( this->Image ); - - this->Pool->AddItem( View2 ); - this->View3D->Add2DPhantom( 1, View2->GetImageActor(), View2->GetSlicePlane() ); - View2->Delete(); - - vtkViewImage2D* View3 = vtkViewImage2D::New(); - View2->SetViewConvention( vtkViewImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin3 = this->qvtkWidget_3->GetRenderWindow( ); - View3->SetRenderWindow( renwin3 ); - View3->SetRenderer( renwin3->GetRenderers()->GetFirstRenderer() ); - View3->SetupInteractor( this->qvtkWidget_3->GetInteractor() ); - View3->SetViewOrientation (vtkViewImage2D::VIEW_ORIENTATION_SAGITTAL); - View3->SetInput( this->Image ); - - this->Pool->AddItem( View3 ); - this->View3D->Add2DPhantom( 2, View3->GetImageActor(), View3->GetSlicePlane() ); - View3->Delete(); - - int size[2] = {400, 400}; - this->Pool->SyncSetSize (size); - - vtkRenderWindow* renwin4 = this->qvtkWidget_4->GetRenderWindow( ); - this->View3D->SetRenderWindow( renwin4 ); - this->View3D->SetupInteractor( this->qvtkWidget_4->GetInteractor() ); - this->View3D->SetInput( this->Image ); - - this->View3D->ResetCamera(); - this->Pool->SetExtraRenderWindow( renwin4 ); - - this->Pool->Initialize(); - this->Pool->SyncSetShowAnnotations( true ); - this->Pool->SyncSetShowScalarBar( true ); - this->Pool->SyncReset(); - this->Pool->SyncRender(); - } -} - -void QImagePageView::SetShowScalarBar( const bool& state ) -{ - this->Pool->SyncSetShowScalarBar(state); -} - -void QImagePageView::SetShowAnnotations( const bool& iState ) -{ - this->Pool->SyncSetShowAnnotations( iState ); -} - -void QImagePageView::SetColorWindow( const double& iValue ) -{ - this->Pool->SyncSetColorWindow( iValue ); -} - -void QImagePageView::SetColorLevel( const double& iValue ) -{ - this->Pool->SyncSetColorLevel( iValue ); -} - -void QImagePageView::SetTag( const QString& iTag ) -{ - this->Tag = iTag; -} - -QString QImagePageView::GetTag( ) const -{ - return this->Tag; -} - -void QImagePageView::resizeEvent( QResizeEvent* event ) -{ - QWidget::resizeEvent( event ); - QSize size = event->size(); - vSplitter->resize( size ); -// gridLayoutWidget->setGeometry( -// QRect(0, 0, size.width(), size.height() ) ); -} -// diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.h b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.h deleted file mode 100644 index 66e3127c..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView.h +++ /dev/null @@ -1,184 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __QImagePageView_h -#define __QImagePageView_h - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "vtkViewImage.h" -#include "vtkViewImage2D.h" -#include "vtkViewImage3D.h" -#include "vtkViewImage2DCollection.h" - -class QImagePageView : public QWidget -{ - Q_OBJECT -public: - explicit QImagePageView( QWidget* parent = 0 ); - ~QImagePageView(); - - void SetImage( vtkImageData* input ); -#ifdef MegaVTK_USE_ITK - template< class TImage > - void SetITKImage (TImage::Pointer); -#endif - - void setupUi( QWidget *Form ); - void retranslateUi(QWidget *Form); - - int GetFullScreenView( ) const; - - QVTKWidget* GetActiveQVTKWidget( ); - vtkViewImage* GetActiveView(); - - enum SnapshotImageType - { - BMP = 0, - EPS, - JPEG, - PNG, - TIFF - }; - - void SetTag( const QString& iTag ); - QString GetTag( ) const; - -public slots: - - void SetBackgroundColor( const double& r, const double& g, const double& b ); - void SetBackgroundColor( double rgb[3] ); - void SetBackgroundColor( const QColor& iColor ); - - void SetLookupTable( vtkLookupTable* lut ); - void SetShowAnnotations( const bool& ); - void SetShowScalarBar( const bool& ); - void SetColorWindow( const double& ); - void SetColorLevel( const double& ); - - void SetFullScreenView( const int& iS ); - void FullScreenView1(); - void FullScreenView2(); - void FullScreenView3(); - void FullScreenView4(); -// void SetView4ToTriPlanarMode(); -// void SetView4ToVolumeRenderingMode(); -/* - void SnapshotView1( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotView2( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotView3( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotView4( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) );*/ - -// void Render( ); - -protected: - QSplitter* vSplitter; - QSplitter* htSplitter; - QSplitter* hbSplitter; - - QWidget* LayOutWidget1; - QHBoxLayout* LayOut1; - QSlider* slider1; - QVTKWidget* qvtkWidget_1; - - QWidget* LayOutWidget2; - QHBoxLayout* LayOut2; - QSlider* slider2; - QVTKWidget* qvtkWidget_2; - - QWidget* LayOutWidget3; - QHBoxLayout* LayOut3; - QSlider* slider3; - QVTKWidget* qvtkWidget_3; - - QWidget* LayOutWidget4; - QHBoxLayout* LayOut4; - QVTKWidget* qvtkWidget_4; - QSpacerItem* Spacer; - vtkViewImage3D* View3D; - - vtkImageData* Image; - - vtkViewImage2DCollection* Pool; - - QString Tag; - -#ifdef MegaVTK_USE_ITK - /** - This pointer is used to store internally a reference to the - current ITK->VTK converter, in order to prevent the image buffer - to be deleted unexpectdely. See the SetITKImageInXXX for more - information. - */ - //BTX - itk::ProcessObject::Pointer ImageConverter; - //ETX -#endif - - void CreateAllViews( ); - - virtual void resizeEvent( QResizeEvent* event ); -// virtual void dragEnterEvent ( QDragEnterEvent * event ); - -// void SnapshotView( QVTKWidget* iWidget, -// const SnapshotImageType& iType, -// const QString& iBaseName = QString( "snapshot" ) ); -// -// bool BuildScreenshotFromImage( vtkImageData* image, -// vtkImageData* screenshot, int size = 0 ); -// bool BuildScreenshotFromRenderWindow( vtkRenderWindow *win, -// vtkImageData* screenshot, int size = 0 ); - - double BackgroundRGB[3]; - int SnapshotId; - - int IsFullScreen; -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.cxx deleted file mode 100644 index 611b9c9f..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.cxx +++ /dev/null @@ -1,232 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "QImagePageViewTracer.h" -#include "QimagePageView4DTracer.h" - -#include "QSplitterchild.h" -#include "vtkViewImage2DCommand.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include - - -QImagePageView4DTracer::QImagePageView4DTracer( QWidget* parent ) : QWidget( parent ) -{ - this->NumberOfTimePoints = 0; - this->Image = (vtkImageData*)(0); - - this->Whatever = new QImagePageViewTracer( ); - - this->slider1 = new QSlider( Qt::Horizontal ); - - this->button = new QPushButton("Run &Movie"); - - this->LayOut1 = new QVBoxLayout; - this->LayOut1->addWidget( this->Whatever ); - this->LayOut1->addWidget( this->slider1 ); - this->LayOut1->addWidget( this->button ); - - this->LayOutWidget1 = new QWidget( this ); - this->LayOutWidget1->setLayout( this->LayOut1 ); - - QObject::connect( this->slider1, SIGNAL( valueChanged( int ) ), - this, SLOT( SetView( int ) ) ); - QObject::connect( this->button, SIGNAL( clicked( ) ), - this, SLOT( RunMovie( ) ) ); - - ColorVizu = true; -} - -QImagePageView4DTracer::~QImagePageView4DTracer() -{ - delete this->Whatever; - delete this->LayOut1; - delete this->LayOutWidget1; - delete this->slider1; -} - -void -QImagePageView4DTracer::SetFileName( char* name ) -{ - this->FileName = name; - this->SetView( 0 ); -} - -void QImagePageView4DTracer::ReadLSMFile( int TimePoint ) -{ - vtkImageData* myImage_ch1 = vtkImageData::New(); - vtkLSMReader* reader=vtkLSMReader::New(); - reader->SetFileName( this->FileName ); - reader->SetUpdateTimePoint( TimePoint ); - reader->Update(); - this->slider1->setMinimum( 0 ); - this->NumberOfTimePoints = reader->GetNumberOfTimePoints(); - this->slider1->setMaximum( this->NumberOfTimePoints ); - - int NumberOfChannels = reader->GetNumberOfChannels(); - myImage_ch1->ShallowCopy( reader->GetOutput() ); - reader->Delete(); - - vtkImageData* myImage_ch2; - std::cout << ColorVizu << std::endl; - if( ( NumberOfChannels == 1 ) || ( !ColorVizu ) ) - { - if( this->Image ) this->Image->Delete(); - this->Image = myImage_ch1; - return; - } - else - { - myImage_ch2 = vtkImageData::New(); - vtkLSMReader* reader2=vtkLSMReader::New(); - reader2->SetFileName( this->FileName ); - reader2->SetUpdateTimePoint( TimePoint ); - reader2->SetUpdateChannel( 1 ); - reader2->Update(); - myImage_ch2->ShallowCopy( reader2->GetOutput() ); - reader2->Delete(); - } - - vtkImageData* myImage2 = vtkImageData::New(); - vtkImageAppendComponents* appendFilter1 = vtkImageAppendComponents::New(); - appendFilter1->AddInput( myImage_ch1 ); - appendFilter1->AddInput( myImage_ch2 ); - appendFilter1->Update(); - myImage2->ShallowCopy( appendFilter1->GetOutput() ); - appendFilter1->Delete(); - myImage_ch2->Delete(); - - vtkImageData* myImage_ch3 = vtkImageData::New(); - if( NumberOfChannels == 2 ) - { - myImage_ch3->ShallowCopy( myImage_ch1 ); - } - else - { - vtkLSMReader* reader3=vtkLSMReader::New(); - reader3->SetFileName( this->FileName ); - reader3->SetUpdateTimePoint( TimePoint ); - reader3->SetUpdateChannel( 2 ); - reader3->Update(); - myImage_ch3->ShallowCopy( reader3->GetOutput() ); - reader3->Delete(); - } - myImage_ch1->Delete(); - - vtkImageData* myImage3 = vtkImageData::New(); - vtkImageAppendComponents* appendFilter2 = vtkImageAppendComponents::New(); - appendFilter2->AddInput( myImage2 ); - appendFilter2->AddInput( myImage_ch3 ); - appendFilter2->Update(); - myImage3->ShallowCopy( appendFilter2->GetOutput() ); - appendFilter2->Delete(); - myImage2->Delete(); - myImage_ch3->Delete(); - - if( this->Image ) this->Image->Delete(); - - this->Image = myImage3; -} - -void QImagePageView4DTracer::SetView( int value ) -{ - clock_t start,finish; - double time; - - start = clock(); - this->ReadLSMFile( value ); - finish = clock(); - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - std::cout << "Reading Time: " << time << "s" << std::endl; - - start = clock(); - this->LayOut1->remove( this->Whatever ); - delete this->Whatever; - this->Whatever = new QImagePageViewTracer( ); - this->LayOut1->insertWidget( 0, this->Whatever ); - finish = clock(); - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - std::cout << "Replace widget: " << time << "s" << std::endl; - - start = clock(); - this->Whatever->SetImage( this->Image ); - finish = clock(); - time = (double(finish)-double(start))/CLOCKS_PER_SEC; - std::cout << "Set image in widget: " << time << "s" << std::endl; -} - -void QImagePageView4DTracer::resizeEvent( QResizeEvent* event ) -{ - QWidget::resizeEvent( event ); - this->LayOutWidget1->resize( event->size() ); -} - -void QImagePageView4DTracer::RunMovie( ) -{ - std::cout << "Enjoy movie mode." << std::endl; - - for( unsigned int i = 0; i < this->NumberOfTimePoints; i++) - { - this->slider1->setValue( i ); - } -} - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.h b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.h deleted file mode 100644 index 53866a07..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageView4DTracer.h +++ /dev/null @@ -1,99 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __QImagePageView4DTracer_h -#define __QImagePageView4DTracer_h - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "vtkViewImage3D.h" -#include "vtkViewImage2DWithContourWidgetCollection.h" -#include "QSplitterchild.h" -#include "QImagePageViewTracer.h" - -/** -\class QImagePageView4DTracer -*/ -class QImagePageView4DTracer : public QWidget -{ - Q_OBJECT -public: - explicit QImagePageView4DTracer( QWidget* parent = 0 ); - ~QImagePageView4DTracer(); - - void SetFileName( char* name ); - void SetColorVizu( int value ) - { - std::cout << "Value: " << value << std::endl; - this->ColorVizu = value; - std::cout << "ColorVizu: " << this->ColorVizu << std::endl; - }; - -public slots: - void SetView( int value ); - void RunMovie(); - -protected: - QWidget* LayOutWidget1; - QVBoxLayout* LayOut1; - QSlider* slider1; - QPushButton* button; - - QImagePageViewTracer* Whatever; - - virtual void resizeEvent( QResizeEvent* event ); - - int NumberOfTimePoints; - char* FileName; - vtkImageData* Image; - void ReadLSMFile( int TimePoint ); - void Render() { this->Whatever->Render( ); }; - - int ColorVizu; -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.cxx deleted file mode 100644 index 3d49be38..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.cxx +++ /dev/null @@ -1,963 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "QImagePageViewTracer.h" -#include "QSplitterchild.h" -#include "vtkViewImage2DCommand.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -QImagePageViewTracer::QImagePageViewTracer( QWidget* parent ) : QWidget( parent ) -{ - IsFullScreen = 0; - SnapshotId = 1; - - Tag = QString( "QImagePageViewTracer" ); - Image = 0; - - Pool = vtkViewImage2DWithContourWidgetCollection::New(); - View3D = vtkViewImage3D::New(); - - vtkEventQtConnector = vtkEventQtSlotConnect::New(); - - setupUi( this ); - QObject::connect( this->slider1, SIGNAL( valueChanged( int ) ), - this, SLOT( SetSlideView1( int ) ) ); - QObject::connect( this->slider2, SIGNAL( valueChanged( int ) ), - this, SLOT( SetSlideView2( int ) ) ); - QObject::connect( this->slider3, SIGNAL( valueChanged( int ) ), - this, SLOT( SetSlideView3( int ) ) ); - - QObject::connect( this->htSplitter, SIGNAL( splitterMoved( int, int ) ), - this->hbSplitter, SLOT( moveSplitter( int, int ) ) ); - QObject::connect(this->hbSplitter, SIGNAL( splitterMoved( int, int ) ), - this->htSplitter, SLOT( moveSplitter( int, int ) ) ); - -} - -QImagePageViewTracer::~QImagePageViewTracer() -{ - delete htSplitter; - delete hbSplitter; - Pool->Delete(); - View3D->Delete(); - vtkEventQtConnector->Delete(); -} - -void QImagePageViewTracer::setupUi( QWidget* parent ) -{ - if(parent->objectName().isEmpty()) - { - parent->resize(800, 800); - } - - QList< int > list_size; - list_size.push_back( 10 ); - list_size.push_back( 10 ); - - this->vSplitter = new QSplitter( Qt::Vertical, parent ); - - this->htSplitter = new QSplitterchild( this->vSplitter ); - this->hbSplitter = new QSplitterchild( this->vSplitter ); - - this->vSplitter->addWidget(this->htSplitter); - this->vSplitter->addWidget(this->hbSplitter); - this->vSplitter->setSizes( list_size ); - this->vSplitter->resize( 800, 800 ); - - this->qvtkWidget_XY = new QVTKWidget; - this->slider1 = new QSlider( Qt::Vertical ); - this->LayOut1 = new QHBoxLayout; - this->LayOut1->addWidget( this->qvtkWidget_XY ); - this->LayOut1->addWidget( this->slider1 ); - this->LayOutWidget1 = new QWidget; - this->LayOutWidget1->setLayout( this->LayOut1 ); - this->htSplitter->addWidget( this->LayOutWidget1 ); - - this->qvtkWidget_2 = new QVTKWidget; - this->slider2 = new QSlider( Qt::Vertical ); - this->LayOut2 = new QHBoxLayout; - this->LayOut2->addWidget( this->qvtkWidget_2 ); - this->LayOut2->addWidget( this->slider2 ); - this->LayOutWidget2 = new QWidget; - this->LayOutWidget2->setLayout( this->LayOut2 ); - this->hbSplitter->addWidget( this->LayOutWidget2 ); -// this->htSplitter->setSizes( list_size ); - - this->qvtkWidget_3 = new QVTKWidget; - this->slider3 = new QSlider( Qt::Vertical ); - this->LayOut3 = new QHBoxLayout; - this->LayOut3->addWidget( this->qvtkWidget_3 ); - this->LayOut3->addWidget( this->slider3 ); - this->LayOutWidget3 = new QWidget; - this->LayOutWidget3->setLayout( this->LayOut3 ); - this->htSplitter->addWidget( this->LayOutWidget3 ); - - this->qvtkWidget_XYZ = new QVTKWidget; - this->Spacer = new QSpacerItem( 27, 10, - QSizePolicy::Minimum, QSizePolicy::Minimum); - this->LayOut4 = new QHBoxLayout; - this->LayOut4->addWidget( this->qvtkWidget_XYZ ); - this->LayOut4->addItem( this->Spacer ); - this->LayOutWidget4 = new QWidget; - this->LayOutWidget4->setLayout( this->LayOut4 ); - this->hbSplitter->addWidget( this->LayOutWidget4 ); - - vtkRenderWindow* renwin4 = this->qvtkWidget_XYZ->GetRenderWindow( ); - View3D->SetRenderWindow( renwin4 ); - - retranslateUi(parent); - - QMetaObject::connectSlotsByName(parent); -} // setupUi - -void QImagePageViewTracer::retranslateUi(QWidget *parent) -{ - parent->setWindowTitle( this->Tag ); - Q_UNUSED(parent); -} - -bool QImagePageViewTracer::BuildScreenshotFromImage( vtkImageData* image, - vtkImageData* screenshot, - int size ) -{ - if (!image || !screenshot) - { - return false; - } - - // Empty image, remove thumbnail/screenshot - - int image_dims[3]; - image->GetDimensions(image_dims); - if (image_dims[0] == 0 || - image_dims[1] == 0 || - image_dims[2] == 0) - { - return false; - } - - double factor; - vtkImageData *resample_input, *resample_output; - - // First, let's make sure we are processing the image as it - // is by clipping its UpdateExtent. By doing so, we prevent our resample - // and permute filter the process the image's *whole* extent. - - vtkImageClip *clip = vtkImageClip::New(); - clip->SetInput(image); - clip->SetOutputWholeExtent(image->GetUpdateExtent()); - clip->Update(); - - // Permute, as a convenience - - int clip_dims[3]; - clip->GetOutput()->GetDimensions(clip_dims); - - vtkImagePermute *permute = NULL; - if (clip_dims[2] != 1) - { - permute = vtkImagePermute::New(); - permute->SetInput(clip->GetOutput()); - if (clip_dims[0] == 1) - { - permute->SetFilteredAxes(1, 2, 0); - } - else - { - permute->SetFilteredAxes(0, 2, 1); - } - resample_input = permute->GetOutput(); - } - else - { - resample_input = clip->GetOutput(); - } - - resample_input->Update(); - int resample_input_dims[3];//, resample_output_dims[3]; - - resample_input->GetDimensions(resample_input_dims); - double *resample_input_spacing = resample_input->GetSpacing(); - - int large_dim = 0, small_dim = 1; - if (resample_input_dims[0] < resample_input_dims[1]) - { - large_dim = 1; - small_dim = 0; - } - - if( size != 0 ) - { - vtkImageResample *resample = vtkImageResample::New(); - resample->SetInput(resample_input); - resample->SetInterpolationModeToCubic(); - resample->SetDimensionality(2); - - // Create the screenshot - - factor = static_cast< double >( size ) / - static_cast< double >( resample_input_dims[large_dim] ); - - resample->SetAxisMagnificationFactor(large_dim, factor); - resample->SetAxisMagnificationFactor( - small_dim, factor * (resample_input_spacing[small_dim] / - resample_input_spacing[large_dim])); - resample->Update(); - resample_output = resample->GetOutput(); - // resample_output->GetDimensions(resample_output_dims); - - screenshot->ShallowCopy( resample_output ); -// SetImage( -// (const unsigned char*) resample_output->GetScalarPointer(), -// resample_output_dims[0], -// resample_output_dims[1], -// 3, -// 0, -// vtkKWIcon::ImageOptionFlipVertical); - resample->Delete(); - } - else - { - screenshot->ShallowCopy( resample_input ); - } - - // Deallocate - - clip->Delete(); - - if( permute ) - { - permute->Delete(); - } - - return true; -} - -bool QImagePageViewTracer::BuildScreenshotFromRenderWindow( - vtkRenderWindow *win, - vtkImageData* screenshot, - int size ) -{ - if( win && screenshot ) - { - vtkWindowToImageFilter* filter = vtkWindowToImageFilter::New(); - filter->ShouldRerenderOff(); - filter->SetInput( win ); - filter->Update(); - bool res = this->BuildScreenshotFromImage( filter->GetOutput(), - screenshot, size ); - filter->Delete(); - return res; - } - return false; -} - -void QImagePageViewTracer::SnapshotView( QVTKWidget* iWidget, - const SnapshotImageType& iType, - const QString& iBaseName ) -{ - vtkImageData* image = vtkImageData::New(); - BuildScreenshotFromRenderWindow( iWidget->GetRenderWindow(), - image ); - QString filename = iBaseName; - filename.append( QString( "%1" ).arg( SnapshotId ) ); - - switch( iType ) - { - default: - case BMP: - { - filename.append( ".bmp" ); - vtkBMPWriter* bmp_writer = vtkBMPWriter::New(); - bmp_writer->SetInput( image ); - bmp_writer->SetFileName( filename.toAscii( ).constData( ) ); - bmp_writer->Write(); - bmp_writer->Delete(); - } - break; - case EPS: - { - filename.append( ".eps" ); - vtkPostScriptWriter* eps_writer = vtkPostScriptWriter::New(); - eps_writer->SetInput( image ); - eps_writer->SetFileName( filename.toAscii( ).constData( ) ); - eps_writer->Write(); - eps_writer->Delete(); - } - break; - case JPEG: - { - filename.append( ".jpeg" ); - vtkJPEGWriter* jpeg_writer = vtkJPEGWriter::New(); - jpeg_writer->SetInput( image ); - jpeg_writer->SetFileName( filename.toAscii( ).constData( ) ); - jpeg_writer->Write(); - jpeg_writer->Delete(); - } - break; - case PNG: - { - filename.append( ".png" ); - vtkPNGWriter* png_writer = vtkPNGWriter::New(); - png_writer->SetInput( image ); - png_writer->SetFileName( filename.toAscii( ).constData( ) ); - png_writer->Write(); - png_writer->Delete(); - } - break; - case TIFF: - { - filename.append( ".tiff" ); - vtkTIFFWriter* tiff_writer = vtkTIFFWriter::New(); - tiff_writer->SetInput( image ); - tiff_writer->SetFileName( filename.toAscii( ).constData( ) ); - tiff_writer->Write(); - tiff_writer->Delete(); - } - break; - } - SnapshotId++; - image->Delete(); -} - -void QImagePageViewTracer::SnapshotViewXY( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_XY, iType, iBaseName ); -} - -void QImagePageViewTracer::SnapshotView2( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_2, iType, iBaseName ); -} -void QImagePageViewTracer::SnapshotView3( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_3, iType, iBaseName ); -} -void QImagePageViewTracer::SnapshotViewXYZ( const SnapshotImageType& iType, - const QString& iBaseName ) -{ - SnapshotView( qvtkWidget_XYZ, iType, iBaseName ); -} - -void QImagePageViewTracer::SetFullScreenView( const int& iS ) -{ - if( IsFullScreen == iS ) - IsFullScreen = 0; - else - IsFullScreen = iS; - - switch( IsFullScreen ) - { - default: - case 0: - { - LayOutWidget1->show(); - LayOutWidget2->show(); - LayOutWidget3->show(); - LayOutWidget4->show(); - break; - } - case 1: - { - LayOutWidget1->show(); - LayOutWidget2->hide(); - LayOutWidget3->hide(); - LayOutWidget4->hide(); - break; - } - case 2: - { - LayOutWidget1->hide(); - LayOutWidget2->show(); - LayOutWidget3->hide(); - LayOutWidget4->hide(); - break; - } - case 3: - { - LayOutWidget1->hide(); - LayOutWidget2->hide(); - LayOutWidget3->show(); - LayOutWidget4->hide(); - break; - } - case 4: - { - LayOutWidget1->hide(); - LayOutWidget2->hide(); - LayOutWidget3->hide(); - LayOutWidget4->show(); - break; - } - } -} - -int QImagePageViewTracer::GetFullScreenView( ) const -{ - return IsFullScreen; -} - -double* QImagePageViewTracer::GetBackgroundColor() -{ - return this->Pool->GetItem( 0 )->GetBackground(); -} - -void QImagePageViewTracer::GetBackgroundColor( double& r, - double& g, double& b ) -{ - double* rgb = this->Pool->GetItem( 0 )->GetBackground(); - r = rgb[0]; - g = rgb[1]; - b = rgb[2]; -} - -void QImagePageViewTracer::SetBackgroundColor( const double& r, -const double& g, const double& b ) -{ - double textcolor[3]; - textcolor[0] = 1. - r; - textcolor[1] = 1. - g; - textcolor[2] = 1. - b; - - double rgb[3] = {r, g, b }; - - this->Pool->SyncSetBackground( rgb ); - - vtkTextProperty* property = this->Pool->GetItem( 0 )->GetTextProperty(); -// property->SetFontFamilyToArial(); -// property->SetFontSize( 14 ); - property->SetColor( textcolor ); - this->Pool->SyncSetTextProperty( property ); -} - -void QImagePageViewTracer::SetBackgroundColor( double rgb[3] ) -{ - double textcolor[3]; - textcolor[0] = 1. - rgb[0]; - textcolor[1] = 1. - rgb[1]; - textcolor[2] = 1. - rgb[2]; - - this->Pool->SyncSetBackground( rgb ); - - vtkTextProperty* property = this->Pool->GetItem( 0 )->GetTextProperty(); -// property->SetFontFamilyToArial(); -// property->SetFontSize( 14 ); - property->SetColor( textcolor ); - this->Pool->SyncSetTextProperty( property ); -} - -void QImagePageViewTracer::SetBackgroundColor( const QColor& iColor ) -{ - int r, g, b; - iColor.getRgb( &r, &g, &b ); - double rgb[3]; - rgb[0] = static_cast< double >( r ) / 255.; - rgb[1] = static_cast< double >( g ) / 255.; - rgb[2] = static_cast< double >( b ) / 255.; - - double textcolor[3]; - textcolor[0] = 1. - rgb[0]; - textcolor[1] = 1. - rgb[1]; - textcolor[2] = 1. - rgb[2]; - - this->Pool->SyncSetBackground( rgb ); - - vtkTextProperty* property = this->Pool->GetItem( 0 )->GetTextProperty(); -// property->SetFontFamilyToArial(); -// property->SetFontSize( 14 ); - property->SetColor( textcolor ); - this->Pool->SyncSetTextProperty( property ); -} - -QVTKWidget* QImagePageViewTracer::GetActiveQVTKWidget( ) -{ - - switch(this->IsFullScreen) - { - case 1 : - return qvtkWidget_XY; - case 2 : - return qvtkWidget_2; - case 3 : - return qvtkWidget_3; - default : - return qvtkWidget_XYZ; - } -} - - -vtkViewImage* QImagePageViewTracer::GetActiveView() -{ - switch(this->IsFullScreen) - { - case 1 : - return this->Pool->GetItem(0); - case 2 : - return this->Pool->GetItem(1); - case 3 : - return this->Pool->GetItem(2); - default : - return this->Pool->GetItem(3); - } -} - -void QImagePageViewTracer::SetLookupTable( vtkLookupTable* lut ) -{ - if( !lut ) - { - return; - } - else - { - this->Pool->SyncSetLookupTable( lut ); - } -} - -void QImagePageViewTracer::quadview() -{ - SetFullScreenView( 0 ); -} - -void QImagePageViewTracer::FullScreenViewXY () -{ - SetFullScreenView( 1 ); -} - - -void QImagePageViewTracer::FullScreenView2( ) -{ - SetFullScreenView( 2 ); -} - - -void QImagePageViewTracer::FullScreenView3( ) -{ - SetFullScreenView( 3 ); -} - - -void QImagePageViewTracer::FullScreenViewXYZ ( ) -{ - SetFullScreenView( 4 ); -} - -void QImagePageViewTracer::SetView3DToTriPlanarMode() -{ - View3D->SetTriPlanarRenderingOn(); - View3D->SetVolumeRenderingOff(); - View3D->Render(); -} -// -void QImagePageViewTracer::SetView3DToVolumeRenderingMode() -{ - View3D->SetTriPlanarRenderingOff(); - View3D->SetVolumeRenderingOn(); - View3D->Render(); -} - -#ifdef MegaVTK_USE_ITK -template< class TImage > -void QImagePageViewTracer::SetITKImage( TImage::Pointer itkImage ) -{ - if( itkImage.IsNull() ) - { - return; - } - - typedef itk::ImageToVTKImageFilter< TImage > ConverterType; - ConverterType::Pointer myConverter = ConverterType::New(); - myConverter->SetInput ( itkImage ); - myConverter->Update(); - - this->SetImage ( myConverter->GetOutput() ); - - this->ImageConverter = myConverter; -} -#endif - -void QImagePageViewTracer::SetImage( vtkImageData* input ) -{ - if( !input ) - return; - else - { - if( this->Image ) this->Image->Delete(); - - this->Image = input; - - vtkViewImage2DWithContourWidget* View1 = - vtkViewImage2DWithContourWidget::New(); - View1->SetInput( this->Image ); - View1->SetViewConvention( vtkViewImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin1 = this->qvtkWidget_XY->GetRenderWindow( ); - View1->SetupInteractor( this->qvtkWidget_XY->GetInteractor() ); - View1->SetRenderWindow( renwin1 ); - View1->SetRenderer( renwin1->GetRenderers()->GetFirstRenderer() ); - View1->SetViewOrientation( vtkViewImage2D::VIEW_ORIENTATION_AXIAL ); - this->Pool->AddItem( View1 ); - this->View3D->Add2DPhantom( 0, View1->GetImageActor(), View1->GetSlicePlane() ); - - int *range = View1->GetSliceRange(); - - this->slider1->setMinimum( range[0] ); - this->slider1->setMaximum( range[1] ); - - // Event connection between vtk and qt - // when SliceMoveEvent occurs in the XY View, Slider1 moves. - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View1->GetInteractorStyle() ), - vtkViewImage2DCommand::SliceMoveEvent, - this, SLOT( MoveSlider1() ) ); - - // Event connection between vtk and qt - // when RequestedPositionEvent occurs in the XY View (double-click), - // Slider2 and Slider3 move. - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View1->GetInteractorStyle() ), - vtkViewImage2DCommand::RequestedPositionEvent, - this, SLOT( MoveSlider2() ) ); - - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View1->GetInteractorStyle() ), - vtkViewImage2DCommand::RequestedPositionEvent, - this, SLOT( MoveSlider3() ) ); - - View1->Delete(); - - vtkViewImage2DWithContourWidget* View2 = - vtkViewImage2DWithContourWidget::New(); - View2->SetInput( this->Image ); - View2->SetViewConvention( vtkViewImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin2 = this->qvtkWidget_2->GetRenderWindow( ); - View2->SetRenderWindow( renwin2 ); - View2->SetRenderer( renwin2->GetRenderers()->GetFirstRenderer() ); - View2->SetupInteractor( this->qvtkWidget_2->GetInteractor() ); - View2->SetViewOrientation (vtkViewImage2D::VIEW_ORIENTATION_CORONAL); - - this->Pool->AddItem( View2 ); - this->View3D->Add2DPhantom( 1, View2->GetImageActor(), View2->GetSlicePlane() ); - - range = View2->GetSliceRange(); - this->slider2->setMinimum( range[0] ); - this->slider2->setMaximum( range[1] ); - // Event connection between vtk and qt - // when SliceMoveEvent occurs in the XY View, Slider1 moves. - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View2->GetInteractorStyle() ), - vtkViewImage2DCommand::SliceMoveEvent, - this, SLOT( MoveSlider2() ) ); - - // Event connection between vtk and qt - // when RequestedPositionEvent occurs in the XY View (double-click), - // Slider2 and Slider3 move. - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View2->GetInteractorStyle() ), - vtkViewImage2DCommand::RequestedPositionEvent, - this, SLOT( MoveSlider1() ) ); - - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View2->GetInteractorStyle() ), - vtkViewImage2DCommand::RequestedPositionEvent, - this, SLOT( MoveSlider3() ) ); - - View2->Delete(); - - vtkViewImage2DWithContourWidget* View3 = - vtkViewImage2DWithContourWidget::New(); - View3->SetInput( this->Image ); - View3->SetViewConvention( vtkViewImage2D::VIEW_CONVENTION_NEUROLOGICAL ); - vtkRenderWindow* renwin3 = this->qvtkWidget_3->GetRenderWindow( ); - View3->SetRenderWindow( renwin3 ); - View3->SetRenderer( renwin3->GetRenderers()->GetFirstRenderer() ); - View3->SetupInteractor( this->qvtkWidget_3->GetInteractor() ); - View3->SetViewOrientation (vtkViewImage2D::VIEW_ORIENTATION_SAGITTAL); - - this->Pool->AddItem( View3 ); - this->View3D->Add2DPhantom( 2, View3->GetImageActor(), View3->GetSlicePlane() ); - - range = View3->GetSliceRange(); - this->slider3->setMinimum( range[0] ); - this->slider3->setMaximum( range[1] ); - - // Event connection between vtk and qt - // when SliceMoveEvent occurs in the XY View, Slider1 moves. - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View3->GetInteractorStyle() ), - vtkViewImage2DCommand::SliceMoveEvent, - this, SLOT( MoveSlider3() ) ); - - // Event connection between vtk and qt - // when RequestedPositionEvent occurs in the XY View (double-click), - // Slider2 and Slider3 move. - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View3->GetInteractorStyle() ), - vtkViewImage2DCommand::RequestedPositionEvent, - this, SLOT( MoveSlider1() ) ); - - vtkEventQtConnector->Connect( - reinterpret_cast< vtkObject* >( View3->GetInteractorStyle() ), - vtkViewImage2DCommand::RequestedPositionEvent, - this, SLOT( MoveSlider2() ) ); - - View3->Delete(); - - int size[2] = {400, 400}; - this->Pool->SyncSetSize (size); - - vtkRenderWindow* renwin4 = this->qvtkWidget_XYZ->GetRenderWindow( ); - this->View3D->SetupInteractor( this->qvtkWidget_XYZ->GetInteractor() ); - this->View3D->SetInput( this->Image ); - this->View3D->SetVolumeRenderingOff(); - this->View3D->SetShowScalarBar( false ); - this->View3D->ResetCamera(); - this->Pool->SetExtraRenderWindow( renwin4 ); - - this->Pool->Initialize(); - this->Pool->SyncSetShowAnnotations( true ); - this->Pool->SyncSetShowScalarBar( false ); - this->Pool->SyncSetBackground( this->Pool->GetItem(0)->GetBackground() ); - this->Pool->SyncSetTextProperty( this->Pool->GetItem(0)->GetTextProperty()); - this->Pool->SyncRender(); - this->Pool->SyncReset(); - - this->slider1->setValue( (this->slider1->minimum()+this->slider1->maximum())/2 ); - this->slider2->setValue( (this->slider2->minimum()+this->slider2->maximum())/2 ); - this->slider3->setValue( (this->slider3->minimum()+this->slider3->maximum())/2 ); - } -} - -void QImagePageViewTracer::Render() -{ - this->Pool->SyncRender(); - View3D->Render(); -} - -void QImagePageViewTracer::SetShowScalarBar( const bool& state ) -{ - this->Pool->SyncSetShowScalarBar(state); - this->Pool->SyncRender(); -} - -void QImagePageViewTracer::SetShowAnnotations( const bool& iState ) -{ - this->Pool->SyncSetShowAnnotations( iState ); -} - -void QImagePageViewTracer::SetColorWindow( const double& iValue ) -{ - this->Pool->SyncSetColorWindow( iValue ); -} - -void QImagePageViewTracer::SetColorLevel( const double& iValue ) -{ - this->Pool->SyncSetColorLevel( iValue ); -} - -void QImagePageViewTracer::SetTag( const QString& iTag ) -{ - this->Tag = iTag; -} - -QString QImagePageViewTracer::GetTag( ) const -{ - return this->Tag; -} - -void QImagePageViewTracer::SetCellId( const unsigned int& iId ) -{ - this->CellId = iId; -} - -unsigned int QImagePageViewTracer::GetCellId() const -{ - return this->CellId; -} - -void QImagePageViewTracer::SetTracerON() -{ - this->Pool->GetItem( 0 )->SetContourWidgetInteractionOn(); - this->Pool->GetItem( 1 )->SetContourWidgetInteractionOn(); - this->Pool->GetItem( 2 )->SetContourWidgetInteractionOn(); -} - -void QImagePageViewTracer::SetTracerOFF() -{ - this->Pool->GetItem( 0 )->SetContourWidgetInteractionOff(); - this->Pool->GetItem( 1 )->SetContourWidgetInteractionOff(); - this->Pool->GetItem( 2 )->SetContourWidgetInteractionOff(); -} - -void QImagePageViewTracer::SetTracer( const bool& iState ) -{ - this->Pool->GetItem( 0 )->SetContourWidgetInteraction( iState ); - this->Pool->GetItem( 1 )->SetContourWidgetInteraction( iState ); - this->Pool->GetItem( 2 )->SetContourWidgetInteraction( iState ); -} - -void QImagePageViewTracer::resizeEvent( QResizeEvent* event ) -{ - QWidget::resizeEvent( event ); - vSplitter->resize( event->size() ); -} - - -// void QImagePageViewTracer::ValidateContour( const int& iId ) -void QImagePageViewTracer::ValidateContour( - const int& iId, - const QColor& iColor, - const bool& iSave ) -{ - double rgb[3]; - rgb[0] = static_cast< double >( iColor.red() ) / 255.; - rgb[1] = static_cast< double >( iColor.green() ) / 255.; - rgb[2] = static_cast< double >( iColor.blue() ) / 255.; - - vtkOrientedGlyphContourRepresentation* contour_rep; - vtkPolyData* contour; - - vtkProperty* contour_property = vtkProperty::New(); - contour_property->SetRepresentationToWireframe(); - contour_property->SetColor( rgb ); - contour_property->SetLineWidth( 3. ); - - for( int i = 0; i < 3; i++ ) - { - contour_rep = this->Pool->GetItem( i )->GetContourRepresentation(); - contour = contour_rep->GetContourRepresentationAsPolyData( ); - - if( contour ) - { - if( contour->GetNumberOfPoints() > 2 ) - { - if( iSave ) - { - QString identifier = QString( "_id%1" ).arg( iId ); - QString orientation = QString( "_dir%1" ).arg( this->Pool->GetItem(i)->GetViewOrientation() ); - QString slice = QString( "_slice%1" ).arg( this->Pool->GetItem(i)->GetSlice() ); - - QString filename = QString( "contour%1%2%3%4" ) - .arg( identifier ).arg( orientation ).arg( slice ).arg( ".vtk" ); - - vtkPolyDataWriter* writer = vtkPolyDataWriter::New(); - writer->SetInput( contour ); - writer->SetFileName( filename.toAscii().constData() ); - writer->Write(); - - writer->Delete(); - } - - vtkPolyData* contour_copy = vtkPolyData::New(); - contour_copy->ShallowCopy( contour ); - - for( int j = 0; j < 3; j++ ) - { - this->Pool->GetItem( j )->AddDataSet( contour_copy, contour_property, true ); - } - contour_copy->Delete(); - } - } - - } - contour_property->Delete(); - this->Pool->SyncRender(); -} - -void QImagePageViewTracer::ReinitializeContour( ) -{ - for( int i = 0; i < 3; i++ ) - { - this->Pool->GetItem( i )->GetContourWidget()->Initialize( 0 ); - } - this->Pool->SyncRender(); -} - -void QImagePageViewTracer::SetSlideView1( const int& iSlice ) -{ - this->Pool->GetItem( 0 )->SetSlice( iSlice ); - this->Pool->SyncRender(); -} - -void QImagePageViewTracer::SetSlideView2( const int& iSlice ) -{ - this->Pool->GetItem( 1 )->SetSlice( iSlice ); - this->Pool->SyncRender(); -} - -void QImagePageViewTracer::SetSlideView3( const int& iSlice ) -{ - this->Pool->GetItem( 2 )->SetSlice( iSlice ); - this->Pool->SyncRender(); -} - -void QImagePageViewTracer::MoveSlider1( ) -{ - this->slider1->setValue( this->Pool->GetItem( 0 )->GetSlice() ); -} - -void QImagePageViewTracer::MoveSlider2( ) -{ - this->slider2->setValue( this->Pool->GetItem( 1 )->GetSlice() ); -} - -void QImagePageViewTracer::MoveSlider3( ) -{ - this->slider3->setValue( this->Pool->GetItem( 2 )->GetSlice() ); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.h b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.h deleted file mode 100644 index 24ca6284..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QImagePageViewTracer.h +++ /dev/null @@ -1,217 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __QImagePageViewTracer_h -#define __QImagePageViewTracer_h - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "vtkViewImage3D.h" -#include "vtkViewImage2DWithContourWidgetCollection.h" -#include "QSplitterchild.h" - -/** -\class QImagePageViewTracer -\bug vtkViewImage3D MUST be the last element inserted in Splitters (temporary solution)... -The bug is at the destruction of the QImagePageViewTracer: -the vtkViewImage3D must be destructed last. -*/ -class QImagePageViewTracer : public QWidget -{ - Q_OBJECT -public: - explicit QImagePageViewTracer( QWidget* parent = 0 ); - ~QImagePageViewTracer(); - - void SetImage( vtkImageData* input ); - -#ifdef MegaVTK_USE_ITK - template< class TImage > - void SetITKImage (TImage::Pointer); -#endif - - void setupUi( QWidget *Form ); - void retranslateUi(QWidget *Form); - - int GetFullScreenView( ) const; - - QVTKWidget* GetActiveQVTKWidget( ); - vtkViewImage* GetActiveView(); - - enum SnapshotImageType - { - BMP = 0, - EPS, - JPEG, - PNG, - TIFF - }; - - void SetTag( const QString& iTag ); - QString GetTag( ) const; - - void SetCellId( const unsigned int& iId ); - unsigned int GetCellId( ) const; - - void SetTracerON(); - void SetTracerOFF(); - void SetTracer( const bool& iState ); - - void GetBackgroundColor( double& r, double& g, double& b ); - double* GetBackgroundColor(); - -public slots: - - void SetBackgroundColor( const double& r, const double& g, const double& b ); - void SetBackgroundColor( double rgb[3] ); - void SetBackgroundColor( const QColor& iColor ); - - void SetLookupTable( vtkLookupTable* lut ); - void SetShowAnnotations( const bool& ); - void SetShowScalarBar( const bool& ); - void SetColorWindow( const double& ); - void SetColorLevel( const double& ); - - void SetFullScreenView( const int& iS ); - void quadview(); - void FullScreenViewXY(); - void FullScreenView2(); - void FullScreenView3(); - void FullScreenViewXYZ(); - void SetView3DToTriPlanarMode(); - void SetView3DToVolumeRenderingMode(); - - void SnapshotViewXY( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotView2( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotView3( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - void SnapshotViewXYZ( const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - - void SetSlideView1( const int& ); - void SetSlideView2( const int& ); - void SetSlideView3( const int& ); - - void ValidateContour( - const int& iId, - const QColor& iColor, - const bool& iSave ); - void ReinitializeContour( ); - void Render( ); - -protected: - QSplitter* vSplitter; - QSplitterchild* htSplitter; - QSplitterchild* hbSplitter; - - QWidget* LayOutWidget1; - QHBoxLayout* LayOut1; - QSlider* slider1; - QVTKWidget* qvtkWidget_XY; - - QWidget* LayOutWidget2; - QHBoxLayout* LayOut2; - QSlider* slider2; - QVTKWidget* qvtkWidget_2; - - QWidget* LayOutWidget3; - QHBoxLayout* LayOut3; - QSlider* slider3; - QVTKWidget* qvtkWidget_3; - - QWidget* LayOutWidget4; - QHBoxLayout* LayOut4; - QVTKWidget* qvtkWidget_XYZ; - QSpacerItem* Spacer; - vtkViewImage3D* View3D; - - vtkImageData* Image; - vtkEventQtSlotConnect* vtkEventQtConnector; - - vtkViewImage2DWithContourWidgetCollection* Pool; - - QString Tag; - -#ifdef MegaVTK_USE_ITK - /** - This pointer is used to store internally a reference to the - current ITK->VTK converter, in order to prevent the image buffer - to be deleted unexpectdely. See the SetITKImageInXXX for more - information. - */ - //BTX - itk::ProcessObject::Pointer ImageConverter; - //ETX -#endif - - virtual void resizeEvent( QResizeEvent* event ); -// virtual void dragEnterEvent ( QDragEnterEvent * event ); - - void SnapshotView( QVTKWidget* iWidget, - const SnapshotImageType& iType, - const QString& iBaseName = QString( "snapshot" ) ); - - bool BuildScreenshotFromImage( vtkImageData* image, - vtkImageData* screenshot, int size = 0 ); - bool BuildScreenshotFromRenderWindow( vtkRenderWindow *win, - vtkImageData* screenshot, int size = 0 ); - - int SnapshotId; - - int IsFullScreen; - - unsigned int CellId; - -protected slots: - void MoveSlider1(); - void MoveSlider2(); - void MoveSlider3(); - -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.cxx deleted file mode 100755 index fc4c00aa..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.cxx +++ /dev/null @@ -1,60 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "QSplitterchild.h" - -QSplitterchild::QSplitterchild( QWidget* parent ): QSplitter( parent ) -{ - prevpos=0; - previndex=0; -} - -QSplitterchild::QSplitterchild( Qt::Orientation orientation, QWidget * parent):QSplitter(orientation,parent) -{} - -QSplitterchild::~QSplitterchild() -{} - - - -void QSplitterchild::moveSplitter(int pos,int index) -{ - if ((prevpos != pos) || (previndex != index)) - { - prevpos=pos; - previndex=index; - QSplitter::moveSplitter(pos, index); - - } -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.h b/branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.h deleted file mode 100755 index 759a2a7d..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/qt/QSplitterchild.h +++ /dev/null @@ -1,63 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __QSplitterchild_h -#define __QSplitterchild_h - -#include - -/** - \class QSplitterchild - \brief in the QSplitter class, the method moveSplitter is protected, so it is -not possible to use connect between the QSplitter to synchronize them. -that's the reason for the creation of QSplitterchild. -*/ -class QSplitterchild : public QSplitter -{ - Q_OBJECT - -public: - explicit QSplitterchild( QWidget* parent = 0 ); - explicit QSplitterchild ( Qt::Orientation orientation, QWidget * parent = 0 ); - virtual ~QSplitterchild(); - -public slots: - void moveSplitter(int pos,int index); - -protected: - int prevpos; - int previndex; -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/CMakeLists.txt b/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/CMakeLists.txt deleted file mode 100644 index 524ec0d0..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -INSTALL_FILES(/include "(\\.h|\\.txx)$") diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.h deleted file mode 100644 index 8f35acb3..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.h +++ /dev/null @@ -1,104 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile: itkImageToVTKImageFilter.h,v $ - Language: C++ - Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ - Version: $Revision: 477 $ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -#ifndef __itkImageToVTKImageFilter_h -#define __itkImageToVTKImageFilter_h - -#include "itkVTKImageExport.h" -#include "vtkImageImport.h" -#include "vtkImageData.h" - -namespace itk -{ - -/** \class ImageToVTKImageFilter - * \brief Converts an ITK image into a VTK image and plugs a - * itk data pipeline to a VTK datapipeline. - * - * This class puts together an itkVTKImageExporter and a vtkImageImporter. - * It takes care of the details related to the connection of ITK and VTK - * pipelines. The User will perceive this filter as an adaptor to which - * an itk::Image can be plugged as input and a vtkImage is produced as - * output. - * - * \ingroup ImageFilters - */ -template -class ITK_EXPORT ImageToVTKImageFilter : public ProcessObject -{ -public: - /** Standard class typedefs. */ - typedef ImageToVTKImageFilter Self; - typedef ProcessObject Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(ImageToVTKImageFilter, ProcessObject); - - /** Some typedefs. */ - typedef TInputImage InputImageType; - typedef typename InputImageType::ConstPointer InputImagePointer; - typedef VTKImageExport< InputImageType> ExporterFilterType; - typedef typename ExporterFilterType::Pointer ExporterFilterPointer; - - /** Get the output in the form of a vtkImage. - This call is delegated to the internal vtkImageImporter filter */ - vtkImageData * GetOutput() const; - - /** Set the input in the form of an itk::Image */ - void SetInput( const InputImageType * ); - - /** Return the internal VTK image importer filter. - This is intended to facilitate users the access - to methods in the importer */ - vtkImageImport * GetImporter() const; - - /** Return the internal ITK image exporter filter. - This is intended to facilitate users the access - to methods in the exporter */ - ExporterFilterType * GetExporter() const; - - /** This call delegate the update to the importer */ - void Update(); - -protected: - ImageToVTKImageFilter(); - virtual ~ImageToVTKImageFilter(); - -private: - ImageToVTKImageFilter(const Self&); //purposely not implemented - void operator=(const Self&); //purposely not implemented - - ExporterFilterPointer m_Exporter; - vtkImageImport * m_Importer; - -}; - -} // end namespace itk - -#ifndef ITK_MANUAL_INSTANTIATION -#include "itkImageToVTKImageFilter.txx" -#endif - -#endif - - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.txx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.txx deleted file mode 100644 index 8035f7b7..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkImageToVTKImageFilter.txx +++ /dev/null @@ -1,140 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile: itkImageToVTKImageFilter.txx,v $ - Language: C++ - Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ - Version: $Revision: 477 $ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ -#ifndef _itkImageToVTKImageFilter_txx -#define _itkImageToVTKImageFilter_txx - -#include "itkImageToVTKImageFilter.h" - -namespace itk -{ - - - -/** - * Constructor - */ -template -ImageToVTKImageFilter -::ImageToVTKImageFilter() -{ - - m_Importer = vtkImageImport::New(); - - m_Exporter = ExporterFilterType::New(); - - m_Importer->SetUpdateInformationCallback(m_Exporter->GetUpdateInformationCallback()); - m_Importer->SetPipelineModifiedCallback(m_Exporter->GetPipelineModifiedCallback()); - m_Importer->SetWholeExtentCallback(m_Exporter->GetWholeExtentCallback()); - m_Importer->SetSpacingCallback(m_Exporter->GetSpacingCallback()); - m_Importer->SetOriginCallback(m_Exporter->GetOriginCallback()); - m_Importer->SetScalarTypeCallback(m_Exporter->GetScalarTypeCallback()); - m_Importer->SetNumberOfComponentsCallback(m_Exporter->GetNumberOfComponentsCallback()); - m_Importer->SetPropagateUpdateExtentCallback(m_Exporter->GetPropagateUpdateExtentCallback()); - m_Importer->SetUpdateDataCallback(m_Exporter->GetUpdateDataCallback()); - m_Importer->SetDataExtentCallback(m_Exporter->GetDataExtentCallback()); - m_Importer->SetBufferPointerCallback(m_Exporter->GetBufferPointerCallback()); - m_Importer->SetCallbackUserData(m_Exporter->GetCallbackUserData()); - -} - - - - -/** - * Destructor - */ -template -ImageToVTKImageFilter -::~ImageToVTKImageFilter() -{ - m_Importer->Delete(); -} - - - -/** - * Set an itk::Image as input - */ -template -void -ImageToVTKImageFilter -::SetInput( const InputImageType * inputImage ) -{ - m_Exporter->SetInput( inputImage ); -} - - - -/** - * Get a vtkImage as output - */ -template -vtkImageData * -ImageToVTKImageFilter -::GetOutput() const -{ - return m_Importer->GetOutput(); -} - - - - -/** - * Get the importer filter - */ -template -vtkImageImport * -ImageToVTKImageFilter -::GetImporter() const -{ - return m_Importer; -} - - - -/** - * Get the exporter filter - */ -template -typename ImageToVTKImageFilter::ExporterFilterType * -ImageToVTKImageFilter -::GetExporter() const -{ - return m_Exporter.GetPointer(); -} - - - -/** - * Delegate the Update to the importer - */ -template -void -ImageToVTKImageFilter -::Update() -{ - m_Importer->Update(); -} - - - - - -} // end namespace itk - -#endif - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.h deleted file mode 100644 index d86851df..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.h +++ /dev/null @@ -1,107 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile: itkVTKImageToImageFilter.h,v $ - Language: C++ - Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ - Version: $Revision: 477 $ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ -#ifndef __itkVTKImageToImageFilter_h -#define __itkVTKImageToImageFilter_h - -#include "itkVTKImageImport.h" -#include "vtkImageExport.h" -#include "vtkImageData.h" - -#ifndef vtkFloatingPointType -#define vtkFloatingPointType float -#endif - -namespace itk -{ - -/** \class VTKImageToImageFilter - * \brief Converts a VTK image into an ITK image and plugs a - * vtk data pipeline to an ITK datapipeline. - * - * This class puts together an itkVTKImageImporter and a vtkImageExporter. - * It takes care of the details related to the connection of ITK and VTK - * pipelines. The User will perceive this filter as an adaptor to which - * a vtkImage can be plugged as input and an itk::Image is produced as - * output. - * - * \ingroup ImageFilters - */ -template -class ITK_EXPORT VTKImageToImageFilter : public ProcessObject -{ -public: - /** Standard class typedefs. */ - typedef VTKImageToImageFilter Self; - typedef ProcessObject Superclass; - typedef SmartPointer Pointer; - typedef SmartPointer ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(VTKImageToImageFilter, ProcessObject); - - /** Some typedefs. */ - typedef TOutputImage OutputImageType; - typedef typename OutputImageType::ConstPointer OutputImagePointer; - typedef VTKImageImport< OutputImageType > ImporterFilterType; - typedef typename ImporterFilterType::Pointer ImporterFilterPointer; - - /** Get the output in the form of a vtkImage. - This call is delegated to the internal vtkImageImporter filter */ - OutputImageType * GetOutput() const; - - /** Set the input in the form of a vtkImageData */ - void SetInput( vtkImageData * ); - - /** Return the internal VTK image exporter filter. - This is intended to facilitate users the access - to methods in the exporter */ - vtkImageExport * GetExporter() const; - - /** Return the internal ITK image importer filter. - This is intended to facilitate users the access - to methods in the importer */ - ImporterFilterType * GetImporter() const; - - /** This call delegate the update to the importer */ - void Update(); - -protected: - VTKImageToImageFilter(); - virtual ~VTKImageToImageFilter(); - -private: - VTKImageToImageFilter(const Self&); //purposely not implemented - void operator=(const Self&); //purposely not implemented - - ImporterFilterPointer m_Importer; - vtkImageExport * m_Exporter; - -}; - -} // end namespace itk - -#ifndef ITK_MANUAL_INSTANTIATION -#include "itkVTKImageToImageFilter.txx" -#endif - -#endif - - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.txx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.txx deleted file mode 100644 index 77eee805..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkItk/itkVTKImageToImageFilter.txx +++ /dev/null @@ -1,144 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile: itkVTKImageToImageFilter.txx,v $ - Language: C++ - Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ - Version: $Revision: 477 $ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ -#ifndef _itkVTKImageToImageFilter_txx -#define _itkVTKImageToImageFilter_txx - -#include "itkVTKImageToImageFilter.h" - -namespace itk -{ - - - -/** - * Constructor - */ -template -VTKImageToImageFilter -::VTKImageToImageFilter() -{ - - m_Exporter = vtkImageExport::New(); - - m_Importer = ImporterFilterType::New(); - - m_Importer->SetUpdateInformationCallback( m_Exporter->GetUpdateInformationCallback()); - m_Importer->SetPipelineModifiedCallback( m_Exporter->GetPipelineModifiedCallback()); - m_Importer->SetWholeExtentCallback( m_Exporter->GetWholeExtentCallback()); - m_Importer->SetSpacingCallback( m_Exporter->GetSpacingCallback()); - m_Importer->SetOriginCallback( m_Exporter->GetOriginCallback()); - m_Importer->SetScalarTypeCallback( m_Exporter->GetScalarTypeCallback()); - m_Importer->SetNumberOfComponentsCallback( m_Exporter->GetNumberOfComponentsCallback()); - m_Importer->SetPropagateUpdateExtentCallback( m_Exporter->GetPropagateUpdateExtentCallback()); - m_Importer->SetUpdateDataCallback( m_Exporter->GetUpdateDataCallback()); - m_Importer->SetDataExtentCallback( m_Exporter->GetDataExtentCallback()); - m_Importer->SetBufferPointerCallback( m_Exporter->GetBufferPointerCallback()); - m_Importer->SetCallbackUserData( m_Exporter->GetCallbackUserData()); - -} - - - - -/** - * Destructor - */ -template -VTKImageToImageFilter -::~VTKImageToImageFilter() -{ - if( m_Exporter ) - { - m_Exporter->Delete(); - m_Exporter = 0; - } -} - - - -/** - * Set a vtkImageData as input - */ -template -void -VTKImageToImageFilter -::SetInput( vtkImageData * inputImage ) -{ - m_Exporter->SetInput( inputImage ); -} - - - -/** - * Get an itk::Image as output - */ -template -typename VTKImageToImageFilter::OutputImageType * -VTKImageToImageFilter -::GetOutput() const -{ - return m_Importer->GetOutput(); -} - - - - -/** - * Get the exporter filter - */ -template -vtkImageExport * -VTKImageToImageFilter -::GetExporter() const -{ - return m_Exporter; -} - - - -/** - * Get the importer filter - */ -template -typename VTKImageToImageFilter::ImporterFilterType * -VTKImageToImageFilter -::GetImporter() const -{ - return m_Importer; -} - - - - -/** - * Delegate the Update to the importer - */ -template -void -VTKImageToImageFilter -::Update() -{ - m_Importer->Update(); -} - - - - -} // end namespace itk - -#endif - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/CMakeLists.txt b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/CMakeLists.txt deleted file mode 100644 index 6acb96f3..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -FILE( GLOB vtkRenderingAddOn_SRCS2 *.cxx ) - -ADD_LIBRARY( vtkRenderingAddOn2 - ${LIBS_STYLE} - ${vtkRenderingAddOn_SRCS2} - ) - -SET(vtkRenderingAddOn_LIBS2 - vtkCommon - vtkRendering - vtkWidgets - vtkVolumeRendering - vtkHybrid - vtkImaging - ) - -TARGET_LINK_LIBRARIES( vtkRenderingAddOn2 - ${vtkRenderingAddOn_LIBS2} - ) - -INSTALL_TARGETS(/lib vtkRenderingAddOn2) - -INSTALL_FILES(/include "(\\.h|\\.txx)$") diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Asymmetry.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Asymmetry.h deleted file mode 100644 index 532bea44..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Asymmetry.h +++ /dev/null @@ -1,316 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: Asymmetry.h 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - - - -#ifndef _lut_asymmetry_h_ -#define _lut_asymmetry_h_ - - -static const float AsymmetryLUT[256][3] = - {{0.000000, 0.000000, 1.000000}, - {0.000000, 0.019608, 1.000000}, - {0.000000, 0.039216, 1.000000}, - {0.000000, 0.058824, 1.000000}, - {0.000000, 0.078431, 1.000000}, - {0.000000, 0.098039, 1.000000}, - {0.000000, 0.117647, 1.000000}, - {0.000000, 0.137255, 1.000000}, - {0.000000, 0.156863, 1.000000}, - {0.000000, 0.176471, 1.000000}, - {0.000000, 0.196078, 1.000000}, - {0.000000, 0.215686, 1.000000}, - {0.000000, 0.235294, 1.000000}, - {0.000000, 0.254902, 1.000000}, - {0.000000, 0.274510, 1.000000}, - {0.000000, 0.294118, 1.000000}, - {0.000000, 0.313725, 1.000000}, - {0.000000, 0.333333, 1.000000}, - {0.000000, 0.352941, 1.000000}, - {0.000000, 0.372549, 1.000000}, - {0.000000, 0.392157, 1.000000}, - {0.000000, 0.411765, 1.000000}, - {0.000000, 0.431373, 1.000000}, - {0.000000, 0.450980, 1.000000}, - {0.000000, 0.470588, 1.000000}, - {0.000000, 0.490196, 1.000000}, - {0.000000, 0.509804, 1.000000}, - {0.000000, 0.529412, 1.000000}, - {0.000000, 0.549020, 1.000000}, - {0.000000, 0.568627, 1.000000}, - {0.000000, 0.588235, 1.000000}, - {0.000000, 0.607843, 1.000000}, - {0.000000, 0.627451, 1.000000}, - {0.000000, 0.647059, 1.000000}, - {0.000000, 0.666667, 1.000000}, - {0.000000, 0.686275, 1.000000}, - {0.000000, 0.705882, 1.000000}, - {0.000000, 0.725490, 1.000000}, - {0.000000, 0.745098, 1.000000}, - {0.000000, 0.764706, 1.000000}, - {0.000000, 0.784314, 1.000000}, - {0.000000, 0.803922, 1.000000}, - {0.000000, 0.823529, 1.000000}, - {0.000000, 0.843137, 1.000000}, - {0.000000, 0.862745, 1.000000}, - {0.000000, 0.882353, 1.000000}, - {0.000000, 0.901961, 1.000000}, - {0.000000, 0.921569, 1.000000}, - {0.000000, 0.941176, 1.000000}, - {0.000000, 0.960784, 1.000000}, - {0.000000, 0.980392, 1.000000}, - {0.000000, 1.000000, 1.000000}, - {0.000000, 1.000000, 0.980392}, - {0.000000, 1.000000, 0.960784}, - {0.000000, 1.000000, 0.941176}, - {0.000000, 1.000000, 0.921569}, - {0.000000, 1.000000, 0.901961}, - {0.000000, 1.000000, 0.882353}, - {0.000000, 1.000000, 0.862745}, - {0.000000, 1.000000, 0.843137}, - {0.000000, 1.000000, 0.823529}, - {0.000000, 1.000000, 0.803922}, - {0.000000, 1.000000, 0.784314}, - {0.000000, 1.000000, 0.764706}, - {0.000000, 1.000000, 0.745098}, - {0.000000, 1.000000, 0.725490}, - {0.000000, 1.000000, 0.705882}, - {0.000000, 1.000000, 0.686275}, - {0.000000, 1.000000, 0.666667}, - {0.000000, 1.000000, 0.647059}, - {0.000000, 1.000000, 0.627451}, - {0.000000, 1.000000, 0.607843}, - {0.000000, 1.000000, 0.588235}, - {0.000000, 1.000000, 0.568627}, - {0.000000, 1.000000, 0.549020}, - {0.000000, 1.000000, 0.529412}, - {0.000000, 1.000000, 0.509804}, - {0.000000, 1.000000, 0.490196}, - {0.000000, 1.000000, 0.470588}, - {0.000000, 1.000000, 0.450980}, - {0.000000, 1.000000, 0.431373}, - {0.000000, 1.000000, 0.411765}, - {0.000000, 1.000000, 0.392157}, - {0.000000, 1.000000, 0.372549}, - {0.000000, 1.000000, 0.352941}, - {0.000000, 1.000000, 0.333333}, - {0.000000, 1.000000, 0.313725}, - {0.000000, 1.000000, 0.294118}, - {0.000000, 1.000000, 0.274510}, - {0.000000, 1.000000, 0.254902}, - {0.000000, 1.000000, 0.235294}, - {0.000000, 1.000000, 0.215686}, - {0.000000, 1.000000, 0.196078}, - {0.000000, 1.000000, 0.176471}, - {0.000000, 1.000000, 0.156863}, - {0.000000, 1.000000, 0.137255}, - {0.000000, 1.000000, 0.117647}, - {0.000000, 1.000000, 0.098039}, - {0.000000, 1.000000, 0.078431}, - {0.000000, 1.000000, 0.058824}, - {0.000000, 1.000000, 0.039216}, - {0.000000, 1.000000, 0.019608}, - {0.000000, 1.000000, 0.000000}, - {0.019608, 1.000000, 0.000000}, - {0.039216, 1.000000, 0.000000}, - {0.058824, 1.000000, 0.000000}, - {0.078431, 1.000000, 0.000000}, - {0.098039, 1.000000, 0.000000}, - {0.117647, 1.000000, 0.000000}, - {0.137255, 1.000000, 0.000000}, - {0.156863, 1.000000, 0.000000}, - {0.176471, 1.000000, 0.000000}, - {0.196078, 1.000000, 0.000000}, - {0.215686, 1.000000, 0.000000}, - {0.235294, 1.000000, 0.000000}, - {0.254902, 1.000000, 0.000000}, - {0.274510, 1.000000, 0.000000}, - {0.294118, 1.000000, 0.000000}, - {0.313725, 1.000000, 0.000000}, - {0.333333, 1.000000, 0.000000}, - {0.352941, 1.000000, 0.000000}, - {0.372549, 1.000000, 0.000000}, - {0.392157, 1.000000, 0.000000}, - {0.411765, 1.000000, 0.000000}, - {0.431373, 1.000000, 0.000000}, - {0.450980, 1.000000, 0.000000}, - {0.470588, 1.000000, 0.000000}, - {0.490196, 1.000000, 0.000000}, - {0.509804, 1.000000, 0.000000}, - {0.529412, 1.000000, 0.000000}, - {0.549020, 1.000000, 0.000000}, - {0.568627, 1.000000, 0.000000}, - {0.588235, 1.000000, 0.000000}, - {0.607843, 1.000000, 0.000000}, - {0.627451, 1.000000, 0.000000}, - {0.647059, 1.000000, 0.000000}, - {0.666667, 1.000000, 0.000000}, - {0.686275, 1.000000, 0.000000}, - {0.705882, 1.000000, 0.000000}, - {0.725490, 1.000000, 0.000000}, - {0.745098, 1.000000, 0.000000}, - {0.764706, 1.000000, 0.000000}, - {0.784314, 1.000000, 0.000000}, - {0.803922, 1.000000, 0.000000}, - {0.823529, 1.000000, 0.000000}, - {0.843137, 1.000000, 0.000000}, - {0.862745, 1.000000, 0.000000}, - {0.882353, 1.000000, 0.000000}, - {0.901961, 1.000000, 0.000000}, - {0.921569, 1.000000, 0.000000}, - {0.941176, 1.000000, 0.000000}, - {0.960784, 1.000000, 0.000000}, - {0.980392, 1.000000, 0.000000}, - {1.000000, 1.000000, 0.000000}, - {1.000000, 0.980392, 0.000000}, - {1.000000, 0.960784, 0.000000}, - {1.000000, 0.941176, 0.000000}, - {1.000000, 0.921569, 0.000000}, - {1.000000, 0.901961, 0.000000}, - {1.000000, 0.882353, 0.000000}, - {1.000000, 0.862745, 0.000000}, - {1.000000, 0.843137, 0.000000}, - {1.000000, 0.823529, 0.000000}, - {1.000000, 0.803922, 0.000000}, - {1.000000, 0.784314, 0.000000}, - {1.000000, 0.764706, 0.000000}, - {1.000000, 0.745098, 0.000000}, - {1.000000, 0.725490, 0.000000}, - {1.000000, 0.705882, 0.000000}, - {1.000000, 0.686275, 0.000000}, - {1.000000, 0.666667, 0.000000}, - {1.000000, 0.647059, 0.000000}, - {1.000000, 0.627451, 0.000000}, - {1.000000, 0.607843, 0.000000}, - {1.000000, 0.588235, 0.000000}, - {1.000000, 0.568627, 0.000000}, - {1.000000, 0.549020, 0.000000}, - {1.000000, 0.529412, 0.000000}, - {1.000000, 0.509804, 0.000000}, - {1.000000, 0.490196, 0.000000}, - {1.000000, 0.470588, 0.000000}, - {1.000000, 0.450980, 0.000000}, - {1.000000, 0.431373, 0.000000}, - {1.000000, 0.411765, 0.000000}, - {1.000000, 0.392157, 0.000000}, - {1.000000, 0.372549, 0.000000}, - {1.000000, 0.352941, 0.000000}, - {1.000000, 0.333333, 0.000000}, - {1.000000, 0.313725, 0.000000}, - {1.000000, 0.294118, 0.000000}, - {1.000000, 0.274510, 0.000000}, - {1.000000, 0.254902, 0.000000}, - {1.000000, 0.235294, 0.000000}, - {1.000000, 0.215686, 0.000000}, - {1.000000, 0.196078, 0.000000}, - {1.000000, 0.176471, 0.000000}, - {1.000000, 0.156863, 0.000000}, - {1.000000, 0.137255, 0.000000}, - {1.000000, 0.117647, 0.000000}, - {1.000000, 0.098039, 0.000000}, - {1.000000, 0.078431, 0.000000}, - {1.000000, 0.058824, 0.000000}, - {1.000000, 0.039216, 0.000000}, - {1.000000, 0.019608, 0.000000}, - {1.000000, 0.000000, 0.000000}, - {1.000000, 0.000000, 0.019608}, - {1.000000, 0.000000, 0.039216}, - {1.000000, 0.000000, 0.058824}, - {1.000000, 0.000000, 0.078431}, - {1.000000, 0.000000, 0.098039}, - {1.000000, 0.000000, 0.117647}, - {1.000000, 0.000000, 0.137255}, - {1.000000, 0.000000, 0.156863}, - {1.000000, 0.000000, 0.176471}, - {1.000000, 0.000000, 0.196078}, - {1.000000, 0.000000, 0.215686}, - {1.000000, 0.000000, 0.235294}, - {1.000000, 0.000000, 0.254902}, - {1.000000, 0.000000, 0.274510}, - {1.000000, 0.000000, 0.294118}, - {1.000000, 0.000000, 0.313725}, - {1.000000, 0.000000, 0.333333}, - {1.000000, 0.000000, 0.352941}, - {1.000000, 0.000000, 0.372549}, - {1.000000, 0.000000, 0.392157}, - {1.000000, 0.000000, 0.411765}, - {1.000000, 0.000000, 0.431373}, - {1.000000, 0.000000, 0.450980}, - {1.000000, 0.000000, 0.470588}, - {1.000000, 0.000000, 0.490196}, - {1.000000, 0.000000, 0.509804}, - {1.000000, 0.000000, 0.529412}, - {1.000000, 0.000000, 0.549020}, - {1.000000, 0.000000, 0.568627}, - {1.000000, 0.000000, 0.588235}, - {1.000000, 0.000000, 0.607843}, - {1.000000, 0.000000, 0.627451}, - {1.000000, 0.000000, 0.647059}, - {1.000000, 0.000000, 0.666667}, - {1.000000, 0.000000, 0.686275}, - {1.000000, 0.000000, 0.705882}, - {1.000000, 0.000000, 0.725490}, - {1.000000, 0.000000, 0.745098}, - {1.000000, 0.000000, 0.764706}, - {1.000000, 0.000000, 0.784314}, - {1.000000, 0.000000, 0.803922}, - {1.000000, 0.000000, 0.823529}, - {1.000000, 0.000000, 0.843137}, - {1.000000, 0.000000, 0.862745}, - {1.000000, 0.000000, 0.882353}, - {1.000000, 0.000000, 0.901961}, - {1.000000, 0.000000, 0.921569}, - {1.000000, 0.000000, 0.941176}, - {1.000000, 0.000000, 0.960784}, - {1.000000, 0.000000, 0.980392}, - {1.000000, 0.000000, 1.000000}}; - - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Flow.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Flow.h deleted file mode 100644 index 8d9fc5ef..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Flow.h +++ /dev/null @@ -1,825 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: Flow.h 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -#ifndef _lut_Flow_h_ -#define _lut_Flow_h_ - -static const int Flow[3*256]={ -32, - 32, - 32, - 32, - 31, - 31, - 31, - 31, - 31, - 30, - 30, - 30, - 30, - 30, - 29, - 29, - 29, - 29, - 29, - 28, - 28, - 28, - 28, - 28, - 27, - 27, - 27, - 27, - 27, - 26, - 26, - 26, - 26, - 26, - 25, - 25, - 25, - 25, - 25, - 24, - 24, - 24, - 24, - 24, - 23, - 23, - 23, - 23, - 23, - 22, - 22, - 22, - 22, - 22, - 21, - 21, - 21, - 21, - 21, - 20, - 20, - 20, - 20, - 19, - 19, - 19, - 19, - 18, - 18, - 18, - 17, - 17, - 17, - 16, - 16, - 16, - 16, - 15, - 15, - 15, - 14, - 14, - 14, - 13, - 13, - 13, - 13, - 12, - 12, - 12, - 11, - 11, - 11, - 10, - 10, - 10, - 10, - 9, - 9, - 9, - 8, - 8, - 8, - 7, - 7, - 7, - 7, - 6, - 6, - 6, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 3, - 3, - 3, - 2, - 2, - 2, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 4, - 8, - 12, - 16, - 20, - 24, - 28, - 32, - 36, - 40, - 45, - 49, - 53, - 57, - 61, - 65, - 69, - 73, - 77, - 81, - 85, - 89, - 93, - 97, - 101, - 105, - 109, - 113, - 117, - 121, - 125, - 130, - 134, - 138, - 142, - 146, - 150, - 154, - 158, - 162, - 166, - 170, - 174, - 178, - 182, - 186, - 190, - 194, - 198, - 202, - 206, - 210, - 215, - 219, - 223, - 227, - 231, - 235, - 239, - 243, - 247, - 251, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 200, - 197, - 194, - 191, - 188, - 185, - 182, - 179, - 176, - 173, - 170, - 167, - 164, - 161, - 158, - 155, - 152, - 149, - 146, - 143, - 140, - 137, - 134, - 131, - 128, - 125, - 122, - 119, - 116, - 113, - 110, - 107, - 104, - 101, - 98, - 95, - 92, - 89, - 86, - 83, - 80, - 77, - 74, - 71, - 68, - 65, - 62, - 59, - 56, - 53, - 50, - 47, - 44, - 41, - 38, - 35, - 32, - 29, - 26, - 23, - 20, - 20, - 20, - 19, - 19, - 19, - 19, - 18, - 18, - 18, - 17, - 17, - 17, - 16, - 16, - 16, - 16, - 15, - 15, - 15, - 14, - 14, - 14, - 13, - 13, - 13, - 13, - 12, - 12, - 12, - 11, - 11, - 11, - 10, - 10, - 10, - 10, - 9, - 9, - 9, - 8, - 8, - 8, - 7, - 7, - 7, - 7, - 6, - 6, - 6, - 5, - 5, - 5, - 4, - 4, - 4, - 4, - 3, - 3, - 3, - 2, - 2, - 2, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 6, - 10, - 14, - 18, - 22, - 26, - 30, - 34, - 38, - 42, - 46, - 50, - 54, - 58, - 62, - 66, - 70, - 74, - 78, - 82, - 86, - 90, - 94, - 98, - 102, - 106, - 110, - 114, - 118, - 122, - 126, - 130, - 134, - 138, - 142, - 146, - 150, - 154, - 158, - 162, - 166, - 170, - 174, - 178, - 182, - 186, - 190, - 194, - 198, - 202, - 206, - 210, - 214, - 218, - 222, - 226, - 230, - 234, - 238, - 242, - 246, - 250, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 251, - 247, - 244, - 240, - 236, - 232, - 228, - 225, - 221, - 217, - 213, - 209, - 206, - 202, - 198, - 194, - 190, - 186, - 183, - 179, - 175, - 171, - 167, - 164, - 160, - 156, - 152, - 148, - 145, - 141, - 137, - 133, - 129, - 126, - 122, - 118, - 114, - 110, - 107, - 103, - 99, - 95, - 91, - 88, - 84, - 80, - 76, - 72, - 69, - 65, - 61, - 57, - 53, - 49, - 46, - 42, - 38, - 34, - 30, - 27, - 23, - 19, - 15, - 11, - 8, - 4, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8, - 16, - 24, - 32, - 40, - 48, - 56, - 64, - 72, - 80, - 88, - 96, - 104, - 112, - 120, - 128, - 136, - 144, - 152, - 160, - 168, - 176, - 184, - 192, - 200, - 208, - 216, - 224, - 232, - 240, - 248, - 255 -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/GEColor.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/GEColor.h deleted file mode 100644 index bf05c6b3..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/GEColor.h +++ /dev/null @@ -1,825 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: GEColor.h 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -#ifndef _lut_GEColor_h_ -#define _lut_GEColor_h_ - -static const int GEColor[3*256]={ -0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 3, - 5, - 7, - 9, - 11, - 13, - 15, - 17, - 19, - 21, - 23, - 25, - 27, - 29, - 31, - 33, - 35, - 37, - 39, - 41, - 43, - 45, - 47, - 49, - 51, - 53, - 55, - 57, - 59, - 61, - 63, - 65, - 67, - 69, - 71, - 73, - 75, - 77, - 79, - 81, - 83, - 85, - 86, - 88, - 90, - 92, - 94, - 96, - 98, - 100, - 102, - 104, - 106, - 108, - 110, - 112, - 114, - 116, - 118, - 120, - 122, - 124, - 126, - 128, - 130, - 132, - 134, - 136, - 138, - 140, - 142, - 144, - 146, - 148, - 150, - 152, - 154, - 156, - 158, - 160, - 162, - 164, - 166, - 168, - 170, - 171, - 173, - 175, - 177, - 179, - 181, - 183, - 185, - 187, - 189, - 191, - 193, - 195, - 197, - 199, - 201, - 203, - 205, - 207, - 209, - 211, - 213, - 215, - 217, - 219, - 221, - 223, - 225, - 227, - 229, - 231, - 233, - 235, - 237, - 239, - 241, - 243, - 245, - 247, - 249, - 251, - 253, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, -0, - 2, - 4, - 6, - 8, - 10, - 12, - 14, - 16, - 18, - 20, - 22, - 24, - 26, - 28, - 30, - 32, - 34, - 36, - 38, - 40, - 42, - 44, - 46, - 48, - 50, - 52, - 54, - 56, - 58, - 60, - 62, - 65, - 67, - 69, - 71, - 73, - 75, - 77, - 79, - 81, - 83, - 85, - 87, - 89, - 91, - 93, - 95, - 97, - 99, - 101, - 103, - 105, - 107, - 109, - 111, - 113, - 115, - 117, - 119, - 121, - 123, - 125, - 128, - 126, - 124, - 122, - 120, - 118, - 116, - 114, - 112, - 110, - 108, - 106, - 104, - 102, - 100, - 98, - 96, - 94, - 92, - 90, - 88, - 86, - 84, - 82, - 80, - 78, - 76, - 74, - 72, - 70, - 68, - 66, - 64, - 63, - 61, - 59, - 57, - 55, - 53, - 51, - 49, - 47, - 45, - 43, - 41, - 39, - 37, - 35, - 33, - 31, - 29, - 27, - 25, - 23, - 21, - 19, - 17, - 15, - 13, - 11, - 9, - 7, - 5, - 3, - 1, - 0, - 2, - 4, - 6, - 8, - 10, - 12, - 14, - 16, - 18, - 20, - 22, - 24, - 26, - 28, - 30, - 32, - 34, - 36, - 38, - 40, - 42, - 44, - 46, - 48, - 50, - 52, - 54, - 56, - 58, - 60, - 62, - 64, - 66, - 68, - 70, - 72, - 74, - 76, - 78, - 80, - 82, - 84, - 86, - 88, - 90, - 92, - 94, - 96, - 98, - 100, - 102, - 104, - 106, - 108, - 110, - 112, - 114, - 116, - 118, - 120, - 122, - 124, - 126, - 128, - 130, - 132, - 134, - 136, - 138, - 140, - 142, - 144, - 146, - 148, - 150, - 152, - 154, - 156, - 158, - 160, - 162, - 164, - 166, - 168, - 170, - 172, - 174, - 176, - 178, - 180, - 182, - 184, - 186, - 188, - 190, - 192, - 194, - 196, - 198, - 200, - 202, - 204, - 206, - 208, - 210, - 212, - 214, - 216, - 218, - 220, - 222, - 224, - 226, - 228, - 230, - 232, - 234, - 236, - 238, - 240, - 242, - 244, - 246, - 248, - 250, - 252, - 255, - 0, - 1, - 3, - 5, - 7, - 9, - 11, - 13, - 15, - 17, - 19, - 21, - 23, - 25, - 27, - 29, - 31, - 33, - 35, - 37, - 39, - 41, - 43, - 45, - 47, - 49, - 51, - 53, - 55, - 57, - 59, - 61, - 63, - 65, - 67, - 69, - 71, - 73, - 75, - 77, - 79, - 81, - 83, - 85, - 87, - 89, - 91, - 93, - 95, - 97, - 99, - 101, - 103, - 105, - 107, - 109, - 111, - 113, - 115, - 117, - 119, - 121, - 123, - 125, - 127, - 129, - 131, - 133, - 135, - 137, - 139, - 141, - 143, - 145, - 147, - 149, - 151, - 153, - 155, - 157, - 159, - 161, - 163, - 165, - 167, - 169, - 171, - 173, - 175, - 177, - 179, - 181, - 183, - 185, - 187, - 189, - 191, - 193, - 195, - 197, - 199, - 201, - 203, - 205, - 207, - 209, - 211, - 213, - 215, - 217, - 219, - 221, - 223, - 225, - 227, - 229, - 231, - 233, - 235, - 237, - 239, - 241, - 243, - 245, - 247, - 249, - 251, - 253, - 255, - 252, - 248, - 244, - 240, - 236, - 232, - 228, - 224, - 220, - 216, - 212, - 208, - 204, - 200, - 196, - 192, - 188, - 184, - 180, - 176, - 172, - 168, - 164, - 160, - 156, - 152, - 148, - 144, - 140, - 136, - 132, - 128, - 124, - 120, - 116, - 112, - 108, - 104, - 100, - 96, - 92, - 88, - 84, - 80, - 76, - 72, - 68, - 64, - 60, - 56, - 52, - 48, - 44, - 40, - 36, - 32, - 28, - 24, - 20, - 16, - 12, - 8, - 4, - 0, - 4, - 8, - 12, - 16, - 20, - 24, - 28, - 32, - 36, - 40, - 44, - 48, - 52, - 56, - 60, - 64, - 68, - 72, - 76, - 80, - 85, - 89, - 93, - 97, - 101, - 105, - 109, - 113, - 117, - 121, - 125, - 129, - 133, - 137, - 141, - 145, - 149, - 153, - 157, - 161, - 165, - 170, - 174, - 178, - 182, - 186, - 190, - 194, - 198, - 202, - 206, - 210, - 214, - 218, - 222, - 226, - 230, - 234, - 238, - 242, - 246, - 250, - 255 -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/HotMetal.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/HotMetal.h deleted file mode 100644 index fe707d30..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/HotMetal.h +++ /dev/null @@ -1,825 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: HotMetal.h 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -#ifndef _lut_HotMetal_h_ -#define _lut_HotMetal_h_ - -static const int HotMetal[256*3]={ -0, -1, - 2, - 4, - 5, - 7, - 8, - 9, - 11, - 12, - 14, - 15, - 16, - 18, - 19, - 21, - 22, - 23, - 25, - 26, - 28, - 29, - 30, - 32, - 33, - 35, - 36, - 37, - 39, - 40, - 42, - 43, - 44, - 46, - 47, - 49, - 50, - 51, - 53, - 54, - 56, - 57, - 58, - 60, - 61, - 63, - 64, - 65, - 67, - 68, - 70, - 71, - 72, - 74, - 75, - 77, - 78, - 79, - 81, - 82, - 84, - 85, - 86, - 88, - 89, - 91, - 92, - 93, - 95, - 96, - 98, - 99, - 100, - 102, - 103, - 105, - 106, - 107, - 109, - 110, - 112, - 113, - 114, - 116, - 117, - 119, - 120, - 121, - 123, - 124, - 126, - 127, - 128, - 130, - 131, - 133, - 134, - 135, - 137, - 138, - 140, - 141, - 142, - 144, - 145, - 147, - 148, - 149, - 151, - 152, - 154, - 155, - 156, - 158, - 159, - 161, - 162, - 163, - 165, - 166, - 168, - 169, - 170, - 172, - 173, - 175, - 176, - 177, - 179, - 180, - 182, - 183, - 184, - 186, - 187, - 189, - 190, - 191, - 193, - 194, - 196, - 197, - 198, - 200, - 201, - 203, - 204, - 205, - 207, - 208, - 210, - 211, - 212, - 214, - 215, - 217, - 218, - 219, - 221, - 222, - 224, - 225, - 226, - 228, - 229, - 231, - 232, - 233, - 235, - 236, - 238, - 239, - 240, - 242, - 243, - 245, - 246, - 247, - 249, - 250, - 252, - 253, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 2, - 5, - 8, - 11, - 14, - 16, - 19, - 22, - 25, - 28, - 30, - 33, - 36, - 39, - 42, - 44, - 47, - 50, - 53, - 56, - 58, - 61, - 64, - 67, - 70, - 72, - 75, - 78, - 81, - 84, - 86, - 89, - 92, - 95, - 98, - 100, - 103, - 106, - 109, - 112, - 114, - 117, - 120, - 123, - 126, - 128, - 131, - 134, - 137, - 140, - 142, - 145, - 148, - 151, - 154, - 156, - 159, - 162, - 165, - 168, - 170, - 173, - 176, - 179, - 182, - 184, - 187, - 190, - 193, - 196, - 198, - 201, - 204, - 207, - 210, - 212, - 215, - 218, - 221, - 224, - 226, - 229, - 232, - 235, - 238, - 240, - 243, - 246, - 249, - 252, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3, - 7, - 11, - 15, - 19, - 23, - 27, - 31, - 35, - 39, - 43, - 47, - 51, - 55, - 59, - 63, - 67, - 71, - 75, - 79, - 83, - 87, - 91, - 95, - 99, - 103, - 107, - 111, - 115, - 119, - 123, - 127, - 131, - 135, - 139, - 143, - 147, - 151, - 155, - 159, - 163, - 167, - 171, - 175, - 179, - 183, - 187, - 191, - 195, - 199, - 203, - 207, - 211, - 215, - 219, - 223, - 227, - 231, - 235, - 239, - 243, - 247, - 251 -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI.h deleted file mode 100644 index 9d87c7b9..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI.h +++ /dev/null @@ -1,261 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: LONI.h 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -#ifndef _lut_LONI_h_ -#define _lut_LONI_h_ - -static const float LONI[203][3] ={ - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0, 1.0000}, - {0, 0.0244, 1.0000}, - {0, 0.0488, 1.0000}, - {0, 0.0732, 1.0000}, - {0, 0.0976, 1.0000}, - {0, 0.1220, 1.0000}, - {0, 0.1463, 1.0000}, - {0, 0.1707, 1.0000}, - {0, 0.1951, 1.0000}, - {0, 0.2195, 1.0000}, - {0, 0.2439, 1.0000}, - {0, 0.2683, 1.0000}, - {0, 0.2927, 1.0000}, - {0, 0.3171, 1.0000}, - {0, 0.3415, 1.0000}, - {0, 0.3659, 1.0000}, - {0, 0.3902, 1.0000}, - {0, 0.4146, 1.0000}, - {0, 0.4390, 1.0000}, - {0, 0.4634, 1.0000}, - {0, 0.4878, 1.0000}, - {0, 0.5122, 1.0000}, - {0, 0.5366, 1.0000}, - {0, 0.5610, 1.0000}, - {0, 0.5854, 1.0000}, - {0, 0.6098, 1.0000}, - {0, 0.6341, 1.0000}, - {0, 0.6585, 1.0000}, - {0, 0.6829, 1.0000}, - {0, 0.7073, 1.0000}, - {0, 0.7317, 1.0000}, - {0, 0.7561, 1.0000}, - {0, 0.7805, 1.0000}, - {0, 0.8049, 1.0000}, - {0, 0.8293, 1.0000}, - {0, 0.8537, 1.0000}, - {0, 0.8780, 1.0000}, - {0, 0.9024, 1.0000}, - {0, 0.9268, 1.0000}, - {0, 0.9512, 1.0000}, - {0, 0.9756, 1.0000}, - {0, 1.0000, 1.0000}, - {0, 1.0000, 0.9756}, - {0, 1.0000, 0.9512}, - {0, 1.0000, 0.9268}, - {0, 1.0000, 0.9024}, - {0, 1.0000, 0.8780}, - {0, 1.0000, 0.8537}, - {0, 1.0000, 0.8293}, - {0, 1.0000, 0.8049}, - {0, 1.0000, 0.7805}, - {0, 1.0000, 0.7561}, - {0, 1.0000, 0.7317}, - {0, 1.0000, 0.7073}, - {0, 1.0000, 0.6829}, - {0, 1.0000, 0.6585}, - {0, 1.0000, 0.6341}, - {0, 1.0000, 0.6098}, - {0, 1.0000, 0.5854}, - {0, 1.0000, 0.5610}, - {0, 1.0000, 0.5366}, - {0, 1.0000, 0.5122}, - {0, 1.0000, 0.4878}, - {0, 1.0000, 0.4634}, - {0, 1.0000, 0.4390}, - {0, 1.0000, 0.4146}, - {0, 1.0000, 0.3902}, - {0, 1.0000, 0.3659}, - {0, 1.0000, 0.3415}, - {0, 1.0000, 0.3171}, - {0, 1.0000, 0.2927}, - {0, 1.0000, 0.2683}, - {0, 1.0000, 0.2439}, - {0, 1.0000, 0.2195}, - {0, 1.0000, 0.1951}, - {0, 1.0000, 0.1707}, - {0, 1.0000, 0.1463}, - {0, 1.0000, 0.1220}, - {0, 1.0000, 0.0976}, - {0, 1.0000, 0.0732}, - {0, 1.0000, 0.0488}, - {0, 1.0000, 0.0244}, - {0, 1.0000, 0}, - {0.0244, 1.0000, 0}, - {0.0488, 1.0000, 0}, - {0.0732, 1.0000, 0}, - {0.0976, 1.0000, 0}, - {0.1220, 1.0000, 0}, - {0.1463, 1.0000, 0}, - {0.1707, 1.0000, 0}, - {0.1951, 1.0000, 0}, - {0.2195, 1.0000, 0}, - {0.2439, 1.0000, 0}, - {0.2683, 1.0000, 0}, - {0.2927, 1.0000, 0}, - {0.3171, 1.0000, 0}, - {0.3415, 1.0000, 0}, - {0.3659, 1.0000, 0}, - {0.3902, 1.0000, 0}, - {0.4146, 1.0000, 0}, - {0.4390, 1.0000, 0}, - {0.4634, 1.0000, 0}, - {0.4878, 1.0000, 0}, - {0.5122, 1.0000, 0}, - {0.5366, 1.0000, 0}, - {0.5610, 1.0000, 0}, - {0.5854, 1.0000, 0}, - {0.6098, 1.0000, 0}, - {0.6341, 1.0000, 0}, - {0.6585, 1.0000, 0}, - {0.6829, 1.0000, 0}, - {0.7073, 1.0000, 0}, - {0.7317, 1.0000, 0}, - {0.7561, 1.0000, 0}, - {0.7805, 1.0000, 0}, - {0.8049, 1.0000, 0}, - {0.8293, 1.0000, 0}, - {0.8537, 1.0000, 0}, - {0.8780, 1.0000, 0}, - {0.9024, 1.0000, 0}, - {0.9268, 1.0000, 0}, - {0.9512, 1.0000, 0}, - {0.9756, 1.0000, 0}, - {1.0000, 1.0000, 0}, - {1.0000, 0.9756, 0}, - {1.0000, 0.9512, 0}, - {1.0000, 0.9268, 0}, - {1.0000, 0.9024, 0}, - {1.0000, 0.8780, 0}, - {1.0000, 0.8537, 0}, - {1.0000, 0.8293, 0}, - {1.0000, 0.8049, 0}, - {1.0000, 0.7805, 0}, - {1.0000, 0.7561, 0}, - {1.0000, 0.7317, 0}, - {1.0000, 0.7073, 0}, - {1.0000, 0.6829, 0}, - {1.0000, 0.6585, 0}, - {1.0000, 0.6341, 0}, - {1.0000, 0.6098, 0}, - {1.0000, 0.5854, 0}, - {1.0000, 0.5610, 0}, - {1.0000, 0.5366, 0}, - {1.0000, 0.5122, 0}, - {1.0000, 0.4878, 0}, - {1.0000, 0.4634, 0}, - {1.0000, 0.4390, 0}, - {1.0000, 0.4146, 0}, - {1.0000, 0.3902, 0}, - {1.0000, 0.3659, 0}, - {1.0000, 0.3415, 0}, - {1.0000, 0.3171, 0}, - {1.0000, 0.2927, 0}, - {1.0000, 0.2683, 0}, - {1.0000, 0.2439, 0}, - {1.0000, 0.2195, 0}, - {1.0000, 0.1951, 0}, - {1.0000, 0.1707, 0}, - {1.0000, 0.1463, 0}, - {1.0000, 0.1220, 0}, - {1.0000, 0.0976, 0}, - {1.0000, 0.0732, 0}, - {1.0000, 0.0488, 0}, - {1.0000, 0.0244, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}, - {1.0000, 0, 0}}; - - - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI2.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI2.h deleted file mode 100644 index 85d9e877..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/LONI2.h +++ /dev/null @@ -1,176 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: LONI2.h 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -#ifndef _lut_LONI2_h_ -#define _lut_LONI2_h_ - -static const float LONI2[120][3] = - {{0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.000000, 1.000000}, - {0.000000, 0.111111, 1.000000}, - {0.000000, 0.222222, 1.000000}, - {0.000000, 0.333333, 1.000000}, - {0.000000, 0.444444, 1.000000}, - {0.000000, 0.555556, 1.000000}, - {0.000000, 0.666667, 1.000000}, - {0.000000, 0.777778, 1.000000}, - {0.000000, 0.888889, 1.000000}, - {0.000000, 1.000000, 1.000000}, - {0.000000, 1.000000, 1.000000}, - {0.000000, 1.000000, 0.888889}, - {0.000000, 1.000000, 0.777778}, - {0.000000, 1.000000, 0.666667}, - {0.000000, 1.000000, 0.555556}, - {0.000000, 1.000000, 0.444444}, - {0.000000, 1.000000, 0.333333}, - {0.000000, 1.000000, 0.222222}, - {0.000000, 1.000000, 0.111111}, - {0.000000, 1.000000, 0.000000}, - {0.000000, 1.000000, 0.000000}, - {0.111111, 1.000000, 0.000000}, - {0.222222, 1.000000, 0.000000}, - {0.333333, 1.000000, 0.000000}, - {0.444444, 1.000000, 0.000000}, - {0.555556, 1.000000, 0.000000}, - {0.666667, 1.000000, 0.000000}, - {0.777778, 1.000000, 0.000000}, - {0.888889, 1.000000, 0.000000}, - {1.000000, 1.000000, 0.000000}, - {1.000000, 1.000000, 0.000000}, - {1.000000, 0.947368, 0.000000}, - {1.000000, 0.894737, 0.000000}, - {1.000000, 0.842105, 0.000000}, - {1.000000, 0.789474, 0.000000}, - {1.000000, 0.736842, 0.000000}, - {1.000000, 0.684211, 0.000000}, - {1.000000, 0.631579, 0.000000}, - {1.000000, 0.578947, 0.000000}, - {1.000000, 0.526316, 0.000000}, - {1.000000, 0.473684, 0.000000}, - {1.000000, 0.421053, 0.000000}, - {1.000000, 0.368421, 0.000000}, - {1.000000, 0.315789, 0.000000}, - {1.000000, 0.263158, 0.000000}, - {1.000000, 0.210526, 0.000000}, - {1.000000, 0.157895, 0.000000}, - {1.000000, 0.105263, 0.000000}, - {1.000000, 0.052632, 0.000000}, - {1.000000, 0.000000, 0.000000}, - {1.000000, 0.000000, 0.000000}, - {1.000000, 0.000000, 0.052632}, - {1.000000, 0.000000, 0.105263}, - {1.000000, 0.000000, 0.157895}, - {1.000000, 0.000000, 0.210526}, - {1.000000, 0.000000, 0.263158}, - {1.000000, 0.000000, 0.315789}, - {1.000000, 0.000000, 0.368421}, - {1.000000, 0.000000, 0.421053}, - {1.000000, 0.000000, 0.473684}, - {1.000000, 0.000000, 0.526316}, - {1.000000, 0.000000, 0.578947}, - {1.000000, 0.000000, 0.631579}, - {1.000000, 0.000000, 0.684211}, - {1.000000, 0.000000, 0.736842}, - {1.000000, 0.000000, 0.789474}, - {1.000000, 0.000000, 0.842105}, - {1.000000, 0.000000, 0.894737}, - {1.000000, 0.000000, 0.947368}, - {1.000000, 0.000000, 1.000000}}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Spectrum.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Spectrum.h deleted file mode 100644 index 81773244..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/lut/Spectrum.h +++ /dev/null @@ -1,826 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: Spectrum.h 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -#ifndef _lut_Spectrum_h_ -#define _lut_Spectrum_h_ - -static const int Spectrum[256*3]= -{ -255, - 250, - 245, - 240, - 235, - 230, - 225, - 220, - 215, - 210, - 205, - 200, - 195, - 190, - 185, - 180, - 175, - 170, - 165, - 160, - 155, - 150, - 145, - 140, - 135, - 130, - 125, - 120, - 115, - 110, - 105, - 100, - 95, - 90, - 85, - 80, - 75, - 70, - 65, - 60, - 55, - 50, - 45, - 40, - 35, - 30, - 25, - 20, - 15, - 10, - 5, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 5, - 10, - 15, - 20, - 25, - 30, - 35, - 40, - 45, - 50, - 55, - 60, - 65, - 70, - 75, - 80, - 85, - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 205, - 210, - 215, - 220, - 225, - 230, - 235, - 240, - 245, - 250, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 5, - 10, - 15, - 20, - 25, - 30, - 35, - 40, - 45, - 50, - 55, - 60, - 65, - 70, - 75, - 80, - 85, - 90, - 95, - 100, - 105, - 110, - 115, - 120, - 125, - 130, - 135, - 140, - 145, - 150, - 155, - 160, - 165, - 170, - 175, - 180, - 185, - 190, - 195, - 200, - 205, - 210, - 215, - 220, - 225, - 230, - 235, - 240, - 245, - 251, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 250, - 245, - 240, - 235, - 230, - 225, - 220, - 215, - 210, - 205, - 200, - 195, - 190, - 185, - 180, - 175, - 170, - 165, - 160, - 155, - 150, - 145, - 140, - 135, - 130, - 125, - 120, - 115, - 110, - 105, - 100, - 95, - 90, - 85, - 80, - 75, - 70, - 65, - 60, - 55, - 50, - 45, - 40, - 35, - 30, - 25, - 20, - 15, - 10, - 5, - 0, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 250, - 245, - 240, - 235, - 230, - 225, - 220, - 215, - 210, - 205, - 200, - 195, - 190, - 185, - 180, - 175, - 170, - 165, - 160, - 155, - 150, - 145, - 140, - 135, - 130, - 125, - 120, - 115, - 110, - 105, - 100, - 95, - 90, - 85, - 80, - 75, - 70, - 65, - 60, - 55, - 50, - 45, - 40, - 35, - 30, - 25, - 20, - 15, - 10, - 5, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.cxx deleted file mode 100644 index 1ac815fb..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.cxx +++ /dev/null @@ -1,547 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkFillImageWithPolyData.h" - -#include "vtkImageData.h" -#include "vtkInformation.h" -#include "vtkInformationVector.h" -#include "vtkObjectFactory.h" -#include "vtkStreamingDemandDrivenPipeline.h" -#include "vtkPoints.h" - -#include "vtkMath.h" -// extern int vtkrint(double a); - -vtkCxxRevisionMacro (vtkFillImageWithPolyData, "$Revision: 477 $"); -vtkStandardNewMacro (vtkFillImageWithPolyData); - - -vtkFillImageWithPolyData::vtkFillImageWithPolyData() -{ - this->PolyData = 0; - this->InsidePixelValue = 1.0; - this->ExtractionDirection = 0; -} - -vtkFillImageWithPolyData::~vtkFillImageWithPolyData() -{ - if( this->PolyData ) - this->PolyData->Delete(); -} - - -//---------------------------------------------------------------------------- -// The output extent is the intersection. -int vtkFillImageWithPolyData::RequestInformation ( - vtkInformation * vtkNotUsed(request), - vtkInformationVector **inputVector, - vtkInformationVector *outputVector) -{ - // get the info objects - vtkInformation* outInfo = outputVector->GetInformationObject(0); - - // copy the polydata bounding box into bbox - if( this->PolyData ) - this->PolyData->GetBounds (BBox); - - vtkDataObject::SetPointDataActiveScalarInfo(outInfo, VTK_UNSIGNED_CHAR , 1); - - return 1; -} - - -void vtkFillImageWithPolyData::PrintSelf(ostream& os, vtkIndent indent) -{ - this->Superclass::PrintSelf(os,indent); - if( this->PolyData ) - { - os << indent << "PolyData: \n"; - os << indent << *PolyData << endl; - } -} - - - - -//---------------------------------------------------------------------------- -// This templated function executes the filter for any type of data. -template -void vtkFillImageWithPolyDataExecuteZ(vtkFillImageWithPolyData *self, - int ext[6], - vtkImageData *inData, - T *in1Ptr, - vtkImageData *outData, - unsigned char *outPtr, - int id, int slice, double bbox[6]) -{ - int num0, num1, num2, numC, numP, pixSize; - int idx0, idx1, idx2; - vtkIdType in1Inc0, in1Inc1, in1Inc2; - vtkIdType outInc0, outInc1, outInc2; - unsigned long count = 0; - unsigned long target; - - numC = outData->GetNumberOfScalarComponents(); - pixSize = numC * sizeof(T); - - // Get information to march through data - inData->GetContinuousIncrements(ext, in1Inc0, in1Inc1, in1Inc2); - outData->GetContinuousIncrements(ext, outInc0, outInc1, outInc2); - num0 = ext[1] - ext[0] + 1; - num1 = ext[3] - ext[2] + 1; - num2 = ext[5] - ext[4] + 1; - - double outVal = self->GetInsidePixelValue(); - - vtkPoints* points = self->GetPolyData()->GetPoints(); - numP = self->GetPolyData()->GetNumberOfPoints(); - - double* spacing = inData->GetSpacing(); - double* origin = inData->GetOrigin(); - - target = (unsigned long)(num2*num1/50.0); - target++; - - // Loop through ouput pixels - for (idx2 = ext[4]; idx2 < ext[4]+num2; ++idx2) - { - - for (idx1 = ext[2]; !self->AbortExecute && idx1 < ext[2]+num1; ++idx1) - { - if (!id) - { - if (!(count%target)) - self->UpdateProgress(count/(50.0*target)); - count++; - } - - for (idx0 = ext[0]; idx0 < ext[0]+num0; ++idx0) - { - - double val=0.0; - if( idx2==slice) - { - double x=idx0*spacing[0]+origin[0]; - double y=idx1*spacing[1]+origin[1]; - - if( x>=bbox[0] && x<=bbox[1] && y>=bbox[2] && y<=bbox[3]) - { - double angle=0; - - for( int i=0;iGetPoint (i,p1); - points->GetPoint ((i+1)%numP,p2); - - dp1[0] = p1[0]-x; - dp1[1] = p1[1]-y; - - dp2[0] = p2[0]-x; - dp2[1] = p2[1]-y; - - angle += self->Angle2D (dp1,dp2); - - } - if( fabs (angle) >= vtkMath::Pi() ) - val = outVal; - } - } - - *outPtr=(unsigned char)(val); - ++outPtr; - in1Ptr+=in1Inc0; - } - in1Ptr += in1Inc1; - outPtr += outInc1; - } - in1Ptr += in1Inc2; - outPtr += outInc2; - } - -} - - - - -//---------------------------------------------------------------------------- -// This templated function executes the filter for any type of data. -template -void vtkFillImageWithPolyDataExecuteY(vtkFillImageWithPolyData *self, int ext[6], - vtkImageData *inData, T *in1Ptr, - vtkImageData *outData, unsigned char *outPtr, - int id, int slice, double bbox[6]) -{ - int num0, num1, num2, numC, numP, pixSize; - int idx0, idx1, idx2; - vtkIdType in1Inc0, in1Inc1, in1Inc2; - vtkIdType outInc0, outInc1, outInc2; - unsigned long count = 0; - unsigned long target; - - numC = outData->GetNumberOfScalarComponents(); - pixSize = numC * sizeof(T); - - // Get information to march through data - inData->GetContinuousIncrements(ext, in1Inc0, in1Inc1, in1Inc2); - outData->GetContinuousIncrements(ext, outInc0, outInc1, outInc2); - num0 = ext[1] - ext[0] + 1; - num1 = ext[3] - ext[2] + 1; - num2 = ext[5] - ext[4] + 1; - - vtkPoints* points = self->GetPolyData()->GetPoints(); - numP = self->GetPolyData()->GetNumberOfPoints(); - - double* spacing = inData->GetSpacing(); - double* origin = inData->GetOrigin(); - - target = (unsigned long)(num2*num1/50.0); - target++; - - // Loop through ouput pixels - for (idx2 = ext[4]; idx2 AbortExecute && idx1 < ext[2]+num1; ++idx1) - { - if (!id) - { - if (!(count%target)) - self->UpdateProgress(count/(50.0*target)); - count++; - } - - for (idx0 = ext[0]; idx0 < ext[0]+num0; ++idx0) - { - - double val=0.0; - - if( idx1==slice) - { - double angle=0; - - double x=idx0*spacing[0]+origin[0]; - double y=idx2*spacing[2]+origin[2]; - - if( x>=bbox[0] && x<=bbox[1] && y>=bbox[4] && y<=bbox[5]) - { - - for( int i=0;iGetPoint (i,p1); - points->GetPoint ((i+1)%numP,p2); - - dp1[0] = p1[0]-x; - dp1[1] = p1[2]-y; - - dp2[0] = p2[0]-x; - dp2[1] = p2[2]-y; - - angle += self->Angle2D (dp1,dp2); - } - - if( fabs (angle) >= vtkMath::Pi() ) - val = self->GetInsidePixelValue(); - } - } - - *outPtr=(unsigned char)(val); - ++outPtr; - in1Ptr+=in1Inc0; - } - in1Ptr += in1Inc1; - outPtr += outInc1; - } - in1Ptr += in1Inc2; - outPtr += outInc2; - } - -} - - - - - -//---------------------------------------------------------------------------- -// This templated function executes the filter for any type of data. -template -void vtkFillImageWithPolyDataExecuteX(vtkFillImageWithPolyData *self, int ext[6], - vtkImageData *inData, T *in1Ptr, - vtkImageData *outData, unsigned char *outPtr, - int id, int slice, double bbox[6]) -{ - int num0, num1, num2, numC, numP, pixSize; - int idx0, idx1, idx2; - vtkIdType in1Inc0, in1Inc1, in1Inc2; - vtkIdType outInc0, outInc1, outInc2; - unsigned long count = 0; - unsigned long target; - - numC = outData->GetNumberOfScalarComponents(); - pixSize = numC * sizeof(T); - - // Get information to march through data - inData->GetContinuousIncrements(ext, in1Inc0, in1Inc1, in1Inc2); - outData->GetContinuousIncrements(ext, outInc0, outInc1, outInc2); - num0 = ext[1] - ext[0] + 1; - num1 = ext[3] - ext[2] + 1; - num2 = ext[5] - ext[4] + 1; - - //get the polydata bounding box - //double bbox[6]; - //self->GetPolyData()->GetBounds (bbox); - - vtkPoints* points = self->GetPolyData()->GetPoints(); - numP = self->GetPolyData()->GetNumberOfPoints(); - - double* spacing = inData->GetSpacing(); - double* origin = inData->GetOrigin(); - - target = (unsigned long)(num2*num1/50.0); - target++; - - // Loop through ouput pixels - for (idx2 = ext[4]; idx2 < ext[4]+num2; ++idx2) - { - for (idx1 = ext[2]; !self->AbortExecute && idx1 < ext[2]+num1; ++idx1) - { - if (!id) - { - if (!(count%target)) - self->UpdateProgress(count/(50.0*target)); - count++; - } - - for (idx0 = ext[0]; idx0 < ext[0]+num0; ++idx0) - { - - double val=0.0; - - if( idx0==slice) - { - double angle=0; - - double x=idx1*spacing[1]+origin[1]; - double y=idx2*spacing[2]+origin[2]; - - if( x>=bbox[2] && x<=bbox[3] && y>=bbox[4] && y<=bbox[5]) - { - - for( int i=0;iGetPoint (i,p1); - points->GetPoint ((i+1)%numP,p2); - - dp1[0] = p1[1]-x; - dp1[1] = p1[2]-y; - - dp2[0] = p2[1]-x; - dp2[1] = p2[2]-y; - - angle += self->Angle2D (dp1,dp2); - } - - if( fabs (angle) >= vtkMath::Pi() ) - val = self->GetInsidePixelValue(); - } - } - - *outPtr=(unsigned char)(val); - ++outPtr; - in1Ptr+=in1Inc0; - } - in1Ptr += in1Inc1; - outPtr += outInc1; - } - in1Ptr += in1Inc2; - outPtr += outInc2; - } - -} - - -//---------------------------------------------------------------------------- -// This method is passed a input and output Datas, and executes the filter -// algorithm to fill the output from the inputs. -// It just executes a switch statement to call the correct function for -// the Datas data types. -void vtkFillImageWithPolyData::ThreadedRequestData( - vtkInformation * vtkNotUsed( request ), - vtkInformationVector ** vtkNotUsed( inputVector ), - vtkInformationVector * vtkNotUsed( outputVector ), - vtkImageData ***inData, - vtkImageData **outData, - int outExt[6], int id) -{ - void *inPtr1; - void *outPtr; - - if(!PolyData) - { - vtkErrorMacro("PolyData not set"); - return; - } - - if( PolyData->GetNumberOfPoints() < 3 ) - { - vtkErrorMacro("PolyData must have more than 2 points."); - return; - } - - // check for the orientation and slice to draw the ROI - int slice=0; - double* spacing = inData[0][0]->GetSpacing(); - double* origin = inData[0][0]->GetOrigin(); - - vtkPoints* points = PolyData->GetPoints(); - double pt[3]; - points->GetPoint (0,pt); - - if( ExtractionDirection > 2 || ExtractionDirection < 0 ) - { - vtkErrorMacro("Dont know extraction direction."); - } - else - { -// slice = int( vtkrint ( (pt[0]-origin[0])/spacing[0] )); - slice = static_cast< int >( - ( pt[ExtractionDirection] - origin[ExtractionDirection] ) - / spacing[ExtractionDirection ] ); - } - - inPtr1 = inData[0][0]->GetScalarPointerForExtent(outExt); - outPtr = outData[0]->GetScalarPointerForExtent(outExt); - - if( ExtractionDirection==2 ) - { - switch (inData[0][0]->GetScalarType()) - { - vtkTemplateMacro(vtkFillImageWithPolyDataExecuteZ(this, outExt, - inData[0][0],(VTK_TT *)(inPtr1), - outData[0], (unsigned char *)(outPtr), id, slice, BBox)); - default: - vtkErrorMacro(<< "Execute: Unknown ScalarType"); - return; - } - } - else - { - if ( ExtractionDirection==1 ) - { - switch (inData[0][0]->GetScalarType()) - { - - vtkTemplateMacro(vtkFillImageWithPolyDataExecuteY(this, outExt, - inData[0][0],(VTK_TT *)(inPtr1), - outData[0], (unsigned char *)(outPtr),id,slice,BBox)); - default: - vtkErrorMacro(<< "Execute: Unknown ScalarType"); - return; - } - - - } - else - { - switch (inData[0][0]->GetScalarType()) - { - vtkTemplateMacro(vtkFillImageWithPolyDataExecuteX(this, outExt, - inData[0][0],(VTK_TT *)(inPtr1), - outData[0], (unsigned char *)(outPtr),id,slice,BBox)); - default: - vtkErrorMacro(<< "Execute: Unknown ScalarType"); - return; - } - - } - - } -} - - - - -double vtkFillImageWithPolyData::Angle2D (const double dp1[2], const double dp2[2]) -{ - double dt, t1, t2; - t1 = atan2 (dp1[0],dp1[1]); - t2 = atan2 (dp2[0],dp2[1]); - - dt = t2-t1; - - while( dt > vtkMath::Pi() ) - dt -= 2. * static_cast< double >( vtkMath::Pi() ); - while( dt < -vtkMath::Pi() ) - dt += 2. * static_cast< double >( vtkMath::Pi() ); - - return dt; -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.h deleted file mode 100644 index 38351c3a..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkFillImageWithPolyData.h +++ /dev/null @@ -1,130 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __vtkFillImageWithPolyData_h -#define __vtkFillImageWithPolyData_h - -#include "vtkThreadedImageAlgorithm.h" -#include - -class vtkFillImageWithPolyData : - public vtkThreadedImageAlgorithm -{ - - public: - static vtkFillImageWithPolyData *New(); - vtkTypeRevisionMacro (vtkFillImageWithPolyData, vtkThreadedImageAlgorithm); - void PrintSelf (ostream &os, vtkIndent indent); - - - // Set/Get the polyData: - vtkSetObjectMacro (PolyData, vtkPolyData); - vtkGetObjectMacro (PolyData, vtkPolyData); - - vtkSetMacro (InsidePixelValue, double); - vtkGetMacro (InsidePixelValue, double); - - - vtkSetMacro (ExtractionDirection, int);//0: X, 1:Y, 2:Z - vtkGetMacro (ExtractionDirection, int); - - - double Angle2D (const double dp1[2], const double dp2[2]); - - - protected: - vtkFillImageWithPolyData(); - ~vtkFillImageWithPolyData(); - - - virtual int RequestInformation (vtkInformation *, - vtkInformationVector **, - vtkInformationVector *); - - - virtual void ThreadedRequestData(vtkInformation *request, - vtkInformationVector **inputVector, - vtkInformationVector *outputVector, - vtkImageData ***inData, - vtkImageData **outData, - int extent[6], int threadId); - - private: - vtkFillImageWithPolyData (const vtkFillImageWithPolyData&); - void operator=(const vtkFillImageWithPolyData&); - - vtkPolyData* PolyData; - double InsidePixelValue; - int ExtractionDirection; - double BBox[6]; - - -}; - - - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.cxx deleted file mode 100644 index cdf9487c..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.cxx +++ /dev/null @@ -1,127 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkImage3DCroppingBoxCallback.h" - -#include -#include - -void vtkImage3DCroppingBoxCallback::Execute ( vtkObject *caller, - unsigned long, void* ) -{ - - if( !this->VolumeMapper ) - { - return; - } - - // get the box widget - vtkBoxWidget *widget = reinterpret_cast(caller); - - if( !widget ) - { - return; - } - - - // Get the poly data defined by the vtkBoxWidget - vtkPolyData* myBox = vtkPolyData::New(); - widget->GetPolyData(myBox); - - double bounds[6]={0.0,0.0,0.0,0.0,0.0,0.0}; - this->VolumeMapper->GetBounds(bounds); - - // myBox contains 15 points and points 8 to 13 - // define the bounding box - double xmin, xmax, ymin, ymax, zmin, zmax; - double* pt = myBox->GetPoint(8); - xmin = pt[0]; - pt = myBox->GetPoint(9); - xmax = pt[0]; - pt = myBox->GetPoint(10); - ymin = pt[1]; - pt = myBox->GetPoint(11); - ymax = pt[1]; - pt = myBox->GetPoint(12); - zmin = pt[2]; - pt = myBox->GetPoint(13); - zmax = pt[2]; - - if(xminbounds[1]) xmax=bounds[1]; - if(ymax>bounds[3]) ymax=bounds[3]; - if(zmax>bounds[5]) zmax=bounds[5]; - - this->VolumeMapper->SetCroppingRegionFlagsToSubVolume(); - this->VolumeMapper->SetCroppingRegionPlanes(xmin, xmax, - ymin, ymax, - zmin, zmax); - - myBox->Delete(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.h deleted file mode 100644 index d611f4aa..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DCroppingBoxCallback.h +++ /dev/null @@ -1,107 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtk_Image3DCroppingBoxCallback_h_ -#define _vtk_Image3DCroppingBoxCallback_h_ - -#include -#include -#include -#include - -class vtkImage3DCroppingBoxCallback: -public vtkCommand -{ - - public: - static vtkImage3DCroppingBoxCallback* New() - { return new vtkImage3DCroppingBoxCallback; } - - virtual void Execute ( vtkObject *caller, unsigned long, void* ); - - void SetVolumeMapper (vtkVolumeMapper* mapper) - { - this->VolumeMapper = mapper; - } - vtkVolumeMapper* GetVolumeMapper (void) const - { - return this->VolumeMapper; - } - - - protected: - vtkImage3DCroppingBoxCallback() : VolumeMapper( 0 ) {} - ~vtkImage3DCroppingBoxCallback(){} - - private: - - vtkVolumeMapper* VolumeMapper; - -}; - - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.cxx deleted file mode 100644 index 9b613e03..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.cxx +++ /dev/null @@ -1,248 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: vtkImage3DImagePlaneCallback.cxx 665 2008-02-11 12:31:28Z ntoussaint $ -Language: C++ -Author: $Author: ntoussaint $ -Date: $Date: 2008-02-11 13:31:28 +0100 (Mon, 11 Feb 2008) $ -Version: $Revision: 665 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkImage3DImagePlaneCallback.h" - -#include -#include -#include -#include -#include "vtkViewImage2D.h" -#include - - - -void vtkImage3DImagePlaneCallback::Execute ( vtkObject *caller, - unsigned long, - void* ) -{ - /* - if( !this->ViewImage2D ) - { - return; - } - */ - - // get the box widget -// vtkPlaneWidget *widget = reinterpret_cast(caller); - vtkPlaneWidget *widget = vtkPlaneWidget::SafeDownCast(caller); - if( !widget ) - { - return; - } - - vtkImageData* imageData = vtkImageData::SafeDownCast( widget->GetInput() ); - - if( !imageData ) - { - this->Reslice->SetInput (NULL); - return; - } - - this->Reslice->SetInput ( imageData ); - - - // Calculate appropriate pixel spacing for the reslicing - imageData->UpdateInformation(); - double spacing[3]; - imageData->GetSpacing(spacing); - - - double imOrigin[3]; - imageData->GetOrigin(imOrigin); - int extent[6]; - imageData->GetWholeExtent(extent); - double bounds[] = {imOrigin[0] + spacing[0]*extent[0], //xmin - imOrigin[0] + spacing[0]*extent[1], //xmax - imOrigin[1] + spacing[1]*extent[2], //ymin - imOrigin[1] + spacing[1]*extent[3], //ymax - imOrigin[2] + spacing[2]*extent[4], //zmin - imOrigin[2] + spacing[2]*extent[5]};//zmax - - - int i = 0; - - for (i = 0; i <= 4; i += 2 ) // reverse bounds if necessary - { - if ( bounds[i] > bounds[i+1] ) - { - double t = bounds[i+1]; - bounds[i+1] = bounds[i]; - bounds[i] = t; - } - } - - double abs_normal[3]; - widget->GetNormal(abs_normal); - double planeCenter[3]; - widget->GetCenter(planeCenter); - double nmax = 0.0; - int k = 0; - for (i = 0; i < 3; i++ ) - { - abs_normal[i] = fabs(abs_normal[i]); - if ( abs_normal[i]>nmax ) - { - nmax = abs_normal[i]; - k = i; - } - } - - // Force the plane to lie within the true image bounds along its normal - // - - if ( planeCenter[k] > bounds[2*k+1] ) - { - planeCenter[k] = bounds[2*k+1]; - } - else if ( planeCenter[k] < bounds[2*k] ) - { - planeCenter[k] = bounds[2*k]; - } - - widget->SetCenter(planeCenter); - - - - // get the planes - double point1[3], point2[3], origin[4], normal[3]; - widget->GetPoint1 (point1); - widget->GetPoint2 (point2); - widget->GetOrigin (origin); - widget->GetNormal (normal); - - double axis1[3], axis2[3]; - for(i=0; i<3; i++) - { - axis1[i] = point1[i]-origin[i]; - axis2[i] = point2[i]-origin[i]; - } - - double planeSizeX = vtkMath::Normalize(axis1); - double planeSizeY = vtkMath::Normalize(axis2); - - this->ResliceAxes->Identity(); - for (i = 0; i < 3; i++ ) - { - this->ResliceAxes->SetElement(0,i,axis1[i]); - this->ResliceAxes->SetElement(1,i,axis2[i]); - this->ResliceAxes->SetElement(2,i,normal[i]); - } - - origin[3] = 1.0; - double originXYZW[4]; - this->ResliceAxes->MultiplyPoint(origin,originXYZW); - - this->ResliceAxes->Transpose(); - double neworiginXYZW[4]; - double point[] = {originXYZW[0],originXYZW[1],originXYZW[2],originXYZW[3]}; - this->ResliceAxes->MultiplyPoint(point,neworiginXYZW); - - this->ResliceAxes->SetElement(0,3,neworiginXYZW[0]); - this->ResliceAxes->SetElement(1,3,neworiginXYZW[1]); - this->ResliceAxes->SetElement(2,3,neworiginXYZW[2]); - - this->Reslice->SetResliceAxes (this->ResliceAxes); - this->Reslice->SetInterpolationModeToLinear(); - this->Reslice->SetOutputSpacing (1.0,1.0,1.0); - this->Reslice->SetOutputOrigin (0,0,0); - this->Reslice->SetOutputExtent (0, static_cast(planeSizeX)-1, - 0, static_cast(planeSizeY)-1, - 0, 0); - - this->Reslice->Update(); - - /* - if( this->FirstRender ) - { - this->ViewImage2D->SetImage ( this->Reslice->GetOutput() ); - this->ViewImage2D->ResetCurrentPoint(); - this->ViewImage2D->ResetWindowLevel(); - this->FirstRender = false; - } - - this->ViewImage2D->Update(); - this->ViewImage2D->Render(); - */ -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.h deleted file mode 100644 index 5fe95398..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImage3DImagePlaneCallback.h +++ /dev/null @@ -1,147 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtk_Image3DImagePlaneCallback_h_ -#define _vtk_Image3DImagePlaneCallback_h_ - -#include -#include -#include - - -class vtkViewImage2D; - - -class vtkImage3DImagePlaneCallback: public vtkCommand -{ - - public: - - static vtkImage3DImagePlaneCallback* New() - { return new vtkImage3DImagePlaneCallback; } - - virtual void Execute ( vtkObject *caller, unsigned long, void* ); - - /* - void SetViewImage2D (vtkViewImage2D* view) - { - this->ViewImage2D = view; - this->FirstRender = true; - }*/ - - vtkImageData* GetOutput (void) const - { - return this->Reslice->GetOutput(); - } - - - virtual void Reset (void) - { - this->Reslice->SetInput (NULL); - //this->FirstRender = true; - } - - vtkImageReslice* GetReslice() - { - return this->Reslice; - } - vtkMatrix4x4* GetMatrix() - { - return this->ResliceAxes; - } - - - - - protected: - vtkImage3DImagePlaneCallback() - { - /* - this->ViewImage2D = 0; - this->FirstRender = true; - */ - this->Reslice = vtkImageReslice::New(); - this->ResliceAxes = vtkMatrix4x4::New(); - } - ~vtkImage3DImagePlaneCallback() - { - this->Reslice->Delete(); - this->ResliceAxes->Delete(); - } - - private: - /* - vtkViewImage2D* ViewImage2D; - bool FirstRender;*/ - - vtkImageReslice* Reslice; - vtkMatrix4x4* ResliceAxes; - -}; - - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.cxx deleted file mode 100644 index 8152ba51..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.cxx +++ /dev/null @@ -1,340 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: vtkImageBlendWithMask.cxx 477 2007-11-20 17:46:10Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2007-11-20 12:46:10 -0500 (Tue, 20 Nov 2007) $ -Version: $Revision: 477 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - - - -#include "vtkImageBlendWithMask.h" - -#include "vtkImageData.h" -#include "vtkInformation.h" -#include "vtkInformationVector.h" -#include "vtkObjectFactory.h" -#include "vtkStreamingDemandDrivenPipeline.h" - -vtkCxxRevisionMacro (vtkImageBlendWithMask, "$Revision: 477 $"); -vtkStandardNewMacro (vtkImageBlendWithMask); - -vtkImageBlendWithMask::vtkImageBlendWithMask() -{ - LookupTable=0; - this->SetNumberOfInputPorts (2); -} - -vtkImageBlendWithMask::~vtkImageBlendWithMask() -{ - if( LookupTable ) - LookupTable->Delete(); -} - -//---------------------------------------------------------------------------- -void vtkImageBlendWithMask::SetImageInput(vtkImageData *in) -{ - this->SetInput1(in); -} - -//---------------------------------------------------------------------------- -void vtkImageBlendWithMask::SetMaskInput(vtkImageData *in) -{ - this->SetInput2(in); -} - -//---------------------------------------------------------------------------- -// The output extent is the intersection. -int vtkImageBlendWithMask::RequestInformation ( - vtkInformation * vtkNotUsed(request), - vtkInformationVector **inputVector, - vtkInformationVector *outputVector) -{ - // get the info objects - vtkInformation* outInfo = outputVector->GetInformationObject(0); - vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); - vtkInformation *inInfo2 = inputVector[1]->GetInformationObject(0); - - int ext[6], ext2[6], idx; - - inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(),ext); - inInfo2->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(),ext2); - for (idx = 0; idx < 3; ++idx) - { - if (ext2[idx*2] > ext[idx*2]) - { - ext[idx*2] = ext2[idx*2]; - } - if (ext2[idx*2+1] < ext[idx*2+1]) - { - ext[idx*2+1] = ext2[idx*2+1]; - } - } - - outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(),ext,6); - - return 1; -} - - -void vtkImageBlendWithMask::PrintSelf(ostream& os, vtkIndent indent) -{ - this->Superclass::PrintSelf(os,indent); - if( LookupTable ) - { - os << indent << "LookupTable: \n"; - os << indent << *LookupTable << endl; - } -} - - - - -//---------------------------------------------------------------------------- -// This templated function executes the filter for any type of data. -template -void vtkImageBlendWithMaskExecute(vtkImageBlendWithMask *self, int ext[6], - vtkImageData *in1Data, T *in1Ptr, - vtkImageData *in2Data, T *in2Ptr, - vtkImageData *outData, T *outPtr, int id) -{ - int num0, num1, num2, numC, numM, pixSize; - int idx0, idx1, idx2, idxC; - vtkIdType in1Inc0, in1Inc1, in1Inc2; - vtkIdType in2Inc0, in2Inc1, in2Inc2; - vtkIdType outInc0, outInc1, outInc2; - double maskAlpha, oneMinusMaskAlpha; - unsigned long count = 0; - unsigned long target; - - numC = outData->GetNumberOfScalarComponents(); - pixSize = numC * sizeof(T); - maskAlpha = 0.5; - oneMinusMaskAlpha = 0.5; - - numM = in2Data->GetNumberOfScalarComponents(); - - // Get information to march through data - in1Data->GetContinuousIncrements(ext, in1Inc0, in1Inc1, in1Inc2); - in2Data->GetContinuousIncrements(ext, in2Inc0, in2Inc1, in2Inc2); - outData->GetContinuousIncrements(ext, outInc0, outInc1, outInc2); - num0 = ext[1] - ext[0] + 1; - num1 = ext[3] - ext[2] + 1; - num2 = ext[5] - ext[4] + 1; - - - target = (unsigned long)(num2*num1/50.0); - target++; - - // Loop through ouput pixels - for (idx2 = 0; idx2 < num2; ++idx2) - { - for (idx1 = 0; !self->AbortExecute && idx1 < num1; ++idx1) - { - if (!id) - { - if (!(count%target)) - self->UpdateProgress(count/(50.0*target)); - count++; - } - - for (idx0 = 0; idx0 < num0; ++idx0) - { - - if( int(*in2Ptr)==0 ) - { - memcpy (outPtr, in1Ptr, pixSize); - in1Ptr += numC; - outPtr += numC; - } - else - { - double color[4]; - self->GetLookupTable()->GetTableValue ((int)(*in2Ptr), color); - maskAlpha = color[3]; - oneMinusMaskAlpha = 1.0-maskAlpha; - - for(idxC = 0; idxCGetScalarPointerForExtent(outExt); - inPtr2 = inData[1][0]->GetScalarPointerForExtent(outExt); - outPtr = outData[0]->GetScalarPointerForExtent(outExt); - - tExt = inData[1][0]->GetExtent(); - if (tExt[0] > outExt[0] || tExt[1] < outExt[1] || - tExt[2] > outExt[2] || tExt[3] < outExt[3] || - tExt[4] > outExt[4] || tExt[5] < outExt[5]) - { - vtkErrorMacro("Mask extent not large enough"); - return; - } - /* - if (inData[1][0]->GetNumberOfScalarComponents() != 1) - { - vtkErrorMacro("Mask can have one component"); - }*/ - - if (inData[0][0]->GetScalarType() != outData[0]->GetScalarType() || - inData[0][0]->GetScalarType() != VTK_UNSIGNED_CHAR || - (inData[0][0]->GetNumberOfScalarComponents() != 3 && inData[0][0]->GetNumberOfScalarComponents() != 4) - /*inData[1][0]->GetScalarType() != VTK_UNSIGNED_CHAR*/) - { - vtkErrorMacro(<< "Execute: image ScalarType (" - << inData[0][0]->GetScalarType() << ") must match out ScalarType (" - << outData[0]->GetScalarType() << "), and mask scalar type (" - << inData[1][0]->GetScalarType() << ") must be unsigned char." - << "Number of input components: " << inData[0][0]->GetNumberOfScalarComponents()); - return; - } - - switch (inData[0][0]->GetScalarType()) - { - vtkTemplateMacro( - vtkImageBlendWithMaskExecute(this, outExt, - inData[0][0],(VTK_TT *)(inPtr1), - //inData[1][0],(unsigned char *)(inPtr2), - inData[1][0],(VTK_TT *)(inPtr2), - outData[0], (VTK_TT *)(outPtr),id)); - default: - vtkErrorMacro(<< "Execute: Unknown ScalarType"); - return; - } -} - - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.h deleted file mode 100644 index 839c6e7e..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkImageBlendWithMask.h +++ /dev/null @@ -1,130 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __vtkImageBlendWithMask_h -#define __vtkImageBlendWithMask_h - -#include "vtkThreadedImageAlgorithm.h" -#include "vtkLookupTable.h" - -class vtkImageBlendWithMask : - public vtkThreadedImageAlgorithm -{ - public: - static vtkImageBlendWithMask *New(); - vtkTypeRevisionMacro (vtkImageBlendWithMask, vtkThreadedImageAlgorithm); - void PrintSelf (ostream &os, vtkIndent indent); - - - // Set/Get the LUT to map the mask - vtkSetObjectMacro (LookupTable, vtkLookupTable); - vtkGetObjectMacro (LookupTable, vtkLookupTable); - - - - - // Description: - // Set the input to be masked. - void SetImageInput(vtkImageData *in); - - // Description: - // Set the mask to be used. - void SetMaskInput(vtkImageData *in); - - // Description: - // Set the two inputs to this filter - virtual void SetInput1(vtkDataObject *in) { this->SetInput(0,in); } - virtual void SetInput2(vtkDataObject *in) { this->SetInput(1,in); } - - protected: - vtkImageBlendWithMask(); - ~vtkImageBlendWithMask(); - - vtkLookupTable* LookupTable; - - virtual int RequestInformation (vtkInformation *, - vtkInformationVector **, - vtkInformationVector *); - - - virtual void ThreadedRequestData(vtkInformation *request, - vtkInformationVector **inputVector, - vtkInformationVector *outputVector, - vtkImageData ***inData, - vtkImageData **outData, - int extent[6], int threadId); - - - private: - vtkImageBlendWithMask (const vtkImageBlendWithMask&); - void operator=(const vtkImageBlendWithMask&); - -}; - - - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.cxx deleted file mode 100644 index 8a00677b..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.cxx +++ /dev/null @@ -1,328 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkInteractorStyleImage2D.h" - -#include "vtkAbstractPropPicker.h" -#include "vtkAssemblyPath.h" -#include "vtkMath.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindowInteractor.h" -#include -#include -#include -#include -#include "vtkViewImage2DCommand.h" - - -vtkCxxRevisionMacro (vtkInteractorStyleImage2D, "$Revision: 752 $"); -vtkStandardNewMacro (vtkInteractorStyleImage2D); - - -//---------------------------------------------------------------------------- -vtkInteractorStyleImage2D::vtkInteractorStyleImage2D() -{ - this->SliceStep = 0; - this->RequestedPosition = new int[2]; - this->RequestedPosition[0] = this->RequestedPosition[1] = 0; -} - -//---------------------------------------------------------------------------- -vtkInteractorStyleImage2D::~vtkInteractorStyleImage2D() -{ - delete this->RequestedPosition; -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnMouseMove() -{ - int x = this->Interactor->GetEventPosition()[0]; - int y = this->Interactor->GetEventPosition()[1]; - - switch (this->State) - { - case VTKIS_SLICE_MOVE: - this->FindPokedRenderer(x, y); - this->SliceMove(); - this->InvokeEvent(vtkCommand::InteractionEvent, NULL); - this->Superclass::OnMouseMove(); - break; - case VTKIS_DOLLY: - this->InvokeEvent(vtkViewImage2DCommand::ZoomEvent); - break; - case VTKIS_PAN: - this->InvokeEvent(vtkViewImage2DCommand::PanEvent); - break; - default: - this->Superclass::OnMouseMove(); - break; - } - -// this->RequestedPosition = this->Interactor->GetEventPosition(); - this->InvokeEvent (vtkCommand::InteractionEvent); - -// -/// NOTE:12 MAR 2009 -/// This is a really dirty solution: it breaks the "natural" behavior of the vtkViewImage2D -/// alone (not in a Collection: synchronized view); -// this->Superclass::OnMouseMove(); -} - - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnLeftButtonDown() -{ - int x = this->Interactor->GetEventPosition()[0]; - int y = this->Interactor->GetEventPosition()[1]; - - this->FindPokedRenderer(x, y); - if ( !this->CurrentRenderer ) - return; - - if (this->Interactor->GetRepeatCount()) - { - this->RequestedPosition[0] = x; - this->RequestedPosition[1] = y; - this->InvokeEvent (vtkViewImage2DCommand::RequestedPositionEvent); - } - - this->Superclass::OnLeftButtonDown(); -} - - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnLeftButtonUp() -{ - this->Superclass::OnLeftButtonUp(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnMiddleButtonDown() -{ - int x = this->Interactor->GetEventPosition()[0]; - int y = this->Interactor->GetEventPosition()[1]; - - this->FindPokedRenderer(x, y); - if ( !this->CurrentRenderer ) - return; - - this->Superclass::OnMiddleButtonDown(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnMiddleButtonUp() -{ - this->Superclass::OnMiddleButtonUp(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnRightButtonDown() -{ - this->Superclass::OnRightButtonDown(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnRightButtonUp() -{ - this->Superclass::OnRightButtonUp(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnChar() -{ - vtkRenderWindowInteractor *rwi = this->Interactor; - - switch( rwi->GetKeyCode() ) - { - case 'o': - { - this->InvokeEvent (vtkViewImage2DCommand::ResetViewerEvent, this); - break; - } - } - this->Superclass::OnChar(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnKeyUp() -{ - vtkRenderWindowInteractor *rwi = this->Interactor; - - if (!strcmp (rwi->GetKeySym(),"Up")) - { - this->SliceStep = 1; - this->StartSliceMove(); - this->SliceMove(); - this->EndSliceMove(); - } - else if(!strcmp (rwi->GetKeySym(),"Down")) - { - this->SliceStep = -1; - this->StartSliceMove(); - this->SliceMove(); - this->EndSliceMove(); - } - else if (!strcmp (rwi->GetKeySym(),"o")) - { - this->InvokeEvent (vtkViewImage2DCommand::ResetViewerEvent, this); - } - - - this->Superclass::OnKeyUp(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnKeyPress() -{ - this->Superclass::OnKeyPress(); -} - -//---------------------------------------------------------------------------- -void vtkInteractorStyleImage2D::OnKeyRelease() -{ - this->Superclass::OnKeyRelease(); -} - -//---------------------------------------------------------------------------- -void -vtkInteractorStyleImage2D::StartSliceMove() -{ - if ((this->State != VTKIS_NONE) && (this->State != VTKIS_PICK)) - { - return; - } - this->StartState(VTKIS_SLICE_MOVE); - this->InvokeEvent(vtkViewImage2DCommand::StartSliceMoveEvent, this); -} - -//---------------------------------------------------------------------------- -void -vtkInteractorStyleImage2D::EndSliceMove() -{ - if (this->State != VTKIS_SLICE_MOVE) - { - return; - } - this->InvokeEvent(vtkViewImage2DCommand::EndSliceMoveEvent, this); - this->StopState(); -} - -//---------------------------------------------------------------------------- -void -vtkInteractorStyleImage2D::SliceMove() -{ - if (this->State != VTKIS_SLICE_MOVE) - { - return; - } - this->InvokeEvent(vtkViewImage2DCommand::SliceMoveEvent, this); -} - -void -vtkInteractorStyleImage2D::OnMouseWheelForward() -{ - this->StartSliceMove(); - this->SliceStep = static_cast< int >( this->MouseWheelMotionFactor ); - this->SliceMove(); - this->EndSliceMove(); -} -void -vtkInteractorStyleImage2D::OnMouseWheelBackward() -{ - this->StartSliceMove(); - this->SliceStep = static_cast< int >( -this->MouseWheelMotionFactor ); - this->SliceMove(); - this->EndSliceMove(); -} - -// void vtkInteractorStyleImage2D::PropagateCameraFocalAndPosition() -// { -// if( !this->GetView() ) -// { -// return; -// } - -// //double pos[3], focal[3]; - -// if( !this->GetView()->GetRenderer() ) -// { -// return; -// } - -// vtkCamera* camera = this->GetView()->GetRenderer()->GetActiveCamera(); -// double* focal = camera->GetFocalPoint (); -// double* pos = camera->GetPosition (); - -// bool LinkCamera = this->GetView()->GetLinkCameraFocalAndPosition(); -// this->GetView()->SetLinkCameraFocalAndPosition (false); -// this->GetView()->SyncSetCameraFocalAndPosition (focal, pos); -// this->GetView()->SetLinkCameraFocalAndPosition ( LinkCamera ); - -// //this->GetView()->Render(); - - -// } diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.h deleted file mode 100644 index 261385c1..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkInteractorStyleImage2D.h +++ /dev/null @@ -1,119 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtk_InteractorStyleImage2D_h_ -#define _vtk_InteractorStyleImage2D_h_ - -#include - -#define VTKIS_SLICE_MOVE 5051 - -class vtkInteractorStyleImage2D : - public vtkInteractorStyleImage -{ - public: - static vtkInteractorStyleImage2D *New(); - vtkTypeRevisionMacro (vtkInteractorStyleImage2D, vtkInteractorStyleImage); - - virtual void OnMouseMove(); - virtual void OnLeftButtonDown(); - virtual void OnLeftButtonUp(); - virtual void OnMiddleButtonDown(); - virtual void OnMiddleButtonUp(); - virtual void OnRightButtonDown(); - virtual void OnRightButtonUp(); - virtual void OnMouseWheelForward(); - virtual void OnMouseWheelBackward(); - virtual void OnChar(); - virtual void OnKeyUp(); - virtual void OnKeyPress(); - virtual void OnKeyRelease(); - - virtual void StartSliceMove(); - virtual void SliceMove(); - virtual void EndSliceMove(); - - - vtkGetMacro( SliceStep, int ); - int* GetRequestedPosition(void) - { return this->RequestedPosition; } - - protected: - vtkInteractorStyleImage2D(); - ~vtkInteractorStyleImage2D(); - - int SliceStep; - int* RequestedPosition; - - private: - - vtkInteractorStyleImage2D(const vtkInteractorStyleImage2D&); // Not implemented. - void operator=(const vtkInteractorStyleImage2D&); // Not implemented. - -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.cxx deleted file mode 100644 index f690fe9d..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.cxx +++ /dev/null @@ -1,420 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: vtkLookupTableManager.cxx 842 2008-05-20 16:57:09Z ntoussaint $ -Language: C++ -Author: $Author: ntoussaint $ -Date: $Date: 2008-05-20 12:57:09 -0400 (Tue, 20 May 2008) $ -Version: $Revision: 842 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkLookupTableManager.h" -#include - -vtkCxxRevisionMacro(vtkLookupTableManager, "$Revision: 842 $"); -vtkStandardNewMacro(vtkLookupTableManager); - -#include "lut/Spectrum.h" -#include "lut/HotMetal.h" -#include "lut/GEColor.h" -#include "lut/Flow.h" -#include "lut/LONI.h" -#include "lut/LONI2.h" -#include "lut/Asymmetry.h" - -#include - -vtkLookupTableManager::vtkLookupTableManager() -{} - - -vtkLookupTableManager::~vtkLookupTableManager() -{} - - -std::vector vtkLookupTableManager::GetAvailableLookupTables() -{ - std::string lutNames[]={"B/W", "B/W Inverse", "Spectrum", "HotMetal", "GEColor", "Flow", "LONI", "LONI2", "Asymmetry", "P-Value", "ROI"}; - - std::vector v_lutNames; - for( int i=0; i<10; i++) - { - v_lutNames.push_back(lutNames[i]); - } - - return v_lutNames; -} - - -vtkLookupTable* vtkLookupTableManager::GetLookupTable(const int& n) -{ - vtkLookupTable* lut = 0; - switch(n) - { - case LUT_BW: - lut = vtkLookupTableManager::GetBWLookupTable(); - break; - - case LUT_BWINV: - lut = vtkLookupTableManager::GetBWInverseLookupTable(); - break; - - case LUT_SPECTTUM: - lut = vtkLookupTableManager::GetSpectrumLookupTable(); - break; - - case LUT_HOTMETAL: - lut = vtkLookupTableManager::GetHotMetalLookupTable(); - break; - - case LUT_GECOLORS: - lut = vtkLookupTableManager::GetGEColorLookupTable(); - break; - - case LUT_FLOW: - lut = vtkLookupTableManager::GetFlowLookupTable(); - break; - - case LUT_LONI: - lut = vtkLookupTableManager::GetLONILookupTable(); - break; - - case LUT_LONI2: - lut = vtkLookupTableManager::GetLONI2LookupTable(); - break; - - case LUT_ASYMETRY: - lut = vtkLookupTableManager::GetAsymmetryLookupTable(); - break; - - case LUT_PVALUE: - lut = vtkLookupTableManager::GetPValueLookupTable(); - break; - - case LUT_ROI: - lut = vtkLookupTableManager::GetROILookupTable(); - break; - - default: - break; - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetBWLookupTable() -{ - vtkLookupTable* bwLut = vtkLookupTable::New(); - bwLut->SetTableRange (0, 1); - bwLut->SetSaturationRange (0, 0); - bwLut->SetHueRange (0, 0); - bwLut->SetValueRange (0, 1); - bwLut->Build(); - - return bwLut; -} - - -vtkLookupTable* vtkLookupTableManager::GetBWInverseLookupTable() -{ - vtkLookupTable* bwLut = vtkLookupTable::New(); - bwLut->SetTableRange (0, 1); - bwLut->SetSaturationRange (0, 0); - bwLut->SetHueRange (0, 0); - bwLut->SetValueRange (1, 0); - bwLut->Build(); - - return bwLut; -} - - - -vtkLookupTable* vtkLookupTableManager::GetSpectrumLookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues(256); - lut->Build(); - - for( int i=0; i<256; i++) - { - lut->SetTableValue(i, (double)Spectrum[i]/255.0, (double)Spectrum[256+i]/255.0, (double)Spectrum[256*2+i]/255.0, 1.0); - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetHotMetalLookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues(256); - lut->Build(); - - for( int i=0; i<256; i++) - { - lut->SetTableValue(i, (double)HotMetal[i]/255.0, (double)HotMetal[256+i]/255.0, (double)HotMetal[256*2+i]/255.0, 1.0); - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetGEColorLookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues(256); - lut->Build(); - - for( int i=0; i<256; i++) - { - lut->SetTableValue(i, (double)GEColor[i]/255.0, (double)GEColor[256+i]/255.0, (double)GEColor[256*2+i]/255.0, 1.0); - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetFlowLookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues(256); - lut->Build(); - - for( int i=0; i<256; i++) - { - lut->SetTableValue(i, (double)Flow[i]/255.0, (double)Flow[256+i]/255.0, (double)Flow[256*2+i]/255.0, 1.0); - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetLONILookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues(203); - lut->Build(); - - for( int i=0; i<203; i++) - { - lut->SetTableValue(i, (double)LONI[i][0], (double)LONI[i][1], (double)LONI[i][2], 1.0); - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetLONI2LookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues(120); - lut->Build(); - - for( int i=0; i<120; i++) - { - lut->SetTableValue(i, (double)LONI2[i][0], (double)LONI2[i][1], (double)LONI2[i][2], 1.0); - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetAsymmetryLookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues(256); - lut->Build(); - - for( int i=0; i<256; i++) - { - lut->SetTableValue(i, (double)AsymmetryLUT[i][0], (double)AsymmetryLUT[i][1], (double)AsymmetryLUT[i][2], 1.0); - } - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetPValueLookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetTableRange (0, 1); - lut->SetSaturationRange (1.0, 1.5); - lut->SetHueRange (0.666, 0.8333); - //lut->SetHueRange (0.666, 0.0); - lut->SetValueRange (0.5, 1.0); - lut->Build(); - - return lut; -} - - -vtkLookupTable* vtkLookupTableManager::GetROILookupTable() -{ - vtkLookupTable* lut = vtkLookupTable::New(); - lut->SetNumberOfTableValues (256); - lut->SetTableValue (0, 0.0, 0.0, 0.0, 0.0); // erase color - - lut->SetTableValue (1, 1.0, 0.0, 0.0, 0.5); - lut->SetTableValue (2, 0.0, 1.0, 0.0, 0.5); - lut->SetTableValue (3, 0.0, 0.0, 1.0, 0.5); - lut->SetTableValue (4, 1.0, 1.0, 0.0, 0.5); - lut->SetTableValue (5, 0.0, 1.0, 1.0, 0.5); - lut->SetTableValue (6, 1.0, 0.0, 1.0, 0.5); - - lut->SetTableValue (7, 1.0, 0.5, 0.0, 0.5); - lut->SetTableValue (8, 0.0, 1.0, 0.5, 0.5); - lut->SetTableValue (9, 0.5, 0.0, 1.0, 0.5); - lut->SetTableValue (10, 1.0, 1.0, 0.5, 0.5); - lut->SetTableValue (11, 0.5, 1.0, 1.0, 0.5); - lut->SetTableValue (12, 1.0, 0.5, 1.0, 0.5); - - - - // Fill the rest of the labels with color ramps, code taken from SNAP -// for (int i = 13; i < 256; i++) -// { -// if (i < 85) -// { -// lut->SetTableValue (i, ((84.0-i)/85.0 * 200.0 + 50.0)/255.0, (i/85.0 * 200.0 + 50.0)/255.0, 0, 0.5); -// } -// else if (i < 170) -// { -// lut->SetTableValue (i, 0, ((169.0-i)/85.0 * 200.0 + 50)/255.0, ((i-85)/85.0 * 200.0 + 50)/255.0, 0.5); -// } -// else -// { -// lut->SetTableValue (i, ((i-170)/85.0 * 200.0 + 50)/255.0, 0.0, ((255.0-i)/85.0 * 200.0 + 50)/255.0, 0.5); -// } -// } - - - // Fill the rest with random colors - -// for (int i = 13; i < 256; i++) -// { -// srand (clock()); - -// // put a random color -// int i1 = 1 + (int) (100.0 * ((double)rand() / (RAND_MAX + 1.0))); -// int i2 = 1 + (int) (100.0 * ((double)rand() / (RAND_MAX + 1.0))); -// int i3 = 1 + (int) (100.0 * ((double)rand() / (RAND_MAX + 1.0))); -// double rand_1 = (double)(i1)/(100.0); -// double rand_2 = (double)(i2)/(100.0); -// double rand_3 = (double)(i3)/(100.0); -// double r = rand_1, g = rand_2, b = rand_3; -// if (i1 < 33) -// r = 1; -// else if (i1 < 66) -// g = 1; -// else if (i1 < 100) -// b = 1; - -// lut->SetTableValue (i, r, g, b, 0.5); -// } - - for (int i = 12; i < 256; i++) - { - if (i%12 == 0) - lut->SetTableValue (i, 1.0, 0.0, 0.0, 0.5); - else if (i%12 == 1) - lut->SetTableValue (i, 0.0, 1.0, 0.0, 0.5); - else if (i%12 == 2) - lut->SetTableValue (i, 0.0, 0.0, 1.0, 0.5); - else if (i%12 == 3) - lut->SetTableValue (i, 1.0, 1.0, 0.0, 0.5); - else if (i%12 == 4) - lut->SetTableValue (i, 0.0, 1.0, 1.0, 0.5); - else if (i%12 == 5) - lut->SetTableValue (i, 1.0, 0.0, 1.0, 0.5); - else if (i%12 == 6) - lut->SetTableValue (i, 1.0, 0.5, 0.0, 0.5); - else if (i%12 == 7) - lut->SetTableValue (i, 0.0, 1.0, 0.5, 0.5); - else if (i%12 == 8) - lut->SetTableValue (i, 0.5, 0.0, 1.0, 0.5); - else if (i%12 == 9) - lut->SetTableValue (i, 1.0, 1.0, 0.5, 0.5); - else if (i%12 == 10) - lut->SetTableValue (i, 0.5, 1.0, 1.0, 0.5); - else if (i%12 == 11) - lut->SetTableValue (i, 1.0, 0.5, 1.0, 0.5); - } - - return lut; - -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.h deleted file mode 100644 index b245032a..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkLookupTableManager.h +++ /dev/null @@ -1,158 +0,0 @@ -/*========================================================================= - -Program: vtkINRIA3D -Module: $Id: vtkLookupTableManager.h 700 2008-02-22 16:19:25Z filus $ -Language: C++ -Author: $Author: filus $ -Date: $Date: 2008-02-22 11:19:25 -0500 (Fri, 22 Feb 2008) $ -Version: $Revision: 700 $ - -Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved. - -This software is distributed WITHOUT ANY WARRANTY; without even -the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - - -#ifndef _vtk_LookupTableManager_h_ -#define _vtk_LookupTableManager_h_ - -#include - -#include -#include - -class vtkLookupTableManager: public vtkObject -{ - - public: - - //BTX - enum LookupTableIds - { - LUT_BW = 0, - LUT_BWINV, - LUT_SPECTTUM, - LUT_HOTMETAL, - LUT_GECOLORS, - LUT_FLOW, - LUT_LONI, - LUT_LONI2, - LUT_ASYMETRY, - LUT_PVALUE, - LUT_ROI - }; - //ETX - - static vtkLookupTableManager* New(); - vtkTypeRevisionMacro (vtkLookupTableManager, vtkObject); - - static vtkLookupTable* GetBWLookupTable (void); - - static vtkLookupTable* GetBWInverseLookupTable (void); - - static vtkLookupTable* GetSpectrumLookupTable (void); - - static vtkLookupTable* GetHotMetalLookupTable (void); - - static vtkLookupTable* GetGEColorLookupTable (void); - - static vtkLookupTable* GetFlowLookupTable (void); - - static vtkLookupTable* GetLONILookupTable (void); - - static vtkLookupTable* GetLONI2LookupTable (void); - - static vtkLookupTable* GetAsymmetryLookupTable (void); - - static vtkLookupTable* GetPValueLookupTable (void); - - static std::vector GetAvailableLookupTables(void); - - static vtkLookupTable* GetROILookupTable (void); - - static vtkLookupTable* GetLookupTable(const int&); - - protected: - vtkLookupTableManager(); - ~vtkLookupTableManager(); - - - - private: - - -}; - - - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.cxx deleted file mode 100755 index 27c6fd23..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.cxx +++ /dev/null @@ -1,115 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkOrientationAnnotation.h" -#include "vtkObjectFactory.h" -#include "vtkTextProperty.h" -#include "vtkTextMapper.h" - -//---------------------------------------------------------------------------- -vtkStandardNewMacro(vtkOrientationAnnotation); -vtkCxxRevisionMacro(vtkOrientationAnnotation, "$Revision: 1043 $"); - -//---------------------------------------------------------------------------- -vtkOrientationAnnotation::vtkOrientationAnnotation() -{ -} - -//---------------------------------------------------------------------------- -vtkOrientationAnnotation::~vtkOrientationAnnotation() -{ -} - - -//---------------------------------------------------------------------------- -void vtkOrientationAnnotation::SetTextActorsPosition(int vsize[2]) -{ - this->TextActor[2]->SetPosition(5, vsize[1]/2); - this->TextActor[3]->SetPosition(vsize[0]/2, 5); - this->TextActor[0]->SetPosition(vsize[0]-5, vsize[1]/2); - this->TextActor[1]->SetPosition(vsize[0]/2, vsize[1]-5); -} - -//---------------------------------------------------------------------------- -void vtkOrientationAnnotation::SetTextActorsJustification() -{ - vtkTextProperty *tprop = this->TextMapper[2]->GetTextProperty(); - tprop->SetJustificationToLeft(); - tprop->SetVerticalJustificationToCentered(); - - tprop = this->TextMapper[3]->GetTextProperty(); - tprop->SetJustificationToCentered(); - tprop->SetVerticalJustificationToBottom(); - - tprop = this->TextMapper[0]->GetTextProperty(); - tprop->SetJustificationToRight(); - tprop->SetVerticalJustificationToCentered(); - - tprop = this->TextMapper[1]->GetTextProperty(); - tprop->SetJustificationToCentered(); - tprop->SetVerticalJustificationToTop(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.h deleted file mode 100755 index 9080bf84..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientationAnnotation.h +++ /dev/null @@ -1,110 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -// .NAME vtkOrientationAnnotation - text annotation in four corners -// .SECTION Description -// This is an annotation object that manages four text actors / mappers -// to provide annotation in the four corners of a viewport -// -// .SECTION See Also -// vtkActor2D vtkTextMapper - -#ifndef __vtkOrientationAnnotation_h -#define __vtkOrientationAnnotation_h - -#include "vtkCornerAnnotation.h" - -class vtkOrientationAnnotation : - public vtkCornerAnnotation -{ -public: - vtkTypeRevisionMacro(vtkOrientationAnnotation,vtkCornerAnnotation); - - // Description: - // Instantiate object with a rectangle in normaled view coordinates - // of (0.2,0.85, 0.8, 0.95). - static vtkOrientationAnnotation *New(); - -protected: - vtkOrientationAnnotation(); - ~vtkOrientationAnnotation(); - - // Description: - // Set text actor positions given a viewport size and justification - virtual void SetTextActorsPosition(int vsize[2]); - virtual void SetTextActorsJustification(); - -private: - vtkOrientationAnnotation(const vtkOrientationAnnotation&); // Not implemented. - void operator=(const vtkOrientationAnnotation&); // Not implemented. -}; - - -#endif - - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.cxx deleted file mode 100644 index 6b5f55d5..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.cxx +++ /dev/null @@ -1,243 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkOrientedBoxWidget.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkObjectFactory.h" -#include "vtkMatrix4x4.h" -#include "vtkPoints.h" -#include "vtkActor.h" -#include "vtkAssemblyNode.h" -#include "vtkAssemblyPath.h" -#include "vtkCallbackCommand.h" -#include "vtkCamera.h" -#include "vtkCellArray.h" -#include "vtkCellPicker.h" -#include "vtkDoubleArray.h" -#include "vtkFloatArray.h" -#include "vtkMath.h" -#include "vtkObjectFactory.h" -#include "vtkPlanes.h" -#include "vtkPolyData.h" -#include "vtkPolyDataMapper.h" -#include "vtkProperty.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkSphereSource.h" -#include "vtkTransform.h" - -vtkCxxRevisionMacro(vtkOrientedBoxWidget, "$Revision: 2 $"); -vtkStandardNewMacro(vtkOrientedBoxWidget); - - -//---------------------------------------------------------------------------- -vtkOrientedBoxWidget::vtkOrientedBoxWidget() -{ - this->OrientationMatrix = vtkMatrix4x4::New(); - this->OrientationMatrix->Identity(); - - this->InvertedOrientationMatrix = vtkMatrix4x4::New(); - this->InvertedOrientationMatrix->Identity(); -} - -//---------------------------------------------------------------------------- -vtkOrientedBoxWidget::~vtkOrientedBoxWidget() -{ - this->OrientationMatrix->Delete(); - this->InvertedOrientationMatrix->Delete(); -} - - -//---------------------------------------------------------------------------- -void vtkOrientedBoxWidget::SetOrientationMatrix(vtkMatrix4x4* matrix) -{ - if (matrix == this->OrientationMatrix) - return; - - if (this->OrientationMatrix) - { - this->OrientationMatrix->UnRegister (this); - this->OrientationMatrix = NULL; - } - - this->OrientationMatrix = matrix; - - if (this->OrientationMatrix) - { - - // move all the actors according to the user-matrix - this->HexActor->SetUserMatrix (matrix); - this->HexFace->SetUserMatrix (matrix); - this->HexOutline->SetUserMatrix (matrix); - - for (unsigned int i=0; i<7; i++) - this->Handle[i]->SetUserMatrix (matrix); - - // initialize inverse matrix - vtkMatrix4x4::Invert (this->OrientationMatrix, this->InvertedOrientationMatrix); - } - -} - - - -//---------------------------------------------------------------------------- -void vtkOrientedBoxWidget::OnMouseMove() -{ - // See whether we're active - if ( this->State == vtkBoxWidget::Outside || - this->State == vtkBoxWidget::Start ) - { - return; - } - - int X = this->Interactor->GetEventPosition()[0]; - int Y = this->Interactor->GetEventPosition()[1]; - - // Do different things depending on state - // Calculations everybody does - double focalPoint[4], pickPoint[4], prevPickPoint[4]; - double z, vpn[3]; - - vtkCamera *camera = this->CurrentRenderer->GetActiveCamera(); - if ( !camera ) - { - return; - } - - // Compute the two points defining the motion vector - this->ComputeWorldToDisplay(this->LastPickPosition[0], - this->LastPickPosition[1], - this->LastPickPosition[2], focalPoint); - z = focalPoint[2]; - this->ComputeDisplayToWorld( - static_cast(this->Interactor->GetLastEventPosition()[0]), - static_cast(this->Interactor->GetLastEventPosition()[1]), - z, prevPickPoint); - this->ComputeDisplayToWorld( static_cast(X), static_cast(Y), - z, pickPoint); - - // multiply pick points by the inverted orientation matrix - // to recover the true movement to apply - this->InvertedOrientationMatrix->MultiplyPoint (prevPickPoint, prevPickPoint); - this->InvertedOrientationMatrix->MultiplyPoint (pickPoint, pickPoint); - - // Process the motion - if ( this->State == vtkBoxWidget::Moving ) - { - // Okay to process - if ( this->CurrentHandle ) - { - if ( this->RotationEnabled && this->CurrentHandle == this->HexFace ) - { - camera->GetViewPlaneNormal(vpn); - this->Rotate(X, Y, prevPickPoint, pickPoint, vpn); - } - else if ( this->TranslationEnabled && - this->CurrentHandle == this->Handle[6] ) - { - this->Translate(prevPickPoint, pickPoint); - } - else if ( this->TranslationEnabled && this->ScalingEnabled ) - { - if ( this->CurrentHandle == this->Handle[0] ) - { - this->MoveMinusXFace(prevPickPoint, pickPoint); - } - else if ( this->CurrentHandle == this->Handle[1] ) - { - this->MovePlusXFace(prevPickPoint, pickPoint); - } - else if ( this->CurrentHandle == this->Handle[2] ) - { - this->MoveMinusYFace(prevPickPoint, pickPoint); - } - else if ( this->CurrentHandle == this->Handle[3] ) - { - this->MovePlusYFace(prevPickPoint, pickPoint); - } - else if ( this->CurrentHandle == this->Handle[4] ) - { - this->MoveMinusZFace(prevPickPoint, pickPoint); - } - else if ( this->CurrentHandle == this->Handle[5] ) - { - this->MovePlusZFace(prevPickPoint, pickPoint); - } - } - } - } - else if ( this->ScalingEnabled && this->State == vtkBoxWidget::Scaling ) - { - this->Scale(prevPickPoint, pickPoint, X, Y); - } - - // Interact, if desired - this->EventCallbackCommand->SetAbortFlag(1); - this->InvokeEvent(vtkCommand::InteractionEvent, NULL); - this->Interactor->Render(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.h deleted file mode 100644 index 5ad032c6..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkOrientedBoxWidget.h +++ /dev/null @@ -1,113 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkOrientedBoxWidget_h_ -#define _vtkOrientedBoxWidget_h_ - -#include "vtkBoxWidget.h" - -class vtkMatrix4x4; - -/** - \author Nicolas Toussaint - \class vtkOrientedBoxWidget - \brief orthogonal hexahedron 3D widget with pre-defined orientation - - Description - - This 3D widget defines a region of interest. By default it behaves exactly as - the vtkBoxWidget class does. But if the user set the Orientation matrix - with SetOrientationMatrix() then all the actors of the widgets (handles, - hexahedron, etc) will be oriented according to the argument. - - \see vtk3DWidget vtkBoxWidget - */ -class vtkOrientedBoxWidget : public vtkBoxWidget -{ - - public: - - static vtkOrientedBoxWidget* New(); - vtkTypeRevisionMacro(vtkOrientedBoxWidget, vtkBoxWidget); - - vtkGetObjectMacro (OrientationMatrix, vtkMatrix4x4); - virtual void SetOrientationMatrix (vtkMatrix4x4* matrix); - - protected: - - vtkOrientedBoxWidget(); - ~vtkOrientedBoxWidget(); - - virtual void OnMouseMove(); - - vtkMatrix4x4* OrientationMatrix; - vtkMatrix4x4* InvertedOrientationMatrix; - - -}; - -#endif /* _vtkOrientedBoxWidget_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.cxx deleted file mode 100644 index c836ced9..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.cxx +++ /dev/null @@ -1,320 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewColorImage.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkMatrix4x4.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" -#include "vtkInteractorStyleImage.h" - -#include -#include - -vtkCxxRevisionMacro(vtkViewColorImage, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewColorImage); - -//---------------------------------------------------------------------------- -vtkViewColorImage::vtkViewColorImage() -{ - this->OrientationMatrix = vtkMatrix4x4::New(); - this->OrientationAnnotation = vtkOrientationAnnotation::New(); - this->CornerAnnotation = vtkCornerAnnotation::New(); - this->TextProperty = vtkTextProperty::New(); - this->Prop3DCollection = vtkProp3DCollection::New(); - this->DataSetCollection = vtkDataSetCollection::New(); - this->OrientationTransform = vtkMatrixToLinearTransform::New(); - - this->OrientationMatrix->Identity(); - this->CornerAnnotation->SetNonlinearFontScaleFactor (0.22); - this->CornerAnnotation->SetTextProperty ( this->TextProperty ); - this->OrientationAnnotation->SetNonlinearFontScaleFactor (0.25); - this->OrientationAnnotation->SetTextProperty ( this->TextProperty ); - - this->ShowAnnotations = true; - - this->OrientationTransform->SetInput (this->OrientationMatrix); - - this->Renderer->AddViewProp ( this->CornerAnnotation ); - this->Renderer->AddViewProp ( this->OrientationAnnotation ); -} - -//---------------------------------------------------------------------------- -vtkViewColorImage::~vtkViewColorImage() -{ - this->OrientationMatrix->Delete(); - this->OrientationAnnotation->Delete(); - this->CornerAnnotation->Delete(); - this->Prop3DCollection->Delete(); - this->DataSetCollection->Delete(); - this->OrientationTransform->Delete(); - this->TextProperty->Delete(); -} - - -//---------------------------------------------------------------------------- -void vtkViewColorImage::SetOrientationMatrix (vtkMatrix4x4* matrix) -{ - vtkSetObjectMacro2Body (OrientationMatrix, vtkMatrix4x4, matrix); - this->ImageActor->SetUserMatrix (this->OrientationMatrix); - this->OrientationTransform->SetInput (this->OrientationMatrix); - - this->UpdateOrientation(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage::SetTextProperty (vtkTextProperty* textproperty) -{ - vtkSetObjectMacro2Body (TextProperty, vtkTextProperty, textproperty); - this->CornerAnnotation->SetTextProperty (this->TextProperty); -} - -//---------------------------------------------------------------------------- -double vtkViewColorImage::GetValueAtPosition(double worldcoordinates[3], - int component ) -{ - if (!this->GetInput()) - return 0.0; - - int* indices= this->GetImageCoordinatesFromWorldCoordinates(worldcoordinates); - int* extent = this->GetInput()->GetWholeExtent(); - if ( (indices[0] < extent[0]) || (indices[0] > extent[1]) || - (indices[1] < extent[2]) || (indices[1] > extent[3]) || - (indices[2] < extent[4]) || (indices[2] > extent[5]) ) - return 0; - else - return this->GetInput()->GetScalarComponentAsDouble (indices[0], indices[1], - indices[2], component); -} - - -//---------------------------------------------------------------------------- -bool vtkViewColorImage::RemoveDataSet (vtkDataSet* dataset) -{ - unsigned int index = this->DataSetCollection->IsItemPresent (dataset); - if (!index) - return false; - this->Renderer->RemoveViewProp ( - vtkProp::SafeDownCast (this->Prop3DCollection->GetItemAsObject (index))); - this->DataSetCollection->RemoveItem (index); - this->Prop3DCollection->RemoveItem (index); - - return true; -} - -//---------------------------------------------------------------------------- -double* vtkViewColorImage::GetWorldCoordinatesFromImageCoordinates(int indices[3]) -{ - if (!this->GetInput()) - { - double* nullpos = new double[3]; - nullpos[0] = 0; nullpos[1] = 0; nullpos[2] = 0; - return nullpos; - } - - // Get information - double* spacing = this->GetInput()->GetSpacing(); - double* origin = this->GetInput()->GetOrigin(); - - double unorientedposition[4]; - for (unsigned int i=0; i<3; i++) - unorientedposition[i] = origin[i] + spacing[i]*indices[i]; - unorientedposition[3] = 1; - - // apply orientation matrix - double* position = new double[4]; - this->GetOrientationMatrix()->MultiplyPoint (unorientedposition, position); - return position; -} - -//---------------------------------------------------------------------------- -int* vtkViewColorImage::GetImageCoordinatesFromWorldCoordinates(double position[3]) -{ - if (!this->GetInput()) - { - int* nullpos = new int[3]; - nullpos[0] = 0; nullpos[1] = 0; nullpos[2] = 0; - return nullpos; - } - - // Get information - double unorientedposition[4] = {position[0], position[1], position[2], 1}; - double spacing[4] = {this->GetInput()->GetSpacing()[0], - this->GetInput()->GetSpacing()[1], - this->GetInput()->GetSpacing()[2], - 0}; - double origin[4] = {this->GetInput()->GetOrigin()[0], - this->GetInput()->GetOrigin()[1], - this->GetInput ()->GetOrigin()[2], - 1}; - - // apply inverted orientation matrix to the world-coordinate position - vtkMatrix4x4* inverse = vtkMatrix4x4::New(); - vtkMatrix4x4::Invert (this->GetOrientationMatrix(), inverse); - inverse->MultiplyPoint (unorientedposition, unorientedposition); - - int* indices = new int[3]; - for (unsigned int i=0; i<3;i++) - { - if (fabs (spacing[i]) > 1e-5) - indices[i] = vtkMath::Round((unorientedposition[i]-origin[i])/spacing[i]); - else - indices[i] = 0; - } - inverse->Delete(); - - return indices; -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage::SetBackground(double rgb[3]) -{ - if (this->Renderer) - this->Renderer->SetBackground(rgb); -} -//---------------------------------------------------------------------------- -void vtkViewColorImage::SetBackground(double r, double g, double b) -{ - if (this->Renderer) - this->Renderer->SetBackground(r,g,b); -} - -//---------------------------------------------------------------------------- -double* vtkViewColorImage::GetBackground() -{ - if (this->Renderer) - return this->Renderer->GetBackground(); - return NULL; -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage::ResetCamera (void) -{ - if (this->Renderer) - this->Renderer->ResetCamera(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage::Reset (void) -{ - this->ResetCamera(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage::Enable (void) -{ - this->Interactor->Enable(); -} -//---------------------------------------------------------------------------- -void vtkViewColorImage::Disable (void) -{ - this->Interactor->Disable(); -} -//---------------------------------------------------------------------------- -int vtkViewColorImage::GetEnabled (void) -{ - return this->Interactor->GetEnabled(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage::SetShowAnnotations (int val) -{ - this->ShowAnnotations = val; - this->CornerAnnotation->SetVisibility (val); - this->OrientationAnnotation->SetVisibility (val); -} - -//---------------------------------------------------------------------------- -vtkRenderWindowInteractor* vtkViewColorImage::GetRenderWindowInteractor() -{ - return this->GetRenderWindow()->GetInteractor(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.h deleted file mode 100644 index 6a63188f..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage.h +++ /dev/null @@ -1,295 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewColorImage_h_ -#define _vtkViewColorImage_h_ - -#include "vtkImageViewer2.h" - -/** - This macro can be useful as we frequently set - an instance this way, meaning unregistering previously set instance, - registering given instance, and call a modified event. - However this might be not the best place to define it... -*/ -//BTX -#define vtkSetObjectMacro2Body(object, type, _arg)\ - if (this->object == _arg) \ - return; \ - if (this->object) \ - { \ - this->object->UnRegister(this); \ - } \ - this->object = _arg; \ - \ - if (this->object != NULL) \ - { \ - this->object->Register(this); \ - } \ - \ - this->Modified(); \ -//ETX - -/** - This macro can be useful as we frequently set - an instance this way, meaning unregistering previously set instance, - registering given instance, and call a modified event. - However this might be not the best place to define it... -*/ -//BTX -#define vtkSetObjectMacro2(object, type) \ - virtual void Set##object (type* _arg) \ - { \ - vtkSetObjectMacro2Body (object, type, _arg);\ - } \ - -//ETX - -class vtkMatrix4x4; -class vtkScalarBarActor; -class vtkLookupTable; -class vtkTextProperty; -class vtkCornerAnnotation; -class vtkOrientationAnnotation; -class vtkActor; -class vtkDataSet; -class vtkPolyData; -class vtkProperty; -class vtkProp3DCollection; -class vtkDataSetCollection; -class vtkMatrixToLinearTransform; - -class vtkViewColorImage : public vtkImageViewer2 -{ - - public: - - static vtkViewColorImage* New(); - vtkTypeRevisionMacro(vtkViewColorImage, vtkImageViewer2); - - /** - Get the orientation annotation. This annotation describes the orientation - of the slice plane, according to the rule - Right(R)-Left(L) Anterior(A)-Posterior(P) Inferior(I)-Superior(S) - */ - vtkGetObjectMacro (OrientationAnnotation, vtkOrientationAnnotation); - - - /** - Get the corner annotation. - */ - ///\todo make the corner annotation such that it follows the slice number, the - ///image scalar value at cursor, the spacing, etc - vtkGetObjectMacro (CornerAnnotation, vtkCornerAnnotation); - - - /** - The OrientationMatrix instance (GetOrientationMatrix()) is a very important - added feature of this viewer. It describes the rotation and translation to - apply to the image bouding box (axis aligned) to the world coordinate - system. - - Rotation part is usually given by the GetDirection() method on an - itk::Image for instance. Translation usually correspond to the origin of - the image given by GetOrigin() on an itk::Image. - - CAUTION: if you provide non-zero origin to the viewer vtkImageData input - (SetInput()), then don't provide translation to the OrientationMatrix - instance, otherwise the information is redundant. - - The best behaviour is to force the origin of the vtkImageData input to zero - and provide this origin information in the OrientationMatrix. - - */ - vtkGetObjectMacro (OrientationMatrix, vtkMatrix4x4); - virtual void SetOrientationMatrix (vtkMatrix4x4* matrix); - - - /** - The TextProperty instance (GetTextProperty()) describes the font and - other settings of the CornerAnnotation instance (GetCornerAnnotation()) - */ - vtkGetObjectMacro (TextProperty, vtkTextProperty); - virtual void SetTextProperty (vtkTextProperty* textproperty); - - /** - The world is not always what we think it is ... - - Use this method to move the viewer slice such that the position - (in world coordinates) given by the arguments is contained by - the slice plane. If the given position is outside the bounds - of the image, then the slice will be as close as possible. - */ - virtual void SetWorldCoordinates (double x, double y, double z) - { - double pos[3] = {x,y,z}; - this->SetWorldCoordinates (pos); - } - virtual void SetWorldCoordinates (double pos[3]){}; - - - - /** - Add a dataset to the view (has to be subclass of vtkPointSet). - The dataset will be cut through the implicit slice plane - (GetImplicitSlicePlane()). - - This results in a loss of dimensionality, i.e. tetrahedron will be displayed - as triangles, triangles as lines, lines as points. - A vtkProperty of the dataset can be specified. - */ - virtual void AddDataSet (vtkDataSet* dataset, - vtkProperty* property = NULL, - const bool& intersection = true ) {}; - virtual bool RemoveDataSet (vtkDataSet* dataset); - - /** - Set/Get the current slice to display (depending on the orientation - this can be in X, Y or Z). - */ - virtual void SetSlice(int s) - { this->Superclass::SetSlice (s); }; - - /** - Convert an indices coordinate point (image coordinates) into a world - coordinate point - */ - virtual double* GetWorldCoordinatesFromImageCoordinates (int indices[3]); - - /** - Convert a world coordinate point into an image indices coordinate point - */ - virtual int* GetImageCoordinatesFromWorldCoordinates (double position[3]); - - /** - Get the pixel value at a given world coordinate point in space, return - zero if out of bounds. - */ - virtual double GetValueAtPosition(double worldcoordinates[3], - int component=0 ); - - /** - Set the background color. Format is RGB, 0 <= R,G,B <=1 - Example: SetBackground(0.9,0.9,0.9) for grey-white. - */ - virtual void SetBackground(double rgb[3]); - virtual void SetBackground(double r, double g, double b); - virtual double* GetBackground(void); - - /** - Reset the camera - */ - virtual void ResetCamera(void); - /** - Reset position - zoom to default - */ - virtual void Reset(void); - /** - Show/Hide the annotations. - */ - vtkGetMacro (ShowAnnotations, int); - /** - Show/Hide the annotations. - */ - virtual void SetShowAnnotations (int); - /** - Show/Hide the annotations. - */ - vtkBooleanMacro (ShowAnnotations, int); - /** - Enable or Disable interaction on the view. - */ - virtual void Enable (void); - /** - Enable or Disable interaction on the view. - */ - virtual void Disable (void); - /** - Enable or Disable interaction on the view. - */ - virtual int GetEnabled (void); - virtual vtkRenderWindowInteractor* GetRenderWindowInteractor(); - - protected: - - vtkViewColorImage(); - ~vtkViewColorImage(); - - // Description: - vtkMatrix4x4* OrientationMatrix; - vtkCornerAnnotation* CornerAnnotation; - vtkOrientationAnnotation* OrientationAnnotation; - vtkTextProperty* TextProperty; - vtkProp3DCollection* Prop3DCollection; - vtkDataSetCollection* DataSetCollection; - vtkMatrixToLinearTransform* OrientationTransform; - - int ShowAnnotations; - -}; - -#endif /* _vtkViewColorImage_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.cxx deleted file mode 100644 index 9115d86b..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.cxx +++ /dev/null @@ -1,812 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewColorImage2D.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkMatrix4x4.h" -#include "vtkTransform.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkClipPolyData.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" -#include "vtkInteractorStyleImage2D.h" -#include "vtkViewColorImage2DCommand.h" - -#include -#include - -vtkCxxRevisionMacro(vtkViewColorImage2D, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewColorImage2D); - -//---------------------------------------------------------------------------- -vtkViewColorImage2D::vtkViewColorImage2D() -{ - this->ConventionMatrix = vtkMatrix4x4::New(); - this->SliceImplicitPlane = vtkPlane::New(); - this->AdjustmentTransform = vtkTransform::New(); - this->SlicePlane = vtkPolyData::New(); - this->Command = vtkViewColorImage2DCommand::New(); - - this->Command->SetViewer( this); - - this->AdjustmentTransform->Identity(); - this->SliceImplicitPlane->SetOrigin( 0,0,0); - this->SliceImplicitPlane->SetNormal( 0,0,1); - - this->ViewConvention = vtkViewColorImage2D::VIEW_CONVENTION_RADIOLOGICAL; - this->ViewOrientation = vtkViewColorImage2D::VIEW_ORIENTATION_AXIAL; - - this->ConventionMatrix->Zero(); - this->ConventionMatrix->SetElement( 2,0, 1); - this->ConventionMatrix->SetElement( 2,1, 1); - this->ConventionMatrix->SetElement( 1,2, -1); - this->ConventionMatrix->SetElement( 0,3, 1); - this->ConventionMatrix->SetElement( 1,3, -1); - this->ConventionMatrix->SetElement( 2,3, -1); - - this->InitializeSlicePlane(); - this->Zoom = 1.; -} - -//---------------------------------------------------------------------------- -vtkViewColorImage2D::~vtkViewColorImage2D() -{ - this->ConventionMatrix->Delete(); - this->SliceImplicitPlane->Delete(); - this->SlicePlane->Delete(); - this->AdjustmentTransform->Delete(); - this->Command->Delete(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetViewConvention(int convention) -{ - if( ( convention < vtkViewColorImage2D::VIEW_CONVENTION_RADIOLOGICAL) || - convention == this->ViewConvention) - return; - - this->ViewConvention = convention; - - this->ConventionMatrix->SetElement( 2,0, 1); - this->ConventionMatrix->SetElement( 2,1, 1); - this->ConventionMatrix->SetElement( 1,2, -1); - - int x_watcher, y_watcher, z_watcher; - - switch(convention) - { - case vtkViewColorImage2D::VIEW_CONVENTION_RADIOLOGICAL: - default: - x_watcher = 1; - y_watcher = -1; - z_watcher = -1; - break; - case vtkViewColorImage2D::VIEW_CONVENTION_NEUROLOGICAL: - x_watcher = 1; - y_watcher = 1; - z_watcher = 1; - break; - ///\todo why not adding cardiologic conventions with oblique points of view ? - /// actually we can't: oblique point of view implies resampling data: loss of - /// data... and we don't want that, do we ? - } - this->ConventionMatrix->SetElement( 0,3, x_watcher); - this->ConventionMatrix->SetElement( 1,3, y_watcher); - this->ConventionMatrix->SetElement( 2,3, z_watcher); - - this->UpdateOrientation(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetViewOrientation(int orientation) -{ - ///\todo: in terms of view orientation here we can add some cardiac specific: - /// short axis, long axis, and 4-chambers !!! exiting ! - if( ( orientation < vtkViewColorImage2D::VIEW_ORIENTATION_SAGITTAL) || - orientation == this->ViewOrientation) - return; - - this->ViewOrientation = orientation; - unsigned int sliceorientation = 2; - double dot = 0; - for( unsigned int i=0; i<3; i++) - if( dot < fabs( this->GetOrientationMatrix()->GetElement( orientation, i))) - { - dot = fabs( this->GetOrientationMatrix()->GetElement( orientation, i)); - sliceorientation = i; - } - this->SetSliceOrientation( sliceorientation); -} -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetOrientationMatrix( vtkMatrix4x4* matrix) -{ - this->Superclass::SetOrientationMatrix( matrix); - this->UpdateOrientation(); -} - - - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::InitializeSlicePlane(void) -{ - vtkPoints* points = vtkPoints::New(); - this->SlicePlane->SetPoints( points); - points->InsertNextPoint( 0, 0, 0); - points->InsertNextPoint( 1, 0, 0); - points->InsertNextPoint( 0, 1, 0); - points->InsertNextPoint( 1, 1, 0); - this->SlicePlane->Allocate( 4); - - vtkIdType pts[4]; - pts[0] = 0; pts[1] = 1; pts[2] = 3; pts[3] = 2; - this->SlicePlane->InsertNextCell( VTK_QUAD, 4, pts); - pts[0] = 0; pts[1] = 2; pts[2] = 3; pts[3] = 1; - this->SlicePlane->InsertNextCell( VTK_QUAD, 4, pts); - points->Delete(); - - vtkUnsignedCharArray* array = vtkUnsignedCharArray::New(); - array->SetName( "Colors"); - array->SetNumberOfComponents( 3); - unsigned char vals[3]; - vals[0] = 255; vals[1] = 0; vals[2] = 0; - array->InsertNextTupleValue( vals); - array->InsertNextTupleValue( vals); - array->InsertNextTupleValue( vals); - array->InsertNextTupleValue( vals); - - this->SlicePlane->GetPointData()->SetScalars( array); - array->Delete(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::UpdateOrientation() -{ - this->Superclass::UpdateOrientation(); - int axis = this->SetCameraToConvention(); - this->ViewOrientation = axis; - - this->SetAnnotationToConvention(); - this->SetSlicePlaneToConvention( axis); - this->UpdateSlicePlane(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetWorldCoordinates(double pos[3]) -{ - this->SetSlice( this->GetSliceForWorldCoordinates( pos)); -} - -//---------------------------------------------------------------------------- -int vtkViewColorImage2D::SetCameraToConvention(void) -{ - - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam) - return -1; - - double position[4], focalpoint[4], viewup[4]; - double conventionposition[4]; - double conventionview[4]; - double focaltoposition[3]; - std::vector viewupchoices; - double first[3], second[3], third[3], fourth[3]; - bool inverseposition; - - // First recover information from the camera. - // Recover also information from the convention matrix - unsigned int i; - for( i=0; i<3; i++ ) - { - position[i] = cam->GetPosition()[i]; - focalpoint[i] = cam->GetFocalPoint()[i]; - conventionposition[i] = this->ConventionMatrix->GetElement( i,3); - conventionview[i] = this->ConventionMatrix->GetElement( i, - this->SliceOrientation ); - } - - position[3] = 1; - focalpoint[3] = 1; - conventionview[3] = 0; - viewup[3] = 0; - - // Apply the orientation matrix to all this information - this->GetOrientationMatrix()->MultiplyPoint( position, position ); - this->GetOrientationMatrix()->MultiplyPoint( focalpoint, focalpoint ); - this->GetOrientationMatrix()->MultiplyPoint( conventionview, conventionview ); - this->GetOrientationMatrix()->MultiplyPoint( conventionposition, - conventionposition ); - - // Compute the vector perpendicular to the view - for( i=0; i<3; i++ ) - focaltoposition[i] = position[i] - focalpoint[i]; - - // Deal with the position : - // invert it if necessary( symetry among the focal point) - inverseposition =( vtkMath::Dot( focaltoposition, conventionposition ) < 0 ); - if( inverseposition) - for( i=0; i<3; i++ ) - position[i] -= 2*focaltoposition[i]; - - // Now we now we have 4 choices for the View-Up information - for( i=0; i<3; i++ ) - { - first[i] = conventionview[i]; - second[i] = -conventionview[i]; - } - - vtkMath::Cross( first, focaltoposition, third ); - vtkMath::Cross( second, focaltoposition, fourth ); - vtkMath::Normalize( third ); - vtkMath::Normalize( fourth ); - - viewupchoices.push_back( first ); - viewupchoices.push_back( second ); - viewupchoices.push_back( third ); - viewupchoices.push_back( fourth ); - - // To choose between these choices, first we find the axis - // the closest to the focaltoposition vector - unsigned int id = 0; - double dot = 0; - for( i=0; i<3; i++ ) - { - if( dot < fabs( focaltoposition[i] ) ) - { - dot = fabs( focaltoposition[i] ); - id = i; - } - } - - // Then we choose the convention matrix vector correspondant to the - // one we just found - for( i=0; i<3; i++ ) - conventionview[i] = this->ConventionMatrix->GetElement( i, id ); - - // Then we pick from the 4 solutions the closest to the - // vector just found - unsigned int id2 = 0; - double dot2 = 0; - for( i=0; iSetPosition(position[0], position[1], position[2]); - cam->SetFocalPoint(focalpoint[0], focalpoint[1], focalpoint[2]); - cam->SetViewUp(viewup[0], viewup[1], viewup[2]); - - this->SliceImplicitPlane->SetNormal( focaltoposition ); - - double view_plane_normal[3]; - cam->GetViewPlaneNormal( view_plane_normal ); - - // Rotation of the( Anterior-Posterior)( Ventral-Dorsal) View - if( this->ViewOrientation == 0 ) - cam->Roll( -90. ); - - // these lines are meant to fix the bug that make the line - // actor appear behind the 2D scene... - double translation[3]; - for( i=0; i<3; i++ ) - translation[i] = 0.01 * view_plane_normal[i]; - this->AdjustmentTransform->Identity(); - this->AdjustmentTransform->Translate( translation); - - return id; -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetAnnotationToConvention(void) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam) - return; - - std::string matrix[3][2]; - matrix[0][0] = "R";matrix[0][1] = "L"; - matrix[1][0] = "A";matrix[1][1] = "P"; - matrix[2][0] = "V";matrix[2][1] = "D"; - - std::string solution[4]; - - ///\todo surely there is a simpler way to do all of that ! - - double* viewup = cam->GetViewUp(); - double* normal = cam->GetViewPlaneNormal(); - double rightvector[3]; - vtkMath::Cross( normal, viewup, rightvector); - - unsigned int id1 = 0; - unsigned int id2 = 0; - unsigned int id3 = 0; - double dot1 = 0; - double dot2 = 0; - double dot3 = 0; - - for( unsigned int i=0; i<3; i++) - { - if( dot1 <= fabs( viewup[i])) - { - dot1 = fabs( viewup[i]); - id1 = i; - } - if( dot2 <= fabs( rightvector[i])) - { - dot2 = fabs( rightvector[i]); - id2 = i; - } - if( dot3 <= fabs( normal[i])) - { - dot3 = fabs( normal[i]); - id3 = i; - } - } - - if( viewup[id1] > 0) - { - solution[3] = matrix[id1][0]; - solution[1] = matrix[id1][1]; - } else { - solution[3] = matrix[id1][1]; - solution[1] = matrix[id1][0]; - } - if( rightvector[id2] > 0) - { - solution[0] = matrix[id2][0]; - solution[2] = matrix[id2][1]; - } else { - solution[0] = matrix[id2][1]; - solution[2] = matrix[id2][0]; - } - - for( unsigned int i=0; i<4; i++) - this->OrientationAnnotation->SetText( i, solution[i].c_str()); -} - - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetSlicePlaneToConvention(unsigned int axis) -{ - unsigned char vals[3] = {0,0,0}; - vals[axis] = 255; - - vtkUnsignedCharArray* array = vtkUnsignedCharArray::SafeDownCast( - this->SlicePlane->GetPointData()->GetScalars() ); - - if( !array) - return; - - array->SetTupleValue( 0, vals); - array->SetTupleValue( 1, vals); - array->SetTupleValue( 2, vals); - array->SetTupleValue( 3, vals); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetSlice( int s) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam) - return; - int *range = this->GetSliceRange(); - if( range &&( s >= range[0]) &&( s <= range[1]) ) - { - double* pos = this->GetWorldCoordinatesForSlice( s); - this->SliceImplicitPlane->SetOrigin( pos); - this->Superclass::SetSlice(s); - this->UpdateSlicePlane(); - } - else - this->Superclass::SetSlice(s); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::UpdateSlicePlane( void) -{ - vtkPoints* oldpoints = vtkPoints::New(); - vtkPoints* points = vtkPoints::New(); - double x[3]; - double* bounds = this->ImageActor->GetDisplayBounds( ); - unsigned int added1; - unsigned int added2; - - for( unsigned int i=0; i<4; i++) - { - added1 =( !(i%2)) ? 1 : 0; - added2 =( i<2) ? 1 : 0; - x[(this->SliceOrientation+1)%3] = - bounds[2*((this->SliceOrientation+1)%3)+added1]; - x[(this->SliceOrientation+2)%3] = - bounds[2*((this->SliceOrientation+2)%3)+added2]; - x[this->SliceOrientation] = bounds[2*this->SliceOrientation]; - oldpoints->InsertPoint(i,x); - } - this->OrientationTransform->TransformPoints( oldpoints, points); - this->SlicePlane->SetPoints( points); - oldpoints->Delete(); - points->Delete(); -} - - -//---------------------------------------------------------------------------- -int vtkViewColorImage2D::GetSliceForWorldCoordinates(double pos[3]) -{ - int* indices = this->GetImageCoordinatesFromWorldCoordinates( pos); - return indices[this->SliceOrientation]; -} - -//---------------------------------------------------------------------------- -double* vtkViewColorImage2D::GetWorldCoordinatesForSlice(int slice) -{ - int indices[3] = {slice, slice, slice}; - return this->GetWorldCoordinatesFromImageCoordinates( indices); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::ResetPosition( void ) -{ - if( !this->GetInput()) - return; - - int *range = this->GetSliceRange(); - this->SetSlice( vtkMath::Round( static_cast(0.5*(range[1]-range[0]))) ); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::ResetCamera(void) -{ - this->Zoom = 1.; - - double bounds[6]; - this->GetInput()->GetBounds( bounds ); - - double focal[3]; - focal[0] = 0.5 *( bounds[0] + bounds[1] ); - focal[1] = 0.5 *( bounds[2] + bounds[3] ); - focal[2] = 0.5 *( bounds[4] + bounds[5] ); - - double pos[3]; - pos[0] = focal[0]; - pos[1] = focal[1]; - pos[2] = focal[2]; - - double length[3]; - length[0] = 0.5 *( bounds[1] - bounds[0] ); - length[1] = 0.5 *( bounds[3] - bounds[2] ); - length[2] = 0.5 *( bounds[5] - bounds[4] ); - - double radius = 0.75 * sqrt( length[0] * length[0] + - length[1] * length[1] + - length[2] * length[2] ); - - vtkCamera *camera = this->GetRenderer()->GetActiveCamera(); - double distance = - radius/sin( camera->GetViewAngle()*vtkMath::Pi()/360.0 ); - - double view_plane_normal[3]; - camera->GetViewPlaneNormal( view_plane_normal ); - double* vup = camera->GetViewUp(); - - if( fabs( vtkMath::Dot( vup, view_plane_normal ) ) > 0.999 ) - { - vtkWarningMacro(<<"Resetting view-up since view plane normal is parallel"); - camera->SetViewUp(-vup[2], vup[0], vup[1]); - } - - pos[0] += distance * view_plane_normal[0]; - pos[1] += distance * view_plane_normal[1]; - pos[2] += distance * view_plane_normal[2]; - - this->SetCameraFocalAndPosition( focal, pos ); - - double max_length = std::max( length[0], std::max( length[1], length[2] ) ); - bounds[0] = focal[0] - 50. * max_length; - bounds[1] = focal[0] + 50. * max_length; - bounds[2] = focal[1] - 50. * max_length; - bounds[3] = focal[1] + 50. * max_length; - bounds[4] = focal[2] - 50. * max_length; - bounds[5] = focal[2] + 50. * max_length; - this->GetRenderer()->ResetCameraClippingRange( bounds ); - - camera->SetParallelScale(radius); -} -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::Reset( void) -{ - this->ResetPosition(); - this->ResetCamera(); -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetCameraFocalAndPosition( double focal[3], double pos[3] ) -{ - vtkRenderer* ren = this->GetRenderer(); - - if( !ren ) - { - return; - } - vtkCamera* camera = ren->GetActiveCamera(); - - if( !camera ) - { - return; - } - - camera->SetFocalPoint( focal[0], focal[1], focal[2] ); - camera->SetPosition( pos[0], pos[1], pos[2] ); -} - -void vtkViewColorImage2D::GetCameraFocalAndPosition( double focal[3], double pos[3] ) -{ - vtkRenderer* ren = this->GetRenderer(); - - if( !ren ) - { - return; - } - vtkCamera* camera = ren->GetActiveCamera(); - - if( !camera ) - { - return; - } - - camera->GetPosition( pos ); - camera->GetFocalPoint( focal ); -} -//---------------------------------------------------------------------------- -double* vtkViewColorImage2D::GetWorldCoordinatesFromDisplayPosition( int xy[2] ) -{ - - if( !this->GetInput() || !this->GetRenderer()) - { - double* nullpos = new double[3]; - nullpos[0] = 0; nullpos[1] = 0; nullpos[2] = 0; - return nullpos; - } - - double* slicepos = this->GetWorldCoordinatesForSlice( this->GetSlice()); - this->GetRenderer()->SetWorldPoint( slicepos[0], slicepos[1], slicepos[2], - 1.0); - this->GetRenderer()->WorldToDisplay(); - this->GetRenderer()->SetDisplayPoint( xy[0], xy[1], - this->GetRenderer()->GetDisplayPoint()[2]); - this->GetRenderer()->DisplayToWorld(); - return this->GetRenderer()->GetWorldPoint(); -} - - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::InstallPipeline() -{ - if( this->RenderWindow && this->Renderer) - { - this->RenderWindow->AddRenderer(this->Renderer); - } - - if( this->Interactor) - { - if( !this->InteractorStyle) - { - this->InteractorStyle = vtkInteractorStyleImage2D::New(); - this->Interactor->SetInteractorStyle(this->InteractorStyle); - this->InteractorStyle->AddObserver( - vtkCommand::KeyPressEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewColorImage2DCommand::StartSliceMoveEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewColorImage2DCommand::SliceMoveEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewColorImage2DCommand::EndSliceMoveEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewColorImage2DCommand::ResetViewerEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewColorImage2DCommand::ZoomEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewColorImage2DCommand::PanEvent, this->Command); - this->InteractorStyle->AddObserver( vtkCommand::InteractionEvent, - this->Command); - } - - this->Interactor->SetInteractorStyle(this->InteractorStyle); - this->Interactor->SetRenderWindow(this->RenderWindow); - } - - if( this->Renderer && this->ImageActor) - { - this->Renderer->AddViewProp(this->ImageActor); - } -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::SetInterpolate(const int& val ) -{ - if( this->ImageActor) - { - this->ImageActor->SetInterpolate( val); - } -} - -//---------------------------------------------------------------------------- -int vtkViewColorImage2D::GetInterpolate(void) -{ - if( this->ImageActor) - return this->ImageActor->GetInterpolate(); - return 0; -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::AddDataSet( vtkPolyData* dataset, - vtkProperty* property, - const bool& intersection ) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam ) - return; - - vtkPolyDataMapper* mapper = vtkPolyDataMapper::New(); - vtkActor* actor = vtkActor::New(); - - vtkClipPolyData* cutter = vtkClipPolyData::New(); - - if( intersection ) - { - cutter->SetInputConnection( 0, dataset->GetProducerPort()); - cutter->SetClipFunction( this->SliceImplicitPlane ); - cutter->InsideOutOn(); - mapper->SetInputConnection( 0, cutter->GetOutputPort()); - } - else - { - mapper->SetInput( dataset ); - } - - actor->SetMapper( mapper ); - if( property ) - actor->SetProperty( property ); - - actor->SetUserTransform( this->AdjustmentTransform ); - - this->Renderer->AddViewProp( actor ); - this->DataSetCollection->AddItem( dataset ); - this->Prop3DCollection->AddItem( actor ); - - cutter->Delete(); - mapper->Delete(); - actor->Delete(); -} -//---------------------------------------------------------------------------- -//---------------------------------------------------------------------------- -void vtkViewColorImage2D::AddDataSet( vtkDataSet* dataset, - vtkProperty* property, - const bool& intersection ) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam ) - return; - - vtkPolyDataMapper* mapper = vtkPolyDataMapper::New(); - vtkActor* actor = vtkActor::New(); - - vtkCutter* cutter = vtkCutter::New(); - - if( intersection ) - { - cutter->SetInputConnection( 0, dataset->GetProducerPort()); - cutter->SetCutFunction( this->SliceImplicitPlane ); - mapper->SetInputConnection( 0, cutter->GetOutputPort()); - } - else - { - mapper->SetInput( vtkPolyData::SafeDownCast( dataset ) ); - } - - actor->SetMapper( mapper ); - if( property ) - actor->SetProperty( property ); - - actor->SetUserTransform( this->AdjustmentTransform ); - - this->Renderer->AddViewProp( actor ); - this->DataSetCollection->AddItem( dataset ); - this->Prop3DCollection->AddItem( actor ); - - cutter->Delete(); - mapper->Delete(); - actor->Delete(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.h deleted file mode 100644 index 44acf6e0..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2D.h +++ /dev/null @@ -1,271 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewColorImage2D_h_ -#define _vtkViewColorImage2D_h_ - -#include "vtkViewColorImage.h" - -class vtkPlane; -class vtkViewColorImage2DCommand; -class vtkTransform; -class vtkImageBlendWithMask; - -/** - -*/ - - -class vtkViewColorImage2D : public vtkViewColorImage -{ - - public: - - static vtkViewColorImage2D* New(); - vtkTypeRevisionMacro(vtkViewColorImage2D, vtkViewColorImage); - /** - Description: - The orientation of the view is a abstract representation of the object - we are looking at. It results from the acquisition plane. Setting the View - Orientation by calling SetViewOrientation() will imply the view to set its - inner "slice" orientation. (slice orientation == 2 means plane of - acquisition.) - - IMPORTANT NOTE: - - The view orientations defined here are orthogonal to the normal basis - in the scanner. A very interesting improvement would be to define "oblique" - view orientations for cardiac imaging, something like: - - VIEW_ORIENTATION_SHORT_AXIS, VIEW_ORIENTATION_LONG_AXIS, and - VIEW_ORIENTATION_FOUR_CHAMBER could define the different views that are - usually used in cardiac imaging. - - From this user-input information, the idea would be to evaluate which slice - orientation does correspond to the requested view. This can be done by - evaluating the dot product between the axis of acquisition and a - pre-defined oblique axis that "should" correspond to the requested - orientation... - **/ - //BTX - enum - { - VIEW_ORIENTATION_SAGITTAL = 0, - VIEW_ORIENTATION_CORONAL = 1, - VIEW_ORIENTATION_AXIAL = 2 - }; - //ETX - /** - Description: - **/ - //BTX - enum - { - VIEW_CONVENTION_RADIOLOGICAL = 0, - VIEW_CONVENTION_NEUROLOGICAL = 1 - }; - //ETX - - /** - The SliceImplicitPlane instance (GetImplicitSlicePlane()) is the - implicit function that cuts every dataset that is added with AddDataSet(). - */ - vtkGetObjectMacro (SliceImplicitPlane, vtkPlane); - /** - The SlicePlane instance (GetSlicePlane()) is the polygonal - square corresponding to the slice plane, - it is updated each time the slice changes, - and is color-coded according to conventions - */ - vtkGetObjectMacro (SlicePlane, vtkPolyData); - /** - The world is not always what we think it is ... - - Use this method to move the viewer slice such that the position - (in world coordinates) given by the arguments is contained by - the slice plane. If the given position is outside the bounds - of the image, then the slice will be as close as possible. - */ - virtual void SetWorldCoordinates (double pos[3]); - - /** - Set/Get the current slice to display (depending on the orientation - this can be in X, Y or Z). - */ - virtual void SetSlice(int s); - - /** - Instead of setting the slice orientation to an axis (YZ - XZ - XY), - you can force the view to be axial (foot-head), coronal (front-back), - or sagittal (left-right). It will just use the OrientationMatrix - (GetOrientationMatrix()) to check which slice orientation to pick. - */ - vtkGetMacro (ViewOrientation, int); - virtual void SetViewOrientation (int orientation); - virtual void SetOrientationMatrix (vtkMatrix4x4* matrix); - - /** - The ViewConvention instance explains where to place the camera around - the patient. Default behaviour is Radiological convention, meaning - we respectively look at the patient from his feet, his face and his left - ear. - - For Neurological convention, we respectively look from the top of his head, - the the back of his head, and his left ear. - */ - ///\todo Why not adding cardiologic conventions where we look at the patient in - /// oblique angles ? - vtkGetMacro (ViewConvention, int); - virtual void SetViewConvention (int convention); - /** - Convert an indices coordinate point (image coordinates) into a world - coordinate point - */ - virtual double* GetWorldCoordinatesForSlice (int slice); - /** - Convert a world coordinate point into an image indices coordinate point - */ - virtual int GetSliceForWorldCoordinates(double pos[3]); - - virtual void ResetCamera(void); - /** - Reset the 3D position to center - */ - virtual void ResetPosition(void); - /** - Reset position - zoom - to default - */ - virtual void Reset(void); - /** - */ - virtual double* GetWorldCoordinatesFromDisplayPosition( int xy[2] ); - virtual double* GetWorldCoordinatesFromDisplayPosition( const int& x, const int& y ) - { - int xy[2] = {x,y}; - return this->GetWorldCoordinatesFromDisplayPosition( xy ); - } - - vtkSetMacro( Zoom, double ); - vtkGetMacro( Zoom, double ); - - vtkSetVector3Macro( CameraMotionVector, double ); - vtkGetVector3Macro( CameraMotionVector, double ); - - void SetCameraFocalAndPosition( double focal[3], double pos[3] ); - void GetCameraFocalAndPosition( double focal[3], double pos[3] ); - - vtkGetObjectMacro (Command, vtkViewColorImage2DCommand); - - virtual void SetInterpolate( const int& val ); - virtual int GetInterpolate (); - vtkBooleanMacro (Interpolate, int); - /** - Add a dataset to the view (has to be subclass of vtkPointSet). - The dataset will be cut through the implicit slice plane - (GetImplicitSlicePlane()). - - This results in a loss of dimensionality, i.e. tetrahedron will be displayed - as triangles, triangles as lines, lines as points. - A vtkProperty of the dataset can be specified. - */ - virtual void AddDataSet (vtkDataSet* dataset, - vtkProperty* property = NULL, - const bool& intersection = true ); - - virtual void AddDataSet( vtkPolyData* polydata, - vtkProperty* property = NULL, - const bool& intersection = true ); - - protected: - - vtkViewColorImage2D(); - ~vtkViewColorImage2D(); - - // Description: - virtual void UpdateOrientation(); - virtual int SetCameraToConvention (void); - virtual void SetAnnotationToConvention(void); - virtual void InitializeSlicePlane (void); - virtual void UpdateSlicePlane (void); - virtual void SetSlicePlaneToConvention (unsigned int axis); - virtual void InstallPipeline(); - - vtkMatrix4x4* ConventionMatrix; - vtkPlane* SliceImplicitPlane; - vtkTransform* AdjustmentTransform; - vtkPolyData* SlicePlane; - - vtkViewColorImage2DCommand* Command; - - int ViewOrientation; - int ViewConvention; - - double Zoom; - double CameraMotionVector[3]; -}; - -#endif /* _vtkViewColorImage2D_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.cxx deleted file mode 100644 index 07138afc..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.cxx +++ /dev/null @@ -1,275 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewColorImage2DCollection.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkRendererCollection.h" -#include "vtkMatrix4x4.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" -#include "vtkProperty.h" - -#include "vtkViewColorImage2DCommand.h" -#include "vtkInteractorStyleImage2D.h" - -#include -#include -#include - -vtkCxxRevisionMacro(vtkViewColorImage2DCollection, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewColorImage2DCollection); - - -//---------------------------------------------------------------------------- -vtkViewColorImage2DCollection::vtkViewColorImage2DCollection() -{ - this->Command = vtkViewColorImage2DCollectionCommand::New(); - this->Command->SetCollection (this); - this->ExtraRenderWindow = NULL; -} - -//---------------------------------------------------------------------------- -vtkViewColorImage2DCollection::~vtkViewColorImage2DCollection() -{ - this->Command->Delete(); -} - - -// Add an object to the list. Does not prevent duplicate entries. -void vtkViewColorImage2DCollection::AddItem(vtkViewColorImage2D *a) -{ - this->Superclass::AddItem (a); - - a->GetInteractorStyle()->AddObserver (vtkViewColorImage2DCommand::SliceMoveEvent, - this->Command); - a->GetInteractorStyle()->AddObserver ( - vtkViewColorImage2DCommand::RequestedPositionEvent, this->Command); - a->GetInteractorStyle()->AddObserver ( - vtkViewColorImage2DCommand::ResetViewerEvent, this->Command); - -} - -// Remove an object from the list. Removes the first object found, not -// all occurrences. If no object found, list is unaffected. See warning -// in description of RemoveItem(int). -void vtkViewColorImage2DCollection::RemoveItem(vtkViewColorImage2D *a) -{ - this->Superclass::RemoveItem (a); -} - -// Remove all objects from the list. -void vtkViewColorImage2DCollection::RemoveAllItems() -{ - this->Superclass::RemoveAllItems (); -} - - -// Replace the i'th item in the collection with a -void vtkViewColorImage2DCollection::ReplaceItem(int i, vtkViewColorImage2D *a) -{ - this->Superclass::ReplaceItem (i, a); -} - - -// Remove the i'th item in the list. -// Be careful if using this function during traversal of the list using -// GetNextItemAsObject (or GetNextItem in derived class). The list WILL -// be shortened if a valid index is given! If this->Current is equal to the -// element being removed, have it point to then next element in the list. -void vtkViewColorImage2DCollection::RemoveItem(int i) -{ - this->Superclass::RemoveItem (i); -} - - -void vtkViewColorImage2DCollection::Initialize(void) -{ - vtkProperty* plane_property = vtkProperty::New(); - plane_property->SetRepresentationToWireframe(); - - for (int i=0; iGetNumberOfItems(); i++) - { - for (int j=0; jGetNumberOfItems(); j++) - { - this->GetItem (j)->AddDataSet( - this->GetItem (i)->GetSlicePlane(), plane_property, ( i != j ) ); - } - } - plane_property->Delete(); -} - -void vtkViewColorImage2DCollection::SyncRender(void) -{ - this->InitTraversal(); - vtkViewColorImage2D* item = this->GetNextItem(); - while(item) - { - item->Render (); - item = this->GetNextItem(); - } - if (this->ExtraRenderWindow) - this->ExtraRenderWindow->Render(); -} - - -void vtkViewColorImage2DCollection::SyncReset(void) -{ - this->InitTraversal(); - vtkViewColorImage2D* item = this->GetNextItem(); - while(item) - { - item->Reset (); - item = this->GetNextItem(); - } -} - -//---------------------------------------------------------------------------- -vtkViewColorImage2DCollectionCommand::vtkViewColorImage2DCollectionCommand() -{ -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2DCollectionCommand::SetCollection(vtkViewColorImage2DCollection* p) -{ - this->Collection = p; -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage2DCollectionCommand::Execute(vtkObject *caller, - unsigned long event, - void *vtkNotUsed(callData)) -{ - if (!this->Collection) - return; - - vtkInteractorStyleImage2D *isi = - vtkInteractorStyleImage2D::SafeDownCast(caller); - this->GetCollection()->InitTraversal(); - vtkViewColorImage2D* v = this->GetCollection()->GetNextItem(); - vtkViewColorImage2D* viewer = NULL; - while(v) - { - if (isi == v->GetInteractorStyle()) - viewer = v; - v = this->GetCollection()->GetNextItem(); - } - - if (!isi || !viewer || !viewer->GetInput()) - return; - - // Reset - if (event == vtkViewColorImage2DCommand::ResetViewerEvent) - { - this->Collection->SyncReset(); - this->Collection->SyncRender(); - return; - } - - // Move - if (event == vtkViewColorImage2DCommand::SliceMoveEvent) - { - // do not synchronize this, but render all - this->Collection->SyncRender(); - - } - - // Position requested - if (event == vtkViewColorImage2DCommand::RequestedPositionEvent) - { - double* position = viewer->GetWorldCoordinatesFromDisplayPosition ( - isi->GetRequestedPosition ()); - this->Collection->SyncSetWorldCoordinates(position); - this->Collection->SyncRender(); - } -} - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.h deleted file mode 100644 index 2f8abef4..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCollection.h +++ /dev/null @@ -1,244 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewColorImage2DCollection_h_ -#define _vtkViewColorImage2DCollection_h_ - -#include "vtkCollection.h" -#include "vtkCommand.h" - -#include "vtkViewColorImage2D.h" -/** - This macro can be useful as we frequently set - an instance this way, meaning unregistering previously set instance, - registering given instance, and call a modified event. - However this might be not the best place to define it... -*/ -//BTX -#define vtkSyncSetMacro(name, type, base ) \ - virtual void SyncSet##name (type _arg) \ - { \ - this->InitTraversal(); \ - base* item = this->GetNextItem(); \ - while(item) \ - { \ - item->Set##name (_arg); \ - item = this->GetNextItem(); \ - } \ - } -///ETX - -///BTX -#define vtkSyncSetObjectMacro(name, type, base) \ - virtual void SyncSet##name (type* _arg) \ - { \ - this->InitTraversal(); \ - base* item = this->GetNextItem(); \ - while(item) \ - { \ - item->Set##name (_arg); \ - item = this->GetNextItem(); \ - } \ - } - -///ETX - - -class vtkTextProperty; -class vtkCornerAnnotation; -class vtkOrientationAnnotation; -class vtkPlane; -class vtkActor; -class vtkDataSet; -class vtkPolyData; -class vtkProperty; -class vtkProp3DCollection; -class vtkDataSetCollection; -class vtkMatrixToLinearTransform; -class vtkViewColorImage2DCollectionCommand; - -/** - -*/ -// NOTE ALEX: could do a template here to manage color and greyscale with i -// the same class. -class vtkViewColorImage2DCollection : public vtkCollection -{ - public: - - static vtkViewColorImage2DCollection* New(); - vtkTypeRevisionMacro(vtkViewColorImage2DCollection, vtkCollection); - - // Description: - // Get the next vtkViewColorImage2D in the list. - // Return NULL when at the end of the list. - vtkViewColorImage2D *GetNextItem() { - return static_cast(this->GetNextItemAsObject());}; - - // Description: - // Get the next vtkViewColorImage2D in the list.Return NULL when at the end of - // the list. - vtkViewColorImage2D *GetItem(int i) { - return static_cast(this->GetItemAsObject(i));}; - - // Description: - // Add an object to the list. Does not prevent duplicate entries. - void AddItem(vtkViewColorImage2D*); - - // Description: - // Replace the i'th item in the collection with a - void ReplaceItem(int i, vtkViewColorImage2D *); - - // Description: - // Remove the i'th item in the list. - // Be careful if using this function during traversal of the list using - // GetNextItemAsObject (or GetNextItem in derived class). The list WILL - // be shortened if a valid index is given! If this->Current is equal to the - // element being removed, have it point to then next element in the list. - void RemoveItem(int i); - - // Description: - // Remove an object from the list. Removes the first object found, not - // all occurrences. If no object found, list is unaffected. See warning - // in description of RemoveItem(int). - void RemoveItem(vtkViewColorImage2D *); - - // Description: - // Remove all objects from the list. - void RemoveAllItems(); - - // Description: - // Initialize the viewers togethers. - void Initialize(void); - - - vtkGetObjectMacro (Command, vtkViewColorImage2DCollectionCommand); - vtkGetObjectMacro (ExtraRenderWindow, vtkRenderWindow); - void SetExtraRenderWindow (vtkRenderWindow* win) - { this->ExtraRenderWindow = win; } - - vtkSyncSetMacro (Slice, int, vtkViewColorImage2D); - vtkSyncSetMacro (SliceOrientation, int, vtkViewColorImage2D); - vtkSyncSetMacro (ShowAnnotations, int, vtkViewColorImage2D); - - vtkSyncSetObjectMacro (OrientationMatrix, vtkMatrix4x4, vtkViewColorImage2D); - vtkSyncSetObjectMacro (TextProperty, vtkTextProperty, vtkViewColorImage2D); - vtkSyncSetObjectMacro (Input, vtkImageData, vtkViewColorImage2D); - vtkSyncSetObjectMacro (InputConnection, vtkAlgorithmOutput, - vtkViewColorImage2D); - - vtkSyncSetObjectMacro (Size, int, vtkViewColorImage2D); - vtkSyncSetObjectMacro (Position, int, vtkViewColorImage2D); - vtkSyncSetObjectMacro (WorldCoordinates, double, vtkViewColorImage2D); - vtkSyncSetObjectMacro (Background, double, vtkViewColorImage2D); - - void SyncRender (void); - void SyncReset (void); - - protected: - - vtkViewColorImage2DCollection(); - ~vtkViewColorImage2DCollection(); - - vtkViewColorImage2DCollectionCommand* Command; - vtkRenderWindow* ExtraRenderWindow; -}; - - - - -class vtkViewColorImage2DCollectionCommand : - public vtkCommand -{ - - public: - - static vtkViewColorImage2DCollectionCommand *New() - {return new vtkViewColorImage2DCollectionCommand;}; - - vtkViewColorImage2DCollection* GetCollection (void) - { return this->Collection;}; - void SetCollection (vtkViewColorImage2DCollection* p); - - // Description: - // Satisfy the superclass API for callbacks. Recall that the caller is - // the instance invoking the event; eid is the event id (see - // vtkCommand.h); and calldata is information sent when the callback - // was invoked (e.g., progress value in the vtkCommand::ProgressEvent). - virtual void Execute(vtkObject *caller,unsigned long event, - void *vtkNotUsed(callData)); - - protected: - - vtkViewColorImage2DCollectionCommand(); - ~vtkViewColorImage2DCollectionCommand(){}; - - private: - vtkViewColorImage2DCollection* Collection; -}; - -#endif /* _vtkViewColorImage2DCollection_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.cxx deleted file mode 100644 index 6f85a866..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.cxx +++ /dev/null @@ -1,269 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifdef _MSC_VER -# pragma warning (disable : 4018) -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "vtkViewColorImage2D.h" -#include "vtkInteractorStyleImage2D.h" - - -#include "vtkViewColorImage2DCommand.h" -#include "vtkInteractorStyleImage2D.h" - -#include -#include - - -vtkViewColorImage2DCommand::vtkViewColorImage2DCommand() : Viewer( 0 ) -{} - -void -vtkViewColorImage2DCommand::Execute( vtkObject* caller, - unsigned long event, - void* callData) -{ - vtkInteractorStyleImage2D *isi = - static_cast(caller); - - if (!isi || !this->Viewer || !this->Viewer->GetInput()) - { - return; - } - - // Reset - if (event == vtkViewColorImage2DCommand::ResetViewerEvent) - { - this->Viewer->Reset(); - this->Viewer->Render(); - return; - } - - if (event == vtkCommand::KeyPressEvent) - { - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - if (rwi->GetKeyCode() == 't') - { - this->Viewer->SetViewOrientation ( - (this->Viewer->GetViewOrientation()+1)%3 ); - this->Viewer->Render(); - } - else if (rwi->GetKeyCode() == 'i') - { - this->Viewer->SetInterpolate ((this->Viewer->GetInterpolate() + 1)%2); - this->Viewer->Render(); - } - - return; - } - - if (event == vtkViewColorImage2DCommand::EndSliceMoveEvent) - { - int step = isi->GetSliceStep(); - this->Viewer->SetSlice (this->Viewer->GetSlice()+step); - this->Viewer->Render(); - } - - if( event == vtkViewColorImage2DCommand::ZoomEvent ) - { - this->Zooming(); - } - - if( event == vtkViewColorImage2DCommand::PanEvent ) - { - this->Panning(); - } - - // Move - // Position Value requested - if (event == vtkViewColorImage2DCommand::InteractionEvent) - { - PrintInformation(); - } - - // Position requested - if (event == vtkViewColorImage2DCommand::RequestedPositionEvent) - { - double* position = this->Viewer->GetWorldCoordinatesFromDisplayPosition ( - isi->GetRequestedPosition ()); - this->Viewer->SetWorldCoordinates(position); - this->Viewer->Render(); - } -} - -void vtkViewColorImage2DCommand::PrintInformation() -{ - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - double* pos = this->Viewer->GetWorldCoordinatesFromDisplayPosition ( - rwi->GetLastEventPosition ()); - - int* idx = this->Viewer->GetImageCoordinatesFromWorldCoordinates( pos ); - - int dims[3]; - this->Viewer->GetInput()->GetDimensions( dims ); - - double spacing[3]; - this->Viewer->GetInput()->GetSpacing( spacing ); - - std::ostringstream os; - ///TODO dims and spacing must be computed from the orientation of the - /// image. - os <<"Size: " <<"[ " <Viewer->GetSlice() <<" / " - <Viewer->GetSliceMax() - this->Viewer->GetSliceMin() <Viewer->GetCornerAnnotation()->SetText (2, os.str().c_str()); - - std::ostringstream os2; - os2 <<"Location: " <<"[ " <Viewer->GetValueAtPosition (pos); - this->Viewer->GetCornerAnnotation()->SetText (3, os2.str().c_str()); - this->Viewer->Render(); -} - - -void vtkViewColorImage2DCommand::Zooming( ) -{ - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - rwi->FindPokedRenderer( rwi->GetEventPosition()[0], - rwi->GetEventPosition()[1]); - - vtkRenderer* ren = this->Viewer->GetRenderer(); - - double *center = ren->GetCenter(); - int dy = rwi->GetEventPosition()[1] - rwi->GetLastEventPosition()[1]; - - double factor = static_cast(dy) / static_cast( center[1] ); - - double z = 1.; - z *= pow((double)1.1, factor); - - this->Viewer->SetZoom( z ); -} - - -void vtkViewColorImage2DCommand::Panning( ) -{ - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - double ViewFocus[4]; - double NewPickPoint[4]; - - // Calculate the focal depth since we'll be using it a lot - vtkRenderer* ren = this->Viewer->GetRenderer(); - vtkCamera* camera = ren->GetActiveCamera(); - camera->GetFocalPoint(ViewFocus); - - vtkInteractorObserver::ComputeWorldToDisplay( ren, - ViewFocus[0], ViewFocus[1], ViewFocus[2], ViewFocus); - - double focalDepth = ViewFocus[2]; - - vtkInteractorObserver::ComputeDisplayToWorld( ren, - rwi->GetEventPosition()[0], - rwi->GetEventPosition()[1], - focalDepth, - NewPickPoint ); - - // Get the current focal point and position - - camera->GetFocalPoint(ViewFocus); - - // Compute a translation vector, moving everything 1/10 - // the distance to the cursor. (Arbitrary scale factor) - - double MotionVector[3]; - MotionVector[0] = 0.01 * (ViewFocus[0] - NewPickPoint[0]); - MotionVector[1] = 0.01 * (ViewFocus[1] - NewPickPoint[1]); - MotionVector[2] = 0.01 * (ViewFocus[2] - NewPickPoint[2]); - - this->Viewer->SetCameraMotionVector( MotionVector ); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.h deleted file mode 100644 index dc216567..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage2DCommand.h +++ /dev/null @@ -1,124 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewColorImage2DCommand_h_ -#define _vtkViewColorImage2DCommand_h_ - -#include - -class vtkInteractorStyleImage2D; -class vtkInteractorStyleImage; -class vtkViewColorImage2D; - -class vtkViewColorImage2DCommand : public vtkCommand -{ - public: - - static vtkViewColorImage2DCommand* New() - { return new vtkViewColorImage2DCommand; } - - //BTX - enum EventIds - { - SliceMoveEvent=(vtkCommand::UserEvent+1), - StartSliceMoveEvent, - EndSliceMoveEvent, - ZoomEvent, - PanEvent, - RequestedPositionEvent, - ResetViewerEvent - }; - //ETX - - - - // Description: - // Satisfy the superclass API for callbacks. Recall that the caller is - // the instance invoking the event; eid is the event id (see - // vtkCommand.h); and calldata is information sent when the callback - // was invoked (e.g., progress value in the vtkCommand::ProgressEvent). - virtual void Execute(vtkObject *caller,unsigned long event, - void *vtkNotUsed(callData)); - - void SetViewer(vtkViewColorImage2D *viewer) - { this->Viewer = viewer; } - - protected: - vtkViewColorImage2DCommand(); - ~vtkViewColorImage2DCommand(){}; - - void Zooming(); - void Panning(); - void PrintInformation(); - - private: - vtkViewColorImage2D* Viewer; - int InitialSlice; - -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.cxx deleted file mode 100644 index a9e068a8..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.cxx +++ /dev/null @@ -1,507 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewColorImage3D.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkMatrix4x4.h" -#include "vtkTransform.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "vtkRenderWindow.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -vtkCxxRevisionMacro(vtkViewColorImage3D, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewColorImage3D); - - -//---------------------------------------------------------------------------- -class ColorImageActorCallback : public vtkCommand -{ -public: - static ColorImageActorCallback *New() { return new ColorImageActorCallback; } - - void Execute(vtkObject *caller, - unsigned long event, - void *vtkNotUsed(callData)) - { - if (!this->Actor) - return; - vtkImageActor* imagecaller = vtkImageActor::SafeDownCast (caller); - if (imagecaller && (event == vtkCommand::ModifiedEvent)) - { - this->Actor->SetInput(imagecaller->GetInput()); - this->Actor->SetInterpolate(imagecaller->GetInterpolate()); - this->Actor->SetDisplayExtent (imagecaller->GetDisplayExtent()); - } - } - vtkImageActor* Actor; - -}; - - - -//---------------------------------------------------------------------------- -vtkViewColorImage3D::vtkViewColorImage3D() -{ - this->VolumeProperty = vtkVolumeProperty::New(); - this->VolumeActor = vtkVolume::New(); - this->BoxWidget = vtkOrientedBoxWidget::New(); - this->Callback = vtkImage3DCroppingBoxCallback::New(); - this->PlaneWidget = vtkPlaneWidget::New(); - this->VolumeMapper3D = vtkVolumeTextureMapper3D::New(); - - this->Phantom.push_back( vtkImageActor::New() ); - this->Phantom.push_back( vtkImageActor::New() ); - this->Phantom.push_back( vtkImageActor::New() ); - - this->PhantomCallback.push_back( ColorImageActorCallback::New() ); - this->PhantomCallback.push_back( ColorImageActorCallback::New() ); - this->PhantomCallback.push_back( ColorImageActorCallback::New() ); - - this->BoundsActor.push_back( vtkActor::New() ); - this->BoundsActor.push_back( vtkActor::New() ); - this->BoundsActor.push_back( vtkActor::New() ); - - this->SetupVolumeRendering(); - this->SetupWidgets(); -} - -//---------------------------------------------------------------------------- -vtkViewColorImage3D::~vtkViewColorImage3D() -{ - // delete all vtk objetcts: - this->VolumeMapper3D->Delete(); - this->VolumeProperty->Delete(); - this->VolumeActor->Delete(); - this->BoxWidget->Delete(); - this->Callback->Delete(); - this->Cube->Delete(); - this->Marker->Delete(); - this->PlaneWidget->Delete(); - this->Phantom[0]->Delete(); - this->Phantom[1]->Delete(); - this->Phantom[2]->Delete(); - this->PhantomCallback[0]->Delete(); - this->PhantomCallback[1]->Delete(); - this->PhantomCallback[2]->Delete(); - this->BoundsActor[0]->Delete(); - this->BoundsActor[1]->Delete(); - this->BoundsActor[2]->Delete(); -} - - -//---------------------------------------------------------------------------- -void vtkViewColorImage3D::SetupVolumeRendering() -{ - vtkVolumeTextureMapper3D* texturemapper = - vtkVolumeTextureMapper3D::SafeDownCast ( this->VolumeActor->GetMapper() ); - if (texturemapper) - { - texturemapper->SetSampleDistance(0.5); - texturemapper->SetPreferredMethodToNVidia(); - } - - this->VolumeMapper3D->CroppingOn(); - this->VolumeMapper3D->SetCroppingRegionFlagsToSubVolume(); - this->VolumeMapper3D->SetCroppingRegionFlags (0x7ffdfff); - - // set up the vtk pipeline: volume rendering - this->VolumeActor->SetMapper ( this->VolumeMapper3D ); - this->VolumeActor->PickableOff(); - this->VolumeActor->DragableOff(); - this->VolumeActor->SetVisibility (0); - - // set up the boxwidget/ callback - this->Callback->SetVolumeMapper ( this->VolumeMapper3D ); - - this->Renderer->AddViewProp (this->VolumeActor); - -} - - -//---------------------------------------------------------------------------- -void vtkViewColorImage3D::SetupWidgets() -{ - - // Create an annotated cube actor (directions) - this->Cube = vtkAnnotatedCubeActor::New(); - this->Cube->SetXPlusFaceText ("L"); - this->Cube->SetXMinusFaceText ("R"); - this->Cube->SetYPlusFaceText ("P"); - this->Cube->SetYMinusFaceText ("A"); - this->Cube->SetZPlusFaceText ("D"); - this->Cube->SetZMinusFaceText ("V"); - this->Cube->SetZFaceTextRotation (90); - this->Cube->SetFaceTextScale (0.65); - this->Cube->GetCubeProperty()->SetColor (0.5, 1, 1); - this->Cube->GetTextEdgesProperty()->SetLineWidth (1); - this->Cube->GetTextEdgesProperty()->SetDiffuse (0); - this->Cube->GetTextEdgesProperty()->SetAmbient (1); - this->Cube->GetTextEdgesProperty()->SetColor (0.18, 0.28, 0.23); - -#if VTK_MAJOR_VERSION==5 && VTK_MINOR_VERSION>=1 - this->Cube->SetTextEdgesVisibility (1); - this->Cube->SetCubeVisibility(1); - this->Cube->SetFaceTextVisibility(1); -#else - this->Cube->TextEdgesOn (); - this->Cube->FaceTextOn(); - this->Cube->CubeOn(); -#endif - - this->Cube->GetXPlusFaceProperty()->SetColor (1, 0, 0); - this->Cube->GetXPlusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetXMinusFaceProperty()->SetColor (1, 0, 0); - this->Cube->GetXMinusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetYPlusFaceProperty()->SetColor (0, 1, 0); - this->Cube->GetYPlusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetYMinusFaceProperty()->SetColor (0, 1, 0); - this->Cube->GetYMinusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetZPlusFaceProperty()->SetColor (0, 0, 1); - this->Cube->GetZPlusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetZMinusFaceProperty()->SetColor (0, 0, 1); - this->Cube->GetZMinusFaceProperty()->SetInterpolationToFlat(); - - this->Marker = vtkOrientationMarkerWidget::New(); - this->Marker->SetOutlineColor (0.93, 0.57, 0.13); - this->Marker->SetOrientationMarker (this->Cube); - this->Marker->SetViewport (0.0, 0.05, 0.15, 0.15); - - this->BoxWidget->RotationEnabledOff(); - this->BoxWidget->SetPlaceFactor (0.5); - this->BoxWidget->SetKeyPressActivationValue ('b'); - this->BoxWidget->AddObserver (vtkCommand::InteractionEvent, this->Callback); - - this->PlaneWidget->SetKeyPressActivationValue ('p'); - this->PlaneWidget->NormalToZAxisOn(); - -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage3D::Render() -{ - - if (this->FirstRender) - { - // Initialize the size if not set yet - - vtkImageData *input = this->GetInput(); - if (this->RenderWindow->GetSize()[0] == 0 && input) - { - if (this->Renderer) - { - this->Renderer->ResetCamera(); - } - this->FirstRender = 0; - } - } - if (this->GetInput()) - { - this->RenderWindow->Render(); - } -} - - -void vtkViewColorImage3D::Add2DPhantom(const unsigned int& i, - vtkImageActor* input, - vtkPolyData* in_bounds ) -{ - if( i >= 3 ) - return; - - vtkRenderer* ren = this->GetRenderer(); - if( ren ) - { - this->Phantom[i]->SetInput (input->GetInput()); - this->Phantom[i]->SetDisplayExtent (input->GetDisplayExtent()); - this->Phantom[i]->SetUserMatrix (input->GetUserMatrix()); - this->PhantomCallback[i]->Actor = this->Phantom[i]; - input->AddObserver (vtkCommand::ModifiedEvent, this->PhantomCallback[i]); - ren->AddActor (this->Phantom[i]); - - /** - IMPORTANT NOTE - - Adding a 2D actor in the 3D scene should be as simple as the next line - instead of the code above... - - Unfortunately it does not seem to work properly. But this is something - we should investigate in because it would be much simpler - */ - // this->GetRenderer()->AddActor (input); - - if( in_bounds ) - { - vtkPolyDataMapper* bounds_mapper = vtkPolyDataMapper::New(); - bounds_mapper->SetInput( in_bounds ); - - this->BoundsActor[i]->SetMapper( bounds_mapper ); - this->BoundsActor[i]->GetProperty()->SetRepresentationToWireframe(); - this->BoundsActor[i]->GetProperty()->SetLineWidth( 2. ); - - ren->AddActor( this->BoundsActor[i] ); - bounds_mapper->Delete(); - } - - } - -} - -//---------------------------------------------------------------------------- -void vtkViewColorImage3D::InstallPipeline() -{ - if (this->RenderWindow && this->Renderer) - { - this->RenderWindow->AddRenderer(this->Renderer); - } - - if (this->Interactor) - { - - // init the interactor style: - vtkInteractorStyleSwitch* interactorStyle = vtkInteractorStyleSwitch::New(); - interactorStyle->SetCurrentStyleToTrackballCamera(); - this->Interactor->SetInteractorStyle (interactorStyle); - this->BoxWidget->SetInteractor ( this->Interactor ); - this->PlaneWidget->SetInteractor ( this->Interactor ); - this->Marker->SetInteractor ( this->Interactor ); - interactorStyle->Delete(); - this->Interactor->SetRenderWindow(this->RenderWindow); - - this->Marker->On(); - this->Marker->InteractiveOff (); - - } - -} - - -//---------------------------------------------------------------------------- -void vtkViewColorImage3D::SetInput(vtkImageData* image) -{ - this->Superclass::SetInput (image); - - if( !image ) - { - return; - } - - int* size = image->GetDimensions(); - - if ( (size[0] < 2) || - (size[1] < 2) || - (size[2] < 2) ) - { - vtkWarningMacro ( <<"Cannot do volume rendering for a single slice, skipping"<VolumeMapper3D->SetInput ( this->GetInput() ); - - this->SetupTextureMapper(); - - this->BoxWidget->SetInput (this->GetInput()); - this->BoxWidget->PlaceWidget(); - - this->PlaneWidget->SetInput (this->GetInput()); - this->PlaneWidget->PlaceWidget(); - - // line to be removed: the box has to be called externally - this->BoxWidget->On(); - - this->VolumeActor->SetVisibility (1); -} - - - -//---------------------------------------------------------------------------- -void vtkViewColorImage3D::SetOrientationMatrix (vtkMatrix4x4* matrix) -{ - this->Superclass::SetOrientationMatrix (matrix); - - this->VolumeActor->SetUserMatrix (matrix); - this->BoxWidget->SetOrientationMatrix (matrix); -// this->PlaneWidget->SetTransform (transform); -} - - - -//---------------------------------------------------------------------------- -void vtkViewColorImage3D::SetupTextureMapper() -{ - - if (!this->GetInput()) - return; - - vtkVolumeTextureMapper3D* mapper3D = - vtkVolumeTextureMapper3D::SafeDownCast( this->VolumeActor->GetMapper() ); - - if( mapper3D && !this->GetRenderWindow()->GetNeverRendered() ) - { - if( !mapper3D->IsRenderSupported ( this->VolumeProperty ) ) - { - //try the ATI fragment program implementation - mapper3D->SetPreferredMethodToFragmentProgram(); - if ( !mapper3D->IsRenderSupported ( this->VolumeProperty ) ) - { - vtkWarningMacro ( - <<"Warning: 3D Texture volume rendering is not supported by your" - <<" hardware, I switch to 2D Texture rendering."<CroppingOn(); - newMapper->SetCroppingRegionFlags (0x7ffdfff); - - - double* range = this->GetInput()->GetScalarRange(); - double shift = 0 - range[0]; - double scale = 65535.0/(range[1] - range[0]); - - vtkImageShiftScale* scaler = vtkImageShiftScale::New(); - scaler->SetInput (this->GetInput()); - scaler->SetShift (shift); - scaler->SetScale (scale); - scaler->SetOutputScalarTypeToUnsignedShort(); - scaler->Update(); - newMapper->SetInput ( scaler->GetOutput() ); - scaler->Delete(); - this->Callback->SetVolumeMapper (newMapper); - - mapper3D->Delete(); - this->VolumeMapper3D = newMapper; - this->VolumeActor->SetMapper ( this->VolumeMapper3D ); - } - } - } -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.h deleted file mode 100644 index 66971928..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewColorImage3D.h +++ /dev/null @@ -1,300 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewColorImage3D_h_ -#define _vtkViewColorImage3D_h_ - -#include "vtkViewColorImage.h" - -#include -#include -#include -#include -#include -#include -#include "vtkImage3DCroppingBoxCallback.h" -#include - -#include - -class vtkVolumeTextureMapper3D; -class vtkVolumeMapper; -class vtkPiecewiseFunction; -class vtkVolume; -class vtkImageActor; -class vtkAxes; -class vtkDataSet3DCroppingPlaneCallback; -class vtkTubeFilter; -class vtkAnnotatedCubeActor; -class vtkOrientationMarkerWidget; -class vtkAxesActor; -class vtkImageBlend; -class vtkViewColorImage2D; - - -/** - -*/ - -class ColorImageActorCallback; - -class vtkViewColorImage3D : public vtkViewColorImage -{ - - public: - - static vtkViewColorImage3D* New(); - vtkTypeRevisionMacro(vtkViewColorImage3D, vtkViewColorImage); - - // Description: - // Render the resulting image. - virtual void Render(void); - - /** - Add a dataset to the view (has to be subclass of vtkPointSet). - The dataset will be cut through the implicit slice plane - (GetImplicitSlicePlane()). - - This results in a loss of dimensionality, i.e. tetrahedron will be displayed - as triangles, triangles as lines, lines as points. - A vtkProperty of the dataset can be specified. - */ - virtual void AddDataSet (vtkDataSet* dataset, - vtkProperty* property = NULL, - const bool& intersection = true ) {}; - /** - Set/Get the current slice to display (depending on the orientation - this can be in X, Y or Z). - */ - virtual void SetSlice(int s){}; - virtual void SetSliceOrientation(int orientation){}; - // Description: - // Update the display extent manually so that the proper slice for the - // given orientation is displayed. It will also try to set a - // reasonable camera clipping range. - // This method is called automatically when the Input is changed, but - // most of the time the input of this class is likely to remain the same, - // i.e. connected to the output of a filter, or an image reader. When the - // input of this filter or reader itself is changed, an error message might - // be displayed since the current display extent is probably outside - // the new whole extent. Calling this method will ensure that the display - // extent is reset properly. - virtual void UpdateDisplayExtent(){}; - - virtual void Add2DPhantom( - const unsigned int& i, - vtkImageActor* input, - vtkPolyData* in_bounds = NULL ); - - virtual void SetInput (vtkImageData* input); - - virtual void SetOrientationMatrix (vtkMatrix4x4* matrix); - - void SetVolumeRenderingOff() - { - this->VolumeActor->SetVisibility (false); - this->BoxWidget->Off(); - } - - void SetVolumeRenderingOn() - { - this->VolumeActor->SetVisibility(true); - } - - void SetTriPlanarRenderingOn() - { - this->VolumeActor->SetVisibility(false); - for( int i = 0; i < 3; i++ ) - { - this->Phantom[i]->SetVisibility(true); - this->BoundsActor[i]->SetVisibility(true); - } - } - - void SetTriPlanarRenderingOff() - { - this->VolumeActor->SetVisibility(true); - for( int i = 0; i < 3; i++ ) - { - this->Phantom[i]->SetVisibility(false); - this->BoundsActor[i]->SetVisibility(false); - } - } - - void SetVolumeMapperToTexture (void) - { - this->VolumeActor->SetMapper ( this->VolumeMapper3D ); - this->Callback->SetVolumeMapper ( this->VolumeMapper3D ); - } - - void SetVolumeMapperToRayCast (void) - { - } - - void SetVolumeRayCastFunctionToComposite (void) - { - } - - - void SetVolumeRayCastFunctionToMIP (void) - { - } - - - void SetVolumeRayCastFunctionToIsosurface (void) - { - } - - /** Set the box widget visibility */ - void SetBoxWidgetVisibility (int a) - { - if (this->Interactor) - this->BoxWidget->SetEnabled (a); - } - bool GetBoxWidgetVisibility (void) - { - return ( this->BoxWidget->GetEnabled() == 1 ); - } - vtkBooleanMacro (BoxWidgetVisibility, int); - - /** Set the plane widget on */ - void SetPlaneWidgetVisibility (int a) - { - if (this->Interactor) - this->PlaneWidget->SetEnabled (a); - } - bool GetPlaneWidgetVisibility (void) - { - return ( this->PlaneWidget->GetEnabled() == 1 ); - } - vtkBooleanMacro (PlaneWidgetVisibility, int); - - /** Set the cube widget on */ - void SetCubeVisibility (int a) - { - if (this->Interactor) - this->Marker->SetEnabled (a); - } - bool GetCubeVisibility (void) - { - return ( this->Marker->GetEnabled() == 1 ); - } - vtkBooleanMacro (CubeVisibility, int); - - void SetShade (int a) - { - this->VolumeProperty->SetShade (a); - } - bool GetShade (void) - { - return ( this->VolumeProperty->GetShade() == 1 ); - } - vtkBooleanMacro (Shade, int); - - /** Get volume actor */ - vtkGetObjectMacro (VolumeActor, vtkVolume); - vtkGetObjectMacro (PlaneWidget, vtkPlaneWidget); - vtkGetObjectMacro (VolumeProperty, vtkVolumeProperty); - vtkGetObjectMacro (BoxWidget, vtkOrientedBoxWidget); - - protected: - - vtkViewColorImage3D(); - ~vtkViewColorImage3D(); - - // Description: - virtual void InstallPipeline(); - virtual void UpdateOrientation(){} - - virtual void SetupVolumeRendering(); - virtual void SetupWidgets(); - virtual void SetupTextureMapper(); - - // texture mapper in 3D - vtkVolumeMapper* VolumeMapper3D; - // volume property - vtkVolumeProperty* VolumeProperty; - // volume actor - vtkVolume* VolumeActor; - // image 3D cropping box callback - vtkImage3DCroppingBoxCallback* Callback; - - std::vector< vtkImageActor* > Phantom; - std::vector< ColorImageActorCallback* > PhantomCallback; - std::vector< vtkActor* > BoundsActor; - - // box widget - vtkOrientedBoxWidget* BoxWidget; - // vtkPlane widget - vtkPlaneWidget* PlaneWidget; - // annotated cube actor - vtkAnnotatedCubeActor* Cube; - vtkOrientationMarkerWidget* Marker; - -}; - -#endif /* _vtkViewColorImage3D_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.cxx deleted file mode 100644 index f2f3f66f..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.cxx +++ /dev/null @@ -1,383 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewImage.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkImageMapToWindowLevelColors.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkMatrix4x4.h" -#include "vtkScalarBarActor.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkLookupTable.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" -#include "vtkInteractorStyleImage.h" - -#include -#include - -vtkCxxRevisionMacro(vtkViewImage, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewImage); - -//---------------------------------------------------------------------------- -vtkViewImage::vtkViewImage() -{ - this->OrientationMatrix = vtkMatrix4x4::New(); - this->OrientationAnnotation = vtkOrientationAnnotation::New(); - this->CornerAnnotation = vtkCornerAnnotation::New(); - this->TextProperty = vtkTextProperty::New(); - this->LookupTable = vtkLookupTable::New(); - this->ScalarBarActor = vtkScalarBarActor::New(); - this->Prop3DCollection = vtkProp3DCollection::New(); - this->DataSetCollection = vtkDataSetCollection::New(); - this->OrientationTransform = vtkMatrixToLinearTransform::New(); - - this->MaskImage = 0; - - this->OrientationMatrix->Identity(); - this->CornerAnnotation->SetNonlinearFontScaleFactor (0.22); - this->CornerAnnotation->SetTextProperty ( this->TextProperty ); - this->OrientationAnnotation->SetNonlinearFontScaleFactor (0.25); - this->OrientationAnnotation->SetTextProperty ( this->TextProperty ); - this->ScalarBarActor->GetLabelTextProperty()->BoldOff(); - this->ScalarBarActor->GetLabelTextProperty()->ItalicOff(); - this->ScalarBarActor->SetNumberOfLabels (3); - this->ScalarBarActor->SetWidth (0.1); - this->ScalarBarActor->SetHeight (0.5); - this->ScalarBarActor->SetPosition (0.9,0.3); - this->LookupTable->SetTableRange (0, 1); - this->LookupTable->SetSaturationRange (0, 0); - this->LookupTable->SetHueRange (0, 0); - this->LookupTable->SetValueRange (0, 1); - this->LookupTable->Build(); - - this->ShowAnnotations = true; - this->ShowScalarBar = false; - - this->OrientationTransform->SetInput (this->OrientationMatrix); - - //this->WindowLevel->SetLookupTable (this->LookupTable); - this->ScalarBarActor->SetLookupTable (this->LookupTable); - - this->Renderer->AddViewProp ( this->CornerAnnotation ); - this->Renderer->AddViewProp ( this->OrientationAnnotation ); - - this->Renderer->AddViewProp ( this->ScalarBarActor ); -} - -//---------------------------------------------------------------------------- -vtkViewImage::~vtkViewImage() -{ - this->OrientationMatrix->Delete(); - this->OrientationAnnotation->Delete(); - this->CornerAnnotation->Delete(); - this->LookupTable->Delete(); - this->ScalarBarActor->Delete(); - this->Prop3DCollection->Delete(); - this->DataSetCollection->Delete(); - this->OrientationTransform->Delete(); - this->TextProperty->Delete(); -} - - -//---------------------------------------------------------------------------- -void vtkViewImage::SetOrientationMatrix (vtkMatrix4x4* matrix) -{ - vtkSetObjectMacro2Body (OrientationMatrix, vtkMatrix4x4, matrix); - this->ImageActor->SetUserMatrix (this->OrientationMatrix); - this->OrientationTransform->SetInput (this->OrientationMatrix); - - this->UpdateOrientation(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage::SetLookupTable (vtkLookupTable* lookuptable) -{ - vtkSetObjectMacro2Body (LookupTable, vtkLookupTable, lookuptable); - this->WindowLevel->SetLookupTable (this->LookupTable); - this->ScalarBarActor->SetLookupTable (this->LookupTable); -} - -//---------------------------------------------------------------------------- -void vtkViewImage::SetTextProperty (vtkTextProperty* textproperty) -{ - vtkSetObjectMacro2Body (TextProperty, vtkTextProperty, textproperty); - this->CornerAnnotation->SetTextProperty (this->TextProperty); -} - -//---------------------------------------------------------------------------- -void vtkViewImage::SetColorWindow(double s) -{ - if (s<0) - s = 1.0; - - this->Superclass::SetColorWindow(s); - double v_min = this->GetColorLevel() - 0.5*s; - double v_max = this->GetColorLevel() + 0.5*s; - this->GetLookupTable()->SetRange (v_min, v_max); - -} - -//---------------------------------------------------------------------------- -void vtkViewImage::SetColorLevel(double s) -{ - this->Superclass::SetColorLevel(s); - double v_min = s - 0.5*this->GetColorWindow(); - double v_max = s + 0.5*this->GetColorWindow(); - this->GetLookupTable()->SetRange (v_min, v_max); - -} - - -//---------------------------------------------------------------------------- -double vtkViewImage::GetValueAtPosition(double worldcoordinates[3], - int component ) -{ - if (!this->GetInput()) - return 0.0; - - int* indices = this->GetImageCoordinatesFromWorldCoordinates (worldcoordinates); - int* extent = this->GetInput()->GetWholeExtent(); - if ( (indices[0] < extent[0]) || (indices[0] > extent[1]) || - (indices[1] < extent[2]) || (indices[1] > extent[3]) || - (indices[2] < extent[4]) || (indices[2] > extent[5]) ) - return 0; - else - return this->GetInput()->GetScalarComponentAsDouble (indices[0], indices[1], - indices[2], component); -} - - -//---------------------------------------------------------------------------- -bool vtkViewImage::RemoveDataSet (vtkDataSet* dataset) -{ - unsigned int index = this->DataSetCollection->IsItemPresent (dataset); - if (!index) - return false; - this->Renderer->RemoveViewProp ( - vtkProp::SafeDownCast (this->Prop3DCollection->GetItemAsObject (index))); - this->DataSetCollection->RemoveItem (index); - this->Prop3DCollection->RemoveItem (index); - - return true; -} - -//---------------------------------------------------------------------------- -double* vtkViewImage::GetWorldCoordinatesFromImageCoordinates(int indices[3]) -{ - if (!this->GetInput()) - { - double* nullpos = new double[3]; - nullpos[0] = 0; nullpos[1] = 0; nullpos[2] = 0; - return nullpos; - } - - // Get information - double* spacing = this->GetInput()->GetSpacing(); - double* origin = this->GetInput()->GetOrigin(); - - double unorientedposition[4]; - for (unsigned int i=0; i<3; i++) - unorientedposition[i] = origin[i] + spacing[i]*indices[i]; - unorientedposition[3] = 1; - - // apply orientation matrix - double* position = new double[4]; - this->GetOrientationMatrix()->MultiplyPoint (unorientedposition, position); - return position; -} - -//---------------------------------------------------------------------------- -int* vtkViewImage::GetImageCoordinatesFromWorldCoordinates(double position[3]) -{ - if (!this->GetInput()) - { - int* nullpos = new int[3]; - nullpos[0] = 0; nullpos[1] = 0; nullpos[2] = 0; - return nullpos; - } - - // Get information - double unorientedposition[4] = {position[0], position[1], position[2], 1}; - double spacing[4] = {this->GetInput()->GetSpacing()[0], - this->GetInput()->GetSpacing()[1], - this->GetInput()->GetSpacing()[2], - 0}; - double origin[4] = {this->GetInput()->GetOrigin()[0], - this->GetInput()->GetOrigin()[1], - this->GetInput ()->GetOrigin()[2], - 1}; - - // apply inverted orientation matrix to the world-coordinate position - vtkMatrix4x4* inverse = vtkMatrix4x4::New(); - vtkMatrix4x4::Invert (this->GetOrientationMatrix(), inverse); - inverse->MultiplyPoint (unorientedposition, unorientedposition); - - int* indices = new int[3]; - for (unsigned int i=0; i<3;i++) - { - if (fabs (spacing[i]) > 1e-5) - indices[i] = vtkMath::Round((unorientedposition[i]-origin[i])/spacing[i]); - else - indices[i] = 0; - } - inverse->Delete(); - - return indices; -} - -//---------------------------------------------------------------------------- -void vtkViewImage::SetBackground(double rgb[3]) -{ - if (this->Renderer) - this->Renderer->SetBackground(rgb); -} -//---------------------------------------------------------------------------- -void vtkViewImage::SetBackground(double r, double g, double b) -{ - if (this->Renderer) - this->Renderer->SetBackground(r,g,b); -} - -//---------------------------------------------------------------------------- -double* vtkViewImage::GetBackground() -{ - if (this->Renderer) - return this->Renderer->GetBackground(); - return NULL; -} - -//---------------------------------------------------------------------------- -void vtkViewImage::ResetCamera (void) -{ - if (this->Renderer) - this->Renderer->ResetCamera(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage::Reset (void) -{ - this->ResetCamera(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage::Enable (void) -{ - this->Interactor->Enable(); -} -//---------------------------------------------------------------------------- -void vtkViewImage::Disable (void) -{ - this->Interactor->Disable(); -} -//---------------------------------------------------------------------------- -int vtkViewImage::GetEnabled (void) -{ - return this->Interactor->GetEnabled(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage::SetShowAnnotations (int val) -{ - this->ShowAnnotations = val; - this->CornerAnnotation->SetVisibility (val); - this->OrientationAnnotation->SetVisibility (val); -} -//---------------------------------------------------------------------------- -void vtkViewImage::SetShowScalarBar (int val) -{ - this->ShowScalarBar = val; - this->ScalarBarActor->SetVisibility (val); -} - -vtkRenderWindowInteractor* vtkViewImage::GetRenderWindowInteractor() -{ - return this->GetRenderWindow()->GetInteractor(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.h deleted file mode 100644 index bf7a32fe..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage.h +++ /dev/null @@ -1,340 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewImage_h_ -#define _vtkViewImage_h_ - -#include "vtkImageViewer2.h" - -/** - This macro can be useful as we frequently set - an instance this way, meaning unregistering previously set instance, - registering given instance, and call a modified event. - However this might be not the best place to define it... -*/ -//BTX -#define vtkSetObjectMacro2Body(object, type, _arg)\ - if (this->object == _arg) \ - return; \ - if (this->object) \ - { \ - this->object->UnRegister(this); \ - } \ - this->object = _arg; \ - \ - if (this->object != NULL) \ - { \ - this->object->Register(this); \ - } \ - \ - this->Modified(); \ -//ETX - -/** - This macro can be useful as we frequently set - an instance this way, meaning unregistering previously set instance, - registering given instance, and call a modified event. - However this might be not the best place to define it... -*/ -//BTX -#define vtkSetObjectMacro2(object, type) \ - virtual void Set##object (type* _arg) \ - { \ - vtkSetObjectMacro2Body (object, type, _arg);\ - } \ - -//ETX - - -class vtkMatrix4x4; -class vtkScalarBarActor; -class vtkLookupTable; -class vtkTextProperty; -class vtkCornerAnnotation; -class vtkOrientationAnnotation; -class vtkActor; -class vtkDataSet; -class vtkPolyData; -class vtkProperty; -class vtkProp3DCollection; -class vtkDataSetCollection; -class vtkMatrixToLinearTransform; - -/** - -*/ - - -class vtkViewImage : public vtkImageViewer2 -{ - - public: - - static vtkViewImage* New(); - vtkTypeRevisionMacro(vtkViewImage, vtkImageViewer2); - - /** - Get the orientation annotation. This annotation describes the orientation - of the slice plane, according to the rule - Right(R)-Left(L) Anterior(A)-Posterior(P) Inferior(I)-Superior(S) - */ - vtkGetObjectMacro (OrientationAnnotation, vtkOrientationAnnotation); - /** - Get the corner annotation. - */ - ///\todo make the corner annotation such that it follows the slice number, the - ///image scalar value at cursor, the spacing, etc - vtkGetObjectMacro (CornerAnnotation, vtkCornerAnnotation); - /** - Get the scalar bar actor. This instance follows the color window/level - of the viewer. - */ - ///\todo make this scalar bar actually follow the WindowLevel filter. It does - /// not seems to work yet - vtkGetObjectMacro (ScalarBarActor, vtkScalarBarActor); - /** - The OrientationMatrix instance (GetOrientationMatrix()) is a very important - added feature of this viewer. It describes the rotation and translation to - apply to the image bouding box (axis aligned) to the world coordinate - system. - - Rotation part is usually given by the GetDirection() method on an itk::Image - for instance. Translation usually correspond to the origin of the image - given by GetOrigin() on an itk::Image. - - CAUTION: if you provide non-zero origin to the viewer vtkImageData input - (SetInput()), then don't provide translation to the OrientationMatrix - instance, otherwise the information is redundant. - - The best behaviour is to force the origin of the vtkImageData input to zero - and provide this origin information in the OrientationMatrix. - - */ - vtkGetObjectMacro (OrientationMatrix, vtkMatrix4x4); - virtual void SetOrientationMatrix (vtkMatrix4x4* matrix); - /** - The LookupTable instance (GetLookupTable()) can be used to set a - user-defined color-table to the viewer. Default is a linear black to - white table. - */ - vtkGetObjectMacro (LookupTable, vtkLookupTable); - virtual void SetLookupTable (vtkLookupTable* lookuptable); - /** - The TextProperty instance (GetTextProperty()) describes the font and - other settings of the CornerAnnotation instance (GetCornerAnnotation()) - */ - vtkGetObjectMacro (TextProperty, vtkTextProperty); - virtual void SetTextProperty (vtkTextProperty* textproperty); - /** - The wolld is not always what we think it is ... - - Use this method to move the viewer slice such that the position - (in world coordinates) given by the arguments is contained by - the slice plane. If the given position is outside the bounds - of the image, then the slice will be as close as possible. - */ - virtual void SetWorldCoordinates (double x, double y, double z) - { - double pos[3] = {x,y,z}; - this->SetWorldCoordinates (pos); - } - virtual void SetWorldCoordinates (double pos[3]){}; - - /** - Add a dataset to the view (has to be subclass of vtkPointSet). - The dataset will be cut through the implicit slice plane - (GetImplicitSlicePlane()). - - This results in a loss of dimensionality, i.e. tetrahedron will be displayed - as triangles, triangles as lines, lines as points. - A vtkProperty of the dataset can be specified. - */ - virtual void AddDataSet (vtkDataSet* dataset, - vtkProperty* property = NULL, - const bool& intersection = true ) {}; - virtual bool RemoveDataSet (vtkDataSet* dataset); - - /** - Set/Get the current slice to display (depending on the orientation - this can be in X, Y or Z). - */ - virtual void SetSlice(int s) - { this->Superclass::SetSlice (s); }; - - /** - Convert an indices coordinate point (image coordinates) into a world - coordinate point - */ - virtual double* GetWorldCoordinatesFromImageCoordinates (int indices[3]); - /** - Convert a world coordinate point into an image indices coordinate point - */ - virtual int* GetImageCoordinatesFromWorldCoordinates (double position[3]); - /** - Get the pixel value at a given world coordinate point in space, return - zero if out of bounds. - */ - virtual double GetValueAtPosition(double worldcoordinates[3], - int component=0 ); - /** - Set the background color. Format is RGB, 0 <= R,G,B <=1 - Example: SetBackground(0.9,0.9,0.9) for grey-white. - */ - virtual void SetBackground(double rgb[3]); - virtual void SetBackground(double r, double g, double b); - virtual double* GetBackground(void); - /** - Reset the camera - */ - virtual void ResetCamera(void); - /** - Reset position - zoom - window/level to default - */ - virtual void Reset(void); - /** - Show/Hide the annotations. - */ - vtkGetMacro (ShowAnnotations, int); - /** - Show/Hide the annotations. - */ - virtual void SetShowAnnotations (int); - /** - Show/Hide the annotations. - */ - vtkBooleanMacro (ShowAnnotations, int); - /** - Enable or Disable interaction on the view. - */ - virtual void Enable (void); - /** - Enable or Disable interaction on the view. - */ - virtual void Disable (void); - /** - Enable or Disable interaction on the view. - */ - virtual int GetEnabled (void); - /** - Show/Hide the annotations. - */ - vtkGetMacro (ShowScalarBar, int); - /** - Show/Hide the annotations. - */ - virtual void SetShowScalarBar (int); - /** - Show/Hide the annotations. - */ - vtkBooleanMacro (ShowScalarBar, int); - // Description: - // Set window and level for mapping pixels to colors. - virtual void SetColorWindow(double s); - virtual void SetColorLevel(double s); - - /** - Set a mask image and its corresponding LookupTable. The mask image will - be overlapped to the current image, and the lookup table is used to assess - the color of the label: label 0 will have color given by entry 0 of the LUT, - etc. - The image has to be of type unsigned char. - */ - virtual void SetMaskImage( vtkImageData* mask, vtkLookupTable* lut ) - { - this->MaskImage = mask; - this->MaskLUT = lut; - } - vtkGetObjectMacro( MaskImage, vtkImageData ); - vtkGetObjectMacro( MaskLUT, vtkLookupTable ); - - virtual vtkRenderWindowInteractor* GetRenderWindowInteractor(); - - protected: - - vtkViewImage(); - ~vtkViewImage(); - - // Description: - vtkMatrix4x4* OrientationMatrix; - vtkCornerAnnotation* CornerAnnotation; - vtkOrientationAnnotation* OrientationAnnotation; - vtkTextProperty* TextProperty; - vtkLookupTable* LookupTable; - vtkScalarBarActor* ScalarBarActor; - vtkProp3DCollection* Prop3DCollection; - vtkDataSetCollection* DataSetCollection; - vtkMatrixToLinearTransform* OrientationTransform; - - vtkImageData* MaskImage; - vtkLookupTable* MaskLUT; - - int ShowAnnotations; - int ShowScalarBar; - -}; - -#endif /* _vtkViewImage_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.cxx deleted file mode 100644 index 7546a0cf..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.cxx +++ /dev/null @@ -1,891 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewImage2D.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkImageMapToWindowLevelColors.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkMatrix4x4.h" -#include "vtkTransform.h" -#include "vtkScalarBarActor.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkLookupTable.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkClipPolyData.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" -#include "vtkInteractorStyleImage2D.h" -#include "vtkViewImage2DCommand.h" -#include "vtkImageBlendWithMask.h" - -#include -#include - -vtkCxxRevisionMacro(vtkViewImage2D, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewImage2D); - -//---------------------------------------------------------------------------- -vtkViewImage2D::vtkViewImage2D() -{ - this->ConventionMatrix = vtkMatrix4x4::New(); - this->SliceImplicitPlane = vtkPlane::New(); - this->AdjustmentTransform = vtkTransform::New(); - this->SlicePlane = vtkPolyData::New(); - this->Command = vtkViewImage2DCommand::New(); - - this->Command->SetViewer( this); - - this->AdjustmentTransform->Identity(); - this->SliceImplicitPlane->SetOrigin( 0,0,0); - this->SliceImplicitPlane->SetNormal( 0,0,1); - - this->ViewConvention = vtkViewImage2D::VIEW_CONVENTION_RADIOLOGICAL; - this->ViewOrientation = vtkViewImage2D::VIEW_ORIENTATION_AXIAL; - - this->ConventionMatrix->Zero(); - this->ConventionMatrix->SetElement( 2,0, 1); - this->ConventionMatrix->SetElement( 2,1, 1); - this->ConventionMatrix->SetElement( 1,2, -1); - this->ConventionMatrix->SetElement( 0,3, 1); - this->ConventionMatrix->SetElement( 1,3, -1); - this->ConventionMatrix->SetElement( 2,3, -1); - - this->MaskFilter = vtkImageBlendWithMask::New(); - - this->InitializeSlicePlane(); - this->Zoom = 1.; -} - -//---------------------------------------------------------------------------- -vtkViewImage2D::~vtkViewImage2D() -{ - this->ConventionMatrix->Delete(); - this->SliceImplicitPlane->Delete(); - this->SlicePlane->Delete(); - this->AdjustmentTransform->Delete(); - this->MaskFilter->Delete(); - this->Command->Delete(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetViewConvention(int convention) -{ - if( ( convention < vtkViewImage2D::VIEW_CONVENTION_RADIOLOGICAL) || - convention == this->ViewConvention) - return; - - this->ViewConvention = convention; - - this->ConventionMatrix->SetElement( 2,0, 1); - this->ConventionMatrix->SetElement( 2,1, 1); - this->ConventionMatrix->SetElement( 1,2, -1); - - int x_watcher, y_watcher, z_watcher; - - switch(convention) - { - case vtkViewImage2D::VIEW_CONVENTION_RADIOLOGICAL: - default: - x_watcher = 1; - y_watcher = -1; - z_watcher = -1; - break; - case vtkViewImage2D::VIEW_CONVENTION_NEUROLOGICAL: - x_watcher = 1; - y_watcher = 1; - z_watcher = 1; - break; - ///\todo why not adding cardiologic conventions with oblique points of view ? - /// actually we can't: oblique point of view implies resampling data: loss of - /// data... and we don't want that, do we ? - } - this->ConventionMatrix->SetElement( 0,3, x_watcher); - this->ConventionMatrix->SetElement( 1,3, y_watcher); - this->ConventionMatrix->SetElement( 2,3, z_watcher); - - this->UpdateOrientation(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetViewOrientation(int orientation) -{ - ///\todo: in terms of view orientation here we can add some cardiac specific: - /// short axis, long axis, and 4-chambers !!! exiting ! - if( ( orientation < vtkViewImage2D::VIEW_ORIENTATION_SAGITTAL) || - orientation == this->ViewOrientation) - return; - - this->ViewOrientation = orientation; - unsigned int sliceorientation = 2; - double dot = 0; - for( unsigned int i=0; i<3; i++) - if( dot < fabs( this->GetOrientationMatrix()->GetElement( orientation, i))) - { - dot = fabs( this->GetOrientationMatrix()->GetElement( orientation, i)); - sliceorientation = i; - } - this->SetSliceOrientation( sliceorientation); -} -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetOrientationMatrix( vtkMatrix4x4* matrix) -{ - this->Superclass::SetOrientationMatrix( matrix); - this->UpdateOrientation(); -} - - - -//---------------------------------------------------------------------------- -void vtkViewImage2D::InitializeSlicePlane(void) -{ - vtkPoints* points = vtkPoints::New(); - this->SlicePlane->SetPoints( points); - points->InsertNextPoint( 0, 0, 0); - points->InsertNextPoint( 1, 0, 0); - points->InsertNextPoint( 0, 1, 0); - points->InsertNextPoint( 1, 1, 0); - this->SlicePlane->Allocate( 4); - - vtkIdType pts[4]; - pts[0] = 0; pts[1] = 1; pts[2] = 3; pts[3] = 2; - this->SlicePlane->InsertNextCell( VTK_QUAD, 4, pts); - pts[0] = 0; pts[1] = 2; pts[2] = 3; pts[3] = 1; - this->SlicePlane->InsertNextCell( VTK_QUAD, 4, pts); - points->Delete(); - - vtkUnsignedCharArray* array = vtkUnsignedCharArray::New(); - array->SetName( "Colors"); - array->SetNumberOfComponents( 3); - unsigned char vals[3]; - vals[0] = 255; vals[1] = 0; vals[2] = 0; - array->InsertNextTupleValue( vals); - array->InsertNextTupleValue( vals); - array->InsertNextTupleValue( vals); - array->InsertNextTupleValue( vals); - - this->SlicePlane->GetPointData()->SetScalars( array); - array->Delete(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::UpdateOrientation() -{ - this->Superclass::UpdateOrientation(); - int axis = this->SetCameraToConvention(); - this->ViewOrientation = axis; - - this->SetAnnotationToConvention(); - this->SetSlicePlaneToConvention( axis); - this->UpdateSlicePlane(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetWorldCoordinates(double pos[3]) -{ - this->SetSlice( this->GetSliceForWorldCoordinates( pos)); -} - -//---------------------------------------------------------------------------- -int vtkViewImage2D::SetCameraToConvention(void) -{ - - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam) - return -1; - - double position[4], focalpoint[4], viewup[4]; - double conventionposition[4]; - double conventionview[4]; - double focaltoposition[3]; - std::vector viewupchoices; - double first[3], second[3], third[3], fourth[3]; - bool inverseposition; - - // First recover information from the camera. - // Recover also information from the convention matrix - unsigned int i; - for( i=0; i<3; i++ ) - { - position[i] = cam->GetPosition()[i]; - focalpoint[i] = cam->GetFocalPoint()[i]; - conventionposition[i] = this->ConventionMatrix->GetElement( i,3); - conventionview[i] = this->ConventionMatrix->GetElement( i, - this->SliceOrientation ); - } - - position[3] = 1; - focalpoint[3] = 1; - conventionview[3] = 0; - viewup[3] = 0; - - // Apply the orientation matrix to all this information - this->GetOrientationMatrix()->MultiplyPoint( position, position ); - this->GetOrientationMatrix()->MultiplyPoint( focalpoint, focalpoint ); - this->GetOrientationMatrix()->MultiplyPoint( conventionview, conventionview ); - this->GetOrientationMatrix()->MultiplyPoint( conventionposition, - conventionposition ); - - // Compute the vector perpendicular to the view - for( i=0; i<3; i++ ) - focaltoposition[i] = position[i] - focalpoint[i]; - - // Deal with the position : - // invert it if necessary( symetry among the focal point) - inverseposition =( vtkMath::Dot( focaltoposition, conventionposition ) < 0 ); - if( inverseposition) - for( i=0; i<3; i++ ) - position[i] -= 2*focaltoposition[i]; - - // Now we now we have 4 choices for the View-Up information - for( i=0; i<3; i++ ) - { - first[i] = conventionview[i]; - second[i] = -conventionview[i]; - } - - vtkMath::Cross( first, focaltoposition, third ); - vtkMath::Cross( second, focaltoposition, fourth ); - vtkMath::Normalize( third ); - vtkMath::Normalize( fourth ); - - viewupchoices.push_back( first ); - viewupchoices.push_back( second ); - viewupchoices.push_back( third ); - viewupchoices.push_back( fourth ); - - // To choose between these choices, first we find the axis - // the closest to the focaltoposition vector - unsigned int id = 0; - double dot = 0; - for( i=0; i<3; i++ ) - { - if( dot < fabs( focaltoposition[i] ) ) - { - dot = fabs( focaltoposition[i] ); - id = i; - } - } - - // Then we choose the convention matrix vector correspondant to the - // one we just found - for( i=0; i<3; i++ ) - conventionview[i] = this->ConventionMatrix->GetElement( i, id ); - - // Then we pick from the 4 solutions the closest to the - // vector just found - unsigned int id2 = 0; - double dot2 = 0; - for( i=0; iSetPosition(position[0], position[1], position[2]); - cam->SetFocalPoint(focalpoint[0], focalpoint[1], focalpoint[2]); - cam->SetViewUp(viewup[0], viewup[1], viewup[2]); - - this->SliceImplicitPlane->SetNormal( focaltoposition ); - - double view_plane_normal[3]; - cam->GetViewPlaneNormal( view_plane_normal ); - - // Rotation of the( Anterior-Posterior)( Ventral-Dorsal) View - if( this->ViewOrientation == 0 ) - cam->Roll( -90. ); - - // these lines are meant to fix the bug that make the line - // actor appear behind the 2D scene... - double translation[3]; - for( i=0; i<3; i++ ) - translation[i] = 0.01 * view_plane_normal[i]; - this->AdjustmentTransform->Identity(); - this->AdjustmentTransform->Translate( translation); - - return id; -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetAnnotationToConvention(void) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam) - return; - - std::string matrix[3][2]; - matrix[0][0] = "R";matrix[0][1] = "L"; - matrix[1][0] = "A";matrix[1][1] = "P"; - matrix[2][0] = "V";matrix[2][1] = "D"; - - std::string solution[4]; - - ///\todo surely there is a simpler way to do all of that ! - - double* viewup = cam->GetViewUp(); - double* normal = cam->GetViewPlaneNormal(); - double rightvector[3]; - vtkMath::Cross( normal, viewup, rightvector); - - unsigned int id1 = 0; - unsigned int id2 = 0; - unsigned int id3 = 0; - double dot1 = 0; - double dot2 = 0; - double dot3 = 0; - - for( unsigned int i=0; i<3; i++) - { - if( dot1 <= fabs( viewup[i])) - { - dot1 = fabs( viewup[i]); - id1 = i; - } - if( dot2 <= fabs( rightvector[i])) - { - dot2 = fabs( rightvector[i]); - id2 = i; - } - if( dot3 <= fabs( normal[i])) - { - dot3 = fabs( normal[i]); - id3 = i; - } - } - - if( viewup[id1] > 0) - { - solution[3] = matrix[id1][0]; - solution[1] = matrix[id1][1]; - } else { - solution[3] = matrix[id1][1]; - solution[1] = matrix[id1][0]; - } - if( rightvector[id2] > 0) - { - solution[0] = matrix[id2][0]; - solution[2] = matrix[id2][1]; - } else { - solution[0] = matrix[id2][1]; - solution[2] = matrix[id2][0]; - } - - for( unsigned int i=0; i<4; i++) - this->OrientationAnnotation->SetText( i, solution[i].c_str()); -} - - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetSlicePlaneToConvention(unsigned int axis) -{ - unsigned char vals[3] = {0,0,0}; - vals[axis] = 255; - - vtkUnsignedCharArray* array = vtkUnsignedCharArray::SafeDownCast( - this->SlicePlane->GetPointData()->GetScalars() ); - - if( !array) - return; - - array->SetTupleValue( 0, vals); - array->SetTupleValue( 1, vals); - array->SetTupleValue( 2, vals); - array->SetTupleValue( 3, vals); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetSlice( int s) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam) - return; - int *range = this->GetSliceRange(); - if( range &&( s >= range[0]) &&( s <= range[1]) ) - { - double* pos = this->GetWorldCoordinatesForSlice( s); - this->SliceImplicitPlane->SetOrigin( pos); - this->Superclass::SetSlice(s); - this->UpdateSlicePlane(); - } - else - this->Superclass::SetSlice(s); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::UpdateSlicePlane( void) -{ - vtkPoints* oldpoints = vtkPoints::New(); - vtkPoints* points = vtkPoints::New(); - double x[3]; - double* bounds = this->ImageActor->GetDisplayBounds( ); - unsigned int added1; - unsigned int added2; - - for( unsigned int i=0; i<4; i++) - { - added1 =( !(i%2)) ? 1 : 0; - added2 =( i<2) ? 1 : 0; - x[(this->SliceOrientation+1)%3] = - bounds[2*((this->SliceOrientation+1)%3)+added1]; - x[(this->SliceOrientation+2)%3] = - bounds[2*((this->SliceOrientation+2)%3)+added2]; - x[this->SliceOrientation] = bounds[2*this->SliceOrientation]; - oldpoints->InsertPoint(i,x); - } - this->OrientationTransform->TransformPoints( oldpoints, points); - this->SlicePlane->SetPoints( points); - oldpoints->Delete(); - points->Delete(); -} - - -//---------------------------------------------------------------------------- -int vtkViewImage2D::GetSliceForWorldCoordinates(double pos[3]) -{ - int* indices = this->GetImageCoordinatesFromWorldCoordinates( pos); - return indices[this->SliceOrientation]; -} - -//---------------------------------------------------------------------------- -double* vtkViewImage2D::GetWorldCoordinatesForSlice(int slice) -{ - int indices[3] = {slice, slice, slice}; - return this->GetWorldCoordinatesFromImageCoordinates( indices); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::ResetPosition( void ) -{ - if( !this->GetInput()) - return; - - int *range = this->GetSliceRange(); - this->SetSlice( vtkMath::Round( static_cast(0.5*(range[1]-range[0]))) ); -} -//---------------------------------------------------------------------------- -void vtkViewImage2D::ResetWindowLevel( void ) -{ - if( !this->GetInput()) - return; - - double* range = this->GetInput()->GetScalarRange(); - double window = range[1]-range[0]; - double level = 0.5*(range[1]+range[0]); - - this->SetColorWindow( window ); - this->SetColorLevel( level ); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::ResetCamera(void) -{ - this->Zoom = 1.; - - double bounds[6]; - this->GetInput()->GetBounds( bounds ); - - double focal[3]; - focal[0] = 0.5 *( bounds[0] + bounds[1] ); - focal[1] = 0.5 *( bounds[2] + bounds[3] ); - focal[2] = 0.5 *( bounds[4] + bounds[5] ); - - double pos[3]; - pos[0] = focal[0]; - pos[1] = focal[1]; - pos[2] = focal[2]; - - double length[3]; - length[0] = 0.5 *( bounds[1] - bounds[0] ); - length[1] = 0.5 *( bounds[3] - bounds[2] ); - length[2] = 0.5 *( bounds[5] - bounds[4] ); - - double radius = 0.75 * sqrt( length[0] * length[0] + - length[1] * length[1] + - length[2] * length[2] ); - - vtkCamera *camera = this->GetRenderer()->GetActiveCamera(); - double distance = - radius/sin( camera->GetViewAngle()*vtkMath::Pi()/360.0 ); - - double view_plane_normal[3]; - camera->GetViewPlaneNormal( view_plane_normal ); - double* vup = camera->GetViewUp(); - - if( fabs( vtkMath::Dot( vup, view_plane_normal ) ) > 0.999 ) - { - vtkWarningMacro(<<"Resetting view-up since view plane normal is parallel"); - camera->SetViewUp(-vup[2], vup[0], vup[1]); - } - - pos[0] += distance * view_plane_normal[0]; - pos[1] += distance * view_plane_normal[1]; - pos[2] += distance * view_plane_normal[2]; - - this->SetCameraFocalAndPosition( focal, pos ); - - double max_length = std::max( length[0], std::max( length[1], length[2] ) ); - bounds[0] = focal[0] - 50. * max_length; - bounds[1] = focal[0] + 50. * max_length; - bounds[2] = focal[1] - 50. * max_length; - bounds[3] = focal[1] + 50. * max_length; - bounds[4] = focal[2] - 50. * max_length; - bounds[5] = focal[2] + 50. * max_length; - this->GetRenderer()->ResetCameraClippingRange( bounds ); - - camera->SetParallelScale(radius); -} -//---------------------------------------------------------------------------- -void vtkViewImage2D::Reset( void) -{ - this->ResetPosition(); - this->ResetWindowLevel(); - this->ResetCamera(); -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetCameraFocalAndPosition( double focal[3], double pos[3] ) -{ - vtkRenderer* ren = this->GetRenderer(); - - if( !ren ) - { - return; - } - vtkCamera* camera = ren->GetActiveCamera(); - - if( !camera ) - { - return; - } - - camera->SetFocalPoint( focal[0], focal[1], focal[2] ); - camera->SetPosition( pos[0], pos[1], pos[2] ); -} - -void vtkViewImage2D::GetCameraFocalAndPosition( double focal[3], double pos[3] ) -{ - vtkRenderer* ren = this->GetRenderer(); - - if( !ren ) - { - return; - } - vtkCamera* camera = ren->GetActiveCamera(); - - if( !camera ) - { - return; - } - - camera->GetPosition( pos ); - camera->GetFocalPoint( focal ); -} -//---------------------------------------------------------------------------- -double* vtkViewImage2D::GetWorldCoordinatesFromDisplayPosition( int xy[2] ) -{ - - if( !this->GetInput() || !this->GetRenderer()) - { - double* nullpos = new double[3]; - nullpos[0] = 0; nullpos[1] = 0; nullpos[2] = 0; - return nullpos; - } - - double* slicepos = this->GetWorldCoordinatesForSlice( this->GetSlice()); - this->GetRenderer()->SetWorldPoint( slicepos[0], slicepos[1], slicepos[2], - 1.0); - this->GetRenderer()->WorldToDisplay(); - this->GetRenderer()->SetDisplayPoint( xy[0], xy[1], - this->GetRenderer()->GetDisplayPoint()[2]); - this->GetRenderer()->DisplayToWorld(); - return this->GetRenderer()->GetWorldPoint(); -} - - -//---------------------------------------------------------------------------- -void vtkViewImage2D::InstallPipeline() -{ - if( this->RenderWindow && this->Renderer) - { - this->RenderWindow->AddRenderer(this->Renderer); - } - - if( this->Interactor) - { - if( !this->InteractorStyle) - { - this->InteractorStyle = vtkInteractorStyleImage2D::New(); - this->Interactor->SetInteractorStyle(this->InteractorStyle); -#if 0 - this->InteractorStyle->AddObserver( - vtkCommand::StartWindowLevelEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkCommand::WindowLevelEvent, this->Command); -#endif - this->InteractorStyle->AddObserver( - vtkCommand::KeyPressEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewImage2DCommand::StartSliceMoveEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewImage2DCommand::SliceMoveEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewImage2DCommand::EndSliceMoveEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewImage2DCommand::ResetViewerEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewImage2DCommand::ZoomEvent, this->Command); - this->InteractorStyle->AddObserver( - vtkViewImage2DCommand::PanEvent, this->Command); - this->InteractorStyle->AddObserver( vtkCommand::InteractionEvent, - this->Command); - } - - this->Interactor->SetInteractorStyle(this->InteractorStyle); - this->Interactor->SetRenderWindow(this->RenderWindow); - } - - if( this->Renderer && this->ImageActor) - { - this->Renderer->AddViewProp(this->ImageActor); - } - - if( this->ImageActor && this->WindowLevel) - { - this->ImageActor->SetInput(this->WindowLevel->GetOutput()); - } -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetInterpolate(const int& val ) -{ - if( this->ImageActor) - { - this->ImageActor->SetInterpolate( val); - } -} - -//---------------------------------------------------------------------------- -int vtkViewImage2D::GetInterpolate(void) -{ - if( this->ImageActor) - return this->ImageActor->GetInterpolate(); - return 0; -} - -//---------------------------------------------------------------------------- -void vtkViewImage2D::AddDataSet( vtkPolyData* dataset, - vtkProperty* property, - const bool& intersection ) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam ) - return; - - vtkPolyDataMapper* mapper = vtkPolyDataMapper::New(); - vtkActor* actor = vtkActor::New(); - - vtkClipPolyData* cutter = vtkClipPolyData::New(); - - if( intersection ) - { - cutter->SetInputConnection( 0, dataset->GetProducerPort()); - cutter->SetClipFunction( this->SliceImplicitPlane ); - cutter->InsideOutOn(); - mapper->SetInputConnection( 0, cutter->GetOutputPort()); - } - else - { - mapper->SetInput( dataset ); - } - - actor->SetMapper( mapper ); - if( property ) - actor->SetProperty( property ); - - actor->SetUserTransform( this->AdjustmentTransform ); - - this->Renderer->AddViewProp( actor ); - this->DataSetCollection->AddItem( dataset ); - this->Prop3DCollection->AddItem( actor ); - - cutter->Delete(); - mapper->Delete(); - actor->Delete(); -} -//---------------------------------------------------------------------------- - - -//---------------------------------------------------------------------------- -void vtkViewImage2D::AddDataSet( vtkDataSet* dataset, - vtkProperty* property, - const bool& intersection ) -{ - vtkCamera *cam = this->Renderer ? this->Renderer->GetActiveCamera() : NULL; - if( !cam ) - return; - - vtkPolyDataMapper* mapper = vtkPolyDataMapper::New(); - vtkActor* actor = vtkActor::New(); - - vtkCutter* cutter = vtkCutter::New(); - - if( intersection ) - { - cutter->SetInputConnection( 0, dataset->GetProducerPort()); - cutter->SetCutFunction( this->SliceImplicitPlane ); - mapper->SetInputConnection( 0, cutter->GetOutputPort()); - } - else - { - mapper->SetInput( vtkPolyData::SafeDownCast( dataset ) ); - } - - actor->SetMapper( mapper ); - if( property ) - actor->SetProperty( property ); - - actor->SetUserTransform( this->AdjustmentTransform ); - - this->Renderer->AddViewProp( actor ); - this->DataSetCollection->AddItem( dataset ); - this->Prop3DCollection->AddItem( actor ); - - cutter->Delete(); - mapper->Delete(); - actor->Delete(); -} - - -//---------------------------------------------------------------------------- -void vtkViewImage2D::SetMaskImage( vtkImageData* mask, - vtkLookupTable* lut, const bool& iStatus ) -{ - vtkImageData* input = this->GetInput(); - - if( !input || !mask || !lut) - { - return; - } - - vtkViewImage::SetMaskImage( mask, lut ); - - // check if the mask dimensions match the image dimensions - int dim1[3], dim2[3]; - input->GetDimensions( dim1); - mask->GetDimensions( dim2); - - if( ( dim1[0] != dim2[0] ) || - ( dim1[1] != dim2[1] ) || - ( dim1[2] != dim2[2] ) ) - { - vtkErrorMacro("Dimensions of the mask image do not match"); - return; - } - - // check if the scalar range match the number of entries in the LUT - double range[2]; - mask->GetScalarRange( range); - int numLUT = lut->GetNumberOfTableValues(); - if( numLUT < static_cast< int >( range[1] + 1. ) ) - { - vtkErrorMacro( <<"The number of LUT entries is less than the" - <<" range of the mask."); - return; - } - this->MaskFilter->SetImageInput( this->WindowLevel->GetOutput() ); - this->MaskFilter->SetMaskInput( mask ); - this->MaskFilter->SetLookupTable( lut ); - this->MaskFilter->Update(); - - this->AddDataSet( this->MaskFilter->GetOutput(), 0, iStatus ); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.h deleted file mode 100644 index 7482edd8..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2D.h +++ /dev/null @@ -1,280 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewImage2D_h_ -#define _vtkViewImage2D_h_ - -#include "vtkViewImage.h" - -class vtkPlane; -class vtkViewImage2DCommand; -class vtkTransform; -class vtkImageBlendWithMask; - -/** - -*/ - - -class vtkViewImage2D : public vtkViewImage -{ - - public: - - static vtkViewImage2D* New(); - vtkTypeRevisionMacro(vtkViewImage2D, vtkViewImage); - /** - Description: - The orientation of the view is a abstract representation of the object - we are looking at. It results from the acquisition plane. Setting the View - Orientation by calling SetViewOrientation() will imply the view to set its - inner "slice" orientation. (slice orientation == 2 means plane of - acquisition.) - - IMPORTANT NOTE: - - The view orientations defined here are orthogonal to the normal basis - in the scanner. A very interesting improvement would be to define "oblique" - view orientations for cardiac imaging, something like: - - VIEW_ORIENTATION_SHORT_AXIS, VIEW_ORIENTATION_LONG_AXIS, and - VIEW_ORIENTATION_FOUR_CHAMBER could define the different views that are - usually used in cardiac imaging. - - From this user-input information, the idea would be to evaluate which slice - orientation does correspond to the requested view. This can be done by - evaluating the dot product between the axis of acquisition and a - pre-defined oblique axis that "should" correspond to the requested - orientation... - **/ - //BTX - enum - { - VIEW_ORIENTATION_SAGITTAL = 0, - VIEW_ORIENTATION_CORONAL = 1, - VIEW_ORIENTATION_AXIAL = 2 - }; - //ETX - /** - Description: - **/ - //BTX - enum - { - VIEW_CONVENTION_RADIOLOGICAL = 0, - VIEW_CONVENTION_NEUROLOGICAL = 1 - }; - //ETX - - /** - The SliceImplicitPlane instance (GetImplicitSlicePlane()) is the - implicit function that cuts every dataset that is added with AddDataSet(). - */ - vtkGetObjectMacro (SliceImplicitPlane, vtkPlane); - /** - The SlicePlane instance (GetSlicePlane()) is the polygonal - square corresponding to the slice plane, - it is updated each time the slice changes, - and is color-coded according to conventions - */ - vtkGetObjectMacro (SlicePlane, vtkPolyData); - /** - The world is not always what we think it is ... - - Use this method to move the viewer slice such that the position - (in world coordinates) given by the arguments is contained by - the slice plane. If the given position is outside the bounds - of the image, then the slice will be as close as possible. - */ - virtual void SetWorldCoordinates (double pos[3]); - - /** - Set/Get the current slice to display (depending on the orientation - this can be in X, Y or Z). - */ - virtual void SetSlice(int s); - - /** - Instead of setting the slice orientation to an axis (YZ - XZ - XY), - you can force the view to be axial (foot-head), coronal (front-back), - or sagittal (left-right). It will just use the OrientationMatrix - (GetOrientationMatrix()) to check which slice orientation to pick. - */ - vtkGetMacro (ViewOrientation, int); - virtual void SetViewOrientation (int orientation); - virtual void SetOrientationMatrix (vtkMatrix4x4* matrix); - - /** - The ViewConvention instance explains where to place the camera around - the patient. Default behaviour is Radiological convention, meaning - we respectively look at the patient from his feet, his face and his left - ear. - - For Neurological convention, we respectively look from the top of his head, - the the back of his head, and his left ear. - */ - ///\todo Why not adding cardiologic conventions where we look at the patient in - /// oblique angles ? - vtkGetMacro (ViewConvention, int); - virtual void SetViewConvention (int convention); - /** - Convert an indices coordinate point (image coordinates) into a world - coordinate point - */ - virtual double* GetWorldCoordinatesForSlice (int slice); - /** - Convert a world coordinate point into an image indices coordinate point - */ - virtual int GetSliceForWorldCoordinates(double pos[3]); - - virtual void ResetCamera(void); - /** - Reset the 3D position to center - */ - virtual void ResetPosition(void); - /** - Reset the window level - */ - virtual void ResetWindowLevel(void); - /** - Reset position - zoom - window/level to default - */ - virtual void Reset(void); - /** - */ - virtual double* GetWorldCoordinatesFromDisplayPosition( int xy[2] ); - virtual double* GetWorldCoordinatesFromDisplayPosition( const int& x, const int& y ) - { - int xy[2] = {x,y}; - return this->GetWorldCoordinatesFromDisplayPosition( xy ); - } - - vtkSetMacro( Zoom, double ); - vtkGetMacro( Zoom, double ); - - vtkSetVector3Macro( CameraMotionVector, double ); - vtkGetVector3Macro( CameraMotionVector, double ); - - void SetCameraFocalAndPosition( double focal[3], double pos[3] ); - void GetCameraFocalAndPosition( double focal[3], double pos[3] ); - - vtkGetObjectMacro (Command, vtkViewImage2DCommand); - - virtual void SetInterpolate( const int& val ); - virtual int GetInterpolate (); - vtkBooleanMacro (Interpolate, int); - /** - Add a dataset to the view (has to be subclass of vtkPointSet). - The dataset will be cut through the implicit slice plane - (GetImplicitSlicePlane()). - - This results in a loss of dimensionality, i.e. tetrahedron will be displayed - as triangles, triangles as lines, lines as points. - A vtkProperty of the dataset can be specified. - */ - virtual void AddDataSet (vtkDataSet* dataset, - vtkProperty* property = NULL, - const bool& intersection = true ); - - virtual void AddDataSet( vtkPolyData* polydata, - vtkProperty* property = NULL, - const bool& intersection = true ); - - virtual void SetMaskImage( vtkImageData* mask, - vtkLookupTable* lut, const bool& status ); - - protected: - - vtkViewImage2D(); - ~vtkViewImage2D(); - - // Description: - virtual void UpdateOrientation(); - virtual int SetCameraToConvention (void); - virtual void SetAnnotationToConvention(void); - virtual void InitializeSlicePlane (void); - virtual void UpdateSlicePlane (void); - virtual void SetSlicePlaneToConvention (unsigned int axis); - virtual void InstallPipeline(); - - vtkMatrix4x4* ConventionMatrix; - vtkPlane* SliceImplicitPlane; - vtkTransform* AdjustmentTransform; - vtkPolyData* SlicePlane; - - vtkImageBlendWithMask* MaskFilter; - - vtkViewImage2DCommand* Command; - - int ViewOrientation; - int ViewConvention; - - double Zoom; - double CameraMotionVector[3]; -}; - -#endif /* _vtkViewImage2D_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.cxx deleted file mode 100644 index 6956998b..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.cxx +++ /dev/null @@ -1,313 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewImage2DCollection.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkImageMapToWindowLevelColors.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkRendererCollection.h" -#include "vtkMatrix4x4.h" -#include "vtkScalarBarActor.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkLookupTable.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" -#include "vtkProperty.h" - -#include "vtkViewImage2DCommand.h" -#include "vtkInteractorStyleImage2D.h" - -#include -#include -#include - -vtkCxxRevisionMacro(vtkViewImage2DCollection, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewImage2DCollection); - - -//---------------------------------------------------------------------------- -vtkViewImage2DCollection::vtkViewImage2DCollection() -{ - this->Command = vtkViewImage2DCollectionCommand::New(); - this->Command->SetCollection (this); - this->ExtraRenderWindow = NULL; -} - -//---------------------------------------------------------------------------- -vtkViewImage2DCollection::~vtkViewImage2DCollection() -{ - this->Command->Delete(); -} - - -// Add an object to the list. Does not prevent duplicate entries. -void vtkViewImage2DCollection::AddItem(vtkViewImage2D *a) -{ - this->Superclass::AddItem (a); - - a->GetInteractorStyle()->AddObserver (vtkCommand::ResetWindowLevelEvent, - this->Command); - a->GetInteractorStyle()->AddObserver (vtkCommand::WindowLevelEvent, - this->Command); - a->GetInteractorStyle()->AddObserver (vtkViewImage2DCommand::SliceMoveEvent, - this->Command); - a->GetInteractorStyle()->AddObserver ( - vtkViewImage2DCommand::RequestedPositionEvent, this->Command); - a->GetInteractorStyle()->AddObserver ( - vtkViewImage2DCommand::ResetViewerEvent, this->Command); - -} - -// Remove an object from the list. Removes the first object found, not -// all occurrences. If no object found, list is unaffected. See warning -// in description of RemoveItem(int). -void vtkViewImage2DCollection::RemoveItem(vtkViewImage2D *a) -{ - this->Superclass::RemoveItem (a); -} - -// Remove all objects from the list. -void vtkViewImage2DCollection::RemoveAllItems() -{ - this->Superclass::RemoveAllItems (); -} - - -// Replace the i'th item in the collection with a -void vtkViewImage2DCollection::ReplaceItem(int i, vtkViewImage2D *a) -{ - this->Superclass::ReplaceItem (i, a); -} - - -// Remove the i'th item in the list. -// Be careful if using this function during traversal of the list using -// GetNextItemAsObject (or GetNextItem in derived class). The list WILL -// be shortened if a valid index is given! If this->Current is equal to the -// element being removed, have it point to then next element in the list. -void vtkViewImage2DCollection::RemoveItem(int i) -{ - this->Superclass::RemoveItem (i); -} - - -void vtkViewImage2DCollection::Initialize(void) -{ - vtkProperty* plane_property = vtkProperty::New(); - plane_property->SetRepresentationToWireframe(); - - for (int i=0; iGetNumberOfItems(); i++) - { - for (int j=0; jGetNumberOfItems(); j++) - { - this->GetItem (j)->AddDataSet( - this->GetItem (i)->GetSlicePlane(), plane_property, ( i != j ) ); - } - } - plane_property->Delete(); -} - -void vtkViewImage2DCollection::SyncRender(void) -{ - this->InitTraversal(); - vtkViewImage2D* item = this->GetNextItem(); - while(item) - { - item->Render (); - item = this->GetNextItem(); - } - if (this->ExtraRenderWindow) - this->ExtraRenderWindow->Render(); -} - - -void vtkViewImage2DCollection::SyncReset(void) -{ - this->InitTraversal(); - vtkViewImage2D* item = this->GetNextItem(); - while(item) - { - item->Reset (); - item = this->GetNextItem(); - } -} - -void vtkViewImage2DCollection::SyncResetWindowLevel(void) -{ - this->InitTraversal(); - vtkViewImage2D* item = this->GetNextItem(); - while(item) - { - item->ResetWindowLevel (); - item = this->GetNextItem(); - } -} - - - - -//---------------------------------------------------------------------------- -vtkViewImage2DCollectionCommand::vtkViewImage2DCollectionCommand() -{ -} - -//---------------------------------------------------------------------------- -void vtkViewImage2DCollectionCommand::SetCollection(vtkViewImage2DCollection* p) -{ - this->Collection = p; -} - -//---------------------------------------------------------------------------- -void vtkViewImage2DCollectionCommand::Execute(vtkObject *caller, - unsigned long event, - void *vtkNotUsed(callData)) -{ - if (!this->Collection) - return; - - vtkInteractorStyleImage2D *isi = - vtkInteractorStyleImage2D::SafeDownCast(caller); - this->GetCollection()->InitTraversal(); - vtkViewImage2D* v = this->GetCollection()->GetNextItem(); - vtkViewImage2D* viewer = NULL; - while(v) - { - if (isi == v->GetInteractorStyle()) - viewer = v; - v = this->GetCollection()->GetNextItem(); - } - - if (!isi || !viewer || !viewer->GetInput()) - return; - - // Reset - if (event == vtkCommand::ResetWindowLevelEvent) - { - this->Collection->SyncResetWindowLevel(); - this->Collection->SyncRender(); - return; - } - // Reset - if (event == vtkViewImage2DCommand::ResetViewerEvent) - { - this->Collection->SyncReset(); - this->Collection->SyncRender(); - return; - } - - // Adjust the window level here - if (event == vtkCommand::WindowLevelEvent) - { - this->Collection->SyncSetColorWindow(viewer->GetColorWindow()); - this->Collection->SyncSetColorLevel(viewer->GetColorLevel()); - this->Collection->SyncRender(); - } - - // Move - if (event == vtkViewImage2DCommand::SliceMoveEvent) - { - // do not synchronize this, but render all - this->Collection->SyncRender(); - - } - - // Position requested - if (event == vtkViewImage2DCommand::RequestedPositionEvent) - { - double* position = viewer->GetWorldCoordinatesFromDisplayPosition ( - isi->GetRequestedPosition ()); - this->Collection->SyncSetWorldCoordinates(position); - this->Collection->SyncRender(); - } - - -} - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.h deleted file mode 100644 index fe92accc..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCollection.h +++ /dev/null @@ -1,255 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewImage2DCollection_h_ -#define _vtkViewImage2DCollection_h_ - -#include "vtkCollection.h" -#include "vtkCommand.h" - -#include "vtkViewImage2D.h" -/** - This macro can be useful as we frequently set - an instance this way, meaning unregistering previously set instance, - registering given instance, and call a modified event. - However this might be not the best place to define it... -*/ -//BTX -#define vtkSyncSetMacro(name, type, base ) \ - virtual void SyncSet##name (type _arg) \ - { \ - this->InitTraversal(); \ - base* item = this->GetNextItem(); \ - while(item) \ - { \ - item->Set##name (_arg); \ - item = this->GetNextItem(); \ - } \ - } -///ETX - -///BTX -#define vtkSyncSetObjectMacro(name, type, base) \ - virtual void SyncSet##name (type* _arg) \ - { \ - this->InitTraversal(); \ - base* item = this->GetNextItem(); \ - while(item) \ - { \ - item->Set##name (_arg); \ - item = this->GetNextItem(); \ - } \ - } - -///ETX - - -class vtkScalarBarActor; -class vtkLookupTable; -class vtkTextProperty; -class vtkCornerAnnotation; -class vtkOrientationAnnotation; -class vtkPlane; -class vtkActor; -class vtkDataSet; -class vtkPolyData; -class vtkProperty; -class vtkProp3DCollection; -class vtkDataSetCollection; -class vtkMatrixToLinearTransform; -class vtkViewImage2DCollectionCommand; - -/** - -*/ - -class vtkViewImage2DCollection : public vtkCollection -{ - public: - - static vtkViewImage2DCollection* New(); - vtkTypeRevisionMacro(vtkViewImage2DCollection, vtkCollection); - - // Description: - // Get the next vtkViewImage2D in the list. Return NULL when at the end of the - // list. - vtkViewImage2D *GetNextItem() { - return static_cast(this->GetNextItemAsObject());}; - // Description: - // Get the next vtkViewImage2D2D in the list. Return NULL when at the end of - // the list. - vtkViewImage2D *GetItem(int i) { - return static_cast(this->GetItemAsObject(i));}; - // Description: - // Add an object to the list. Does not prevent duplicate entries. - void AddItem(vtkViewImage2D*); - - // Description: - // Replace the i'th item in the collection with a - void ReplaceItem(int i, vtkViewImage2D *); - - // Description: - // Remove the i'th item in the list. - // Be careful if using this function during traversal of the list using - // GetNextItemAsObject (or GetNextItem in derived class). The list WILL - // be shortened if a valid index is given! If this->Current is equal to the - // element being removed, have it point to then next element in the list. - void RemoveItem(int i); - - // Description: - // Remove an object from the list. Removes the first object found, not - // all occurrences. If no object found, list is unaffected. See warning - // in description of RemoveItem(int). - void RemoveItem(vtkViewImage2D *); - - // Description: - // Remove all objects from the list. - void RemoveAllItems(); - - // Description: - // Initialize the viewers togethers. - void Initialize(void); - - - vtkGetObjectMacro (Command, vtkViewImage2DCollectionCommand); - vtkGetObjectMacro (ExtraRenderWindow, vtkRenderWindow); - void SetExtraRenderWindow (vtkRenderWindow* win) - { this->ExtraRenderWindow = win; } - - vtkSyncSetMacro (Slice, int, vtkViewImage2D); - vtkSyncSetMacro (SliceOrientation, int, vtkViewImage2D); - vtkSyncSetMacro (ShowAnnotations, int, vtkViewImage2D); - vtkSyncSetMacro (ShowScalarBar, int, vtkViewImage2D); - - vtkSyncSetMacro (ColorWindow, double, vtkViewImage2D); - vtkSyncSetMacro (ColorLevel, double, vtkViewImage2D); - - vtkSyncSetObjectMacro (OrientationMatrix, vtkMatrix4x4, vtkViewImage2D); - vtkSyncSetObjectMacro (LookupTable, vtkLookupTable, vtkViewImage2D); - vtkSyncSetObjectMacro (TextProperty, vtkTextProperty, vtkViewImage2D); - vtkSyncSetObjectMacro (Input, vtkImageData, vtkViewImage2D); - vtkSyncSetObjectMacro (InputConnection, vtkAlgorithmOutput, vtkViewImage2D); - - vtkSyncSetObjectMacro (Size, int, vtkViewImage2D); - vtkSyncSetObjectMacro (Position, int, vtkViewImage2D); - vtkSyncSetObjectMacro (WorldCoordinates, double, vtkViewImage2D); - vtkSyncSetObjectMacro (Background, double, vtkViewImage2D); - - void SyncRender (void); - void SyncResetWindowLevel (void); - void SyncReset (void); - - protected: - - vtkViewImage2DCollection(); - ~vtkViewImage2DCollection(); - - vtkViewImage2DCollectionCommand* Command; - vtkRenderWindow* ExtraRenderWindow; -}; - - - - -class vtkViewImage2DCollectionCommand : - public vtkCommand -{ - - public: - - static vtkViewImage2DCollectionCommand *New() - {return new vtkViewImage2DCollectionCommand;}; - - vtkViewImage2DCollection* GetCollection (void) - { return this->Collection;}; - void SetCollection (vtkViewImage2DCollection* p); - - // Description: - // Satisfy the superclass API for callbacks. Recall that the caller is - // the instance invoking the event; eid is the event id (see - // vtkCommand.h); and calldata is information sent when the callback - // was invoked (e.g., progress value in the vtkCommand::ProgressEvent). - virtual void Execute(vtkObject *caller,unsigned long event, - void *vtkNotUsed(callData)); - - protected: - - vtkViewImage2DCollectionCommand(); - ~vtkViewImage2DCollectionCommand(){}; - - private: - vtkViewImage2DCollection* Collection; - - double InitialWindow; - double InitialLevel; - -}; - - - - -#endif /* _vtkViewImage2DCollection_h_ */ diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.cxx deleted file mode 100644 index c156fe0c..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.cxx +++ /dev/null @@ -1,336 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifdef _MSC_VER -# pragma warning (disable : 4018) -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "vtkViewImage2D.h" -#include "vtkInteractorStyleImage2D.h" - - -#include "vtkViewImage2DCommand.h" -#include "vtkInteractorStyleImage2D.h" - -#include -#include - - -vtkViewImage2DCommand::vtkViewImage2DCommand() : Viewer( 0 ) -{} - -void -vtkViewImage2DCommand::Execute( vtkObject* caller, - unsigned long event, - void* callData) -{ - vtkInteractorStyleImage2D *isi = - static_cast(caller); - - if (!isi || !this->Viewer || !this->Viewer->GetInput()) - { - return; - } - - // Reset - if (event == vtkCommand::ResetWindowLevelEvent) - { - this->Viewer->ResetWindowLevel(); - this->Viewer->Render(); - return; - } - // Reset - if (event == vtkViewImage2DCommand::ResetViewerEvent) - { - this->Viewer->Reset(); - this->Viewer->Render(); - return; - } - - // Start - if (event == vtkCommand::StartWindowLevelEvent) - { - this->InitialWindow = this->Viewer->GetColorWindow(); - this->InitialLevel = this->Viewer->GetColorLevel(); - return; - } - - // Adjust the window level here - if (event == vtkCommand::WindowLevelEvent) - { - this->Windowing( isi ); - return; - } - - if (event == vtkCommand::KeyPressEvent) - { - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - if (rwi->GetKeyCode() == 't') - { - this->Viewer->SetViewOrientation ( - (this->Viewer->GetViewOrientation()+1)%3 ); - this->Viewer->Render(); - } - else if (rwi->GetKeyCode() == 'i') - { - this->Viewer->SetInterpolate ((this->Viewer->GetInterpolate() + 1)%2); - this->Viewer->Render(); - } - - return; - } - - if (event == vtkViewImage2DCommand::EndSliceMoveEvent) - { - int step = isi->GetSliceStep(); - this->Viewer->SetSlice (this->Viewer->GetSlice()+step); - this->Viewer->Render(); - } - - if( event == vtkViewImage2DCommand::ZoomEvent ) - { - this->Zooming(); - } - - if( event == vtkViewImage2DCommand::PanEvent ) - { - this->Panning(); - } - - // Move - // Position Value requested - if (event == vtkViewImage2DCommand::InteractionEvent) - { - PrintInformation(); - } - - // Position requested - if (event == vtkViewImage2DCommand::RequestedPositionEvent) - { - double* position = this->Viewer->GetWorldCoordinatesFromDisplayPosition ( - isi->GetRequestedPosition ()); - this->Viewer->SetWorldCoordinates(position); - this->Viewer->Render(); - } -} - -void vtkViewImage2DCommand::Windowing( vtkInteractorStyleImage2D* isi ) -{ - int *size = this->Viewer->GetRenderWindow()->GetSize(); - double window = this->InitialWindow; - double level = this->InitialLevel; - - // Compute normalized delta - double dx = 4.0 * - (isi->GetWindowLevelCurrentPosition()[0] - - isi->GetWindowLevelStartPosition()[0]) / size[0]; - double dy = 4.0 * - (isi->GetWindowLevelStartPosition()[1] - - isi->GetWindowLevelCurrentPosition()[1]) / size[1]; - - // Scale by current values - if (fabs(window) > 0.01) - dx = dx * window; - else - dx = dx * (window < 0 ? -0.01 : 0.01); - if (fabs(level) > 0.01) - dy = dy * level; - else - dy = dy * (level < 0 ? -0.01 : 0.01); - - // Abs so that direction does not flip - if (window < 0.0) - dx = -1*dx; - if (level < 0.0) - dy = -1*dy; - - // Compute new window level - double newWindow = dx + window; - double newLevel = level - dy; - - // Stay away from zero and really - if (fabs(newWindow) < 0.01) - newWindow = 0.01*(newWindow < 0 ? -1 : 1); - if (fabs(newLevel) < 0.01) - newLevel = 0.01*(newLevel < 0 ? -1 : 1); - - this->Viewer->SetColorWindow(newWindow); - this->Viewer->SetColorLevel(newLevel); - this->Viewer->Render(); -} - -void vtkViewImage2DCommand::PrintInformation() -{ - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - double* pos = this->Viewer->GetWorldCoordinatesFromDisplayPosition ( - rwi->GetLastEventPosition ()); - - int* idx = this->Viewer->GetImageCoordinatesFromWorldCoordinates( pos ); - - int dims[3]; - this->Viewer->GetInput()->GetDimensions( dims ); - - double spacing[3]; - this->Viewer->GetInput()->GetSpacing( spacing ); - - std::ostringstream os; - ///TODO dims and spacing must be computed from the orientation of the - /// image. - os <<"Size: " <<"[ " <Viewer->GetSlice() <<" / " - <Viewer->GetSliceMax() - this->Viewer->GetSliceMin() <Viewer->GetCornerAnnotation()->SetText (2, os.str().c_str()); - - std::ostringstream os2; - os2 <<"Location: " <<"[ " <Viewer->GetValueAtPosition (pos); - this->Viewer->GetCornerAnnotation()->SetText (3, os2.str().c_str()); - this->Viewer->Render(); -} - - -void vtkViewImage2DCommand::Zooming( ) -{ - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - rwi->FindPokedRenderer( rwi->GetEventPosition()[0], - rwi->GetEventPosition()[1]); - - vtkRenderer* ren = this->Viewer->GetRenderer(); - - double *center = ren->GetCenter(); - int dy = rwi->GetEventPosition()[1] - rwi->GetLastEventPosition()[1]; - - double factor = static_cast(dy) / static_cast( center[1] ); - - double z = 1.; - z *= pow((double)1.1, factor); - - this->Viewer->SetZoom( z ); -} - - -void vtkViewImage2DCommand::Panning( ) -{ - vtkRenderWindowInteractor *rwi = - this->Viewer->GetRenderWindow()->GetInteractor(); - - double ViewFocus[4]; - double NewPickPoint[4]; - - // Calculate the focal depth since we'll be using it a lot - vtkRenderer* ren = this->Viewer->GetRenderer(); - vtkCamera* camera = ren->GetActiveCamera(); - camera->GetFocalPoint(ViewFocus); - - vtkInteractorObserver::ComputeWorldToDisplay( ren, - ViewFocus[0], ViewFocus[1], ViewFocus[2], ViewFocus); - - double focalDepth = ViewFocus[2]; - - vtkInteractorObserver::ComputeDisplayToWorld( ren, - rwi->GetEventPosition()[0], - rwi->GetEventPosition()[1], - focalDepth, - NewPickPoint ); - - // Get the current focal point and position - - camera->GetFocalPoint(ViewFocus); - - // Compute a translation vector, moving everything 1/10 - // the distance to the cursor. (Arbitrary scale factor) - - double MotionVector[3]; - MotionVector[0] = 0.01 * (ViewFocus[0] - NewPickPoint[0]); - MotionVector[1] = 0.01 * (ViewFocus[1] - NewPickPoint[1]); - MotionVector[2] = 0.01 * (ViewFocus[2] - NewPickPoint[2]); - - this->Viewer->SetCameraMotionVector( MotionVector ); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.h deleted file mode 100644 index a48dd42e..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DCommand.h +++ /dev/null @@ -1,127 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewImage2DCommand_h_ -#define _vtkViewImage2DCommand_h_ - -#include - -class vtkInteractorStyleImage2D; -class vtkInteractorStyleImage; -class vtkViewImage2D; - -class vtkViewImage2DCommand : public vtkCommand -{ - public: - - static vtkViewImage2DCommand* New() - { return new vtkViewImage2DCommand; } - - //BTX - enum EventIds - { - SliceMoveEvent=(vtkCommand::UserEvent+1), - StartSliceMoveEvent, - EndSliceMoveEvent, - ZoomEvent, - PanEvent, - RequestedPositionEvent, - ResetViewerEvent - }; - //ETX - - - - // Description: - // Satisfy the superclass API for callbacks. Recall that the caller is - // the instance invoking the event; eid is the event id (see - // vtkCommand.h); and calldata is information sent when the callback - // was invoked (e.g., progress value in the vtkCommand::ProgressEvent). - virtual void Execute(vtkObject *caller,unsigned long event, - void *vtkNotUsed(callData)); - - void SetViewer(vtkViewImage2D *viewer) - { this->Viewer = viewer; } - - protected: - vtkViewImage2DCommand(); - ~vtkViewImage2DCommand(){}; - - void Windowing( vtkInteractorStyleImage2D* isi ); - void Zooming(); - void Panning(); - void PrintInformation(); - - private: - vtkViewImage2D* Viewer; - double InitialWindow; - double InitialLevel; - int InitialSlice; - -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.cxx deleted file mode 100644 index 10eaec9f..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.cxx +++ /dev/null @@ -1,249 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewImage2DWithContourWidget.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "vtkFillImageWithPolyData.h" - -vtkCxxRevisionMacro(vtkViewImage2DWithContourWidget, "$Revision 1$"); -vtkStandardNewMacro(vtkViewImage2DWithContourWidget); - - -vtkViewImage2DWithContourWidget::vtkViewImage2DWithContourWidget() -{ - this->ContourWidgetEnabled = false; - - this->ContourRepresentation = vtkOrientedGlyphContourRepresentation::New(); - - this->ContourWidget = vtkContourWidget::New(); - this->ContourWidget->SetPriority( 10.0 ); - - this->CornerAnnotation->SetText( 1, "Tracer OFF"); - - this->CurrentLabel = 1; - - this->LUT = vtkLookupTable::New(); - this->LUT->SetNumberOfTableValues( 256 ); - - this->LUT->SetTableValue (1, 1.0, 0.0, 0.0, 0.5); - this->LUT->SetTableValue (2, 0.0, 1.0, 0.0, 0.5); - this->LUT->SetTableValue (3, 0.0, 0.0, 1.0, 0.5); - this->LUT->SetTableValue (4, 1.0, 1.0, 0.0, 0.5); - this->LUT->SetTableValue (5, 0.0, 1.0, 1.0, 0.5); - this->LUT->SetTableValue (6, 1.0, 0.0, 1.0, 0.5); - - double d_id; - for( int i = 7; i < 256; i++ ) - { - d_id = static_cast< double >( i ); - if( i % 3 == 0 ) - { - this->LUT->SetTableValue( i, - ( 200. * ( 84.0 - d_id ) / 85. + 50. ) / 255., - ( 200. * d_id / 85. + 50. ) / 255., - 0., - 0.5); - } - else - { - if( i % 3 == 1 ) - { - this->LUT->SetTableValue( i, - 0, - ( ( 169. - d_id ) / 85. * 200. + 50. ) / 255., - ( ( d_id - 85. ) / 85. * 200. + 50. ) / 255., - 0.5 ); - } - else - { - this->LUT->SetTableValue( i, - ( ( d_id -170. ) / 85.0 * 200.0 + 50. ) / 255.0, - 0.0, - ( ( 255.0 - d_id ) / 85.0 * 200.0 + 50. ) /255.0, - 0.5); - } - } - } -} - -vtkViewImage2DWithContourWidget::~vtkViewImage2DWithContourWidget() -{ - this->ContourRepresentation->Delete(); - this->ContourWidget->Delete(); - this->LUT->Delete(); -} - -void vtkViewImage2DWithContourWidget::SetupInteractor( - vtkRenderWindowInteractor* arg ) -{ - vtkViewImage2D::SetupInteractor( arg ); - if( arg ) - { - this->ContourWidget->SetInteractor( arg ); - } -} - -void vtkViewImage2DWithContourWidget::SetInput( vtkImageData* image ) -{ - vtkViewImage2D::SetInput( image ); - if( image ) - { - vtkImageActorPointPlacer* point_placer = vtkImageActorPointPlacer::New(); - point_placer->SetImageActor( this->GetImageActor() ); - - this->ContourRepresentation->SetPointPlacer( point_placer ); - this->ContourWidget->SetRepresentation(this->ContourRepresentation); - - point_placer->Delete(); - this->SetContourWidgetInteractionOff(); - } -} - -void vtkViewImage2DWithContourWidget::ValidateTracing() -{ - vtkImageData* input = this->GetInput(); - - if( !input ) - { - return; - } - - vtkPolyData* contour = - this->ContourRepresentation->GetContourRepresentationAsPolyData( ); - - if( !contour || contour->GetNumberOfPoints()<3 ) - { - return; - } - - double val = this->CurrentLabel; - - vtkFillImageWithPolyData* filler = vtkFillImageWithPolyData::New(); - filler->SetInput ( input ); - filler->SetExtractionDirection( this->ViewOrientation ); - filler->SetPolyData( contour ); - filler->SetInsidePixelValue (val); - filler->Update(); - - this->Tracing = this->GetMaskImage(); - - // must check if the dimensions of the image match the dimensions of - // the tracing - if( this->Tracing ) - { - int* dims1 = this->Tracing->GetDimensions(); - int* dims2 = input->GetDimensions(); - if( (dims1[0]!=dims2[0]) || (dims1[1]!=dims2[1]) || (dims1[2]!=dims2[2]) ) - { - // I set to 0 the previous tracing - this->Tracing = 0; - } - } - - - // the output of the filler is merged with the previous tracing, if any - if( this->Tracing ) - { - // do the merging myself - unsigned long numPoints = this->Tracing->GetNumberOfPoints(); - unsigned char* buff1 = (unsigned char*)( this->Tracing->GetScalarPointer() ); - unsigned char* buff2 = (unsigned char*)( - filler->GetOutput()->GetScalarPointer() ); - unsigned char u_char_0 = static_cast< unsigned char >( 0 ); - unsigned char u_char_255 = static_cast< unsigned char >( 255 ); - - for( unsigned long i=0; i u_char_0 ) - *buff1 = *buff2; - } - - this->Tracing->Modified(); - } - else - { - this->Tracing = vtkImageData::New(); - this->Tracing->DeepCopy ( filler->GetOutput() ); - this->Tracing->SetOrigin( input->GetOrigin() ); - - this->SetMaskImage( this->Tracing, this->LUT, true ); - this->Tracing->Delete(); - this->ContourWidget->Initialize( 0 ); - } - - filler->Delete(); -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.h deleted file mode 100644 index c0597701..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidget.h +++ /dev/null @@ -1,132 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __vtkViewImage2DWithContourWidget_h -#define __vtkViewImage2DWithContourWidget_h - -#include "vtkViewImage2D.h" -#include -#include -#include -#include - -class vtkViewImage2DWithContourWidget : public vtkViewImage2D -{ -public: - static vtkViewImage2DWithContourWidget* New(); - vtkTypeRevisionMacro( vtkViewImage2DWithContourWidget, vtkViewImage2D ); - - virtual void SetupInteractor( vtkRenderWindowInteractor* ); - - void SetContourWidgetInteractionOn( ) - { - this->ContourWidgetEnabled = true; - this->ContourWidget->On(); - this->CornerAnnotation->SetText( 1, "Tracer ON"); - } - void SetContourWidgetInteractionOff( ) - { - this->ContourWidgetEnabled = false; - this->ContourWidget->Off(); - this->CornerAnnotation->SetText( 1, "Tracer OFF"); - } - void SetContourWidgetInteraction( const bool& iState ) - { - if( iState ) - this->SetContourWidgetInteractionOn(); - else - this->SetContourWidgetInteractionOff(); - } - - vtkSetMacro( CurrentLabel, unsigned int ); - vtkGetMacro( CurrentLabel, unsigned int ); - - vtkGetMacro( ContourWidgetEnabled, bool ); - vtkGetObjectMacro( ContourWidget, vtkContourWidget ); - vtkGetObjectMacro( ContourRepresentation, - vtkOrientedGlyphContourRepresentation ); - virtual void SetInput( vtkImageData* image ); - - void ValidateTracing(); - -protected: - vtkViewImage2DWithContourWidget(); - ~vtkViewImage2DWithContourWidget(); - - unsigned int CurrentLabel; - bool ContourWidgetEnabled; - vtkOrientedGlyphContourRepresentation* ContourRepresentation; - vtkContourWidget* ContourWidget; - vtkLookupTable* LUT; - vtkImageData* Tracing; - -private: - vtkViewImage2DWithContourWidget( const vtkViewImage2DWithContourWidget& ); - void operator = ( const vtkViewImage2DWithContourWidget& ); -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.cxx deleted file mode 100644 index 1b59919c..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.cxx +++ /dev/null @@ -1,423 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewImage2DWithContourWidgetCollection.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "vtkViewImage2DCommand.h" - -vtkCxxRevisionMacro(vtkViewImage2DWithContourWidgetCollection, "$Revision: 1 $"); -vtkStandardNewMacro(vtkViewImage2DWithContourWidgetCollection); - -vtkViewImage2DWithContourWidgetCollection:: -vtkViewImage2DWithContourWidgetCollection( ) -{ - this->Command = vtkViewImage2DWithContourWidgetCollectionCommand::New(); - this->Command->SetCollection( this ); -} - -vtkViewImage2DWithContourWidgetCollection:: -~vtkViewImage2DWithContourWidgetCollection() -{ - this->Command->Delete(); -} - -void -vtkViewImage2DWithContourWidgetCollection:: -AddItem( vtkViewImage2DWithContourWidget* a ) -{ - this->Superclass::AddItem (a); - a->GetInteractorStyle()->RemoveObservers( - vtkCommand::ResetWindowLevelEvent ); - a->GetInteractorStyle()->RemoveObservers( - vtkViewImage2DCommand::SliceMoveEvent ); - a->GetInteractorStyle()->RemoveObservers( - vtkViewImage2DCommand::ResetViewerEvent ); - a->GetInteractorStyle()->RemoveObservers( vtkViewImage2DCommand:: - RequestedPositionEvent ); - - a->GetInteractorStyle()->AddObserver( vtkCommand::ResetWindowLevelEvent, - this->Command ); - a->GetInteractorStyle()->AddObserver( vtkCommand::WindowLevelEvent, - this->Command ); - a->GetInteractorStyle()->AddObserver( - vtkViewImage2DCommand::SliceMoveEvent, - this->Command ); - a->GetInteractorStyle()->AddObserver( - vtkViewImage2DCommand::ZoomEvent, - this->Command ); - a->GetInteractorStyle()->AddObserver( - vtkViewImage2DCommand::PanEvent, - this->Command ); - a->GetInteractorStyle()->AddObserver( - vtkViewImage2DCommand::RequestedPositionEvent, - this->Command ); - a->GetInteractorStyle()->AddObserver( - vtkViewImage2DCommand::ResetViewerEvent, - this->Command ); -} - - -void -vtkViewImage2DWithContourWidgetCollection:: -ReplaceItem( int i, vtkViewImage2DWithContourWidget* a ) -{ - this->Superclass::ReplaceItem( i, a ); -} - -void -vtkViewImage2DWithContourWidgetCollection:: -RemoveItem( int i ) -{ - this->Superclass::RemoveItem( i ); -} - -void -vtkViewImage2DWithContourWidgetCollection:: -RemoveItem( vtkViewImage2DWithContourWidget* a ) -{ - this->Superclass::RemoveItem( a ); -} - -void -vtkViewImage2DWithContourWidgetCollection:: -RemoveAllItems() -{ - this->Superclass::RemoveAllItems(); -} - -void -vtkViewImage2DWithContourWidgetCollection:: -Initialize() -{ - vtkProperty* plane_property = vtkProperty::New(); - plane_property->SetRepresentationToWireframe(); - - for (int i=0; iGetNumberOfItems(); i++) - { - for (int j=0; jGetNumberOfItems(); j++) - { - this->GetItem( j )->AddDataSet( - static_cast( this->GetItem( i )->GetSlicePlane() ), - plane_property, ( i != j ) ); - } - } - plane_property->Delete(); -} - - -void vtkViewImage2DWithContourWidgetCollection:: -SyncSetBackground( double* rgb ) -{ - this->InitTraversal(); - vtkViewImage2DWithContourWidget* item = this->GetNextItem(); - while(item) - { - item->SetBackground( rgb ); - item = this->GetNextItem(); - } - if (this->ExtraRenderWindow) - { - vtkRenderer* ren = - this->ExtraRenderWindow->GetRenderers()->GetFirstRenderer(); - ren->SetBackground( rgb ); - } -} - -void vtkViewImage2DWithContourWidgetCollection:: -SyncRender(void) -{ - this->InitTraversal(); - vtkViewImage2DWithContourWidget* item = this->GetNextItem(); - while(item) - { - item->Render (); - item = this->GetNextItem(); - } - if (this->ExtraRenderWindow) - this->ExtraRenderWindow->Render(); -} - - -void vtkViewImage2DWithContourWidgetCollection:: -SyncReset(void) -{ - this->InitTraversal(); - vtkViewImage2DWithContourWidget* item = this->GetNextItem(); - while(item) - { - item->Reset (); - item = this->GetNextItem(); - } -} - -void vtkViewImage2DWithContourWidgetCollection:: -SyncResetWindowLevel(void) -{ - this->InitTraversal(); - vtkViewImage2DWithContourWidget* item = this->GetNextItem(); - while(item) - { - item->ResetWindowLevel (); - item = this->GetNextItem(); - } -} - -void vtkViewImage2DWithContourWidgetCollection:: -SyncMaskImage( void ) -{ - for (int i=0; iGetNumberOfItems(); i++) - { - vtkImageData* mask = this->GetItem(i)->GetMaskImage(); - vtkLookupTable* lut = this->GetItem(i)->GetMaskLUT(); - - std::cout <GetNumberOfItems(); j++) - { - this->GetItem(j)->SetMaskImage( mask, lut, ( i == j ) ); - } - } -} - -void vtkViewImage2DWithContourWidgetCollection:: -SyncMaskImage( vtkImageData* mask, vtkLookupTable* lut ) -{ - this->InitTraversal(); - vtkViewImage2DWithContourWidget* item = this->GetNextItem(); - while(item) - { - item->SetMaskImage( mask, lut, true ); - item = this->GetNextItem(); - } -} -//---------------------------------------------------------------------------- -void vtkViewImage2DWithContourWidgetCollection:: -SyncPan() -{ - this->InitTraversal(); - vtkViewImage2DWithContourWidget* item = this->GetNextItem(); - while(item) - { - item = this->GetNextItem(); - } -} - -void vtkViewImage2DWithContourWidgetCollection:: -SyncSetZoomAndParallelScale( double Zoom, double ParallelScale ) -{ - this->InitTraversal(); - vtkViewImage2DWithContourWidget* item = this->GetNextItem(); - double t = ParallelScale / Zoom; - while(item) - { - item->SetZoom( Zoom ); - item->GetRenderer()->GetActiveCamera()->SetParallelScale( t ); - - if( item->GetInteractorStyle()->GetInteractor()->GetLightFollowCamera() ) - { - item->GetRenderer()->UpdateLightsGeometryToFollowCamera(); - } - item->Render(); - item = this->GetNextItem(); - } -} - -//---------------------------------------------------------------------------- -vtkViewImage2DWithContourWidgetCollectionCommand:: -vtkViewImage2DWithContourWidgetCollectionCommand () -{ -} - -//---------------------------------------------------------------------------- -void -vtkViewImage2DWithContourWidgetCollectionCommand::SetCollection( -vtkViewImage2DWithContourWidgetCollection* p) -{ - this->Collection = p; -} - -//---------------------------------------------------------------------------- -void vtkViewImage2DWithContourWidgetCollectionCommand::Execute(vtkObject *caller, - unsigned long event, - void *vtkNotUsed(callData)) -{ - if (!this->Collection) - return; - - vtkInteractorStyleImage2D *isi = - vtkInteractorStyleImage2D::SafeDownCast(caller); - this->GetCollection()->InitTraversal(); - vtkViewImage2DWithContourWidget* v = this->GetCollection()->GetNextItem(); - vtkViewImage2DWithContourWidget* viewer = NULL; - while(v) - { - if (isi == v->GetInteractorStyle()) - viewer = v; - v = this->GetCollection()->GetNextItem(); - } - - if (!isi || !viewer || !viewer->GetInput()) - return; - - if( !viewer->GetContourWidgetEnabled() ) - { - // Reset - if (event == vtkCommand::ResetWindowLevelEvent) - { - this->Collection->SyncResetWindowLevel(); - this->Collection->SyncRender(); - return; - } - // Reset - if (event == vtkViewImage2DCommand::ResetViewerEvent) - { - this->Collection->SyncReset(); - this->Collection->SyncRender(); - return; - } - - // Adjust the window level here - if (event == vtkCommand::WindowLevelEvent) - { - this->Collection->SyncSetColorWindow(viewer->GetColorWindow()); - this->Collection->SyncSetColorLevel(viewer->GetColorLevel()); - this->Collection->SyncRender(); - } - - // Move - if (event == vtkViewImage2DCommand::SliceMoveEvent) - { - // do not synchronize this, but render all - this->Collection->SyncRender(); - } - - if( event == vtkViewImage2DCommand::ZoomEvent ) - { - double z = viewer->GetZoom(); - double parallel_scale = - viewer->GetRenderer()->GetActiveCamera()->GetParallelScale(); - - this->Collection->SyncSetZoomAndParallelScale( z, parallel_scale ); - } - - if( event == vtkViewImage2DCommand::PanEvent ) - { - double motion[3]; - viewer->GetCameraMotionVector( motion ); - - this->GetCollection()->InitTraversal(); - v = this->GetCollection()->GetNextItem(); - double focal[3], pos[3], n[3]; - double dot = 0., u; - - while(v) - { - v->GetCameraFocalAndPosition( focal, pos ); - v->GetRenderer()->GetActiveCamera()->GetViewPlaneNormal( n ); - dot = vtkMath::Dot( n, motion ); - - for( int dim = 0; dim < 3; dim++ ) - { - u = motion[dim] - dot * n[dim]; - focal[dim] += u; - pos[dim] += u; - } - v->SetCameraFocalAndPosition( focal, pos ); - - if( v->GetInteractorStyle()->GetInteractor()->GetLightFollowCamera() ) - { - v->GetRenderer()->UpdateLightsGeometryToFollowCamera(); - } - v->Render(); - v = this->GetCollection()->GetNextItem(); - } - } - // Position requested - if (event == vtkViewImage2DCommand::RequestedPositionEvent) - { - double* position = viewer->GetWorldCoordinatesFromDisplayPosition ( - isi->GetRequestedPosition ()); - this->Collection->SyncSetWorldCoordinates(position); - this->Collection->SyncRender(); - } - } -} - - - diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.h deleted file mode 100644 index 3e3243b6..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage2DWithContourWidgetCollection.h +++ /dev/null @@ -1,214 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __vtkViewImage2DWithContourWidgetCollection_h -#define __vtkViewImage2DWithContourWidgetCollection_h - -#include -#include - -#include "vtkViewImage2DCollection.h" -#include "vtkViewImage2DWithContourWidget.h" - -class vtkViewImage2DWithContourWidgetCollectionCommand; - -class vtkViewImage2DWithContourWidgetCollection : -public vtkCollection -{ -public: - static vtkViewImage2DWithContourWidgetCollection* New(); - vtkTypeRevisionMacro( vtkViewImage2DWithContourWidgetCollection, - vtkCollection ); - - // Description: - // Get the next vtkViewImage2D in the list. Return NULL when at the end of the - // list. - vtkViewImage2DWithContourWidget *GetNextItem() { - return static_cast( - this->GetNextItemAsObject() );}; - // Description: - // Get the next vtkViewImage2D2D in the list. Return NULL when at the end of - // the list. - vtkViewImage2DWithContourWidget *GetItem(int i) { - return static_cast( - this->GetItemAsObject(i) );}; - // Description: - // Add an object to the list. Does not prevent duplicate entries. - void AddItem(vtkViewImage2DWithContourWidget*); - - // Description: - // Replace the i'th item in the collection with a - void ReplaceItem(int i, vtkViewImage2DWithContourWidget *); - - // Description: - // Remove the i'th item in the list. - // Be careful if using this function during traversal of the list using - // GetNextItemAsObject (or GetNextItem in derived class). The list WILL - // be shortened if a valid index is given! If this->Current is equal to the - // element being removed, have it point to then next element in the list. - void RemoveItem(int i); - - // Description: - // Remove an object from the list. Removes the first object found, not - // all occurrences. If no object found, list is unaffected. See warning - // in description of RemoveItem(int). - void RemoveItem(vtkViewImage2DWithContourWidget *); - - // Description: - // Remove all objects from the list. - void RemoveAllItems(); - - // Description: - // Initialize the viewers togethers. - void Initialize(void); - - vtkGetObjectMacro (ExtraRenderWindow, vtkRenderWindow); - void SetExtraRenderWindow (vtkRenderWindow* win) - { this->ExtraRenderWindow = win; } - - vtkSyncSetMacro (Slice, int, vtkViewImage2DWithContourWidget ); - vtkSyncSetMacro (SliceOrientation, int, vtkViewImage2DWithContourWidget); - vtkSyncSetMacro (ShowAnnotations, int, vtkViewImage2DWithContourWidget); - vtkSyncSetMacro (ShowScalarBar, int, vtkViewImage2DWithContourWidget); - - vtkSyncSetMacro (ColorWindow, double, vtkViewImage2DWithContourWidget); - vtkSyncSetMacro (ColorLevel, double, vtkViewImage2DWithContourWidget); - - - vtkSyncSetObjectMacro (OrientationMatrix, vtkMatrix4x4, - vtkViewImage2DWithContourWidget); - vtkSyncSetObjectMacro (LookupTable, vtkLookupTable, - vtkViewImage2DWithContourWidget); - vtkSyncSetObjectMacro (TextProperty, vtkTextProperty, - vtkViewImage2DWithContourWidget); - vtkSyncSetObjectMacro (Input, vtkImageData, vtkViewImage2DWithContourWidget); - vtkSyncSetObjectMacro (InputConnection, vtkAlgorithmOutput, - vtkViewImage2DWithContourWidget); - - vtkSyncSetObjectMacro (Size, int, vtkViewImage2DWithContourWidget); - vtkSyncSetObjectMacro (Position, int, vtkViewImage2DWithContourWidget); - vtkSyncSetObjectMacro (WorldCoordinates, double, - vtkViewImage2DWithContourWidget); - - void SyncSetBackground( double* rgb ); - void SyncRender (void); - void SyncResetWindowLevel (void); - void SyncReset (void); - void SyncPan (void); - void SyncMaskImage( void ); - void SyncMaskImage( vtkImageData* mask, vtkLookupTable* lut ); - void SyncSetZoomAndParallelScale( double Zoom, double ParallelScale ); - -protected: - vtkViewImage2DWithContourWidgetCollection(); - ~vtkViewImage2DWithContourWidgetCollection(); - - vtkViewImage2DWithContourWidgetCollectionCommand* Command; - vtkRenderWindow* ExtraRenderWindow; - -private: - vtkViewImage2DWithContourWidgetCollection( - const vtkViewImage2DWithContourWidgetCollection& ); - void operator = ( const vtkViewImage2DWithContourWidgetCollection& ); -}; - - -class vtkViewImage2DWithContourWidgetCollectionCommand -: public vtkCommand -{ - - public: - - static vtkViewImage2DWithContourWidgetCollectionCommand *New() - {return new vtkViewImage2DWithContourWidgetCollectionCommand;}; - - vtkViewImage2DWithContourWidgetCollection* GetCollection (void) - { return this->Collection;}; - void SetCollection( vtkViewImage2DWithContourWidgetCollection* p ); - - // Description: - // Satisfy the superclass API for callbacks. Recall that the caller is - // the instance invoking the event; eid is the event id (see - // vtkCommand.h); and calldata is information sent when the callback - // was invoked (e.g., progress value in the vtkCommand::ProgressEvent). - virtual void Execute(vtkObject *caller,unsigned long event, - void *vtkNotUsed(callData)); - - protected: - - vtkViewImage2DWithContourWidgetCollectionCommand(); - ~vtkViewImage2DWithContourWidgetCollectionCommand(){}; - - private: - vtkViewImage2DWithContourWidgetCollection* Collection; - - double InitialWindow; - double InitialLevel; - -}; - -#endif diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.cxx b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.cxx deleted file mode 100644 index 0b9b0bcf..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.cxx +++ /dev/null @@ -1,567 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "vtkViewImage3D.h" - -#include "vtkCamera.h" -#include "vtkCommand.h" -#include "vtkImageActor.h" -#include "vtkImageData.h" -#include "vtkImageMapToWindowLevelColors.h" -#include "vtkInteractorStyleImage.h" -#include "vtkObjectFactory.h" -#include "vtkRenderWindow.h" -#include "vtkRenderWindowInteractor.h" -#include "vtkRenderer.h" -#include "vtkMatrix4x4.h" -#include "vtkTransform.h" -#include "vtkScalarBarActor.h" -#include "vtkOrientationAnnotation.h" -#include "vtkCornerAnnotation.h" -#include "vtkTextProperty.h" -#include "vtkLookupTable.h" -#include "vtkMath.h" -#include "vtkPlane.h" -#include "vtkCutter.h" -#include "vtkActor.h" -#include "vtkPolyDataMapper.h" -#include "vtkProp3DCollection.h" -#include "vtkDataSetCollection.h" -#include "vtkPoints.h" -#include "vtkIdList.h" -#include "vtkOutlineSource.h" -#include "vtkMatrixToLinearTransform.h" -#include "vtkPointData.h" -#include "vtkUnsignedCharArray.h" -#include "vtkIntArray.h" -#include "vtkImageAccumulate.h" - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "vtkRenderWindow.h" -#include "vtkScalarsToColors.h" -#include "vtkColorTransferFunction.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -vtkCxxRevisionMacro(vtkViewImage3D, "$Revision: 2 $"); -vtkStandardNewMacro(vtkViewImage3D); - - -//---------------------------------------------------------------------------- -class ImageActorCallback : public vtkCommand -{ -public: - - static ImageActorCallback *New() { return new ImageActorCallback; } - - void Execute(vtkObject *caller, - unsigned long event, - void *vtkNotUsed(callData)) - { - if (!this->Actor) - return; - vtkImageActor* imagecaller = vtkImageActor::SafeDownCast (caller); - - if( !imagecaller ) - return; - if( !imagecaller->GetInput() ) - return; - - if( event == vtkCommand::ModifiedEvent ) - { - this->Actor->SetInput(imagecaller->GetInput()); - this->Actor->SetInterpolate(imagecaller->GetInterpolate()); - this->Actor->SetOpacity(imagecaller->GetOpacity()); - this->Actor->SetDisplayExtent (imagecaller->GetDisplayExtent()); - } - } - - vtkImageActor* Actor; -protected: - ImageActorCallback() : Actor( 0 ) {} - ~ImageActorCallback() {} - -}; - - - -//---------------------------------------------------------------------------- -vtkViewImage3D::vtkViewImage3D() -{ - this->VolumeProperty = vtkVolumeProperty::New(); - this->VolumeActor = vtkVolume::New(); - this->VolumeRayCastMapper = vtkVolumeRayCastMapper::New(); - this->VolumeRayCastMIPFunction = vtkVolumeRayCastMIPFunction::New(); - this->VolumeRayCastCompositeFunction = - vtkVolumeRayCastCompositeFunction::New(); - this->VolumeRayCastIsosurfaceFunction = - vtkVolumeRayCastIsosurfaceFunction::New(); - this->OpacityFunction = vtkPiecewiseFunction::New(); - this->BoxWidget = vtkOrientedBoxWidget::New(); - this->Callback = vtkImage3DCroppingBoxCallback::New(); - this->Blender = vtkImageBlend::New(); - this->PlaneWidget = vtkPlaneWidget::New(); - this->VolumeMapper3D = vtkVolumeTextureMapper3D::New(); - - this->Phantom.push_back( vtkImageActor::New() ); - this->Phantom.push_back( vtkImageActor::New() ); - this->Phantom.push_back( vtkImageActor::New() ); - - this->PhantomCallback.push_back( ImageActorCallback::New() ); - this->PhantomCallback.push_back( ImageActorCallback::New() ); - this->PhantomCallback.push_back( ImageActorCallback::New() ); - - this->BoundsActor.push_back( vtkActor::New() ); - this->BoundsActor.push_back( vtkActor::New() ); - this->BoundsActor.push_back( vtkActor::New() ); - - this->SetupVolumeRendering(); - this->SetupWidgets(); -} - -//---------------------------------------------------------------------------- -vtkViewImage3D::~vtkViewImage3D() -{ - // delete all vtk objetcts: - this->VolumeMapper3D->Delete(); - this->VolumeProperty->Delete(); - this->VolumeActor->Delete(); - this->OpacityFunction->Delete(); - this->BoxWidget->Delete(); - this->Callback->Delete(); - this->Cube->Delete(); - this->Marker->Delete(); - this->Blender->Delete(); - this->PlaneWidget->Delete(); - this->VolumeRayCastMapper->Delete(); - this->VolumeRayCastMIPFunction->Delete(); - this->VolumeRayCastCompositeFunction->Delete(); - this->VolumeRayCastIsosurfaceFunction->Delete(); - this->Phantom[0]->Delete(); - this->Phantom[1]->Delete(); - this->Phantom[2]->Delete(); - this->PhantomCallback[0]->Delete(); - this->PhantomCallback[1]->Delete(); - this->PhantomCallback[2]->Delete(); - this->BoundsActor[0]->Delete(); - this->BoundsActor[1]->Delete(); - this->BoundsActor[2]->Delete(); -} - - -//---------------------------------------------------------------------------- -void vtkViewImage3D::SetupVolumeRendering() -{ - this->Blender->SetBlendModeToNormal(); - this->Blender->SetOpacity (0, 0.25); - this->Blender->SetOpacity (1, 0.75); - vtkVolumeTextureMapper3D* texturemapper = - vtkVolumeTextureMapper3D::SafeDownCast ( this->VolumeActor->GetMapper() ); - if (texturemapper) - { - texturemapper->SetSampleDistance(0.5); - texturemapper->SetPreferredMethodToNVidia(); - } - - this->VolumeMapper3D->CroppingOn(); - this->VolumeMapper3D->SetCroppingRegionFlagsToSubVolume(); - this->VolumeMapper3D->SetCroppingRegionFlags (0x7ffdfff); - this->VolumeRayCastMapper->SetSampleDistance(2.0); - this->VolumeRayCastMapper->CroppingOn(); - this->VolumeRayCastMapper->SetCroppingRegionFlags (0x7ffdfff); - vtkFiniteDifferenceGradientEstimator *gradest = - vtkFiniteDifferenceGradientEstimator::New(); - this->VolumeRayCastMapper->SetGradientEstimator(gradest); - gradest->Delete(); - this->VolumeRayCastMapper->SetVolumeRayCastFunction ( - this->VolumeRayCastCompositeFunction ); - this->OpacityFunction->AddPoint (0, 0.0); - this->OpacityFunction->AddPoint (255, 1.0); - vtkColorTransferFunction* colorfunction = vtkColorTransferFunction::New(); - colorfunction->AddRGBPoint (0, 0.0, 0.0, 0.0); - colorfunction->AddRGBPoint (255, 1.0, 1.0, 1.0); - this->VolumeProperty->IndependentComponentsOff(); - this->VolumeProperty->SetColor (colorfunction); - colorfunction->Delete(); - this->VolumeProperty->SetScalarOpacity(this->OpacityFunction); - this->VolumeProperty->SetInterpolationTypeToLinear(); - this->VolumeProperty->ShadeOff(); - this->VolumeProperty->SetDiffuse (0.9); - this->VolumeProperty->SetAmbient (0.2); - this->VolumeProperty->SetSpecular (0.3); - this->VolumeProperty->SetSpecularPower (15.0); - // set up the vtk pipeline: volume rendering - this->VolumeActor->SetProperty ( this->VolumeProperty ); - this->VolumeActor->SetMapper ( this->VolumeMapper3D ); - this->VolumeActor->PickableOff(); - this->VolumeActor->DragableOff(); - this->VolumeActor->SetVisibility (0); - - // set up the boxwidget/ callback - this->Callback->SetVolumeMapper ( this->VolumeMapper3D ); - - this->Renderer->AddViewProp (this->VolumeActor); - -} - - -//---------------------------------------------------------------------------- -void vtkViewImage3D::SetupWidgets() -{ - - // Create an annotated cube actor (directions) - this->Cube = vtkAnnotatedCubeActor::New(); - this->Cube->SetXPlusFaceText ("L"); - this->Cube->SetXMinusFaceText ("R"); - this->Cube->SetYPlusFaceText ("P"); - this->Cube->SetYMinusFaceText ("A"); - this->Cube->SetZPlusFaceText ("D"); - this->Cube->SetZMinusFaceText ("V"); - this->Cube->SetZFaceTextRotation (90); - this->Cube->SetFaceTextScale (0.65); - this->Cube->GetCubeProperty()->SetColor (0.5, 1, 1); - this->Cube->GetTextEdgesProperty()->SetLineWidth (1); - this->Cube->GetTextEdgesProperty()->SetDiffuse (0); - this->Cube->GetTextEdgesProperty()->SetAmbient (1); - this->Cube->GetTextEdgesProperty()->SetColor (0.18, 0.28, 0.23); - -#if VTK_MAJOR_VERSION==5 && VTK_MINOR_VERSION>=1 - this->Cube->SetTextEdgesVisibility (1); - this->Cube->SetCubeVisibility(1); - this->Cube->SetFaceTextVisibility(1); -#else - this->Cube->TextEdgesOn (); - this->Cube->FaceTextOn(); - this->Cube->CubeOn(); -#endif - - this->Cube->GetXPlusFaceProperty()->SetColor (1, 0, 0); - this->Cube->GetXPlusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetXMinusFaceProperty()->SetColor (1, 0, 0); - this->Cube->GetXMinusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetYPlusFaceProperty()->SetColor (0, 1, 0); - this->Cube->GetYPlusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetYMinusFaceProperty()->SetColor (0, 1, 0); - this->Cube->GetYMinusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetZPlusFaceProperty()->SetColor (0, 0, 1); - this->Cube->GetZPlusFaceProperty()->SetInterpolationToFlat(); - this->Cube->GetZMinusFaceProperty()->SetColor (0, 0, 1); - this->Cube->GetZMinusFaceProperty()->SetInterpolationToFlat(); - - this->Marker = vtkOrientationMarkerWidget::New(); - this->Marker->SetOutlineColor (0.93, 0.57, 0.13); - this->Marker->SetOrientationMarker (this->Cube); - this->Marker->SetViewport (0.0, 0.05, 0.15, 0.15); - - this->BoxWidget->RotationEnabledOff(); - this->BoxWidget->SetPlaceFactor (0.5); - this->BoxWidget->SetKeyPressActivationValue ('b'); - this->BoxWidget->AddObserver (vtkCommand::InteractionEvent, this->Callback); - - this->PlaneWidget->SetKeyPressActivationValue ('p'); - this->PlaneWidget->NormalToZAxisOn(); - -} - -//---------------------------------------------------------------------------- -void vtkViewImage3D::Render() -{ - - if (this->FirstRender) - { - // Initialize the size if not set yet - - vtkImageData *input = this->GetInput(); - if (this->RenderWindow->GetSize()[0] == 0 && input) - { - if (this->Renderer) - { - this->Renderer->ResetCamera(); - } - this->FirstRender = 0; - } - } - if (this->GetInput()) - { - this->RenderWindow->Render(); - } -} - - -void vtkViewImage3D::Add2DPhantom(const unsigned int& i, - vtkImageActor* input, - vtkPolyData* in_bounds ) -{ - if( i >= 3 ) - return; - - vtkRenderer* ren = this->GetRenderer(); - if( ren ) - { - this->Phantom[i]->SetInput (input->GetInput()); - this->Phantom[i]->SetDisplayExtent (input->GetDisplayExtent()); - this->Phantom[i]->SetUserMatrix (input->GetUserMatrix()); - this->PhantomCallback[i]->Actor = this->Phantom[i]; - input->AddObserver (vtkCommand::ModifiedEvent, this->PhantomCallback[i]); - ren->AddActor (this->Phantom[i]); - - /** - IMPORTANT NOTE - - Adding a 2D actor in the 3D scene should be as simple as the next line - instead of the code above... - - Unfortunately it does not seem to work properly. But this is something - we should investigate in because it would be much simpler - */ - // this->GetRenderer()->AddActor (input); - - if( in_bounds ) - { - vtkPolyDataMapper* bounds_mapper = vtkPolyDataMapper::New(); - bounds_mapper->SetInput( in_bounds ); - - this->BoundsActor[i]->SetMapper( bounds_mapper ); - this->BoundsActor[i]->GetProperty()->SetRepresentationToWireframe(); - this->BoundsActor[i]->GetProperty()->SetLineWidth( 2. ); - - ren->AddActor( this->BoundsActor[i] ); - bounds_mapper->Delete(); - } - - } - -} - -//---------------------------------------------------------------------------- -void vtkViewImage3D::InstallPipeline() -{ - if (this->RenderWindow && this->Renderer) - { - this->RenderWindow->AddRenderer(this->Renderer); - } - - if (this->Interactor) - { - - // init the interactor style: - vtkInteractorStyleSwitch* interactorStyle = vtkInteractorStyleSwitch::New(); - interactorStyle->SetCurrentStyleToTrackballCamera(); - this->Interactor->SetInteractorStyle (interactorStyle); - this->BoxWidget->SetInteractor ( this->Interactor ); - this->PlaneWidget->SetInteractor ( this->Interactor ); - this->Marker->SetInteractor ( this->Interactor ); - interactorStyle->Delete(); - this->Interactor->SetRenderWindow(this->RenderWindow); - - this->Marker->On(); - this->Marker->InteractiveOff (); - - } - -} - - -//---------------------------------------------------------------------------- -void vtkViewImage3D::SetInput(vtkImageData* image) -{ - this->Superclass::SetInput (image); - - if( !image ) - { - return; - } - - int* size = image->GetDimensions(); - - if ( (size[0] < 2) || - (size[1] < 2) || - (size[2] < 2) ) - { - vtkWarningMacro ( <<"Cannot do volume rendering for a single slice, skipping"<VolumeMapper3D->SetInput ( this->GetInput() ); - this->VolumeRayCastMapper->SetInput ( this->GetInput() ); - - this->SetupTextureMapper(); - - this->BoxWidget->SetInput (this->GetInput()); - this->BoxWidget->PlaceWidget(); - - this->PlaneWidget->SetInput (this->GetInput()); - this->PlaneWidget->PlaceWidget(); - - // line to be removed: the box has to be called externally - this->BoxWidget->On(); - - this->VolumeActor->SetVisibility (1); -} - - - -//---------------------------------------------------------------------------- -void vtkViewImage3D::SetOrientationMatrix (vtkMatrix4x4* matrix) -{ - this->Superclass::SetOrientationMatrix (matrix); - - this->VolumeActor->SetUserMatrix (matrix); - this->BoxWidget->SetOrientationMatrix (matrix); -// this->PlaneWidget->SetTransform (transform); -} - - - -//---------------------------------------------------------------------------- -void vtkViewImage3D::SetupTextureMapper() -{ - - if (!this->GetInput()) - return; - - vtkVolumeTextureMapper3D* mapper3D = - vtkVolumeTextureMapper3D::SafeDownCast( this->VolumeActor->GetMapper() ); - - if( mapper3D && !this->GetRenderWindow()->GetNeverRendered() ) - { - if( !mapper3D->IsRenderSupported ( this->VolumeProperty ) ) - { - //try the ATI fragment program implementation - mapper3D->SetPreferredMethodToFragmentProgram(); - if ( !mapper3D->IsRenderSupported ( this->VolumeProperty ) ) - { - vtkWarningMacro ( - <<"Warning: 3D Texture volume rendering is not supported by your" - <<" hardware, I switch to 2D Texture rendering."<CroppingOn(); - newMapper->SetCroppingRegionFlags (0x7ffdfff); - - - double* range = this->GetInput()->GetScalarRange(); - double shift = 0 - range[0]; - double scale = 65535.0/(range[1] - range[0]); - - vtkImageShiftScale* scaler = vtkImageShiftScale::New(); - scaler->SetInput (this->GetInput()); - scaler->SetShift (shift); - scaler->SetScale (scale); - scaler->SetOutputScalarTypeToUnsignedShort(); - scaler->Update(); - newMapper->SetInput ( scaler->GetOutput() ); - scaler->Delete(); - this->Callback->SetVolumeMapper (newMapper); - - mapper3D->Delete(); - this->VolumeMapper3D = newMapper; - this->VolumeActor->SetMapper ( this->VolumeMapper3D ); - } - } - } -} diff --git a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.h b/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.h deleted file mode 100644 index 39295661..00000000 --- a/branches/ColorViewer/ExternalCode/MegaVTK/vtkRenderingAddOn/vtkViewImage3D.h +++ /dev/null @@ -1,335 +0,0 @@ -/*======================================================================== - Copyright (c) INRIA - ASCLEPIOS Project (http://www-sop.inria.fr/asclepios). - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of INRIA or ASCLEPIOS, nor the names of any contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS'' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef _vtkViewImage3D_h_ -#define _vtkViewImage3D_h_ - -#include "vtkViewImage.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "vtkImage3DCroppingBoxCallback.h" -#include - -#include - -class vtkVolumeTextureMapper3D; -class vtkVolumeMapper; -class vtkVolumeRayCastFunction; -class vtkPiecewiseFunction; -class vtkColorTransferFunction; -class vtkVolume; -class vtkImageActor; -class vtkAxes; -class vtkDataSet3DCroppingPlaneCallback; -class vtkTubeFilter; -class vtkAnnotatedCubeActor; -class vtkOrientationMarkerWidget; -class vtkAxesActor; -class vtkImageBlend; -class vtkViewImage2D; -class vtkScalarsToColors; -class vtkColorTransferFunction; - - -/** - -*/ - -class ImageActorCallback; - -class vtkViewImage3D : public vtkViewImage -{ - - public: - - static vtkViewImage3D* New(); - vtkTypeRevisionMacro(vtkViewImage3D, vtkViewImage); - - // Description: - // Render the resulting image. - virtual void Render(void); - - /** - Add a dataset to the view (has to be subclass of vtkPointSet). - The dataset will be cut through the implicit slice plane - (GetImplicitSlicePlane()). - - This results in a loss of dimensionality, i.e. tetrahedron will be displayed - as triangles, triangles as lines, lines as points. - A vtkProperty of the dataset can be specified. - */ - virtual void AddDataSet (vtkDataSet* dataset, - vtkProperty* property = NULL, - const bool& intersection = true ) {}; - /** - Set/Get the current slice to display (depending on the orientation - this can be in X, Y or Z). - */ - virtual void SetSlice(int s){}; - virtual void SetSliceOrientation(int orientation){}; - // Description: - // Update the display extent manually so that the proper slice for the - // given orientation is displayed. It will also try to set a - // reasonable camera clipping range. - // This method is called automatically when the Input is changed, but - // most of the time the input of this class is likely to remain the same, - // i.e. connected to the output of a filter, or an image reader. When the - // input of this filter or reader itself is changed, an error message might - // be displayed since the current display extent is probably outside - // the new whole extent. Calling this method will ensure that the display - // extent is reset properly. - virtual void UpdateDisplayExtent(){}; - - virtual void Add2DPhantom( - const unsigned int& i, - vtkImageActor* input, - vtkPolyData* in_bounds = NULL ); - - virtual void SetInput (vtkImageData* input); - - virtual void SetOrientationMatrix (vtkMatrix4x4* matrix); - - void SetVolumeRenderingOff() - { - this->VolumeActor->SetVisibility (false); - this->BoxWidget->Off(); - } - - void SetVolumeRenderingOn() - { - this->VolumeActor->SetVisibility(true); - } - - void SetTriPlanarRenderingOn() - { - this->VolumeActor->SetVisibility(false); - for( int i = 0; i < 3; i++ ) - { - this->Phantom[i]->SetVisibility(true); - this->BoundsActor[i]->SetVisibility(true); - } - } - - void SetTriPlanarRenderingOff() - { - this->VolumeActor->SetVisibility(true); - for( int i = 0; i < 3; i++ ) - { - this->Phantom[i]->SetVisibility(false); - this->BoundsActor[i]->SetVisibility(false); - } - } - - void SetVolumeMapperToTexture (void) - { - this->VolumeActor->SetMapper ( this->VolumeMapper3D ); - this->Callback->SetVolumeMapper ( this->VolumeMapper3D ); - } - - void SetVolumeMapperToRayCast (void) - { - this->VolumeActor->SetMapper ( this->VolumeRayCastMapper ); - this->Callback->SetVolumeMapper ( this->VolumeRayCastMapper ); - } - - void SetVolumeRayCastFunctionToComposite (void) - { - this->VolumeRayCastMapper->SetVolumeRayCastFunction - (this->VolumeRayCastCompositeFunction ); - } - - - void SetVolumeRayCastFunctionToMIP (void) - { - this->VolumeRayCastMapper->SetVolumeRayCastFunction - ( this->VolumeRayCastMIPFunction ); - } - - - void SetVolumeRayCastFunctionToIsosurface (void) - { - this->VolumeRayCastMapper->SetVolumeRayCastFunction - ( this->VolumeRayCastIsosurfaceFunction ); - } - - - - /** Set the box widget visibility */ - void SetBoxWidgetVisibility (int a) - { - if (this->Interactor) - this->BoxWidget->SetEnabled (a); - } - bool GetBoxWidgetVisibility (void) - { - return ( this->BoxWidget->GetEnabled() == 1 ); - } - vtkBooleanMacro (BoxWidgetVisibility, int); - - /** Set the plane widget on */ - void SetPlaneWidgetVisibility (int a) - { - if (this->Interactor) - this->PlaneWidget->SetEnabled (a); - } - bool GetPlaneWidgetVisibility (void) - { - return ( this->PlaneWidget->GetEnabled() == 1 ); - } - vtkBooleanMacro (PlaneWidgetVisibility, int); - - /** Set the cube widget on */ - void SetCubeVisibility (int a) - { - if (this->Interactor) - this->Marker->SetEnabled (a); - } - bool GetCubeVisibility (void) - { - return ( this->Marker->GetEnabled() == 1 ); - } - vtkBooleanMacro (CubeVisibility, int); - - void SetShade (int a) - { - this->VolumeProperty->SetShade (a); - } - bool GetShade (void) - { - return ( this->VolumeProperty->GetShade() == 1 ); - } - vtkBooleanMacro (Shade, int); - - - /** Get volume actor */ - vtkGetObjectMacro (VolumeActor, vtkVolume); - vtkGetObjectMacro (PlaneWidget, vtkPlaneWidget); - vtkGetObjectMacro (VolumeProperty, vtkVolumeProperty); - vtkGetObjectMacro (BoxWidget, vtkOrientedBoxWidget); - - - - protected: - - vtkViewImage3D(); - ~vtkViewImage3D(); - - // Description: - virtual void InstallPipeline(); - virtual void UpdateOrientation(){} - - virtual void SetupVolumeRendering(); - virtual void SetupWidgets(); - virtual void SetupTextureMapper(); - - // texture mapper in 3D - vtkVolumeMapper* VolumeMapper3D; - // volume ray cast mapper - vtkVolumeRayCastMapper* VolumeRayCastMapper; - // ray cast function - vtkVolumeRayCastMIPFunction* VolumeRayCastMIPFunction; - // ray cast function - vtkVolumeRayCastCompositeFunction* VolumeRayCastCompositeFunction; - // ray cast function - vtkVolumeRayCastIsosurfaceFunction* VolumeRayCastIsosurfaceFunction; - // volume property - vtkVolumeProperty* VolumeProperty; - // volume actor - vtkVolume* VolumeActor; - // opacity transfer function - vtkPiecewiseFunction* OpacityFunction; - // blender - vtkImageBlend* Blender; - // image 3D cropping box callback - vtkImage3DCroppingBoxCallback* Callback; - - std::vector< vtkImageActor* > Phantom; - std::vector< ImageActorCallback* > PhantomCallback; - std::vector< vtkActor* > BoundsActor; - - // box widget - vtkOrientedBoxWidget* BoxWidget; - // vtkPlane widget - vtkPlaneWidget* PlaneWidget; - // annotated cube actor - vtkAnnotatedCubeActor* Cube; - vtkOrientationMarkerWidget* Marker; - -}; - -#endif /* _vtkViewImage3D_h_ */ diff --git a/branches/ColorViewer/ExternalCode/itkQt/itkQtAdaptor.h b/branches/ColorViewer/ExternalCode/itkQt/itkQtAdaptor.h deleted file mode 100644 index 86a9e821..00000000 --- a/branches/ColorViewer/ExternalCode/itkQt/itkQtAdaptor.h +++ /dev/null @@ -1,197 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile: itkQtAdaptor.h,v $ - Language: C++ - Date: $Date: 2002-09-13 14:32:40 $ - Version: $Revision: 1.4 $ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -=========================================================================*/ - -#ifndef __itkQtAdaptor_h -#define __itkQtAdaptor_h - -#include -#include "itkObject.h" -#include "itkObjectFactory.h" -#include "itkCommand.h" - - -namespace itk { - -/** Helper class that interface with Qt Signals and Slots */ -class QtTranslator : public QObject -{ - - Q_OBJECT - -public: - QtTranslator() {} - virtual ~QtTranslator() {} - -signals: - void Signal(); - -public slots: - virtual void Slot() {}; - virtual void Slot(int) {}; - virtual void Slot(double) {}; - -}; - - - -/** Helper class that interface Methods with Qt Slots */ -template -class QtSlotAdaptor : public QtTranslator -{ - typedef void (T::*TMemberFunctionVoidPointer)(); - typedef void (T::*TMemberFunctionIntPointer)(int); - typedef void (T::*TMemberFunctionDoublePointer)(double); - -public: - QtSlotAdaptor():m_MemberFunctionVoid(0), - m_MemberFunctionInt(0), - m_MemberFunctionDouble(0) {} - - virtual ~QtSlotAdaptor() {} - - /** Specify the callback function. */ - void SetCallbackFunction(T* object, - TMemberFunctionVoidPointer memberFunction) - { - m_This = object; - m_MemberFunctionVoid = memberFunction; - } - - /** Specify the callback function. */ - void SetCallbackFunction(T* object, - TMemberFunctionIntPointer memberFunction) - { - m_This = object; - m_MemberFunctionInt = memberFunction; - } - - /** Specify the callback function. */ - void SetCallbackFunction(T* object, - TMemberFunctionDoublePointer memberFunction) - { - m_This = object; - m_MemberFunctionDouble = memberFunction; - } - - /** Slot to be connected to Qt Signals. */ - void Slot() - { - if( m_MemberFunctionVoid ) - { - ((*m_This).*(m_MemberFunctionVoid))(); - } - } - - /** Slot to be connected to Qt Signals. */ - void Slot(int value) - { - if( m_MemberFunctionInt ) - { - ((*m_This).*(m_MemberFunctionInt))(value); - } - } - - /** Slot to be connected to Qt Signals. */ - void Slot(double value) - { - if( m_MemberFunctionDouble ) - { - ((*m_This).*(m_MemberFunctionDouble))(value); - } - } - - - -protected: - T* m_This; - TMemberFunctionVoidPointer m_MemberFunctionVoid; - TMemberFunctionIntPointer m_MemberFunctionInt; - TMemberFunctionDoublePointer m_MemberFunctionDouble; - - -}; - - - - - -/** Helper class that interface Observers with Qt Signals */ -class QtSignalAdaptor : public QtTranslator -{ - typedef SimpleMemberCommand CommandType; - -public: - QtSignalAdaptor() - { - m_Command = CommandType::New(); - m_Command->SetCallbackFunction( this, & QtSignalAdaptor::EmitSignal ); - } - - virtual ~QtSignalAdaptor() {} - - CommandType * GetCommand() - { - return m_Command; - } - - void EmitSignal() - { - emit Signal(); - } - -private: - CommandType::Pointer m_Command; -}; - -} // end namespace - -#endif - diff --git a/branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.cxx b/branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.cxx deleted file mode 100644 index 42f3ddd1..00000000 --- a/branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.cxx +++ /dev/null @@ -1,132 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile: itkQtProgressBar.cxx,v $ - Language: C++ - Date: $Date: 2002-09-13 14:32:01 $ - Version: $Revision: 1.3 $ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - - -#include "itkProcessObject.h" -#include "itkQtProgressBar.h" - - -namespace itk { - -/** Constructor */ -QtProgressBar::QtProgressBar( QWidget *parent ):QProgressBar(parent) -{ - m_RedrawCommand = RedrawCommandType::New(); - m_RedrawCommand->SetCallbackFunction( this, &QtProgressBar::ProcessEvent ); - m_RedrawCommand->SetCallbackFunction( this, &QtProgressBar::ConstProcessEvent ); - - this->setMinimum( 0 ); - this->setMaximum( 100 ); - this->reset(); - -} - - -/** Get Command */ -QtProgressBar::RedrawCommandType * -QtProgressBar::GetRedrawCommand( void ) const -{ - return m_RedrawCommand.GetPointer(); -} - - - - - -/** Manage a Progress event */ -void -QtProgressBar::ProcessEvent( itk::Object * caller, - const itk::EventObject & event ) -{ - if( typeid( itk::ProgressEvent ) == typeid( event ) ) - { - ::itk::ProcessObject::Pointer process = - dynamic_cast< itk::ProcessObject *>( caller ); - - const int value = static_cast( - process->GetProgress() * this->maximum() ); - std::cout << "New Value : " << value << std::endl; - this->setValue( value ); - } -} - - - - -void -QtProgressBar::ConstProcessEvent( const itk::Object * caller, - const itk::EventObject & event ) -{ - if( typeid( itk::ProgressEvent ) == typeid( event ) ) - { - itk::ProcessObject::ConstPointer process = - dynamic_cast< const itk::ProcessObject *>( caller ); - - const int value = static_cast( - process->GetProgress() * this->maximum() ); - std::cout << "New Value : " << value << std::endl; - this->setValue( value ); - } -} - - -/** Manage a Progress event */ -void -QtProgressBar::Observe( itk::Object *caller ) -{ - caller->AddObserver( itk::ProgressEvent(), m_RedrawCommand.GetPointer() ); -} - - - -} // end namespace fltk - - diff --git a/branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.h b/branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.h deleted file mode 100644 index 738b2fce..00000000 --- a/branches/ColorViewer/ExternalCode/itkQt/itkQtProgressBar.h +++ /dev/null @@ -1,95 +0,0 @@ -/*========================================================================= - - Program: Insight Segmentation & Registration Toolkit - Module: $RCSfile: itkQtProgressBar.h,v $ - Language: C++ - Date: $Date: $ - Version: $Revision: $ - - Copyright (c) 2002 Insight Consortium. All rights reserved. - See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - - =========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __itkQtProgressBar_h -#define __itkQtProgressBar_h - -#include -#include "itkCommand.h" - -namespace itk { - - -class QtProgressBar : public ::QProgressBar -{ - -public: - - /** Command Class invoked for button redraw */ - typedef itk::MemberCommand< QtProgressBar > RedrawCommandType; - - /** Constructor */ - explicit QtProgressBar( QWidget *parent = 0 ); - - /** Get Command */ - RedrawCommandType * GetRedrawCommand( void ) const; - - - /** Manage a Progress event */ - void ProcessEvent(itk::Object * caller, const itk::EventObject & event ); - void ConstProcessEvent(const itk::Object * caller, const itk::EventObject & event ); - - - /** Manage a Progress event */ - void Observe( itk::Object *caller ); - -private: - - RedrawCommandType::Pointer m_RedrawCommand; - - - -}; - - -} // end of namespace - -#endif diff --git a/branches/ColorViewer/ExternalCode/qticonloader/qticonloader.cxx b/branches/ColorViewer/ExternalCode/qticonloader/qticonloader.cxx deleted file mode 100644 index 7ce4bfe7..00000000 --- a/branches/ColorViewer/ExternalCode/qticonloader/qticonloader.cxx +++ /dev/null @@ -1,351 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtIconLoader project on Qt Software Labs. -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information -** to ensure GNU General Public Licensing requirements will be met: -** http://www.fsf.org/licensing/licenses/info/GPLv2.html and -** http://www.gnu.org/copyleft/gpl.html. In addition, as a special -** exception, Nokia gives you certain additional rights. These rights -** are described in the Nokia Qt GPL Exception version 1.3, included in -** the file GPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - - -#include "qticonloader.h" -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef Q_WS_X11 - -class QIconTheme -{ -public: - QIconTheme(QHash dirList, QStringList parents) : - _dirList(dirList), _parents(parents), _valid(true){ } - QIconTheme() : _valid(false){ } - QHash dirList() {return _dirList;} - QStringList parents() {return _parents;} - bool isValid() {return _valid;} - -private: - QHash _dirList; - QStringList _parents; - bool _valid; -}; - -class QtIconLoaderImplementation -{ -public: - QtIconLoaderImplementation(); - QPixmap findIcon(int size, const QString &name) const; - -private: - QIconTheme parseIndexFile(const QString &themeName) const; - void lookupIconTheme() const; - QPixmap findIconHelper(int size, - const QString &themeName, - const QString &iconName, - QStringList &visited) const; - mutable QString themeName; - mutable QStringList iconDirs; - mutable QHash themeList; -}; - -Q_GLOBAL_STATIC(QtIconLoaderImplementation, iconLoaderInstance) -#endif - -/*! - - Returns the standard icon for the given icon /a name - as specified in the freedesktop icon spec - http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html - - /a fallback is an optional argument to specify the icon to be used if - no icon is found on the platform. This is particularily useful for - crossplatform code. - -*/ -QIcon QtIconLoader::icon(const QString &name, const QIcon &fallback) -{ - QIcon icon; -#ifdef Q_WS_X11 - QString pngExtension(QLatin1String(".png")); - QList iconSizes; - iconSizes << 16 << 24 << 32 << 64; - foreach (int size, iconSizes) { - icon.addPixmap(iconLoaderInstance()->findIcon(size, name + pngExtension)); - } - - if (icon.isNull()) - icon = fallback; -#else - Q_UNUSED(name); - Q_UNUSED(fallback); -#endif // Q_WS_X11 - return icon; -} - -#ifdef Q_WS_X11 - -QtIconLoaderImplementation::QtIconLoaderImplementation() -{ - lookupIconTheme(); -} - -extern "C" { - struct GConfClient; - struct GError; - typedef void (*Ptr_g_type_init)(); - typedef GConfClient* (*Ptr_gconf_client_get_default)(); - typedef char* (*Ptr_gconf_client_get_string)(GConfClient*, const char*, GError **); - typedef void (*Ptr_g_object_unref)(void *); - typedef void (*Ptr_g_error_free)(GError *); - typedef void (*Ptr_g_free)(void*); - static Ptr_g_type_init p_g_type_init = 0; - static Ptr_gconf_client_get_default p_gconf_client_get_default = 0; - static Ptr_gconf_client_get_string p_gconf_client_get_string = 0; - static Ptr_g_object_unref p_g_object_unref = 0; - static Ptr_g_error_free p_g_error_free = 0; - static Ptr_g_free p_g_free = 0; -} - - -static int kdeVersion() -{ - static int version = -1; - if (version == -1) - version = qgetenv("KDE_SESSION_VERSION").toInt(); - return version; -} - -static QString kdeHome() -{ - static QString kdeHomePath; - if (kdeHomePath.isEmpty()) { - kdeHomePath = QString::fromLocal8Bit(qgetenv("KDEHOME")); - if (kdeHomePath.isEmpty()) { - int kdeSessionVersion = QString::fromLocal8Bit(qgetenv("KDE_SESSION_VERSION")).toInt(); - QDir homeDir(QDir::homePath()); - QString kdeConfDir(QLatin1String("/.kde")); - if (4 == kdeSessionVersion && homeDir.exists(QLatin1String(".kde4"))) - kdeConfDir = QLatin1String("/.kde4"); - kdeHomePath = QDir::homePath() + kdeConfDir; - } - } - return kdeHomePath; -} - -void QtIconLoaderImplementation::lookupIconTheme() const -{ - -#ifdef Q_WS_X11 - QString dataDirs = QLatin1String(getenv("XDG_DATA_DIRS")); - if (dataDirs.isEmpty()) - dataDirs = QLatin1String("/usr/local/share/:/usr/share/"); - - dataDirs.prepend(QDir::homePath() + QLatin1String("/:")); - iconDirs = dataDirs.split(QLatin1String(":")); - - // If we are running GNOME we resolve and use GConf. In all other - // cases we currently use the KDE icon theme - - if (qgetenv("DESKTOP_SESSION") == "gnome" || - !qgetenv("GNOME_DESKTOP_SESSION_ID").isEmpty()) { - - if (themeName.isEmpty()) { - // Resolve glib and gconf - - p_g_type_init = (Ptr_g_type_init)QLibrary::resolve(QLatin1String("gobject-2.0"), 0, "g_type_init"); - p_gconf_client_get_default = (Ptr_gconf_client_get_default)QLibrary::resolve(QLatin1String("gconf-2"), 4, "gconf_client_get_default"); - p_gconf_client_get_string = (Ptr_gconf_client_get_string)QLibrary::resolve(QLatin1String("gconf-2"), 4, "gconf_client_get_string"); - p_g_object_unref = (Ptr_g_object_unref)QLibrary::resolve(QLatin1String("gobject-2.0"), 0, "g_object_unref"); - p_g_error_free = (Ptr_g_error_free)QLibrary::resolve(QLatin1String("glib-2.0"), 0, "g_error_free"); - p_g_free = (Ptr_g_free)QLibrary::resolve(QLatin1String("glib-2.0"), 0, "g_free"); - - if (p_g_type_init && p_gconf_client_get_default && - p_gconf_client_get_string && p_g_object_unref && - p_g_error_free && p_g_free) { - - p_g_type_init(); - GConfClient* client = p_gconf_client_get_default(); - GError *err = 0; - - char *str = p_gconf_client_get_string(client, "/desktop/gnome/interface/icon_theme", &err); - if (!err) { - themeName = QString::fromUtf8(str); - p_g_free(str); - } - - p_g_object_unref(client); - if (err) - p_g_error_free (err); - } - if (themeName.isEmpty()) - themeName = QLatin1String("gnome"); - } - - if (!themeName.isEmpty()) - return; - } - - // KDE (and others) - if (dataDirs.isEmpty()) - dataDirs = QLatin1String("/usr/local/share/:/usr/share/"); - - dataDirs += QLatin1Char(':') + kdeHome() + QLatin1String("/share"); - dataDirs.prepend(QDir::homePath() + QLatin1String("/:")); - QStringList kdeDirs = QString::fromLocal8Bit(getenv("KDEDIRS")).split(QLatin1Char(':')); - foreach (const QString dirName, kdeDirs) - dataDirs.append(QLatin1String(":") + dirName + QLatin1String("/share")); - iconDirs = dataDirs.split(QLatin1Char(':')); - - QFileInfo fileInfo(QLatin1String("/usr/share/icons/default.kde")); - QDir dir(fileInfo.canonicalFilePath()); - int kdeVersion = qgetenv("KDE_SESSION_VERSION").toInt(); - QString kdeDefault = kdeVersion >= 4 ? QString::fromLatin1("oxygen") : QString::fromLatin1("crystalsvg"); - QString defaultTheme = fileInfo.exists() ? dir.dirName() : kdeDefault; - QSettings settings(kdeHome() + QLatin1String("/share/config/kdeglobals"), QSettings::IniFormat); - settings.beginGroup(QLatin1String("Icons")); - themeName = settings.value(QLatin1String("Theme"), defaultTheme).toString(); -#endif -} - -QIconTheme QtIconLoaderImplementation::parseIndexFile(const QString &themeName) const -{ - QIconTheme theme; - QFile themeIndex; - QStringList parents; - QHash dirList; - for ( int i = 0 ; i < iconDirs.size() && !themeIndex.exists() ; ++i) { - const QString &contentDir = QLatin1String(iconDirs[i].startsWith(QDir::homePath()) ? "/.icons/" : "/icons/"); - themeIndex.setFileName(iconDirs[i] + contentDir + themeName + QLatin1String("/index.theme")); - } - - if (themeIndex.open(QIODevice::ReadOnly | QIODevice::Text)) { - - QTextStream in(&themeIndex); - - while (!in.atEnd()) { - - QString line = in.readLine(); - - if (line.startsWith(QLatin1String("Inherits="))) { - line = line.right(line.length() - 9); - parents = line.split(QLatin1Char(',')); - } - - if (line.startsWith(QLatin1String("["))) { - line = line.trimmed(); - line.chop(1); - QString dirName = line.right(line.length() - 1); - if (!in.atEnd()) { - line = in.readLine(); - int size; - if (line.startsWith(QLatin1String("Size="))) { - size = line.right(line.length() - 5).toInt(); - if (size) - dirList.insertMulti(size, dirName); - } - } - } - } - } - - if (kdeVersion() >= 3) { - QFileInfo fileInfo(QLatin1String("/usr/share/icons/default.kde")); - QDir dir(fileInfo.canonicalFilePath()); - QString defaultKDETheme = dir.exists() ? dir.dirName() : kdeVersion() == 3 ? - QString::fromLatin1("crystalsvg") : QString::fromLatin1("oxygen"); - if (!parents.contains(defaultKDETheme) && themeName != defaultKDETheme) - parents.append(defaultKDETheme); - } else if (parents.isEmpty() && themeName != QLatin1String("hicolor")) { - parents.append(QLatin1String("hicolor")); - } - - theme = QIconTheme(dirList, parents); - return theme; -} - -QPixmap QtIconLoaderImplementation::findIconHelper(int size, const QString &themeName, - const QString &iconName, QStringList &visited) const -{ - QPixmap pixmap; - - if (!themeName.isEmpty()) { - visited << themeName; - QIconTheme theme = themeList.value(themeName); - - if (!theme.isValid()) { - theme = parseIndexFile(themeName); - themeList.insert(themeName, theme); - } - - if (!theme.isValid()) - return QPixmap(); - - QList subDirs = theme.dirList().values(size); - - for ( int i = 0 ; i < iconDirs.size() ; ++i) { - for ( int j = 0 ; j < subDirs.size() ; ++j) { - QString contentDir = (iconDirs[i].startsWith(QDir::homePath())) ? - QLatin1String("/.icons/") : QLatin1String("/icons/"); - QString fileName = iconDirs[i] + contentDir + themeName + QLatin1Char('/') + subDirs[j] + QLatin1Char('/') + iconName; - QFile file(fileName); - if (file.exists()) - pixmap.load(fileName); - if (!pixmap.isNull()) - break; - } - } - - if (pixmap.isNull()) { - QStringList parents = theme.parents(); - //search recursively through inherited themes - for (int i = 0 ; pixmap.isNull() && i < parents.size() ; ++i) { - QString parentTheme = parents[i].trimmed(); - if (!visited.contains(parentTheme)) //guard against endless recursion - pixmap = findIconHelper(size, parentTheme, iconName, visited); - } - } - } - return pixmap; -} - -QPixmap QtIconLoaderImplementation::findIcon(int size, const QString &name) const -{ - QPixmap pixmap; - QString pixmapName = QLatin1String("$qt") + name + QString::number(size); - if (QPixmapCache::find(pixmapName, pixmap)) - return pixmap; - - if (!themeName.isEmpty()) { - QStringList visited; - pixmap = findIconHelper(size, themeName, name, visited); - } - QPixmapCache::insert(pixmapName, pixmap); - return pixmap; -} -#endif //Q_WS_X11 diff --git a/branches/ColorViewer/ExternalCode/qticonloader/qticonloader.h b/branches/ColorViewer/ExternalCode/qticonloader/qticonloader.h deleted file mode 100644 index 67c8f053..00000000 --- a/branches/ColorViewer/ExternalCode/qticonloader/qticonloader.h +++ /dev/null @@ -1,44 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtIconLoader project on Qt Software Labs. -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the file LICENSE.GPL included in -** the packaging of this file. Please review the following information -** to ensure GNU General Public Licensing requirements will be met: -** http://www.fsf.org/licensing/licenses/info/GPLv2.html and -** http://www.gnu.org/copyleft/gpl.html. In addition, as a special -** exception, Nokia gives you certain additional rights. These rights -** are described in the Nokia Qt GPL Exception version 1.3, included in -** the file GPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef QTICONLOADER_H -#define QTICONLOADER_H - -#include - -// This is the QtIconLoader -// Version 0.1 -// - -class QtIconLoader -{ -public: - static QIcon icon(const QString &name, const QIcon &fallback = QIcon()); -}; - -#endif // QTICONLOADER_H diff --git a/branches/ColorViewer/ExternalCode/vtkLSM/lzw.h b/branches/ColorViewer/ExternalCode/vtkLSM/lzw.h deleted file mode 100644 index 97a89198..00000000 --- a/branches/ColorViewer/ExternalCode/vtkLSM/lzw.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * LZW decoding - * Copyright (c) 2003 Fabrice Bellard - * Copyright (c) 2006 Konstantin Shishkov. - * Licensed under LGPL, see Licenses/LGPL for full license - */ -#define LZW_MAXBITS 12 -#define LZW_SIZTABLE (1<bbits < s->cursize) { - s->bbuf = (s->bbuf << 8) | (*s->pbuf++); - s->bbits += 8; - } - c = s->bbuf >> (s->bbits - s->cursize); - s->bbits -= s->cursize; - return c & s->curmask; -} - - -int lzw_decode_init(LZWState *p, int csize, unsigned char *buf, int buf_size) -{ - struct LZWState *s = (struct LZWState *)p; - - if(csize < 1 || csize > LZW_MAXBITS) - return -1; - /* read buffer */ - s->pbuf = buf; - s->ebuf = s->pbuf + buf_size; - s->bbuf = 0; - s->bbits = 0; - s->bs = 0; - - /* decoder */ - s->codesize = csize; - s->cursize = s->codesize + 1; - s->curmask = mask[s->cursize]; - s->top_slot = 1 << s->cursize; - s->clear_code = 1 << s->codesize; - s->end_code = s->clear_code + 1; - s->slot = s->newcodes = s->clear_code + 2; - s->oc = s->fc = -1; - s->sp = s->stack; - - s->extra_slot = 1; - return 0; -} - -/** - * Decode given number of bytes - * NOTE: the algorithm here is inspired from the LZW GIF decoder - * written by Steven A. Bennett in 1987. - */ -int lzw_decode(LZWState *p, unsigned char *buf, int len){ - int l, c, code, oc, fc; - unsigned char *sp; - struct LZWState *s = (struct LZWState *)p; - - if (s->end_code < 0) - return 0; - - l = len; - sp = s->sp; - oc = s->oc; - fc = s->fc; - - for (;;) { - while (sp > s->stack) { - *buf++ = *(--sp); - if ((--l) == 0) - goto the_end; - } - c = lzw_get_code(s); - if (c == s->end_code) { - break; - } else if (c == s->clear_code) { - s->cursize = s->codesize + 1; - s->curmask = mask[s->cursize]; - s->slot = s->newcodes; - s->top_slot = 1 << s->cursize; - fc= oc= -1; - } else { - code = c; - if (code == s->slot && fc>=0) { - *sp++ = fc; - code = oc; - }else if(code >= s->slot) - break; - while (code >= s->newcodes) { - *sp++ = s->suffix[code]; - code = s->prefix[code]; - } - *sp++ = code; - if (s->slot < s->top_slot && oc>=0) { - s->suffix[s->slot] = code; - s->prefix[s->slot++] = oc; - } - fc = code; - oc = c; - if (s->slot >= s->top_slot - s->extra_slot) { - if (s->cursize < LZW_MAXBITS) { - s->top_slot <<= 1; - s->curmask = mask[++s->cursize]; - } - } - } - } - s->end_code = -1; -the_end: - s->sp = sp; - s->oc = oc; - s->fc = fc; - return len - l; -} \ No newline at end of file diff --git a/branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.cxx b/branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.cxx deleted file mode 100644 index 7bdf8c06..00000000 --- a/branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.cxx +++ /dev/null @@ -1,1657 +0,0 @@ -/*========================================================================= - - Program: BioImageXD - Module: $RCSfile: vtkLSMReader.cxx,v $ - Language: C++ - Date: $Date: 2003/08/22 14:46:02 $ - Version: $Revision: 1.39 $ - - This is an open-source copyright as follows: - Copyright (c) 2004-2008 BioImageXD Development Team - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS - IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - -=========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - - -#include "vtkLSMReader.h" -#include "vtkObjectFactory.h" -#include "vtkImageData.h" -#include "vtkSource.h" -#include "vtkPointData.h" -#include "vtkByteSwap.h" -#include "vtkInformation.h" -#include "vtkInformationVector.h" -#include "vtkStreamingDemandDrivenPipeline.h" -#include - - -#define PRT_EXT(ext) ext[0],ext[1],ext[2],ext[3],ext[4],ext[5] -#define PRT_EXT2(ext) ext[0]<<","<SetNumberOfInputPorts(0); - this->SetNumberOfOutputPorts(1); - this->ChannelDataTypes = 0; - this->TrackWavelengths = 0; - this->ImageOffsets = 0; - this->ReadSizes = 0; - this->Clean(); -} - -vtkLSMReader::~vtkLSMReader() -{ - this->ClearFileName(); - this->ClearChannelNames(); - this->ChannelColors->Delete(); - this->BitsPerSample->Delete(); - this->StripOffset->Delete(); - this->StripByteCount->Delete(); - this->LaserNames->Delete(); - if(this->TrackWavelengths) { - this->TrackWavelengths->Delete(); - } - if(this->ChannelDataTypes) { - this->ChannelDataTypes->Delete(); - } - if(this->ImageOffsets) { - this->ImageOffsets->Delete(); - this->ImageOffsets = 0; - this->ReadSizes->Delete(); - this->ReadSizes = 0; - } - -} - -void vtkLSMReader::ClearFileName() -{ - if (this->File) - { - this->File->close(); - delete this->File; - this->File = NULL; - } - - if (this->FileName) - { - delete [] this->FileName; - this->FileName = NULL; - } -} -//---------------------------------------------------------------------------- -// This function sets the name of the file. -void vtkLSMReader::SetFileName(const char *name) -{ - if ( this->FileName && name && (!strcmp(this->FileName,name))) - { - return; - } - if (!name && !this->FileName) - { - return; - } - if (this->FileName) - { - delete [] this->FileName; - } - if (name) - { - this->FileName = new char[strlen(name) + 1]; - strcpy(this->FileName, name); - } - else - { - this->FileName = NULL; - } - this->NeedToReadHeaderInformationOn(); - this->Modified(); -} - - -void vtkLSMReader::Clean() -{ - - this->IntUpdateExtent[0] = this->IntUpdateExtent[1] = this->IntUpdateExtent[2] = this->IntUpdateExtent[4] = 0; - this->IntUpdateExtent[3] = this->IntUpdateExtent[5] = 0; - - this->DataExtent[0] = this->DataExtent[1] = this->DataExtent[2] = this->DataExtent[4] = 0; - this->DataExtent[3] = this->DataExtent[5] = 0; - this->OffsetToLastAccessedImage = 0; - this->NumberOfLastAccessedImage = 0; - this->FileNameChanged = 0; - this->FileName = NULL; - this->File = NULL; - this->VoxelSizes[0] = this->VoxelSizes[1] = this->VoxelSizes[2] = 0.0; - this->Identifier = 0; - - - this->LaserNames = vtkStringArray::New(); - this->TrackWavelengths = vtkDoubleArray::New(); - this->DataSpacing[0] = this->DataSpacing[1] = this->DataSpacing[2] = 1.0f; - this->Dimensions[0] = this->Dimensions[1] = this->Dimensions[2] = this->Dimensions[3] = this->Dimensions[4] = 0; - this->NewSubFileType = 0; - this->BitsPerSample = vtkUnsignedShortArray::New(); - this->BitsPerSample->SetNumberOfTuples(4); - this->BitsPerSample->SetNumberOfComponents(1); - this->Compression = 0; - this->StripOffset = vtkUnsignedIntArray::New(); - this->StripOffset->SetNumberOfTuples(4); - this->StripOffset->SetNumberOfComponents(1); - this->SamplesPerPixel = 0; - this->StripByteCount = vtkUnsignedIntArray::New(); - this->StripByteCount->SetNumberOfTuples(4); - this->StripByteCount->SetNumberOfComponents(1); - this->Predictor = 0; - this->PhotometricInterpretation = 0; - this->PlanarConfiguration = 0; - this->ColorMapOffset = 0; - this->LSMSpecificInfoOffset = 0; - this->NumberOfIntensityValues[0] = this->NumberOfIntensityValues[1] = - this->NumberOfIntensityValues[2] = this->NumberOfIntensityValues[3] = 0; - this->ScanType = 0; - this->DataType = 0; - this->ChannelColors = vtkIntArray::New(); - this->ChannelNames = NULL; - this->TimeStampInformation = vtkDoubleArray::New(); -} - - int vtkLSMReader::OpenFile() -{ - if (!this->FileName) - { - vtkErrorMacro(<<"FileName must be specified."); - return 0; - } - - // Close file from any previous image - if (this->File) - { - this->File->close(); - delete this->File; - this->File = NULL; - } - - // Open the new file -#ifdef _WIN32 - this->File = new ifstream(this->FileName, ios::in | ios::binary); -#else - this->File = new ifstream(this->FileName, ios::in); -#endif - if (! this->File || this->File->fail()) - { - vtkErrorMacro(<< "OpenFile: Could not open file " <FileName); - return 0; - } - return 1; -} - - -void vtkLSMReader::SetDataByteOrderToBigEndian() -{ -#ifndef VTK_WORDS_BIGENDIAN - this->SwapBytesOn(); -#else - this->SwapBytesOff(); -#endif -} - -void vtkLSMReader::SetDataByteOrderToLittleEndian() -{ -#ifdef VTK_WORDS_BIGENDIAN - this->SwapBytesOn(); -#else - this->SwapBytesOff(); -#endif -} - -void vtkLSMReader::SetDataByteOrder(int byteOrder) -{ - if ( byteOrder == VTK_FILE_BYTE_ORDER_BIG_ENDIAN ) - { - this->SetDataByteOrderToBigEndian(); - } - else - { - this->SetDataByteOrderToLittleEndian(); - } -} - -int vtkLSMReader::GetDataByteOrder() -{ -#ifdef VTK_WORDS_BIGENDIAN - if ( this->SwapBytes ) - { - return VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN; - } - else - { - return VTK_FILE_BYTE_ORDER_BIG_ENDIAN; - } -#else - if ( this->SwapBytes ) - { - return VTK_FILE_BYTE_ORDER_BIG_ENDIAN; - } - else - { - return VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN; - } -#endif -} - -const char *vtkLSMReader::GetDataByteOrderAsString() -{ -#ifdef VTK_WORDS_BIGENDIAN - if ( this->SwapBytes ) - { - return "LittleEndian"; - } - else - { - return "BigEndian"; - } -#else - if ( this->SwapBytes ) - { - return "BigEndian"; - } - else - { - return "LittleEndian"; - } -#endif -} - - -char* vtkLSMReader::GetChannelName(int chNum) -{ - if(!this->ChannelNames || chNum < 0 || chNum > this->GetNumberOfChannels()-1) - { - vtkDebugMacro(<<"GetChannelName: Illegal channel index!"); - return ""; - } - return this->ChannelNames[chNum]; -} - -int vtkLSMReader::ClearChannelNames() -{ - vtkDebugMacro(<<"clearing " << this->GetNumberOfChannels()<<"channel names"); - if(!this->ChannelNames || this->GetNumberOfChannels() < 1) - { - return 0; - } - - for(int i=0;iGetNumberOfChannels();i++) - { - delete [] this->ChannelNames[i]; - } - vtkDebugMacro(<<"almost done\n"); - delete [] this->ChannelNames; - vtkDebugMacro(<<"done"); - return 0; -} - -int vtkLSMReader::AllocateChannelNames(int chNum) -{ - this->ClearChannelNames(); - vtkDebugMacro(<<"allocating space for "<ChannelNames = new char*[chNum]; - if(!this->ChannelNames) - { - vtkErrorMacro(<<"Could not allocate memory for channel name table!"); - return 1; - } - for(int i=0;iChannelNames[i] = NULL; - } - return 0; -} - -int vtkLSMReader::SetChannelName(const char *chName, int chNum) -{ - char *name; - int length; - if(!chName || chNum > this->GetNumberOfChannels()) - { - return 0; - } - if(!this->ChannelNames) - { - this->AllocateChannelNames(this->GetNumberOfChannels()); - } - - length = strlen(chName); - vtkDebugMacro(<<"length="<ChannelNames[chNum] = name; - return 0; -} - -int vtkLSMReader::FindChannelNameStart(const char *nameBuff, int length) -{ - int i; - char ch; - for(i=0;i 32) - { - break; - } - } - if(i >= length) - { - vtkWarningMacro(<<"Start of the channel name may not be found!"); - } - return i; -} - -int vtkLSMReader::ReadChannelName(const char *nameBuff, int length, char *buffer) -{ - int i; - char component; - for(i=0;iGetNumberOfChannels(); - this->ChannelDataTypes = vtkUnsignedIntArray::New(); - this->ChannelDataTypes->SetNumberOfTuples(numOfChls); - this->ChannelDataTypes->SetNumberOfComponents(1); - for(unsigned int i=0; i < numOfChls; i++) { - dataType = this->ReadUnsignedInt(f, &pos); - this->ChannelDataTypes->SetValue(i, dataType); - vtkDebugMacro(<<"Channel "<ReadInt(f,&pos); - //vtkDebugMacro(<<"size of structure = "<ReadInt(f,&pos); - // Read number of names - nameNum = this->ReadInt(f,&pos); - //vtkDebugMacro(<<"nameNum="<GetNumberOfChannels()) - { - vtkDebugMacro(<<"Number of channel colors is not same as number of channels!"); - vtkDebugMacro(<<"numColors="<ChannelColors->Reset(); - this->ChannelColors->SetNumberOfValues(3*(colNum+1)); - this->ChannelColors->SetNumberOfComponents(3); - - - // Read the colors - for(int j = 0; j < this->GetNumberOfChannels(); j++) - { - this->ReadFile(f,&colorOffset,4,colorBuff,1); - - for(int i=0;i<3;i++) - { - component = this->CharPointerToUnsignedChar(colorBuff+i); - - this->ChannelColors->SetValue(i+(3*j),component); - } - } - - this->ReadFile(f,&nameOffset,sizeOfNames,nameBuff,1); - - nameLength = nameSkip = 0; - tempBuff = nameBuff; - for(int i = 0; i < this->GetNumberOfChannels(); i++) - { - nameSkip = this->FindChannelNameStart(tempBuff,sizeOfNames-nameSkip); - nameLength = this->ReadChannelName(tempBuff+nameSkip,sizeOfNames-nameSkip,name); - - tempBuff += nameSkip + nameLength; - vtkDebugMacro(<<"Setting channel "<SetChannelName(name,i); - } - - delete [] nameBuff; - delete [] name; - delete [] colorBuff; - return 0; -} - -int vtkLSMReader::ReadTimeStampInformation(ifstream *f,unsigned long offset) -{ - int numOffStamps = 0; - if( offset == 0 ) // position is 0 for non-timeseries files! - { - vtkDebugMacro(<<"No timestamp information available"); - return 0; - } - offset += 4; - numOffStamps = this->ReadInt(f,&offset); - vtkDebugMacro(<<"There are "<GetNumberOfTimePoints()) - { -// vtkWarningMacro(<<"Number of time stamps does not correspond to the number off time points!"); - } - this->TimeStampInformation->Reset(); - this->TimeStampInformation->SetNumberOfTuples(numOffStamps); - this->TimeStampInformation->SetNumberOfComponents(1); - for(int i=0;iTimeStampInformation->SetValue(i,this->ReadDouble(f,&offset)); - } - return 0; -} - -/* Read the TIF_CZ_LSMINFO entry described in Table 17 of the LSM file format specification - * - * - */ -int vtkLSMReader::ReadLSMSpecificInfo(ifstream *f,unsigned long pos) -{ - unsigned long offset; - vtkDebugMacro("ReadLSMSpecificInfo(stream,"<NumberOfIntensityValues[0] = this->ReadInt(f,&pos); - - // vtkByteSwap::Swap4LE((int*)&this->NumberOfIntensityValues[0]); - this->Dimensions[0] = this->NumberOfIntensityValues[0]; - // Y - this->NumberOfIntensityValues[1] = this->ReadInt(f,&pos); - this->Dimensions[1] = this->NumberOfIntensityValues[1]; - // and Z dimension - this->NumberOfIntensityValues[2] = this->ReadInt(f,&pos); - this->Dimensions[2] = this->NumberOfIntensityValues[2]; - vtkDebugMacro(<<"Dimensions =" << Dimensions[0]<<","<Dimensions[4] = this->ReadInt(f,&pos); - vtkDebugMacro(<<"Number of Channels"<Dimensions[4]<<"\n"); - - // Read number of timepoints - this->NumberOfIntensityValues[3] = this->ReadInt(f,&pos); - this->Dimensions[3] = this->NumberOfIntensityValues[3]; - - // Read datatype, 1 for 8-bit unsigned int - // 2 for 12-bit unsigned int - // 5 for 32-bit float (timeseries mean of ROIs) - // 0 if the channels have different types - // In that case, u32OffsetChannelDataTypes - // has further info - this->DataType = this->ReadInt(f,&pos); - vtkDebugMacro(<<"Data type="<DataType<<"\n"); - - // Skip the width and height of thumbnails - pos += 2 * 4; - - // Read voxel sizes - this->VoxelSizes[0] = this->ReadDouble(f,&pos); - this->VoxelSizes[1] = this->ReadDouble(f,&pos); - this->VoxelSizes[2] = this->ReadDouble(f,&pos); - vtkDebugMacro("Voxel size="<ScanType = this->ReadShort(f,&pos); - vtkDebugMacro("ScanType"<ScanType<<"\n"); - - // skip over SpectralScan flag - // if 0, no spectral scan - // if 1, image has been acquired with spectral scan mode with a "meta" detector - // skip over DataType, Offset to vector overlay, Offset to input LUT - pos += 1*2 + 4*4;// + 1*8 + 3*4; - - // Read OffsetChannelColors, which is an offset to channel colors and names - this->ChannelInfoOffset = this->ReadUnsignedInt(f,&pos); - vtkDebugMacro(<<"Channel info offset (from addr"<ChannelInfoOffset<<"\n"); - this->ReadChannelColorsAndNames(f,this->ChannelInfoOffset); - - // Skip time interval in seconds (8 bytes) - //pos += 1*8; - this->TimeInterval = this->ReadDouble(f, &pos); - printf("Time interval = %f\n", this->TimeInterval); - - // If each channel has different datatype (meaning DataType == 0), then - // read the offset to more information and read the info - this->ChannelDataTypesOffset = this->ReadInt(f, &pos); - unsigned long scanInformationOffset = this->ReadUnsignedInt(f, &pos); - if(this->DataType == 0) { - this->ReadChannelDataTypes(f, this->ChannelDataTypesOffset); - } - - // Read scan information - printf("Scan information offset = %ld\n", scanInformationOffset); - this->ReadScanInformation(f, scanInformationOffset); - // SKip Zeiss Vision KS-3D speific data - pos += 4; - // Read timestamp information - offset = this->ReadUnsignedInt(f,&pos); - this->ReadTimeStampInformation(f,offset); - - - return 1; -} -int vtkLSMReader::ReadScanInformation(ifstream* f, unsigned long pos) -{ - unsigned int entry, type, size; - unsigned int subblocksOpen = 0; - char* name; - double gain; - double wavelength; - int mode; - char* chName; - int chIsOn = 0, trackIsOn = 0, isOn = 0; - while( 1 ) { - entry = this->ReadUnsignedInt(f, &pos); - type = this->ReadUnsignedInt(f, &pos); - size = this->ReadUnsignedInt(f, &pos); - - //printf("entry=%d\n", entry); - if(type == TYPE_SUBBLOCK && entry == SUBBLOCK_END) subblocksOpen--; - else if(type == TYPE_SUBBLOCK) { - subblocksOpen++; - } - - switch(entry) { - case DETCHANNEL_ENTRY_DETECTOR_GAIN_FIRST: - gain = this->ReadDouble(f, &pos); - continue; - break; - case DETCHANNEL_ENTRY_DETECTOR_GAIN_LAST: - gain = this->ReadDouble(f, &pos); - continue; - break; - case DETCHANNEL_ENTRY_INTEGRATION_MODE: - mode = this->ReadInt(f, &pos); - continue; - break; - case LASER_ENTRY_NAME: - name = new char[size+1]; - this->ReadData(f, &pos, size, name); - //printf("Laser name: %s\n", name); - this->LaserNames->InsertNextValue(name); - delete[] name; - continue; - break; - case ILLUMCHANNEL_ENTRY_WAVELENGTH: - wavelength = this->ReadDouble(f, &pos); - - continue; - break; - case ILLUMCHANNEL_DETCHANNEL_NAME: - chName = new char[size+1]; - this->ReadData(f, &pos, size, chName); -// printf("chName = %s\n", chName); - delete[] chName; - continue; - break; - case TRACK_ENTRY_ACQUIRE: - trackIsOn = this->ReadInt(f, &pos); - - continue; - break; - case TRACK_ENTRY_NAME: - chName = new char[size+1]; - this->ReadData(f, &pos, size, chName); - if(trackIsOn) { - // printf("Track name = %s is on\n", chName); - } - delete[] chName; - continue; - break; - case DETCHANNEL_DETECTION_CHANNEL_NAME: - chName = new char[size+1]; - this->ReadData(f, &pos, size, chName); - if(chIsOn) { - //printf("Detection channel name = %s is on\n", chName); - } - delete[] chName; - continue; - break; - case DETCHANNEL_ENTRY_ACQUIRE: - chIsOn = this->ReadInt(f, &pos); - continue; - break; - - case ILLUMCHANNEL_ENTRY_AQUIRE: - isOn = this->ReadInt(f, &pos); - if(isOn) { - if(trackIsOn) { - this->TrackWavelengths->InsertNextValue(wavelength); - //printf("Acquired using wavelength: %f\n", wavelength); - } - } - continue; - break; - case RECORDING_ENTRY_DESCRIPTION: - Description = new char[size+1]; - this->ReadData(f, &pos, size, Description); - //printf("Description: %s\n", Description); - continue; - break; - case RECORDING_ENTRY_OBJETIVE: - Objective = new char[size+1]; - this->ReadData(f, &pos, size, Objective); - continue; - - case SUBBLOCK_RECORDING: - break; - case SUBBLOCK_LASERS: - break; - case SUBBLOCK_LASER: - break; - case SUBBLOCK_TRACKS: - break; - case SUBBLOCK_TRACK: - break; - case SUBBLOCK_DETECTION_CHANNELS: - break; - case SUBBLOCK_DETECTION_CHANNEL: - break; - case SUBBLOCK_ILLUMINATION_CHANNELS: - break; - case SUBBLOCK_ILLUMINATION_CHANNEL: - break; - case SUBBLOCK_BEAM_SPLITTERS: - break; - case SUBBLOCK_BEAM_SPLITTER: - break; - case SUBBLOCK_DATA_CHANNELS: - break; - case SUBBLOCK_DATA_CHANNEL: - break; - case SUBBLOCK_TIMERS: - break; - case SUBBLOCK_TIMER: - break; - case SUBBLOCK_MARKERS: - break; - case SUBBLOCK_MARKER: - break; - } - if(subblocksOpen == 0) break; - // By default, skip the entry - pos += size; - } - return 0; -} -int vtkLSMReader::AnalyzeTag(ifstream *f,unsigned long startPos) -{ - unsigned short type,length,tag; - unsigned long readSize; - int value, dataSize,i; - char tempValue[4],tempValue2[4]; - char *actualValue = NULL; - //vtkDebugMacro(<<"Analyze tag start pos="<ReadUnsignedShort(f,&startPos); - type = this->ReadUnsignedShort(f,&startPos); - length = this->ReadUnsignedInt(f,&startPos); - - this->ReadFile(f,&startPos,4,tempValue); - - for(i=0;i<4;i++)tempValue2[i]=tempValue[i]; -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap4LE((unsigned int*)tempValue2); -#endif - value = this->CharPointerToUnsignedInt(tempValue2); - - // if there is more than 4 bytes in value, - // value is an offset to the actual data - dataSize = this->TIFF_BYTES(type); - readSize = dataSize*length; - if(readSize > 4 && tag != TIF_CZ_LSMINFO) - { - actualValue = new char[readSize]; - startPos = value; - if(tag == TIF_STRIPOFFSETS ||tag == TIF_STRIPBYTECOUNTS) { - // vtkDebugMacro(<<"Reading actual value from "<ReadFile(f,&startPos,readSize,actualValue) ) { - vtkErrorMacro(<<"Failde to get strip offsets\n"); - return 0; - } - } - } - else - { - actualValue = new char[4]; - for(int o=0;o<4;o++)actualValue[o] = tempValue[o]; - } - switch(tag) - { - case TIF_NEWSUBFILETYPE: -// vtkDebugMacro(<<"New subfile type="<NewSubFileType = value; - break; - - case TIF_IMAGEWIDTH: -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap4LE((unsigned int*)actualValue); - vtkDebugMacro(<<"Image width="<Dimensions[0] = this->CharPointerToUnsignedInt(actualValue); - //this->Dimensions[0] = value; - break; - - case TIF_IMAGELENGTH: -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap4LE((unsigned int*)actualValue); - //this->Dimensions[1] = this->CharPointerToUnsignedInt(actualValue); - vtkDebugMacro(<<"Image length="<Dimensions[1] = value; - break; - - case TIF_BITSPERSAMPLE: -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap2LE((unsigned short*)actualValue); -#endif - this->BitsPerSample->SetNumberOfValues(length); - unsigned short bitsPerSample; - for(i=0;iCharPointerToUnsignedShort(actualValue + (this->TIFF_BYTES(TIFF_SHORT)*i)); - this->BitsPerSample->SetValue(i,bitsPerSample); - } - break; - - case TIF_COMPRESSION: -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap2LE((unsigned short*)actualValue); -#endif - this->Compression = this->CharPointerToUnsignedShort(actualValue); - break; - - case TIF_PHOTOMETRICINTERPRETATION: -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap2LE((unsigned short*)actualValue); -#endif - this->PhotometricInterpretation = this->CharPointerToUnsignedShort(actualValue); - break; - - case TIF_STRIPOFFSETS: - // vtkDebugMacro(<<"Number of values="<StripOffset->SetNumberOfValues(length); -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap4LERange((unsigned int*)actualValue,length); -#endif - if(length>1) { - for(i=0;iStripByteCount->SetNumberOfValues(length); - - if(length>1) { - for(i=0;iCharPointerToUnsignedInt(actualValue + (this->TIFF_BYTES(TIFF_LONG)*i)); - - this->StripByteCount->SetValue(i,bytecount); - // vtkDebugMacro(<<"Strip byte count of " << i <<"="<ReadSizes->GetValue(timepoint*this->Dimensions[2]+slice); -} - -unsigned int vtkLSMReader::GetSliceOffset(unsigned int timepoint, unsigned int slice) { - if(!this->ImageOffsets) { - vtkErrorMacro(<<"Request slice offset but table not constructed\n"); - return 0; - } - return this->ImageOffsets->GetValue(timepoint*this->Dimensions[2]+slice); -} - -void vtkLSMReader::ConstructSliceOffsets() -{ -// unsigned long int startPos = 2; - if(!this->ImageOffsets) { - this->ImageOffsets = vtkUnsignedIntArray::New(); - this->ReadSizes = vtkUnsignedIntArray::New(); - this->ImageOffsets->SetNumberOfTuples(this->Dimensions[2]*this->Dimensions[3]); - this->ReadSizes->SetNumberOfTuples(this->Dimensions[2]*this->Dimensions[3]); - for(int j = 0; j < this->Dimensions[2]*this->Dimensions[3]; j++) { - this->ImageOffsets->SetValue(j, 0); - this->ReadSizes->SetValue(j, 0); - } - } - int channel = this->GetUpdateChannel(); - - for(int tp = 0; tp < this->Dimensions[3]; tp++) { - for(int slice = 0; slice < this->Dimensions[2]; slice++) { - this->GetOffsetToImage(slice, tp); - unsigned long offset = this->StripOffset->GetValue(channel); - unsigned long readSize = this->StripByteCount->GetValue(channel); - this->ImageOffsets->SetValue(tp*this->Dimensions[2]+slice, offset); - this->ReadSizes->SetValue(tp*this->Dimensions[2]+slice, readSize); - } - } -} - -unsigned long vtkLSMReader::GetOffsetToImage(int slice, int timepoint) -{ - return this->SeekFile(slice+(timepoint*this->Dimensions[2])); -} - -unsigned long vtkLSMReader::SeekFile(int image) -{ - unsigned long offset = 4, finalOffset; - // int readSize = 4; - int i=0; - //unsigned short numberOfTags = 0; - int imageCount = image+1; - - if(this->OffsetToLastAccessedImage && (this->NumberOfLastAccessedImage < image)) - { - offset = this->OffsetToLastAccessedImage; - imageCount = image - this->NumberOfLastAccessedImage; -// vtkDebugMacro(<<"offset of last image: "<ReadInt(this->GetFile(),&offset); - vtkDebugMacro(<<"offset (from file): "<< offset<<"\n"); - } - - offset = this->ReadImageDirectory(this->GetFile(),offset); -// vtkDebugMacro(<<"Offset: "<NewSubFileType == 0) - { - i++; - } - finalOffset = offset; - offset = this->ReadImageDirectory(this->GetFile(),offset); - //vtkDebugMacro(<<"i="<OffsetToLastAccessedImage = finalOffset; - this->NumberOfLastAccessedImage = image; - - return finalOffset; -} - -unsigned long vtkLSMReader::ReadImageDirectory(ifstream *f,unsigned long offset) -{ - unsigned short numberOfTags=0; - unsigned long nextOffset = offset; - - //vtkDebugMacro(<<"Reading unsigned short from "<ReadUnsignedShort(f,&offset); - for(int i = 0; i < numberOfTags; i++) - { - this->AnalyzeTag(f,offset); - //vtkDebugMacro(<<"Tag analyed...\n"); - if(this->NewSubFileType == 1) { - //vtkDebugMacro(<<"Found thumbnail, get next"); - break; //thumbnail image - } - offset = offset + 12; - //vtkDebugMacro(<<"New offset="<ReadUnsignedInt(f,&nextOffset); -} - - -void vtkLSMReader::DecodeHorizontalDifferencing(unsigned char *buffer, int size) -{ - for(int i=1;iDimensions[0]; - int channel = this->GetUpdateChannel(); - int bytes = this->BYTES_BY_DATA_TYPE(this->GetDataTypeForChannel(channel)); - int lines = size / (width*bytes); - lzw_decode_init(s, 8, bufp, size); - vtkDebugMacro(<<"Size: "<Predictor == 2) { - if(bytes == 1) - this->DecodeHorizontalDifferencing(outbufp,width*bytes); - else { - this->DecodeHorizontalDifferencingUnsignedShort((unsigned short*)outbufp, width); - } - } - outbufp += width*bytes; - } - for(int i=0;i < size;i++) { - buffer[i] = outbuf[i]; - } - vtkDebugMacro(<<"Decoding done"<<"\n"); - delete s; - delete []outbuf; - -} - -int vtkLSMReader::GetDataTypeForChannel(unsigned int channel) -{ - if(this->DataType != 0) { - return this->DataType; - } - if(!this->ChannelDataTypes) return 1; - return this->ChannelDataTypes->GetValue(channel); -} - -//---------------------------------------------------------------------------- -// Convert to Imaging API -int vtkLSMReader::RequestData( - vtkInformation *vtkNotUsed(request), - vtkInformationVector **vtkNotUsed(inputVector), - vtkInformationVector *outputVector) -{ - unsigned long offset;//, imageOffset;; - unsigned char *buf, *tempBuf; - int size,readSize,numberOfPixels,timepoint,channel; - time_t start, end; - int outExtent[6]; - - if(!this->ImageOffsets) { - vtkDebugMacro(<<"Constructing slice offset table\n"); - this->ConstructSliceOffsets(); - } - - // get the info object - vtkInformation *outInfo = outputVector->GetInformationObject(0); - vtkImageData *data = this->AllocateOutputData(outInfo->Get(vtkDataObject::DATA_OBJECT())); - data->GetPointData()->GetScalars()->SetName("LSM Scalars"); - - data->GetExtent(outExtent); - if(!this->Identifier) - { - vtkDebugMacro(<<"Can not execute data since information has not been executed!"); - return 0; - } - vtkDebugMacro(<<"Update extent: " << outExtent[0]<<", "<IntUpdateExtent[3]>this->GetNumberOfTimePoints()-1?this->GetNumberOfTimePoints()-1:this->IntUpdateExtent[3]); - channel = this->GetUpdateChannel(); -// int nSlices = (outExtent[5]-outExtent[4])+1; - // std::cout <<"Timepoint="<Dimensions[0]*this->Dimensions[1]*(outExtent[5]-outExtent[4]+1 ); - int dataType = this->GetDataTypeForChannel(channel); - size = numberOfPixels * this->BYTES_BY_DATA_TYPE(dataType); - vtkDebugMacro(<<"numberOfPixels=" << numberOfPixels << ", buffer size="<GetSliceOffset(timepoint, i); - readSize = this->GetStripByteCount(timepoint, i); - - vtkDebugMacro(<<"Offset to tp "<ReadFile(this->GetFile(),&offset,readSize,(char *)tempBuf,1); - - if(bytes != readSize) { - vtkDebugMacro(<<"Asked for " << readSize<<" bytes, got "<GetFile()->fail()<<", eof: "<GetFile()->eof()<<"\n"); - this->GetFile()->clear(); - } - if(this->IsCompressed()) - { - this->DecodeLZWCompression(tempBuf,readSize); - } - tempBuf += readSize; - } - end = time (NULL); - - vtkDebugMacro(<<"Dataset generation time: "<BYTES_BY_DATA_TYPE(dataType) > 1) - { - ussarray = vtkUnsignedShortArray::New(); - ussarray->SetNumberOfComponents(1); - ussarray->SetNumberOfValues(numberOfPixels); - - ussarray->SetArray((unsigned short *)buf, numberOfPixels, 0); - data->GetPointData()->SetScalars(ussarray); - - ussarray->Delete(); - } - else - { - uscarray = vtkUnsignedCharArray::New(); - uscarray->SetNumberOfComponents(1); - uscarray->SetNumberOfValues(numberOfPixels); - - uscarray->SetArray(buf, numberOfPixels, 0); - data->GetPointData()->SetScalars(uscarray); - - uscarray->Delete(); - } - - return 1; - -} - -int vtkLSMReader::RequestUpdateExtent ( - vtkInformation* request, - vtkInformationVector** inputVector, - vtkInformationVector* outputVector) -{ - int uext[6], ext[6]; - - vtkInformation* outInfo = outputVector->GetInformationObject(0); - //vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); - - outInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(),ext); - // Get the requested update extent from the output. - outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uext); - - // If they request an update extent that doesn't cover the whole slice - // then modify the uextent - if(uext[1] < ext[1] ) uext[1] = ext[1]; - if(uext[3] < ext[3] ) uext[3] = ext[3]; - outInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uext,6); - //request->Set(vtkStreamingDemandDrivenPipeline::REQUEST_UPDATE_EXTENT(), uext,6); - return 1; -} - -int vtkLSMReader::RequestInformation ( - - vtkInformation * vtkNotUsed( request ), - - vtkInformationVector** vtkNotUsed( inputVector ), - - vtkInformationVector * outputVector) -{ - unsigned long startPos; - unsigned int imageDirOffset; - int dataType; - - -// char buf[12]; - - vtkInformation* outInfo = outputVector->GetInformationObject(0); - - this->SetDataByteOrderToLittleEndian(); - - if(!this->NeedToReadHeaderInformation()) - { - vtkDebugMacro(<<"Don't need to read header information"); - return 1; - } - - vtkDebugMacro(<<"Executing information."); - - if(!this->OpenFile()) - { - this->Identifier = 0; - return 0; - } - - - startPos = 2; // header identifier - - this->Identifier = this->ReadUnsignedShort(this->GetFile(),&startPos); - if(!this->IsValidLSMFile()) - { - vtkErrorMacro("Given file is not a valid LSM-file."); - return 0; - } - - imageDirOffset = this->ReadUnsignedInt(this->GetFile(),&startPos); - - this->ReadImageDirectory(this->GetFile(),imageDirOffset); - - if(this->LSMSpecificInfoOffset) - { - ReadLSMSpecificInfo(this->GetFile(),(unsigned long)this->LSMSpecificInfoOffset); - } - else - { - vtkErrorMacro("Did not found LSM specific info!"); - return 0; - } - if( !(this->ScanType == 6 || this->ScanType == 0 || this->ScanType == 3) ) - { - vtkErrorMacro("Sorry! Your LSM-file must be of type 6 LSM-file (time series x-y-z) or type 0 (normal x-y-z) or type 3 (2D + time). Type of this File is " <ScanType); - return 0; - } - - vtkDebugMacro(<<"Executing information: first directory has been read."); - - this->CalculateExtentAndSpacing(this->DataExtent,this->DataSpacing); - outInfo->Set(vtkDataObject::SPACING(), this->DataSpacing, 3); - - - outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), - this->DataExtent, 6); - - this->NumberOfScalarComponents = 1; - - int channel = this->GetUpdateChannel(); - dataType = this->GetDataTypeForChannel(channel); - if(dataType > 1) - { - this->DataScalarType = VTK_UNSIGNED_SHORT; - } - else - { - this->DataScalarType = VTK_UNSIGNED_CHAR; - } - vtkDataObject::SetPointDataActiveScalarInfo(outInfo, this->DataScalarType, - this->NumberOfScalarComponents); - - this->NeedToReadHeaderInformationOff(); - vtkDebugMacro(<<"Executing information: executed."); - return 1; -} - -void vtkLSMReader::CalculateExtentAndSpacing(int extent[6],double spacing[3]) -{ - - extent[0] = extent[2] = extent[4] = 0; - extent[1] = this->Dimensions[0]-1; - extent[3] = this->Dimensions[1]-1; - extent[5] = this->Dimensions[2]-1; - - - spacing[0] = this->VoxelSizes[0]*1000000; - spacing[1] = this->VoxelSizes[1]*1000000; - spacing[2] = this->VoxelSizes[2]*1000000; -} - -//---------------------------------------------------------------------------- - -int vtkLSMReader::GetChannelColorComponent(int ch, int component) -{ - if(ch < 0 || ch > this->GetNumberOfChannels()-1 || component < 0 || component > 2) - { - return 0; - } - return *(this->ChannelColors->GetPointer((ch*3) + component)); -} - -vtkImageData* vtkLSMReader:: GetTimePointOutput(int timepoint, int channel) -{ - this->SetUpdateTimePoint(timepoint); - this->SetUpdateChannel(channel); - return this->GetOutput(); -} - -void vtkLSMReader::SetUpdateTimePoint(int timepoint) -{ - if(timepoint < 0 || timepoint == this->IntUpdateExtent[3]) - { - return; - } - this->IntUpdateExtent[3] = timepoint; - this->Modified(); -} - -void vtkLSMReader::SetUpdateChannel(int ch) -{ - if(ch < 0 || ch == this->IntUpdateExtent[4]) - { - return; - } - this->IntUpdateExtent[4] = ch; - // std::cout << "Update channel is now " << ch << std::endl; - this->Modified(); -} - -void vtkLSMReader::NeedToReadHeaderInformationOn() -{ - this->FileNameChanged = 1; -} - -void vtkLSMReader::NeedToReadHeaderInformationOff() -{ - this->FileNameChanged = 0; -} - -int vtkLSMReader::NeedToReadHeaderInformation() -{ - return this->FileNameChanged; -} - -ifstream *vtkLSMReader::GetFile() -{ - return this->File; -} - -int vtkLSMReader::BYTES_BY_DATA_TYPE(int type) -{ - int bytes = 1; - switch(type) - { - case(1): - return 1; - case(2): - return 2; - case(5): - return 4; - } - return bytes; -} - -int vtkLSMReader::TIFF_BYTES(unsigned short type) -{ - int bytes = 1; - switch(type) - { - case(TIFF_BYTE): - return 1; - case(TIFF_ASCII): - case(TIFF_SHORT): - return 2; - case(TIFF_LONG): - case(TIFF_RATIONAL): - return 4; - } - return bytes; -} - -unsigned char vtkLSMReader::CharPointerToUnsignedChar(char *buf) -{ - return *((unsigned char*)(buf)); -} - -int vtkLSMReader::CharPointerToInt(char *buf) -{ - return *((int*)(buf)); -} - -unsigned int vtkLSMReader::CharPointerToUnsignedInt(char *buf) -{ - return *((unsigned int*)(buf)); -} - -short vtkLSMReader::CharPointerToShort(char *buf) -{ - return *((short*)(buf)); -} - -unsigned short vtkLSMReader::CharPointerToUnsignedShort(char *buf) -{ - return *((unsigned short*)(buf)); -} - -double vtkLSMReader::CharPointerToDouble(char *buf) -{ - return *((double*)(buf)); -} - -int vtkLSMReader::ReadInt(ifstream *f,unsigned long *pos) -{ - char buff[4]; - this->ReadFile(f,pos,4,buff); -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap4LE((int*)buff); -#endif - return CharPointerToInt(buff); -} - -unsigned int vtkLSMReader::ReadUnsignedInt(ifstream *f,unsigned long *pos) -{ - char buff[4]; - this->ReadFile(f,pos,4,buff); -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap4LE((unsigned int*)buff); -#endif - return this->CharPointerToUnsignedInt(buff); -} - -short vtkLSMReader::ReadShort(ifstream *f,unsigned long *pos) -{ - char buff[2]; - this->ReadFile(f,pos,2,buff); -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap2LE((short*)buff); -#endif - return this->CharPointerToShort(buff); -} - -unsigned short vtkLSMReader::ReadUnsignedShort(ifstream *f,unsigned long *pos) -{ - char buff[2]; - this->ReadFile(f,pos,2,buff); -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap2LE((unsigned short*)buff); -#endif - return this->CharPointerToUnsignedShort(buff); -} - -double vtkLSMReader::ReadDouble(ifstream *f,unsigned long *pos) -{ - char buff[8]; - this->ReadFile(f,pos,8,buff); -#ifdef VTK_WORDS_BIGENDIAN - vtkByteSwap::Swap8LE((double*)buff); -#endif - return this->CharPointerToDouble(buff); -} - -int vtkLSMReader::ReadData(ifstream *f,unsigned long *pos,int size,char *buf) -{ - return this->ReadFile(f,pos,size,buf,1); -} - -int vtkLSMReader::ReadFile(ifstream *f,unsigned long *pos,int size,char *buf,bool swap) -{ - unsigned int ret = 1; - f->seekg(*pos,ios::beg); - f->read(buf,size); -#ifdef VTK_WORDS_BIGENDIAN - if(swap) { - vtkByteSwap::SwapLERange(buf,size); - } -#endif - //if(f->fail() || f->eof()) ret=0; - ret = f->gcount(); - if( !f ) return 0; - *pos = *pos + size; - return ret; -} - -unsigned int vtkLSMReader::GetUpdateChannel() { - return (this->IntUpdateExtent[4]>this->GetNumberOfChannels()-1?this->GetNumberOfChannels()-1:this->IntUpdateExtent[4]); - -} - -void vtkLSMReader::PrintSelf(ostream& os, vtkIndent indent) -{ - this->Superclass::PrintSelf(os,indent); - os << indent << "Identifier: " << this->Identifier <<"\n"; - os << indent << "Dimensions: " << this->Dimensions[0] << "," << this->Dimensions[1] << ","<Dimensions[2] << "\n"; - os << indent << "Time points: " << this->Dimensions[3] << "\n"; - os << "Number of channels: " << this->Dimensions[4] << "\n"; - os << "\n"; - os << indent << "Number of intensity values X: " << this->NumberOfIntensityValues[0] << "\n"; - os << indent << "Number of intensity values Y: " << this->NumberOfIntensityValues[1] << "\n"; - os << indent << "Number of intensity values Z: " << this->NumberOfIntensityValues[2] << "\n"; - os << indent << "Number of intensity values Time: " << this->NumberOfIntensityValues[3] << "\n"; - os << indent << "Voxel size X: " << this->VoxelSizes[0] << "\n"; - os << indent << "Voxel size Y: " << this->VoxelSizes[1] << "\n"; - os << indent << "Voxel size Z: " << this->VoxelSizes[2] << "\n"; - os << "\n"; - os << indent << "Scan type: " << this->ScanType << "\n"; - os << indent << "Data type: " << this->DataType << "\n"; - if(this->DataType == 0) { - for(int i=0; i < this->GetNumberOfChannels(); i++) { - os << indent << indent << "Data type of channel "<ChannelDataTypes->GetValue(i)<<"\n"; - } - } - os << indent << "Compression: " << this->Compression << "\n"; - os << "\n"; - os << indent << "Planar configuration: " << this->PlanarConfiguration << "\n"; - os << indent << "Photometric interpretation: " << this->PhotometricInterpretation << "\n"; - os << indent << "Predictor: " << this->Predictor << "\n"; - os << indent << "Channel info:\n"; - - for(int i=0;iDimensions[4];i++) - { - os << indent << indent << this->GetChannelName(i)<<",("<GetChannelColorComponent(i,0)<<","<GetChannelColorComponent(i,1)<<","<GetChannelColorComponent(i,2)<<")\n"; - } - os << indent << "Strip byte counts:\n"; - - for(int i=0;iDimensions[4];i++) - { - os << indent << indent << this->StripByteCount->GetValue(i) << "\n"; - } -} - diff --git a/branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.h b/branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.h deleted file mode 100644 index eedccce6..00000000 --- a/branches/ColorViewer/ExternalCode/vtkLSM/vtkLSMReader.h +++ /dev/null @@ -1,404 +0,0 @@ -/*========================================================================= - - Program: BioImageXD - Module: $RCSfile: vtkLSMReader.h,v $ - Language: C++ - Date: $Date: 2003/08/22 14:46:02 $ - Version: $Revision: 1.39 $ - - This is an open-source copyright as follows: - Copyright (c) 2004-2008 BioImageXD Development Team - - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Modified source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS - IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - -=========================================================================*/ - -/*========================================================================= - Modifications were made by the GoFigure Dev. Team. - while at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - - -#define TIF_NEWSUBFILETYPE 254 -#define TIF_IMAGEWIDTH 256 -#define TIF_IMAGELENGTH 257 -#define TIF_BITSPERSAMPLE 258 -#define TIF_COMPRESSION 259 -#define TIF_PHOTOMETRICINTERPRETATION 262 -#define TIF_STRIPOFFSETS 273 -#define TIF_SAMPLESPERPIXEL 277 -#define TIF_STRIPBYTECOUNTS 279 -#define TIF_PLANARCONFIGURATION 284 -#define TIF_PREDICTOR 317 -#define TIF_COLORMAP 320 -#define TIF_CZ_LSMINFO 34412 - -#define SUBBLOCK_END 0x0FFFFFFFF -#define SUBBLOCK_RECORDING 0x010000000 -#define SUBBLOCK_LASERS 0x030000000 -#define SUBBLOCK_LASER 0x050000000 -#define SUBBLOCK_TRACKS 0x020000000 -#define SUBBLOCK_TRACK 0x040000000 -#define SUBBLOCK_DETECTION_CHANNELS 0x060000000 -#define SUBBLOCK_DETECTION_CHANNEL 0x070000000 -#define SUBBLOCK_ILLUMINATION_CHANNELS 0x080000000 -#define SUBBLOCK_ILLUMINATION_CHANNEL 0x090000000 -#define SUBBLOCK_BEAM_SPLITTERS 0x0A0000000 -#define SUBBLOCK_BEAM_SPLITTER 0x0B0000000 -#define SUBBLOCK_DATA_CHANNELS 0x0C0000000 -#define SUBBLOCK_DATA_CHANNEL 0x0D0000000 -#define SUBBLOCK_TIMERS 0x011000000 -#define SUBBLOCK_TIMER 0x012000000 -#define SUBBLOCK_MARKERS 0x013000000 -#define SUBBLOCK_MARKER 0x014000000 -#define SUBBLOCK_END 0x0FFFFFFFF - -#define RECORDING_ENTRY_NAME 0x010000001 -#define RECORDING_ENTRY_DESCRIPTION 0x010000002 -#define RECORDING_ENTRY_NOTES 0x010000003 -#define RECORDING_ENTRY_OBJETIVE 0x010000004 -#define RECORDING_ENTRY_PROCESSING_SUMMARY 0x010000005 -#define RECORDING_ENTRY_SPECIAL_SCAN_MODE 0x010000006 -#define RECORDING_ENTRY_SCAN_TYPE 0x010000007 -#define OLEDB_RECORDING_ENTRY_SCAN_MODE 0x010000008 -#define RECORDING_ENTRY_NUMBER_OF_STACKS 0x010000009 -#define RECORDING_ENTRY_LINES_PER_PLANE 0x01000000A -#define RECORDING_ENTRY_SAMPLES_PER_LINE 0x01000000B -#define RECORDING_ENTRY_PLANES_PER_VOLUME 0x01000000C -#define RECORDING_ENTRY_IMAGES_WIDTH 0x01000000D -#define RECORDING_ENTRY_IMAGES_HEIGHT 0x01000000E -#define RECORDING_ENTRY_IMAGES_NUMBER_PLANES 0x01000000F -#define RECORDING_ENTRY_IMAGES_NUMBER_STACKS 0x010000010 -#define RECORDING_ENTRY_IMAGES_NUMBER_CHANNELS 0x010000011 -#define RECORDING_ENTRY_LINSCAN_XY_SIZE 0x010000012 -#define RECORDING_ENTRY_SCAN_DIRECTION 0x010000013 -#define RECORDING_ENTRY_TIME_SERIES 0x010000014 -#define RECORDING_ENTRY_ORIGINAL_SCAN_DATA 0x010000015 -#define RECORDING_ENTRY_ZOOM_X 0x010000016 -#define RECORDING_ENTRY_ZOOM_Y 0x010000017 -#define RECORDING_ENTRY_ZOOM_Z 0x010000018 -#define RECORDING_ENTRY_SAMPLE_0X 0x010000019 -#define RECORDING_ENTRY_SAMPLE_0Y 0x01000001A -#define RECORDING_ENTRY_SAMPLE_0Z 0x01000001B -#define RECORDING_ENTRY_SAMPLE_SPACING 0x01000001C -#define RECORDING_ENTRY_LINE_SPACING 0x01000001D -#define RECORDING_ENTRY_PLANE_SPACING 0x01000001E -#define RECORDING_ENTRY_PLANE_WIDTH 0x01000001F -#define RECORDING_ENTRY_PLANE_HEIGHT 0x010000020 -#define RECORDING_ENTRY_VOLUME_DEPTH 0x010000021 -#define RECORDING_ENTRY_ROTATION 0x010000034 -#define RECORDING_ENTRY_NUTATION 0x010000023 -#define RECORDING_ENTRY_PRECESSION 0x010000035 -#define RECORDING_ENTRY_SAMPLE_0TIME 0x010000036 - - -#define LASER_ENTRY_NAME 0x050000001 -#define LASER_ENTRY_ACQUIRE 0x050000002 -#define LASER_ENTRY_POWER 0x050000003 - -#define DETCHANNEL_ENTRY_DETECTOR_GAIN_FIRST 0x070000003 -#define DETCHANNEL_ENTRY_DETECTOR_GAIN_LAST 0x070000004 -#define DETCHANNEL_ENTRY_INTEGRATION_MODE 0x070000001 -#define DETCHANNEL_ENTRY_ACQUIRE 0x07000000B -#define DETCHANNEL_DETECTION_CHANNEL_NAME 0x070000014 - -#define RECORDING_ENTRY_DESCRIPTION 0x010000002 - -#define ILLUMCHANNEL_ENTRY_WAVELENGTH 0x090000003 -#define ILLUMCHANNEL_ENTRY_AQUIRE 0x090000004 -#define ILLUMCHANNEL_DETCHANNEL_NAME 0x090000005 - -#define TRACK_ENTRY_ACQUIRE 0x040000006 -#define TRACK_ENTRY_NAME 0x04000000C -#define TYPE_SUBBLOCK 0 -#define TYPE_LONG 4 -#define TYPE_RATIONAL 5 -#define TYPE_ASCII 2 -// .NAME vtkLSMReader - read LSM files -// .SECTION Description -// vtkLSMReader is a source object that reads LSM files. -// It should be able to read most any LSM file -// -// .SECTION Thanks -// This class was developed as a part of the BioImageXD Project. -// The BioImageXD project includes the following people: -// -// Dan White -// Kalle Pahajoki -// Pasi Kankaanpää -// - - -#ifndef __vtkLSMReader_h -#define __vtkLSMReader_h - -#include "vtkImageSource.h" -#include "vtkImageAlgorithm.h" -#include "vtkIntArray.h" -#include "vtkUnsignedIntArray.h" -#include "vtkDoubleArray.h" -#include "vtkUnsignedShortArray.h" -#include "vtkUnsignedCharArray.h" -#include "vtkStringArray.h" - -#define TIFF_BYTE 1 -#define TIFF_ASCII 2 -#define TIFF_SHORT 3 -#define TIFF_LONG 4 -#define TIFF_RATIONAL 5 - -#define LSM_MAGIC_NUMBER 42 - -#define LSM_COMPRESSED 5 - -#define VTK_FILE_BYTE_ORDER_BIG_ENDIAN 0 -#define VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN 1 - -class vtkLSMReader : public vtkImageAlgorithm -{ -public: - - static vtkLSMReader *New(); - vtkTypeMacro(vtkLSMReader,vtkImageAlgorithm); - virtual void PrintSelf(ostream& os, vtkIndent indent); - - // Description: - // Get the file extensions for this format. - // Returns a string with a space separated list of extensions in - // the format .extension - const char* GetFileExtensions() - { - return ".lsm .LSM"; - } - - int GetHeaderIdentifier(); - int IsValidLSMFile(); - int IsCompressed(); - int GetNumberOfTimePoints(); - int GetNumberOfChannels(); - int OpenFile(); - - int GetChannelColorComponent(int,int); - char* GetChannelName(int); - void SetFileName(const char *); - //void ExecuteInformation(); - int RequestInformation ( - vtkInformation * vtkNotUsed( request ), - vtkInformationVector** vtkNotUsed( inputVector ), - vtkInformationVector * outputVector); - void SetUpdateTimePoint(int); - void SetUpdateChannel(int); - - void SetDataByteOrderToBigEndian(); - void SetDataByteOrderToLittleEndian(); - void SetDataByteOrder(int); - int GetDataByteOrder(); - const char *GetDataByteOrderAsString(); - - // Description: - // Set/Get the byte swapping to explicitly swap the bytes of a file. - vtkSetMacro(SwapBytes,int); - virtual int GetSwapBytes() {return this->SwapBytes;} - vtkBooleanMacro(SwapBytes,int); - - int GetDataTypeForChannel(unsigned int channel); - - vtkGetStringMacro(Objective); - vtkGetStringMacro(Description); - - vtkGetStringMacro(FileName); - vtkGetVector3Macro(VoxelSizes,double); - vtkGetVectorMacro(Dimensions,int,5); - vtkGetVectorMacro(NumberOfIntensityValues,int,4); - vtkGetVectorMacro(DataSpacing,double,3); - vtkGetMacro(Identifier,unsigned short); - vtkGetMacro(NewSubFileType,unsigned int); - vtkGetMacro(Compression,unsigned int); - vtkGetMacro(SamplesPerPixel,unsigned int); - vtkGetMacro(ScanType,unsigned short); - vtkGetMacro(DataType,int); - vtkGetMacro(TimeInterval, double); - vtkGetObjectMacro(TimeStampInformation,vtkDoubleArray); - vtkGetObjectMacro(ChannelColors,vtkIntArray); - vtkGetObjectMacro(TrackWavelengths, vtkDoubleArray); - unsigned int GetUpdateChannel(); - vtkImageData* GetTimePointOutput(int,int); - -protected: - - vtkLSMReader(); - ~vtkLSMReader(); - - int TIFF_BYTES(unsigned short); - int BYTES_BY_DATA_TYPE(int); - void ClearFileName(); - void Clean(); - unsigned long ReadImageDirectory(ifstream *,unsigned long); - int AllocateChannelNames(int); - int SetChannelName(const char *,int); - int ClearChannelNames(); - int FindChannelNameStart(const char *, int); - int ReadChannelName(const char *, int, char *); - int ReadChannelDataTypes(ifstream*, unsigned long); - int ReadChannelColorsAndNames(ifstream *,unsigned long); - int ReadTimeStampInformation(ifstream *,unsigned long); - int ReadLSMSpecificInfo(ifstream *,unsigned long); - int AnalyzeTag(ifstream *,unsigned long); - int ReadScanInformation(ifstream*, unsigned long); - int NeedToReadHeaderInformation(); - void NeedToReadHeaderInformationOn(); - void NeedToReadHeaderInformationOff(); - unsigned long SeekFile(int); - unsigned long GetOffsetToImage(int, int); - ifstream *GetFile(); - - int RequestUpdateExtent ( - vtkInformation* request, - vtkInformationVector** inputVector, - vtkInformationVector* outputVector); - -int RequestData( - - vtkInformation *vtkNotUsed(request), - - vtkInformationVector **vtkNotUsed(inputVector), - - vtkInformationVector *outputVector); - - - - - //void ExecuteData(vtkDataObject *out); - void CalculateExtentAndSpacing(int extent[6],double spacing[3]); - void DecodeHorizontalDifferencing(unsigned char *,int); - void DecodeHorizontalDifferencingUnsignedShort(unsigned short*, int); - void DecodeLZWCompression(unsigned char *,int); - void ConstructSliceOffsets(); - unsigned int GetStripByteCount(unsigned int timepoint, unsigned int slice); - unsigned int GetSliceOffset(unsigned int timepoint, unsigned int slice); - - - int SwapBytes; - - int IntUpdateExtent[6]; - unsigned long OffsetToLastAccessedImage; - int NumberOfLastAccessedImage; - int FileNameChanged; - ifstream *File; - char *FileName; - double VoxelSizes[3]; - int Dimensions[5];// x,y,z,time,channels - int NumberOfIntensityValues[4]; - unsigned short Identifier; - unsigned int NewSubFileType; - vtkUnsignedShortArray *BitsPerSample; - unsigned int Compression; - vtkUnsignedIntArray *StripOffset; - vtkUnsignedIntArray *ChannelDataTypes; - vtkDoubleArray *TrackWavelengths; - unsigned int SamplesPerPixel; - vtkUnsignedIntArray *StripByteCount; - unsigned int LSMSpecificInfoOffset; - unsigned short PhotometricInterpretation; - unsigned long ColorMapOffset; - unsigned short PlanarConfiguration; - unsigned short Predictor; - unsigned short ScanType; - int DataScalarType; - - vtkUnsignedIntArray *ImageOffsets; - vtkUnsignedIntArray *ReadSizes; - vtkDoubleArray* DetectorOffsetFirstImage; - vtkDoubleArray* DetectorOffsetLastImage; - - vtkStringArray* LaserNames; - - - double DataSpacing[3]; - int DataExtent[6]; - int NumberOfScalarComponents; - int DataType; - unsigned long ChannelInfoOffset; - unsigned long ChannelDataTypesOffset; - vtkIntArray *ChannelColors; - char **ChannelNames; - vtkDoubleArray *TimeStampInformation; - char* Objective; - char* Description; - double TimeInterval; - - unsigned char CharPointerToUnsignedChar(char *); - int CharPointerToInt(char *); - unsigned int CharPointerToUnsignedInt(char *); - short CharPointerToShort(char *); - unsigned short CharPointerToUnsignedShort(char *); - double CharPointerToDouble(char *); - - int ReadInt(ifstream *,unsigned long *); - unsigned int ReadUnsignedInt(ifstream *,unsigned long *); - short ReadShort(ifstream *,unsigned long *); - unsigned short ReadUnsignedShort(ifstream *,unsigned long *); - double ReadDouble(ifstream *,unsigned long *); - int ReadFile(ifstream *,unsigned long *,int,char *,bool swap=0); - int ReadData(ifstream *,unsigned long *,int,char *); - - -private: - vtkLSMReader(const vtkLSMReader&); // Not implemented. - void operator=(const vtkLSMReader&); // Not implemented. -}; -#endif diff --git a/branches/ColorViewer/QGoMainWindow.cxx b/branches/ColorViewer/QGoMainWindow.cxx deleted file mode 100644 index 97d2832c..00000000 --- a/branches/ColorViewer/QGoMainWindow.cxx +++ /dev/null @@ -1,728 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include "QGoMainWindow.h" - -#include - -#include -#include -#include - -#include "itkQtAdaptor.h" -#include "itkQtProgressBar.h" -#include "QColorImagePageView.h" - -#include -#include -#include - -#include "vtkImageAppendComponents.h" - -// ***************************************************************************** -QGoMainWindow::QGoMainWindow( ) -{ - this->setupUi( this ); - this->setCentralWidget( this->CentralImageTabWidget ); - this->setWindowTitle( tr( "~~>=O~~ GoFigure ~~O=<~~") ); - this->statusbar->showMessage( tr( "No data" ) ); - this->CentralImageTabWidget->clear(); - this->KishoreSegDockWidget->setVisible(false); - this->ManualSegmentationDockWidget->setVisible(false); - this->OneClickSegmentationDockWidget->setVisible(false); - this->statusbar->addPermanentWidget( &m_Bar ); - m_Bar.hide(); - //setCurrentFile(""); - -#if QT_VERSION_MAJOR == 4 && QT_VERSION_MINOR >= 5 - //NOTE: The next properties appear in Qt 4.5. - this->CentralImageTabWidget->setTabsClosable( true ); - this->CentralImageTabWidget->setTabsMovable( true ); -#endif - - m_LUTDialog = new QGoLUTDialog( this ); - - QObject::connect( this->m_LUTDialog, SIGNAL( accepted( ) ), - this, SLOT( ChangeLookupTable( ) ) ); - - /* QObject::connect( this->TracerPolygonBtn, SIGNAL( released( ) ), - this, SLOT( SetTracerToPolygonTracer() ) ); - QObject::connect( this->TracerFreeLineBtn, SIGNAL( released( ) ), - this, SLOT( SetTracerToFreeLineTracer() ) ); - QObject::connect( this->TracerTranslationBtn, SIGNAL( released() ), - this, SLOT( SetTracerToTranslateContourTracer() ) ); - QObject::connect( this->TracerRotationBtn, SIGNAL( released() ), - this, SLOT( SetTracerToRotateContourTracer() ) ); - QObject::connect( this->TracerScalingBtn, SIGNAL( released() ), - this, SLOT( SetTracerToScaleContourTracer() ) );*/ - - QObject::connect( this->ManualSegmentationOnRadioBtn, SIGNAL( toggled(bool) ), - this, SLOT( SetContourTracerOn(bool) ) ); - QObject::connect( this->ManualSegmentationOffRadioBtn, SIGNAL( toggled(bool) ), - this, SLOT( SetContourTracerOff(bool) ) ); - QObject::connect( this->IdContourColorBtn, SIGNAL( released( ) ), - this, SLOT( SetColorForGivenId( ) ) ); - QObject::connect( this->TracerValidationBtn, SIGNAL( released( ) ), - this, SLOT( ValidateContourTracer() ) ); - QObject::connect( this->TracerReinitializeBtn, SIGNAL( released() ), - this, SLOT( ReinitializeContourTracer() ) ); - //QObject::connect( this->actionOpen, SIGNAL( activated( ) ), - //this, SLOT( showprogressloading() ) ); - QObject::connect(CentralImageTabWidget,SIGNAL(currentChanged(int)),this, SLOT(UpdateFullScreenViewButtons(int))); - - Fullscreenbuttons(); - - for (int i = 0; i < MaxRecentFiles; ++i) - { - recentFileActions[i] = new QAction(this); - recentFileActions[i]->setVisible(false); - QObject::connect(this->recentFileActions[i], SIGNAL(triggered()), - this, SLOT(openRecentFile())); - } - - readSettings(); -} - -// ***************************************************************************** -QGoMainWindow::~QGoMainWindow() -{ - while( !m_PageView.empty() ) - { - delete m_PageView.last(); - m_PageView.pop_back(); - } - delete m_LUTDialog; -} - -// ***************************************************************************** -void QGoMainWindow::on_actionOpen_activated( ) -{ - // NOTE: Handling symbolic links will be done later - // (that way it requires much more code than expected) - // QFileDialog filedialog( this, tr( "Select Image" ) ); - // filedialog.setResolveSymlinks( true ); - QString filename = QFileDialog::getOpenFileName( this, tr( "Select Image" ) ); - - if( !filename.isEmpty() ) - { - SetFileName( filename ); - } -} - -// ***************************************************************************** -void QGoMainWindow::on_actionClose_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - // NOTE ALEX: should check idx against min and max of array - this->CentralImageTabWidget->removeTab( idx ); - if (idx>=0) - {delete m_PageView[idx]; - m_PageView.remove( idx ); - } - - // NOTE ALEX: - // we should remove the datasets in m_ITK, m_VTK arrays - // by default to release memory - // - // We should check if it was the last tab, in which case, - // the close option shoudl be disactivated - - writeSettings(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionClose_all_activated( ) -{ - this->CentralImageTabWidget->clear( ); - while( !m_PageView.empty() ) - { - delete m_PageView.last(); - m_PageView.pop_back(); - writeSettings(); - } -} - -// ***************************************************************************** -void QGoMainWindow::on_actionQuit_activated( ) -{ - this->close(); - writeSettings(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionBackground_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - double* rgb = m_PageView[idx]->GetBackgroundColor(); - QColor color( static_cast< int >( 255. * rgb[0] ), - static_cast< int >( 255. * rgb[1] ), - static_cast< int >( 255. * rgb[2] ) ); - m_PageView[idx]->SetBackgroundColor( QColorDialog::getColor( color, this ) ); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionLookup_Table_activated( ) -{ - m_LUTDialog->show(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionQuad_View_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->quadview(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionFull_screen_XY_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->FullScreenViewXY(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionFull_screen_YZ_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->FullScreenView3(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionFull_screen_XZ_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->FullScreenView2(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionFull_screen_XYZ_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->FullScreenViewXYZ(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionVolume_rendering_XYZ_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - if (actionVolume_rendering_XYZ->isChecked()) - m_PageView[idx]->SetView3DToVolumeRenderingMode(); - else - m_PageView[idx]->SetView3DToTriPlanarMode(); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionScale_bars_activated( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - if (actionScale_bars->isChecked()) - m_PageView[idx]->SetShowScalarBar(true); - else - m_PageView[idx]->SetShowScalarBar(false); -} - -// ***************************************************************************** -void QGoMainWindow::SetContourTracerOn(const bool& iChecked) -{ - if( iChecked ) - { - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->SetTracerON(); - } -} - -// ***************************************************************************** -void QGoMainWindow::SetContourTracerOff(const bool& iChecked) -{ - if( iChecked ) - { - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->SetTracerOFF(); - } -} -// void QGoMainWindow::SetTracerToPolygonTracer() -// { -// m_PageView->SetTracerToPolygon(); -// } - -// ***************************************************************************** -// void QGoMainWindow::SetTracerToFreeLineTracer() -// { -// m_PageView->SetTracerToFreeLine(); -// } - -// ***************************************************************************** -// void QGoMainWindow::SetTracerToTranslateContourTracer() -// { -// m_PageView->SetTracerToTranslateExistingContour(); -// } - -// ***************************************************************************** -// void QGoMainWindow::SetTracerToRotateContourTracer() -// { -// m_PageView->SetTracerToRotateExistingContour(); -// } - -// ***************************************************************************** -// void QGoMainWindow::SetTracerToScaleContourTracer() -// { -// m_PageView->SetTracerToScaleExistingContour(); -// } - - -// ***************************************************************************** -void QGoMainWindow::ChangeLookupTable( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->SetLookupTable( this->m_LUTDialog->GetLookupTable() ); -} - -// ***************************************************************************** -void QGoMainWindow::SetColorForGivenId( const bool& iSelect ) -{ - unsigned int cell_id = IdContourBox->value(); - - // m_PageView-> - vnl_random random( 12 ); - QColor color; - - if( cell_id < 7 ) - { - switch( cell_id ) - { - default: - case 1: - color.setHsv( 0, 255, 255 ); - break; - case 2: - color.setHsv( 60, 255, 255 ); - break; - case 3: - color.setHsv( 120, 255, 255 ); - break; - case 4: - color.setHsv( 180, 255, 255 ); - break; - case 5: - color.setHsv( 240, 255, 255 ); - break; - case 6: - color.setHsv( 300, 255, 255 ); - break; - } - } - else - { - switch( cell_id % 6 ) - { - case 0: - color.setHsv( random.lrand32( 0, 60 ), random.lrand32( 0, 255 ), random.lrand32( 0, 255 ) ); - break; - case 1: - color.setHsv( random.lrand32( 60, 120 ), random.lrand32( 0, 255 ), random.lrand32( 0, 255 ) ); - break; - case 2: - color.setHsv( random.lrand32( 120, 180 ), random.lrand32( 0, 255 ), random.lrand32( 0, 255 ) ); - break; - case 3: - color.setHsv( random.lrand32( 180, 240 ), random.lrand32( 0, 255 ), random.lrand32( 0, 255 ) ); - break; - case 4: - color.setHsv( random.lrand32( 240, 300 ), random.lrand32( 0, 255 ), random.lrand32( 0, 255 ) ); - break; - case 5: - color.setHsv( random.lrand32( 300, 360 ), random.lrand32( 0, 255 ), random.lrand32( 0, 255 ) ); - break; - } - } - - if( iSelect ) - { - m_IdColorMap[ cell_id ] = QColorDialog::getColor( color, this ); - } - else - { - m_IdColorMap[ cell_id ] = color; - } - -} - -// ***************************************************************************** -void QGoMainWindow::ValidateContourTracer( ) -{ - int idx = this->CentralImageTabWidget->currentIndex(); - unsigned int cell_id = IdContourBox->value(); - m_PageView[idx]->SetCellId( cell_id ); - - if( m_IdColorMap.find( cell_id ) == m_IdColorMap.end() ) - SetColorForGivenId( false ); - - m_PageView[idx]->ValidateContour( - cell_id, - m_IdColorMap[ cell_id ], - this->SaveContourCheckBox->isChecked() ); -} - -// ***************************************************************************** -void QGoMainWindow::ReinitializeContourTracer() -{ - int idx = this->CentralImageTabWidget->currentIndex(); - m_PageView[idx]->ReinitializeContour(); -} - - -// ***************************************************************************** -void QGoMainWindow::SetFileName( const QString& iFile ) -{ - if( QFile::exists( iFile ) ) - { - this->setCurrentFile( iFile ); - // parse extension - QFileInfo fi(iFile); - QString ext = fi.suffix(); - if( ext.compare("lsm") == 0 ) - { - this->OpenAndDisplayLSMFile( m_CurrentFile, 0, true ); - } - else - { - this->OpenImage( m_CurrentFile ); - this->DisplayImage( m_CurrentFile ); - } - } -} - -// ***************************************************************************** -void QGoMainWindow::OpenImage( const QString& iFile ) -{ - typedef itk::ImageFileReader< ImageType > ImageReaderType; - typedef ImageReaderType::Pointer ImageReaderPointer; - - ImageReaderPointer reader = ImageReaderType::New(); - reader->SetFileName( iFile.toAscii( ).constData( ) ); - - //BUG 03/23: This next line is commented for the time being since - // it makes gofigure crashing. - // this->ShowProgressLoading( reader ); - reader->Update(); - this->HideProgressLoading(); - - m_ITKImage.push_back( reader->GetOutput() ); - m_ITKImage.last()->DisconnectPipeline(); - -} - -// ***************************************************************************** -void QGoMainWindow::DisplayImage( QString iTag ) -{ - m_Convert.push_back( VTKConvertImageType::New() ); - m_Convert.last()->SetInput( m_ITKImage.last() ); - ShowProgressLoading( m_Convert.last() ); - m_Convert.last()->Update(); - HideProgressLoading(); - - m_VTKImage.push_back( m_Convert.last()->GetOutput() ); - - m_PageView.push_back( new QImagePageViewTracer ); - m_PageView.last()->SetImage( m_VTKImage.last() ); - - int idx = this->CentralImageTabWidget->addTab( m_PageView.last(), iTag ); - this->CentralImageTabWidget->setCurrentIndex( idx ); -} - -// ***************************************************************************** -void QGoMainWindow::OpenAndDisplayLSMFile( QString iTag, int timePoint, bool ComposeChannels ) -{ - this->OpenLSMFile( iTag, timePoint, ComposeChannels ); - - //m_PageView.push_back( new QImagePageViewTracer ); - QColorImagePageView * viewer = new QColorImagePageView; - //m_PageView.last()->SetImage( m_VTKImage.last() ); - viewer->SetImage( m_VTKImage.last() ); - - int idx = this->CentralImageTabWidget->addTab( viewer, iTag ); - this->CentralImageTabWidget->setCurrentIndex( idx ); -} - -// ***************************************************************************** -void QGoMainWindow::OpenLSMFile( QString iTag, int timePoint, bool ComposeChannels ) -{ - vtkLSMReader* reader=vtkLSMReader::New(); - reader->SetFileName( iTag.toAscii( ).constData( ) ); - reader->SetUpdateTimePoint( timePoint ); - reader->Update(); - - int NumberOfChannels = reader->GetNumberOfChannels(); - - if( !ComposeChannels || NumberOfChannels < 2 ) - { - vtkImageData * result = vtkImageData::New(); - result->ShallowCopy( reader->GetOutput() ); - m_VTKImage.push_back( result ); - reader->Delete(); - return; - } - - vtkLSMReader* reader2 = vtkLSMReader::New(); - reader2->SetFileName( iTag.toAscii( ).constData( ) ); - reader2->SetUpdateTimePoint( timePoint ); - reader2->SetUpdateChannel( 1 ); - reader2->Update(); - - vtkImageAppendComponents* appendFilter1 = vtkImageAppendComponents::New(); - appendFilter1->AddInput( reader->GetOutput() ); - appendFilter1->AddInput( reader2->GetOutput() ); - appendFilter1->Update(); - - reader->Delete(); - reader2->Delete(); - - // NOTE ALEX: if channel == 2 we could do a deepcopy - // for faster process - vtkLSMReader* reader3 = vtkLSMReader::New(); - reader3->SetFileName( iTag.toAscii( ).constData( ) ); - reader3->SetUpdateTimePoint( timePoint ); - reader3->SetUpdateChannel( 2 ); - reader3->Update(); - - int * dimensions = reader3->GetDimensions(); - int flatindex = dimensions[0] * dimensions[1] * dimensions[2]; - if( NumberOfChannels == 2 ) // dummy third channel - { - // here we suppose the type to be char - // to be improved - char *ptr = (char*)( reader3->GetOutput()->GetScalarPointer()); - for( int k=0; k < flatindex; k++ ) - { - *ptr++ = 0; - } - } - - vtkImageAppendComponents* appendFilter2 = vtkImageAppendComponents::New(); - appendFilter2->AddInput( appendFilter1->GetOutput() ); - appendFilter2->AddInput( reader3->GetOutput() ); - appendFilter2->Update(); - - appendFilter1->Delete(); - reader3->Delete(); - - vtkImageData * result = vtkImageData::New(); - result->ShallowCopy( appendFilter2->GetOutput() ); - appendFilter2->Delete(); - - m_VTKImage.push_back( result ); - - return; -} - -// ***************************************************************************** -void QGoMainWindow::DisplayInTab( vtkImageData* myImage, int TabIndex ) -{ - m_PageView[ TabIndex ]->SetImage( myImage ); -} - - - -// ***************************************************************************** -void QGoMainWindow::on_actionAbout_activated( ) -{ - QString version( tr( "v0.5" ) ); - - QString about_gofigure( tr( "GoFigure V2 \n\n" ) ); - - QString authors( tr( "Authors in alphabetical order:\n" ) ); - authors.append( " * 2008 ~ Arnaud Gelas\n" ); - authors.append( " * 2007 ~ Alexandre Gouaillard\n" ); - authors.append( " * 2008 ~ Kishore Mosaliganti\n" ); - authors.append( " * 2008 ~ Lydie Souhait\n\n" ); - authors.append( " * Principal Investigator\n" ); - authors.append( " * Sean Megason\n" ); - - QString message = QString( "GoFigure V2 %1\n\n" ).arg( version ); - message.append( about_gofigure ); - message.append( authors ); - - QMessageBox::about( this, tr( "About GoFigure" ), message ); -} - -// ***************************************************************************** -void QGoMainWindow::on_actionAbout_Qt_activated( ) -{ - QMessageBox::aboutQt( this, tr( "About Qt" ) ); -} - -// ***************************************************************************** -void QGoMainWindow::Fullscreenbuttons() -{ - m_FullscreenGroup = new QActionGroup (this); - m_FullscreenGroup->addAction( this->actionFull_screen_XY ); - m_FullscreenGroup->addAction( this->actionFull_screen_YZ ); - m_FullscreenGroup->addAction( this->actionFull_screen_XZ ); - m_FullscreenGroup->addAction( this->actionFull_screen_XYZ ); - m_FullscreenGroup->addAction( this->actionQuad_View ); -} - -// ***************************************************************************** -void QGoMainWindow::setCurrentFile(const QString &fileName) -{ - m_CurrentFile = fileName; - this->setWindowModified( false ); - QString shownName = "Untitled"; - if( !m_CurrentFile.isEmpty() ) - { - shownName = strippedName( m_CurrentFile ); - m_RecentFiles.removeAll( m_CurrentFile ); - m_RecentFiles.prepend( m_CurrentFile ); - updateRecentFileActions(); - } -} - -// ***************************************************************************** -QString QGoMainWindow::strippedName(const QString &fullFileName) -{ - return QFileInfo(fullFileName).fileName(); -} - -// ***************************************************************************** -void QGoMainWindow::updateRecentFileActions() -{ - QMutableStringListIterator i(m_RecentFiles); - while (i.hasNext()) - { - if (!QFile::exists(i.next())) - i.remove(); - } - if (!m_RecentFiles.isEmpty()) - { - menuOpen_Recent_Files->setEnabled(true); - } - - for (int j = 0; j < MaxRecentFiles; ++j) - { - if (j < m_RecentFiles.count()) - { - QString text = tr("&%1 %2 ") - .arg(j + 1) - .arg(strippedName(m_RecentFiles[j])); - - recentFileActions[j]->setText(text); - recentFileActions[j]->setData(m_RecentFiles[j]); - recentFileActions[j]->setVisible(true); - menuOpen_Recent_Files->addAction(recentFileActions[j]); - } - } -} - -// ***************************************************************************** -void QGoMainWindow::openRecentFile() -{ - QAction* action = qobject_cast< QAction* >( sender() ); - if( action ) - { - SetFileName(action->data().toString()); - } -} - - -// ***************************************************************************** -void QGoMainWindow::readSettings() -{ - QSettings settings("MegasonLab", "Gofigure2"); - m_RecentFiles = settings.value("recentFiles").toStringList(); - updateRecentFileActions(); -} - -// ***************************************************************************** -void QGoMainWindow::writeSettings() -{ - QSettings settings("MegasonLab", "Gofigure2"); - settings.setValue("recentFiles", m_RecentFiles); -} - -// ***************************************************************************** -void QGoMainWindow::ShowProgressLoading( itk::Object * myFilter ) -{ - m_Bar.setValue(50); - m_Bar.show(); - m_Bar.Observe( myFilter ); - - myFilter->AddObserver( itk::EndEvent(), m_SignalAdaptor.GetCommand() ); - - QObject::connect( &m_SignalAdaptor, SIGNAL(Signal()), - &(this->m_Bar), SLOT(hide()) ); -} - -// ***************************************************************************** -void QGoMainWindow::HideProgressLoading() -{ - m_Bar.hide(); -} - -// ***************************************************************************** -void QGoMainWindow::UpdateFullScreenViewButtons(int idx) -{ - if( (idx>=0) && (idxGetFullScreenView(); -switch( whichview ) - { - default: - case 0: - { this->actionQuad_View->setChecked(true); - break; - } - case 1: - { - this->actionFull_screen_XY->setChecked(true); - break; - } - case 2: - { - this->actionFull_screen_XZ->setChecked(true); - break; - } - case 3: - { - this->actionFull_screen_YZ->setChecked(true); - break; - } - case 4: - { - this->actionFull_screen_XYZ->setChecked(true); - break; - } - } -} -} diff --git a/branches/ColorViewer/QGoMainWindow.h b/branches/ColorViewer/QGoMainWindow.h deleted file mode 100644 index cbb3c27a..00000000 --- a/branches/ColorViewer/QGoMainWindow.h +++ /dev/null @@ -1,187 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#ifndef __QGoMainWindow_h -#define __QGoMainWindow_h - -#include - -#include -#include - -// ALEX: Have to use decorator pattern here -#include -// #include "QColorImagePageView.h" -#include -#include "itkQtProgressBar.h" -#include "itkQtAdaptor.h" -#include "vtkLSMReader.h" - -#include -#include -#include -#include - -#include "QGoLUTDialog.h" -#include "ui_go.h" - - -class QGoMainWindow : public QMainWindow, - private Ui::go_mainwindow -{ - Q_OBJECT - -public: - typedef itk::Image< unsigned char, 3 > ImageType; - typedef ImageType::Pointer ImagePointer; - - typedef itk::ImageToVTKImageFilter< ImageType > VTKConvertImageType; - typedef VTKConvertImageType::Pointer VTKConvertImagePointer; - - QGoMainWindow( ); - virtual ~QGoMainWindow(); - - void SetFileName( const QString& iFileName ); - - -protected slots: - void on_actionOpen_activated( ); -// void on_actionSave_activated(); - void on_actionClose_activated( ); - void on_actionClose_all_activated( ); - void on_actionQuit_activated( ); - - void on_actionBackground_activated( ); - void on_actionLookup_Table_activated( ); - - void on_actionQuad_View_activated( ); - void on_actionFull_screen_XY_activated( ); - void on_actionFull_screen_YZ_activated( ); - void on_actionFull_screen_XZ_activated( ); - void on_actionFull_screen_XYZ_activated( ); - void on_actionVolume_rendering_XYZ_activated( ); - void on_actionScale_bars_activated( ); - - void on_actionAbout_activated( ); - void on_actionAbout_Qt_activated( ); - - void SetContourTracerOn(const bool& iChecked); - void SetContourTracerOff(const bool& iChecked); - void ShowProgressLoading( itk::Object * myFilter ); - void HideProgressLoading(); -/**\Update the full screen button group when the current tab is changed*/ - void UpdateFullScreenViewButtons(int idx); - - -// void SetTracerToPolygonTracer(); -// void SetTracerToFreeLineTracer(); -// void SetTracerToTranslateContourTracer(); -// void SetTracerToRotateContourTracer(); -// void SetTracerToScaleContourTracer(); - - void ChangeLookupTable( ); - - void SetColorForGivenId( const bool& iSelected = true ); - void ValidateContourTracer(); - void ReinitializeContourTracer(); - void openRecentFile(); - -protected: - QVector< ImagePointer > m_ITKImage; - QVector< vtkImageData* > m_VTKImage; - - /** \brief Quad View*/ - // QVector< QWidget* > m_PageView; - QVector< QImagePageViewTracer* > m_PageView; - - /** \brief Convert itk::Image format to vtkImageData */ - QVector< VTKConvertImagePointer > m_Convert; - - /** \brief Look-up Table dialog */ - QGoLUTDialog* m_LUTDialog; - - QHash< unsigned int, QColor > m_IdColorMap; - QActionGroup* m_FullscreenGroup; - - /** \brief */ - void setCurrentFile(const QString &fileName); - - /** \brief */ - void updateRecentFileActions(); - - /** \brief Open Image with given iFileName - \param[in] iFileName - */ - void OpenImage( const QString& iFileName ); - - /** \brief Display Image in a "quad-view" widget in a tab. - The title of the tab is given by iTag. - \param[in] iImage - \param[in] iTag - */ - void DisplayImage( QString iTag ); - - /** \brief Create Fullscreengroup*/ - void Fullscreenbuttons(); - - void readSettings(); - void writeSettings(); - - itk::QtSignalAdaptor m_SignalAdaptor; - - /** \brief list of recent files */ - QStringList m_RecentFiles; - - /** \brief current file name */ - QString m_CurrentFile; - - /** \brief Remove path from a given FileName*/ - QString strippedName(const QString &fullFileName); - - itk::QtProgressBar m_Bar; - //QProgressBar m_Bar; - - enum { MaxRecentFiles = 5 }; - QAction *recentFileActions[MaxRecentFiles]; - -private: - QGoMainWindow( const QGoMainWindow& ); - QGoMainWindow operator = ( const QGoMainWindow& ); - - void DisplayInTab( vtkImageData* myImage, int TabIndex ); - void OpenLSMFile( QString iTag, int timePoint, bool ComposeChannels ); - void OpenAndDisplayLSMFile( QString iTag, int timePoint, bool ComposeChannels ); - -}; -#endif diff --git a/branches/ColorViewer/go.ui b/branches/ColorViewer/go.ui deleted file mode 100644 index ffebea31..00000000 --- a/branches/ColorViewer/go.ui +++ /dev/null @@ -1,1541 +0,0 @@ - - go_mainwindow - - - Qt::NonModal - - - - 0 - 0 - 1440 - 829 - - - - GoFigure - - - true - - - - - - - QTabWidget::North - - - QTabWidget::Rounded - - - 0 - - - Qt::ElideLeft - - - - Tab 1 - - - - - Page - - - - - - - - - - 0 - 0 - 1440 - 25 - - - - - File - - - - false - - - Open Recent Files - - - - - - - - - - - - - View - - - - - - - - - - - - - - - - - Help - - - - - - - Segmentation - - - - - - - - false - - - Tracking - - - - - false - - - Lineage - - - - - Properties - - - - - - - - - - - - - - - - false - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - toolBar_2 - - - TopToolBarArea - - - false - - - - - - - - - - true - - - - 196 - 93 - - - - - 299 - 578 - - - - false - - - QDockWidget::AllDockWidgetFeatures - - - Geodesic Active Contour - - - 1 - - - - - - 0 - 0 - 211 - 381 - - - - - 50 - false - false - false - false - true - - - - Qt::LeftToRight - - - false - - - QFrame::Plain - - - 0 - - - 2 - - - - - 0 - 0 - 201 - 284 - - - - Foreground Extraction - - - - - 30 - 250 - 152 - 60 - - - - Qt::Vertical - - - QDialogButtonBox::Apply|QDialogButtonBox::RestoreDefaults - - - false - - - - - - 0 - 0 - 192 - 261 - - - - - - - - - Nuclei Stain -Threshold Min - - - - - - - 255 - - - 70 - - - - - - - - - - - Nuclei Stain -Threshold Max - - - m_NucleiTresholdSpinBox - - - - - - - 255 - - - 120 - - - - - - - - - - - Membrane Stain -Threshold - - - m_MembraneThresholdSpinBox - - - - - - - 255 - - - 255 - - - - - - - - - - - Correlation -Threshold - - - m_CorrelationThresholdSpinBox - - - - - - - 255 - - - 5 - - - - - - - - - - - Average Cell -Radius - - - m_CellRadiusSpinBox - - - - - - - 255 - - - 40 - - - - - - - - - - - Sigma Form - - - - - - - 2.000000000000000 - - - - - - - - - - - - 0 - 0 - 201 - 284 - - - - Feature Extraction - - - - - 30 - 220 - 152 - 60 - - - - Qt::Vertical - - - QDialogButtonBox::Apply|QDialogButtonBox::RestoreDefaults - - - - - - 0 - 0 - 202 - 222 - - - - - - - - - Sigma Cell -Stain - - - - - - - 0.400000000000000 - - - - - - - - - - - Sigma - Correlation Map - - - - - - - 0.400000000000000 - - - - - - - - - - - Distance Map -Weight - - - spinBox_8 - - - - - - - % - - - 100 - - - 30 - - - - - - - - - - - Gradient -Weight - - - spinBox_9 - - - - - - - % - - - - - - 100 - - - 30 - - - - - - - - - - - Gauss - Weight - - - spinBox_6 - - - - - - - % - - - 100 - - - 10 - - - - - - - - - - - - 0 - 0 - 201 - 284 - - - - Level Set Evolution - - - - - 30 - 260 - 152 - 60 - - - - Qt::Vertical - - - QDialogButtonBox::Apply|QDialogButtonBox::RestoreDefaults - - - - - - 0 - 0 - 187 - 268 - - - - - - - - - Max. Nb. -Iter. - - - spinBox_10 - - - - - - - Maximum Number Of Iterations - - - 1000 - - - 500 - - - - - - - - - - - Propagation -Weight - - - spinBox_11 - - - - - - - % - - - 100 - - - 3 - - - - - - - - - - - Curvature -Weight - - - spinBox_12 - - - - - - - % - - - 100 - - - 1 - - - - - - - - - - - Advection -Weight - - - spinBox_13 - - - - - - - % - - - 100 - - - 3 - - - - - - - - - - - Max RMS -Change - - - - - - - 4 - - - 0.001000000000000 - - - - - - - - - - - Min -Component - - - - - - - 2 - - - 2.000000000000000 - - - - - - - - - - - - - 30 - 430 - 158 - 28 - - - - Qt::Horizontal - - - QDialogButtonBox::Apply|QDialogButtonBox::Cancel - - - - - - - - 196 - 70 - - - - Manual Segmentation - - - 1 - - - - - - 20 - 0 - 49 - 56 - - - - - - - On - - - - - - - Off - - - true - - - - - - - - - 30 - 110 - 121 - 23 - - - - Save Contours - - - - - - 50 - 140 - 96 - 58 - - - - - - - Reinitialize - - - - - - - Validate - - - - - - - - - 11 - 71 - 186 - 29 - - - - - - - Id - - - IdContourBox - - - - - - - 1 - - - 10000 - - - - - - - false - - - Set Color... - - - - - - layoutWidget - TracerValidationBtn - layoutWidget - TracerReinitializeBtn - SaveContourCheckBox - OneClickSegmentationDockWidget - - - - - toolBar - - - - 22 - 22 - - - - TopToolBarArea - - - false - - - - - - - - - - - One Click - - - 1 - - - - - - 30 - 140 - 126 - 26 - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 7 - 60 - 161 - 20 - - - - Qt::Horizontal - - - - - - 10 - 10 - 108 - 48 - - - - - - - Chan Vese - - - true - - - - - - - Shape-Based - - - - - - - - - 10 - 80 - 170 - 50 - - - - - - - - - 2D - - - true - - - - - - - 3D - - - - - - - - - - - Radius - - - - - - - um - - - 0.100000000000000 - - - 6.000000000000000 - - - 0.100000000000000 - - - 3.000000000000000 - - - - - - - - - - - - false - - - false - - - - :/newPrefix/fig/document-open.png:/newPrefix/fig/document-open.png - - - Open - - - Ctrl+O - - - - - true - - - - :/newPrefix/fig/filesaveas.png:/newPrefix/fig/filesaveas.png - - - Save As... - - - Ctrl+S - - - - - - :/newPrefix/fig/system-quit.png:/newPrefix/fig/system-quit.png - - - Quit - - - Ctrl+Q - - - true - - - - - New Tab - - - - - Close - - - Ctrl+W - - - - - true - - - - :/newPrefix/fig/xy.png:/newPrefix/fig/xy.png - - - Full-screen XY - - - - - true - - - - :/newPrefix/fig/yz.png:/newPrefix/fig/yz.png - - - Full-screen YZ - - - - - true - - - - :/newPrefix/fig/zx.png:/newPrefix/fig/zx.png - - - Full-screen XZ - - - - - true - - - false - - - - :/newPrefix/fig/xyz.png:/newPrefix/fig/xyz.png - - - Full-screen (tri-planar) XYZ - - - Tri-planar XYZ - - - - - About - - - QAction::AboutRole - - - - - About Qt - - - QAction::AboutQtRole - - - - - true - - - false - - - false - - - Geodesic Active Contour Seg. - - - - - Background ... - - - - - false - - - Image ... - - - - - false - - - Mesh ... - - - - - true - - - true - - - - :/newPrefix/fig/VolumeRendering1.png:/newPrefix/fig/VolumeRendering1.png - - - Volume rendering on/off - - - Volume Rendering XYZ - - - - - Free-Line - - - - - Polygon - - - - - Translation - - - - - Rotation - - - - - Scaling - - - - - Move Node - - - - - Add Node - - - - - Remove Node - - - - - Translation - - - - - Rotation - - - - - Scaling - - - - - Move node - - - - - Add node - - - - - Delete node - - - - - Copy - - - - - Add Contour - - - - - true - - - false - - - true - - - Manual Segmentation - - - - - false - - - - :/newPrefix/fig/page-zoom.png:/newPrefix/fig/page-zoom.png - - - Zoom - - - true - - - - - true - - - - :/newPrefix/fig/LookupTable.png:/newPrefix/fig/LookupTable.png - - - Lookup Table - - - - - false - - - - :/newPrefix/fig/Hand.png:/newPrefix/fig/Hand.png - - - Pan - - - - - false - - - - :/newPrefix/fig/selection.png:/newPrefix/fig/selection.png - - - Select - - - - - Close all - - - - - true - - - true - - - - :/newPrefix/fig/4views.png:/newPrefix/fig/4views.png - - - Quad-View - - - - - true - - - false - - - - :/newPrefix/fig/scalarbar.png:/newPrefix/fig/scalarbar.png - - - Scalar bars - - - - - ??? - - - - - true - - - false - - - One Click Segmentation - - - - - m_NucleiTresholdSpinBox - m_MembraneThresholdSpinBox - m_CorrelationThresholdSpinBox - m_CellRadiusSpinBox - ForegroundExtractionbuttonBox - spinBox_6 - spinBox_8 - spinBox_9 - buttonBox_4 - spinBox_10 - spinBox_11 - spinBox_12 - spinBox_13 - buttonBox_3 - m_KishoreGlobalApplyBtn - - - - - - - actionCopy - toggled(bool) - KishoreSegDockWidget - setVisible(bool) - - - -1 - -1 - - - 107 - 325 - - - - - actionManual_Segmentation - toggled(bool) - ManualSegmentationDockWidget - setVisible(bool) - - - -1 - -1 - - - 107 - 462 - - - - - actionOne_Click_Segmentation - toggled(bool) - OneClickSegmentationDockWidget - setVisible(bool) - - - -1 - -1 - - - 97 - 672 - - - - - diff --git a/branches/ColorViewer/gofigure.cxx b/branches/ColorViewer/gofigure.cxx deleted file mode 100644 index 8ad4cde7..00000000 --- a/branches/ColorViewer/gofigure.cxx +++ /dev/null @@ -1,83 +0,0 @@ -/*========================================================================= - Authors: The GoFigure Dev. Team. - at Megason Lab, Systems biology, Harvard Medical school, 2009 - - Copyright (c) 2009, President and Fellows of Harvard College. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - Neither the name of the President and Fellows of Harvard College - nor the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - =========================================================================*/ - -#include -#include "QGoMainWindow.h" -#include - -int main( int argc, char** argv ) -{ - QApplication app(argc, argv); - - QPixmap pixmap(":/fig/splash.jpg"); - QSplashScreen *splash = new QSplashScreen(pixmap,Qt::WindowStaysOnTopHint); - - splash->show(); - - app.processEvents(); - splash->showMessage("Application loading...please wait"); - - QGoMainWindow form; - - if( argc == 2 ) - { - splash->showMessage("Image loading...please wait"); - form.SetFileName( argv[1] ); - } - - app.setMainWidget( &form ); - - form.show( ); - - splash->showMessage("Application ready"); - // app.processEvents(); - splash->finish(&form); - delete splash; - - return app.exec(); -} - - - - - - - - - -/*establishConnections(); -mainWin.show(); -splash->finish(&mainWin); -delete splash; -return app.exec();*/ diff --git a/branches/ColorViewer/resources/axes.qrc b/branches/ColorViewer/resources/axes.qrc deleted file mode 100644 index f568e465..00000000 --- a/branches/ColorViewer/resources/axes.qrc +++ /dev/null @@ -1,68 +0,0 @@ - - - fig/splash.jpg - - - fig/xy.png - - - fig/scalarbar.png - - - fig/4views.png - - - fig/selection.png - - - fig/filesaveas.png - - - fig/document-open.png - - - fig/Hand.png - - - fig/LookupTable.png - - - fig/folder.png - - - fig/page-zoom.png - - - fig/system-quit.png - - - fig/spline.png - - - fig/tracer.png - - - fig/scaling.png - - - fig/rotation.png - - - fig/translation.png - - - fig/VolumeRendering1.png - - - fig/xyz.png - - - fig/zx.png - - - fig/yz.png - - - fig/scalarbar.png - - diff --git a/branches/ColorViewer/resources/fig/4views.png b/branches/ColorViewer/resources/fig/4views.png deleted file mode 100644 index e93aff4d4f5b01b37467e15cd89aa4597b04855f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6<+C7!;n z>^FG01tgV<_(b!7LMuI8978<3lY2~4f9!v5#eDdCJr7S0&lSe5Lk`6%l@kB#tH1TE ziim4@Xy42rUdYCL*I~=kQ;!^)S>1Wrj)|*i-00-qebJyz-EdPg(~^l&5>svlTrxD} zY5kdH(tJR$wtok5v2=CbQBrS312DSD03pgPRZLmXqCRJ;evy=94?Ep z25jD}aY2060VB~VIR%Lm_Sl?A{lxSC<`RKdQyLyAG&9be(Z(Ks@9I{dqZvG1{an^L HB{Ts5786|o diff --git a/branches/ColorViewer/resources/fig/Hand.png b/branches/ColorViewer/resources/fig/Hand.png deleted file mode 100644 index 9653437d1d47639bdff74ceeacb074da76c25e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!2~4zm9+zb6id3JuOkD)#(wTUiL5|AXMsm# zF#`j)5C}6~x?A@LD9B#o>FdgVgGW$=o9A6)c_>imfv1aOh=u>$DHnO04R~B$`n);f z2Si_1g~y(KxJ2k*myrE$3-vwcKF7$lKRCY8=R|4j(w7!}fqsV=PF+j7U#`0?_wnX; zp?VvPv(87g7WK7QGN@hU&Rw;$WycZLYm$;(tC$YH5MSB)DA@dr!R4~Hz-C3ConmeU z%(qpvmv{MYE9NXdVBVkBE$*A1<~{%C(F3}x{z!b~nfvzWrmN!HZI@5`xXj+dJ@upV zzAV3pd66}zS6d1H>ocCDW>db}uK$_mq5JnIJhyoxbA9!zRbgK@-Rxcd{Oknd-;>Xz gPs{s%wy(vU_doBkYx=x5fPQ80boFyt=akR{0J$oRl>h($ diff --git a/branches/ColorViewer/resources/fig/LookupTable.png b/branches/ColorViewer/resources/fig/LookupTable.png deleted file mode 100644 index 01b76ba3d513b22f6e87fa570ce83992144b1045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)x^D<3L&0;TXeR_AAo!>q^^SrOf|0gFMSgMrx_K2A2h;5X02m|Or zH@eV{7Brv^AygoUA~93>VlIos-;3TbB>D0vmi3G~T;l>K*uy5)5yKRQ(Th$rqZVai zy%vhKlPAfK;0}TxxT##>3`a=Yp{uM5c4&mPA7Qki9w7t?F7OJz*IezK(#)e_&I6*Du37^0ZL1jaFlK7?VQ6^-B^%2c5o#bO==T!&Cjj?lmRCvWk$ Vh2seQFOUEL002ovPDHLkV1g|l(Cq*K diff --git a/branches/ColorViewer/resources/fig/VolumeRendering1.png b/branches/ColorViewer/resources/fig/VolumeRendering1.png deleted file mode 100644 index d1859eb07ed8d1599cd1357740a296712ee69e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1891 zcmV-p2b}ncP)<+8}( zvcLlF0xrw0?81V;atd-^a-2F6c&P9R(MwkNE$||A7|F6VlKgl2R=J!wOx;4-D>Xb*n}?UCZ*+V zL|yB}TRe%f(11Rtgu%1~hC;ki=2hZ;whmER<8zg|vq6$kxM!6h{NSLC@Sfl(`ie4j zKXdu<%m(dd!o!{(mksF6@E%8N6630{^=rlEh@MTy>ew36jq~|oGV|M*N(#e}DJAq$ zBl5DA;yV}Le`l#6ys_U}SUwL|Ha{RoJ;_jUE_2}r7~b;{#`UYITl+)$J+^T=q6T{} zHR0zJi2V}@_0PxAOM`n%4~ojWT+KBRATm*`XcYUdw^+9Cec>HD3t`zy0paV0Qgj{D zXmwpoX2$cG?=HpO@RyG|Q%4(Y_fuaUDC z>mPNROg|L_;Z4Q0Xq)u&9;>b25S9vkvg$ zn20z@(z7wo***5njPMigk3be(AV{k*6VdgTeNcf3Qf;Mc7E-ZGq%E; zg63K&B_(a-nx4=!@(X(Ie?g|{IR`SoVq4T0>Z)d@k2_OmeuG-`xou@hxAO)HqO@8^kX4Eu86E`6S-vr)M(o2H<@Vb9z&v; z!Yy@%Jb4EX;sa^fXoYUgkEpd=!QjzdB&O8h8KM7&e~jU8Nm5hO*vMp(qO#|Sd#Djt zKh?8xxx!75#3@O;Tt}MNNMUh1!>VGwPWEFiIS@^@f(%(NU1?$ly!SD@|6|5Z?nWyq zLY64wPGSOO(wq3j*Z(fRwCiD>qU+hd04-i&)sNfS`lUj8ik_^<5-vwol9S&~pFE$b zQ#)zfu!>&0H5gK*T+Zo1Ev-afSjCO9yXYixMh`jBchH5-3lXHG>IfCp&Kc^uN<>$U zzsXZ{|3zQlTPK{5J|qbzX$!#3paLAj)ikd&4eiXzo9 z^EiG#*mczkOF?)`P&bSbCYfYYz!)(}t&~P)p$bo-LR^ek(u!+v6Am8bI3B*q){0)pJ}t!|c8tbk8WnFTy+ zu=6&u^IR{k(Y+ivqyIyKSd*6=>9+P|^k2baa>fa}F-Ji5LtHP;5T*En{yPm!)T&Tc zwNoI`P#zLPrM(k1wwtMT^Wf9KJRFWz;c&PD7q45SN}IpQk?EyDM|N6nU-7S&%sWp} z&T>UHL*lJ3iBkOvm2QX`rIe?cr+J#{%cC>9>Ds(zK0LK+R$^Sc0!c`pCydLEu88{m4y7_!^bNVKy^a@%Q^mot+c$L#67^gDk@o9#MktyZD4 zT#3PQIo(dygohU4aRmq@K#O#0gr=?_%zF7I^F05z<5$iz zVk^jvk#jxH{264Jkf}!~sTm@+WQN%EdqijSBf9xHQDqO=`LhvR%=_CnQrDRr5n;3a d|A1c#{1g9mbN9tH?>ztj002ovPDHLkV1j?pquKxf diff --git a/branches/ColorViewer/resources/fig/VolumeRenderingIcon.png b/branches/ColorViewer/resources/fig/VolumeRenderingIcon.png deleted file mode 100644 index b02373ec6bbd2a7cd64e35e4e56636ce8b3bb2ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1852 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 diff --git a/branches/ColorViewer/resources/fig/filesave.png b/branches/ColorViewer/resources/fig/filesave.png deleted file mode 100644 index 105e3cd534a770f859c222589db349543d21f20b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1245 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

Q0>FRc=Uxs2jR*^2+uw> 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 z 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 WuzFhUW?caF?~;>JmaGvs4*q}Ctkr`6 diff --git a/branches/ColorViewer/resources/fig/page-zoom.png b/branches/ColorViewer/resources/fig/page-zoom.png deleted file mode 100644 index d40a26aab002ed4a98d442521b70de8afb4b8b74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 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 USs8j5N|*&GzEOK!Aqx%uf7%6DhX4Qo diff --git a/branches/ColorViewer/resources/fig/rotation.png b/branches/ColorViewer/resources/fig/rotation.png deleted file mode 100644 index 1d13b66c3b0f0158b256d51677a89c8f39e9a860..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1187 zcmV;U1YG-xP)CC<&N8&@26Af59%2VRKf#6yQ<1g;cOa#AAP+9?q( zz<{NEeXjdh2q-_JNkagEmi7RQk#&+OeDTDq^cdgIjztJJH{ODP^9WR{ME;pcP!4>Z z%qW8yjHoDpugmhG;^Sr`v|fQ-6oevjCoseTXWD0gBU40mwus$%BK8-EIAoNfNF9c7 zufSOp>T(5M>h}P3KX9AYZ<5`e-2a)zRMNpKu$q9M74eaC9$?QX#_3$ThzhU3JQFrb zaLN;4zW-+63XvCoAMiR-_Nhb!r$s@>Ro=7;LCckR#w_5{N#M^WV7LWvPRtQO6>yCt zTwlzEgM9~Q&g0T`lc={l4!|gTCkU{~yw3o<> zg*yZen(;7#5)4?fJu9Pd=y?6{<}$N==-AQruglG+sn^Fc=}m@k@X^~p!oJ>L7b=zQMII|L`Un969Wxh3hzDmVbj>zvy9o#liBZC4_Q|? zyVm&SX!R@G-!-TaVEE zZQXcVJ7eu+Gr_yMSmW-JFL+e*^##u9L!o;krQ*#xY9q}SUV+>L%76g6m^4^lf0cE1 zP6N~YwE3OxocJi+D#JY*<}(f^6aUyF5&mvHkPAN-uuDZiK4>}Gz|NhU2B!Hp6{Yn& zE4($UicF$Z`0IpJ9Q|b4<0J&6#Kk4`)Yc5o^4Ml$BTbFNabemuVKeykeB?RG`^O@3 z4T9jj?57wg_{yEfiPtMBBYsVZ z&e2bGw`3jsHkcmC@2aV}#rg=G1e+4kYNffA?aE8rkqd~Nzim{FJfFXR4L*ESN`HTY zig8Ts)3=d(>-s89HD)S+O^+K_|8V&5$Nfi+{4;&H>_cbBT+2jMfM`*L+)ZsKP z<+;v9()(LX!M^S3A*wT}387mfdFY&uncQ>W{{ag1Qj@(8nw9_n002ovPDHLkV1j41 BK9v9f diff --git a/branches/ColorViewer/resources/fig/scalarbar.png b/branches/ColorViewer/resources/fig/scalarbar.png deleted file mode 100755 index 93a76507f40d0b0f8dacadcf4d22b128c9a0cfd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM5!2~4h*IN|;DaPU;cPEB*=VV?2Ih+L^k;M!Q z+`=Ht$S`Y;1W=H@#M9T6{U$S)sDR+>biLC+p*T+$#}JM4TQ9|O9Z=w5eh|ra@Be~Z z@~)0Y-f;P#U<~1FKrd`dOk-(HhIC7GfXR1Eedf7ICVxtcPYz~ xYf;Quu@|~Iqp~&L?*0G2Me})2kP_2N_W$mdQ>B7^z5{Jy@O1TaS?83{1OW9nLw^7O diff --git a/branches/ColorViewer/resources/fig/scaling.png b/branches/ColorViewer/resources/fig/scaling.png deleted file mode 100644 index abd6a788af48c02e41142eb53ea236cfe33cd43d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmV-`1AqL9P)4iTIX0(r^CQz#=*v_rH)#r1f|MCiX*t{vX`&DqfeBWYAvv}Fgn?uY zLH(hVC@Wd|Bf*M(lrd>aMj#4(e`hJAB>DCByayaBXKoE1HqKtI=YHNbo{uRjtvSwbZk#JvfK@CwY81S*~v0`qSK z+MfgZKbBZW2_dTz%g73k!Q9^~WP>DrYxF1R5nNrAj7d^$5YT~i1mz}C#{XpnUjm0- zAQcMnYb}J?mmy+#down;jodwghbdt+EtiVJsR-dp33^e$%;)fcM?1Drla0P8EE8aV zK%gm?`0*ubC6q^(Lb;@3u2khaT;wZ`UMA@4aLxUlR#L*p+)q~*v?P@hxdstUHFWc= z0)~nO^k~A6R6uqt0`u|tqGBS>BnX(3?*m`jV^ZO28*eO+%!|is4c3C5@hN#SWHA46 zKu29bN{Nq;Y^c>TqETQSSK=+y3D&QM z|Fw#;{7*L94D0P>^!>B*TxCJ5%KiABG?J~zjzeHd-1_8Ut96{&?QFQMZG2NykdFKA z3B=tQ85|8LTTT|6Cc3*Bd*WbhV1PLqEVsy_D88Kkfy>~76fXr3Q(b7P8SUyEcyZ$< zd)n0Wp5l?XR2r6R=8PN9E-6%Um4;MpR?qoUsjl%^4)pi`i!Mk;q}+h#S?w*%_55$N WYPgwXEq`nP0000Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU!(Md!>R7gu>V88+X|Nqa3OO7J(uV25)eE9G|i0T&n{rk7!+qZA! zyLRo83JncqrpT2@nwft8{yqKFsZ(!u?AX!N-Q6t@lw+ZW;VeIY{+yAXp8mg}pz!^s zO`AH3ii%``1~XA=IO~reKW2u7Mf{hLl>eWfU-)6~-n~7(zP{p=8V)u%GBWnRppfE! z8ClK$Sy?$B&zw2a0Ss>mpy6bPIoROn=*0gLQU?F|1r+~FN~r-2&w6wA?AdNg3^j~0he-F&=k3N0+^Z-boy>{(dJTT08 zfWbnrd;uFA9uf6lL(}O0oVg2sq-WLrlaVw2pPo_h6`0MJ0}b&2VjCdV17aB<<{~D% z!3I}WRsEkZVbc2p2M+E&c<|IGS$VVnW)?304jediJ~%ko0cemI5QALG4o%y{xfmGp zZ&s{Wu~b)AH}u}Ud;8ryBLB-P=>4y*Zg_d*$dM|bVIrhv7UnNszEobha%F<6tE(qa zvlg&0N?o{UB`_z-|95ru{&nowu`R$9p$(K{BdPp&_3D*cXJ@A>%)7wkC42GW<*P=< zHvcWH?Ei1svgOK*88d=_^4!Ek8oK46#1BfNps-^*ckV*%#*JJ4tX#SJ*|KHJmIed_ zxBQbIKabi+^eSHcr*MU+6$Va@C8Vs_O73xAzh7f`V1JSvTP+Wk5 d1sP*i4*;nuK~pBUw#Wbg002ovPDHLkV1is!nFas= diff --git a/branches/ColorViewer/resources/fig/selector.png b/branches/ColorViewer/resources/fig/selector.png deleted file mode 100644 index ff22d44579f124c9f33c1a45142fee444e6f310c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 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�`p%PiD-Hi7Ob0$;k*!b7Jd` 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 TK7)e@-=h)6C}rE=e-{1^Rfu}j diff --git a/branches/ColorViewer/resources/fig/spline.png b/branches/ColorViewer/resources/fig/spline.png deleted file mode 100644 index 64ea8ee67c5aab59d46326d845d89c777564a9e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 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 Hu0mjf`H=-c diff --git a/branches/ColorViewer/resources/fig/xy.png b/branches/ColorViewer/resources/fig/xy.png deleted file mode 100644 index 1e9b6f5de6aae33e5ed405f89ea038b63cafc87f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455 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