Files
OnebotCatalog/项目总览.md

300 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 欧霓博目录软件 —— 项目总览(继续开发前先读这个)
> 本文件是项目全貌的汇总。继续开发时,先让 AI 读本文件 + `README.md`(同目录)+ `文件夹说明.md` 即可接上上下文。
> 最后更新2026-08-28**NX 按需生成服务二期 A 版全链路打通**:批处理导出 0 solid 根因定位+独立翻译器正解+worker 改造+nxBin 配置化+后台 /admin 密码登录三 tab+一键启动+网页状态圆球+生成后 3D 预览选格式下载+模型管理定时/手动清理;详见 `docs\工作交接.md` + `开发记录-NX2506批处理攻坚.md` §4.6
## 1. 项目背景
- 公司:**欧霓博**(气动元件/气缸制造商)
- 目标:**自研**气动元件电子目录软件,对标 Airtac 的 CADENAS PARTdataManager 目录光盘(工作目录里的 Airtac 包即对标物),**不使用任何 CADENAS 组件**
- 核心目标一句话:**普通客户通过软件选型并下载 STEP 文件**,导入自己的 CAD 使用
## 2. 需求定稿(多次收敛后的最终范围)
| 项 | 结论 |
|---|---|
| 交付对象 | 普通客户(各类 CAD 用户),不限定 Teamcenter/NX/SolidWorks |
| 核心功能 | 浏览目录 → 参数选型(规则过滤)→ 3D 预览 → **下载 STEP** |
| 增强功能 | 搜索(型号/中文/英文/拼音)、参数范围筛选、批量下载 zip+BOM |
| 维护端 | 维护入口内置在同一个软件里(密码保护,客户不可见);内含 Builder 制作器 |
| 发布 | 维护入口/命令行一键编译发布 → **客户版单文件 exe**(数据内置、无维护入口)+ 光盘目录 + 增量更新包 |
| 平台 | Windows 10/11完全离线单机中英双语 |
| 一致性2026-08-24 定) | **桌面版功能与页面排版始终与在线版保持一致**——任何界面/功能改动两端同步做 |
| Teamcenter 集成 | 默认不做仅当客户明确需要时作为可选扩展M4 |
## 3. 里程碑状态M1/M2/M3 全部完成 ✅
- **M1 核心闭环**:目录树、参数化选型(规则 R1~R3 实时过滤、3D 预览(拖拽旋转/滚轮缩放)、尺寸图/参数表/数据表 PDF、STEP 下载、维护入口(`--admin`)、中英切换
- **M2 制作与检索**:维护入口内 Builder 5 步向导(含保存/加载配置)、全文搜索+拼音关键词、参数范围筛选、批量下载、校验器STEP 缺失/编码重复/规则冲突/附件缺失、CLI 打包模式 `--build`
- **M3 一键发布**`publish.ps1`(自测门禁 → 客户版 exe 数据内置+物理剔除维护入口 → 光盘目录+增量包)、数据包版本校验、用户/维护手册
- **自测全过**`--selftest`,结果看 `sample/selftest.log`;样例包 40 项、ONEBOT 包 25 项,新增"手册页附件可读"与"真实 B-rep 兼容"检查)
## 4. 技术栈与关键决策(含与设计文档的偏差)
本机环境:**无 .NET SDK**,有 VS 2022 Build Tools含 Roslyn csc.exe+ Windows 自带 .NET Framework 4.8/WPF。
| 设计文档原案 | 实际实现 | 原因 |
|---|---|---|
| C# / .NET 8 (WPF+MVVM) | C# / net48 **代码式 WPF无 XAML**csc 编译 | 零安装net48 内置于 Win10/11客户机免装运行时 |
| SQLite + FTS5 | **zip + catalog.json**,内存 LINQ 查询 | 避免外部依赖10 万级变体足够 |
| Helix Toolkit | WPF 内置 **Viewport3D** | 零依赖 |
| 预生成预览网格 | 运行时直接解析**自有极简 STEP**4 圆柱组合)→ 网格 | 自有格式简单;真实 CAD 通用 STEP 由 NX Journal 批量生成预生成变体 |
| — | 数据包 .opc = zipcatalog.json + step/ + docs/ | schema_version=1.0,向前兼容校验 |
**关键架构决策**(详见 `欧霓博_目录软件_M1设计文档.md` 决策 2
- **预生成变体策略**:一个型号组合一个 STEP 文件,选型=命中文件。**离散档位行程够用**;若行程连续(任意值)需"参数化二期"(运行时建模,最难部分,已预留 `geometry_source` 扩展点)
## 5. 目录结构地图(工作目录根 = Airtac 包目录)
```
airtac_0602_2026_v11sp5_world_version/ ← 工作目录根 (Airtac 原始 CD 内容: data/ + cip/ + software/)
├── OnebotCatalog_2026.08_客户版.zip ← 客户交付包示例
├── ONEBOT目录-维护版.lnk / ONEBOT目录-客户版.lnk ← 快捷方式
└── OnebotCatalog/ ← ★项目主目录 (自包含: 文档+软件+数据+工具)
│ ├── 项目总览.md ← 本文件 (继续开发的入口)
│ ├── 文件夹说明.md / README.md ← 目录用途 / 开发说明
│ ├── 欧霓博_电子目录系统_开发提示词.md + M1/M2/M3设计文档.md ← 历史文档
│ ├── src/ (App + CatalogCore + Viewer3D, 10+ 个 .cs)
│ ├── web/ (在线站前端: index.html/app.js/style.css + OneBot-logo.png)
│ ├── viewer/STEPViewer/ ← 新迪 3D 查看器【本地副本】(原项目 Z:\...\上海新迪3D\dev 只读不改;
│ │ menu=min 精简菜单/无模型树已改; 菜单精简-生产部署补丁.txt = 部署补丁)
│ ├── assets/ (OneBot-logo.png 嵌入资源 + OneBot-logo.ico exe 图标)
│ ├── tools/ (build.ps1, publish.ps1, serve-web.ps1, fix-bom.ps1, make-icon.ps1,
│ │ make-opc.ps1, extract-pdf.py, ui-diagnose.ps1, ui-diagnose2.ps1)
│ ├── bin/ (OnebotCatalog.exe 开发版, OnebotCatalog-Customer.exe 客户版, 维护入口.bat)
│ ├── sample/ (OnebotCatalog_2026.08.opc 真实目录; 2026.06 旧版已删, SC-meta.json)
│ ├── release/ (2026.08 真实三份产物: 离线包+增量包+在线站)
│ ├── docs/ (用户手册.md, 维护手册.md)
│ ├── README.md (开发说明, 必读)
│ ├── onebot-data/ ← ONEBOT 数据管线 (统一路线, 2026-08-22 并入自包含布局)
│ │ ├── catalog/ ← ★唯一数据源★ (catalog.json + series\*.meta.json + csv\ + step\ + manual\)
│ │ ├── tools/ (gen-onebot-source.ps1 源生成器, render-manual-pages.py 手册拆页, scan-manual-pages.py)
│ │ ├── 数据维护说明书.md ← 团队操作指南 (数模替换/新增系列/打包/排查)
│ │ └── (旧 build-onebot-catalog.ps1 与 out\ 旧布局残留已于 2026-08-23 删除, 防止误用)
│ └── sample-data/ ← 样例数据 + NX 工具 (2026-08-22 并入)
│ ├── onb-sc/ (SC 标准气缸 72 变体 + MAQ 迷你气缸 36 变体, step/ 108 个 STEP, params.csv)
│ └── tools/ (gen-step/gen-images/gen-pdf/gen-xlsx/verify-step/fix-bom,
│ nx-batch-export.vb NX 批量导出模板, nx-batch-export-glb.vb,
│ NX母模建模操作说明书.md)
├── airtac-benchmark/ ← 亚德客目录对标分析 (2026-08-22, 仅结构/格式, 不含对方几何)
│ ├── 亚德客目录对标分析.md ← 主报告 (.cip 容器格式/目录组织/参数格式/架构对照/可借鉴点)
│ ├── cip-tool.py (解析器) + series-tree.txt (系列树) + *-listing.txt (两容器条目清单)
│ └── out\ (解出的文本配置: dir.prj/categories.prj/系列.tab 等, 仅明文, 无几何)
```
### 真实数据 (ONEBOT, 2026-08-22 入库)
- 来源《ONEBOT - 直线气缸 - 中文.pdf》(152 页, 71MB)。提取方式:`OnebotCatalog/tools/extract-pdf.py` (PyMuPDF) + 私有区数字解码0xF6B1~0xF6BA = 0~9
- 产物:`OnebotCatalog\onebot-data\catalog\`★唯一数据源★catalog.json + series\*.meta.json + csv\ + step\ 1,309 个占位几何 STEP + manual\ 38 页)→ C# FullCatalogBuilder → `OnebotCatalog/sample/OnebotCatalog_2026.08.opc`11 系列 52,154 变体, 5.5MB)。
- 系列KC(32-320)/KCB/KSB/KCS/KS/KSU/M/MS/MSC/MAL/MALC规则按手册提取YB→缸径≤125KS/KSU 双轴型固定形式受限)。
- **2026-08-23 新增 6 个 UNIVER 系样板系列**(参照官网 universal-onebot.com 产品数据UCBM 气动夹紧缸(6 型号)/ULP 可伸缩定位销(3)/USP 勾销缸(3)/UGP 夹爪缸(2, 含规则)/UAGP 翻转缸(22)/LAE 电动气缸(3)——共 39 型号,几何为占位,参数仅"规格(±型式)"两列,**作为各分类的填数模板**(现 17 系列 52,193 变体)。
- **几何为占位**NX 母模批量导出真实 STEP 后,按相同文件名(`系列-型号缸径x行程.step`)替换 `catalog\step\` 并【重建全量目录】即可KC-00-32x10 已试点)。
## 6. 日常操作手册(浓缩)
```powershell
# 编译开发版 / 客户版
powershell -NoProfile -ExecutionPolicy Bypass -File OnebotCatalog\tools\build.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File OnebotCatalog\tools\build.ps1 -Customer -Opc sample\xxx.opc
# 自测 (结果看 OnebotCatalog\sample\selftest.log)
OnebotCatalog\bin\OnebotCatalog.exe --selftest OnebotCatalog\sample\OnebotCatalog_2026.08.opc
# CLI 打包 (与向导同一 Builder 内核; --meta 元数据模板见 sample\SC-meta.json)
OnebotCatalog\bin\OnebotCatalog.exe --build params.csv step目录 输出.opc --series SC --meta 配置.json
# CLI 全量打包 (统一路线: 源目录 → .opc; 结果看 <out 同目录>\build.log)
OnebotCatalog\bin\OnebotCatalog.exe --buildfull OnebotCatalog\onebot-data\catalog OnebotCatalog\sample\OnebotCatalog_2026.08.opc
# 刷新源数据 (占位几何+CSV+meta 重生成; NX 真实 STEP 直接替换 catalog\step\ 同名文件即可, 无需跑这个)
powershell -NoProfile -ExecutionPolicy Bypass -File OnebotCatalog\onebot-data\tools\gen-onebot-source.ps1
# 一键发布 (自测不过不允许发布; ★发布前必须先停 serve-web 和客户版 exe★)
powershell -NoProfile -ExecutionPolicy Bypass -File OnebotCatalog\tools\publish.ps1 -Opc sample\xxx.opc -Version 2026.08
# 本地网页预览 (并发服务器, 默认站点 release\web_2026.08; 关掉即停)
powershell -NoProfile -ExecutionPolicy Bypass -File OnebotCatalog\tools\serve-web.ps1
# 运行
OnebotCatalog\bin\OnebotCatalog.exe sample\xxx.opc # 客户模式
OnebotCatalog\bin\OnebotCatalog.exe sample\xxx.opc --admin # 维护入口 (密码: onebot888)
```
**维护入口在哪里(用户常问)**
- 双击 `OnebotCatalog\bin\维护入口.bat` = 开发版 + --admin + 密码框(密码 onebot888→ 顶栏出现【维护入口】按钮
- **客户版 exerelease\ 里那个)编译时已彻底移除维护入口**——这是设计需求,不是 bug客户永远看不到编辑功能
- 若需在客户版也留隐藏入口(如 Ctrl+Shift+A 弹密码框),改 MainWindow.cs 一处即可(未做)
**放数据/编辑数据流程**(核心概念:.opc 是编译产物,不可直接改;编辑 = 改源头 CSV/STEP → 重新生成):
1. 准备:参数表 CSV首列=型号编码 + 参数列 + 必须的 step_file 列)+ STEP 目录 + 可选附件
2. 首次:维护入口 → 目录制作器 → 5 步向导(导入→参数→编码→规则→附件生成)→ 【保存配置】
3. 编辑:改 CSV/STEP → 向导【加载配置】→ 重新导入 → 生成 → 校验 → publish 或替换客户 catalog.opc
4. **编辑当前数据2026-08-22 统一路线)**:唯一数据源 = `OnebotCatalog\onebot-data\catalog\`catalog.json + series\<代码>.meta.json + csv\ + step\ + manual\)。维护窗口显示当前包系列清单;目录制作器 Step1 顶部选【数据源目录】(默认已填) → 下拉选系列 → 编辑参数/规则/显示名/附件 →【保存配置】(直接写回 series\*.meta.json) → 点【重建全量目录】→ 全量 .opc 生成并可加载到主窗口。同一内核另有 CLI`--buildfull <源目录> <输出.opc>`。旧 build-onebot-catalog.ps1 已废弃(存档);源数据刷新用 `OnebotCatalog\onebot-data\tools\gen-onebot-source.ps1`(几何+CSV+meta 生成NX 真实 STEP 直接替换 catalog\step\ 同名文件)
5. **团队完整操作指南**`OnebotCatalog\onebot-data\数据维护说明书.md` —— 数模替换 / 新增产品系列CSV+meta+挂分类+STEP 全流程)/ 只改参数规则 / 常见问题排查表(含"桌面 3D 对真实 B-rep 空白"等已知边界),可直接转给维护同事
**环境陷阱(重要!)**
- PowerShell 5.1 与 csc 对**无 BOM 文件按 GBK 读取** → 编辑任何含中文的 .ps1/.cs/.vb 后必须先运行 `fix-bom.ps1`(幂等,可重复跑)再编译/运行
- winexeGUI 程序)退出码不可靠 → 自测结果以 selftest.log 文本为准("结果: X 通过, Y 失败"
- 外层 PowerShell 调用里不要用双引号包裹含 `$` 的命令(外层会先插值吞掉变量)
- **发布前必须先停 serve-web 与客户版 exe**(站点目录/编译产物被占用会失败publish 已带删除重试,但 exe 锁仍会卡编译)
- 嵌套 powershell 传数组参数会被揉成单串 → fix-bom 等带 -Files 数组的脚本用当前会话 `& (Resolve-Path ...).Path -Files @(...)` 调用;`&` 相对路径偶发"模块加载"报错,一律先 Resolve-Path 取绝对路径
## 7. NX 数据准备(母模参数化 + Journal 批量导出)
用户使用 **NX 2506**。流程(★完整操作说明书:`OnebotCatalog\sample-data\tools\NX母模建模操作说明书.md`——表达式规划/建模五步/验收表/journal CONFIG/常见问题):
1. **建参数化母模**:所有会变尺寸用表达式(`bore`/`stroke`/`rodLen=stroke+40` 公式联动),表达式名与 CSV 列名一字不差;磁石槽等"有无"特征用【按表达式抑制】magOn=0/1**固定形式/磁石/双轴都改变外形 → 母模内做特征组+按表达式抑制切换**mountIdx 0~6、twinOn 0/1草图必须全约束
2. **安装方式建议做法②**:母模只建气缸本体,安装件(法兰/脚座/中摆)独立 STEP 当选配件发;参数表 mount 列照写,多型号可共用同一 step_fileBuilder 支持)
3. **批量导出**NX 里 工具→日记→播放(**不是 Ctrl+U**Ctrl+U 只认 .dll`OnebotCatalog\sample-data\tools\nx-batch-export.vb`(已适配 NX 10~2506 的 DexBuilder API改 CONFIG 区三个路径即可)
4. 验收:母模手动改 stroke/magOn/bore 验证联动,再 2~3 档小批量试跑,最后全量
5. **GLB 轻量化批量导出(待办 9**`nx-batch-export-glb.vb` 同款骨架NX 2506 原生支持文件→导出→Extended Reality→GLBNX 2206 起有此功能);导出 API 需用【工具→日记→录制】录一次真实调用再填入 ExportGlb 函数体(模板已留接缝)
## 8. 双发布管线(离线 + 在线,一次编辑两处发布)
目标:**同一份数据,一次编辑,离线/在线同步发布,零二次编辑**。
```
CSV + STEP + 配置 meta唯一数据源
↓ Builder 打包
.opc 数据包(唯一中间产物)
↓ publish 流水线(扩展现有 publish.ps1
┌───────────┴─────────────┐
离线发布 在线发布
├─ 客户版 exe数据内置 ├─ 解包 .opc 内容
├─ 发布 zip官网下载 │ (catalog.json + step/ + docs/)
└─ 增量包 catalog.opc └─ 上传 Web 服务器静态目录
网页选型应用(读同一份 catalog.json
```
**一致性三保障**:① 格式同源——网页消费的 catalog.json 与离线包内部完全同一份;② 校验同源——两端用同一 PackageValidator③ 版本同源——catalogVersion 统一,在线即时更新,离线客户走增量包;后续给客户版 exe 加"检查更新"(启动时读服务器 version.json 对比版本号提示升级),离线客户永不落后。
**网页版技术要点**:纯静态托管(云服务器/OSS/CDN即可一期做目录树+参数选型+尺寸图+下载(无 3D二期 3D 预览需构建期把 STEP 预转 **glTF**three.js 渲染);附加价值:搜索引擎收录获客、下载/选型统计、SEO。
**在线 MVP 已实现2026-08-22持续增强**
- `OnebotCatalog/web/` — 前端三件套index.html / app.js / style.css零依赖纯静态规则引擎与离线版 C# 同语义;支持目录树/选型/尺寸图/参数表+范围筛选/搜索/双语/STEP 下载URL 加 `?selftest=1` 页面底部显示断言结果
- **网页版增强2026-08-22**:目录树/参数面板**拖拽调宽**split1/split2 分隔条STEP 下载**点击即时反馈 + 3 秒防连点**;尺寸图窗口显示**系列手册页**kind=manual3D iframe 带 `&menu=min` 精简菜单;品牌 ONEBOTapp.js 版本号 `?v=4`
- publish.ps1 第 5 步:解包 .opc + 复制前端 → `release/web_<版本>/`**整目录上传到网站根目录即上线**(站点目录删除带重试)
- `OnebotCatalog/tools/serve-web.ps1` — 零依赖本地预览服务器localhost:8080**Runspace 池 16 并发**,大文件不阻塞下载,含防目录穿越 + /viewer/ 双根目录)
## 9. 待办清单(按优先级,状态更新于 2026-08-22
| # | 待办 | 状态 | 依赖 |
|---|---|---|---|
| 1 | **真实数据接入**:真实系列参数表 + NX 母模导出 STEP → 套用 Builder 流程 | 🔄 目录数据已入库;**KC-00-32x10 真实数模已试点接入**(网页渲染/下载验证通过),待批量导出其余 1,308 个 | 用户 NX 母模批量导出 |
| 2 | **离线交付完善**:代码签名证书 + 官网 zip 下载流程 | ⏳ 未开始 | 证书需用户购买 |
| 3 | **虚拟机验收**:纯净 Win10/11 断网跑客户版 + CAD 核对 STEP | ⏳ 未开始 | 可随时做 |
| 4 | **在线 MVP**:网页选型(目录树+参数+尺寸图+下载,无 3Dpublish.ps1 增加"解包上传"输出分支 | ✅ 完成2026-08-22 | 待上传部署 |
| 5 | **检查更新**:客户版 exe 启动时读服务器 version.json 提示升级 | ⏳ 未开始 | 在线 MVP 之后 |
| 6 | **在线 3D 预览** | ✅ 完成 | 新迪 STEPViewer iframe 联动 + Canvas 回退 |
| 7 | **参数化****一期选型数据参数化**2026-08-25 上线,进展 23+ **二期 NX 按需生成服务**(服务器现算 STEPCADENAS 模式A 版:轻量自建队列 + run_journal 常驻 worker单个+批量、输出留存不删、检索先行、多格式 STEP/Parasolid/IGES/STL | ✅ 一期上线;**二期 A 版全链路打通2026-08-28**:批处理导出 0 solid 根因定位 + 独立翻译器正解 + worker 改造 + 后台 /admin 密码登录三 tab + 一键启动 + 网页状态圆球 + 生成后 3D 预览选格式下载 + 模型管理定时/手动清理Parasolid/STL 已砍(只留 step/iges/prt| **真母模**(建模工程师,唯一卡进度)+ NX 2512 实测 + 云部署 |
| 8 | **M4 可选扩展**Teamcenter 集成 | ⏳ 未开始 | 仅客户明确需要 |
| 9 | **网页/桌面 3D 轻量化(预转换)**NX 把 STEP 离线批量转轻量网格,预览读网格(快/稳STEP 照旧下载 | ✅ **桌面窗口内部分完成2026-08-23**:开源 Helix Toolkit (MIT) 直渲 STL 网格NX journal 同步导出 STL进展 17网页端轻量化glTF待做`nx-batch-export-glb.vb` 模板已写 | 网页轻量化随 NX 母模批量导出一起做 |
| 10 | **网站集成/云部署**目录网页版融入公司网站onebot251231_n2PB6React+Supabase或腾讯云+宝塔部署;已出三方案(静态模块/网站后台/维护服务),等用户命令 | 📋 方案已分析待命令 | 需备案域名 + 服务器预算确认 |
共 9 项待办,**完成 4/61 试点中**,剩 2/3/5/7/8/9。核心软件M1-M3已完成。
**2026-08-22 全天进展记录(按序)**
1. 占位 STEP 全量重建OCCT 拓扑+颜色)→ 自测 25/25 → 2026.08 三份产物发布2026.06 旧产物已全删,脚本默认参数统一指向 2026.08
2. **统一路线重构**:源目录 `OnebotCatalog\onebot-data\catalog\` = 唯一数据源C# FullCatalogBuilder维护窗口【重建全量目录】/ CLI --buildfull向导编辑源目录 meta JSON含 Display 显示名列);旧打包脚本废弃
3. 尺寸图窗口**手册页对照**38 页 2MBkind=manual
4. 新迪查看器 **menu=min 精简菜单 + 隐藏模型树**(本地副本;生产补丁文件备好)
5. 窗口拖拽:桌面版三分区 GridSplitter + 全部窗口可调/最小尺寸;网页版目录树/参数面板分隔条
6. **真实数模试点**KC-00-32x10 真实 NX STEP 接入全链路,无头浏览器验证渲染成功(自测兼容真实 B-rep
7. STEP 下载反馈+防连点serve-web 并发化Runspace 池publish 删除重试
8. 品牌统一 ONEBOT
9. 注意release 站点 app.js 里 `VIEWER_BASE` 目前是本地 `/viewer/` 前缀,**上传生产前需改成 `/STEPViewer/index.html`**§12
**2026-08-23 进展记录(续)**
10. **平替对照功能**:数据源 `catalog\crossref.csv`brand,foreign_model,our_model,note构建自动校验我方型号存在桌面【平替对照】标签页+搜索直达SearchEngine 挂 AltCodes竞品型号精确命中 900 分)、网页同款标签页;佳尔灵英文目录自动提取工具 `onebot-data\tools\jelpc-crossref.py`(系列对照 SI↔KC/SIB↔KCB/SQ↔KCS/SC↔KS/SU↔KSU/SCT↔KSB/MAL/MALC 同名;完整订购码需逐系列解析订购码页)
11. **.stp 后缀兼容**:构建内核 ResolveStepFile优先 .step找不到同名 .stpNX 导出的 .stp 直接放无需改名(已实测)
12. 桌面 3D 真实数模**自动弹浏览器预览**(本机微型服务器,静默失败降级);网页手册页标题只显序号、未选型不显示占位图
13. 修复向导前导零 bug踩坑 #18KC meta 数据还原,自测恢复 25/25
14. **产品种类扩充(空壳)**catalog.json 新增 6 个分类——气动夹紧缸 CLM / 气动可伸缩定位销 PIN / 气动勾销缸 HOK / 气动夹爪缸 GRP / 气动翻转缸 ROT / 电动气缸 ELEC中英名**参照官网 universal-onebot.com 与网站源码** `06_update_execution_categories.sql` + `translate-categories.sql`series 暂为空,系列数据待 CSV+meta 按维护说明书场景 4 补充)→ 重建 25/25 自测 → 三份产物已发布
15. **6 个分类各建样板系列**型号取自网站产品数据几何占位、参数极简作为填数模板UCBM/ULP/USP/UGP/UAGP/LAE39 型号,占位 STEP 按型号命名——将来 NX 真实数模**同名替换**即可CSV 都不用改)→ 17 系列 52,193 变体 → 自测 31/31 → 三份产物已发布
16. **新系列 .stp 原生约定**(按用户 NX 导出习惯6 个新系列的 step_file 列与占位文件统一为 `.stp`——NX 导出的 .stp 拷进 `catalog\step\` 同名覆盖即可,无后缀差异;老 11 个系列仍为 .step 列(.stp 自动兼容,但同前缀时 .step 优先,换 .stp 需先删 .step 占位)
17. **开源窗口内 3DHelix Toolkit, MIT**:桌面 3D 标签页接入 HelixViewport3D——选型后找 `<数据包目录>\mesh\<step同名>.stl`,有网格就**窗口内直渲**不再弹浏览器无网格回退浏览器方案管线NX journal 同步导出 STL 到 `catalog\mesh\`exportStl 开关,公差 0.5mm)→ publish 同步到 sample\mesh\ + 发布目录 mesh\`gen-mesh-preview.py` 生成占位网格40 个已就位lib\ 放 HelixToolkit.Wpf.dll(2.27.3, net462)+HelixToolkit.dllbuild/publish 自动附带(客户版 +580KB
18. **STEP→STL 开源转换链路**(手头真实 STEP 不必等 NX`step-to-stl.py`cadquery/OCPLGPL1.5mm 公差,**二进制 STL**)批量把 `catalog\step\` 真实数模转 `catalog\mesh\``simplify-stl.py`(纯 numpy 顶点聚类 0.75mm)把 >2MB 网格压小——UCBM32 装配体 22MB→2.1MB、USP63 4.8MB→0.5MB已转真实网格UCBM32/USP63/KC-00-32x10
19. **方案 B 落地:窗口内嵌 WebView2 3D2026-08-24**lib\ 引入 Microsoft.Web.WebView2 三件套1.0.4129.50, net462MainWindow 3D 标签页四级优先级——**STL 网格(Helix) > WebView2 内嵌新迪查看器(真实 STEP 直显) > 外部浏览器回退 > 占位自绘**WebView2 初始化失败静默降级Win11 自带运行时, Win10 装 Edge 即有);真实数模不再弹浏览器窗口;发布目录附带三件套 DLL开发提示词文档`开发提示词-窗口内3D-WebView2方案B.md`
20. **桌面/网页一致性 + 布局合并2026-08-24用户新规矩桌面版功能与排版始终与在线版一致**:两端 3D 与尺寸图合并为同一页(左 3D | 可拖拽分隔条 | 右 尺寸图+手册页网页无头实测分隔条拖拽生效37 个占位网格已删,保留 3 个真实网格UCBM32/USP63/KC-00-32x10作无 WebView2 环境降级;新 6 系列手册占位manual\<系列>\p01.png + meta 附件,`gen-manual-placeholders.py` 纯标准库生成,真实手册到货同名覆盖)
21. **PDF 下载 + 精确视图定稿2026-08-24**:① 17 个系列手册页打包成 PDF`manual-pages-to-pdf.py`,纯标准库 PNG 解码+手写 PDF挂 datasheet 附件——网页【下载 PDF】按钮直接下载、桌面数据表标签新增【下载数据表 (PDF)】SaveFileDialog与 STEP 下载一致;② **真实数模直接进 WebView2 精确视图**(用户定稿,不做网格快显+按钮);显示链:占位→自绘 / 真实→WebView2 直显 / 无运行时→Helix 网格降级 / 都无→浏览器回退;③ 桌面参数表**双击行→参数带入选型**(与网页一致);④ 新迪查看器防闪烁补丁body 首帧前应用 embed/menu-min 类,生产部署补丁文件已更新);⑤ crossref.csv 用户行 S0032-50 修正为 KCS0032-50
22. **购物车批量导出2026-08-24淘宝式两端一致**:三处入口(参数面板【加入清单】/参数表行尾"+"与勾选批量加入/顶栏【清单 (N)】角标)→ 清单面板(桌面非模态窗口/网页右侧抽屉;数量可改仅体现于 BOMzip 每型号一份)→ **一键打包** zip全部 STEP+BOM.csv UTF-8 BOM+清单.txt重名加系列码后缀桌面 ZipArchive 零新依赖,网页 JSZip 3.10.1 (MIT, web\libs\) 前端内存打包纯静态;购物车生命周期=浏览器刷新/软件重启才清空,切系列/标签页/搜索/平替均不动购物车;原"参数表批量导出所选"改造为批量加入清单;无头 E2E 验证:两系列各加一件 → 角标 (2) 抽屉 2 条 0 报错;开发提示词:`开发提示词-批量导出购物车.md`
23. **参数化选型引擎一期2026-08-25两端一致KC 试点)**meta.json 扩展 `mode=parametric` + `modelCodeTemplate`(语法 `{field[:padN]}`+ range 参数域min/max/step/gridValuesCSV 降级为"标准档位网格",非标组合由引擎实时生成编码(无 STEP**对拍门禁**构建期强制KC 全部 2,628 编码模板重生成 100% 一致);**双端一致性** = 一份规则 JSON + C#/JS 各一解释器 + 同一份测试向量 `catalog\parametric-vectors.json`(随 .opc 发布,桌面 selftest 36/36 含向量 7/7 + 网页无头 e2e-parametric.js 16/16非标档位行为标题徽标 + 下载按钮置灰(统一文案)+ 3D 展示最近标准档位(按域距离,平局取小)+ 购物车条目标注"非标档位(打包时无 STEP"、zip 打包跳过并注明range 参数 UI = 桌面可编辑下拉(标准档位标"标准"/ 网页输入框+datalist非法输入红字提示不生效开发提示词`开发提示词-参数化选型引擎.md`、二期:`开发提示词-NX按需生成服务.md`A 版已含 单个+批量/输出留存/检索先行/多格式)
24. **NX 按需生成服务二期 A 版2026-08-25开发+本地联调完成,待 NX 实测/部署)**`bin\GenServer.exe`(独立控制台 exetools\build-genserver.ps1 单独编译,复用 CatalogCore 规则引擎做服务端二次校验——红线)+ `sample-data\tools\worker_journal.vb`run_journal 常驻轮询,母模副本绝不保存、批量单会话顺序处理、逐项 .prog 进度);**检索先行**(入队前+认领后双重检索,输出目录 `output\<系列>\<型号>\` 留存不删,全格式齐全即命中复用);**多格式** STEP(214)/Parasolid/IGES/STLDexBuilder+StlManager与 nx-batch-export.vb 同源);**单个+批量**/gen、/gen-batch、/status、/file、/files、/downloadtoken 一次性+限流+CORS+匿名模式);两端接入:网页 config.js api空=置灰过渡态)+ 桌面 catalog.json genApi购物车含非标时打包前自动批量生成型号子文件夹本地联调全过状态机/检索/批量/zip/token网页 e2e-gen.js 8/8按钮升级/立即命中/排队轮询/标准回归);**待用户**masters.json 表达式名确认、KC 母模就位、NX run_journal 实测、IGES/Parasolid 枚举名按版本核对、云部署指令
25. **NX 2506 批处理攻坚2026-08-26 凌晨,接续见 `OnebotCatalog\开发记录-NX2506批处理攻坚.md`**:本机确认 **NX 2506 已装**`C:\Program Files\Siemens\NX2506\NXBIN\run_journal.exe`);全部 API 通过反射探针实测适配probe-api1~6.vbOpenBaseDisplay批处理 OpenBase 后 Work=NULL、CloseAll 两参数、CreateExpression("Number","名=值")、UF EditExp 只改已存在、ufs.Modl.Update()、Session.DexManager 各格式独立 CreatorStepCreator/IgesCreator/ParasolidExporter/STLCreator、SaveAs 两参数、journal 无 JSON 库任务文件改行式键值GenServer 烘焙母模配置worker 编译运行全管线通过(心跳/认领/改表达式/写结果);**新增 PRT 格式**用户需求SaveAs 输出 NX 原生参数化部件)+ 格式下拉两端齐;**卡点**批处理模式翻译器导出全部空几何STEP/IGES 空文件、Parasolid "no valid export objects"、STL 不产出;已排除中文路径/只读/引用集/几何来源)——交互式导出正常;**明天方案**:用户交互式 NX 录制导出宏修正 worker 导出函数(首选),或真母模直接实测(可能直接成功);**教训**:停 worker 时按时间条件批量杀 ugraf 误杀了用户交互会话,今后停进程必须精确 PID用户新需求待做生成后先 3D 预览再选格式下载GenServer 加 /preview 端点)
## 10. 重要踩坑记录2026-08-22修复都带回归自测
| # | 坑 | 根因与修复 | 影响面 |
|---|---|---|---|
| 1 | **选型选项一选就被清空**"已选 0/5无法选择" | `AllowedOptions` 跳过了"已选参数"的键UI 刷新拿空列表把刚选的值删掉M1 就潜伏,样例期未暴露) | 桌面+网页 |
| 2 | **选完型号后参数锁死** | 修复#1 后,已选参数的可选值被"自己的当前值"锁死 → 改为"除自身外的其他已选"约束计算可改值 | 桌面+网页 |
| 3 | **网页磁石/固定形式点不了** | 空字符串 ""(无磁石/基本型)是合法枚举值,`<option value="">` 与"未选择"混淆 → 用 `__EMPTY__` 哨兵值 | 仅网页 |
| 4 | 本地预览服务器卡死 | `while ($reader.ReadLine() -ne '')` 遇客户端断连(返回 null死循环 → EOF 判空退出 + 读写超时 + no-cache 响应头 | serve-web |
| 5 | PS 5.1/csc 按 GBK 读无 BOM 文件 → 中文乱码甚至吞掉语法符号 | 编辑任何含中文 .ps1/.cs/.vb 后**必须**跑 `fix-bom.ps1`(幂等)再编译 | 所有脚本 |
| 6 | PDF 手册数字提取为私有区字符 | 内嵌字体把 0~9 映射到 0xF6B1~0xF6BA用 PyMuPDF 提取后按码点解码ISO15552/-20~80°C 交叉验证) | extract-pdf.py |
| 7 | winexe 退出码不可靠 / robocopy 退出码 1=成功 | 自测结果以 selftest.log 文本为准robocopy 0-7 均成功;**GUI 子系统 exeOnebotCatalog.exe`&` 启动后 PowerShell 不等待**$LASTEXITCODE 空),构建可能在后台跑——必须 `Start-Process -Wait` 并核对 build.log/.opc 时间戳再发布否则会把旧包发布出去2026-08-23 踩过) | 脚本 |
| 8 | 客户版 exe 被运行中实例锁文件 | 编译前 `Stop-Process -Name OnebotCatalog` | 构建 |
| 9 | JavaScriptSerializer 默认 2M 字符上限 | 大目录 catalog.json 超限 → `MaxJsonLength = int.MaxValue` | 客户端 |
| 10 | 手写极简 STEP 在 occt-import-js 0.0.23 (新迪查看器) 崩溃 "RuntimeError: null function" | 试过拓扑升级(顶点上圆周+闭圆边+接缝边)/注入 STYLED_ITEM 颜色/颜色实体顺序重排, 该库对极简 B-rep 仍不稳定; **真实 CAD 导出的 STEP 全部正常** → 网页 iframe 联动 + 8 秒 Canvas 回退并存, 真实 NX STEP 替换占位后自动用新迪渲染 | 网页 3D 占位期 |
| 11 | serve-web 把 URL 查询串 `?file=` 当文件路径 → GetFullPath 抛异常 → 空响应 | 解析路径前先剥离 `?` 之后的部分 | serve-web |
| 12 | 单线程服务器扛不住浏览器并行/预连接 (ERR_EMPTY_RESPONSE) | 读超时降到 2s 快速失败 + 监听循环异常不退出 + no-cache | serve-web |
| 13 | 发布时站点目录删不掉 (句柄未释放竞态); STEP 下载点击无反馈被连点重复下载 | publish.ps1 站点目录删除加重试(6 次×2s); serve-web 改 **Runspace 池并发** (16 并发, 大文件不再阻塞下载); app.js 下载点击即时状态提示 + 3 秒防重复 | publish/serve-web/网页 |
| 14 | 用户把真实 STEP 放错目录/扩展名 (out\step\*.stp 旧目录) 导致网页看不到 | 统一路线后数据源只有 `OnebotCatalog\onebot-data\catalog\step\` 且文件名须与 CSV step_file 列一致 (.step); 真实 NX STEP 已接入验证 (自测兼容真实 B-rep: 网页走新迪渲染, Canvas 仅占位用) | 数据管线 |
| 15 | 网页数据"变回旧版" | serve-web.ps1/publish.ps1 默认参数残留 2026.06 版本号, 重启服务器时没带 -Root 就服务了旧站点 → 默认参数统一指向当前版本 + 旧版产物全删 + 发布产物只保留最新 | 脚本/运维 |
| 18 | 向导保存把枚举码 00/02/03 数值化成 0/2/3 (KC 系列 2 项自测挂掉) + 保存清空系列搜索关键词 | ToNumOrStr 前导零保持字符串; SaveConfig 覆盖时保留原关键词; 由"type 初始可选值非空/完整选型后可改"两项自测守卫 | 向导/数据 |
| 19 | 软件运行中点【重建全量目录】报"全量打包异常: .opc 正由另一进程使用" | OpcPackage.Open 用 ZipFile.OpenRead 持有文件句柄到退出 → 改为整包读入内存(FileShare.ReadWrite)后立即释放, 5.7MB 小包无压力; 实测软件开着包同时重建成功; 注意重建后内存中的包是旧的, 需重新加载数据包 | 数据管线/核心 |
| 20 | 新放的真实数模 (UCBM32.stp 6.3MB) 网页 3D 加载失败 | iframe `file=` 原为查看器目录内相对路径 → 查看器从自己 `STEPViewer\step\` 取文件, 该目录未随数据更新 → 404。改为**站点根绝对路径 `/step/xxx`**: 模型直接取站点 step\ (发布时从 .opc 解包), 查看器无需模型副本, 也不再需要双份同步; 无头验证 6.3MB 真实数模渲染成功 | 网页 3D |
| 21 | 桌面软件 UI 连发 OutOfMemoryException (crash.log, WPF DUCE 渲染通道) | 系统内存压力 (NX+浏览器+软件同开, 31.5GB 机器空闲仅 3.7GB) + WPF 软件渲染回退导致; 非代码 bug。缓解: 网格简化阈值 5MB→2MB (USP63 4.8MB→0.5MB); 新版 WebView2 路径把真实数模渲染移出 WPF (Edge GPU 进程); 全局异常日志 crash.log 是程序自带功能, 发布前删除残留 | 桌面 3D/环境 |
| 16 | 文件夹改名被占用删不掉 | 用户把 Excel 报价单放在软件文件夹里且正被 Excel 打开 (~$ 锁文件), 根目录被锁 → 用 robocopy /E /MOVE 把全部内容搬到新名目录 (文件级移动不受根目录锁影响), 遗留空壳等 Excel 关闭后手动删; **教训: 业务文件别放软件目录** | 运维 |
| 17 | 离线桌面版看不了真实数模 3D | 桌面内置解析器只支持占位圆柱几何, 真实 NX B-rep 空白 → 检测到真实数模时 3D 标签显示【在浏览器中打开 3D 预览】按钮: 程序内嵌 LocalViewerServer (127.0.0.1 随机端口 TcpListener, 零权限) + 系统浏览器 + 本地新迪副本; 客户版发布目录附带查看器组件 (~8MB, 剔除 samples/uploads/step)。**2026-08-23 升级**: 开源 Helix Toolkit (MIT) 窗口内直渲 STL 网格 (进展 17), 有网格时不再弹浏览器; 浏览器+新迪查看器降级为无网格时的回退 | 桌面版 3D |
| 22 | **参数化联动清空选项**2026-08-25两端同源 | ① AllowedOptions 原按"网格行存在性"过滤候选值——选 stroke=87 这类自由值后网格无此行 → 其他参数选项瞬间清空。改为按**域+规则**判合法ValidatePartial + RuleViolatedPartial: Then 参数未选不判违背,否则选 mount=YB 会清空未选参数选项);② 网页 domainValid 把空串一律判非法,但枚举空值(磁石="")是合法值——只对 range 拦截空串。修复后桌面 36/36、网页 E2E 16/16 + 购物车回归全过 | 参数化联动 |
| 23 | **GenServer 三连坑**2026-08-25 | ① JavaScriptSerializer **泛型** Deserialize\<Dictionary\> 路径下 JSON 数组是 **ArrayList** 而非 object[]DeserializeObject 路径才是 object[]selftest 向量没踩到——gen-batch 解析失败;② job 完成后 .done 结果里没有 token下载校验查不到 → **.tok 侧车文件**独立存 token24h 过期),且 /files 必须先读 .done 再消费 token顺序反了会 404③ 输出留存导致联调测试跨轮次残留 → 测试脚本开头加夹具清理(生产留存在是特性、测试环境是干扰) | GenServer |
| 24 | **NX 2506 批处理连环坑**2026-08-26全部实测+探针定位) | ① run_journal 只接受一个参数 → 配置走"当前工作目录\worker-config.txt + worker-no.txt";② 批处理 OpenBase 打开后 Work=NULL → **OpenBaseDisplay**;③ Program Files 复制的模板带只读属性 → NX 只读打开拒绝保存syslog 里 "Read only part modified"),母模/worker 副本都要清只读;④ 表达式 API 全变CreateExpression("Number","名=值")、EditExp 只改已存在;⑤ journal 编译环境无 System.Web.Script.Serialization 也无泛型隐式导入 → 任务文件/配置全部改行式键值格式 + 显式 Imports System.Collections.Generic⑥ 导出器从 Part.DexManager 挪到 Session.DexManager 且各格式独立 Creator**未解**:批处理翻译器导出空几何(进展 25 | NX 2506 / worker |
**UI 回归诊断手段**`tools/ui-diagnose.ps1`(逐系列检查下拉数据源)、`tools/ui-diagnose2.ps1`模拟点击选型全链路STA 模式——UI 问题先跑这两个再猜。
## 11. ONEBOT 真实数据管线2026-08-22 入库)
**数据源**《ONEBOT - 直线气缸 - 中文.pdf》152 页/71MB品牌 **ONEBOT**)。
**提取与构建统一路线2026-08-22 重构后)**
```
手册 PDF ──extract-pdf.py(PyMuPDF+数字解码)──→ 每页文本
↓ 人工/模型整理
OnebotCatalog\onebot-data\tools\gen-onebot-source.ps1系列定义+规则+占位几何+CSV → 源目录)
↓ 源目录 = 唯一数据源
OnebotCatalog\onebot-data\catalog\ (catalog.json + series\*.meta.json + csv\ + step\ + manual\)
↓ 打包 = C# 统一内核 (维护窗口【重建全量目录】/ CLI --buildfull)
OnebotCatalog\sample\OnebotCatalog_2026.08.opc (17 系列, 52,193 变体, 5.6MB, 手册页 2MB)
↓ publish.ps1 → 客户 exe / 光盘目录 / 增量包 / 网页站
```
- NX 真实 STEP 直接替换 `catalog\step\` 同名文件后【重建全量目录】即可,全链路自动更新
- 系列KC(32~320)/KCB/KSB(双行程)/KCS/KS/KSU/M/MS/MSC/MAL/MALC规则按手册提取YB→缸径≤125KS/KSU 双轴型固定形式受限)
- 行程取标准档 10/20/30/50/75/100"可调行程 25~1000mm"属**参数化二期**
- **几何占位**NX 母模批量导出真实 STEP 后按同名(`系列-型号缸径x行程.step`)替换 **`catalog\step\`** 再【重建全量目录】即可,全链路(桌面/网页/发布)自动更新;**KC-00-32x10 真实数模已试点接入验证通过**
- 型号编码按订购码表拼接(如 KC0032-100MLB与 ERP 真实编码有出入时改 CSV 的 model_code 列
- **手册页对照2026-08-22**:尺寸图窗口新增系列级手册页(附件 kind=manual`OnebotCatalog\onebot-data\tools\render-manual-pages.py` 从手册 PDF 按系列拆页渲染灰度 PNG110dpi38 页 2MB映射表在脚本 SERIES_PAGES 里KC 全缸径合并 p2-6+p11-12KS/KSU 共享双轴页 p14-15`catalog\manual\<系列>\pXX.png` → gen-onebot-source.ps1 在 meta JSON 里写附件引用 → 全量构建时打包进 .opc。桌面/网页均"选中系列即显示",滚动对照;改映射/DPI 后重跑渲染脚本+重建即可
## 12. 新迪 3D 查看器联动(网页 3D 升级)
**两个项目的关系(重要)**:新迪 2D/3D 查看器是**独立项目**,原代码在 `Z:\web\FTP_ObjectStorage\上海新迪3D\dev`(生产部署于 3d.ruiguo.wangFTP 双向同步)。**原项目代码只读、不许改动**;集成使用**本地副本** `OnebotCatalog\viewer\STEPViewer\`
**嵌入协议**(见其 开发文档.md + embed_demo.html
```
<iframe src="STEPViewer/index.html?file=/step/<站点根绝对路径>&embed=1&bg=grey">
```
**集成方式**
- **file 参数用站点根绝对路径 `/step/xxx`2026-08-23 改,踩坑 #20**:模型直接从站点 step\ 目录取,查看器目录无需自带模型副本(不再维护 STEPViewer\step\ 双份拷贝);本地/生产同规则——发布时 .opc 解包出的站点 step\ 即查看器数据源
- 网页 app.js`VIEWER_BASE` 配置——本地联调 `/viewer/STEPViewer/index.html`serve-web.ps1 `-ViewerRoot` 双根目录同端口避免跨域),生产同域改为 `/STEPViewer/index.html`
- **8 秒回退机制**:查看器 404/离线时自动退回内置 Canvas 渲染(保留的零依赖方案)
- **精简菜单 + 无模型树2026-08-22**iframe 带 `&menu=min` → 只保留 剖切/线框/透明/视角/测量模型树面板隐藏、3D 视口占满 iframe本地副本 app.js/style.css 已改;生产 Z 盘原版未动,补丁见 `OnebotCatalog\viewer\菜单精简-生产部署补丁.txt`,部署时自行应用;**无头浏览器已验证**:真实 STEP 渲染成功零报错、菜单恰 5 项、模型树隐藏)
- 本地服务命令:`serve-web.ps1 -Root release\web_2026.08 -ViewerRoot OnebotCatalog\viewer`
- 无头验证脚本:`%TEMP%\nds3dtest\check_real_model.js`playwright-core + Edge仿照它验证新模型渲染
## 13. 新对话接续方式
开始新对话时直接说:**"读一下 项目总览.md 和 OnebotCatalog\开发记录-NX2506批处理攻坚.md我们继续开发欧霓博目录软件二期"**AI 即可恢复全部上下文(本文件 = 范围/架构/进度/踩坑;开发记录 = 二期 NX 攻坚的最新卡点与明天方案README + OnebotCatalog\文件夹说明.md 为补充)。