setiastrosuitepro 1.6.8__tar.gz → 1.6.10__tar.gz

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 (403) hide show
  1. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/PKG-INFO +1 -1
  2. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/pyproject.toml +1 -1
  3. setiastrosuitepro-1.6.10/src/setiastro/images/abeicon.svg +16 -0
  4. setiastrosuitepro-1.6.10/src/setiastro/images/cosmic.svg +40 -0
  5. setiastrosuitepro-1.6.10/src/setiastro/images/cosmicsat.svg +24 -0
  6. setiastrosuitepro-1.6.10/src/setiastro/images/graxpert.svg +19 -0
  7. setiastrosuitepro-1.6.10/src/setiastro/images/linearfit.svg +32 -0
  8. setiastrosuitepro-1.6.10/src/setiastro/images/pixelmath.svg +42 -0
  9. setiastrosuitepro-1.6.10/src/setiastro/saspro/_generated/build_info.py +3 -0
  10. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/add_stars.py +29 -5
  11. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/blink_comparator_pro.py +83 -46
  12. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/cosmicclarity.py +125 -18
  13. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/crop_dialog_pro.py +96 -2
  14. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/curve_editor_pro.py +60 -39
  15. setiastrosuitepro-1.6.10/src/setiastro/saspro/frequency_separation.py +2303 -0
  16. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/main_window.py +131 -31
  17. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/theme_mixin.py +160 -14
  18. setiastrosuitepro-1.6.10/src/setiastro/saspro/imageops/stretch.py +705 -0
  19. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/layers.py +13 -9
  20. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/layers_dock.py +183 -3
  21. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/legacy/numba_utils.py +43 -0
  22. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/multiscale_decomp.py +47 -12
  23. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/numba_utils.py +72 -2
  24. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/shortcuts.py +122 -12
  25. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/stacking_suite.py +523 -316
  26. setiastrosuitepro-1.6.10/src/setiastro/saspro/stat_stretch.py +1112 -0
  27. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/subwindow.py +302 -71
  28. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/resource_monitor.py +7 -7
  29. setiastrosuitepro-1.6.8/src/setiastro/saspro/_generated/build_info.py +0 -3
  30. setiastrosuitepro-1.6.8/src/setiastro/saspro/frequency_separation.py +0 -1352
  31. setiastrosuitepro-1.6.8/src/setiastro/saspro/imageops/stretch.py +0 -236
  32. setiastrosuitepro-1.6.8/src/setiastro/saspro/stat_stretch.py +0 -554
  33. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/LICENSE +0 -0
  34. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/README.md +0 -0
  35. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/license.txt +0 -0
  36. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/__init__.py +0 -0
  37. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/SASP_data.fits +0 -0
  38. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv +0 -0
  39. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/astrobin_filters.csv +0 -0
  40. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/astrobin_filters_page1_local.csv +0 -0
  41. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/cali2.csv +0 -0
  42. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/cali2color.csv +0 -0
  43. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/celestial_catalog - original.csv +0 -0
  44. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/celestial_catalog.csv +0 -0
  45. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/detected_stars.csv +0 -0
  46. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/fits_header_data.csv +0 -0
  47. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/test.csv +0 -0
  48. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/data/catalogs/updated_celestial_catalog.csv +0 -0
  49. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/Astro_Spikes.png +0 -0
  50. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/Background_startup.jpg +0 -0
  51. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/HRDiagram.png +0 -0
  52. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/LExtract.png +0 -0
  53. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/LInsert.png +0 -0
  54. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/Oxygenation-atm-2.svg.png +0 -0
  55. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/RGB080604.png +0 -0
  56. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/abeicon.png +0 -0
  57. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/aberration.png +0 -0
  58. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/acv_icon.png +0 -0
  59. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/andromedatry.png +0 -0
  60. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/andromedatry_satellited.png +0 -0
  61. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/annotated.png +0 -0
  62. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/aperture.png +0 -0
  63. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/astrosuite.ico +0 -0
  64. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/astrosuite.png +0 -0
  65. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/astrosuitepro.icns +0 -0
  66. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/astrosuitepro.ico +0 -0
  67. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/astrosuitepro.png +0 -0
  68. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/background.png +0 -0
  69. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/background2.png +0 -0
  70. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/benchmark.png +0 -0
  71. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/big_moon_stabilizer_timeline.png +0 -0
  72. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/big_moon_stabilizer_timeline_clean.png +0 -0
  73. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/blaster.png +0 -0
  74. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/blink.png +0 -0
  75. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/clahe.png +0 -0
  76. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/collage.png +0 -0
  77. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/colorwheel.png +0 -0
  78. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/contsub.png +0 -0
  79. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/convo.png +0 -0
  80. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/copyslot.png +0 -0
  81. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/cosmic.png +0 -0
  82. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/cosmicsat.png +0 -0
  83. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/crop1.png +0 -0
  84. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/cropicon.png +0 -0
  85. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/curves.png +0 -0
  86. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/cvs.png +0 -0
  87. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/debayer.png +0 -0
  88. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/denoise_cnn_custom.png +0 -0
  89. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/denoise_cnn_graph.png +0 -0
  90. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/disk.png +0 -0
  91. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/dse.png +0 -0
  92. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/exoicon.png +0 -0
  93. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/eye.png +0 -0
  94. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/first_quarter.png +0 -0
  95. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/fliphorizontal.png +0 -0
  96. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/flipvertical.png +0 -0
  97. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/font.png +0 -0
  98. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/freqsep.png +0 -0
  99. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/full_moon.png +0 -0
  100. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/functionbundle.png +0 -0
  101. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/graxpert.png +0 -0
  102. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/green.png +0 -0
  103. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/gridicon.png +0 -0
  104. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/halo.png +0 -0
  105. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/hdr.png +0 -0
  106. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/histogram.png +0 -0
  107. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/hubble.png +0 -0
  108. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/imagecombine.png +0 -0
  109. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/invert.png +0 -0
  110. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/isophote.png +0 -0
  111. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/isophote_demo_figure.png +0 -0
  112. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/isophote_demo_image.png +0 -0
  113. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/isophote_demo_model.png +0 -0
  114. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/isophote_demo_residual.png +0 -0
  115. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/jwstpupil.png +0 -0
  116. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/last_quarter.png +0 -0
  117. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/linearfit.png +0 -0
  118. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/livestacking.png +0 -0
  119. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/mask.png +0 -0
  120. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/maskapply.png +0 -0
  121. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/maskcreate.png +0 -0
  122. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/maskremove.png +0 -0
  123. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/morpho.png +0 -0
  124. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/mosaic.png +0 -0
  125. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/multiscale_decomp.png +0 -0
  126. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/nbtorgb.png +0 -0
  127. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/neutral.png +0 -0
  128. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/new_moon.png +0 -0
  129. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/nuke.png +0 -0
  130. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/openfile.png +0 -0
  131. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/pedestal.png +0 -0
  132. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/pen.png +0 -0
  133. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/pixelmath.png +0 -0
  134. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/platesolve.png +0 -0
  135. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/ppp.png +0 -0
  136. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/pro.png +0 -0
  137. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/project.png +0 -0
  138. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/psf.png +0 -0
  139. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/redo.png +0 -0
  140. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/redoicon.png +0 -0
  141. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rescale.png +0 -0
  142. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rgbalign.png +0 -0
  143. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rgbcombo.png +0 -0
  144. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rgbextract.png +0 -0
  145. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rotate180.png +0 -0
  146. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rotatearbitrary.png +0 -0
  147. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rotateclockwise.png +0 -0
  148. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/rotatecounterclockwise.png +0 -0
  149. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/satellite.png +0 -0
  150. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/script.png +0 -0
  151. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/selectivecolor.png +0 -0
  152. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/simbad.png +0 -0
  153. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot0.png +0 -0
  154. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot1.png +0 -0
  155. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot2.png +0 -0
  156. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot3.png +0 -0
  157. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot4.png +0 -0
  158. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot5.png +0 -0
  159. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot6.png +0 -0
  160. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot7.png +0 -0
  161. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot8.png +0 -0
  162. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/slot9.png +0 -0
  163. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/spcc.png +0 -0
  164. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/spin_precession_vs_lunar_distance.png +0 -0
  165. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/spinner.gif +0 -0
  166. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/stacking.png +0 -0
  167. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/staradd.png +0 -0
  168. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/staralign.png +0 -0
  169. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/starnet.png +0 -0
  170. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/starregistration.png +0 -0
  171. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/starspike.png +0 -0
  172. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/starstretch.png +0 -0
  173. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/statstretch.png +0 -0
  174. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/supernova.png +0 -0
  175. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/uhs.png +0 -0
  176. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/undoicon.png +0 -0
  177. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/upscale.png +0 -0
  178. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/viewbundle.png +0 -0
  179. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_crescent_1.png +0 -0
  180. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_crescent_2.png +0 -0
  181. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_crescent_3.png +0 -0
  182. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_crescent_4.png +0 -0
  183. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_crescent_5.png +0 -0
  184. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_gibbous_1.png +0 -0
  185. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_gibbous_2.png +0 -0
  186. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_gibbous_3.png +0 -0
  187. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_gibbous_4.png +0 -0
  188. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waning_gibbous_5.png +0 -0
  189. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_crescent_1.png +0 -0
  190. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_crescent_2.png +0 -0
  191. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_crescent_3.png +0 -0
  192. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_crescent_4.png +0 -0
  193. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_crescent_5.png +0 -0
  194. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_gibbous_1.png +0 -0
  195. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_gibbous_2.png +0 -0
  196. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_gibbous_3.png +0 -0
  197. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_gibbous_4.png +0 -0
  198. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/waxing_gibbous_5.png +0 -0
  199. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/whitebalance.png +0 -0
  200. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/wimi_icon_256x256.png +0 -0
  201. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/wimilogo.png +0 -0
  202. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/wims.png +0 -0
  203. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/wrench_icon.png +0 -0
  204. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/images/xisfliberator.png +0 -0
  205. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/qml/ResourceMonitor.qml +0 -0
  206. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/__init__.py +0 -0
  207. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/__main__.py +0 -0
  208. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/_generated/__init__.py +0 -0
  209. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/abe.py +0 -0
  210. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/abe_preset.py +0 -0
  211. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/aberration_ai.py +0 -0
  212. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/aberration_ai_preset.py +0 -0
  213. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/accel_installer.py +0 -0
  214. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/accel_workers.py +0 -0
  215. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/acv_exporter.py +0 -0
  216. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/astrobin_exporter.py +0 -0
  217. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/astrospike.py +0 -0
  218. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/astrospike_python.py +0 -0
  219. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/autostretch.py +0 -0
  220. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/backgroundneutral.py +0 -0
  221. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/batch_convert.py +0 -0
  222. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/batch_renamer.py +0 -0
  223. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/blemish_blaster.py +0 -0
  224. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/bundles.py +0 -0
  225. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/bundles_dock.py +0 -0
  226. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/cheat_sheet.py +0 -0
  227. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/clahe.py +0 -0
  228. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/comet_stacking.py +0 -0
  229. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/common_tr.py +0 -0
  230. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/config.py +0 -0
  231. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/config_bootstrap.py +0 -0
  232. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/config_manager.py +0 -0
  233. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/continuum_subtract.py +0 -0
  234. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/convo.py +0 -0
  235. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/convo_preset.py +0 -0
  236. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/copyastro.py +0 -0
  237. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/cosmicclarity_preset.py +0 -0
  238. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/crop_preset.py +0 -0
  239. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/curves_preset.py +0 -0
  240. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/debayer.py +0 -0
  241. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/debug_utils.py +0 -0
  242. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/dnd_mime.py +0 -0
  243. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/doc_manager.py +0 -0
  244. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/exoplanet_detector.py +0 -0
  245. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/file_utils.py +0 -0
  246. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/fitsmodifier.py +0 -0
  247. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/fix_bom.py +0 -0
  248. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/free_torch_memory.py +0 -0
  249. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/function_bundle.py +0 -0
  250. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/generate_translations.py +0 -0
  251. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ghs_dialog_pro.py +0 -0
  252. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ghs_preset.py +0 -0
  253. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/graxpert.py +0 -0
  254. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/graxpert_preset.py +0 -0
  255. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/__init__.py +0 -0
  256. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/__init__.py +0 -0
  257. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/dock_mixin.py +0 -0
  258. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/file_mixin.py +0 -0
  259. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/geometry_mixin.py +0 -0
  260. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/header_mixin.py +0 -0
  261. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/mask_mixin.py +0 -0
  262. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/menu_mixin.py +0 -0
  263. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/toolbar_mixin.py +0 -0
  264. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/update_mixin.py +0 -0
  265. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/mixins/view_mixin.py +0 -0
  266. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/gui/statistics_dialog.py +0 -0
  267. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/halobgon.py +0 -0
  268. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/header_viewer.py +0 -0
  269. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/headless_utils.py +0 -0
  270. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/histogram.py +0 -0
  271. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/history_explorer.py +0 -0
  272. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/i18n.py +0 -0
  273. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/image_combine.py +0 -0
  274. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/image_peeker_pro.py +0 -0
  275. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/imageops/__init__.py +0 -0
  276. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/imageops/mdi_snap.py +0 -0
  277. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/imageops/scnr.py +0 -0
  278. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/imageops/starbasedwhitebalance.py +0 -0
  279. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/isophote.py +0 -0
  280. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/lazy_imports.py +0 -0
  281. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/legacy/__init__.py +0 -0
  282. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/legacy/image_manager.py +0 -0
  283. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/legacy/xisf.py +0 -0
  284. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/linear_fit.py +0 -0
  285. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/live_stacking.py +0 -0
  286. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/log_bus.py +0 -0
  287. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/logging_config.py +0 -0
  288. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/luminancerecombine.py +0 -0
  289. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/main_helpers.py +0 -0
  290. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/mask_creation.py +0 -0
  291. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/masks_core.py +0 -0
  292. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/mdi_widgets.py +0 -0
  293. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/memory_utils.py +0 -0
  294. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/metadata_patcher.py +0 -0
  295. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/mfdeconv.py +0 -0
  296. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/mfdeconv_earlystop.py +0 -0
  297. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/mfdeconvcudnn.py +0 -0
  298. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/mfdeconvsport.py +0 -0
  299. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/minorbodycatalog.py +0 -0
  300. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/morphology.py +0 -0
  301. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/nbtorgb_stars.py +0 -0
  302. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/numba_warmup.py +0 -0
  303. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ops/__init__.py +0 -0
  304. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ops/command_help_dialog.py +0 -0
  305. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ops/command_runner.py +0 -0
  306. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ops/commands.py +0 -0
  307. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ops/script_editor.py +0 -0
  308. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ops/scripts.py +0 -0
  309. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/ops/settings.py +0 -0
  310. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/parallel_utils.py +0 -0
  311. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/pedestal.py +0 -0
  312. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/perfect_palette_picker.py +0 -0
  313. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/pipeline.py +0 -0
  314. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/pixelmath.py +0 -0
  315. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/plate_solver.py +0 -0
  316. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/project_io.py +0 -0
  317. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/psf_utils.py +0 -0
  318. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/psf_viewer.py +0 -0
  319. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/pyi_rthook_astroquery.py +0 -0
  320. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/remove_green.py +0 -0
  321. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/remove_stars.py +0 -0
  322. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/remove_stars_preset.py +0 -0
  323. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/resources.py +0 -0
  324. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/rgb_combination.py +0 -0
  325. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/rgb_extract.py +0 -0
  326. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/rgbalign.py +0 -0
  327. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/runtime_imports.py +0 -0
  328. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/runtime_torch.py +0 -0
  329. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/save_options.py +0 -0
  330. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/selective_color.py +0 -0
  331. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/sfcc.py +0 -0
  332. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/signature_insert.py +0 -0
  333. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/star_alignment.py +0 -0
  334. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/star_alignment_preset.py +0 -0
  335. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/star_metrics.py +0 -0
  336. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/star_spikes.py +0 -0
  337. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/star_stretch.py +0 -0
  338. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/status_log_dock.py +0 -0
  339. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/supernovaasteroidhunter.py +0 -0
  340. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/swap_manager.py +0 -0
  341. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/torch_backend.py +0 -0
  342. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/torch_rejection.py +0 -0
  343. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/all_source_strings.json +0 -0
  344. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/ar_translations.py +0 -0
  345. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/de_translations.py +0 -0
  346. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/es_translations.py +0 -0
  347. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/fr_translations.py +0 -0
  348. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/hi_translations.py +0 -0
  349. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/integrate_translations.py +0 -0
  350. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/it_translations.py +0 -0
  351. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/ja_translations.py +0 -0
  352. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/pt_translations.py +0 -0
  353. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/ru_translations.py +0 -0
  354. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_ar.qm +0 -0
  355. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_ar.ts +0 -0
  356. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_de.qm +0 -0
  357. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_de.ts +0 -0
  358. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_es.qm +0 -0
  359. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_es.ts +0 -0
  360. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_fr.qm +0 -0
  361. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_fr.ts +0 -0
  362. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_hi.qm +0 -0
  363. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_hi.ts +0 -0
  364. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_it.qm +0 -0
  365. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_it.ts +0 -0
  366. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_ja.qm +0 -0
  367. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_ja.ts +0 -0
  368. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_pt.qm +0 -0
  369. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_pt.ts +0 -0
  370. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_ru.qm +0 -0
  371. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_ru.ts +0 -0
  372. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_sw.qm +0 -0
  373. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_sw.ts +0 -0
  374. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_uk.qm +0 -0
  375. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_uk.ts +0 -0
  376. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_zh.qm +0 -0
  377. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/saspro_zh.ts +0 -0
  378. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/sw_translations.py +0 -0
  379. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/uk_translations.py +0 -0
  380. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/translations/zh_translations.py +0 -0
  381. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/versioning.py +0 -0
  382. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/view_bundle.py +0 -0
  383. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/wavescale_hdr.py +0 -0
  384. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/wavescale_hdr_preset.py +0 -0
  385. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/wavescalede.py +0 -0
  386. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/wavescalede_preset.py +0 -0
  387. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/wcs_update.py +0 -0
  388. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/whitebalance.py +0 -0
  389. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/__init__.py +0 -0
  390. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/common_utilities.py +0 -0
  391. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/graphics_views.py +0 -0
  392. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/image_utils.py +0 -0
  393. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/minigame/game.js +0 -0
  394. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/minigame/index.html +0 -0
  395. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/minigame/style.css +0 -0
  396. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/preview_dialogs.py +0 -0
  397. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/spinboxes.py +0 -0
  398. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/themed_buttons.py +0 -0
  399. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/widgets/wavelet_utils.py +0 -0
  400. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/wimi.py +0 -0
  401. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/wims.py +0 -0
  402. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/window_shelf.py +0 -0
  403. {setiastrosuitepro-1.6.8 → setiastrosuitepro-1.6.10}/src/setiastro/saspro/xisf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setiastrosuitepro
