-
Notifications
You must be signed in to change notification settings - Fork 38
/
frb_mark.py
78 lines (54 loc) · 2.29 KB
/
frb_mark.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# This is an image sub-class that automatically gets its values from an object
# that implements __call__ with a bounds= argument and returns a fixed
# resolution buffer (FRB). It is the equivalent of FRBArtist in glue-core.
import numpy as np
from bqplot import ColorScale
from bqplot_image_gl import ImageGL
from ...utils import debounced
__all__ = ['FRBImage']
EMPTY_IMAGE = np.zeros((10, 10, 4), dtype=np.uint8)
class FRBImage(ImageGL):
def __init__(self, viewer, array_maker):
# FIXME: need to use weakref to avoid circular references
self.viewer = viewer
self.scale_image = ColorScale()
self.scales = {'x': self.viewer.scale_x,
'y': self.viewer.scale_y,
'image': self.scale_image}
super().__init__(image=EMPTY_IMAGE, scales=self.scales)
self.array_maker = array_maker
self.viewer.figure.axes[0].scale.observe(self.debounced_update, 'min')
self.viewer.figure.axes[0].scale.observe(self.debounced_update, 'max')
self.viewer.figure.axes[1].scale.observe(self.debounced_update, 'min')
self.viewer.figure.axes[1].scale.observe(self.debounced_update, 'max')
self.update()
@debounced(method=True)
def debounced_update(self, *args, **kwargs):
return self.update(self, *args, **kwargs)
@property
def shape(self):
return self.viewer.shape
def update(self, *args, **kwargs):
if self.shape is None:
return
# Get current limits from the plot
xmin = self.viewer.figure.axes[0].scale.min
xmax = self.viewer.figure.axes[0].scale.max
ymin = self.viewer.figure.axes[1].scale.min
ymax = self.viewer.figure.axes[1].scale.max
if xmin is None or xmax is None or ymin is None or ymax is None:
return
ny, nx = self.shape
# Set up bounds
bounds = [(ymin, ymax, ny), (xmin, xmax, nx)]
# Get the array and assign it to the artist
image = self.array_maker(bounds=bounds)
if image is not None:
with self.hold_sync():
self.image = image
self.x = (xmin, xmax)
self.y = (ymin, ymax)
else:
self.image = EMPTY_IMAGE
def invalidate_cache(self):
self.update()