setiastrosuitepro 1.6.5.post2__tar.gz → 1.6.9__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.5.post2 → setiastrosuitepro-1.6.9}/PKG-INFO +2 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/pyproject.toml +2 -1
- setiastrosuitepro-1.6.9/src/setiastro/images/acv_icon.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/first_quarter.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/full_moon.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/last_quarter.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/new_moon.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_crescent_1.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_crescent_2.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_crescent_3.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_crescent_4.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_crescent_5.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_gibbous_1.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_gibbous_2.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_gibbous_3.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_gibbous_4.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waning_gibbous_5.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_crescent_1.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_crescent_2.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_crescent_3.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_crescent_4.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_crescent_5.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_gibbous_1.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_gibbous_2.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_gibbous_3.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_gibbous_4.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/images/waxing_gibbous_5.png +0 -0
- setiastrosuitepro-1.6.9/src/setiastro/qml/ResourceMonitor.qml +128 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/__main__.py +6 -0
- setiastrosuitepro-1.6.9/src/setiastro/saspro/_generated/build_info.py +3 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/abe.py +37 -4
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/aberration_ai.py +228 -16
- setiastrosuitepro-1.6.9/src/setiastro/saspro/acv_exporter.py +379 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/add_stars.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/backgroundneutral.py +35 -7
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/blemish_blaster.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/blink_comparator_pro.py +74 -24
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/clahe.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/continuum_subtract.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/convo.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/cosmicclarity.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/crop_dialog_pro.py +123 -7
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/curve_editor_pro.py +109 -42
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/doc_manager.py +67 -4
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/exoplanet_detector.py +120 -28
- setiastrosuitepro-1.6.9/src/setiastro/saspro/frequency_separation.py +2303 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ghs_dialog_pro.py +81 -16
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/graxpert.py +1 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/main_window.py +330 -91
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/menu_mixin.py +1 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/toolbar_mixin.py +205 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/update_mixin.py +121 -33
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/view_mixin.py +42 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/halobgon.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/histogram.py +5 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/image_combine.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/image_peeker_pro.py +4 -0
- setiastrosuitepro-1.6.9/src/setiastro/saspro/imageops/stretch.py +707 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/isophote.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/legacy/numba_utils.py +43 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/live_stacking.py +180 -79
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/mask_creation.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/mfdeconv.py +29 -14
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/mfdeconvcudnn.py +36 -49
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/mfdeconvsport.py +28 -14
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/morphology.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/multiscale_decomp.py +51 -12
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/numba_utils.py +72 -2
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ops/commands.py +18 -18
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/perfect_palette_picker.py +37 -3
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/plate_solver.py +84 -49
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/psf_viewer.py +119 -37
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/resources.py +67 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/rgbalign.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/selective_color.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/sfcc.py +60 -2
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/shortcuts.py +142 -23
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/signature_insert.py +692 -33
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/stacking_suite.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/star_alignment.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/star_spikes.py +4 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/star_stretch.py +38 -3
- setiastrosuitepro-1.6.9/src/setiastro/saspro/stat_stretch.py +880 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/subwindow.py +315 -93
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/wavescale_hdr.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/wavescalede.py +4 -1
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/whitebalance.py +38 -11
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/common_utilities.py +28 -21
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/resource_monitor.py +109 -59
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/spinboxes.py +10 -13
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/wimi.py +27 -656
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/wims.py +13 -3
- setiastrosuitepro-1.6.5.post2/src/setiastro/qml/ResourceMonitor.qml +0 -126
- setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/_generated/build_info.py +0 -3
- setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/frequency_separation.py +0 -1349
- setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/imageops/stretch.py +0 -236
- setiastrosuitepro-1.6.5.post2/src/setiastro/saspro/stat_stretch.py +0 -538
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/LICENSE +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/README.md +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/license.txt +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/SASP_data.fits +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/astrobin_filters.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/astrobin_filters_page1_local.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/cali2.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/cali2color.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/celestial_catalog - original.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/celestial_catalog.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/detected_stars.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/fits_header_data.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/test.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/data/catalogs/updated_celestial_catalog.csv +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/Astro_Spikes.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/Background_startup.jpg +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/HRDiagram.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/LExtract.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/LInsert.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/Oxygenation-atm-2.svg.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/RGB080604.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/abeicon.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/aberration.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/andromedatry.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/andromedatry_satellited.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/annotated.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/aperture.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/astrosuite.ico +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/astrosuite.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/astrosuitepro.icns +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/astrosuitepro.ico +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/astrosuitepro.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/background.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/background2.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/benchmark.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/big_moon_stabilizer_timeline.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/big_moon_stabilizer_timeline_clean.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/blaster.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/blink.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/clahe.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/collage.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/colorwheel.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/contsub.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/convo.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/copyslot.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/cosmic.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/cosmicsat.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/crop1.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/cropicon.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/curves.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/cvs.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/debayer.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/denoise_cnn_custom.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/denoise_cnn_graph.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/disk.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/dse.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/exoicon.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/eye.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/fliphorizontal.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/flipvertical.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/font.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/freqsep.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/functionbundle.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/graxpert.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/green.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/gridicon.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/halo.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/hdr.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/histogram.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/hubble.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/imagecombine.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/invert.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/isophote.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/isophote_demo_figure.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/isophote_demo_image.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/isophote_demo_model.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/isophote_demo_residual.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/jwstpupil.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/linearfit.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/livestacking.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/mask.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/maskapply.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/maskcreate.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/maskremove.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/morpho.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/mosaic.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/multiscale_decomp.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/nbtorgb.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/neutral.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/nuke.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/openfile.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/pedestal.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/pen.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/pixelmath.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/platesolve.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/ppp.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/pro.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/project.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/psf.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/redo.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/redoicon.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rescale.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rgbalign.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rgbcombo.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rgbextract.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rotate180.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rotatearbitrary.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rotateclockwise.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/rotatecounterclockwise.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/satellite.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/script.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/selectivecolor.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/simbad.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot0.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot1.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot2.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot3.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot4.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot5.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot6.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot7.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot8.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/slot9.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/spcc.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/spin_precession_vs_lunar_distance.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/spinner.gif +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/stacking.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/staradd.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/staralign.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/starnet.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/starregistration.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/starspike.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/starstretch.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/statstretch.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/supernova.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/uhs.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/undoicon.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/upscale.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/viewbundle.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/whitebalance.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/wimi_icon_256x256.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/wimilogo.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/wims.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/wrench_icon.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/images/xisfliberator.png +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/_generated/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/abe_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/aberration_ai_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/accel_installer.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/accel_workers.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/astrobin_exporter.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/astrospike.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/astrospike_python.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/autostretch.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/batch_convert.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/batch_renamer.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/bundles.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/bundles_dock.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/cheat_sheet.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/comet_stacking.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/common_tr.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/config.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/config_bootstrap.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/config_manager.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/convo_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/copyastro.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/cosmicclarity_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/crop_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/curves_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/debayer.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/debug_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/dnd_mime.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/file_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/fitsmodifier.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/fix_bom.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/free_torch_memory.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/function_bundle.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/generate_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ghs_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/graxpert_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/dock_mixin.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/file_mixin.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/geometry_mixin.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/header_mixin.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/mask_mixin.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/mixins/theme_mixin.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/gui/statistics_dialog.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/header_viewer.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/headless_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/history_explorer.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/i18n.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/imageops/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/imageops/mdi_snap.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/imageops/scnr.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/imageops/starbasedwhitebalance.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/layers.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/layers_dock.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/lazy_imports.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/legacy/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/legacy/image_manager.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/legacy/xisf.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/linear_fit.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/log_bus.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/logging_config.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/luminancerecombine.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/main_helpers.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/masks_core.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/mdi_widgets.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/memory_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/metadata_patcher.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/mfdeconv_earlystop.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/minorbodycatalog.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/nbtorgb_stars.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/numba_warmup.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ops/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ops/command_help_dialog.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ops/command_runner.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ops/script_editor.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ops/scripts.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/ops/settings.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/parallel_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/pedestal.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/pipeline.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/pixelmath.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/project_io.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/psf_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/pyi_rthook_astroquery.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/remove_green.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/remove_stars.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/remove_stars_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/rgb_combination.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/rgb_extract.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/runtime_imports.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/runtime_torch.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/save_options.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/star_alignment_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/star_metrics.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/status_log_dock.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/supernovaasteroidhunter.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/swap_manager.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/torch_backend.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/torch_rejection.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/all_source_strings.json +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/ar_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/de_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/es_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/fr_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/hi_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/integrate_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/it_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/ja_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/pt_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/ru_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_ar.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_ar.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_de.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_de.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_es.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_es.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_fr.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_fr.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_hi.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_hi.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_it.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_it.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_ja.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_ja.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_pt.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_pt.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_ru.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_ru.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_sw.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_sw.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_uk.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_uk.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_zh.qm +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/saspro_zh.ts +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/sw_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/uk_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/translations/zh_translations.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/versioning.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/view_bundle.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/wavescale_hdr_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/wavescalede_preset.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/wcs_update.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/__init__.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/graphics_views.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/image_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/minigame/game.js +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/minigame/index.html +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/minigame/style.css +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/preview_dialogs.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/themed_buttons.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/widgets/wavelet_utils.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/window_shelf.py +0 -0
- {setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/xisf.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: setiastrosuitepro
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.9
|
|
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
|
|
@@ -25,6 +25,7 @@ Requires-Dist: astroalign
|
|
|
25
25
|
Requires-Dist: astropy
|
|
26
26
|
Requires-Dist: astroquery
|
|
27
27
|
Requires-Dist: exifread
|
|
28
|
+
Requires-Dist: imagecodecs (>=2025.11.11,<2026.0.0) ; python_version >= "3.11" and sys_platform == "darwin"
|
|
28
29
|
Requires-Dist: imageio
|
|
29
30
|
Requires-Dist: jplephem
|
|
30
31
|
Requires-Dist: lightkurve
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "setiastrosuitepro"
|
|
3
|
-
version = "1.6.
|
|
3
|
+
version = "1.6.9"
|
|
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"
|
|
@@ -77,6 +77,7 @@ psutil = "*"
|
|
|
77
77
|
|
|
78
78
|
# computer vision
|
|
79
79
|
opencv-python-headless = "*"
|
|
80
|
+
imagecodecs = {version = "^2025.11.11", python = ">=3.11", platform = "darwin"}
|
|
80
81
|
|
|
81
82
|
[tool.poetry.group.dev.dependencies]
|
|
82
83
|
pytest = "*"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import QtQuick 2.15
|
|
2
|
+
import QtQuick.Controls 2.15
|
|
3
|
+
import QtQuick.Layouts 1.15
|
|
4
|
+
import QtQuick.Window 2.15 // ✅ gives us access to the attached Window handle
|
|
5
|
+
|
|
6
|
+
Rectangle {
|
|
7
|
+
id: root
|
|
8
|
+
width: 200
|
|
9
|
+
height: 60
|
|
10
|
+
color: "#80000000"
|
|
11
|
+
radius: 30
|
|
12
|
+
border.color: "#555"
|
|
13
|
+
border.width: 1
|
|
14
|
+
|
|
15
|
+
// Bind directly to the injected Python object (context property "backend")
|
|
16
|
+
property double cpuUsage: backend ? backend.cpuUsage : 0.0
|
|
17
|
+
property double ramUsage: backend ? backend.ramUsage : 0.0
|
|
18
|
+
property double gpuUsage: backend ? backend.gpuUsage : 0.0
|
|
19
|
+
property string appRamString: backend ? backend.appRamString : "0 MB"
|
|
20
|
+
|
|
21
|
+
// ─── Wayland-friendly drag (works if we have a real QQuickWindow) ───
|
|
22
|
+
MouseArea {
|
|
23
|
+
anchors.fill: parent
|
|
24
|
+
hoverEnabled: true
|
|
25
|
+
cursorShape: Qt.OpenHandCursor
|
|
26
|
+
|
|
27
|
+
onPressed: {
|
|
28
|
+
// Window-attached handle: root.Window.window is the QQuickWindow
|
|
29
|
+
var w = root.Window ? root.Window.window : null;
|
|
30
|
+
if (w && w.startSystemMove) {
|
|
31
|
+
// Wayland: this is the correct, compositor-approved move
|
|
32
|
+
w.startSystemMove();
|
|
33
|
+
} else {
|
|
34
|
+
// Fallback (Windows embed, or platforms where startSystemMove isn't exposed)
|
|
35
|
+
// Do nothing; your existing Windows behavior remains unchanged.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
component MiniGauge: Item {
|
|
41
|
+
Layout.preferredWidth: 40
|
|
42
|
+
Layout.preferredHeight: 40
|
|
43
|
+
property string label: ""
|
|
44
|
+
property color barColor: "#0f0"
|
|
45
|
+
property double value: 0
|
|
46
|
+
|
|
47
|
+
onValueChanged: if (gaugeCanvas) gaugeCanvas.requestPaint()
|
|
48
|
+
|
|
49
|
+
Canvas {
|
|
50
|
+
id: gaugeCanvas
|
|
51
|
+
anchors.fill: parent
|
|
52
|
+
antialiasing: true
|
|
53
|
+
onPaint: {
|
|
54
|
+
var ctx = getContext("2d");
|
|
55
|
+
var cx = width / 2;
|
|
56
|
+
var cy = height / 2;
|
|
57
|
+
var r = (width / 2) - 3;
|
|
58
|
+
|
|
59
|
+
ctx.reset();
|
|
60
|
+
|
|
61
|
+
ctx.beginPath();
|
|
62
|
+
ctx.arc(cx, cy, r, 0, 2*Math.PI);
|
|
63
|
+
ctx.lineWidth = 4;
|
|
64
|
+
ctx.strokeStyle = "#444";
|
|
65
|
+
ctx.stroke();
|
|
66
|
+
|
|
67
|
+
var start = -Math.PI/2;
|
|
68
|
+
var end = start + (value/100 * 2*Math.PI);
|
|
69
|
+
|
|
70
|
+
ctx.beginPath();
|
|
71
|
+
ctx.arc(cx, cy, r, start, end);
|
|
72
|
+
ctx.lineWidth = 4;
|
|
73
|
+
ctx.lineCap = "round";
|
|
74
|
+
ctx.strokeStyle = barColor;
|
|
75
|
+
ctx.stroke();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Text {
|
|
80
|
+
anchors.centerIn: parent
|
|
81
|
+
text: Math.round(value) + "%"
|
|
82
|
+
font.pixelSize: 10
|
|
83
|
+
font.bold: true
|
|
84
|
+
color: "#fff"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
RowLayout {
|
|
89
|
+
anchors.centerIn: parent
|
|
90
|
+
spacing: 15
|
|
91
|
+
|
|
92
|
+
ColumnLayout {
|
|
93
|
+
spacing: 2
|
|
94
|
+
MiniGauge {
|
|
95
|
+
value: root.cpuUsage
|
|
96
|
+
barColor: root.cpuUsage > 80 ? "#ff4444" : (root.cpuUsage > 50 ? "#ffbb33" : "#00C851")
|
|
97
|
+
}
|
|
98
|
+
Text {
|
|
99
|
+
Layout.alignment: Qt.AlignHCenter
|
|
100
|
+
text: "CPU"
|
|
101
|
+
color: "#aaaaaa"
|
|
102
|
+
font.pixelSize: 9
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
ColumnLayout {
|
|
107
|
+
spacing: 2
|
|
108
|
+
MiniGauge { value: root.ramUsage; barColor: "#33b5e5" }
|
|
109
|
+
Text {
|
|
110
|
+
Layout.alignment: Qt.AlignHCenter
|
|
111
|
+
text: "RAM"
|
|
112
|
+
color: "#aaaaaa"
|
|
113
|
+
font.pixelSize: 9
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
ColumnLayout {
|
|
118
|
+
spacing: 2
|
|
119
|
+
MiniGauge { value: root.gpuUsage; barColor: "#aa66cc" }
|
|
120
|
+
Text {
|
|
121
|
+
Layout.alignment: Qt.AlignHCenter
|
|
122
|
+
text: "GPU"
|
|
123
|
+
color: "#aaaaaa"
|
|
124
|
+
font.pixelSize: 9
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -92,9 +92,15 @@ def _init_splash():
|
|
|
92
92
|
# Create QApplication
|
|
93
93
|
_app = QApplication(sys.argv)
|
|
94
94
|
|
|
95
|
+
try:
|
|
96
|
+
_app.setQuitOnLastWindowClosed(True)
|
|
97
|
+
except Exception:
|
|
98
|
+
pass
|
|
99
|
+
|
|
95
100
|
if sys.platform.startswith("linux"):
|
|
96
101
|
try:
|
|
97
102
|
print("Qt platform:", _app.platformName())
|
|
103
|
+
print("QuitOnLastWindowClosed:", _app.quitOnLastWindowClosed())
|
|
98
104
|
print("XDG_SESSION_TYPE:", os.environ.get("XDG_SESSION_TYPE"))
|
|
99
105
|
print("QT_QPA_PLATFORM:", os.environ.get("QT_QPA_PLATFORM"))
|
|
100
106
|
print("QT_OPENGL:", os.environ.get("QT_OPENGL"))
|
|
@@ -491,14 +491,21 @@ class ABEDialog(QDialog):
|
|
|
491
491
|
# Non-modal: allow user to switch between images while dialog is open
|
|
492
492
|
self.setWindowModality(Qt.WindowModality.NonModal)
|
|
493
493
|
self.setModal(False)
|
|
494
|
-
|
|
494
|
+
try:
|
|
495
|
+
self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True)
|
|
496
|
+
except Exception:
|
|
497
|
+
pass # older PyQt6 versions
|
|
495
498
|
|
|
496
499
|
self._main = parent
|
|
497
500
|
self.doc = document
|
|
498
501
|
|
|
499
|
-
|
|
502
|
+
self._connected_current_doc_changed = False
|
|
500
503
|
if hasattr(self._main, "currentDocumentChanged"):
|
|
501
|
-
|
|
504
|
+
try:
|
|
505
|
+
self._main.currentDocumentChanged.connect(self._on_active_doc_changed)
|
|
506
|
+
self._connected_current_doc_changed = True
|
|
507
|
+
except Exception:
|
|
508
|
+
self._connected_current_doc_changed = False
|
|
502
509
|
|
|
503
510
|
self._preview_scale = 1.0
|
|
504
511
|
self._preview_qimg = None
|
|
@@ -844,12 +851,38 @@ class ABEDialog(QDialog):
|
|
|
844
851
|
self._set_status("Done")
|
|
845
852
|
# Dialog stays open so user can apply to other images
|
|
846
853
|
# Refresh to use the now-active document for next operation
|
|
847
|
-
self.
|
|
854
|
+
self.close()
|
|
855
|
+
return
|
|
848
856
|
|
|
849
857
|
except Exception as e:
|
|
850
858
|
self._set_status("Error")
|
|
851
859
|
QMessageBox.critical(self, "Apply failed", str(e))
|
|
852
860
|
|
|
861
|
+
def closeEvent(self, ev):
|
|
862
|
+
# 1) Disconnect active-doc tracking (Fabio hook)
|
|
863
|
+
try:
|
|
864
|
+
if self._connected_current_doc_changed and hasattr(self._main, "currentDocumentChanged"):
|
|
865
|
+
self._main.currentDocumentChanged.disconnect(self._on_active_doc_changed)
|
|
866
|
+
except Exception:
|
|
867
|
+
pass
|
|
868
|
+
self._connected_current_doc_changed = False
|
|
869
|
+
|
|
870
|
+
# 2) Stop any background preview worker/thread if you have one
|
|
871
|
+
# (names may differ in your file; keep what matches your implementation)
|
|
872
|
+
try:
|
|
873
|
+
if getattr(self, "_worker", None) is not None:
|
|
874
|
+
try:
|
|
875
|
+
self._worker.requestInterruption()
|
|
876
|
+
except Exception:
|
|
877
|
+
pass
|
|
878
|
+
if getattr(self, "_thread", None) is not None:
|
|
879
|
+
self._thread.quit()
|
|
880
|
+
self._thread.wait(500)
|
|
881
|
+
except Exception:
|
|
882
|
+
pass
|
|
883
|
+
|
|
884
|
+
super().closeEvent(ev)
|
|
885
|
+
|
|
853
886
|
def _refresh_document_from_active(self):
|
|
854
887
|
"""
|
|
855
888
|
Refresh the dialog's document reference to the currently active document.
|
{setiastrosuitepro-1.6.5.post2 → setiastrosuitepro-1.6.9}/src/setiastro/saspro/aberration_ai.py
RENAMED
|
@@ -13,7 +13,7 @@ IS_APPLE_ARM = (sys.platform == "darwin" and platform.machine() == "arm64")
|
|
|
13
13
|
from PyQt6.QtCore import Qt, QThread, pyqtSignal, QStandardPaths, QSettings
|
|
14
14
|
from PyQt6.QtWidgets import (
|
|
15
15
|
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QFileDialog,
|
|
16
|
-
QComboBox, QSpinBox, QProgressBar, QMessageBox, QCheckBox
|
|
16
|
+
QComboBox, QSpinBox, QProgressBar, QMessageBox, QCheckBox, QLineEdit
|
|
17
17
|
)
|
|
18
18
|
from PyQt6.QtGui import QIcon
|
|
19
19
|
from setiastro.saspro.config import Config
|
|
@@ -315,11 +315,29 @@ class AberrationAIDialog(QDialog):
|
|
|
315
315
|
row.addWidget(QLabel(self.tr("Model:")))
|
|
316
316
|
self.model_label = QLabel("—")
|
|
317
317
|
self.model_label.setToolTip("")
|
|
318
|
-
btn_browse = QPushButton(self.tr("Browse…")); btn_browse.clicked.connect(self.
|
|
318
|
+
btn_browse = QPushButton(self.tr("Browse…")); btn_browse.clicked.connect(self._browse_active_model)
|
|
319
319
|
row.addWidget(self.model_label, 1)
|
|
320
320
|
row.addWidget(btn_browse)
|
|
321
321
|
v.addLayout(row)
|
|
322
|
+
# Custom model row (NEW)
|
|
323
|
+
row_custom = QHBoxLayout()
|
|
324
|
+
self.chk_use_custom = QCheckBox(self.tr("Use custom model file"))
|
|
325
|
+
self.chk_use_custom.setChecked(False)
|
|
326
|
+
self.chk_use_custom.toggled.connect(self._on_use_custom_toggled)
|
|
322
327
|
|
|
328
|
+
self.le_custom_model = QLineEdit()
|
|
329
|
+
self.le_custom_model.setReadOnly(True)
|
|
330
|
+
self.le_custom_model.setPlaceholderText(self.tr("No custom model selected"))
|
|
331
|
+
self.le_custom_model.setToolTip("")
|
|
332
|
+
|
|
333
|
+
btn_custom_clear = QPushButton(self.tr("Clear"))
|
|
334
|
+
btn_custom_clear.clicked.connect(self._clear_custom_model)
|
|
335
|
+
|
|
336
|
+
row_custom.addWidget(self.chk_use_custom)
|
|
337
|
+
row_custom.addWidget(self.le_custom_model, 1)
|
|
338
|
+
|
|
339
|
+
row_custom.addWidget(btn_custom_clear)
|
|
340
|
+
v.addLayout(row_custom)
|
|
323
341
|
# Providers row
|
|
324
342
|
row2 = QHBoxLayout()
|
|
325
343
|
self.chk_auto = QCheckBox(self.tr("Auto GPU (if available)"))
|
|
@@ -373,7 +391,9 @@ class AberrationAIDialog(QDialog):
|
|
|
373
391
|
self._model_path = None
|
|
374
392
|
self._refresh_providers()
|
|
375
393
|
self._load_last_model_from_settings()
|
|
376
|
-
|
|
394
|
+
self._load_last_custom_model_from_settings()
|
|
395
|
+
use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
|
|
396
|
+
self.chk_use_custom.setChecked(bool(use_custom))
|
|
377
397
|
if IS_APPLE_ARM:
|
|
378
398
|
self.chk_auto.setChecked(False)
|
|
379
399
|
self.chk_auto.setEnabled(False)
|
|
@@ -395,11 +415,73 @@ class AberrationAIDialog(QDialog):
|
|
|
395
415
|
if p and os.path.isfile(p):
|
|
396
416
|
self._set_model_path(p)
|
|
397
417
|
|
|
398
|
-
def
|
|
399
|
-
|
|
418
|
+
def _browse_active_model(self):
|
|
419
|
+
"""
|
|
420
|
+
Single Browse button.
|
|
421
|
+
- If user picks a file inside the app model folder -> treat as "downloaded" selection (use_custom_model=False)
|
|
422
|
+
- If user picks a file outside -> treat as "custom" (use_custom_model=True)
|
|
423
|
+
"""
|
|
424
|
+
app_dir = os.path.abspath(_app_model_dir())
|
|
425
|
+
|
|
426
|
+
# Start in last-used folder if possible
|
|
427
|
+
last_custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
|
|
428
|
+
last_downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
|
|
429
|
+
start_dir = None
|
|
430
|
+
for candidate in (last_custom, last_downloaded):
|
|
431
|
+
if candidate and os.path.isfile(candidate):
|
|
432
|
+
d = os.path.dirname(candidate)
|
|
433
|
+
if os.path.isdir(d):
|
|
434
|
+
start_dir = d
|
|
435
|
+
break
|
|
436
|
+
if start_dir is None:
|
|
437
|
+
start_dir = app_dir
|
|
438
|
+
|
|
400
439
|
p, _ = QFileDialog.getOpenFileName(self, "Select ONNX model", start_dir, "ONNX (*.onnx)")
|
|
401
|
-
if p:
|
|
402
|
-
|
|
440
|
+
if not p:
|
|
441
|
+
return
|
|
442
|
+
|
|
443
|
+
p_abs = os.path.abspath(p)
|
|
444
|
+
# Determine if picked file is inside app model folder
|
|
445
|
+
in_app_dir = False
|
|
446
|
+
try:
|
|
447
|
+
in_app_dir = os.path.commonpath([app_dir, p_abs]) == app_dir
|
|
448
|
+
except Exception:
|
|
449
|
+
in_app_dir = p_abs.startswith(app_dir)
|
|
450
|
+
|
|
451
|
+
if in_app_dir:
|
|
452
|
+
# "Downloaded" selection
|
|
453
|
+
self._set_model_path(p_abs)
|
|
454
|
+
self._set_custom_model_path(None)
|
|
455
|
+
QSettings().setValue("AberrationAI/use_custom_model", False)
|
|
456
|
+
if hasattr(self, "chk_use_custom"):
|
|
457
|
+
self.chk_use_custom.setChecked(False)
|
|
458
|
+
else:
|
|
459
|
+
# "Custom" selection
|
|
460
|
+
self._set_custom_model_path(p_abs)
|
|
461
|
+
QSettings().setValue("AberrationAI/use_custom_model", True)
|
|
462
|
+
if hasattr(self, "chk_use_custom"):
|
|
463
|
+
self.chk_use_custom.setChecked(True)
|
|
464
|
+
|
|
465
|
+
# Keep visuals in sync
|
|
466
|
+
self._refresh_model_label()
|
|
467
|
+
self._refresh_custom_row_visibility()
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def _refresh_model_label(self):
|
|
471
|
+
downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
|
|
472
|
+
custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
|
|
473
|
+
use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
|
|
474
|
+
|
|
475
|
+
if use_custom and custom:
|
|
476
|
+
self.model_label.setText(f"Custom: {os.path.basename(custom)}")
|
|
477
|
+
self.model_label.setToolTip(custom)
|
|
478
|
+
elif downloaded:
|
|
479
|
+
self.model_label.setText(f"Downloaded: {os.path.basename(downloaded)}")
|
|
480
|
+
self.model_label.setToolTip(downloaded)
|
|
481
|
+
else:
|
|
482
|
+
self.model_label.setText("—")
|
|
483
|
+
self.model_label.setToolTip("")
|
|
484
|
+
|
|
403
485
|
|
|
404
486
|
def _open_model_folder(self):
|
|
405
487
|
d = _app_model_dir()
|
|
@@ -412,6 +494,108 @@ class AberrationAIDialog(QDialog):
|
|
|
412
494
|
import subprocess; subprocess.Popen(["xdg-open", d])
|
|
413
495
|
except Exception:
|
|
414
496
|
webbrowser.open(f"file://{d}")
|
|
497
|
+
# ----- custom model helpers (NEW) -----
|
|
498
|
+
def _set_custom_model_path(self, p: str | None):
|
|
499
|
+
if p:
|
|
500
|
+
self.le_custom_model.setText(os.path.basename(p))
|
|
501
|
+
self.le_custom_model.setToolTip(p)
|
|
502
|
+
QSettings().setValue("AberrationAI/custom_model_path", p)
|
|
503
|
+
else:
|
|
504
|
+
self.le_custom_model.clear()
|
|
505
|
+
self.le_custom_model.setToolTip("")
|
|
506
|
+
QSettings().remove("AberrationAI/custom_model_path")
|
|
507
|
+
|
|
508
|
+
def _load_last_custom_model_from_settings(self):
|
|
509
|
+
p = QSettings().value("AberrationAI/custom_model_path", type=str)
|
|
510
|
+
if p:
|
|
511
|
+
if os.path.isfile(p):
|
|
512
|
+
self._set_custom_model_path(p)
|
|
513
|
+
else:
|
|
514
|
+
# Keep the broken path visible in tooltip for debugging
|
|
515
|
+
if hasattr(self, "le_custom_model"):
|
|
516
|
+
self.le_custom_model.setText(os.path.basename(p) + " (missing)")
|
|
517
|
+
self.le_custom_model.setToolTip(p)
|
|
518
|
+
|
|
519
|
+
# After both loads, sync labels/visibility
|
|
520
|
+
self._refresh_model_label()
|
|
521
|
+
self._refresh_custom_row_visibility()
|
|
522
|
+
|
|
523
|
+
def _refresh_custom_row_visibility(self):
|
|
524
|
+
"""
|
|
525
|
+
If you keep the custom row in the UI, hide the path field unless custom is enabled.
|
|
526
|
+
"""
|
|
527
|
+
if not hasattr(self, "le_custom_model"):
|
|
528
|
+
return
|
|
529
|
+
use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
|
|
530
|
+
self.le_custom_model.setVisible(bool(use_custom))
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def _refresh_model_label(self):
|
|
534
|
+
downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
|
|
535
|
+
custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
|
|
536
|
+
use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
|
|
537
|
+
|
|
538
|
+
# Prefer custom only if enabled AND the file exists
|
|
539
|
+
if use_custom and custom:
|
|
540
|
+
if os.path.isfile(custom):
|
|
541
|
+
self.model_label.setText(f"Custom: {os.path.basename(custom)}")
|
|
542
|
+
self.model_label.setToolTip(custom)
|
|
543
|
+
return
|
|
544
|
+
else:
|
|
545
|
+
self.model_label.setText(f"Custom: {os.path.basename(custom)} (missing)")
|
|
546
|
+
self.model_label.setToolTip(custom)
|
|
547
|
+
return
|
|
548
|
+
|
|
549
|
+
# Otherwise show downloaded if valid
|
|
550
|
+
if downloaded and os.path.isfile(downloaded):
|
|
551
|
+
self.model_label.setText(f"Downloaded: {os.path.basename(downloaded)}")
|
|
552
|
+
self.model_label.setToolTip(downloaded)
|
|
553
|
+
else:
|
|
554
|
+
self.model_label.setText("—")
|
|
555
|
+
self.model_label.setToolTip("")
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def _browse_custom_model(self):
|
|
559
|
+
# Start at last dir if possible, else app model dir
|
|
560
|
+
last = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
|
|
561
|
+
start_dir = os.path.dirname(last) if last and os.path.isdir(os.path.dirname(last)) else _app_model_dir()
|
|
562
|
+
p, _ = QFileDialog.getOpenFileName(self, "Select custom ONNX model", start_dir, "ONNX (*.onnx)")
|
|
563
|
+
if p:
|
|
564
|
+
self._set_custom_model_path(p)
|
|
565
|
+
QSettings().setValue("AberrationAI/use_custom_model", True)
|
|
566
|
+
if not self.chk_use_custom.isChecked():
|
|
567
|
+
self.chk_use_custom.setChecked(True)
|
|
568
|
+
|
|
569
|
+
def _clear_custom_model(self):
|
|
570
|
+
self._set_custom_model_path(None)
|
|
571
|
+
QSettings().setValue("AberrationAI/use_custom_model", False)
|
|
572
|
+
if hasattr(self, "chk_use_custom"):
|
|
573
|
+
self.chk_use_custom.setChecked(False)
|
|
574
|
+
|
|
575
|
+
self._refresh_model_label()
|
|
576
|
+
self._refresh_custom_row_visibility()
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
def _on_use_custom_toggled(self, on: bool):
|
|
580
|
+
QSettings().setValue("AberrationAI/use_custom_model", bool(on))
|
|
581
|
+
|
|
582
|
+
if on:
|
|
583
|
+
p = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
|
|
584
|
+
if not (p and os.path.isfile(p)):
|
|
585
|
+
# Don’t spawn another browse button path; use the ONE browse if they want
|
|
586
|
+
QMessageBox.information(
|
|
587
|
+
self,
|
|
588
|
+
self.tr("Custom model"),
|
|
589
|
+
self.tr("Custom model is enabled, but no custom file is selected.\n"
|
|
590
|
+
"Click Browse… to choose a model file.")
|
|
591
|
+
)
|
|
592
|
+
# Optional: auto-open the single browse:
|
|
593
|
+
# self._browse_active_model()
|
|
594
|
+
# return
|
|
595
|
+
|
|
596
|
+
self._refresh_model_label()
|
|
597
|
+
self._refresh_custom_row_visibility()
|
|
598
|
+
|
|
415
599
|
|
|
416
600
|
# ----- provider UI -----
|
|
417
601
|
def _log(self, msg: str): # NEW
|
|
@@ -477,8 +661,16 @@ class AberrationAIDialog(QDialog):
|
|
|
477
661
|
def _on_download_ok(self, path: str):
|
|
478
662
|
self.progress.setValue(100)
|
|
479
663
|
self._set_model_path(path)
|
|
664
|
+
|
|
665
|
+
# Download becomes the active model unless custom is explicitly enabled
|
|
666
|
+
if not QSettings().value("AberrationAI/use_custom_model", False, type=bool):
|
|
667
|
+
self._set_custom_model_path(None)
|
|
668
|
+
|
|
480
669
|
QMessageBox.information(self, "Model", f"Downloaded: {os.path.basename(path)}")
|
|
481
670
|
|
|
671
|
+
self._refresh_model_label()
|
|
672
|
+
self._refresh_custom_row_visibility()
|
|
673
|
+
|
|
482
674
|
# ----- run -----
|
|
483
675
|
def _run(self):
|
|
484
676
|
if ort is None:
|
|
@@ -489,7 +681,22 @@ class AberrationAIDialog(QDialog):
|
|
|
489
681
|
"Please try installing an earlier version (for example 1.19.x) and try again."
|
|
490
682
|
)
|
|
491
683
|
return
|
|
492
|
-
|
|
684
|
+
|
|
685
|
+
# Choose model path (normal vs custom)
|
|
686
|
+
use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
|
|
687
|
+
downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
|
|
688
|
+
custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
|
|
689
|
+
|
|
690
|
+
model_path = custom if use_custom else downloaded
|
|
691
|
+
if self.chk_use_custom.isChecked():
|
|
692
|
+
cp = QSettings().value("AberrationAI/custom_model_path", type=str)
|
|
693
|
+
if cp and os.path.isfile(cp):
|
|
694
|
+
model_path = cp
|
|
695
|
+
else:
|
|
696
|
+
QMessageBox.warning(self, "Model", "Custom model is enabled but the file is missing. Please browse to a valid .onnx.")
|
|
697
|
+
return
|
|
698
|
+
|
|
699
|
+
if not model_path or not os.path.isfile(model_path):
|
|
493
700
|
QMessageBox.warning(self, "Model", "Please select or download a valid .onnx model first.")
|
|
494
701
|
return
|
|
495
702
|
|
|
@@ -516,7 +723,7 @@ class AberrationAIDialog(QDialog):
|
|
|
516
723
|
providers = [sel] if sel else ["CPUExecutionProvider"]
|
|
517
724
|
|
|
518
725
|
# --- make patch match the model's requirement (if fixed) ---
|
|
519
|
-
req = _model_required_patch(
|
|
726
|
+
req = _model_required_patch(model_path)
|
|
520
727
|
if req and req > 0:
|
|
521
728
|
patch = req
|
|
522
729
|
try:
|
|
@@ -537,14 +744,16 @@ class AberrationAIDialog(QDialog):
|
|
|
537
744
|
|
|
538
745
|
self._t_start = time.perf_counter()
|
|
539
746
|
prov_txt = ("auto" if self.chk_auto.isChecked() else self.cmb_provider.currentText() or "CPU")
|
|
540
|
-
self._log(f"🚀 Aberration AI: model={os.path.basename(
|
|
747
|
+
self._log(f"🚀 Aberration AI: model={os.path.basename(model_path)}, "
|
|
541
748
|
f"provider={prov_txt}, patch={patch}, overlap={overlap}")
|
|
749
|
+
|
|
750
|
+
self._effective_model_path = model_path
|
|
542
751
|
|
|
543
752
|
# -------- run worker --------
|
|
544
753
|
self.progress.setValue(0)
|
|
545
754
|
self.btn_run.setEnabled(False)
|
|
546
755
|
|
|
547
|
-
self._worker = _ONNXWorker(
|
|
756
|
+
self._worker = _ONNXWorker(model_path, img, patch, overlap, providers)
|
|
548
757
|
self._worker.progressed.connect(self.progress.setValue)
|
|
549
758
|
self._worker.failed.connect(self._on_failed)
|
|
550
759
|
self._worker.finished_ok.connect(self._on_ok)
|
|
@@ -553,11 +762,15 @@ class AberrationAIDialog(QDialog):
|
|
|
553
762
|
|
|
554
763
|
|
|
555
764
|
def _on_failed(self, msg: str):
|
|
765
|
+
model_path = getattr(self, "_effective_model_path", self._model_path)
|
|
556
766
|
self._log(f"❌ Aberration AI failed: {msg}")
|
|
557
767
|
QMessageBox.critical(self, "ONNX Error", msg)
|
|
558
768
|
self.reject() # closes the dialog
|
|
559
769
|
|
|
560
770
|
def _on_ok(self, out: np.ndarray):
|
|
771
|
+
used = getattr(self._worker, "used_provider", None) or \
|
|
772
|
+
(self.cmb_provider.currentText() if not self.chk_auto.isChecked() else "auto")
|
|
773
|
+
model_path = getattr(self, "_effective_model_path", self._model_path)
|
|
561
774
|
doc = self.get_active_doc()
|
|
562
775
|
if doc is None or getattr(doc, "image", None) is None:
|
|
563
776
|
QMessageBox.warning(self, "Image", "No active image.")
|
|
@@ -579,11 +792,10 @@ class AberrationAIDialog(QDialog):
|
|
|
579
792
|
"processing_parameters": {
|
|
580
793
|
**(getattr(doc, "metadata", {}) or {}).get("processing_parameters", {}),
|
|
581
794
|
"AberrationAI": {
|
|
582
|
-
"model_path":
|
|
795
|
+
"model_path": model_path,
|
|
583
796
|
"patch_size": int(self.spin_patch.value()),
|
|
584
797
|
"overlap": int(self.spin_overlap.value()),
|
|
585
|
-
"provider":
|
|
586
|
-
if not self.chk_auto.isChecked() else "auto"),
|
|
798
|
+
"provider": used,
|
|
587
799
|
"border_px": BORDER_PX,
|
|
588
800
|
}
|
|
589
801
|
}
|
|
@@ -616,7 +828,7 @@ class AberrationAIDialog(QDialog):
|
|
|
616
828
|
if main is not None:
|
|
617
829
|
auto_gpu = bool(self.chk_auto.isChecked())
|
|
618
830
|
preset = {
|
|
619
|
-
"model":
|
|
831
|
+
"model": model_path,
|
|
620
832
|
"patch": int(self.spin_patch.value()),
|
|
621
833
|
"overlap": int(self.spin_overlap.value()),
|
|
622
834
|
"border_px": int(BORDER_PX),
|
|
@@ -675,7 +887,7 @@ class AberrationAIDialog(QDialog):
|
|
|
675
887
|
BORDER_PX = 10 # same value used above
|
|
676
888
|
self._log(
|
|
677
889
|
f"✅ Aberration AI applied "
|
|
678
|
-
f"(model={os.path.basename(
|
|
890
|
+
f"(model={os.path.basename(model_path)}, provider={used}, "
|
|
679
891
|
f"patch={int(self.spin_patch.value())}, overlap={int(self.spin_overlap.value())}, "
|
|
680
892
|
f"border={BORDER_PX}px, time={dt:.2f}s)"
|
|
681
893
|
)
|