2D로 3 개의 디스크를 클릭하여 이동할 수있는 간단한 프로그램이 Python-VTK (7)에 있습니다.2D 액터 Python으로 VTK-7에서 따기
나는 MouseMove
이벤트에 LeftButtonClick
경우, 이전에 선택한 요소의 변경 위치에 선택한 요소를 저장하고 LeftButtonRelease
이벤트에 None
선택한 요소를 설정하는 사용자 정의 인터랙 스타일을 제작하여이 작업을 수행.
import vtk
class CustomInteractor(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self, renderer, renWin):
self.AddObserver('LeftButtonPressEvent', self.OnLeftButtonDown)
self.AddObserver('LeftButtonReleaseEvent', self.OnLeftButtonRelease)
self.AddObserver('MouseMoveEvent', self.OnMouseMove)
self.renderer = renderer
self.chosenPiece = None
self.renWin = renWin
def OnLeftButtonRelease(self, obj, eventType):
self.chosenPiece = None
vtk.vtkInteractorStyleTrackballCamera.OnLeftButtonUp(self)
def OnLeftButtonDown(self, obj, eventType):
clickPos = self.GetInteractor().GetEventPosition()
picker = vtk.vtkPropPicker()
picker.Pick(clickPos[0], clickPos[1], 0, self.renderer)
actor = picker.GetActor2D()
self.chosenPiece = actor
vtk.vtkInteractorStyleTrackballCamera.OnLeftButtonDown(self)
def OnMouseMove(self, obj, eventType):
if self.chosenPiece is not None:
mousePos = self.GetInteractor().GetEventPosition()
self.chosenPiece.SetPosition(mousePos[0], mousePos[1])
self.renWin.Render()
else :
vtk.vtkInteractorStyleTrackballCamera.OnMouseMove(self)
def buildDiskActor(inner_radius = 10, outer_radius = 20, position = (100, 20), color = (1, 1, 1)):
disk = vtk.vtkDiskSource()
disk.SetInnerRadius(inner_radius)
disk.SetOuterRadius(outer_radius)
disk.SetRadialResolution(100)
disk.SetCircumferentialResolution(100)
disk.Update()
mapper = vtk.vtkPolyDataMapper2D()
mapper.SetInputConnection(disk.GetOutputPort())
actor = vtk.vtkActor2D()
actor.SetMapper(mapper)
actor.SetPosition(position[0], position[1])
actor.GetProperty().SetColor(color)
return actor
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
renWin.SetSize(600, 600)
elements = [
buildDiskActor(position = (200, 400), color=(1, 0, 0)),
buildDiskActor(position = (400, 400), color=(0, 1, 0)),
buildDiskActor(position = (300, 200), color=(0, 0, 1)),
]
for actor in elements:
ren.AddActor(actor)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
inStyle = CustomInteractor(ren, renWin)
iren.SetInteractorStyle(inStyle)
renWin.Render()
iren.Start()
을 결과는 다음과 같습니다 :
즉, 내가 선택 중 디스크 만 녹색 하나를 여기에
은 (이상적으로) 그렇게해야 전체 VTK 코드입니다vtkPropPicker
에 의해 선택됩니다.
어떤 이유로 나는 Python3-VTK7 대신 Python2-VTK6.3.0을 사용할 때 예상대로 작동합니다. 이것은 VTK7의 버그입니까? 또는 구현이 어떻게 변경 되었습니까? 아니면 다른 것입니까?