|
|
|
@ -701,3 +701,494 @@ LCS 不负责:
|
|
|
|
一句话总结:
|
|
|
|
一句话总结:
|
|
|
|
|
|
|
|
|
|
|
|
> 3D 端子不应只是几何点,而应是“有位置的 2D 电气语义映射节点”。
|
|
|
|
> 3D 端子不应只是几何点,而应是“有位置的 2D 电气语义映射节点”。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 24. 阶段 A:统一标识和数据口径
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
阶段 A 的目标不是先把 2D/3D 联动界面做出来,而是先把“双方到底在说谁”这件事说清楚。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果这一阶段没有先定死,后面最容易出现的问题是:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 2D 里的设备实例和 3D 里的设备实例靠显示名硬猜
|
|
|
|
|
|
|
|
- 端子编号改一次,绑定关系全部漂移
|
|
|
|
|
|
|
|
- 同一个对象在数据库、3D 文档、界面显示里分别有三套名字
|
|
|
|
|
|
|
|
- 回写数据时不知道应该更新哪一条记录
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
所以阶段 A 的交付物应该是:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 一份统一字段清单
|
|
|
|
|
|
|
|
- 一份主键和唯一性约定
|
|
|
|
|
|
|
|
- 一份“谁是主数据源”的边界说明
|
|
|
|
|
|
|
|
- 一份最小同步记录样例
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.1 阶段 A 的范围
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
阶段 A 先不做下面这些事:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 不做 FreeCAD 端子对象代码
|
|
|
|
|
|
|
|
- 不做自动装配
|
|
|
|
|
|
|
|
- 不做自动路由
|
|
|
|
|
|
|
|
- 不做 2D/3D 双向实时联动
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
阶段 A 只回答四个问题:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 设备怎么唯一识别
|
|
|
|
|
|
|
|
2. 端子怎么唯一识别
|
|
|
|
|
|
|
|
3. 2D 和 3D 之间靠哪些字段绑定
|
|
|
|
|
|
|
|
4. 哪些字段由 2D 负责,哪些字段由 3D 负责
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.2 总体原则
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
建议在阶段 A 固定下面四条原则:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 电气语义真相源在 2D
|
|
|
|
|
|
|
|
2. 空间位姿真相源在 3D
|
|
|
|
|
|
|
|
3. 绑定靠稳定 ID,不靠显示名称
|
|
|
|
|
|
|
|
4. 一个字段只定义一个主责任方,避免双写冲突
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
也就是说:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 2D 负责定义“这是什么设备、这是什么端子、它属于哪个网络”
|
|
|
|
|
|
|
|
- 3D 负责定义“这个设备装在哪里、这个端子在空间里具体在哪”
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.3 阶段 A 推荐统一字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
建议第一版统一下面这组字段名。后续无论走 SQLite、JSON、还是接口对象,都尽量保持同名。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.3.1 项目级字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `project_uuid`
|
|
|
|
|
|
|
|
- `project_name`
|
|
|
|
|
|
|
|
- `source_diagram_uuid`
|
|
|
|
|
|
|
|
- `scene_diagram_uuid`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
含义建议:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `project_uuid`:整个项目唯一标识
|
|
|
|
|
|
|
|
- `project_name`:项目显示名称,不参与绑定主键
|
|
|
|
|
|
|
|
- `source_diagram_uuid`:2D 原理图/来源图纸唯一标识
|
|
|
|
|
|
|
|
- `scene_diagram_uuid`:3D 场景或 3D 视图唯一标识
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.3.2 设备级字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `element_uuid`
|
|
|
|
|
|
|
|
- `instance_id`
|
|
|
|
|
|
|
|
- `device_id`
|
|
|
|
|
|
|
|
- `display_tag`
|
|
|
|
|
|
|
|
- `asset_uri`
|
|
|
|
|
|
|
|
- `layout_2d_diagram`
|
|
|
|
|
|
|
|
- `host_object_id`
|
|
|
|
|
|
|
|
- `host_object_type`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
含义建议:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `element_uuid`:2D 元件实例唯一标识
|
|
|
|
|
|
|
|
- `instance_id`:3D 设备实例唯一标识
|
|
|
|
|
|
|
|
- `device_id`:设备类型或库元件标识
|
|
|
|
|
|
|
|
- `display_tag`:界面显示标签,例如 `QF1`
|
|
|
|
|
|
|
|
- `asset_uri`:3D 资产路径或 3D 资源定位符
|
|
|
|
|
|
|
|
- `layout_2d_diagram`:2D 布局图标识
|
|
|
|
|
|
|
|
- `host_object_id`:3D 中的宿主对象标识,例如某导轨、安装板、柜体分区
|
|
|
|
|
|
|
|
- `host_object_type`:宿主对象类型,例如 `Rail`、`Panel`、`Cabinet`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.3.3 端子级字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `terminal_uuid`
|
|
|
|
|
|
|
|
- `terminal_key`
|
|
|
|
|
|
|
|
- `symbol_terminal`
|
|
|
|
|
|
|
|
- `connection_point_key`
|
|
|
|
|
|
|
|
- `terminal_direction`
|
|
|
|
|
|
|
|
- `terminal_type`
|
|
|
|
|
|
|
|
- `wire_label`
|
|
|
|
|
|
|
|
- `net_id`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
含义建议:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `terminal_uuid`:2D 端子实例唯一标识
|
|
|
|
|
|
|
|
- `terminal_key`:设备内部端子业务键,例如 `QF1:13`
|
|
|
|
|
|
|
|
- `symbol_terminal`:图纸显示端子号,例如 `13`
|
|
|
|
|
|
|
|
- `connection_point_key`:3D 连接点键,例如设备模型中的 `cp_13`
|
|
|
|
|
|
|
|
- `terminal_direction`:端子方向/进出方向语义
|
|
|
|
|
|
|
|
- `terminal_type`:端子类型语义
|
|
|
|
|
|
|
|
- `wire_label`:当前线号/导线标签
|
|
|
|
|
|
|
|
- `net_id`:网络唯一标识
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.4 推荐主键和唯一性约定
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
建议在阶段 A 先把“哪个字段必须稳定、哪个字段只是显示用途”彻底分开。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.4.1 只做显示用途,不可作为绑定主键
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
下面这些字段不建议直接作为绑定主键:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `project_name`
|
|
|
|
|
|
|
|
- `display_tag`
|
|
|
|
|
|
|
|
- `symbol_terminal`
|
|
|
|
|
|
|
|
- 任何中文名称
|
|
|
|
|
|
|
|
- 任何模型树显示名称
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
原因很简单:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 这些字段可能会被人工修改
|
|
|
|
|
|
|
|
- 它们有显示意义,但不一定有全局唯一性
|
|
|
|
|
|
|
|
- 一旦改名,绑定关系会断
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.4.2 推荐的主键约定
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
建议按下面规则理解:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 设备绑定主键:`project_uuid + element_uuid`
|
|
|
|
|
|
|
|
- 3D 设备实例主键:`project_uuid + instance_id`
|
|
|
|
|
|
|
|
- 端子绑定主键:`project_uuid + terminal_uuid`
|
|
|
|
|
|
|
|
- 3D 连接点主键:`project_uuid + instance_id + connection_point_key`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果需要业务可读键,可以再保留:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `terminal_key = <display_tag>:<symbol_terminal>`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
但这个可读键建议作为辅助字段,不代替 `terminal_uuid`。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.5 一对一 / 一对多关系约定
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
阶段 A 建议先把关系收紧,不要一开始就支持太多复杂映射。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
第一版建议:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 一个 `element_uuid` 对应一个 3D `instance_id`
|
|
|
|
|
|
|
|
- 一个 `terminal_uuid` 对应一个 3D 端子对象
|
|
|
|
|
|
|
|
- 一个 3D 端子对象对应一个 `connection_point_key`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这意味着第一版先按最稳的模型来:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 一个 2D 设备实例,只落成一个 3D 设备实例
|
|
|
|
|
|
|
|
- 一个 2D 端子,只绑定一个 3D 连接点
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
后续如果要支持:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 一符号多模型
|
|
|
|
|
|
|
|
- 一端子多连接点
|
|
|
|
|
|
|
|
- 跳线桥接
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
再在阶段 B/C 之后扩展,不建议在阶段 A 就放开。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.6 2D 与 3D 的职责边界
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
为了避免双向覆盖,建议把字段责任按下面方式固定。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.6.1 由 2D 负责的字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `project_uuid`
|
|
|
|
|
|
|
|
- `source_diagram_uuid`
|
|
|
|
|
|
|
|
- `element_uuid`
|
|
|
|
|
|
|
|
- `device_id`
|
|
|
|
|
|
|
|
- `display_tag`
|
|
|
|
|
|
|
|
- `terminal_uuid`
|
|
|
|
|
|
|
|
- `terminal_key`
|
|
|
|
|
|
|
|
- `symbol_terminal`
|
|
|
|
|
|
|
|
- `wire_label`
|
|
|
|
|
|
|
|
- `net_id`
|
|
|
|
|
|
|
|
- 端子类型、端子方向、电气属性
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
也就是说,2D 负责:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 设备是谁
|
|
|
|
|
|
|
|
- 端子是谁
|
|
|
|
|
|
|
|
- 设备和端子在电气上是什么意思
|
|
|
|
|
|
|
|
- 它们属于哪个网络
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.6.2 由 3D 负责的字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `instance_id` 对应的空间位姿
|
|
|
|
|
|
|
|
- 宿主对象落点
|
|
|
|
|
|
|
|
- 3D 端子具体几何位置
|
|
|
|
|
|
|
|
- `connection_point_key` 对应的实际连接点落位
|
|
|
|
|
|
|
|
- 柜内装配关系
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
也就是说,3D 负责:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 它在柜体中装在哪里
|
|
|
|
|
|
|
|
- 它挂在哪条导轨、哪块安装板上
|
|
|
|
|
|
|
|
- 端子在三维空间里具体位于哪里
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.6.3 需要双方共同遵守但不能双写冲突的字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `asset_uri`
|
|
|
|
|
|
|
|
- `instance_id`
|
|
|
|
|
|
|
|
- `connection_point_key`
|
|
|
|
|
|
|
|
- `host_object_id`
|
|
|
|
|
|
|
|
- `host_object_type`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
建议策略:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 第一版由 2D 提供 `asset_uri`
|
|
|
|
|
|
|
|
- 第一版由 3D 回写 `instance_id / connection_point_key / host_object_*`
|
|
|
|
|
|
|
|
- 如果 2D 后续能预先规划 3D 实例 ID,也要保证生成规则稳定且不会和 3D 重复造号
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.7 阶段 A 的推荐记录样例
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
下面给出两个“建议形态”的样例,目的是帮助阶段 A 对齐字段语义,不代表必须先改成 JSON 存储。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.7.1 设备级绑定样例
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"project_uuid": "proj-001",
|
|
|
|
|
|
|
|
"source_diagram_uuid": "sch-001",
|
|
|
|
|
|
|
|
"element_uuid": "elem-a1b2c3",
|
|
|
|
|
|
|
|
"instance_id": "inst-qf1",
|
|
|
|
|
|
|
|
"device_id": "MCCB_1P_OF",
|
|
|
|
|
|
|
|
"display_tag": "QF1",
|
|
|
|
|
|
|
|
"asset_uri": "file:///assets/MCCB_1P_OF.step",
|
|
|
|
|
|
|
|
"layout_2d_diagram": "layout-main",
|
|
|
|
|
|
|
|
"host_object_id": "rail-01",
|
|
|
|
|
|
|
|
"host_object_type": "Rail"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.7.2 端子级绑定样例
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"project_uuid": "proj-001",
|
|
|
|
|
|
|
|
"source_diagram_uuid": "sch-001",
|
|
|
|
|
|
|
|
"element_uuid": "elem-a1b2c3",
|
|
|
|
|
|
|
|
"terminal_uuid": "term-13",
|
|
|
|
|
|
|
|
"instance_id": "inst-qf1",
|
|
|
|
|
|
|
|
"terminal_key": "QF1:13",
|
|
|
|
|
|
|
|
"symbol_terminal": "13",
|
|
|
|
|
|
|
|
"connection_point_key": "cp_13",
|
|
|
|
|
|
|
|
"terminal_direction": "bidirectional",
|
|
|
|
|
|
|
|
"terminal_type": "power",
|
|
|
|
|
|
|
|
"wire_label": "W-001",
|
|
|
|
|
|
|
|
"net_id": "net-l1"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.8 阶段 A 与现有 2D 代码的对应关系
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
当前 2D 代码里,阶段 A 所需的大部分基础其实已经存在。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.8.1 设备 3D 资源字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
已有:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `parts_3d`
|
|
|
|
|
|
|
|
- `layout_2d_diagram`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
参考:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- [deviceeditor.cpp](D:/project/MingTuCAD/qelectrotech/sources/DeviceManager/deviceeditor.cpp:1484)
|
|
|
|
|
|
|
|
- [DeviceMeta.h](D:/project/MingTuCAD/qelectrotech/sources/DeviceManager/DeviceMeta.h:32)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.8.2 端子属性字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
已有:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `tag`
|
|
|
|
|
|
|
|
- `direction`
|
|
|
|
|
|
|
|
- `type_id`
|
|
|
|
|
|
|
|
- `max_wire`
|
|
|
|
|
|
|
|
- `mnemonic`
|
|
|
|
|
|
|
|
- `usage`
|
|
|
|
|
|
|
|
- `max_sec`
|
|
|
|
|
|
|
|
- `min_sec`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
参考:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- [deviceterminaleditor.cpp](D:/project/MingTuCAD/qelectrotech/sources/InsertFunction/deviceterminaleditor.cpp:94)
|
|
|
|
|
|
|
|
- [deviceterminaleditor.cpp](D:/project/MingTuCAD/qelectrotech/sources/InsertFunction/deviceterminaleditor.cpp:214)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 24.8.3 2D/3D 绑定表
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
已有:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `project_3d_scene_instance`
|
|
|
|
|
|
|
|
- `project_3d_space_object`
|
|
|
|
|
|
|
|
- `project_2d3d_link`
|
|
|
|
|
|
|
|
- `project_2d3d_symbol_binding`
|
|
|
|
|
|
|
|
- `project_2d3d_terminal_binding`
|
|
|
|
|
|
|
|
- `start_end_terminal_matches`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
参考:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- [projectlocaldatabase.cpp](D:/project/MingTuCAD/qelectrotech/sources/dataBase/projectlocaldatabase.cpp:364)
|
|
|
|
|
|
|
|
- [projectlocaldatabase.cpp](D:/project/MingTuCAD/qelectrotech/sources/dataBase/projectlocaldatabase.cpp:411)
|
|
|
|
|
|
|
|
- [projectlocaldatabase.cpp](D:/project/MingTuCAD/qelectrotech/sources/dataBase/projectlocaldatabase.cpp:425)
|
|
|
|
|
|
|
|
- [projectlocaldatabase.cpp](D:/project/MingTuCAD/qelectrotech/sources/dataBase/projectlocaldatabase.cpp:446)
|
|
|
|
|
|
|
|
- [projectlocaldatabase.cpp](D:/project/MingTuCAD/qelectrotech/sources/dataBase/projectlocaldatabase.cpp:469)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
所以阶段 A 的重点并不是“重新设计一套完全新的数据结构”,而是:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 统一字段命名
|
|
|
|
|
|
|
|
- 统一主键规则
|
|
|
|
|
|
|
|
- 明确哪些现有字段可以直接沿用
|
|
|
|
|
|
|
|
- 明确哪些字段需要补充或规范化
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.9 阶段 A 的文档交付清单
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
建议阶段 A 至少完成下面这些文档性交付物:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 《字段对照表》
|
|
|
|
|
|
|
|
2. 《主键与唯一性约定》
|
|
|
|
|
|
|
|
3. 《2D/3D 职责边界说明》
|
|
|
|
|
|
|
|
4. 《设备级绑定样例》
|
|
|
|
|
|
|
|
5. 《端子级绑定样例》
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只有这几样都齐了,后面的代码实现才不容易边写边改字段语义。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.10 阶段 A 的验收标准
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
阶段 A 完成的判断标准建议定成下面这些:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 团队内部能明确回答:
|
|
|
|
|
|
|
|
- 设备靠哪个字段唯一识别
|
|
|
|
|
|
|
|
- 端子靠哪个字段唯一识别
|
|
|
|
|
|
|
|
- 哪些字段只是显示用途
|
|
|
|
|
|
|
|
2. 能给出一条设备绑定记录样例
|
|
|
|
|
|
|
|
3. 能给出一条端子绑定记录样例
|
|
|
|
|
|
|
|
4. 能明确指出每个关键字段由 2D 还是 3D 负责
|
|
|
|
|
|
|
|
5. 不需要看代码猜字段含义,单看文档就能开始阶段 B
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 25. 2D -> 3D 字段对照表
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
下面这张表的目标不是一次覆盖所有未来字段,而是先把阶段 A 真正要对齐的核心字段固定下来。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
建议使用原则:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 左侧 `2D 字段` 表示 QElectroTech 侧已有字段或推荐输出字段
|
|
|
|
|
|
|
|
- 中间 `3D 字段` 表示 FreeCAD 侧对象属性、绑定对象属性或同步结构中的字段名
|
|
|
|
|
|
|
|
- `责任方` 表示该字段的主维护方
|
|
|
|
|
|
|
|
- `备注` 用于说明是否直接映射、是否仅显示、是否后续回写
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.1 项目级字段对照
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2D 字段 | 3D 字段 | 责任方 | 备注 |
|
|
|
|
|
|
|
|
| --- | --- | --- | --- |
|
|
|
|
|
|
|
|
| `project_uuid` | `ProjectUuid` | 2D | 项目全局主键,3D 只读并保存,不自行生成 |
|
|
|
|
|
|
|
|
| `project_name` | `ProjectName` | 2D | 仅显示用途,不作为绑定主键 |
|
|
|
|
|
|
|
|
| `source_diagram_uuid` | `SourceDiagramUuid` | 2D | 2D 来源图纸主键,3D 端用于追溯来源 |
|
|
|
|
|
|
|
|
| `scene_diagram_uuid` | `SceneDiagramUuid` | 3D | 3D 场景主键,若 2D 侧已有对应字段可同步保存 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.2 设备级字段对照
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2D 字段 | 3D 字段 | 责任方 | 备注 |
|
|
|
|
|
|
|
|
| --- | --- | --- | --- |
|
|
|
|
|
|
|
|
| `element_uuid` | `ElementUuid` | 2D | 2D 设备实例主键,设备绑定首要识别字段 |
|
|
|
|
|
|
|
|
| `instance_id` | `InstanceId` | 3D | 3D 设备实例主键,建议由 3D 创建后回写 2D |
|
|
|
|
|
|
|
|
| `device_id` | `DeviceId` | 2D | 设备类型标识,可映射到元件库类型 |
|
|
|
|
|
|
|
|
| `display_tag` | `DisplayTag` | 2D | 显示名,例如 `QF1`,不可替代主键 |
|
|
|
|
|
|
|
|
| `parts_3d` / `asset_uri` | `AssetUri` | 2D | 3D 资产路径来源字段,第一版由 2D 提供 |
|
|
|
|
|
|
|
|
| `layout_2d_diagram` | `Layout2DDiagram` | 2D | 2D 布局来源标识,3D 仅保存引用 |
|
|
|
|
|
|
|
|
| `host_object_id` | `HostObjectId` | 3D | 设备在 3D 中挂载到哪个宿主对象,例如导轨或安装板 |
|
|
|
|
|
|
|
|
| `host_object_type` | `HostObjectType` | 3D | 宿主对象类型,例如 `Rail`、`Panel`、`Cabinet` |
|
|
|
|
|
|
|
|
| `pos_x / pos_y / pos_z`(若 2D 侧后续引入) | `Placement.Base` | 3D | 第一版建议位姿由 3D 主导,2D 可只保存回写结果 |
|
|
|
|
|
|
|
|
| `rot_x / rot_y / rot_z`(若 2D 侧后续引入) | `Placement.Rotation` | 3D | 同上,作为 3D 位姿结果回写,不建议 2D 首发控制 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.3 端子级字段对照
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2D 字段 | 3D 字段 | 责任方 | 备注 |
|
|
|
|
|
|
|
|
| --- | --- | --- | --- |
|
|
|
|
|
|
|
|
| `terminal_uuid` | `TerminalUuid` | 2D | 2D 端子实例主键,端子绑定核心标识 |
|
|
|
|
|
|
|
|
| `terminal_key` | `TerminalKey` | 2D | 业务可读键,例如 `QF1:13`,建议稳定生成 |
|
|
|
|
|
|
|
|
| `symbol_terminal` | `SymbolTerminal` | 2D | 图纸显示端子号,例如 `13`,仅显示和辅助检索 |
|
|
|
|
|
|
|
|
| `tag` | `TerminalTag` | 2D | 若 2D 端已有端子标签字段,可单独映射保留 |
|
|
|
|
|
|
|
|
| `direction` | `TerminalDirection` | 2D | 端子方向语义,3D 用于规则判断,不直接决定整体路由 |
|
|
|
|
|
|
|
|
| `type_id` | `TerminalTypeId` | 2D | 端子类型枚举主键,便于后续规则扩展 |
|
|
|
|
|
|
|
|
| `mnemonic` | `Mnemonic` | 2D | 端子助记符,偏显示和检索用途 |
|
|
|
|
|
|
|
|
| `usage` | `Usage` | 2D | 端子用途说明,例如控制、电源、保护 |
|
|
|
|
|
|
|
|
| `max_wire` | `MaxWire` | 2D | 最大接线数,后续可用于 3D 规则检查 |
|
|
|
|
|
|
|
|
| `max_sec` | `MaxSection` | 2D | 最大线径/截面积,第一版可先只保存不执行校验 |
|
|
|
|
|
|
|
|
| `min_sec` | `MinSection` | 2D | 最小线径/截面积,第一版可先只保存不执行校验 |
|
|
|
|
|
|
|
|
| `connection_point_key` | `ConnectionPointKey` | 3D | 3D 连接点键,建议由 3D 端确定后回写 2D |
|
|
|
|
|
|
|
|
| `wire_label` | `WireLabel` | 2D | 线号/导线标签,3D 只读并附着到端子或导线对象 |
|
|
|
|
|
|
|
|
| `net_id` | `NetId` | 2D | 网络主键,3D 连线对象应直接读取并保存 |
|
|
|
|
|
|
|
|
| `can_wire`(若 2D 侧后续显式输出) | `CanWire` | 2D/3D 共同遵守 | 第一版默认可由 3D 端按端子对象类型推导,也可由 2D 显式下发 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.4 3D 端子与连接点扩展字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这部分字段不一定在 2D 现有数据库里原生存在,但建议在 3D 侧先固定命名,便于后续回写和扩展。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2D 字段 | 3D 字段 | 责任方 | 备注 |
|
|
|
|
|
|
|
|
| --- | --- | --- | --- |
|
|
|
|
|
|
|
|
| - | `OwnerDevice` | 3D | FreeCAD 端子对象指向所属设备对象的链接属性 |
|
|
|
|
|
|
|
|
| - | `LcsName` | 3D | 端子几何基准的 LCS 名称,便于界面调试和对象检索 |
|
|
|
|
|
|
|
|
| - | `Status` | 3D | 3D 端子当前状态,例如 `Unbound`、`Bound`、`Connected` |
|
|
|
|
|
|
|
|
| `extra_json`(若已有或后续扩展) | `ExtraJson` | 双方约定 | 放临时扩展字段,但不建议承载主键语义 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.5 表级映射建议
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
为了让字段对照真正能落到代码里,建议阶段 A 同时固定“字段主要从哪张表来”。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2D 表/来源 | 对应 3D 对象/结构 | 责任方 | 备注 |
|
|
|
|
|
|
|
|
| --- | --- | --- | --- |
|
|
|
|
|
|
|
|
| `project_2d3d_symbol_binding` | 3D 设备实例绑定记录 | 2D 写入,3D 读取/回写部分字段 | 设备级绑定主表 |
|
|
|
|
|
|
|
|
| `project_2d3d_terminal_binding` | 3D 端子对象绑定记录 | 2D 写入,3D 回写 `connection_point_key` 等 | 端子级绑定主表 |
|
|
|
|
|
|
|
|
| `project_3d_scene_instance` | 3D 场景实例位姿记录 | 3D | 位姿与宿主落位建议由 3D 主导 |
|
|
|
|
|
|
|
|
| `device_circuit_terminals` | 3D 端子语义属性来源 | 2D | 类型、方向、线径、接线数等语义来源 |
|
|
|
|
|
|
|
|
| `parts_3d` / `layout_2d_diagram` | 3D 资产入口与布局引用 | 2D | 第一版不建议 3D 自行猜资产路径 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.6 推荐命名规则
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
为了减少后续字段漂移,建议阶段 A 先固定这些命名规则:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 数据库存储字段保持 `snake_case`
|
|
|
|
|
|
|
|
- FreeCAD 对象属性使用 `PascalCase`
|
|
|
|
|
|
|
|
- 界面显示名允许中文,但不参与绑定
|
|
|
|
|
|
|
|
- `Uuid` 后缀只用于真正全局唯一标识
|
|
|
|
|
|
|
|
- `Key` 后缀用于业务键或连接点键
|
|
|
|
|
|
|
|
- `Id` 后缀用于类型标识、实例标识或宿主标识
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
示例:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 数据库字段:`terminal_uuid`
|
|
|
|
|
|
|
|
- FreeCAD 属性:`TerminalUuid`
|
|
|
|
|
|
|
|
- 界面显示:`端子 13`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.7 第一版建议严格区分的字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
下面这些字段看起来相近,但建议在阶段 A 就明确区分,避免后面混用:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 25.7.1 `terminal_uuid` 与 `terminal_key`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `terminal_uuid`:机器主键,稳定唯一
|
|
|
|
|
|
|
|
- `terminal_key`:业务可读键,便于调试和跨界面识别
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
不建议只保留 `terminal_key`,因为显示编号或设备标签变化时它可能变化。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 25.7.2 `element_uuid` 与 `instance_id`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `element_uuid`:2D 设备实例身份
|
|
|
|
|
|
|
|
- `instance_id`:3D 设备实例身份
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这两个字段不要互相替代。第一版即使它们暂时值相同,也建议语义上保持区分。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### 25.7.3 `symbol_terminal` 与 `connection_point_key`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- `symbol_terminal`:2D 图纸上的端子显示号
|
|
|
|
|
|
|
|
- `connection_point_key`:3D 模型内部连接点键
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
一个显示端子号理论上可以映射到一个具体连接点,但两者不是同一个概念。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 25.8 字段对照表的使用方式
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这张表建议在阶段 B/C 里直接作为开发输入使用:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 2D 侧先检查哪些字段已经稳定存在
|
|
|
|
|
|
|
|
2. 对不存在但必要的字段做补充或规范化
|
|
|
|
|
|
|
|
3. 3D 侧严格按对照表创建对象属性
|
|
|
|
|
|
|
|
4. 接口层不要临时发明新名字,优先复用这里的统一命名
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
也就是说,后续代码实现时应该尽量做到:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> 看字段对照表就能知道字段从哪来、落到哪去、该由谁维护。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 24.11 阶段 A 结束后再进入代码
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
阶段 A 结束后,下一步再做代码时,建议顺序是:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. 先在 2D 侧把设备级绑定输出稳定下来
|
|
|
|
|
|
|
|
2. 再在 3D 侧按 `instance_id` 落设备实例
|
|
|
|
|
|
|
|
3. 设备级稳定后,再进入端子级绑定
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
也就是说,阶段 A 的价值就在于:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> 先把绑定语言说清楚,再开始真正的数据读写和对象创建。
|