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.rst6
-rw-r--r--doc/source/Tutorials/fitconfig.rst4
-rw-r--r--doc/source/Tutorials/io.rst28
-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.rst54
-rw-r--r--doc/source/conf.py128
-rw-r--r--doc/source/ext/snapshotqt_directive.py107
-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.rst71
-rw-r--r--doc/source/license.rst12
-rw-r--r--doc/source/modules/gui/data/img/ArrayTableWidget.pngbin41977 -> 48408 bytes
-rw-r--r--doc/source/modules/gui/data/img/DataViewer.pngbin37500 -> 42376 bytes
-rw-r--r--doc/source/modules/gui/dialog/img/abstractdatafiledialog.svg1958
-rw-r--r--doc/source/modules/gui/icons.rst400
-rw-r--r--doc/source/modules/gui/plot/getting_started.rst6
-rw-r--r--doc/source/modules/gui/plot/img/BasicGridStatsWidget.pngbin20668 -> 13381 bytes
-rw-r--r--doc/source/modules/gui/plot/img/BasicStatsWidget.pngbin8699 -> 9452 bytes
-rw-r--r--doc/source/modules/gui/plot/img/LimitsToolBar.pngbin21679 -> 21920 bytes
-rw-r--r--doc/source/modules/gui/plot/img/ROIStatsWidget.pngbin9659 -> 7176 bytes
-rw-r--r--doc/source/modules/gui/plot/img/logColorbar.pngbin12390 -> 7855 bytes
-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.rst1
-rw-r--r--doc/source/modules/gui/plot3d/img/SceneWidget.pngbin73947 -> 74504 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/FrameBrowser.pngbin4538 -> 3379 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.pngbin2884 -> 2987 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/PeriodicCombo.pngbin3124 -> 2912 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/PeriodicList.pngbin38615 -> 27993 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/PeriodicTable.pngbin61338 -> 35882 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/RangeSlider.pngbin1028 -> 1024 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/TableWidget.pngbin3624 -> 3824 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/ThreadPoolPushButton.pngbin2566 -> 2383 bytes
-rw-r--r--doc/source/modules/gui/widgets/img/WaitingPushButton.pngbin1187 -> 1148 bytes
-rw-r--r--doc/source/modules/gui/widgets/printpreview.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/index.rst4
-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/utils/html.rst7
-rw-r--r--doc/source/modules/utils/index.rst1
-rw-r--r--doc/source/overview.rst7
-rw-r--r--doc/source/sample_code/img/compareBackends.pngbin0 -> 63046 bytes
-rw-r--r--doc/source/sample_code/img/compositeline.pngbin23150 -> 0 bytes
-rw-r--r--doc/source/sample_code/img/floatedit.pngbin0 -> 4511 bytes
-rw-r--r--doc/source/sample_code/img/plotUpdateImageFromGevent.pngbin0 -> 50938 bytes
-rw-r--r--doc/source/sample_code/img/stackedprogressbar.pngbin0 -> 6508 bytes
-rw-r--r--doc/source/sample_code/img/waiterOverlay.pngbin0 -> 41574 bytes
-rw-r--r--doc/source/sample_code/index.rst34
-rw-r--r--doc/source/tutorials.rst5
-rw-r--r--doc/source/user_guide.rst87
-rw-r--r--doc/source/virtualenv.rst8
64 files changed, 3952 insertions, 497 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 d9671f4..c0eafc5 100644
--- a/doc/source/Tutorials/fit.rst
+++ b/doc/source/Tutorials/fit.rst
@@ -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
@@ -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 41a0dd3..4c54bba 100644
--- a/doc/source/Tutorials/io.rst
+++ b/doc/source/Tutorials/io.rst
@@ -324,6 +324,34 @@ For example to process all top-level groups of an HDF5 file:
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 d4145c2..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,25 +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)
- -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)
+.. 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 86e7bfa..1f421fe 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -1,6 +1,5 @@
-# -*- coding: utf-8 -*-
# /*##########################################################################
-# Copyright (C) 2015-2019 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,36 +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',
- 'sphinx.ext.inheritance_diagram',
- 'sphinxext-archive',
- 'snapshotqt_directive',
- '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
@@ -110,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
@@ -139,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 = []
@@ -154,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 = []
@@ -183,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.
@@ -227,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
@@ -267,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
@@ -282,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.
@@ -297,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
index 582b934..ab7ae1b 100644
--- a/doc/source/ext/snapshotqt_directive.py
+++ b/doc/source/ext/snapshotqt_directive.py
@@ -1,4 +1,3 @@
-# coding: utf-8
# /*##########################################################################
#
# Copyright (c) 2004-2019 European Synchrotron Radiation Facility
@@ -31,7 +30,6 @@ Configuration variable in conf.py:
the documentation source directory (i.e., the directory of conf.py)
(default: '..').
"""
-from __future__ import absolute_import
__authors__ = ["H. Payno", "T. Vincent"]
__license__ = "MIT"
@@ -46,34 +44,37 @@ 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__, "..", "..", "..", '..'))
+home = os.path.abspath(os.path.join(__file__, "..", "..", "..", ".."))
-if not os.environ.get('DIRECTIVE_SNAPSHOT_QT') == 'True':
+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
+ option_spec["script"] = directives.unchanged
has_content = True
def run(self):
- self.options['figwidth'] = 'image'
+ 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')
+ 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'}
+ 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
@@ -117,73 +118,84 @@ else:
:height: 5cm
:script: myscript.py
"""
+
option_spec = Image.option_spec.copy()
- option_spec['script'] = directives.unchanged
+ 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)
+ 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')
+ 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)
+ 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):
+ 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) is 0)
+ has_source_code = not (self.content is None or len(self.content) == 0)
if has_source_code:
- with open(output_script, 'w') as _file:
+ 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_()")
+ _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)
+ _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')
+ _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)
+ 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'}
+ 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))
+ _logger.info(
+ "generate screenshot for %s from %s, binding is %s"
+ "" % (filename, script_or_module, qt.BINDING)
+ )
def grabWindow(winID):
screen = qt.QApplication.primaryScreen()
@@ -192,9 +204,9 @@ else:
global _count
_count = 15
global _TIMEOUT
- _TIMEOUT = 1000. # in ms
+ _TIMEOUT = 1000.0 # in ms
app = qt.QApplication.instance() or qt.QApplication([])
- _logger.debug('Using Qt bindings: %s', qt)
+ _logger.debug("Using Qt bindings: %s", qt)
def _grabActiveWindowAndClose():
global _count
@@ -202,33 +214,32 @@ else:
if activeWindow is not None:
if activeWindow.isVisible():
# hot fix since issue with pySide2 API
- if qt.BINDING == 'PySide2':
+ 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)
+ _logger.error("Cannot save snapshot to %s", filename)
else:
- _logger.error('activeWindow is not visible.')
+ _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)
+ qt.QTimer.singleShot(_TIMEOUT, _grabActiveWindowAndClose)
else:
app.quit()
raise TimeoutError(
- 'Aborted: It took too long to have an active window.')
+ "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)))
+ 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')
+ 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 b0d6b4f..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.6-3.9 | PyQt5.6+, PySide2 |
-+------------+--------------+---------------------+
-| `MacOS`_ | 3.6-3.9 | PyQt5.6+, PySide2 |
-+------------+--------------+---------------------+
-| `Linux`_ | 3.6-3.9 | 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,7 +67,8 @@ 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.org/project/qtconsole>`_
@@ -245,7 +247,7 @@ 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
@@ -288,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:
+Advanced options can be set through the following environment variables:
-.. code-block:: bash
-
- 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 e7bb2a9..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 7980de9..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/icons.rst b/doc/source/modules/gui/icons.rst
index 67235c2..efa0264 100644
--- a/doc/source/modules/gui/icons.rst
+++ b/doc/source/modules/gui/icons.rst
@@ -49,12 +49,16 @@ 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|
@@ -313,6 +317,12 @@ Available icons
- rotate-3d
* - |rudder|
- rudder
+ * - |ruler|
+ - ruler
+ * - |scale-auto|
+ - scale-auto
+ * - |scale-fixed|
+ - scale-fixed
* - |selected|
- selected
* - |shape-circle-solid|
@@ -339,6 +349,8 @@ Available icons
- shape-square
* - |shape-vertical|
- shape-vertical
+ * - |side-histograms|
+ - side-histograms
* - |silx|
- silx
* - |slice-cross|
@@ -402,194 +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-range-horizontal| image:: ../../../../silx/resources/gui/icons/add-range-horizontal.png
-.. |add-shape-arc| image:: ../../../../silx/resources/gui/icons/add-shape-arc.png
-.. |add-shape-circle| image:: ../../../../silx/resources/gui/icons/add-shape-circle.png
-.. |add-shape-cross| image:: ../../../../silx/resources/gui/icons/add-shape-cross.png
-.. |add-shape-diagonal| image:: ../../../../silx/resources/gui/icons/add-shape-diagonal.png
-.. |add-shape-ellipse| image:: ../../../../silx/resources/gui/icons/add-shape-ellipse.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
-.. |add| image:: ../../../../silx/resources/gui/icons/add.png
-.. |arrow-keys| image:: ../../../../silx/resources/gui/icons/arrow-keys.png
-.. |axis| image:: ../../../../silx/resources/gui/icons/axis.png
-.. |backend-opengl| image:: ../../../../silx/resources/gui/icons/backend-opengl.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-norm-arcsinh| image:: ../../../../silx/resources/gui/icons/colormap-norm-arcsinh.png
-.. |colormap-norm-gamma| image:: ../../../../silx/resources/gui/icons/colormap-norm-gamma.png
-.. |colormap-norm-linear| image:: ../../../../silx/resources/gui/icons/colormap-norm-linear.png
-.. |colormap-norm-log| image:: ../../../../silx/resources/gui/icons/colormap-norm-log.png
-.. |colormap-norm-sqrt| image:: ../../../../silx/resources/gui/icons/colormap-norm-sqrt.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-minus-b| image:: ../../../../silx/resources/gui/icons/compare-mode-a-minus-b.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
-.. |description-description| image:: ../../../../silx/resources/gui/icons/description-description.png
-.. |description-error| image:: ../../../../silx/resources/gui/icons/description-error.png
-.. |description-name| image:: ../../../../silx/resources/gui/icons/description-name.png
-.. |description-program| image:: ../../../../silx/resources/gui/icons/description-program.png
-.. |description-title| image:: ../../../../silx/resources/gui/icons/description-title.png
-.. |description-value| image:: ../../../../silx/resources/gui/icons/description-value.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
-.. |eye| image:: ../../../../silx/resources/gui/icons/eye.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
-.. |mask-clear-all| image:: ../../../../silx/resources/gui/icons/mask-clear-all.png
-.. |mask-clear| image:: ../../../../silx/resources/gui/icons/mask-clear.png
-.. |mask-invert| image:: ../../../../silx/resources/gui/icons/mask-invert.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
-.. |pointing-hand| image:: ../../../../silx/resources/gui/icons/pointing-hand.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
-.. |rm| image:: ../../../../silx/resources/gui/icons/rm.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-cross| image:: ../../../../silx/resources/gui/icons/shape-cross.png
-.. |shape-diagonal-directed| image:: ../../../../silx/resources/gui/icons/shape-diagonal-directed.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
-.. |slice-cross| image:: ../../../../silx/resources/gui/icons/slice-cross.png
-.. |slice-horizontal| image:: ../../../../silx/resources/gui/icons/slice-horizontal.png
-.. |slice-vertical| image:: ../../../../silx/resources/gui/icons/slice-vertical.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
-.. |tree-sort| image:: ../../../../silx/resources/gui/icons/tree-sort.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/getting_started.rst b/doc/source/modules/gui/plot/getting_started.rst
index c105395..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.5 and PyQt5.
-
From a Python or IPython interpreter, the simplest way is to import the :mod:`silx.sx` module:
>>> from silx import sx
@@ -87,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
index 261909a..a468cc1 100644
--- a/doc/source/modules/gui/plot/img/BasicGridStatsWidget.png
+++ 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
index b0d815d..6dbdd30 100644
--- a/doc/source/modules/gui/plot/img/BasicStatsWidget.png
+++ 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 b360fe0..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
index 7a634fe..fae9d62 100644
--- a/doc/source/modules/gui/plot/img/ROIStatsWidget.png
+++ 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 49282e7..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/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 d16c4ab..05dd77c 100644
--- a/doc/source/modules/gui/plot/plotwidget.rst
+++ b/doc/source/modules/gui/plot/plotwidget.rst
@@ -115,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/plot3d/img/SceneWidget.png b/doc/source/modules/gui/plot3d/img/SceneWidget.png
index 4ddc0a8..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/widgets/img/FrameBrowser.png b/doc/source/modules/gui/widgets/img/FrameBrowser.png
index 1d4ebcf..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 96edd3c..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 7534805..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 74ce7d6..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 bada39a..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 e7a1011..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 a614ae7..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 eb55b14..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 97bd14a..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/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/index.rst b/doc/source/modules/io/index.rst
index 581f763..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,6 +17,7 @@
specfile.rst
specfilewrapper.rst
spech5.rst
+ fioh5.rst
url.rst
utils.rst
h5py_utils.rst
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/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 db18422..ae07deb 100644
--- a/doc/source/modules/utils/index.rst
+++ b/doc/source/modules/utils/index.rst
@@ -6,7 +6,6 @@
array_like.rst
decorators.rst
- html.rst
testutils.rst
weakref.rst
retry.rst
diff --git a/doc/source/overview.rst b/doc/source/overview.rst
index e65c163..729bdec 100644
--- a/doc/source/overview.rst
+++ b/doc/source/overview.rst
@@ -8,16 +8,21 @@ Source code, pre-built binaries (aka Python wheels) for Windows, MacOS and
ManyLinux, Debian/Ubuntu packages of released versions are made available in the following places:
- `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>`_
+- `Unofficial Debian/Ubuntu packages <https://github.com/silx-kit/silx/releases/latest>`_
- :doc:`changelog`
+|release| |version|
+
Nightly builds
--------------
Linux packages and documentation are automatically generated from the tip of the project's repository on a regular basis:
- `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
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/compositeline.png b/doc/source/sample_code/img/compositeline.png
deleted file mode 100644
index 8950286..0000000
--- a/doc/source/sample_code/img/compositeline.png
+++ /dev/null
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/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/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/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 0aade4c..2bbfc29 100644
--- a/doc/source/sample_code/index.rst
+++ b/doc/source/sample_code/index.rst
@@ -343,6 +343,10 @@ Sample code that illustrates some functionalities of :class:`~silx.gui.plot.Plot
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
:width: 150px
@@ -361,10 +365,6 @@ Sample code that illustrates some functionalities of :class:`~silx.gui.plot.Plot
:width: 150px
- This script is an example to illustrate how to use axis synchronization
tool.
- * - :download:`compositeline.py <../../../examples/compositeline.py>`
- - .. image:: img/compositeline.png
- :width: 150px
- - Example to show the use of markers to draw head and tail of lines.
* - :download:`dropZones.py <../../../examples/dropZones.py>`
- .. image:: img/dropZones.png
:width: 150px
@@ -382,6 +382,10 @@ Sample code that illustrates some functionalities of :class:`~silx.gui.plot.Plot
: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:
@@ -445,6 +449,28 @@ Sample code that illustrates some functionalities of :class:`~silx.gui.plot.Plot
an interactive cutting plane.
It can also be started without providing a file.
+:mod:`silx.gui.widgets` sample code
++++++++++++++++++++++++++++++++++++
+
+.. list-table::
+ :widths: 1 1 4
+ :header-rows: 1
+
+ * - 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
++++++++++++++++++++++++++
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 ccdd9b6..6f64d5b 100644
--- a/doc/source/virtualenv.rst
+++ b/doc/source/virtualenv.rst
@@ -12,7 +12,7 @@ Prerequisites
This guide assumes that your system meets the following requirements:
- - a version of python compatible with *silx* is installed (Python >= 3.5)
+ - a version of python compatible with *silx* is installed
- the *pip* installer for python packages is installed
Installation procedure
@@ -54,11 +54,11 @@ Virtual environments are created using a builtin standard library, ``venv`` (Pyt
``--system-site-packages``
To use a different python interpreter, use it to create the virtual environment.
-For example, to use python 3.5:
+For example, to use python 3.10:
.. code-block:: bash
- /usr/bin/python3.5 -m venv silx_venv
+ /usr/bin/python3.10 -m venv silx_venv
Activate a virtualenv
@@ -132,7 +132,7 @@ To test *silx*, open an interactive python console:
python
-If you don't have PyQt5 or PySide2, run:
+If you don't have PyQt5, PySide6 or PyQt6, run:
.. code-block:: bash