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.
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/PKG-INFO +1 -7
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/README.md +0 -6
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/pyproject.toml +1 -1
- setiastrosuitepro-1.6.5.post2/src/setiastro/images/rotatearbitrary.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/__main__.py +13 -0
- setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/_generated/build_info.py +3 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/aberration_ai.py +9 -5
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/doc_manager.py +1 -1
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/main_window.py +103 -131
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/geometry_mixin.py +105 -5
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/menu_mixin.py +1 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/toolbar_mixin.py +166 -13
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/update_mixin.py +24 -10
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/legacy/image_manager.py +154 -20
- {setiastrosuitepro-1.6.3/src/setiastro/saspro → setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/legacy}/xisf.py +101 -11
- setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/luminancerecombine.py +510 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mask_creation.py +170 -15
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconv.py +84 -21
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconvcudnn.py +83 -21
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconvsport.py +84 -21
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/script_editor.py +5 -2
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/scripts.py +3 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/remove_stars_preset.py +55 -13
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/resources.py +2 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/shortcuts.py +34 -1
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/stacking_suite.py +655 -116
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_alignment.py +275 -330
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/subwindow.py +326 -247
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/supernovaasteroidhunter.py +1 -1
- setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/swap_manager.py +134 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/whitebalance.py +25 -4
- {setiastrosuitepro-1.6.3/src/setiastro/saspro/legacy → setiastrosuitepro-1.6.5.post2/src/setiastro/saspro}/xisf.py +240 -98
- setiastrosuitepro-1.6.3/src/setiastro/saspro/_generated/build_info.py +0 -3
- setiastrosuitepro-1.6.3/src/setiastro/saspro/luminancerecombine.py +0 -309
- setiastrosuitepro-1.6.3/src/setiastro/saspro/swap_manager.py +0 -99
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/LICENSE +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/license.txt +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/SASP_data.fits +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/astrobin_filters.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/astrobin_filters_page1_local.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/cali2.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/cali2color.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/celestial_catalog - original.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/celestial_catalog.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/detected_stars.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/fits_header_data.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/test.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/data/catalogs/updated_celestial_catalog.csv +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/Astro_Spikes.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/Background_startup.jpg +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/HRDiagram.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/LExtract.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/LInsert.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/Oxygenation-atm-2.svg.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/RGB080604.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/abeicon.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/aberration.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/andromedatry.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/andromedatry_satellited.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/annotated.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/aperture.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuite.ico +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuite.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuitepro.icns +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuitepro.ico +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/astrosuitepro.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/background.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/background2.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/benchmark.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/big_moon_stabilizer_timeline.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/big_moon_stabilizer_timeline_clean.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/blaster.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/blink.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/clahe.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/collage.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/colorwheel.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/contsub.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/convo.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/copyslot.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cosmic.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cosmicsat.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/crop1.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cropicon.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/curves.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/cvs.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/debayer.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/denoise_cnn_custom.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/denoise_cnn_graph.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/disk.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/dse.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/exoicon.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/eye.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/fliphorizontal.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/flipvertical.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/font.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/freqsep.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/functionbundle.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/graxpert.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/green.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/gridicon.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/halo.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/hdr.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/histogram.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/hubble.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/imagecombine.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/invert.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_figure.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_image.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_model.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/isophote_demo_residual.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/jwstpupil.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/linearfit.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/livestacking.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/mask.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/maskapply.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/maskcreate.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/maskremove.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/morpho.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/mosaic.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/multiscale_decomp.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/nbtorgb.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/neutral.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/nuke.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/openfile.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pedestal.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pen.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pixelmath.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/platesolve.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/ppp.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/pro.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/project.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/psf.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/redo.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/redoicon.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rescale.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rgbalign.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rgbcombo.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rgbextract.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rotate180.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rotateclockwise.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/rotatecounterclockwise.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/satellite.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/script.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/selectivecolor.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/simbad.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot0.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot1.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot2.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot3.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot4.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot5.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot6.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot7.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot8.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/slot9.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/spcc.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/spin_precession_vs_lunar_distance.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/spinner.gif +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/stacking.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/staradd.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/staralign.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starnet.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starregistration.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starspike.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/starstretch.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/statstretch.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/supernova.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/uhs.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/undoicon.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/upscale.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/viewbundle.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/whitebalance.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wimi_icon_256x256.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wimilogo.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wims.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/wrench_icon.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/images/xisfliberator.png +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/qml/ResourceMonitor.qml +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/_generated/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/abe.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/abe_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/aberration_ai_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/accel_installer.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/accel_workers.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/add_stars.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/astrobin_exporter.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/astrospike.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/astrospike_python.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/autostretch.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/backgroundneutral.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/batch_convert.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/batch_renamer.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/blemish_blaster.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/blink_comparator_pro.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/bundles.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/bundles_dock.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/cheat_sheet.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/clahe.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/comet_stacking.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/common_tr.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/config.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/config_bootstrap.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/config_manager.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/continuum_subtract.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/convo.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/convo_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/copyastro.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/cosmicclarity.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/cosmicclarity_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/crop_dialog_pro.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/crop_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/curve_editor_pro.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/curves_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/debayer.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/debug_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/dnd_mime.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/exoplanet_detector.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/file_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/fitsmodifier.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/fix_bom.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/free_torch_memory.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/frequency_separation.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/function_bundle.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/generate_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ghs_dialog_pro.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ghs_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/graxpert.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/graxpert_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/dock_mixin.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/file_mixin.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/header_mixin.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/mask_mixin.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/theme_mixin.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/mixins/view_mixin.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/statistics_dialog.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/halobgon.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/header_viewer.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/headless_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/histogram.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/history_explorer.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/i18n.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/image_combine.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/image_peeker_pro.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/mdi_snap.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/scnr.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/starbasedwhitebalance.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/imageops/stretch.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/isophote.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/layers.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/layers_dock.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/lazy_imports.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/legacy/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/legacy/numba_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/linear_fit.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/live_stacking.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/log_bus.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/logging_config.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/main_helpers.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/masks_core.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mdi_widgets.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/memory_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/metadata_patcher.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/mfdeconv_earlystop.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/minorbodycatalog.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/morphology.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/multiscale_decomp.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/nbtorgb_stars.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/numba_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/numba_warmup.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/command_help_dialog.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/command_runner.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/commands.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/ops/settings.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/parallel_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pedestal.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/perfect_palette_picker.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pipeline.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pixelmath.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/plate_solver.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/project_io.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/psf_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/psf_viewer.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/pyi_rthook_astroquery.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/remove_green.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/remove_stars.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/rgb_combination.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/rgb_extract.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/rgbalign.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/runtime_imports.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/runtime_torch.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/save_options.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/selective_color.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/sfcc.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/signature_insert.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_alignment_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_metrics.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_spikes.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/star_stretch.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/stat_stretch.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/status_log_dock.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/torch_backend.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/torch_rejection.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/all_source_strings.json +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/ar_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/de_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/es_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/fr_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/hi_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/integrate_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/it_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/ja_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/pt_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/ru_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ar.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ar.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_de.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_de.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_es.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_es.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_fr.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_fr.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_hi.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_hi.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_it.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_it.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ja.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ja.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_pt.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_pt.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ru.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_ru.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_sw.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_sw.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_uk.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_uk.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_zh.qm +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/saspro_zh.ts +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/sw_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/uk_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/translations/zh_translations.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/versioning.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/view_bundle.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescale_hdr.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescale_hdr_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescalede.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wavescalede_preset.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wcs_update.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/__init__.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/common_utilities.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/graphics_views.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/image_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/minigame/game.js +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/minigame/index.html +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/minigame/style.css +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/preview_dialogs.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/resource_monitor.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/spinboxes.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/themed_buttons.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/widgets/wavelet_utils.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wimi.py +0 -0
- {setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/wims.py +0 -0
- {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
|
+
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
|
+
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"
|
|
Binary file
|
|
@@ -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) ----
|
{setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/aberration_ai.py
RENAMED
|
@@ -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}")
|
|
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
|
-
#
|
|
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
|
-
#
|
|
687
|
-
|
|
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
|
{setiastrosuitepro-1.6.3 → setiastrosuitepro-1.6.5.post2}/src/setiastro/saspro/gui/main_window.py
RENAMED
|
@@ -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.
|
|
473
|
-
self.doc_manager.documentRemoved.connect(lambda *_: self.
|
|
474
|
-
self.doc_manager.imageRegionUpdated.connect(lambda *_: self.
|
|
475
|
-
self.doc_manager.previewRepaintRequested.connect(lambda *_: self.
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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.
|
|
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
|
|
3011
|
-
|
|
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
|
-
|
|
3024
|
-
|
|
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=
|
|
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
|
-
|
|
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 ({
|
|
3059
|
+
name=f"{doc.display_name()} -- Luminance ({suffix})",
|
|
3046
3060
|
is_mono=True,
|
|
3047
|
-
metadata=
|
|
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
|
|
3057
|
-
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
|
|
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
|
-
|
|
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()
|
|
3103
|
-
|
|
3104
|
-
|
|
3105
|
-
|
|
3106
|
-
|
|
3107
|
-
|
|
3108
|
-
|
|
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":
|
|
3115
|
+
"luma_method": resolved_method,
|
|
3163
3116
|
}
|
|
3164
|
-
if
|
|
3165
|
-
meta["luma_weights"] = np.asarray(
|
|
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
|
-
|
|
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":
|
|
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 ({
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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()
|