diff options
Diffstat (limited to 'doc/source')
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 Binary files differnew file mode 100644 index 0000000..bbd2117 --- /dev/null +++ b/doc/source/applications/img/silx-compare.png 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 Binary files differnew file mode 100644 index 0000000..f622c04 --- /dev/null +++ b/doc/source/img/silx-view.gif 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 Binary files differindex e7bb2a9..138d189 100644 --- a/doc/source/modules/gui/data/img/ArrayTableWidget.png +++ b/doc/source/modules/gui/data/img/ArrayTableWidget.png diff --git a/doc/source/modules/gui/data/img/DataViewer.png b/doc/source/modules/gui/data/img/DataViewer.png Binary files differindex 7980de9..6d0da71 100644 --- a/doc/source/modules/gui/data/img/DataViewer.png +++ b/doc/source/modules/gui/data/img/DataViewer.png 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 Binary files differindex 261909a..a468cc1 100644 --- a/doc/source/modules/gui/plot/img/BasicGridStatsWidget.png +++ b/doc/source/modules/gui/plot/img/BasicGridStatsWidget.png diff --git a/doc/source/modules/gui/plot/img/BasicStatsWidget.png b/doc/source/modules/gui/plot/img/BasicStatsWidget.png Binary files differindex b0d815d..6dbdd30 100644 --- a/doc/source/modules/gui/plot/img/BasicStatsWidget.png +++ b/doc/source/modules/gui/plot/img/BasicStatsWidget.png diff --git a/doc/source/modules/gui/plot/img/LimitsToolBar.png b/doc/source/modules/gui/plot/img/LimitsToolBar.png Binary files differindex b360fe0..2d96458 100644 --- a/doc/source/modules/gui/plot/img/LimitsToolBar.png +++ b/doc/source/modules/gui/plot/img/LimitsToolBar.png diff --git a/doc/source/modules/gui/plot/img/ROIStatsWidget.png b/doc/source/modules/gui/plot/img/ROIStatsWidget.png Binary files differindex 7a634fe..fae9d62 100644 --- a/doc/source/modules/gui/plot/img/ROIStatsWidget.png +++ b/doc/source/modules/gui/plot/img/ROIStatsWidget.png diff --git a/doc/source/modules/gui/plot/img/logColorbar.png b/doc/source/modules/gui/plot/img/logColorbar.png Binary files differindex 49282e7..31594e0 100644 --- a/doc/source/modules/gui/plot/img/logColorbar.png +++ b/doc/source/modules/gui/plot/img/logColorbar.png 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 Binary files differindex 4ddc0a8..7ad6de4 100644 --- a/doc/source/modules/gui/plot3d/img/SceneWidget.png +++ b/doc/source/modules/gui/plot3d/img/SceneWidget.png diff --git a/doc/source/modules/gui/widgets/img/FrameBrowser.png b/doc/source/modules/gui/widgets/img/FrameBrowser.png Binary files differindex 1d4ebcf..6f46631 100644 --- a/doc/source/modules/gui/widgets/img/FrameBrowser.png +++ b/doc/source/modules/gui/widgets/img/FrameBrowser.png diff --git a/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png b/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png Binary files differindex 96edd3c..13a4ddf 100644 --- a/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png +++ b/doc/source/modules/gui/widgets/img/HorizontalSliderWithBrowser.png diff --git a/doc/source/modules/gui/widgets/img/PeriodicCombo.png b/doc/source/modules/gui/widgets/img/PeriodicCombo.png Binary files differindex 7534805..bec3a78 100644 --- a/doc/source/modules/gui/widgets/img/PeriodicCombo.png +++ b/doc/source/modules/gui/widgets/img/PeriodicCombo.png diff --git a/doc/source/modules/gui/widgets/img/PeriodicList.png b/doc/source/modules/gui/widgets/img/PeriodicList.png Binary files differindex 74ce7d6..a695525 100644 --- a/doc/source/modules/gui/widgets/img/PeriodicList.png +++ b/doc/source/modules/gui/widgets/img/PeriodicList.png diff --git a/doc/source/modules/gui/widgets/img/PeriodicTable.png b/doc/source/modules/gui/widgets/img/PeriodicTable.png Binary files differindex bada39a..70039ab 100644 --- a/doc/source/modules/gui/widgets/img/PeriodicTable.png +++ b/doc/source/modules/gui/widgets/img/PeriodicTable.png diff --git a/doc/source/modules/gui/widgets/img/RangeSlider.png b/doc/source/modules/gui/widgets/img/RangeSlider.png Binary files differindex e7a1011..f552fb3 100644 --- a/doc/source/modules/gui/widgets/img/RangeSlider.png +++ b/doc/source/modules/gui/widgets/img/RangeSlider.png diff --git a/doc/source/modules/gui/widgets/img/TableWidget.png b/doc/source/modules/gui/widgets/img/TableWidget.png Binary files differindex a614ae7..959af57 100644 --- a/doc/source/modules/gui/widgets/img/TableWidget.png +++ b/doc/source/modules/gui/widgets/img/TableWidget.png diff --git a/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png b/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png Binary files differindex eb55b14..5d1af4c 100644 --- a/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png +++ b/doc/source/modules/gui/widgets/img/ThreadPoolPushButton.png diff --git a/doc/source/modules/gui/widgets/img/WaitingPushButton.png b/doc/source/modules/gui/widgets/img/WaitingPushButton.png Binary files differindex 97bd14a..5bfcdb8 100644 --- a/doc/source/modules/gui/widgets/img/WaitingPushButton.png +++ b/doc/source/modules/gui/widgets/img/WaitingPushButton.png 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 Binary files differnew file mode 100644 index 0000000..93dd6b4 --- /dev/null +++ b/doc/source/sample_code/img/compareBackends.png diff --git a/doc/source/sample_code/img/compositeline.png b/doc/source/sample_code/img/compositeline.png Binary files differdeleted file mode 100644 index 8950286..0000000 --- a/doc/source/sample_code/img/compositeline.png +++ /dev/null diff --git a/doc/source/sample_code/img/floatedit.png b/doc/source/sample_code/img/floatedit.png Binary files differnew file mode 100644 index 0000000..075c4a0 --- /dev/null +++ b/doc/source/sample_code/img/floatedit.png diff --git a/doc/source/sample_code/img/plotUpdateImageFromGevent.png b/doc/source/sample_code/img/plotUpdateImageFromGevent.png Binary files differnew file mode 100644 index 0000000..c0caec3 --- /dev/null +++ b/doc/source/sample_code/img/plotUpdateImageFromGevent.png diff --git a/doc/source/sample_code/img/stackedprogressbar.png b/doc/source/sample_code/img/stackedprogressbar.png Binary files differnew file mode 100644 index 0000000..cc88cfe --- /dev/null +++ b/doc/source/sample_code/img/stackedprogressbar.png diff --git a/doc/source/sample_code/img/waiterOverlay.png b/doc/source/sample_code/img/waiterOverlay.png Binary files differnew file mode 100644 index 0000000..2166246 --- /dev/null +++ b/doc/source/sample_code/img/waiterOverlay.png 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 |