13 KiB
开发记录: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、/files(token 一次性)、/download(fmt 单格式)、/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.js(genApi/genSingle/批量打包联动/格式下拉含 PRT)+ index.html btnGenFmt |
✅ e2e-gen 8/8、参数化 16/16、购物车回归全过 |
| 桌面端 | MainWindow(_genApi/GenSingle/GenBatch/格式下拉/非标按钮升级)+ Cart.cs(Params/异步打包) | ✅ 编译通过、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.vb(UF 造仿真气缸母模)、add-expressions.vb、import-master.vb(STEP 导入构建母模——导入 WorkPart 成功但实体数=0)
4.5 根因重新定位(2026-08-27 重读全部诊断后)
结论:不是翻译器 API 用错,而是母模本身是 0 实体废品 + 诊断脚本选了错误的导出模式。 证据链:
catalog-masters\KC\check-master.txt:特征数=1、实体数=0 —— 当前KC_master.prt是空壳。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)。debug-export.vb用ExportFrom=ExistingPart + InputFile=masterPath读磁盘未保存的文件(实体还在内存里没写盘),双重叠加必然空。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 实体"是现象之一,但真根因更深一层——六轮实测逐步排除后锁定:
- 母模能造出真圆柱(
bodies=2、faces=3、带 mm 单位、入 MODEL 引用集、save 成功)→ 排除"母模 0 实体"和"表达式单位"。 Display=Work且Display.bodies=2→ 排除"批处理显示部件为空"。ExportSolidsAndSurfacesAs=Precise(默认)、ProcessHoldFlag=False→ 排除 flag。- 最硬证据:
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、7KBiges.exe(.prt→.igs)实测 Face=6ug_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 录制导出宏——
工具 → 日记 → 录制→文件 → 导出 → STEP214(任选一零件)→ 停止录制,保存 journal- 照录制的真实调用修正 worker 的 ExportStep214/ExportIges/ExportParasolid(大概率是某个未探测到的属性需要设置,如 ObjectTypes/SettingsFile 等)
- 用用户的真母模(交互式建的、特征树完整)直接跑 worker
方案 B:用户把真母模(或任意带 bore/stroke 表达式的真实零件)放到 catalog-masters\KC\KC_master.prt,直接启动 worker 实测——真母模的特征树/引用集是交互式 NX 维护的,可能直接导出成功(批处理问题可能只影响程序化创建的几何)。
实测启动命令(本机):
# 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 时不要按时间条件批量杀 ugraf(2026-08-26 凌晨误杀了用户会话,教训)。网页测试:release\web_2026.08\config.js 当前 api 指向 http://localhost:8899(正式部署默认空)。
6. 待办收尾清单
格式选择(含 PRT)✅批处理翻译器导出✅ 已解决(§4.6:正解=独立命令行翻译器 step214ug.exe/iges.exe,全链路实测通过,Parasolid/STL 已砍)生成后先 3D 预览再下载✅ 已实现(GenServer/preview/{series}/{code}.stp端点 + 前端「生成→预览→选格式→下载」)- 全链路真实验证(网页点生成 → 用户 NX 打开导出文件核对)—— ⏳ 待真母模就位
- 部署:netsh urlacl 授权、网页 config.js 填生产地址、桌面端 catalog.json genApi 字段 + 重建发布 —— ⏳
- masters.json 表达式名按真母模核对(现用 bore/stroke/magOn/mountIdx 与 nx-batch-export.vb 一致)—— ⏳ 待真母模
参数映射网页后台编辑✅(/admin「参数配置」tab)后台密码登录 + 模型管理(手动/定时清理)✅(/admin 三 tab)
详细交接见 docs\工作交接.md 与 docs\部署清单.md。
7. 本地环境当前状态(2026-08-28 更新)
- GenServer 已改为密码登录(adminKey 默认
onebot888),后台/admin三 tab:UG 配置 / 参数配置 / 模型管理 _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* 测试目录)