3
- Version: 1.6.8
3
+ Version: 1.6.10
4
4
  Summary: Seti Astro Suite Pro - Advanced astrophotography toolkit for image calibration, stacking, registration, photometry, and visualization
5
5
  License: GPL-3.0
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "setiastrosuitepro"
3
- version = "1.6.8"
3
+ version = "1.6.10"
4
4
  description = "Seti Astro Suite Pro - Advanced astrophotography toolkit for image calibration, stacking, registration, photometry, and visualization"
5
5
  authors = ["Franklin Marek <info@setiastro.com>"]
6
6
  readme = "README.md"
@@ -0,0 +1,16 @@
1
+ <svg width="300" height="300" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo sfumato -->
3
+ <defs>
4
+ <linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
5
+ <stop offset="0%" style="stop-color:white;stop-opacity:1" />
6
+ <stop offset="40%" style="stop-color:#cccccc;stop-opacity:1" />
7
+ <stop offset="100%" style="stop-color:#4a0000;stop-opacity:1" />
8
+ </linearGradient>
9
+ </defs>
10
+ <rect width="300" height="300" fill="url(#bgGradient)" />
11
+
12
+ <!-- Lettere -->
13
+ <text x="20" y="110" font-family="Arial, sans-serif" font-weight="bold" font-size="140" fill="#ff0000">A</text>
14
+ <text x="100" y="220" font-family="Arial, sans-serif" font-weight="bold" font-size="140" fill="#00ff00">B</text>
15
+ <text x="185" y="295" font-family="Arial, sans-serif" font-weight="bold" font-size="140" fill="#0000ff">E</text>
16
+ </svg>
@@ -0,0 +1,40 @@
1
+ <svg width="400" height="400" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo Tondo Blu Scuro -->
3
+ <circle cx="200" cy="200" r="190" fill="#2C3278" />
4
+
5
+ <!-- Scia/Onda inferiore (Swoosh) -->
6
+ <!-- Swoosh grande viola scuro -->
7
+ <path d="M80,260
8
+ Q110,360 200,340
9
+ Q280,320 320,220
10
+ L335,230
11
+ Q300,340 200,360
12
+ Q100,380 70,280 Z"
13
+ fill="#534FB1" opacity="0.9" />
14
+
15
+ <!-- Swoosh piccola interna (più chiara) -->
16
+ <path d="M120,290 Q160,330 220,310"
17
+ fill="none" stroke="#686CCF" stroke-width="12" stroke-linecap="round" />
18
+
19
+ <!-- Stella Principale Bianca -->
20
+ <!-- Uso curve di Bezier per ottenere l'effetto "pizzicato" esatto -->
21
+ <path d="M200,50
22
+ C215,160 215,160 350,200
23
+ C215,240 215,240 200,350
24
+ C185,240 185,240 50,200
25
+ C185,160 185,160 200,50 Z"
26
+ fill="#FFFFFF" />
27
+
28
+ <!-- Elementi decorativi -->
29
+
30
+ <!-- Stella piccola a destra (inclinata) -->
31
+ <path d="M280,110 C290,105 290,105 300,100 C290,95 290,95 280,90 C270,95 270,95 260,100 C270,105 270,105 280,110 Z"
32
+ fill="#FFFFFF" transform="rotate(-15, 280, 100)" />
33
+
34
+ <!-- Pallini a sinistra -->
35
+ <!-- Pallino bianco in alto -->
36
+ <circle cx="140" cy="85" r="5" fill="#FFFFFF" />
37
+ <!-- Pallino blu scuro in basso -->
38
+ <circle cx="90" cy="140" r="7" fill="#4C54A0" />
39
+
40
+ </svg>
@@ -0,0 +1,24 @@
1
+ <svg width="300" height="300" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo quadrato arrotondato -->
3
+ <rect x="20" y="20" width="260" height="260" rx="40" fill="#293375" />
4
+
5
+ <!-- Silhouette Satellite -->
6
+ <g transform="translate(150,150) rotate(-45)">
7
+ <!-- Pannelli solari -->
8
+ <rect x="-90" y="-30" width="60" height="60" fill="#0c1236" />
9
+ <rect x="30" y="-30" width="60" height="60" fill="#0c1236" />
10
+ <!-- Corpo centrale -->
11
+ <rect x="-30" y="-50" width="60" height="100" rx="10" fill="#0c1236" />
12
+ <!-- Antenna -->
13
+ <line x1="0" y1="-50" x2="0" y2="-100" stroke="#f0f0f0" stroke-width="10" stroke-linecap="round"/>
14
+ <!-- Raggio inferiore -->
15
+ <path d="M-10,50 L-20,150 L20,150 L10,50 Z" fill="#f0f0f0" opacity="0.9"/>
16
+ </g>
17
+
18
+ <!-- Segnale di divieto (X rossa) -->
19
+ <circle cx="230" cy="230" r="60" fill="#e84545" />
20
+ <g stroke="white" stroke-width="15" stroke-linecap="round">
21
+ <line x1="210" y1="210" x2="250" y2="250" />
22
+ <line x1="250" y1="210" x2="210" y2="250" />
23
+ </g>
24
+ </svg>
@@ -0,0 +1,19 @@
1
+ <svg width="300" height="240" viewBox="0 0 300 240" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo gradiente radiale -->
3
+ <defs>
4
+ <radialGradient id="gradGX" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
5
+ <stop offset="0%" style="stop-color:#f0f0f0;stop-opacity:1" />
6
+ <stop offset="70%" style="stop-color:#d0d0d0;stop-opacity:1" />
7
+ <stop offset="100%" style="stop-color:#ffffff;stop-opacity:0" />
8
+ </radialGradient>
9
+ <filter id="blurEffect">
10
+ <feGaussianBlur in="SourceGraphic" stdDeviation="5" />
11
+ </filter>
12
+ </defs>
13
+
14
+ <!-- Ellisse di sfondo sfocata -->
15
+ <ellipse cx="150" cy="120" rx="130" ry="100" fill="url(#gradGX)" filter="url(#blurEffect)" />
16
+
17
+ <!-- Testo GX -->
18
+ <text x="150" y="180" font-family="Arial, sans-serif" font-weight="bold" font-size="160" text-anchor="middle" fill="black">GX</text>
19
+ </svg>
@@ -0,0 +1,32 @@
1
+ <svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Bordo quadrato arrotondato -->
3
+ <rect x="20" y="20" width="460" height="460" rx="80" fill="white" stroke="black" stroke-width="25" />
4
+
5
+ <!-- Assi Cartesiani -->
6
+ <g stroke="black" stroke-width="25" stroke-linecap="round" stroke-linejoin="round" fill="none">
7
+ <!-- Asse Y e X -->
8
+ <path d="M80,100 L80,420 L420,420" />
9
+ <!-- Frecce -->
10
+ <path d="M50,130 L80,90 L110,130" /> <!-- Freccia Y -->
11
+ <path d="M390,390 L430,420 L390,450" /> <!-- Freccia X -->
12
+ </g>
13
+
14
+ <!-- Punti Dati (Scatter Plot) -->
15
+ <g fill="#ff3333">
16
+ <circle cx="160" cy="220" r="20" />
17
+ <circle cx="200" cy="230" r="20" />
18
+ <circle cx="160" cy="260" r="20" />
19
+ <circle cx="220" cy="230" r="20" />
20
+ <circle cx="270" cy="300" r="20" />
21
+ <circle cx="320" cy="300" r="20" />
22
+ <circle cx="240" cy="350" r="20" />
23
+ <circle cx="330" cy="260" r="20" />
24
+ <circle cx="360" cy="220" r="20" />
25
+ <circle cx="300" cy="150" r="20" />
26
+ <circle cx="370" cy="80" r="20" />
27
+ <circle cx="450" cy="120" r="20" />
28
+ </g>
29
+
30
+ <!-- Linea di Regressione (Best Fit) -->
31
+ <line x1="130" y1="370" x2="420" y2="100" stroke="#2d72b5" stroke-width="30" stroke-linecap="round" />
32
+ </svg>
@@ -0,0 +1,42 @@
1
+ <svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
2
+
3
+ <!-- Quadrato Alto Sinistra (Giallo / Più) -->
4
+ <g transform="translate(10, 10)">
5
+ <rect width="230" height="230" fill="#fec035" />
6
+ <!-- Effetto ombra diagonale -->
7
+ <path d="M230,0 L230,230 L115,230 Z" fill="#fab005" opacity="0.4" />
8
+ <!-- Simbolo + -->
9
+ <rect x="95" y="45" width="40" height="140" rx="10" fill="white" />
10
+ <rect x="45" y="95" width="140" height="40" rx="10" fill="white" />
11
+ </g>
12
+
13
+ <!-- Quadrato Alto Destra (Rosso / Meno) -->
14
+ <g transform="translate(260, 10)">
15
+ <rect width="230" height="230" fill="#f15654" />
16
+ <path d="M230,0 L230,230 L115,230 Z" fill="#d04442" opacity="0.4" />
17
+ <!-- Simbolo - -->
18
+ <rect x="45" y="95" width="140" height="30" rx="10" fill="white" />
19
+ </g>
20
+
21
+ <!-- Quadrato Basso Sinistra (Verde / Per) -->
22
+ <g transform="translate(10, 260)">
23
+ <rect width="230" height="230" fill="#5cba63" />
24
+ <path d="M230,0 L230,230 L115,230 Z" fill="#4fa555" opacity="0.4" />
25
+ <!-- Simbolo X (Ruotato +) -->
26
+ <g transform="translate(115, 115) rotate(45)">
27
+ <rect x="-20" y="-70" width="40" height="140" rx="10" fill="white" />
28
+ <rect x="-70" y="-20" width="140" height="40" rx="10" fill="white" />
29
+ </g>
30
+ </g>
31
+
32
+ <!-- Quadrato Basso Destra (Blu / Diviso) -->
33
+ <g transform="translate(260, 260)">
34
+ <rect width="230" height="230" fill="#427bc9" />
35
+ <path d="M230,0 L230,230 L115,230 Z" fill="#3664a3" opacity="0.4" />
36
+ <!-- Simbolo Diviso -->
37
+ <rect x="45" y="95" width="140" height="30" rx="10" fill="white" />
38
+ <circle cx="115" cy="55" r="15" fill="white" />
39
+ <circle cx="115" cy="175" r="15" fill="white" />
40
+ </g>
41
+
42
+ </svg>
@@ -0,0 +1,3 @@
1
+ # Auto-generated at build time. Do not edit.
2
+ BUILD_TIMESTAMP = "2026-01-04T16:49:01Z"
3
+ APP_VERSION = "1.6.10"
@@ -578,10 +578,9 @@ class AddStarsDialog(QDialog):
578
578
 
