Hi, I am trying to reproduce a python (3.8) VTK (9.0.3) code:
colors = vtk.vtkNamedColors()
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
axes = vtk.vtkAxesActor()
om = vtk.vtkOrientationMarkerWidget()
om.SetOrientationMarker(axes)
om.SetViewport(0.0, 0.0, 0.2, 0.2)
om.SetInteractor(iren)
om.EnabledOn()
om.InteractiveOff()
ren.SetBackground(colors.GetColor3d('Wheat'))
ren.ResetCamera()
renWin.Render()
iren.Initialize()
iren.Start()
(this code shows coords axes in a small widget at the lower left corner.)
to an embedded PyQt5 code. Here is the pyqt code:
import sys
import vtk
from PyQt5 import QtWidgets
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent = None):
QtWidgets.QMainWindow.__init__(self, parent)
self.frame = QtWidgets.QFrame()
self.vl = QtWidgets.QVBoxLayout()
self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
self.vl.addWidget(self.vtkWidget)
self.renderer = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(self.renderer)
self.interactor = self.vtkWidget
colors = vtk.vtkNamedColors()
source = vtk.vtkSphereSource()
source.SetCenter(0, 0, 0)
source.SetRadius(5.0)
source.SetThetaResolution(16)
source.SetPhiResolution(16)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
self.renderer.AddActor(actor)
axes = vtk.vtkAxesActor()
om = vtk.vtkOrientationMarkerWidget()
om.SetOrientationMarker(axes)
om.SetViewport(0.0, 0.0, 0.2, 0.2)
om.SetInteractor(self.vtkWidget )
om.EnabledOn()
om.InteractiveOff()
self.renderer.SetBackground(colors.GetColor3d('Wheat'))
self.renderer.ResetCamera()
self.frame.setLayout(self.vl)
self.setCentralWidget(self.frame)
self.show()
self.interactor.Initialize()
self.interactor.Start()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
The PyQt5 code does not show the lower left widget.
Does anyone know what is wrong in my pyqt5 code ?
Can you, please, place your code between ```python
and ``` markdown tokens so it is easier to read?
I setup my orientation widget like this (C++):
//----------------------adding the orientation axes-------------------------
vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();
_vtkAxesWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
_vtkAxesWidget->SetOutlineColor(0.9300, 0.5700, 0.1300);
_vtkAxesWidget->SetOrientationMarker(axes);
_vtkAxesWidget->SetInteractor(_vtkwidget->GetRenderWindow()->GetInteractor());
_vtkAxesWidget->SetViewport(0.0, 0.0, 0.2, 0.2);
_vtkAxesWidget->SetEnabled(1);
_vtkAxesWidget->InteractiveOn();
//--------------------------------------------------------------------------
So I guess this line:
should be:
om.SetInteractor(self.vtkWidget.GetRenderWindow().GetInteractor())
I hope this helps.
Hi Paulo, thanks for the reply.
Sorry for source code, I didn’t know that. But, thanks for the tip.
Regarding the interactor, I have already tried that, and it does not work.
I thing it could be something with “vtkmodules.qt.QVTKRenderWindowInteractor”, because the code with vtk.vtkRenderWindowInteractor() works perfectly. Could it be?
Unfortunately, I just knew VTK a few weeks ago. There is still very much to learn …
Thanks again.
BR, Ricardo
Well, Ricardo, I’d simply copy the working code and develop from it step-by-step until it stops working. This way you should be able to diagnose the problem. That’s what I do in face of silent bugs like that.
Hana
November 27, 2023, 4:08am
8
Hi Ricardo, I’ve faced the same problem with you, when using PyQt5 and vkt to develop a coordinate axes widget. Has this problem been solved yet?
Hana
November 27, 2023, 4:37am
9
I’m not sure if you still need to solve this problem, but I’ve found a solution in this post:
According to your code, I define the oject ‘vtkOrientationMarkerWidget’ as a member variable of the class MyViewer instead of local variable in the function. It works! That’s the reason why I can not see the result. Thank you very much!
It seems that we both made a same mistake not to define the object ‘vtkOrientationMarkerWidget’ as a member of class ‘MainWindow’. Now my PyQt5 program can work normally.
And here is my code:
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent = None):
super().__init__()
# create QVTKRenderWindowInteractor
self.vtk_widget = QVTKRenderWindowInteractor(self)
# create render and interactor
self.renderer = vtk.vtkRenderer()
self.vtk_widget.GetRenderWindow().AddRenderer(self.renderer)
self.interactor = self.vtk_widget.GetRenderWindow().GetInteractor()
# create an axes actor, remember to define it as a member variable
self.axes_actor = vtkAxesActor()
self.axes_actor.AxisLabelsOn()
self.axes_actor.SetTotalLength(1.0, 1.0, 1.0)
self.axes_actor.SetShaftTypeToCylinder()
# create a vtkOrientationMarkerWidget, and connect it with axes actor. remember to define it as a member variable
self.axes_widget = vtk.vtkOrientationMarkerWidget()
self.axes_widget.SetOrientationMarker(self.axes_actor)
self.axes_widget.SetInteractor(self.interactor)
self.axes_widget.SetViewport(0.0, 0.0, 0.2, 0.2)
self.axes_widget.SetEnabled(True)
self.axes_widget.InteractiveOn()
# background color
self.renderer.SetBackground(0.8, 0.8, 0.8)
# model
self.sphere = vtk.vtkSphereSource()
self.sphere_mapper = vtk.vtkPolyDataMapper()
self.sphere_mapper.SetInputConnection(self.sphere.GetOutputPort())
self.sphere_actor = vtk.vtkActor()
self.sphere_actor.SetMapper(self.sphere_mapper)
self.renderer.AddActor(self.sphere_actor)
# camera
self.camera = self.renderer.GetActiveCamera()
self.camera.SetPosition(0, 0, 30)
self.renderer.SetActiveCamera(self.camera)
self.setCentralWidget(self.vtk_widget)
1 Like