tomwer 1.0.4__py3-none-any.whl → 1.1.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/tutorials/EBS_tomo_listener.ows +39 -0
- orangecontrib/tomwer/tutorials/cast_volume.ows +34 -0
- orangecontrib/tomwer/tutorials/simple_slice_reconstruction.ows +39 -0
- orangecontrib/tomwer/tutorials/simple_volume_local_reconstruction.ows +49 -0
- orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +59 -0
- orangecontrib/tomwer/tutorials/using_saaxis_to_find_cor.ows +44 -0
- orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +1 -1
- orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +14 -4
- orangecontrib/tomwer/widgets/cluster/__init__.py +1 -1
- orangecontrib/tomwer/widgets/control/DataListOW.py +12 -5
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +18 -9
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +13 -6
- orangecontrib/tomwer/widgets/control/DataTransfertOW.py +4 -5
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +8 -4
- orangecontrib/tomwer/widgets/control/DataWatcherOW.py +4 -6
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +49 -62
- orangecontrib/tomwer/widgets/control/FilterOW.py +2 -4
- orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +93 -0
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +135 -128
- orangecontrib/tomwer/widgets/control/NotifierOW.py +31 -7
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +3 -5
- orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +85 -0
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +12 -4
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +11 -7
- orangecontrib/tomwer/widgets/control/icons/notification.svg +4 -4
- orangecontrib/tomwer/widgets/control/icons/nxtomomill.png +0 -0
- orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +8 -5
- orangecontrib/tomwer/widgets/control/icons/tomoobjserie.png +0 -0
- orangecontrib/tomwer/widgets/control/icons/tomoobjserie.svg +138 -0
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +16 -4
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +100 -0
- orangecontrib/tomwer/widgets/edit/icons/image_key_editor.png +0 -0
- orangecontrib/tomwer/widgets/edit/icons/image_key_upgrader.png +0 -0
- orangecontrib/tomwer/widgets/edit/icons/nx_tomo_editor.png +0 -0
- orangecontrib/tomwer/widgets/edit/icons/nx_tomo_editor.svg +123 -0
- orangecontrib/tomwer/widgets/edit/test/test_dark_flat_patch.py +21 -1
- orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py +1 -1
- orangecontrib/tomwer/widgets/edit/test/test_image_key_upgrader.py +1 -1
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +25 -0
- orangecontrib/tomwer/widgets/other/PythonScriptOW.py +19 -10
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +20 -14
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +24 -10
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +26 -21
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +29 -12
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +44 -17
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +28 -18
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +24 -17
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +6 -6
- orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +4 -2
- orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.png +0 -0
- orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.svg +11 -8
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +10 -4
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +69 -0
- orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +2 -4
- orangecontrib/tomwer/widgets/visualization/icons/nx_tomo_metadata_viewer.png +0 -0
- orangecontrib/tomwer/widgets/visualization/icons/nx_tomo_metadata_viewer.svg +105 -0
- tomwer/__main__.py +10 -5
- tomwer/app/canvas_launcher/config.py +10 -10
- tomwer/app/canvas_launcher/mainwindow.py +68 -6
- tomwer/app/canvas_launcher/widgetsscheme.py +1 -3
- tomwer/app/darkref.py +16 -12
- tomwer/app/imagekeyeditor.py +2 -2
- tomwer/app/imagekeyupgrader.py +104 -0
- tomwer/app/nxtomoeditor.py +103 -0
- tomwer/app/rsync.py +1 -1
- tomwer/core/cluster/cluster.py +1 -1
- tomwer/core/futureobject.py +1 -0
- tomwer/core/process/control/datalistener/datalistener.py +7 -1
- tomwer/core/process/control/datalistener/rpcserver.py +3 -3
- tomwer/core/process/control/datawatcher/datawatcher.py +18 -18
- tomwer/core/process/control/datawatcher/datawatcherobserver.py +5 -8
- tomwer/core/process/control/datawatcher/datawatcherprocess.py +2 -3
- tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -2
- tomwer/core/process/control/nxtomomill.py +33 -58
- tomwer/core/process/control/scanlist.py +2 -1
- tomwer/core/process/control/scanselector.py +7 -0
- tomwer/core/process/control/scantransfer.py +9 -18
- tomwer/core/process/control/scanvalidator.py +6 -5
- tomwer/core/process/control/singletomoobj.py +2 -1
- tomwer/core/process/control/timer.py +2 -1
- tomwer/core/process/control/tomoobjserie.py +8 -0
- tomwer/core/process/control/volumeselector.py +2 -1
- tomwer/core/process/control/volumesymlink.py +2 -1
- tomwer/core/process/edit/darkflatpatch.py +2 -1
- tomwer/core/process/edit/imagekeyeditor.py +4 -3
- tomwer/core/process/reconstruction/axis/axis.py +29 -32
- tomwer/core/process/reconstruction/axis/mode.py +3 -2
- tomwer/core/process/reconstruction/axis/params.py +35 -16
- tomwer/core/process/reconstruction/darkref/darkrefs.py +90 -707
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +44 -16
- tomwer/core/process/reconstruction/darkref/params.py +62 -67
- tomwer/core/process/reconstruction/lamino/tofu.py +1 -1
- tomwer/core/process/reconstruction/nabu/castvolume.py +21 -26
- tomwer/core/process/reconstruction/nabu/nabucommon.py +36 -38
- tomwer/core/process/reconstruction/nabu/nabuscores.py +28 -13
- tomwer/core/process/reconstruction/nabu/nabuslices.py +41 -14
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +21 -12
- tomwer/core/process/reconstruction/nabu/utils.py +12 -1
- tomwer/core/process/reconstruction/normalization/normalization.py +9 -8
- tomwer/core/process/reconstruction/saaxis/saaxis.py +46 -20
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +38 -12
- tomwer/core/process/reconstruction/test/__init__.py +0 -39
- tomwer/core/process/reconstruction/test/test_axis_params.py +25 -3
- tomwer/core/process/reconstruction/test/test_darkref_copy.py +117 -1
- tomwer/core/process/script/python.py +16 -12
- tomwer/core/process/task.py +3 -7
- tomwer/core/process/test/test_axis.py +1 -1
- tomwer/core/process/test/test_dark_and_flat.py +41 -111
- tomwer/core/process/test/test_data_listener.py +0 -29
- tomwer/core/process/test/test_data_transfer.py +10 -14
- tomwer/core/process/test/test_nabu.py +1 -1
- tomwer/core/process/test/test_normalization.py +1 -1
- tomwer/core/process/visualization/liveslice.py +6 -0
- tomwer/core/scan/blissscan.py +37 -2
- tomwer/core/scan/edfscan.py +14 -4
- tomwer/core/scan/hdf5scan.py +10 -4
- tomwer/core/scan/scanbase.py +35 -29
- tomwer/core/scan/scanfactory.py +3 -17
- tomwer/core/scan/test/test_h5.py +1 -1
- tomwer/core/scan/test/test_process_registration.py +0 -11
- tomwer/core/scan/test/test_scan.py +32 -30
- tomwer/core/settings.py +2 -2
- tomwer/core/test/test_utils.py +1 -1
- tomwer/core/tomwer_object.py +19 -0
- tomwer/core/utils/__init__.py +0 -45
- tomwer/core/utils/char.py +2 -0
- tomwer/core/utils/gpu.py +5 -5
- tomwer/core/utils/nxtomoutils.py +2 -2
- tomwer/core/utils/scanutils.py +50 -0
- tomwer/core/utils/volumeutils.py +13 -0
- tomwer/core/volume/edfvolume.py +4 -0
- tomwer/core/volume/hdf5volume.py +4 -0
- tomwer/core/volume/jp2kvolume.py +4 -0
- tomwer/core/volume/rawvolume.py +4 -0
- tomwer/core/volume/tiffvolume.py +4 -0
- tomwer/core/volume/volumebase.py +19 -12
- tomwer/core/volume/volumefactory.py +20 -1
- tomwer/gui/cluster/slurm.py +1 -1
- tomwer/gui/cluster/test/test_cluster.py +2 -2
- tomwer/gui/control/datalist.py +109 -34
- tomwer/gui/control/datatransfert.py +1 -1
- tomwer/gui/control/datawatcher/datawatcher.py +23 -13
- tomwer/gui/control/datawatcher/datawatcherobserver.py +1 -1
- tomwer/gui/control/observations.py +0 -3
- tomwer/gui/control/selectorwidgetbase.py +42 -11
- tomwer/gui/control/serie/seriecreator.py +967 -0
- tomwer/{web/__init__.py → gui/control/serie/seriewaiter.py} +5 -7
- tomwer/gui/control/singletomoobj.py +15 -3
- tomwer/gui/control/test/test_datalist.py +1 -1
- tomwer/gui/control/test/test_datalistener.py +1 -1
- tomwer/gui/control/test/test_inputwidget.py +1 -1
- tomwer/gui/control/test/test_process_manager.py +1 -13
- tomwer/gui/control/test/test_scanselector.py +1 -1
- tomwer/gui/control/test/test_scanvalidator.py +1 -1
- tomwer/gui/control/test/test_single_tomo_obj.py +1 -1
- tomwer/gui/control/test/test_volume_dialog.py +19 -7
- tomwer/gui/control/test/test_volumeselector.py +4 -4
- tomwer/gui/debugtools/datasetgenerator.py +1 -8
- tomwer/gui/edit/dkrfpatch.py +2 -2
- tomwer/gui/edit/imagekeyeditor.py +12 -9
- tomwer/gui/edit/nxtomoeditor.py +475 -0
- tomwer/gui/edit/test/test_dkrf_patch.py +2 -14
- tomwer/gui/edit/test/test_image_key_editor.py +2 -2
- tomwer/gui/edit/test/test_nx_editor.py +155 -0
- tomwer/gui/qfolderdialog.py +11 -0
- tomwer/gui/reconstruction/axis/CompareImages.py +27 -29
- tomwer/gui/reconstruction/axis/axis.py +2 -0
- tomwer/gui/reconstruction/axis/radioaxis.py +67 -11
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +7 -9
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +22 -24
- tomwer/gui/reconstruction/lamino/tofu/projections.py +1 -1
- tomwer/gui/reconstruction/lamino/tofu/tofu.py +3 -3
- tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +4 -4
- tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +10 -4
- tomwer/gui/reconstruction/nabu/castvolume.py +80 -11
- tomwer/gui/reconstruction/nabu/check.py +1 -1
- tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +352 -0
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +0 -9
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +1 -1
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +18 -19
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +30 -7
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +26 -13
- tomwer/gui/reconstruction/nabu/slices.py +10 -2
- tomwer/gui/reconstruction/nabu/slurm.py +1 -1
- tomwer/gui/reconstruction/nabu/volume.py +13 -7
- tomwer/gui/reconstruction/normalization/intensity.py +1 -1
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +10 -34
- tomwer/gui/reconstruction/saaxis/saaxis.py +11 -6
- tomwer/gui/reconstruction/saaxis/sliceselector.py +11 -26
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +13 -8
- tomwer/gui/reconstruction/scores/scoreplot.py +67 -61
- tomwer/gui/reconstruction/test/test_axis.py +2 -2
- tomwer/gui/reconstruction/test/test_lamino.py +2 -2
- tomwer/gui/reconstruction/test/test_nabu.py +14 -1
- tomwer/gui/reconstruction/test/test_saaxis.py +8 -17
- tomwer/gui/reconstruction/test/test_sadeltabeta.py +7 -13
- tomwer/gui/stackplot.py +11 -28
- tomwer/gui/test/test_axis_gui.py +4 -4
- tomwer/gui/test/test_qfolder_dialog.py +12 -0
- tomwer/gui/utils/inputwidget.py +42 -21
- tomwer/gui/utils/lineselector/lineselector.py +13 -21
- tomwer/gui/utils/scandescription.py +2 -4
- tomwer/gui/utils/slider.py +1 -102
- tomwer/gui/utils/unitsystem.py +48 -11
- tomwer/gui/visualization/dataviewer.py +24 -17
- tomwer/gui/visualization/diffviewer/diffviewer.py +2 -11
- tomwer/gui/visualization/nxtomometadata.py +21 -0
- tomwer/gui/visualization/scanoverview.py +0 -1
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +72 -0
- tomwer/gui/visualization/test/test_stacks.py +1 -1
- tomwer/gui/visualization/tomoobjoverview.py +49 -0
- tomwer/gui/visualization/volumeoverview.py +64 -0
- tomwer/gui/visualization/volumeviewer.py +1 -1
- tomwer/resources/gui/icons/multi-document-save.png +0 -0
- tomwer/resources/gui/icons/multi-document-save.svg +101 -0
- tomwer/resources/gui/illustrations/ctf_z1.png +0 -0
- tomwer/resources/gui/illustrations/ctf_z1.svg +471 -0
- tomwer/synctools/datalistener.py +5 -1
- tomwer/synctools/imageloaderthread.py +2 -2
- tomwer/synctools/stacks/edit/imagekeyeditor.py +1 -1
- tomwer/synctools/stacks/processingstack.py +2 -2
- tomwer/synctools/stacks/reconstruction/castvolume.py +1 -0
- tomwer/synctools/stacks/reconstruction/lamino.py +1 -3
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +0 -2
- tomwer/synctools/test/test_darkRefs.py +32 -149
- tomwer/synctools/test/test_foldertransfer.py +1 -1
- tomwer/synctools/test/test_scanstages.py +2 -2
- tomwer/tests/__init__.py +0 -0
- tomwer/tests/conftest.py +51 -0
- tomwer/{test → tests}/test_scripts.py +1 -1
- tomwer/tests/test_utils.py +10 -0
- tomwer/{test → tests}/utils/utilstest.py +0 -11
- tomwer/version.py +3 -3
- {tomwer-1.0.4.dist-info → tomwer-1.1.0.dist-info}/METADATA +14 -16
- {tomwer-1.0.4.dist-info → tomwer-1.1.0.dist-info}/RECORD +245 -217
- {tomwer-1.0.4.dist-info → tomwer-1.1.0.dist-info}/WHEEL +1 -1
- {tomwer-1.0.4.dist-info → tomwer-1.1.0.dist-info}/entry_points.txt +6 -0
- orangecontrib/tomwer/setup.py +0 -45
- orangecontrib/tomwer/widgets/setup.py +0 -49
- tomwer/app/process.py +0 -153
- tomwer/core/process/reconstruction/nabu/slurm.py +0 -36
- tomwer/core/process/reconstruction/utils/nabu_slice_exec.py +0 -10
- tomwer/core/utils/laminoutils.py +0 -80
- tomwer/gui/utils/lineselector/lineselection.py +0 -76
- tomwer/setup.py +0 -52
- tomwer/web/client.py +0 -43
- tomwer/web/config.py +0 -36
- tomwer/web/test/test_graylog_connection.py +0 -59
- {tomwer/test → orangecontrib/tomwer/tutorials}/__init__.py +0 -0
- /tomwer/{web/test → gui/control/serie}/__init__.py +0 -0
- /tomwer/{test → tests}/utils/__init__.py +0 -0
- /tomwer-1.0.4-py3.8-nspkg.pth → /tomwer-1.1.0-py3.9-nspkg.pth +0 -0
- {tomwer-1.0.4.dist-info → tomwer-1.1.0.dist-info}/LICENSE +0 -0
- {tomwer-1.0.4.dist-info → tomwer-1.1.0.dist-info}/namespace_packages.txt +0 -0
- {tomwer-1.0.4.dist-info → tomwer-1.1.0.dist-info}/top_level.txt +0 -0
@@ -125,7 +125,9 @@ class SADeltaBetaWindow(_SADeltaBetaWindow):
|
|
125
125
|
if scan is None:
|
126
126
|
return
|
127
127
|
assert isinstance(scan, TomwerScanBase)
|
128
|
-
selected_db_value =
|
128
|
+
selected_db_value = (
|
129
|
+
self.getCurrentDeltaBetaValue() or scan.sa_delta_beta_params.autofocus
|
130
|
+
)
|
129
131
|
if selected_db_value is None:
|
130
132
|
infos = "no selected delta / beta value. {} skip SADeltaBetaParams".format(
|
131
133
|
scan
|
@@ -137,6 +139,10 @@ class SADeltaBetaWindow(_SADeltaBetaWindow):
|
|
137
139
|
)
|
138
140
|
else:
|
139
141
|
scan.sa_delta_beta_params.set_db_selected_value(selected_db_value)
|
142
|
+
if scan.nabu_recons_params is not None:
|
143
|
+
if "phase" not in scan.nabu_recons_params:
|
144
|
+
scan.nabu_recons_params["phase"] = {}
|
145
|
+
scan.nabu_recons_params["phase"]["delta_beta"] = (selected_db_value,)
|
140
146
|
infos = "delta / beta selected for {}: {},".format(
|
141
147
|
scan, scan.sa_delta_beta_params.value
|
142
148
|
)
|
@@ -221,10 +227,7 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
|
|
221
227
|
sigScanReady = qt.Signal(TomwerScanBase)
|
222
228
|
"""Signal emitted when a scan is ready"""
|
223
229
|
|
224
|
-
|
225
|
-
"settings store as dict"
|
226
|
-
|
227
|
-
static_input = Setting({"data": None, "sa_delta_beta_params": None})
|
230
|
+
_ewoks_default_inputs = Setting({"data": None, "sa_delta_beta_params": None})
|
228
231
|
|
229
232
|
class Inputs:
|
230
233
|
data = Input(name="data", type=TomwerScanBase, default=True, multiple=False)
|
@@ -264,10 +267,10 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
|
|
264
267
|
)
|
265
268
|
self._layout.addWidget(self._widget)
|
266
269
|
|
267
|
-
sa_delta_beta_params = self.
|
268
|
-
|
269
|
-
|
270
|
-
self.setConfiguration(sa_delta_beta_params)
|
270
|
+
sa_delta_beta_params = self._ewoks_default_inputs.get(
|
271
|
+
"sa_delta_beta_params", None
|
272
|
+
)
|
273
|
+
self.setConfiguration(sa_delta_beta_params or {})
|
271
274
|
|
272
275
|
# connect signal / slot
|
273
276
|
self._widget.sigConfigurationChanged.connect(self._updateSettings)
|
@@ -279,6 +282,16 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
|
|
279
282
|
# expose API
|
280
283
|
self.wait_processing = self._widget.wait_processing
|
281
284
|
|
285
|
+
def __new__(cls, *args, **kwargs):
|
286
|
+
# ensure backward compatibility with 'static_input'
|
287
|
+
static_input = kwargs.get("stored_settings", {}).get("static_input", None)
|
288
|
+
if static_input not in (None, {}):
|
289
|
+
_logger.warning(
|
290
|
+
"static_input has been deprecated. Will be replaced by _ewoks_default_inputs in the workflow file. Please save the workflow to apply modifications"
|
291
|
+
)
|
292
|
+
kwargs["stored_settings"]["_ewoks_default_inputs"] = static_input
|
293
|
+
return super().__new__(cls, *args, **kwargs)
|
294
|
+
|
282
295
|
def setConfiguration(self, configuration):
|
283
296
|
if "workflow" in configuration:
|
284
297
|
autofocus_lock = configuration["workflow"].get("autofocus_lock", None)
|
@@ -362,17 +375,11 @@ class SADeltaBetaOW(SuperviseOW, WidgetLongProcessing):
|
|
362
375
|
def _updateSettings(self):
|
363
376
|
config = self._widget.getConfiguration()
|
364
377
|
config.pop("cluster_config", None)
|
365
|
-
self.
|
366
|
-
self._rpSetting["workflow"] = {
|
367
|
-
"autofocus_lock": self._widget.isAutoFocusLock(),
|
368
|
-
}
|
369
|
-
# keep for backward compatibility
|
370
|
-
|
371
|
-
self.static_input = {
|
378
|
+
self._ewoks_default_inputs = {
|
372
379
|
"data": None,
|
373
380
|
"sa_delta_beta_params": self._widget.getConfiguration(),
|
374
381
|
}
|
375
|
-
self.
|
382
|
+
self._ewoks_default_inputs["sa_delta_beta_params"]["workflow"] = {
|
376
383
|
"autofocus_lock": self._widget.isAutoFocusLock(),
|
377
384
|
}
|
378
385
|
|
@@ -133,7 +133,7 @@ class SinoNormOW(WidgetLongProcessing, SuperviseOW):
|
|
133
133
|
compress_signal = False
|
134
134
|
allows_cycle = True
|
135
135
|
|
136
|
-
|
136
|
+
_ewoks_default_inputs = Setting(dict())
|
137
137
|
|
138
138
|
sigScanReady = qt.Signal(TomwerScanBase)
|
139
139
|
"Signal emitted when a scan is ended"
|
@@ -300,10 +300,10 @@ class SinoNormOW(WidgetLongProcessing, SuperviseOW):
|
|
300
300
|
self._window.stop()
|
301
301
|
|
302
302
|
def _updateSettings(self):
|
303
|
-
self.
|
304
|
-
self.
|
303
|
+
self._ewoks_default_inputs = self._window.getConfiguration()
|
304
|
+
self._ewoks_default_inputs["__lock__"] = self.isLocked()
|
305
305
|
|
306
306
|
def loadSettings(self):
|
307
|
-
self._window.setConfiguration(self.
|
308
|
-
if "__lock__" in self.
|
309
|
-
self.setLocked(self.
|
307
|
+
self._window.setConfiguration(self._ewoks_default_inputs)
|
308
|
+
if "__lock__" in self._ewoks_default_inputs:
|
309
|
+
self.setLocked(self._ewoks_default_inputs["__lock__"])
|
@@ -75,7 +75,7 @@ class TofuOW(WidgetLongProcessing, SuperviseOW):
|
|
75
75
|
_reconsParams = settings.Setting(dict())
|
76
76
|
"""Parameters directly editabled from the TOFU interface"""
|
77
77
|
# kept for compatibility
|
78
|
-
|
78
|
+
_ewoks_default_inputs = settings.Setting({"data": None, "lamino_params": None})
|
79
79
|
|
80
80
|
_additionalOpts = settings.Setting(dict())
|
81
81
|
"""Parameters which can be add on the expert tab from TOFU"""
|
@@ -108,7 +108,9 @@ class TofuOW(WidgetLongProcessing, SuperviseOW):
|
|
108
108
|
self._box.layout().addWidget(self._mainWidget)
|
109
109
|
self._box.layout().addWidget(self._widgetControl)
|
110
110
|
|
111
|
-
lamino_params = self.
|
111
|
+
lamino_params = self._ewoks_default_inputs.get( # pylint: disable=E1101
|
112
|
+
"lamino_params", None
|
113
|
+
)
|
112
114
|
if lamino_params is None:
|
113
115
|
lamino_params = self._reconsParams
|
114
116
|
self._mainWidget.setParameters(lamino_params)
|
Binary file
|
@@ -14,8 +14,11 @@
|
|
14
14
|
viewBox="0 0 48 48"
|
15
15
|
version="1.1"
|
16
16
|
id="SVGRoot"
|
17
|
-
inkscape:version="0.92.
|
18
|
-
sodipodi:docname="
|
17
|
+
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
18
|
+
sodipodi:docname="nabu_2d.svg"
|
19
|
+
inkscape:export-filename="/media/payno/830add5c-f5d7-4db2-875e-03be4f0a67f0/dev/tomography/tomwer/orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.png"
|
20
|
+
inkscape:export-xdpi="59.900002"
|
21
|
+
inkscape:export-ydpi="59.900002">
|
19
22
|
<defs
|
20
23
|
id="defs815" />
|
21
24
|
<sodipodi:namedview
|
@@ -26,14 +29,14 @@
|
|
26
29
|
inkscape:pageopacity="0.0"
|
27
30
|
inkscape:pageshadow="2"
|
28
31
|
inkscape:zoom="5.3333333"
|
29
|
-
inkscape:cx="-
|
30
|
-
inkscape:cy="
|
32
|
+
inkscape:cx="-96.821274"
|
33
|
+
inkscape:cy="34.925261"
|
31
34
|
inkscape:document-units="px"
|
32
35
|
inkscape:current-layer="g1399"
|
33
36
|
showgrid="false"
|
34
|
-
inkscape:window-width="
|
35
|
-
inkscape:window-height="
|
36
|
-
inkscape:window-x="
|
37
|
+
inkscape:window-width="1848"
|
38
|
+
inkscape:window-height="1136"
|
39
|
+
inkscape:window-x="72"
|
37
40
|
inkscape:window-y="27"
|
38
41
|
inkscape:window-maximized="1"
|
39
42
|
inkscape:grid-bbox="true" />
|
@@ -45,7 +48,7 @@
|
|
45
48
|
<dc:format>image/svg+xml</dc:format>
|
46
49
|
<dc:type
|
47
50
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
48
|
-
<dc:title
|
51
|
+
<dc:title />
|
49
52
|
</cc:Work>
|
50
53
|
</rdf:RDF>
|
51
54
|
</metadata>
|
@@ -70,7 +70,7 @@ class DataViewerOW(widget.OWBaseWidget, openclass=True):
|
|
70
70
|
data = Input(name="data", type=TomwerScanBase)
|
71
71
|
|
72
72
|
def __init__(self, parent=None):
|
73
|
-
|
73
|
+
super().__init__(parent)
|
74
74
|
self._layout = gui.vBox(self.mainArea, self.name).layout()
|
75
75
|
self.viewer = DataViewer(parent=self)
|
76
76
|
self.viewer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Expanding)
|
@@ -115,9 +115,15 @@ class DataViewerOW(widget.OWBaseWidget, openclass=True):
|
|
115
115
|
return qt.QSize(400, 500)
|
116
116
|
|
117
117
|
def _updateSettings(self):
|
118
|
-
self._viewer_config[
|
119
|
-
|
120
|
-
|
118
|
+
self._viewer_config[ # pylint: disable=E1137
|
119
|
+
"mode"
|
120
|
+
] = self.viewer.getDisplayMode().value
|
121
|
+
self._viewer_config[ # pylint: disable=E1137
|
122
|
+
"slice_opt"
|
123
|
+
] = self.viewer.getSliceOption().value
|
124
|
+
self._viewer_config[ # pylint: disable=E1137
|
125
|
+
"radio_opt"
|
126
|
+
] = self.viewer.getRadioOption().value
|
121
127
|
|
122
128
|
def _setSettings(self, settings):
|
123
129
|
old_state = self.viewer.blockSignals(True)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
from orangewidget import widget, gui
|
2
|
+
from tomwer.gui.visualization.nxtomometadata import NXtomoMetadataViewer
|
3
|
+
from orangewidget.widget import Input, Output
|
4
|
+
from tomwer.core.scan.hdf5scan import HDF5TomoScan
|
5
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
6
|
+
from silx.gui import qt
|
7
|
+
|
8
|
+
|
9
|
+
class NXtomoMetadataViewerOW(widget.OWBaseWidget, openclass=True):
|
10
|
+
"""
|
11
|
+
Widget to siplay NXtomo metadata
|
12
|
+
"""
|
13
|
+
|
14
|
+
name = "nxtomo-metadata-viewer"
|
15
|
+
id = "orange.widgets.tomwer.visualization.NXtomoMetadataViewerOW.NXtomoMetadataViewerOW"
|
16
|
+
description = "Interface to display some metadata of an NXtomo"
|
17
|
+
icon = "icons/nx_tomo_metadata_viewer.svg"
|
18
|
+
priority = 13
|
19
|
+
keywords = [
|
20
|
+
"hdf5",
|
21
|
+
"nexus",
|
22
|
+
"tomwer",
|
23
|
+
"file",
|
24
|
+
"visualize",
|
25
|
+
"visualization",
|
26
|
+
"display",
|
27
|
+
"NXTomo",
|
28
|
+
"editor",
|
29
|
+
"energy",
|
30
|
+
"distance",
|
31
|
+
"pixel size",
|
32
|
+
]
|
33
|
+
|
34
|
+
class Inputs:
|
35
|
+
data = Input(name="data", type=TomwerScanBase)
|
36
|
+
|
37
|
+
class Outputs:
|
38
|
+
data = Output(name="data", type=TomwerScanBase)
|
39
|
+
|
40
|
+
want_main_area = True
|
41
|
+
resizing_enabled = True
|
42
|
+
compress_signal = False
|
43
|
+
|
44
|
+
def __init__(self, parent=None, *args, **kwargs):
|
45
|
+
super().__init__(parent=parent, *args, **kwargs)
|
46
|
+
|
47
|
+
_layout = gui.vBox(self.mainArea, self.name).layout()
|
48
|
+
self.widget = NXtomoMetadataViewer(parent=self)
|
49
|
+
_layout.addWidget(self.widget)
|
50
|
+
|
51
|
+
def _validateScan(self, scan):
|
52
|
+
self.Outputs.data.send(scan)
|
53
|
+
super().hide()
|
54
|
+
|
55
|
+
@Inputs.data
|
56
|
+
def setScan(self, scan):
|
57
|
+
if scan is None:
|
58
|
+
pass
|
59
|
+
elif not isinstance(scan, HDF5TomoScan):
|
60
|
+
raise TypeError(
|
61
|
+
f"expect to have an instance of {HDF5TomoScan}. {type(scan)} provided."
|
62
|
+
)
|
63
|
+
else:
|
64
|
+
self.widget.setScan(scan)
|
65
|
+
self.show()
|
66
|
+
self.raise_()
|
67
|
+
|
68
|
+
def sizeHint(self):
|
69
|
+
return qt.QSize(400, 500)
|
@@ -30,7 +30,6 @@ __date__ = "19/03/2018"
|
|
30
30
|
from silx.gui import qt
|
31
31
|
from orangewidget import widget, gui
|
32
32
|
from orangewidget.widget import Input
|
33
|
-
from tomwer.web.client import OWClient
|
34
33
|
from tomwer.gui.samplemoved import SampleMovedWidget
|
35
34
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
36
35
|
import tomwer.core.process.visualization.samplemoved
|
@@ -40,7 +39,7 @@ import logging
|
|
40
39
|
logger = logging.getLogger(__name__)
|
41
40
|
|
42
41
|
|
43
|
-
class SampleMovedOW(widget.OWBaseWidget,
|
42
|
+
class SampleMovedOW(widget.OWBaseWidget, openclass=True):
|
44
43
|
"""
|
45
44
|
Simple widget exposing two images side by side to see if a sample moved
|
46
45
|
during the acquisition.
|
@@ -72,8 +71,7 @@ class SampleMovedOW(widget.OWBaseWidget, OWClient, openclass=True):
|
|
72
71
|
data = Input(name="data", type=TomwerScanBase)
|
73
72
|
|
74
73
|
def __init__(self, parent=None):
|
75
|
-
|
76
|
-
OWClient.__init__(self)
|
74
|
+
super().__init__(parent)
|
77
75
|
|
78
76
|
layout = gui.vBox(self.mainArea, self.name).layout()
|
79
77
|
|
@@ -0,0 +1,105 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
3
|
+
|
4
|
+
<svg
|
5
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
6
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
7
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
8
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
9
|
+
xmlns="http://www.w3.org/2000/svg"
|
10
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
11
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
12
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
13
|
+
width="48"
|
14
|
+
height="48"
|
15
|
+
viewBox="0 0 12.7 12.7"
|
16
|
+
version="1.1"
|
17
|
+
id="svg901"
|
18
|
+
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
19
|
+
sodipodi:docname="nx_tomo_metadata_viewer.svg"
|
20
|
+
inkscape:export-filename="/media/payno/830add5c-f5d7-4db2-875e-03be4f0a67f0/dev/tomography/tomwer/orangecontrib/tomwer/widgets/visualization/icons/nx_tomo_metadata_viewer.png"
|
21
|
+
inkscape:export-xdpi="59.900002"
|
22
|
+
inkscape:export-ydpi="59.900002">
|
23
|
+
<defs
|
24
|
+
id="defs895" />
|
25
|
+
<sodipodi:namedview
|
26
|
+
id="base"
|
27
|
+
pagecolor="#ffffff"
|
28
|
+
bordercolor="#666666"
|
29
|
+
borderopacity="1.0"
|
30
|
+
inkscape:pageopacity="0.0"
|
31
|
+
inkscape:pageshadow="2"
|
32
|
+
inkscape:zoom="3.959798"
|
33
|
+
inkscape:cx="-32.267824"
|
34
|
+
inkscape:cy="1.1453318"
|
35
|
+
inkscape:document-units="mm"
|
36
|
+
inkscape:current-layer="layer1"
|
37
|
+
showgrid="false"
|
38
|
+
units="px"
|
39
|
+
inkscape:window-width="1848"
|
40
|
+
inkscape:window-height="1136"
|
41
|
+
inkscape:window-x="72"
|
42
|
+
inkscape:window-y="27"
|
43
|
+
inkscape:window-maximized="1" />
|
44
|
+
<metadata
|
45
|
+
id="metadata898">
|
46
|
+
<rdf:RDF>
|
47
|
+
<cc:Work
|
48
|
+
rdf:about="">
|
49
|
+
<dc:format>image/svg+xml</dc:format>
|
50
|
+
<dc:type
|
51
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
52
|
+
<dc:title></dc:title>
|
53
|
+
</cc:Work>
|
54
|
+
</rdf:RDF>
|
55
|
+
</metadata>
|
56
|
+
<g
|
57
|
+
inkscape:label="Layer 1"
|
58
|
+
inkscape:groupmode="layer"
|
59
|
+
id="layer1"
|
60
|
+
transform="translate(0,-284.3)">
|
61
|
+
<g
|
62
|
+
transform="matrix(0.67999756,0,0,1.4705936,-0.07800087,-0.17577001)"
|
63
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15.24015903px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.07525919"
|
64
|
+
id="text2005">
|
65
|
+
<path
|
66
|
+
inkscape:connector-curvature="0"
|
67
|
+
d="M 0.19471413,195.6209 H 1.1392864 l 2.2989224,4.3374 v -4.3374 h 0.6806477 v 5.18473 H 3.1742841 l -2.29892227,-4.33739 v 4.33739 h -0.6806477 z"
|
68
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.1120739px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
|
69
|
+
id="path869" />
|
70
|
+
<path
|
71
|
+
inkscape:connector-curvature="0"
|
72
|
+
d="m 5.264845,195.6209 h 0.7535742 l 1.2883689,1.92735 1.2953142,-1.92735 h 0.7535742 l -1.6668923,2.48992 1.7780185,2.69481 H 8.7132284 l -1.4585307,-2.20516 -1.4689489,2.20516 H 5.0287019 l 1.850945,-2.76773 z"
|
73
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.1120739px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
|
74
|
+
id="path871" />
|
75
|
+
<path
|
76
|
+
inkscape:connector-curvature="0"
|
77
|
+
d="m 10.340185,198.30877 v 0.55216 h 0.658075 v 0.24829 h -0.658075 v 1.0557 q 0,0.23788 0.06424,0.3056 0.06598,0.0677 0.265661,0.0677 h 0.328169 v 0.26739 h -0.328169 q -0.369842,0 -0.510486,-0.13717 -0.140644,-0.13891 -0.140644,-0.50354 v -1.0557 H 9.7845543 v -0.24829 h 0.2344067 v -0.55216 z"
|
78
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
|
79
|
+
id="path873" />
|
80
|
+
<path
|
81
|
+
inkscape:connector-curvature="0"
|
82
|
+
d="m 12.17203,199.08491 q -0.25698,0 -0.406305,0.20142 -0.149326,0.19968 -0.149326,0.54869 0,0.349 0.147589,0.55042 0.149326,0.19968 0.408042,0.19968 0.255242,0 0.404568,-0.20142 0.149326,-0.20141 0.149326,-0.54868 0,-0.34554 -0.149326,-0.54695 -0.149326,-0.20316 -0.404568,-0.20316 z m 0,-0.27087 q 0.416723,0 0.654602,0.27087 0.237879,0.27087 0.237879,0.75011 0,0.47749 -0.237879,0.7501 -0.237879,0.27087 -0.654602,0.27087 -0.41846,0 -0.656339,-0.27087 -0.236143,-0.27261 -0.236143,-0.7501 0,-0.47924 0.236143,-0.75011 0.237879,-0.27087 0.656339,-0.27087 z"
|
83
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
|
84
|
+
id="path875" />
|
85
|
+
<path
|
86
|
+
inkscape:connector-curvature="0"
|
87
|
+
d="m 15.108191,199.23424 q 0.119808,-0.21531 0.286497,-0.31775 0.166689,-0.10245 0.392414,-0.10245 0.303861,0 0.468814,0.21358 0.164953,0.21183 0.164953,0.60424 v 1.17377 h -0.321224 v -1.16335 q 0,-0.27955 -0.09897,-0.41499 -0.09897,-0.13543 -0.302124,-0.13543 -0.248298,0 -0.392414,0.16495 -0.144117,0.16496 -0.144117,0.44972 v 1.0991 h -0.321224 v -1.16335 q 0,-0.28129 -0.09897,-0.41499 -0.09897,-0.13543 -0.305597,-0.13543 -0.244825,0 -0.388941,0.16669 -0.144117,0.16495 -0.144117,0.44798 v 1.0991 h -0.321224 v -1.9447 h 0.321224 v 0.30212 q 0.10939,-0.17884 0.262188,-0.26392 0.152799,-0.0851 0.362897,-0.0851 0.211834,0 0.359423,0.10766 0.149326,0.10765 0.220516,0.31254 z"
|
88
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
|
89
|
+
id="path877" />
|
90
|
+
<path
|
91
|
+
inkscape:connector-curvature="0"
|
92
|
+
d="m 17.811682,199.08491 q -0.256979,0 -0.406305,0.20142 -0.149326,0.19968 -0.149326,0.54869 0,0.349 0.147589,0.55042 0.149326,0.19968 0.408042,0.19968 0.255243,0 0.404568,-0.20142 0.149326,-0.20141 0.149326,-0.54868 0,-0.34554 -0.149326,-0.54695 -0.149325,-0.20316 -0.404568,-0.20316 z m 0,-0.27087 q 0.416723,0 0.654602,0.27087 0.23788,0.27087 0.23788,0.75011 0,0.47749 -0.23788,0.7501 -0.237879,0.27087 -0.654602,0.27087 -0.41846,0 -0.656339,-0.27087 -0.236143,-0.27261 -0.236143,-0.7501 0,-0.47924 0.236143,-0.75011 0.237879,-0.27087 0.656339,-0.27087 z"
|
93
|
+
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.55603695px;font-family:'Noto Serif Gurmukhi';-inkscape-font-specification:'Noto Serif Gurmukhi';stroke-width:0.07525919"
|
94
|
+
id="path879" />
|
95
|
+
</g>
|
96
|
+
<image
|
97
|
+
width="8.9820642"
|
98
|
+
height="8.2470732"
|
99
|
+
preserveAspectRatio="none"
|
100
|
+
xlink:href="data:image/png;base64,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 QmCC "
|
101
|
+
id="image1813"
|
102
|
+
x="4.855176"
|
103
|
+
y="283.63773" />
|
104
|
+
</g>
|
105
|
+
</svg>
|
tomwer/__main__.py
CHANGED
@@ -80,6 +80,11 @@ def main():
|
|
80
80
|
module_name="tomwer.app.imagekeyeditor",
|
81
81
|
description="Tool to modify in place frames image key parameter.",
|
82
82
|
)
|
83
|
+
launcher.add_command(
|
84
|
+
"image-key-upgrader",
|
85
|
+
module_name="tomwer.app.imagekeyupgrader",
|
86
|
+
description="Tool to upgrade in place frames image key parameter.",
|
87
|
+
)
|
83
88
|
launcher.add_command(
|
84
89
|
"norm-intensity",
|
85
90
|
module_name="tomwer.app.intensitynormalization",
|
@@ -100,16 +105,16 @@ def main():
|
|
100
105
|
module_name="tomwer.app.nabuapp",
|
101
106
|
description="Use nabu to reconstruct a given scan",
|
102
107
|
)
|
108
|
+
launcher.add_command(
|
109
|
+
"nxtomo-editor",
|
110
|
+
module_name="tomwer.app.nxtomoeditor",
|
111
|
+
description="Use to edit an NXtomo",
|
112
|
+
)
|
103
113
|
launcher.add_command(
|
104
114
|
"ows-to-script",
|
105
115
|
module_name="tomwer.app.ows_to_script",
|
106
116
|
description="Convert a .ows file to python script",
|
107
117
|
)
|
108
|
-
launcher.add_command(
|
109
|
-
"process",
|
110
|
-
module_name="tomwer.app.process",
|
111
|
-
description="Process a given scan with a defined" "workflow",
|
112
|
-
)
|
113
118
|
launcher.add_command(
|
114
119
|
"rsync",
|
115
120
|
module_name="tomwer.app.rsync",
|
@@ -124,12 +124,12 @@ class TomwerConfig(config.Config):
|
|
124
124
|
#: Submit a bug report action in the Help menu
|
125
125
|
"Bug Report": "https://gitlab.esrf.fr/tomotools/tomwer/-/issues",
|
126
126
|
#: A url quick tour/getting started url
|
127
|
-
"Quick Start": "
|
127
|
+
"Quick Start": "https://www.youtube.com/playlist?list=PLddRXwP6Z6F9KOu1V5o6H24KPH5Ikuk2f",
|
128
128
|
#: The 'full' documentation, should be something like current /docs/
|
129
129
|
#: but specific for 'Visual Programing' only
|
130
|
-
"Documentation": "
|
130
|
+
"Documentation": "https://tomotools.gitlab-pages.esrf.fr/nxtomomill/index.html",
|
131
131
|
#: YouTube tutorials
|
132
|
-
"Screencasts": "
|
132
|
+
"Screencasts": "https://www.youtube.com/@tomotools",
|
133
133
|
}
|
134
134
|
|
135
135
|
|
@@ -187,13 +187,13 @@ class TerminalTextDocument(_TerminalTextDocument):
|
|
187
187
|
# remove linux reset sequence
|
188
188
|
string = string.replace("\033[1;%dm", "")
|
189
189
|
# remove linux reset sequence
|
190
|
-
string = string.replace("
|
191
|
-
string = string.replace("
|
192
|
-
string = string.replace("
|
193
|
-
string = string.replace("
|
194
|
-
string = string.replace("
|
195
|
-
string = string.replace("
|
196
|
-
string = string.replace("
|
190
|
+
string = string.replace("\x1B[1m", "")
|
191
|
+
string = string.replace("\x1B[1;30m", "")
|
192
|
+
string = string.replace("\x1B[1;31m", "")
|
193
|
+
string = string.replace("\x1B[1;32m", "")
|
194
|
+
string = string.replace("\x1B[1;33m", "")
|
195
|
+
string = string.replace("\x1B[1;34m", "")
|
196
|
+
string = string.replace("\x1B[1;35m", "")
|
197
197
|
|
198
198
|
color = self.get_log_level(string) or qt.Qt.red
|
199
199
|
charformat.setForeground(color)
|
@@ -16,6 +16,7 @@ from orangecanvas.application.outputview import (
|
|
16
16
|
ExceptHook,
|
17
17
|
TerminalTextDocument,
|
18
18
|
)
|
19
|
+
from xml.sax.saxutils import escape
|
19
20
|
import logging
|
20
21
|
import os
|
21
22
|
import shutil
|
@@ -26,6 +27,19 @@ from .config import TomwerConfig, TomwerSplashScreen
|
|
26
27
|
import tomwer.version
|
27
28
|
from urllib.request import urlopen
|
28
29
|
|
30
|
+
try:
|
31
|
+
import nabu
|
32
|
+
except ImportError:
|
33
|
+
has_nabu = False
|
34
|
+
else:
|
35
|
+
has_nabu = True
|
36
|
+
try:
|
37
|
+
import nxtomomill.version
|
38
|
+
except ImportError:
|
39
|
+
has_nxtomomill = False
|
40
|
+
else:
|
41
|
+
has_nxtomomill = True
|
42
|
+
|
29
43
|
_logger = logging.getLogger(__file__)
|
30
44
|
|
31
45
|
MAX_LOG_FILE = 10
|
@@ -68,20 +82,27 @@ class MainWindow(_MainWindow):
|
|
68
82
|
super().setup_menu()
|
69
83
|
self.view_menu.addAction(self.show_processes_manager_action)
|
70
84
|
|
85
|
+
def open_about(self):
|
86
|
+
# type: () -> None
|
87
|
+
"""Open the about dialog."""
|
88
|
+
dlg = AboutDialog(self)
|
89
|
+
dlg.setAttribute(qt.Qt.WA_DeleteOnClose)
|
90
|
+
dlg.exec()
|
91
|
+
|
71
92
|
|
72
93
|
log = logging.getLogger(__name__)
|
73
94
|
|
74
95
|
|
75
|
-
def check_for_updates():
|
76
|
-
|
96
|
+
def check_for_updates() -> bool:
|
97
|
+
return False
|
77
98
|
|
78
99
|
|
79
|
-
def send_usage_statistics():
|
80
|
-
|
100
|
+
def send_usage_statistics() -> bool:
|
101
|
+
return False
|
81
102
|
|
82
103
|
|
83
|
-
def pull_notifications():
|
84
|
-
|
104
|
+
def pull_notifications() -> bool:
|
105
|
+
return False
|
85
106
|
|
86
107
|
|
87
108
|
def make_sql_logger(level=logging.INFO):
|
@@ -175,6 +196,47 @@ def widget_settings_dir():
|
|
175
196
|
return os.path.join(data_dir(), "widgets")
|
176
197
|
|
177
198
|
|
199
|
+
ABOUT_TEMPLATE = """\
|
200
|
+
<center>
|
201
|
+
<h4>{name}</h4>
|
202
|
+
<p>tomwer version: {tomwer_version}</p>
|
203
|
+
<p>nabu version: {nabu_version}</p>
|
204
|
+
<p>nxtomomill version: {nxtomomill_version}</p>
|
205
|
+
</center>
|
206
|
+
"""
|
207
|
+
|
208
|
+
|
209
|
+
class AboutDialog(qt.QDialog):
|
210
|
+
def __init__(self, parent=None, **kwargs) -> None:
|
211
|
+
super().__init__(parent, **kwargs)
|
212
|
+
layout = qt.QVBoxLayout()
|
213
|
+
label = qt.QLabel(self)
|
214
|
+
|
215
|
+
pixmap, _ = TomwerConfig.splash_screen()
|
216
|
+
pixmap = pixmap.scaled(150, 150)
|
217
|
+
|
218
|
+
label.setPixmap(pixmap)
|
219
|
+
|
220
|
+
layout.addWidget(label, qt.Qt.AlignCenter)
|
221
|
+
|
222
|
+
text = ABOUT_TEMPLATE.format(
|
223
|
+
name=escape("tomwer"),
|
224
|
+
tomwer_version=escape(tomwer.version.version),
|
225
|
+
nabu_version=escape(nabu.version if has_nabu else "not installed"),
|
226
|
+
nxtomomill_version=escape(
|
227
|
+
nxtomomill.version.version if has_nxtomomill else "not installed"
|
228
|
+
),
|
229
|
+
)
|
230
|
+
text_label = qt.QLabel(text)
|
231
|
+
layout.addWidget(text_label, qt.Qt.AlignCenter)
|
232
|
+
|
233
|
+
buttons = qt.QDialogButtonBox(qt.QDialogButtonBox.Close, qt.Qt.Horizontal, self)
|
234
|
+
layout.addWidget(buttons)
|
235
|
+
buttons.rejected.connect(self.accept)
|
236
|
+
layout.setSizeConstraint(qt.QVBoxLayout.SetFixedSize)
|
237
|
+
self.setLayout(layout)
|
238
|
+
|
239
|
+
|
178
240
|
class OMain(_OMain):
|
179
241
|
config: TomwerConfig
|
180
242
|
DefaultConfig = "tomwer.app.canvas_launcher.config.TomwerConfig"
|