Как получить координаты и/или идентификатор точки при щелчке левой кнопкой мыши в VTK PolyData в PythonPython

Программы на Python
Anonymous
Как получить координаты и/или идентификатор точки при щелчке левой кнопкой мыши в VTK PolyData в Python

Сообщение Anonymous »

У меня есть несколько случайных точек в средстве визуализации VTK с использованием QVTKRenderWindowInteractor. Я могу обновить сцену, создав больше случайных точек, нажав кнопку QT, как показано на скриншоте. Код Python MWE находится внизу.
Изображение

На этом этапе я хочу иметь возможность щелкнуть одну из этих точек и получить ее координаты и/или идентификатор. Я рассмотрел примеры vtkPointPicker и vtkCellPicker. Но самостоятельно разобраться не удалось.
Я новичок в ВТК. Вот мой код на данный момент. Любые указания будут оценены.

Код: Выделить всё

import sys
import numpy as np

from PyQt5.QtWidgets import (
QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton
)

# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from vtkmodules.vtkCommonCore import vtkPoints
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkInteractionWidgets import vtkCameraOrientationWidget
from vtkmodules.vtkCommonDataModel import (
vtkCellArray,
vtkPolyData,
)
from vtkmodules.vtkRenderingCore import (
vtkActor,
vtkPolyDataMapper,
vtkRenderer,
)
import vtkmodules.util.numpy_support as vtk_np

class Ui_MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi()

def setupUi(self):
self.setWindowTitle('Visualization App')
self.resize(800, 600)
self.centralwidget = QWidget(self)
self.verticalLayout = QVBoxLayout()

self.colors = vtkNamedColors()

# Interactor widget
self.canvas = QVTKRenderWindowInteractor(self.centralwidget)
self.verticalLayout.addWidget(self.canvas)

# button
self.pushButton = QPushButton(self.centralwidget)
self.pushButton.setText('Update')
self.verticalLayout.addWidget(self.pushButton)
self.pushButton.clicked.connect(self.update_plot)

self.centralwidget.setLayout(self.verticalLayout)
self.setCentralWidget(self.centralwidget)

self.setup_canvas()

# enable user interface interactor
self.show()
self.ren_win.Render()
self.interactor.Initialize()
self.interactor.Start()

def setup_canvas(self):
# Renderer, render window and the interactor
self.ren = vtkRenderer()
self.ren_win = self.canvas.GetRenderWindow()
self.interactor = self.ren_win.GetInteractor()

self.ren.SetBackground(.2, .3, .4)
self.ren_win.AddRenderer(self.ren)

# Target
self.target_actor = self.init_canvas_actor(np.random.normal(size=(np.random.randint(100), 3), scale=0.2))
self.ren.AddActor(self.target_actor)

# Camera orientation widget
# Important: The interactor must be set prior to enabling the widget
self.interactor.SetRenderWindow(self.ren_win)
self.cam_orient_manipulator = vtkCameraOrientationWidget()
self.cam_orient_manipulator.SetParentRenderer(self.ren)
self.cam_orient_manipulator.On()

# Camera position
self.ren.GetActiveCamera().Azimuth(0)
self.ren.GetActiveCamera().Elevation(-80)
self.ren.ResetCamera()

def init_canvas_actor(self, nparray: np.ndarray):
self.nparray = nparray
nCoords = nparray.shape[0]

self.points = vtkPoints()
self.cells = vtkCellArray()
self.pd = vtkPolyData()

self.points.SetData(vtk_np.numpy_to_vtk(nparray))
cells_npy = np.vstack([np.ones(nCoords, dtype=np.int64), np.arange(nCoords, dtype=np.int64)]).T.flatten()
self.cells.SetCells(nCoords, vtk_np.numpy_to_vtkIdTypeArray(cells_npy))
self.pd.SetPoints(self.points)
self.pd.SetVerts(self.cells)

mapper = vtkPolyDataMapper()
mapper.SetInputDataObject(self.pd)

actor = vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetRepresentationToPoints()
actor.GetProperty().SetColor(0.0, 1.0, 0.0)
actor.GetProperty().SetPointSize(4)

return actor

def update_plot(self):
nCoords = np.random.randint(100)
pc = np.random.normal(size=(nCoords, 3), scale=0.2)
points:  vtkPoints = self.pd.GetPoints()
points.SetData(vtk_np.numpy_to_vtk(pc))
cells_npy = np.vstack([np.ones(nCoords, dtype=np.int64), np.arange(nCoords, dtype=np.int64)]).T.flatten()
self.cells.SetCells(nCoords, vtk_np.numpy_to_vtkIdTypeArray(cells_npy))
self.pd.SetPoints(points)

points.Modified()
self.cells.Modified()
self.pd.Modified()
self.show()
self.ren_win.Render()

if __name__ == '__main__':
app = QApplication(sys.argv)
main = Ui_MainWindow()
# main.show()
sys.exit(app.exec_())
Я использую Python: v3.10.12, Qt: v5.15.2, PyQt: v5.15.10, VTK: v9.3.0.

Подробнее здесь: https://stackoverflow.com/questions/786 ... k-in-vtk-p

Вернуться в «Python»