def test_new_shapes(qtbot): """Test adding new shapes layer.""" # Add labels to empty viewer viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) viewer.add_shapes() assert len(viewer.layers[0].data) == 0 assert len(viewer.layers) == 1 assert view.layers.vbox_layout.count() == 2 * len(viewer.layers) + 2 assert viewer.dims.ndim == 2 assert view.dims.nsliders == viewer.dims.ndim assert np.sum(view.dims._displayed_sliders) == 0 # Add points with image already present viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = np.random.random((10, 15)) viewer.add_image(data) viewer.add_shapes() assert len(viewer.layers[1].data) == 0 assert len(viewer.layers) == 2 assert view.layers.vbox_layout.count() == 2 * len(viewer.layers) + 2 assert viewer.dims.ndim == 2 assert view.dims.nsliders == viewer.dims.ndim assert np.sum(view.dims._displayed_sliders) == 0
def test_screenshot(qtbot): "Test taking a screenshot" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) # Add image data = np.random.random((10, 15)) viewer.add_image(data) # Add labels data = np.random.randint(20, size=(10, 15)) viewer.add_labels(data) # Add points data = 20 * np.random.random((10, 2)) viewer.add_points(data) # Add vectors data = 20 * np.random.random((10, 2, 2)) viewer.add_vectors(data) # Add shapes data = 20 * np.random.random((10, 4, 2)) viewer.add_shapes(data) # Take screenshot screenshot = view.screenshot() assert screenshot.ndim == 3
def test_add_layer(qtbot, layer_class, data, ndim): viewer = ViewerModel(ndisplay=ndim) view = QtViewer(viewer) qtbot.addWidget(view) add_layer_by_type(viewer, layer_class, data) check_viewer_functioning(viewer, view, data, ndim) view.shutdown()
def view(qtbot): """basic viewer with data that we will use a few times""" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = np.random.random((10, 10, 15)) viewer.add_image(data) yield view # Adding teardown code for fixture print("shutting down QtViewer") view.shutdown() return view
def test_qt_viewer(qtbot): """Test instantiating viewer.""" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) assert viewer.title == 'napari' assert view.viewer == viewer assert len(viewer.layers) == 0 assert view.layers.vbox_layout.count() == 2 assert viewer.dims.ndim == 2 assert view.dims.nsliders == viewer.dims.ndim assert np.sum(view.dims._displayed_sliders) == 0 view.shutdown()
def view(qtbot): """basic viewer with data that we will use a few times""" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = np.random.random((10, 10, 15)) viewer.add_image(data) return view
def test_qt_viewer_data_integrity(qtbot, dtype): """Test that the viewer doesn't change the underlying array.""" image = np.random.rand(10, 32, 32) image *= 200 if dtype.endswith('8') else 2**14 image = image.astype(dtype) imean = image.mean() viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) viewer.add_image(image.copy()) datamean = viewer.layers[0].data.mean() assert datamean == imean # toggle dimensions viewer.dims.ndisplay = 3 datamean = viewer.layers[0].data.mean() assert datamean == imean # back to 2D viewer.dims.ndisplay = 2 datamean = viewer.layers[0].data.mean() assert datamean == imean view.shutdown()
def test_add_labels(qtbot): """Test adding labels image.""" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = np.random.randint(20, size=(10, 15)) viewer.add_labels(data) assert np.all(viewer.layers[0].data == data) assert len(viewer.layers) == 1 assert view.layers.vbox_layout.count() == 2 * len(viewer.layers) + 2 assert viewer.dims.ndim == 2 assert view.dims.nsliders == viewer.dims.ndim assert np.sum(view.dims._displayed_sliders) == 0
def test_add_volume(qtbot): """Test adding volume.""" viewer = ViewerModel(ndisplay=3) view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = np.random.random((10, 15, 20)) viewer.add_image(data) assert np.all(viewer.layers[0].data == data) assert len(viewer.layers) == 1 assert view.layers.vbox_layout.count() == 2 * len(viewer.layers) + 2 assert viewer.dims.ndim == 3 assert view.dims.nsliders == viewer.dims.ndim assert np.sum(view.dims._displayed_sliders) == 0
def test_add_shapes(qtbot): """Test adding vectors.""" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = 20 * np.random.random((10, 4, 2)) viewer.add_shapes(data) assert np.all(viewer.layers[0].data == data) assert len(viewer.layers) == 1 assert view.layers.vbox_layout.count() == 2 * len(viewer.layers) + 2 assert viewer.dims.ndim == 2 assert view.dims.nsliders == viewer.dims.ndim assert np.sum(view.dims._displayed_sliders) == 0
def test_add_pyramid(qtbot): """Test adding image pyramid.""" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) shapes = [(40, 20), (20, 10), (10, 5)] np.random.seed(0) data = [np.random.random(s) for s in shapes] viewer.add_image(data, is_pyramid=True) assert np.all(viewer.layers[0].data == data) assert len(viewer.layers) == 1 assert view.layers.vbox_layout.count() == 2 * len(viewer.layers) + 2 assert viewer.dims.ndim == 2 assert view.dims.nsliders == viewer.dims.ndim assert np.sum(view.dims._displayed_sliders) == 0
def test_slice_labels(qtbot): viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = np.random.random((20, 10, 10)) viewer.add_image(data) # make sure the totslice_label is showing the correct number assert int(view.dims.slider_widgets[0].totslice_label.text()) == 19 # make sure setting the dims.point updates the slice label label_edit = view.dims.slider_widgets[0].curslice_label viewer.dims.set_point(0, 15) assert int(label_edit.text()) == 15 # make sure setting the current slice label updates the model label_edit.setText(str(8)) label_edit.editingFinished.emit() assert viewer.dims.point[0] == 8
def loadImage(self, index: QModelIndex) -> None: index = index.row() self.isBusy = True viewerWidget = self.splitter.widget(1) if isinstance(viewerWidget, QLabel): adjustWidget = self._createAdjustWidget(3) # need to load napari viewer here viewerModel = self.napariViewerModel = NapariViewerModel() viewerModel.theme = "light" napariViewer = QtViewer(viewerModel) napariViewer.setWindowFlags(Qt.Widget) self.napariViewer = napariViewer # create image viewer here imageViewer = QSplitter() imageViewer.setOrientation(Qt.Horizontal) imageViewer.setHandleWidth(12) imageViewer.addWidget(adjustWidget) imageViewer.addWidget(napariViewer) self.imageViewer = imageViewer self.splitter.replaceWidget(1, imageViewer) self.splitter.setSizes([200, 300]) image: Image = self.model.state.images[index] # set up block diagram editor blockName = image.block_name block = next( (block for block in self.model.state.blocks if block.name == blockName), None, ) if block is None: return blockDiagramEditorView = BlockDiagramEditorView( block, self.model.state.devices) blockDiagramEditorView.diagramWidget.setEnabled(False) if self.imageTableSplitter.count() == 1: self.imageTableSplitter.addWidget(blockDiagramEditorView) else: self.imageTableSplitter.replaceWidget(1, blockDiagramEditorView) self.imageTableSplitter.setSizes([200, 300]) # remove all layers; can't do directly layers = self.napariViewerModel.layers layers.select_all() layers.remove_selected() # unset all other images; TODO: does this actually help with memory usage? for im in self.model.state.images: im.pixels = None image.load(self.model.path) # add image name = image.relpath.name pixels = image.pixels pyramids = pixels.pyramids + ([pixels.background] if pixels.background else []) for pyramid in pyramids: scale = pyramid.mpp scale = (scale.y, scale.x) translate = pyramid.offset translate = (translate.y, translate.x) if pixels.file_format == "scn" and pixels.axes != "YXS": scale = (1, ) + scale translate = (0, ) + translate self.napariViewerModel.add_image(data=pyramid.layers, name=name, scale=scale, translate=translate) self.isBusy = False