From 4385257abab406204bb01fde554b72dac89ea2d3 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 11:53:14 -0400 Subject: [PATCH 01/16] COMP: Use slicerMacroBuildLoadableModule instead of deprecated slicerMacroBuildQtModule --- Modules/Loadable/CameraPath/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Loadable/CameraPath/CMakeLists.txt b/Modules/Loadable/CameraPath/CMakeLists.txt index 9522166..9cb4fe6 100644 --- a/Modules/Loadable/CameraPath/CMakeLists.txt +++ b/Modules/Loadable/CameraPath/CMakeLists.txt @@ -53,7 +53,7 @@ set(MODULE_RESOURCES ) #----------------------------------------------------------------------------- -slicerMacroBuildQtModule( +slicerMacroBuildLoadableModule( NAME ${MODULE_NAME} TITLE ${MODULE_TITLE} EXPORT_DIRECTIVE ${MODULE_EXPORT_DIRECTIVE} From 5cf5c8985f5d399497645326d69245ce9fc0cf91 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 11:53:47 -0400 Subject: [PATCH 02/16] COMP: Simplify and fix build removing unused FooBarWidget --- Modules/Loadable/CameraPath/CMakeLists.txt | 2 - .../UI/qSlicerCameraPathFooBarWidget.ui | 31 -------- .../CameraPath/Widgets/CMakeLists.txt | 42 ----------- .../Widgets/qSlicerCameraPathFooBarWidget.cxx | 72 ------------------- .../Widgets/qSlicerCameraPathFooBarWidget.h | 52 -------------- 5 files changed, 199 deletions(-) delete mode 100644 Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathFooBarWidget.ui delete mode 100644 Modules/Loadable/CameraPath/Widgets/CMakeLists.txt delete mode 100644 Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.cxx delete mode 100644 Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.h diff --git a/Modules/Loadable/CameraPath/CMakeLists.txt b/Modules/Loadable/CameraPath/CMakeLists.txt index 9cb4fe6..0df6153 100644 --- a/Modules/Loadable/CameraPath/CMakeLists.txt +++ b/Modules/Loadable/CameraPath/CMakeLists.txt @@ -8,7 +8,6 @@ string(TOUPPER ${MODULE_NAME} MODULE_NAME_UPPER) #----------------------------------------------------------------------------- add_subdirectory(MRML) add_subdirectory(Logic) -add_subdirectory(Widgets) #----------------------------------------------------------------------------- set(MODULE_EXPORT_DIRECTIVE "Q_SLICER_QTMODULES_${MODULE_NAME_UPPER}_EXPORT") @@ -45,7 +44,6 @@ set(MODULE_UI_SRCS set(MODULE_TARGET_LIBRARIES vtkSlicerModelsModuleLogic vtkSlicer${MODULE_NAME}ModuleLogic - qSlicer${MODULE_NAME}ModuleWidgets ) set(MODULE_RESOURCES diff --git a/Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathFooBarWidget.ui b/Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathFooBarWidget.ui deleted file mode 100644 index 7a6cf29..0000000 --- a/Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathFooBarWidget.ui +++ /dev/null @@ -1,31 +0,0 @@ - - - qSlicerCameraPathFooBarWidget - - - - 0 - 0 - 103 - 27 - - - - Foo bar - - - - 0 - - - - - Foo Bar - - - - - - - - diff --git a/Modules/Loadable/CameraPath/Widgets/CMakeLists.txt b/Modules/Loadable/CameraPath/Widgets/CMakeLists.txt deleted file mode 100644 index cd9298a..0000000 --- a/Modules/Loadable/CameraPath/Widgets/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -project(qSlicer${MODULE_NAME}ModuleWidgets) - -set(KIT ${PROJECT_NAME}) - -set(${KIT}_EXPORT_DIRECTIVE "Q_SLICER_MODULE_${MODULE_NAME_UPPER}_WIDGETS_EXPORT") - -set(${KIT}_INCLUDE_DIRECTORIES - ) - -set(${KIT}_SRCS - qSlicer${MODULE_NAME}FooBarWidget.cxx - qSlicer${MODULE_NAME}FooBarWidget.h - ) - -set(${KIT}_MOC_SRCS - qSlicer${MODULE_NAME}FooBarWidget.h - ) - -set(${KIT}_UI_SRCS - ../Resources/UI/qSlicer${MODULE_NAME}FooBarWidget.ui - ) - -set(${KIT}_RESOURCES - ../Resources/UI/qSlicer${MODULE_NAME}FooBarWidget.ui - ) - -set(${KIT}_TARGET_LIBRARIES - vtkSlicer${MODULE_NAME}ModuleLogic - ) - -#----------------------------------------------------------------------------- -SlicerMacroBuildModuleWidgets( - NAME ${KIT} - EXPORT_DIRECTIVE ${${KIT}_EXPORT_DIRECTIVE} - INCLUDE_DIRECTORIES ${${KIT}_INCLUDE_DIRECTORIES} - SRCS ${${KIT}_SRCS} - MOC_SRCS ${${KIT}_MOC_SRCS} - UI_SRCS ${${KIT}_UI_SRCS} - TARGET_LIBRARIES ${${KIT}_TARGET_LIBRARIES} - RESOURCES ${${KIT}_RESOURCES} - WRAP_PYTHONQT - ) diff --git a/Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.cxx b/Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.cxx deleted file mode 100644 index 1940201..0000000 --- a/Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.cxx +++ /dev/null @@ -1,72 +0,0 @@ -/*============================================================================== - - Program: 3D Slicer - - Copyright (c) Kitware Inc. - - See COPYRIGHT.txt - or http://www.slicer.org/copyright/copyright.txt for details. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - This file was originally developed by Jean-Christophe Fillion-Robin, Kitware Inc. - and was partially funded by NIH grant 3P41RR013218-12S1 - -==============================================================================*/ - -// FooBar Widgets includes -#include "qSlicerCameraPathFooBarWidget.h" -#include "ui_qSlicerCameraPathFooBarWidget.h" - -//----------------------------------------------------------------------------- -/// \ingroup Slicer_QtModules_CameraPath -class qSlicerCameraPathFooBarWidgetPrivate - : public Ui_qSlicerCameraPathFooBarWidget -{ - Q_DECLARE_PUBLIC(qSlicerCameraPathFooBarWidget); -protected: - qSlicerCameraPathFooBarWidget* const q_ptr; - -public: - qSlicerCameraPathFooBarWidgetPrivate( - qSlicerCameraPathFooBarWidget& object); - virtual void setupUi(qSlicerCameraPathFooBarWidget*); -}; - -// -------------------------------------------------------------------------- -qSlicerCameraPathFooBarWidgetPrivate -::qSlicerCameraPathFooBarWidgetPrivate( - qSlicerCameraPathFooBarWidget& object) - : q_ptr(&object) -{ -} - -// -------------------------------------------------------------------------- -void qSlicerCameraPathFooBarWidgetPrivate -::setupUi(qSlicerCameraPathFooBarWidget* widget) -{ - this->Ui_qSlicerCameraPathFooBarWidget::setupUi(widget); -} - -//----------------------------------------------------------------------------- -// qSlicerCameraPathFooBarWidget methods - -//----------------------------------------------------------------------------- -qSlicerCameraPathFooBarWidget -::qSlicerCameraPathFooBarWidget(QWidget* parentWidget) - : Superclass( parentWidget ) - , d_ptr( new qSlicerCameraPathFooBarWidgetPrivate(*this) ) -{ - Q_D(qSlicerCameraPathFooBarWidget); - d->setupUi(this); -} - -//----------------------------------------------------------------------------- -qSlicerCameraPathFooBarWidget -::~qSlicerCameraPathFooBarWidget() -{ -} diff --git a/Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.h b/Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.h deleted file mode 100644 index a5bb1a2..0000000 --- a/Modules/Loadable/CameraPath/Widgets/qSlicerCameraPathFooBarWidget.h +++ /dev/null @@ -1,52 +0,0 @@ -/*============================================================================== - - Program: 3D Slicer - - Copyright (c) Kitware Inc. - - See COPYRIGHT.txt - or http://www.slicer.org/copyright/copyright.txt for details. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - This file was originally developed by Jean-Christophe Fillion-Robin, Kitware Inc. - and was partially funded by NIH grant 3P41RR013218-12S1 - -==============================================================================*/ - -#ifndef __qSlicerCameraPathFooBarWidget_h -#define __qSlicerCameraPathFooBarWidget_h - -// Qt includes -#include - -// FooBar Widgets includes -#include "qSlicerCameraPathModuleWidgetsExport.h" - -class qSlicerCameraPathFooBarWidgetPrivate; - -/// \ingroup Slicer_QtModules_CameraPath -class Q_SLICER_MODULE_CAMERAPATH_WIDGETS_EXPORT qSlicerCameraPathFooBarWidget - : public QWidget -{ - Q_OBJECT -public: - typedef QWidget Superclass; - qSlicerCameraPathFooBarWidget(QWidget *parent=0); - virtual ~qSlicerCameraPathFooBarWidget(); - -protected slots: - -protected: - QScopedPointer d_ptr; - -private: - Q_DECLARE_PRIVATE(qSlicerCameraPathFooBarWidget); - Q_DISABLE_COPY(qSlicerCameraPathFooBarWidget); -}; - -#endif From a791be953f24b3922366defa2570f3b2b50e5c3b Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 11:55:33 -0400 Subject: [PATCH 03/16] COMP: Remove obsolete code supporting Qt4 plugin infrastructure --- Modules/Loadable/CameraPath/qSlicerCameraPathModule.cxx | 3 --- 1 file changed, 3 deletions(-) diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModule.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModule.cxx index 4dbe603..c59f1c4 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModule.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModule.cxx @@ -31,9 +31,6 @@ #include "qSlicerCameraPathModuleWidget.h" #include "qSlicerCameraPathReader.h" -//----------------------------------------------------------------------------- -Q_EXPORT_PLUGIN2(qSlicerCameraPathModule, qSlicerCameraPathModule); - //----------------------------------------------------------------------------- /// \ingroup Slicer_QtModules_ExtensionTemplate class qSlicerCameraPathModulePrivate From f8648cc693159bda4fc7c7a486e6b85a6721f1cc Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 12:03:01 -0400 Subject: [PATCH 04/16] COMP: Support building against VTK without FFMPEG IO module This commit introduces Slicer_CAMERA_PATH_EXPORT_VIDEO_SUPPORT macro to conditionally build FFMPEG export. --- .../CameraPath/qSlicerCameraPathModuleWidget.cxx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index 362fec7..a7603a2 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -49,7 +49,9 @@ #include "vtkRenderWindow.h" #include "vtkWindowToImageFilter.h" #include "vtkPNGWriter.h" +#ifdef Slicer_CAMERA_PATH_EXPORT_VIDEO_SUPPORT #include "vtkFFMPEGWriter.h" +#endif //----------------------------------------------------------------------------- /// \ingroup Slicer_QtModules_ExtensionTemplate @@ -1024,14 +1026,20 @@ void qSlicerCameraPathModuleWidget::onRecordClicked() } } +#ifdef Slicer_CAMERA_PATH_EXPORT_VIDEO_SUPPORT vtkNew FFMPEGWriter; +#endif if(exportType == VIDEOCLIP) { +#ifdef Slicer_CAMERA_PATH_EXPORT_VIDEO_SUPPORT FFMPEGWriter->SetInputConnection(w2i->GetOutputPort()); FFMPEGWriter->SetQuality(exportQuality); FFMPEGWriter->SetFileName(fileName.toStdString().c_str()); FFMPEGWriter->SetRate(d->fpsSpinBox->value()); FFMPEGWriter->Start(); +#else + qWarning() << "Export failed: CameraPath module build without video export support"; +#endif } // Create progress dialog @@ -1075,8 +1083,10 @@ void qSlicerCameraPathModuleWidget::onRecordClicked() // Write video frame if(exportType == VIDEOCLIP) { +#ifdef Slicer_CAMERA_PATH_EXPORT_VIDEO_SUPPORT qDebug() <<"Writing frame "<< i << "/" << d->timeSlider->maximum(); FFMPEGWriter->Write(); +#endif } // Update progress dialog @@ -1094,7 +1104,9 @@ void qSlicerCameraPathModuleWidget::onRecordClicked() // End video if(exportType == VIDEOCLIP) { +#ifdef Slicer_CAMERA_PATH_EXPORT_VIDEO_SUPPORT FFMPEGWriter->End(); +#endif } // Reset renderwindow size From 5e42fcc32301ed8ba0cee38635e4b0756c0ad07c Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 12:07:01 -0400 Subject: [PATCH 05/16] COMP: Fix build against Qt5 using QHeaderView::setSectionResizeMode --- Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index a7603a2..7a0f8a8 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -164,7 +164,7 @@ void qSlicerCameraPathModuleWidget::setup() // Keyframes table widget d->keyFramesTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); d->keyFramesTableWidget->setColumnWidth(0,80); - d->keyFramesTableWidget->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch); + d->keyFramesTableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); connect(d->keyFramesTableWidget, SIGNAL(cellChanged(int, int)), this, SLOT(onCellChanged(int, int))); connect(d->keyFramesTableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(onItemClicked(QTableWidgetItem*))); From 907222e767eb3cfd9759724ab4677b1cd3dd7769 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 12:14:33 -0400 Subject: [PATCH 06/16] COMP: Fix CameraPathModuleWidget build removing use of obsolete MRML Copy API Follow up Slicer/Slicer@f88c11043 (ENH: Refactor MRML node API to support shallow and deep copy) switching to use of MRMLNodeModifyBlocker --- .../Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index 7a0f8a8..0955626 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -683,14 +683,13 @@ void qSlicerCameraPathModuleWidget::onUpdateKeyFrameClicked() cameraPathNode->GetKeyFrameCamera(index); // Update keyframe camera - keyframeCameraNode->DisableModifiedEventOn(); - keyframeCameraNode->CopyWithoutModifiedEvent(defaultCameraNode); + MRMLNodeModifyBlocker blocker(keyframeCameraNode); + + keyframeCameraNode->Copy(defaultCameraNode); keyframeCameraNode->SetHideFromEditors(1); QString cameraPathName(cameraPathNode->GetName()); QString cameraName(cameraPathName+"_Camera"); keyframeCameraNode->SetName(cameraName.toStdString().c_str()); - keyframeCameraNode->DisableModifiedEventOff(); - keyframeCameraNode->Modified(); // XXX Update splines cameraPathNode->SetKeyFrameCamera(index,keyframeCameraNode); From 6e56cfcc4d7c7b399c9013d6fd567a189d0b2eda Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 12:28:08 -0400 Subject: [PATCH 07/16] COMP: Update script to fix "TabError: inconsistent use of tabs and spaces in indentation" --- .../Scripted/testCameraPath/testCameraPath.py | 176 ++++++++---------- 1 file changed, 79 insertions(+), 97 deletions(-) diff --git a/Modules/Scripted/testCameraPath/testCameraPath.py b/Modules/Scripted/testCameraPath/testCameraPath.py index e2fac72..b09e62e 100644 --- a/Modules/Scripted/testCameraPath/testCameraPath.py +++ b/Modules/Scripted/testCameraPath/testCameraPath.py @@ -1,5 +1,13 @@ -import vtk, qt, ctk, slicer, time +import time import os + +import ctk +import qt +import vtk + +import slicer + + # # testCameraPath # @@ -17,6 +25,7 @@ def __init__(self, parent): self.parent = parent +# # qtestCameraPathWidget # @@ -50,133 +59,106 @@ def setup(self): self.RemoveButton.toolTip = "Remove KeyFrames" self.RemoveButton.connect('clicked()', self.onRemoveButton) progress_layout.addWidget(self.RemoveButton) - + self.AddButton = qt.QPushButton("Add KeyFrame") self.AddButton.toolTip = "Add KeyFrame" self.AddButton.connect('clicked()', self.onAddButton) progress_layout.addWidget(self.AddButton) - + self.CreateButton = qt.QPushButton("Create Path") self.CreateButton.toolTip = "Create Path" self.CreateButton.connect('clicked()', self.onCreateButton) progress_layout.addWidget(self.CreateButton) - + self.FlyButton = qt.QPushButton("Fly !") self.FlyButton.toolTip = "Fly !" self.FlyButton.connect('clicked()', self.onFlyButton) self.FlyButton.setEnabled(False) progress_layout.addWidget(self.FlyButton) - + # LOGIC self.defaultCam = slicer.mrmlScene.GetNodeByID('vtkMRMLCameraNode1') self.Time = 0 self.CameraList = [] self.cameraPath = slicer.vtkMRMLCameraPathNode() - posSpline = self.cameraPath.GetPositionSplines() - focalSpline = self.cameraPath.GetFocalPointSplines() - viewSpline = self.cameraPath.GetViewUpSplines() - - posSpline.SetName('posSpline') - focalSpline.SetName('focalSpline') - viewSpline.SetName('viewSpline') - - slicer.mrmlScene.AddNode(self.cameraPath) - slicer.mrmlScene.AddNode(posSpline) - slicer.mrmlScene.AddNode(focalSpline) - slicer.mrmlScene.AddNode(viewSpline) - - self.Flying = False + posSpline = self.cameraPath.GetPositionSplines() + focalSpline = self.cameraPath.GetFocalPointSplines() + viewSpline = self.cameraPath.GetViewUpSplines() + + posSpline.SetName('posSpline') + focalSpline.SetName('focalSpline') + viewSpline.SetName('viewSpline') + + slicer.mrmlScene.AddNode(self.cameraPath) + slicer.mrmlScene.AddNode(posSpline) + slicer.mrmlScene.AddNode(focalSpline) + slicer.mrmlScene.AddNode(viewSpline) + + self.Flying = False def onRemoveButton(self): - print "-- Removing KeyFrames" self.cameraPath.RemoveKeyFrames() - + if self.CameraList: - for camera in self.CameraList: - print camera.GetName() - slicer.mrmlScene.RemoveNode(camera) - del self.CameraList[:] - + for camera in self.CameraList: + print camera.GetName() + slicer.mrmlScene.RemoveNode(camera) + del self.CameraList[:] + self.Time = 0 - + def onAddButton(self): - - print " -- Adding Keyframe at t =",self.Time - camera = slicer.mrmlScene.CreateNodeByClass('vtkMRMLCameraNode') - slicer.mrmlScene.AddNode(camera) - - x = vtk.mutable(0) - y = vtk.mutable(0) - z = vtk.mutable(0) - value = [x,y,z] - - self.defaultCam.GetPosition(value) - camera.SetPosition(value) - self.defaultCam.GetFocalPoint(value) - camera.SetFocalPoint(value) - self.defaultCam.GetViewUp(value) - camera.SetViewUp(value) - - cameraName = 'Camera T = '+str(self.Time) - print cameraName - camera.SetName(cameraName) - - self.cameraPath.AddKeyFrame(self.Time, camera) - self.Time += 100 - self.CameraList.append(camera) - + print " -- Adding Keyframe at t =",self.Time + camera = slicer.mrmlScene.CreateNodeByClass('vtkMRMLCameraNode') + slicer.mrmlScene.AddNode(camera) + + x = vtk.mutable(0) + y = vtk.mutable(0) + z = vtk.mutable(0) + value = [x,y,z] + + self.defaultCam.GetPosition(value) + camera.SetPosition(value) + self.defaultCam.GetFocalPoint(value) + camera.SetFocalPoint(value) + self.defaultCam.GetViewUp(value) + camera.SetViewUp(value) + + cameraName = 'Camera T = '+str(self.Time) + print cameraName + camera.SetName(cameraName) + + self.cameraPath.AddKeyFrame(self.Time, camera) + self.Time += 100 + self.CameraList.append(camera) + self.FlyButton.setEnabled(False) def onCreateButton(self): - - print " -- Creating Path" - self.cameraPath.CreatePath(); + print " -- Creating Path" + self.cameraPath.CreatePath(); self.FlyButton.setEnabled(True) - def onFlyButton(self): - if not self.Flying: - print " -- FLYING !" - self.Flying = True + print " -- FLYING !" + self.Flying = True self.FlyButton.setText("Stop") - - for t in range(0,self.Time-99): - if not self.Flying: - return - self.cameraPath.GetCameraAt(t,self.defaultCam) - self.defaultCam.ResetClippingRange() - print t - slicer.app.processEvents() - time.sleep(0.05) - - print "End" - self.Flying = False - self.FlyButton.setText("Fly!") - - else: - print " -- Stopped" - self.Flying = False - self.FlyButton.setText("Fly!") - + for t in range(0,self.Time-99): + if not self.Flying: + return + self.cameraPath.GetCameraAt(t,self.defaultCam) + self.defaultCam.ResetClippingRange() + print t + slicer.app.processEvents() + time.sleep(0.05) + print "End" + self.Flying = False + self.FlyButton.setText("Fly!") + else: + print " -- Stopped" + self.Flying = False + self.FlyButton.setText("Fly!") self.FlyButton.setEnabled(True) - - - - - - - - - - - - - - - - - - - \ No newline at end of file + From faf512a10cc92dc00cd5140a0dbb6e1b0f98b6ab Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 12:33:14 -0400 Subject: [PATCH 08/16] COMP: Update script to support python3 This commit fixes the following error: SyntaxError: Missing parentheses in call to 'print' --- .../Scripted/testCameraPath/testCameraPath.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Modules/Scripted/testCameraPath/testCameraPath.py b/Modules/Scripted/testCameraPath/testCameraPath.py index b09e62e..d57f674 100644 --- a/Modules/Scripted/testCameraPath/testCameraPath.py +++ b/Modules/Scripted/testCameraPath/testCameraPath.py @@ -97,19 +97,19 @@ def setup(self): self.Flying = False def onRemoveButton(self): - print "-- Removing KeyFrames" + print("-- Removing KeyFrames") self.cameraPath.RemoveKeyFrames() if self.CameraList: for camera in self.CameraList: - print camera.GetName() + print(camera.GetName()) slicer.mrmlScene.RemoveNode(camera) del self.CameraList[:] self.Time = 0 def onAddButton(self): - print " -- Adding Keyframe at t =",self.Time + print(" -- Adding Keyframe at t =", self.Time) camera = slicer.mrmlScene.CreateNodeByClass('vtkMRMLCameraNode') slicer.mrmlScene.AddNode(camera) @@ -126,7 +126,7 @@ def onAddButton(self): camera.SetViewUp(value) cameraName = 'Camera T = '+str(self.Time) - print cameraName + print(cameraName) camera.SetName(cameraName) self.cameraPath.AddKeyFrame(self.Time, camera) @@ -136,13 +136,13 @@ def onAddButton(self): self.FlyButton.setEnabled(False) def onCreateButton(self): - print " -- Creating Path" + print(" -- Creating Path") self.cameraPath.CreatePath(); self.FlyButton.setEnabled(True) def onFlyButton(self): if not self.Flying: - print " -- FLYING !" + print(" -- FLYING !") self.Flying = True self.FlyButton.setText("Stop") for t in range(0,self.Time-99): @@ -150,14 +150,14 @@ def onFlyButton(self): return self.cameraPath.GetCameraAt(t,self.defaultCam) self.defaultCam.ResetClippingRange() - print t + print(t) slicer.app.processEvents() time.sleep(0.05) - print "End" + print("End") self.Flying = False self.FlyButton.setText("Fly!") else: - print " -- Stopped" + print(" -- Stopped") self.Flying = False self.FlyButton.setText("Fly!") self.FlyButton.setEnabled(True) From 5feaad95a5437162bc4244b370f143927bf2f16f Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 12:35:42 -0400 Subject: [PATCH 09/16] BUG: Fix loading of module when built against Slicer 5.x and Qt 5.15 This commit fixes the following runtime error: Failed to extract plugin meta data from '/path/to/lib/Slicer-5.1/qt-loadable-modules/libqSlicerCameraPathModule.so' References: * https://www.slicer.org/wiki/Documentation/Nightly/Developers/Tutorials/MigrationGuide#Qt5:_Update_loadable_modules_to_use_new_plugin_macros * https://wiki.qt.io/Transition_from_Qt_4.x_to_Qt5#Plugin_loading --- Modules/Loadable/CameraPath/qSlicerCameraPathModule.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h b/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h index 953eeda..25a68e6 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h @@ -31,6 +31,7 @@ qSlicerCameraPathModule : public qSlicerLoadableModule { Q_OBJECT + Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0"); Q_INTERFACES(qSlicerLoadableModule); public: From 169c0f6bd404e8a74c6ff18ada4fd725aae1f977 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 17:38:12 -0400 Subject: [PATCH 10/16] COMP: Replace deprecated qSort by std::sort --- Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index 0955626..65cc4f6 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -557,7 +557,7 @@ void qSlicerCameraPathModuleWidget::onDeleteSelectedClicked() rows << row; } // sort the list - qSort(rows); + std::sort(rows.begin(), rows.end()); // Popup window to ask the delete confirmation ctkMessageBox deleteMsgBox; From a1e744fa7e9f01c7693b2b5909bc6fe4e2a9811b Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 17:55:51 -0400 Subject: [PATCH 11/16] COMP: Fix -Wdeprecated-copy in vtkMRMLCameraPathNode.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit fixes warning like the following: In file included from /path/to/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNodePython.cxx:11: /tmp/Slicer-CameraPath/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h:30:13: note: because ‘KeyFrame’ has user-provided ‘KeyFrame& KeyFrame::operator=(const KeyFrame&)’ 30 | KeyFrame& operator = (const KeyFrame& a) | ^~~~~~~~ /tmp/Slicer-CameraPath/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h:106:46: note: initializing argument 2 of ‘void vtkMRMLCameraPathNode::SetKeyFrame(vtkIdType, KeyFrame)’ 106 | void SetKeyFrame(vtkIdType index, KeyFrame keyFrame); | ~~~~~~~~~^~~~~~~~ /path/to/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNodePython.cxx: In function ‘PyObject* PyvtkMRMLCameraPathNode_AddKeyFrame_s1(PyObject*, PyObject*)’: /path/to/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNodePython.cxx:849:29: warning: implicitly-declared ‘KeyFrame::KeyFrame(const KeyFrame&)’ is deprecated [-Wdeprecated-copy] 849 | op->AddKeyFrame(*temp0); | ^ --- Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h index f6531cc..faa6e09 100644 --- a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h +++ b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h @@ -27,6 +27,12 @@ struct KeyFrame Time(time) {} + KeyFrame(const KeyFrame& a) + { + Camera = a.Camera; + Time = a.Time; + } + KeyFrame& operator = (const KeyFrame& a) { Camera = a.Camera; From 468d513ab8fbadc0322120786c505d3a5d402be1 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 18:11:32 -0400 Subject: [PATCH 12/16] COMP: Use nullptr instead of 0 or NULL This commit converts the usage of null pointer constants (eg. NULL, 0) to use the new C++11 nullptr keyword. Updates were performed following these steps: (1) Reconfigure with CMAKE_EXPORT_COMPILE_COMMANDS cd /tmp/Slicer-CameraPath- cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON . (2) Run run-clang-tidy cd /tmp/Slicer-CameraPath-build run-clang-tidy-10 -header-filter='.*' -checks='-*,modernize-use-nullptr' -fix References: * https://www.slicer.org/wiki/Documentation/Nightly/Developers/Tutorials/MigrationGuide#C.2B.2B11:_Update_source_code_to_use_nullptr --- .../CameraPath/Logic/vtkSlicerCameraPathLogic.cxx | 14 +++++++------- .../CameraPath/MRML/vtkMRMLCameraPathNode.h | 14 +++++++------- .../CameraPath/MRML/vtkMRMLPointSplineNode.cxx | 4 ++-- .../CameraPath/MRML/vtkMRMLPointSplineNode.h | 2 +- .../Loadable/CameraPath/qSlicerCameraPathModule.h | 2 +- .../CameraPath/qSlicerCameraPathModuleWidget.cxx | 2 +- .../CameraPath/qSlicerCameraPathModuleWidget.h | 2 +- .../CameraPath/qSlicerCameraPathReader.cxx | 6 +++--- .../Loadable/CameraPath/qSlicerCameraPathReader.h | 4 ++-- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Modules/Loadable/CameraPath/Logic/vtkSlicerCameraPathLogic.cxx b/Modules/Loadable/CameraPath/Logic/vtkSlicerCameraPathLogic.cxx index 3effd40..7bc538e 100644 --- a/Modules/Loadable/CameraPath/Logic/vtkSlicerCameraPathLogic.cxx +++ b/Modules/Loadable/CameraPath/Logic/vtkSlicerCameraPathLogic.cxx @@ -82,7 +82,7 @@ void vtkSlicerCameraPathLogic::UpdateFromMRMLScene() //--------------------------------------------------------------------------- void vtkSlicerCameraPathLogic::OnMRMLSceneNodeAdded(vtkMRMLNode* node) { - if (node==NULL) + if (node == nullptr) { vtkErrorMacro("An invalid node is attempted to be added"); return; @@ -104,7 +104,7 @@ void vtkSlicerCameraPathLogic::OnMRMLSceneNodeAdded(vtkMRMLNode* node) //--------------------------------------------------------------------------- void vtkSlicerCameraPathLogic::OnMRMLSceneNodeRemoved(vtkMRMLNode* node) { - if (node==NULL) + if (node == nullptr) { vtkErrorMacro("An invalid node is attempted to be removed"); return; @@ -124,23 +124,23 @@ void vtkSlicerCameraPathLogic::OnMRMLSceneNodeRemoved(vtkMRMLNode* node) //--------------------------------------------------------------------------- char* vtkSlicerCameraPathLogic::LoadCameraPath(const char *fileName, const char *nodeName) { - char *nodeIDs = NULL; + char *nodeIDs = nullptr; std::string idList; if (!fileName) { vtkErrorMacro("LoadCameraPath: null file name, cannot load"); - return NULL; + return nullptr; } if (fileName[0] == '\0') { vtkErrorMacro("LoadCameraPath: empty file name, cannot load"); - return NULL; + return nullptr; } if (!this->GetMRMLScene()) { vtkErrorMacro("LoadCameraPath: no MRML scene, cannot load"); - return NULL; + return nullptr; } // turn on batch processing @@ -180,7 +180,7 @@ char* vtkSlicerCameraPathLogic::LoadCameraPath(const char *fileName, const char vtkErrorMacro("LoadCameraPath: coud not read data"); this->GetMRMLScene()->RemoveNode(cameraPathNode.GetPointer()); this->GetMRMLScene()->RemoveNode(storageNode.GetPointer()); - return NULL; + return nullptr; } // adding camera nodes to scene diff --git a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h index faa6e09..34bdcab 100644 --- a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h +++ b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.h @@ -21,7 +21,7 @@ struct KeyFrame //bool Locked; //bool Visibility; - KeyFrame(vtkMRMLCameraNode* camera = NULL, + KeyFrame(vtkMRMLCameraNode* camera = nullptr, double time = 0.0): Camera(camera), Time(time) @@ -104,9 +104,9 @@ class VTK_SLICER_CAMERAPATH_MODULE_MRML_EXPORT vtkMRMLCameraPathNode: KeyFrame GetKeyFrame(vtkIdType index); double GetKeyFrameTime(vtkIdType index); vtkMRMLCameraNode* GetKeyFrameCamera(vtkIdType index); - void GetKeyFramePosition(vtkIdType index, double position[3] = 0); - void GetKeyFrameFocalPoint(vtkIdType index, double focalPoint[3] = 0); - void GetKeyFrameViewUp(vtkIdType index, double viewUp[3] = 0); + void GetKeyFramePosition(vtkIdType index, double position[3] = nullptr); + void GetKeyFrameFocalPoint(vtkIdType index, double focalPoint[3] = nullptr); + void GetKeyFrameViewUp(vtkIdType index, double viewUp[3] = nullptr); void SetKeyFrames(KeyFrameVector keyFrames); void SetKeyFrame(vtkIdType index, KeyFrame keyFrame); @@ -140,9 +140,9 @@ class VTK_SLICER_CAMERAPATH_MODULE_MRML_EXPORT vtkMRMLCameraPathNode: vtkMRMLPointSplineNode* viewUps); void GetCameraAt(double t, vtkMRMLCameraNode* camera); - void GetPositionAt(double t, double position[3] = 0); - void GetFocalPointAt(double t, double focalPoint[3] = 0); - void GetViewUpAt(double t, double viewUp[3] = 0); + void GetPositionAt(double t, double position[3] = nullptr); + void GetFocalPointAt(double t, double focalPoint[3] = nullptr); + void GetViewUpAt(double t, double viewUp[3] = nullptr); double ClampTime(double t); protected: diff --git a/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.cxx b/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.cxx index 1ebc810..71e670a 100644 --- a/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.cxx +++ b/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.cxx @@ -115,12 +115,12 @@ void vtkMRMLPointSplineNode::PrintSelf(ostream& os, vtkIndent indent) //---------------------------------------------------------------------------- void vtkMRMLPointSplineNode::CreateDefaultDisplayNodes() { - if (vtkMRMLModelDisplayNode::SafeDownCast(this->GetDisplayNode())!=NULL) + if (vtkMRMLModelDisplayNode::SafeDownCast(this->GetDisplayNode()) != nullptr) { // display node already exists return; } - if (this->GetScene()==NULL) + if (this->GetScene() == nullptr) { vtkErrorMacro("vtkMRMLPointSplineNode::CreateDefaultDisplayNodes failed: scene is invalid"); return; diff --git a/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.h b/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.h index be2b34c..3cd99de 100644 --- a/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.h +++ b/Modules/Loadable/CameraPath/MRML/vtkMRMLPointSplineNode.h @@ -56,7 +56,7 @@ class VTK_SLICER_CAMERAPATH_MODULE_MRML_EXPORT vtkMRMLPointSplineNode : void AddPoint(double t, double point[3]); void RemovePoint(double t); void UpdatePolyData(int framerate); - void Evaluate(double t, double point[3]=0); + void Evaluate(double t, double point[3]=nullptr); protected: vtkMRMLPointSplineNode(); diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h b/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h index 25a68e6..9351a92 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModule.h @@ -37,7 +37,7 @@ qSlicerCameraPathModule public: typedef qSlicerLoadableModule Superclass; - explicit qSlicerCameraPathModule(QObject *parent=0); + explicit qSlicerCameraPathModule(QObject *parent=nullptr); virtual ~qSlicerCameraPathModule(); qSlicerGetTitleMacro(QTMODULE_TITLE); diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index 65cc4f6..551787b 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -98,7 +98,7 @@ qSlicerCameraPathModuleWidgetPrivate::logic() const Q_Q(const qSlicerCameraPathModuleWidget); vtkSlicerCameraPathLogic* logic=vtkSlicerCameraPathLogic::SafeDownCast(q->logic()); - if (logic==NULL) + if (logic == nullptr) { qCritical() << "Camera path logic is invalid"; } diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.h b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.h index c02eb40..a8e8894 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.h +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.h @@ -40,7 +40,7 @@ class Q_SLICER_QTMODULES_CAMERAPATH_EXPORT qSlicerCameraPathModuleWidget : public: typedef qSlicerAbstractModuleWidget Superclass; - qSlicerCameraPathModuleWidget(QWidget *parent=0); + qSlicerCameraPathModuleWidget(QWidget *parent=nullptr); virtual ~qSlicerCameraPathModuleWidget(); void travelToTime(double t); diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathReader.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathReader.cxx index 0c91cbb..f44a4a2 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathReader.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathReader.cxx @@ -107,7 +107,7 @@ bool qSlicerCameraPathReader::load(const IOProperties& properties) name = properties["name"].toString(); } - if (d->CameraPathLogic.GetPointer() == 0) + if (d->CameraPathLogic.GetPointer() == nullptr) { return false; } @@ -125,7 +125,7 @@ bool qSlicerCameraPathReader::load(const IOProperties& properties) while (ptr) { nodeIDList.append(ptr); - ptr = strtok(NULL, ","); + ptr = strtok(nullptr, ","); } this->setLoadedNodes(nodeIDList); } @@ -135,5 +135,5 @@ bool qSlicerCameraPathReader::load(const IOProperties& properties) return false; } - return nodeIDs != 0; + return nodeIDs != nullptr; } diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathReader.h b/Modules/Loadable/CameraPath/qSlicerCameraPathReader.h index dc9b21a..a010267 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathReader.h +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathReader.h @@ -32,8 +32,8 @@ class qSlicerCameraPathReader Q_OBJECT public: typedef qSlicerFileReader Superclass; - qSlicerCameraPathReader(QObject* parent = 0); - qSlicerCameraPathReader(vtkSlicerCameraPathLogic* logic, QObject* parent = 0); + qSlicerCameraPathReader(QObject* parent = nullptr); + qSlicerCameraPathReader(vtkSlicerCameraPathLogic* logic, QObject* parent = nullptr); virtual ~qSlicerCameraPathReader(); vtkSlicerCameraPathLogic* CameraPathLogic()const; From 3230fcb99abfbcbb8578a44d2d127244bdb54809 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 18:23:34 -0400 Subject: [PATCH 13/16] COMP: Fix -Waddress in vtkMRMLCameraPathNode.cxx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit fixes the following warning: /path/to/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx: In member function ‘void vtkMRMLCameraPathNode::SetKeyFrame(vtkIdType, KeyFrame)’: /path/to/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx:252:58: warning: the address of ‘time_t time(time_t*)’ will never be NULL [-Waddress] 252 | std::cerr << "A keyframe already exists for t = " << time << std::endl | ^~~~ --- Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx index 62a6a3c..b9279a8 100644 --- a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx +++ b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx @@ -249,7 +249,7 @@ void vtkMRMLCameraPathNode::SetKeyFrame(vtkIdType index, KeyFrame keyFrame) vtkIdType otherIndex = this->KeyFrameIndexAt(keyFrame.Time); if (otherIndex != -1) { - std::cerr << "A keyframe already exists for t = " << time << std::endl + std::cerr << "A keyframe already exists for t = " << keyFrame.Time << std::endl << "Keyframe ID : " << otherIndex << std::endl << std::endl; return; From 766e42c57abb8b75d89c995e4846da5c39ed9365 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 23:38:32 -0400 Subject: [PATCH 14/16] BUG: Avoid resetting current view camera by copying only camera attributes This commit leverage copy API introduced in Slicer/Slicer@f88c11043 (ENH: Refactor MRML node API to support shallow and deep copy). --- Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index 551787b..38d8beb 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -685,7 +685,7 @@ void qSlicerCameraPathModuleWidget::onUpdateKeyFrameClicked() // Update keyframe camera MRMLNodeModifyBlocker blocker(keyframeCameraNode); - keyframeCameraNode->Copy(defaultCameraNode); + keyframeCameraNode->CopyContent(defaultCameraNode); keyframeCameraNode->SetHideFromEditors(1); QString cameraPathName(cameraPathNode->GetName()); QString cameraName(cameraPathName+"_Camera"); @@ -741,7 +741,7 @@ void qSlicerCameraPathModuleWidget::onAddKeyFrameClicked() // Create new camera vtkNew newCameraNode; - newCameraNode->Copy(defaultCameraNode); + newCameraNode->CopyContent(defaultCameraNode); newCameraNode->SetHideFromEditors(1); QString cameraPathName(cameraPathNode->GetName()); QString newCameraName(cameraPathName+"_Camera"); From bcc10984c78ccac3ee2ac757fad93a00cf9231de Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 20:18:30 -0400 Subject: [PATCH 15/16] BUG: Avoid clobbering other view's camera node Since following Slicer/Slicer@e78f557cd (ENH: Simplify view widgets initialization from view nodes), the camera node is managed as a singleton (the singleton tag corresponds to the layout name), this commit ensures camera nodes associated with other views are not clobbered by systematically instantiating a new camera node that is (1) not added to the scene and (2) only used as convenience inside vtkMRMLCameraPathNode. --- .../CameraPath/MRML/vtkMRMLCameraPathNode.cxx | 6 +++- .../qSlicerCameraPathModuleWidget.cxx | 15 ++------- .../Scripted/testCameraPath/testCameraPath.py | 31 ++----------------- 3 files changed, 10 insertions(+), 42 deletions(-) diff --git a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx index b9279a8..8fbcf6b 100644 --- a/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx +++ b/Modules/Loadable/CameraPath/MRML/vtkMRMLCameraPathNode.cxx @@ -451,7 +451,11 @@ void vtkMRMLCameraPathNode::AddKeyFrame(KeyFrame keyFrame) void vtkMRMLCameraPathNode::AddKeyFrame(double t, vtkMRMLCameraNode* camera) { - KeyFrame keyFrame(camera, t); + vtkNew newCamera; + newCamera->SetPosition(camera->GetPosition()); + newCamera->SetFocalPoint(camera->GetFocalPoint()); + newCamera->SetViewUp(camera->GetViewUp()); + KeyFrame keyFrame(newCamera, t); this->AddKeyFrame(keyFrame); } diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index 38d8beb..f2174ac 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -739,21 +739,12 @@ void qSlicerCameraPathModuleWidget::onAddKeyFrameClicked() return; } - // Create new camera - vtkNew newCameraNode; - newCameraNode->CopyContent(defaultCameraNode); - newCameraNode->SetHideFromEditors(1); - QString cameraPathName(cameraPathNode->GetName()); - QString newCameraName(cameraPathName+"_Camera"); - newCameraNode->SetName(newCameraName.toStdString().c_str()); - cameraPathNode->GetScene()->AddNode(newCameraNode.GetPointer()); - // Listen to new camera - this->qvtkConnect(newCameraNode.GetPointer(), vtkCommand::ModifiedEvent, - this, SLOT(onKeyFrameCameraModified(vtkObject*))); + //this->qvtkConnect(defaultCameraNode, vtkCommand::ModifiedEvent, + // this, SLOT(onKeyFrameCameraModified(vtkObject*))); // Add key frame - cameraPathNode->AddKeyFrame(t, newCameraNode.GetPointer()); + cameraPathNode->AddKeyFrame(t, defaultCameraNode); // Select new row index = cameraPathNode->KeyFrameIndexAt(t); diff --git a/Modules/Scripted/testCameraPath/testCameraPath.py b/Modules/Scripted/testCameraPath/testCameraPath.py index d57f674..6383dfb 100644 --- a/Modules/Scripted/testCameraPath/testCameraPath.py +++ b/Modules/Scripted/testCameraPath/testCameraPath.py @@ -79,7 +79,6 @@ def setup(self): # LOGIC self.defaultCam = slicer.mrmlScene.GetNodeByID('vtkMRMLCameraNode1') self.Time = 0 - self.CameraList = [] self.cameraPath = slicer.vtkMRMLCameraPathNode() posSpline = self.cameraPath.GetPositionSplines() focalSpline = self.cameraPath.GetFocalPointSplines() @@ -99,39 +98,13 @@ def setup(self): def onRemoveButton(self): print("-- Removing KeyFrames") self.cameraPath.RemoveKeyFrames() - - if self.CameraList: - for camera in self.CameraList: - print(camera.GetName()) - slicer.mrmlScene.RemoveNode(camera) - del self.CameraList[:] - self.Time = 0 def onAddButton(self): print(" -- Adding Keyframe at t =", self.Time) - camera = slicer.mrmlScene.CreateNodeByClass('vtkMRMLCameraNode') - slicer.mrmlScene.AddNode(camera) - - x = vtk.mutable(0) - y = vtk.mutable(0) - z = vtk.mutable(0) - value = [x,y,z] - - self.defaultCam.GetPosition(value) - camera.SetPosition(value) - self.defaultCam.GetFocalPoint(value) - camera.SetFocalPoint(value) - self.defaultCam.GetViewUp(value) - camera.SetViewUp(value) - - cameraName = 'Camera T = '+str(self.Time) - print(cameraName) - camera.SetName(cameraName) - - self.cameraPath.AddKeyFrame(self.Time, camera) + + self.cameraPath.AddKeyFrame(self.Time, self.defaultCam) self.Time += 100 - self.CameraList.append(camera) self.FlyButton.setEnabled(False) From e5b45c0e533eb3d0eff7b68caa397f8162274c5d Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Mon, 16 May 2022 20:18:39 -0400 Subject: [PATCH 16/16] BUG: Remove empty "Camera" column from key frame table --- .../Resources/UI/qSlicerCameraPathModuleWidget.ui | 11 +++-------- .../CameraPath/qSlicerCameraPathModuleWidget.cxx | 14 ++++---------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathModuleWidget.ui b/Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathModuleWidget.ui index 29a7c3d..aab6522 100644 --- a/Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathModuleWidget.ui +++ b/Modules/Loadable/CameraPath/Resources/UI/qSlicerCameraPathModuleWidget.ui @@ -609,11 +609,6 @@ Time - - - Camera - - @@ -631,14 +626,14 @@ - + - Camera ID : + KeyFrame ID : - + no key frame selected diff --git a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx index f2174ac..70adbfa 100644 --- a/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx +++ b/Modules/Loadable/CameraPath/qSlicerCameraPathModuleWidget.cxx @@ -163,8 +163,7 @@ void qSlicerCameraPathModuleWidget::setup() // Keyframes table widget d->keyFramesTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); - d->keyFramesTableWidget->setColumnWidth(0,80); - d->keyFramesTableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); + d->keyFramesTableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); connect(d->keyFramesTableWidget, SIGNAL(cellChanged(int, int)), this, SLOT(onCellChanged(int, int))); connect(d->keyFramesTableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(onItemClicked(QTableWidgetItem*))); @@ -811,8 +810,8 @@ void qSlicerCameraPathModuleWidget::onItemClicked(QTableWidgetItem* item) // Get Keyframe index int index = item->row(); - // Set selected camera - d->selectedCameraIDLineEdit->setText(d->keyFramesTableWidget->item(index, 1)->text()); + // Set selected key frame + d->selectedKeyFrameIDLineEdit->setText(QString::number(index)); // Update camera table d->cameraTableWidget->setEnabled(true); @@ -1182,7 +1181,6 @@ void qSlicerCameraPathModuleWidget::populateKeyFramesTableWidget() { // Get Key frame info double t = keyFrames.at(i).Time; - char* cameraID = keyFrames.at(i).Camera->GetID(); // Add Key frame in table table->insertRow(table->rowCount()); @@ -1190,10 +1188,6 @@ void qSlicerCameraPathModuleWidget::populateKeyFramesTableWidget() QTableWidgetItem* timeItem = new QTableWidgetItem(); timeItem->setData(Qt::DisplayRole,t); table->setItem(table->rowCount()-1, 0, timeItem ); - - QTableWidgetItem* cameraItem = new QTableWidgetItem(QString(cameraID)); - cameraItem->setFlags(cameraItem->flags() ^ Qt::ItemIsEditable); - table->setItem(table->rowCount()-1, 1, cameraItem); } // Unblock signals from table @@ -1216,7 +1210,7 @@ void qSlicerCameraPathModuleWidget::emptyCameraTableWidget() { Q_D(qSlicerCameraPathModuleWidget); - d->selectedCameraIDLineEdit->setText("Please select one keyframe"); + d->selectedKeyFrameIDLineEdit->setText("Please select one keyframe"); d->cameraTableWidget->clearContents(); d->cameraTableWidget->setEnabled(false); }