datalab-platform 0.0.1.dev0__py3-none-any.whl → 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- datalab/__init__.py +35 -2
- datalab/adapters_metadata/__init__.py +31 -0
- datalab/adapters_metadata/base_adapter.py +316 -0
- datalab/adapters_metadata/common.py +422 -0
- datalab/adapters_metadata/geometry_adapter.py +98 -0
- datalab/adapters_metadata/table_adapter.py +84 -0
- datalab/adapters_plotpy/__init__.py +54 -0
- datalab/adapters_plotpy/annotations.py +124 -0
- datalab/adapters_plotpy/base.py +110 -0
- datalab/adapters_plotpy/converters.py +86 -0
- datalab/adapters_plotpy/factories.py +80 -0
- datalab/adapters_plotpy/objects/__init__.py +0 -0
- datalab/adapters_plotpy/objects/base.py +197 -0
- datalab/adapters_plotpy/objects/image.py +157 -0
- datalab/adapters_plotpy/objects/scalar.py +565 -0
- datalab/adapters_plotpy/objects/signal.py +264 -0
- datalab/adapters_plotpy/roi/__init__.py +0 -0
- datalab/adapters_plotpy/roi/base.py +146 -0
- datalab/adapters_plotpy/roi/factory.py +93 -0
- datalab/adapters_plotpy/roi/image.py +207 -0
- datalab/adapters_plotpy/roi/signal.py +72 -0
- datalab/app.py +98 -0
- datalab/config.py +817 -0
- datalab/control/__init__.py +0 -0
- datalab/control/baseproxy.py +776 -0
- datalab/control/proxy.py +343 -0
- datalab/control/remote.py +1005 -0
- datalab/data/doc/DataLab_en.pdf +0 -0
- datalab/data/doc/DataLab_fr.pdf +0 -0
- datalab/data/icons/analysis/delete_results.svg +109 -0
- datalab/data/icons/analysis/fw1e2.svg +156 -0
- datalab/data/icons/analysis/fwhm.svg +156 -0
- datalab/data/icons/analysis/histogram.svg +49 -0
- datalab/data/icons/analysis/peak_detect.svg +160 -0
- datalab/data/icons/analysis/plot_results.svg +151 -0
- datalab/data/icons/analysis/show_results.svg +83 -0
- datalab/data/icons/analysis/stats.svg +49 -0
- datalab/data/icons/analysis.svg +120 -0
- datalab/data/icons/apply.svg +3 -0
- datalab/data/icons/check_all.svg +15 -0
- datalab/data/icons/collapse.svg +44 -0
- datalab/data/icons/collapse_selection.svg +63 -0
- datalab/data/icons/console.svg +101 -0
- datalab/data/icons/create/1d-normal.svg +8 -0
- datalab/data/icons/create/1d-poisson.svg +9 -0
- datalab/data/icons/create/1d-uniform.svg +8 -0
- datalab/data/icons/create/1d-zero.svg +57 -0
- datalab/data/icons/create/2d-gaussian.svg +56 -0
- datalab/data/icons/create/2d-normal.svg +38 -0
- datalab/data/icons/create/2d-poisson.svg +38 -0
- datalab/data/icons/create/2d-ramp.svg +90 -0
- datalab/data/icons/create/2d-sinc.svg +62 -0
- datalab/data/icons/create/2d-uniform.svg +38 -0
- datalab/data/icons/create/2d-zero.svg +13 -0
- datalab/data/icons/create/checkerboard.svg +39 -0
- datalab/data/icons/create/cosine.svg +12 -0
- datalab/data/icons/create/exponential.svg +55 -0
- datalab/data/icons/create/gaussian.svg +12 -0
- datalab/data/icons/create/grating.svg +29 -0
- datalab/data/icons/create/linear_chirp.svg +7 -0
- datalab/data/icons/create/logistic.svg +7 -0
- datalab/data/icons/create/lorentzian.svg +12 -0
- datalab/data/icons/create/planck.svg +12 -0
- datalab/data/icons/create/polynomial.svg +7 -0
- datalab/data/icons/create/pulse.svg +12 -0
- datalab/data/icons/create/ring.svg +18 -0
- datalab/data/icons/create/sawtooth.svg +7 -0
- datalab/data/icons/create/siemens.svg +35 -0
- datalab/data/icons/create/sinc.svg +12 -0
- datalab/data/icons/create/sine.svg +7 -0
- datalab/data/icons/create/square.svg +7 -0
- datalab/data/icons/create/square_pulse.svg +7 -0
- datalab/data/icons/create/step.svg +7 -0
- datalab/data/icons/create/step_pulse.svg +12 -0
- datalab/data/icons/create/triangle.svg +7 -0
- datalab/data/icons/create/voigt.svg +12 -0
- datalab/data/icons/edit/annotations.svg +72 -0
- datalab/data/icons/edit/annotations_copy.svg +114 -0
- datalab/data/icons/edit/annotations_delete.svg +83 -0
- datalab/data/icons/edit/annotations_edit.svg +98 -0
- datalab/data/icons/edit/annotations_export.svg +85 -0
- datalab/data/icons/edit/annotations_import.svg +85 -0
- datalab/data/icons/edit/annotations_paste.svg +100 -0
- datalab/data/icons/edit/copy_titles.svg +109 -0
- datalab/data/icons/edit/delete.svg +84 -0
- datalab/data/icons/edit/delete_all.svg +214 -0
- datalab/data/icons/edit/duplicate.svg +64 -0
- datalab/data/icons/edit/goto_source.svg +60 -0
- datalab/data/icons/edit/metadata.svg +60 -0
- datalab/data/icons/edit/metadata_add.svg +80 -0
- datalab/data/icons/edit/metadata_copy.svg +96 -0
- datalab/data/icons/edit/metadata_delete.svg +62 -0
- datalab/data/icons/edit/metadata_export.svg +68 -0
- datalab/data/icons/edit/metadata_import.svg +68 -0
- datalab/data/icons/edit/metadata_paste.svg +79 -0
- datalab/data/icons/edit/move_down.svg +55 -0
- datalab/data/icons/edit/move_up.svg +54 -0
- datalab/data/icons/edit/new_group.svg +76 -0
- datalab/data/icons/edit/recompute.svg +60 -0
- datalab/data/icons/edit/rename.svg +49 -0
- datalab/data/icons/edit.svg +16 -0
- datalab/data/icons/expand.svg +44 -0
- datalab/data/icons/expand_selection.svg +63 -0
- datalab/data/icons/fit/cdf_fit.svg +56 -0
- datalab/data/icons/fit/exponential_fit.svg +55 -0
- datalab/data/icons/fit/gaussian_fit.svg +62 -0
- datalab/data/icons/fit/interactive_fit.svg +101 -0
- datalab/data/icons/fit/linear_fit.svg +57 -0
- datalab/data/icons/fit/lorentzian_fit.svg +209 -0
- datalab/data/icons/fit/multigaussian_fit.svg +85 -0
- datalab/data/icons/fit/multilorentzian_fit.svg +85 -0
- datalab/data/icons/fit/piecewiseexponential_fit.svg +209 -0
- datalab/data/icons/fit/planckian_fit.svg +62 -0
- datalab/data/icons/fit/polynomial_fit.svg +59 -0
- datalab/data/icons/fit/sigmoid_fit.svg +56 -0
- datalab/data/icons/fit/sinusoidal_fit.svg +72 -0
- datalab/data/icons/fit/twohalfgaussian_fit.svg +63 -0
- datalab/data/icons/fit/voigt_fit.svg +57 -0
- datalab/data/icons/group.svg +56 -0
- datalab/data/icons/h5/h5array.svg +59 -0
- datalab/data/icons/h5/h5attrs.svg +75 -0
- datalab/data/icons/h5/h5browser.svg +133 -0
- datalab/data/icons/h5/h5file.svg +69 -0
- datalab/data/icons/h5/h5group.svg +49 -0
- datalab/data/icons/h5/h5scalar.svg +1 -0
- datalab/data/icons/help_pdf.svg +46 -0
- datalab/data/icons/history.svg +7 -0
- datalab/data/icons/image.svg +135 -0
- datalab/data/icons/io/fileopen_directory.svg +60 -0
- datalab/data/icons/io/fileopen_h5.svg +84 -0
- datalab/data/icons/io/fileopen_ima.svg +187 -0
- datalab/data/icons/io/fileopen_py.svg +123 -0
- datalab/data/icons/io/fileopen_sig.svg +138 -0
- datalab/data/icons/io/filesave_h5.svg +97 -0
- datalab/data/icons/io/filesave_ima.svg +200 -0
- datalab/data/icons/io/filesave_py.svg +136 -0
- datalab/data/icons/io/filesave_sig.svg +151 -0
- datalab/data/icons/io/import_text.svg +144 -0
- datalab/data/icons/io/save_to_directory.svg +134 -0
- datalab/data/icons/io.svg +84 -0
- datalab/data/icons/libre-camera-flash-off.svg +1 -0
- datalab/data/icons/libre-camera-flash-on.svg +1 -0
- datalab/data/icons/libre-gui-about.svg +1 -0
- datalab/data/icons/libre-gui-action-delete.svg +1 -0
- datalab/data/icons/libre-gui-add.svg +1 -0
- datalab/data/icons/libre-gui-arrow-down.svg +1 -0
- datalab/data/icons/libre-gui-arrow-left.svg +1 -0
- datalab/data/icons/libre-gui-arrow-right.svg +1 -0
- datalab/data/icons/libre-gui-arrow-up.svg +1 -0
- datalab/data/icons/libre-gui-close.svg +40 -0
- datalab/data/icons/libre-gui-cogs.svg +1 -0
- datalab/data/icons/libre-gui-globe.svg +1 -0
- datalab/data/icons/libre-gui-help.svg +1 -0
- datalab/data/icons/libre-gui-link.svg +1 -0
- datalab/data/icons/libre-gui-menu.svg +1 -0
- datalab/data/icons/libre-gui-pencil.svg +1 -0
- datalab/data/icons/libre-gui-plugin.svg +1 -0
- datalab/data/icons/libre-gui-questions.svg +1 -0
- datalab/data/icons/libre-gui-settings.svg +1 -0
- datalab/data/icons/libre-gui-unlink.svg +1 -0
- datalab/data/icons/libre-tech-ram.svg +1 -0
- datalab/data/icons/libre-toolbox.svg +1 -0
- datalab/data/icons/logs.svg +1 -0
- datalab/data/icons/markers.svg +74 -0
- datalab/data/icons/menu.svg +13 -0
- datalab/data/icons/new_ima.svg +148 -0
- datalab/data/icons/new_sig.svg +123 -0
- datalab/data/icons/operations/abs.svg +116 -0
- datalab/data/icons/operations/arithmetic.svg +123 -0
- datalab/data/icons/operations/average.svg +124 -0
- datalab/data/icons/operations/complex_from_magnitude_phase.svg +116 -0
- datalab/data/icons/operations/complex_from_real_imag.svg +124 -0
- datalab/data/icons/operations/constant.svg +116 -0
- datalab/data/icons/operations/constant_add.svg +109 -0
- datalab/data/icons/operations/constant_divide.svg +109 -0
- datalab/data/icons/operations/constant_multiply.svg +109 -0
- datalab/data/icons/operations/constant_subtract.svg +109 -0
- datalab/data/icons/operations/convert_dtype.svg +117 -0
- datalab/data/icons/operations/convolution.svg +46 -0
- datalab/data/icons/operations/deconvolution.svg +57 -0
- datalab/data/icons/operations/derivative.svg +127 -0
- datalab/data/icons/operations/difference.svg +52 -0
- datalab/data/icons/operations/division.svg +139 -0
- datalab/data/icons/operations/exp.svg +116 -0
- datalab/data/icons/operations/flip_horizontally.svg +69 -0
- datalab/data/icons/operations/flip_vertically.svg +74 -0
- datalab/data/icons/operations/im.svg +124 -0
- datalab/data/icons/operations/integral.svg +50 -0
- datalab/data/icons/operations/inverse.svg +143 -0
- datalab/data/icons/operations/log10.svg +109 -0
- datalab/data/icons/operations/phase.svg +116 -0
- datalab/data/icons/operations/power.svg +118 -0
- datalab/data/icons/operations/product.svg +124 -0
- datalab/data/icons/operations/profile.svg +379 -0
- datalab/data/icons/operations/profile_average.svg +399 -0
- datalab/data/icons/operations/profile_radial.svg +261 -0
- datalab/data/icons/operations/profile_segment.svg +262 -0
- datalab/data/icons/operations/quadratic_difference.svg +84 -0
- datalab/data/icons/operations/re.svg +124 -0
- datalab/data/icons/operations/rotate_left.svg +72 -0
- datalab/data/icons/operations/rotate_right.svg +72 -0
- datalab/data/icons/operations/signals_to_image.svg +314 -0
- datalab/data/icons/operations/sqrt.svg +110 -0
- datalab/data/icons/operations/std.svg +124 -0
- datalab/data/icons/operations/sum.svg +102 -0
- datalab/data/icons/play_demo.svg +9 -0
- datalab/data/icons/processing/axis_transform.svg +62 -0
- datalab/data/icons/processing/bandpass.svg +79 -0
- datalab/data/icons/processing/bandstop.svg +71 -0
- datalab/data/icons/processing/binning.svg +126 -0
- datalab/data/icons/processing/clip.svg +119 -0
- datalab/data/icons/processing/detrending.svg +173 -0
- datalab/data/icons/processing/distribute_on_grid.svg +769 -0
- datalab/data/icons/processing/edge_detection.svg +46 -0
- datalab/data/icons/processing/erase.svg +1 -0
- datalab/data/icons/processing/exposure.svg +143 -0
- datalab/data/icons/processing/fourier.svg +104 -0
- datalab/data/icons/processing/highpass.svg +59 -0
- datalab/data/icons/processing/interpolation.svg +71 -0
- datalab/data/icons/processing/level_adjustment.svg +70 -0
- datalab/data/icons/processing/lowpass.svg +60 -0
- datalab/data/icons/processing/morphology.svg +49 -0
- datalab/data/icons/processing/noise_addition.svg +114 -0
- datalab/data/icons/processing/noise_reduction.svg +38 -0
- datalab/data/icons/processing/normalize.svg +84 -0
- datalab/data/icons/processing/offset_correction.svg +131 -0
- datalab/data/icons/processing/resampling1d.svg +101 -0
- datalab/data/icons/processing/resampling2d.svg +240 -0
- datalab/data/icons/processing/reset_positions.svg +185 -0
- datalab/data/icons/processing/resize.svg +9 -0
- datalab/data/icons/processing/reverse_signal_x.svg +171 -0
- datalab/data/icons/processing/stability.svg +11 -0
- datalab/data/icons/processing/swap_x_y.svg +65 -0
- datalab/data/icons/processing/thresholding.svg +63 -0
- datalab/data/icons/processing/windowing.svg +45 -0
- datalab/data/icons/properties.svg +26 -0
- datalab/data/icons/reset.svg +9 -0
- datalab/data/icons/restore.svg +40 -0
- datalab/data/icons/roi/roi.svg +76 -0
- datalab/data/icons/roi/roi_coordinate.svg +78 -0
- datalab/data/icons/roi/roi_copy.svg +112 -0
- datalab/data/icons/roi/roi_delete.svg +81 -0
- datalab/data/icons/roi/roi_export.svg +87 -0
- datalab/data/icons/roi/roi_graphical.svg +78 -0
- datalab/data/icons/roi/roi_grid.svg +67 -0
- datalab/data/icons/roi/roi_ima.svg +188 -0
- datalab/data/icons/roi/roi_import.svg +87 -0
- datalab/data/icons/roi/roi_new.svg +81 -0
- datalab/data/icons/roi/roi_new_circle.svg +95 -0
- datalab/data/icons/roi/roi_new_polygon.svg +110 -0
- datalab/data/icons/roi/roi_new_rectangle.svg +70 -0
- datalab/data/icons/roi/roi_paste.svg +98 -0
- datalab/data/icons/roi/roi_sig.svg +124 -0
- datalab/data/icons/shapes.svg +134 -0
- datalab/data/icons/signal.svg +103 -0
- datalab/data/icons/table.svg +85 -0
- datalab/data/icons/table_unavailable.svg +102 -0
- datalab/data/icons/to_signal.svg +124 -0
- datalab/data/icons/tour/next.svg +44 -0
- datalab/data/icons/tour/previous.svg +44 -0
- datalab/data/icons/tour/rewind.svg +51 -0
- datalab/data/icons/tour/stop.svg +47 -0
- datalab/data/icons/tour/tour.svg +16 -0
- datalab/data/icons/uncheck_all.svg +78 -0
- datalab/data/icons/view/curve_antialiasing.svg +50 -0
- datalab/data/icons/view/new_window.svg +98 -0
- datalab/data/icons/view/refresh-auto.svg +57 -0
- datalab/data/icons/view/refresh-manual.svg +51 -0
- datalab/data/icons/view/reset_curve_styles.svg +96 -0
- datalab/data/icons/view/show_first.svg +55 -0
- datalab/data/icons/view/show_titles.svg +46 -0
- datalab/data/icons/visualization.svg +51 -0
- datalab/data/logo/DataLab-Banner-150.png +0 -0
- datalab/data/logo/DataLab-Banner-200.png +0 -0
- datalab/data/logo/DataLab-Banner2-100.png +0 -0
- datalab/data/logo/DataLab-Splash.png +0 -0
- datalab/data/logo/DataLab-watermark.png +0 -0
- datalab/data/logo/DataLab.svg +83 -0
- datalab/data/tests/reordering_test.h5 +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot1.jpg +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot2.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_13.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_18.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_23.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_30.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_35.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_40.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_45.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_50.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_55.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_60.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_65.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_70.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_75.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_80.jpg +0 -0
- datalab/env.py +542 -0
- datalab/gui/__init__.py +89 -0
- datalab/gui/actionhandler.py +1701 -0
- datalab/gui/docks.py +473 -0
- datalab/gui/h5io.py +150 -0
- datalab/gui/macroeditor.py +310 -0
- datalab/gui/main.py +2081 -0
- datalab/gui/newobject.py +217 -0
- datalab/gui/objectview.py +766 -0
- datalab/gui/panel/__init__.py +48 -0
- datalab/gui/panel/base.py +3254 -0
- datalab/gui/panel/image.py +157 -0
- datalab/gui/panel/macro.py +607 -0
- datalab/gui/panel/signal.py +164 -0
- datalab/gui/plothandler.py +800 -0
- datalab/gui/processor/__init__.py +84 -0
- datalab/gui/processor/base.py +2456 -0
- datalab/gui/processor/catcher.py +75 -0
- datalab/gui/processor/image.py +1214 -0
- datalab/gui/processor/signal.py +755 -0
- datalab/gui/profiledialog.py +333 -0
- datalab/gui/roieditor.py +633 -0
- datalab/gui/roigrideditor.py +208 -0
- datalab/gui/settings.py +612 -0
- datalab/gui/tour.py +908 -0
- datalab/h5/__init__.py +12 -0
- datalab/h5/common.py +314 -0
- datalab/h5/generic.py +580 -0
- datalab/h5/native.py +39 -0
- datalab/h5/utils.py +95 -0
- datalab/objectmodel.py +640 -0
- datalab/plugins/_readme_.txt +9 -0
- datalab/plugins/datalab_imageformats.py +175 -0
- datalab/plugins/datalab_testdata.py +190 -0
- datalab/plugins.py +355 -0
- datalab/tests/__init__.py +199 -0
- datalab/tests/backbone/__init__.py +1 -0
- datalab/tests/backbone/config_unit_test.py +170 -0
- datalab/tests/backbone/config_versioning_unit_test.py +34 -0
- datalab/tests/backbone/dictlistserial_app_test.py +38 -0
- datalab/tests/backbone/errorcatcher_unit_test.py +69 -0
- datalab/tests/backbone/errormsgbox_unit_test.py +50 -0
- datalab/tests/backbone/execenv_unit.py +262 -0
- datalab/tests/backbone/loadtest_gdi.py +147 -0
- datalab/tests/backbone/long_callback.py +96 -0
- datalab/tests/backbone/main_app_test.py +137 -0
- datalab/tests/backbone/memory_leak.py +43 -0
- datalab/tests/backbone/procisolation1_unit.py +128 -0
- datalab/tests/backbone/procisolation2_unit.py +171 -0
- datalab/tests/backbone/procisolation_unit_test.py +22 -0
- datalab/tests/backbone/profiling_app.py +27 -0
- datalab/tests/backbone/strings_unit_test.py +65 -0
- datalab/tests/backbone/title_formatting_unit_test.py +82 -0
- datalab/tests/conftest.py +131 -0
- datalab/tests/features/__init__.py +1 -0
- datalab/tests/features/applauncher/__init__.py +1 -0
- datalab/tests/features/applauncher/launcher1_app_test.py +28 -0
- datalab/tests/features/applauncher/launcher2_app_test.py +30 -0
- datalab/tests/features/common/__init__.py +1 -0
- datalab/tests/features/common/add_metadata_app_test.py +134 -0
- datalab/tests/features/common/add_metadata_unit_test.py +267 -0
- datalab/tests/features/common/annotations_management_unit_test.py +152 -0
- datalab/tests/features/common/auto_analysis_recompute_unit_test.py +240 -0
- datalab/tests/features/common/createobject_unit_test.py +50 -0
- datalab/tests/features/common/geometry_results_app_test.py +135 -0
- datalab/tests/features/common/interactive_processing_test.py +1109 -0
- datalab/tests/features/common/io_app_test.py +75 -0
- datalab/tests/features/common/large_results_app_test.py +187 -0
- datalab/tests/features/common/metadata_all_patterns_test.py +103 -0
- datalab/tests/features/common/metadata_app_test.py +139 -0
- datalab/tests/features/common/metadata_io_unit_test.py +60 -0
- datalab/tests/features/common/misc_app_test.py +236 -0
- datalab/tests/features/common/multiple_geometry_results_unit_test.py +122 -0
- datalab/tests/features/common/multiple_table_results_unit_test.py +64 -0
- datalab/tests/features/common/operation_modes_app_test.py +392 -0
- datalab/tests/features/common/plot_results_app_test.py +278 -0
- datalab/tests/features/common/reorder_app_test.py +75 -0
- datalab/tests/features/common/result_deletion_unit_test.py +96 -0
- datalab/tests/features/common/result_merged_label_unit_test.py +154 -0
- datalab/tests/features/common/result_shape_settings_unit_test.py +223 -0
- datalab/tests/features/common/roi_plotitem_unit_test.py +64 -0
- datalab/tests/features/common/roieditor_unit_test.py +102 -0
- datalab/tests/features/common/save_to_dir_app_test.py +163 -0
- datalab/tests/features/common/save_to_dir_unit_test.py +474 -0
- datalab/tests/features/common/stat_app_test.py +40 -0
- datalab/tests/features/common/stats_tools_unit_test.py +77 -0
- datalab/tests/features/common/table_results_app_test.py +52 -0
- datalab/tests/features/common/textimport_unit_test.py +131 -0
- datalab/tests/features/common/uuid_preservation_test.py +281 -0
- datalab/tests/features/common/worker_unit_test.py +402 -0
- datalab/tests/features/control/__init__.py +1 -0
- datalab/tests/features/control/connect_dialog.py +28 -0
- datalab/tests/features/control/embedded1_unit_test.py +304 -0
- datalab/tests/features/control/embedded2_unit_test.py +52 -0
- datalab/tests/features/control/remoteclient_app_test.py +219 -0
- datalab/tests/features/control/remoteclient_unit.py +75 -0
- datalab/tests/features/control/simpleclient_unit_test.py +321 -0
- datalab/tests/features/hdf5/__init__.py +1 -0
- datalab/tests/features/hdf5/h5browser1_unit_test.py +31 -0
- datalab/tests/features/hdf5/h5browser2_unit.py +55 -0
- datalab/tests/features/hdf5/h5browser_app_test.py +77 -0
- datalab/tests/features/hdf5/h5import_app_test.py +25 -0
- datalab/tests/features/hdf5/h5importer_app_test.py +34 -0
- datalab/tests/features/image/__init__.py +1 -0
- datalab/tests/features/image/annotations_app_test.py +28 -0
- datalab/tests/features/image/annotations_unit_test.py +80 -0
- datalab/tests/features/image/average_app_test.py +46 -0
- datalab/tests/features/image/background_dialog_test.py +70 -0
- datalab/tests/features/image/blobs_app_test.py +50 -0
- datalab/tests/features/image/contour_app_test.py +42 -0
- datalab/tests/features/image/contour_fabryperot_app_test.py +51 -0
- datalab/tests/features/image/denoise_app_test.py +31 -0
- datalab/tests/features/image/distribute_on_grid_app_test.py +95 -0
- datalab/tests/features/image/edges_app_test.py +31 -0
- datalab/tests/features/image/erase_app_test.py +21 -0
- datalab/tests/features/image/fft2d_app_test.py +27 -0
- datalab/tests/features/image/flatfield_app_test.py +40 -0
- datalab/tests/features/image/geometry_transform_unit_test.py +396 -0
- datalab/tests/features/image/imagetools_app_test.py +51 -0
- datalab/tests/features/image/imagetools_unit_test.py +27 -0
- datalab/tests/features/image/load_app_test.py +73 -0
- datalab/tests/features/image/morph_app_test.py +32 -0
- datalab/tests/features/image/offsetcorrection_app_test.py +30 -0
- datalab/tests/features/image/peak2d_app_test.py +53 -0
- datalab/tests/features/image/profile_app_test.py +73 -0
- datalab/tests/features/image/profile_dialog_test.py +56 -0
- datalab/tests/features/image/roi_app_test.py +98 -0
- datalab/tests/features/image/roi_circ_app_test.py +62 -0
- datalab/tests/features/image/roi_manipulation_app_test.py +268 -0
- datalab/tests/features/image/roigrid_unit_test.py +60 -0
- datalab/tests/features/image/side_by_side_app_test.py +52 -0
- datalab/tests/features/macro/__init__.py +1 -0
- datalab/tests/features/macro/macro_app_test.py +28 -0
- datalab/tests/features/macro/macroeditor_unit_test.py +102 -0
- datalab/tests/features/signal/__init__.py +1 -0
- datalab/tests/features/signal/baseline_dialog_test.py +53 -0
- datalab/tests/features/signal/deltax_dialog_unit_test.py +34 -0
- datalab/tests/features/signal/fft1d_app_test.py +26 -0
- datalab/tests/features/signal/filter_app_test.py +44 -0
- datalab/tests/features/signal/fitdialog_unit_test.py +50 -0
- datalab/tests/features/signal/interpolation_app_test.py +110 -0
- datalab/tests/features/signal/loadbigsignal_app_test.py +80 -0
- datalab/tests/features/signal/multiple_rois_unit_test.py +132 -0
- datalab/tests/features/signal/pulse_features_app_test.py +118 -0
- datalab/tests/features/signal/pulse_features_roi_app_test.py +55 -0
- datalab/tests/features/signal/roi_app_test.py +78 -0
- datalab/tests/features/signal/roi_manipulation_app_test.py +261 -0
- datalab/tests/features/signal/select_xy_cursor_unit_test.py +46 -0
- datalab/tests/features/signal/signalpeakdetection_dialog_test.py +33 -0
- datalab/tests/features/signal/signals_to_image_app_test.py +98 -0
- datalab/tests/features/signal/xarray_compat_app_test.py +128 -0
- datalab/tests/features/tour_unit_test.py +22 -0
- datalab/tests/features/utilities/__init__.py +1 -0
- datalab/tests/features/utilities/installconf_unit_test.py +21 -0
- datalab/tests/features/utilities/logview_app_test.py +21 -0
- datalab/tests/features/utilities/logview_error.py +24 -0
- datalab/tests/features/utilities/logview_unit_test.py +21 -0
- datalab/tests/features/utilities/memstatus_app_test.py +42 -0
- datalab/tests/features/utilities/settings_unit_test.py +88 -0
- datalab/tests/scenarios/__init__.py +1 -0
- datalab/tests/scenarios/beautiful_app.py +121 -0
- datalab/tests/scenarios/common.py +463 -0
- datalab/tests/scenarios/demo.py +212 -0
- datalab/tests/scenarios/example_app_test.py +47 -0
- datalab/tests/scenarios/scenario_h5_app_test.py +75 -0
- datalab/tests/scenarios/scenario_ima1_app_test.py +34 -0
- datalab/tests/scenarios/scenario_ima2_app_test.py +34 -0
- datalab/tests/scenarios/scenario_mac_app_test.py +58 -0
- datalab/tests/scenarios/scenario_sig1_app_test.py +36 -0
- datalab/tests/scenarios/scenario_sig2_app_test.py +35 -0
- datalab/utils/__init__.py +1 -0
- datalab/utils/conf.py +304 -0
- datalab/utils/dephash.py +105 -0
- datalab/utils/qthelpers.py +633 -0
- datalab/utils/strings.py +34 -0
- datalab/utils/tests.py +0 -0
- datalab/widgets/__init__.py +1 -0
- datalab/widgets/connection.py +138 -0
- datalab/widgets/filedialog.py +91 -0
- datalab/widgets/fileviewer.py +84 -0
- datalab/widgets/fitdialog.py +788 -0
- datalab/widgets/h5browser.py +1048 -0
- datalab/widgets/imagebackground.py +111 -0
- datalab/widgets/instconfviewer.py +175 -0
- datalab/widgets/logviewer.py +80 -0
- datalab/widgets/signalbaseline.py +90 -0
- datalab/widgets/signalcursor.py +208 -0
- datalab/widgets/signaldeltax.py +151 -0
- datalab/widgets/signalpeak.py +199 -0
- datalab/widgets/status.py +249 -0
- datalab/widgets/textimport.py +786 -0
- datalab/widgets/warningerror.py +223 -0
- datalab/widgets/wizard.py +286 -0
- datalab_platform-1.0.0.dist-info/METADATA +121 -0
- datalab_platform-1.0.0.dist-info/RECORD +494 -0
- datalab_platform-0.0.1.dev0.dist-info/METADATA +0 -67
- datalab_platform-0.0.1.dev0.dist-info/RECORD +0 -7
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.0.dist-info}/WHEEL +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.0.dist-info}/entry_points.txt +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.0.dist-info}/licenses/LICENSE +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Profile dialog
|
|
5
|
+
==============
|
|
6
|
+
|
|
7
|
+
The :mod:`datalab.gui.profiledialog` module provides the profile extraction dialog.
|
|
8
|
+
|
|
9
|
+
.. autoclass:: ProfileExtractionDialog
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# pylint: disable=invalid-name # Allows short reference names like x, y, ...
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from typing import TYPE_CHECKING, Literal
|
|
17
|
+
|
|
18
|
+
import qtpy.QtCore as QC
|
|
19
|
+
import sigima.params
|
|
20
|
+
from guidata.configtools import get_icon
|
|
21
|
+
from plotpy.interfaces import ICurveItemType
|
|
22
|
+
from plotpy.items import AnnotatedPoint, AnnotatedRectangle, AnnotatedSegment
|
|
23
|
+
from plotpy.panels.csection.cswidget import LineCrossSection
|
|
24
|
+
from plotpy.plot import PlotDialog, PlotOptions
|
|
25
|
+
from plotpy.tools import AverageCrossSectionTool, CrossSectionTool, LineCrossSectionTool
|
|
26
|
+
from qtpy import QtWidgets as QW
|
|
27
|
+
from qtpy.QtWidgets import QWidget
|
|
28
|
+
|
|
29
|
+
from datalab.adapters_plotpy import create_adapter_from_object
|
|
30
|
+
from datalab.config import _
|
|
31
|
+
from datalab.utils.qthelpers import resize_widget_to_parent
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from plotpy.items import CurveItem
|
|
35
|
+
from plotpy.panels import XCrossSection, YCrossSection
|
|
36
|
+
from plotpy.plot import BasePlot
|
|
37
|
+
from sigima.objects import ImageObj
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ProfileExtractionDialog(PlotDialog):
|
|
41
|
+
"""Profile extraction dialog
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
mode: "line", "segment" or "rectangle"
|
|
45
|
+
options: Plot options
|
|
46
|
+
parent: Parent widget
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
mode: Literal["line", "segment", "rectangle"],
|
|
52
|
+
param: sigima.params.LineProfileParam
|
|
53
|
+
| sigima.params.SegmentProfileParam
|
|
54
|
+
| sigima.params.AverageProfileParam,
|
|
55
|
+
options: PlotOptions | None = None,
|
|
56
|
+
parent: QWidget | None = None,
|
|
57
|
+
add_initial_shape: bool = False,
|
|
58
|
+
) -> None:
|
|
59
|
+
self.__obj: ImageObj | None = None
|
|
60
|
+
self.__default_curve_color: str | None = None
|
|
61
|
+
assert mode in ("line", "segment", "rectangle")
|
|
62
|
+
self.mode = mode
|
|
63
|
+
self.param = param
|
|
64
|
+
title = param.get_title()
|
|
65
|
+
self.__add_initial_shape = add_initial_shape
|
|
66
|
+
if options is None:
|
|
67
|
+
options = PlotOptions(show_contrast=True, show_axes_tab=False)
|
|
68
|
+
options.show_xsection = options.show_ysection = True
|
|
69
|
+
toolklass = {
|
|
70
|
+
"line": CrossSectionTool,
|
|
71
|
+
"segment": LineCrossSectionTool,
|
|
72
|
+
"rectangle": AverageCrossSectionTool,
|
|
73
|
+
}[mode]
|
|
74
|
+
super().__init__(title=title, edit=True, options=options, parent=parent)
|
|
75
|
+
self.setObjectName("profileextraction")
|
|
76
|
+
self.setWindowIcon(get_icon("DataLab.svg"))
|
|
77
|
+
resize_widget_to_parent(self, parent, aspect_ratio=1.0)
|
|
78
|
+
mgr = self.get_manager()
|
|
79
|
+
tool: (
|
|
80
|
+
CrossSectionTool | LineCrossSectionTool | AverageCrossSectionTool | None
|
|
81
|
+
) = mgr.get_tool(toolklass)
|
|
82
|
+
if tool is None:
|
|
83
|
+
tool = mgr.add_tool(toolklass)
|
|
84
|
+
self.cstool = tool
|
|
85
|
+
self.shape: AnnotatedPoint | AnnotatedSegment | AnnotatedRectangle | None = None
|
|
86
|
+
self.param_btn = pbtn = QW.QPushButton(_("Edit profile parameters"))
|
|
87
|
+
pbtn.setIcon(get_icon("edit.svg"))
|
|
88
|
+
pbtn.clicked.connect(self.edit_values)
|
|
89
|
+
pbtn.setEnabled(False)
|
|
90
|
+
self.button_box.button(QW.QDialogButtonBox.Ok).setEnabled(False)
|
|
91
|
+
tool.SIG_TOOL_JOB_FINISHED.connect(self.__tool_job_finished)
|
|
92
|
+
self.button_layout.insertWidget(0, pbtn)
|
|
93
|
+
rbtn = QW.QPushButton(_("Reset selection"))
|
|
94
|
+
rbtn.setIcon(get_icon("reset.svg"))
|
|
95
|
+
rbtn.clicked.connect(self.reset_to_initial)
|
|
96
|
+
self.button_layout.insertWidget(1, rbtn)
|
|
97
|
+
self.update_cs_panels_state()
|
|
98
|
+
self.get_plot().SIG_ITEMS_CHANGED.connect(self.update_cs_panels_state)
|
|
99
|
+
|
|
100
|
+
def populate_plot_layout(self):
|
|
101
|
+
"""Populate the plot layout"""
|
|
102
|
+
super().populate_plot_layout()
|
|
103
|
+
lcs_panel = LineCrossSection(self)
|
|
104
|
+
splitter = self.plot_widget.xcsw_splitter
|
|
105
|
+
splitter.addWidget(lcs_panel)
|
|
106
|
+
splitter.setSizes([0, 1, 0])
|
|
107
|
+
self.manager.add_panel(lcs_panel)
|
|
108
|
+
# Install event filters on cross-section plots to detect clicks
|
|
109
|
+
mgr = self.get_manager()
|
|
110
|
+
xcs_panel = mgr.get_xcs_panel()
|
|
111
|
+
ycs_panel = mgr.get_ycs_panel()
|
|
112
|
+
if xcs_panel is not None:
|
|
113
|
+
xcs_panel.cs_plot.canvas().installEventFilter(self)
|
|
114
|
+
# Store reference to know which plot was clicked
|
|
115
|
+
xcs_panel.cs_plot.canvas().setProperty("cs_direction", "horizontal")
|
|
116
|
+
if ycs_panel is not None:
|
|
117
|
+
ycs_panel.cs_plot.canvas().installEventFilter(self)
|
|
118
|
+
ycs_panel.cs_plot.canvas().setProperty("cs_direction", "vertical")
|
|
119
|
+
|
|
120
|
+
def __set_curve_enable_state(self, curve: CurveItem, state: bool) -> None:
|
|
121
|
+
"""Set curve enable state
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
curve: Curve item
|
|
125
|
+
state: Enable state
|
|
126
|
+
"""
|
|
127
|
+
if self.__default_curve_color is None:
|
|
128
|
+
self.__default_curve_color = curve.param.line.color
|
|
129
|
+
color = self.__default_curve_color if state else "#666666"
|
|
130
|
+
curve.param.line.color = color
|
|
131
|
+
curve.param.update_item(curve)
|
|
132
|
+
|
|
133
|
+
def __get_curve(self, plot: BasePlot) -> CurveItem | None:
|
|
134
|
+
"""Get cross-section curve
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
plot: Plot
|
|
138
|
+
"""
|
|
139
|
+
curves = plot.get_items(item_type=ICurveItemType)
|
|
140
|
+
if curves:
|
|
141
|
+
return curves[0]
|
|
142
|
+
return None
|
|
143
|
+
|
|
144
|
+
def __update_xycs_panel_state(
|
|
145
|
+
self, cs_panel: XCrossSection | YCrossSection, state: bool
|
|
146
|
+
) -> None:
|
|
147
|
+
"""Update cross-section panel state
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
cs_panel: Cross-section panel
|
|
151
|
+
state: Enable state
|
|
152
|
+
"""
|
|
153
|
+
cs_panel.setEnabled(state)
|
|
154
|
+
cs_plot = cs_panel.cs_plot
|
|
155
|
+
curve = self.__get_curve(cs_plot)
|
|
156
|
+
if curve:
|
|
157
|
+
self.__set_curve_enable_state(curve, state)
|
|
158
|
+
|
|
159
|
+
def __on_cs_plot_clicked(self, direction: str) -> None:
|
|
160
|
+
"""Handle click on cross-section plot to switch direction
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
direction: "horizontal" or "vertical"
|
|
164
|
+
"""
|
|
165
|
+
# Only handle clicks for line and rectangle modes
|
|
166
|
+
if self.mode not in ("line", "rectangle"):
|
|
167
|
+
return
|
|
168
|
+
# Switch direction if different
|
|
169
|
+
if self.param.direction != direction:
|
|
170
|
+
self.param.direction = direction
|
|
171
|
+
self.update_cs_panels_state()
|
|
172
|
+
self.get_plot().replot()
|
|
173
|
+
|
|
174
|
+
def eventFilter(self, obj: QC.QObject, event: QC.QEvent) -> bool:
|
|
175
|
+
"""Event filter to detect clicks on cross-section plots
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
obj: Object
|
|
179
|
+
event: Event
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
True if event was handled, False otherwise
|
|
183
|
+
"""
|
|
184
|
+
# Check if this is a cross-section plot canvas
|
|
185
|
+
direction = obj.property("cs_direction")
|
|
186
|
+
if direction:
|
|
187
|
+
# Handle mouse press to switch direction
|
|
188
|
+
if event.type() == QC.QEvent.MouseButtonPress:
|
|
189
|
+
self.__on_cs_plot_clicked(direction)
|
|
190
|
+
# Consume the event to prevent curve selection
|
|
191
|
+
return True
|
|
192
|
+
return super().eventFilter(obj, event)
|
|
193
|
+
|
|
194
|
+
def update_cs_panels_state(self):
|
|
195
|
+
"""Enable or disable X or Y cross-section panels depending on the direction
|
|
196
|
+
of the desired profile extraction."""
|
|
197
|
+
mgr = self.get_manager()
|
|
198
|
+
lcs_panel = mgr.get_panel(LineCrossSection.PANEL_ID)
|
|
199
|
+
xcs_panel, ycs_panel = mgr.get_xcs_panel(), mgr.get_ycs_panel()
|
|
200
|
+
xymode = self.mode in ("line", "rectangle")
|
|
201
|
+
lcs_panel.setVisible(not xymode)
|
|
202
|
+
xcs_panel.setVisible(xymode)
|
|
203
|
+
ycs_panel.setVisible(xymode)
|
|
204
|
+
if xymode:
|
|
205
|
+
p = self.param
|
|
206
|
+
self.__update_xycs_panel_state(xcs_panel, p.direction == "horizontal")
|
|
207
|
+
self.__update_xycs_panel_state(ycs_panel, p.direction == "vertical")
|
|
208
|
+
|
|
209
|
+
def accept(self) -> None:
|
|
210
|
+
"""Accept"""
|
|
211
|
+
if self.shape is not None:
|
|
212
|
+
self.shape_to_param()
|
|
213
|
+
super().accept()
|
|
214
|
+
|
|
215
|
+
def reset_to_initial(self) -> None:
|
|
216
|
+
"""Reset to initial"""
|
|
217
|
+
self.param_btn.setEnabled(False)
|
|
218
|
+
self.button_box.button(QW.QDialogButtonBox.Ok).setEnabled(False)
|
|
219
|
+
if self.mode == "line":
|
|
220
|
+
self.param = sigima.params.LineProfileParam()
|
|
221
|
+
elif self.mode == "segment":
|
|
222
|
+
self.param = sigima.params.SegmentProfileParam()
|
|
223
|
+
else:
|
|
224
|
+
self.param = sigima.params.AverageProfileParam()
|
|
225
|
+
plot = self.get_plot()
|
|
226
|
+
if self.shape is not None:
|
|
227
|
+
plot.del_item(self.shape)
|
|
228
|
+
self.cstool.activate()
|
|
229
|
+
self.update_cs_panels_state()
|
|
230
|
+
self.get_plot().replot()
|
|
231
|
+
|
|
232
|
+
def __tool_job_finished(self):
|
|
233
|
+
"""Tool job finished"""
|
|
234
|
+
self.param_btn.setEnabled(True)
|
|
235
|
+
self.button_box.button(QW.QDialogButtonBox.Ok).setEnabled(True)
|
|
236
|
+
self.shape = self.cstool.get_last_final_shape()
|
|
237
|
+
assert self.shape is not None
|
|
238
|
+
self.shape.set_readonly(True)
|
|
239
|
+
self.shape_to_param()
|
|
240
|
+
self.update_cs_panels_state()
|
|
241
|
+
|
|
242
|
+
def __physical_to_indices(self, coords: list[float]) -> tuple[int, int]:
|
|
243
|
+
"""Physical to indices
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
coords: Coordinates
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
Tuple of indices
|
|
250
|
+
"""
|
|
251
|
+
assert self.__obj is not None
|
|
252
|
+
return self.__obj.physical_to_indices(coords, clip=True)
|
|
253
|
+
|
|
254
|
+
def shape_to_param(self) -> None:
|
|
255
|
+
"""Shape to param"""
|
|
256
|
+
assert self.__obj is not None
|
|
257
|
+
p2i = self.__physical_to_indices
|
|
258
|
+
p = self.param
|
|
259
|
+
if isinstance(self.shape, AnnotatedPoint):
|
|
260
|
+
assert isinstance(p, sigima.params.LineProfileParam)
|
|
261
|
+
p.col, p.row = p2i(self.shape.get_pos())
|
|
262
|
+
elif isinstance(self.shape, AnnotatedSegment):
|
|
263
|
+
assert isinstance(p, sigima.params.SegmentProfileParam)
|
|
264
|
+
p.col1, p.row1, p.col2, p.row2 = p2i(self.shape.get_rect())
|
|
265
|
+
if p.col1 > p.col2:
|
|
266
|
+
p.col1, p.col2 = p.col2, p.col1
|
|
267
|
+
p.row1, p.row2 = p.row2, p.row1
|
|
268
|
+
else:
|
|
269
|
+
assert isinstance(p, sigima.params.AverageProfileParam)
|
|
270
|
+
p.col1, p.row1, p.col2, p.row2 = p2i(self.shape.get_rect())
|
|
271
|
+
if p.col1 > p.col2:
|
|
272
|
+
p.col1, p.col2 = p.col2, p.col1
|
|
273
|
+
p.row1, p.row2 = p.row2, p.row1
|
|
274
|
+
|
|
275
|
+
def param_to_shape(self) -> None:
|
|
276
|
+
"""Param to shape"""
|
|
277
|
+
assert self.__obj is not None
|
|
278
|
+
i2p = self.__obj.indices_to_physical
|
|
279
|
+
p = self.param
|
|
280
|
+
if isinstance(self.shape, AnnotatedPoint):
|
|
281
|
+
assert isinstance(p, sigima.params.LineProfileParam)
|
|
282
|
+
x, y = i2p([p.col, p.row])
|
|
283
|
+
self.shape.set_pos(x, y)
|
|
284
|
+
elif isinstance(self.shape, AnnotatedSegment):
|
|
285
|
+
assert isinstance(p, sigima.params.SegmentProfileParam)
|
|
286
|
+
x1, y1, x2, y2 = i2p([p.col1, p.row1, p.col2, p.row2])
|
|
287
|
+
self.shape.set_rect(x1, y1, x2, y2)
|
|
288
|
+
else:
|
|
289
|
+
assert isinstance(p, sigima.params.AverageProfileParam)
|
|
290
|
+
x1, y1, x2, y2 = i2p([p.col1, p.row1, p.col2, p.row2])
|
|
291
|
+
self.shape.set_rect(x1, y1, x2, y2)
|
|
292
|
+
|
|
293
|
+
def edit_values(self) -> None:
|
|
294
|
+
"""Edit values"""
|
|
295
|
+
self.shape_to_param()
|
|
296
|
+
if self.param.edit(parent=self, apply=lambda _param: self.apply_callback()):
|
|
297
|
+
self.param_to_shape()
|
|
298
|
+
self.update_cs_panels_state()
|
|
299
|
+
self.get_plot().replot()
|
|
300
|
+
|
|
301
|
+
def apply_callback(self) -> None:
|
|
302
|
+
"""Apply callback"""
|
|
303
|
+
self.param_to_shape()
|
|
304
|
+
self.update_cs_panels_state()
|
|
305
|
+
self.get_plot().replot()
|
|
306
|
+
|
|
307
|
+
def set_obj(self, obj: ImageObj):
|
|
308
|
+
"""Set object
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
obj: Image object
|
|
312
|
+
"""
|
|
313
|
+
self.__obj = obj
|
|
314
|
+
item = create_adapter_from_object(obj).make_item()
|
|
315
|
+
item.set_readonly(True)
|
|
316
|
+
item.set_resizable(False)
|
|
317
|
+
item.set_rotatable(False)
|
|
318
|
+
item.set_selectable(False)
|
|
319
|
+
plot = self.get_plot()
|
|
320
|
+
plot.add_item(item)
|
|
321
|
+
plot.set_active_item(item)
|
|
322
|
+
item.unselect()
|
|
323
|
+
if self.__add_initial_shape:
|
|
324
|
+
plot = self.get_plot()
|
|
325
|
+
self.show() # To be able to convert axes to canvas coordinates
|
|
326
|
+
p0 = QC.QPointF(0.0, 0.0)
|
|
327
|
+
self.cstool.add_shape_to_plot(plot, p0, p0)
|
|
328
|
+
self.shape = self.cstool.get_last_final_shape()
|
|
329
|
+
self.param_to_shape()
|
|
330
|
+
self.param_btn.setEnabled(True)
|
|
331
|
+
self.button_box.button(QW.QDialogButtonBox.Ok).setEnabled(True)
|
|
332
|
+
else:
|
|
333
|
+
self.cstool.activate()
|