579
579
  # Emit (target_doc, blended_image)
580
580
  self.stars_added.emit(target_doc, self.blended_image.astype(np.float32, copy=False))
581
- # Dialog stays open so user can apply to other images
582
- # Refresh combo boxes for next operation
583
- self._populate_doc_combos()
584
-
581
+ # Close UI after apply
582
+ self.accept() # or: self.close()
583
+ return
585
584
 
586
585
  # Ensure initial fit once shown
587
586
  def showEvent(self, ev):
@@ -606,7 +605,32 @@ def add_stars(main):
606
605
 
607
606
  dlg = AddStarsDialog(main, parent=main)
608
607
  dlg.stars_added.connect(lambda target, arr: _apply_to_doc(main, target, arr))
609
- dlg.exec()
608
+
609
+ # IMPORTANT: keep a strong reference (non-modal show)
610
+ if not hasattr(main, "_tool_dialogs"):
611
+ main._tool_dialogs = []
612
+ main._tool_dialogs.append(dlg)
613
+
614
+ # When the dialog closes, drop the reference
615
+ def _cleanup(_=None, d=dlg):
616
+ try:
617
+ if hasattr(main, "_tool_dialogs") and d in main._tool_dialogs:
618
+ main._tool_dialogs.remove(d)
619
+ except Exception:
620
+ pass
621
+
622
+ try:
623
+ dlg.finished.connect(_cleanup) # QDialog signal
624
+ except Exception:
625
+ pass
626
+ try:
627
+ dlg.destroyed.connect(_cleanup) # QObject signal (extra safety)
628
+ except Exception:
629
+ pass
630
+
631
+ dlg.show()
632
+ dlg.raise_()
633
+ dlg.activateWindow()
610
634
 
