Skip to content

Instantly share code, notes, and snippets.

@astrofrog
Created July 16, 2019 01:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save astrofrog/694d18e8b1af2414c504189d1214a456 to your computer and use it in GitHub Desktop.
Save astrofrog/694d18e8b1af2414c504189d1214a456 to your computer and use it in GitHub Desktop.
Example of creating 2d viewers from a single 3d viewer in glue and keeping properties in sync
from glue.core import Data
from glue.config import viewer_tool
from glue.external.echo import keep_in_sync
from glue.viewers.common.tool import Tool
from glue.viewers.scatter.qt.data_viewer import ScatterViewer
from glue_vispy_viewers.scatter.scatter_viewer import VispyScatterViewer
@viewer_tool
class XYZViewersTool(Tool):
icon = 'app_icon'
tool_id = 'xyz_slices'
def activate(self):
app = self.viewer.session.application
viewer_xy = app.new_data_viewer(ScatterViewer)
viewer_xz = app.new_data_viewer(ScatterViewer)
viewer_yz = app.new_data_viewer(ScatterViewer)
for viewer in [viewer_xy, viewer_xz, viewer_yz]:
for layer_state in self.viewer.state.layers:
if isinstance(layer_state.layer, Data):
viewer.add_data(layer_state.layer)
viewer.viewer_size = self.viewer.viewer_size
x0, y0 = self.viewer.position
dx, dy = self.viewer.viewer_size
for suffix in ['_att', '_min', '_max']:
self._sync(self.viewer.state, 'x' + suffix, viewer_xy.state, 'x' + suffix)
self._sync(self.viewer.state, 'y' + suffix, viewer_xy.state, 'y' + suffix)
self._sync(self.viewer.state, 'x' + suffix, viewer_xz.state, 'x' + suffix)
self._sync(self.viewer.state, 'z' + suffix, viewer_xz.state, 'y' + suffix)
self._sync(self.viewer.state, 'y' + suffix, viewer_yz.state, 'x' + suffix)
self._sync(self.viewer.state, 'z' + suffix, viewer_yz.state, 'y' + suffix)
# For now just assume the first layer is the main data layer, and just
# keep that one in sync. This could be generalized.
layer_3d = self.viewer.state.layers[0]
for viewer in [viewer_xy, viewer_xz, viewer_yz]:
layer_2d = viewer.state.layers[0]
for prop_3d in layer_3d.callback_properties():
if 'cache' in prop_3d:
continue
prop_2d = prop_3d.replace('attribute', 'att').replace('color_mode', 'cmap_mode')
self._sync(layer_3d, prop_3d, layer_2d, prop_2d)
viewer_xy.position = (x0, y0 + dy)
viewer_xz.position = (x0 + dx, y0 + dy)
viewer_yz.position = (x0 + dx, y0)
def _sync(self, viewer1, att1, viewer2, att2):
if not hasattr(self, '_syncers'):
self._syncers = []
self._syncers.append(keep_in_sync(viewer1, att1, viewer2, att2))
try:
setattr(viewer2, att2, getattr(viewer1, att1))
except ValueError:
pass
VispyScatterViewer.tools.append('xyz_slices')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment