setiastrosuitepro 1.6.4__py3-none-any.whl → 1.6.12__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 setiastrosuitepro might be problematic. Click here for more details.

Files changed (115) hide show
  1. setiastro/images/abeicon.svg +16 -0
  2. setiastro/images/acv_icon.png +0 -0
  3. setiastro/images/colorwheel.svg +97 -0
  4. setiastro/images/cosmic.svg +40 -0
  5. setiastro/images/cosmicsat.svg +24 -0
  6. setiastro/images/first_quarter.png +0 -0
  7. setiastro/images/full_moon.png +0 -0
  8. setiastro/images/graxpert.svg +19 -0
  9. setiastro/images/last_quarter.png +0 -0
  10. setiastro/images/linearfit.svg +32 -0
  11. setiastro/images/new_moon.png +0 -0
  12. setiastro/images/pixelmath.svg +42 -0
  13. setiastro/images/waning_crescent_1.png +0 -0
  14. setiastro/images/waning_crescent_2.png +0 -0
  15. setiastro/images/waning_crescent_3.png +0 -0
  16. setiastro/images/waning_crescent_4.png +0 -0
  17. setiastro/images/waning_crescent_5.png +0 -0
  18. setiastro/images/waning_gibbous_1.png +0 -0
  19. setiastro/images/waning_gibbous_2.png +0 -0
  20. setiastro/images/waning_gibbous_3.png +0 -0
  21. setiastro/images/waning_gibbous_4.png +0 -0
  22. setiastro/images/waning_gibbous_5.png +0 -0
  23. setiastro/images/waxing_crescent_1.png +0 -0
  24. setiastro/images/waxing_crescent_2.png +0 -0
  25. setiastro/images/waxing_crescent_3.png +0 -0
  26. setiastro/images/waxing_crescent_4.png +0 -0
  27. setiastro/images/waxing_crescent_5.png +0 -0
  28. setiastro/images/waxing_gibbous_1.png +0 -0
  29. setiastro/images/waxing_gibbous_2.png +0 -0
  30. setiastro/images/waxing_gibbous_3.png +0 -0
  31. setiastro/images/waxing_gibbous_4.png +0 -0
  32. setiastro/images/waxing_gibbous_5.png +0 -0
  33. setiastro/qml/ResourceMonitor.qml +84 -82
  34. setiastro/saspro/__main__.py +20 -1
  35. setiastro/saspro/_generated/build_info.py +2 -2
  36. setiastro/saspro/abe.py +37 -4
  37. setiastro/saspro/aberration_ai.py +237 -21
  38. setiastro/saspro/acv_exporter.py +379 -0
  39. setiastro/saspro/add_stars.py +33 -6
  40. setiastro/saspro/backgroundneutral.py +108 -40
  41. setiastro/saspro/blemish_blaster.py +4 -1
  42. setiastro/saspro/blink_comparator_pro.py +74 -24
  43. setiastro/saspro/clahe.py +4 -1
  44. setiastro/saspro/continuum_subtract.py +4 -1
  45. setiastro/saspro/convo.py +13 -7
  46. setiastro/saspro/cosmicclarity.py +129 -18
  47. setiastro/saspro/crop_dialog_pro.py +123 -7
  48. setiastro/saspro/curve_editor_pro.py +109 -42
  49. setiastro/saspro/doc_manager.py +245 -15
  50. setiastro/saspro/exoplanet_detector.py +120 -28
  51. setiastro/saspro/frequency_separation.py +1158 -204
  52. setiastro/saspro/ghs_dialog_pro.py +81 -16
  53. setiastro/saspro/graxpert.py +1 -0
  54. setiastro/saspro/gui/main_window.py +429 -228
  55. setiastro/saspro/gui/mixins/dock_mixin.py +245 -24
  56. setiastro/saspro/gui/mixins/menu_mixin.py +27 -1
  57. setiastro/saspro/gui/mixins/theme_mixin.py +160 -14
  58. setiastro/saspro/gui/mixins/toolbar_mixin.py +384 -18
  59. setiastro/saspro/gui/mixins/update_mixin.py +138 -36
  60. setiastro/saspro/gui/mixins/view_mixin.py +42 -0
  61. setiastro/saspro/halobgon.py +4 -0
  62. setiastro/saspro/histogram.py +5 -1
  63. setiastro/saspro/image_combine.py +4 -0
  64. setiastro/saspro/image_peeker_pro.py +4 -0
  65. setiastro/saspro/imageops/starbasedwhitebalance.py +23 -52
  66. setiastro/saspro/imageops/stretch.py +582 -62
  67. setiastro/saspro/isophote.py +4 -0
  68. setiastro/saspro/layers.py +13 -9
  69. setiastro/saspro/layers_dock.py +183 -3
  70. setiastro/saspro/legacy/image_manager.py +154 -20
  71. setiastro/saspro/legacy/numba_utils.py +67 -47
  72. setiastro/saspro/legacy/xisf.py +240 -98
  73. setiastro/saspro/live_stacking.py +180 -79
  74. setiastro/saspro/luminancerecombine.py +228 -27
  75. setiastro/saspro/mask_creation.py +174 -15
  76. setiastro/saspro/mfdeconv.py +113 -35
  77. setiastro/saspro/mfdeconvcudnn.py +119 -70
  78. setiastro/saspro/mfdeconvsport.py +112 -35
  79. setiastro/saspro/morphology.py +4 -0
  80. setiastro/saspro/multiscale_decomp.py +51 -12
  81. setiastro/saspro/numba_utils.py +72 -57
  82. setiastro/saspro/ops/commands.py +18 -18
  83. setiastro/saspro/ops/script_editor.py +10 -2
  84. setiastro/saspro/ops/scripts.py +122 -0
  85. setiastro/saspro/perfect_palette_picker.py +37 -3
  86. setiastro/saspro/plate_solver.py +84 -49
  87. setiastro/saspro/psf_viewer.py +119 -37
  88. setiastro/saspro/resources.py +67 -0
  89. setiastro/saspro/rgbalign.py +4 -0
  90. setiastro/saspro/selective_color.py +4 -1
  91. setiastro/saspro/sfcc.py +364 -152
  92. setiastro/saspro/shortcuts.py +160 -29
  93. setiastro/saspro/signature_insert.py +692 -33
  94. setiastro/saspro/stacking_suite.py +1331 -484
  95. setiastro/saspro/star_alignment.py +247 -123
  96. setiastro/saspro/star_spikes.py +4 -0
  97. setiastro/saspro/star_stretch.py +38 -3
  98. setiastro/saspro/stat_stretch.py +743 -128
  99. setiastro/saspro/subwindow.py +786 -360
  100. setiastro/saspro/supernovaasteroidhunter.py +1 -1
  101. setiastro/saspro/wavescale_hdr.py +4 -1
  102. setiastro/saspro/wavescalede.py +4 -1
  103. setiastro/saspro/whitebalance.py +84 -12
  104. setiastro/saspro/widgets/common_utilities.py +28 -21
  105. setiastro/saspro/widgets/resource_monitor.py +109 -59
  106. setiastro/saspro/widgets/spinboxes.py +10 -13
  107. setiastro/saspro/wimi.py +27 -656
  108. setiastro/saspro/wims.py +13 -3
  109. setiastro/saspro/xisf.py +101 -11
  110. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.12.dist-info}/METADATA +2 -1
  111. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.12.dist-info}/RECORD +115 -82
  112. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.12.dist-info}/WHEEL +0 -0
  113. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.12.dist-info}/entry_points.txt +0 -0
  114. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.12.dist-info}/licenses/LICENSE +0 -0
  115. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.12.dist-info}/licenses/license.txt +0 -0
