Skip to content

Commit

Permalink
Nicer API for centering
Browse files Browse the repository at this point in the history
  • Loading branch information
pllim committed Nov 7, 2022
1 parent 55c513d commit dd1b93a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 15 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ New Features

- Spinner in plot options while processing changes to contour settings. [#1794]

- Subset Tools plugin now allows recentering of spatial subset. [#1823]

Cubeviz
^^^^^^^

Expand Down
41 changes: 41 additions & 0 deletions jdaviz/configs/default/plugins/subset_plugin/subset_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,47 @@ def vue_update_subset(self, *args):
self.hub.broadcast(SnackbarMessage(
f"Failed to update Subset: {repr(err)}", color='error', sender=self))

def get_center(self):
# Composite region cannot be edited, so just grab first element.
if not self.is_editable or self.subset_types[0] == "Range": # no-op
return

subset_state = self.subset_select.selected_subset_state
sbst_obj = subset_state.roi

if isinstance(sbst_obj, (CircularROI, EllipticalROI)):
cx, cy = sbst_obj.get_center()
elif isinstance(sbst_obj, RectangularROI):
cx, cy = sbst_obj.center()
else: # pragma: no cover
raise NotImplementedError(f'Getting center of {sbst_obj.__class__} is not supported')

return cx, cy

def set_center(self, x, y):
# Composite region cannot be edited, so just grab first element.
if not self.is_editable or self.subset_types[0] == "Range": # no-op
return

subset_state = self.subset_select.selected_subset_state
sbst_obj = subset_state.roi

if isinstance(sbst_obj, (CircularROI, EllipticalROI)):
self._set_value_in_subset_definition(0, "X Center", "value", x)
self._set_value_in_subset_definition(0, "Y Center", "value", y)
elif isinstance(sbst_obj, RectangularROI):
cx, cy = sbst_obj.center()
dx = x - cx
dy = y - cy
self._set_value_in_subset_definition(0, "Xmin", "value", sbst_obj.xmin + dx)
self._set_value_in_subset_definition(0, "Xmax", "value", sbst_obj.xmax + dx)
self._set_value_in_subset_definition(0, "Ymin", "value", sbst_obj.ymin + dy)
self._set_value_in_subset_definition(0, "Ymax", "value", sbst_obj.ymax + dy)
else: # pragma: no cover
raise NotImplementedError(f'Recentering of {sbst_obj.__class__} is not supported')

self.vue_update_subset()

# List of JSON-like dict is nice for front-end but a pain to look up,
# so we use these helper functions.

Expand Down
25 changes: 10 additions & 15 deletions notebooks/concepts/imviz_edit_subset_programmatic.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
"import time\n",
"\n",
"import numpy as np\n",
"from glue.core.edit_subset_mode import ReplaceMode\n",
"from regions import PixCoord, CirclePixelRegion, RectanglePixelRegion\n",
"\n",
"from jdaviz import Imviz"
Expand Down Expand Up @@ -105,23 +104,19 @@
"metadata": {},
"outputs": [],
"source": [
"plg = subset_tool._obj\n",
"\n",
"for i in range(10):\n",
" subset_tool._obj.subset_selected = 'Subset 1'\n",
" subset_state = subset_tool._obj.subset_select.selected_subset_state\n",
" subset_roi = subset_state.roi\n",
" cur_x, cur_y = subset_roi.center() # API in glue is inconsistent for this; shape-dependent\n",
" subset_roi.move_to(cur_x + 5, cur_y)\n",
" subset_tool._obj.session.edit_subset_mode._combine_data(subset_state, override_mode=ReplaceMode)\n",
" \n",
" plg.subset_selected = 'Subset 1'\n",
" cur_x, cur_y = plg.get_center()\n",
" plg.set_center(cur_x + 5, cur_y)\n",
"\n",
" time.sleep(0.5)\n",
" \n",
" subset_tool._obj.subset_selected = 'Subset 2'\n",
" subset_state = subset_tool._obj.subset_select.selected_subset_state\n",
" subset_roi = subset_state.roi\n",
" cur_x, cur_y = subset_roi.get_center() # Circle API is different from rectangle.\n",
" subset_roi.move_to(2, -2) # For circle, this is delta, not absolute.\n",
" subset_tool._obj.session.edit_subset_mode._combine_data(subset_state, override_mode=ReplaceMode)\n",
" \n",
" plg.subset_selected = 'Subset 2'\n",
" cur_x, cur_y = plg.get_center()\n",
" plg.set_center(cur_x + 2, cur_y - 2)\n",
"\n",
" time.sleep(0.5)"
]
},
Expand Down

0 comments on commit dd1b93a

Please sign in to comment.