diff --git a/docs/FreeCAD 端子显示连线保存回写开发文档.md b/docs/FreeCAD 端子显示连线保存回写开发文档.md index 51899f5..b2b75e4 100644 --- a/docs/FreeCAD 端子显示连线保存回写开发文档.md +++ b/docs/FreeCAD 端子显示连线保存回写开发文档.md @@ -574,4 +574,5 @@ ManualWiring.py - 2026-05-20:新增 FCStd 设备模板制作基础能力,支持把模型上的点位创建为带 `Role="Terminal"`、`CanWire=true`、`QetTemplateSlotName` 的模板端子 LCS;已用单元测试验证端子语义写入和模板校验逻辑。 - 2026-05-20:补充 A 方案资产流转设计,明确 `.FCStd` 为正式设备资产;zwl/QET 只负责选择、保存、导出 `.FCStd` 路径,FreeCADExchange 负责读取 LCS 端子语义并生成工程端子。 - 2026-05-20:补上 `QET_Template_SaveAsFCStd` 模板保存命令,保存前会校验至少存在一个有效模板端子,并自动补 `.FCStd` 后缀;已用单元测试验证保存路径和端子校验结果。 +- 2026-05-20:修复 `TemplateAuthoring.py` 在 `FreeCADCmd.exe` 命令行模式下导入时误注册 GUI 命令的问题;已在运行目录验证创建 `P1` 模板端子、保存 `.FCStd`、重新打开后端子语义仍可识别。 ``` diff --git a/src/Mod/FreeCADExchange/TemplateAuthoring.py b/src/Mod/FreeCADExchange/TemplateAuthoring.py index a4c4a7b..acf6273 100644 --- a/src/Mod/FreeCADExchange/TemplateAuthoring.py +++ b/src/Mod/FreeCADExchange/TemplateAuthoring.py @@ -321,7 +321,7 @@ def register_commands(): global _COMMANDS_REGISTERED if _COMMANDS_REGISTERED: return - if Gui is None: + if Gui is None or not hasattr(Gui, "addCommand"): return Gui.addCommand("QET_Template_AddTerminal", CommandAddTemplateTerminal()) Gui.addCommand("QET_Template_ValidateTerminals", CommandValidateTemplateTerminals()) diff --git a/tests/python/freecad_exchange_template_authoring_test.py b/tests/python/freecad_exchange_template_authoring_test.py index 52c401a..8f0517a 100644 --- a/tests/python/freecad_exchange_template_authoring_test.py +++ b/tests/python/freecad_exchange_template_authoring_test.py @@ -46,6 +46,11 @@ def _install_fake_freecad(): sys.modules["FreeCADGui"] = fake_freecadgui +def _install_fake_freecad_without_gui_commands(): + _install_fake_freecad() + sys.modules["FreeCADGui"] = types.ModuleType("FreeCADGui") + + class FakeViewObject: def __init__(self): self.Visibility = True @@ -115,6 +120,13 @@ def _reload_modules(): class TemplateAuthoringTest(unittest.TestCase): + def test_import_skips_command_registration_when_gui_has_no_add_command(self): + _install_fake_freecad_without_gui_commands() + + template_authoring = _reload_modules() + + self.assertTrue(hasattr(template_authoring, "save_template_as_fcstd")) + def test_create_template_terminal_writes_lcs_semantics(self): _install_fake_freecad() template_authoring = _reload_modules()