@@ -27,6 +27,10 @@ class GhsDialogPro(QDialog):
27
27
  self.setWindowFlag(Qt.WindowType.Window, True)
28
28
  self.setWindowModality(Qt.WindowModality.NonModal)
29
29
  self.setModal(False)
30
+ try:
31
+ self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True)
32
+ except Exception:
33
+ pass # older PyQt6 versions
30
34
  self.doc = document
31
35
  self._preview_img = None
32
36
  self._full_img = None
@@ -123,14 +127,16 @@ class GhsDialogPro(QDialog):
123
127
  main.addLayout(right, 1)
124
128
 
125
129
  # ---------- wiring ----------
126
- self.editor.setPreviewCallback(lambda _lut8: self._quick_preview())
130
+ self._suppress_editor_preview = False
131
+ self.editor.setPreviewCallback(lambda _lut8: self._on_editor_preview())
127
132
  self.editor.setSymmetryCallback(self._on_symmetry_pick)
128
133
 
129
- self.sA.valueChanged.connect(self._rebuild_from_params)
130
- self.sB.valueChanged.connect(self._rebuild_from_params)
131
- self.sG.valueChanged.connect(self._rebuild_from_params)
132
- self.sLP.valueChanged.connect(self._rebuild_from_params)
133
- self.sHP.valueChanged.connect(self._rebuild_from_params)
134
+ for s in (self.sA, self.sB, self.sG, self.sLP, self.sHP):
135
+ s.valueChanged.connect(self._schedule_rebuild_from_params)
136
+
137
+ # Track dragging so we can “flush” on release
138
+ s.sliderPressed.connect(self._on_any_slider_pressed)
139
+ s.sliderReleased.connect(self._on_any_slider_released)
134
140
  self.cmb_ch.currentTextChanged.connect(self._recolor_curve)
135
141
 
136
142
  self.btn_apply.clicked.connect(self._apply)
@@ -148,6 +154,12 @@ class GhsDialogPro(QDialog):
148
154
  # start with Fit to Preview (avoids offset issues)
149
155
  QTimer.singleShot(0, self._fit)
150
156
 
157
+ self._rebuild_debounce = QTimer(self)
158
+ self._rebuild_debounce.setSingleShot(True)
159
+ self._rebuild_debounce.setInterval(75) # 50–120ms feels good; 75 is a nice default
160
+ self._rebuild_debounce.timeout.connect(self._rebuild_from_params_now)
161
+
162
+ self._slider_dragging = False
151
163
 
