pymmcore-plus 0.15.2__py3-none-any.whl → 0.15.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.
@@ -2541,6 +2541,13 @@ for name in (
2541
2541
  ).strip()
2542
2542
  )
2543
2543
 
2544
+ MMCORE_SIGNAL_NAMES = {n for n in dir(pymmcore.MMEventCallback) if n.startswith("on")}
2545
+ _SKIP = {
2546
+ "onImageSnapped",
2547
+ "onSequenceAcquisitionStopped",
2548
+ "onSequenceAcquisitionStarted",
2549
+ }
2550
+
2544
2551
 
2545
2552
  class _MMCallbackRelay(pymmcore.MMEventCallback):
2546
2553
  """Relays MMEventCallback methods to CMMCorePlus.signal."""
@@ -2551,6 +2558,11 @@ class _MMCallbackRelay(pymmcore.MMEventCallback):
2551
2558
 
2552
2559
  @staticmethod
2553
2560
  def make_reemitter(name: str) -> Callable[..., None]:
2561
+ # until we debug issues passing signals emitted on other threads into Qt,
2562
+ # we skip these signals (which already had their own pymmcore-plus emitters)
2563
+ if name in _SKIP:
2564
+ return lambda self, *args: None
2565
+
2554
2566
  sig_name = name[2].lower() + name[3:]
2555
2567
 
2556
2568
  def reemit(self: _MMCallbackRelay, *args: Any) -> None:
@@ -2564,7 +2576,6 @@ class _MMCallbackRelay(pymmcore.MMEventCallback):
2564
2576
  return reemit
2565
2577
 
2566
2578
 
