# 实施计划 ## 0. 建立事实与测试夹具 - 追踪 `compileControlMarkings()` 的每条 stripe 属性、`native_id` 构成和从地图点击到 `onFeature` 的路径。 - 添加失败优先的测试:同组 stripe 需要稳定共享 `elementId`,不同 crossing 不得共享;空编辑输出与基线一致。 - 门禁:能证明一个具体 feature 无歧义回链到一个 junction approach 和 crossing。 ## 1. 第一阶段:元素 manifest 与选择 - 在编译器为 crosswalk stripe 写稳定的元素标识和回链属性。 - 在 direct-edit 服务响应中增量发布按 selection/element 获取的元素 manifest,不扩大现有道路 handle 的职责。 - 客户端建立 `ElementSelection` 纯状态与 feature 点击适配;点击 stripe 选择整组、空白清除。 - 验证:编译器单元测试、API 测试、客户端 selection 单元测试。 ## 2. 第一阶段:位置编辑闭环 - 用 element manifest 的 position control 渲染元素级控件和选中外框;安装时不得影响道路 handle hit-test。 - 从位置手势和表单走同一个 draft builder,写入 `junction-crosswalk-inset`。 - 验证:拖拽与表单值生成同形约束;预览/保存/重载一致;`exact` 状态和撤销/重做覆盖。 - 门禁:一次非空编辑可在正式重编译结果中观察到斑马线位置变化。失败即停止,不能只交付 UI。 ## 3. 复盘门禁 - 手测选中、取消、道路级手柄共存、拖拽钳位、表单验证、保存重载。 - 只有在第一阶段验收全部通过后,才能为尺寸/外观参数做持久化 schema 决策。 ## 4. 第二阶段:尺寸与外观 - 依据第一阶段证据设计并验证长度、宽度、条带数、间距的约束 schema。 - 编译器读取参数、返回 blocking diagnostics;元素 manifest 表达对应控件/字段。 - 实现与表单字段完全一致的尺寸控件,补齐组合参数、持久化和 rebase 测试。 ## 验证命令 ```sh npm run format:check npm run test npm run test:client npm run test:client:unit npm run build ``` ## 风险文件 - `src/compile/native-road.js`:斑马线生成与默认输出兼容性。 - `src/compile/direct-edit-solver.js` / `native-road-edits.js`:约束求解、schema 和 manifest 必须同步。 - `workbench/server.js`:element manifest 查询与 preview 不得写入磁盘。 - `workbench/client/src/components/MapCanvas.tsx`、`App.tsx`、`edit/`:选择、临时控件和表单不得污染 baseline layer。