路径归一化:统一 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 全部就位。
This commit is contained in:
DXC
2026-06-16 12:54:18 +08:00
parent 03c788a16c
commit 0238aa66ab
19 changed files with 544 additions and 222 deletions

View File

@ -185,7 +185,71 @@ class WaterQualityInversionPipeline:
self.callback = None
print(f"工作目录已创建: {self.work_dir}")
# ---- 步骤输出目录查找接口(归一化所有 panel 的路径访问)----
# 用户口语编号 → 权威子目录对象 的映射
# 同时支持 "stepN"、"stepN_alias"、"subdir名" 三种 key 形式查找
_STEP_OUTPUT_DIR_MAP = None # 延迟到首次访问时构造
def _ensure_step_dir_map(self):
"""延迟构造 step_name → 目录对象 映射表(首次访问时执行)"""
if WaterQualityInversionPipeline._STEP_OUTPUT_DIR_MAP is not None:
return WaterQualityInversionPipeline._STEP_OUTPUT_DIR_MAP
wp = self.work_dir
m = {
# 基础步骤
"step1": wp / "1_water_mask",
"step2": wp / "2_Glint_Detection",
"step3": wp / "3_deglint",
"step4_sampling": wp / "4_sampling",
"step5_clean": wp / "5_Data_Cleaning",
"step6_feature": wp / "6_Spectral_Feature_Extraction",
"step7_index": wp / "7_Water_Quality_Indices",
"step8_ml_train": wp / "8_Supervised_Model_Training",
"step9_ml_predict": wp / "8_Non_Empirical_Regression",
"step10_watercolor": wp / "10_WaterIndex_Images",
"step11_map": wp / "14_visualization",
"step12_viz": wp / "14_visualization",
"step13_report": wp / "14_visualization",
# 合并目录(提供单一访问点,避免分散硬编码)
"step11_predictions": wp / "11_12_13_predictions",
"step12_predictions": wp / "11_12_13_predictions",
"step13_predictions": wp / "11_12_13_predictions",
"custom_regression": wp / "13_Custom_Regression",
"prediction_dir": wp / "11_12_13_predictions",
"visualization": wp / "14_visualization",
"reports": wp / "reports",
# 兼容主流程 step_id数字+短名)
"step8": wp / "8_Supervised_Model_Training",
"step9": wp / "8_Non_Empirical_Regression",
"step10": wp / "10_WaterIndex_Images",
"step11": wp / "11_12_13_predictions",
"step12": wp / "13_Custom_Regression",
"step13": wp / "reports",
"step14": wp / "14_visualization",
}
WaterQualityInversionPipeline._STEP_OUTPUT_DIR_MAP = m
return m
def get_step_output_dir(self, step_name: str):
"""根据步骤名称返回权威输出目录 Path 对象。
这是 panel 端访问子目录的**唯一**入口。接收以下任意形式 key:
- 完整 panel 属性名: "step11_map", "step12_viz", "step8_ml_train"
- 主流程 step_id: "step8"~"step14"
- 业务别名: "prediction_dir", "visualization", "reports", "custom_regression"
- 兼容口语: "step11_predictions" (=11_12_13_predictions)
未知 key 一律回退到 work_dir 本身,并打 warning。
"""
mapping = self._ensure_step_dir_map()
key = (step_name or "").strip()
if key in mapping:
return mapping[key]
print(f"[pipeline.get_step_output_dir] 未知 step_name={key!r},回退到 work_dir")
return self.work_dir
def set_callback(self, callback):
"""
设置回调函数用于向GUI报告进度