Files
OnebotCatalog/开发提示词-窗口内3D-WebView2方案B.md

8.9 KiB
Raw Permalink Blame History

开发提示词:窗口内 3D —— WebView2 内嵌新迪查看器(方案 B

用途:把本文件交给 AI 会话执行。任务完成后按"验收标准"逐条核对,并把结果回写 OnebotCatalog\项目总览.md进展记录 + 踩坑表 + 最后更新行)。 背景必读OnebotCatalog\项目总览.md§12 新迪查看器联动、OnebotCatalog\src\App\MainWindow.cs、OnebotCatalog\src\App\LocalViewerServer.cs。

一、角色与任务

你是资深 WPF/桌面软件工程师,在既有项目 OnebotCatalogC# / .NET Framework 4.8,代码式 WPF零 XAML上实现真实 CAD 数模STEP在软件窗口内直接显示 3D不再弹出外部浏览器

二、现状(先读懂再动手)

当前桌面 3D 显示链(src\App\MainWindow.csTryUpdateSelection() / TryLegacyRender() / FallbackToBrowser() / OpenBrowser3D()

  1. 占位简化几何(自产极简 STEP→ 内置 ViewerControl 自绘渲染(窗口内)
  2. 真实数模且有 STL 网格侧车(<数据包目录>\mesh\<step同名>.stl,见 FindMeshSidecar)→ 开源 Helix Toolkit 窗口内直渲已实现2026-08-23
  3. 真实数模且无网格 → 当前弹出外部浏览器Process.Start(url) + LocalViewerServer 本机微型服务器 + 本地新迪查看器副本 viewer\STEPViewer\

本次目标:把第 3 条从"弹外部浏览器"改成"窗口内嵌 WebView2 加载同一 URL"。第 1、2 条保持不动。

三、硬性约束(违反即返工)

  1. 完全离线WebView2 加载的是本机 127.0.0.1 微型服务器的 URL无任何外网请求
  2. 目标平台 Win10/11 x64客户机免安装发布目录拷走即用
  3. 编译环境:无 .NET SDK只有 VS 2022 Build Tools 的 csc.exe + .NET Framework 4.8tools\build.ps1 已封装,新增引用只能加 DLL /reference,不能用 csproj/NuGet 还原)
  4. 编辑任何含中文的 .cs/.ps1 后必须跑 sample-data\tools\fix-bom.ps1csc 对无 BOM 文件按 GBK 读取)
  5. 客户版与开发版同一套代码(#if CUSTOMER_BUILD 区分);新功能两版都要生效
  6. 不碰 Z:\web\FTP_ObjectStorage\上海新迪3D\dev 原项目(只读红线)
  7. 不改动既有数据管线catalog\ / .opc / publish 六步),本次只动桌面 3D 显示层与发布附带

四、实施步骤(严格按序)

步骤 1引入 WebView2 控件库(需用户已批准下载)

  • 下载 NuGet 官方源包 Microsoft.Web.WebView2(最新稳定版,确认 lib\net462\ 目标;.NET 4.8 兼容 net462
  • 解出三个文件放进 OnebotCatalog\lib\
    • Microsoft.Web.WebView2.Wpf.dllWPF 控件)
    • Microsoft.Web.WebView2.Core.dll
    • WebView2Loader.dllnative 加载器,分 x86/x64anycpu 程序在 x64 系统跑 64 位,须放 x64 版本与 exe 同目录;必要时 build.ps1 里按位宽复制)
  • tools\build.ps1$refs 追加两个托管 DLL编译成功后把两个托管 DLL + WebView2Loader.dll 复制到输出目录(现有 Helix DLL 复制的同一位置照抄)
  • tools\publish.ps1:发布目录复制同样的 DLL照抄现有 Helix DLL 复制行)

步骤 2MainWindow 3D 标签页加 WebView2 控件

  • 字段:Microsoft.Web.WebView2.Wpf.WebView2 _webView2;
  • grid3d3D 标签页 Grid中创建初始 Visibility = Visibility.Collapsed;背景与 Helix 视口一致(浅灰)
  • 初始化顺序WebView2 特有坑)EnsureCoreWebView2Async() 完成前不能设置 Source、不能调用 Core 属性;构造时先 InitializeAsync()
    • CoreWebView2Environment.CreateAsync(null, userDataFolder)userDataFolder%LOCALAPPDATA%\OnebotCatalog\WebView2(离线无权限问题),环境带默认浏览器开关
    • 初始化失败WebView2 Runtime 未安装)→ 捕获异常置 _webView2Available = false → 走降级(见步骤 3
  • 窗口关闭时 Dispose() 释放(OnClosedClosed 事件)

步骤 3显示优先级重构核心逻辑

TryUpdateSelection() 中 3D 分支改为四级优先链,每级失败自动降级:

1. FindMeshSidecar 有网格          → Helix 窗口内直渲(现有 LoadHelixMesh
2. 真实 B-rep 且 WebView2 可用      → _webView2.Source = LocalViewerServer 的 URL新建不 Process.Start
3. 真实 B-rep 且 WebView2 不可用     → 现有浏览器回退面板FallbackToBrowser 保持原样)
4. 占位简化几何                     → 内置 ViewerControl 自绘(现有 TryLegacyRender 逻辑)
  • OpenBrowser3D 拆成两件事:GetPreviewUrl()PublishStep 返回 URL纯函数OpenBrowser3DProcess.Start 打开。WebView2 分支只调用前者
  • 每次切换型号WebView2 分支要隐藏 Helix 视口与回退面板、显示 _webView2;其他分支反过来
  • 状态栏文案:窗口内显示时提示"已在窗口内显示真实数模 3DWebView2",与英文对照 _lang.T(zh, en)

步骤 4WebView2 可用性检测与降级

  • Runtime 检测(二选一,双保险):① EnsureCoreWebView2Async 抛异常即不可用;② 启动时查注册表 HKLM\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5} 的 pv 值存在
  • 不可用 → 3D 分支走第 3 级(浏览器回退面板),体验与现在一致;状态栏提示"未检测到 WebView2 运行时使用浏览器预览Win11 自带Win10 装 Edge 即有)"

