首先在start_webserver处启动一个wsbFactory = WebSocketServerFactory
里面注册vtk_wamp.ImagePushBinaryWebSocketServerProtocol//注意这里他是服务端
里面包含了客户端与服务端交互的所有方法
def onOpen(self)://连接打开
def onMessage(self, msg, isBinary)://消息到来
def onClose(self, wasClean, code, reason)://连接关闭
def connectionLost(self, reason)://连接丢失
def renderStaleImage(self)://渲染图像
def render(self)://渲染图像并发送
网页端
客户端会给canvas对象绑定事件,当有事件触发时
会通过rpc调用viewport.mouse.interaction方法
session.call("viewport.mouse.interaction", [vtkWeb_event]).then(function (res) {
if (res) {
action_pending = false;
render();//需要喧嚷
}
}, function(error) {
console.log("Call to viewport.mouse.interaction failed");
console.log(error);
});
class vtkWebMouseHandler(vtkWebProtocol):
@exportRpc("viewport.mouse.interaction")
retVal = self.getApplication().HandleInteractionEvent(view, pvevent)
del pvevent
if retVal:
self.getApplication().InvokeEvent('PushRender')
return retVal
会调用到vtkWebApplication的HandleInteractionEvent方法进行事件消化
得到是否需要渲染图像,如果需要,会触发PushRender事件,这个事件是在连接成功时注册的lambda表达式
self.subscription = self.app.AddObserver('PushRender', lambda obj, event: reactor.callLater(0.0, lambda: self.render()))
进而调用他自己的render方法向客户端发送图像,
客户端收到图像自行渲染
在客户端的render函数里调用rpc 方法 viewport.image.render获取图像,进而显示到canvas上
// Setup internal API
function render(fetch) {
if (force_render === false) {
if (render_onidle_timeout !== null) {
// clear any renderOnIdle requests that are pending since we
// are sending a render request.
GLOBAL.clearTimeout(render_onidle_timeout);
render_onidle_timeout = null;
}
force_render = true;
var renderCfg = {
size: [ container.innerWidth(), container.innerHeight() ],
view: Number(options.view),
mtime: fetch ? 0 : lastMTime,
quality: quality,
localTime : new Date().getTime()
};
container.trigger({
type: 'stats',
stat_id: 'image-fps',
stat_value: 0 // start
});
session.call("viewport.image.render", [renderCfg]).then(function (res) {//在canvas上绘制图像
里面注册vtk_wamp.ImagePushBinaryWebSocketServerProtocol//注意这里他是服务端
里面包含了客户端与服务端交互的所有方法
def onOpen(self)://连接打开
def onMessage(self, msg, isBinary)://消息到来
def onClose(self, wasClean, code, reason)://连接关闭
def connectionLost(self, reason)://连接丢失
def renderStaleImage(self)://渲染图像
def render(self)://渲染图像并发送
网页端
客户端会给canvas对象绑定事件,当有事件触发时
会通过rpc调用viewport.mouse.interaction方法
session.call("viewport.mouse.interaction", [vtkWeb_event]).then(function (res) {
if (res) {
action_pending = false;
render();//需要喧嚷
}
}, function(error) {
console.log("Call to viewport.mouse.interaction failed");
console.log(error);
});
class vtkWebMouseHandler(vtkWebProtocol):
@exportRpc("viewport.mouse.interaction")
retVal = self.getApplication().HandleInteractionEvent(view, pvevent)
del pvevent
if retVal:
self.getApplication().InvokeEvent('PushRender')
return retVal
会调用到vtkWebApplication的HandleInteractionEvent方法进行事件消化
得到是否需要渲染图像,如果需要,会触发PushRender事件,这个事件是在连接成功时注册的lambda表达式
self.subscription = self.app.AddObserver('PushRender', lambda obj, event: reactor.callLater(0.0, lambda: self.render()))
进而调用他自己的render方法向客户端发送图像,
客户端收到图像自行渲染
在客户端的render函数里调用rpc 方法 viewport.image.render获取图像,进而显示到canvas上
// Setup internal API
function render(fetch) {
if (force_render === false) {
if (render_onidle_timeout !== null) {
// clear any renderOnIdle requests that are pending since we
// are sending a render request.
GLOBAL.clearTimeout(render_onidle_timeout);
render_onidle_timeout = null;
}
force_render = true;
var renderCfg = {
size: [ container.innerWidth(), container.innerHeight() ],
view: Number(options.view),
mtime: fetch ? 0 : lastMTime,
quality: quality,
localTime : new Date().getTime()
};
container.trigger({
type: 'stats',
stat_id: 'image-fps',
stat_value: 0 // start
});
session.call("viewport.image.render", [renderCfg]).then(function (res) {//在canvas上绘制图像