Commit Graph

282 Commits

Author SHA1 Message Date
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
f63e6bce05 整体框架修改 2026-06-26 09:47:52 +08:00
DXC
ea5d80041d 整体框架修改 2026-06-26 09:45:11 +08:00
DXC
bcd1ce371e 页面4样式修改 2026-06-26 09:45:00 +08:00
DXC
429ed3c1c1 测试修改 2026-06-25 18:11:50 +08:00
DXC
d327c6c267 fix(report_word): Minimax v2 接口兼容 + 缓存防毒化自愈 2026-06-25 16:45:50 +08:00
DXC
43f50ec07b 测试修改 2026-06-25 15:50:02 +08:00
DXC
67aaaaa6b2 refactor(step10): 拆分 WaterIndexCsvProcessor 到独立子模块 + smoke test 2026-06-24 12:52:56 +08:00
DXC
6a1014afcc refactor(step10_new_arch): 同步新架构 view + service 到散点 CSV 模式 2026-06-24 12:44:01 +08:00
DXC
08a9a0337d refactor(step10_panel): 切换到散点 CSV 模式 UI + Worker 2026-06-24 11:43:44 +08:00
DXC
b0ace0bde8 feat(step10): 新增 WaterIndexCsvProcessor 散点处理入口 2026-06-24 11:39:52 +08:00
DXC
c5a82ec342 refactor(gui/sidebar): 重组导航为四模块 + 扁平无框蓝色高亮主题 + 中括号移除
数据层(panel_registry.py):13 个 step 从「阶段一/二/三/四」重组为四个模块

  模块一 影像预处理(step 1-3)

  模块二 特征工程与数据(step 4-7)

  模块三 模型训练与反演(step 8-10)

  模块四 制图与成果汇编(step 11-13)

step_id 顺序、tab_index、面板绑定、Tab 路由全部保持零变化

文本层(water_quality_gui.py / v2):移除 └─ 字符前缀

样式层(styles.py:get_sidebar_stylesheet):扁平无框 + 蓝色高亮主题

  - 容器 QListWidget 无框化(border: none / outline: none / 透明背景)

  - 步骤项 padding 8px 6px + margin 2px 8px + border-radius 4px

  - hover 极浅蓝灰 #F0F4F8;selected 饱和蓝 #0078D4 + 白字 #FFFFFF

  - 分类头(stage_header):!enabled 选择器锁定 → 蓝色 #0078D4 + 加粗 + 上下间距

Python 代码侧:stage_item.setForeground 硬编码 #0078D4、stage_font.setBold(True)

作为 QSS 失效兜底 + 代码意图自解释

末尾迭代:四个模块名移除 [ ] 中括号(极简风)
2026-06-23 16:50:30 +08:00
DXC
948d1d8acd 测试修改 2026-06-23 16:12:58 +08:00
DXC
e907e73810 测试修改 2026-06-23 15:26:55 +08:00
DXC
b8d263e494 测试修改 2026-06-23 14:39:54 +08:00
DXC
c4aa246c95 fix(viz_reports): plot_scatter_true_vs_pred 指标文本框移到图例下方 2026-06-23 08:41:40 +08:00
DXC
5a5109b1a6 fix(viz_reports): plot_scatter_true_vs_pred NaN 容错 + subplots_adjust 替换 tight_layout 2026-06-22 17:48:03 +08:00
DXC
e8820a73c1 fix(viz_reports): plot_spectrum_by_parameter legend 移出画布防止遮挡 2026-06-22 17:16:10 +08:00
DXC
76d697ce3f fix(viz_thread): generate_all_selected 读 self.extra 注入路径(v1 GUI 实际副本) 2026-06-22 17:15:59 +08:00
DXC
56d8a292be fix(wavelength_prefix): viz_thread.py 同步 _viz_infer_wavelength_start_column 修改
src/gui/core/viz_thread.py 的 _viz_infer_wavelength_start_column 是

step12_viz_panel.py 副本(无跨文件引用),两处独立维护必须同步。

同步前缀兼容与 DEBUG 日志逻辑。

Why: 同一函数双份副本不一致会导致 worker 子线程路径与 panel 主线程

路径在相同列名格式下表现差异。同步保证行为一致。
2026-06-22 16:37:57 +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
561c59fbd4 fix(scatter_legend): 基础版散点图 legend 移出画布防止遮挡
src/postprocessing/visualization_reports.py plot_scatter_true_vs_pred:

ax.legend 加 bbox_to_anchor=(1.02, 1) + borderaxespad=0,将图例移到画布右侧外部。

已有 plt.tight_layout() 与 plt.savefig(..., bbox_inches='tight') 自动处理裁剪。

Why: loc='upper left' 时图例位于散点区左上角,训练/测试点集中时易被遮挡。

仅改基础版(plot_scatter_true_vs_pred),增强版 sctter_batch.py 是 gridspec 4x4

子图布局,硬套 bbox_to_anchor 会破坏右侧 ax_hist_y 子图,保留原样。
2026-06-22 16:37:11 +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
b96555e95c fix(base_view): dispatch_execute 走事件总线优先,父链爬链降级为 fallback
BaseView.dispatch_execute 优先 publish RequestRunSingleStep 事件总线

