setiastrosuitepro 1.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of setiastrosuitepro might be problematic. Click here for more details.
- setiastro/__init__.py +2 -0
- setiastro/saspro/__init__.py +20 -0
- setiastro/saspro/__main__.py +784 -0
- setiastro/saspro/_generated/__init__.py +7 -0
- setiastro/saspro/_generated/build_info.py +2 -0
- setiastro/saspro/abe.py +1295 -0
- setiastro/saspro/abe_preset.py +196 -0
- setiastro/saspro/aberration_ai.py +694 -0
- setiastro/saspro/aberration_ai_preset.py +224 -0
- setiastro/saspro/accel_installer.py +218 -0
- setiastro/saspro/accel_workers.py +30 -0
- setiastro/saspro/add_stars.py +621 -0
- setiastro/saspro/astrobin_exporter.py +1007 -0
- setiastro/saspro/astrospike.py +153 -0
- setiastro/saspro/astrospike_python.py +1839 -0
- setiastro/saspro/autostretch.py +196 -0
- setiastro/saspro/backgroundneutral.py +560 -0
- setiastro/saspro/batch_convert.py +325 -0
- setiastro/saspro/batch_renamer.py +519 -0
- setiastro/saspro/blemish_blaster.py +488 -0
- setiastro/saspro/blink_comparator_pro.py +2923 -0
- setiastro/saspro/bundles.py +61 -0
- setiastro/saspro/bundles_dock.py +114 -0
- setiastro/saspro/cheat_sheet.py +168 -0
- setiastro/saspro/clahe.py +342 -0
- setiastro/saspro/comet_stacking.py +1377 -0
- setiastro/saspro/config.py +38 -0
- setiastro/saspro/config_bootstrap.py +40 -0
- setiastro/saspro/config_manager.py +316 -0
- setiastro/saspro/continuum_subtract.py +1617 -0
- setiastro/saspro/convo.py +1397 -0
- setiastro/saspro/convo_preset.py +414 -0
- setiastro/saspro/copyastro.py +187 -0
- setiastro/saspro/cosmicclarity.py +1564 -0
- setiastro/saspro/cosmicclarity_preset.py +407 -0
- setiastro/saspro/crop_dialog_pro.py +948 -0
- setiastro/saspro/crop_preset.py +189 -0
- setiastro/saspro/curve_editor_pro.py +2544 -0
- setiastro/saspro/curves_preset.py +375 -0
- setiastro/saspro/debayer.py +670 -0
- setiastro/saspro/debug_utils.py +29 -0
- setiastro/saspro/dnd_mime.py +35 -0
- setiastro/saspro/doc_manager.py +2634 -0
- setiastro/saspro/exoplanet_detector.py +2166 -0
- setiastro/saspro/file_utils.py +284 -0
- setiastro/saspro/fitsmodifier.py +744 -0
- setiastro/saspro/free_torch_memory.py +48 -0
- setiastro/saspro/frequency_separation.py +1343 -0
- setiastro/saspro/function_bundle.py +1594 -0
- setiastro/saspro/ghs_dialog_pro.py +660 -0
- setiastro/saspro/ghs_preset.py +284 -0
- setiastro/saspro/graxpert.py +634 -0
- setiastro/saspro/graxpert_preset.py +287 -0
- setiastro/saspro/gui/__init__.py +0 -0
- setiastro/saspro/gui/main_window.py +8494 -0
- setiastro/saspro/gui/mixins/__init__.py +33 -0
- setiastro/saspro/gui/mixins/dock_mixin.py +263 -0
- setiastro/saspro/gui/mixins/file_mixin.py +445 -0
- setiastro/saspro/gui/mixins/geometry_mixin.py +403 -0
- setiastro/saspro/gui/mixins/header_mixin.py +441 -0
- setiastro/saspro/gui/mixins/mask_mixin.py +421 -0
- setiastro/saspro/gui/mixins/menu_mixin.py +361 -0
- setiastro/saspro/gui/mixins/theme_mixin.py +367 -0
- setiastro/saspro/gui/mixins/toolbar_mixin.py +1324 -0
- setiastro/saspro/gui/mixins/update_mixin.py +309 -0
- setiastro/saspro/gui/mixins/view_mixin.py +435 -0
- setiastro/saspro/halobgon.py +462 -0
- setiastro/saspro/header_viewer.py +445 -0
- setiastro/saspro/headless_utils.py +88 -0
- setiastro/saspro/histogram.py +753 -0
- setiastro/saspro/history_explorer.py +939 -0
- setiastro/saspro/image_combine.py +414 -0
- setiastro/saspro/image_peeker_pro.py +1596 -0
- setiastro/saspro/imageops/__init__.py +37 -0
- setiastro/saspro/imageops/mdi_snap.py +292 -0
- setiastro/saspro/imageops/scnr.py +36 -0
- setiastro/saspro/imageops/starbasedwhitebalance.py +210 -0
- setiastro/saspro/imageops/stretch.py +244 -0
- setiastro/saspro/isophote.py +1179 -0
- setiastro/saspro/layers.py +208 -0
- setiastro/saspro/layers_dock.py +714 -0
- setiastro/saspro/lazy_imports.py +193 -0
- setiastro/saspro/legacy/__init__.py +2 -0
- setiastro/saspro/legacy/image_manager.py +2226 -0
- setiastro/saspro/legacy/numba_utils.py +3659 -0
- setiastro/saspro/legacy/xisf.py +1071 -0
- setiastro/saspro/linear_fit.py +534 -0
- setiastro/saspro/live_stacking.py +1830 -0
- setiastro/saspro/log_bus.py +5 -0
- setiastro/saspro/logging_config.py +460 -0
- setiastro/saspro/luminancerecombine.py +309 -0
- setiastro/saspro/main_helpers.py +201 -0
- setiastro/saspro/mask_creation.py +928 -0
- setiastro/saspro/masks_core.py +56 -0
- setiastro/saspro/mdi_widgets.py +353 -0
- setiastro/saspro/memory_utils.py +666 -0
- setiastro/saspro/metadata_patcher.py +75 -0
- setiastro/saspro/mfdeconv.py +3826 -0
- setiastro/saspro/mfdeconv_earlystop.py +71 -0
- setiastro/saspro/mfdeconvcudnn.py +3263 -0
- setiastro/saspro/mfdeconvsport.py +2382 -0
- setiastro/saspro/minorbodycatalog.py +567 -0
- setiastro/saspro/morphology.py +382 -0
- setiastro/saspro/multiscale_decomp.py +1290 -0
- setiastro/saspro/nbtorgb_stars.py +531 -0
- setiastro/saspro/numba_utils.py +3044 -0
- setiastro/saspro/numba_warmup.py +141 -0
- setiastro/saspro/ops/__init__.py +9 -0
- setiastro/saspro/ops/command_help_dialog.py +623 -0
- setiastro/saspro/ops/command_runner.py +217 -0
- setiastro/saspro/ops/commands.py +1594 -0
- setiastro/saspro/ops/script_editor.py +1102 -0
- setiastro/saspro/ops/scripts.py +1413 -0
- setiastro/saspro/ops/settings.py +560 -0
- setiastro/saspro/parallel_utils.py +554 -0
- setiastro/saspro/pedestal.py +121 -0
- setiastro/saspro/perfect_palette_picker.py +1053 -0
- setiastro/saspro/pipeline.py +110 -0
- setiastro/saspro/pixelmath.py +1600 -0
- setiastro/saspro/plate_solver.py +2435 -0
- setiastro/saspro/project_io.py +797 -0
- setiastro/saspro/psf_utils.py +136 -0
- setiastro/saspro/psf_viewer.py +549 -0
- setiastro/saspro/pyi_rthook_astroquery.py +95 -0
- setiastro/saspro/remove_green.py +314 -0
- setiastro/saspro/remove_stars.py +1625 -0
- setiastro/saspro/remove_stars_preset.py +404 -0
- setiastro/saspro/resources.py +472 -0
- setiastro/saspro/rgb_combination.py +207 -0
- setiastro/saspro/rgb_extract.py +19 -0
- setiastro/saspro/rgbalign.py +723 -0
- setiastro/saspro/runtime_imports.py +7 -0
- setiastro/saspro/runtime_torch.py +754 -0
- setiastro/saspro/save_options.py +72 -0
- setiastro/saspro/selective_color.py +1552 -0
- setiastro/saspro/sfcc.py +1425 -0
- setiastro/saspro/shortcuts.py +2807 -0
- setiastro/saspro/signature_insert.py +1099 -0
- setiastro/saspro/stacking_suite.py +17712 -0
- setiastro/saspro/star_alignment.py +7420 -0
- setiastro/saspro/star_alignment_preset.py +329 -0
- setiastro/saspro/star_metrics.py +49 -0
- setiastro/saspro/star_spikes.py +681 -0
- setiastro/saspro/star_stretch.py +470 -0
- setiastro/saspro/stat_stretch.py +502 -0
- setiastro/saspro/status_log_dock.py +78 -0
- setiastro/saspro/subwindow.py +3267 -0
- setiastro/saspro/supernovaasteroidhunter.py +1712 -0
- setiastro/saspro/swap_manager.py +99 -0
- setiastro/saspro/torch_backend.py +89 -0
- setiastro/saspro/torch_rejection.py +434 -0
- setiastro/saspro/view_bundle.py +1555 -0
- setiastro/saspro/wavescale_hdr.py +624 -0
- setiastro/saspro/wavescale_hdr_preset.py +100 -0
- setiastro/saspro/wavescalede.py +657 -0
- setiastro/saspro/wavescalede_preset.py +228 -0
- setiastro/saspro/wcs_update.py +374 -0
- setiastro/saspro/whitebalance.py +456 -0
- setiastro/saspro/widgets/__init__.py +48 -0
- setiastro/saspro/widgets/common_utilities.py +305 -0
- setiastro/saspro/widgets/graphics_views.py +122 -0
- setiastro/saspro/widgets/image_utils.py +518 -0
- setiastro/saspro/widgets/preview_dialogs.py +280 -0
- setiastro/saspro/widgets/spinboxes.py +275 -0
- setiastro/saspro/widgets/themed_buttons.py +13 -0
- setiastro/saspro/widgets/wavelet_utils.py +299 -0
- setiastro/saspro/window_shelf.py +185 -0
- setiastro/saspro/xisf.py +1123 -0
- setiastrosuitepro-1.6.0.dist-info/METADATA +266 -0
- setiastrosuitepro-1.6.0.dist-info/RECORD +174 -0
- setiastrosuitepro-1.6.0.dist-info/WHEEL +4 -0
- setiastrosuitepro-1.6.0.dist-info/entry_points.txt +6 -0
- setiastrosuitepro-1.6.0.dist-info/licenses/LICENSE +674 -0
- setiastrosuitepro-1.6.0.dist-info/licenses/license.txt +2580 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# pro/graxpert_preset.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import tempfile
|
|
6
|
+
import numpy as np
|
|
7
|
+
from PyQt6.QtWidgets import (QMessageBox, QDialog, QFormLayout, QDialogButtonBox, QDoubleSpinBox, QCheckBox,
|
|
8
|
+
QRadioButton, QLabel, QComboBox)
|
|
9
|
+
from PyQt6.QtCore import QTimer
|
|
10
|
+
|
|
11
|
+
# Reuse your existing implementation
|
|
12
|
+
from .graxpert import (
|
|
13
|
+
_resolve_graxpert_exec,
|
|
14
|
+
_run_graxpert_command, _write_tiff_float32
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
def _build_graxpert_cmd(
|
|
18
|
+
exe: str,
|
|
19
|
+
operation: str,
|
|
20
|
+
input_path: str,
|
|
21
|
+
*,
|
|
22
|
+
smoothing: float | None = None,
|
|
23
|
+
strength: float | None = None,
|
|
24
|
+
ai_version: str | None = None,
|
|
25
|
+
gpu: bool = True,
|
|
26
|
+
batch_size: int | None = None
|
|
27
|
+
) -> list[str]:
|
|
28
|
+
op = "denoising" if operation == "denoise" else "background-extraction"
|
|
29
|
+
cmd = [exe, "-cmd", op, input_path, "-cli", "-gpu", "true" if gpu else "false"]
|
|
30
|
+
if op == "denoising":
|
|
31
|
+
if strength is not None:
|
|
32
|
+
cmd += ["-strength", f"{strength:.2f}"]
|
|
33
|
+
if batch_size is not None:
|
|
34
|
+
cmd += ["-batch_size", str(int(batch_size))]
|
|
35
|
+
if ai_version:
|
|
36
|
+
cmd += ["-ai_version", ai_version]
|
|
37
|
+
else:
|
|
38
|
+
if smoothing is not None:
|
|
39
|
+
cmd += ["-smoothing", f"{smoothing:.2f}"]
|
|
40
|
+
return cmd
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# -------------------------- Headless runner --------------------------
|
|
44
|
+
|
|
45
|
+
def run_graxpert_via_preset(main_window, preset: dict | None = None, target_doc=None):
|
|
46
|
+
"""
|
|
47
|
+
Headless GraXpert call:
|
|
48
|
+
- No smoothing prompt (uses preset).
|
|
49
|
+
- Optional GPU toggle from preset (default True).
|
|
50
|
+
- Optional explicit exe override in preset["exe"].
|
|
51
|
+
- Writes input_image.tif and runs same CLI as v2.
|
|
52
|
+
"""
|
|
53
|
+
# 1) active doc (match your v2 access pattern)
|
|
54
|
+
doc = target_doc
|
|
55
|
+
if doc is None:
|
|
56
|
+
doc = getattr(main_window, "_active_doc", None)
|
|
57
|
+
if callable(doc):
|
|
58
|
+
doc = doc()
|
|
59
|
+
if doc is None or getattr(doc, "image", None) is None:
|
|
60
|
+
QMessageBox.warning(main_window, "GraXpert", "Load an image first.")
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
p = dict(preset or {})
|
|
64
|
+
op = str(p.get("op", "background")).lower()
|
|
65
|
+
|
|
66
|
+
strength = p.get("strength", 0.50)
|
|
67
|
+
smoothing = float(p.get("smoothing", 0.10))
|
|
68
|
+
smoothing = max(0.0, min(1.0, smoothing))
|
|
69
|
+
|
|
70
|
+
# ---- NEW: default GPU from QSettings if preset omitted it
|
|
71
|
+
use_gpu_default = True
|
|
72
|
+
try:
|
|
73
|
+
if hasattr(main_window, "settings"):
|
|
74
|
+
use_gpu_default = main_window.settings.value("graxpert/use_gpu", True, type=bool)
|
|
75
|
+
except Exception:
|
|
76
|
+
pass
|
|
77
|
+
gpu = bool(p.get("gpu", use_gpu_default))
|
|
78
|
+
|
|
79
|
+
# Optional batch_size override; otherwise pick sensible default from gpu
|
|
80
|
+
batch_size = p.get("batch_size", None)
|
|
81
|
+
if batch_size is None:
|
|
82
|
+
batch_size = 4 if gpu else 1
|
|
83
|
+
|
|
84
|
+
ai_version = p.get("ai_version") # None or e.g. "3.0.2"
|
|
85
|
+
|
|
86
|
+
# 2) GraXpert executable
|
|
87
|
+
exe = p.get("exe") or _resolve_graxpert_exec(main_window)
|
|
88
|
+
if not exe:
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
# 3) temp write (unchanged)
|
|
92
|
+
workdir = tempfile.mkdtemp(prefix="saspro_graxpert_")
|
|
93
|
+
input_basename = "input_image"
|
|
94
|
+
input_path = os.path.join(workdir, f"{input_basename}.tif")
|
|
95
|
+
try:
|
|
96
|
+
_write_tiff_float32(doc.image, input_path)
|
|
97
|
+
except Exception as e:
|
|
98
|
+
QMessageBox.critical(main_window, "GraXpert", f"Failed to write temporary input:\n{e}")
|
|
99
|
+
shutil.rmtree(workdir, ignore_errors=True)
|
|
100
|
+
return
|
|
101
|
+
|
|
102
|
+
# 4) exact command (now with resolved gpu + batch_size)
|
|
103
|
+
command = _build_graxpert_cmd(
|
|
104
|
+
exe,
|
|
105
|
+
op,
|
|
106
|
+
input_path,
|
|
107
|
+
smoothing=float(smoothing) if op == "background" else None,
|
|
108
|
+
strength=float(strength) if op == "denoise" else None,
|
|
109
|
+
ai_version=str(ai_version) if (op == "denoise" and ai_version) else None,
|
|
110
|
+
gpu=gpu,
|
|
111
|
+
batch_size=int(batch_size) if batch_size is not None else None,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Persist the resolved GPU preference so dialogs/presets stay in sync
|
|
115
|
+
try:
|
|
116
|
+
if hasattr(main_window, "settings"):
|
|
117
|
+
main_window.settings.setValue("graxpert/use_gpu", bool(gpu))
|
|
118
|
+
except Exception:
|
|
119
|
+
pass
|
|
120
|
+
|
|
121
|
+
# 5) store normalized preset for Replay
|
|
122
|
+
try:
|
|
123
|
+
preset_for_replay = {"op": op, "gpu": bool(gpu)}
|
|
124
|
+
if op == "background":
|
|
125
|
+
preset_for_replay["smoothing"] = float(smoothing)
|
|
126
|
+
else:
|
|
127
|
+
preset_for_replay["strength"] = float(strength)
|
|
128
|
+
if ai_version:
|
|
129
|
+
preset_for_replay["ai_version"] = ai_version
|
|
130
|
+
if batch_size is not None:
|
|
131
|
+
preset_for_replay["batch_size"] = int(batch_size)
|
|
132
|
+
|
|
133
|
+
op_label = "GraXpert Denoise" if op == "denoise" else "GraXpert Gradient Removal"
|
|
134
|
+
|
|
135
|
+
remember = getattr(main_window, "remember_last_headless_command", None)
|
|
136
|
+
if remember is None:
|
|
137
|
+
remember = getattr(main_window, "_remember_last_headless_command", None)
|
|
138
|
+
if callable(remember):
|
|
139
|
+
remember("graxpert", preset_for_replay, description=op_label)
|
|
140
|
+
try:
|
|
141
|
+
if hasattr(main_window, "_log"):
|
|
142
|
+
main_window._log(
|
|
143
|
+
f"[Replay] GraXpert preset stored: op={op}, "
|
|
144
|
+
f"keys={list(preset_for_replay.keys())}"
|
|
145
|
+
)
|
|
146
|
+
except Exception:
|
|
147
|
+
pass
|
|
148
|
+
except Exception:
|
|
149
|
+
op_label = "GraXpert Denoise" if op == "denoise" else "GraXpert Gradient Removal"
|
|
150
|
+
|
|
151
|
+
# 6) run
|
|
152
|
+
output_basename = f"{input_basename}_GraXpert"
|
|
153
|
+
|
|
154
|
+
meta_extras = {
|
|
155
|
+
"graxpert_operation": op, # "denoise" | "background"
|
|
156
|
+
"graxpert_param": float(strength if op == "denoise" else smoothing),
|
|
157
|
+
"graxpert_ai_version": (ai_version or "latest") if op == "denoise" else None,
|
|
158
|
+
"graxpert_gpu": bool(gpu),
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
setattr(main_window, "_graxpert_headless_running", True)
|
|
162
|
+
setattr(main_window, "_graxpert_silent", True)
|
|
163
|
+
setattr(main_window, "_graxpert_guard", True)
|
|
164
|
+
try:
|
|
165
|
+
_run_graxpert_command(
|
|
166
|
+
main_window,
|
|
167
|
+
command,
|
|
168
|
+
output_basename,
|
|
169
|
+
workdir,
|
|
170
|
+
target_doc=doc,
|
|
171
|
+
)
|
|
172
|
+
finally:
|
|
173
|
+
def _clear_flags():
|
|
174
|
+
for name in ("_graxpert_headless_running", "_graxpert_silent", "_graxpert_guard"):
|
|
175
|
+
try:
|
|
176
|
+
delattr(main_window, name)
|
|
177
|
+
except Exception:
|
|
178
|
+
setattr(main_window, name, False)
|
|
179
|
+
QTimer.singleShot(1200, _clear_flags)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
# -------------------------- Preset editor (optional) --------------------------
|
|
183
|
+
|
|
184
|
+
class GraXpertPresetDialog(QDialog):
|
|
185
|
+
"""
|
|
186
|
+
Preset editor:
|
|
187
|
+
- Operation: Remove gradient (background) OR Denoise
|
|
188
|
+
- Parameter: Smoothing (0..1) for background OR Strength (0..1) for denoise
|
|
189
|
+
- GPU on/off
|
|
190
|
+
- Optional denoise model (ai_version); blank = latest/auto
|
|
191
|
+
"""
|
|
192
|
+
def __init__(self, parent=None, initial: dict | None = None):
|
|
193
|
+
super().__init__(parent)
|
|
194
|
+
self.setWindowTitle("GraXpert — Preset")
|
|
195
|
+
p = dict(initial or {})
|
|
196
|
+
op = str(p.get("op", "background")).lower() # "background" or "denoise"
|
|
197
|
+
|
|
198
|
+
form = QFormLayout(self)
|
|
199
|
+
|
|
200
|
+
# --- operation radios ---
|
|
201
|
+
self.rb_background = QRadioButton("Remove gradient")
|
|
202
|
+
self.rb_denoise = QRadioButton("Denoise")
|
|
203
|
+
if op == "denoise":
|
|
204
|
+
self.rb_denoise.setChecked(True)
|
|
205
|
+
else:
|
|
206
|
+
self.rb_background.setChecked(True)
|
|
207
|
+
form.addRow(self.rb_background)
|
|
208
|
+
form.addRow(self.rb_denoise)
|
|
209
|
+
|
|
210
|
+
# --- shared numeric control (label changes with op) ---
|
|
211
|
+
self.param_label = QLabel()
|
|
212
|
+
self.param = QDoubleSpinBox()
|
|
213
|
+
self.param.setRange(0.0, 1.0)
|
|
214
|
+
self.param.setDecimals(2)
|
|
215
|
+
self.param.setSingleStep(0.01)
|
|
216
|
+
|
|
217
|
+
smoothing = float(p.get("smoothing", 0.10))
|
|
218
|
+
strength = float(p.get("strength", 0.50))
|
|
219
|
+
|
|
220
|
+
def _set_for_background():
|
|
221
|
+
self.param_label.setText("Smoothing (0–1):")
|
|
222
|
+
self.param.setValue(smoothing)
|
|
223
|
+
self.model_label.setEnabled(False)
|
|
224
|
+
self.model_combo.setEnabled(False)
|
|
225
|
+
|
|
226
|
+
def _set_for_denoise():
|
|
227
|
+
self.param_label.setText("Strength (0–1):")
|
|
228
|
+
self.param.setValue(strength)
|
|
229
|
+
self.model_label.setEnabled(True)
|
|
230
|
+
self.model_combo.setEnabled(True)
|
|
231
|
+
|
|
232
|
+
# --- denoise model picker ---
|
|
233
|
+
self.model_label = QLabel("Denoise model:")
|
|
234
|
+
self.model_combo = QComboBox()
|
|
235
|
+
self.model_combo.addItem("Latest (auto)", "")
|
|
236
|
+
for v in ["3.0.2", "3.0.1", "3.0.0", "2.0.0", "1.1.0", "1.0.0"]:
|
|
237
|
+
self.model_combo.addItem(v, v)
|
|
238
|
+
# preselect from preset if provided
|
|
239
|
+
ai_ver = str(p.get("ai_version") or "")
|
|
240
|
+
idx = max(0, self.model_combo.findData(ai_ver))
|
|
241
|
+
self.model_combo.setCurrentIndex(idx)
|
|
242
|
+
|
|
243
|
+
self.rb_background.toggled.connect(lambda checked: _set_for_background() if checked else None)
|
|
244
|
+
self.rb_denoise.toggled.connect(lambda checked: _set_for_denoise() if checked else None)
|
|
245
|
+
|
|
246
|
+
# Initialize label/value once
|
|
247
|
+
if self.rb_denoise.isChecked():
|
|
248
|
+
_set_for_denoise()
|
|
249
|
+
else:
|
|
250
|
+
_set_for_background()
|
|
251
|
+
|
|
252
|
+
form.addRow(self.param_label, self.param)
|
|
253
|
+
form.addRow(self.model_label, self.model_combo)
|
|
254
|
+
|
|
255
|
+
# --- GPU ---
|
|
256
|
+
self.gpu = QCheckBox("Use GPU (if available)")
|
|
257
|
+
use_gpu_default = True
|
|
258
|
+
try:
|
|
259
|
+
settings = getattr(parent, "settings", None)
|
|
260
|
+
if settings is not None:
|
|
261
|
+
use_gpu_default = settings.value("graxpert/use_gpu", True, type=bool)
|
|
262
|
+
except Exception:
|
|
263
|
+
pass
|
|
264
|
+
self.gpu.setChecked(bool(p.get("gpu", use_gpu_default)))
|
|
265
|
+
|
|
266
|
+
form.addRow(self.gpu)
|
|
267
|
+
|
|
268
|
+
# Buttons
|
|
269
|
+
btns = QDialogButtonBox(
|
|
270
|
+
QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel,
|
|
271
|
+
parent=self
|
|
272
|
+
)
|
|
273
|
+
btns.accepted.connect(self.accept)
|
|
274
|
+
btns.rejected.connect(self.reject)
|
|
275
|
+
form.addRow(btns)
|
|
276
|
+
|
|
277
|
+
def result_dict(self) -> dict:
|
|
278
|
+
op = "denoise" if self.rb_denoise.isChecked() else "background"
|
|
279
|
+
out = {"op": op, "gpu": bool(self.gpu.isChecked())}
|
|
280
|
+
if op == "background":
|
|
281
|
+
out["smoothing"] = float(self.param.value())
|
|
282
|
+
else:
|
|
283
|
+
out["strength"] = float(self.param.value())
|
|
284
|
+
ai_version = self.model_combo.currentData() or ""
|
|
285
|
+
if ai_version: # only include if explicitly chosen
|
|
286
|
+
out["ai_version"] = ai_version
|
|
287
|
+
return out
|
|
File without changes
|