Commit Graph

102 Commits

Author SHA1 Message Date
8f01624171 fix: step7 filter bar split into 2 rows - row1: combo+selectAll+clear, row2: ratio+conc+reload+count 2026-07-10 11:58:58 +08:00
600400a4d9 fix: step13 auto-detect report mode on panel load (in _auto_pull_work_dir), not just on generate click 2026-07-09 15:38:47 +08:00
208e067334 feat: step13 auto-detect mode + user confirmation combo (with fallback to manual override) 2026-07-09 15:33:45 +08:00
66a181cbe2 feat: step13 auto-detect ML vs formula mode like step11, remove manual selector 2026-07-09 15:21:45 +08:00
3f4cb94929 fix: clean up step13 mode selector labels - remove misleading step numbers 2026-07-09 15:18:55 +08:00
a13b4be6d4 feat: formula report AI analysis per distribution map with configurable limit in UI panel 2026-07-09 15:03:39 +08:00
650e505ac4 feat: 报告生成模块双轨制重构 — 公式模式 + ML 模式独立分流
**UI (step13_report_panel.py):**
  - 新增 QComboBox 报告模式选择:
    机器学习(ml) / 水色指数公式(formula)
  - WorkerThread 传递 report_mode 到 generate_report

**后端 (report_word.py):**
  - generate_report(report_mode='ml'/'formula') 参数路由
  - _generate_formula_report(): 水色指数专属结构
    1.项目背景 → 2.影像预处理 → 3.公式列表 →
    4.指数统计(10_WaterIndex_CSV) → 5.分布专题图(11_Thematic_Map)
    绝不包含模型训练/R²/RMSE 等 ML 内容
  - _generate_ml_report(): 原有 ML 逻辑完整保留
  - _analyze_statistics(): 全部改用 .get() 防御式读取
    兼容 参数/Parameter/name, 点位数/数量/count,
    最小值/min, 最大值/max, 平均值/mean, 标准差/std
2026-07-09 11:33:50 +08:00
f496b28c8c fix: 回退 setWidgetResizable(False) 恢复图像显示 + 保留滚动条策略修复
setWidgetResizable(False)+QSizePolicy.Ignored 导致 QLabel
  无有效 sizeHint, 图像不显示。

回退为 setWidgetResizable(True), 保留显式 ScrollBarAsNeeded
  策略 (原默认可能为 AlwaysOff 导致滚动条异常)。
2026-07-08 17:55:34 +08:00
7921e21750 fix: step4 采样点过密 — 提高自适应下限 + 默认关闭自适应模式
问题: min_interval=10 导致每个水面产生数千个密集采样点 (8242点)

修复:
  1. sampling.py: min_interval 默认值 10→50 (提高 5×)
     两个入口函数同步修改 (chunked + full)
  2. step4_sampling_panel.py: 自适应采样复选框默认 False
     用户设置的固定间隔 (interval=100px) 真正生效
2026-07-08 16:03:42 +08:00
197f58c187 fix: step12 图像预览横向滚动条被挤出视口底部
根因: QScrollArea.setWidgetResizable(True) 强制 QLabel 填充视口,
  与缩放后 QLabel 的 pixmap 固有尺寸冲突,滚动条布局异常。

修复:
  1. setWidgetResizable(False) — QLabel 保持 pixmap 自然尺寸
  2. QScrollArea SizePolicy → Expanding×Expanding (受父布局约束)
  3. ScrollBarPolicy → AsNeeded (显式设置)
  4. QLabel SizePolicy → Ignored (按内容自适应大小)

缩放行为:
  - 放大超出视口 → 自动出现滚动条
  - 缩小/适应窗口 → QLabel 自动缩至 pixmap 尺寸, 无滚动条
