-
Notifications
You must be signed in to change notification settings - Fork 0
Tut1 Example5
Sung-June, Lim edited this page Oct 2, 2016
·
3 revisions
_tutorials
_tutorial1
...
example5apps
HelloCyhub.py
blocks
MainWindow.py
Cone.py
cyapp.py
cyapp_cfg.py
cymgr.py
cymgr_cfg.py
cycoord.py
cycoord_cfg.py
- Cone의 색상을 리턴하는
get_color()method 생성 -
get_color()method에@cyhub_methoddecorator를 사용
(@cyhub_methoddecorator는 method를 Remote Call 가능하도록 List에 추가)
from cyhub import cy_vtk
from cyhub.block import Block_meta, cyhub_slot, cyhub_method
from random import random
class Cone(cy_vtk.Vtk_image_holder, metaclass=Block_meta):
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()
@cyhub_slot()
def on_change_color_random(self):
rgb = [random() for _ in range(3)]
self.change_color(*rgb)
@cyhub_slot('int', 'int', 'int')
def on_change_color(self, r, g, b):
self.change_color(r, g, b)
@cyhub_method
def get_color(self):
r, g, b = self.cone.GetProperty().GetColor()
return (r, g, b)- 기본적으로 cyhub의 Stub/Proxy는 비동기 호출(Asynchronous call)을 따름
즉, Cone Block(cone_view)의get_color()는 비동기 호출 - Synchronous method 내애서 Asynchronous method 호출 시, async wrapper method로 둘러싸서 사용
즉, Main Block(main)의on_get_color()와 같은 Slot은 Synchronous method이므로 async wrapper method 사용 - Async method 최초 호출 시
create_task(coroutine)method를 사용하여 호출
(create_task(coroutine): coroutine object의 실행을 예약, Promise를 리턴)
from PyQt5 import QtWidgets
from PyQt5.QtCore import pyqtSignal
from cyhub.block import Block_meta, cyhub_slot
from _qapp import create_task
class MainWindow(QtWidgets.QMainWindow, metaclass=Block_meta):
sig_change_color = pyqtSignal('int', 'int', 'int')
def __init__(self, *args, **kwds):
super().__init__(*args, **kwds)
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)
def initialize(self):
"""
this method is called at end of 'compose_app'
thus, R(reference) like 'self.cone' are available from now (not available in '__init__(..)')
"""
# Organize layout.
cw = QtWidgets.QWidget()
self.setCentralWidget(cw)
cw.setLayout(QtWidgets.QHBoxLayout())
cw.layout().addWidget(self.view.as_widget())
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()
@cyhub_slot()
def on_change_color_random(self):
s = self.log.toPlainText() + 'Color is Changed\n'
self.log.setText(s)
@cyhub_slot()
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)
@cyhub_slot()
def on_get_color(self):
async def _do():
r, g, b = await self.view.get_color()
s = self.log.toPlainText() + 'Color : %.3f, %.3f, %.3f\n' % (r, g, b)
self.log.setText(s)
create_task(_do())이전의 Example과 마찬가지로 Cloud 기반의 Application을 구성하기 위하여 2대의 Machine 환경이 필요합니다.
하나의 Machine에서는 Coordinator를 실행할 것이며, 다른 하나의 Machine에서는 Application을 실행 할 것입니다.
따라서, 2대의 Machine 환경에서 실행 가능하도록 환경이 구축되어 있어야 합니다.
(하지만, 편의상 Tutorial 시연을 위해 하나의 Machine에서 Coordinator와 Application 모두 실행 가능)
이전 Example에서 작성한 cycoord_cfg.py, cymgr_cfg.py, cyapp_cfg.py 파일에서 cycode_prefix의 값을 example5의 위치로 변경하면 됩니다.
cycode_prefix = '_tutorials._tutorial1.example5'- coordinator가 위치한 machine에서 cycoord.py 파일을 실행 합니다.
- application이 위치한 machine에서 cyapp.py 파일을 실행 합니다.
- Remote Rendering이 되고 있는 Block은 좌측 상단에 'R'이 표시 됩니다.