2567
- MMCORE_SIGNAL_NAMES = {n for n in dir(pymmcore.MMEventCallback) if n.startswith("on")}
2568
2579
  MMCallbackRelay = type(
2569
2580
  "MMCallbackRelay",
2570
2581
  (_MMCallbackRelay,),
@@ -131,6 +131,9 @@ class PCoreSignaler(Protocol):
131
131
  """Emits `(name: str, newExposure: float)` when the exposure of the SLM device changes.""" # noqa: E501
132
132
  sLMExposureChanged: ClassVar[PSignal] # alias
133
133
 
134
+ shutterOpenChanged: ClassVar[PSignal]
135
+ """Emits `(name: str, isOpen: bool)` when the shutter open state has changed."""
136
+
134
137
  # added for CMMCorePlus
135
138
  configSet: ClassVar[PSignal]
136
139
  """Emits `(str, str)` when a config has been set.
@@ -24,6 +24,7 @@ class CMMCoreSignaler(SignalGroup, _DevicePropertyEventMixin):
24
24
  XYStagePositionChanged = Signal(str, float, float)
25
25
  exposureChanged = Signal(str, float)
26
26
  SLMExposureChanged = Signal(str, float)
27
+ shutterOpenChanged = Signal(str, bool)
27
28
 
28
29
  # https://github.com/micro-manager/mmCoreAndDevices/pull/659
29
30
  imageSnapped = Signal(str) # on snapImage()
@@ -25,6 +25,7 @@ class QCoreSignaler(QObject):
25
25
  exposureChanged = Signal(str, float)
26
26
  SLMExposureChanged = Signal(str, float)
27
27
  sLMExposureChanged = SLMExposureChanged # alias
28
+ shutterOpenChanged = Signal(str, bool)
28
29
 
29
30
  # https://github.com/micro-manager/mmCoreAndDevices/pull/659
30
31
  imageSnapped = Signal(str) # on snapImage()
pymmcore_plus/install.py CHANGED
@@ -68,6 +68,7 @@ DOWNLOADS_URL = f"{BASE_URL}/nightly/2.0/{plat}/"
68
68
  # generally running `mmcore install -r <some_date>` will bring in devices with
69
69
  # the NEW interface.
70
70
  INTERFACES: dict[int, str] = {
71
+ 74: "20250815",
71
72
  73: "20250318",
72
73
  72: "20250318",
73
74
  71: "20221031",
@@ -26,7 +26,7 @@ def _get_auto_MDA_callback_class() -> type[PMDASignaler]:
26
26
  return QMDASignaler
27
27
 
28
28
  # (not sure why this type ignore is needed... apparently isn't matching protocol)
29
- return MDASignaler # type: ignore
29
+ return MDASignaler
30
30
 
31
31
 
32
32
  def __dir__() -> list[str]: # pragma: no cover
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymmcore-plus
3
- Version: 0.15.2
3
+ Version: 0.15.4
4
4
  Summary: pymmcore superset providing improved APIs, event handling, and a pure python acquisition engine
5
5
  Project-URL: Source, https://github.com/pymmcore-plus/pymmcore-plus
6
6
  Project-URL: Tracker, https://github.com/pymmcore-plus/pymmcore-plus/issues
@@ -7,7 +7,7 @@ pymmcore_plus/_ipy_completion.py,sha256=K__bKTJZukzz0RhNr3KZ2urpQGxQrW8ySUQtHDoK
7
7
  pymmcore_plus/_logger.py,sha256=d7ldqxY0rGWORKdIzNUiFc9BW6cFBx57kHWtXyY1HE0,5416
8
8
  pymmcore_plus/_pymmcore.py,sha256=hy0gfEhvQ84o7SFIB2nQp6A1w2L4U7VQrV5_qKsJoLQ,699
9
9
  pymmcore_plus/_util.py,sha256=VGcb_nQu6BBWZsQihed0TrCHdTRADKlBo_qSnIbeF0Q,22814
10
- pymmcore_plus/install.py,sha256=U4TbQXbUc12aMtGRF_SkinNOTDCuuzIhME5Oup_4ds0,10768
10
+ pymmcore_plus/install.py,sha256=t05GmuxphIVkOr1CuFLAL6NmzL5ELWiXl7aivtQSoOo,10788
11
11
  pymmcore_plus/mocks.py,sha256=jNUfmffD1OArtIvEmqWsy7GCrtTpssVF03flH8cEYx8,1867
12
12
  pymmcore_plus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  pymmcore_plus/seq_tester.py,sha256=ielLx2ZUJrOXVCojk64UXTeKDoARxt8QkQjt5AE5Gng,3776
@@ -18,7 +18,7 @@ pymmcore_plus/core/_config_group.py,sha256=R-o4xuPDBPQAC3s-mFsiKwHVKWR38L9qq_aoW
18
18
  pymmcore_plus/core/_constants.py,sha256=tpXCn4CdhevGabUwOSvn7klMRoiXiVPmsPlAofL6Ai4,14122
19
19
  pymmcore_plus/core/_device.py,sha256=v58TcROSuvxE5ALBjzS474Dx430e0iMA61OuBSnc2rE,33197
20
20
  pymmcore_plus/core/_metadata.py,sha256=L8x1gX_zXPz02BUqc7eqJM_Bey2G0RyX30SOBs2aBNc,2755
21
- pymmcore_plus/core/_mmcore_plus.py,sha256=uNphVZdOqNIcvZpkyMVkekQhOKZlSJm6J01M2XZ3XHI,102486
21
+ pymmcore_plus/core/_mmcore_plus.py,sha256=_5d73MYRG4nOdyJkdL7BvFX8bDmWwbjfN5sCU_vxj8A,102842
22
22
  pymmcore_plus/core/_property.py,sha256=QsQEzqOAedR24zEJ1Ge4kwScfT_7NOApVcgz6QxBJrI,8265
23
23
  pymmcore_plus/core/_sequencing.py,sha256=pOydKOsHjQOlYGp51hrSjHz02s4NoSEzQwTTSh3R4_Q,16887
24
24
  pymmcore_plus/core/events/__init__.py,sha256=F8r10LEBLrAV8qfkXScSkpqfExdT2XoOx92OqSturpc,1078
@@ -26,9 +26,9 @@ pymmcore_plus/core/events/_deprecated.py,sha256=H_Sd63ZyV3Hkq8Imozi8OE7FIa_hhSRp
26
26
  pymmcore_plus/core/events/_device_signal_view.py,sha256=t-NfBdg3E4rms4vDFxkkR5XtrpLxaBT7mfPwkpIsbVk,1079
27
27
  pymmcore_plus/core/events/_norm_slot.py,sha256=8DCBoLHGh7cbB1OB19IJYwL6sFBFmkD8IakfBOvFbw8,2907
28
28
  pymmcore_plus/core/events/_prop_event_mixin.py,sha256=FvJJnpEKrOR-_Sp3-NNCwFoUUHwmNKiHruo0Y1vybsY,4042
29
- pymmcore_plus/core/events/_protocol.py,sha256=LSS2ns1XZqByB61nx_zdwMxqQuHmRj4BrbJ392f6Z30,8944
30
- pymmcore_plus/core/events/_psygnal.py,sha256=GZGLU-L9lE-l-_24ABKhT8_OUw0yvu9QxNIk6mAVwL8,2709
31
- pymmcore_plus/core/events/_qsignals.py,sha256=d1-J2ISo09JovLrZ6Tn3b5DHrmbRMbvqfFaH_Hsb0Os,4009
29
+ pymmcore_plus/core/events/_protocol.py,sha256=0EpuRrgbnG_abE8raixViU4QcJ59i2RWI7kwKIeZiBs,9072
30
+ pymmcore_plus/core/events/_psygnal.py,sha256=PogTZBA2Xd1PaKHtWpqkSqYOwRd4UM2XSHAHo7-UipI,2752
31
+ pymmcore_plus/core/events/_qsignals.py,sha256=aQfLz_E7E3gqE62KWmuyxekQB9N2rUZ9Dbd8c-TgV9U,4052
32
32
  pymmcore_plus/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  pymmcore_plus/experimental/unicore/__init__.py,sha256=2jjw8K3DZ8NSY5mFn4YBTrYp78Zc9EbGIZCiyG7PujQ,682
34
34
  pymmcore_plus/experimental/unicore/_device_manager.py,sha256=I0kbIsxxT3tyeeSElK4l4kUd16hbw81fJv3UZCQPW2Q,6423
@@ -50,7 +50,7 @@ pymmcore_plus/mda/_engine.py,sha256=U83PnmbaWChxUCEskKqHVy-Xa8KAZAMuvwPSVTAwsKg,
50
50
  pymmcore_plus/mda/_protocol.py,sha256=10CDJ9H57oX1z0oqK3eShXyQhufHvvu3_8wdaCYpPIg,3254
51
51
  pymmcore_plus/mda/_runner.py,sha256=NSOhpll6_WxDLO19FTs19dASJcHcOoVOCy7q_QzX_Ms,18523
52
52
  pymmcore_plus/mda/_thread_relay.py,sha256=Ww-9gyvLEzwRhnpL1dpze71wL7IRlhH8K3Q1dmJIxgs,6193
53
- pymmcore_plus/mda/events/__init__.py,sha256=v7YsVXzd3cTavFs2v3_PEhjqP4CtuRE0nWUoJA3CvYU,1176
53
+ pymmcore_plus/mda/events/__init__.py,sha256=Y3AermCe3megT48VMF9-6lGweAx1J13hAC_TZjvtw6M,1160
54
54
  pymmcore_plus/mda/events/_protocol.py,sha256=9xs9sRaCGtOQcAPChsB_NxXs4g8eaEKuJHBzNRRtiII,1739
55
55
  pymmcore_plus/mda/events/_psygnal.py,sha256=TdN1mFGpTPXmEs9iwFKSC1svv87PDZkT2JZvl0tEGrQ,640
56
56
  pymmcore_plus/mda/events/_qsignals.py,sha256=tULQg-e_NX197DxJXaWHn1zLJ-4tzc9QyOAnsobEDtA,554
@@ -74,8 +74,8 @@ pymmcore_plus/model/_device.py,sha256=AX3rO2gbY7AXJyMN3FfI_n2jl2V0IAPuBh7MiDA5Sq
74
74
  pymmcore_plus/model/_microscope.py,sha256=69VV6cuevinOK_LhYEkQygHGesvCZefdn9YNt3mV618,11353
75
75
  pymmcore_plus/model/_pixel_size_config.py,sha256=RXk8AAwARe8clsXue0GZfOTb1bxyXIsO0ibcDLHM4_s,3889
76
76
  pymmcore_plus/model/_property.py,sha256=NQzNtnEzSCR9ogwx1cfi8X-qbJ_cBSJKdSBAaoKoPQ0,3720
77
- pymmcore_plus-0.15.2.dist-info/METADATA,sha256=YxrpoW8j0NccoGNVcU8phM-vNTAQgh6jmm8US4pwCn4,8835
78
- pymmcore_plus-0.15.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
79
- pymmcore_plus-0.15.2.dist-info/entry_points.txt,sha256=NtFyndrQzBpUNJyil-8e5hMGke2utAf7mkGavTLcLOY,51
80
- pymmcore_plus-0.15.2.dist-info/licenses/LICENSE,sha256=OHJjRpOPKKRc7FEnpehNWdR5LRBdBhUtIFG-ZI0dCEA,1522
81
- pymmcore_plus-0.15.2.dist-info/RECORD,,
77
+ pymmcore_plus-0.15.4.dist-info/METADATA,sha256=-3XrqRBjgLgw1NqqiSnXjoLYIw0nteZgXIeOYpVl1Pg,8835
78
+ pymmcore_plus-0.15.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
79
+ pymmcore_plus-0.15.4.dist-info/entry_points.txt,sha256=NtFyndrQzBpUNJyil-8e5hMGke2utAf7mkGavTLcLOY,51
80
+ pymmcore_plus-0.15.4.dist-info/licenses/LICENSE,sha256=OHJjRpOPKKRc7FEnpehNWdR5LRBdBhUtIFG-ZI0dCEA,1522
81
+ pymmcore_plus-0.15.4.dist-info/RECORD,,