Skip to content

Commit d94ab84

Browse files
committed
high level API works, doesn't break gridplot functionality
1 parent 34028a0 commit d94ab84

7 files changed

Lines changed: 405 additions & 20 deletions

File tree

examples/gridplot_simple.ipynb

Lines changed: 3 additions & 3 deletions
Large diffs are not rendered by default.

examples/lineplot.ipynb

Lines changed: 3 additions & 3 deletions
Large diffs are not rendered by default.

examples/simple.ipynb

Lines changed: 316 additions & 0 deletions
Large diffs are not rendered by default.

fastplotlib/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .graphics import Image, Scatter, Line
22
from .layouts import GridPlot
33
from .subplot import Subplot
4+
from .plot import Plot

fastplotlib/layouts.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def __init__(
7676
canvas = WgpuCanvas()
7777

7878
if renderer is None:
79-
renderer = pygfx.renderers.WgpuRenderer(canvas)
79+
renderer = pygfx.renderers.WgpuRenderer(canvas, show_fps=True)
8080

8181
self.canvas = canvas
8282
self.renderer = renderer
@@ -104,14 +104,12 @@ def __init__(
104104
position = (i, j)
105105
camera = cameras[i, j]
106106
controller = self._controllers[i, j]
107-
viewport = pygfx.Viewport(renderer)
108107

109108
self.subplots[i, j] = Subplot(
110109
position=position,
111110
parent_dims=(nrows, ncols),
112111
camera=camera,
113112
controller=controller,
114-
viewport=viewport,
115113
canvas=canvas,
116114
renderer=renderer
117115
)
@@ -122,13 +120,6 @@ def __init__(
122120
def animate(self):
123121
for subplot in self:
124122
subplot.animate(self.canvas.get_logical_size())
125-
# subplot.controller.update_camera(subplot.camera)
126-
127-
# w, h = self.canvas.get_logical_size()
128-
#
129-
# for subplot in self:
130-
# subplot.viewport.rect = subplot.get_rect(w, h)
131-
# subplot.viewport.render(subplot.scene, subplot.camera)
132123

133124
for f in self._animate_funcs:
134125
f()

fastplotlib/plot.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import pygfx
2+
from pygfx.linalg import Vector3
3+
from wgpu.gui.auto import WgpuCanvas
4+
from .subplot import Subplot
5+
from .graphics import *
6+
7+
8+
class Plot(Subplot):
9+
def __init__(
10+
self,
11+
canvas: WgpuCanvas = None,
12+
renderer: pygfx.Renderer = None,
13+
camera: str = '2d',
14+
controller: Union[pygfx.PanZoomController, pygfx.OrbitOrthoController] = None
15+
):
16+
super(Plot, self).__init__(
17+
position=(0, 0),
18+
parent_dims=(1, 1),
19+
canvas=canvas,
20+
renderer=renderer,
21+
camera=camera,
22+
controller=controller
23+
)
24+
25+
def image(self, *args, **kwargs):
26+
graphic = Image(*args, **kwargs)
27+
self.scene.add(graphic.world_object)
28+
29+
dims = graphic.data.shape
30+
zero_pos = Vector3(dims[0] / 2, dims[1] / 2, self.camera.position.z)
31+
delta = zero_pos.clone().sub(self.camera.position)
32+
zoom_level = 1 / np.mean(dims)
33+
if self.controller.zoom_value != zoom_level:
34+
self.controller.zoom(zoom_level)
35+
self.controller.pan(delta)
36+
37+
return graphic
38+
39+
def line(self, *args, **kwargs):
40+
graphic = Line(*args, **kwargs)
41+
self.scene.add(graphic.world_object)
42+
43+
return graphic
44+
45+
def scatter(self, *args, **kwargs):
46+
graphic = Scatter(*args, **kwargs)
47+
self.scene.add(graphic.world_object)
48+
self.camera.show_object(graphic.world_object)
49+
50+
return graphic
51+
52+
def animate(self):
53+
super(Plot, self).animate(canvas_dims=None)
54+
55+
self.renderer.flush()
56+
self.canvas.request_draw()
57+
58+
def show(self):
59+
self.canvas.request_draw(self.animate)
60+
return self.canvas

fastplotlib/subplot.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,18 @@ def __init__(
1313
position: Tuple[int, int] = None,
1414
parent_dims: Tuple[int, int] = None,
1515
camera: str = '2d',
16-
controller: pygfx.PanZoomController = None,
17-
viewport: pygfx.Viewport = None,
16+
controller: Union[pygfx.PanZoomController, pygfx.OrbitOrthoController] = None,
1817
canvas: WgpuCanvas = None,
1918
renderer: pygfx.Renderer = None
2019
):
2120
self.scene: pygfx.Scene = pygfx.Scene()
21+
22+
if canvas is None:
23+
canvas = WgpuCanvas()
24+
25+
if renderer is None:
26+
renderer = pygfx.renderers.WgpuRenderer(canvas)
27+
2228
self.canvas = canvas
2329
self.renderer = renderer
2430

@@ -39,7 +45,7 @@ def __init__(
3945

4046
# might be better as an attribute of GridPlot
4147
# but easier to iterate when in same object as camera and scene
42-
self.viewport: pygfx.Viewport = viewport
48+
self.viewport: pygfx.Viewport = pygfx.Viewport(renderer)
4349

4450
self.controller.add_default_event_handlers(
4551
self.viewport,
@@ -54,6 +60,8 @@ def __init__(
5460

5561
self._grid: GridHelper = GridHelper(size=100, thickness=1)
5662

63+
self._animate_funcs = list()
64+
5765
def _produce_rect(self, i, j, w, h):
5866
# print(locals())
5967
return [
@@ -67,11 +75,20 @@ def _resize(self, canvas_dims: Tuple[int, int]):
6775
# w, h = self.canvas.get_logical_size()
6876
self.viewport.rect = self._produce_rect(*self.position, *canvas_dims)
6977

70-
def animate(self, canvas_dims: Tuple[int, int]):
78+
def animate(self, canvas_dims: Tuple[int, int] = None):
79+
if canvas_dims is None:
80+
canvas_dims = self.canvas.get_logical_size()
81+
7182
self.controller.update_camera(self.camera)
7283
self._resize(canvas_dims)
7384
self.viewport.render(self.scene, self.camera)
7485

86+
for f in self._animate_funcs:
87+
f()
88+
89+
def add_animations(self, funcs: List[callable]):
90+
self._animate_funcs += funcs
91+
7592
def add_graphic(self, graphic):
7693
self.scene.add(graphic.world_object)
7794

0 commit comments

Comments
 (0)