Как я могу узнать, щелкнул ли я 'r' в vtkInteractorStyleRubberBandPick, чтобы нарисовать поле выбора? - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь добавить двух наблюдателей в класс vtkInteractorStyleRubberBandPick. Первый должен вызывать функцию при нажатии левой мыши, а второй - когда я выбираю поле, используя сначала клавишу «r». Моя проблема в том, что когда я нажимаю 'r' и пытаюсь выбрать поле, нажатие левой кнопки мыши также вызывает триггер

. Что я хотел бы сделать, это проверить, не нахожусь ли я в режиме окна выбора ( с 'r'), когда я впервые передаю в левую кнопку мыши нажатую функцию события, чтобы считать, что я хочу сделать поле выбора.

В приведенном ниже коде, если я нажму 'r', чтобы сделать выбор окно, я ввожу в оба события функцию. LeftButtonPressEventfunc при нажатии мыши, а затем EndPickEventfunc при отпускании мыши.

import vtk

class MouseInteractorHighLightActor(vtk.vtkInteractorStyleRubberBandPick):

    def __init__(self, parent=None):
        super(MouseInteractorHighLightActor, self).__init__()
        self.AddObserver(vtk.vtkCommand.LeftButtonPressEvent, self.LeftButtonPressEventfunc)

        self.area_picker = vtk.vtkRenderedAreaPicker()
        self.area_picker.AddObserver(vtk.vtkCommand.EndPickEvent, self.EndPickEventfunc)
        return

    def LeftButtonPressEventfunc(self, obj, event):
        print('LeftButtonPressEventfunc' )
        self.OnLeftButtonDown()


    def EndPickEventfunc(self, obj, event):
        print('I was here!')


# A renderer and render window
renderer = vtk.vtkRenderer()
renderer.SetBackground(.3, .4, .5)

renwin = vtk.vtkRenderWindow()
renwin.AddRenderer(renderer)

# An interactor
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(renwin)

# add the custom style
style = MouseInteractorHighLightActor()
style.SetDefaultRenderer(renderer)
interactor.SetInteractorStyle(style)
interactor.SetPicker(style.area_picker)


# Add spheres to play with
for i in range(10):
    source = vtk.vtkSphereSource()

    source.SetRadius(vtk.vtkMath.Random(.5, 1.0))
    source.SetCenter(vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5), vtk.vtkMath.Random(-5, 5))
    source.SetPhiResolution(11)
    source.SetThetaResolution(21)

    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(source.GetOutputPort())
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)

    actor.GetProperty().SetDiffuseColor(vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0), vtk.vtkMath.Random(.4, 1.0))

    renderer.AddActor(actor)

# Start
interactor.Initialize()
interactor.Start()
...