Skip to content

Commit 9d95d9c

Browse files
author
Isaak Lim
committed
add basic screenshot functionality to RenderableWidget
for now screenshot data is stored in self.screenshot_data self.screenshot_ready indicates that RenderableView has returned the image
1 parent f3c5000 commit 9d95d9c

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

js/src/_base/Renderable.js

+11
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,14 @@ var RenderableView = widgets.DOMWidgetView.extend({
336336

337337
},
338338

339+
screenshot: function() {
340+
var data_url = this.renderer.domElement.toDataURL('image/png');
341+
this.send({
342+
type: 'screenshot',
343+
ret_val: data_url,
344+
});
345+
},
346+
339347
teardownViewer: function() {
340348

341349
this.$renderer.off('mouseenter');
@@ -380,6 +388,9 @@ var RenderableView = widgets.DOMWidgetView.extend({
380388
case 'freeze':
381389
this.freeze();
382390
break;
391+
case 'screenshot':
392+
this.screenshot();
393+
break;
383394
default:
384395
}
385396
},

pythreejs/_base/renderable.py

+31
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
from ..math.Plane_autogen import Plane
1010
from ..renderers.webgl.WebGLShadowMap_autogen import WebGLShadowMap
1111

12+
import base64
13+
try:
14+
from io import BytesIO as StringIO
15+
except:
16+
from cStringIO import StringIO
17+
import PIL.Image
18+
1219

1320
class RenderableWidget(DOMWidget):
1421
_view_module = Unicode(npm_pkg_name).tag(sync=True)
@@ -42,6 +49,23 @@ class RenderableWidget(DOMWidget):
4249
clearColor = Unicode('#000000').tag(sync=True)
4350
clearOpacity = CFloat(1.0).tag(sync=True)
4451

52+
def __init__(self, **kwargs):
53+
super(RenderableWidget, self).__init__(**kwargs)
54+
self.on_msg(self._on_potential_ret_val)
55+
self.screenshot_data = None
56+
self.screenshot_ready = False
57+
58+
def _on_potential_ret_val(self, widget, content, buffers):
59+
"""Message callback used internally"""
60+
if content['type'] == "screenshot":
61+
self._handle_screenshot(content['ret_val'])
62+
63+
def _handle_screenshot(self, data):
64+
data = data[data.find(',')+1:]
65+
data = base64.b64decode(data)
66+
self.screenshot_data = PIL.Image.open(StringIO(data))
67+
self.screenshot_ready = True
68+
4569
def send_msg(self, message_type, payload=None):
4670
if payload is None:
4771
payload = {}
@@ -64,6 +88,13 @@ def freeze(self):
6488
}
6589
self.send(content)
6690

91+
def screenshot(self):
92+
self.screenshot_ready = False
93+
content = {
94+
"type": "screenshot"
95+
}
96+
self.send(content)
97+
6798

6899
class Preview(RenderableWidget):
69100
# renderer properties

0 commit comments

Comments
 (0)