tomwer 1.3.26__py3-none-any.whl → 1.4.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.
- orangecontrib/tomwer/orange/managedprocess.py +1 -29
- orangecontrib/tomwer/orange/settings.py +2 -28
- orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
- orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
- orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
- orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
- orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
- orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
- orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
- orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
- orangecontrib/tomwer/widgets/__init__.py +3 -5
- orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
- orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
- orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
- orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
- orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
- orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
- orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
- orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
- orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
- orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
- orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
- orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
- orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
- orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
- orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
- orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
- orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
- orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
- orangecontrib/tomwer/widgets/utils.py +2 -29
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
- orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
- tomwer/__init__.py +3 -28
- tomwer/__main__.py +8 -4
- tomwer/app/__init__.py +2 -0
- tomwer/app/axis.py +8 -10
- tomwer/app/canvas.py +23 -29
- tomwer/app/canvas_launcher/config.py +14 -102
- tomwer/app/canvas_launcher/environ.py +5 -8
- tomwer/app/canvas_launcher/mainwindow.py +175 -69
- tomwer/app/canvas_launcher/splash.py +1 -3
- tomwer/app/canvas_launcher/utils.py +47 -0
- tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
- tomwer/app/diffframe.py +2 -0
- tomwer/app/imagekeyeditor.py +2 -1
- tomwer/app/imagekeyupgrader.py +2 -0
- tomwer/app/multicor.py +5 -2
- tomwer/app/multipag.py +16 -5
- tomwer/app/nabuapp.py +2 -1
- tomwer/app/nxtomoeditor.py +17 -12
- tomwer/app/patchrawdarkflat.py +2 -0
- tomwer/app/radiostack.py +3 -2
- tomwer/app/reducedarkflat.py +3 -0
- tomwer/app/samplemoved.py +2 -0
- tomwer/app/scanviewer.py +2 -0
- tomwer/app/sinogramviewer.py +2 -0
- tomwer/app/slicestack.py +11 -13
- tomwer/app/stitching/common.py +431 -0
- tomwer/app/stopdatalistener.py +3 -0
- tomwer/app/ystitching.py +26 -0
- tomwer/app/zstitching.py +8 -363
- tomwer/core/__init__.py +2 -28
- tomwer/core/cluster/__init__.py +3 -0
- tomwer/core/cluster/cluster.py +10 -26
- tomwer/core/futureobject.py +17 -43
- tomwer/core/log/__init__.py +2 -0
- tomwer/core/log/processlog.py +0 -28
- tomwer/core/process/cluster/supervisor.py +52 -34
- tomwer/core/process/conditions/filters.py +3 -28
- tomwer/core/process/control/datalistener/datalistener.py +7 -75
- tomwer/core/process/control/datalistener/rpcserver.py +8 -38
- tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
- tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
- tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
- tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
- tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
- tomwer/core/process/control/datawatcher/status.py +1 -26
- tomwer/core/process/control/emailnotifier.py +11 -23
- tomwer/core/process/control/nxtomoconcatenate.py +20 -18
- tomwer/core/process/control/nxtomomill.py +9 -44
- tomwer/core/process/control/scanlist.py +0 -27
- tomwer/core/process/control/scantransfer.py +15 -13
- tomwer/core/process/control/scanvalidator.py +4 -30
- tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
- tomwer/core/process/control/timer.py +1 -27
- tomwer/core/process/control/tomoobjseries.py +12 -0
- tomwer/core/process/drac/binning.py +37 -0
- tomwer/core/process/drac/dracbase.py +170 -0
- tomwer/core/process/drac/gallery.py +109 -0
- tomwer/core/process/drac/output.py +12 -0
- tomwer/core/process/drac/processeddataset.py +147 -0
- tomwer/core/process/drac/publish.py +118 -0
- tomwer/core/process/drac/rawdataset.py +142 -0
- tomwer/core/process/drac/tests/test_gallery.py +71 -0
- tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
- tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
- tomwer/core/process/edit/darkflatpatch.py +1 -28
- tomwer/core/process/edit/imagekeyeditor.py +4 -32
- tomwer/core/process/edit/nxtomoeditor.py +307 -0
- tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
- tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
- tomwer/core/process/output.py +9 -2
- tomwer/core/process/reconstruction/__init__.py +0 -26
- tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
- tomwer/core/process/reconstruction/axis/axis.py +47 -804
- tomwer/core/process/reconstruction/axis/mode.py +89 -25
- tomwer/core/process/reconstruction/axis/params.py +131 -283
- tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
- tomwer/core/process/reconstruction/axis/side.py +8 -0
- tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
- tomwer/core/process/reconstruction/darkref/params.py +1 -28
- tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
- tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
- tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
- tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
- tomwer/core/process/reconstruction/nabu/plane.py +10 -0
- tomwer/core/process/reconstruction/nabu/settings.py +1 -28
- tomwer/core/process/reconstruction/nabu/target.py +0 -28
- tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
- tomwer/core/process/reconstruction/nabu/utils.py +11 -60
- tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
- tomwer/core/process/reconstruction/normalization/params.py +3 -35
- tomwer/core/process/reconstruction/output.py +14 -19
- tomwer/core/process/reconstruction/paramsbase.py +4 -33
- tomwer/core/process/reconstruction/saaxis/params.py +5 -33
- tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
- tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
- tomwer/core/process/reconstruction/scores/params.py +9 -39
- tomwer/core/process/reconstruction/scores/scores.py +10 -42
- tomwer/core/process/reconstruction/tests/__init__.py +0 -0
- tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
- tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
- tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
- tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
- tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
- tomwer/core/process/reconstruction/utils/cor.py +8 -4
- tomwer/core/process/script/python.py +1 -27
- tomwer/core/process/script/tests/test_script.py +41 -0
- tomwer/core/process/stitching/metadataholder.py +5 -4
- tomwer/core/process/stitching/nabustitcher.py +35 -5
- tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
- tomwer/core/process/task.py +20 -63
- tomwer/core/process/tests/__init__.py +0 -0
- tomwer/core/process/{test → tests}/test_conditions.py +1 -28
- tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
- tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
- tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
- tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
- tomwer/core/process/{test → tests}/test_nabu.py +2 -33
- tomwer/core/process/{test → tests}/test_normalization.py +1 -26
- tomwer/core/process/{test → tests}/test_timer.py +1 -27
- tomwer/core/process/utils.py +2 -31
- tomwer/core/process/visualization/dataviewer.py +1 -26
- tomwer/core/process/visualization/diffviewer.py +1 -26
- tomwer/core/process/visualization/imagestackviewer.py +0 -26
- tomwer/core/process/visualization/radiostack.py +0 -26
- tomwer/core/process/visualization/samplemoved.py +0 -28
- tomwer/core/process/visualization/sinogramviewer.py +0 -27
- tomwer/core/process/visualization/slicestack.py +0 -28
- tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
- tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
- tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
- tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
- tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
- tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
- tomwer/core/process/visualization/volumeviewer.py +0 -29
- tomwer/core/scan/__init__.py +3 -27
- tomwer/core/scan/blissscan.py +5 -34
- tomwer/core/scan/edfscan.py +19 -53
- tomwer/core/scan/hdf5scan.py +2 -2
- tomwer/core/scan/nxtomoscan.py +48 -54
- tomwer/core/scan/scanbase.py +107 -203
- tomwer/core/scan/scanfactory.py +11 -41
- tomwer/core/scan/tests/__init__.py +0 -0
- tomwer/core/scan/tests/test_edf.py +25 -0
- tomwer/core/scan/tests/test_future_scan.py +35 -0
- tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
- tomwer/core/scan/tests/test_process_registration.py +64 -0
- tomwer/core/settings.py +18 -40
- tomwer/core/tests/__init__.py +0 -0
- tomwer/core/tests/test_scanutils.py +26 -0
- tomwer/core/{test → tests}/test_utils.py +1 -28
- tomwer/core/tomwer_object.py +4 -0
- tomwer/core/utils/__init__.py +2 -0
- tomwer/core/utils/char.py +0 -28
- tomwer/core/utils/deprecation.py +12 -38
- tomwer/core/utils/dictutils.py +1 -3
- tomwer/core/utils/ftseriesutils.py +1 -27
- tomwer/core/utils/gpu.py +0 -28
- tomwer/core/utils/image.py +8 -39
- tomwer/core/utils/locker.py +1 -28
- tomwer/core/utils/logconfig.py +0 -27
- tomwer/core/utils/normalization.py +4 -31
- tomwer/core/utils/nxtomoutils.py +8 -38
- tomwer/core/utils/resource.py +0 -26
- tomwer/core/utils/scanutils.py +23 -52
- tomwer/core/utils/slurm.py +7 -30
- tomwer/core/utils/spec.py +6 -6
- tomwer/core/utils/tests/__init__.py +0 -0
- tomwer/core/utils/tests/test_image.py +30 -0
- tomwer/core/utils/tests/test_nxtomo.py +38 -0
- tomwer/core/utils/tests/test_scan_utils.py +46 -0
- tomwer/core/utils/tests/test_time.py +6 -0
- tomwer/core/utils/threads.py +0 -26
- tomwer/core/utils/time.py +0 -27
- tomwer/core/volume/__init__.py +4 -0
- tomwer/core/volume/edfvolume.py +1 -28
- tomwer/core/volume/hdf5volume.py +1 -28
- tomwer/core/volume/jp2kvolume.py +1 -27
- tomwer/core/volume/rawvolume.py +1 -28
- tomwer/core/volume/tests/test_volumes.py +21 -0
- tomwer/core/volume/tiffvolume.py +1 -28
- tomwer/core/volume/volumebase.py +5 -0
- tomwer/core/volume/volumefactory.py +7 -33
- tomwer/gui/__init__.py +0 -28
- tomwer/gui/cluster/__init__.py +2 -0
- tomwer/gui/cluster/slurm.py +297 -95
- tomwer/gui/cluster/supervisor.py +1 -27
- tomwer/gui/cluster/tests/__init__.py +0 -0
- tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
- tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
- tomwer/gui/conditions/__init__.py +2 -0
- tomwer/gui/conditions/filter.py +1 -26
- tomwer/gui/configuration/__init__.py +2 -0
- tomwer/gui/control/__init__.py +2 -0
- tomwer/gui/control/actions.py +2 -28
- tomwer/gui/control/datadiscovery.py +4 -3
- tomwer/gui/control/datalist.py +64 -69
- tomwer/gui/control/datalistener.py +1 -39
- tomwer/gui/control/datareacheractions.py +1 -28
- tomwer/gui/control/datatransfert.py +2 -29
- tomwer/gui/control/datavalidator.py +3 -37
- tomwer/gui/control/datawatcher/__init__.py +0 -28
- tomwer/gui/control/datawatcher/configuration.py +1 -28
- tomwer/gui/control/datawatcher/datawatcher.py +3 -32
- tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
- tomwer/gui/control/history.py +5 -35
- tomwer/gui/control/nxtomomill.py +3 -30
- tomwer/gui/control/observations.py +61 -55
- tomwer/gui/control/reducedarkflatselector.py +24 -20
- tomwer/gui/control/scanselectorwidget.py +2 -28
- tomwer/gui/control/selectorwidgetbase.py +17 -17
- tomwer/gui/control/series/__init__.py +0 -0
- tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
- tomwer/gui/control/series/serieswaiter.py +0 -0
- tomwer/gui/control/series/test/test_creator.py +424 -0
- tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
- tomwer/gui/control/singletomoobj.py +1 -1
- tomwer/gui/control/tests/__init__.py +0 -0
- tomwer/gui/control/tests/test_datalist.py +47 -0
- tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
- tomwer/gui/control/tests/test_datavalidator.py +27 -0
- tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
- tomwer/gui/control/tests/test_process_manager.py +38 -0
- tomwer/gui/control/tests/test_scan_observations.py +23 -0
- tomwer/gui/control/tests/test_scanselector.py +42 -0
- tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
- tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
- tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
- tomwer/gui/control/volumeselectorwidget.py +2 -30
- tomwer/gui/dataportal/__init__.py +2 -0
- tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
- tomwer/gui/dataportal/gallery.py +133 -0
- tomwer/gui/dataportal/outputformat.py +0 -0
- tomwer/gui/dataportal/publish.py +96 -0
- tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
- tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
- tomwer/gui/debugtools/__init__.py +2 -0
- tomwer/gui/debugtools/datasetgenerator.py +1 -30
- tomwer/gui/debugtools/objectinspector.py +1 -29
- tomwer/gui/dialog/QDataDialog.py +89 -0
- tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
- tomwer/gui/dialog/__init__.py +1 -0
- tomwer/gui/edit/__init__.py +2 -0
- tomwer/gui/edit/dkrfpatch.py +52 -87
- tomwer/gui/edit/imagekeyeditor.py +18 -54
- tomwer/gui/edit/nxtomoeditor.py +113 -300
- tomwer/gui/edit/nxtomowarmer.py +3 -2
- tomwer/gui/edit/tests/__init__.py +0 -0
- tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
- tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
- tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
- tomwer/gui/fonts.py +5 -0
- tomwer/gui/icons.py +28 -66
- tomwer/gui/illustrations.py +4 -34
- tomwer/gui/imagefromfile.py +5 -30
- tomwer/gui/metadataloader.py +36 -0
- tomwer/gui/qconfigfile.py +3 -0
- tomwer/gui/qlefilesystem.py +3 -0
- tomwer/gui/reconstruction/__init__.py +2 -0
- tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
- tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
- tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
- tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
- tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
- tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
- tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
- tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
- tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
- tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
- tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
- tomwer/gui/reconstruction/axis/__init__.py +2 -2
- tomwer/gui/reconstruction/darkref/__init__.py +0 -27
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
- tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
- tomwer/gui/reconstruction/nabu/check.py +7 -33
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
- tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
- tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
- tomwer/gui/reconstruction/nabu/platform.py +94 -0
- tomwer/gui/reconstruction/nabu/slices.py +81 -45
- tomwer/gui/reconstruction/nabu/slurm.py +1 -27
- tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
- tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
- tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
- tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
- tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
- tomwer/gui/reconstruction/nabu/volume.py +62 -90
- tomwer/gui/reconstruction/normalization/intensity.py +5 -32
- tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
- tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
- tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
- tomwer/gui/reconstruction/scores/control.py +2 -30
- tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
- tomwer/gui/reconstruction/tests/__init__.py +0 -0
- tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
- tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
- tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
- tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
- tomwer/gui/samplemoved/__init__.py +2 -30
- tomwer/gui/samplemoved/selectiontable.py +3 -33
- tomwer/gui/settings.py +7 -0
- tomwer/gui/stackplot.py +33 -661
- tomwer/gui/stacks.py +261 -135
- tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
- tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
- tomwer/gui/stitching/StitchingWindow.py +586 -0
- tomwer/gui/stitching/__init__.py +2 -0
- tomwer/gui/stitching/alignment.py +90 -0
- tomwer/gui/stitching/axisorderedlist.py +44 -34
- tomwer/gui/stitching/config/axisparams.py +25 -11
- tomwer/gui/stitching/config/output.py +6 -5
- tomwer/gui/stitching/config/positionoveraxis.py +313 -51
- tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
- tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
- tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
- tomwer/gui/stitching/normalization.py +1 -0
- tomwer/gui/stitching/preview.py +59 -0
- tomwer/gui/stitching/singleaxis.py +57 -0
- tomwer/gui/stitching/stitchandbackground.py +3 -2
- tomwer/gui/stitching/stitching_preview.py +44 -36
- tomwer/gui/stitching/stitching_raw.py +5 -3
- tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
- tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
- tomwer/gui/stitching/tests/test_normalization.py +27 -0
- tomwer/gui/stitching/tests/test_preview.py +68 -0
- tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
- tomwer/gui/stitching/tests/utils.py +92 -0
- tomwer/gui/stitching/utils.py +14 -0
- tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
- tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
- tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
- tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
- tomwer/gui/tests/__init__.py +0 -0
- tomwer/gui/tests/test_axis_gui.py +43 -0
- tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
- tomwer/gui/utils/RangeWidget.py +44 -0
- tomwer/gui/utils/buttons.py +4 -3
- tomwer/gui/utils/completer.py +2 -33
- tomwer/gui/utils/flow.py +11 -40
- tomwer/gui/utils/gpu.py +60 -0
- tomwer/gui/utils/illustrations.py +1 -26
- tomwer/gui/utils/inputwidget.py +35 -73
- tomwer/gui/utils/lineselector/lineselector.py +9 -46
- tomwer/gui/utils/loadingmode.py +81 -0
- tomwer/gui/utils/qt_utils.py +9 -0
- tomwer/gui/utils/sandboxes.py +1 -26
- tomwer/gui/utils/scandescription.py +2 -31
- tomwer/gui/utils/scrollarea.py +6 -55
- tomwer/gui/utils/slider.py +4 -28
- tomwer/gui/utils/splashscreen.py +0 -28
- tomwer/gui/utils/step.py +14 -13
- tomwer/gui/utils/tests/test_completer.py +41 -0
- tomwer/gui/utils/tests/test_line_selector.py +21 -0
- tomwer/gui/utils/tests/test_splashscreen.py +8 -0
- tomwer/gui/utils/tests/test_vignettes.py +68 -0
- tomwer/gui/utils/unitsystem.py +15 -69
- tomwer/gui/utils/utils.py +4 -5
- tomwer/gui/utils/vignettes.py +10 -41
- tomwer/gui/utils/waiterthread.py +0 -26
- tomwer/gui/visualization/__init__.py +2 -0
- tomwer/gui/visualization/dataviewer.py +68 -421
- tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
- tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
- tomwer/gui/visualization/fullscreenplot.py +5 -5
- tomwer/gui/visualization/imagestack.py +403 -0
- tomwer/gui/visualization/nxtomometadata.py +0 -4
- tomwer/gui/visualization/reconstructionparameters.py +14 -32
- tomwer/gui/visualization/scanoverview.py +33 -66
- tomwer/gui/visualization/sinogramviewer.py +2 -28
- tomwer/gui/visualization/test/__init__.py +0 -28
- tomwer/gui/visualization/test/test_dataviewer.py +1 -28
- tomwer/gui/visualization/test/test_diffviewer.py +1 -28
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
- tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
- tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
- tomwer/gui/visualization/test/test_stacks.py +184 -115
- tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
- tomwer/gui/visualization/tomoobjoverview.py +2 -2
- tomwer/gui/visualization/volumeoverview.py +3 -2
- tomwer/gui/visualization/volumeviewer.py +47 -43
- tomwer/io/__init__.py +2 -0
- tomwer/io/utils/h5pyutils.py +1 -27
- tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
- tomwer/io/utils/test/test_utils.py +67 -0
- tomwer/io/utils/utils.py +2 -31
- tomwer/resources/__init__.py +13 -33
- tomwer/resources/gui/icons/edit_downstream.svg +114 -0
- tomwer/resources/gui/icons/edit_upstream.svg +112 -0
- tomwer/resources/gui/icons/free_edition.svg +23 -0
- tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
- tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
- tomwer/resources/gui/icons/search.png +0 -0
- tomwer/resources/gui/icons/search.svg +23 -0
- tomwer/resources/gui/icons/warning.png +0 -0
- tomwer/synctools/__init__.py +2 -0
- tomwer/synctools/axis.py +1 -27
- tomwer/synctools/darkref.py +1 -26
- tomwer/synctools/datalistener.py +1 -27
- tomwer/synctools/datatransfert.py +2 -27
- tomwer/synctools/imageloaderthread.py +1 -28
- tomwer/synctools/rsyncmanager.py +1 -25
- tomwer/synctools/saaxis.py +1 -26
- tomwer/synctools/sadeltabeta.py +1 -26
- tomwer/synctools/stacks/control/datalistener.py +1 -26
- tomwer/synctools/stacks/processingstack.py +4 -33
- tomwer/synctools/stacks/reconstruction/axis.py +6 -53
- tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
- tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
- tomwer/synctools/tests/__init__.py +0 -0
- tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
- tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
- tomwer/synctools/utils/scanstages.py +2 -31
- tomwer/tests/__init__.py +1 -0
- tomwer/tests/app/test_stitching.py +95 -0
- tomwer/tests/datasets.py +1 -5
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
- orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
- tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
- tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
- tomwer/tests/test_ewoks/test_conversion.py +104 -0
- tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
- tomwer/tests/test_ewoks/test_workflows.py +138 -0
- tomwer/utils.py +11 -39
- tomwer/version.py +2 -2
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
- tomwer-1.4.0.dist-info/METADATA +337 -0
- tomwer-1.4.0.dist-info/RECORD +912 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
- orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
- orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
- tomwer/core/log/logger.py +0 -130
- tomwer/core/process/control/test/test_volume_link.py +0 -74
- tomwer/core/process/control/tomoobjserie.py +0 -12
- tomwer/core/process/control/volumesymlink.py +0 -200
- tomwer/core/process/icat/createscreenshots.py +0 -100
- tomwer/core/process/icat/gallery.py +0 -377
- tomwer/core/process/icat/icatbase.py +0 -36
- tomwer/core/process/icat/publish.py +0 -228
- tomwer/core/process/icat/screenshots.py +0 -27
- tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
- tomwer/core/process/test/test_axis.py +0 -309
- tomwer/core/process/visualization/liveslice.py +0 -6
- tomwer/core/progress.py +0 -100
- tomwer/core/scan/test/test_edf.py +0 -53
- tomwer/core/scan/test/test_future_scan.py +0 -61
- tomwer/core/scan/test/test_h5.py +0 -96
- tomwer/core/scan/test/test_process_registration.py +0 -109
- tomwer/core/test/test_scanutils.py +0 -53
- tomwer/gui/control/emailnotifier.py +0 -174
- tomwer/gui/control/serie/seriewaiter.py +0 -28
- tomwer/gui/control/test/__init__.py +0 -28
- tomwer/gui/control/test/test_datalist.py +0 -96
- tomwer/gui/control/test/test_datavalidator.py +0 -54
- tomwer/gui/control/test/test_email.py +0 -35
- tomwer/gui/control/test/test_process_manager.py +0 -65
- tomwer/gui/control/test/test_scanselector.py +0 -67
- tomwer/gui/edit/test/__init__.py +0 -28
- tomwer/gui/icat/gallery.py +0 -214
- tomwer/gui/icat/publish.py +0 -187
- tomwer/gui/reconstruction/axis/axis.py +0 -733
- tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
- tomwer/gui/stitching/stitching.py +0 -1392
- tomwer/gui/test/__init__.py +0 -28
- tomwer/gui/test/test_axis_gui.py +0 -34
- tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
- tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
- tomwer/third_part/WaitingOverlay.py +0 -110
- tomwer-1.3.26-py3.11-nspkg.pth +0 -1
- tomwer-1.3.26.dist-info/METADATA +0 -292
- tomwer-1.3.26.dist-info/RECORD +0 -785
- tomwer-1.3.26.dist-info/namespace_packages.txt +0 -1
- /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
- {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
- {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
- {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
- {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
- {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
- {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
- {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
- {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
- {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
- {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
- /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
- /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
- /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
- /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
- /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
- /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
- /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
- /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,28 +1,33 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
|
1
4
|
import functools
|
2
5
|
import numpy
|
3
6
|
from silx.gui import qt
|
7
|
+
from silx.utils.enum import Enum as _Enum
|
4
8
|
|
9
|
+
from tomwer.core.tomwer_object import TomwerObject
|
10
|
+
from tomwer.gui import icons
|
5
11
|
from tomwer.gui.stitching.axisorderedlist import AxisOrderedTomoObjsModel
|
6
12
|
from tomwer.gui.utils.step import StepSizeSelectorWidget
|
13
|
+
from tomwer.gui.utils.qt_utils import block_signals
|
7
14
|
|
8
15
|
|
9
16
|
class PosEditorOverOneAxis(qt.QWidget):
|
10
17
|
"""keep it ordered along one axis"""
|
11
18
|
|
12
|
-
DEFAULT_VALUE_WHEM_MISSING = 0
|
13
|
-
|
14
19
|
def __init__(
|
15
20
|
self, parent, axis_edited: int, axis_order=None, *args, **kwargs
|
16
21
|
) -> None:
|
17
22
|
assert axis_edited in (0, 1, 2)
|
18
23
|
super().__init__(parent, *args, **kwargs)
|
19
24
|
self._axisEdited = axis_edited
|
20
|
-
# the axis
|
25
|
+
# the axis we are editing
|
21
26
|
self._axisOrder = axis_order if axis_order is not None else axis_edited
|
22
27
|
# the axis along which the tomo obj are ordered
|
23
|
-
self.
|
24
|
-
# list of
|
25
|
-
self.
|
28
|
+
self._tomoObjtoTomoObjPosWidget = {}
|
29
|
+
# list of `_TomoObjPosition` to edit the position over the axis. Key is the tomo object, value is the `_TomoObjPosition`
|
30
|
+
self.__tomoObjPosWidgetCallbacks = {}
|
26
31
|
self.setLayout(qt.QVBoxLayout())
|
27
32
|
# widget to define step size
|
28
33
|
self._stepSizeWidget = StepSizeSelectorWidget(
|
@@ -34,19 +39,24 @@ class PosEditorOverOneAxis(qt.QWidget):
|
|
34
39
|
)
|
35
40
|
self.layout().addWidget(self._stepSizeWidget)
|
36
41
|
|
42
|
+
# widget to define edition mode and reset
|
43
|
+
self._editionOptionsWidget = _EditionOptions()
|
44
|
+
self.layout().addWidget(self._editionOptionsWidget)
|
45
|
+
|
37
46
|
# table with the different Tomo objects
|
38
47
|
self._tomoObjsTableView = qt.QTableView(parent=self)
|
39
|
-
model = EditableAxisOrderedTomoObjsModel(axis=
|
48
|
+
model = EditableAxisOrderedTomoObjsModel(axis=axis_edited)
|
40
49
|
self._tomoObjsTableView.setModel(model)
|
41
50
|
|
42
51
|
self.layout().addWidget(self._tomoObjsTableView)
|
43
52
|
|
44
53
|
# connect signal / slot
|
45
54
|
self._stepSizeWidget.valueChanged.connect(self._updateStepSize)
|
55
|
+
self._editionOptionsWidget.sigReset.connect(self._resetPositions)
|
46
56
|
|
47
57
|
# tune table view
|
48
|
-
self._tomoObjsTableView.setColumnWidth(0,
|
49
|
-
self._tomoObjsTableView.setColumnWidth(2,
|
58
|
+
self._tomoObjsTableView.setColumnWidth(0, 45)
|
59
|
+
self._tomoObjsTableView.setColumnWidth(2, _TomoObjPosition.WIDGET_WIDTH)
|
50
60
|
self._tomoObjsTableView.horizontalHeader().setSectionResizeMode(
|
51
61
|
1, qt.QHeaderView.Stretch
|
52
62
|
)
|
@@ -54,7 +64,7 @@ class PosEditorOverOneAxis(qt.QWidget):
|
|
54
64
|
|
55
65
|
def _updateStepSize(self):
|
56
66
|
step_size = self.getStepSize()
|
57
|
-
for sb in self.
|
67
|
+
for sb in self._tomoObjtoTomoObjPosWidget.values():
|
58
68
|
sb.setSingleStep(step_size)
|
59
69
|
|
60
70
|
def setStepSize(self, step_size: int):
|
@@ -64,6 +74,9 @@ class PosEditorOverOneAxis(qt.QWidget):
|
|
64
74
|
def getStepSize(self) -> int:
|
65
75
|
return self._stepSizeWidget.getStepSize()
|
66
76
|
|
77
|
+
def getTomoObjs(self) -> tuple[TomwerObject]:
|
78
|
+
return self._tomoObjsTableView.model().getTomoObjs()
|
79
|
+
|
67
80
|
def addTomoObj(self, tomo_obj):
|
68
81
|
if tomo_obj is None:
|
69
82
|
return
|
@@ -71,43 +84,92 @@ class PosEditorOverOneAxis(qt.QWidget):
|
|
71
84
|
self._tomoObjsTableView.model().addTomoObj(tomo_obj)
|
72
85
|
# register tomo obj metadata modification to make sure we keel the z ordered list up to data
|
73
86
|
tomo_obj.stitching_metadata.sigChanged.connect(
|
74
|
-
self.
|
87
|
+
self._orderedMightHaveChanged
|
75
88
|
)
|
76
|
-
self.
|
77
|
-
self.
|
78
|
-
|
79
|
-
def
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
89
|
+
self._createTomoObjPosition(tomo_obj=tomo_obj)
|
90
|
+
self._orderedMightHaveChanged()
|
91
|
+
|
92
|
+
def _createTomoObjPosition(self, tomo_obj, original_value: float | None = None):
|
93
|
+
"""
|
94
|
+
:param original_value: original_value of the tomo_obj along the edited axis. Used when the widget is delete and recreate
|
95
|
+
"""
|
96
|
+
widget = _TomoObjPosition(
|
97
|
+
tomo_obj=tomo_obj,
|
98
|
+
axis_edited=self._axisEdited,
|
99
|
+
original_value=original_value,
|
100
|
+
parent=self,
|
87
101
|
)
|
102
|
+
widget.setSingleStep(self.getStepSize())
|
103
|
+
|
88
104
|
identifier_as_str = tomo_obj.get_identifier().to_str()
|
89
|
-
self.
|
105
|
+
self._tomoObjtoTomoObjPosWidget[identifier_as_str] = widget
|
90
106
|
# connect signal / slot
|
91
107
|
callback = functools.partial(
|
92
|
-
self.
|
108
|
+
self._tomoObjPosChanged, spin_box=widget, tomo_obj_to_update=tomo_obj
|
93
109
|
)
|
94
|
-
self.
|
95
|
-
|
96
|
-
return
|
110
|
+
self.__tomoObjPosWidgetCallbacks[identifier_as_str] = callback
|
111
|
+
widget.sigValueChanged.connect(callback)
|
112
|
+
return widget
|
97
113
|
|
98
114
|
def _deleteSpinBox(self, tomo_obj):
|
99
115
|
identifier_as_str = tomo_obj.get_identifier().to_str()
|
100
|
-
if identifier_as_str in self.
|
101
|
-
|
102
|
-
|
116
|
+
if identifier_as_str in self._tomoObjtoTomoObjPosWidget:
|
117
|
+
spinBox = self._tomoObjtoTomoObjPosWidget.pop(identifier_as_str)
|
118
|
+
spinBox.deleteLater()
|
119
|
+
if identifier_as_str in self.__tomoObjPosWidgetCallbacks:
|
120
|
+
del self.__tomoObjPosWidgetCallbacks[identifier_as_str]
|
103
121
|
|
104
122
|
def removeTomoObj(self, tomo_obj):
|
105
123
|
self._deleteSpinBox(tomo_obj)
|
106
124
|
self._tomoObjsTableView.model().removeTomoObj(tomo_obj)
|
107
|
-
tomo_obj.stitching_metadata.sigChanged.disconnect(self.
|
125
|
+
tomo_obj.stitching_metadata.sigChanged.disconnect(self._orderedMightHaveChanged)
|
108
126
|
|
109
|
-
def
|
110
|
-
|
127
|
+
def _tomoObjPosChanged(
|
128
|
+
self,
|
129
|
+
old_pos_value: int,
|
130
|
+
new_pos_value: int,
|
131
|
+
tomo_obj_to_update,
|
132
|
+
*args,
|
133
|
+
**kwargs,
|
134
|
+
):
|
135
|
+
tomo_obj_to_update.stitching_metadata.setPxPos(
|
136
|
+
new_pos_value, axis=self._axisEdited
|
137
|
+
)
|
138
|
+
# edit upstream or downstream nodes according to the edit mode
|
139
|
+
shift = new_pos_value - old_pos_value
|
140
|
+
if shift == 0:
|
141
|
+
return
|
142
|
+
|
143
|
+
edition_mode = self._editionOptionsWidget.getEditionMode()
|
144
|
+
if edition_mode is _EditionMode.FREE:
|
145
|
+
tomo_objs_to_update = ()
|
146
|
+
elif edition_mode is _EditionMode.DOWNSTREAM:
|
147
|
+
tomo_objs_to_update = self._get_downstream_tomo_obj(
|
148
|
+
position=old_pos_value, tomo_obj_to_filter=tomo_obj_to_update
|
149
|
+
)
|
150
|
+
elif edition_mode is _EditionMode.UPSTREAM:
|
151
|
+
tomo_objs_to_update = self._get_upstream_tomo_obj_pos_widgets(
|
152
|
+
position=old_pos_value, tomo_obj_to_filter=tomo_obj_to_update
|
153
|
+
)
|
154
|
+
else:
|
155
|
+
raise NotImplementedError(f"edition mode ({edition_mode}) is not handled")
|
156
|
+
with block_signals(self):
|
157
|
+
for tomo_obj_to_update in tomo_objs_to_update:
|
158
|
+
associated_widget = self._tomoObjtoTomoObjPosWidget[
|
159
|
+
tomo_obj_to_update.get_identifier().to_str()
|
160
|
+
]
|
161
|
+
current_value = associated_widget.getValue()
|
162
|
+
assert (
|
163
|
+
current_value == associated_widget.getValue()
|
164
|
+
), "incoherent value between tomo object and widget"
|
165
|
+
new_value = current_value + shift
|
166
|
+
with block_signals(associated_widget):
|
167
|
+
associated_widget.setValue(new_value)
|
168
|
+
with block_signals(tomo_obj_to_update.stitching_metadata):
|
169
|
+
tomo_obj_to_update.stitching_metadata.setPxPos(
|
170
|
+
value=new_value, axis=self._axisEdited
|
171
|
+
)
|
172
|
+
self._orderedMightHaveChanged()
|
111
173
|
|
112
174
|
def setTomoObjs(self, tomo_objs: tuple) -> None:
|
113
175
|
"""
|
@@ -122,47 +184,247 @@ class PosEditorOverOneAxis(qt.QWidget):
|
|
122
184
|
for tomo_obj in tomo_objs:
|
123
185
|
self.removeTomoObj(tomo_obj=tomo_obj)
|
124
186
|
|
125
|
-
def
|
126
|
-
pass
|
127
|
-
|
128
|
-
def setSerie(self):
|
187
|
+
def setSeries(self):
|
129
188
|
raise NotImplementedError
|
130
189
|
|
131
|
-
def
|
190
|
+
def _resetPositions(self):
|
191
|
+
tomo_objs = self.getTomoObjs()
|
192
|
+
|
193
|
+
with block_signals(self):
|
194
|
+
for tomo_obj in tomo_objs:
|
195
|
+
widget = self._tomoObjtoTomoObjPosWidget[
|
196
|
+
tomo_obj.get_identifier().to_str()
|
197
|
+
]
|
198
|
+
with block_signals(widget):
|
199
|
+
widget.resetOriginalValue()
|
200
|
+
tomo_obj.stitching_metadata.setPxPos(
|
201
|
+
value=widget.getOriginalValue(), axis=self._axisEdited
|
202
|
+
)
|
203
|
+
self._orderedMightHaveChanged()
|
204
|
+
|
205
|
+
def _get_upstream_tomo_obj_pos_widgets(
|
206
|
+
self, position: float, tomo_obj_to_filter: TomwerObject | None = None
|
207
|
+
) -> tuple[TomwerObject]:
|
208
|
+
return tuple(
|
209
|
+
filter(
|
210
|
+
lambda tomo_obj: (
|
211
|
+
tomo_obj.stitching_metadata.get_abs_position_px(
|
212
|
+
axis=self._axisEdited
|
213
|
+
)
|
214
|
+
>= position
|
215
|
+
)
|
216
|
+
and (tomo_obj is not tomo_obj_to_filter),
|
217
|
+
self.getTomoObjs(),
|
218
|
+
)
|
219
|
+
)
|
220
|
+
|
221
|
+
def _get_downstream_tomo_obj(
|
222
|
+
self, position: float, tomo_obj_to_filter: TomwerObject | None = None
|
223
|
+
) -> tuple[TomwerObject]:
|
224
|
+
return tuple(
|
225
|
+
filter(
|
226
|
+
lambda tomo_obj: (
|
227
|
+
tomo_obj.stitching_metadata.get_abs_position_px(
|
228
|
+
axis=self._axisEdited
|
229
|
+
)
|
230
|
+
<= position
|
231
|
+
)
|
232
|
+
and (tomo_obj is not tomo_obj_to_filter),
|
233
|
+
self.getTomoObjs(),
|
234
|
+
)
|
235
|
+
)
|
236
|
+
|
237
|
+
def _orderedMightHaveChanged(self, force_sb_update=False):
|
132
238
|
# add index widget
|
133
239
|
self._tomoObjsTableView.model().reorder_objs()
|
134
240
|
self._tomoObjsTableView.model().layoutChanged.emit()
|
135
241
|
|
136
242
|
ordered_objs = self._tomoObjsTableView.model()._axis_decreasing_ordered_objs
|
137
243
|
|
138
|
-
# start update
|
244
|
+
# start update position widgets
|
139
245
|
# check if we need to update one widget. Has this is designed if we need to update one then we need to update them all...
|
140
246
|
needs_to_update_widget = force_sb_update
|
141
247
|
for i_pos, tomo_obj in enumerate(ordered_objs):
|
142
248
|
identifier_as_str = tomo_obj.get_identifier().to_str()
|
143
|
-
|
249
|
+
widget = self._tomoObjtoTomoObjPosWidget[identifier_as_str]
|
144
250
|
model_index = self._tomoObjsTableView.model().createIndex(i_pos, 2)
|
145
|
-
|
146
|
-
needs_to_update_widget
|
147
|
-
|
148
|
-
not in (None, spinBox)
|
149
|
-
)
|
251
|
+
if self._tomoObjsTableView.indexWidget(model_index) not in (None, widget):
|
252
|
+
needs_to_update_widget = True
|
253
|
+
break
|
150
254
|
|
151
255
|
for i_pos, tomo_obj in enumerate(ordered_objs):
|
152
256
|
identifier_as_str = tomo_obj.get_identifier().to_str()
|
153
|
-
|
257
|
+
widget = self._tomoObjtoTomoObjPosWidget[identifier_as_str]
|
154
258
|
model_index = self._tomoObjsTableView.model().createIndex(i_pos, 2)
|
155
259
|
if needs_to_update_widget:
|
156
|
-
# if items have been reordered then we must recreated
|
260
|
+
# if items have been reordered then we must recreated `TomoObjPosWidget` otherwise if we try
|
157
261
|
# to change order then Qt will end up with a seg fault which seems to come from
|
158
|
-
#
|
262
|
+
# overwriting the cell and trying to reuse them
|
263
|
+
original_value = widget.getOriginalValue()
|
159
264
|
self._deleteSpinBox(tomo_obj=tomo_obj)
|
160
|
-
|
161
|
-
|
162
|
-
|
265
|
+
widget = self._createTomoObjPosition(
|
266
|
+
tomo_obj=tomo_obj, original_value=original_value
|
267
|
+
)
|
268
|
+
self._tomoObjsTableView.setIndexWidget(model_index, widget)
|
269
|
+
|
270
|
+
# expose API
|
271
|
+
def getEditionMode(self) -> _EditionMode:
|
272
|
+
return self._editionOptionsWidget.getEditionMode()
|
273
|
+
|
274
|
+
def setEditionMode(self, edition_mode: _EditionMode) -> _EditionMode:
|
275
|
+
self._editionOptionsWidget.setEditionMode(edition_mode=edition_mode)
|
163
276
|
|
164
277
|
|
165
278
|
class EditableAxisOrderedTomoObjsModel(AxisOrderedTomoObjsModel):
|
166
279
|
def __init__(self, axis: int, parent=None) -> None:
|
167
280
|
super().__init__(axis, parent)
|
168
281
|
self._headers = ["index", "tomo obj", f"axis {axis} pos (px)"]
|
282
|
+
|
283
|
+
|
284
|
+
class _TomoObjPosition(qt.QWidget):
|
285
|
+
"""
|
286
|
+
Widget used to define tomo object position over one axis (and reset if needed)
|
287
|
+
|
288
|
+
:param original_value: original_value of the tomo_obj along the edited axis. Used when the widget is delete and recreate
|
289
|
+
"""
|
290
|
+
|
291
|
+
WIDGET_WIDTH = 120
|
292
|
+
|
293
|
+
RESET_BUTTON_WIDTH = 25
|
294
|
+
|
295
|
+
DEFAULT_VALUE_WHEN_MISSING = 0
|
296
|
+
|
297
|
+
sigValueChanged = qt.Signal(int, int)
|
298
|
+
"""emit when the value is changed. Parameters are (old value, new value)"""
|
299
|
+
|
300
|
+
def __init__(
|
301
|
+
self,
|
302
|
+
tomo_obj,
|
303
|
+
axis_edited: int,
|
304
|
+
parent: qt.QWidget | None = None,
|
305
|
+
original_value: float | None = None,
|
306
|
+
) -> None:
|
307
|
+
super().__init__(parent)
|
308
|
+
self.setLayout(qt.QHBoxLayout())
|
309
|
+
self.layout().setContentsMargins(0, 0, 0, 0)
|
310
|
+
self.layout().setSpacing(0)
|
311
|
+
# create spin box object
|
312
|
+
self._spinBox = qt.QSpinBox(self)
|
313
|
+
self._spinBox.setRange(
|
314
|
+
numpy.iinfo(numpy.int32).min, numpy.iinfo(numpy.int32).max
|
315
|
+
)
|
316
|
+
self._spinBox.setSuffix("px")
|
317
|
+
currentPos = (
|
318
|
+
tomo_obj.stitching_metadata.get_abs_position_px(axis=axis_edited)
|
319
|
+
or self.DEFAULT_VALUE_WHEN_MISSING
|
320
|
+
)
|
321
|
+
self.__originalValue = original_value or currentPos
|
322
|
+
self.__lastValue = self.__originalValue
|
323
|
+
self._spinBox.setValue(currentPos)
|
324
|
+
self._spinBox.setFixedWidth(self.WIDGET_WIDTH - self.RESET_BUTTON_WIDTH)
|
325
|
+
self.layout().addWidget(self._spinBox)
|
326
|
+
|
327
|
+
# create option to reset value
|
328
|
+
self._resetValueQPB = qt.QPushButton(parent=self)
|
329
|
+
self._resetValueQPB.setFixedWidth(self.RESET_BUTTON_WIDTH)
|
330
|
+
style = qt.QApplication.style()
|
331
|
+
resetIcon = style.standardIcon(qt.QStyle.SP_DialogResetButton)
|
332
|
+
self._resetValueQPB.setIcon(resetIcon)
|
333
|
+
self.layout().addWidget(self._resetValueQPB)
|
334
|
+
|
335
|
+
# connect signal / slot
|
336
|
+
self._spinBox.valueChanged.connect(self._valueChanged)
|
337
|
+
self._resetValueQPB.clicked.connect(self.resetOriginalValue)
|
338
|
+
|
339
|
+
def _valueChanged(self, new_value):
|
340
|
+
self.sigValueChanged.emit(
|
341
|
+
self.__lastValue,
|
342
|
+
new_value,
|
343
|
+
)
|
344
|
+
self.__lastValue = new_value
|
345
|
+
|
346
|
+
def getOriginalValue(self) -> float:
|
347
|
+
return self.__originalValue
|
348
|
+
|
349
|
+
def setOriginalValue(self, value: float) -> None:
|
350
|
+
self.__originalValue = value
|
351
|
+
|
352
|
+
def resetOriginalValue(self) -> None:
|
353
|
+
self._spinBox.setValue(self.getOriginalValue())
|
354
|
+
self._positionChanged()
|
355
|
+
|
356
|
+
def _positionChanged(self):
|
357
|
+
self._valueChanged(new_value=self._spinBox.value())
|
358
|
+
|
359
|
+
def setValue(self, value: float) -> None:
|
360
|
+
self._spinBox.setValue(value)
|
361
|
+
self.__lastValue = value
|
362
|
+
|
363
|
+
def getValue(self) -> float:
|
364
|
+
return self._spinBox.value()
|
365
|
+
|
366
|
+
# expose API
|
367
|
+
def setSingleStep(self, val: int):
|
368
|
+
self._spinBox.setSingleStep(val)
|
369
|
+
|
370
|
+
|
371
|
+
class _EditionMode(_Enum):
|
372
|
+
FREE = "free"
|
373
|
+
UPSTREAM = "upstream"
|
374
|
+
DOWNSTREAM = "downstream"
|
375
|
+
|
376
|
+
@staticmethod
|
377
|
+
def get_icon(cls):
|
378
|
+
if cls == cls.UPSTREAM:
|
379
|
+
return icons.getQIcon("edit_upstream")
|
380
|
+
elif cls == cls.DOWNSTREAM:
|
381
|
+
return icons.getQIcon("edit_downstream")
|
382
|
+
elif cls == cls.FREE:
|
383
|
+
return icons.getQIcon("free_edition")
|
384
|
+
else:
|
385
|
+
raise ValueError()
|
386
|
+
|
387
|
+
|
388
|
+
class _EditionOptions(qt.QWidget):
|
389
|
+
|
390
|
+
sigReset = qt.Signal()
|
391
|
+
sigModeChanged = qt.Signal()
|
392
|
+
|
393
|
+
def __init__(self, parent=None):
|
394
|
+
super().__init__(parent)
|
395
|
+
self.setLayout(qt.QHBoxLayout())
|
396
|
+
|
397
|
+
self._editionModeLabel = qt.QLabel("edition mode", self)
|
398
|
+
self.layout().addWidget(self._editionModeLabel)
|
399
|
+
|
400
|
+
self._editionModeCB = qt.QComboBox(self)
|
401
|
+
for mode in _EditionMode:
|
402
|
+
self._editionModeCB.addItem(
|
403
|
+
_EditionMode.get_icon(mode),
|
404
|
+
mode.value,
|
405
|
+
)
|
406
|
+
self.layout().addWidget(self._editionModeCB)
|
407
|
+
self._editionModeCB.setFixedHeight(30)
|
408
|
+
|
409
|
+
self._spacer = qt.QSpacerItem(
|
410
|
+
20, 40, qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
|
411
|
+
)
|
412
|
+
self.layout().addItem(self._spacer)
|
413
|
+
|
414
|
+
style = qt.QApplication.style()
|
415
|
+
reset_icon = style.standardIcon(qt.QStyle.SP_DialogResetButton)
|
416
|
+
self._resetButton = qt.QPushButton(
|
417
|
+
parent=self, text="reset all positions", icon=reset_icon
|
418
|
+
)
|
419
|
+
self._resetButton.setToolTip("reset all position to initial positions")
|
420
|
+
self.layout().addWidget(self._resetButton)
|
421
|
+
|
422
|
+
# connect signal / slot
|
423
|
+
self._editionModeCB.currentIndexChanged.connect(self.sigModeChanged)
|
424
|
+
self._resetButton.released.connect(self.sigReset)
|
425
|
+
|
426
|
+
def getEditionMode(self) -> _EditionMode:
|
427
|
+
return _EditionMode(self._editionModeCB.currentText())
|
428
|
+
|
429
|
+
def setEditionMode(self, edition_mode: _EditionMode | str):
|
430
|
+
self._editionModeCB.setCurrentText(_EditionMode(edition_mode).value)
|
@@ -1,38 +1,43 @@
|
|
1
|
-
from
|
1
|
+
from __future__ import annotations
|
2
|
+
|
2
3
|
from tomwer.io.utils.utils import str_to_dict
|
3
4
|
|
4
5
|
from nabu.stitching import config as stitching_config
|
5
6
|
from nabu.stitching.overlap import OverlapStitchingStrategy
|
6
7
|
from silx.gui import qt
|
8
|
+
from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel as QComboBox
|
9
|
+
from tomwer.gui.utils.scrollarea import QSpinBoxIgnoreWheel as QSpinBox
|
10
|
+
from ..singleaxis import _SingleAxisMixIn
|
7
11
|
|
8
12
|
|
9
|
-
class
|
13
|
+
class _StitchingHeightSpinBox(qt.QWidget):
|
10
14
|
def __init__(self, parent=None) -> None:
|
11
15
|
super().__init__(parent)
|
12
16
|
self.setLayout(qt.QHBoxLayout())
|
13
17
|
self._autoCB = qt.QCheckBox("max", self)
|
14
18
|
self.layout().addWidget(self._autoCB)
|
15
|
-
self._stitchingHeight =
|
19
|
+
self._stitchingHeight = QSpinBox(self)
|
16
20
|
self._stitchingHeight.setMinimum(3)
|
17
21
|
self._stitchingHeight.setMaximum(999999)
|
18
|
-
self._stitchingHeight.setValue(
|
22
|
+
self._stitchingHeight.setValue(40)
|
23
|
+
self._stitchingHeight.setSuffix("px")
|
19
24
|
self.layout().addWidget(self._stitchingHeight)
|
20
25
|
|
21
26
|
self._autoCB.toggled.connect(self._stitchingHeight.setDisabled)
|
22
27
|
|
23
|
-
def getStitchingHeight(self) ->
|
28
|
+
def getStitchingHeight(self) -> int | None:
|
24
29
|
if self._autoCB.isChecked():
|
25
30
|
return None
|
26
31
|
else:
|
27
32
|
return self._stitchingHeight.value()
|
28
33
|
|
29
|
-
def setStitchingHeight(self, height:
|
34
|
+
def setStitchingHeight(self, height: int | None) -> None:
|
30
35
|
self._autoCB.setChecked(height is None)
|
31
36
|
if height is not None:
|
32
37
|
self._stitchingHeight.setValue(int(height))
|
33
38
|
|
34
39
|
|
35
|
-
class StitchingStrategies(qt.QWidget):
|
40
|
+
class StitchingStrategies(qt.QWidget, _SingleAxisMixIn):
|
36
41
|
"""
|
37
42
|
Defines algorithm and strategies to be used
|
38
43
|
"""
|
@@ -40,20 +45,21 @@ class StitchingStrategies(qt.QWidget):
|
|
40
45
|
DEFAULT_STITCHING_HEIGHT = None # max value is the default
|
41
46
|
|
42
47
|
sigChanged = qt.Signal()
|
48
|
+
"""emit when strategy change"""
|
43
49
|
|
44
|
-
def __init__(self, parent=None
|
50
|
+
def __init__(self, axis: int, parent=None) -> None:
|
45
51
|
super().__init__(parent)
|
46
52
|
self.setLayout(qt.QFormLayout())
|
47
|
-
self._stitchingStrategyCG =
|
53
|
+
self._stitchingStrategyCG = QComboBox(parent=self)
|
48
54
|
for strategy in OverlapStitchingStrategy.values():
|
49
55
|
self._stitchingStrategyCG.addItem(strategy)
|
50
56
|
self._stitchingStrategyCG.setToolTip(
|
51
|
-
"stitcher behavior is also know as stitching strategy. It define the
|
57
|
+
"stitcher behavior is also know as stitching strategy. It define the behavior to have on overlaping areas"
|
52
58
|
)
|
53
59
|
self.layout().addRow("stitcher behavior", self._stitchingStrategyCG)
|
54
|
-
self._axis = axis
|
60
|
+
self._axis = axis # needed to implement the _SingleAxisMixIn interface
|
55
61
|
|
56
|
-
self._stitchingHeight =
|
62
|
+
self._stitchingHeight = _StitchingHeightSpinBox(parent=self)
|
57
63
|
self._stitchingHeight.setStitchingHeight(self.DEFAULT_STITCHING_HEIGHT)
|
58
64
|
self.layout().addRow("stitching height", self._stitchingHeight)
|
59
65
|
|
@@ -74,7 +80,7 @@ class StitchingStrategies(qt.QWidget):
|
|
74
80
|
self._stitchingStrategyCG.currentText()
|
75
81
|
)
|
76
82
|
|
77
|
-
def setStitchingStrategy(self, strategy:
|
83
|
+
def setStitchingStrategy(self, strategy: OverlapStitchingStrategy | str):
|
78
84
|
strategy = OverlapStitchingStrategy.from_value(strategy)
|
79
85
|
idx = self._stitchingStrategyCG.findText(strategy.value)
|
80
86
|
if idx >= 0:
|
@@ -87,7 +93,7 @@ class StitchingStrategies(qt.QWidget):
|
|
87
93
|
return {
|
88
94
|
stitching_config.STITCHING_SECTION: {
|
89
95
|
stitching_config.STITCHING_STRATEGY_FIELD: self.getStitchingStrategy().value,
|
90
|
-
f"axis_{self.
|
96
|
+
f"axis_{self.first_axis}_params": f"overlap_size={overlap_size}",
|
91
97
|
}
|
92
98
|
}
|
93
99
|
|
@@ -98,12 +104,12 @@ class StitchingStrategies(qt.QWidget):
|
|
98
104
|
if strategy is not None:
|
99
105
|
self.setStitchingStrategy(strategy=strategy)
|
100
106
|
|
101
|
-
|
107
|
+
first_axis_params_dict = str_to_dict(
|
102
108
|
config.get(stitching_config.STITCHING_SECTION, {}).get(
|
103
109
|
f"axis_{self._axis}_params", ""
|
104
110
|
)
|
105
111
|
)
|
106
|
-
stitching_height =
|
112
|
+
stitching_height = first_axis_params_dict.get(
|
107
113
|
stitching_config.KEY_OVERLAP_SIZE, "unknown"
|
108
114
|
)
|
109
115
|
if stitching_height in ("None", "", None):
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import pytest
|
2
|
+
|
3
|
+
from tomwer.gui.stitching.config.axisparams import StitcherAxisParams
|
4
|
+
from tomwer.tests.conftest import qtapp # noqa F401
|
5
|
+
|
6
|
+
|
7
|
+
def test_StitcherAxisParams(
|
8
|
+
qtapp, # noqa F811
|
9
|
+
):
|
10
|
+
"""test the StitcherAxisParams widget"""
|
11
|
+
with pytest.raises(TypeError):
|
12
|
+
widget = StitcherAxisParams(axis="toto")
|
13
|
+
widget = StitcherAxisParams(axis=0)
|
14
|
+
assert widget.getConfiguration() == {
|
15
|
+
"stitching": {
|
16
|
+
"axis_0_params": "img_reg_method=nabu-fft;window_size=400",
|
17
|
+
}
|
18
|
+
}
|
19
|
+
new_config = {
|
20
|
+
"stitching": {
|
21
|
+
"axis_0_params": "img_reg_method=skimage;window_size=50",
|
22
|
+
},
|
23
|
+
}
|
24
|
+
widget.setConfiguration(new_config)
|
25
|
+
assert widget.getConfiguration() == new_config
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from
|
1
|
+
from __future__ import annotations
|
2
2
|
|
3
3
|
from nabu.stitching.config import StitchingType
|
4
4
|
from silx.gui import qt
|
@@ -165,7 +165,7 @@ class _AxisPositionGroup(qt.QGroupBox):
|
|
165
165
|
else:
|
166
166
|
return self._pixelSizeRaw.getValue()
|
167
167
|
|
168
|
-
def setStitchingMetadata(self, stitching_metadata:
|
168
|
+
def setStitchingMetadata(self, stitching_metadata: QStitchingMetadata | None):
|
169
169
|
"""
|
170
170
|
load used metadata from tomo_obj
|
171
171
|
"""
|
@@ -335,9 +335,7 @@ class TomoObjectPositionInfos(qt.QWidget):
|
|
335
335
|
self.reset()
|
336
336
|
self._stitching_metadata = None
|
337
337
|
|
338
|
-
def setStitchingMetadata(
|
339
|
-
self, stitching_metadata: Optional[StitchingMetadata] = None
|
340
|
-
):
|
338
|
+
def setStitchingMetadata(self, stitching_metadata: StitchingMetadata | None = None):
|
341
339
|
if stitching_metadata is not None and not isinstance(
|
342
340
|
stitching_metadata, StitchingMetadata
|
343
341
|
):
|