152
164
  # first curve
153
165
  self._rebuild_from_params()
@@ -194,12 +206,53 @@ class GhsDialogPro(QDialog):
194
206
  self.editor.setSymmetryPoint(u * 360.0, 0.0)
195
207
  self._rebuild_from_params()
196
208
 
209
+ def _on_editor_preview(self):
210
+ if getattr(self, "_suppress_editor_preview", False):
211
+ return
212
+ self._quick_preview()
213
+
214
+ def _on_any_slider_pressed(self):
215
+ self._slider_dragging = True
216
+
217
+ def _on_any_slider_released(self):
218
+ self._slider_dragging = False
219
+ # Flush immediately to final value
220
+ if self._rebuild_debounce.isActive():
221
+ self._rebuild_debounce.stop()
222
+ self._rebuild_from_params_now()
223
+
224
+ def _schedule_rebuild_from_params(self):
225
+ """
226
+ Called on every valueChanged tick. Updates labels fast, but defers the heavy work.
227
+ """
228
+ # lightweight label updates (no LUT/preview work here)
229
+ a = self.sA.value() / 50.0
230
+ b = self.sB.value() / 50.0
231
+ g = self.sG.value() / 100.0
232
+ self.labA.setText(f"{a:.2f}")
233
+ self.labB.setText(f"{b:.2f}")
234
+ self.labG.setText(f"{g:.2f}")
235
+ self.labLP.setText(f"{self.sLP.value()/360.0:.2f}")
236
+ self.labHP.setText(f"{self.sHP.value()/360.0:.2f}")
237
+
238
+ # debounce heavy rebuild
239
+ self._rebuild_debounce.start()
240
+
241
+ def _rebuild_from_params(self):
242
+ """
243
+ Keep existing call sites working (hist pivot, symmetry pick, etc).
244
+ For non-slider callers we generally WANT immediate rebuild.
245
+ """
246
+ if self._rebuild_debounce.isActive():
247
+ self._rebuild_debounce.stop()
248
+ self._rebuild_from_params_now()
249
+
197
250
 
198
251
  def _on_symmetry_pick(self, u, v):
199
252
  self._sym_u = float(u)
200
253
  self._rebuild_from_params()
201
254
 
202
- def _rebuild_from_params(self):
255
+ def _rebuild_from_params_now(self):
203
256
  a = self.sA.value()/50.0
204
257
  b = self.sB.value()/50.0
205
258
  g = self.sG.value()/100.0
@@ -267,12 +320,17 @@ class GhsDialogPro(QDialog):
267
320
  ys = (1.0 - vp) * 360.0
268
321
  pts = list(zip(xs.astype(float), ys.astype(float)))
269
322
 
270
- cps_sorted = sorted(self.editor.control_points, key=lambda p: p.scenePos().x())
271
- for p, (x, y) in zip(cps_sorted, pts):
272
- p.setPos(x, y)
323
+ self._suppress_editor_preview = True
324
+ try:
325
+ cps_sorted = sorted(self.editor.control_points, key=lambda p: p.scenePos().x())
326
+ for p, (x, y) in zip(cps_sorted, pts):
327
+ p.setPos(x, y)
328
+
329
+ self._recolor_curve()
330
+ self.editor.updateCurve()
331
+ finally:
332
+ self._suppress_editor_preview = False
273
333
 
274
- self._recolor_curve()
275
- self.editor.updateCurve()
276
334
  self._quick_preview()
277
335
 
278
336
 
@@ -654,10 +712,17 @@ class GhsDialogPro(QDialog):
654
712
 
655
713
  return (m * out + (1.0 - m) * src).astype(np.float32, copy=False)
656
714
 
657
-
658
715
  def _reset(self):
659
- self.sA.setValue(50); self.sB.setValue(50); self.sG.setValue(100)
660
- self.sLP.setValue(0); self.sHP.setValue(0)
716
+ for s in (self.sA, self.sB, self.sG, self.sLP, self.sHP):
717
+ s.blockSignals(True)
718
+ try:
719
+ self.sA.setValue(50); self.sB.setValue(50); self.sG.setValue(100)
720
+ self.sLP.setValue(0); self.sHP.setValue(0)
721
+ finally:
722
+ for s in (self.sA, self.sB, self.sG, self.sLP, self.sHP):
723
+ s.blockSignals(False)
724
+
661
725
  self._sym_u = 0.5
662
726
  self.editor.clearSymmetryLine()
663
- self._rebuild_from_params()
727
+ self._rebuild_from_params() # immediate
728
+
@@ -34,6 +34,7 @@ class GraXpertOperationDialog(QDialog):
34
34
  self.setWindowFlag(Qt.WindowType.Window, True)
35
35
  self.setWindowModality(Qt.WindowModality.NonModal)
36
36
  self.setModal(False)
37
+
37
38
  root = QVBoxLayout(self)
38
39
 
39
40
  # radios