def testRemovedSelection(self): item1 = roi_items.PointROI() item1.setSelectable(True) manager = roi.RegionOfInterestManager(self.plot) manager.addRoi(item1) manager.setCurrentRoi(item1) manager.removeRoi(item1) self.assertIs(manager.getCurrentRoi(), None)
def testSelectionProxy(self): item1 = roi_items.PointROI() item1.setSelectable(True) item2 = roi_items.PointROI() item2.setSelectable(True) item1.setFocusProxy(item2) manager = roi.RegionOfInterestManager(self.plot) manager.setCurrentRoi(item1) self.assertIs(manager.getCurrentRoi(), item2)
def testPlotWhenRoiRemoved(self): """Make sure there is no remaining items in the plot when a ROI is removed""" manager = roi.RegionOfInterestManager(self.plot) item = roi_items.LineROI() item.setEndPoints((0, 0), (1, 1)) item.setEditable(True) manager.addRoi(item) self.qWait() try: # Make sure the test setup is fine self.assertNotEqual(len(manager.getRois()), 0) self.assertNotEqual(len(self.plot.getItems()), 0) # Call clear and test the expected state manager.removeRoi(item) self.assertEqual(len(manager.getRois()), 0) self.assertEqual(len(self.plot.getItems()), 0) finally: # Clean up manager.clear()
def testPlotWhenCleared(self): """PlotWidget.clear should clean up the available ROIs""" manager = roi.RegionOfInterestManager(self.plot) item = roi_items.LineROI() item.setEndPoints((0, 0), (1, 1)) item.setEditable(True) manager.addRoi(item) self.qWait() try: # Make sure the test setup is fine self.assertNotEqual(len(manager.getRois()), 0) self.assertNotEqual(len(self.plot.getItems()), 0) # Call clear and test the expected state self.plot.clear() self.assertEqual(len(manager.getRois()), 0) self.assertEqual(len(self.plot.getItems()), 0) finally: # Clean up manager.clear()
def testArcRoiSwitchMode(self): """Make sure we can switch mode by clicking on the ROI""" xlimit = self.plot.getXAxis().getLimits() ylimit = self.plot.getYAxis().getLimits() points = numpy.array([xlimit, ylimit]).T center = numpy.mean(points, axis=0) size = numpy.abs(points[1] - points[0]) # Create the line manager = roi.RegionOfInterestManager(self.plot) item = roi_items.ArcROI() item.setGeometry(center, size[1] / 10, size[1] / 2, 0, 3) item.setEditable(True) item.setSelectable(True) manager.addRoi(item) self.qapp.processEvents() # Initial state self.assertIs(item.getInteractionMode(), roi_items.ArcROI.ThreePointMode) self.qWait(500) # Click on the center widget = self.plot.getWidgetHandle() mx, my = self.plot.dataToPixel(*center) # Select the ROI self.mouseMove(widget, pos=(mx, my)) self.mouseClick(widget, qt.Qt.LeftButton, pos=(mx, my)) self.qWait(500) self.assertIs(item.getInteractionMode(), roi_items.ArcROI.ThreePointMode) # Change the mode self.mouseMove(widget, pos=(mx, my)) self.mouseClick(widget, qt.Qt.LeftButton, pos=(mx, my)) self.qWait(500) self.assertIs(item.getInteractionMode(), roi_items.ArcROI.PolarMode) manager.clear() self.qapp.processEvents()
def testChangeInteractionMode(self): """Test change of interaction mode""" manager = roi.RegionOfInterestManager(self.plot) self.roiTableWidget.setRegionOfInterestManager(manager) manager.start(roi_items.PointROI) interactiveModeToolBar = self.plot.getInteractiveModeToolBar() panAction = interactiveModeToolBar.getPanModeAction() for roiClass in manager.getSupportedRoiClasses(): with self.subTest(roiClass=roiClass): # Change to pan mode panAction.trigger() # Change to interactive ROI mode action = manager.getInteractionModeAction(roiClass) action.trigger() self.assertEqual(roiClass, manager.getCurrentInteractionModeRoiClass()) manager.clear()
def testLineInteraction(self): """This test make sure that a ROI based on handles can be edited with the mouse.""" xlimit = self.plot.getXAxis().getLimits() ylimit = self.plot.getYAxis().getLimits() points = numpy.array([xlimit, ylimit]).T center = numpy.mean(points, axis=0) # Create the line manager = roi.RegionOfInterestManager(self.plot) item = roi_items.LineROI() item.setEndPoints(points[0], points[1]) item.setEditable(True) manager.addRoi(item) self.qapp.processEvents() # Drag the center widget = self.plot.getWidgetHandle() mx, my = self.plot.dataToPixel(*center) self.mouseMove(widget, pos=(mx, my)) self.mousePress(widget, qt.Qt.LeftButton, pos=(mx, my)) self.mouseMove(widget, pos=(mx, my + 25)) self.mouseMove(widget, pos=(mx, my + 50)) self.mouseRelease(widget, qt.Qt.LeftButton, pos=(mx, my + 50)) result = numpy.array(item.getEndPoints()) # x location is still the same numpy.testing.assert_allclose(points[:, 0], result[:, 0], atol=0.5) # size is still the same numpy.testing.assert_allclose(points[1] - points[0], result[1] - result[0], atol=0.5) # But Y is not the same self.assertNotEqual(points[0, 1], result[0, 1]) self.assertNotEqual(points[1, 1], result[1, 1]) item = None manager.clear() self.qapp.processEvents()
def testRoiDisplay(self): rois = [] # Line item = roi_items.LineROI() startPoint = numpy.array([1, 2]) endPoint = numpy.array([3, 4]) item.setEndPoints(startPoint, endPoint) rois.append(item) # Horizontal line item = roi_items.HorizontalLineROI() item.setPosition(15) rois.append(item) # Vertical line item = roi_items.VerticalLineROI() item.setPosition(15) rois.append(item) # Point item = roi_items.PointROI() point = numpy.array([1, 2]) item.setPosition(point) rois.append(item) # Rectangle item = roi_items.RectangleROI() origin = numpy.array([0, 0]) size = numpy.array([10, 20]) item.setGeometry(origin=origin, size=size) rois.append(item) # Polygon item = roi_items.PolygonROI() points = numpy.array([[10, 10], [12, 10], [50, 1]]) item.setPoints(points) rois.append(item) # Degenerated polygon: No points item = roi_items.PolygonROI() points = numpy.empty((0, 2)) item.setPoints(points) rois.append(item) # Degenerated polygon: A single point item = roi_items.PolygonROI() points = numpy.array([[5, 10]]) item.setPoints(points) rois.append(item) # Degenerated arc: it's a point item = roi_items.ArcROI() center = numpy.array([10, 20]) innerRadius, outerRadius, startAngle, endAngle = 0, 0, 0, 0 item.setGeometry(center, innerRadius, outerRadius, startAngle, endAngle) rois.append(item) # Degenerated arc: it's a line item = roi_items.ArcROI() center = numpy.array([10, 20]) innerRadius, outerRadius, startAngle, endAngle = 0, 100, numpy.pi, numpy.pi item.setGeometry(center, innerRadius, outerRadius, startAngle, endAngle) rois.append(item) # Special arc: it's a donut item = roi_items.ArcROI() center = numpy.array([10, 20]) innerRadius, outerRadius, startAngle, endAngle = 1, 100, numpy.pi, 3 * numpy.pi item.setGeometry(center, innerRadius, outerRadius, startAngle, endAngle) rois.append(item) # Arc item = roi_items.ArcROI() center = numpy.array([10, 20]) innerRadius, outerRadius, startAngle, endAngle = 1, 100, numpy.pi * 0.5, numpy.pi item.setGeometry(center, innerRadius, outerRadius, startAngle, endAngle) rois.append(item) # Horizontal Range item = roi_items.HorizontalRangeROI() item.setRange(-1, 3) rois.append(item) manager = roi.RegionOfInterestManager(self.plot) self.roiTableWidget.setRegionOfInterestManager(manager) for item in rois: with self.subTest(roi=str(item)): manager.addRoi(item) self.qapp.processEvents() item.setEditable(True) self.qapp.processEvents() item.setEditable(False) self.qapp.processEvents() manager.removeRoi(item) self.qapp.processEvents()
def test(self): """Test ROI of different shapes""" tests = ( # shape, points=[list of (x, y), list of (x, y)] (roi_items.PointROI, numpy.array(([(10., 15.)], [(20., 25.)]))), (roi_items.RectangleROI, numpy.array((((1., 10.), (11., 20.)), ((2., 3.), (12., 13.))))), (roi_items.PolygonROI, numpy.array((((0., 1.), (0., 10.), (10., 0.)), ((5., 6.), (5., 16.), (15., 6.))))), (roi_items.LineROI, numpy.array( (((10., 20.), (10., 30.)), ((30., 40.), (30., 50.))))), (roi_items.HorizontalLineROI, numpy.array( (((10., 20.), (10., 30.)), ((30., 40.), (30., 50.))))), (roi_items.VerticalLineROI, numpy.array( (((10., 20.), (10., 30.)), ((30., 40.), (30., 50.))))), (roi_items.HorizontalLineROI, numpy.array( (((10., 20.), (10., 30.)), ((30., 40.), (30., 50.))))), ) for roiClass, points in tests: with self.subTest(roiClass=roiClass): manager = roi.RegionOfInterestManager(self.plot) self.roiTableWidget.setRegionOfInterestManager(manager) manager.start(roiClass) self.assertEqual(manager.getRois(), ()) finishListener = SignalListener() manager.sigInteractiveModeFinished.connect(finishListener) changedListener = SignalListener() manager.sigRoiChanged.connect(changedListener) # Add a point r = roiClass() r.setFirstShapePoints(points[0]) manager.addRoi(r) self.qapp.processEvents() self.assertTrue(len(manager.getRois()), 1) self.assertEqual(changedListener.callCount(), 1) # Remove it manager.removeRoi(manager.getRois()[0]) self.assertEqual(manager.getRois(), ()) self.assertEqual(changedListener.callCount(), 2) # Add two point r = roiClass() r.setFirstShapePoints(points[0]) manager.addRoi(r) self.qapp.processEvents() r = roiClass() r.setFirstShapePoints(points[1]) manager.addRoi(r) self.qapp.processEvents() self.assertTrue(len(manager.getRois()), 2) self.assertEqual(changedListener.callCount(), 4) # Reset it result = manager.clear() self.assertTrue(result) self.assertEqual(manager.getRois(), ()) self.assertEqual(changedListener.callCount(), 5) changedListener.clear() # Add two point r = roiClass() r.setFirstShapePoints(points[0]) manager.addRoi(r) self.qapp.processEvents() r = roiClass() r.setFirstShapePoints(points[1]) manager.addRoi(r) self.qapp.processEvents() self.assertTrue(len(manager.getRois()), 2) self.assertEqual(changedListener.callCount(), 2) # stop result = manager.stop() self.assertTrue(result) self.assertTrue(len(manager.getRois()), 1) self.qapp.processEvents() self.assertEqual(finishListener.callCount(), 1) manager.clear()