4-2 Custom InteractorStyle

2567 ワード

import vtk

# 사용자 입력에 대한 이벤트 핸들러 클래스
# vtkInteractorStyleTrackballCamera를 상속받아서 트랙볼 카메라로 동작
class CustomInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
    def __init__(self, parent=None):
        self.AddObserver("LeftButtonPressEvent", self.OnLeftButtonPress) #마우스 왼쪽버튼 프레스 이벤트 핸들러 설정
        self.AddObserver("LeftButtonReleaseEvent", self.OnLeftButtonRelease) #마우스 왼쪽버튼 릴리즈 이벤트 핸들러 설정
        self.AddObserver("MiddleButtonPressEvent", self.OnMiddleButtonPress) #마우스 가운데버튼 프레스 이벤트 핸들러 설정
        self.AddObserver("MiddleButtonReleaseEvent", self.OnMiddleButtonRelease) #마우스 가운데버튼 릴리즈 이벤트 핸들러 설정
        self.AddObserver("RightButtonPressEvent", self.OnRightButtonPress) #마우스 오른쪽버튼 프레스 이벤트 핸들러 설정
        self.AddObserver("RightButtonReleaseEvent", self.OnRightButtonRelease) #마우스 오른쪽버튼 릴리즈 이벤트 핸들러 설정

    def OnLeftButtonPress(self, object, event):
        self.OnLeftButtonDown()
        return

    def OnLeftButtonRelease(self, object, event):
        self.OnLeftButtonUp()
        return

    def OnMiddleButtonPress(self, object, event):
        self.OnMiddleButtonDown()
        return

    def OnMiddleButtonRelease(self, object, event):
        self.OnMiddleButtonUp()
        return

    def OnRightButtonPress(self, object, event):
        self.OnRightButtonDown()
        return

    def OnRightButtonRelease(self, object, event):
        self.OnRightButtonUp()
        return

def main():
    source = vtk.vtkCylinderSource() #원기둥 생성
    source.SetResolution(32) #원기둥 Segment를 32개로 설정

    mapper = vtk.vtkPolyDataMapper() #vtkPolyData를 Geometry로 매핑
    mapper.SetInputConnection(source.GetOutputPort()) #원기둥 Output과 Mapper의 Input을 연결

    actor = vtk.vtkActor() #Actor 생성
    actor.SetMapper(mapper) #Mapper 할당

    renderer = vtk.vtkRenderer() #Renderer 생성
    renderer.AddActor(actor) #Renderer에 Actor 할당
    renderer.SetBackground(0.3, 0.5, 0.7) #배경화면 색상지정

    window = vtk.vtkRenderWindow() #Window 생성
    window.AddRenderer(renderer) #Window에 Renderer 할당
    window.SetSize(800, 600) #Window 크기 지정

    interactor = vtk.vtkRenderWindowInteractor() #vtkRenderWindowInteractor 생성
    interactor.SetRenderWindow(window) #window interactor에 Window 지정
    interactor.SetInteractorStyle(CustomInteractorStyle()) #window interactor에 이벤트 핸들러 클래스 지정

    
    interactor.Initialize()

    window.Render()
    interactor.Start()

if(__name__ == "__main__"):
    main()