From 94f9a26cdc02156ed451cfadd024f6580cd923e2 Mon Sep 17 00:00:00 2001 From: HHY Date: Tue, 6 Oct 2026 07:18:19 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20AI=E7=94=9F=E6=88=90=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E5=A4=A7=E6=A0=B7=E5=9B=BE(=E6=95=B4=E5=90=88autocad=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=A4=A7=E6=A0=B7=E5=9B=BE=E6=8F=90=E7=A4=BA=E8=AF=8D?= =?UTF-8?q?=E8=B5=84=E4=BA=A7,=20blueprint=E6=A8=A1=E5=BC=8F2D=E5=9B=BE?= =?UTF-8?q?=E7=BA=B8=E8=BD=AC=E9=BB=91=E7=99=BDCAD=E5=A4=A7=E6=A0=B7?= =?UTF-8?q?=E5=9B=BE,=20=E4=BF=AE=E5=A4=8DloadTemplate=E4=B8=8D=E5=9B=9E?= =?UTF-8?q?=E5=86=99templateId)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG | 1 + doc/API.md | 4 +- frontend/src/components/WindoorCanvas.vue | 9 +++- frontend/src/views/AIRenderView.vue | 51 ++++++++++++++++++---- shots/bp-real.png | Bin 0 -> 907178 bytes shots/bp-result.png | Bin 0 -> 235797 bytes src/huamenchuang/api/ai_render.py | 42 +++++++++++++++--- 7 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 shots/bp-real.png create mode 100644 shots/bp-result.png diff --git a/CHANGELOG b/CHANGELOG index 8847aa9..79b044d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ # CHANGELOG +- [2026-10-06 07:17] FEAT: v2.44 AI 生成工程大样图(整合自 D:\Codeutocad 项目草图标准化能力)。后端 /api/ai-render 新增 blueprint 模式: 2D 图纸截图(sketch_b64, WindoorCanvas 新增 exportImage() 画布导出)为底图 images/edits 重绘黑白 CAD 工程大样图; 大样图提示词移植 autocad 项目风格迁移资产(正投影立面/细黑线框/玻璃淡灰填充/尺寸线/中文工程标注/标题栏+不编造尺寸/仅供审图与报价附件约束)并叠加 describe_window 窗型分格特征增强保真; /prompt 端点支持 blueprint 预览; 前端 AI 炫图页新增「工程大样图」Tab(样板选择+2D 图纸底图+一键生成+结果下载); 真实生成实测 59~68s: 样板704 → 黑白大样图(分格 F1/A1/F2 与原图一致, 开启扇对角线+把手保留, 尺寸标注 600/1200/400/1200 与几何一致, 中文引出线标注+说明+标题栏图名/规格/比例/日期); 修复 AIRenderView.loadTemplate 不回写 templateId(程序化自动选样板后 template_id=undefined 报未找到图纸数据, 手动下拉路径 v-model 自动更新故从未暴露); 回归: 冒烟 60/60+24 页巡检 0 异常 (Files: src/huamenchuang/api/ai_render.py, frontend/src/views/AIRenderView.vue, frontend/src/components/WindoorCanvas.vue, doc/API.md) - [2026-10-06 05:57] FEAT: v2.43 部位级材料选择——对应部位使用对应材料。估算器 estimate() 增加 material_overrides(部位级覆盖: profile 按 _profile_role 名称归位 frame/mullion/sash/pressline, 命中行替换名称/单价/米重; glass/hardware 整类替换)+overrides 回显; 新增 GET /api/costbook/series-materials(聚合全部系列用料按部位分组去重, 供跨系列混搭: frame 3 种/mullion 3/sash 2/pressline 6/glass 5/hardware 1); offer-price 新增 materials 参数透传; QuoteDialog 部位选材面板(外框型材/中梃型材/扇框型材/玻璃配置/五金套件 五下拉, 选项带价格与系列来源, 改选即重算 offer-price 实时刷新系列成本); 端到端实测: 样板704+系列75, 外框改选 95 系列 33框(25.88元/kg) → 系列成本 1251.10→1303.57 实时重算(手算吻合), 报价总额独立对比; 回归: 冒烟 60/60+24 页巡检 0 异常 (Files: src/huamenchuang/services/costbook_service.py, src/huamenchuang/api/quote.py, src/huamenchuang/api/costbook.py, frontend/src/components/QuoteDialog.vue, doc/API.md) - [2026-10-06 08:05] FEAT: v2.42 样板库整合材料系列选择——商家选材闭环。样板库预览对话框(编辑/非编辑态)新增「材料系列」选择器(GET /api/costbook/series: 75框扇齐平1.4/85框扇齐平1.8/95窗纱一体1.8, 来自鲁铭成本核算 Excel); 选择后算料报价携带 series_id → /api/offer-price 响应附加 series(系列名/壁厚)+series_estimate(按图纸实际宽高的系列八分区成本估算: 总成本/每平/型材/玻璃/五金/人工/margin_ladder 毛利阶梯); QuoteDialog 新增「材料系列成本参考」面板(统计卡+分区明细+建议售价50%毛利), 与报价总额并列对比辅助商家决策; 端到端实测: 样板704(1800x1600)+系列75 → 报价761.08元, 系列成本参考1251.1元/樘(每平434.41, 50%毛利建议1876.65); 回归: 冒烟 60/60+24 页巡检 0 异常 (Files: src/huamenchuang/api/quote.py, frontend/src/components/QuoteDialog.vue, frontend/src/views/TemplatesView.vue, doc/API.md) - [2026-10-05 07:52] FIX: v2.41 门窗渲染语义区分(对齐官方图纸)。对照官方参考图(windoor-images/31337/31343/31637)逐项核对门的视觉语义, 三渲染器同步: ①门把手贯穿长条(约55%扇高, 官方门统一长条贯穿中缝侧) vs 窗短把手(20%) ②门上下锁点小方块(RenderCanvas 此前缺失, 补齐; WindoorCanvas 已有) ③裙板色=型材同色系(RenderCanvas 取 shape.cm.g 暗化 62%, 解析失败退中性深灰; WindoorCanvas 图纸深灰+竖纹肌理+浅色编号; 3D 0x606369)——此前裙板米色与型材脱节; 门窗开向符号(V形虚线顶点指铰链侧)经官方图核对为同一语义无需区分; 视觉验收: 31343/31337 门(长把手+锁点+型材色裙板)与 704 窗(短把手)对比官方图一致; 回归: 24 页巡检 0 异常+冒烟 60/60 (Files: frontend/src/components/RenderCanvas.vue, frontend/src/components/WindoorCanvas.vue, frontend/src/components/WindoorThreed.vue) diff --git a/doc/API.md b/doc/API.md index 598361a..2030015 100644 --- a/doc/API.md +++ b/doc/API.md @@ -459,6 +459,8 @@ uv run uvicorn huamenchuang.main:app --reload # 启动,http://localhost:8000 ### 12.22 照片式 AI 炫图(v2.20 升级,P0-照片炫图) +> **v2.44 新增 `blueprint` 模式(工程大样图,整合自 autocad 项目草图标准化资产)**:`{mode:"blueprint", template_id|drawing_data, sketch_b64(2D 图纸截图)}` → AI 重绘为黑白 CAD 工程大样图(正投影立面/细黑线框/玻璃淡灰填充/尺寸线/中文工程标注/标题栏;严格保留分格与开启扇位置,不编造尺寸),可作报价与合同附件。提示词预览 `/api/ai-render/prompt` 同样支持 `mode:"blueprint"`。 + 对齐目标站 `renderV2` 炫图 7 分类:**渲图 / 安装合成 / 门窗擦除 / 室内装修 / 别墅 / 去围栏 / 变毛坯**。 纯前端像素合成(`components/photoCompose.ts`,无需服务端 AI): @@ -476,7 +478,7 @@ uv run uvicorn huamenchuang.main:app --reload # 启动,http://localhost:8000 | 接口名称 | 方式 | URL 路径 | 请求参数 | 说明 | |---|---|---|---|---| | 提示词预览 | POST | `/api/ai-render/prompt` | `{template_id\|drawing_data, style, time, scene}` | 返回 `{features(窗型特征), prompt(优化后完整提示词), size}` | -| **云端生成** | POST | `/api/ai-render/generate` | `{template_id\|drawing_data, mode: quick\|photo, style, time, scene, photo_b64?}` | quick→`images/generations`;photo→`images/edits`(用户照片为参考图,AI 将窗型合成进照片窗洞);返回 `{image_b64, prompt, size, features}`;耗时 30~90s(前端 timeout 200s) | +| **云端生成** | POST | `/api/ai-render/generate` | `{template_id\|drawing_data, mode: quick\|photo\|blueprint, style, time, scene, photo_b64?, sketch_b64?}` | quick→`images/generations`;photo→`images/edits`(用户照片为参考图,AI 将窗型合成进照片窗洞);**blueprint(v2.44 工程大样图,整合自 autocad 项目)→`images/edits` 以 2D 图纸截图为底图重绘黑白 CAD 大样图**(正投影/尺寸线/中文工程标注/标题栏,严格保留分格与开启扇,不编造尺寸,可作报价与合同附件);返回 `{image_b64, prompt, size, features}`;耗时 30~90s(前端 timeout 200s) | - 未配置 Key 时接口返回 code=0,前端降级本地程序化渲染("本地 4 方案"按钮) - 前端:AI 炫图页两个模式(照片合成/风格速览)主按钮均走云端生成,结果大图展示 + 提示词折叠面板可查看 + PNG 下载;照片模式参考图自动压缩 ≤1536px JPEG diff --git a/frontend/src/components/WindoorCanvas.vue b/frontend/src/components/WindoorCanvas.vue index 22dee7c..0f9c83e 100644 --- a/frontend/src/components/WindoorCanvas.vue +++ b/frontend/src/components/WindoorCanvas.vue @@ -1008,6 +1008,13 @@ function exportDrawing(): string | null { return dd ? JSON.stringify(dd) : null } +/** 画布截图(dataURL):供 AI 大样图等以 2D 图纸为底图的场景。 */ +function exportImage(): string | null { + const cv = cvRef.value + if (!cv || !cv.width) return null + try { return cv.toDataURL('image/png') } catch { return null } +} + // ---- 装饰格条设计(P0-格条设计器) ---- const DEC_COLORS = [ { label: '黑', v: '#2b2b2b' }, { label: '白', v: '#ffffff' }, { label: '灰', v: '#9aa0a6' }, @@ -1120,7 +1127,7 @@ function removeAssign() { emit('change') ElMessage.success('已清除该格指定') } -defineExpose({ exportDrawing }) +defineExpose({ exportDrawing, exportImage }) // ============ 视图控制 ============ diff --git a/frontend/src/views/AIRenderView.vue b/frontend/src/views/AIRenderView.vue index f92659d..e700269 100644 --- a/frontend/src/views/AIRenderView.vue +++ b/frontend/src/views/AIRenderView.vue @@ -6,6 +6,7 @@ 照片合成 风格速览 + 工程大样图 @@ -53,7 +54,7 @@ -