2026-07-08 15:24:44 +08:00
385e5915af 格式统一 2026-07-01 17:33:52 +08:00
1611001a72 格式统一 2026-07-01 13:19:46 +08:00
8de73db80e 格式统一 2026-07-01 11:32:32 +08:00
a3c20d3e49 格式统一 2026-07-01 09:57:27 +08:00
c793ea2204 格式统一 2026-06-30 14:12:12 +08:00
9e433395f4 feat: 波长偏移修正 + 项目架构文档
- BandMathCalculator 支持 wavelength_offset 参数,公式波长统一加减偏移后匹配传感器波段
- WaterQualityIndexCalculator 全链传递偏移量 (band_math → calculate_one → calculate_many)
- WaterIndexCsvProcessor / Step7Handler / DataPreparationStep 传播偏移参数
- Step7/Step10 面板新增 QDoubleSpinBox 波长偏移控件 (±200nm, 默认0)
- 偏移控件去除单位后缀,避免编辑时需手动移动光标
- 新增 ARCHITECTURE.md 完整项目架构文档
2026-06-30 13:13:38 +08:00
8ff5b08190 imput导入修正,去除掉废弃内容 2026-06-30 11:32:40 +08:00
f05916bc3a 步骤四的采样点和对应的光谱图像展示修正 2026-06-30 10:45:20 +08:00
73cb019a4a refactor: 重构所有面板 update_from_config 为文件系统扫描模式
=== 核心变更 ===
- _step_path_resolver 新增 scan_work_dir_for_input() 统一文件扫描工具
- 基于 _SCAN_TABLE 映射表,按 output_type 自动扫描 work_dir 子目录
- 支持扩展名匹配(.dat/.tif/.bsq/.csv 等)和文件名关键词匹配
- 按 mtime 排序,返回最新匹配文件

=== 各面板重构 ===
- step2/3/4/6: 废弃 main_window.stepX_panel 跨面板读取
  统一改为 scan_work_dir_for_input(work_dir, 'water_mask/glint_mask/deglint_image')
- step6: 移除对 step1/2/3/5 panel 的4处跨面板依赖
- step8: 替换 _resolve_training_csv_from_workdir 为 scan_work_dir_for_input
  优先级:training_spectra_indices -> training_spectra
- step9: 替换 _resolve_latest_wqi_test_csv 为 scan_work_dir_for_input
  废弃 factory.get_panel('step4_sampling') 和 get_panel('step8_ml_train')
- step10: 替换3层回退链为 scan_work_dir_for_input('sampling_points')
- step11: 替换 factory.get_panel('step9')/('step1') 为文件扫描

=== 删除的冗余方法 ===
- step8._resolve_training_csv_from_workdir (~55行)
- step9._resolve_latest_wqi_test_csv (~56行)

=== 数据流原则 ===
1. pipeline context 为第一顺位(执行时内存状态)
2. 文件系统扫描为回退(仅信任硬盘上真实存在的文件)
3. 彻底禁止面板间 UI 控件互相读取
2026-06-30 09:53:23 +08:00
1bdd623fe7 style: Step4 图表中文排版升级,对齐Step12风格
- 添加 matplotlib rcParams 中文字体配置(Microsoft YaHei / SimHei)
- 散点图标题→'采样点空间分布',坐标轴→'经度/X'、'纬度/Y'
- 光谱图标题→'采样点 ID: X 光谱曲线',坐标轴→'波长/特征'、'反射率'
- 悬停提示框中文化:ID + 经度 + 纬度
- 标题字号统一为 fontsize=14 fontweight='bold' pad=12
- 轴标签字号统一为 fontsize=11
2026-06-30 09:45:50 +08:00
48d17ef0ca fix: 全局UX修复与Step4交互可视化重构
=== 自动填入过于激进(幽灵路径级联)===
- 所有面板 update_from_config 移除 os.makedirs(),目录创建留给 pipeline 执行
- 输出路径仅 widget 为空时填入默认值,不覆盖用户已选
- 输入路径从上游读取后添加 os.path.exists() 检查,阻断幽灵路径级联
- panel_factory._replay_live_panel_inputs 广播前校验文件确实存在
- step10 update_from_config 添加 os.path.isfile() 存在性检查
- 清理 step8/9/11 中冗余局部 import os(修复 UnboundLocalError)

=== 输出目录缺失 ===
- step7 新增 output_file FileSelectWidget,默认路径 7_Water_Quality_Indices/
- step9 output_file 从文件模式改为目录模式 (Directories)

=== 空目录自动创建 ===
- step12 _setup_prediction_output_dirs 移除 mkdir() 调用,改为只读日志

=== 过期依赖与缺失 import ===
- panel_registry Step10 依赖 bsq_file→sampling_csv_file(匹配 CSV 模式重构)
- step7 添加缺失的 import pandas as pd(修复 NameError)

=== 导航与 UI 一致性 ===
- water_quality_gui_v2 新增 _select_first_nav_item(),启动时默认选中第一项
- step1 输出卡片对齐 step8 风格
- step8 补充缺失的样式表和统一边距

