# NX 2506 参数化母模建模操作说明书

> 目的：为欧霓博目录软件建立"一个母模覆盖全系列所有型号组合"的参数化零件，
> 配套 `nx-batch-export.vb` 批量导出 STEP。
> 读者：NX 建模工程师。**建模前先通读一遍，严格按命名规范执行。**

---

## 0. 核心概念（先想清楚再动手）

```
CSV 参数表 (数值源头)  ←── 列名必须与母模表达式名一致 ──→  NX 母模 (公式/特征)
        ↓                                                          ↓
   nx-batch-export.vb (翻译官) ── 改表达式 → 更新模型 ──→ 导出 STEP
```

- **表达式名 = CSV 列名**（一字不差，区分大小写）：`bore`、`stroke`、`magnet`、`mount`
- 开关类表达式另起名字并在 journal CONFIG 区映射：`magOn`、`mountIdx`
- 所有"会变"的尺寸必须表达式化；所有"有无"的特征必须按表达式抑制
- 建模完成后验收标准：**手动改 3 组不同参数组合，模型能正确重建且无错误**

---

## 1. 建模前规划

### 1.1 确定本系列的几何键（决定哪些组合要分别导出）

几何键 = 影响外形的一切参数组合。以 KC 系列为例：

| 参数 | 是否影响外形 | 母模处理 |
|---|---|---|
| type 型号段 (00/02/03 单杆/双轴/双轴可调) | ✅ | 双轴 = 第二根活塞杆特征组按表达式抑制 |
| bore 缸径 | ✅ | 尺寸表达式 |
| stroke 行程 | ✅ | 尺寸表达式 |
| magnet 磁石 | ✅（磁石槽+开关导轨） | 特征组按表达式抑制 (magOn=0/1) |
| mount 固定形式 | ✅（端盖耳座/支座/法兰特征） | 特征组按表达式抑制 (mountIdx=0~6) |

### 1.2 表达式命名清单（先建全，再开始画）

在母模里**先建立全部表达式**（工具→表达式 Ctrl+E），带注释：

| 名称 | 类型/初值 | 公式 | 注释 |
|---|---|---|---|
| bore | Number / 32 | 32 | 缸径 mm（基准值，journal 会覆盖） |
| stroke | Number / 50 | 50 | 行程 mm |
| rodLen | Number | stroke + 60 | 活塞杆长（联动示例，按实际结构改） |
| bodyLen | Number | stroke + 缸体常数 | 缸筒长（联动） |
| magOn | Number / 1 | 1 | 磁石开关：1=有磁石 0=无 |
| magPos | Number | stroke + 40 | 磁石中心位置（联动；若独立规格则写常数+journal 映射） |
| guideLen | Number | stroke + 30 | 开关导轨长（联动） |
| mountIdx | Number / 0 | 0 | 安装形式：0=基本 1=FA 2=FB 3=CA 4=CB 5=LB 6=YB |
| typeTwin | Number / 0 | 0 | 双轴开关：1=双轴（第二根杆特征组抑制式引用它） |

> 命名建议：全小写、驼峰（bore/stroke/magOn），与 CSV 列名一致；开关类加 On/Idx 后缀。

---

## 2. 建模步骤（KC 母模示例）

### 步骤 1：建缸体主体

1. 新建零件 → 存为 `KC_master.prt`
2. 草图：缸筒截面（**全约束**！）——外径引用 `bodyR = bore/2 + 壁厚` 等派生表达式，不要写死数
3. 拉伸长度引用 `bodyLen` 表达式

### 步骤 2：端盖与活塞杆

- 前盖/后盖草图定位引用**基准坐标系或已有表达式**（严禁引用会被抑制的特征面）
- 活塞杆：圆柱特征，直径/长度引用表达式，定位在轴心
- **双轴型号（02/03）**：把第二根活塞杆+对应孔做成**特征组**，按表达式抑制：
  ```
  右键特征 → 特征组 → 命名为 group_twin
  右键 group_twin → 抑制 → 按表达式抑制
  → 表达式列表里新建 twinOn = 1，抑制表达式写 if(twinOn==1)(1)else(0)
  ```

### 步骤 3：磁石槽（有/无 切换）

1. 在缸筒上画磁石槽：草图 → 拉伸求差（布尔 Subtract）
2. 槽位置引用 `magPos`（中心），长度引用 `guideLen`
3. 磁石槽+导轨特征全选 → 特征组 `group_magnet`
4. 按表达式抑制：`if(magOn==1)(1)else(0)`
5. 开关导轨（如有独立件外形）同样入组

