feat: v0.6 分割树架构——横梃竖梃完整编辑
- 逆向确认原站设计思路: 基底多边形+mm.sp分割树(polyId指向作用区域), 运行时重放得到最终窗格(254套样本验证重放语义) - 前端 replayShape: 分割树重放还原真实网格(平开1矩形→4-7格) - 中梃编辑: 点击选中高亮/拖动移动/删除(直接操作sp源真值后重放) - 加梃升级: polyId.idx 精确指向被点窗格 - Python报价算料同语义重放: 中梃长度精确到实际作用跨度 - 方案文档§3.3: 原站设计思路+编辑器完成设计
This commit is contained in:
+22
-9
@@ -132,16 +132,29 @@ frontend/
|
||||
└── dist -> 后端静态挂载 # 构建产物挂载(符合前后端规范)
|
||||
```
|
||||
|
||||
### 3.3 拖拽布置编辑器(核心难点)复刻方案
|
||||
### 3.3 拖拽布置编辑器(核心难点)复刻方案 —— v2 已实现
|
||||
|
||||
1. **数据层**:直接采用 §2.2 解析出的模型(`drawing_data` 已有 254 个真实样本作为测试集,兼容读入即等于拥有 254 个回归用例)。
|
||||
2. **交互层**:
|
||||
- 左侧样板库面板(`search_default_windoor` 数据 + 分类树 `default_windoor_catelog`),**拖拽模板进画布即实例化一个 sm 形状**;
|
||||
- 画布上选中形状后,从边缘拖出**中梃分割线**(norm 决定水平/垂直,`alignType`/`equalSplit` 决定等分策略);
|
||||
- 分割递归产生子区域,点击区域可指定 `sashes`(开扇,含开向箭头)、`bars`(格条)、玻璃类型;
|
||||
- 边缘料宽 `ew[4]` 可视化拖拽调节;尺寸标注 `dims` 绑定边/中梃(`eidx`/`midx`)自动跟随。
|
||||
3. **渲染层**:多边形裁剪 + 玻璃填充色 `cm.g` + 开向线条;打印视图走 SVG 输出。
|
||||
4. **算料层**:遍历形状树输出型材清单(外框 4 段 + 中梃/横撑按 `sp` 长度),套用产品价格脚本(`script_bar/script_glass/script_addon`,服务端执行)。
|
||||
**原站设计思路**(逆向自 drawing_data 序列化结构,经 254 套样本验证):
|
||||
|
||||
1. **三层模型**:`Frame 形状 = 基底多边形(polygon.polygon) + 分割树(mm.sp[]) + 扇子形状(sm[])`
|
||||
2. **分割树**(关键发现):`polygon.polygon` 不是最终窗格,而是基底多边形;`mm.sp[]` 按序记录每次分割——`line{pt,norm}` 定位分割线、`polyId{idx,pos}` 指向作用区域与插入位。编辑器打开文件时**重放分割树**得到最终窗格。同一中梃可能被记录为多条共线分段(随区域生长拆分)
|
||||
3. **扇模型**:子形状 `Sash/DoubleSash`,`sashes[]` 描述子扇(`od` 开向角、`wtf` 转框、`openToward` 内开/外开),经 `polyId` 挂到窗格;`bd` 边界在序列化中常退化,运行时重算
|
||||
4. **序列化即状态**:drawing_data 直接喂给 `shapeManager.openFile()` 恢复整个画布
|
||||
|
||||
**自研实现**(`frontend/src/components/WindoorCanvas.vue`,约 700 行,Canvas2D):
|
||||
|
||||
| 能力 | 实现 |
|
||||
|---|---|
|
||||
| 真实网格渲染 | `replayShape()` 分割树重放(两次交叉点法切多边形,退化/非凸跳过),254 套样板全部还原真实分格(平开 4-7 格、推拉亮子结构、转角窗多体) |
|
||||
| 中梃绘制 | 每条 sp 按其作用区域 bbox 裁剪为分段双线;共线分段自然重叠无害 |
|
||||
| 扇样式推断 | `有效bd → polyId 映射区域(双扇对半) → 帧bbox按扇数竖向均分` 三级解析;开向三角/内开空心/门标注 |
|
||||
| 尺寸参数化 | W/H 输入框 + 拖拽外框右缘/下缘/右下角手柄;全部几何(含 sp 点位)按比例缩放,料宽不变 |
|
||||
| **加中梃** | +竖梃/+横梃 → 点击玻璃区域 → 追加 sp(polyId.idx=被点窗格)→ 重放 |
|
||||
| **改中梃** | 点击选中(蓝色高亮)→ 拖动(line.pt 更新→重放,30mm 边距钳制)→ Del/按钮删除(移除 sp→重放) |
|
||||
| 撤销/自动报价 | JSON 快照栈;变化后 600ms 防抖调 offer-price 实时显示总价 |
|
||||
| 服务端算料 | Python 侧同语义 `replay_shape`:玻璃面积=重放窗格面积和,中梃长度=作用区域投影(精确到实际跨度) |
|
||||
|
||||
数据兼容性:编辑仅增删改 sp 与几何点,不改变 drawing_data 的字段结构——保存后仍是标准 shapeManager 格式。
|
||||
|
||||
## 4. 领域模型(依据真实响应样本归纳)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user