611
635
 
612
636
  def _apply_to_doc(main, doc, arr: np.ndarray):
@@ -150,7 +150,6 @@ class MetricsPanel(QWidget):
150
150
  orig_back = entry.get('orig_background', np.nan)
151
151
  return idx, fwhm, ecc, orig_back, star_cnt
152
152
 
153
-
154
153
  def compute_all_metrics(self, loaded_images) -> bool:
155
154
  """Run SEP over the full list in parallel using threads and cache results.
156
155
  Returns True if metrics were computed, False if user declined/canceled.
@@ -163,71 +162,109 @@ class MetricsPanel(QWidget):
163
162
  self._threshold_initialized = [False] * 4
164
163
  return True
165
164
 
165
+ def _has_metrics(md):
166
+ try:
167
+ return md is not None and len(md) == 4 and md[0] is not None and len(md[0]) > 0
168
+ except Exception:
169
+ return False
170
+
166
171
  settings = QSettings()
167
- show = settings.value("metrics/showWarning", True, type=bool)
168
- if show:
172
+ show_warning = settings.value("metrics/showWarning", True, type=bool)
173
+
174
+ if (not show_warning) and (not _has_metrics(getattr(self, "metrics_data", None))):
175
+ settings.setValue("metrics/showWarning", True)
176
+ show_warning = True
177
+
178
+ # ----------------------------
179
+ # 1) Optional warning gate
180
+ # ----------------------------
181
+ if show_warning:
169
182
  msg = QMessageBox(self)
170
183
  msg.setWindowTitle(self.tr("Heads-up"))
171
184
  msg.setText(self.tr(
172
185
  "This is going to use ALL your CPU cores and the UI may lock up until it finishes.\n\n"
173
186
  "Continue?"
174
187
  ))
175
- msg.setStandardButtons(QMessageBox.StandardButton.Yes |
176
- QMessageBox.StandardButton.No)
188
+ msg.setStandardButtons(
189
+ QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
190
+ )
177
191
  cb = QCheckBox(self.tr("Don't show again"), msg)
178
192
  msg.setCheckBox(cb)
179
193
 
180
- if msg.exec() != QMessageBox.StandardButton.Yes:
181
- # IMPORTANT: leave caches alone; caller (plot) will clear/return
194
+ clicked = msg.exec()
195
+ clicked_yes = (clicked == QMessageBox.StandardButton.Yes)
196
+
197
+ if not clicked_yes:
198
+ # If they said NO, never allow "Don't show again" to lock them out.
199
+ # Keep the warning enabled so they can opt-in later.
200
+ if cb.isChecked():
201
+ settings.setValue("metrics/showWarning", True)
182
202
  return False
183
203
 
204
+ # They said YES: now it's safe to honor "Don't show again"
184
205
  if cb.isChecked():
185
206
  settings.setValue("metrics/showWarning", False)
186
207
 
187
- # pre-allocate result arrays
188
- m0 = np.full(n, np.nan, dtype=np.float32) # FWHM
189
- m1 = np.full(n, np.nan, dtype=np.float32) # Eccentricity
190
- m2 = np.full(n, np.nan, dtype=np.float32) # Background (cached)
191
- m3 = np.full(n, np.nan, dtype=np.float32) # Star count
192
- flags = [e.get('flagged', False) for e in loaded_images]
193
-
194
- # progress dialog
195
- prog = QProgressDialog(self.tr("Computing frame metrics…"), self.tr("Cancel"), 0, n, self)
196
- prog.setWindowModality(Qt.WindowModality.WindowModal)
197
- prog.setMinimumDuration(0)
198
- prog.setValue(0)
199
- prog.show()
200
- QApplication.processEvents()
208
+ # If show_warning is False, we compute with no prompt.
209
+
210
+ # ----------------------------
211
+ # 2) Allocate result arrays
212
+ # ----------------------------
213
+ m0 = np.full(n, np.nan, dtype=np.float32) # FWHM
214
+ m1 = np.full(n, np.nan, dtype=np.float32) # Eccentricity
215
+ m2 = np.full(n, np.nan, dtype=np.float32) # Background (cached)
216
+ m3 = np.full(n, np.nan, dtype=np.float32) # Star count
217
+ flags = [e.get('flagged', False) for e in loaded_images]
218
+
219
+ # ----------------------------
220
+ # 3) Progress dialog
221
+ # ----------------------------
222
+ prog = QProgressDialog(self.tr("Computing frame metrics…"), self.tr("Cancel"), 0, n, self)
223
+ prog.setWindowModality(Qt.WindowModality.WindowModal)
224
+ prog.setMinimumDuration(0)
225
+ prog.setValue(0)
226
+ prog.show()
227
+ QApplication.processEvents()
201
228
 
202
- workers = min(os.cpu_count() or 1, 60)
203
- tasks = [(i, loaded_images[i]) for i in range(n)]
204
- done = 0 # <-- FIX: initialize before incrementing
229
+ workers = min(os.cpu_count() or 1, 60)
230
+ tasks = [(i, loaded_images[i]) for i in range(n)]
231
+ done = 0
232
+ canceled = False
205
233
 
206
- try:
207
- with ThreadPoolExecutor(max_workers=workers) as exe:
208
- futures = {exe.submit(self._compute_one, t): t[0] for t in tasks}
209
- for fut in as_completed(futures):
210
- if prog.wasCanceled():
211
- break
212
- try:
213
- idx, fwhm, ecc, orig_back, star_cnt = fut.result()
214
- except Exception:
215
- # On failure, leave NaNs/sentinels and continue
216
- idx, fwhm, ecc, orig_back, star_cnt = futures[fut], np.nan, np.nan, np.nan, 0
234
+ try:
235
+ with ThreadPoolExecutor(max_workers=workers) as exe:
236
+ futures = {exe.submit(self._compute_one, t): t[0] for t in tasks}
237
+ for fut in as_completed(futures):
238
+ if prog.wasCanceled():
239
+ canceled = True
240
+ break
241
+ try:
242
+ idx, fwhm, ecc, orig_back, star_cnt = fut.result()
243
+ except Exception:
244
+ idx = futures.get(fut, 0)
245
+ fwhm, ecc, orig_back, star_cnt = np.nan, np.nan, np.nan, 0
246
+
247
+ if 0 <= idx < n:
217
248
  m0[idx], m1[idx], m2[idx], m3[idx] = fwhm, ecc, orig_back, float(star_cnt)
218
- done += 1
219
- prog.setValue(done)
220
- QApplication.processEvents()
221
- finally:
222
- prog.close()
223
249
 
224
- # stash results
225
- self._orig_images = loaded_images
226
- self.metrics_data = [m0, m1, m2, m3]
227
- self.flags = flags
228
- self._threshold_initialized = [False] * 4
229
- return True
250
+ done += 1
251
+ prog.setValue(done)
252
+ QApplication.processEvents()
253
+ finally:
254
+ prog.close()
255
+
256
+ if canceled:
257
+ # IMPORTANT: leave caches alone; caller will clear/return
258
+ return False
230
259
 
260
+ # ----------------------------
261
+ # 4) Stash results
262
+ # ----------------------------
263
+ self._orig_images = loaded_images
264
+ self.metrics_data = [m0, m1, m2, m3]
265
+ self.flags = flags
266
+ self._threshold_initialized = [False] * 4
267
+ return True
231
268
 
232
269
  def plot(self, loaded_images, indices=None):
233
270
  """
