2016-07-05 3 views
1

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() 

을 결과는 다음과 같습니다 :

enter image description here

즉, 내가 선택 중 디스크 만 녹색 하나를 여기에

은 (이상적으로) 그렇게해야 전체 VTK 코드입니다 vtkPropPicker에 의해 선택됩니다.

어떤 이유로 나는 Python3-VTK7 대신 Python2-VTK6.3.0을 사용할 때 예상대로 작동합니다. 이것은 VTK7의 버그입니까? 또는 구현이 어떻게 변경 되었습니까? 아니면 다른 것입니까?

답변

0

VTK 7이 새로운 렌더링 백엔드로 전환되었습니다. 7.0에서 렌더링 백엔드는 2D 액터를 선택하는 버그가 있습니다.

버그는 7.1에서 수정되었습니다. Kitware/[email protected]5559c11을 참조하십시오.