I am using VTK im my project. In some situations, vtk do not show image and it really make me confuzed.
Firstly, the following code work:
import vtk, sys
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MainWindow(QWidget):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent=parent)
self.vl = QVBoxLayout()
self.setLayout(self.vl)
self.vtkWidget = QVTKRenderWindowInteractor()
self.vl.addWidget(self.vtkWidget)
img = vtk.vtkDICOMImageReader()
img.SetFileName('C:\\Users\\MLoong\\Desktop\\dicom_data\\Chang Cheng\\TOF\\IM_0174')
img.Update()
windowLevel = vtk.vtkImageMapToWindowLevelColors()
windowLevel.SetInputData(img.GetOutput())
windowLevel.Update()
actor = vtk.vtkImageActor()
actor.GetMapper().SetInputConnection(windowLevel.GetOutputPort())
self.ren = vtk.vtkRenderer()
self.ren.AddActor(actor)
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
self.iren.RemoveAllObservers()
self.vtkWidget.GetRenderWindow().Render()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
And the result is:
Because the reality project is not a demo. In the reality project, I need to firstly build the pipeline, like:
self.ren = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
Then, for example, the user will click a button, and the program will show a image. Thus, I modify the above code as following:
import vtk, sys
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class MainWindow(QWidget):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent=parent)
self.vl = QVBoxLayout()
self.setLayout(self.vl)
self.vtkWidget = QVTKRenderWindowInteractor()
self.vl.addWidget(self.vtkWidget)
self.ren = vtk.vtkRenderer()
# self.ren.AddActor(actor)
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
self.iren.RemoveAllObservers()
self.vtkWidget.GetRenderWindow().Render() ############# the flag code
img = vtk.vtkDICOMImageReader() ######## move these code to the last
img.SetFileName('C:\\Users\\MLoong\\Desktop\\dicom_data\\Chang Cheng\\TOF\\IM_0174')
img.Update()
windowLevel = vtk.vtkImageMapToWindowLevelColors()
windowLevel.SetInputData(img.GetOutput())
windowLevel.Update()
actor = vtk.vtkImageActor()
actor.GetMapper().SetInputConnection(windowLevel.GetOutputPort())
self.ren.AddActor(actor)
self.vtkWidget.GetRenderWindow().Render()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
What I do is move some code from middle to the last. The result of the above code is:
After long time debug, I find what make it wrong.
self.vtkWidget.GetRenderWindow().Render() ############# the flag code
This code should be removed. If I remove it, the result is OK. But I don’t know why it make this bug.
In addition, I find one code will also cause the same bug:
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
self.iren.Initialize()
self.iren.RemoveAllObservers()
Just add iren.Initialize()
. And I also don’t know why.
The thing I want to know most is that how should I debug for these situations?
Any suggestion is appreciated!