@@ -228,21 +228,116 @@ class WaitForFileWorker(QThread):
228
228
  fileFound = pyqtSignal(str)
229
229
  cancelled = pyqtSignal()
230
230
  error = pyqtSignal(str)
231
- def __init__(self, glob_pat: str, timeout_sec=1800, parent=None):
231
+
232
+ def __init__(
233
+ self,
234
+ glob_pat: str,
235
+ timeout_sec: int = 1800,
236
+ parent=None,
237
+ *,
238
+ poll_ms: int = 200,
239
+ stable_polls: int = 6, # 6 * 200ms = ~1.2s of stability
240
+ stable_timeout_sec: int = 120, # extra time after first detection
241
+ ):
232
242
  super().__init__(parent)
233
243
  self._glob = glob_pat
234
- self._timeout = timeout_sec
244
+ self._timeout = int(timeout_sec)
245
+ self._poll_ms = int(poll_ms)
246
+ self._stable_polls = int(stable_polls)
247
+ self._stable_timeout = int(stable_timeout_sec)
235
248
  self._running = True
249
+
250
+ def stop(self):
251
+ self._running = False
252
+
253
+ def _best_candidate(self, paths: list[str]) -> str | None:
254
+ if not paths:
255
+ return None
256
+ # prefer biggest file; tie-break by newest mtime
257
+ def key(p):
258
+ try:
259
+ st = os.stat(p)
260
+ return (st.st_size, st.st_mtime)
261
+ except Exception:
262
+ return (-1, -1)
263
+ paths.sort(key=key, reverse=True)
264
+ return paths[0]
265
+
266
+ def _is_stable_and_readable(self, path: str) -> bool:
267
+ """
268
+ Consider stable when size+mtime unchanged for N polls in a row AND file is readable.
269
+ Handles slow writers + Windows "file still locked" issues.
270
+ """
271
+ stable = 0
272
+ last = None
273
+
274
+ t0 = time.monotonic()
275
+ while self._running and (time.monotonic() - t0) < self._stable_timeout:
276
+ try:
277
+ st = os.stat(path)
278
+ cur = (st.st_size, st.st_mtime)
279
+ if st.st_size <= 0:
280
+ stable = 0
281
+ last = cur
282
+ elif cur == last:
283
+ stable += 1
284
+ else:
285
+ stable = 0
286
+ last = cur
287
+
288
+ if stable >= self._stable_polls:
289
+ # extra “is it readable?” check (important on Windows)
290
+ try:
291
+ with open(path, "rb") as f:
292
+ f.read(64)
293
+ return True
294
+ except PermissionError:
295
+ # still locked by writer, keep waiting
296
+ stable = 0
297
+ except Exception:
298
+ # transient weirdness: keep waiting, don’t declare failure yet
299
+ stable = 0
300
+
301
+ except FileNotFoundError:
302
+ stable = 0
303
+ last = None
304
+ except Exception:
305
+ # don't crash the worker for stat weirdness
306
+ stable = 0
307
+
308
+ time.sleep(self._poll_ms / 1000.0)
309
+
310
+ return False
311
+
236
312
  def run(self):
