Skip to content

Commit 98e9b0f

Browse files
committed
add freeze method
1 parent 48abf81 commit 98e9b0f

File tree

6 files changed

+73
-47
lines changed

6 files changed

+73
-47
lines changed

examples/test.ipynb

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"cells": [
33
{
44
"cell_type": "code",
5-
"execution_count": 1,
5+
"execution_count": null,
66
"metadata": {
77
"collapsed": false
88
},
@@ -14,7 +14,7 @@
1414
},
1515
{
1616
"cell_type": "code",
17-
"execution_count": 2,
17+
"execution_count": null,
1818
"metadata": {
1919
"collapsed": false
2020
},
@@ -28,7 +28,7 @@
2828
},
2929
{
3030
"cell_type": "code",
31-
"execution_count": 3,
31+
"execution_count": null,
3232
"metadata": {
3333
"collapsed": true
3434
},
@@ -41,7 +41,7 @@
4141
},
4242
{
4343
"cell_type": "code",
44-
"execution_count": 4,
44+
"execution_count": null,
4545
"metadata": {
4646
"collapsed": true
4747
},
@@ -58,7 +58,7 @@
5858
},
5959
{
6060
"cell_type": "code",
61-
"execution_count": 5,
61+
"execution_count": null,
6262
"metadata": {
6363
"collapsed": false
6464
},
@@ -70,7 +70,7 @@
7070
},
7171
{
7272
"cell_type": "code",
73-
"execution_count": 6,
73+
"execution_count": null,
7474
"metadata": {
7575
"collapsed": true
7676
},
@@ -83,7 +83,7 @@
8383
},
8484
{
8585
"cell_type": "code",
86-
"execution_count": 7,
86+
"execution_count": null,
8787
"metadata": {
8888
"collapsed": true
8989
},
@@ -96,7 +96,7 @@
9696
},
9797
{
9898
"cell_type": "code",
99-
"execution_count": 8,
99+
"execution_count": null,
100100
"metadata": {
101101
"collapsed": true
102102
},
@@ -107,7 +107,7 @@
107107
},
108108
{
109109
"cell_type": "code",
110-
"execution_count": 9,
110+
"execution_count": null,
111111
"metadata": {
112112
"collapsed": true
113113
},
@@ -123,7 +123,7 @@
123123
},
124124
{
125125
"cell_type": "code",
126-
"execution_count": 10,
126+
"execution_count": null,
127127
"metadata": {
128128
"collapsed": true
129129
},
@@ -135,7 +135,7 @@
135135
},
136136
{
137137
"cell_type": "code",
138-
"execution_count": 11,
138+
"execution_count": null,
139139
"metadata": {
140140
"collapsed": true
141141
},
@@ -147,7 +147,7 @@
147147
},
148148
{
149149
"cell_type": "code",
150-
"execution_count": 12,
150+
"execution_count": null,
151151
"metadata": {
152152
"collapsed": true
153153
},
@@ -158,7 +158,7 @@
158158
},
159159
{
160160
"cell_type": "code",
161-
"execution_count": 13,
161+
"execution_count": null,
162162
"metadata": {
163163
"collapsed": false
164164
},
@@ -174,7 +174,9 @@
174174
"collapsed": true
175175
},
176176
"outputs": [],
177-
"source": []
177+
"source": [
178+
"renderer.freeze()"
179+
]
178180
}
179181
],
180182
"metadata": {

js/src/_base/Three.js

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ var ThreeView = widgets.DOMWidgetView.extend({
2121

2222
var obj = this.model.obj;
2323

24-
this.renderer = new THREE.WebGLRenderer();
24+
this.renderer = new THREE.WebGLRenderer({
25+
// required for converting canvas to png
26+
preserveDrawingBuffer: true,
27+
});
28+
2529
this.el.className = "jupyter-widget jupyter-threejs";
2630
this.$el.empty().append(this.renderer.domElement);
2731

@@ -68,7 +72,8 @@ var ThreeView = widgets.DOMWidgetView.extend({
6872
}
6973

7074
this.on('destroy', this.destroy, this);
71-
this.listenTo(this.model, 'rerender', this.renderScene);
75+
this.listenTo(this.model, 'rerender', this.renderScene);
76+
this.listenTo(this.model, 'msg:custom', this.onCustomMessage.bind(this));
7277

7378
},
7479

@@ -147,6 +152,19 @@ var ThreeView = widgets.DOMWidgetView.extend({
147152
this.renderer.render(this.scene, this.camera);
148153
},
149154

155+
freeze: function() {
156+
this.$el.empty().append('<img src="' + this.renderer.domElement.toDataURL() + '" />');
157+
},
158+
159+
onCustomMessage: function(content, buffers) {
160+
switch(content.type) {
161+
case 'freeze':
162+
this.freeze();
163+
break;
164+
default:
165+
}
166+
},
167+
150168
});
151169

152170
var ThreeModel = widgets.DOMWidgetModel.extend({
@@ -341,13 +359,19 @@ var ThreeModel = widgets.DOMWidgetModel.extend({
341359
//
342360

343361
onCustomMessage: function(content, buffers) {
344-
if (content.type === 'exec_three_obj_method') {
345-
this.onExecThreeObjMethod(content.method_name, content.args, content.buffers);
346-
} else if (content.type === 'print') {
347-
console.log("SERVER: " + JSON.stringify(content.msg));
348-
} else {
349-
console.log("ERROR: invalid custom message");
350-
console.log(content);
362+
switch(content.type) {
363+
case 'exec_three_obj_method':
364+
this.onExecThreeObjMethod(content.method_name, content.args, content.buffers);
365+
break;
366+
case 'freeze':
367+
break;
368+
case 'print':
369+
console.log("SERVER: " + JSON.stringify(content.msg));
370+
break;
371+
default:
372+
console.log("ERROR: invalid custom message");
373+
console.log(content);
374+
351375
}
352376
},
353377

js/src/renderers/WebGLRenderer.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ var WebGLRendererView = widgets.DOMWidgetView.extend({
6565
},
6666

6767
onCustomMessage: function(content, buffers) {
68-
var type = content.type;
69-
switch(type) {
68+
switch(content.type) {
7069

7170
case 'render':
7271
Promise.props({
@@ -77,6 +76,9 @@ var WebGLRendererView = widgets.DOMWidgetView.extend({
7776
});
7877
break;
7978

79+
case 'freeze':
80+
this.freeze();
81+
8082
default:
8183
throw new Error('Invalid custom msg type: ' + type);
8284

@@ -92,7 +94,10 @@ var WebGLRendererView = widgets.DOMWidgetView.extend({
9294
},
9395

9496
render: function() {
95-
this.renderer = new THREE.WebGLRenderer(this.model.get('width'), this.model.get('size'));
97+
this.renderer = new THREE.WebGLRenderer({
98+
// required for converting canvas to png
99+
preserveDrawingBuffer: true,
100+
});
96101

97102
this.el.className = "jupytr-widget jupyter-threejs";
98103
this.$el.empty().append(this.renderer.domElement);
@@ -112,6 +117,10 @@ var WebGLRendererView = widgets.DOMWidgetView.extend({
112117
this.renderer.render(scene, camera);
113118
},
114119

120+
freeze: function() {
121+
this.$el.empty().append('<img src="' + this.renderer.domElement.toDataURL() + '" />');
122+
},
123+
115124
invoke: function(methodName, propNames) {
116125
var fn = function() {
117126
args = propNames.map(function(name) {

pythreejs/_base/Three.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ def log(self, msg):
2626
}
2727
self.send(content=content, buffers=None)
2828

29+
def freeze(self):
30+
content = {
31+
"type": "freeze"
32+
}
33+
self.send(content)
34+
2935
def on_potential_ret_val(self, widget, content, buffers):
3036
if content['type'] == "exec_three_obj_method_retval":
3137
self.on_ret_val(content['method_name'], content['ret_val'])

pythreejs/renderers/WebGLRenderer.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,9 @@ def render(self, scene, camera):
5151
}
5252
self.send(content)
5353

54+
def freeze(self):
55+
content = {
56+
"type": "freeze"
57+
}
58+
self.send(content)
59+

pythreejs/renderers/WebGLRenderer_autogen.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)