def create_plot3d(data): window = SceneWindow() sceneWidget = window.getSceneWidget() #x, y, z = numpy.meshgrid(numpy.linspace(-10, 10, 64), # numpy.linspace(-10, 10, 64), # numpy.linspace(-10, 10, 64)) #data = numpy.sin(x * y * z) / (x * y * z) volume = sceneWidget.addVolume(data) volume.addIsosurface(0.4 * np.max(data), '#FF000080') return window
def __init__(self, parent=None): super(Detector3dDialog, self).__init__(parent=parent) self.setWindowTitle("Display sample stage") self.__plot = SceneWindow(self) self.__plot.setVisible(False) self.__process = qt.QProgressBar(self) self.__process.setFormat("Processing data") self.__process.setRange(0, 100) self.__buttons = qt.QDialogButtonBox(self) self.__buttons.addButton(qt.QDialogButtonBox.Cancel) self.__buttons.accepted.connect(self.accept) self.__buttons.rejected.connect(self.reject) layout = qt.QVBoxLayout(self) layout.addWidget(self.__plot) layout.addWidget(self.__process) layout.addWidget(self.__buttons)
def main(): global app app = qt.QApplication([]) # Create a SceneWindow window = SceneWindow() window.show() sceneWidget = window.getSceneWidget() scatter = items.Scatter3D() scatter.setSymbol(',') scatter.getColormap().setName('magma') sceneWidget.addItem(scatter) # Create the thread that calls submitToQtMainThread updateThread = UpdateScatterThread(scatter) updateThread.start() # Start updating the plot app.exec_() updateThread.stop() # Stop updating the plot
def main(): global app app = qt.QApplication([]) # Create a SceneWindow window = SceneWindow() window.show() sceneWidget = window.getSceneWidget() scatter = items.Scatter3D() scatter.setSymbol(',') scatter.getColormap().setName('magma') sceneWidget.addItem(scatter) # Create the thread that calls submitToQtMainThread updateThread = UpdateScatterThread(scatter) updateThread.start() # Start updating the plot app.exec_() updateThread.stop() # Stop updating the plot
def __init__(self, parent=None): super(Detector3dDialog, self).__init__(parent=parent) self.setWindowTitle("Display sample stage") self.__plot = SceneWindow(self) self.__plot.setVisible(False) self.__process = qt.QProgressBar(self) self.__process.setFormat("Processing data") self.__process.setRange(0, 100) self.__buttons = qt.QDialogButtonBox(self) self.__buttons.addButton(qt.QDialogButtonBox.Cancel) self.__buttons.accepted.connect(self.accept) self.__buttons.rejected.connect(self.reject) layout = qt.QVBoxLayout(self) layout.addWidget(self.__plot) layout.addWidget(self.__process) layout.addWidget(self.__buttons)
__date__ = "17/11/2017" import sys import numpy from silx.gui import qt from silx.gui.plot3d.SceneWindow import SceneWindow, items SIZE = 1024 # Create QApplication qapp = qt.QApplication([]) # Create a SceneWindow widget window = SceneWindow() # Get the SceneWidget contained in the window and set its colors sceneWidget = window.getSceneWidget() sceneWidget.setBackgroundColor((0.8, 0.8, 0.8, 1.)) sceneWidget.setForegroundColor((1., 1., 1., 1.)) sceneWidget.setTextColor((0.1, 0.1, 0.1, 1.)) # 2D Image ### # Add a dummy RGBA image img = numpy.random.random(3 * SIZE ** 2).reshape(SIZE, SIZE, 3) # Dummy image imageRgba = sceneWidget.addImage(img) # Add ImageRgba item to the scene
class Detector3dDialog(qt.QDialog): """Dialog to display a selected geometry """ def __init__(self, parent=None): super(Detector3dDialog, self).__init__(parent=parent) self.setWindowTitle("Display sample stage") self.__plot = SceneWindow(self) self.__plot.setVisible(False) self.__process = qt.QProgressBar(self) self.__process.setFormat("Processing data") self.__process.setRange(0, 100) self.__buttons = qt.QDialogButtonBox(self) self.__buttons.addButton(qt.QDialogButtonBox.Cancel) self.__buttons.accepted.connect(self.accept) self.__buttons.rejected.connect(self.reject) layout = qt.QVBoxLayout(self) layout.addWidget(self.__plot) layout.addWidget(self.__process) layout.addWidget(self.__buttons) def __detectorLoaded(self, thread): if thread.isAborted(): template = "<html>3D preview cancelled:<br/>%s</html>" message = template % html.escape(thread.errorString()) self.setVisible(False) qt.QMessageBox.critical(self, "Error", message) self.deleteLater() return self.__process.setVisible(False) self.__plot.setVisible(True) self.__buttons.clear() self.__buttons.addButton(qt.QDialogButtonBox.Close) self.adjustSize() sceneWidget = self.__plot.getSceneWidget() item = thread.getDetectorItem() sceneWidget.addItem(item) if thread.hasGeometry(): # Display the full sample stage item = thread.getBeamItem() sceneWidget.addItem(item) item = thread.getSampleItem() sceneWidget.addItem(item) sceneWidget.resetZoom(face="left") def __detectorLoading(self, percent): self.__process.setValue(percent) def setData(self, detector=None, image=None, mask=None, colormap=None, geometry=None): thread = CreateSceneThread(self) thread.setGeometry(geometry) thread.setDetector(detector) thread.setImage(image) thread.setMask(mask) thread.setColormap(colormap) thread.finished.connect( functools.partial(self.__detectorLoaded, thread)) thread.finished.connect(thread.deleteLater) thread.progressValue.connect(self.__detectorLoading) self.rejected.connect(thread.requestInterruption) thread.start()
def setUp(self): super(TestSceneWindow, self).setUp() self.window = SceneWindow() self.window.show() self.qWaitForWindowExposed(self.window)
class TestSceneWindow(TestCaseQt, ParametricTestCase): """Tests SceneWidget picking feature""" def setUp(self): super(TestSceneWindow, self).setUp() self.window = SceneWindow() self.window.show() self.qWaitForWindowExposed(self.window) def tearDown(self): self.qapp.processEvents() self.window.setAttribute(qt.Qt.WA_DeleteOnClose) self.window.close() del self.window super(TestSceneWindow, self).tearDown() def testAdd(self): """Test add basic scene primitive""" sceneWidget = self.window.getSceneWidget() items = [] # RGB image image = sceneWidget.addImage(numpy.random.random( 10*10*3).astype(numpy.float32).reshape(10, 10, 3)) image.setLabel('RGB image') items.append(image) self.assertEqual(sceneWidget.getItems(), tuple(items)) # Data image image = sceneWidget.addImage( numpy.arange(100, dtype=numpy.float32).reshape(10, 10)) image.setTranslation(10.) items.append(image) self.assertEqual(sceneWidget.getItems(), tuple(items)) # 2D scatter scatter = sceneWidget.add2DScatter( *numpy.random.random(3000).astype(numpy.float32).reshape(3, -1), index=0) scatter.setTranslation(0, 10) scatter.setScale(10, 10, 10) items.insert(0, scatter) self.assertEqual(sceneWidget.getItems(), tuple(items)) # 3D scatter scatter = sceneWidget.add3DScatter( *numpy.random.random(4000).astype(numpy.float32).reshape(4, -1)) scatter.setTranslation(10, 10) scatter.setScale(10, 10, 10) items.append(scatter) self.assertEqual(sceneWidget.getItems(), tuple(items)) # 3D array of float volume = sceneWidget.addVolume( numpy.arange(10**3, dtype=numpy.float32).reshape(10, 10, 10)) volume.setTranslation(0, 0, 10) volume.setRotation(45, (0, 0, 1)) volume.addIsosurface(500, 'red') volume.getCutPlanes()[0].getColormap().setName('viridis') items.append(volume) self.assertEqual(sceneWidget.getItems(), tuple(items)) # 3D array of complex volume = sceneWidget.addVolume( numpy.arange(10**3).reshape(10, 10, 10).astype(numpy.complex64)) volume.setTranslation(10, 0, 10) volume.setRotation(45, (0, 0, 1)) volume.setComplexMode(volume.ComplexMode.REAL) volume.addIsosurface(500, (1., 0., 0., .5)) items.append(volume) self.assertEqual(sceneWidget.getItems(), tuple(items)) sceneWidget.resetZoom('front') self.qapp.processEvents() def testHeightMap(self): """Test height map items""" sceneWidget = self.window.getSceneWidget() height = numpy.arange(10000).reshape(100, 100) /100. for shape in ((100, 100), (4, 5), (150, 20), (110, 110)): with self.subTest(shape=shape): items = [] # Colormapped data height map data = numpy.arange(numpy.prod(shape)).astype(numpy.float32).reshape(shape) heightmap = HeightMapData() heightmap.setData(height) heightmap.setColormappedData(data) heightmap.getColormap().setName('viridis') items.append(heightmap) sceneWidget.addItem(heightmap) # RGBA height map colors = numpy.zeros(shape + (3,), dtype=numpy.float32) colors[:, :, 1] = numpy.random.random(shape) heightmap = HeightMapRGBA() heightmap.setData(height) heightmap.setColorData(colors) heightmap.setTranslation(100., 0., 0.) items.append(heightmap) sceneWidget.addItem(heightmap) self.assertEqual(sceneWidget.getItems(), tuple(items)) sceneWidget.resetZoom('front') self.qapp.processEvents() sceneWidget.clearItems() def testChangeContent(self): """Test add/remove/clear items""" sceneWidget = self.window.getSceneWidget() items = [] # Add 2 images image = numpy.arange(100, dtype=numpy.float32).reshape(10, 10) items.append(sceneWidget.addImage(image)) items.append(sceneWidget.addImage(image)) self.qapp.processEvents() self.assertEqual(sceneWidget.getItems(), tuple(items)) # Clear sceneWidget.clearItems() self.qapp.processEvents() self.assertEqual(sceneWidget.getItems(), ()) # Add 2 images and remove first one image = numpy.arange(100, dtype=numpy.float32).reshape(10, 10) sceneWidget.addImage(image) items = (sceneWidget.addImage(image),) self.qapp.processEvents() sceneWidget.removeItem(sceneWidget.getItems()[0]) self.qapp.processEvents() self.assertEqual(sceneWidget.getItems(), items) def testColors(self): """Test setting scene colors""" sceneWidget = self.window.getSceneWidget() color = qt.QColor(128, 128, 128) sceneWidget.setBackgroundColor(color) self.assertEqual(sceneWidget.getBackgroundColor(), color) color = qt.QColor(0, 0, 0) sceneWidget.setForegroundColor(color) self.assertEqual(sceneWidget.getForegroundColor(), color) color = qt.QColor(255, 0, 0) sceneWidget.setTextColor(color) self.assertEqual(sceneWidget.getTextColor(), color) color = qt.QColor(0, 255, 0) sceneWidget.setHighlightColor(color) self.assertEqual(sceneWidget.getHighlightColor(), color) self.qapp.processEvents() def testInteractiveMode(self): """Test changing interactive mode""" sceneWidget = self.window.getSceneWidget() center = numpy.array((sceneWidget.width() //2, sceneWidget.height() // 2)) self.mouseMove(sceneWidget, pos=center) self.mouseClick(sceneWidget, qt.Qt.LeftButton, pos=center) volume = sceneWidget.addVolume( numpy.arange(10**3).astype(numpy.float32).reshape(10, 10, 10)) sceneWidget.selection().setCurrentItem( volume.getCutPlanes()[0]) sceneWidget.resetZoom('side') for mode in (None, 'rotate', 'pan', 'panSelectedPlane'): with self.subTest(mode=mode): sceneWidget.setInteractiveMode(mode) self.qapp.processEvents() self.assertEqual(sceneWidget.getInteractiveMode(), mode) self.mouseMove(sceneWidget, pos=center) self.mousePress(sceneWidget, qt.Qt.LeftButton, pos=center) self.mouseMove(sceneWidget, pos=center-10) self.mouseMove(sceneWidget, pos=center-20) self.mouseRelease(sceneWidget, qt.Qt.LeftButton, pos=center-20) self.keyPress(sceneWidget, qt.Qt.Key_Control) self.mouseMove(sceneWidget, pos=center) self.mousePress(sceneWidget, qt.Qt.LeftButton, pos=center) self.mouseMove(sceneWidget, pos=center-10) self.mouseMove(sceneWidget, pos=center-20) self.mouseRelease(sceneWidget, qt.Qt.LeftButton, pos=center-20) self.keyRelease(sceneWidget, qt.Qt.Key_Control)
import sys import numpy from silx.gui import qt from silx.gui.plot3d.SceneWindow import SceneWindow, items from silx.gui.plot3d.tools.PositionInfoWidget import PositionInfoWidget from silx.gui.widgets.BoxLayoutDockWidget import BoxLayoutDockWidget SIZE = 1024 # Create QApplication qapp = qt.QApplication([]) # Create a SceneWindow widget window = SceneWindow() # Get the SceneWidget contained in the window and set its colors sceneWidget = window.getSceneWidget() sceneWidget.setBackgroundColor((0.8, 0.8, 0.8, 1.)) sceneWidget.setForegroundColor((1., 1., 1., 1.)) sceneWidget.setTextColor((0.1, 0.1, 0.1, 1.)) # Add PositionInfoWidget to display picking info positionInfo = PositionInfoWidget() positionInfo.setSceneWidget(sceneWidget) dock = BoxLayoutDockWidget() dock.setWindowTitle("Selection Info") dock.setWidget(positionInfo) window.addDockWidget(qt.Qt.BottomDockWidgetArea, dock)
class Detector3dDialog(qt.QDialog): """Dialog to display a selected geometry """ def __init__(self, parent=None): super(Detector3dDialog, self).__init__(parent=parent) self.setWindowTitle("Display sample stage") self.__plot = SceneWindow(self) self.__plot.setVisible(False) self.__process = qt.QProgressBar(self) self.__process.setFormat("Processing data") self.__process.setRange(0, 100) self.__buttons = qt.QDialogButtonBox(self) self.__buttons.addButton(qt.QDialogButtonBox.Cancel) self.__buttons.accepted.connect(self.accept) self.__buttons.rejected.connect(self.reject) layout = qt.QVBoxLayout(self) layout.addWidget(self.__plot) layout.addWidget(self.__process) layout.addWidget(self.__buttons) def __detectorLoaded(self, thread): if thread.isAborted(): template = "<html>3D preview cancelled:<br/>%s</html>" message = template % html.escape(thread.errorString()) self.setVisible(False) qt.QMessageBox.critical(self, "Error", message) self.deleteLater() return self.__process.setVisible(False) self.__plot.setVisible(True) self.__buttons.clear() self.__buttons.addButton(qt.QDialogButtonBox.Close) self.adjustSize() sceneWidget = self.__plot.getSceneWidget() item = thread.getDetectorItem() sceneWidget.addItem(item) if thread.hasGeometry(): # Display the full sample stage item = thread.getBeamItem() sceneWidget.addItem(item) item = thread.getSampleItem() sceneWidget.addItem(item) sceneWidget.resetZoom(face="left") def __detectorLoading(self, percent): self.__process.setValue(percent) def setData(self, detector=None, image=None, mask=None, colormap=None, geometry=None): thread = CreateSceneThread(self) thread.setGeometry(geometry) thread.setDetector(detector) thread.setImage(image) thread.setMask(mask) thread.setColormap(colormap) thread.finished.connect(functools.partial(self.__detectorLoaded, thread)) thread.finished.connect(thread.deleteLater) thread.progressValue.connect(self.__detectorLoading) self.rejected.connect(thread.requestInterruption) thread.start()
import sys import numpy from silx.gui import qt from silx.gui.plot3d.SceneWindow import SceneWindow, items from silx.gui.plot3d.tools.PositionInfoWidget import PositionInfoWidget from silx.gui.widgets.BoxLayoutDockWidget import BoxLayoutDockWidget SIZE = 1024 # Create QApplication qapp = qt.QApplication.instance() or qt.QApplication([]) # Create a SceneWindow widget window = SceneWindow() # Get the SceneWidget contained in the window and set its colors sceneWidget = window.getSceneWidget() sceneWidget.setBackgroundColor((0.8, 0.8, 0.8, 1.)) sceneWidget.setForegroundColor((1., 1., 1., 1.)) sceneWidget.setTextColor((0.1, 0.1, 0.1, 1.)) # Add PositionInfoWidget to display picking info positionInfo = PositionInfoWidget() positionInfo.setSceneWidget(sceneWidget) dock = BoxLayoutDockWidget() dock.setWindowTitle("Selection Info") dock.setWidget(positionInfo) window.addDockWidget(qt.Qt.BottomDockWidgetArea, dock)