Procházet zdrojové kódy

Listen to the renderwindow interactor in ctkVTKThumbnailView

Julien Finet před 14 roky
rodič
revize
2475499dbe

+ 18 - 0
Libs/Visualization/VTK/Core/ctkVTKObjectEventsObserver.cpp

@@ -111,6 +111,24 @@ QString ctkVTKObjectEventsObserver::addConnection(vtkObject* old_vtk_obj, vtkObj
   if (old_vtk_obj)
     {
     // Check that old_object and new_object are the same type
+    // If you have a crash when accessing old_vtk_obj->GetClassName(), that means
+    // old_vtk_obj has been deleted and you should probably have keep
+    // old_vtk_obj into a vtkWeakPointer:
+    // vtkWeakPointer<vtkObject> obj1 = myobj1;
+    // this->addConnection(obj1, vtkCommand::Modified...)
+    // myobj1->Delete();
+    // vtkWeakPointer<vtkObject> obj2 = myobj2;
+    // this->addConnection(obj1, obj2, vtkCommand::Modified...)
+    // ...
+    // Or just call addConnection with a new
+    // vtk_obj of 0 before the vtk_obj is deleted.
+    // vtkObject* obj1 = vtkObject::New();
+    // this->addConnection(obj1, vtkCommand::Modified...)
+    // this->addConnection(obj1, 0, vtkCommand::Modified...)
+    // obj1->Delete();
+    // vtkObject* obj2 = vtkObject::New();
+    // this->addConnection(0, obj2, vtkCommand::Modified...)
+    // ...
     if (vtk_obj && !vtk_obj->IsA(old_vtk_obj->GetClassName()))
       {
       qDebug() << "Previous vtkObject (type:" << old_vtk_obj->GetClassName() << ") to disconnect"

+ 4 - 3
Libs/Visualization/VTK/Widgets/ctkVTKThumbnailView.cpp

@@ -37,6 +37,7 @@
 #include <vtkRenderWindowInteractor.h>
 #include <vtkRenderer.h>
 #include <vtkSmartPointer.h>
+#include <vtkWeakPointer.h>
 
 //--------------------------------------------------------------------------
 static ctkLogger logger("org.slicer.libs.qmrmlwidgets.ctkVTKThumbnailView");
@@ -61,7 +62,7 @@ public:
   void resetCamera();
 
   vtkRenderer*                       Renderer;
-  vtkRenderWindowInteractor*         Interactor;
+  vtkWeakPointer<vtkRenderWindowInteractor> Interactor;
   
   vtkOutlineSource*                  FOVBox;
   vtkPolyDataMapper*                 FOVBoxMapper;
@@ -432,8 +433,8 @@ void ctkVTKThumbnailView::setRendererToListen(vtkRenderer* newRenderer)
 {
   Q_D(ctkVTKThumbnailView);
   d->Renderer = newRenderer;
-  vtkRenderWindow* newRenderWindow = newRenderer->GetRenderWindow();
-  vtkRenderWindowInteractor* newInteractor = newRenderWindow->GetInteractor();
+  vtkRenderWindow* newRenderWindow = newRenderer ? newRenderer->GetRenderWindow() : 0;
+  vtkRenderWindowInteractor* newInteractor = newRenderWindow ? newRenderWindow->GetInteractor() : 0;
   this->qvtkReconnect(d->Interactor, newInteractor,
                       vtkCommand::EndInteractionEvent, this,SLOT(updateCamera()));
   d->Interactor = newInteractor;