=== Step4 交互式光谱探针重构 ===
- 左右分栏 QSplitter 布局:左侧控制区 + 右侧 Matplotlib 视图
- 1x2 子图:ax1 散点图 + ax2 光谱曲线
- Hover 悬停 Annotation 显示坐标,Click 点击高亮+绘制光谱
- NavigationToolbar2QT 工具栏(保存/缩放/平移)
- 自动检测坐标列和波段列,完善异常处理
2026-06-30 09:38:27 +08:00
DXC
e337f01312 全局修正 2026-06-29 16:16:55 +08:00
DXC
61e06dd789 步骤十三页面修改 2026-06-29 15:15:09 +08:00
DXC
e121b02e34 Step8/9 UX: feature_start 改 QComboBox + 多源 CSV 优先回退 2026-06-29 14:40:39 +08:00
DXC
b82efc1e52 步骤十二页面修改 2026-06-29 14:31:31 +08:00
DXC
c6c0b8fdf5 步骤十一页面修改 2026-06-29 11:11:32 +08:00
DXC
ef24398df9 步骤十页面修改 2026-06-29 10:16:12 +08:00
DXC
14ea72a4e7 步骤九页面修改 2026-06-26 17:13:14 +08:00
DXC
23f391eedf 步骤八页面修改 2026-06-26 16:59:24 +08:00
DXC
9ab916a61c 步骤七页面修改 2026-06-26 16:43:28 +08:00
DXC
abbe218608 步骤六页面修改 2026-06-26 13:56:57 +08:00
DXC
5fb2db4a07 步骤五页面修改 2026-06-26 13:54:09 +08:00
DXC
7293ddd5ee 步骤四页面修改 2026-06-26 13:51:10 +08:00
DXC
6e4f0f5527 步骤二页面修改 2026-06-26 13:24:56 +08:00
DXC
e54c2b8fe6 步骤一页面修改 2026-06-26 13:07:22 +08:00
DXC
bcd1ce371e 页面4样式修改 2026-06-26 09:45:00 +08:00
DXC
429ed3c1c1 测试修改 2026-06-25 18:11:50 +08:00
DXC
43f50ec07b 测试修改 2026-06-25 15:50:02 +08:00
DXC
08a9a0337d refactor(step10_panel): 切换到散点 CSV 模式 UI + Worker 2026-06-24 11:43:44 +08:00
DXC
e907e73810 测试修改 2026-06-23 15:26:55 +08:00
DXC
b8d263e494 测试修改 2026-06-23 14:39:54 +08:00
DXC
e9c4535bb0 fix(wavelength_prefix): _viz_infer_wavelength_start_column 加 nm/wavelength/wl/λ 前缀兼容
src/gui/panels/step12_viz_panel.py _viz_infer_wavelength_start_column:

原逻辑只匹配 200.0<=v<=3000.0 的纯数字列名。新增正则剥前缀 _PREFIX_RE =

^(?:nm|wavelength|wl|λ|wave_len)[_\s-]* (不区分大小写),剥后再试 float。

覆盖 nm_700、wavelength_800.0、WL 900、λ_650 等命名风格。

兜底返回 0 时打印 df.columns.tolist() 便于下次失败时一眼定位列名。

Why: 训练光谱 CSV 可能因不同 step 输出格式差异,前缀化列名常见。

viz_thread.py 同步修改(同函数独立副本)。
2026-06-22 16:37:29 +08:00
DXC
26f93bd233 fix(step12_viz): scatter 模型目录改读 self.extra + 主线程 step8 预取注入
worker generate_all_selected.gen_scatter 块改读 self.extra['models_dir'],

fallback 到 wp / 8_Supervised_Model_Training(替换旧版 7_Supervised_Model_Training)。

主线程 generate_all_visualizations 通过 panel_factory.get_panel('step8_ml_train')

预取 step8 panel.output_path,注入 extra 字典 models_dir 键。

Why: 子线程内 self.window() 无意义(VisualizationWorkerThread 是 QThread 子类

且无 parent 传参),必须主线程预取 + worker 读 extra 字典。与同文件既有