步骤 5发布与交付

  • publish.ps1 发布目录附带 WebView2 三件套 DLL步骤 1
  • 发布目录 README_zh.txt 增加一行Win10 若提示缺少 WebView2 运行时,安装 Edge 或微软 WebView2 Evergreen 运行时即可(可选附离线安装包到发布目录 webview2\
  • 客户版与开发版行为一致

步骤 6回归验证

  • bin\OnebotCatalog.exe --selftest sample\OnebotCatalog_2026.08.opc → 31 项全过(本次不改数据,必须不变)
  • 编译开发版 + 客户版都成功;tools\publish.ps1 全流程过
  • 人工验收清单(见下节)逐条过,结果写进项目总览进展记录

五、验收标准(人工,逐条核对)

  1. 打开开发版 → 选「气动夹紧缸 UCBM → 规格 32」真实数模、无网格场景要先临时移走 sample\mesh\UCBM32.stl 验证):3D 在软件窗口内显示,无任何浏览器窗口弹出;拖拽旋转/滚轮缩放正常;剖切/线框/透明/视角/测量按钮可用menu=min 精简菜单)
  2. 移回网格后选同一型号:窗口内 Helix 渲染优先(画面切换无闪烁)
  3. 选占位型号(如 UCBM25仍是内置自绘渲染无 WebView2 介入
  4. 客户版发布目录双击运行:同 1~3 行为一致;完全断网验证(拔网线/禁网卡)可用
  5. 状态栏提示文案中英切换正确(右上角语言切换按钮)
  6. 关闭窗口进程干净退出(无残留 OnebotCatalog.exe

六、已知陷阱(本项目血泪史 + WebView2 专属)

# 陷阱 对策
1 PowerShell/csc 把无 BOM 中文文件按 GBK 读 → 乱码报错 改完必跑 fix-bom.ps1步骤见约束 4
2 GUI 子系统 exe 用 & 启动后 PowerShell 不等待,$LASTEXITCODE 空 一律 Start-Process -Wait -PassThru,核对 build.log/selftest.log 时间戳
3 WebView2 在 EnsureCoreWebView2Async 完成前设置 Source/属性 → 崩溃 全部操作放在 await 之后;初始化失败路径显式处理
4 WebView2Loader.dll 位宽不匹配 → 创建控件时 TypeInitializationException anycpu + x64 系统用 x64 loader发布时按位宽复制正确版本
5 userDataFolder 无权限Program Files 等)→ 初始化失败 用 %LOCALAPPDATA%\OnebotCatalog\WebView2
6 发布前程序/服务器占文件 → 复制失败 发布前停 serve-web 和运行中的 exe红线
7 无头自动化难验 WebView2 渲染 用人工验收清单 + 降级路径自动测试WebView2 失败必须静默降级到浏览器方案
8 新迪查看器 file 参数已改为站点根绝对路径 /step/...(踩坑 #20 LocalViewerServer 的 URL 构造保持现状,不要改回相对路径

七、交付物清单

  1. 可运行的开发版 exebin\+ 客户版 exerelease 目录)
  2. lib\ 新增 WebView2 三件套build.ps1 / publish.ps1 相应改动
  3. MainWindow.cs 改动(含注释,风格与现有代码一致)
  4. 文档回写:项目总览.md进展记录新条目 + 踩坑表新增 WebView2 相关 + §12 更新 + 最后更新行、docs\维护手册.md §7、README.md 已知简化段、数据维护说明书.md 桌面 3D 相关说明
  5. 本文件验收标准逐条核对结果

八、不做的事(范围外)

  • 不碰网页版web\ 与 release\web_2026.08
  • 不改数据管线与 .opc 格式
  • 不做 WebView2 离线运行时安装器(只附可选安装包说明)
  • 不把 WebView2 用于除 3D 标签页以外的任何界面