首次提交: OnebotCatalog 项目代码与文档(含 NX 按需生成服务二期、后台、一键启动)

This commit is contained in:
wangruiguo
2026-09-03 17:55:45 +08:00
commit fafa86d3a6
241 changed files with 78656 additions and 0 deletions

View File

@@ -0,0 +1,131 @@
# 开发记录NX 2506 批处理攻坚2026-08-26 凌晨,接续用)
> 本文件是 2026-08-25/26 二期 NX 按需生成服务开发的全量记录与**接续入口**。
> 新对话先说:**"读一下 项目总览.md 和 OnebotCatalog\开发记录-NX2506批处理攻坚.md继续开发欧霓博目录软件二期"**。
## 1. 项目背景速览
- 一期参数化选型引擎已上线KC 系列试点meta.json 加 `mode=parametric` + `modelCodeTemplate` + range 参数域;对拍门禁 2,628 编码;桌面 selftest 36/36、网页 e2e-parametric 16/16。
- 二期NX 按需生成服务 A 版):非标组合 → 网页/桌面点【在线生成数模】→ GenServer轻量队列→ NX 2506 批处理 worker 真实生成 → 输出留存 `output\<系列>\<型号>\`(检索先行复用)→ 按格式下载(全格式 zip / STEP / Parasolid / IGES / STL / **PRT**用户新增需求NX 原生参数化部件))。
- 用户新需求2026-08-26 凌晨追加,**尚未实现 UI**):生成后先回传 STEP 做 3D 预览,再选格式下载(目前是"生成→直接下载",需改成"生成→预览→下载"两步)。
## 2. 已完成并验证的组件(可放心接续)
| 组件 | 文件 | 状态 |
|---|---|---|
| GenServer 轻量后端 | `src\GenServer\GenServer.cs`csc 单独编译:`tools\build-genserver.ps1`,输出 `bin\GenServer.exe` | ✅ 无 NX 联调全过:/gen、/gen-batch、/status含 .prog 进度)、/file、/filestoken 一次性)、/downloadfmt 单格式)、/health、限流、CORS、匿名模式apiKey 留空)、**行式键值任务文件**journal 无 JSON 库、worker-config.txt 自动生成 |
| NX worker journal | `sample-data\tools\worker_journal.vb` | ✅ **NX 2506 编译运行通过**:常驻轮询/认领/打开母模/改表达式/更新/写结果/心跳/循环,全管线机制验证过 |
| 母模配置 | `onebot-data\masters.json`expressionMap/switchRules/exports 含 prt | ✅ |
| 本地联调配置 | `genserver-local\genserver-config.json`(绝对路径,匿名)+ 启动时自动生成 worker-config.txt | ✅ |
| 网页端 | `web\config.js`GEN_CONFIG.api+ app.jsgenApi/genSingle/批量打包联动/格式下拉含 PRT+ index.html btnGenFmt | ✅ e2e-gen 8/8、参数化 16/16、购物车回归全过 |
| 桌面端 | MainWindow_genApi/GenSingle/GenBatch/格式下拉/非标按钮升级)+ Cart.csParams/异步打包) | ✅ 编译通过、selftest 36/36真实生成未在桌面实测 |
| 测试脚本 | `tools\e2e-parametric.js``tools\e2e-cart.js``tools\e2e-gen.js`playwright-core 在 `C:\Users\ruigu\AppData\Local\Temp\nds3dtest\node_modules`,脚本已带绝对路径回退) | ✅ |
## 3. NX 2506 API 适配结论(已通过反射探针逐一验证,直接可用)
NX 2506 与老版本差异巨大,以下结论全部实测:
| 主题 | 2506 正确用法(老写法会失败) |
|---|---|
| 打开部件 | **`Parts.OpenBaseDisplay(path, status)`**——批处理下 OpenBase 打开后 `Parts.Work = NULL`(最大坑) |
| 关闭部件 | `Parts.CloseAll(CloseModified.CloseModified, Nothing)`——两参数(老版三参数) |
| 建表达式 | `Expressions.CreateExpression("Number", "bore=32")`(类型, "名=值");带单位 `CreateExpressionWithUnit("Number", "bore=32", mm)``mm = UnitCollection.FindObject("MilliMeter")` |
| 改表达式 | `ufs.Modl.EditExp("bore=50")`——只改已存在的Deprecated 警告但可用);不会自动创建 |
| 更新模型 | `ufs.Modl.Update()`——Session.CreateUpdate 已不存在 |
| STEP 导出 | `Session.DexManager.CreateStepCreator()`ExportFrom(DisplayPart/ExistingPart)、ExportAs(Ap214)、OutputFile、InputFile、ColorAndLayers、Commit/Destroy |
| IGES 导出 | `Session.DexManager.CreateIgesCreator()`ExportFrom、ExportModelData、OutputFile、Commit |
| Parasolid | `Session.DexManager.CreateParasolidExporter()`ExportFrom(DisplayedPart)、ParasolidVersion(Current)、OutputFile、Commit |
| STL | `Session.DexManager.CreateStlCreator()`OutputType(Binary)、ChordalTol、AdjacencyTol、AutoNormalGen、OutputFile、Commit**无 ExportFrom/InputFile** |
| PRT 导出 | `workPart.SaveAs(path)` ✅(已验证写入) |
| 建圆柱 | `ufs.Modl.CreateCyl1(FeatureSigns.Nullsign, origin, height, diam, direction, ByRef tag)`——六参数、dim 是表达式字符串 |
| Save | `part.Save(SaveComponents.True, CloseAfterSave.False)`(两参数,返回 PartSaveStatus |
| journal 环境 | **无 System.Web.Script.Serialization**(任务文件用行式键值格式,由 GenServer 烘焙母模配置);`Imports System.Collections.Generic` 必须显式加 |
## 4. 当前卡点(唯一未打通的一环)
**NX 2506 批处理模式run_journal翻译器导出全部输出空几何**
- 交互式 NX 导出正常(用户真实导出 UCBM32.stp 等为证)
- 批处理下STEP/IGES 产出 ~2-3KB 空文件(日志 "Total number of solids input: 0"、Parasolid 抛 "Part has no valid export objects or all valid export objects are filtered out"、STL 连文件都不写
- 已排除:路径中文、只读属性、引用集(实体已加进 MODEL、几何来源UF 造的实体和导入的真 STEP 一样被拒)、模板问题
- worker 整体流程本身跑通(打开→改表达式→更新→写结果→心跳全部正常),仅导出几何这步为空
**已尝试过的路线**(都有对应诊断脚本在 `sample-data\tools\`probe-api*.vb反射探针、debug-save.vb、debug-export.vb、debug-export-all.vb、check-master.vb查特征/实体/面数/表达式、create-test-master.vbUF 造仿真气缸母模、add-expressions.vb、import-master.vbSTEP 导入构建母模——导入 WorkPart 成功但实体数=0
## 4.5 根因重新定位2026-08-27 重读全部诊断后)
**结论:不是翻译器 API 用错,而是母模本身是 0 实体废品 + 诊断脚本选了错误的导出模式。** 证据链:
1. `catalog-masters\KC\check-master.txt`**特征数=1、实体数=0** —— 当前 `KC_master.prt` 是空壳。
2. `catalog-masters\KC\KC_imported.log``Total number of solids input: 0``Total 0` —— `import-master.vb` 导入 `src.step` 时源文件就没带进实体(源 STEP `夹爪_v2.0_1.stp` 的实体是 `manifold_solid_brep` 但导入结果为 0
3. `debug-export.vb``ExportFrom=ExistingPart + InputFile=masterPath` 读磁盘**未保存**的文件(实体还在内存里没写盘),双重叠加必然空。
4. **`worker_journal.vb` 的导出函数其实是对的**`GenerateOne``OpenBaseDisplay`(批处理正确用法),`ExportStep214`/`ExportIges``ExportFrom=DisplayPart`(内存实体)、`ExportParasolid``DisplayedPart` —— 都是批处理下对内存工作部件的正确模式,**无需改翻译器 API**。
**修复 = 重建含实体的母模**worker 不改:
- 验证脚本已就位:`sample-data\tools\rebuild-verify-master.vb`UF CreateCyl1 造含实体母模 + 加入 MODEL 引用集 + Save再分别用 DisplayPart / ExistingPart 双模式导出对比,证明「有实体就能导出」)。
- 一键启动:`catalog-masters\KC\_run_rebuild.bat`(或 `sample-data\tools\run-rebuild-verify.ps1`);结果日志 `catalog-masters\KC\rebuild-verify-master.txt`,产物 `catalog-masters\KC\dbg_out\`
- 真母模就位后同名替换 `catalog-masters\KC\KC_master.prt`worker 直接可用。
## 4.6 最终结论全链路已打通2026-08-27 深夜实测)
**§4.5 的"母模 0 实体"是现象之一,但真根因更深一层**——六轮实测逐步排除后锁定:
1. 母模能造出真圆柱(`bodies=2``faces=3`、带 mm 单位、入 MODEL 引用集、save 成功)→ 排除"母模 0 实体"和"表达式单位"。
2. `Display=Work``Display.bodies=2` → 排除"批处理显示部件为空"。
3. `ExportSolidsAndSurfacesAs=Precise`(默认)、`ProcessHoldFlag=False` → 排除 flag。
4. **最硬证据**`KC_imported.log` 里 STEP→UG **导入**含 `manifold_solid_brep:1` 的真实 STEP 也是 `Total solids input: 0` → 导入也空。
**真根因NX 2506 的 ST-DEVELOPER 翻译器(第三方 STEP Tools "System Release v20")在 `run_journal` 无 GUI 批处理会话里,导入导出都判 0 solid——与几何健康与否无关是环境级限制。** 批处理内 `DexManager.CreateStepCreator/Commit` 是死路。
**正解:改用独立命令行翻译器**(不依赖 NX 会话、直接读写 .prt
- `step214ug.exe`.prt→.step双向实测 `Total solids: 2``manifold_solid_brep: 2`、7KB
- `iges.exe`.prt→.igs实测 Face=6
- `ug_convert_part.exe`=仅单位转换、`ugtopv.exe`=JT 导出,均已排除
**worker 改造**`sample-data\tools\worker_journal.vb`GenerateOne 改为 设表达式→Update→**Save 副本**→PRT SaveAs→CloseAll 释放句柄→**spawn 独立翻译器导出**nxBin 从 worker-config.txt 读 + 自动探测(`C:\Program Files\Siemens\NX*\NXBIN`,覆盖 2506/2512。Parasolid/STL 按用户要求砍掉masters.json exports 只留 step/iges/prt
**全链路实测成功**网页→GenServer→worker 消费任务 `job_3e788ae033a6`KC0032-87`.done` 显示 `OK=1 HIT=0 FILE=.stp/.igs/.prt`STEP 日志 `Total solids input: 2`(非空壳)。**两天卡点彻底解决。**
**交付前剩余**:① 真母模替换(`catalog-masters\KC\KC_master.prt` 仍是仿真圆柱占位母模,待用户交互式建模真母模同名替换);② 生成交互已改为"生成→网页内 3D 预览→选格式→下载"GenServer 加 `/preview/{series}/{code}.stp` 端点),需重编译+重启 GenServer 生效;③ NX 2512 版本待实测。
## 5. 明天接续方案(二选一,预计 10-30 分钟)
**方案 A首选**:用户在交互式 NX 录制导出宏——
1. `工具 → 日记 → 录制``文件 → 导出 → STEP214`(任选一零件)→ 停止录制,保存 journal
2. 照录制的真实调用修正 worker 的 ExportStep214/ExportIges/ExportParasolid大概率是某个未探测到的属性需要设置如 ObjectTypes/SettingsFile 等)
3. 用用户的真母模(交互式建的、特征树完整)直接跑 worker
**方案 B**:用户把真母模(或任意带 bore/stroke 表达式的真实零件)放到 `catalog-masters\KC\KC_master.prt`,直接启动 worker 实测——真母模的特征树/引用集是交互式 NX 维护的,可能直接导出成功(批处理问题可能只影响程序化创建的几何)。
**实测启动命令**(本机):
```powershell
# GenServer已在跑; 若需重启)
Start-Process "$base\bin\GenServer.exe" -ArgumentList "$base\genserver-local\genserver-config.json" -WorkingDirectory "$base\genserver-local"
# worker每席位一个; NX 空闲时跑)
Start-Process "C:\Program Files\Siemens\NX2506\NXBIN\run_journal.exe" -ArgumentList "$base\sample-data\tools\worker_journal.vb" -WorkingDirectory "$base\genserver-local"
# 触发测试
Invoke-RestMethod -Method Post -Uri "http://localhost:8899/gen" -Body '{"series":"KC","params":{"type":"00","bore":32,"stroke":87,"magnet":"","mount":""},"code":"KC0032-87"}' -ContentType "application/json"
```
**注意**:本机 worker 与用户交互式 NX 争 license 席位(批处理需独立席位);停 worker 时**不要**按时间条件批量杀 ugraf2026-08-26 凌晨误杀了用户会话,教训)。网页测试:`release\web_2026.08\config.js` 当前 api 指向 `http://localhost:8899`(正式部署默认空)。
## 6. 待办收尾清单
1. ~~格式选择(含 PRT~~
2. ~~批处理翻译器导出~~**已解决**§4.6:正解=独立命令行翻译器 step214ug.exe/iges.exe全链路实测通过Parasolid/STL 已砍)
3. ~~生成后先 3D 预览再下载~~ ✅ 已实现GenServer `/preview/{series}/{code}.stp` 端点 + 前端「生成→预览→选格式→下载」)
4. 全链路真实验证(网页点生成 → 用户 NX 打开导出文件核对)—— ⏳ 待真母模就位
5. 部署netsh urlacl 授权、网页 config.js 填生产地址、桌面端 catalog.json genApi 字段 + 重建发布 —— ⏳
6. masters.json 表达式名按真母模核对(现用 bore/stroke/magOn/mountIdx 与 nx-batch-export.vb 一致)—— ⏳ 待真母模
7. ~~参数映射网页后台编辑~~ ✅(/admin「参数配置」tab
8. ~~后台密码登录 + 模型管理(手动/定时清理)~~ ✅(/admin 三 tab
**详细交接见 `docs\工作交接.md` 与 `docs\部署清单.md`。**
## 7. 本地环境当前状态2026-08-28 更新)
- GenServer 已改为**密码登录**adminKey 默认 `onebot888`),后台 `/admin` 三 tabUG 配置 / 参数配置 / 模型管理
- `_start_all.bat` 一键启动(停旧→编译→启动 GenServer+worker→health 自检);网页底部信息栏有状态圆球(绿=就绪/橙=等worker/红=故障)
- 配置以 **D 盘**为准W 盘旧 TeamCenter 映射已废弃)
- **待真母模**`catalog-masters\KC\KC_master.prt` 目前是仿真圆柱占位母模
- 母模:`catalog-masters\KC\KC_master.prt` 目前是"STEP 导入版"(实体数=0 的废品),真母模待用户提供/重建
- 测试夹具:`C:\Users\ruigu\AppData\Local\Temp\nds3dtest\`playwright、gensrv* 测试目录)