summaryrefslogtreecommitdiff
path: root/doc/source
diff options
context:
space:
mode:
Diffstat (limited to 'doc/source')
-rw-r--r--doc/source/Tutorials/Image.ipynb52
-rw-r--r--doc/source/Tutorials/Sift/sift.ipynb66
-rw-r--r--doc/source/Tutorials/array_widget.rst4
-rw-r--r--doc/source/Tutorials/codec/Bitshuffle-LZ4.ipynb317
-rw-r--r--doc/source/Tutorials/fit.rst12
-rw-r--r--doc/source/Tutorials/fitconfig.rst4
-rw-r--r--doc/source/Tutorials/io.rst74
-rw-r--r--doc/source/Tutorials/writing_NXdata.rst8
-rw-r--r--doc/source/_static/navbar_icons/pypi.svg705
-rw-r--r--doc/source/_templates/version.html2
-rw-r--r--doc/source/applications/compare.rst40
-rw-r--r--doc/source/applications/img/silx-compare.pngbin0 -> 424032 bytes
-rw-r--r--doc/source/applications/index.rst6
-rw-r--r--doc/source/applications/view.rst51
-rw-r--r--doc/source/conf.py126
-rw-r--r--doc/source/ext/snapshotqt_directive.py245
-rw-r--r--doc/source/ext/sphinxext-archive.py54
-rw-r--r--doc/source/img/silx-view.gifbin0 -> 4939183 bytes
-rw-r--r--doc/source/index.rst165
-rw-r--r--doc/source/install.rst133
-rw-r--r--doc/source/license.rst12
-rw-r--r--doc/source/modules/gui/data/img/ArrayTableWidget.pngbin29088 -> 48408 bytes
-rw-r--r--doc/source/modules/gui/data/img/DataViewer.pngbin37627 -> 42376 bytes
-rw-r--r--doc/source/modules/gui/dialog/img/abstractdatafiledialog.svg1958
-rw-r--r--doc/source/modules/gui/gallery.rst115
-rw-r--r--doc/source/modules/gui/hdf5/getting_started.rst2
-rw-r--r--doc/source/modules/gui/icons.rst430
-rw-r--r--doc/source/modules/gui/plot/dev.rst1
-rw-r--r--doc/source/modules/gui/plot/getting_started.rst20
-rw-r--r--doc/source/modules/gui/plot/img/BasicGridStatsWidget.pngbin0 -> 13381 bytes
-rw-r--r--doc/source/modules/gui/plot/img/BasicStatsWidget.pngbin0 -> 9452 bytes
-rw-r--r--doc/source/modules/gui/plot/img/LimitsToolBar.pngbin2331 -> 21920 bytes
-rw-r--r--doc/source/modules/gui/plot/img/ROIStatsWidget.pngbin0 -> 7176 bytes
-rw-r--r--doc/source/modules/gui/plot/img/logColorbar.pngbin8575 -> 7855 bytes
-rw-r--r--doc/source/modules/gui/plot/index.rst10
-rw-r--r--doc/source/modules/gui/plot/items.rst31
-rw-r--r--doc/source/modules/gui/plot/plotsignal.rst1
-rw-r--r--doc/source/modules/gui/plot/plotwidget.rst4
-rw-r--r--doc/source/modules/gui/plot/roi.rst31
-rw-r--r--doc/source/modules/gui/plot/roistatswidget.rst24
-rw-r--r--doc/source/modules/gui/plot/statswidget.rst16
-rw-r--r--doc/source/modules/gui/plot/tools/img/CurveLegendsWidget.png (renamed from doc/source/modules/gui/plot/img/CurveLegendsWidget.png)bin30043 -> 30043 bytes
-rw-r--r--doc/source/modules/gui/plot/tools/img/linearColorbar.png (renamed from doc/source/modules/gui/plot/img/linearColorbar.png)bin6585 -> 6585 bytes
-rw-r--r--doc/source/modules/gui/plot/tools/index.rst (renamed from doc/source/modules/gui/plot/tools.rst)32
-rw-r--r--doc/source/modules/gui/plot/tools/profile.rst84
-rw-r--r--doc/source/modules/gui/plot/utils.rst12
-rw-r--r--doc/source/modules/gui/plot3d/glutils.rst10
-rw-r--r--doc/source/modules/gui/plot3d/img/SceneWidget.pngbin349485 -> 74504 bytes
-rw-r--r--doc/source/modules/gui/plot3d/items.rst27
-rw-r--r--doc/source/modules/gui/widgets/img/FrameBrowser.pngbin3731 -> 3379 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.pngbin4215 -> 2987 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/PeriodicCombo.pngbin3464 -> 2912 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/PeriodicList.pngbin12035 -> 27993 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/PeriodicTable.pngbin35124 -> 35882 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/RangeSlider.pngbin2686 -> 1024 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/TableWidget.pngbin4058 -> 3824 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/ThreadPoolPushButton.pngbin2729 -> 2383 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/WaitingPushButton.pngbin1962 -> 1148 bytes
-rw-r--r--doc/source/modules/gui/widgets/printpreview.rst4
-rw-r--r--doc/source/modules/image/index.rst2
-rw-r--r--doc/source/modules/image/shapes.rst4
-rw-r--r--doc/source/modules/index.rst2
-rw-r--r--doc/source/modules/io/commonh5.rst28
-rw-r--r--doc/source/modules/io/fioh5.rst27
-rw-r--r--doc/source/modules/io/h5py_utils.rst8
-rw-r--r--doc/source/modules/io/index.rst5
-rw-r--r--doc/source/modules/io/specfile.rst3
-rw-r--r--doc/source/modules/io/spech5.rst8
-rw-r--r--doc/source/modules/math/fit/functions.rst1
-rw-r--r--doc/source/modules/opencl/convolution.rst10
-rw-r--r--doc/source/modules/opencl/index.rst4
-rw-r--r--doc/source/modules/opencl/processing.rst10
-rw-r--r--doc/source/modules/opencl/sinofilter.rst9
-rw-r--r--doc/source/modules/opencl/statistics.rst10
-rw-r--r--doc/source/modules/utils/html.rst7
-rw-r--r--doc/source/modules/utils/index.rst2
-rw-r--r--doc/source/modules/utils/retry.rst7
-rw-r--r--doc/source/overview.rst21
-rw-r--r--doc/source/sample_code/img/compareBackends.pngbin0 -> 63046 bytes
-rw-r--r--doc/source/sample_code/img/compareImages.pngbin0 -> 33398 bytes
-rw-r--r--doc/source/sample_code/img/customSilxView.pngbin0 -> 93797 bytes
-rw-r--r--doc/source/sample_code/img/dropZones.pngbin0 -> 8182 bytes
-rw-r--r--doc/source/sample_code/img/exampleBaseline.pngbin0 -> 79266 bytes
-rw-r--r--doc/source/sample_code/img/findContours.pngbin0 -> 390630 bytes
-rw-r--r--doc/source/sample_code/img/floatedit.pngbin0 -> 4511 bytes
-rw-r--r--doc/source/sample_code/img/imageStack.pngbin0 -> 347747 bytes
-rw-r--r--doc/source/sample_code/img/plot3dUpdateScatterFromThread.pngbin0 -> 181775 bytes
-rw-r--r--doc/source/sample_code/img/plotCurveLegendWidget.pngbin0 -> 105797 bytes
-rw-r--r--doc/source/sample_code/img/plotProfile.pngbin0 -> 86902 bytes
-rw-r--r--doc/source/sample_code/img/plotROIStats.pngbin0 -> 167957 bytes
-rw-r--r--doc/source/sample_code/img/plotStats.pngbin0 -> 52815 bytes
-rw-r--r--doc/source/sample_code/img/plotUpdateImageFromGevent.pngbin0 -> 50938 bytes
-rw-r--r--doc/source/sample_code/img/scatterview.pngbin0 -> 73884 bytes
-rw-r--r--doc/source/sample_code/img/stackedprogressbar.pngbin0 -> 6508 bytes
-rw-r--r--doc/source/sample_code/img/syncPlotLocation.pngbin0 -> 178464 bytes
-rw-r--r--doc/source/sample_code/img/waiterOverlay.pngbin0 -> 41574 bytes
-rw-r--r--doc/source/sample_code/index.rst348
-rw-r--r--doc/source/troubleshooting.rst2
-rw-r--r--doc/source/tutorials.rst5
-rw-r--r--doc/source/user_guide.rst87
-rw-r--r--doc/source/virtualenv.rst97
101 files changed, 4895 insertions, 700 deletions
diff --git a/doc/source/Tutorials/Image.ipynb b/doc/source/Tutorials/Image.ipynb
index 5ddab38..cea6c31 100644
--- a/doc/source/Tutorials/Image.ipynb
+++ b/doc/source/Tutorials/Image.ipynb
@@ -52,14 +52,20 @@
],
"source": [
"import time, os\n",
+ "\n",
"start_time = time.time()\n",
"import silx\n",
- "print(\"Using silx version \",silx.version)\n",
+ "\n",
+ "print(\"Using silx version \", silx.version)\n",
"from silx.resources import ExternalResources\n",
- "downloader = ExternalResources(\"pyFAI\", \"http://www.silx.org/pub/pyFAI/testimages\", \"PYFAI_DATA\")\n",
+ "\n",
+ "downloader = ExternalResources(\n",
+ " \"pyFAI\", \"http://www.silx.org/pub/pyFAI/testimages\", \"PYFAI_DATA\"\n",
+ ")\n",
"fname = downloader.getfile(\"powder_200_2_0001.cbf\")\n",
"print(\"filename\", os.path.basename(fname))\n",
"import fabio\n",
+ "\n",
"nbins = 1000"
]
},
@@ -80,9 +86,9 @@
"source": [
"%%time\n",
"\n",
- "#Display an image and the histogram of values (in log scale)\n",
+ "# Display an image and the histogram of values (in log scale)\n",
"img = fabio.open(fname).data\n",
- "log_img = numpy.arcsinh(img) # arcsinh is well behaved log-like function\n",
+ "log_img = numpy.arcsinh(img) # arcsinh is well behaved log-like function\n",
"his, edges = numpy.histogram(log_img, nbins)"
]
},
@@ -895,10 +901,13 @@
}
],
"source": [
- "fig, ax = subplots(1,2,)\n",
- "center = (edges[1:] + edges[:-1])/2.0 # this is the center of the bins \n",
+ "fig, ax = subplots(\n",
+ " 1,\n",
+ " 2,\n",
+ ")\n",
+ "center = (edges[1:] + edges[:-1]) / 2.0 # this is the center of the bins\n",
"ax[1].imshow(log_img, cmap=\"inferno\")\n",
- "ax[0].plot(center,his)"
+ "ax[0].plot(center, his)"
]
},
{
@@ -924,17 +933,20 @@
"metadata": {},
"outputs": [],
"source": [
- "#switch this to \"CPU\" to have a fail safe \n",
+ "# switch this to \"CPU\" to have a fail safe\n",
"devicetype = \"GPU\"\n",
"from silx.opencl.codec.byte_offset import ByteOffset\n",
"from silx.opencl.image import ImageProcessing\n",
"import pyopencl, pyopencl.array, pyopencl.elementwise\n",
+ "\n",
"cbf = fabio.cbfimage.CbfImage()\n",
"bo = ByteOffset(os.path.getsize(fname), img.size, devicetype=devicetype)\n",
- "ash = pyopencl.elementwise.ElementwiseKernel(bo.ctx, \n",
- " arguments=\"float* data, float* res\", \n",
- " operation=\"res[i] = asinh(data[i])\", \n",
- " name='arcsinh_kernel')\n",
+ "ash = pyopencl.elementwise.ElementwiseKernel(\n",
+ " bo.ctx,\n",
+ " arguments=\"float* data, float* res\",\n",
+ " operation=\"res[i] = asinh(data[i])\",\n",
+ " name=\"arcsinh_kernel\",\n",
+ ")\n",
"ip = ImageProcessing(template=img, ctx=bo.ctx)\n",
"res = pyopencl.array.empty(bo.queue, img.shape, dtype=float32)"
]
@@ -954,11 +966,11 @@
}
],
"source": [
- "%%time \n",
+ "%%time\n",
"raw = cbf.read(fname, only_raw=True)\n",
"dec = bo(raw, as_float=True)\n",
"ash(dec, res)\n",
- "his, edges = ip.histogram(res, nbins, copy=False)\n",
+ "his, edges = ip.histogram(res, nbins, copy=False)\n",
"log_img = res.get()"
]
},
@@ -1771,10 +1783,13 @@
}
],
"source": [
- "fig, ax = subplots(1,2,)\n",
- "center = (edges[1:] + edges[:-1])/2.0 # this is the center of the bins \n",
+ "fig, ax = subplots(\n",
+ " 1,\n",
+ " 2,\n",
+ ")\n",
+ "center = (edges[1:] + edges[:-1]) / 2.0 # this is the center of the bins\n",
"ax[1].imshow(log_img, cmap=\"inferno\")\n",
- "ax[0].plot(center,his)"
+ "ax[0].plot(center, his)"
]
},
{
@@ -1826,9 +1841,10 @@
"raw = cbf.read(fname, only_raw=True)\n",
"dec = bo(raw, as_float=True)\n",
"ash(dec, res)\n",
- "his, edges = ip.histogram(res, nbins, copy=False)\n",
+ "his, edges = ip.histogram(res, nbins, copy=False)\n",
"log_img = res.get()\n",
"import os\n",
+ "\n",
"print(os.linesep.join(bo.log_profile()))\n",
"print(os.linesep.join(ip.log_profile()))"
]
diff --git a/doc/source/Tutorials/Sift/sift.ipynb b/doc/source/Tutorials/Sift/sift.ipynb
index 4b96aad..af880d4 100644
--- a/doc/source/Tutorials/Sift/sift.ipynb
+++ b/doc/source/Tutorials/Sift/sift.ipynb
@@ -43,6 +43,7 @@
],
"source": [
"import time\n",
+ "\n",
"start_time = time.time()\n",
"%pylab nbagg"
]
@@ -865,10 +866,12 @@
"source": [
"# display test image\n",
"import silx\n",
- "print(\"Silx version %s\"%silx.version)\n",
+ "\n",
+ "print(\"Silx version %s\" % silx.version)\n",
"\n",
"from PIL import Image\n",
"from silx.test.utils import utilstest\n",
+ "\n",
"path = utilstest.getfile(\"lena.png\")\n",
"image = numpy.asarray(Image.open(path))\n",
"fig, ax = subplots()\n",
@@ -891,15 +894,16 @@
}
],
"source": [
- "#Initialization of the sift object is time consuming: it compiles all the code.\n",
- "import os \n",
- "#set to 1 to see the compilation going on\n",
- "os.environ[\"PYOPENCL_COMPILER_OUTPUT\"] = \"0\" \n",
- "#switch to \"GPU\" to \"CPU\" to enable fail-save version.\n",
- "devicetype=\"GPU\"\n",
+ "# Initialization of the sift object is time consuming: it compiles all the code.\n",
+ "import os\n",
+ "\n",
+ "# set to 1 to see the compilation going on\n",
+ "os.environ[\"PYOPENCL_COMPILER_OUTPUT\"] = \"0\"\n",
+ "# switch to \"GPU\" to \"CPU\" to enable fail-save version.\n",
+ "devicetype = \"GPU\"\n",
"from silx.image import sift\n",
"\n",
- "%time sift_ocl = sift.SiftPlan(template=image, devicetype=devicetype) \n",
+ "%time sift_ocl = sift.SiftPlan(template=image, devicetype=devicetype)\n",
"\n",
"print(\"Device used for calculation: \", sift_ocl.ctx.devices[0].name)"
]
@@ -933,13 +937,15 @@
}
],
"source": [
- "print(\"Time for calculating the keypoints on one image of size %sx%s\"%image.shape[:2])\n",
+ "print(\"Time for calculating the keypoints on one image of size %sx%s\" % image.shape[:2])\n",
"%time keypoints = sift_ocl(image)\n",
- "print(\"Number of keypoints: %s\"%len(keypoints))\n",
+ "print(\"Number of keypoints: %s\" % len(keypoints))\n",
"print(\"Keypoint content:\")\n",
"print(keypoints.dtype)\n",
- "print(\"x: %.3f \\t y: %.3f \\t sigma: %.3f \\t angle: %.3f\" % \n",
- " (keypoints[-1].x,keypoints[-1].y,keypoints[-1].scale,keypoints[-1].angle))\n",
+ "print(\n",
+ " \"x: %.3f \\t y: %.3f \\t sigma: %.3f \\t angle: %.3f\"\n",
+ " % (keypoints[-1].x, keypoints[-1].y, keypoints[-1].scale, keypoints[-1].angle)\n",
+ ")\n",
"print(\"descriptor:\")\n",
"print(keypoints[-1].desc)"
]
@@ -1753,10 +1759,10 @@
}
],
"source": [
- "#Overlay keypoints on the image:\n",
+ "# Overlay keypoints on the image:\n",
"fig, ax = subplots()\n",
"ax.imshow(image)\n",
- "ax.plot(keypoints[:].x, keypoints[:].y,\".g\")"
+ "ax.plot(keypoints[:].x, keypoints[:].y, \".g\")"
]
},
{
@@ -2568,7 +2574,7 @@
}
],
"source": [
- "#Diplaying keypoints by scale:\n",
+ "# Diplaying keypoints by scale:\n",
"fig, ax = subplots()\n",
"ax.hist(keypoints[:].scale, 100)\n",
"ax.set_xlabel(\"scale\")"
@@ -3383,18 +3389,18 @@
}
],
"source": [
- "#One can see 3 groups of keypoints, boundaries at: 8 and 20. Let's display them using colors.\n",
+ "# One can see 3 groups of keypoints, boundaries at: 8 and 20. Let's display them using colors.\n",
"S = 8\n",
"L = 20\n",
- "tiny = keypoints[keypoints[:].scale<S]\n",
- "small = keypoints[numpy.logical_and(keypoints[:].scale<L,keypoints[:].scale>=S)]\n",
- "bigger = keypoints[keypoints[:].scale>=L]\n",
+ "tiny = keypoints[keypoints[:].scale < S]\n",
+ "small = keypoints[numpy.logical_and(keypoints[:].scale < L, keypoints[:].scale >= S)]\n",
+ "bigger = keypoints[keypoints[:].scale >= L]\n",
"\n",
"fig, ax = subplots()\n",
"ax.imshow(image, cmap=\"gray\")\n",
- "ax.plot(tiny[:].x, tiny[:].y,\",g\", label=\"tiny\")\n",
- "ax.plot(small[:].x, small[:].y,\".b\", label=\"small\")\n",
- "ax.plot(bigger[:].x, bigger[:].y,\"or\", label=\"large\")\n",
+ "ax.plot(tiny[:].x, tiny[:].y, \",g\", label=\"tiny\")\n",
+ "ax.plot(small[:].x, small[:].y, \".b\", label=\"small\")\n",
+ "ax.plot(bigger[:].x, bigger[:].y, \"or\", label=\"large\")\n",
"ax.legend()"
]
},
@@ -3417,7 +3423,7 @@
"outputs": [],
"source": [
"shifted = numpy.zeros_like(image)\n",
- "shifted[5:,8:] = image[:-5, :-8]\n",
+ "shifted[5:, 8:] = image[:-5, :-8]\n",
"shifted_points = sift_ocl(shifted)"
]
},
@@ -3442,9 +3448,16 @@
"source": [
"%time mp = sift.MatchPlan()\n",
"%time match = mp(keypoints, shifted_points)\n",
- "print(\"Number of Keypoints with for image 1 : %i, For image 2 : %i, Matching keypoints: %i\" % (keypoints.size, shifted_points.size, match.shape[0]))\n",
+ "print(\n",
+ " \"Number of Keypoints with for image 1 : %i, For image 2 : %i, Matching keypoints: %i\"\n",
+ " % (keypoints.size, shifted_points.size, match.shape[0])\n",
+ ")\n",
"from numpy import median\n",
- "print(\"Measured offsets dx: %.3f, dy: %.3f\"%(median(match[:,1].x-match[:,0].x),median(match[:,1].y-match[:,0].y)))"
+ "\n",
+ "print(\n",
+ " \"Measured offsets dx: %.3f, dy: %.3f\"\n",
+ " % (median(match[:, 1].x - match[:, 0].x), median(match[:, 1].y - match[:, 0].y))\n",
+ ")"
]
},
{
@@ -4258,9 +4271,10 @@
"source": [
"# Example of usage of the automatic alignment:\n",
"import scipy.ndimage\n",
+ "\n",
"rotated = scipy.ndimage.rotate(image, 20, reshape=False)\n",
"sa = sift.LinearAlign(image, devicetype=devicetype)\n",
- "fig,ax = subplots(1, 3, figsize=(9,3))\n",
+ "fig, ax = subplots(1, 3, figsize=(9, 3))\n",
"ax[0].imshow(image)\n",
"ax[0].set_title(\"original\")\n",
"ax[1].imshow(rotated)\n",
diff --git a/doc/source/Tutorials/array_widget.rst b/doc/source/Tutorials/array_widget.rst
index c6a32e3..b0bc890 100644
--- a/doc/source/Tutorials/array_widget.rst
+++ b/doc/source/Tutorials/array_widget.rst
@@ -23,7 +23,7 @@ Let's look at a simple usage example:
w = ArrayTableWidget()
w.setArrayData(array, labels=True)
w.show()
- app.exec_()
+ app.exec()
.. |imgArray0| image:: img/arraywidget3D_0.png
@@ -242,6 +242,6 @@ of RGB colors.
fgcolors=fcolors)
atw.show()
- app.exec_()
+ app.exec()
diff --git a/doc/source/Tutorials/codec/Bitshuffle-LZ4.ipynb b/doc/source/Tutorials/codec/Bitshuffle-LZ4.ipynb
new file mode 100644
index 0000000..f5ece05
--- /dev/null
+++ b/doc/source/Tutorials/codec/Bitshuffle-LZ4.ipynb
@@ -0,0 +1,317 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "ba432c39-a7a0-4c75-93f9-dcbd879ff5f5",
+ "metadata": {},
+ "source": [
+ "# Bitshuffle-LZ decompression on GPU\n",
+ "\n",
+ "This tutorial explains:\n",
+ "\n",
+ "* how to read a HDF5 dataset chunk-by-chunk using the direct-chunk-read feature \n",
+ "* how to perform the bitshuffle-LZ4 decompression on the GPU using OpenCL.\n",
+ "\n",
+ "It uses a stack of 100 frames collected at the ESRF BM29 beamline with a Pilatus 2M, during a HPLC experiment."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "529014bd-2265-4057-8538-1f2a810f7661",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "fdbaea8e-f713-4f89-8d93-586e8fd2fdac",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Version of silx used (should be 1.2): 1.2.0-a0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# some imports\n",
+ "import time\n",
+ "import h5py\n",
+ "import hdf5plugin\n",
+ "import numpy\n",
+ "from matplotlib.pyplot import subplots\n",
+ "from matplotlib.colors import LogNorm\n",
+ "import silx\n",
+ "from silx.resources import ExternalResources\n",
+ "from silx.opencl.codec.bitshuffle_lz4 import BitshuffleLz4\n",
+ "\n",
+ "start_time = time.perf_counter()\n",
+ "print(f\"Version of silx used (should be 1.2): {silx.version}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "a9337c85-cc22-4dd7-9a95-66634ec27432",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Download some data from internet:\n",
+ "filename = ExternalResources(\"silx\", \"http://www.silx.org/pub/silx\").getfile(\"hplc.h5\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "92a1f29a-4501-49e5-97ec-ad6067202492",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "dataset of shape (100, 1679, 1475) and dtype int32. Images look like:\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Display one frame:\n",
+ "fig, ax = subplots()\n",
+ "h = h5py.File(filename)\n",
+ "ds = h[\"/entry_0000/measurement/data\"]\n",
+ "ax.imshow(ds[0], norm=LogNorm())\n",
+ "print(f\"dataset of shape {ds.shape} and dtype {ds.dtype}. Images look like:\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "3a923d74-d164-4dc1-ab2b-2ba1fae6b027",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "696 ms ± 14.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# How long does it take to read all frames ?\n",
+ "%timeit for frame in ds: pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "6bf7abcb-87d8-4d52-9063-19ed2c0939b3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "29.3 ms ± 343 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "(0, 1358315)"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# How long does it take to read the raw data (uncompresed) ?\n",
+ "filter_mask, chunk = ds.id.read_direct_chunk(ds.id.get_chunk_info(0).chunk_offset)\n",
+ "%timeit for i in range(ds.id.get_num_chunks()): filter_mask, chunk = ds.id.read_direct_chunk(ds.id.get_chunk_info(i).chunk_offset)\n",
+ "filter_mask, len(chunk)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "d572e453-67e1-4cd5-9faf-aed1ef6ddbbe",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "cl.Array([14, 10, 13, ..., 2, 3, 2], dtype=int32)"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Setup the decompressor on the GPU:\n",
+ "gpu_lz = BitshuffleLz4(len(chunk), numpy.prod(ds.shape[1:]), ds.dtype)\n",
+ "gpu_lz.decompress(chunk)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "cc985465-78e3-43e9-a76d-a0c1452ede1e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, ax = subplots()\n",
+ "frame = gpu_lz.decompress(chunk).get().reshape(ds.shape[1:])\n",
+ "ax.imshow(gpu_lz.decompress(chunk).get().reshape(ds.shape[1:]), norm=LogNorm())\n",
+ "# Validate the decompression on the GPU gives actually the proper result\n",
+ "numpy.all(frame == ds[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "fe78c750-5e4a-45f9-848d-387050aef0bd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "112 ms ± 343 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%timeit\n",
+ "for i in range(ds.id.get_num_chunks()):\n",
+ " filter_mask, chunk = ds.id.read_direct_chunk(ds.id.get_chunk_info(i).chunk_offset)\n",
+ " gpu_lz.decompress(chunk, wg=128)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "66816e9d-d974-485f-9768-1f2f14661fb7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "OpenCL kernel profiling statistics in milliseconds for: BitshuffleLz4\n",
+ " Kernel name (count): min median max mean std\n",
+ " copy raw H -> D ( 100): 0.117 0.118 0.128 0.118 0.002\n",
+ " LZ4 unblock ( 100): 0.289 0.293 0.304 0.293 0.003\n",
+ " LZ4 decompress ( 100): 0.144 0.146 0.150 0.146 0.001\n",
+ "________________________________________________________________________________\n",
+ " Total OpenCL execution time : 55.774ms\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Some profiling information:\n",
+ "gpu_lz.set_profiling(True)\n",
+ "for i in range(ds.id.get_num_chunks()):\n",
+ " filter_mask, chunk = ds.id.read_direct_chunk(ds.id.get_chunk_info(i).chunk_offset)\n",
+ " gpu_lz.decompress(chunk, wg=128)\n",
+ "print(\"\\n\".join(gpu_lz.log_profile(stats=True)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "495d6274-fd39-41f9-aaac-c5c8cd8cba40",
+ "metadata": {},
+ "source": [
+ "## Conclusion\n",
+ "\n",
+ "A speed-up factor 6 has been observed which is mainly due to the (slow) parsing of the input to find the start of the LZ4 blocks. \n",
+ "The decompression and bit-unshuffling is comparatively fast !\n",
+ "This procedure is mainly worth when subsequent analysis takes place on the GPU, since it saves the time to send the decompressed array."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "b4ff76c0-c176-459a-9178-bb5448a102e1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Total run-time for the notebook 18.307s\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"Total run-time for the notebook {time.perf_counter()-start_time:.3f}s\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/doc/source/Tutorials/fit.rst b/doc/source/Tutorials/fit.rst
index b1b28e5..c0eafc5 100644
--- a/doc/source/Tutorials/fit.rst
+++ b/doc/source/Tutorials/fit.rst
@@ -234,7 +234,7 @@ the previous tutorial (See `Weighted fit`_)
from silx.math.fit.fitmanager import FitManager
# Create synthetic data with a sum of gaussian functions
- x = numpy.arange(1000).astype(numpy.float)
+ x = numpy.arange(1000).astype(numpy.float64)
y = 2.4 * x**4 - 10. * x**3 + 15.2 * x**2 - 24.6 * x + 150.
# define our fit function: a generic polynomial of degree 4
@@ -304,7 +304,7 @@ data, generated using another *silx* module: :mod:`silx.math.fit.functions`.
from silx.math.fit.fitmanager import FitManager
# Create synthetic data with a sum of gaussian functions
- x = numpy.arange(1000).astype(numpy.float)
+ x = numpy.arange(1000).astype(numpy.float64)
# height, center x, fwhm
p = [1000, 100., 250, # 1st peak
@@ -450,7 +450,7 @@ The following example illustrates the strip background removal process:
app = qt.QApplication([])
plot(x, y, x, actual_bg, x, strip_bg)
plot(x, y, x, (y - strip_bg))
- app.exec_()
+ app.exec()
.. |imgStrip1| image:: img/stripbg_plot1.png
:height: 300px
@@ -526,7 +526,7 @@ Simple usage
from silx.gui.fit import FitWidget
from silx.math.fit.functions import sum_gauss
- x = numpy.arange(2000).astype(numpy.float)
+ x = numpy.arange(2000).astype(numpy.float64)
constant_bg = 3.14
# gaussian parameters: height, position, fwhm
@@ -545,7 +545,7 @@ Simple usage
w.setData(x=x, y=y)
w.show()
- a.exec_()
+ a.exec()
.. |imgFitWidget1| image:: img/fitwidget1.png
:width: 300px
@@ -638,7 +638,7 @@ The :class:`FitWidget` can be initialised with a non-standard
fw = FitWidget(fitmngr=myfitmngr)
fw.show()
- a.exec_()
+ a.exec()
In our previous example, we didn't load a customised :class:`FitManager`,
therefore, the fit widget automatically initialised the default fit manager and
diff --git a/doc/source/Tutorials/fitconfig.rst b/doc/source/Tutorials/fitconfig.rst
index 225ef8f..0d7538c 100644
--- a/doc/source/Tutorials/fitconfig.rst
+++ b/doc/source/Tutorials/fitconfig.rst
@@ -52,7 +52,7 @@ dialog by FitWidget:
- :meth:`show`: should cause the widget to become visible to the
user)
- - :meth:`exec_`: should run while the user is interacting with the
+ - :meth:`exec`: should run while the user is interacting with the
widget, interrupting the rest of the program. It should
typically end (*return*) when the user clicks an *OK*
or a *Cancel* button.
@@ -175,7 +175,7 @@ used by our fit function to scale the *y* values.
fw.associateConfigDialog("scaled linear", CustomConfigWidget())
fw.show()
- app.exec_()
+ app.exec()
.. |img0| image:: img/custom_config_scale1.0.png
:height: 300px
diff --git a/doc/source/Tutorials/io.rst b/doc/source/Tutorials/io.rst
index 8b70e83..4c54bba 100644
--- a/doc/source/Tutorials/io.rst
+++ b/doc/source/Tutorials/io.rst
@@ -72,6 +72,19 @@ It exposes an HDF5 group as a python object that resembles a python
dictionary and an HDF5 dataset or attribute as an object that resembles a
numpy array.
+
+silx.io.h5py_utils
+++++++++++++++++++
+
+The *h5py* library does not support concurrent HDF5 reading and writing in
+different processes in a convenient way. SWMR does not allow adding groups,
+datasets and attributes during writing. In addition SWMR does not work on
+network file systems.
+
+The module :mod:`silx.io.h5py_utils` provides utility methods for reading
+an HDF5 file that is being modified by another process without SWMR.
+
+
API description
---------------
@@ -279,6 +292,67 @@ inside its context manager:
maxPhi = sf["2.1/measurement/Phi"][...].max()
+Concurrent HDF5
++++++++++++++++
+
+When reading an HDF5 file that is being written to, exceptions
+can be raised when opening the file or reading data. The only
+solution is to retry opening and reading until it succeeds.
+
+For example to process all top-level groups of an HDF5 file:
+
+.. code-block:: python
+
+ import silx.io.h5py_utils
+
+ @silx.io.h5py_utils.retry()
+ def process_scan(filename, name):
+ """The method will be executed again if
+ any HDF5 IO fails.
+ """
+ with silx.io.h5py_utils.File(filename) as h5file:
+ scan = h5file[name]
+ I0 = scan["measurement/I0"][()]
+ It = scan["measurement/It"][()]
+ return It/I0
+
+ scans = silx.io.h5py_utils.safe_top_level_names("myfile.h5")
+
+ for name in scans:
+ result = process_scan("myfile.h5", name)
+
+Note that the method with the `retry` decorator has to be idempotent
+as it can be executed several times for one call.
+
+An equivalent decorator exists for context managers
+
+.. code-block:: python
+
+ import silx.io.h5py_utils
+
+ @silx.io.h5py_utils.retry_contextmanager()
+ def measurement_context(filename, name):
+ """The method will be entered again if
+ any HDF5 IO fails.
+ """
+ with silx.io.h5py_utils.File(filename) as h5file:
+ yield h5file[name]["measurement"]
+
+Generator functions need to have a `start_index` parameter
+
+.. code-block:: python
+
+ import silx.io.h5py_utils
+
+ @silx.io.h5py_utils.retry()
+ def iter_measurement(filename, names, start_index=0):
+ """The method will be iterated again if any HDF5
+ IO fails, possibly with a different start index.
+ """
+ with silx.io.h5py_utils.File(filename) as h5file:
+ for name in names[start_index:]:
+ yield h5file[name]["measurement"]
+
Additional resources
--------------------
diff --git a/doc/source/Tutorials/writing_NXdata.rst b/doc/source/Tutorials/writing_NXdata.rst
index 1c65199..e59eb36 100644
--- a/doc/source/Tutorials/writing_NXdata.rst
+++ b/doc/source/Tutorials/writing_NXdata.rst
@@ -154,8 +154,7 @@ a *frame number*.
.. note::
- This additional attribute is not mentionned in the official NXdata
- specification.
+ This attribute is documented in the official NeXus `description <https://manual.nexusformat.org/nxdl_desc.html>`_
Writing NXdata with h5py
@@ -175,10 +174,7 @@ the *h5py* library.
import sys
# this is needed for writing arrays of utf-8 strings with h5py
- if sys.version_info < (3,):
- text_dtype = h5py.special_dtype(vlen=unicode)
- else:
- text_dtype = h5py.special_dtype(vlen=str)
+ text_dtype = h5py.special_dtype(vlen=str)
filename = "./myfile.h5"
h5f = h5py.File(filename, "w")
diff --git a/doc/source/_static/navbar_icons/pypi.svg b/doc/source/_static/navbar_icons/pypi.svg
new file mode 100644
index 0000000..095a3f9
--- /dev/null
+++ b/doc/source/_static/navbar_icons/pypi.svg
@@ -0,0 +1,705 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="65.812"
+ height="58"
+ version="1.1"
+ id="svg276"
+ sodipodi:docname="pypi.svg"
+ inkscape:export-filename="pypi.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs280" />
+ <sodipodi:namedview
+ id="namedview278"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ showgrid="false"
+ inkscape:zoom="4.0689655"
+ inkscape:cx="14.377119"
+ inkscape:cy="29"
+ inkscape:window-width="1920"
+ inkscape:window-height="1131"
+ inkscape:window-x="0"
+ inkscape:window-y="32"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg276" />
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g14">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -156.012) scale(2.92733)"
+ id="path2" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -156.012) scale(2.92733)"
+ id="path4" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -156.012) scale(2.92733)"
+ id="path6" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -156.012) scale(2.92733)"
+ id="path8" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#fff;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -156.012) scale(2.92733)"
+ id="path10" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -156.012) scale(2.92733)"
+ id="path12" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g28">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -163.673) scale(2.92733)"
+ id="path16" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -163.673) scale(2.92733)"
+ id="path18" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -163.673) scale(2.92733)"
+ id="path20" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -163.673) scale(2.92733)"
+ id="path22" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#fff;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -163.673) scale(2.92733)"
+ id="path24" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -163.673) scale(2.92733)"
+ id="path26" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g42">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(555.014 -141.542) scale(2.92733)"
+ id="path30" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(555.014 -141.542) scale(2.92733)"
+ id="path32" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(555.014 -141.542) scale(2.92733)"
+ id="path34" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(555.014 -141.542) scale(2.92733)"
+ id="path36" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#fff;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(555.014 -141.542) scale(2.92733)"
+ id="path38" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(555.014 -141.542) scale(2.92733)"
+ id="path40" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g56">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -138.137) scale(2.92733)"
+ id="path44" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -138.137) scale(2.92733)"
+ id="path46" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -138.137) scale(2.92733)"
+ id="path48" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -138.137) scale(2.92733)"
+ id="path50" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#fff;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -138.137) scale(2.92733)"
+ id="path52" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -138.137) scale(2.92733)"
+ id="path54" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g70">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -149.203) scale(2.92733)"
+ id="path58" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -149.203) scale(2.92733)"
+ id="path60" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(564.377 -149.203) scale(2.92733)"
+ id="path62" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -149.203) scale(2.92733)"
+ id="path64" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#fff;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -149.203) scale(2.92733)"
+ id="path66" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(564.377 -149.203) scale(2.92733)"
+ id="path68" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g84">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -144.947) scale(2.92733)"
+ id="path72" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -144.947) scale(2.92733)"
+ id="path74" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -144.947) scale(2.92733)"
+ id="path76" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -144.947) scale(2.92733)"
+ id="path78" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#fff;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -144.947) scale(2.92733)"
+ id="path80" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -144.947) scale(2.92733)"
+ id="path82" />
+ </g>
+ <g
+ transform="translate(-1683.66 -513.275) scale(.65177)"
+ id="g102">
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g98">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(3492.218 570.342) scale(4.49135)"
+ id="path86" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(3492.218 570.342) scale(4.49135)"
+ id="path88" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(3492.218 570.342) scale(4.49135)"
+ id="path90" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(3492.218 570.342) scale(4.49135)"
+ id="path92" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#ffd242;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(3492.218 570.342) scale(4.49135)"
+ id="path94" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(3492.218 570.342) scale(4.49135)"
+ id="path96" />
+ </g>
+ <circle
+ cx="2835.218"
+ cy="1823.899"
+ r="2.967"
+ style="fill:#fff;fill-opacity:1"
+ transform="skewY(-20) scale(.9397 1)"
+ id="circle100" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g116">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -138.137) scale(2.92733)"
+ id="path104" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -138.137) scale(2.92733)"
+ id="path106" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -138.137) scale(2.92733)"
+ id="path108" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -138.137) scale(2.92733)"
+ id="path110" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#ffd242;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -138.137) scale(2.92733)"
+ id="path112" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -138.137) scale(2.92733)"
+ id="path114" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g130">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -134.732) scale(2.92733)"
+ id="path118" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -134.732) scale(2.92733)"
+ id="path120" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -134.732) scale(2.92733)"
+ id="path122" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -134.732) scale(2.92733)"
+ id="path124" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#fff;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -134.732) scale(2.92733)"
+ id="path126" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -134.732) scale(2.92733)"
+ id="path128" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g144">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -156.012) scale(2.92733)"
+ id="path132" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -156.012) scale(2.92733)"
+ id="path134" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -156.012) scale(2.92733)"
+ id="path136" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -156.012) scale(2.92733)"
+ id="path138" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#ffd242;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -156.012) scale(2.92733)"
+ id="path140" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -156.012) scale(2.92733)"
+ id="path142" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g158">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -167.078) scale(2.92733)"
+ id="path146" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -167.078) scale(2.92733)"
+ id="path148" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(601.83 -167.078) scale(2.92733)"
+ id="path150" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#ffc91d;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -167.078) scale(2.92733)"
+ id="path152" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#ffd242;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -167.078) scale(2.92733)"
+ id="path154" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(601.83 -167.078) scale(2.92733)"
+ id="path156" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g172">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -152.608) scale(2.92733)"
+ id="path160" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -152.608) scale(2.92733)"
+ id="path162" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -152.608) scale(2.92733)"
+ id="path164" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -152.608) scale(2.92733)"
+ id="path166" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#ffd242;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -152.608) scale(2.92733)"
+ id="path168" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -152.608) scale(2.92733)"
+ id="path170" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g186">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -163.673) scale(2.92733)"
+ id="path174" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -163.673) scale(2.92733)"
+ id="path176" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -163.673) scale(2.92733)"
+ id="path178" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -163.673) scale(2.92733)"
+ id="path180" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#3775a9;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -163.673) scale(2.92733)"
+ id="path182" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -163.673) scale(2.92733)"
+ id="path184" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g200">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -174.739) scale(2.92733)"
+ id="path188" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -174.739) scale(2.92733)"
+ id="path190" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(592.467 -174.739) scale(2.92733)"
+ id="path192" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#2f6491;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -174.739) scale(2.92733)"
+ id="path194" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#3775a9;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -174.739) scale(2.92733)"
+ id="path196" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(592.467 -174.739) scale(2.92733)"
+ id="path198" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g214">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -149.203) scale(2.92733)"
+ id="path202" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -149.203) scale(2.92733)"
+ id="path204" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -149.203) scale(2.92733)"
+ id="path206" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -149.203) scale(2.92733)"
+ id="path208" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#ffd242;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -149.203) scale(2.92733)"
+ id="path210" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -149.203) scale(2.92733)"
+ id="path212" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g228">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -160.268) scale(2.92733)"
+ id="path216" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -160.268) scale(2.92733)"
+ id="path218" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(583.104 -160.268) scale(2.92733)"
+ id="path220" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -160.268) scale(2.92733)"
+ id="path222" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#3775a9;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -160.268) scale(2.92733)"
+ id="path224" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#efeeea;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(583.104 -160.268) scale(2.92733)"
+ id="path226" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g242">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -145.798) scale(2.92733)"
+ id="path230" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -145.798) scale(2.92733)"
+ id="path232" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -145.798) scale(2.92733)"
+ id="path234" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#f7f7f4;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -145.798) scale(2.92733)"
+ id="path236" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#3775a9;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -145.798) scale(2.92733)"
+ id="path238" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#2f6491;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -145.798) scale(2.92733)"
+ id="path240" />
+ </g>
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g256">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -156.864) scale(2.92733)"
+ id="path244" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -156.864) scale(2.92733)"
+ id="path246" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(573.74 -156.864) scale(2.92733)"
+ id="path248" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#2f6491;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -156.864) scale(2.92733)"
+ id="path250" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#3775a9;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -156.864) scale(2.92733)"
+ id="path252" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#2f6491;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(573.74 -156.864) scale(2.92733)"
+ id="path254" />
+ </g>
+ <g
+ transform="translate(-1683.66 -513.275) scale(.65177)"
+ id="g274">
+ <g
+ style="fill:#a29d86;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g270">
+ <path
+ d="m-186.329 59.726 3.185 1.16v3.742l-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#e9e9ff;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(3477.852 524.633) scale(4.49135)"
+ id="path258" />
+ <path
+ d="M-189.56 60.903v3.743l3.231-1.177v-3.743z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#353564;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(3477.852 524.633) scale(4.49135)"
+ id="path260" />
+ <path
+ d="m-189.56 64.646 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="color:#000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000;solid-opacity:1;fill:#afafde;fill-opacity:1;fill-rule:nonzero;stroke:#ccc;stroke-width:.07269443;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="translate(3477.852 524.633) scale(4.49135)"
+ id="path262" />
+ <path
+ d="m-189.56 60.903 3.184 1.159 3.232-1.177-3.185-1.159z"
+ style="fill:#2f6491;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(3477.852 524.633) scale(4.49135)"
+ id="path264" />
+ <path
+ d="M-186.376 62.062v3.743l3.232-1.177v-3.743z"
+ style="fill:#3775a9;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(3477.852 524.633) scale(4.49135)"
+ id="path266" />
+ <path
+ d="m-189.56 60.903 3.184 1.159v3.743l-3.185-1.16z"
+ style="fill:#2f6491;fill-opacity:1;stroke:#ccc;stroke-width:.07269443;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(3477.852 524.633) scale(4.49135)"
+ id="path268" />
+ </g>
+ <circle
+ cx="2816.017"
+ cy="1772.922"
+ r="2.967"
+ style="fill:#fff;fill-opacity:1"
+ transform="skewY(-20) scale(.9397 1)"
+ id="circle272" />
+ </g>
+</svg>
diff --git a/doc/source/_templates/version.html b/doc/source/_templates/version.html
new file mode 100644
index 0000000..1b7d33f
--- /dev/null
+++ b/doc/source/_templates/version.html
@@ -0,0 +1,2 @@
+<!-- This will display the version of the docs -->
+{{ version }} \ No newline at end of file
diff --git a/doc/source/applications/compare.rst b/doc/source/applications/compare.rst
new file mode 100644
index 0000000..4175eae
--- /dev/null
+++ b/doc/source/applications/compare.rst
@@ -0,0 +1,40 @@
+.. _silx compare:
+
+silx compare
+============
+
+Purpose
+-------
+
+The *silx compare* command provides a graphical user interface to compare 2D data from files.
+
+It displays a list of datasets, and allows to open multiple datasets.
+This list can be updated with drag and drop from silx view.
+
+
+.. |imgViewImg| image:: img/silx-compare.png
+ :height: 300px
+ :align: middle
+
+
+Usage
+-----
+
+::
+
+ silx compare [-h] [--debug] [--use-opengl-plot] [files [files ...]]
+
+
+Options
+-------
+
+ -h, --help show this help message and exit
+ --debug Set logging system in debug mode
+ --use-opengl-plot Use OpenGL for plots (instead of matplotlib)
+
+Examples of usage
+-----------------
+
+::
+
+ silx compare "silx://ID16B_diatomee.h5?path=/scan1/instrument/data&slice=0" "silx://ID16B_diatomee.h5?path=/scan1/instrument/data&slice=1"
diff --git a/doc/source/applications/img/silx-compare.png b/doc/source/applications/img/silx-compare.png
new file mode 100644
index 0000000..bbd2117
--- /dev/null
+++ b/doc/source/applications/img/silx-compare.png
Binary files differ
diff --git a/doc/source/applications/index.rst b/doc/source/applications/index.rst
index 2601e2c..fd3552a 100644
--- a/doc/source/applications/index.rst
+++ b/doc/source/applications/index.rst
@@ -1,6 +1,7 @@
+.. _Applications:
-Applications documentation
-==========================
+Applications
+============
While *silx* is first and foremost a Python library to be used by developers,
a set of command line applications is provided to use some key features of
@@ -15,3 +16,4 @@ To see the list of all available commands, type the following command in a termi
view
convert
+ compare
diff --git a/doc/source/applications/view.rst b/doc/source/applications/view.rst
index 694f95d..05e38b9 100644
--- a/doc/source/applications/view.rst
+++ b/doc/source/applications/view.rst
@@ -1,7 +1,11 @@
+.. _silx view:
silx view
=========
+.. figure:: http://www.silx.org/doc/silx/img/silx-view-v1-0.gif
+ :align: center
+
Purpose
-------
@@ -37,24 +41,59 @@ and to view this data in plot widgets or in simple table views.
Usage
-----
-::
+.. code-block:: none
- silx view [-h] [--debug] [--use-opengl-plot] [files [files ...]]
+ silx view [-h] [--slices SLICES [SLICES ...]] [--debug] [--use-opengl-plot] [-f] [--hdf5-file-locking] [files ...]
Options
-------
- -h, --help Show this help message and exit
- --debug Set logging system in debug mode
- --use-opengl-plot Use OpenGL for plots (instead of matplotlib)
+.. code-block:: none
+ -h, --help show this help message and exit
+ --slices SLICES [SLICES ...]
+ List of slice indices to open (Only for dataset)
+ --debug Set logging system in debug mode
+ --use-opengl-plot Use OpenGL for plots (instead of matplotlib)
+ -f, --fresh Start the application using new fresh user preferences
+ --hdf5-file-locking Start the application with HDF5 file locking enabled (it is disabled by
+ default)
Examples of usage
-----------------
-::
+Open file(s)
+............
+
+.. code-block:: none
silx view 31oct98.dat
silx view *.edf
silx view myfile.h5
+
+
+Open HDF5 dataset(s)
+....................
+
+Using the HDF5 path to the dataset:
+
+.. code-block:: none
+
+ silx view my_hdf5_file.h5::entry/instrument/detector/data
+
+Using wildcard:
+
+.. code-block:: none
+
+ silx view my_hdf5_file.h5::entry/*/data
+
+
+Open HDF5 dataset slices
+........................
+
+Open first and last slices of datasets:
+
+.. code-block:: none
+
+ silx view my_hdf5_file.h5::entry/*/data --slices 0 -1
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 532f6bf..1f421fe 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -1,6 +1,5 @@
-# -*- coding: utf-8 -*-
# /*##########################################################################
-# Copyright (C) 2015-2017 European Synchrotron Radiation Facility
+# Copyright (C) 2015-2023 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
@@ -32,35 +31,27 @@ autogenerated file.
All configuration values have a default; values that are commented out
serve to show the default."""
-import sys
+import importlib
import os
-import os.path
-import glob
-import subprocess
+import sys
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# sys.path.insert(0, os.path.abspath('.'))
-project = u'silx'
-try:
- import silx
- project_dir = os.path.abspath(os.path.join(__file__, "..", "..", ".."))
- build_dir = os.path.abspath(silx.__file__)
- if not build_dir.startswith(project_dir):
- raise RuntimeError("%s looks to come from the system. Fix your PYTHONPATH and restart sphinx." % project)
-except ImportError:
- raise RuntimeError("%s is not on the path. Fix your PYTHONPATH and restart sphinx." % project)
+project = "silx"
+import silx
# Disable deprecation warnings:
# It avoid to spam documentation logs with deprecation warnings.
# If we want to generate the documentation of deprecated features it should
# not make the logs durty.
from silx.utils.deprecation import depreclog
+
depreclog.disabled = 1
# Add local sphinx extension directory
-sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'ext'))
+sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "ext"))
# -- General configuration -----------------------------------------------------
@@ -70,34 +61,45 @@ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'ext'))
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
- 'sphinx.ext.autodoc',
- 'sphinx.ext.coverage',
- 'sphinx.ext.mathjax',
- 'sphinx.ext.viewcode',
- 'sphinx.ext.doctest',
- 'sphinxext-archive',
- 'nbsphinx'
-
+ "sphinx.ext.autodoc",
+ "sphinx.ext.coverage",
+ "sphinx.ext.mathjax",
+ "sphinx.ext.viewcode",
+ "sphinx.ext.doctest",
+ "sphinx.ext.inheritance_diagram",
+ "sphinx_panels",
+ "sphinxext-archive",
+ "snapshotqt_directive",
+ "nbsphinx",
]
-autodoc_member_order = 'bysource'
+if importlib.util.find_spec("sphinx_autodoc_typehints"):
+ extensions.append("sphinx_autodoc_typehints")
+
+ always_document_param_types = True
+
+autodoc_member_order = "bysource"
# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ["_templates"]
# The suffix of source filenames.
-source_suffix = '.rst'
+source_suffix = ".rst"
# The encoding of source files.
# source_encoding = 'utf-8-sig'
# The master toctree document.
-master_doc = 'index'
+master_doc = "index"
# General information about the project.
from silx._version import strictversion, version, __date__ as _date
+
year = _date.split("/")[-1]
-copyright = u'2015-%s, Data analysis unit, European Synchrotron Radiation Facility, Grenoble' % year
+copyright = (
+ "2015-%s, Data analysis unit, European Synchrotron Radiation Facility, Grenoble"
+ % year
+)
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -108,6 +110,16 @@ copyright = u'2015-%s, Data analysis unit, European Synchrotron Radiation Facili
# The full version, including alpha/beta/rc tags.
release = strictversion
+# Substitutions defined for all pages
+rst_prolog = f"""
+.. |silx_installer_btn| replace::
+ .. link-button:: https://github.com/silx-kit/silx/releases/download/v{release}/silx-{release}-windows-installer-x86_64.exe
+ :classes: btn-success
+ :text: Download Windows installer
+
+.. |silx_archive| replace:: :download:`silx ZIP archive <https://github.com/silx-kit/silx/releases/download/v{release}/silx-{release}-windows-application.zip>`
+"""
+
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
# language = None
@@ -137,7 +149,7 @@ add_module_names = False
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = "sphinx"
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
@@ -152,12 +164,33 @@ mathjax_path = 'file:///usr/share/javascript/mathjax/MathJax.js?config=TeX-AMS-M
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
-html_theme = 'default'
+html_theme = "pydata_sphinx_theme"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
-# html_theme_options = {}
+html_theme_options = {
+ "icon_links": [
+ {
+ "name": "GitHub",
+ "url": "https://github.com/silx-kit/silx",
+ "icon": "fa-brands fa-github",
+ },
+ {
+ "name": "PyPI",
+ "url": "https://pypi.org/project/silx",
+ "icon": "_static/navbar_icons/pypi.svg",
+ "type": "local",
+ },
+ ],
+ "show_toc_level": 1,
+ "navbar_align": "left",
+ "show_version_warning_banner": True,
+ "navbar_start": ["navbar-logo", "version"],
+ "navbar_center": ["navbar-nav"],
+ "footer_start": ["copyright"],
+ "footer_center": ["sphinx-version"],
+}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
@@ -181,7 +214,7 @@ html_favicon = "img/silx.ico"
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
-# html_static_path = []
+html_static_path = ["_static"]
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
@@ -225,19 +258,17 @@ html_favicon = "img/silx.ico"
# html_file_suffix = None
# Output file base name for HTML help builder.
-htmlhelp_basename = 'silxdoc'
+htmlhelp_basename = "silxdoc"
# -- Options for LaTeX output --------------------------------------------------
-latex_elements = {'papersize': 'a4paper',
- 'pointsize': '10pt'}
+latex_elements = {"papersize": "a4paper", "pointsize": "10pt"}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
- ('index', 'silx.tex', u'silx Documentation',
- u'Data analysis unit', 'manual'),
+ ("index", "silx.tex", "silx Documentation", "Data analysis unit", "manual"),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -265,10 +296,7 @@ latex_logo = "img/silx_large.png"
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
-man_pages = [
- ('index', 'silx', u'silx Documentation',
- [u'Data analysis unit'], 1)
-]
+man_pages = [("index", "silx", "silx Documentation", ["Data analysis unit"], 1)]
# If true, show URL addresses after external links.
# man_show_urls = False
@@ -280,9 +308,15 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- ('index', 'silx', u'silx Documentation',
- u'Data analysis unit', 'silx', 'One line description of project.',
- 'Miscellaneous'),
+ (
+ "index",
+ "silx",
+ "silx Documentation",
+ "Data analysis unit",
+ "silx",
+ "One line description of project.",
+ "Miscellaneous",
+ ),
]
# Documents to append as an appendix to all manuals.
@@ -295,4 +329,4 @@ texinfo_documents = [
# texinfo_show_urls = 'footnote'
# Do not test code in >>> by default
-doctest_test_doctest_blocks = ''
+doctest_test_doctest_blocks = ""
diff --git a/doc/source/ext/snapshotqt_directive.py b/doc/source/ext/snapshotqt_directive.py
new file mode 100644
index 0000000..ab7ae1b
--- /dev/null
+++ b/doc/source/ext/snapshotqt_directive.py
@@ -0,0 +1,245 @@
+# /*##########################################################################
+#
+# Copyright (c) 2004-2019 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.
+#
+# ###########################################################################*/
+"""RST directive to include snapshot of a Qt application in Sphinx doc.
+
+Configuration variable in conf.py:
+
+- snapshotqt_image_type: image file extension (default 'png').
+- snapshotqt_script_dir: relative path of the root directory for scripts from
+ the documentation source directory (i.e., the directory of conf.py)
+ (default: '..').
+"""
+
+__authors__ = ["H. Payno", "T. Vincent"]
+__license__ = "MIT"
+__date__ = "07/12/2018"
+
+import os
+import logging
+import sys
+from docutils.parsers.rst.directives.images import Image
+from docutils.parsers.rst import directives
+
+# from docutils.par
+# note: conf.py is patching the PATH so this will be the 'current' qt version
+
+home = os.path.abspath(os.path.join(__file__, "..", "..", "..", ".."))
+
+
+if not os.environ.get("DIRECTIVE_SNAPSHOT_QT") == "True":
+ """
+ In case we don't wan't to regenerate screenshot, simply apply Figure
+ directive
+ """
+
+ class SnapshotQtDirective(Image):
+ option_spec = Image.option_spec.copy()
+ option_spec["script"] = directives.unchanged
+ has_content = True
+
+ def run(self):
+ self.options["figwidth"] = "image"
+ self.content = []
+
+ # Create an image filename from arguments
+ return Image.run(self)
+
+ def makescreenshot(*args, **kwargs):
+ raise RuntimeError(
+ "not defined without env variable SILX_GENERATE_SCREENSHOT set to True"
+ )
+
+ def setup(app):
+ app.add_config_value("snapshotqt_image_type", "png", "env")
+ app.add_config_value("snapshotqt_script_dir", "..", "env")
+ app.add_directive("snapshotqt", SnapshotQtDirective)
+ return {"version": "0.1"}
+
+else:
+ from silx.gui import qt
+
+ logging.basicConfig()
+ _logger = logging.getLogger(__name__)
+
+ # RST directive ###############################################################
+
+ class SnapshotQtDirective(Image):
+ """Image of a Qt application snapshot.
+
+ Directive Type: "snapshotqt"
+ Doctree Elements: As for figure
+ Directive Arguments: One or more, required (script URI + script arguments).
+ Directive Options: Possible.
+ Directive Content: Interpreted as the figure caption and optional legend.
+
+ A "snapshotqt" is a rst `figure
+ <http://docutils.sourceforge.net/docs/ref/rst/directives.html#figure>`_
+ that is generated from a Python script that uses Qt.
+
+ The path of the script to take a snapshot is relative to
+ the path given in conf.py 'snapshotqt_script_dir' value.
+
+ ::
+
+ .. snapshotqt: img/demo.py
+ :align: center
+ :height: 5cm
+
+ source code
+
+
+ you can also define a snapshot from a script, using the :script: option
+ .. note:: on this path are given from the project root level
+
+ ::
+ .. snapshotqt: img/demo.py
+ :align: center
+ :height: 5cm
+ :script: myscript.py
+ """
+
+ option_spec = Image.option_spec.copy()
+ option_spec["script"] = directives.unchanged
+ has_content = True
+
+ def run(self):
+ assert len(self.arguments) > 0
+ # Run script stored in arguments and replace by snapshot filename
+ script = self.options.pop("script", None)
+ env = self.state.document.settings.env
+
+ image_ext = env.config.snapshotqt_image_type.lower()
+ script_name = self.arguments[0].replace(image_ext, "py")
+ output_script = os.path.join(env.app.outdir, script_name)
+
+ image_file_source_path = env.relfn2path(self.arguments[0])[0]
+ image_file_source_path = os.path.join(
+ home, env.srcdir, image_file_source_path
+ )
+
+ def createNeededDirs(_dir):
+ parentDir = os.path.dirname(_dir)
+ if parentDir not in ("", os.sep):
+ createNeededDirs(parentDir)
+ if os.path.exists(_dir) is False:
+ os.mkdir(_dir)
+
+ createNeededDirs(os.path.dirname(output_script))
+
+ has_source_code = not (self.content is None or len(self.content) == 0)
+ if has_source_code:
+ with open(output_script, "w") as _file:
+ _file.write("# from silx.gui import qt\n")
+ _file.write("# app = qt.QApplication([])\n")
+ for _line in self.content:
+ _towrite = _line.lstrip(" ")
+ if not _towrite.startswith(":"):
+ _file.write(_towrite + "\n")
+ _file.write("app.exec()")
+ self.content = []
+ if script is not None:
+ _logger.warning(
+ "Cannot specify a script if source code (content) is given."
+ "Ignore script option"
+ )
+ makescreenshot(
+ script_or_module=output_script, filename=image_file_source_path
+ )
+ else:
+ # script
+ if script is None:
+ _logger.warning(
+ "no source code or script defined in the snapshot"
+ "directive, fail to generate a screenshot"
+ )
+ else:
+ script_path = os.path.join(home, script)
+ makescreenshot(
+ script_or_module=script_path, filename=image_file_source_path
+ )
+
+ #
+ # Use created image as in Figure
+ return super(SnapshotQtDirective, self).run()
+
+ def setup(app):
+ app.add_config_value("snapshotqt_image_type", "png", "env")
+ app.add_config_value("snapshotqt_script_dir", "..", "env")
+ app.add_directive("snapshotqt", SnapshotQtDirective)
+ return {"version": "0.1"}
+
+ # screensImageFileDialogH5.hot function ########################################################
+
+ def makescreenshot(script_or_module, filename):
+ _logger.info(
+ "generate screenshot for %s from %s, binding is %s"
+ "" % (filename, script_or_module, qt.BINDING)
+ )
+
+ def grabWindow(winID):
+ screen = qt.QApplication.primaryScreen()
+ return screen.grabWindow(winID)
+
+ global _count
+ _count = 15
+ global _TIMEOUT
+ _TIMEOUT = 1000.0 # in ms
+ app = qt.QApplication.instance() or qt.QApplication([])
+ _logger.debug("Using Qt bindings: %s", qt)
+
+ def _grabActiveWindowAndClose():
+ global _count
+ activeWindow = qt.QApplication.activeWindow()
+ if activeWindow is not None:
+ if activeWindow.isVisible():
+ # hot fix since issue with pySide2 API
+ if qt.BINDING == "PySide2":
+ pixmap = activeWindow.grab()
+ else:
+ pixmap = grabWindow(activeWindow.winId())
+ saveOK = pixmap.save(filename)
+ if not saveOK:
+ _logger.error("Cannot save snapshot to %s", filename)
+ else:
+ _logger.error("activeWindow is not visible.")
+ app.quit()
+ else:
+ _count -= 1
+ if _count > 0:
+ # Only restart a timer if everything is OK
+ qt.QTimer.singleShot(_TIMEOUT, _grabActiveWindowAndClose)
+ else:
+ app.quit()
+ raise TimeoutError(
+ "Aborted: It took too long to have an active window."
+ )
+
+ script_or_module = os.path.abspath(script_or_module)
+
+ sys.argv = [script_or_module]
+ sys.path.append(os.path.abspath(os.path.dirname(script_or_module)))
+ qt.QTimer.singleShot(_TIMEOUT, _grabActiveWindowAndClose)
+ with open(script_or_module) as f:
+ code = compile(f.read(), script_or_module, "exec")
+ exec(code, globals(), locals())
diff --git a/doc/source/ext/sphinxext-archive.py b/doc/source/ext/sphinxext-archive.py
index dc1c2c8..68d9637 100644
--- a/doc/source/ext/sphinxext-archive.py
+++ b/doc/source/ext/sphinxext-archive.py
@@ -1,4 +1,3 @@
-# coding: utf-8
# /*##########################################################################
#
# Copyright (c) 2017 European Synchrotron Radiation Facility
@@ -73,6 +72,7 @@ _logger = logging.getLogger(__name__)
# docutils directive
+
class ArchiveDirective(Directive):
"""Add a link to download an archive
@@ -84,40 +84,44 @@ class ArchiveDirective(Directive):
optional_arguments = 0
final_argument_whitespace = False
option_spec = {
- 'filename': directives.unchanged,
- 'filter': directives.unchanged,
- 'basedir': directives.unchanged,
+ "filename": directives.unchanged,
+ "filter": directives.unchanged,
+ "basedir": directives.unchanged,
}
def run(self):
- node = archive('')
+ node = archive("")
# Get rst source file containing this directive
source_file = self.state_machine.get_source_and_line()[0]
if source_file is None:
- raise RuntimeError('Cannot get rst source file path')
+ raise RuntimeError("Cannot get rst source file path")
# Build input path from rst source file and directive argument
input_path = self.arguments[0]
- if not input_path.startswith('/'): # Argument is a relative path
+ if not input_path.startswith("/"): # Argument is a relative path
input_path = os.path.abspath(
- os.path.join(os.path.dirname(source_file), input_path))
- node['input_path'] = input_path
+ os.path.join(os.path.dirname(source_file), input_path)
+ )
+ node["input_path"] = input_path
default_basedir = os.path.basename(input_path)
- node['basedir'] = self.options.get('basedir', default_basedir)
- node['filename'] = self.options.get('filename',
- '.'.join((default_basedir, 'zip')))
+ node["basedir"] = self.options.get("basedir", default_basedir)
+ node["filename"] = self.options.get(
+ "filename", ".".join((default_basedir, "zip"))
+ )
- node['filter'] = self.options.get('filter', '*.*')
+ node["filter"] = self.options.get("filter", "*.*")
return [node]
# archive doctuils node
+
class archive(docutils.nodes.General, docutils.nodes.Element, docutils.nodes.Inline):
"""archive node created by :class:`ArchiveDirective`"""
+
pass
@@ -128,17 +132,17 @@ def visit_archive_html(self, node):
:param node: The :class:`archive` node to translate to HTML
:raise: SkipNode as depart is not implemented
"""
- filename = node['filename']
- input_path = node['input_path']
+ filename = node["filename"]
+ input_path = node["input_path"]
# Create a temporary folder to create archive content
tmp_dir = tempfile.mkdtemp()
# Copy selected content to temporary folder
- base_dir = os.path.join(tmp_dir, node['basedir'])
+ base_dir = os.path.join(tmp_dir, node["basedir"])
def ignore(src, names):
- patterns = node['filter'].split()
+ patterns = node["filter"].split()
ignored_names = []
for name in names:
for pattern in patterns:
@@ -151,11 +155,10 @@ def visit_archive_html(self, node):
shutil.copytree(input_path, base_dir, ignore=ignore)
# Compress temporary folder to zip
- output_filename = os.path.join(
- self.builder.outdir, '_downloads', filename)
+ output_filename = os.path.join(self.builder.outdir, "_downloads", filename)
root, ext = os.path.splitext(output_filename)
- assert ext == '.zip'
- shutil.make_archive(root, 'zip', tmp_dir, node['basedir'])
+ assert ext == ".zip"
+ shutil.make_archive(root, "zip", tmp_dir, node["basedir"])
# Clean-up temporary folder
shutil.rmtree(tmp_dir)
@@ -173,12 +176,11 @@ def visit_skip(self, node):
# Extension setup
+
def setup(app):
"""Sphinx extension registration"""
- app.add_node(archive,
- html=(visit_archive_html, None),
- latex=(visit_skip, None))
+ app.add_node(archive, html=(visit_archive_html, None), latex=(visit_skip, None))
- app.add_directive('archive', ArchiveDirective)
+ app.add_directive("archive", ArchiveDirective)
- return {'version': '0.1'}
+ return {"version": "0.1"}
diff --git a/doc/source/img/silx-view.gif b/doc/source/img/silx-view.gif
new file mode 100644
index 0000000..f622c04
--- /dev/null
+++ b/doc/source/img/silx-view.gif
Binary files differ
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 1c4ad72..d7e99cd 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -1,84 +1,133 @@
silx |version|
==============
-The silx project aims to provide a collection of Python packages to support the
+.. toctree::
+ :hidden:
+
+ user_guide.rst
+ applications/index.rst
+ tutorials.rst
+ modules/index.rst
+ changelog.rst
+
+silx provides applications and Python modules to support the
development of data assessment, reduction and analysis at synchrotron radiation
facilities.
-It intends to provide reading/writing tools for different file formats, data
+It provides reading/writing tools for different file formats, data
reduction routines and a set of Qt widgets to browse and visualise data.
-Silx can be cited by its DOIs referenced on
-`Zenodo <https://doi.org/10.5281/zenodo.591709>`_.
-The current version (v\ |version|) caters for:
+:ref:`Installation`
+-------------------
-* Supporting `HDF5 <https://www.hdfgroup.org/HDF5/>`_,
- `SPEC <https://certif.com/spec.html>`_ and
- `FabIO <http://www.silx.org/doc/fabio/dev/getting_started.html#list-of-file-formats-that-fabio-can-read-and-write>`_
- images file formats.
-* OpenCL-based data processing: image alignment (SIFT),
- image processing (median filter, histogram),
- filtered backprojection for tomography
-* Data reduction: histogramming, fitting, median filter
-* A set of Qt widgets, including:
+You can install **silx** via `pip <https://pypi.org/project/pip>`_, `conda <https://docs.conda.io>`_ or on Linux with the following commands:
- * 1D and 2D visualization widgets with a set of associated tools using multiple backends (matplotlib or OpenGL)
- * OpenGL-based widgets to visualize data in 3D (scalar field with isosurface and cut plane, scatter plot)
- * a unified browser for HDF5, SPEC and image file formats supporting inspection and
- visualization of n-dimensional datasets.
+.. tabbed:: pip
-* a set of applications:
+ .. code-block:: bash
- * a unified viewer (*silx view filename*) for HDF5, SPEC and image file formats
- * a unified converter to HDF5 format (*silx convert filename*)
+ pip install silx[full]
+.. tabbed:: conda
-.. toctree::
- :hidden:
+ .. code-block:: bash
- overview.rst
- install.rst
- description/index.rst
- tutorials.rst
- modules/index.rst
- applications/index.rst
- changelog.rst
- license.rst
- virtualenv.rst
- troubleshooting.rst
+ conda install -c conda-forge silx
+
+.. tabbed:: Debian & Ubuntu
+
+ .. code-block:: bash
+
+ sudo apt-get install silx
+
+|silx_installer_btn| or decompress the |silx_archive|.
+
+:ref:`Applications`
+-------------------
+
+.. panels::
+
+ :column: col-lg-12
+ :body: text-center
+
+ **silx view**
+ ^^^^^^^^^^^^^
+
+ .. image:: img/silx-view.gif
+
+ .. link-button:: applications/view
+ :type: ref
+ :text: Unified viewer supporting HDF5, SPEC and image file formats
+ :classes: stretched-link
+
+ ---
+
+ **silx compare**
+ ^^^^^^^^^^^^^^^^
+
+ .. image:: applications/img/silx-compare.png
+
+ .. link-button:: applications/compare
+ :type: ref
+ :text: User interface to compare 2D data from files
+ :classes: stretched-link
+
+ ---
+
+ **silx convert**
+ ^^^^^^^^^^^^^^^^
+
+ .. link-button:: applications/convert
+ :type: ref
+ :text: Converter of legacy file formats into HDF5 file
+ :classes: stretched-link
+
+:ref:`Python modules<API Reference>`
+------------------------------------
+
+.. panels::
+
+ **silx.gui**
+ ^^^^^^^^^^^^
-:doc:`overview`
- Releases, repository, issue tracker, mailing list, ...
+ .. link-button:: modules/gui/index
+ :type: ref
+ :text: Qt widgets:
+ :classes: stretched-link
-:doc:`install`
- How to install *silx* on Linux, Windows and MacOS X
+ * 1D and 2D visualization widgets and associated tools
+ * OpenGL-based 3D visualization widgets
+ * a unified HDF5, SPEC and image data file browser and n-dimensional dataset viewer
-:doc:`description/index`
- Description of the different algorithms and their implementation
+ ---
-:doc:`tutorials`
- Tutorials and sample code
+ **silx.opencl**
+ ^^^^^^^^^^^^^^^
-:doc:`modules/index`
- Documentation of the packages included in *silx*
+ .. link-button:: modules/opencl/index
+ :type: ref
+ :text: OpenCL-based data processing:
+ :classes: stretched-link
-:doc:`applications/index`
- Documentation of the applications provided by *silx*
+ * Image alignment (SIFT)
+ * Image processing (median filter, histogram)
+ * Filtered backprojection for tomography
-:doc:`modules/gui/gallery`
- Widgets gallery and screenshots
+ ---
-:doc:`changelog`
- List of changes between releases
+ **silx.io**
+ ^^^^^^^^^^^
-:doc:`license`
- License and copyright information
+ .. link-button:: modules/io/index
+ :type: ref
+ :text: Supporting HDF5, SPEC and FabIO images file formats
+ :classes: stretched-link
-:doc:`troubleshooting`
- When things do not work as expected
+ ---
-Indices
-=======
+ **silx.math**
+ ^^^^^^^^^^^^^
-* :ref:`modindex`
-* :ref:`search`
-* :ref:`genindex`
+ .. link-button:: modules/math/index
+ :type: ref
+ :text: Data reduction: histogramming, fitting, median filter
+ :classes: stretched-link
diff --git a/doc/source/install.rst b/doc/source/install.rst
index 7941a7b..a551b18 100644
--- a/doc/source/install.rst
+++ b/doc/source/install.rst
@@ -1,21 +1,22 @@
+.. _Installation:
-Installation steps
-==================
+Installation
+============
*silx* supports most operating systems and different versions of the Python
programming language.
This table summarizes the support matrix of silx:
-+------------+--------------+---------------------+
-| System | Python vers. | Qt and its bindings |
-+------------+--------------+---------------------+
-| `Windows`_ | 3.5, 3.6-3.7 | PyQt5.6+, PySide2 |
-+------------+--------------+---------------------+
-| `MacOS`_ | 2.7, 3.5-3.7 | PyQt5.6+, PySide2 |
-+------------+--------------+---------------------+
-| `Linux`_ | 2.7, 3.4-3.7 | PyQt5.3+, PySide2 |
-+------------+--------------+---------------------+
++------------+--------------+--------------------------------+
+| System | Python vers. | Qt and its bindings |
++------------+--------------+--------------------------------+
+| `Windows`_ | 3.7-3.10 | PyQt5.9+, PySide6.4+, PyQt6.3+ |
++------------+--------------+--------------------------------+
+| `MacOS`_ | 3.7-3.10 | PyQt5.9+, PySide6.4+, PyQt6.3+ |
++------------+--------------+--------------------------------+
+| `Linux`_ | 3.7-3.10 | PyQt5.9+, PySide6.4+, PyQt6.3+ |
++------------+--------------+--------------------------------+
For the description of *silx* dependencies, see the Dependencies_ section.
@@ -66,42 +67,32 @@ The mandatory dependencies are:
The GUI widgets depend on the following extra packages:
* A Qt binding: either `PyQt5 <https://riverbankcomputing.com/software/pyqt/intro>`_,
- or `PySide2 <https://wiki.qt.io/Qt_for_Python>`_
+ `PySide6 <https://pypi.org/project/PySide6/>`_ or
+ `PyQt6 <https://pypi.org/project/PyQt6/>`_
* `matplotlib <http://matplotlib.org/>`_
* `PyOpenGL <http://pyopengl.sourceforge.net/>`_
-* `qt_console <https://pypi.python.org/pypi/qtconsole>`_
+* `qt_console <https://pypi.org/project/qtconsole>`_
for the ``silx.gui.console`` widget.
* `dateutil <https://pypi.org/project/python-dateutil/>`_
-Tools for reading and writing files depend on the following packages:
-
-* `h5py <http://docs.h5py.org/en/latest/build.html>`_ for HDF5 files
-* `fabio <https://github.com/silx-kit/fabio>`_ for multiple image formats
-
*silx.opencl* further depends on OpenCL and the following packages too :
* `pyopencl <https://mathema.tician.de/software/pyopencl/>`_
* `Mako <http://www.makotemplates.org/>`_
The complete list of dependencies with the minimal version is described in the
-`requirement.txt <https://github.com/silx-kit/silx/blob/0.8/requirements.txt>`_
+`requirement.txt <https://github.com/silx-kit/silx/blob/master/requirements.txt>`_
at the top level of the source package.
Build dependencies
++++++++++++++++++
In addition to run-time dependencies, building *silx* requires a C/C++ compiler,
-`numpy <http://www.numpy.org/>`_ and `cython <http://cython.org>`_ (optional).
-
-On Windows it is recommended to use Python 3.5, because with previous versions
-of Python, it might be difficult to compile extensions (i.e. binary modules).
-
-This project uses Cython (version > 0.21) to generate C files.
-Cython is mandatory to build *silx* from the development branch.
+`numpy <http://www.numpy.org/>`_ and `cython <http://cython.org>`_.
The complete list of dependencies for building the package, including its
documentation, is described in the
-`requirement-dev.txt <https://github.com/silx-kit/silx/blob/0.8/requirements-dev.txt>`_
+`requirement-dev.txt <https://github.com/silx-kit/silx/blob/master/requirements-dev.txt>`_
at the top level of the source package.
@@ -110,7 +101,7 @@ Linux
Packages are available for a few distributions:
-- Debian 8: see `Installing a Debian package`_.
+- Debian/Ubuntu: see `Installing a Debian package`_.
- `CentOS 7 RPM packages <http://pubrepo.maxiv.lu.se/rpm/el7/x86_64/>`_ provided by the Max IV institute at Lund, Sweden.
- `Fedora 23 rpm packages <http://pubrepo.maxiv.lu.se/rpm/fc23/x86_64/>`_ provided by the Max IV institute at Lund, Sweden.
- `Arch Linux (AUR) package <https://aur.archlinux.org/packages/python-silx>`_ provided by Leonid Bloch.
@@ -125,35 +116,24 @@ You can also follow one of those installation procedures:
Installing a Debian package
+++++++++++++++++++++++++++
-Debian 8 (Jessie) packages are available on http://www.silx.org/pub/debian/ for amd64 computers.
-To install it, you need to download this file :
+silx is officially packaged in `Debian <https://packages.debian.org/search?searchon=names&keywords=silx>`_
+and `Ubuntu <https://packages.ubuntu.com/search?keywords=silx&searchon=names&suite=all&section=all>`_.
-.. code-block:: bash
-
- http://www.silx.org/pub/debian/silx.list
-
-and copy it into the /etc/apt/source.list.d folder.
-Then run ``apt-get update`` and ``apt-get install python-silx``
-
-.. code-block:: bash
+To install it, run `apt-get install silx` as root.
+The `python3-silx` package provides the library, while the `silx` package provides the executable (`silx view`, `silx convert`, ...).
- wget http://www.silx.org/pub/debian/silx.list
- sudo cp silx.list /etc/apt/sources.list.d
- sudo apt-get update
- sudo apt-get install python-silx python3-silx silx
-
-The `python-silx` and `python3-silx` packages provide the library,
-while the `silx` package provides the executable (`silx view`, `silx convert` ...).
+Unofficial (possibly more recent) packages are available for Debian 10 (Buster, amd64) and Ubuntu 20.04 (Focal, amd64 and ppc64le) in this repository: http://www.silx.org/pub/linux-repo/.
+See information on `how-to use this repository <http://www.silx.org/pub/linux-repo/>`_ before running `apt-get install silx`.
.. note::
- The packages are built automatically, hence not signed.
- You have to accept the installation of non-signed packages.
+ Those packages are built automatically, hence not signed.
+ You have to accept the installation of non-signed packages.
If the packages are not installed, it might be due to the priority list.
-You can display the priority list using `apt-cache policy python-silx`.
-If the Pin-number of silx.org is too low compared to other sources:
-download http://www.silx.org/pub/debian/silx.pref into /etc/apt/preferences.d
+You can display the priority list using `apt-cache policy silx`.
+If the Pin-number of silx.org is too low compared to other sources,
+see the "Information/Troubleshooting" section `here <http://www.silx.org/pub/linux-repo/>`_,
and start the update/install procedure again.
@@ -184,9 +164,6 @@ binary wheel for it.
This means that you would have to install *silx* from its sources, which requires
you to install a C compiler first.
-We also encourage you to use Python 3.5 or newer as former versions are no longer
-officially supported.
-
Configure Python as explained on
`docs.python.org <https://docs.python.org/3/using/windows.html#configuring-python>`_
to add the python installation directory to your PATH environment variable.
@@ -211,8 +188,7 @@ prompt.
MacOS
-----
-While Apple ships Python 2.7 by default on their operating systems, we recommend
-using Python 3.5 or newer to ease the installation of the Qt library.
+Make sure to use python3 to install silx (you might need to install python3).
Then, install *silx* with ``pip``, see `Installing with pip`_::
@@ -271,14 +247,14 @@ installed using:
.. code-block:: bash
- pip install -r https://github.com/silx-kit/silx/raw/0.8/requirements-dev.txt
+ pip install -r https://github.com/silx-kit/silx/raw/master/requirements-dev.txt
Building from source
++++++++++++++++++++
Source package of *silx* releases can be downloaded from
-`the pypi project page <https://pypi.python.org/pypi/silx>`_.
+`the pypi project page <https://pypi.org/project/silx>`_.
After downloading the `silx-x.y.z.tar.gz` archive, extract its content::
@@ -314,32 +290,51 @@ To set the environment variables, type on the command line:
Advanced build options
++++++++++++++++++++++
-In case you want more control over the build procedure, the build command is:
-
-.. code-block:: bash
+Advanced options can be set through the following environment variables:
- python setup.py build
+.. list-table::
+ :widths: 1 4
+ :header-rows: 1
-There are few advanced options to ``setup.py build``:
+ * - Environment variable
+ - Description
+ * - ``SILX_WITH_OPENMP``
+ - Whether or not to compile Cython code with OpenMP support (default: ``True`` except on macOS where it is ``False``)
+ * - ``SILX_FORCE_CYTHON``
+ - Whether or not to force re-generating the C/C++ source code from Cython files (default: ``False``).
+ * - ``SPECFILE_USE_GNU_SOURCE``
+ - Whether or not to use a cleaner locale independent implementation of :mod:`silx.io.specfile` by using `_GNU_SOURCE=1`
+ (default: ``False``; POSIX operating system only).
+ * - ``SILX_FULL_INSTALL_REQUIRES``
+ - Set it to put all dependencies as ``install_requires`` (For packaging purpose).
+ * - ``SILX_INSTALL_REQUIRES_STRIP``
+ - Comma-separated list of package names to remove from ``install_requires`` (For packaging purpose).
+.. note:: Boolean options are passed as ``True`` or ``False``.
-* ``--no-cython``: Prevent Cython (even if installed) from re-generating the C source code.
- Use the one provided by the development team.
-* ``--no-openmp``: Recompiles the Cython code without OpenMP support (default for MacOSX).
-* ``--openmp``: Recompiles the Cython code with OpenMP support (default for Windows and Linux).
-Package the build into a wheel and install it:
+Package the build into a wheel and install it (this requires to install the `build <https://pypa-build.readthedocs.io>`_ package):
.. code-block:: bash
- python setup.py bdist_wheel
+ python -m build --wheel
pip install dist/silx*.whl
To build the documentation, using `Sphinx <http://www.sphinx-doc.org/>`_:
.. code-block:: bash
- python setup.py build build_doc
+ pip install . # Make sure to install the same version as the source
+ sphinx-build doc/source/ build/html
+
+.. note::
+
+ To re-generate the example script screenshots, build the documentation with the
+ environment variable ``DIRECTIVE_SNAPSHOT_QT`` set to ``True``.
+
+Formatting
+++++++++++
+To format the code, use `black <https://black.readthedocs.io>`_.
Testing
+++++++
diff --git a/doc/source/license.rst b/doc/source/license.rst
index 760be91..4adcbcf 100644
--- a/doc/source/license.rst
+++ b/doc/source/license.rst
@@ -4,6 +4,18 @@ License
The source code of *silx* is licensed under the `MIT <https://opensource.org/licenses/MIT>`_ license:
.. include:: ../../LICENSE
+ :literal:
+
+Note:
+ The silx toolkit is a software library and one of its goals is not to impose any license to the end user.
+
+ silx follows the permissive MIT license although it may include contributions following other licenses not interfering with the previous goal.
+ Detailed information can be found in the copyright file.
+
+ silx uses the Qt library for its graphical user interfaces.
+ A word of caution is to be provided.
+ If users develop and distribute software using modules accessing Qt by means of Riverbank Computing Qt bindings PyQt4 or PyQt5, those users will be conditioned by the license of their PyQt4/5 software (GPL or commercial).
+ If the end user does not own a commercial license of PyQt4 or PyQt5 and wishes to be free of any distribution condition, (s)he should be able to use PySide6 because it uses the LGPL license.
The following list provides the copyright and license of the different source files of the project:
diff --git a/doc/source/modules/gui/data/img/ArrayTableWidget.png b/doc/source/modules/gui/data/img/ArrayTableWidget.png
index 7c81d02..138d189 100644
--- a/doc/source/modules/gui/data/img/ArrayTableWidget.png
+++ b/doc/source/modules/gui/data/img/ArrayTableWidget.png
Binary files differ
diff --git a/doc/source/modules/gui/data/img/DataViewer.png b/doc/source/modules/gui/data/img/DataViewer.png
index 719c822..6d0da71 100644
--- a/doc/source/modules/gui/data/img/DataViewer.png
+++ b/doc/source/modules/gui/data/img/DataViewer.png
Binary files differ
diff --git a/doc/source/modules/gui/dialog/img/abstractdatafiledialog.svg b/doc/source/modules/gui/dialog/img/abstractdatafiledialog.svg
new file mode 100644
index 0000000..f545c12
--- /dev/null
+++ b/doc/source/modules/gui/dialog/img/abstractdatafiledialog.svg
@@ -0,0 +1,1958 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="660"
+ height="500"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="abstract_file_dialog.svg"
+ inkscape:export-filename="abstract_file_dialog.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <filter
+ inkscape:label="Wax print"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Wax print on tissue texture"
+ height="1.4"
+ y="-0.2"
+ width="1.4"
+ x="-0.2"
+ color-interpolation-filters="sRGB"
+ id="filter3755">
+ <feGaussianBlur
+ result="result1"
+ in="SourceGraphic"
+ stdDeviation="2"
+ id="feGaussianBlur3757" />
+ <feTurbulence
+ result="result0"
+ numOctaves="5"
+ baseFrequency="0.05"
+ type="fractalNoise"
+ id="feTurbulence3759" />
+ <feDisplacementMap
+ result="result2"
+ scale="10"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in="result1"
+ in2="result0"
+ id="feDisplacementMap3761" />
+ <feColorMatrix
+ values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
+ result="result3"
+ id="feColorMatrix3763" />
+ <feBlend
+ mode="multiply"
+ in="result2"
+ result="result5"
+ in2="result3"
+ id="feBlend3765" />
+ <feGaussianBlur
+ result="result4"
+ in="result3"
+ stdDeviation="5"
+ id="feGaussianBlur3767" />
+ <feComposite
+ k1="0.5"
+ k3="1.5"
+ k2="0.15"
+ in="result4"
+ in2="result5"
+ operator="arithmetic"
+ result="result6"
+ id="feComposite3769"
+ k4="0" />
+ <feComposite
+ operator="in"
+ in="result6"
+ in2="result4"
+ id="feComposite3771" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6728">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6730" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6732">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6734" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6736">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6738" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6740"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6742"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6744" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6746" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6748">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6750" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6752">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6754" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6756">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6758" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6760"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6762"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6764" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6766" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6768">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6770" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6772">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6774" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6776">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6778" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6780"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6782"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6784" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6786" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6788">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6790" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6792">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6794" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6796">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6798" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6800"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6802"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6804" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6806" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6808">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6810" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6812">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6814" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6816">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6818" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6820"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6822"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6824" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6826" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6828">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6830" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6832">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6834" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6836">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6838" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6840"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6842"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6844" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6846" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6848">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6850" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6852">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6854" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6856">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6858" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6860"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6862"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6864" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6866" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6868">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6870" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6872">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6874" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6876">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6878" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6880"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6882"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6884" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6886" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6888">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6890" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6892">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6894" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6896">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6898" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6900"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6902"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6904" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6906" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6908">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6910" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6912">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6914" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6916">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6918" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6920"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6922"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6924" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6926" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6928">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6930" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6932">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6934" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6936">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6938" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6940"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6942"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6944" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6946" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6948">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6950" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6952">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6954" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6956">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6958" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6960"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6962"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6964" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6966" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6968">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6970" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6972">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6974" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6976">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6978" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6980"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6982"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6984" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6986" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6988">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6990" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6992">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6994" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6996">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6998" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite7000"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite7002"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite7004" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap7006" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter7008">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence7010" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting7012">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight7014" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting7016">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight7018" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite7020"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite7022"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite7024" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap7026" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter7028">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence7030" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting7032">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight7034" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting7036">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight7038" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite7040"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite7042"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite7044" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap7046" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter7048">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence7050" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting7052">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight7054" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting7056">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight7058" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite7060"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite7062"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite7064" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap7066" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter7068">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence7070" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting7072">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight7074" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting7076">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight7078" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite7080"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite7082"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite7084" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap7086" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter7088">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence7090" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting7092">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight7094" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting7096">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight7098" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite7100"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite7102"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite7104" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap7106" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter7108">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence7110" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting7112">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight7114" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting7116">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight7118" />
+ </feSpecularLighting>
+ <feComposite
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite7120"
+ k2="0"
+ k3="0"
+ k4="0" />
+ <feComposite
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite7122"
+ k1="0"
+ k4="0" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite7124" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap7126" />
+ </filter>
+ <filter
+ inkscape:label="Rough and glossy"
+ inkscape:menu="Textures"
+ inkscape:menu-tooltip="Crumpled glossy paper effect which can be used for pictures as for objects"
+ color-interpolation-filters="sRGB"
+ id="filter6768-5">
+ <feTurbulence
+ type="fractalNoise"
+ numOctaves="7"
+ baseFrequency="0.02"
+ seed="55"
+ result="result0"
+ id="feTurbulence6770-9" />
+ <feDiffuseLighting
+ surfaceScale="4"
+ diffuseConstant="1"
+ kernelUnitLength="1"
+ result="result1"
+ in="result0"
+ id="feDiffuseLighting6772-2">
+ <feDistantLight
+ azimuth="235"
+ elevation="60"
+ id="feDistantLight6774-2" />
+ </feDiffuseLighting>
+ <feSpecularLighting
+ in="result0"
+ surfaceScale="3"
+ specularConstant="1"
+ specularExponent="25"
+ kernelUnitLength="1"
+ result="result3"
+ id="feSpecularLighting6776-8">
+ <feDistantLight
+ azimuth="235"
+ elevation="55"
+ id="feDistantLight6778-9" />
+ </feSpecularLighting>
+ <feComposite
+ k4="0"
+ k3="0"
+ k2="0"
+ in="result1"
+ in2="SourceGraphic"
+ operator="arithmetic"
+ k1="1"
+ result="result2"
+ id="feComposite6780-7" />
+ <feComposite
+ k4="0"
+ k1="0"
+ in="result2"
+ in2="result3"
+ operator="arithmetic"
+ k2="1"
+ k3="1"
+ result="result4"
+ id="feComposite6782-3" />
+ <feComposite
+ in2="SourceAlpha"
+ operator="in"
+ in="result4"
+ result="fbSourceGraphic"
+ id="feComposite6784-6" />
+ <feDisplacementMap
+ scale="7"
+ yChannelSelector="G"
+ xChannelSelector="R"
+ in2="result0"
+ id="feDisplacementMap6786-1" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="349.21157"
+ inkscape:cy="238.52147"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1722"
+ inkscape:window-height="981"
+ inkscape:window-x="168"
+ inkscape:window-y="219"
+ inkscape:window-maximized="0"
+ inkscape:snap-global="false"
+ showguides="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3887"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="-5.4px"
+ originy="-443.4px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-5.4,-108.9622)">
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter7108);enable-background:accumulate"
+ id="rect3773"
+ width="420.22345"
+ height="206.07112"
+ x="34.009075"
+ y="175.08205" />
+ <rect
+ style="color:#000000;fill:none;stroke:#757575;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter7088);enable-background:accumulate"
+ id="rect3786"
+ width="120"
+ height="400"
+ x="23.543495"
+ y="155.5638" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter7068);enable-background:accumulate"
+ id="rect3788"
+ width="240"
+ height="30"
+ x="173.54349"
+ y="165.5638" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter7048);enable-background:accumulate"
+ id="rect3790"
+ width="180"
+ height="30"
+ x="453.54352"
+ y="165.5638" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter7028);enable-background:accumulate"
+ id="rect3792"
+ width="180"
+ height="210"
+ x="453.54352"
+ y="205.5638" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter7008);enable-background:accumulate"
+ id="rect3794"
+ width="180"
+ height="120"
+ x="453.54352"
+ y="425.56378" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6988);enable-background:accumulate"
+ id="rect3796"
+ width="440"
+ height="30"
+ x="23.543495"
+ y="565.56384" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6968);enable-background:accumulate"
+ id="rect3798"
+ width="240"
+ height="30"
+ x="173.54349"
+ y="515.56384" />
+ <rect
+ style="color:#000000;fill:none;stroke:#757575;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6948);enable-background:accumulate"
+ id="rect3800"
+ width="260"
+ height="400"
+ x="163.54349"
+ y="155.5638" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6928);enable-background:accumulate"
+ id="rect3802"
+ width="80"
+ height="30"
+ x="473.54352"
+ y="565.56384" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6908);enable-background:accumulate"
+ id="rect3804"
+ width="80"
+ height="30"
+ x="563.54346"
+ y="565.56384"
+ ry="0" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6888);enable-background:accumulate"
+ id="rect3806"
+ width="640"
+ height="460"
+ x="13.543495"
+ y="145.5638" />
+ <g
+ id="g3853"
+ transform="translate(-220.10121,39.2414)"
+ style="filter:url(#filter6868)">
+ <path
+ transform="matrix(0.23457511,0,0,0.23457511,323.28913,226.51496)"
+ d="m 214.28572,295.93362 a 6.4285712,6.4285712 0 1 1 -12.85714,0 6.4285712,6.4285712 0 1 1 12.85714,0 z"
+ sodipodi:ry="6.4285712"
+ sodipodi:rx="6.4285712"
+ sodipodi:cy="295.93362"
+ sodipodi:cx="207.85715"
+ id="path3808"
+ style="color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.23457511,0,0,0.23457511,323.28913,234.76086)"
+ d="m 214.28572,295.93362 a 6.4285712,6.4285712 0 1 1 -12.85714,0 6.4285712,6.4285712 0 1 1 12.85714,0 z"
+ sodipodi:ry="6.4285712"
+ sodipodi:rx="6.4285712"
+ sodipodi:cy="295.93362"
+ sodipodi:cx="207.85715"
+ id="path3808-6"
+ style="color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.23457511,0,0,0.23457511,323.28913,243.00678)"
+ d="m 214.28572,295.93362 a 6.4285712,6.4285712 0 1 1 -12.85714,0 6.4285712,6.4285712 0 1 1 12.85714,0 z"
+ sodipodi:ry="6.4285712"
+ sodipodi:rx="6.4285712"
+ sodipodi:cy="295.93362"
+ sodipodi:cx="207.85715"
+ id="path3808-7"
+ style="color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g3853-5"
+ transform="translate(60.781967,39.2414)"
+ style="filter:url(#filter6848)">
+ <path
+ transform="matrix(0.23457511,0,0,0.23457511,323.28913,226.51496)"
+ d="m 214.28572,295.93362 a 6.4285712,6.4285712 0 1 1 -12.85714,0 6.4285712,6.4285712 0 1 1 12.85714,0 z"
+ sodipodi:ry="6.4285712"
+ sodipodi:rx="6.4285712"
+ sodipodi:cy="295.93362"
+ sodipodi:cx="207.85715"
+ id="path3808-35"
+ style="color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.23457511,0,0,0.23457511,323.28913,234.76086)"
+ d="m 214.28572,295.93362 a 6.4285712,6.4285712 0 1 1 -12.85714,0 6.4285712,6.4285712 0 1 1 12.85714,0 z"
+ sodipodi:ry="6.4285712"
+ sodipodi:rx="6.4285712"
+ sodipodi:cy="295.93362"
+ sodipodi:cx="207.85715"
+ id="path3808-6-6"
+ style="color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.23457511,0,0,0.23457511,323.28913,243.00678)"
+ d="m 214.28572,295.93362 a 6.4285712,6.4285712 0 1 1 -12.85714,0 6.4285712,6.4285712 0 1 1 12.85714,0 z"
+ sodipodi:ry="6.4285712"
+ sodipodi:rx="6.4285712"
+ sodipodi:cy="295.93362"
+ sodipodi:cx="207.85715"
+ id="path3808-7-2"
+ style="color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+ <rect
+ style="color:#000000;fill:none;stroke:#757575;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6828);enable-background:accumulate"
+ id="rect3891"
+ width="200"
+ height="400"
+ x="443.54352"
+ y="155.5638" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6808);enable-background:accumulate"
+ id="rect3893"
+ width="240"
+ height="300"
+ x="173.54349"
+ y="205.5638" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6788);enable-background:accumulate"
+ id="rect3788-9"
+ width="640"
+ height="30"
+ x="13.543495"
+ y="115.56378" />
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6768);enable-background:accumulate"
+ id="rect3913"
+ width="100"
+ height="300"
+ x="33.543499"
+ y="205.5638" />
+ <text
+ xml:space="preserve"
+ style="font-size:18.27440071px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="39.028339"
+ y="247.82175"
+ id="text3915"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3917"
+ x="39.028339"
+ y="247.82175">Shortcuts</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="208.54349"
+ y="264.56378"
+ id="text3915-1"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="74.912109"
+ inkscape:transform-center-y="103.96484"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2"
+ x="208.54349"
+ y="264.56378">Browser</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:17.64155769px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="223.45605"
+ y="185.64771"
+ id="text3915-1-7"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="33.039158"
+ inkscape:transform-center-y="45.852548"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-0"
+ x="223.45605"
+ y="185.64771">Browser Toolbar</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:17.64155769px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="582.13245"
+ y="586.1618"
+ id="text3915-1-7-9"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="33.039175"
+ inkscape:transform-center-y="45.852541"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-0-3"
+ x="582.13245"
+ y="586.1618">Open</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:17.64155769px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="483.3667"
+ y="584.45728"
+ id="text3915-1-7-9-6"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="33.039149"
+ inkscape:transform-center-y="45.852549"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-0-3-0"
+ x="483.3667"
+ y="584.45728">Cancel</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22.65561676px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="33.543499"
+ y="587.56384"
+ id="text3915-1-7-9-6-6"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="42.429502"
+ inkscape:transform-center-y="58.884695"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-0-3-0-2"
+ x="33.543499"
+ y="587.56384">URL</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:17.64155769px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="193.05695"
+ y="536.06213"
+ id="text3915-1-7-9-6-6-6"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="33.03916"
+ inkscape:transform-center-y="45.852561"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-0-3-0-2-1"
+ x="193.05695"
+ y="536.06213">File format selector</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:17.64155769px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="469.60443"
+ y="185.5638"
+ id="text3915-1-7-8"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="33.039162"
+ inkscape:transform-center-y="45.852549"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-0-7"
+ x="469.60443"
+ y="185.5638">Preview Toolbar</tspan></text>
+ <rect
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6748);enable-background:accumulate"
+ id="rect3798-9"
+ width="30"
+ height="30"
+ x="383.54352"
+ y="515.56384" />
+ <path
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6728);enable-background:accumulate"
+ d="m 388.5435,520.5638 10,20 10,-20 z"
+ id="path4084"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="538.62158"
+ y="263.56378"
+ id="text3915-1-0"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="74.912109"
+ inkscape:transform-center-y="103.96484"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-2"
+ x="538.62158"
+ y="263.56378">Data</tspan><tspan
+ sodipodi:role="line"
+ x="538.62158"
+ y="313.56378"
+ id="tspan4145">Preview</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="544.39307"
+ y="475.56378"
+ id="text3915-1-0-3"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="74.912109"
+ inkscape:transform-center-y="103.96484"><tspan
+ sodipodi:role="line"
+ id="tspan3917-2-2-7"
+ x="544.39307"
+ y="475.56378">Data</tspan><tspan
+ sodipodi:role="line"
+ x="544.39307"
+ y="525.56378"
+ id="tspan4147">Selector</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/modules/gui/gallery.rst b/doc/source/modules/gui/gallery.rst
index fffcfd8..9923c0b 100644
--- a/doc/source/modules/gui/gallery.rst
+++ b/doc/source/modules/gui/gallery.rst
@@ -39,14 +39,27 @@ Widgets gallery
* - Widget
- Description
- * - .. image:: data/img/ArrayTableWidget.png
+ * - .. snapshotqt:: data/img/ArrayTableWidget.png
:height: 150px
:align: center
+
+ from silx.gui.data.ArrayTableWidget import ArrayTableWidget
+ import numpy.random
+ table = ArrayTableWidget()
+ table.setArrayData(numpy.random.random((100, 100, 100)))
+ table.resize(500, 300)
+ table.show()
- :class:`ArrayTableWidget` is a table widget with browsers designed to
display the content of multi-dimensional data arrays.
- * - .. image:: data/img/DataViewer.png
+ * - .. snapshotqt:: data/img/DataViewer.png
:height: 150px
:align: center
+
+ import numpy.random
+ from silx.gui.data.DataViewer import DataViewer
+ viewer = DataViewer()
+ viewer.setData(numpy.random.random((100, 100, 100)))
+ viewer.show()
- :class:`DataViewer` is a widget designed to display data using the most
adapted view.
* - .. image:: data/img/DataViewerFrame.png
@@ -208,14 +221,33 @@ Additional widgets:
:align: center
- :class:`.PlotTools.PositionInfo` is a widget displaying mouse position and
information of a :class:`PlotWidget` associated to the mouse position.
- * - .. image:: plot/img/LimitsToolBar.png
+ * - .. snapshotqt:: plot/img/LimitsToolBar.png
:width: 300px
:align: center
+
+ from silx.gui.plot import Plot2D
+ from silx.gui.plot.tools.LimitsToolBar import LimitsToolBar
+ plot = Plot2D()
+ toolbar = LimitsToolBar(plot=plot)
+ toolbar.resize(400, 30)
+ plot.show()
+ toolbar.show()
+ app.processEvents()
- :class:`.PlotTools.LimitsToolBar` is a QToolBar displaying and
controlling the limits of a :class:`PlotWidget`.
- * - .. image:: plot/img/logColorbar.png
+ * - .. snapshotqt:: plot/img/logColorbar.png
:height: 150px
:align: center
+
+ from silx.gui.plot import Plot2D
+ from silx.gui.plot.ColorBar import ColorBarWidget
+ from silx.gui.plot.Colors import Colormap
+ import numpy
+ plot = Plot2D()
+ colorbar = ColorBarWidget(plot=plot, legend='Colormap Log scale')
+ colorbar.setColormap(Colormap(name='jet', normalization='log', vmin=1.0, vmax=10e3))
+ colorbar.show()
+ colorbar.resize(20, 500)
- :class:`.ColorBar.ColorBarWidget` display colormap gradient and can be linked with a plot
to display the colormap
* - .. image:: plot/img/statsWidget.png
@@ -243,9 +275,10 @@ Additional widgets:
and associated toolbars.
It can display 2D images, 2D scatter data, 3D scatter data and 3D volumes with different visualizations.
See ``plot3dSceneWindow.py`` in :ref:`plot3d-sample-code`.
- * - .. image:: plot3d/img/SceneWidget.png
+ * - .. snapshotqt:: plot3d/img/SceneWidget.png
:height: 150px
:align: center
+ :script: examples/plot3dSceneWindow.py
- :class:`SceneWidget` is a :class:`Plot3DWidget` providing a 3D scene for visualizing different kind of data.
It can display 2D images, 2D scatter data, 3D scatter data and 3D volumes with different visualizations.
See ``plot3dSceneWindow.py`` in :ref:`plot3d-sample-code`.
@@ -303,49 +336,103 @@ Additional widgets:
* - Widget
- Description
- * - .. image:: widgets/img/FrameBrowser.png
+ * - .. snapshotqt:: widgets/img/FrameBrowser.png
:width: 110px
:align: center
+
+ from silx.gui.widgets.FrameBrowser import FrameBrowser
+ widget = FrameBrowser()
+ widget.setRange(0, 10)
+ widget.show()
- :class:`FrameBrowser.FrameBrowser` is a browser widget designed to
browse through a sequence of integers (e.g. the indices of an array)
- * - .. image:: widgets/img/HorizontalSliderWithBrowser.png
+ * - .. snapshotqt:: widgets/img/HorizontalSliderWithBrowser.png
:width: 150px
:align: center
+
+ from silx.gui.widgets.FrameBrowser import HorizontalSliderWithBrowser
+ slider = HorizontalSliderWithBrowser()
+ slider.show()
- :class:`FrameBrowser.HorizontalSliderWithBrowser` is a :class:`FrameBrowser`
with an additional slider.
- * - .. image:: widgets/img/RangeSlider.png
+ * - .. snapshotqt:: widgets/img/RangeSlider.png
:width: 150px
:align: center
+
+ from silx.gui.widgets.RangeSlider import RangeSlider
+ from silx.gui.plot.Colors import Colormap
+ import numpy
+ widget = RangeSlider()
+ widget.setRange(0, 500)
+ widget.setValues(100, 400)
+ background = numpy.sin(numpy.arange(250) / 250.0)
+ background[0], background[-1] = background[-1], background[0]
+ colormap = Colormap("viridis")
+ widget.setGroovePixmapFromProfile(background, colormap)
+ widget.show()
- :class:`~silx.gui.widgets.RangeSlider.RangeSlider` is a slider with 2 thumbs dedicated
to the interactive selection of an interval.
- * - .. image:: widgets/img/PeriodicCombo.png
+ * - .. snapshotqt:: widgets/img/PeriodicCombo.png
:width: 150px
:align: center
+
+ from silx.gui.widgets.PeriodicTable import PeriodicCombo
+ widget = PeriodicCombo()
+ widget.setSelection('Yb')
+ widget.show()
- :class:`PeriodicTable.PeriodicCombo` is a :class:`QComboBox` widget designed to
select a single atomic element.
- * - .. image:: widgets/img/PeriodicList.png
+ * - .. snapshotqt:: widgets/img/PeriodicList.png
:height: 150px
:align: center
+
+ from silx.gui.widgets.PeriodicTable import PeriodicList
+ widget = PeriodicList()
+ widget.setSelectedElements(('S', 'Cl'))
+ widget.resize(200, 400)
+ widget.show()
- :class:`PeriodicTable.PeriodicList` is a :class:`QTreeWidget` designed to select one
or more atomic elements.
- * - .. image:: widgets/img/PeriodicTable.png
+ * - .. snapshotqt:: widgets/img/PeriodicTable.png
:height: 150px
:align: center
+
+ from silx.gui.widgets.PeriodicTable import PeriodicTable
+ widget = PeriodicTable()
+ widget.setSelection(('S', 'H', 'Zr'))
+ widget.show()
- :class:`PeriodicTable.PeriodicTable` is a periodic table widget designed to select one
or more atomic elements.
- * - .. image:: widgets/img/TableWidget.png
+ * - .. snapshotqt:: widgets/img/TableWidget.png
:height: 150px
:align: center
+
+ from silx.gui.widgets.TableWidget import TableWidget
+ widget = TableWidget()
+ widget.setRowCount(8)
+ widget.setColumnCount(4)
+ widget.resize(300, 200)
+ widget.show()
- :class:`TableWidget.TableWidget` and :class:`TableWidget.TableView` inherit respectively
:class:`QTableWidget` and :class:`QTableView`, and add a context menu with *cut/copy/paste*
actions.
- * - .. image:: widgets/img/WaitingPushButton.png
+ * - .. snapshotqt:: widgets/img/WaitingPushButton.png
:width: 60px
:align: center
+
+ from silx.gui.widgets.WaitingPushButton import WaitingPushButton
+ from silx.gui import icons
+ animated_icon = icons.getWaitIcon()
+ button = WaitingPushButton(icon=animated_icon.currentIcon(), text='Run')
+ button.show()
- :class:`WaitingPushButton` is a :class:`QPushButton` that can be graphically disabled,
for example to wait for a callback function to finish computing.
- * - .. image:: widgets/img/ThreadPoolPushButton.png
+ * - .. snapshotqt:: widgets/img/ThreadPoolPushButton.png
:width: 100px
:align: center
+
+ from silx.gui.widgets.ThreadPoolPushButton import ThreadPoolPushButton
+ button = ThreadPoolPushButton(text="Compute 2^16")
+ button.show()
- :class:`ThreadPoolPushButton` is a :class:`WaitingPushButton` that executes a
callback in a thread.
diff --git a/doc/source/modules/gui/hdf5/getting_started.rst b/doc/source/modules/gui/hdf5/getting_started.rst
index 1a81a0a..6951247 100644
--- a/doc/source/modules/gui/hdf5/getting_started.rst
+++ b/doc/source/modules/gui/hdf5/getting_started.rst
@@ -86,7 +86,7 @@ We can use directly h5py Files, Groups and Datasets.
.. code-block:: python
import h5py
- h5 = h5py.File("test.h5")
+ h5 = h5py.File("test.h5", mode="r")
# We can use file
model.insertH5pyObject(h5)
diff --git a/doc/source/modules/gui/icons.rst b/doc/source/modules/gui/icons.rst
index 659bc4c..efa0264 100644
--- a/doc/source/modules/gui/icons.rst
+++ b/doc/source/modules/gui/icons.rst
@@ -29,10 +29,18 @@ Available icons
- 3d-plane-pan
* - |3d-plane|
- 3d-plane
+ * - |add-range-horizontal|
+ - add-range-horizontal
* - |add-shape-arc|
- add-shape-arc
+ * - |add-shape-circle|
+ - add-shape-circle
+ * - |add-shape-cross|
+ - add-shape-cross
* - |add-shape-diagonal|
- add-shape-diagonal
+ * - |add-shape-ellipse|
+ - add-shape-ellipse
* - |add-shape-horizontal|
- add-shape-horizontal
* - |add-shape-point|
@@ -41,14 +49,22 @@ Available icons
- add-shape-polygon
* - |add-shape-rectangle|
- add-shape-rectangle
+ * - |add-shape-rotated-rectangle|
+ - add-shape-rotated-rectangle
* - |add-shape-unknown|
- add-shape-unknown
* - |add-shape-vertical|
- add-shape-vertical
+ * - |add|
+ - add
+ * - |aggregation-mode|
+ - aggregation-mode
* - |arrow-keys|
- arrow-keys
* - |axis|
- axis
+ * - |backend-opengl|
+ - backend-opengl
* - |camera|
- camera
* - |clipboard|
@@ -61,6 +77,16 @@ Available icons
- colormap-histogram
* - |colormap-none|
- colormap-none
+ * - |colormap-norm-arcsinh|
+ - colormap-norm-arcsinh
+ * - |colormap-norm-gamma|
+ - colormap-norm-gamma
+ * - |colormap-norm-linear|
+ - colormap-norm-linear
+ * - |colormap-norm-log|
+ - colormap-norm-log
+ * - |colormap-norm-sqrt|
+ - colormap-norm-sqrt
* - |colormap-range|
- colormap-range
* - |colormap|
@@ -75,6 +101,8 @@ Available icons
- compare-align-stretch
* - |compare-keypoints|
- compare-keypoints
+ * - |compare-mode-a-minus-b|
+ - compare-mode-a-minus-b
* - |compare-mode-a|
- compare-mode-a
* - |compare-mode-b|
@@ -107,6 +135,18 @@ Available icons
- cube-top
* - |cube|
- cube
+ * - |description-description|
+ - description-description
+ * - |description-error|
+ - description-error
+ * - |description-name|
+ - description-name
+ * - |description-program|
+ - description-program
+ * - |description-title|
+ - description-title
+ * - |description-value|
+ - description-value
* - |document-open|
- document-open
* - |document-print|
@@ -121,6 +161,8 @@ Available icons
- draw-rubber
* - |edit-copy|
- edit-copy
+ * - |eye|
+ - eye
* - |first|
- first
* - |folder|
@@ -157,6 +199,12 @@ Available icons
- last
* - |layer-nx|
- layer-nx
+ * - |mask-clear-all|
+ - mask-clear-all
+ * - |mask-clear|
+ - mask-clear
+ * - |mask-invert|
+ - mask-invert
* - |math-amplitude|
- math-amplitude
* - |math-average|
@@ -251,6 +299,8 @@ Available icons
- plot-ylog
* - |plot-yup|
- plot-yup
+ * - |pointing-hand|
+ - pointing-hand
* - |previous|
- previous
* - |profile-clear|
@@ -261,16 +311,28 @@ Available icons
- profile2D
* - |remove|
- remove
+ * - |rm|
+ - rm
* - |rotate-3d|
- rotate-3d
* - |rudder|
- rudder
+ * - |ruler|
+ - ruler
+ * - |scale-auto|
+ - scale-auto
+ * - |scale-fixed|
+ - scale-fixed
* - |selected|
- selected
* - |shape-circle-solid|
- shape-circle-solid
* - |shape-circle|
- shape-circle
+ * - |shape-cross|
+ - shape-cross
+ * - |shape-diagonal-directed|
+ - shape-diagonal-directed
* - |shape-diagonal|
- shape-diagonal
* - |shape-ellipse-solid|
@@ -287,8 +349,16 @@ Available icons
- shape-square
* - |shape-vertical|
- shape-vertical
+ * - |side-histograms|
+ - side-histograms
* - |silx|
- silx
+ * - |slice-cross|
+ - slice-cross
+ * - |slice-horizontal|
+ - slice-horizontal
+ * - |slice-vertical|
+ - slice-vertical
* - |sliders-off|
- sliders-off
* - |sliders-on|
@@ -307,6 +377,8 @@ Available icons
- tree-collapse-all
* - |tree-expand-all|
- tree-expand-all
+ * - |tree-sort|
+ - tree-sort
* - |view-1d|
- view-1d
* - |view-2d-stack|
@@ -342,164 +414,200 @@ Available icons
* - |zoom|
- zoom
-.. |3d-plane-normal-x| image:: ../../../../silx/resources/gui/icons/3d-plane-normal-x.png
-.. |3d-plane-normal-y| image:: ../../../../silx/resources/gui/icons/3d-plane-normal-y.png
-.. |3d-plane-normal-z| image:: ../../../../silx/resources/gui/icons/3d-plane-normal-z.png
-.. |3d-plane-pan| image:: ../../../../silx/resources/gui/icons/3d-plane-pan.png
-.. |3d-plane| image:: ../../../../silx/resources/gui/icons/3d-plane.png
-.. |add-shape-arc| image:: ../../../../silx/resources/gui/icons/add-shape-arc.png
-.. |add-shape-diagonal| image:: ../../../../silx/resources/gui/icons/add-shape-diagonal.png
-.. |add-shape-horizontal| image:: ../../../../silx/resources/gui/icons/add-shape-horizontal.png
-.. |add-shape-point| image:: ../../../../silx/resources/gui/icons/add-shape-point.png
-.. |add-shape-polygon| image:: ../../../../silx/resources/gui/icons/add-shape-polygon.png
-.. |add-shape-rectangle| image:: ../../../../silx/resources/gui/icons/add-shape-rectangle.png
-.. |add-shape-unknown| image:: ../../../../silx/resources/gui/icons/add-shape-unknown.png
-.. |add-shape-vertical| image:: ../../../../silx/resources/gui/icons/add-shape-vertical.png
-.. |arrow-keys| image:: ../../../../silx/resources/gui/icons/arrow-keys.png
-.. |axis| image:: ../../../../silx/resources/gui/icons/axis.png
-.. |camera| image:: ../../../../silx/resources/gui/icons/camera.png
-.. |clipboard| image:: ../../../../silx/resources/gui/icons/clipboard.png
-.. |close| image:: ../../../../silx/resources/gui/icons/close.png
-.. |colorbar| image:: ../../../../silx/resources/gui/icons/colorbar.png
-.. |colormap-histogram| image:: ../../../../silx/resources/gui/icons/colormap-histogram.png
-.. |colormap-none| image:: ../../../../silx/resources/gui/icons/colormap-none.png
-.. |colormap-range| image:: ../../../../silx/resources/gui/icons/colormap-range.png
-.. |colormap| image:: ../../../../silx/resources/gui/icons/colormap.png
-.. |compare-align-auto| image:: ../../../../silx/resources/gui/icons/compare-align-auto.png
-.. |compare-align-center| image:: ../../../../silx/resources/gui/icons/compare-align-center.png
-.. |compare-align-origin| image:: ../../../../silx/resources/gui/icons/compare-align-origin.png
-.. |compare-align-stretch| image:: ../../../../silx/resources/gui/icons/compare-align-stretch.png
-.. |compare-keypoints| image:: ../../../../silx/resources/gui/icons/compare-keypoints.png
-.. |compare-mode-a| image:: ../../../../silx/resources/gui/icons/compare-mode-a.png
-.. |compare-mode-b| image:: ../../../../silx/resources/gui/icons/compare-mode-b.png
-.. |compare-mode-hline| image:: ../../../../silx/resources/gui/icons/compare-mode-hline.png
-.. |compare-mode-rb-channel| image:: ../../../../silx/resources/gui/icons/compare-mode-rb-channel.png
-.. |compare-mode-rbneg-channel| image:: ../../../../silx/resources/gui/icons/compare-mode-rbneg-channel.png
-.. |compare-mode-vline| image:: ../../../../silx/resources/gui/icons/compare-mode-vline.png
-.. |crop| image:: ../../../../silx/resources/gui/icons/crop.png
-.. |crosshair| image:: ../../../../silx/resources/gui/icons/crosshair.png
-.. |cube-back| image:: ../../../../silx/resources/gui/icons/cube-back.png
-.. |cube-bottom| image:: ../../../../silx/resources/gui/icons/cube-bottom.png
-.. |cube-front| image:: ../../../../silx/resources/gui/icons/cube-front.png
-.. |cube-left| image:: ../../../../silx/resources/gui/icons/cube-left.png
-.. |cube-right| image:: ../../../../silx/resources/gui/icons/cube-right.png
-.. |cube-rotate| image:: ../../../../silx/resources/gui/icons/cube-rotate.png
-.. |cube-top| image:: ../../../../silx/resources/gui/icons/cube-top.png
-.. |cube| image:: ../../../../silx/resources/gui/icons/cube.png
-.. |document-open| image:: ../../../../silx/resources/gui/icons/document-open.png
-.. |document-print| image:: ../../../../silx/resources/gui/icons/document-print.png
-.. |document-save| image:: ../../../../silx/resources/gui/icons/document-save.png
-.. |draw-brush| image:: ../../../../silx/resources/gui/icons/draw-brush.png
-.. |draw-pencil| image:: ../../../../silx/resources/gui/icons/draw-pencil.png
-.. |draw-rubber| image:: ../../../../silx/resources/gui/icons/draw-rubber.png
-.. |edit-copy| image:: ../../../../silx/resources/gui/icons/edit-copy.png
-.. |first| image:: ../../../../silx/resources/gui/icons/first.png
-.. |folder| image:: ../../../../silx/resources/gui/icons/folder.png
-.. |image-mask| image:: ../../../../silx/resources/gui/icons/image-mask.png
-.. |image-select-add| image:: ../../../../silx/resources/gui/icons/image-select-add.png
-.. |image-select-box| image:: ../../../../silx/resources/gui/icons/image-select-box.png
-.. |image-select-brush| image:: ../../../../silx/resources/gui/icons/image-select-brush.png
-.. |image-select-erase-rubber| image:: ../../../../silx/resources/gui/icons/image-select-erase-rubber.png
-.. |image-select-erase| image:: ../../../../silx/resources/gui/icons/image-select-erase.png
-.. |image| image:: ../../../../silx/resources/gui/icons/image.png
-.. |item-0dim| image:: ../../../../silx/resources/gui/icons/item-0dim.png
-.. |item-1dim| image:: ../../../../silx/resources/gui/icons/item-1dim.png
-.. |item-2dim| image:: ../../../../silx/resources/gui/icons/item-2dim.png
-.. |item-3dim| image:: ../../../../silx/resources/gui/icons/item-3dim.png
-.. |item-ndim| image:: ../../../../silx/resources/gui/icons/item-ndim.png
-.. |item-none| image:: ../../../../silx/resources/gui/icons/item-none.png
-.. |item-object| image:: ../../../../silx/resources/gui/icons/item-object.png
-.. |last| image:: ../../../../silx/resources/gui/icons/last.png
-.. |layer-nx| image:: ../../../../silx/resources/gui/icons/layer-nx.png
-.. |math-amplitude| image:: ../../../../silx/resources/gui/icons/math-amplitude.png
-.. |math-average| image:: ../../../../silx/resources/gui/icons/math-average.png
-.. |math-derive| image:: ../../../../silx/resources/gui/icons/math-derive.png
-.. |math-energy| image:: ../../../../silx/resources/gui/icons/math-energy.png
-.. |math-fit| image:: ../../../../silx/resources/gui/icons/math-fit.png
-.. |math-imaginary| image:: ../../../../silx/resources/gui/icons/math-imaginary.png
-.. |math-mean| image:: ../../../../silx/resources/gui/icons/math-mean.png
-.. |math-normalize| image:: ../../../../silx/resources/gui/icons/math-normalize.png
-.. |math-peak-reset| image:: ../../../../silx/resources/gui/icons/math-peak-reset.png
-.. |math-peak-search| image:: ../../../../silx/resources/gui/icons/math-peak-search.png
-.. |math-peak| image:: ../../../../silx/resources/gui/icons/math-peak.png
-.. |math-phase-color-log| image:: ../../../../silx/resources/gui/icons/math-phase-color-log.png
-.. |math-phase-color| image:: ../../../../silx/resources/gui/icons/math-phase-color.png
-.. |math-phase| image:: ../../../../silx/resources/gui/icons/math-phase.png
-.. |math-real| image:: ../../../../silx/resources/gui/icons/math-real.png
-.. |math-sigma| image:: ../../../../silx/resources/gui/icons/math-sigma.png
-.. |math-smooth| image:: ../../../../silx/resources/gui/icons/math-smooth.png
-.. |math-square-amplitude| image:: ../../../../silx/resources/gui/icons/math-square-amplitude.png
-.. |math-substract| image:: ../../../../silx/resources/gui/icons/math-substract.png
-.. |math-swap-sign| image:: ../../../../silx/resources/gui/icons/math-swap-sign.png
-.. |math-ymin-to-zero| image:: ../../../../silx/resources/gui/icons/math-ymin-to-zero.png
-.. |median-filter| image:: ../../../../silx/resources/gui/icons/median-filter.png
-.. |next| image:: ../../../../silx/resources/gui/icons/next.png
-.. |normal| image:: ../../../../silx/resources/gui/icons/normal.png
-.. |nxdata-axis-add| image:: ../../../../silx/resources/gui/icons/nxdata-axis-add.png
-.. |nxdata-axis-remove| image:: ../../../../silx/resources/gui/icons/nxdata-axis-remove.png
-.. |nxdata-create| image:: ../../../../silx/resources/gui/icons/nxdata-create.png
-.. |nxdata-remove| image:: ../../../../silx/resources/gui/icons/nxdata-remove.png
-.. |pan| image:: ../../../../silx/resources/gui/icons/pan.png
-.. |pixel-intensities| image:: ../../../../silx/resources/gui/icons/pixel-intensities.png
-.. |plot-grid| image:: ../../../../silx/resources/gui/icons/plot-grid.png
-.. |plot-roi-above| image:: ../../../../silx/resources/gui/icons/plot-roi-above.png
-.. |plot-roi-below| image:: ../../../../silx/resources/gui/icons/plot-roi-below.png
-.. |plot-roi-between| image:: ../../../../silx/resources/gui/icons/plot-roi-between.png
-.. |plot-roi-reset| image:: ../../../../silx/resources/gui/icons/plot-roi-reset.png
-.. |plot-roi| image:: ../../../../silx/resources/gui/icons/plot-roi.png
-.. |plot-symbols| image:: ../../../../silx/resources/gui/icons/plot-symbols.png
-.. |plot-toggle-points| image:: ../../../../silx/resources/gui/icons/plot-toggle-points.png
-.. |plot-widget| image:: ../../../../silx/resources/gui/icons/plot-widget.png
-.. |plot-window-image| image:: ../../../../silx/resources/gui/icons/plot-window-image.png
-.. |plot-window| image:: ../../../../silx/resources/gui/icons/plot-window.png
-.. |plot-xauto| image:: ../../../../silx/resources/gui/icons/plot-xauto.png
-.. |plot-xlog| image:: ../../../../silx/resources/gui/icons/plot-xlog.png
-.. |plot-yauto| image:: ../../../../silx/resources/gui/icons/plot-yauto.png
-.. |plot-ydown| image:: ../../../../silx/resources/gui/icons/plot-ydown.png
-.. |plot-ylog| image:: ../../../../silx/resources/gui/icons/plot-ylog.png
-.. |plot-yup| image:: ../../../../silx/resources/gui/icons/plot-yup.png
-.. |previous| image:: ../../../../silx/resources/gui/icons/previous.png
-.. |profile-clear| image:: ../../../../silx/resources/gui/icons/profile-clear.png
-.. |profile1D| image:: ../../../../silx/resources/gui/icons/profile1D.png
-.. |profile2D| image:: ../../../../silx/resources/gui/icons/profile2D.png
-.. |remove| image:: ../../../../silx/resources/gui/icons/remove.png
-.. |rotate-3d| image:: ../../../../silx/resources/gui/icons/rotate-3d.png
-.. |rudder| image:: ../../../../silx/resources/gui/icons/rudder.png
-.. |selected| image:: ../../../../silx/resources/gui/icons/selected.png
-.. |shape-circle-solid| image:: ../../../../silx/resources/gui/icons/shape-circle-solid.png
-.. |shape-circle| image:: ../../../../silx/resources/gui/icons/shape-circle.png
-.. |shape-diagonal| image:: ../../../../silx/resources/gui/icons/shape-diagonal.png
-.. |shape-ellipse-solid| image:: ../../../../silx/resources/gui/icons/shape-ellipse-solid.png
-.. |shape-ellipse| image:: ../../../../silx/resources/gui/icons/shape-ellipse.png
-.. |shape-horizontal| image:: ../../../../silx/resources/gui/icons/shape-horizontal.png
-.. |shape-polygon| image:: ../../../../silx/resources/gui/icons/shape-polygon.png
-.. |shape-rectangle| image:: ../../../../silx/resources/gui/icons/shape-rectangle.png
-.. |shape-square| image:: ../../../../silx/resources/gui/icons/shape-square.png
-.. |shape-vertical| image:: ../../../../silx/resources/gui/icons/shape-vertical.png
-.. |silx| image:: ../../../../silx/resources/gui/icons/silx.png
-.. |sliders-off| image:: ../../../../silx/resources/gui/icons/sliders-off.png
-.. |sliders-on| image:: ../../../../silx/resources/gui/icons/sliders-on.png
-.. |spec| image:: ../../../../silx/resources/gui/icons/spec.png
-.. |stats-active-items| image:: ../../../../silx/resources/gui/icons/stats-active-items.png
-.. |stats-visible-data| image:: ../../../../silx/resources/gui/icons/stats-visible-data.png
-.. |stats-whole-data| image:: ../../../../silx/resources/gui/icons/stats-whole-data.png
-.. |stats-whole-items| image:: ../../../../silx/resources/gui/icons/stats-whole-items.png
-.. |tree-collapse-all| image:: ../../../../silx/resources/gui/icons/tree-collapse-all.png
-.. |tree-expand-all| image:: ../../../../silx/resources/gui/icons/tree-expand-all.png
-.. |view-1d| image:: ../../../../silx/resources/gui/icons/view-1d.png
-.. |view-2d-stack| image:: ../../../../silx/resources/gui/icons/view-2d-stack.png
-.. |view-2d| image:: ../../../../silx/resources/gui/icons/view-2d.png
-.. |view-3d| image:: ../../../../silx/resources/gui/icons/view-3d.png
-.. |view-fullscreen| image:: ../../../../silx/resources/gui/icons/view-fullscreen.png
-.. |view-hdf5| image:: ../../../../silx/resources/gui/icons/view-hdf5.png
-.. |view-nexus| image:: ../../../../silx/resources/gui/icons/view-nexus.png
-.. |view-nofullscreen| image:: ../../../../silx/resources/gui/icons/view-nofullscreen.png
-.. |view-raw| image:: ../../../../silx/resources/gui/icons/view-raw.png
-.. |view-refresh| image:: ../../../../silx/resources/gui/icons/view-refresh.png
-.. |view-text| image:: ../../../../silx/resources/gui/icons/view-text.png
-.. |window-new| image:: ../../../../silx/resources/gui/icons/window-new.png
-.. |zoom-back| image:: ../../../../silx/resources/gui/icons/zoom-back.png
-.. |zoom-in| image:: ../../../../silx/resources/gui/icons/zoom-in.png
-.. |zoom-original| image:: ../../../../silx/resources/gui/icons/zoom-original.png
-.. |zoom-out| image:: ../../../../silx/resources/gui/icons/zoom-out.png
-.. |zoom| image:: ../../../../silx/resources/gui/icons/zoom.png
+.. |3d-plane-normal-x| image:: ../../../../src/silx/resources/gui/icons/3d-plane-normal-x.png
+.. |3d-plane-normal-y| image:: ../../../../src/silx/resources/gui/icons/3d-plane-normal-y.png
+.. |3d-plane-normal-z| image:: ../../../../src/silx/resources/gui/icons/3d-plane-normal-z.png
+.. |3d-plane-pan| image:: ../../../../src/silx/resources/gui/icons/3d-plane-pan.png
+.. |3d-plane| image:: ../../../../src/silx/resources/gui/icons/3d-plane.png
+.. |add-range-horizontal| image:: ../../../../src/silx/resources/gui/icons/add-range-horizontal.png
+.. |add-shape-arc| image:: ../../../../src/silx/resources/gui/icons/add-shape-arc.png
+.. |add-shape-circle| image:: ../../../../src/silx/resources/gui/icons/add-shape-circle.png
+.. |add-shape-cross| image:: ../../../../src/silx/resources/gui/icons/add-shape-cross.png
+.. |add-shape-diagonal| image:: ../../../../src/silx/resources/gui/icons/add-shape-diagonal.png
+.. |add-shape-ellipse| image:: ../../../../src/silx/resources/gui/icons/add-shape-ellipse.png
+.. |add-shape-horizontal| image:: ../../../../src/silx/resources/gui/icons/add-shape-horizontal.png
+.. |add-shape-point| image:: ../../../../src/silx/resources/gui/icons/add-shape-point.png
+.. |add-shape-polygon| image:: ../../../../src/silx/resources/gui/icons/add-shape-polygon.png
+.. |add-shape-rectangle| image:: ../../../../src/silx/resources/gui/icons/add-shape-rectangle.png
+.. |add-shape-rotated-rectangle| image:: ../../../../src/silx/resources/gui/icons/add-shape-rotated-rectangle.png
+.. |add-shape-unknown| image:: ../../../../src/silx/resources/gui/icons/add-shape-unknown.png
+.. |add-shape-vertical| image:: ../../../../src/silx/resources/gui/icons/add-shape-vertical.png
+.. |add| image:: ../../../../src/silx/resources/gui/icons/add.png
+.. |aggregation-mode| image:: ../../../../src/silx/resources/gui/icons/aggregation-mode.png
+.. |arrow-keys| image:: ../../../../src/silx/resources/gui/icons/arrow-keys.png
+.. |axis| image:: ../../../../src/silx/resources/gui/icons/axis.png
+.. |backend-opengl| image:: ../../../../src/silx/resources/gui/icons/backend-opengl.png
+.. |camera| image:: ../../../../src/silx/resources/gui/icons/camera.png
+.. |clipboard| image:: ../../../../src/silx/resources/gui/icons/clipboard.png
+.. |close| image:: ../../../../src/silx/resources/gui/icons/close.png
+.. |colorbar| image:: ../../../../src/silx/resources/gui/icons/colorbar.png
+.. |colormap-histogram| image:: ../../../../src/silx/resources/gui/icons/colormap-histogram.png
+.. |colormap-none| image:: ../../../../src/silx/resources/gui/icons/colormap-none.png
+.. |colormap-norm-arcsinh| image:: ../../../../src/silx/resources/gui/icons/colormap-norm-arcsinh.png
+.. |colormap-norm-gamma| image:: ../../../../src/silx/resources/gui/icons/colormap-norm-gamma.png
+.. |colormap-norm-linear| image:: ../../../../src/silx/resources/gui/icons/colormap-norm-linear.png
+.. |colormap-norm-log| image:: ../../../../src/silx/resources/gui/icons/colormap-norm-log.png
+.. |colormap-norm-sqrt| image:: ../../../../src/silx/resources/gui/icons/colormap-norm-sqrt.png
+.. |colormap-range| image:: ../../../../src/silx/resources/gui/icons/colormap-range.png
+.. |colormap| image:: ../../../../src/silx/resources/gui/icons/colormap.png
+.. |compare-align-auto| image:: ../../../../src/silx/resources/gui/icons/compare-align-auto.png
+.. |compare-align-center| image:: ../../../../src/silx/resources/gui/icons/compare-align-center.png
+.. |compare-align-origin| image:: ../../../../src/silx/resources/gui/icons/compare-align-origin.png
+.. |compare-align-stretch| image:: ../../../../src/silx/resources/gui/icons/compare-align-stretch.png
+.. |compare-keypoints| image:: ../../../../src/silx/resources/gui/icons/compare-keypoints.png
+.. |compare-mode-a-minus-b| image:: ../../../../src/silx/resources/gui/icons/compare-mode-a-minus-b.png
+.. |compare-mode-a| image:: ../../../../src/silx/resources/gui/icons/compare-mode-a.png
+.. |compare-mode-b| image:: ../../../../src/silx/resources/gui/icons/compare-mode-b.png
+.. |compare-mode-hline| image:: ../../../../src/silx/resources/gui/icons/compare-mode-hline.png
+.. |compare-mode-rb-channel| image:: ../../../../src/silx/resources/gui/icons/compare-mode-rb-channel.png
+.. |compare-mode-rbneg-channel| image:: ../../../../src/silx/resources/gui/icons/compare-mode-rbneg-channel.png
+.. |compare-mode-vline| image:: ../../../../src/silx/resources/gui/icons/compare-mode-vline.png
+.. |crop| image:: ../../../../src/silx/resources/gui/icons/crop.png
+.. |crosshair| image:: ../../../../src/silx/resources/gui/icons/crosshair.png
+.. |cube-back| image:: ../../../../src/silx/resources/gui/icons/cube-back.png
+.. |cube-bottom| image:: ../../../../src/silx/resources/gui/icons/cube-bottom.png
+.. |cube-front| image:: ../../../../src/silx/resources/gui/icons/cube-front.png
+.. |cube-left| image:: ../../../../src/silx/resources/gui/icons/cube-left.png
+.. |cube-right| image:: ../../../../src/silx/resources/gui/icons/cube-right.png
+.. |cube-rotate| image:: ../../../../src/silx/resources/gui/icons/cube-rotate.png
+.. |cube-top| image:: ../../../../src/silx/resources/gui/icons/cube-top.png
+.. |cube| image:: ../../../../src/silx/resources/gui/icons/cube.png
+.. |description-description| image:: ../../../../src/silx/resources/gui/icons/description-description.png
+.. |description-error| image:: ../../../../src/silx/resources/gui/icons/description-error.png
+.. |description-name| image:: ../../../../src/silx/resources/gui/icons/description-name.png
+.. |description-program| image:: ../../../../src/silx/resources/gui/icons/description-program.png
+.. |description-title| image:: ../../../../src/silx/resources/gui/icons/description-title.png
+.. |description-value| image:: ../../../../src/silx/resources/gui/icons/description-value.png
+.. |document-open| image:: ../../../../src/silx/resources/gui/icons/document-open.png
+.. |document-print| image:: ../../../../src/silx/resources/gui/icons/document-print.png
+.. |document-save| image:: ../../../../src/silx/resources/gui/icons/document-save.png
+.. |draw-brush| image:: ../../../../src/silx/resources/gui/icons/draw-brush.png
+.. |draw-pencil| image:: ../../../../src/silx/resources/gui/icons/draw-pencil.png
+.. |draw-rubber| image:: ../../../../src/silx/resources/gui/icons/draw-rubber.png
+.. |edit-copy| image:: ../../../../src/silx/resources/gui/icons/edit-copy.png
+.. |eye| image:: ../../../../src/silx/resources/gui/icons/eye.png
+.. |first| image:: ../../../../src/silx/resources/gui/icons/first.png
+.. |folder| image:: ../../../../src/silx/resources/gui/icons/folder.png
+.. |image-mask| image:: ../../../../src/silx/resources/gui/icons/image-mask.png
+.. |image-select-add| image:: ../../../../src/silx/resources/gui/icons/image-select-add.png
+.. |image-select-box| image:: ../../../../src/silx/resources/gui/icons/image-select-box.png
+.. |image-select-brush| image:: ../../../../src/silx/resources/gui/icons/image-select-brush.png
+.. |image-select-erase-rubber| image:: ../../../../src/silx/resources/gui/icons/image-select-erase-rubber.png
+.. |image-select-erase| image:: ../../../../src/silx/resources/gui/icons/image-select-erase.png
+.. |image| image:: ../../../../src/silx/resources/gui/icons/image.png
+.. |item-0dim| image:: ../../../../src/silx/resources/gui/icons/item-0dim.png
+.. |item-1dim| image:: ../../../../src/silx/resources/gui/icons/item-1dim.png
+.. |item-2dim| image:: ../../../../src/silx/resources/gui/icons/item-2dim.png
+.. |item-3dim| image:: ../../../../src/silx/resources/gui/icons/item-3dim.png
+.. |item-ndim| image:: ../../../../src/silx/resources/gui/icons/item-ndim.png
+.. |item-none| image:: ../../../../src/silx/resources/gui/icons/item-none.png
+.. |item-object| image:: ../../../../src/silx/resources/gui/icons/item-object.png
+.. |last| image:: ../../../../src/silx/resources/gui/icons/last.png
+.. |layer-nx| image:: ../../../../src/silx/resources/gui/icons/layer-nx.png
+.. |mask-clear-all| image:: ../../../../src/silx/resources/gui/icons/mask-clear-all.png
+.. |mask-clear| image:: ../../../../src/silx/resources/gui/icons/mask-clear.png
+.. |mask-invert| image:: ../../../../src/silx/resources/gui/icons/mask-invert.png
+.. |math-amplitude| image:: ../../../../src/silx/resources/gui/icons/math-amplitude.png
+.. |math-average| image:: ../../../../src/silx/resources/gui/icons/math-average.png
+.. |math-derive| image:: ../../../../src/silx/resources/gui/icons/math-derive.png
+.. |math-energy| image:: ../../../../src/silx/resources/gui/icons/math-energy.png
+.. |math-fit| image:: ../../../../src/silx/resources/gui/icons/math-fit.png
+.. |math-imaginary| image:: ../../../../src/silx/resources/gui/icons/math-imaginary.png
+.. |math-mean| image:: ../../../../src/silx/resources/gui/icons/math-mean.png
+.. |math-normalize| image:: ../../../../src/silx/resources/gui/icons/math-normalize.png
+.. |math-peak-reset| image:: ../../../../src/silx/resources/gui/icons/math-peak-reset.png
+.. |math-peak-search| image:: ../../../../src/silx/resources/gui/icons/math-peak-search.png
+.. |math-peak| image:: ../../../../src/silx/resources/gui/icons/math-peak.png
+.. |math-phase-color-log| image:: ../../../../src/silx/resources/gui/icons/math-phase-color-log.png
+.. |math-phase-color| image:: ../../../../src/silx/resources/gui/icons/math-phase-color.png
+.. |math-phase| image:: ../../../../src/silx/resources/gui/icons/math-phase.png
+.. |math-real| image:: ../../../../src/silx/resources/gui/icons/math-real.png
+.. |math-sigma| image:: ../../../../src/silx/resources/gui/icons/math-sigma.png
+.. |math-smooth| image:: ../../../../src/silx/resources/gui/icons/math-smooth.png
+.. |math-square-amplitude| image:: ../../../../src/silx/resources/gui/icons/math-square-amplitude.png
+.. |math-substract| image:: ../../../../src/silx/resources/gui/icons/math-substract.png
+.. |math-swap-sign| image:: ../../../../src/silx/resources/gui/icons/math-swap-sign.png
+.. |math-ymin-to-zero| image:: ../../../../src/silx/resources/gui/icons/math-ymin-to-zero.png
+.. |median-filter| image:: ../../../../src/silx/resources/gui/icons/median-filter.png
+.. |next| image:: ../../../../src/silx/resources/gui/icons/next.png
+.. |normal| image:: ../../../../src/silx/resources/gui/icons/normal.png
+.. |nxdata-axis-add| image:: ../../../../src/silx/resources/gui/icons/nxdata-axis-add.png
+.. |nxdata-axis-remove| image:: ../../../../src/silx/resources/gui/icons/nxdata-axis-remove.png
+.. |nxdata-create| image:: ../../../../src/silx/resources/gui/icons/nxdata-create.png
+.. |nxdata-remove| image:: ../../../../src/silx/resources/gui/icons/nxdata-remove.png
+.. |pan| image:: ../../../../src/silx/resources/gui/icons/pan.png
+.. |pixel-intensities| image:: ../../../../src/silx/resources/gui/icons/pixel-intensities.png
+.. |plot-grid| image:: ../../../../src/silx/resources/gui/icons/plot-grid.png
+.. |plot-roi-above| image:: ../../../../src/silx/resources/gui/icons/plot-roi-above.png
+.. |plot-roi-below| image:: ../../../../src/silx/resources/gui/icons/plot-roi-below.png
+.. |plot-roi-between| image:: ../../../../src/silx/resources/gui/icons/plot-roi-between.png
+.. |plot-roi-reset| image:: ../../../../src/silx/resources/gui/icons/plot-roi-reset.png
+.. |plot-roi| image:: ../../../../src/silx/resources/gui/icons/plot-roi.png
+.. |plot-symbols| image:: ../../../../src/silx/resources/gui/icons/plot-symbols.png
+.. |plot-toggle-points| image:: ../../../../src/silx/resources/gui/icons/plot-toggle-points.png
+.. |plot-widget| image:: ../../../../src/silx/resources/gui/icons/plot-widget.png
+.. |plot-window-image| image:: ../../../../src/silx/resources/gui/icons/plot-window-image.png
+.. |plot-window| image:: ../../../../src/silx/resources/gui/icons/plot-window.png
+.. |plot-xauto| image:: ../../../../src/silx/resources/gui/icons/plot-xauto.png
+.. |plot-xlog| image:: ../../../../src/silx/resources/gui/icons/plot-xlog.png
+.. |plot-yauto| image:: ../../../../src/silx/resources/gui/icons/plot-yauto.png
+.. |plot-ydown| image:: ../../../../src/silx/resources/gui/icons/plot-ydown.png
+.. |plot-ylog| image:: ../../../../src/silx/resources/gui/icons/plot-ylog.png
+.. |plot-yup| image:: ../../../../src/silx/resources/gui/icons/plot-yup.png
+.. |pointing-hand| image:: ../../../../src/silx/resources/gui/icons/pointing-hand.png
+.. |previous| image:: ../../../../src/silx/resources/gui/icons/previous.png
+.. |profile-clear| image:: ../../../../src/silx/resources/gui/icons/profile-clear.png
+.. |profile1D| image:: ../../../../src/silx/resources/gui/icons/profile1D.png
+.. |profile2D| image:: ../../../../src/silx/resources/gui/icons/profile2D.png
+.. |remove| image:: ../../../../src/silx/resources/gui/icons/remove.png
+.. |rm| image:: ../../../../src/silx/resources/gui/icons/rm.png
+.. |rotate-3d| image:: ../../../../src/silx/resources/gui/icons/rotate-3d.png
+.. |rudder| image:: ../../../../src/silx/resources/gui/icons/rudder.png
+.. |ruler| image:: ../../../../src/silx/resources/gui/icons/ruler.png
+.. |scale-auto| image:: ../../../../src/silx/resources/gui/icons/scale-auto.png
+.. |scale-fixed| image:: ../../../../src/silx/resources/gui/icons/scale-fixed.png
+.. |selected| image:: ../../../../src/silx/resources/gui/icons/selected.png
+.. |shape-circle-solid| image:: ../../../../src/silx/resources/gui/icons/shape-circle-solid.png
+.. |shape-circle| image:: ../../../../src/silx/resources/gui/icons/shape-circle.png
+.. |shape-cross| image:: ../../../../src/silx/resources/gui/icons/shape-cross.png
+.. |shape-diagonal-directed| image:: ../../../../src/silx/resources/gui/icons/shape-diagonal-directed.png
+.. |shape-diagonal| image:: ../../../../src/silx/resources/gui/icons/shape-diagonal.png
+.. |shape-ellipse-solid| image:: ../../../../src/silx/resources/gui/icons/shape-ellipse-solid.png
+.. |shape-ellipse| image:: ../../../../src/silx/resources/gui/icons/shape-ellipse.png
+.. |shape-horizontal| image:: ../../../../src/silx/resources/gui/icons/shape-horizontal.png
+.. |shape-polygon| image:: ../../../../src/silx/resources/gui/icons/shape-polygon.png
+.. |shape-rectangle| image:: ../../../../src/silx/resources/gui/icons/shape-rectangle.png
+.. |shape-square| image:: ../../../../src/silx/resources/gui/icons/shape-square.png
+.. |shape-vertical| image:: ../../../../src/silx/resources/gui/icons/shape-vertical.png
+.. |side-histograms| image:: ../../../../src/silx/resources/gui/icons/side-histograms.png
+.. |silx| image:: ../../../../src/silx/resources/gui/icons/silx.png
+.. |slice-cross| image:: ../../../../src/silx/resources/gui/icons/slice-cross.png
+.. |slice-horizontal| image:: ../../../../src/silx/resources/gui/icons/slice-horizontal.png
+.. |slice-vertical| image:: ../../../../src/silx/resources/gui/icons/slice-vertical.png
+.. |sliders-off| image:: ../../../../src/silx/resources/gui/icons/sliders-off.png
+.. |sliders-on| image:: ../../../../src/silx/resources/gui/icons/sliders-on.png
+.. |spec| image:: ../../../../src/silx/resources/gui/icons/spec.png
+.. |stats-active-items| image:: ../../../../src/silx/resources/gui/icons/stats-active-items.png
+.. |stats-visible-data| image:: ../../../../src/silx/resources/gui/icons/stats-visible-data.png
+.. |stats-whole-data| image:: ../../../../src/silx/resources/gui/icons/stats-whole-data.png
+.. |stats-whole-items| image:: ../../../../src/silx/resources/gui/icons/stats-whole-items.png
+.. |tree-collapse-all| image:: ../../../../src/silx/resources/gui/icons/tree-collapse-all.png
+.. |tree-expand-all| image:: ../../../../src/silx/resources/gui/icons/tree-expand-all.png
+.. |tree-sort| image:: ../../../../src/silx/resources/gui/icons/tree-sort.png
+.. |view-1d| image:: ../../../../src/silx/resources/gui/icons/view-1d.png
+.. |view-2d-stack| image:: ../../../../src/silx/resources/gui/icons/view-2d-stack.png
+.. |view-2d| image:: ../../../../src/silx/resources/gui/icons/view-2d.png
+.. |view-3d| image:: ../../../../src/silx/resources/gui/icons/view-3d.png
+.. |view-fullscreen| image:: ../../../../src/silx/resources/gui/icons/view-fullscreen.png
+.. |view-hdf5| image:: ../../../../src/silx/resources/gui/icons/view-hdf5.png
+.. |view-nexus| image:: ../../../../src/silx/resources/gui/icons/view-nexus.png
+.. |view-nofullscreen| image:: ../../../../src/silx/resources/gui/icons/view-nofullscreen.png
+.. |view-raw| image:: ../../../../src/silx/resources/gui/icons/view-raw.png
+.. |view-refresh| image:: ../../../../src/silx/resources/gui/icons/view-refresh.png
+.. |view-text| image:: ../../../../src/silx/resources/gui/icons/view-text.png
+.. |window-new| image:: ../../../../src/silx/resources/gui/icons/window-new.png
+.. |zoom-back| image:: ../../../../src/silx/resources/gui/icons/zoom-back.png
+.. |zoom-in| image:: ../../../../src/silx/resources/gui/icons/zoom-in.png
+.. |zoom-original| image:: ../../../../src/silx/resources/gui/icons/zoom-original.png
+.. |zoom-out| image:: ../../../../src/silx/resources/gui/icons/zoom-out.png
+.. |zoom| image:: ../../../../src/silx/resources/gui/icons/zoom.png
diff --git a/doc/source/modules/gui/plot/dev.rst b/doc/source/modules/gui/plot/dev.rst
index 8966487..0c848e9 100644
--- a/doc/source/modules/gui/plot/dev.rst
+++ b/doc/source/modules/gui/plot/dev.rst
@@ -92,6 +92,7 @@ The following modules are the modules used internally by the plot package.
.. automodule:: silx.gui.plot.CurvesROIWidget
:members:
+ :noindex:
:mod:`Interaction`
++++++++++++++++++
diff --git a/doc/source/modules/gui/plot/getting_started.rst b/doc/source/modules/gui/plot/getting_started.rst
index 899d262..ead9e43 100644
--- a/doc/source/modules/gui/plot/getting_started.rst
+++ b/doc/source/modules/gui/plot/getting_started.rst
@@ -20,8 +20,6 @@ For a complete description of the API, see :mod:`silx.gui.plot`.
Use :mod:`silx.gui.plot` from (I)Python console
-----------------------------------------------
-We recommend to use (I)Python 3.x and PyQt5.
-
From a Python or IPython interpreter, the simplest way is to import the :mod:`silx.sx` module:
>>> from silx import sx
@@ -48,10 +46,6 @@ the way silx loads Qt and the way IPython is doing it through the ``--gui`` opti
`%pylab <http://ipython.org/ipython-doc/stable/interactive/magics.html#magic-pylab>`_ magics.
In this case, IPython magics that initialize Qt might not work after importing modules from silx.gui.
-When using Python2.7 and PyQt4, there is another incompatibility to deal with as
-silx requires PyQt4 API version 2 (See note below for explanation).
-In this case, start IPython with the ``QT_API`` environment variable set to ``pyqt``.
-
On Linux and MacOS X, run from the command line::
QT_API=pyqt ipython
@@ -61,16 +55,6 @@ On Windows, run from the command line::
set QT_API=pyqt&&ipython
-.. note:: PyQt4 used from Python 2.x provides 2 incompatible versions of QString and QVariant:
-
- - version 1, the legacy version which is also the default, and
- - version 2, a more pythonic one, which is the only one supported by *silx*.
-
- All other configurations (i.e., PyQt4 on Python 3.x, PySide2, PyQt5, IPython QtConsole widget) uses version 2.
-
- For more information, see `IPython, PyQt and PySide <http://ipython.org/ipython-doc/stable/interactive/reference.html#pyqt-and-pyside>`_.
-
-
Plot functions
++++++++++++++
@@ -101,9 +85,9 @@ A Qt GUI script must have a QApplication initialised before creating widgets:
if __name__ == '__main__':
[...]
- qapp.exec_()
+ qapp.exec()
-Unless a Qt binding has already been loaded, :mod:`silx.gui.qt` uses one of the supported Qt bindings (PyQt5, PyQt4, PySide2).
+Unless a Qt binding has already been loaded, :mod:`silx.gui.qt` uses one of the supported Qt bindings (PyQt5, PySide6, PyQt6).
If you prefer to choose the Qt binding yourself, import it before importing
a module from :mod:`silx.gui`:
diff --git a/doc/source/modules/gui/plot/img/BasicGridStatsWidget.png b/doc/source/modules/gui/plot/img/BasicGridStatsWidget.png
new file mode 100644
index 0000000..a468cc1
--- /dev/null
+++ b/doc/source/modules/gui/plot/img/BasicGridStatsWidget.png
Binary files differ
diff --git a/doc/source/modules/gui/plot/img/BasicStatsWidget.png b/doc/source/modules/gui/plot/img/BasicStatsWidget.png
new file mode 100644
index 0000000..6dbdd30
--- /dev/null
+++ b/doc/source/modules/gui/plot/img/BasicStatsWidget.png
Binary files differ
diff --git a/doc/source/modules/gui/plot/img/LimitsToolBar.png b/doc/source/modules/gui/plot/img/LimitsToolBar.png
index 99af8bd..2d96458 100644
--- a/doc/source/modules/gui/plot/img/LimitsToolBar.png
+++ b/doc/source/modules/gui/plot/img/LimitsToolBar.png
Binary files differ
diff --git a/doc/source/modules/gui/plot/img/ROIStatsWidget.png b/doc/source/modules/gui/plot/img/ROIStatsWidget.png
new file mode 100644
index 0000000..fae9d62
--- /dev/null
+++ b/doc/source/modules/gui/plot/img/ROIStatsWidget.png
Binary files differ
diff --git a/doc/source/modules/gui/plot/img/logColorbar.png b/doc/source/modules/gui/plot/img/logColorbar.png
index cdd247c..31594e0 100644
--- a/doc/source/modules/gui/plot/img/logColorbar.png
+++ b/doc/source/modules/gui/plot/img/logColorbar.png
Binary files differ
diff --git a/doc/source/modules/gui/plot/index.rst b/doc/source/modules/gui/plot/index.rst
index 6f06830..7f60ba4 100644
--- a/doc/source/modules/gui/plot/index.rst
+++ b/doc/source/modules/gui/plot/index.rst
@@ -54,13 +54,21 @@ Additionnal plot tool widgets:
actions/index.rst
plottoolbuttons.rst
- tools.rst
+ tools/index.rst
profile.rst
roi.rst
printpreviewtoolbutton.rst
statswidget.rst
+ roistatswidget.rst
stats/index.rst
+Utilities
+
+.. toctree::
+ :maxdepth: 2
+
+ utils.rst
+
Internals
---------
diff --git a/doc/source/modules/gui/plot/items.rst b/doc/source/modules/gui/plot/items.rst
index 43eb77e..2b2985b 100644
--- a/doc/source/modules/gui/plot/items.rst
+++ b/doc/source/modules/gui/plot/items.rst
@@ -118,3 +118,34 @@ Axis
.. automodule:: silx.gui.plot.items.roi
:members:
+ :show-inheritance:
+
+ .. autoclass:: silx.gui.plot.items.roi.ArcROI
+ :members:
+ :show-inheritance:
+
+ .. autoclass:: silx.gui.plot.items.roi.BandROI
+ :members:
+ :show-inheritance:
+
+
+Base class for regions of interest
+++++++++++++++++++++++++++++++++++
+
+.. autoclass:: silx.gui.plot.items._roi_base._RegionOfInterestBase
+ :members:
+ :show-inheritance:
+
+.. autoclass:: silx.gui.plot.items.roi.RegionOfInterest
+ :members:
+ :show-inheritance:
+
+.. autoclass:: silx.gui.plot.items.roi.HandleBasedROI
+ :members:
+ :show-inheritance:
+
+.. autoclass:: silx.gui.plot.items.roi.InteractionModeMixIn
+ :members:
+
+.. autoclass:: silx.gui.plot.items.roi.RoiInteractionMode
+ :members:
diff --git a/doc/source/modules/gui/plot/plotsignal.rst b/doc/source/modules/gui/plot/plotsignal.rst
index 091f481..641b0ef 100644
--- a/doc/source/modules/gui/plot/plotsignal.rst
+++ b/doc/source/modules/gui/plot/plotsignal.rst
@@ -91,6 +91,7 @@ Both share the following keys:
- 'event': 'curveClicked' or 'imageClicked'
- 'button': the mouse button that was pressed in 'left', 'middle', 'right'
+- 'item': The plot item object that was clicked
- 'label': The legend associated with the clicked image or curve
- 'type': The type of item in 'curve', 'image'
- 'x' and 'y': The clicked position in data coordinates
diff --git a/doc/source/modules/gui/plot/plotwidget.rst b/doc/source/modules/gui/plot/plotwidget.rst
index 9978479..05dd77c 100644
--- a/doc/source/modules/gui/plot/plotwidget.rst
+++ b/doc/source/modules/gui/plot/plotwidget.rst
@@ -82,7 +82,10 @@ The following methods handle plot limits, aspect ratio, grid and axes display:
.. automethod:: PlotWidget.setKeepDataAspectRatio
.. automethod:: PlotWidget.getGraphGrid
.. automethod:: PlotWidget.setGraphGrid
+.. automethod:: PlotWidget.isAxesDisplayed
.. automethod:: PlotWidget.setAxesDisplayed
+.. automethod:: PlotWidget.getAxesMargins
+.. automethod:: PlotWidget.setAxesMargins
Reset zoom
..........
@@ -112,6 +115,7 @@ Interaction
Those methods allow to change the interaction mode (e.g., drawing mode)
of the plot and to toggle the use of a crosshair cursor:
+.. automethod:: PlotWidget.interaction
.. automethod:: PlotWidget.getInteractiveMode
.. automethod:: PlotWidget.setInteractiveMode
diff --git a/doc/source/modules/gui/plot/roi.rst b/doc/source/modules/gui/plot/roi.rst
index 77b5c2a..efe41a7 100644
--- a/doc/source/modules/gui/plot/roi.rst
+++ b/doc/source/modules/gui/plot/roi.rst
@@ -1,12 +1,15 @@
-.. currentmodule:: silx.gui.plot
+.. currentmodule:: silx.gui.plot.CurvesROIWidget
:mod:`CurvesROIWidget`: ROI from curves
=======================================
+
.. |roiWidgetImage| image:: img/roiwidget.png
:height: 400px
:align: middle
+.. automodule:: silx.gui.plot.CurvesROIWidget
+
You can access to the ROIWidget from a Plot window by :
- using the tool button 'ROI'
@@ -14,4 +17,28 @@ You can access to the ROIWidget from a Plot window by :
|roiWidgetImage|
-.. automodule:: silx.gui.plot.CurvesROIWidget
+
+
+
+:class:`ROI` class
+------------------
+
+.. autoclass:: ROI
+ :show-inheritance:
+ :members:
+
+
+:class:`CurvesROIWidget` class
+-------------------------------
+
+.. autoclass:: CurvesROIWidget
+ :show-inheritance:
+ :members:
+
+
+:class:`ROITable` class
+-----------------------
+
+.. autoclass:: ROITable
+ :show-inheritance:
+ :members:
diff --git a/doc/source/modules/gui/plot/roistatswidget.rst b/doc/source/modules/gui/plot/roistatswidget.rst
new file mode 100644
index 0000000..d9563b5
--- /dev/null
+++ b/doc/source/modules/gui/plot/roistatswidget.rst
@@ -0,0 +1,24 @@
+
+.. currentmodule:: silx.gui.plot.ROIStatsWidget
+
+:mod:`ROIStatsWidget`: Display a set of statistics for couples (plot items, roi)
+================================================================================
+
+An example of the usage is given in examples/plotRoiStats.py
+
+.. automodule:: silx.gui.plot.ROIStatsWidget
+
+
+:class:`ROIStatsWidget` class
+-----------------------------
+
+.. autoclass:: ROIStatsWidget
+ :show-inheritance:
+ :members:
+
+:class:`ROIStatsItemHelper` class
+---------------------------------
+
+.. autoclass:: ROIStatsItemHelper
+ :show-inheritance:
+ :members:
diff --git a/doc/source/modules/gui/plot/statswidget.rst b/doc/source/modules/gui/plot/statswidget.rst
index f534921..1574abc 100644
--- a/doc/source/modules/gui/plot/statswidget.rst
+++ b/doc/source/modules/gui/plot/statswidget.rst
@@ -31,3 +31,19 @@
:show-inheritance:
:members:
+
+:class:`BasicLineStatsWidget` class
+-----------------------------------
+
+.. autoclass:: BasicLineStatsWidget
+ :show-inheritance:
+ :members:
+
+
+:class:`BasicGridStatsWidget` class
+-----------------------------------
+
+.. autoclass:: BasicGridStatsWidget
+ :show-inheritance:
+ :members:
+
diff --git a/doc/source/modules/gui/plot/img/CurveLegendsWidget.png b/doc/source/modules/gui/plot/tools/img/CurveLegendsWidget.png
index e7fa9f8..e7fa9f8 100644
--- a/doc/source/modules/gui/plot/img/CurveLegendsWidget.png
+++ b/doc/source/modules/gui/plot/tools/img/CurveLegendsWidget.png
Binary files differ
diff --git a/doc/source/modules/gui/plot/img/linearColorbar.png b/doc/source/modules/gui/plot/tools/img/linearColorbar.png
index 26621ce..26621ce 100644
--- a/doc/source/modules/gui/plot/img/linearColorbar.png
+++ b/doc/source/modules/gui/plot/tools/img/linearColorbar.png
Binary files differ
diff --git a/doc/source/modules/gui/plot/tools.rst b/doc/source/modules/gui/plot/tools/index.rst
index d7c96b5..c75aea5 100644
--- a/doc/source/modules/gui/plot/tools.rst
+++ b/doc/source/modules/gui/plot/tools/index.rst
@@ -1,10 +1,23 @@
+.. currentmodule:: silx.gui.plot.tools
+
:mod:`~silx.gui.plot.tools`: Tool widgets for PlotWidget
========================================================
-.. currentmodule:: silx.gui.plot.tools
-
.. automodule:: silx.gui.plot.tools
+Tools API
+---------
+
+Tools are divided into the following sub-modules:
+
+.. toctree::
+ :maxdepth: 1
+
+ profile.rst
+
+Other tools API
+---------------
+
:class:`PositionInfo` class
---------------------------
@@ -91,21 +104,6 @@
.. autoclass:: RegionOfInterestTableWidget
:members:
-:mod:`~silx.gui.plot.tools.profile`: Profile Tools
---------------------------------------------------
-
-.. automodule:: silx.gui.plot.tools.profile
-
-.. currentmodule:: silx.gui.plot.tools.profile
-
-:class:`ScatterProfileToolBar`
-++++++++++++++++++++++++++++++
-
-.. autoclass:: ScatterProfileToolBar
- :members: sigProfileChanged, getProfilePoints, getProfileValues, getProfileTitle, getPlotWidget, isDefaultProfileWindowEnabled, setDefaultProfileWindowEnabled, getDefaultProfileWindow, getColor, setColor, clearProfile, getNPoints, setNPoints
-
-.. currentmodule:: silx.gui.plot
-
:mod:`ColorBar`: ColorBar Widget
================================
diff --git a/doc/source/modules/gui/plot/tools/profile.rst b/doc/source/modules/gui/plot/tools/profile.rst
new file mode 100644
index 0000000..32d8a26
--- /dev/null
+++ b/doc/source/modules/gui/plot/tools/profile.rst
@@ -0,0 +1,84 @@
+.. currentmodule:: silx.gui.plot.tools.profile
+
+:mod:`~silx.gui.plot.tools.profile`: Profile tool for PlotWidget
+================================================================
+
+.. automodule:: silx.gui.plot.tools.profile
+
+The profile package is divided into several sub-modules.
+
+:mod:`~silx.gui.plot.tools.profile.manager` module
+--------------------------------------------------
+
+.. automodule:: silx.gui.plot.tools.profile.manager
+
+:class:`ProfileManager` class
++++++++++++++++++++++++++++++
+
+.. autoclass:: ProfileManager
+ :show-inheritance:
+ :members:
+
+:class:`ProfileWindow` class
+++++++++++++++++++++++++++++
+
+.. autoclass:: ProfileWindow
+ :show-inheritance:
+ :members:
+
+:mod:`~silx.gui.plot.tools.profile.editors` module
+--------------------------------------------------
+
+.. automodule:: silx.gui.plot.tools.profile.editors
+
+:class:`ProfileRoiEditorAction` class
++++++++++++++++++++++++++++++++++++++
+
+.. autoclass:: ProfileRoiEditorAction
+ :show-inheritance:
+ :members:
+
+:mod:`~silx.gui.plot.tools.profile.core` module
+-----------------------------------------------
+
+.. automodule:: silx.gui.plot.tools.profile.core
+
+:class:`ProfileRoiMixIn` class
+++++++++++++++++++++++++++++++
+
+.. autoclass:: ProfileRoiMixIn
+ :show-inheritance:
+ :members:
+
+:class:`CurveProfileData` class
++++++++++++++++++++++++++++++++
+
+.. autoclass:: CurveProfileData
+ :show-inheritance:
+ :members:
+
+
+:class:`ImageProfileData` class
++++++++++++++++++++++++++++++++
+
+.. autoclass:: ImageProfileData
+ :show-inheritance:
+ :members:
+
+:mod:`~silx.gui.plot.tools.profile.ScatterProfileToolBar` module
+----------------------------------------------------------------
+
+.. automodule:: silx.gui.plot.tools.profile.ScatterProfileToolBar
+
+:class:`ScatterProfileToolBar`
+++++++++++++++++++++++++++++++
+
+.. autoclass:: ScatterProfileToolBar
+ :show-inheritance:
+ :members:
+
+:mod:`~silx.gui.plot.tools.profile.rois` module
+-----------------------------------------------
+
+.. automodule:: silx.gui.plot.tools.profile.rois
+
diff --git a/doc/source/modules/gui/plot/utils.rst b/doc/source/modules/gui/plot/utils.rst
new file mode 100644
index 0000000..e930208
--- /dev/null
+++ b/doc/source/modules/gui/plot/utils.rst
@@ -0,0 +1,12 @@
+.. currentmodule:: silx.gui.plot.utils
+
+
+:mod:`axis`: utilities for plots
+================================
+
+SyncAxes
+--------
+
+.. autoclass:: silx.gui.plot.utils.axis.SyncAxes
+ :members:
+
diff --git a/doc/source/modules/gui/plot3d/glutils.rst b/doc/source/modules/gui/plot3d/glutils.rst
index 2c36e83..21781d9 100644
--- a/doc/source/modules/gui/plot3d/glutils.rst
+++ b/doc/source/modules/gui/plot3d/glutils.rst
@@ -13,13 +13,17 @@
Utility functions
-----------------
-.. currentmodule:: silx.gui._glutils
+.. currentmodule:: silx.gui._glutils.Context
For OpenGL context management:
-.. autofunction:: getGLContext
+.. autofunction:: getCurrent
+
+.. autofunction:: setCurrent
-.. autofunction:: setGLContextGetter
+.. autofunction:: current
+
+.. currentmodule:: silx.gui._glutils
For type checking and conversion:
diff --git a/doc/source/modules/gui/plot3d/img/SceneWidget.png b/doc/source/modules/gui/plot3d/img/SceneWidget.png
index 610c41a..7ad6de4 100644
--- a/doc/source/modules/gui/plot3d/img/SceneWidget.png
+++ b/doc/source/modules/gui/plot3d/img/SceneWidget.png
Binary files differ
diff --git a/doc/source/modules/gui/plot3d/items.rst b/doc/source/modules/gui/plot3d/items.rst
index 1162cb9..ba39336 100644
--- a/doc/source/modules/gui/plot3d/items.rst
+++ b/doc/source/modules/gui/plot3d/items.rst
@@ -53,7 +53,7 @@ The following classes are items that describes the content of a :class:`SceneWid
:class:`Scatter2D` inherits from :class:`.DataItem3D` and also provides its API.
.. autoclass:: Scatter2D
- :members: getData, setData, getXData, getYData, getValues,
+ :members: getData, setData, getXData, getYData, getValueData,
supportedVisualizations, isPropertyEnabled,
getVisualization, setVisualization,
isHeightMap, setHeightMap,
@@ -67,7 +67,7 @@ The following classes are items that describes the content of a :class:`SceneWid
:class:`Scatter3D` inherits from :class:`.DataItem3D` and also provides its API.
.. autoclass:: Scatter3D
- :members: getData, setData, getXData, getYData, getZData, getValues,
+ :members: getData, setData, getXData, getYData, getZData, getValueData,
getColormap, setColormap,
getSupportedSymbols, getSymbol, setSymbol
@@ -112,6 +112,29 @@ The following classes allows to configure :class:`ScalarField3D` visualization:
getParameters, setParameters,
getDisplayValuesBelowMin, setDisplayValuesBelowMin
+Height map
+----------
+
+.. currentmodule:: silx.gui.plot3d.items.image
+
+:class:`HeightMapData`
+++++++++++++++++++++++
+
+:class:`HeightMapData` inherits from :class:`.DataItem3D` and also provides its API.
+
+.. autoclass:: HeightMapData
+ :members: getData, setData,
+ getColormappedData, setColormappedData
+
+:class:`HeightMapRGBA`
+++++++++++++++++++++++
+
+:class:`HeightMapRGBA` inherits from :class:`.DataItem3D` and also provides its API.
+
+.. autoclass:: HeightMapRGBA
+ :members: getData, setData,
+ getColorData, setColorData
+
Clipping plane
--------------
diff --git a/doc/source/modules/gui/widgets/img/FrameBrowser.png b/doc/source/modules/gui/widgets/img/FrameBrowser.png
index c5624f7..6f46631 100644
--- a/doc/source/modules/gui/widgets/img/FrameBrowser.png
+++ b/doc/source/modules/gui/widgets/img/FrameBrowser.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png b/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png
index d64b2df..13a4ddf 100644
--- a/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png
+++ b/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/PeriodicCombo.png b/doc/source/modules/gui/widgets/img/PeriodicCombo.png
index e0b40c2..bec3a78 100644
--- a/doc/source/modules/gui/widgets/img/PeriodicCombo.png
+++ b/doc/source/modules/gui/widgets/img/PeriodicCombo.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/PeriodicList.png b/doc/source/modules/gui/widgets/img/PeriodicList.png
index d1e540b..a695525 100644
--- a/doc/source/modules/gui/widgets/img/PeriodicList.png
+++ b/doc/source/modules/gui/widgets/img/PeriodicList.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/PeriodicTable.png b/doc/source/modules/gui/widgets/img/PeriodicTable.png
index c06dded..70039ab 100644
--- a/doc/source/modules/gui/widgets/img/PeriodicTable.png
+++ b/doc/source/modules/gui/widgets/img/PeriodicTable.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/RangeSlider.png b/doc/source/modules/gui/widgets/img/RangeSlider.png
index b068c6f..f552fb3 100644
--- a/doc/source/modules/gui/widgets/img/RangeSlider.png
+++ b/doc/source/modules/gui/widgets/img/RangeSlider.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/TableWidget.png b/doc/source/modules/gui/widgets/img/TableWidget.png
index a0f819f..959af57 100644
--- a/doc/source/modules/gui/widgets/img/TableWidget.png
+++ b/doc/source/modules/gui/widgets/img/TableWidget.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png b/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png
index 4710d16..5d1af4c 100644
--- a/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png
+++ b/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/img/WaitingPushButton.png b/doc/source/modules/gui/widgets/img/WaitingPushButton.png
index fa1d51a..5bfcdb8 100644
--- a/doc/source/modules/gui/widgets/img/WaitingPushButton.png
+++ b/doc/source/modules/gui/widgets/img/WaitingPushButton.png
Binary files differ
diff --git a/doc/source/modules/gui/widgets/printpreview.rst b/doc/source/modules/gui/widgets/printpreview.rst
index d0b7999..bff2381 100644
--- a/doc/source/modules/gui/widgets/printpreview.rst
+++ b/doc/source/modules/gui/widgets/printpreview.rst
@@ -56,5 +56,5 @@ Example
commentPosition="CENTER")
w.addImage(qt.QImage(filename), comment=comment, commentPosition="LEFT")
- w.exec_()
- a.exec_()
+ w.exec()
+ a.exec()
diff --git a/doc/source/modules/image/index.rst b/doc/source/modules/image/index.rst
index 477cc9f..cf4867b 100644
--- a/doc/source/modules/image/index.rst
+++ b/doc/source/modules/image/index.rst
@@ -12,4 +12,6 @@
marchingsquares.rst
shapes.rst
sift.rst
+ projection.rst
backprojection.rst
+ reconstruction.rst
diff --git a/doc/source/modules/image/shapes.rst b/doc/source/modules/image/shapes.rst
index a20b0cd..be51975 100644
--- a/doc/source/modules/image/shapes.rst
+++ b/doc/source/modules/image/shapes.rst
@@ -2,7 +2,7 @@
.. currentmodule:: silx.image
:mod:`shapes`: 2D shapes drawing
----------------------------------
+--------------------------------
.. automodule:: silx.image.shapes
- :members: circle_fill, draw_line, polygon_fill_mask, Polygon
+ :members: circle_fill, ellipse_fill, draw_line, polygon_fill_mask, Polygon
diff --git a/doc/source/modules/index.rst b/doc/source/modules/index.rst
index b6e0036..2845d3f 100644
--- a/doc/source/modules/index.rst
+++ b/doc/source/modules/index.rst
@@ -1,3 +1,5 @@
+.. _API Reference:
+
API Reference
=============
diff --git a/doc/source/modules/io/commonh5.rst b/doc/source/modules/io/commonh5.rst
new file mode 100644
index 0000000..9e62ccd
--- /dev/null
+++ b/doc/source/modules/io/commonh5.rst
@@ -0,0 +1,28 @@
+. currentmodule:: silx.io
+
+:mod:`commonh5`: Helpers for writing h5py-like API
+--------------------------------------------------
+
+.. automodule:: silx.io.commonh5
+
+Classes
++++++++
+
+.. autoclass:: Node
+ :members:
+
+.. autoclass:: File
+ :show-inheritance:
+ :members:
+
+.. autoclass:: Group
+ :show-inheritance:
+ :undoc-members:
+ :members: name, basename, file, attrs, h5py_class, parent,
+ get, keys, values, items, visit, visititems
+ :special-members: __getitem__, __len__, __contains__, __iter__
+ :exclude-members: add_node
+
+.. autoclass:: Dataset
+ :show-inheritance:
+ :members:
diff --git a/doc/source/modules/io/fioh5.rst b/doc/source/modules/io/fioh5.rst
new file mode 100644
index 0000000..99498de
--- /dev/null
+++ b/doc/source/modules/io/fioh5.rst
@@ -0,0 +1,27 @@
+
+.. currentmodule:: silx.io
+
+:mod:`fioh5`: h5py-like API to FIO file
+----------------------------------------
+
+.. automodule:: silx.io.fioh5
+
+
+Classes
++++++++
+
+- :class:`FioH5`
+- :class:`FioFile`
+
+.. autoclass:: FioH5
+ :members:
+ :show-inheritance:
+ :undoc-members:
+ :inherited-members: name, basename, attrs, h5py_class, parent,
+ get, keys, values, items,
+ :special-members: __getitem__, __len__, __contains__, __enter__, __exit__, __iter__
+ :exclude-members: add_node
+
+.. autoclass:: FioFile
+
+.. autofunction:: is_fiofile \ No newline at end of file
diff --git a/doc/source/modules/io/h5py_utils.rst b/doc/source/modules/io/h5py_utils.rst
new file mode 100644
index 0000000..b6461b1
--- /dev/null
+++ b/doc/source/modules/io/h5py_utils.rst
@@ -0,0 +1,8 @@
+
+.. currentmodule:: silx.io
+
+:mod:`h5py_utils`: HDF5 I/O utilities
+-------------------------------------
+
+.. automodule:: silx.io.h5py_utils
+ :members:
diff --git a/doc/source/modules/io/index.rst b/doc/source/modules/io/index.rst
index b504695..b69a760 100644
--- a/doc/source/modules/io/index.rst
+++ b/doc/source/modules/io/index.rst
@@ -7,7 +7,8 @@
.. toctree::
:maxdepth: 1
-
+
+ commonh5.rst
configdict.rst
convert.rst
dictdump.rst
@@ -16,8 +17,10 @@
specfile.rst
specfilewrapper.rst
spech5.rst
+ fioh5.rst
url.rst
utils.rst
+ h5py_utils.rst
Top-level functions
-------------------
diff --git a/doc/source/modules/io/specfile.rst b/doc/source/modules/io/specfile.rst
index a937ca8..9b26e31 100644
--- a/doc/source/modules/io/specfile.rst
+++ b/doc/source/modules/io/specfile.rst
@@ -5,8 +5,7 @@
----------------------------------
.. automodule:: silx.io.specfile
- :members:
- :undoc-members:
+
.. autoclass:: silx.io.specfile.SpecFile
:members:
diff --git a/doc/source/modules/io/spech5.rst b/doc/source/modules/io/spech5.rst
index 61e0083..a9b8456 100644
--- a/doc/source/modules/io/spech5.rst
+++ b/doc/source/modules/io/spech5.rst
@@ -26,14 +26,6 @@ Classes
.. autoclass:: SpecH5Group
:show-inheritance:
-.. autoclass:: silx.io.commonh5.Group
- :show-inheritance:
- :undoc-members:
- :members: name, basename, file, attrs, h5py_class, parent,
- get, keys, values, items, visit, visititems
- :special-members: __getitem__, __len__, __contains__, __iter__
- :exclude-members: add_node
-
.. autoclass:: SpecH5Dataset
:show-inheritance:
diff --git a/doc/source/modules/math/fit/functions.rst b/doc/source/modules/math/fit/functions.rst
index f354964..9f0f092 100644
--- a/doc/source/modules/math/fit/functions.rst
+++ b/doc/source/modules/math/fit/functions.rst
@@ -21,6 +21,7 @@ Fit functions
.. autofunction:: silx.math.fit.sum_splitgauss
.. autofunction:: silx.math.fit.sum_splitlorentz
.. autofunction:: silx.math.fit.sum_splitpvoigt
+.. autofunction:: silx.math.fit.sum_splitpvoigt2
.. autofunction:: silx.math.fit.sum_stepdown
.. autofunction:: silx.math.fit.sum_stepup
diff --git a/doc/source/modules/opencl/convolution.rst b/doc/source/modules/opencl/convolution.rst
new file mode 100644
index 0000000..f33cc5b
--- /dev/null
+++ b/doc/source/modules/opencl/convolution.rst
@@ -0,0 +1,10 @@
+
+.. currentmodule:: silx.opencl
+
+:mod:`convolution`: Convolution
+-------------------------------
+
+.. automodule:: silx.opencl.convolution
+ :members: Convolution
+ :show-inheritance:
+ :undoc-members:
diff --git a/doc/source/modules/opencl/index.rst b/doc/source/modules/opencl/index.rst
index e17eecb..ef8b9e6 100644
--- a/doc/source/modules/opencl/index.rst
+++ b/doc/source/modules/opencl/index.rst
@@ -10,6 +10,10 @@
sift/index.rst
fbp.rst
+ sinofilter.rst
+ processing.rst
+ convolution.rst
+ statistics.rst
medfilt.rst
codec_cbf.rst
diff --git a/doc/source/modules/opencl/processing.rst b/doc/source/modules/opencl/processing.rst
new file mode 100644
index 0000000..a246cc6
--- /dev/null
+++ b/doc/source/modules/opencl/processing.rst
@@ -0,0 +1,10 @@
+
+.. currentmodule:: silx.opencl
+
+:mod:`processing`: Processing
+-------------------------------
+
+.. automodule:: silx.opencl.processing
+ :members: OpenclProcessing, KernelContainer
+ :show-inheritance:
+ :undoc-members:
diff --git a/doc/source/modules/opencl/sinofilter.rst b/doc/source/modules/opencl/sinofilter.rst
new file mode 100644
index 0000000..81fe100
--- /dev/null
+++ b/doc/source/modules/opencl/sinofilter.rst
@@ -0,0 +1,9 @@
+
+.. currentmodule:: silx.opencl
+
+:mod:`sinofilter`: Sinogram filtering.
+--------------------------------------------------
+
+.. automodule:: silx.opencl.sinofilter
+ :members:
+ :show-inheritance:
diff --git a/doc/source/modules/opencl/statistics.rst b/doc/source/modules/opencl/statistics.rst
new file mode 100644
index 0000000..0db7566
--- /dev/null
+++ b/doc/source/modules/opencl/statistics.rst
@@ -0,0 +1,10 @@
+
+.. currentmodule:: silx.opencl
+
+:mod:`statistics`: Statistics
+-------------------------------
+
+.. automodule:: silx.opencl.statistics
+ :members: Statistics
+ :show-inheritance:
+ :undoc-members:
diff --git a/doc/source/modules/utils/html.rst b/doc/source/modules/utils/html.rst
deleted file mode 100644
index 1e590f4..0000000
--- a/doc/source/modules/utils/html.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. currentmodule:: silx.utils
-
-:mod:`html`
------------
-
-.. automodule:: silx.utils.html
- :members:
diff --git a/doc/source/modules/utils/index.rst b/doc/source/modules/utils/index.rst
index 7dd10dd..ae07deb 100644
--- a/doc/source/modules/utils/index.rst
+++ b/doc/source/modules/utils/index.rst
@@ -6,6 +6,6 @@
array_like.rst
decorators.rst
- html.rst
testutils.rst
weakref.rst
+ retry.rst
diff --git a/doc/source/modules/utils/retry.rst b/doc/source/modules/utils/retry.rst
new file mode 100644
index 0000000..e176bc0
--- /dev/null
+++ b/doc/source/modules/utils/retry.rst
@@ -0,0 +1,7 @@
+.. currentmodule:: silx.utils
+
+:mod:`weakref`
+---------------
+
+.. automodule:: silx.utils.retry
+ :members: \ No newline at end of file
diff --git a/doc/source/overview.rst b/doc/source/overview.rst
index 9e4fc28..729bdec 100644
--- a/doc/source/overview.rst
+++ b/doc/source/overview.rst
@@ -5,21 +5,24 @@ Releases
--------
Source code, pre-built binaries (aka Python wheels) for Windows, MacOS and
-ManyLinux1.
-Debian packages of released versions are made available in the following places:
+ManyLinux, Debian/Ubuntu packages of released versions are made available in the following places:
-- `Wheels and source code on PyPi <https://pypi.python.org/pypi/silx>`_
-- `Debian 8 packages <http://www.silx.org/pub/debian/>`_
+- `Wheels and source code on PyPi <https://pypi.org/project/silx/>`_
+- `Conda package on conda-forge channel <https://anaconda.org/conda-forge/silx>`_
+- Windows application installer `on github release page <https://github.com/silx-kit/silx/releases/latest/>`_ (available in the `Assets` at the bottom).
- `Documentation on silx.org <http://www.silx.org/doc/silx/latest/>`_
+- `Unofficial Debian/Ubuntu packages <https://github.com/silx-kit/silx/releases/latest>`_
- :doc:`changelog`
+|release| |version|
+
Nightly builds
--------------
-Debian 8 packages and documentation are automatically generated from the tip of
-the project's repository on a daily basis:
+Linux packages and documentation are automatically generated from the tip of the project's repository on a regular basis:
-- `Debian 8 packages <http://www.silx.org/pub/debian/>`_
+- `Debian 10 and Ubuntu20.04 packages <http://www.silx.org/pub/linux-repo/>`_
+- `Wheels and Windows application <https://silx.gitlab-pages.esrf.fr/bob/silx/>`_
- `Documentation <http://www.silx.org/doc/silx/dev/>`_
Project
@@ -36,12 +39,12 @@ Project
- Continuous integration: *silx* is continuously tested on all three major
operating systems:
- - Linux and MacOS X: `Travis <https://travis-ci.org/silx-kit/silx>`_
+ - Linux, MacOS, Windows: `GitHub Actions <https://github.com/silx-kit/silx/actions>`_
- Windows: `AppVeyor <https://ci.appveyor.com/project/ESRF/silx>`_
Additional Material
-------------------
-- Code Camp Talks. *silx* follows a quarterly release cycle. Prior to each release, a code camp takes place in which the novelties are presented and interested users make use of the development version in order to spot bugs or missing features. The `PDFs of the talks are available for download <http://ftp.esrf.fr/pub/scisoft/silx/talks/>`_
+- Code Camp held before releases: `The PDFs of the talks are available for download <http://ftp.esrf.fr/pub/scisoft/silx/talks/>`_
diff --git a/doc/source/sample_code/img/compareBackends.png b/doc/source/sample_code/img/compareBackends.png
new file mode 100644
index 0000000..93dd6b4
--- /dev/null
+++ b/doc/source/sample_code/img/compareBackends.png
Binary files differ
diff --git a/doc/source/sample_code/img/compareImages.png b/doc/source/sample_code/img/compareImages.png
new file mode 100644
index 0000000..49618b5
--- /dev/null
+++ b/doc/source/sample_code/img/compareImages.png
Binary files differ
diff --git a/doc/source/sample_code/img/customSilxView.png b/doc/source/sample_code/img/customSilxView.png
new file mode 100644
index 0000000..5ffa457
--- /dev/null
+++ b/doc/source/sample_code/img/customSilxView.png
Binary files differ
diff --git a/doc/source/sample_code/img/dropZones.png b/doc/source/sample_code/img/dropZones.png
new file mode 100644
index 0000000..3196c6b
--- /dev/null
+++ b/doc/source/sample_code/img/dropZones.png
Binary files differ
diff --git a/doc/source/sample_code/img/exampleBaseline.png b/doc/source/sample_code/img/exampleBaseline.png
new file mode 100644
index 0000000..fcd5778
--- /dev/null
+++ b/doc/source/sample_code/img/exampleBaseline.png
Binary files differ
diff --git a/doc/source/sample_code/img/findContours.png b/doc/source/sample_code/img/findContours.png
new file mode 100644
index 0000000..06dcf01
--- /dev/null
+++ b/doc/source/sample_code/img/findContours.png
Binary files differ
diff --git a/doc/source/sample_code/img/floatedit.png b/doc/source/sample_code/img/floatedit.png
new file mode 100644
index 0000000..075c4a0
--- /dev/null
+++ b/doc/source/sample_code/img/floatedit.png
Binary files differ
diff --git a/doc/source/sample_code/img/imageStack.png b/doc/source/sample_code/img/imageStack.png
new file mode 100644
index 0000000..ac23703
--- /dev/null
+++ b/doc/source/sample_code/img/imageStack.png
Binary files differ
diff --git a/doc/source/sample_code/img/plot3dUpdateScatterFromThread.png b/doc/source/sample_code/img/plot3dUpdateScatterFromThread.png
new file mode 100644
index 0000000..acd1c58
--- /dev/null
+++ b/doc/source/sample_code/img/plot3dUpdateScatterFromThread.png
Binary files differ
diff --git a/doc/source/sample_code/img/plotCurveLegendWidget.png b/doc/source/sample_code/img/plotCurveLegendWidget.png
new file mode 100644
index 0000000..d857950
--- /dev/null
+++ b/doc/source/sample_code/img/plotCurveLegendWidget.png
Binary files differ
diff --git a/doc/source/sample_code/img/plotProfile.png b/doc/source/sample_code/img/plotProfile.png
new file mode 100644
index 0000000..2a74338
--- /dev/null
+++ b/doc/source/sample_code/img/plotProfile.png
Binary files differ
diff --git a/doc/source/sample_code/img/plotROIStats.png b/doc/source/sample_code/img/plotROIStats.png
new file mode 100644
index 0000000..18446aa
--- /dev/null
+++ b/doc/source/sample_code/img/plotROIStats.png
Binary files differ
diff --git a/doc/source/sample_code/img/plotStats.png b/doc/source/sample_code/img/plotStats.png
new file mode 100644
index 0000000..e4fc781
--- /dev/null
+++ b/doc/source/sample_code/img/plotStats.png
Binary files differ
diff --git a/doc/source/sample_code/img/plotUpdateImageFromGevent.png b/doc/source/sample_code/img/plotUpdateImageFromGevent.png
new file mode 100644
index 0000000..c0caec3
--- /dev/null
+++ b/doc/source/sample_code/img/plotUpdateImageFromGevent.png
Binary files differ
diff --git a/doc/source/sample_code/img/scatterview.png b/doc/source/sample_code/img/scatterview.png
new file mode 100644
index 0000000..32f0235
--- /dev/null
+++ b/doc/source/sample_code/img/scatterview.png
Binary files differ
diff --git a/doc/source/sample_code/img/stackedprogressbar.png b/doc/source/sample_code/img/stackedprogressbar.png
new file mode 100644
index 0000000..cc88cfe
--- /dev/null
+++ b/doc/source/sample_code/img/stackedprogressbar.png
Binary files differ
diff --git a/doc/source/sample_code/img/syncPlotLocation.png b/doc/source/sample_code/img/syncPlotLocation.png
new file mode 100644
index 0000000..0b86f3e
--- /dev/null
+++ b/doc/source/sample_code/img/syncPlotLocation.png
Binary files differ
diff --git a/doc/source/sample_code/img/waiterOverlay.png b/doc/source/sample_code/img/waiterOverlay.png
new file mode 100644
index 0000000..2166246
--- /dev/null
+++ b/doc/source/sample_code/img/waiterOverlay.png
Binary files differ
diff --git a/doc/source/sample_code/index.rst b/doc/source/sample_code/index.rst
index a5cbf11..2bbfc29 100644
--- a/doc/source/sample_code/index.rst
+++ b/doc/source/sample_code/index.rst
@@ -25,8 +25,7 @@ All sample codes can be downloaded as a zip file: |sample_code_archive|.
- Description
* - :download:`icons.py <../../../examples/icons.py>`
- .. image:: img/icons.png
- :height: 150px
- :align: center
+ :width: 150px
- Display icons and animated icons provided by silx.
:mod:`silx.gui.data` and :mod:`silx.gui.hdf5`
@@ -41,24 +40,17 @@ All sample codes can be downloaded as a zip file: |sample_code_archive|.
- Description
* - :download:`customHdf5TreeModel.py <../../../examples/customHdf5TreeModel.py>`
- .. image:: img/customHdf5TreeModel.png
- :height: 150px
- :align: center
+ :width: 150px
- Qt Hdf5 widget examples
* - :download:`customDataView.py <../../../examples/customDataView.py>`
- .. image:: img/customDataView.png
- :height: 150px
- :align: center
+ :width: 150px
- Qt data view example
* - :download:`hdf5widget.py <../../../examples/hdf5widget.py>`
- .. image:: img/hdf5widget.png
- :height: 150px
- :align: center
+ :width: 150px
- Qt Hdf5 widget examples
- .. note:: This module has a dependency on the `h5py <http://www.h5py.org/>`_
- library, which is not a mandatory dependency for `silx`. You might need
- to install it if you don't already have it.
-
:mod:`silx.gui.dialog`
......................
@@ -71,9 +63,12 @@ All sample codes can be downloaded as a zip file: |sample_code_archive|.
- Description
* - :download:`fileDialog.py <../../../examples/fileDialog.py>`
- .. image:: img/fileDialog.png
- :height: 150px
- :align: center
+ :width: 150px
- Example for the use of the ImageFileDialog.
+ * - :download:`colormapDialog.py <../../../examples/colormapDialog.py>`
+ - .. image:: img/colormapDialog.png
+ :width: 150px
+ - This script shows the features of a :mod:`~silx.gui.dialog.ColormapDialog`.
:mod:`silx.gui.widgets`
.......................
@@ -87,14 +82,13 @@ All sample codes can be downloaded as a zip file: |sample_code_archive|.
- Description
* - :download:`periodicTable.py <../../../examples/periodicTable.py>`
- .. image:: img/periodicTable.png
- :height: 150px
+ :width: 150px
:align: center
- This script is a simple example of how to use the periodic table widgets,
select elements and connect signals.
* - :download:`simplewidget.py <../../../examples/simplewidget.py>`
- .. image:: img/simplewidget.png
- :height: 150px
- :align: center
+ :width: 150px
- This script shows a gallery of simple widgets provided by silx.
It shows the following widgets:
@@ -117,8 +111,7 @@ Widgets
- Description
* - :download:`imageview.py <../../../examples/imageview.py>`
- .. image:: img/imageview.png
- :height: 150px
- :align: center
+ :width: 150px
- Example to show the use of :mod:`~silx.gui.plot.ImageView` widget.
It can be used to open an EDF or TIFF file from the shell command line.
@@ -127,22 +120,47 @@ Widgets
``python examples/imageview.py <file to open>``
To get help:
``python examples/imageview.py -h``
-
- For developers with a git clone you can use it with the bootstrap
- To view an image file with the current installed silx library:
-
- ``./bootstrap.py python examples/imageview.py <file to open>``
* - :download:`stackView.py <../../../examples/stackView.py>`
- .. image:: img/stackView.png
- :height: 150px
- :align: center
+ :width: 150px
- This script is a simple example to illustrate how to use the
:mod:`~silx.gui.plot.StackView` widget.
- * - :download:`colormapDialog.py <../../../examples/colormapDialog.py>`
- - .. image:: img/colormapDialog.png
- :height: 150px
- :align: center
- - This script shows the features of a :mod:`~silx.gui.dialog.ColormapDialog`.
+ * - :download:`scatterview.py <../../../examples/scatterview.py>`
+ - .. image:: img/scatterview.png
+ :width: 150px
+ - Example to show the use of :class:`~silx.gui.plot.ScatterView.ScatterView` widget
+ * - :download:`compareImages.py <../../../examples/compareImages.py>`
+ - .. image:: img/compareImages.png
+ :width: 150px
+ - usage: compareImages.py [-h] [--debug] [--testdata] [--use-opengl-plot]
+ [files [files ...]]
+
+ Example demonstrating the use of the widget CompareImages
+
+ positional arguments:
+ files Image data to compare (HDF5 file with path, EDF files,
+ JPEG/PNG image files). Data from HDF5 files can be
+ accessed using dataset path and slicing as an URL:
+ silx:../my_file.h5?path=/entry/data&slice=10 EDF file
+ frames also can can be accessed using URL:
+ fabio:../my_file.edf?slice=10 Using URL in command like
+ usually have to be quoted: "URL".
+
+ optional arguments:
+ -h, --help show this help message and exit
+ --debug Set logging system in debug mode
+ --testdata Use synthetic images to test the application
+ --use-opengl-plot Use OpenGL for plots (instead of matplotlib)
+ * - :download:`imageStack.py <../../../examples/imageStack.py>`
+ - .. image:: img/imageStack.png
+ :width: 150px
+ - Simple example for using the ImageStack.
+
+ In this example we want to display images from different source: .h5, .edf
+ and .npy files.
+
+ To do so we simple reimplement the thread managing the loading of data.
+
:class:`silx.gui.plot.actions.PlotAction`
.........................................
@@ -158,16 +176,14 @@ Sample code that adds buttons to the toolbar of a silx plot widget.
- Description
* - :download:`plotClearAction.py <../../../examples/plotClearAction.py>`
- .. image:: img/plotClearAction.png
- :height: 150px
- :align: center
+ :width: 150px
- This script shows how to create a minimalistic
:class:`~silx.gui.plot.actions.PlotAction` that clear the plot.
This illustrates how to add more buttons in a plot widget toolbar.
* - :download:`shiftPlotAction.py <../../../examples/shiftPlotAction.py>`
- .. image:: img/shiftPlotAction.png
- :height: 150px
- :align: center
+ :width: 150px
- This script is a simple (trivial) example of how to create a :class:`~silx.gui.plot.PlotWindow`,
create a custom :class:`~silx.gui.plot.actions.PlotAction` and add it to the toolbar.
@@ -176,8 +192,7 @@ Sample code that adds buttons to the toolbar of a silx plot widget.
* - :download:`fftPlotAction.py <../../../examples/fftPlotAction.py>`,
:download:`fft.png <../../../examples/fft.png>`
- .. image:: img/fftPlotAction.png
- :height: 150px
- :align: center
+ :width: 150px
- This script is a simple example of how to create a :class:`~silx.gui.plot.PlotWindow`
with a custom :class:`~silx.gui.plot.actions.PlotAction` added to the toolbar.
@@ -195,7 +210,7 @@ Sample code that adds buttons to the toolbar of a silx plot widget.
Add features to :class:`~silx.gui.plot.PlotWidget`
..................................................
-Sample code that adds specific tools or functions to plot widgets.
+Sample code that adds specific tools or functions to :class:`~silx.gui.plot.PlotWidget`.
.. list-table::
:widths: 1 1 4
@@ -206,8 +221,7 @@ Sample code that adds specific tools or functions to plot widgets.
- Description
* - :download:`plotWidget.py <../../../examples/plotWidget.py>`
- .. image:: img/plotWidget.png
- :height: 150px
- :align: center
+ :width: 150px
- This script shows how to create a custom window around a PlotWidget.
It subclasses :class:`QMainWindow`, uses a :class:`~silx.gui.plot.PlotWidget`
@@ -218,10 +232,86 @@ Sample code that adds specific tools or functions to plot widgets.
- QAction from :mod:`silx.gui.plot.actions`
- QToolButton from :mod:`silx.gui.plot.PlotToolButtons`
- :class:`silx.gui.plot.ColorBar.ColorBarWidget`
+ * - :download:`plotItemsSelector.py <../../../examples/plotItemsSelector.py>`
+ - .. image:: img/plotItemsSelector.png
+ :width: 150px
+ - This example illustrates how to use a :class:`ItemsSelectionDialog` widget
+ associated with a :class:`~silx.gui.plot.PlotWidget`
+ * - :download:`plotInteractiveImageROI.py <../../../examples/plotInteractiveImageROI.py>`
+ - .. image:: img/plotInteractiveImageROI.png
+ :width: 150px
+ - This script illustrates image ROI selection in a :class:`~silx.gui.plot.PlotWidget`
+
+ It uses :class:`~silx.gui.plot.tools.roi.RegionOfInterestManager` and
+ :class:`~silx.gui.plot.tools.roi.RegionOfInterestTableWidget` to handle the
+ interactive selection and to display the list of selected ROIs.
+ * - :download:`printPreview.py <../../../examples/printPreview.py>`
+ - .. image:: img/printPreview.png
+ :width: 150px
+ - This script illustrates how to add a print preview tool button to any plot
+ widget inheriting :class:`~silx.gui.plot.PlotWidget`.
+
+ Three plot widgets are instantiated. One of them uses a standalone
+ :class:`~silx.gui.plot.PrintPreviewToolButton.PrintPreviewToolButton`,
+ while the other two use a
+ :class:`~silx.gui.plot.PrintPreviewToolButton.SingletonPrintPreviewToolButton`
+ which allows them to send their content to the same print preview page.
+ * - :download:`scatterMask.py <../../../examples/scatterMask.py>`
+ - .. image:: img/scatterMask.png
+ :width: 150px
+ - This example demonstrates how to use ScatterMaskToolsWidget
+ and NamedScatterAlphaSlider with a PlotWidget.
+ * - :download:`plotCurveLegendWidget.py <../../../examples/plotCurveLegendWidget.py>`
+ - .. image:: img/plotCurveLegendWidget.png
+ :width: 150px
+ - This example illustrates the use of :class:`CurveLegendsWidget`.
+
+ :class:`CurveLegendsWidget` display curves style and legend currently visible
+ in a :class:`~silx.gui.plot.PlotWidget`
+ * - :download:`plotStats.py <../../../examples/plotStats.py>`
+ - .. image:: img/plotStats.png
+ :width: 150px
+ - This script is a simple example of how to add your own statistic to a
+ :class:`~silx.gui.plot.statsWidget.StatsWidget` from customs
+ :class:`~silx.gui.plot.stats.Stats` and display it.
+
+ On this example we will:
+
+ - show sum of values for each type
+ - compute curve integrals (only for 'curve').
+ - compute center of mass for all possible items
+
+ .. note:: for now the possible types manged by the Stats are ('curve', 'image',
+ 'scatter' and 'histogram')
+ * - :download:`plotROIStats.py <../../../examples/plotROIStats.py>`
+ - .. image:: img/plotROIStats.png
+ :width: 150px
+ - This script is a simple example of how to display statistics on a specific
+ region of interest.
+
+ An example on how to define your own statistic is given in the 'plotStats.py'
+ script.
+ * - :download:`plotProfile.py <../../../examples/plotProfile.py>`
+ - .. image:: img/plotProfile.png
+ :width: 150px
+ - Example illustrating the different profile tools.
+
+
+:class:`~silx.gui.plot.PlotWidget` features
+...........................................
+
+Sample code that illustrates some functionalities of :class:`~silx.gui.plot.PlotWidget`.
+
+.. list-table::
+ :widths: 1 1 4
+ :header-rows: 1
+
+ * - Source
+ - Screenshot
+ - Description
* - :download:`plotContextMenu.py <../../../examples/plotContextMenu.py>`
- .. image:: img/plotContextMenu.png
- :height: 150px
- :align: center
+ :width: 150px
- This script illustrates the addition of a context menu to a
:class:`~silx.gui.plot.PlotWidget`.
@@ -235,22 +325,14 @@ Sample code that adds specific tools or functions to plot widgets.
inherit from :class:`~silx.gui.plot.PlotWidget`.
For more information on context menus, see Qt documentation.
- * - :download:`plotItemsSelector.py <../../../examples/plotItemsSelector.py>`
- - .. image:: img/plotItemsSelector.png
- :height: 150px
- :align: center
- - This example illustrates how to use a :class:`ItemsSelectionDialog` widget
- associated with a :class:`~silx.gui.plot.PlotWidget`
* - :download:`plotLimits.py <../../../examples/plotLimits.py>`
- .. image:: img/plotLimits.png
- :height: 150px
- :align: center
+ :width: 150px
- This script is an example to illustrate how to use axis synchronization
tool.
* - :download:`plotUpdateCurveFromThread.py <../../../examples/plotUpdateCurveFromThread.py>`
- .. image:: img/plotUpdateCurveFromThread.png
- :height: 150px
- :align: center
+ :width: 150px
- This script illustrates the update of a :mod:`silx.gui.plot` widget from a thread.
The problem is that plot and GUI methods should be called from the main thread.
@@ -261,10 +343,13 @@ Sample code that adds specific tools or functions to plot widgets.
In this example a thread calls submitToQtMainThread to update the curve
of a plot.
+ * - :download:`plotUpdateImageFromGevent.py <../../../examples/plotUpdateImageFromGevent.py>`
+ - .. image:: img/plotUpdateImageFromGevent.png
+ :width: 150px
+ - This script illustrates the update of a :class:`~silx.gui.plot.Plot2D` widget from a gevent coroutine.
* - :download:`plotUpdateImageFromThread.py <../../../examples/plotUpdateImageFromThread.py>`
- .. image:: img/plotUpdateImageFromThread.png
- :height: 150px
- :align: center
+ :width: 150px
- This script illustrates the update of a :mod:`silx.gui.plot` widget from a thread.
The problem is that plot and GUI methods should be called from the main thread.
@@ -275,39 +360,33 @@ Sample code that adds specific tools or functions to plot widgets.
In this example a thread calls submitToQtMainThread to update the curve
of a plot.
- * - :download:`plotInteractiveImageROI.py <../../../examples/plotInteractiveImageROI.py>`
- - .. image:: img/plotInteractiveImageROI.png
- :height: 150px
- :align: center
- - This script illustrates image ROI selection in a :class:`~silx.gui.plot.PlotWidget`
-
- It uses :class:`~silx.gui.plot.tools.roi.RegionOfInterestManager` and
- :class:`~silx.gui.plot.tools.roi.RegionOfInterestTableWidget` to handle the
- interactive selection and to display the list of selected ROIs.
- * - :download:`printPreview.py <../../../examples/printPreview.py>`
- - .. image:: img/printPreview.png
- :height: 150px
- :align: center
- - This script illustrates how to add a print preview tool button to any plot
- widget inheriting :class:`~silx.gui.plot.PlotWidget`.
-
- Three plot widgets are instantiated. One of them uses a standalone
- :class:`~silx.gui.plot.PrintPreviewToolButton.PrintPreviewToolButton`,
- while the other two use a
- :class:`~silx.gui.plot.PrintPreviewToolButton.SingletonPrintPreviewToolButton`
- which allows them to send their content to the same print preview page.
- * - :download:`scatterMask.py <../../../examples/scatterMask.py>`
- - .. image:: img/scatterMask.png
- :height: 150px
- :align: center
- - This example demonstrates how to use ScatterMaskToolsWidget
- and NamedScatterAlphaSlider with a PlotWidget.
* - :download:`syncaxis.py <../../../examples/syncaxis.py>`
- .. image:: img/syncaxis.png
- :height: 150px
- :align: center
+ :width: 150px
+ - This script is an example to illustrate how to use axis synchronization
+ tool.
+ * - :download:`dropZones.py <../../../examples/dropZones.py>`
+ - .. image:: img/dropZones.png
+ :width: 150px
+ - Example of drop zone supporting application/x-silx-uri.
+
+ This example illustrates the support of drag&drop of silx URLs.
+ It provides 2 URLs (corresponding to 2 datasets) that can be dragged to
+ either a :class:`PlotWidget` or a QLable displaying the URL information.
+ * - :download:`exampleBaseline.py <../../../examples/exampleBaseline.py>`
+ - .. image:: img/exampleBaseline.png
+ :width: 150px
+ - This example illustrates some usage possible with the baseline parameter
+ * - :download:`syncPlotLocation.py <../../../examples/syncPlotLocation.py>`
+ - .. image:: img/syncPlotLocation.png
+ :width: 150px
- This script is an example to illustrate how to use axis synchronization
tool.
+ * - :download:`compareBackends.py <../../../examples/compareBackends.py>`
+ - .. image:: img/compareBackends.png
+ :width: 150px
+ - This script compares the rendering of PlotWidget's matplotlib and OpenGL backends.
+
.. _plot3d-sample-code:
@@ -321,10 +400,38 @@ Sample code that adds specific tools or functions to plot widgets.
* - Source
- Screenshot
- Description
+ * - :download:`plot3dSceneWindow.py <../../../examples/plot3dSceneWindow.py>`
+ - .. image:: img/plot3dSceneWindow.png
+ :width: 150px
+ - 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.
+ * - :download:`plot3dUpdateScatterFromThread.py <../../../examples/plot3dUpdateScatterFromThread.py>`
+ - .. image:: img/plot3dUpdateScatterFromThread.png
+ :width: 150px
+ - This script illustrates the update of a
+ :class:`~silx.gui.plot3d.SceneWindow.SceneWindow` widget from a thread.
+
+ The problem is that GUI methods should be called from the main thread.
+ To safely update the scene from another thread, one need to execute the update
+ asynchronously in the main thread.
+ In this example, this is achieved with
+ :func:`~silx.gui.utils.concurrent.submitToQtMainThread`.
+
+ In this example a thread calls submitToQtMainThread to append data to a 3D scatter.
* - :download:`plot3dContextMenu.py <../../../examples/plot3dContextMenu.py>`
- .. image:: img/plot3dContextMenu.png
- :height: 150px
- :align: center
+ :width: 150px
- This script adds a context menu to a :class:`silx.gui.plot3d.ScalarFieldView`.
This is done by adding a custom context menu to the :class:`Plot3DWidget`:
@@ -335,30 +442,35 @@ Sample code that adds specific tools or functions to plot widgets.
For more information on context menus, see Qt documentation.
* - :download:`viewer3DVolume.py <../../../examples/viewer3DVolume.py>`
- .. image:: img/viewer3DVolume.png
- :height: 150px
- :align: center
+ :width: 150px
- This script illustrates the use of :class:`silx.gui.plot3d.ScalarFieldView`.
It loads a 3D scalar data set from a file and displays iso-surfaces and
an interactive cutting plane.
It can also be started without providing a file.
- * - :download:`plot3dSceneWindow.py <../../../examples/plot3dSceneWindow.py>`
- - .. image:: img/plot3dSceneWindow.png
- :height: 150px
- :align: center
- - 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.
+:mod:`silx.gui.widgets` sample code
++++++++++++++++++++++++++++++++++++
- It features:
+.. list-table::
+ :widths: 1 1 4
+ :header-rows: 1
- - 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.
+ * - Source
+ - Screenshot
+ - Description
+ * - :download:`floatedit.py <../../../examples/floatedit.py>`
+ - .. image:: img/floatedit.png
+ :width: 150px
+ - This script illustrates the use of :class:`silx.gui.widgets.FloatEdit.FloatEdit`.
+ * - :download:`stackedprogressbar.py <../../../examples/stackedprogressbar.py>`
+ - .. image:: img/stackedprogressbar.png
+ :width: 150px
+ - This script illustrates the use of :class:`silx.gui.widgets.StackedProgressBar.StackedProgressBar`.
+ * - :download:`waiterOverlay.py <../../../examples/waiterOverlay.py>`
+ - .. image:: img/waiterOverlay.png
+ :width: 150px
+ - Demonstration window that displays a wait icon until the plot is updated.
:mod:`silx.io` sample code
++++++++++++++++++++++++++
@@ -374,3 +486,37 @@ Sample code that adds specific tools or functions to plot widgets.
-
- This script is an example of how to use the :mod:`silx.io.convert` module.
See the following tutorial for more information: :doc:`../Tutorials/convert`
+
+
+:mod:`silx.image` sample code
++++++++++++++++++++++++++++++
+
+.. list-table::
+ :widths: 1 1 4
+ :header-rows: 1
+
+ * - Source
+ - Screenshot
+ - Description
+ * - :download:`findContours.py <../../../examples/findContours.py>`
+ - .. image:: img/findContours.png
+ :width: 150px
+ - Find contours examples
+
+ .. note:: This module has an optional dependency with sci-kit image library.
+ You might need to install it if you don't already have it.
+
+:mod:`silx.app` sample code
++++++++++++++++++++++++++++
+
+.. list-table::
+ :widths: 1 1 4
+ :header-rows: 1
+
+ * - Source
+ - Screenshot
+ - Description
+ * - :download:`customSilxView.py <../../../examples/customSilxView.py>`
+ - .. image:: img/customSilxView.png
+ :width: 150px
+ - Sample code illustrating how to custom silx view into another application.
diff --git a/doc/source/troubleshooting.rst b/doc/source/troubleshooting.rst
index 95917eb..43cdea2 100644
--- a/doc/source/troubleshooting.rst
+++ b/doc/source/troubleshooting.rst
@@ -12,7 +12,7 @@ Some widgets in :mod:`silx.gui` are using OpenGL2.1:
When running applications based on OpenGL2.1 through ssh, there are a few situations that can prevent the display of OpenGL widgets:
- Make sure to use ``ssh -X`` to enable X11 forwarding.
-- OpenGL is disabled with X11 forwarding (the default on Debian 8 and 9). See `Enabling OpenGL forwarding`_.
+- OpenGL is disabled with X11 forwarding (the default on Debian). See `Enabling OpenGL forwarding`_.
- Unless the operating system is using `libglvnd <https://github.com/NVIDIA/libglvnd/releases>`_
(available from Debian 9 backports onward),
both the server and the client computers must have the same kind of GPU drivers
diff --git a/doc/source/tutorials.rst b/doc/source/tutorials.rst
index cda7855..17d5eb0 100644
--- a/doc/source/tutorials.rst
+++ b/doc/source/tutorials.rst
@@ -1,5 +1,5 @@
-Tutorials and sample code
-=========================
+Tutorials & Sample Code
+=======================
Tutorials and cookbooks:
@@ -11,6 +11,7 @@ Tutorials and cookbooks:
modules/gui/designer.rst
Tutorials/Image
Tutorials/Sift/sift
+ Tutorials/codec/Bitshuffle-LZ4.ipynb
Tutorials/io.rst
Tutorials/convert.rst
Tutorials/specfile_to_hdf5.rst
diff --git a/doc/source/user_guide.rst b/doc/source/user_guide.rst
new file mode 100644
index 0000000..3cb91b7
--- /dev/null
+++ b/doc/source/user_guide.rst
@@ -0,0 +1,87 @@
+User Guide
+==========
+
+
+.. |silxView| image:: http://www.silx.org/doc/silx/img/silx-view-v1-0.gif
+ :height: 80px
+
+The silx project aims to provide a collection of Python packages to support the
+development of data assessment, reduction and analysis at synchrotron radiation
+facilities.
+It intends to provide reading/writing tools for different file formats, data
+reduction routines and a set of Qt widgets to browse and visualise data.
+Silx can be cited by its DOIs referenced on
+`Zenodo <https://doi.org/10.5281/zenodo.591709>`_.
+
+The current version (v\ |version|) caters for:
+
+* Supporting `HDF5 <https://www.hdfgroup.org/HDF5/>`_,
+ `SPEC <https://certif.com/spec.html>`_ and
+ `FabIO <http://www.silx.org/doc/fabio/dev/getting_started.html#list-of-file-formats-that-fabio-can-read-and-write>`_
+ images file formats.
+* OpenCL-based data processing: image alignment (SIFT),
+ image processing (median filter, histogram),
+ filtered backprojection for tomography
+* Data reduction: histogramming, fitting, median filter
+* A set of Qt widgets, including:
+
+ * 1D and 2D visualization widgets with a set of associated tools using multiple backends (matplotlib or OpenGL)
+ * OpenGL-based widgets to visualize data in 3D (scalar field with isosurface and cut plane, scatter plot)
+ * a unified browser for HDF5, SPEC and image file formats supporting inspection and
+ visualization of n-dimensional datasets.
+
+* a set of applications:
+
+ * a unified viewer (:ref:`silx view` *filename*) for HDF5, SPEC and image file formats
+
+ |silxView|
+
+ * a unified converter to HDF5 format (*silx convert filename*)
+
+
+.. toctree::
+ :hidden:
+
+ overview.rst
+ install.rst
+ description/index.rst
+ license.rst
+ virtualenv.rst
+ troubleshooting.rst
+
+:doc:`overview`
+ Releases, repository, issue tracker, mailing list, ...
+
+:doc:`install`
+ How to install *silx* on Linux, Windows and MacOS X
+
+:doc:`description/index`
+ Description of the different algorithms and their implementation
+
+:doc:`tutorials`
+ Tutorials and sample code
+
+:doc:`modules/index`
+ Documentation of the packages included in *silx*
+
+:doc:`applications/index`
+ Documentation of the applications provided by *silx*
+
+:doc:`modules/gui/gallery`
+ Widgets gallery and screenshots
+
+:doc:`changelog`
+ List of changes between releases
+
+:doc:`license`
+ License and copyright information
+
+:doc:`troubleshooting`
+ When things do not work as expected
+
+
+Indices
+=======
+
+* :ref:`modindex`
+* :ref:`genindex`
diff --git a/doc/source/virtualenv.rst b/doc/source/virtualenv.rst
index 3d86617..6f64d5b 100644
--- a/doc/source/virtualenv.rst
+++ b/doc/source/virtualenv.rst
@@ -12,30 +12,12 @@ Prerequisites
This guide assumes that your system meets the following requirements:
- - a version of python compatible with *silx* is installed (python 2.7 or python >= 3.5)
+ - a version of python compatible with *silx* is installed
- the *pip* installer for python packages is installed
- - the Qt and PyQt libraries are installed (optional, required for using ``silx.gui``)
Installation procedure
----------------------
-
-Install vitrualenv
-******************
-
-.. code-block:: bash
-
- pip install virtualenv --user
-
-.. note::
-
- This step is not required for recent version of Python 3.
- Virtual environments are created using a builtin standard library,
- ``venv``.
- On Debian platforms, you might need to install the ``python3-venv``
- package.
-
-
Create a virtualenv
*******************
@@ -51,20 +33,12 @@ a virtual environment named ``silx_venv``
cd
mkdir -p venvs
cd venvs
- virtualenv silx_venv
-
+ python -m venv silx_venv
A virtualenv contains a copy of your default python interpreter with a few tools
to install packages (pip, setuptools).
-To use a different python interpreter, you can specify it on the command line.
-For example, to use python 3.4:
-
-.. code-block:: bash
-
- virtualenv -p /usr/bin/python3.4 silx_venv
-
-But for python 3 you should use the builtin ``venv`` module:
+Virtual environments are created using a builtin standard library, ``venv`` (Python3 only):
.. code-block:: bash
@@ -72,11 +46,20 @@ But for python 3 you should use the builtin ``venv`` module:
.. note::
+ On Debian platforms, you might need to install the ``python3-venv`` package.
+
If you don't need to start with a clean environment and you don't want
to install each required library one by one, you can use a command line
option to create a virtualenv with access to all system packages:
``--system-site-packages``
+To use a different python interpreter, use it to create the virtual environment.
+For example, to use python 3.10:
+
+.. code-block:: bash
+
+ /usr/bin/python3.10 -m venv silx_venv
+
Activate a virtualenv
*********************
@@ -128,64 +111,28 @@ install *silx*:
.. since 0.5, numpy is now automatically installed when doing `pip install silx`
-Install optional dependencies
-*****************************
-
-The following command installs libraries that are needed by various modules
-of *silx*:
-
-.. code-block:: bash
-
- pip install matplotlib fabio h5py
-
-The next command installs libraries that are used by the python modules
-handling parallel computing:
-
-.. code-block:: bash
-
- pip install pyopencl mako
-
-
-Install pyqt
+Install silx
************
-If your python version is 3.5 or newer, installing PyQt5 and all required packages
-is as simple as typing:
-
-.. code-block:: bash
-
- pip install PyQt5
-
-For previous versions of python, there are no PyQt wheels available, so the installation
-is not as simple.
-
-The simplest way, assuming that PyQt is installed on your system, is to use that
-system package directly. For this, you need to add a symbolic link to your virtualenv.
-
-If you want to use PyQt5 installed in ``/usr/lib/python2.7/dist-packages/``, type:
+To install silx with minimal dependencies, run:
.. code-block:: bash
- ln -s /usr/lib/python2.7/dist-packages/PyQt5 silx_venv/lib/python2.7/site-packages/
- ln -s /usr/lib/python2.7/dist-packages/sip.so silx_venv/lib/python2.7/site-packages/
-
+ pip install silx
-Install silx
-************
+To install silx with all dependencies, run:
.. code-block:: bash
- pip install silx
-
+ pip install silx[full]
-To test *silx*, open an interactive python console. If you managed to install PyQt5 or PySide2
-in your virtualenv, type:
+To test *silx*, open an interactive python console:
.. code-block:: bash
python
-If you don't have PyQt, use:
+If you don't have PyQt5, PySide6 or PyQt6, run:
.. code-block:: bash
@@ -195,9 +142,3 @@ Run the test suite using:
>>> import silx.test
>>> silx.test.run_tests()
-
-
-
-
-
-