(v1 pipeline_executor 已订阅),让 v1 GUI(water_quality_gui_v2.py)

也能接收 v2 view 的执行请求。父链爬链保留为 fallback(v2 MainView

直调 run_single_step)。两者都失败时 RuntimeError 错误信息增强为双重失败说明。

Why: v1 GUI 加载 v2 view 时原父链爬链找不到具备 run_single_step 方法

的主窗口容器(v1 MainView 无此方法),触发父级GUI对象 RuntimeError。

事件总线优先 + 父链 fallback 让 v1/v2 双 GUI 都可正常工作。
2026-06-22 16:14:21 +08:00
5b2f5a8160 fix(panel_registry): dependencies 控件名对账 (step2-11, 13处断链) 2026-06-18 15:39:12 +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
f61a3dfb1d feat: 懒加载面板Catch-up状态回放 + 上一步/下一步向导导航按钮 2026-06-18 11:18:37 +08:00
DXC
d6c003a211 fix: Step7 UI坍塌修复+EventBus打通 + DRY抽离spxy/ks + GridSearchCV→RandomizedSearchCV + smoke test死链修复 2026-06-18 11:18:27 +08:00
DXC
3ee4e90b31 fix: step_default_outputs 支持列表候选文件名,解决动态命名导致 OutputUpdated 断链 2026-06-18 10:36:52 +08:00
DXC
3f217e95b0 fix: 修复下游面板自动填充断裂的三处根因 + 清理过时 pipeline→panel 映射 2026-06-18 10:28:14 +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
2d45610aa6 fix: 导航状态锁防抖 + 运行按钮中间槽函数(修复乱跳与无响应双 Bug)
Bug1 导航乱跳:_on_step_list_changed 先调 get_panel 触发懒加载再 setCurrentIndex,避免 removeTab/insertTab 索引偏移导致跳页错乱。_on_tab_changed 加 _is_syncing 守卫斩断乒乓效应。Bug2 按钮无响应:新增 _on_run_all_clicked 中间槽函数替代直接连接,内含 print 探针 + try/except 兜底。
2026-06-18 09:01:25 +08:00
DXC
f1cc339d4a feat: Step2~Step7 Handler 批量生成 + WorkerThread 接入新调度器
- 新增 6 个 Handler:Step2GlintDetection / Step3GlintRemoval / Step4Sampling / Step5ProcessCsv / Step6ExtractSpectra / Step7CalcIndices

- 新增 register_handlers.py:register_all_handlers() 一键注册 Step1~Step7

- 更新 __init__.py:导出全部 7 个 Handler

- 重构 worker_thread.py:移除旧 WaterQualityInversionPipeline 导入,改用 PipelineScheduler + register_all_handlers

- run_single_step 改为 scheduler.run_step() 调用,保留外部模型透传逻辑
2026-06-17 18:02:31 +08:00
DXC
f6455b71ba fix: PanelFactory 信号风暴修复 + 后端上帝类肢解(BaseStepHandler/调度器/Step1打样) 2026-06-17 17:48:40 +08:00
DXC
39e8c29913 refactor: 实现第二批 Manager(LogManager/ConfigManager/DialogService/TrainingModeManager)
- log_manager.py: 日志区+进度条+清空按钮封装,内部订阅 LogMessage/ProgressUpdate

- config_manager.py: 配置读写(new/load/save/get_current_config),懒加载安全(未加载面板返回 {})

- dialog_service.py: 纯展示弹窗封装(Pipeline状态/关于/AI设置)

- training_mode_manager.py: 训练模式切换,发布 TrainingModeChanged 事件

- water_quality_gui_v2.py: 725→605 行,菜单回调全部委托给 Manager,移除 _create_log_panel/_create_progress_panel/_on_log_message/_on_progress_update
2026-06-17 17:35:27 +08:00
DXC
19c86e6e44 refactor: 实现纯壳主窗口 + 第一批 Manager(PanelFactory/PipelineExecutor/WorkspaceInitializer)
- water_quality_gui_v2.py: 纯壳主窗口(725行),依赖注入链 + EventBus 驱动,7个菜单连线

- panel_factory.py: PanelFactory 懒加载工厂(占位页替换 + 邻接预加载)

- pipeline_executor.py: PipelineExecutor 核心调度(接管 run_full_pipeline/run_single_step/stop_pipeline)

- workspace_initializer.py: WorkspaceInitializer 环境初始化(接管 init_workspace/set_work_directory/auto_populate_all)
2026-06-17 17:18:15 +08:00
DXC
bb5c2a50f8 refactor: 引入 EventBus 事件总线,实现各步骤面板间的去中心化自动参数传导,完成最终解耦 2026-06-17 16:27:26 +08:00
DXC
a58744cfbb refactor: 建立动态面板注册表,消除硬编码,实现步骤界面的数据驱动渲染与依赖路由 2026-06-17 16:02:17 +08:00
DXC
1949711cda refactor: 提取 WorkspaceManager,将文件扫描与路径业务逻辑从主 GUI 解耦 2026-06-17 15:35:02 +08:00
DXC
191a4b681d refactor: 移除主界面重复代码,复用现有组件并彻底抽离图像控件 2026-06-17 15:16:19 +08:00