setiastrosuitepro 1.6.3__tar.gz → 1.6.5.post2__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 (370) hide show
  1. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/PKG-INFO +1 -7
  2. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/README.md +0 -6
  3. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/pyproject.toml +1 -1
  4. setiastrosuitepro-1.6.5.post2/src/setiastro/images/rotatearbitrary.png +0 -0
  5. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/__main__.py +13 -0
  6. setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/_generated/build_info.py +3 -0
  7. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/aberration_ai.py +9 -5
  8. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/doc_manager.py +1 -1
  9. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/main_window.py +103 -131
  10. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/geometry_mixin.py +105 -5
  11. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/menu_mixin.py +1 -0
  12. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/toolbar_mixin.py +166 -13
  13. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/update_mixin.py +24 -10
  14. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/legacy/image_manager.py +154 -20
  15. {setiastrosuitepro-1.6.3/src/setiastro/saspro → setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/legacy}/xisf.py +101 -11
  16. setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/luminancerecombine.py +510 -0
  17. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mask_creation.py +170 -15
  18. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconv.py +84 -21
  19. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconvcudnn.py +83 -21
  20. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconvsport.py +84 -21
  21. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/script_editor.py +5 -2
  22. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/scripts.py +3 -0
  23. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/remove_stars_preset.py +55 -13
  24. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/resources.py +2 -0
  25. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/shortcuts.py +34 -1
  26. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/stacking_suite.py +655 -116
  27. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_alignment.py +275 -330
  28. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/subwindow.py +326 -247
  29. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/supernovaasteroidhunter.py +1 -1
  30. setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/swap_manager.py +134 -0
  31. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/whitebalance.py +25 -4
  32. {setiastrosuitepro-1.6.3/src/setiastro/saspro/legacy → setiastrosuitepro-1.6.5.post2/src/setiastro/saspro}/xisf.py +240 -98
  33. setiastrosuitepro-1.6.3/src/setiastro/saspro/_generated/build_info.py +0 -3
  34. setiastrosuitepro-1.6.3/src/setiastro/saspro/luminancerecombine.py +0 -309
  35. setiastrosuitepro-1.6.3/src/setiastro/saspro/swap_manager.py +0 -99
  36. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/LICENSE +0 -0
  37. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/license.txt +0 -0
  38. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/__init__.py +0 -0
  39. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/SASP_data.fits +0 -0
  40. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv +0 -0
  41. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/astrobin_filters.csv +0 -0
  42. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/astrobin_filters_page1_local.csv +0 -0
  43. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/cali2.csv +0 -0
  44. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/cali2color.csv +0 -0
  45. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/celestial_catalog - original.csv +0 -0
  46. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/celestial_catalog.csv +0 -0
  47. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/detected_stars.csv +0 -0
  48. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/fits_header_data.csv +0 -0
  49. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/test.csv +0 -0
  50. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/updated_celestial_catalog.csv +0 -0
  51. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/Astro_Spikes.png +0 -0
  52. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/Background_startup.jpg +0 -0
  53. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/HRDiagram.png +0 -0
  54. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/LExtract.png +0 -0
  55. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/LInsert.png +0 -0
  56. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/Oxygenation-atm-2.svg.png +0 -0
  57. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/RGB080604.png +0 -0
  58. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/abeicon.png +0 -0
  59. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/aberration.png +0 -0
  60. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/andromedatry.png +0 -0
  61. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/andromedatry_satellited.png +0 -0
  62. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/annotated.png +0 -0
  63. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/aperture.png +0 -0
  64. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuite.ico +0 -0
  65. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuite.png +0 -0
  66. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuitepro.icns +0 -0
  67. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuitepro.ico +0 -0
  68. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuitepro.png +0 -0
  69. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/background.png +0 -0
  70. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/background2.png +0 -0
  71. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/benchmark.png +0 -0
  72. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/big_moon_stabilizer_timeline.png +0 -0
  73. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/big_moon_stabilizer_timeline_clean.png +0 -0
  74. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/blaster.png +0 -0
  75. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/blink.png +0 -0
  76. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/clahe.png +0 -0
  77. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/collage.png +0 -0
  78. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/colorwheel.png +0 -0
  79. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/contsub.png +0 -0
  80. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/convo.png +0 -0
  81. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/copyslot.png +0 -0
  82. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cosmic.png +0 -0
  83. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cosmicsat.png +0 -0
  84. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/crop1.png +0 -0
  85. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cropicon.png +0 -0
  86. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/curves.png +0 -0
  87. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cvs.png +0 -0
  88. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/debayer.png +0 -0
  89. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/denoise_cnn_custom.png +0 -0
  90. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/denoise_cnn_graph.png +0 -0
  91. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/disk.png +0 -0
  92. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/dse.png +0 -0
  93. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/exoicon.png +0 -0
  94. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/eye.png +0 -0
  95. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/fliphorizontal.png +0 -0
  96. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/flipvertical.png +0 -0
  97. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/font.png +0 -0
  98. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/freqsep.png +0 -0
  99. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/functionbundle.png +0 -0
  100. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/graxpert.png +0 -0
  101. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/green.png +0 -0
  102. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/gridicon.png +0 -0
  103. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/halo.png +0 -0
  104. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/hdr.png +0 -0
  105. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/histogram.png +0 -0
  106. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/hubble.png +0 -0
  107. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/imagecombine.png +0 -0
  108. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/invert.png +0 -0
  109. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote.png +0 -0
  110. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_figure.png +0 -0
  111. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_image.png +0 -0
  112. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_model.png +0 -0
  113. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_residual.png +0 -0
  114. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/jwstpupil.png +0 -0
  115. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/linearfit.png +0 -0
  116. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/livestacking.png +0 -0
  117. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/mask.png +0 -0
  118. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/maskapply.png +0 -0
  119. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/maskcreate.png +0 -0
  120. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/maskremove.png +0 -0
  121. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/morpho.png +0 -0
  122. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/mosaic.png +0 -0
  123. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/multiscale_decomp.png +0 -0
  124. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/nbtorgb.png +0 -0
  125. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/neutral.png +0 -0
  126. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/nuke.png +0 -0
  127. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/openfile.png +0 -0
  128. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pedestal.png +0 -0
  129. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pen.png +0 -0
  130. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pixelmath.png +0 -0
  131. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/platesolve.png +0 -0
  132. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/ppp.png +0 -0
  133. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pro.png +0 -0
  134. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/project.png +0 -0
  135. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/psf.png +0 -0
  136. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/redo.png +0 -0
  137. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/redoicon.png +0 -0
  138. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rescale.png +0 -0
  139. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rgbalign.png +0 -0
  140. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rgbcombo.png +0 -0
  141. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rgbextract.png +0 -0
  142. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rotate180.png +0 -0
  143. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rotateclockwise.png +0 -0
  144. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rotatecounterclockwise.png +0 -0
  145. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/satellite.png +0 -0
  146. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/script.png +0 -0
  147. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/selectivecolor.png +0 -0
  148. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/simbad.png +0 -0
  149. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot0.png +0 -0
  150. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot1.png +0 -0
  151. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot2.png +0 -0
  152. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot3.png +0 -0
  153. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot4.png +0 -0
  154. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot5.png +0 -0
  155. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot6.png +0 -0
  156. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot7.png +0 -0
  157. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot8.png +0 -0
  158. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot9.png +0 -0
  159. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/spcc.png +0 -0
  160. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/spin_precession_vs_lunar_distance.png +0 -0
  161. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/spinner.gif +0 -0
  162. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/stacking.png +0 -0
  163. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/staradd.png +0 -0
  164. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/staralign.png +0 -0
  165. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starnet.png +0 -0
  166. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starregistration.png +0 -0
  167. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starspike.png +0 -0
  168. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starstretch.png +0 -0
  169. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/statstretch.png +0 -0
  170. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/supernova.png +0 -0
  171. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/uhs.png +0 -0
  172. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/undoicon.png +0 -0
  173. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/upscale.png +0 -0
  174. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/viewbundle.png +0 -0
  175. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/whitebalance.png +0 -0
  176. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wimi_icon_256x256.png +0 -0
  177. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wimilogo.png +0 -0
  178. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wims.png +0 -0
  179. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wrench_icon.png +0 -0
  180. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/xisfliberator.png +0 -0
  181. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/qml/ResourceMonitor.qml +0 -0
  182. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/__init__.py +0 -0
  183. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/_generated/__init__.py +0 -0
  184. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/abe.py +0 -0
  185. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/abe_preset.py +0 -0
  186. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/aberration_ai_preset.py +0 -0
  187. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/accel_installer.py +0 -0
  188. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/accel_workers.py +0 -0
  189. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/add_stars.py +0 -0
  190. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/astrobin_exporter.py +0 -0
  191. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/astrospike.py +0 -0
  192. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/astrospike_python.py +0 -0
  193. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/autostretch.py +0 -0
  194. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/backgroundneutral.py +0 -0
  195. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/batch_convert.py +0 -0
  196. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/batch_renamer.py +0 -0
  197. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/blemish_blaster.py +0 -0
  198. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/blink_comparator_pro.py +0 -0
  199. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/bundles.py +0 -0
  200. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/bundles_dock.py +0 -0
  201. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/cheat_sheet.py +0 -0
  202. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/clahe.py +0 -0
  203. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/comet_stacking.py +0 -0
  204. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/common_tr.py +0 -0
  205. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/config.py +0 -0
  206. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/config_bootstrap.py +0 -0
  207. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/config_manager.py +0 -0
  208. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/continuum_subtract.py +0 -0
  209. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/convo.py +0 -0
  210. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/convo_preset.py +0 -0
  211. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/copyastro.py +0 -0
  212. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/cosmicclarity.py +0 -0
  213. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/cosmicclarity_preset.py +0 -0
  214. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/crop_dialog_pro.py +0 -0
  215. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/crop_preset.py +0 -0
  216. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/curve_editor_pro.py +0 -0
  217. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/curves_preset.py +0 -0
  218. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/debayer.py +0 -0
  219. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/debug_utils.py +0 -0
  220. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/dnd_mime.py +0 -0
  221. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/exoplanet_detector.py +0 -0
  222. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/file_utils.py +0 -0
  223. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/fitsmodifier.py +0 -0
  224. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/fix_bom.py +0 -0
  225. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/free_torch_memory.py +0 -0
  226. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/frequency_separation.py +0 -0
  227. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/function_bundle.py +0 -0
  228. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/generate_translations.py +0 -0
  229. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ghs_dialog_pro.py +0 -0
  230. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ghs_preset.py +0 -0
  231. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/graxpert.py +0 -0
  232. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/graxpert_preset.py +0 -0
  233. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/__init__.py +0 -0
  234. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/__init__.py +0 -0
  235. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/dock_mixin.py +0 -0
  236. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/file_mixin.py +0 -0
  237. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/header_mixin.py +0 -0
  238. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/mask_mixin.py +0 -0
  239. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/theme_mixin.py +0 -0
  240. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/view_mixin.py +0 -0
  241. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/statistics_dialog.py +0 -0
  242. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/halobgon.py +0 -0
  243. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/header_viewer.py +0 -0
  244. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/headless_utils.py +0 -0
  245. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/histogram.py +0 -0
  246. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/history_explorer.py +0 -0
  247. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/i18n.py +0 -0
  248. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/image_combine.py +0 -0
  249. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/image_peeker_pro.py +0 -0
  250. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/__init__.py +0 -0
  251. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/mdi_snap.py +0 -0
  252. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/scnr.py +0 -0
  253. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/starbasedwhitebalance.py +0 -0
  254. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/stretch.py +0 -0
  255. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/isophote.py +0 -0
  256. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/layers.py +0 -0
  257. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/layers_dock.py +0 -0
  258. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/lazy_imports.py +0 -0
  259. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/legacy/__init__.py +0 -0
  260. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/legacy/numba_utils.py +0 -0
  261. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/linear_fit.py +0 -0
  262. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/live_stacking.py +0 -0
  263. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/log_bus.py +0 -0
  264. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/logging_config.py +0 -0
  265. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/main_helpers.py +0 -0
  266. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/masks_core.py +0 -0
  267. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mdi_widgets.py +0 -0
  268. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/memory_utils.py +0 -0
  269. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/metadata_patcher.py +0 -0
  270. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconv_earlystop.py +0 -0
  271. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/minorbodycatalog.py +0 -0
  272. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/morphology.py +0 -0
  273. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/multiscale_decomp.py +0 -0
  274. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/nbtorgb_stars.py +0 -0
  275. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/numba_utils.py +0 -0
  276. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/numba_warmup.py +0 -0
  277. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/__init__.py +0 -0
  278. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/command_help_dialog.py +0 -0
  279. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/command_runner.py +0 -0
  280. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/commands.py +0 -0
  281. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/settings.py +0 -0
  282. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/parallel_utils.py +0 -0
  283. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pedestal.py +0 -0
  284. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/perfect_palette_picker.py +0 -0
  285. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pipeline.py +0 -0
  286. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pixelmath.py +0 -0
  287. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/plate_solver.py +0 -0
  288. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/project_io.py +0 -0
  289. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/psf_utils.py +0 -0
  290. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/psf_viewer.py +0 -0
  291. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pyi_rthook_astroquery.py +0 -0
  292. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/remove_green.py +0 -0
  293. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/remove_stars.py +0 -0
  294. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/rgb_combination.py +0 -0
  295. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/rgb_extract.py +0 -0
  296. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/rgbalign.py +0 -0
  297. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/runtime_imports.py +0 -0
  298. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/runtime_torch.py +0 -0
  299. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/save_options.py +0 -0
  300. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/selective_color.py +0 -0
  301. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/sfcc.py +0 -0
  302. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/signature_insert.py +0 -0
  303. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_alignment_preset.py +0 -0
  304. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_metrics.py +0 -0
  305. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_spikes.py +0 -0
  306. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_stretch.py +0 -0
  307. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/stat_stretch.py +0 -0
  308. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/status_log_dock.py +0 -0
  309. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/torch_backend.py +0 -0
  310. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/torch_rejection.py +0 -0
  311. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/all_source_strings.json +0 -0
  312. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/ar_translations.py +0 -0
  313. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/de_translations.py +0 -0
  314. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/es_translations.py +0 -0
  315. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/fr_translations.py +0 -0
  316. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/hi_translations.py +0 -0
  317. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/integrate_translations.py +0 -0
  318. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/it_translations.py +0 -0
  319. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/ja_translations.py +0 -0
  320. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/pt_translations.py +0 -0
  321. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/ru_translations.py +0 -0
  322. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ar.qm +0 -0
  323. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ar.ts +0 -0
  324. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_de.qm +0 -0
  325. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_de.ts +0 -0
  326. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_es.qm +0 -0
  327. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_es.ts +0 -0
  328. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_fr.qm +0 -0
  329. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_fr.ts +0 -0
  330. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_hi.qm +0 -0
  331. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_hi.ts +0 -0
  332. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_it.qm +0 -0
  333. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_it.ts +0 -0
  334. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ja.qm +0 -0
  335. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ja.ts +0 -0
  336. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_pt.qm +0 -0
  337. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_pt.ts +0 -0
  338. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ru.qm +0 -0
  339. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ru.ts +0 -0
  340. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_sw.qm +0 -0
  341. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_sw.ts +0 -0
  342. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_uk.qm +0 -0
  343. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_uk.ts +0 -0
  344. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_zh.qm +0 -0
  345. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_zh.ts +0 -0
  346. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/sw_translations.py +0 -0
  347. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/uk_translations.py +0 -0
  348. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/zh_translations.py +0 -0
  349. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/versioning.py +0 -0
  350. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/view_bundle.py +0 -0
  351. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescale_hdr.py +0 -0
  352. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescale_hdr_preset.py +0 -0
  353. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescalede.py +0 -0
  354. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescalede_preset.py +0 -0
  355. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wcs_update.py +0 -0
  356. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/__init__.py +0 -0
  357. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/common_utilities.py +0 -0
  358. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/graphics_views.py +0 -0
  359. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/image_utils.py +0 -0
  360. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/minigame/game.js +0 -0
  361. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/minigame/index.html +0 -0
  362. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/minigame/style.css +0 -0
  363. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/preview_dialogs.py +0 -0
  364. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/resource_monitor.py +0 -0
  365. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/spinboxes.py +0 -0
  366. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/themed_buttons.py +0 -0
  367. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/wavelet_utils.py +0 -0
  368. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wimi.py +0 -0
  369. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wims.py +0 -0
  370. {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/window_shelf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setiastrosuitepro
3
- Version: 1.6.3
3
+ Version: 1.6.5.post2
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
@@ -65,15 +65,9 @@ Description-Content-Type: text/markdown
65
65
 
66
66
  ### Other contributors:
67
67
  - [Fabio Tempera](https://github.com/Ft2801) 🥇
68
- <<<<<<< HEAD
69
- - Complete code refactoring of `setiastrosuitepro.py` (20,000+ lines)
70
- - Addition of AstroSpikes tool, secret minigame, and 10+ language translations
71
- - Implementation of UI elements, startup window, caching methods, lazy imports, utils functions, better memory management, system resources monitor, app statistics, and other important code optimizations across the entire project
72
- =======
73
68
  - Complete code refactoring of `setiastrosuitepro.py` (20,000+ lines), and duplicated code removal across the project
74
69
  - Addition of AstroSpikes tool, secret minigame, system resources monitor, app statistics, and 10+ language translations
75
70
  - Implementation of UI elements, startup window, caching methods, lazy imports, utils functions, better memory management, and other important code optimizations across the entire project
76
- >>>>>>> dev
77
71
  - [Joaquin Rodriguez](https://github.com/jrhuerta)
78
72
  - Project migration to Poetry
79
73
  - [Tim Dicke](https://github.com/dickett)
@@ -5,15 +5,9 @@
5
5
 
6
6
  ### Other contributors:
7
7
  - [Fabio Tempera](https://github.com/Ft2801) 🥇
8
- <<<<<<< HEAD
9
- - Complete code refactoring of `setiastrosuitepro.py` (20,000+ lines)
10
- - Addition of AstroSpikes tool, secret minigame, and 10+ language translations
11
- - Implementation of UI elements, startup window, caching methods, lazy imports, utils functions, better memory management, system resources monitor, app statistics, and other important code optimizations across the entire project
12
- =======
13
8
  - Complete code refactoring of `setiastrosuitepro.py` (20,000+ lines), and duplicated code removal across the project
14
9
  - Addition of AstroSpikes tool, secret minigame, system resources monitor, app statistics, and 10+ language translations
15
10
  - Implementation of UI elements, startup window, caching methods, lazy imports, utils functions, better memory management, and other important code optimizations across the entire project
16
- >>>>>>> dev
17
11
  - [Joaquin Rodriguez](https://github.com/jrhuerta)
18
12
  - Project migration to Poetry
19
13
  - [Tim Dicke](https://github.com/dickett)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "setiastrosuitepro"
3
- version = "1.6.3"
3
+ version = "1.6.5.post2"
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"
@@ -11,6 +11,19 @@ called via the `main()` function when invoked as an entry point.
11
11
 
12
12
  import sys
13
13
  import os
14
+
15
+ from pathlib import Path
16
+
17
+ if sys.platform.startswith("win"):
18
+ exe_dir = Path(sys.executable).resolve().parent
19
+ internal = exe_dir / "_internal"
20
+ if internal.is_dir():
21
+ try:
22
+ os.add_dll_directory(str(internal))
23
+ except Exception:
24
+ pass
25
+ os.environ["PATH"] = str(internal) + os.pathsep + os.environ.get("PATH", "")
26
+
14
27
  from PyQt6.QtCore import QCoreApplication
15
28
 
16
29
  # ---- Linux Qt stability guard (must run BEFORE any PyQt6 import) ----
@@ -0,0 +1,3 @@
1
+ # Auto-generated at build time. Do not edit.
2
+ BUILD_TIMESTAMP = "2025-12-29T14:37:51Z"
3
+ APP_VERSION = "1.6.5.post2"
@@ -553,8 +553,9 @@ class AberrationAIDialog(QDialog):
553
553
 
554
554
 
555
555
  def _on_failed(self, msg: str):
556
- self._log(f"❌ Aberration AI failed: {msg}") # NEW
556
+ self._log(f"❌ Aberration AI failed: {msg}")
557
557
  QMessageBox.critical(self, "ONNX Error", msg)
558
+ self.reject() # closes the dialog
558
559
 
559
560
  def _on_ok(self, out: np.ndarray):
560
561
  doc = self.get_active_doc()
@@ -680,15 +681,18 @@ class AberrationAIDialog(QDialog):
680
681
  )
681
682
 
682
683
  self.progress.setValue(100)
683
- # Dialog stays open so user can apply to other images
684
+ # NEW: close this UI after a successful run
685
+ self.accept() # or self.close()
686
+ return
684
687
 
685
688
  def _on_worker_finished(self):
686
- # If dialog is already gone, this method is never called because the receiver (self)
687
- # has been destroyed and Qt auto-disconnects the signal.
689
+ # Dialog might have been closed by _on_ok()
690
+ if not self.isVisible():
691
+ return
692
+
688
693
  if hasattr(self, "btn_run"):
689
694
  try:
690
695
  self.btn_run.setEnabled(True)
691
696
  except RuntimeError:
692
- # Button already deleted; ignore
693
697
  pass
694
698
  self._worker = None
@@ -1,4 +1,4 @@
1
- # pro/doc_manager.py
1
+ # saspro/doc_manager.py
2
2
  from __future__ import annotations
3
3
  from PyQt6.QtCore import QObject, pyqtSignal, Qt, QTimer
4
4
  from PyQt6.QtWidgets import QApplication, QMessageBox
@@ -129,7 +129,7 @@ from PyQt6.QtGui import (QPixmap, QColor, QIcon, QKeySequence, QShortcut,
129
129
 
130
130
  # ----- QtCore -----
131
131
  from PyQt6.QtCore import (Qt, pyqtSignal, QCoreApplication, QTimer, QSize, QSignalBlocker, QModelIndex, QThread, QUrl, QSettings, QEvent, QByteArray, QObject,
132
- QPropertyAnimation, QEasingCurve
132
+ QPropertyAnimation, QEasingCurve, QElapsedTimer
133
133
  )
134
134
 
135
135
  from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
@@ -187,7 +187,7 @@ from setiastro.saspro.resources import (
187
187
  platesolve_path, psf_path, supernova_path, starregistration_path,
188
188
  stacking_path, pedestal_icon_path, starspike_path, aperture_path,
189
189
  jwstpupil_path, signature_icon_path, livestacking_path, hrdiagram_path,
190
- convoicon_path, spcc_icon_path, sasp_data_path, exoicon_path, peeker_icon,
190
+ convoicon_path, spcc_icon_path, sasp_data_path, exoicon_path, peeker_icon,rotatearbitrary_path,
191
191
  dse_icon_path, astrobin_filters_csv_path, isophote_path, statstretch_path,
192
192
  starstretch_path, curves_path, disk_path, uhs_path, blink_path, ppp_path,
193
193
  nbtorgb_path, freqsep_path, contsub_path, halo_path, cosmic_path,
@@ -467,26 +467,23 @@ class AstroSuiteProMainWindow(
467
467
  self.mdi.linkViewDropped.connect(self._on_linkview_drop)
468
468
 
469
469
  self.doc_manager.set_mdi_area(self.mdi)
470
-
470
+ # Coalesce undo/redo label refreshes
471
+ self._undo_redo_refresh_pending = False
472
+ self._undo_redo_refresh_timer = QTimer(self)
473
+ self._undo_redo_refresh_timer.setSingleShot(True)
474
+ self._undo_redo_refresh_timer.timeout.connect(self._do_undo_redo_label_refresh)
471
475
  # Keep the toolbar in sync whenever anything relevant changes
472
- self.doc_manager.documentAdded.connect(lambda *_: self.update_undo_redo_action_labels())
473
- self.doc_manager.documentRemoved.connect(lambda *_: self.update_undo_redo_action_labels())
474
- self.doc_manager.imageRegionUpdated.connect(lambda *_: self.update_undo_redo_action_labels())
475
- self.doc_manager.previewRepaintRequested.connect(lambda *_: self.update_undo_redo_action_labels())
476
-
477
- # Also refresh when the active subwindow changes
478
- try:
479
- self.mdi.subWindowActivated.connect(lambda *_: self.update_undo_redo_action_labels())
480
- except Exception:
481
- pass
482
-
483
- try:
484
- QApplication.instance().focusChanged.connect(
485
- lambda *_: QTimer.singleShot(0, self.update_undo_redo_action_labels)
486
- )
487
- except Exception:
488
- pass
489
-
476
+ self.doc_manager.documentAdded.connect(lambda *_: self._schedule_undo_redo_label_refresh())
477
+ self.doc_manager.documentRemoved.connect(lambda *_: self._schedule_undo_redo_label_refresh())
478
+ self.doc_manager.imageRegionUpdated.connect(lambda *_: self._schedule_undo_redo_label_refresh())
479
+ self.doc_manager.previewRepaintRequested.connect(lambda *_: self._schedule_undo_redo_label_refresh())
480
+ self.mdi.subWindowActivated.connect(lambda *_: self._schedule_undo_redo_label_refresh())
481
+
482
+ # optional: keep, but schedule (or remove entirely)
483
+ #try:
484
+ # QApplication.instance().focusChanged.connect(lambda *_: self._schedule_undo_redo_label_refresh())
485
+ #except Exception:
486
+ # pass
490
487
  self.shortcuts.load_shortcuts()
491
488
  self._ensure_persistent_names()
492
489
  self._restore_window_placement()
@@ -570,6 +567,22 @@ class AstroSuiteProMainWindow(
570
567
 
571
568
  # _init_log_dock, _hook_stdout_stderr, and _append_log_text are now in DockMixin
572
569
 
570
+ def _schedule_undo_redo_label_refresh(self):
571
+ # Coalesce many triggers into one UI update
572
+ if getattr(self, "_undo_redo_refresh_pending", False):
573
+ return
574
+ self._undo_redo_refresh_pending = True
575
+ # 0ms is fine *if* it’s a real attribute timer (not a local)
576
+ self._undo_redo_refresh_timer.start(0)
577
+
578
+ def _do_undo_redo_label_refresh(self):
579
+ self._undo_redo_refresh_pending = False
580
+ try:
581
+ self.update_undo_redo_action_labels()
582
+ except Exception:
583
+ pass
584
+
585
+
573
586
  def _rebuild_menus_for_language(self):
574
587
  """Rebuild menus after language change to apply new translations."""
575
588
  try:
@@ -608,7 +621,7 @@ class AstroSuiteProMainWindow(
608
621
  doc.changed.connect(self.update_undo_redo_action_labels)
609
622
  except Exception:
610
623
  pass
611
- self.update_undo_redo_action_labels()
624
+ self._schedule_undo_redo_label_refresh()
612
625
 
613
626
  def _promote_roi_preview_to_real_doc(self, st: dict, preview_doc) -> None:
614
627
  """
@@ -3002,17 +3015,17 @@ class AstroSuiteProMainWindow(
3002
3015
 
3003
3016
  self.convo_window.show()
3004
3017
 
3005
-
3006
-
3007
3018
  def _apply_extract_luminance_preset_to_doc(self, doc, preset=None):
3008
-
3009
3019
  from PyQt6.QtWidgets import QMessageBox
3010
- from setiastro.saspro.luminancerecombine import compute_luminance, _LUMA_REC709, _LUMA_REC601, _LUMA_REC2020
3011
- from setiastro.saspro.headless_utils import normalize_headless_main, unwrap_docproxy
3020
+ from setiastro.saspro.luminancerecombine import (
3021
+ compute_luminance,
3022
+ resolve_luma_profile_weights,
3023
+ )
3024
+ from setiastro.saspro.headless_utils import unwrap_docproxy
3025
+ import numpy as np
3012
3026
 
3013
3027
  doc = unwrap_docproxy(doc)
3014
3028
  p = dict(preset or {})
3015
- mode = (p.get("mode") or "rec709").lower()
3016
3029
 
3017
3030
  if doc is None or getattr(doc, "image", None) is None:
3018
3031
  QMessageBox.information(self, "Extract Luminance", "No target image.")
@@ -3020,52 +3033,43 @@ class AstroSuiteProMainWindow(
3020
3033
 
3021
3034
  img = np.asarray(doc.image)
3022
3035
 
3023
- # pick weights
3024
- if mode == "rec601":
3025
- w = _LUMA_REC601
3026
- elif mode == "rec2020":
3027
- w = _LUMA_REC2020
3028
- elif mode == "max":
3029
- w = None
3030
- else:
3031
- w = _LUMA_REC709
3036
+ mode = str(p.get("mode", "rec709")).strip()
3037
+ resolved_method, w, profile_name = resolve_luma_profile_weights(mode)
3032
3038
 
3033
- L = compute_luminance(img, method=mode, weights=w)
3039
+ L = compute_luminance(img, method=resolved_method, weights=w)
3034
3040
 
3035
3041
  dm = getattr(self, "doc_manager", None)
3036
3042
  if dm is None:
3037
- # headless fallback: just overwrite active doc
3038
3043
  doc.apply_edit(L.astype(np.float32), step_name="Extract Luminance")
3039
3044
  return
3040
3045
 
3041
- # normal behavior: create a new mono document
3046
+ meta = {
3047
+ "step_name": "Extract Luminance",
3048
+ "luma_method": resolved_method,
3049
+ }
3050
+ if w is not None:
3051
+ meta["luma_weights"] = np.asarray(w, dtype=np.float32).tolist()
3052
+ if profile_name:
3053
+ meta["luma_profile"] = str(profile_name)
3054
+
3042
3055
  try:
3056
+ suffix = f"{profile_name}" if profile_name else resolved_method
3043
3057
  new_doc = dm.create_document_from_array(
3044
3058
  L.astype(np.float32),
3045
- name=f"{doc.display_name()} -- Luminance ({mode})",
3059
+ name=f"{doc.display_name()} -- Luminance ({suffix})",
3046
3060
  is_mono=True,
3047
- metadata={"step_name":"Extract Luminance", "luma_method":mode}
3061
+ metadata=meta,
3048
3062
  )
3049
3063
  dm.add_document(new_doc)
3050
3064
  except Exception:
3051
- # safe fallback
3052
3065
  doc.apply_edit(L.astype(np.float32), step_name="Extract Luminance")
3053
3066
 
3054
-
3055
3067
  def _extract_luminance(self, doc=None, preset: dict | None = None):
3056
- from setiastro.saspro.luminancerecombine import _LUMA_REC709, _LUMA_REC601, _LUMA_REC2020
3057
- """
3058
- If doc is None, uses the active subwindow's document.
3059
- Otherwise, run on the provided doc (for drag-and-drop to a specific view).
3060
- Creates a new mono document (float32, [0..1]) and spawns a subwindow.
3061
-
3062
- Preset schema:
3063
- {
3064
- "mode": "rec709" | "rec601" | "rec2020" | "max" | "snr" | "equal" | "median",
3065
- # aliases accepted: method, luma_method, nb_max -> "max", snr_unequal -> "snr"
3066
- }
3067
- """
3068
- # 1) resolve source document
3068
+ from PyQt6.QtWidgets import QMessageBox
3069
+ from PyQt6.QtGui import QIcon
3070
+ from setiastro.saspro.luminancerecombine import compute_luminance, resolve_luma_profile_weights
3071
+
3072
+
3069
3073
  sw = None
3070
3074
  if doc is None:
3071
3075
  sw = self.mdi.activeSubWindow()
@@ -3084,70 +3088,19 @@ class AstroSuiteProMainWindow(
3084
3088
  QMessageBox.information(self, "Extract Luminance", "Luminance extraction requires an RGB image.")
3085
3089
  return
3086
3090
 
3087
- # 2) normalize to [0,1] float32
3088
- a = img.astype(np.float32, copy=False)
3089
- if a.size:
3090
- m = float(np.nanmax(a))
3091
- if np.isfinite(m) and m > 1.0:
3092
- a = a / m
3093
- a = np.clip(a, 0.0, 1.0)
3094
-
3095
- # 3) choose luminance method
3096
3091
  p = dict(preset or {})
3097
- method = str(
3092
+ mode = str(
3098
3093
  p.get("mode",
3099
3094
  p.get("method",
3100
3095
  p.get("luma_method",
3101
3096
  getattr(self, "luma_method", "rec709"))))
3102
- ).strip().lower()
3103
-
3104
- # aliases
3105
- alias = {
3106
- "rec.709": "rec709",
3107
- "rec-709": "rec709",
3108
- "rgb": "rec709",
3109
- "k": "rec709",
3110
- "rec.601": "rec601",
3111
- "rec-601": "rec601",
3112
- "rec.2020": "rec2020",
3113
- "rec-2020": "rec2020",
3114
- "nb_max": "max",
3115
- "narrowband": "max",
3116
- "snr_unequal": "snr",
3117
- "unequal_noise": "snr",
3118
- }
3119
- method = alias.get(method, method)
3120
-
3121
- # 4) compute luminance per selected method
3122
- luma_weights = None
3123
- if method == "rec601":
3124
- luma_weights = _LUMA_REC601
3125
- y = np.tensordot(a, _LUMA_REC601, axes=([2],[0]))
3126
- elif method == "rec2020":
3127
- luma_weights = _LUMA_REC2020
3128
- y = np.tensordot(a, _LUMA_REC2020, axes=([2],[0]))
3129
- elif method == "max":
3130
- y = a.max(axis=2)
3131
- elif method == "median":
3132
- y = np.median(a, axis=2)
3133
- elif method == "equal":
3134
- luma_weights = np.array([1/3, 1/3, 1/3], dtype=np.float32)
3135
- y = a.mean(axis=2)
3136
- elif method == "snr":
3137
- from setiastro.saspro.luminancerecombine import _estimate_noise_sigma_per_channel
3138
- sigma = _estimate_noise_sigma_per_channel(a)
3139
- w = 1.0 / (sigma[:3]**2 + 1e-12)
3140
- w = w / w.sum()
3141
- luma_weights = w.astype(np.float32)
3142
- y = np.tensordot(a[..., :3], luma_weights, axes=([2],[0]))
3143
- else: # "rec709" default
3144
- method = "rec709"
3145
- luma_weights = _LUMA_REC709
3146
- y = np.tensordot(a, _LUMA_REC709, axes=([2],[0]))
3147
-
3148
- y = np.clip(y.astype(np.float32, copy=False), 0.0, 1.0)
3149
-
3150
- # 5) metadata & title
3097
+ ).strip()
3098
+
3099
+ resolved_method, w, profile_name = resolve_luma_profile_weights(mode)
3100
+
3101
+ y = compute_luminance(img, method=resolved_method, weights=w)
3102
+
3103
+ # ---- metadata & title ----
3151
3104
  base_meta = {}
3152
3105
  try:
3153
3106
  base_meta = dict(getattr(doc, "metadata", {}) or {})
@@ -3159,13 +3112,16 @@ class AstroSuiteProMainWindow(
3159
3112
  "source": "ExtractLuminance",
3160
3113
  "is_mono": True,
3161
3114
  "bit_depth": "32f",
3162
- "luma_method": method,
3115
+ "luma_method": resolved_method,
3163
3116
  }
3164
- if luma_weights is not None:
3165
- meta["luma_weights"] = np.asarray(luma_weights, dtype=np.float32).tolist()
3117
+ if w is not None:
3118
+ meta["luma_weights"] = np.asarray(w, dtype=np.float32).tolist()
3119
+ if profile_name:
3120
+ meta["luma_profile"] = str(profile_name)
3166
3121
 
3167
3122
  base_title = sw.windowTitle() if sw else (getattr(doc, "title", getattr(doc, "name", "")) or "Untitled")
3168
- title = f"{base_title} -- Luminance"
3123
+ suffix = f"{profile_name}" if profile_name else resolved_method
3124
+ title = f"{base_title} -- Luminance ({suffix})"
3169
3125
 
3170
3126
  dm = getattr(self, "docman", None)
3171
3127
  if dm is None:
@@ -3193,19 +3149,19 @@ class AstroSuiteProMainWindow(
3193
3149
  except Exception:
3194
3150
  pass
3195
3151
 
3196
- # ðŸ" Remember for Replay (optional but consistent)
3197
3152
  try:
3198
3153
  remember = getattr(self, "remember_last_headless_command", None) or getattr(self, "_remember_last_headless_command", None)
3199
3154
  if callable(remember):
3200
- remember("extract_luminance", {"mode": method}, description="Extract Luminance")
3155
+ remember("extract_luminance", {"mode": mode}, description="Extract Luminance")
3201
3156
  except Exception:
3202
3157
  pass
3203
3158
 
3204
3159
  if hasattr(self, "_log"):
3205
- self._log(f"Extract Luminance ({method}) -> new mono document created.")
3160
+ self._log(f"Extract Luminance ({suffix}) -> new mono document created.")
3206
3161
 
3207
3162
  return new_doc
3208
3163
 
3164
+
3209
3165
  def _subwindow_docs(self):
3210
3166
  docs = []
3211
3167
  for sw in self.mdi.subWindowList():
@@ -5542,6 +5498,10 @@ class AstroSuiteProMainWindow(
5542
5498
  "rotate_180": "geom_rotate_180",
5543
5499
  "geom_rotate_180": "geom_rotate_180",
5544
5500
 
5501
+ "rotate_any": "geom_rotate_any",
5502
+ "rotate_arbitrary": "geom_rotate_any",
5503
+ "geom_rotate_any": "geom_rotate_any",
5504
+
5545
5505
  "invert": "geom_invert",
5546
5506
  "geom_invert": "geom_invert",
5547
5507
 
@@ -6542,6 +6502,17 @@ class AstroSuiteProMainWindow(
6542
6502
  QMessageBox.warning(self, "Rotate 180Â deg", str(e))
6543
6503
  return
6544
6504
 
6505
+ if cid == "geom_rotate_any":
6506
+ try:
6507
+ angle = float(preset.get("angle_deg", preset.get("angle", 0.0)))
6508
+ called = _call_any(["_apply_geom_rot_any_to_doc"], doc, angle_deg=angle)
6509
+ if not called:
6510
+ raise RuntimeError("No rotate-any apply method found")
6511
+ self._log(f"Rotate ({angle:g}°) applied to '{target_sw.windowTitle()}'")
6512
+ except Exception as e:
6513
+ QMessageBox.warning(self, "Rotate...", str(e))
6514
+ return
6515
+
6545
6516
  if cid == "geom_rescale":
6546
6517
  try:
6547
6518
  factor = float(preset.get("factor", 1.0))
@@ -7562,7 +7533,7 @@ class AstroSuiteProMainWindow(
7562
7533
  except Exception:
7563
7534
  pass
7564
7535
 
7565
- try: self.update_undo_redo_action_labels()
7536
+ try: self._schedule_undo_redo_label_refresh()
7566
7537
  except Exception as e:
7567
7538
  import logging
7568
7539
  logging.debug(f"Exception suppressed: {type(e).__name__}: {e}")
@@ -8050,7 +8021,7 @@ class AstroSuiteProMainWindow(
8050
8021
  # If no subwindows remain, clear all "active doc" UI bits, including header
8051
8022
  if not self.mdi.subWindowList():
8052
8023
  self.currentDocumentChanged.emit(None) # drives HeaderViewerDock.set_document(None)
8053
- self.update_undo_redo_action_labels()
8024
+ self._schedule_undo_redo_label_refresh()
8054
8025
  self._hdr_refresh_timer.start(0) # belt-and-suspenders for manual widgets
8055
8026
  # If your dock has its own set_document, call it explicitly too
8056
8027
  hv = getattr(self, "header_viewer", None)
@@ -8392,19 +8363,20 @@ class AstroSuiteProMainWindow(
8392
8363
 
8393
8364
  # Misc UI refreshes (guarded)
8394
8365
  try:
8395
- self.update_undo_redo_action_labels()
8396
- except Exception:
8397
- pass
8398
- try:
8399
- if hasattr(self, "_hdr_refresh_timer") and self._hdr_refresh_timer is not None:
8400
- self._hdr_refresh_timer.start(0)
8366
+ self._schedule_undo_redo_label_refresh()
8401
8367
  except Exception:
8402
8368
  pass
8369
+ #try:
8370
+ # if hasattr(self, "_hdr_refresh_timer") and self._hdr_refresh_timer is not None:
8371
+ # self._hdr_refresh_timer.start(0)
8372
+ #except Exception:
8373
+ # pass
8403
8374
  try:
8404
8375
  self._refresh_mask_action_states()
8405
8376
  except Exception:
8406
8377
  pass
8407
8378
 
8379
+
8408
8380
  def _sync_docman_active(self, doc):
8409
8381
  dm = self.doc_manager
8410
8382
  try:
@@ -51,12 +51,10 @@ except ImportError:
51
51
  return cv2.resize(arr, (new_w, new_h), interpolation=cv2.INTER_LINEAR)
52
52
 
53
53
 
54
- # Try to import WCS update function
55
- try:
56
- from setiastro.saspro.wcs_utils import update_wcs_after_crop
57
- except ImportError:
58
- update_wcs_after_crop = None
54
+ from setiastro.saspro.wcs_update import update_wcs_after_crop
59
55
 
56
+ import cv2
57
+ import math
60
58
 
61
59
  if TYPE_CHECKING:
62
60
  pass
@@ -209,6 +207,44 @@ class GeometryMixin:
209
207
  except Exception as e:
210
208
  QMessageBox.critical(self, "Rotate 180°", str(e))
211
209
 
210
+ def _exec_geom_rot_any(self):
211
+ sw = self.mdi.activeSubWindow() if hasattr(self, "mdi") else None
212
+ view = sw.widget() if sw else None
213
+ doc = getattr(view, "document", None)
214
+ if doc is None or getattr(doc, "image", None) is None:
215
+ QMessageBox.information(self, self.tr("Rotate..."), self.tr("Active view has no image."))
216
+ return
217
+
218
+ if cv2 is None:
219
+ QMessageBox.warning(self, self.tr("Rotate..."), self.tr("OpenCV (cv2) is required for arbitrary rotation."))
220
+ return
221
+
222
+ dlg = QInputDialog(self)
223
+ dlg.setWindowTitle(self.tr("Rotate..."))
224
+ dlg.setLabelText(self.tr("Angle in degrees (positive = CCW):"))
225
+ dlg.setInputMode(QInputDialog.InputMode.DoubleInput)
226
+ dlg.setDoubleRange(-360.0, 360.0)
227
+ dlg.setDoubleDecimals(2)
228
+ dlg.setDoubleValue(0.0)
229
+ dlg.setWindowFlag(Qt.WindowType.Window, True)
230
+
231
+ try:
232
+ from setiastro.saspro.resources import rotatearbitrary_path
233
+ dlg.setWindowIcon(QIcon(rotatearbitrary_path))
234
+ except Exception:
235
+ pass
236
+
237
+ if dlg.exec() != QDialog.DialogCode.Accepted:
238
+ return
239
+
240
+ angle = float(dlg.doubleValue())
241
+ try:
242
+ self._apply_geom_rot_any_to_doc(doc, angle_deg=angle)
243
+ self._log(f"Rotate ({angle:g}°) applied to active view")
244
+ except Exception as e:
245
+ QMessageBox.critical(self, self.tr("Rotate..."), str(e))
246
+
247
+
212
248
  def _exec_geom_rescale(self):
213
249
  """Execute rescale operation on active view with dialog."""
214
250
  sw = self.mdi.activeSubWindow() if hasattr(self, "mdi") else None
@@ -334,6 +370,70 @@ class GeometryMixin:
334
370
 
335
371
  self._apply_geom_with_wcs(doc, out, M_src_to_dst=M, step_name="Rotate 180°")
336
372
 
373
+ def _apply_geom_rot_any_to_doc(self, doc, *, angle_deg: float):
374
+ if cv2 is None:
375
+ raise RuntimeError("cv2 is required for arbitrary rotation")
376
+
377
+ src = np.asarray(doc.image, dtype=np.float32, order="C")
378
+ h, w = src.shape[:2]
379
+
380
+ # Rotation about center
381
+ cx = (w - 1) * 0.5
382
+ cy = (h - 1) * 0.5
383
+
384
+ # OpenCV uses CCW degrees
385
+ A2 = cv2.getRotationMatrix2D((cx, cy), angle_deg, 1.0) # 2x3
386
+
387
+ # Convert to 3x3
388
+ M = np.array([
389
+ [A2[0,0], A2[0,1], A2[0,2]],
390
+ [A2[1,0], A2[1,1], A2[1,2]],
391
+ [0.0, 0.0, 1.0 ],
392
+ ], dtype=np.float32)
393
+
394
+ # Compute output bounds by rotating the four corners
395
+ corners = np.array([
396
+ [0.0, 0.0, 1.0],
397
+ [w - 1.0, 0.0, 1.0],
398
+ [w - 1.0, h - 1.0, 1.0],
399
+ [0.0, h - 1.0, 1.0],
400
+ ], dtype=np.float32).T # 3x4
401
+
402
+ rc = (M @ corners) # 3x4
403
+ xs = rc[0, :]
404
+ ys = rc[1, :]
405
+
406
+ min_x = float(xs.min())
407
+ max_x = float(xs.max())
408
+ min_y = float(ys.min())
409
+ max_y = float(ys.max())
410
+
411
+ out_w = int(math.ceil(max_x - min_x + 1.0))
412
+ out_h = int(math.ceil(max_y - min_y + 1.0))
413
+ if out_w <= 0 or out_h <= 0:
414
+ raise RuntimeError("Invalid output size after rotation")
415
+
416
+ # Shift so that min corner maps to (0,0)
417
+ T = np.array([
418
+ [1.0, 0.0, -min_x],
419
+ [0.0, 1.0, -min_y],
420
+ [0.0, 0.0, 1.0],
421
+ ], dtype=np.float32)
422
+
423
+ M = (T @ M).astype(np.float32) # final src->dst 3x3
424
+
425
+ # Warp
426
+ # cv2.warpPerspective expects (W,H)
427
+ flags = cv2.INTER_LANCZOS4
428
+ if src.ndim == 2:
429
+ out = cv2.warpPerspective(src, M, (out_w, out_h), flags=flags)
430
+ else:
431
+ # warpPerspective works on multi-channel too
432
+ out = cv2.warpPerspective(src, M, (out_w, out_h), flags=flags)
433
+
434
+ self._apply_geom_with_wcs(doc, out, M_src_to_dst=M, step_name=f"Rotate ({angle_deg:g}°)")
435
+
436
+
337
437
  def _apply_geom_rescale_to_doc(self, doc, *, factor: float):
338
438
  """Apply rescale to document with WCS update."""
339
439
  factor = float(max(0.1, min(10.0, factor)))
@@ -185,6 +185,7 @@ class MenuMixin:
185
185
  m_geom.addAction(self.act_geom_rot_cw)
186
186
  m_geom.addAction(self.act_geom_rot_ccw)
187
187
  m_geom.addAction(self.act_geom_rot_180)
188
+ m_geom.addAction(self.act_geom_rot_any)
188
189
  m_geom.addSeparator()
189
190
  m_geom.addAction(self.act_geom_rescale)
190
191
  m_geom.addSeparator()