diff --git a/CHANGELOG b/CHANGELOG index bde2736..8a80179 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ # CHANGELOG +- [2026-09-20 11:15] FEAT: v0.6 分割树架构——横梃竖梃完整编辑。①逆向确认原站设计思路: polygon.polygon为基底多边形+mm.sp[]为分割树(polyId指向作用区域), 运行时重放得最终窗格(254样本验证); ②前端 replayShape 分割树重放, 网格渲染真实化(平开1矩形→4-7格); ③中梃编辑: 点击选中(高亮)/拖动移动(line.pt更新→重放,30mm钳制)/删除(移除sp→重放), 加梃指向被点窗格; ④Python侧同语义replay_shape, 报价中梃长度精确到实际作用跨度(2375/2350/1642/979mm); ⑤方案文档§3.3更新原站设计思路与编辑器完成设计 (Files: frontend/src/components/WindoorCanvas.vue, frontend/src/types/drawing.ts, src/huamenchuang/core/drawing.py, src/huamenchuang/services/quote_service.py, doc/克隆实施方案.md) - [2026-09-20 10:39] FEAT: v0.5 画布尺寸编辑+自动报价+扇样式保真修复——①参数化尺寸编辑: W/H输入框与拖拽外框右缘/下缘/右下角手柄, 全部几何按比例自动缩放(料宽不变,最小300mm), 拖拽静默/松手提交, 撤销栈; ②自动报价: 画布变化600ms防抖自动调offer-price并实时显示总价(样板库/订单详情); ③修复"样板显示为默认样式": 扇样式推断引擎三级解析(有效bd→polyId区域映射双扇对半→帧bbox按扇数竖向均分), 还原真实分格/开向(od角度/inward空心标记/门标注), 无图纸订单显示引导提示 (Files: frontend/src/components/WindoorCanvas.vue, frontend/src/types/drawing.ts, frontend/src/views/*, doc/API.md) - [2026-09-20 09:04] FEAT: v0.4 画布编辑器(拖拽布置v1)——WindoorCanvas 增加 editable 模式:+竖梃/+横梃点击玻璃区域实时分割(两次交叉点法多边形重算+mm.sp分割线同步)、撤销栈;订单详情可保存图纸(PUT orders),样板库可另存我的样板(新增 POST windoor/templates is_default=0);10接口回归全通过 (Files: frontend/src/components/WindoorCanvas.vue, frontend/src/views/*, src/huamenchuang/api/windoor.py, src/huamenchuang/schemas/windoor.py, doc/API.md) - [2026-09-20 09:35] FEAT: v0.3 报价算料+仓库库存+前端扩展——报价引擎(从drawing_data几何提取外框/中梃/扇框型材清单+玻璃鞋带面积,套价格本计价);仓库模块(材料CRUD/出入库/流水/负库存拦截/预警);前端新增仓库页与报价弹窗(样板库/订单详情可唤起);SQLite路径锚定项目根修复cwd问题;全接口回归9/9通过 (Files: src/huamenchuang/**, frontend/**, doc/API.md) diff --git a/doc/克隆实施方案.md b/doc/克隆实施方案.md index c436bda..327f6c2 100644 --- a/doc/克隆实施方案.md +++ b/doc/克隆实施方案.md @@ -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. 领域模型(依据真实响应样本归纳) diff --git a/frontend/src/components/WindoorCanvas.vue b/frontend/src/components/WindoorCanvas.vue index a23cd53..b30b2d4 100644 --- a/frontend/src/components/WindoorCanvas.vue +++ b/frontend/src/components/WindoorCanvas.vue @@ -11,6 +11,7 @@ controls-position="right" style="width:104px" @change="onSizeInput" /> +竖梃 +横梃 + 删除梃 撤销 重置视图 @@ -20,18 +21,24 @@