# FreeCAD FCStd 电气设备模板制作设计 ## 1. 目标 把普通 STEP / STP / STE 几何模型加工成可复用的 `.FCStd` 电气设备模板。 模板保存设备几何和端子槽位语义。后续不同工程、不同人员导入这个 FCStd 时,FreeCADExchange 能识别其中的端子 LCS,并把工程里的真实 `terminal_uuid` 绑定到这些槽位上。 ## 2. 非目标 - 不修改 FreeCAD C/C++ 内核。 - 不在模板文件里保存工程级 `terminal_uuid`、`project_uuid`、`instance_id`。 - 不做自动布线。 - 不把完整接线路径写入数据库。 - 不要求第一版做完整 UI 面板。 ## 3. 核心原则 STEP / STP / STE 是几何输入,FCStd 是正式设备模板输出。 模板端子描述“这个设备模型哪里可以接线”。工程端子描述“当前工程的哪个 2D 端子绑定到哪个 3D 端子对象”。两者不能混用。 ## 4. 模板文件结构 以电流互感器为例: ```text 电流互感器.FCStd ModelGeometry Terminal_P1 Terminal_P2 ``` `Terminal_P1` 和 `Terminal_P2` 是 LCS 对象。它们的位置就是模型上真实接线位置,方向就是后续出线方向参考。 ## 5. 模板端子属性 模板端子至少写入: ```text Role = Terminal CanWire = true QetTemplateSlotName = P1 QetTerminalLabel = P1 QetTerminalType = primary ``` 模板端子不写入: ```text QetProjectUuid QetElementUuid QetTerminalUuid QetInstanceId ``` 这些字段只属于具体工程场景。 ## 6. 新模块 新增模块: ```text src/Mod/FreeCADExchange/TemplateAuthoring.py ``` 职责: - 创建模板端子 LCS。 - 给 LCS 写入模板语义属性。 - 校验当前文档中的模板端子。 - 保存或辅助保存 `.FCStd` 模板。 不负责: - 工程 `2d_to_3d.json` 导入。 - 工程端子 UUID 绑定。 - 手动连线。 - `3d_to_2d.json` 回写。 ## 7. 第一版命令 第一版先做两个命令: ```text QET_Template_AddTerminal QET_Template_ValidateTerminals ``` `QET_Template_AddTerminal`: 1. 用户选择一个模型对象或模型上的点位。 2. 执行命令。 3. 输入端子槽位名,例如 `P1`。 4. 在选择位置创建 LCS。 5. 自动写入模板端子属性。 `QET_Template_ValidateTerminals`: 1. 扫描当前文档中的端子 LCS。 2. 检查是否有 `Role="Terminal"`。 3. 检查是否有 `QetTemplateSlotName`。 4. 输出端子列表和问题。 保存动作第一版直接使用 FreeCAD 自带保存为 `.FCStd`。后续再补 `QET_Template_SaveAsFCStd`。 ## 8. 第一版点位策略 第一版按简单稳定策略实现: 1. 如果用户选择对象的子元素,并且能取到选择点,就使用该点。 2. 如果只能选到对象,则使用对象包围盒中心。 3. 如果没有选择,则拒绝创建端子。 端子方向第一版使用默认旋转。后续再增加方向编辑,例如沿面法向、沿用户选择边方向或手动输入轴角。 ## 9. 与现有导入流程的关系 现有项目导入流程保持不变: ```text ExchangeBootstrap -> DeviceImport -> TerminalImport -> ExchangeWriteBack ``` `TerminalImport` 已经支持读取 FCStd 模板中的 `Role="Terminal"` LCS。模板制作工具只负责把这些 LCS 方便、规范地放进 FCStd。 项目导入时的优先级仍是: 1. FCStd 模板 LCS。 2. sidecar JSON。 3. bbox fallback。 ## 10. 用户流程 以电流互感器为例: 1. 打开 FreeCAD。 2. 导入 `电流互感器.step`。 3. 选择 P1 接线位置。 4. 执行 `QET_Template_AddTerminal`,输入 `P1`。 5. 选择 P2 接线位置。 6. 执行 `QET_Template_AddTerminal`,输入 `P2`。 7. 执行 `QET_Template_ValidateTerminals`。 8. 保存为 `电流互感器.FCStd`。 9. 在 LightWork3D 设备 3D 资源中使用该 FCStd。 ## 11. 验收标准 - 能从普通 STEP 模型创建 `Terminal_P1` 和 `Terminal_P2`。 - 端子对象是 LCS。 - 端子对象带 `Role="Terminal"` 和 `CanWire=true`。 - 端子对象带 `QetTemplateSlotName`。 - 保存为 FCStd 后重新打开,端子和属性仍存在。 - 使用该 FCStd 作为工程模型时,端子位置来自模板 LCS,不再使用 bbox fallback。 ## 12. 风险和处理 选择点不可用: - 第一版退回对象包围盒中心。 - 如果连对象也没有选择,则直接提示错误。 端子重名: - 第一版自动使用唯一对象名,例如 `Terminal_P1_1`。 - `QetTemplateSlotName` 保持用户输入,用于槽位语义。 模板里混入工程端子属性: - 校验命令提示警告。 - 第一版不自动删除,避免误删用户数据。 方向不准确: - 第一版只保证位置和语义。 - 后续补方向编辑命令。 ## 13. 实施顺序 1. 新增 `TemplateAuthoring.py`。 2. 在 `CMakeLists.txt` 加入该模块。 3. 在 `InitGui.py` 注册模板命令。 4. 实现添加端子命令。 5. 实现校验命令。 6. 增加 Python 单元测试,覆盖属性写入和校验逻辑。 7. 用电流互感器模型手工验证一次完整流程。