-
Notifications
You must be signed in to change notification settings - Fork 0
Tut1 Example1
Sung-June, Lim edited this page Oct 21, 2016
·
31 revisions
_tutorials
_tutorial1
example1
MainWindow.py
Cone.py
cyhub를 활용한 example을 다루기 전에 일반적인 Python, pyQt를 활용한 예제를 먼저 다루고자 합니다. 이 예제를 통하여 일반적인 Local환경의 Application 구현 방법을 알아볼 것이며, 이후 학습할 cyhub 기반 예제의 이해를 도울 것입니다.
- 본 예제에서는 불필요한 설명을 줄이기 위해 pyQt와 VTK의 일부를 cyhub의 _qapp와 cy_vtk 활용
- 버튼과 Signal/Slot을 통해 같은or다른 모듈에 arguments를 전달하여 emit 하는 일반적인 활용
- 다른 모듈의 method를 호출하는 일반적인 활용
- Application을 구성 할 Widget과 Layout 구성 : Change Color(Random) 버튼, Change Color(Red) 버튼, Get Color 버튼, Log 텍스트박스
- Cone 생성 :
import Cone.py,self.view = Cone()
- Change Color(Random) 버튼과 Slot 연결 :
self.on_change_color_random(),self.view.on_change_color_random() -
self.on_change_color_random(): self.log 텍스트박스에 Log 출력 -
self.view.on_change_color_random(): Cone 모듈의 색상을 랜덤하게 변경하는 method (Cone.py 참조)
-
sig_change_colorSignal 생성 : pyqtSignal('int', 'int', 'int') Format -
sig_change_color에 Slot 연결 :self.view.on_change_color(r, g, b) -
self.view.on_change_color(r, g, b): Cone 모듈의 색상을 지정하여 변경하는 method (Cone.py 참조) - Change Color(Red) 버튼과 Slot 연결 :
self.on_change_color_red() -
self.on_change_color_red():self.sig_change_color.emit(1,0,0)호출,self.log텍스트박스에 Log 출력
- Get Color 버튼과 Slot 연결 :
self.on_get_color() -
self.on_get_color():self.view.get_color()호출하여 리턴받은 값을self.log텍스트박스에 출력 -
self.view.get_color(): Cone 모듈의 색상 정보 리턴 (Cone.py 참조)
from PyQt5 import QtWidgets
from PyQt5.QtCore import pyqtSignal, pyqtSlot
import _qapp
# import module for Cone
from _tutorials._tutorial1.example1.Cone import Cone
class MainWindow(QtWidgets.QMainWindow):
# signal for 'change color'
sig_change_color = pyqtSignal('int', 'int', 'int')
def __init__(self, *args, **kwds):
super().__init__(*args, **kwds)
# Create Cone
self.view = Cone()
# Create widgets
self.log = QtWidgets.QTextEdit()
self.btn_change_color_random = QtWidgets.QPushButton('Change Color (Random)', clicked=self.on_change_color_random)
self.btn_change_color_red = QtWidgets.QPushButton('Change Color (Red)', clicked=self.on_change_color_red)
self.btn_get_color = QtWidgets.QPushButton('Get Color', clicked=self.on_get_color)
# Connect sig(main) / slot(view)
clicked_random = self.btn_change_color_random.clicked
clicked_random.connect(self.view.on_change_color_random)
self.sig_change_color.connect(self.view.on_change_color)
# Organize layout.
cw = QtWidgets.QWidget()
self.setCentralWidget(cw)
cw.setLayout(QtWidgets.QHBoxLayout())
cw.layout().addWidget(self.view)
widget_sig_slot = QtWidgets.QWidget()
cw.layout().addWidget(widget_sig_slot)
widget_sig_slot.setLayout(QtWidgets.QVBoxLayout())
widget_sig_slot.layout().addWidget(self.log)
widget_sig_slot.layout().addWidget(self.btn_change_color_random)
widget_sig_slot.layout().addWidget(self.btn_change_color_red)
widget_sig_slot.layout().addWidget(self.btn_get_color)
# Show.
self.show()
@pyqtSlot()
def on_change_color_random(self):
s = self.log.toPlainText() + 'Color is Changed\n'
self.log.setText(s)
@pyqtSlot()
def on_change_color_red(self):
self.sig_change_color.emit(1, 0, 0)
s = self.log.toPlainText() + 'Color is Changed to Red\n'
self.log.setText(s)
@pyqtSlot()
def on_get_color(self):
r, g, b = self.view.get_color()
s = self.log.toPlainText() + 'Color : %.3f, %.3f, %.3f\n' % (r, g, b)
self.log.setText(s)
main = MainWindow()
_qapp.exec_()- 이번 챕터에서는 불필요한 설명을 줄이기 위해 VTK의 Pipeline과 Renderer 파트는 미리 구현된 cyhub.cy_vtk 활용
- Widget Class는 VTK Render를 위해
QVTKRenderWindowInteractor를 활용하고 있는 Vtk_image_holder 상속 - vtk actor는 cy_vtk에 샘플로 구현되어 있는
actor_cone()활용하여 생성 - 생성된 vtk actor는 Vtk_image_holder의 ren(렌더)에 추가
-
self.coneactor의 색상을 입력받은 (r,g,b)으로 변경
-
pyqtSlot()decorator 사용 - Random 값으로 r, g, b 값 생성하여 change_color(r, g, b) 호출
-
pyqtSlot('int', 'int', 'int')decorator 사용 - 입력받은 r, g, b 값으로 change_color(r, g, b) 호출
-
self.cone의 색상 정보를 리턴
from cyhub import cy_vtk
from PyQt5.QtCore import pyqtSlot
from random import random
class Cone(cy_vtk.Vtk_image_holder):
def __init__(self, *args, **kwds):
super().__init__(*args, **kwds)
self.cone = cy_vtk.actor_cone()
self.ren.AddActor(self.cone)
def change_color(self, r, g, b):
self.cone.GetProperty().SetColor(r, g, b)
# update render
self.view._RenderWindow.Render()
@pyqtSlot()
def on_change_color_random(self):
rgb = [random() for _ in range(3)]
self.change_color(*rgb)
@pyqtSlot('int', 'int', 'int')
def on_change_color(self, r, g, b):
self.change_color(r, g, b)
def get_color(self):
r, g, b = self.cone.GetProperty().GetColor()
return (r, g, b)MainWindow.py 실행
