Skip to content

Tut1 Example1

Sung-June, Lim edited this page Oct 21, 2016 · 31 revisions

File Composition for Tutorial1

_tutorials

_tutorial1

example1

MainWindow.py
Cone.py

Introduction

cyhub를 활용한 example을 다루기 전에 일반적인 Python, pyQt를 활용한 예제를 먼저 다루고자 합니다. 이 예제를 통하여 일반적인 Local환경의 Application 구현 방법을 알아볼 것이며, 이후 학습할 cyhub 기반 예제의 이해를 도울 것입니다.

Implementation

  • 본 예제에서는 불필요한 설명을 줄이기 위해 pyQt와 VTK의 일부를 cyhub의 _qapp와 cy_vtk 활용
  • 버튼과 Signal/Slot을 통해 같은or다른 모듈에 arguments를 전달하여 emit 하는 일반적인 활용
  • 다른 모듈의 method를 호출하는 일반적인 활용

MainWindow.py

Layout & Widgets
  • Application을 구성 할 Widget과 Layout 구성 : Change Color(Random) 버튼, Change Color(Red) 버튼, Get Color 버튼, Log 텍스트박스
  • Cone 생성 : import Cone.py, self.view = Cone()
Change Color(Random) 버튼
  • 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 참조)
Change Color(Red) 버튼
  • sig_change_color Signal 생성 : 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 버튼
  • 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_()

Cone.py

Cone
  • 이번 챕터에서는 불필요한 설명을 줄이기 위해 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(렌더)에 추가
change_color(r, g, b)
  • self.cone actor의 색상을 입력받은 (r,g,b)으로 변경
on_change_color_random()
  • pyqtSlot() decorator 사용
  • Random 값으로 r, g, b 값 생성하여 change_color(r, g, b) 호출
on_change_color(r, g, b)
  • pyqtSlot('int', 'int', 'int') decorator 사용
  • 입력받은 r, g, b 값으로 change_color(r, g, b) 호출
get_color()
  • 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)

Run App

MainWindow.py 실행

[Application]

Clone this wiki locally