Planning: parent design.md becomes the single authoritative contract (constraint model with 6 kinds, handle manifest, coordinate/unit layering, preview sequencing, storage layout and lazy migration, area config snapshot, API contract). Work is split into four independently verifiable child tasks with per-step gates and rollback points. Test infra: pin vitest 4.1.11, add test:client:unit for client pure logic, extend prettier globs to root *.ts so vitest.config.ts is checked. Add .gitignore: the repo had none, so inputs/, outputs/, workbench-data/ and the client build output were untracked rather than ignored. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2.1 KiB
2.1 KiB
Drawtonomy:可验证的设计证据
本笔记仅基于本机 /Users/que01/Project/drawtonomy 的公开源码与文档。该 checkout 不包含编辑器 Canvas、指针事件、选择或历史实现;不能据此断言它具体如何处理拖拽状态机。
公开事实
README.md将其描述为 topology-aware lane、snap 与 point sharing;连接会随编辑保持。packages/drawtonomy-sdk/src/types.ts定义point、linestring、lane:lane 用leftBoundaryId/rightBoundaryId引用边界,边界以pointIds引用点,next/prev表示车道关系。packages/drawtonomy-sdk/src/exporter/osmToShapes.ts从 Lanelet2 导入时复用相同的点和 linestring,对相邻道路保留共享边界与方向反转信息。packages/drawtonomy-sdk/src/exporter/laneCenterline.ts从左右边界按归一化弧长采样,导出中心线和宽度;中心线是派生数据。docs/exporter.md指出可重新编辑的 SVG 内嵌完整 snapshot,导出器只从对象图读取数据。
可迁移原则
- 拥有关系而非复制关系:共享点/边界只保存一次,依赖对象通过 ID 引用。因此一个动作自然波及所有关联几何。
- 编辑源与展示/导出分离:编辑对象图是源,中心线、边界渲染、导出格式是派生物。
- 显式拓扑:车道连接不是靠距离猜测,而是用
next/prev表示。 - 可重新打开的完整状态:持久化内容足以重新构建编辑场景,而不是一张结果图。
不应直接照搬
Drawtonomy 是从空白画布或 Lanelet2 形状开始编辑的创作工具;本项目以 OSM 为权威输入、编译器推导道路横断面和路口。若完全改为点/边界对象图,会失去现有 OSM 重导入、规则推导和可追溯性,且制造第二个不一致的地图源。
对本项目的结论
借鉴其“语义对象图 + 依赖重算 + 共享锚点”的原则,但将持久化内容定义为附着在 OSM 派生语义 ID 上的约束,而不是迁移到 Drawtonomy 的自由形状 snapshot。