237
- start = time.time()
238
- while self._running and (time.time() - start < self._timeout):
239
- m = glob.glob(self._glob)
240
- if m:
241
- self.fileFound.emit(m[0]); return
242
- time.sleep(1)
243
- if self._running: self.error.emit("Output file not found within timeout.")
244
- else: self.cancelled.emit()
245
- def stop(self): self._running = False
313
+ t_start = time.monotonic()
314
+ seen_first_candidate_at = None
315
+
316
+ while self._running and (time.monotonic() - t_start) < self._timeout:
317
+ matches = glob.glob(self._glob)
318
+ cand = self._best_candidate(matches)
319
+
320
+ if cand:
321
+ if seen_first_candidate_at is None:
322
+ seen_first_candidate_at = time.monotonic()
323
+
324
+ if self._is_stable_and_readable(cand):
325
+ self.fileFound.emit(cand)
326
+ return
327
+
328
+ # If we've been seeing candidates for a while but none stabilize,
329
+ # keep looping until global timeout. (This is common on slow disks.)
330
+
331
+ time.sleep(self._poll_ms / 1000.0)
332
+
333
+ if not self._running:
334
+ self.cancelled.emit()
335
+ else:
336
+ extra = ""
337
+ if seen_first_candidate_at is not None:
338
+ extra = " (output appeared but never stabilized)"
339
+ self.error.emit("Output file not found within timeout." + extra)
340
+
246
341
 
