Files
OnebotCatalog/开发记录-NX2506批处理攻坚.md

13 KiB
Raw Blame History

开发记录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.cscsc 单独编译: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.jsonexpressionMap/switchRules/exports 含 prt
本地联调配置 genserver-local\genserver-config.json(绝对路径,匿名)+ 启动时自动生成 worker-config.txt
网页端 web\config.jsGEN_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.jstools\e2e-cart.jstools\e2e-gen.jsplaywright-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.logTotal number of solids input: 0Total 0 —— import-master.vb 导入 src.step 时源文件就没带进实体(源 STEP 夹爪_v2.0_1.stp 的实体是 manifold_solid_brep 但导入结果为 0
  3. debug-export.vbExportFrom=ExistingPart + InputFile=masterPath 读磁盘未保存的文件(实体还在内存里没写盘),双重叠加必然空。
  4. worker_journal.vb 的导出函数其实是对的GenerateOneOpenBaseDisplay(批处理正确用法),ExportStep214/ExportIgesExportFrom=DisplayPart(内存实体)、ExportParasolidDisplayedPart —— 都是批处理下对内存工作部件的正确模式,无需改翻译器 API

修复 = 重建含实体的母模worker 不改:

  • 验证脚本已就位:sample-data\tools\rebuild-verify-master.vbUF 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.prtworker 直接可用。

4.6 最终结论全链路已打通2026-08-27 深夜实测)

§4.5 的"母模 0 实体"是现象之一,但真根因更深一层——六轮实测逐步排除后锁定:

  1. 母模能造出真圆柱(bodies=2faces=3、带 mm 单位、入 MODEL 引用集、save 成功)→ 排除"母模 0 实体"和"表达式单位"。
  2. Display=WorkDisplay.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: 2manifold_solid_brep: 2、7KB
  • iges.exe.prt→.igs实测 Face=6
  • ug_convert_part.exe=仅单位转换、ugtopv.exe=JT 导出,均已排除

worker 改造sample-data\tools\worker_journal.vbGenerateOne 改为 设表达式→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_3e788ae033a6KC0032-87.done 显示 OK=1 HIT=0 FILE=.stp/.igs/.prtSTEP 日志 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 维护的,可能直接导出成功(批处理问题可能只影响程序化创建的几何)。

实测启动命令(本机):

# 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\工作交接.mddocs\部署清单.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* 测试目录)