> ⚠️ 若倒角/圆角引用磁石槽的边，把倒角也放进 group_magnet，否则抑制后更新报错。

### 步骤 4：安装形式特征组（7 种切换）

1. 以"基本型"端盖为底
2. 每种形式单独建模（FA 法兰、FB 后法兰、CA 单耳、CB 双耳、LB 脚架孔、YB 支座孔），每组做完立即：
   - 全选该组特征 → 特征组 `group_mount_FA` 等 6 个组
   - 按表达式抑制，条件式：`if(mountIdx==1)(1)else(0)`（FA 对应 1，依此类推）
3. 建模次序建议：先建完**基本型全部结构**，再逐个叠加形式特征，最后统一分组抑制

> 特征跨实体布尔（求和/求差）时，目标体选基本体，别选会被抑制的特征体。

### 步骤 5：验证（必须做！）

| 验证项 | 操作 | 通过标准 |
|---|---|---|
| 尺寸联动 | 改 bore=125 → Ctrl+F7 更新 | 无报错，模型整体放大 |
| 行程联动 | 改 stroke=1000 | 缸筒/活塞杆/导轨跟着变 |
| 磁石切换 | magOn=0/1 | 槽消失/出现，无悬空特征 |
| 形式切换 | mountIdx=0~6 逐个试 | 每值对应正确外形 |
| 双轴切换 | typeTwin=0/1 | 第二杆出现/消失 |
| 极限组合 | bore=320 + stroke=1000 + magOn=1 + mountIdx=6 | 极端组合不破面 |

验收后再交给 journal 跑批量。

---

## 3. Journal 配置（nx-batch-export.vb）

文件头有完整注释。**建模工程师只需改 CONFIG 区**：

```vb
' ============================ CONFIG 区 ============================
Dim csvPath As String = "D:\catalog\params.csv"   ' ← 改成 catalog\csv\KC.csv
Dim outDir As String = "D:\catalog\step_out\"     ' ← 改成 catalog\step\

' 1) 尺寸映射: NX 表达式名 → CSV 列名
exprMap.Add("bore", "bore")
exprMap.Add("stroke", "stroke")
'   有独立表达式就加: exprMap.Add("magPos", "magpos")  ← CSV 里也要有这一列

' 2) 枚举开关映射: {CSV列名, 列值, NX表达式名, 表达式值}
switchRules.Add({"magnet", "",  "magOn", "0"})    ' 无磁石
switchRules.Add({"magnet", "M", "magOn", "1"})    ' 有磁石
switchRules.Add({"mount", "",  "mountIdx", "0"})  ' 基本型
switchRules.Add({"mount", "FA", "mountIdx", "1"}) ' 前盖固定
...（按你们母模实际的表达式名和取值改）
' ================================================================
```

**运行**：NX 里 工具 → 日记 → 播放 → 选 `nx-batch-export.vb`（不是 Ctrl+U，Ctrl+U 只认 .dll）。

---

## 4. 全流程走查（建模 → 目录上线）

```
1. NX 母模验收 (步骤 5 的验证表)
2. journal CONFIG 改好 → 播放 → 挂机批量导出 (已去重, 同文件只导一次)
3. STEP 落盘 catalog\step\ → 双击 OnebotCatalog\bin\维护入口.bat
   → 目录制作器 → 【重建全量目录】
4. 自测 (发布门禁自动跑 25 项, 缺文件会拦)
5. 停预览服务器 → publish.ps1 → 三份产物
6. 网页 localhost:8080 验证 3D + 下载
```

---

## 5. 常见问题排查

| 现象 | 原因 | 处理 |
|---|---|---|
| 导出后模型没变化 | journal 里表达式名与母模对不上 | 对照 Ctrl+E 列表逐名核对 |
| 更新报"更新失败/内部错误" | 被抑制特征被其它特征引用（边/面） | 把引用它的特征也入同一个抑制组 |
| 改 mountIdx 后外形不对 | 抑制条件式写错（== 写成 =） | 条件式格式: `if(mountIdx==1)(1)else(0)` |
| 抑制后草图悬空 | 草图定位引用了会被抑制的边 | 定位改引用基准轴/面 |
| journal 报"参数表缺少列" | CSV 表头与 exprMap/switchRules 不一致 | 表头名与 CONFIG 统一 |
| 导出的 STEP 在网页渲染异常 | 用了特殊特征（钣金/焊接件） | 导出前抽空合并实体，尽量常规特征 |
| 中文乱码 | 编辑 .vb 后没跑 fix-bom.ps1 | 每次改完 journal 跑一次 fix-bom |
