2016-07-05 8 views
1

私はPython-VTK(7)で、2Dで3つのディスクをクリックして移動できる単純なプログラムを持っています。2DアクタPythonでVTK-7でピッキングする

私はMouseMoveイベントにLeftButtonClickイベント、以前に選択された要素の変更位置に選択された要素を格納し、LeftButtonReleaseイベントにNoneに選択された要素を設定したカスタムの相互作用因子のスタイルを作ることによってこれを行います。

ここで(理想的には)それを行う必要があり、完全なVTKコードです:

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

つまり、私が選ぶどのディスク、唯一の緑1 vtkPropPickerによって選択されます。

何らかの理由で、私がPython3-VTK7の代わりにPython2-VTK6.3.0を使用すると、期待どおりに動作します。これはVTK7のバグですか?または、実装が何らかの形で変更されていますか?それとも別のことですか?

答えて

0

VTK 7が新しいレンダリングバックエンドに切り替えました。 7.0では、レンダリングバックエンドに2Dアクタを選択する際のバグがあります。

バグは7.1で修正されました。 Kitware/[email protected]5559c11を参照してください。

関連する問題