From 9d30a86d93fc0cba5b6a24aaff3805e2d55554fa Mon Sep 17 00:00:00 2001 From: biochem_fan Date: Fri, 6 Sep 2024 21:41:35 +0900 Subject: [PATCH] Image viewer masking UI fixes (#2731) - Fix glitches in dials.image_viewer masking tool (#1824, #1964) - Allow panning and zoom change while polygons are drawn (#1824) - Make sure polygon vertices are within a single panel since polygons over multiple panels are not (yet) supported (#2712) - Clear the current rectangle and exit the rectangle mode when failed - Make masking errors visible as a dialog box (#2260) --- newsfragments/2731.bugfix | 1 + src/dials/util/image_viewer/mask_frame.py | 49 +++++++++++++++++------ 2 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 newsfragments/2731.bugfix diff --git a/newsfragments/2731.bugfix b/newsfragments/2731.bugfix new file mode 100644 index 0000000000..3d3e47a620 --- /dev/null +++ b/newsfragments/2731.bugfix @@ -0,0 +1 @@ +``dials.image_viewer``: Fix UI glitches in masking tools. diff --git a/src/dials/util/image_viewer/mask_frame.py b/src/dials/util/image_viewer/mask_frame.py index f058e5f558..deb386b54b 100644 --- a/src/dials/util/image_viewer/mask_frame.py +++ b/src/dials/util/image_viewer/mask_frame.py @@ -685,8 +685,31 @@ def OnLeftDown(self, event): self._circle_radius = None return elif self._mode_polygon: - self._mode_polygon_points.append(click_posn) + xgeo, ygeo = self._pyslip.ConvertView2Geo(click_posn) + xc, yc = self._pyslip.tiles.map_relative_to_picture_fast_slow( + xgeo, ygeo + ) + p1, p0, p_id = self._pyslip.tiles.flex_image.picture_to_readout(yc, xc) + + if p_id < 0: + return + + # polygon must be within a single panel + if len(self._mode_polygon_points) > 0: + xgeo0, ygeo0 = self._mode_polygon_points[0] + xc0, yc0 = self._pyslip.tiles.map_relative_to_picture_fast_slow( + xgeo0, ygeo0 + ) + _, _, p_id0 = self._pyslip.tiles.flex_image.picture_to_readout( + yc0, xc0 + ) + + if p_id0 != p_id: + return + + self._mode_polygon_points.append((xgeo, ygeo)) self.DrawPolygon(self._mode_polygon_points) + event.Skip() def OnLeftUp(self, event): @@ -697,12 +720,16 @@ def OnLeftUp(self, event): self._rectangle_x1y1 = click_posn x0, y0 = self._rectangle_x0y0 x1, y1 = self._rectangle_x1y1 - self.AddUntrustedRectangle(x0, y0, x1, y1) - self._pyslip.DeleteLayer(self._mode_rectangle_layer) - self._mode_rectangle_layer = None - self.mode_rectangle_button.SetValue(False) - self.OnUpdate(event) - return + try: + self.AddUntrustedRectangle(x0, y0, x1, y1) + except Exception as e: + wx.MessageBox(str(e)) + finally: + self._pyslip.DeleteLayer(self._mode_rectangle_layer) + self._mode_rectangle_layer = None + self.mode_rectangle_button.SetValue(False) + self.OnUpdate(event) + return elif self._mode_circle and self._circle_xy is not None: xc, yc = self._circle_xy @@ -711,7 +738,7 @@ def OnLeftUp(self, event): try: self.AddUntrustedCircle(xc, yc, xedge, yedge) except Exception as e: - print(e) + wx.MessageBox(str(e)) finally: self._pyslip.DeleteLayer(self._mode_circle_layer) self._mode_circle_layer = None @@ -806,10 +833,7 @@ def DrawPolygon(self, vertices): for i in range(len(vertices) - 1): polygon_data.append( ( - ( - self._pyslip.ConvertView2Geo(vertices[i]), - self._pyslip.ConvertView2Geo(vertices[i + 1]), - ), + (vertices[i], vertices[i + 1]), d, ) ) @@ -828,7 +852,6 @@ def AddUntrustedPolygon(self, vertices): if len(vertices) < 4: return vertices.append(vertices[0]) - vertices = [self._pyslip.ConvertView2Geo(v) for v in vertices] vertices = [ self._pyslip.tiles.map_relative_to_picture_fast_slow(*v) for v in vertices ]