scatter 任务(line 208-209)和 step11 风格统一。
2026-06-22 16:14:59 +08:00
DXC
b2435d66c3 fix: 终极状态回滚 + 三个 panel 短路径导包修复
- water_quality_gui_v2.py:回滚机制由 panel_registry.get_tab_index 改为基于 PANEL_REGISTRY[current_tab_idx]['step_id'] 的索引反查,消除不存在的 get_tab_index 导致回滚期间二次崩溃并被静默吞噬的幽灵跳步根因
2026-06-18 14:55:14 +08:00
DXC
e5bb9c5cd9 fix: 懒加载导航容错 + 状态回滚机制 + Step 11 NameError 修复
导航容错(v2._on_step_list_changed)

- try-except 包裹懒加载 + setCurrentIndex,避免导航崩溃导致左右脱节

- 新增状态回滚机制:右侧切换失败时强制将左侧导航栏选中项退回当前显示 tab_index 对应的 step,消除"幽灵跳转/假死"(blockSignals 防 setCurrentRow 二次触发回调)

Step 11 NameError

- step11_map_panel 顶部补 import get_step_output_path,消除 update_from_config 中 NameError
2026-06-18 13:59:30 +08:00
DXC
f93dbeb848 fix: Step 7 路由 + 发送端字符串对齐(消除 KeyError)+ 配套防御性补强
核心修复

- panel_registry: step7_index class_ref 换绑 Step7View(最小侵入式对位,保持 step_id 保护全项目 18 处下游引用)

- step7_view._on_run_single_clicked: 'step7' → 'step7_index'(wrapped_config key + step_name 同步对齐,消除 PipelineScheduler 抛 KeyError "未注册的步骤: 'step7'")

配套防御性补强

- pipeline_executor.run_single_step_handler: 后台 is_running 时改 QMessageBox 警告 + LogMessage,防多次点击死锁

- worker_thread.run_single_step: 兼容嵌套/扁平 config 格式,嵌套子 dict 为空时回退扁平读取

- 公式 ListWidget layout 修复:setUniformItemSizes + stretch=1 + update(),消除 step7_view 加载后坍塌/不刷新
2026-06-18 13:59:20 +08:00
DXC
2261b4b30e feat: Step1~Step14 面板单步按钮 EventBus 解耦 + Handler 补全(Step8~Step14)+ 旧上帝类删除
- 9 个面板(step1~step6/step8_ml_train/step8_qaa/step9_ml_predict/step10)单步执行按钮从 parent 链上溯改为 global_event_bus.publish('RequestRunSingleStep')

- PipelineExecutor 新增 _on_request_run_single_step 订阅

- 新增 Handler: step8_ml_train / step9_ml_predict / step10_qaa_inversion / step11_concentration / step12_kriging / step13_visualization / step14_report

- 删除旧 water_quality_inversion_pipeline_GUI.py(上帝类已肢解完毕)
2026-06-18 09:19:51 +08:00
DXC
bd4263d2ca 旧 GUI 张冠李戴修复:step6/step8 ML 训练 CSV 强制读 Step 6 特征结果 + step3 默认算法切到 goodman 2026-06-16 17:53:55 +08:00
DXC
5084f7d049 Step10 Kriging 输出路径强制 14_visualization + Step11 掩膜自动填入 2026-06-16 14:12:10 +08:00
DXC
0238aa66ab 路径归一化:统一 14 个子目录 helper 接口 + 修复 getattr 张冠李戴
新增 _step_path_resolver.py(STEP_DATA_SOURCE 映射表 + _FALLBACK_DIR_TABLE 40+ keys + resolve_subdir / get_step_output_path / resolve_step_widget 三层 API),与 pipeline.get_step_output_dir 互为表里、互不依赖。

pipeline 新增 get_step_output_dir(step_name) 唯一权威接口(class-level _STEP_OUTPUT_DIR_MAP 延迟构造 + 未知 key 回退 work_dir + 调试日志)。

全量重构 src/gui/panels/step*.py(17 个文件)

* 消除全部 os.path.join(wp, "X_subdir") 硬编码(14 个预定义子目录)

* 8 处 getattr(main_window.stepXX_panel, ...) 张冠李戴死代码全部修复(错位属性名 → 通过 STEP_DATA_SOURCE 映射到正确的 main_window 长名属性)

* 删除 step12_viz_panel.py 中 self.step11_ml_panel / step11_panel / step12_panel 死代码块

* 提示文字/标签字典/日志保留原文,仅替换实际路径计算

Smoke test:39 fallback key + 14 路径映射 + 14 step 数字 key + 17/17 panel AST 解析 + 17/17 import 全部就位。
2026-06-16 12:54:18 +08:00