pymodaq 4.3.2__py3-none-any.whl → 4.3.4__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.
Potentially problematic release.
This version of pymodaq might be problematic. Click here for more details.
- pymodaq/control_modules/daq_move.py +22 -2
- pymodaq/dashboard.py +7 -5
- pymodaq/extensions/pid/__init__.py +2 -2
- pymodaq/extensions/pid/actuator_controller.py +13 -0
- pymodaq/extensions/pid/daq_move_PID.py +25 -44
- pymodaq/extensions/pid/pid_controller.py +4 -2
- pymodaq/extensions/pid/utils.py +3 -2
- pymodaq/extensions/utils.py +12 -8
- pymodaq/resources/VERSION +1 -1
- {pymodaq-4.3.2.dist-info → pymodaq-4.3.4.dist-info}/METADATA +1 -1
- {pymodaq-4.3.2.dist-info → pymodaq-4.3.4.dist-info}/RECORD +14 -13
- {pymodaq-4.3.2.dist-info → pymodaq-4.3.4.dist-info}/WHEEL +0 -0
- {pymodaq-4.3.2.dist-info → pymodaq-4.3.4.dist-info}/entry_points.txt +0 -0
- {pymodaq-4.3.2.dist-info → pymodaq-4.3.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -172,6 +172,20 @@ class DAQ_Move(ParameterControlModule):
|
|
|
172
172
|
elif cmd.command == 'rel_value':
|
|
173
173
|
self._relative_value = cmd.attribute
|
|
174
174
|
|
|
175
|
+
@property
|
|
176
|
+
def master(self) -> bool:
|
|
177
|
+
""" Get/Set programmaticaly the Master/Slave status of an actuator"""
|
|
178
|
+
if self.initialized_state:
|
|
179
|
+
return self.settings['move_settings', 'multiaxes', 'multi_status'] == 'Master'
|
|
180
|
+
else:
|
|
181
|
+
return True
|
|
182
|
+
|
|
183
|
+
@master.setter
|
|
184
|
+
def master(self, is_master: bool):
|
|
185
|
+
if self.initialized_state:
|
|
186
|
+
self.settings.child('move_settings', 'multiaxes', 'multi_status').setValue(
|
|
187
|
+
'Master' if is_master else 'Slave')
|
|
188
|
+
|
|
175
189
|
def append_data(self, dte: Optional[DataToExport] = None, where: Union[Node, str, None] = None):
|
|
176
190
|
"""Appends current DataToExport to an ActuatorEnlargeableSaver
|
|
177
191
|
|
|
@@ -359,8 +373,9 @@ class DAQ_Move(ParameterControlModule):
|
|
|
359
373
|
self._hardware_thread.hardware = hardware
|
|
360
374
|
self._hardware_thread.start()
|
|
361
375
|
self.command_hardware.emit(
|
|
362
|
-
ThreadCommand(command="ini_stage", attribute=[
|
|
363
|
-
|
|
376
|
+
ThreadCommand(command="ini_stage", attribute=[
|
|
377
|
+
self.settings.child('move_settings').saveState(),
|
|
378
|
+
self.controller]))
|
|
364
379
|
except Exception as e:
|
|
365
380
|
self.logger.exception(str(e))
|
|
366
381
|
|
|
@@ -546,6 +561,11 @@ class DAQ_Move(ParameterControlModule):
|
|
|
546
561
|
else:
|
|
547
562
|
raise ActuatorError(f'{act_type} is an invalid actuator, should be within {ACTUATOR_TYPES}')
|
|
548
563
|
|
|
564
|
+
@property
|
|
565
|
+
def actuators(self) -> List[str]:
|
|
566
|
+
""" Get the list of possible actuators"""
|
|
567
|
+
return ACTUATOR_TYPES
|
|
568
|
+
|
|
549
569
|
def update_plugin_config(self):
|
|
550
570
|
parent_module = utils.find_dict_in_list_from_key_val(DAQ_Move_Actuators, 'name', self.actuator)
|
|
551
571
|
mod = import_module(parent_module['module'].__package__.split('.')[0])
|
pymodaq/dashboard.py
CHANGED
|
@@ -8,6 +8,9 @@ import logging
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from importlib import import_module
|
|
10
10
|
from packaging import version as version_mod
|
|
11
|
+
from typing import Tuple, List
|
|
12
|
+
|
|
13
|
+
|
|
11
14
|
from qtpy import QtGui, QtWidgets, QtCore
|
|
12
15
|
from qtpy.QtCore import Qt, QObject, Slot, QThread, Signal
|
|
13
16
|
from time import perf_counter
|
|
@@ -32,7 +35,7 @@ from pymodaq.utils.parameter import ParameterTree, Parameter
|
|
|
32
35
|
from pymodaq.utils.leco.utils import start_coordinator
|
|
33
36
|
from pymodaq.control_modules.daq_move import DAQ_Move
|
|
34
37
|
from pymodaq.control_modules.daq_viewer import DAQ_Viewer
|
|
35
|
-
|
|
38
|
+
from pymodaq.extensions.pid.actuator_controller import PIDController
|
|
36
39
|
from pymodaq import extensions as extmod
|
|
37
40
|
|
|
38
41
|
from pymodaq_plugin_manager.manager import PluginManager
|
|
@@ -666,7 +669,7 @@ class DashBoard(QObject):
|
|
|
666
669
|
|
|
667
670
|
detector_modules.append(det_mod_tmp)
|
|
668
671
|
|
|
669
|
-
def set_file_preset(self, filename):
|
|
672
|
+
def set_file_preset(self, filename) -> Tuple[List[DAQ_Move], List[DAQ_Viewer]]:
|
|
670
673
|
"""
|
|
671
674
|
Set a file managers from the converted xml file given by the filename parameter.
|
|
672
675
|
|
|
@@ -1120,9 +1123,8 @@ class DashBoard(QObject):
|
|
|
1120
1123
|
self.preset_manager.preset_params.child('pid_models').value())['class']
|
|
1121
1124
|
for setp in model_class.setpoints_names:
|
|
1122
1125
|
self.add_move(setp, None, 'PID', [], [], actuators_modules)
|
|
1123
|
-
actuators_modules[-1].controller =
|
|
1124
|
-
|
|
1125
|
-
emit_curr_points=self.pid_module.emit_curr_points_sig)
|
|
1126
|
+
actuators_modules[-1].controller = PIDController(self.pid_module)
|
|
1127
|
+
actuators_modules[-1].master = False
|
|
1126
1128
|
actuators_modules[-1].init_hardware_ui()
|
|
1127
1129
|
QtWidgets.QApplication.processEvents()
|
|
1128
1130
|
self.poll_init(actuators_modules[-1])
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import importlib
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
|
-
from pymodaq.utils.logger import set_logger
|
|
5
|
-
|
|
4
|
+
from pymodaq.utils.logger import set_logger
|
|
5
|
+
|
|
6
6
|
logger = set_logger('move_plugins', add_to_console=False)
|
|
7
7
|
|
|
8
8
|
for path in Path(__file__).parent.iterdir():
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING
|
|
2
|
+
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
from .pid_controller import DAQ_PID
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PIDController:
|
|
8
|
+
""" Fake controller object for the DAQ_Move_PID"""
|
|
9
|
+
|
|
10
|
+
def __init__(self, daq_pid: 'DAQ_PID'):
|
|
11
|
+
self.curr_point = daq_pid.curr_points_signal
|
|
12
|
+
self.setpoint = daq_pid.setpoints_signal
|
|
13
|
+
self.emit_curr_points = daq_pid.emit_curr_points_sig
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from
|
|
1
|
+
from pymodaq_utils.utils import ThreadCommand
|
|
2
|
+
|
|
3
|
+
from pymodaq.control_modules.move_utility_classes import (DAQ_Move_base, comon_parameters_fun,
|
|
4
|
+
DataActuatorType, DataActuator)
|
|
5
|
+
|
|
6
|
+
from pymodaq.extensions.pid.actuator_controller import PIDController
|
|
4
7
|
|
|
5
8
|
|
|
6
9
|
class DAQ_Move_PID(DAQ_Move_base):
|
|
7
10
|
"""
|
|
8
11
|
"""
|
|
9
|
-
_controller_units = '
|
|
12
|
+
_controller_units = ''
|
|
13
|
+
data_actuator_type = DataActuatorType.DataActuator
|
|
10
14
|
is_multiaxes = True
|
|
11
15
|
stage_names = []
|
|
12
16
|
|
|
13
17
|
params = comon_parameters_fun(is_multiaxes, stage_names, master=False)
|
|
14
18
|
|
|
15
|
-
def
|
|
16
|
-
|
|
19
|
+
def ini_attributes(self):
|
|
20
|
+
self.controller: PIDController = None
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
def update_position(self, dict_val):
|
|
22
|
+
def update_position(self, dict_val: dict):
|
|
20
23
|
self.current_value = dict_val[self.parent.title]
|
|
21
24
|
|
|
22
25
|
def get_actuator_value(self):
|
|
23
|
-
self.controller
|
|
26
|
+
self.controller.emit_curr_points.emit()
|
|
24
27
|
pos = self.current_value
|
|
25
|
-
#
|
|
26
|
-
# pos = self.get_position_with_scaling(pos)
|
|
27
|
-
# self.current_value = pos
|
|
28
28
|
return pos
|
|
29
29
|
|
|
30
30
|
def close(self):
|
|
@@ -36,51 +36,32 @@ class DAQ_Move_PID(DAQ_Move_base):
|
|
|
36
36
|
def ini_stage(self, controller=None):
|
|
37
37
|
"""
|
|
38
38
|
"""
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
self.controller = None # any object that will control the stages
|
|
49
|
-
|
|
50
|
-
self.controller['curr_point'].connect(self.update_position)
|
|
51
|
-
|
|
52
|
-
info = "PID stage"
|
|
53
|
-
self.status.info = info
|
|
54
|
-
self.status.controller = self.controller
|
|
55
|
-
self.status.initialized = True
|
|
56
|
-
return self.status.info, self.status.initialized
|
|
57
|
-
|
|
58
|
-
except Exception as e:
|
|
59
|
-
self.status.info = str(e)
|
|
60
|
-
self.status.initialized = False
|
|
61
|
-
return self.status
|
|
62
|
-
|
|
63
|
-
def move_Abs(self, position):
|
|
39
|
+
self.ini_stage_init(controller, None)
|
|
40
|
+
|
|
41
|
+
self.controller.curr_point.connect(self.update_position)
|
|
42
|
+
|
|
43
|
+
info = "PID stage"
|
|
44
|
+
initialized = True
|
|
45
|
+
return info, initialized
|
|
46
|
+
|
|
47
|
+
def move_abs(self, position: DataActuator):
|
|
64
48
|
"""
|
|
65
49
|
"""
|
|
66
50
|
position = self.check_bound(position)
|
|
67
|
-
# position=self.set_position_with_scaling(position)
|
|
68
|
-
# print(position)
|
|
69
51
|
self.target_position = position
|
|
70
52
|
|
|
71
|
-
self.controller
|
|
72
|
-
self.poll_moving()
|
|
53
|
+
self.controller.setpoint.emit({self.parent.title: self.target_position})
|
|
73
54
|
|
|
74
|
-
def
|
|
55
|
+
def move_rel(self, position: DataActuator):
|
|
75
56
|
"""
|
|
76
57
|
"""
|
|
77
58
|
position = self.check_bound(self.current_value + position) - self.current_value
|
|
78
59
|
self.target_position = position + self.current_value
|
|
79
60
|
|
|
80
|
-
self.controller
|
|
61
|
+
self.controller.setpoint.emit({self.parent.title: self.target_position})
|
|
81
62
|
self.poll_moving()
|
|
82
63
|
|
|
83
|
-
def
|
|
64
|
+
def move_home(self):
|
|
84
65
|
"""
|
|
85
66
|
"""
|
|
86
67
|
self.emit_status(ThreadCommand('Update_Status', ['Move Home not implemented']))
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import time
|
|
2
2
|
from functools import partial # needed for the button to sync setpoint with currpoint
|
|
3
|
+
from typing import Dict
|
|
4
|
+
|
|
3
5
|
import numpy as np
|
|
4
6
|
|
|
5
7
|
from pyqtgraph.widgets.SpinBox import SpinBox
|
|
@@ -365,10 +367,10 @@ class DAQ_PID(CustomApp):
|
|
|
365
367
|
for ind, sp in enumerate(self.setpoints_sb):
|
|
366
368
|
sp.setValue(values[ind])
|
|
367
369
|
|
|
368
|
-
def setpoints_external(self, values_dict):
|
|
370
|
+
def setpoints_external(self, values_dict: Dict[str, DataActuator]):
|
|
369
371
|
for key in values_dict:
|
|
370
372
|
index = self.model_class.setpoints_names.index(key)
|
|
371
|
-
self.setpoints_sb[index].setValue(values_dict[key])
|
|
373
|
+
self.setpoints_sb[index].setValue(values_dict[key].value())
|
|
372
374
|
|
|
373
375
|
@property
|
|
374
376
|
def curr_points(self):
|
pymodaq/extensions/pid/utils.py
CHANGED
|
@@ -22,6 +22,7 @@ DAQ_2DViewer_Det_types = get_plugins('daq_2Dviewer')
|
|
|
22
22
|
DAQ_NDViewer_Det_types = get_plugins('daq_NDviewer')
|
|
23
23
|
|
|
24
24
|
|
|
25
|
+
|
|
25
26
|
class DataToActuatorPID(DataToActuators):
|
|
26
27
|
|
|
27
28
|
def __init__(self, *args, **kwargs):
|
|
@@ -176,8 +177,8 @@ def get_models(model_name=None):
|
|
|
176
177
|
"""
|
|
177
178
|
from pymodaq.extensions.pid.utils import PIDModelGeneric
|
|
178
179
|
models_import = []
|
|
179
|
-
discovered_models = get_entrypoints(group='pymodaq.pid_models')
|
|
180
|
-
discovered_models
|
|
180
|
+
discovered_models = list(get_entrypoints(group='pymodaq.pid_models'))
|
|
181
|
+
discovered_models.extend(list(get_entrypoints(group='pymodaq.models')))
|
|
181
182
|
if len(discovered_models) > 0:
|
|
182
183
|
for pkg in discovered_models:
|
|
183
184
|
try:
|
pymodaq/extensions/utils.py
CHANGED
|
@@ -45,14 +45,18 @@ def get_extensions():
|
|
|
45
45
|
module = importlib.import_module(pkg.value)
|
|
46
46
|
modules = get_ext_modules(Path(module.__path__[0]).joinpath('extensions'))
|
|
47
47
|
for mod in modules:
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
48
|
+
try:
|
|
49
|
+
mod_in = importlib.import_module(f'{pkg.value}.extensions.{mod}')
|
|
50
|
+
if hasattr(mod_in, 'EXTENSION_NAME'):
|
|
51
|
+
extension_import.append({'pkg': pkg.value, 'module': mod,
|
|
52
|
+
'name': mod_in.EXTENSION_NAME,
|
|
53
|
+
'class_name': mod_in.CLASS_NAME})
|
|
54
|
+
|
|
55
|
+
except Exception as e: # pragma: no cover
|
|
56
|
+
logger.warning(f'Impossible to import the {pkg.value}.extensions.{mod} extension: '
|
|
57
|
+
f'{str(e)}')
|
|
58
|
+
except Exception as e:
|
|
59
|
+
logger.warning(f'Impossible to import the {pkg.value} package: '
|
|
56
60
|
f'{str(e)}')
|
|
57
61
|
|
|
58
62
|
return extension_import
|
pymodaq/resources/VERSION
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
version = '4.3.
|
|
1
|
+
version = '4.3.4'
|
|
2
2
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
pymodaq/__init__.py,sha256=boHjxPnKEAQUmOHKbnxlI8DHP1eM5IKSrrnd1EqkvHg,4295
|
|
2
|
-
pymodaq/dashboard.py,sha256=
|
|
2
|
+
pymodaq/dashboard.py,sha256=4fbV92erom0yWwqPMtx3KW1q-d6QYflV-EhOZMg24a4,64476
|
|
3
3
|
pymodaq/icon.ico,sha256=hOHHfNDENKphQvG1WDleSEYcHukneR2eRFJu8isIlD4,74359
|
|
4
4
|
pymodaq/splash.png,sha256=ow8IECF3tPRUMA4tf2tMu1aRiMaxx91_Y2ckVxkrmF0,53114
|
|
5
5
|
pymodaq/control_modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
pymodaq/control_modules/daq_move.py,sha256
|
|
6
|
+
pymodaq/control_modules/daq_move.py,sha256=-ipGtKrkeB_eaMfdDVHDFu86J5By_pHO8Z5axOkC_tY,35985
|
|
7
7
|
pymodaq/control_modules/daq_move_ui.py,sha256=euA8_utFfiscd9ahZxRTqqTiCSrNB4CKCLqgdbUKSlI,15307
|
|
8
8
|
pymodaq/control_modules/daq_viewer.py,sha256=5CYmdWHGE7sQApeMfdWNV3zbPyoxxYtzFlQ1PaEw4fI,57883
|
|
9
9
|
pymodaq/control_modules/daq_viewer_ui.py,sha256=FWP3jdIOR9vTgYqNaaodteGZ3dwgQ1GdWKrOpOAuSrs,15693
|
|
@@ -40,14 +40,15 @@ pymodaq/extensions/daq_logger.py,sha256=hEAb98fv1qJxcH9NPvaiLp1SPWkBVBwpujJhuyAi
|
|
|
40
40
|
pymodaq/extensions/daq_scan.py,sha256=CGBPrhLRHPmFJunKQ1aK5RgToXemzNEPdYSHn7e36DE,49414
|
|
41
41
|
pymodaq/extensions/daq_scan_ui.py,sha256=bYJaWBLQMl2Yu1PAxc-bCldh4keWXd6l12ttrHqExE0,10181
|
|
42
42
|
pymodaq/extensions/h5browser.py,sha256=eQZ8YhPHdiBCyHIn1JJJLn7OgZsc1XlcETgqdafofZs,1140
|
|
43
|
-
pymodaq/extensions/utils.py,sha256=
|
|
43
|
+
pymodaq/extensions/utils.py,sha256=sh4SxJx5_lGJ6aJE8p8VJ2zrptW8pyze73aT_52xOwQ,2255
|
|
44
44
|
pymodaq/extensions/bayesian/__init__.py,sha256=QMV9tq8Axi6YjoGj4UguBO8Zvuh26r5s91bm6YU7Itk,55
|
|
45
45
|
pymodaq/extensions/bayesian/bayesian_optimisation.py,sha256=zB6DoyHx6nsKHsl3G4T0Hsw8npl80gdEIwvNfx4DCrU,30033
|
|
46
46
|
pymodaq/extensions/bayesian/utils.py,sha256=1m_NpYMr-Swg2ImtMvbh-XOxutkAVwc0M2BWeK_NMIg,15544
|
|
47
|
-
pymodaq/extensions/pid/__init__.py,sha256=
|
|
48
|
-
pymodaq/extensions/pid/
|
|
49
|
-
pymodaq/extensions/pid/
|
|
50
|
-
pymodaq/extensions/pid/
|
|
47
|
+
pymodaq/extensions/pid/__init__.py,sha256=jm4axOgTnYVPsftjcjlvC_07KsdTY1H7CnOCYhOvY-o,473
|
|
48
|
+
pymodaq/extensions/pid/actuator_controller.py,sha256=SOE2GjevbqxqxXewW0DMgoqNL_0CaPdNLjyKNc6ULKI,377
|
|
49
|
+
pymodaq/extensions/pid/daq_move_PID.py,sha256=kqWAnYbhSMtrqu4cK1AtOuBD0UjPlrAFl-uB39ToPts,2151
|
|
50
|
+
pymodaq/extensions/pid/pid_controller.py,sha256=5iTEiv69MlHW7-sUFCzvQlqZzAoXiJ_mRQtFntvFBIE,28511
|
|
51
|
+
pymodaq/extensions/pid/utils.py,sha256=pxexKSg-3a1CWLQtCFZR6ZtdI8NY1Yl7J87aSBi2q2o,7984
|
|
51
52
|
pymodaq/post_treatment/__init__.py,sha256=xaaLFZJ7OLqI_7yPurFk89A7m2ywSbYDXAsdE-QQ8Zg,81
|
|
52
53
|
pymodaq/post_treatment/load_and_plot.py,sha256=UZaAMrC3b9VXcsZsjc3-7LxxUEuia_5ECUqDB7G_EoM,12140
|
|
53
54
|
pymodaq/post_treatment/process_to_scalar.py,sha256=NHntybqpDhDjQJ224Dhf9Ij_ql-fAEMRT6egA6UEGfA,11568
|
|
@@ -57,7 +58,7 @@ pymodaq/post_treatment/daq_measurement/daq_measurement_GUI.py,sha256=1u7hWDaiwsZ
|
|
|
57
58
|
pymodaq/post_treatment/daq_measurement/daq_measurement_GUI.ui,sha256=PyzbCWPMkh5oIYYteZczXyWMeHKW9EJmM1QlzXhnyTk,7037
|
|
58
59
|
pymodaq/post_treatment/daq_measurement/daq_measurement_main.py,sha256=CAKwcWMOD86aXB8mbdxOK7e8nZRos5d59FzDtqK1QoY,17093
|
|
59
60
|
pymodaq/post_treatment/daq_measurement/process_from_QtDesigner_DAQ_Measurement_GUI.bat,sha256=e1tu2A67MS9fk3jhriF6saQgRxWIucIvNW92iWXFP6E,164
|
|
60
|
-
pymodaq/resources/VERSION,sha256=
|
|
61
|
+
pymodaq/resources/VERSION,sha256=AL4m0CftoqyTIE2ogy_Wi8qZkqsOSNw3VNWln1U1P4A,19
|
|
61
62
|
pymodaq/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
62
63
|
pymodaq/resources/config_template.toml,sha256=d3pofgIK5FxaRMELAI1qEsRcMD3GlYd87zZjDj9G9m0,3210
|
|
63
64
|
pymodaq/resources/preset_default.xml,sha256=Dt8iWLwPPOPtcG00JCVP-mh-G7KC6B0YN8hd8RQdnNI,27256
|
|
@@ -437,8 +438,8 @@ pymodaq/utils/tcp_ip/__init__.py,sha256=1e_EK0AgvdoLAD_CSGGEaITZdy6OWCO7ih9IAIp7
|
|
|
437
438
|
pymodaq/utils/tcp_ip/mysocket.py,sha256=StAWj8dzHeMnbLj68Sel81uWFy-YkKVNRnVf7gXrESI,3452
|
|
438
439
|
pymodaq/utils/tcp_ip/serializer.py,sha256=oTQ24JNln_vRX4YADitTYiJplwFIdsta1ZDp6TOGMCA,27562
|
|
439
440
|
pymodaq/utils/tcp_ip/tcp_server_client.py,sha256=xIMTNgVW_rKK0yTi4FDNFLf85-Akb27Jz2LdrvOrP68,30660
|
|
440
|
-
pymodaq-4.3.
|
|
441
|
-
pymodaq-4.3.
|
|
442
|
-
pymodaq-4.3.
|
|
443
|
-
pymodaq-4.3.
|
|
444
|
-
pymodaq-4.3.
|
|
441
|
+
pymodaq-4.3.4.dist-info/METADATA,sha256=gm5Fngee-a_FaJlJKKTtjEy8u1rlwxWHTiGBZgTvaRU,7657
|
|
442
|
+
pymodaq-4.3.4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
443
|
+
pymodaq-4.3.4.dist-info/entry_points.txt,sha256=RAzdYNjvUT28I2eiCKki_g2NzXq0woWxhev6lwzwRv8,348
|
|
444
|
+
pymodaq-4.3.4.dist-info/licenses/LICENSE,sha256=VKOejxexXAe3XwfhAhcFGqeXQ12irxVHdeAojZwFEI8,1108
|
|
445
|
+
pymodaq-4.3.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|