pymodaq 4.3.1__py3-none-any.whl → 4.3.3__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.

@@ -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=[self.settings.child('move_settings').saveState(),
363
- self.controller]))
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 = dict(curr_point=self.pid_module.curr_points_signal,
1124
- setpoint=self.pid_module.setpoints_signal,
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, get_module_name
5
- from pymodaq.utils import daq_utils as utils
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 pymodaq.utils.daq_utils import ThreadCommand
2
- from pymodaq.control_modules.move_utility_classes import DAQ_Move_base, comon_parameters_fun
3
- from easydict import EasyDict as edict
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 = 'whatever'
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 __init__(self, parent=None, params_state=None):
16
- super().__init__(parent, params_state)
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['emit_curr_points'].emit()
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
- try:
40
- self.status.update(edict(info="", controller=None, initialized=False))
41
- if self.settings.child('multiaxes', 'ismultiaxes').value() and self.settings.child('multiaxes',
42
- 'multi_status').value() == "Slave":
43
- if controller is None:
44
- raise Exception('no controller has been defined externally while this axe is a slave one')
45
- else:
46
- self.controller = controller
47
- else: # Master stage
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['setpoint'].emit({self.parent.title: self.target_position})
72
- self.poll_moving()
53
+ self.controller.setpoint.emit({self.parent.title: self.target_position})
73
54
 
74
- def move_Rel(self, position):
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['setpoint'].emit({self.parent.title: self.target_position})
61
+ self.controller.setpoint.emit({self.parent.title: self.target_position})
81
62
  self.poll_moving()
82
63
 
83
- def move_Home(self):
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):
@@ -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 = get_entrypoints(group='pymodaq.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/resources/VERSION CHANGED
@@ -1,2 +1,2 @@
1
- version = '4.3.1'
1
+ version = '4.3.3'
2
2
 
pymodaq/utils/config.py CHANGED
@@ -20,7 +20,7 @@ except:
20
20
  USER = 'unknown_user'
21
21
 
22
22
  CONFIG_BASE_PATH = Path(environ['PROGRAMDATA']) if sys.platform == 'win32' else \
23
- Path('Library/Application Support') if sys.platform == 'darwin' else Path('/etc')
23
+ Path('/Library/Application Support') if sys.platform == 'darwin' else Path('/etc')
24
24
 
25
25
 
26
26
  KeyType = TypeVar('KeyType')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pymodaq
3
- Version: 4.3.1
3
+ Version: 4.3.3
4
4
  Summary: Modular Data Acquisition with Python
5
5
  Project-URL: Homepage, http://pymodaq.cnrs.fr
6
6
  Project-URL: Source, https://github.com/PyMoDAQ/PyMoDAQ
@@ -1,9 +1,9 @@
1
1
  pymodaq/__init__.py,sha256=boHjxPnKEAQUmOHKbnxlI8DHP1eM5IKSrrnd1EqkvHg,4295
2
- pymodaq/dashboard.py,sha256=9SN2974L0FA-mUBWgAZ12aLzZmmFrQeUojdj3jstv44,64522
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=S5Mpiowv_8xxicOsQ4XhWBflt_5EmMMjBe2BLZbw8js,35348
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
@@ -44,10 +44,11 @@ pymodaq/extensions/utils.py,sha256=3cF3-7hVxYY1xxi0Kz-ck_yHcWyO5gAFFghf8Zo01Z8,2
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=YP5CemFZ54mFlFIhktct2SeOmkAuvxQm2y1Fiq5HiMQ,534
48
- pymodaq/extensions/pid/daq_move_PID.py,sha256=EiTJz4fLcjVL1UxnFREu2oZEz2nl-iL5xgxf83YG85M,3090
49
- pymodaq/extensions/pid/pid_controller.py,sha256=y0LTF_3N4mKEeRXyvgPycIy4FMPr-kRxLHgl1BV_YLc,28453
50
- pymodaq/extensions/pid/utils.py,sha256=KPSGlaiQsjH30GIN5Oy75OUFIgGTl8JU8dtHSR8JRjQ,7965
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=MPiZrA62gJB-c6KDylCIOlyEh88miLi2MF-z1S1WZ0M,19
61
+ pymodaq/resources/VERSION,sha256=h2mDwD22qdTOg_NB5mTHQmwKnwAsac6zW9EJQsTh1lQ,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
@@ -307,7 +308,7 @@ pymodaq/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
307
308
  pymodaq/utils/array_manipulation.py,sha256=uMdiVVR2mU7j6Z4DKL5VGhUPqiWvFX2YK7RLMGdLyC8,10415
308
309
  pymodaq/utils/calibration_camera.py,sha256=d3aAu0izXOdeLs-vyBaFfBuvyDGT3O-SreTuyd0Kvs4,8921
309
310
  pymodaq/utils/chrono_timer.py,sha256=rwX8apS8B-IKhA0Cp2H9tLz0BRN7G3Pg5ptozvd3MKM,7244
310
- pymodaq/utils/config.py,sha256=0QqoBJC4ECuIeh1UsvUQqhxkKl7Vfgi4iERp-6qNWAc,16202
311
+ pymodaq/utils/config.py,sha256=u-Q4af-tgXG7h8YitMGSPkigDxGoOYSEMHERQCF9mAM,16203
311
312
  pymodaq/utils/conftests.py,sha256=3Ak8WEpa3EhAp73Yb1LLq8YFONhPqiL7gG9eSDIoTNc,58
312
313
  pymodaq/utils/daq_utils.py,sha256=0jTrbT0aaZr3KaTgeDicmK9FbVnu3iaWBmNHnNJpr3A,28050
313
314
  pymodaq/utils/data.py,sha256=7m48jht2GOerMNszM5Pwvv5bdYHa3uTPc8UI2YQPmJE,110327
@@ -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.1.dist-info/METADATA,sha256=J2Ymeg9Ps2XPGb6ctDQtwmNMxG2Ntrsv0H9FdZ6zrsI,7657
441
- pymodaq-4.3.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
442
- pymodaq-4.3.1.dist-info/entry_points.txt,sha256=RAzdYNjvUT28I2eiCKki_g2NzXq0woWxhev6lwzwRv8,348
443
- pymodaq-4.3.1.dist-info/licenses/LICENSE,sha256=VKOejxexXAe3XwfhAhcFGqeXQ12irxVHdeAojZwFEI8,1108
444
- pymodaq-4.3.1.dist-info/RECORD,,
441
+ pymodaq-4.3.3.dist-info/METADATA,sha256=ZjjuzNivAsZ9brdqz0U2tfvQ-t4R6FqluEvXDNa7qpo,7657
442
+ pymodaq-4.3.3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
443
+ pymodaq-4.3.3.dist-info/entry_points.txt,sha256=RAzdYNjvUT28I2eiCKki_g2NzXq0woWxhev6lwzwRv8,348
444
+ pymodaq-4.3.3.dist-info/licenses/LICENSE,sha256=VKOejxexXAe3XwfhAhcFGqeXQ12irxVHdeAojZwFEI8,1108
445
+ pymodaq-4.3.3.dist-info/RECORD,,