247
342
 
248
343
  # =============================================================================
@@ -556,6 +651,12 @@ class CosmicClarityDialogPro(QDialog):
556
651
  QMessageBox.critical(self, "Cosmic Clarity", f"Executable not found:\n{exe_path}")
557
652
  return
558
653
 
654
+ # ✅ compute base early (we need it for purge + glob)
655
+ base = self._base_name()
656
+
657
+ # ✅ purge any stale outputs for THIS base name (avoids matching old files)
658
+ _purge_cc_io(self.cosmic_root, clear_input=False, clear_output=True, prefix=base)
659
+
559
660
  # Build args (SASv2 flags mirrored)
560
661
  args = []
561
662
  if mode == "sharpen":
@@ -599,7 +700,7 @@ class CosmicClarityDialogPro(QDialog):
599
700
 
600
701
  # Wait for output file
601
702
  base = self._base_name()
602
- out_glob = os.path.join(self.cosmic_root, "output", f"{base}{suffix}.*")
703
+ out_glob = os.path.join(self.cosmic_root, "output", f"{base}*{suffix}*.*")
603
704
  self._wait = WaitDialog(f"Cosmic Clarity – {mode.title()}", self)
604
705
  self._wait.cancelled.connect(self._cancel_all)
605
706
  self._wait.show()
@@ -615,19 +716,25 @@ class CosmicClarityDialogPro(QDialog):
615
716
 
616
717
  def _read_proc_output(self, proc: QProcess, which="main"):
617
718
  out = proc.readAllStandardOutput().data().decode("utf-8", errors="replace")
618
- if not self._wait: return
719
+ if not self._wait:
720
+ return
721
+
619
722
  for line in out.splitlines():
620
723
  line = line.strip()
621
- if not line: continue
724
+ if not line:
725
+ continue
726
+
622
727
  if line.startswith("Progress:"):
623
728
  try:
624
- pct = float(line.split()[1].replace("%",""))
729
+ pct = float(line.split()[1].replace("%", ""))
625
730
  self._wait.set_progress(int(pct))
626
731
  except Exception:
627
732
  pass
628
- else:
629
- self._wait.append_output(line)
630
- print(f"[CC] {line}")
733
+ continue # <- skip echo
734
+
735
+ # non-progress lines: keep showing + printing
736
+ self._wait.append_output(line)
737
+ print(f"[CC] {line}")
631
738
 
632
739
  def _on_proc_finished(self, mode, suffix, code, status):
633
740
  if code != 0: