CAD Edit Service(services/cad)
services/cad/ 是 Python FastAPI 服务,基于 ezdxf,默认端口 8200。它与 services/ifc 同构:脚本沙箱、10 步暂存、大版本快照、定位、标量改写、diff 一应俱全,另外负责发布 render.json 给前端画布。和 ifc 侧的差异是模型文件为 uploads/{id}.dxf,且没有内存实体缓存和直改时代的遗留概念。
运行与配置
bash
cd services/cad
uv sync
VIEWER_DATA_DIR="$(cd ../data && pwd)" uv run uvicorn app.main:app --port 8200| 环境变量 | 默认 | 说明 |
|---|---|---|
VIEWER_DATA_DIR | ../data | 与 server 和 edit-service 指向同一目录,必须一致 |
AIDXF_FLOWS_DIR | flows | DXF 沙箱契约层目录 |
CAD_SERVICE_PORT | 8200 | 监听端口 |
沙箱环境变量与 ifc 侧同名同义,见沙箱执行环境。
端点
模型 id 匹配 ^m_[0-9a-f]{16}$。脚本编辑面和 IFC 侧是同一套:
| 端点 | 语义 |
|---|---|
GET/PUT /models/{id}/script · script/params · script/undo|redo|discard | 脚本读取、暂存、暂存导航 |
POST /models/{id}/script/run · save · rollback | 试运行、大版本保存、回滚。成功后原子发布 render.json |
GET /models/{id}/scripts · script/diff · script/staging/diff | 版本列表与各层 diff |
GET /models/{id}/script/locate?key= | 按实体 key 定位脚本调用点,key 存在 DXF 的 XDATA 扩展数据里 |
POST /models/{id}/script/edit-call | libcst 标量改写,仅直连可用 |
GET /models/{id}/versions · POST /models/{id}/diff | 版本列表、实体级语义 diff |
GET /models/{id}/render.json | 渲染载荷。已发布时直接读文件,未发布时即时生成 |
Go server 按模型 kind 分流:dxf 模型的请求代理到 8200,对外路径不变。render.json 另外经 GET /v1/models/{id}/render.json 只读直挂,schema 见 REST API。
实现要点
- 七个领域模块来自共享包
aibim_sandbox,和 services/ifc 同一事实源,本服务只留薄适配。 app/dxf_diffing.py做实体级 diff;app/dxf_materialize.py按需重建历史版本;app/render.py把 DXF 转成 render.json,坐标保持原始 DXF 坐标系。- 契约层在
services/cad/flows/,提供脚本校验和确定性 key。
测试
bash
cd services/cad
uv run --group dev pytest