路径归一化:统一 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:
@ -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报告进度
|
||||
|
||||
Reference in New Issue
Block a user