diff options
Diffstat (limited to 'examples/plot3dSceneWindow.py')
-rw-r--r-- | examples/plot3dSceneWindow.py | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/examples/plot3dSceneWindow.py b/examples/plot3dSceneWindow.py new file mode 100644 index 0000000..efffcd3 --- /dev/null +++ b/examples/plot3dSceneWindow.py @@ -0,0 +1,197 @@ +# coding: utf-8 +# /*########################################################################## +# +# Copyright (c) 2017-2018 European Synchrotron Radiation Facility +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# ###########################################################################*/ +""" +This script displays the different items of :class:`~silx.gui.plot3d.SceneWindow`. + +It shows the different visualizations of :class:`~silx.gui.plot3d.SceneWindow` +and :class:`~silx.gui.plot3d.SceneWidget`. +It illustrates the API to set those items. + +It features: + +- 2D images: data and RGBA images +- 2D scatter data, displayed either as markers, wireframe or surface. +- 3D scatter plot +- 3D scalar field with iso-surface and cutting plane. +- A clipping plane. + +""" + +from __future__ import absolute_import + +__authors__ = ["T. Vincent"] +__license__ = "MIT" +__date__ = "17/11/2017" + +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 + +# Set imageRgba transform +imageRgba.setTranslation(SIZE*.15, SIZE*.15, 0.) # Translate the image +# Rotate the image by 45 degrees around its center +imageRgba.setRotationCenter('center', 'center', 0.) +imageRgba.setRotation(45., axis=(0., 0., 1.)) +imageRgba.setScale(0.7, 0.7, 0.7) # Scale down image + + +# Add a data image +data = numpy.arange(SIZE ** 2).reshape(SIZE, SIZE) # Dummy data +imageData = sceneWidget.addImage(data) # Add ImageData item to the scene + +# Set imageData transform +imageData.setTranslation(0., SIZE, 0.) # Translate the image + +# Set imageData properties +imageData.setInterpolation('linear') # 'linear' or 'nearest' interpolation +imageData.getColormap().setName('magma') # Use magma colormap + + +# 2D scatter data ### + +# Create 2D scatter dummy data +x = numpy.random.random(10 ** 3) +y = numpy.random.random(len(x)) +values = numpy.exp(- 11. * ((x - .5) ** 2 + (y - .5) ** 2)) + +# Add 2D scatter data with 6 different visualisations +for row, heightMap in enumerate((False, True)): + for col, mode in enumerate(('points', 'lines', 'solid')): + # Add a new scatter + item = sceneWidget.add2DScatter(x, y, values) + + # Set 2D scatter item tranform + item.setTranslation(SIZE + col * SIZE, row * SIZE, 0.) + item.setScale(SIZE, SIZE, SIZE) + + # Set 2D scatter item properties + item.setHeightMap(heightMap) + item.setVisualization(mode) + item.getColormap().setName('viridis') + item.setLineWidth(2.) + + +# Group ### + +# Create a group item and add it to the scene +# The group children share the group transform +group = items.GroupItem() # Create a new group item +group.setTranslation(SIZE * 4, 0., 0.) # Translate the group + + +# Clipping plane ### + +# Add a clipping plane to the group (and thus to the scene) +# This item hides part of other items in the half space defined by the plane. +# Clipped items are those belonging to the same group (i.e., brothers) that +# comes after the clipping plane. +clipPlane = items.ClipPlane() # Create a new clipping plane item +clipPlane.setNormal((1., -0.35, 0.)) # Set its normal +clipPlane.setPoint((0., 0., 0.)) # Set a point on the plane +group.addItem(clipPlane) # Add clipping plane to the group + + +# 3D scatter data ### + +# Create dummy data +x = numpy.random.random(10**3) +y = numpy.random.random(len(x)) +z = numpy.random.random(len(x)) +values = numpy.random.random(len(x)) + +# Create a 3D scatter item and set its data +scatter3d = items.Scatter3D() +scatter3d.setData(x, y, z, values) + +# Set scatter3d transform +scatter3d.setScale(SIZE, SIZE, SIZE) + +# Set scatter3d properties +scatter3d.getColormap().setName('magma') # Use 'magma' colormap +scatter3d.setSymbol('d') # Use diamond markers +scatter3d.setSymbolSize(11) # Set the size of the markers + +# Add scatter3d to the group (and thus to the scene) +group.addItem(scatter3d) + + +# 3D scalar volume ### + +# Create dummy 3D array data +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) + +# Create a 3D scalar field item and set its data +volume = items.ScalarField3D() # Create a new 3D volume item +volume.setData(data) # Set its data +group.addItem(volume) # Add it to the group (and thus to the scene) + +# Set volume tranform +volume.setTranslation(0., SIZE, 0.) +volume.setScale(SIZE/data.shape[2], SIZE/data.shape[1], SIZE/data.shape[0]) + +# Add isosurfaces to the volume item given isolevel and color +volume.addIsosurface(0.2, '#FF000080') +volume.addIsosurface(0.5, '#0000FFFF') + +# Set the volume cut plane +cutPlane = volume.getCutPlanes()[0] # Get the volume's cut plane +cutPlane.setVisible(True) # Set it to be visible +cutPlane.getColormap().setName('jet') # Set cut plane's colormap +cutPlane.setNormal((0., 0., 1.)) # Set cut plane's normal +cutPlane.moveToCenter() # Place the cut plane at the center of the volume + +sceneWidget.addItem(group) # Add the group as an item of the scene + +# Show the SceneWidget widget +window.show() + +# Run Qt event loop +qapp.exec_() |