feat: 工程大样图支持上传手绘量尺登记表(逐窗转换保留分格/开启扇/手写尺寸, 纯草图模式无样板, 横版1536x1024)
This commit is contained in:
@@ -60,36 +60,39 @@ async def preview_prompt(body: AiRenderBody, user: CurrentUser, db: DbSession):
|
||||
|
||||
|
||||
def build_blueprint_prompt(drawing: str | dict) -> str:
|
||||
"""工程大样图提示词:2D 图纸 → 黑白 CAD 大样图风格(移植自 autocad 项目草图标准化资产,
|
||||
叠加 drawing_data 结构化特征增强分格保真)。"""
|
||||
try:
|
||||
info = describe_window(drawing)
|
||||
feat = f"窗型实际分格: {info['summary']}; 外框尺寸 {info['width_mm']}×{info['height_mm']} mm。"
|
||||
except Exception:
|
||||
feat = ""
|
||||
"""工程大样图提示词:手绘草图/量尺登记表照片或 2D 图纸 → 黑白 CAD 大样图
|
||||
(移植自 autocad 项目草图标准化资产,叠加 drawing_data 结构化特征增强分格保真)。"""
|
||||
feat = ""
|
||||
if drawing:
|
||||
try:
|
||||
info = describe_window(drawing)
|
||||
feat = f"参考窗型(若输入草图中有相似窗型可参照其分格风格): {info['summary']}; 外框尺寸 {info['width_mm']}×{info['height_mm']} mm。"
|
||||
except Exception:
|
||||
feat = ""
|
||||
return f"""Use case: style-transfer
|
||||
Asset type: 门窗工程审图参考图
|
||||
Primary request: 将输入的门窗 2D 图纸重绘为清晰、整洁的工程 CAD 大样图风格预览。
|
||||
Input images: 第一张是原始 2D 图纸(彩色渲染稿),仅作为几何与分格的几何来源。
|
||||
Primary request: 将输入的门窗手绘草图(现场量尺登记表照片)或 2D 图纸重绘为清晰、整洁的工程 CAD 大样图风格预览。
|
||||
Input images: 第一张是原始手绘草图照片或 2D 图纸,仅作为几何、分格与标注位置的几何来源。输入可能是一页包含多个窗的手绘量尺登记表——逐窗转换,保持各窗的相对布局与各自分格。
|
||||
Style/medium: 黑白二维门窗工程大样图、正投影立面、细黑线框、玻璃淡灰填充、外部尺寸线与分格尺寸标注、中文工程标注、右下角标题栏(图名/比例/日期)。
|
||||
Constraints: {feat} 严格保留原图的可辨识总体构图、窗扇/玻璃分格数量与比例、开启扇方向线与把手位置;不要增删或合并分格;不要编造缺失尺寸,标注尺寸须与原图几何一致;输出仅供人工审图与报价附件,不作为 CAD 几何或生产数据来源;无水印、无装饰性场景、无彩色。
|
||||
Constraints: {feat} 严格保留手稿中可辨识的总体构图、每个窗的窗扇/玻璃分格数量与比例、开启扇方向符号(对角三角线)位置、手写尺寸数字;不要增删或合并分格;手写字迹模糊的尺寸按可辨识程度规范誊写,不要编造缺失尺寸;输出仅供人工审图与报价附件,不作为 CAD 几何或生产数据来源;无水印、无装饰性场景、无彩色、不保留登记表表格框线。
|
||||
Avoid: 三维渲染、透视效果、写实照片、彩色渲染、虚构品牌、模糊文字。"""
|
||||
|
||||
|
||||
@router.post("/generate")
|
||||
async def generate(body: AiRenderBody, user: CurrentUser, db: DbSession):
|
||||
"""云端 AI 生图(gpt-image):quick=生成 / photo=参考图编辑 / blueprint=2D图纸转工程大样图。"""
|
||||
"""云端 AI 生图(gpt-image):quick=生成 / photo=参考图编辑 / blueprint=手绘草图或2D图纸转工程大样图。"""
|
||||
if not settings.ai_api_key:
|
||||
return fail("AI 生图服务未配置(HMC_AI_API_KEY)")
|
||||
drawing = await _resolve_drawing(db, body)
|
||||
if drawing is None:
|
||||
# blueprint 纯草图模式(上传手绘登记表, 无样板)不要求图纸数据
|
||||
if drawing is None and body.mode != "blueprint":
|
||||
return fail("未找到图纸数据")
|
||||
if body.mode == "photo" and not body.photo_b64:
|
||||
return fail("照片模式需要上传参考照片")
|
||||
if body.mode == "blueprint" and not body.sketch_b64:
|
||||
return fail("大样图模式需要 2D 图纸截图")
|
||||
return fail("大样图模式需要草图照片或 2D 图纸截图")
|
||||
try:
|
||||
info = describe_window(drawing)
|
||||
info = describe_window(drawing) if drawing else {"width_mm": 0, "height_mm": 0, "summary": ""}
|
||||
# 照片模式: 把框选洞口位置转成提示词方位描述, 引导 AI 装窗位置
|
||||
rect_hint = ""
|
||||
if body.mode == "photo" and body.rect:
|
||||
@@ -111,9 +114,10 @@ async def generate(body: AiRenderBody, user: CurrentUser, db: DbSession):
|
||||
rect_hint = ""
|
||||
if body.mode == "blueprint":
|
||||
prompt = build_blueprint_prompt(drawing)
|
||||
size = "1536x1024" # 大样图横版(量尺登记表整页比例), 对齐 autocad 项目口径
|
||||
else:
|
||||
prompt = build_prompt(drawing, body.style, body.time, body.scene, rect_hint=rect_hint)
|
||||
size = pick_size(info["width_mm"], info["height_mm"])
|
||||
size = pick_size(info["width_mm"], info["height_mm"])
|
||||
except Exception:
|
||||
return fail("图纸数据解析失败")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user