2015-09-17 2 views
1

Я начинаю с vtk (6) в python и имею проблему с обработкой KeyPressEvent. Я хочу, чтобы подкласс vtkInteractorStyleTrackballCameraКак получить код ключа в vtk KeyPressEvent с использованием python

, если я использую этот шаблон, мой стиль Interactor не getKeySym(), и я не могу расшифровать, что клавиша была нажата

class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): 

    def __init__(self,parent=None): 
     self.AddObserver("MiddleButtonPressEvent",self.middleButtonPressEvent) 
     self.AddObserver("MiddleButtonReleaseEvent",self.middleButtonReleaseEvent) 
     self.AddObserver("KeyPressEvent",self.keyPress) 

    def keyPress(self,obj,event): 
     key = obj.GetKeySym() #Does not work 
     print("key %s" % key) 
     return 

    def middleButtonPressEvent(self,obj,event): 
     ... 
     return 

    def middleButtonReleaseEvent(self,obj,event): 
     ... 
     return 

Однако, если я использую класс фабрики vtkInteractorStyleTrackballCamera и добавить наблюдателей с этим шаблоном, тот же keyPress() может получить доступ к GetKeySym().

def KeyPress(obj,event): 
    key = obj.GetKeySym() #works fine 
    print("key %s" % key) 

def MiddleButtonPressEvent(obj,event): 
    ... 
    return 

def MiddleButtonReleaseEvent(obj,event): 
    ... 
    return 
... 
interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) 
    interactor.AddObserver("KeyPressEvent",KeyPress) 
    interactor.AddObserver("MiddleButtonPressEvent",MiddleButtonPressEvent) 
    interactor.AddObserver("MiddleButtonReleaseEvent",MiddleButtonReleaseEvent) 

Я новичок, что мне делать, чтобы получить функциональность в моем классе?

ответ

0

Right Я нашел решение после проверки ВТК Doxygen для и, видя, что vtkInteractorStyleTrackballCamera не наследуется от vtkRenderWindowInteractor, который я предполагал в example я портирования. Я решил передать свой класс стиля родительскому, чтобы он мог получить доступ к RenderWindow GetKeySym(). Это может быть не лучшим решением, но вот как как FYI:

class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): 

    def __init__(self,parent=None): 
     self.parent = vtk.vtkRenderWindowInteractor() 
     if(parent is not None): 
      self.parent = parent 

     self.AddObserver("KeyPressEvent",self.keyPress) 

    def keyPress(self,obj,event): 
     key = self.parent.GetKeySym() 
... 
    interactor = vtk.vtkRenderWindowInteractor() 
    interactor.SetInteractorStyle(KeyPressInteractorStyle(parent = interactor)) 
2

Если вы делаете класс Interactor Style Я думаю, что это с уверенностью предположить, что будет применяться к интерактора в какой-то момент. Я заметил, что в вашем решении вы устанавливаете родителя как vtk.vtkRenderWindowInteractor(). Было бы лучше установить родительский экземпляр для конкретного экземпляра vtkRenderWindowInteractor:

class MyInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): 

    def __init__(self,parent=None): 
     self.parent = iren 

     self.AddObserver("KeyPressEvent",self.keyPressEvent) 

    def keyPressEvent(self,obj,event): 
     key = self.parent.GetKeySym() 
     if key == 'l': 
      print(key) 
     return 

... 

iren = vtk.vtkRenderWindowInteractor() 

iren.SetInteractorStyle(MyInteractorStyle()) 

iren.SetRenderWindow(renWin) 
renWin.Render() 

iren.Initialize() 
iren.Start()