implemented FFT res waterfall colorscale_max slider
This commit is contained in:
@ -459,9 +459,10 @@ def main():
|
|||||||
freq_shared: Optional[np.ndarray] = None
|
freq_shared: Optional[np.ndarray] = None
|
||||||
# Параметры контраста водопада спектров
|
# Параметры контраста водопада спектров
|
||||||
spec_clip = _parse_spec_clip(getattr(args, "spec_clip", None))
|
spec_clip = _parse_spec_clip(getattr(args, "spec_clip", None))
|
||||||
# Ползунки управления Y для B-scan
|
# Ползунки управления Y для B-scan и контрастом
|
||||||
ymin_slider = None
|
ymin_slider = None
|
||||||
ymax_slider = None
|
ymax_slider = None
|
||||||
|
contrast_slider = None
|
||||||
|
|
||||||
# Линейный график последнего свипа
|
# Линейный график последнего свипа
|
||||||
line_obj, = ax_line.plot([], [], lw=1)
|
line_obj, = ax_line.plot([], [], lw=1)
|
||||||
@ -520,12 +521,14 @@ def main():
|
|||||||
ax_spec.tick_params(axis="x", labelbottom=False)
|
ax_spec.tick_params(axis="x", labelbottom=False)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
# Слайдеры для управления осью Y B-scan (мин/макс)
|
# Слайдеры для управления осью Y B-scan (мин/макс) и контрастом
|
||||||
try:
|
try:
|
||||||
ax_smin = fig.add_axes([0.92, 0.55, 0.02, 0.35])
|
ax_smin = fig.add_axes([0.92, 0.55, 0.02, 0.35])
|
||||||
ax_smax = fig.add_axes([0.95, 0.55, 0.02, 0.35])
|
ax_smax = fig.add_axes([0.95, 0.55, 0.02, 0.35])
|
||||||
|
ax_sctr = fig.add_axes([0.98, 0.55, 0.02, 0.35])
|
||||||
ymin_slider = Slider(ax_smin, "Y min", 0, max(1, fft_bins - 1), valinit=0, valstep=1, orientation="vertical")
|
ymin_slider = Slider(ax_smin, "Y min", 0, max(1, fft_bins - 1), valinit=0, valstep=1, orientation="vertical")
|
||||||
ymax_slider = Slider(ax_smax, "Y max", 0, max(1, fft_bins - 1), valinit=max(1, fft_bins - 1), valstep=1, orientation="vertical")
|
ymax_slider = Slider(ax_smax, "Y max", 0, max(1, fft_bins - 1), valinit=max(1, fft_bins - 1), valstep=1, orientation="vertical")
|
||||||
|
contrast_slider = Slider(ax_sctr, "Int max", 0, 100, valinit=100, valstep=1, orientation="vertical")
|
||||||
|
|
||||||
def _on_ylim_change(_val):
|
def _on_ylim_change(_val):
|
||||||
try:
|
try:
|
||||||
@ -538,6 +541,8 @@ def main():
|
|||||||
|
|
||||||
ymin_slider.on_changed(_on_ylim_change)
|
ymin_slider.on_changed(_on_ylim_change)
|
||||||
ymax_slider.on_changed(_on_ylim_change)
|
ymax_slider.on_changed(_on_ylim_change)
|
||||||
|
# Контраст влияет на верхнюю границу цветовой шкалы (процент от авто-диапазона)
|
||||||
|
contrast_slider.on_changed(lambda _v: fig.canvas.draw_idle())
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -739,7 +744,13 @@ def main():
|
|||||||
if y_min_fft is not None and y_max_fft is not None and np.isfinite(y_min_fft) and np.isfinite(y_max_fft) and y_min_fft != y_max_fft:
|
if y_min_fft is not None and y_max_fft is not None and np.isfinite(y_min_fft) and np.isfinite(y_max_fft) and y_min_fft != y_max_fft:
|
||||||
vmin_v, vmax_v = y_min_fft, y_max_fft
|
vmin_v, vmax_v = y_min_fft, y_max_fft
|
||||||
if vmin_v is not None and vmax_v is not None and vmin_v != vmax_v:
|
if vmin_v is not None and vmax_v is not None and vmin_v != vmax_v:
|
||||||
img_fft_obj.set_clim(vmin=vmin_v, vmax=vmax_v)
|
# Применим скалирование контрастом (верхняя граница)
|
||||||
|
try:
|
||||||
|
c = float(contrast_slider.val) / 100.0 if contrast_slider is not None else 1.0
|
||||||
|
except Exception:
|
||||||
|
c = 1.0
|
||||||
|
vmax_eff = vmin_v + c * (vmax_v - vmin_v)
|
||||||
|
img_fft_obj.set_clim(vmin=vmin_v, vmax=vmax_eff)
|
||||||
|
|
||||||
# Возвращаем обновлённые артисты
|
# Возвращаем обновлённые артисты
|
||||||
return (line_obj, img_obj, fft_line_obj, img_fft_obj)
|
return (line_obj, img_obj, fft_line_obj, img_fft_obj)
|
||||||
|
|||||||
Reference in New Issue
Block a user