一句话总结:在 NX 12 制图模块里,用两个小按钮把两类高频手工活自动化——把剖视图里的尺寸批量追加 (D1)/(D2)/(L1) 后缀标号;再按一个矩形草图范围一键生成评审、修订用的连续云线。下面是视频复盘、规则设计和实现要点。


一、开篇:两类很常见、又很容易做乱的活

加工图、品检图、工序图里,尺寸后面经常要挂 (D1)、(D2)、(L1) 这类标号,用来和检验单、工艺卡、测量报告对应。手工改有三个坑:

  • 漏改、错改:图纸一多,某个尺寸忘改,后面整套编号就断。
  • 编号不连续:同一张图里 (D1)、(D3) 中间跳号,审图时很难解释。
  • 破坏关联:用游离文本去「补」后缀,尺寸和模型不再联动,改模型后图面直接漂移。

云线也是类似问题。评审圈改、断裂边界、局部放大范围、工序提示区域,手画的话线条松紧、圈口位置、比例全凭手感;遇到改版,重画一遍非常烦。

所以我把它们做成了两个小按钮:后缀标号和云线。后缀标号在公开仓库里有完整实现(705 行,下面第三节讲规则);云线是内部版功能,先看视频。

二、先看视频:两个按钮完整演示

2.1 后缀标号(29 秒)

后缀标号 · 29 秒完整演示

视频里做的事:对当前图纸剖视图上已有的尺寸,按类型归组、按空间排序,逐个追加 (D1)、(D2)、(L1) 标号,信息窗口同步输出处理日志。注意它只处理当前活动图纸——别的 sheet 上的同名标注一概不动。

2.2 矩形云线(33 秒)

矩形云线 · 33 秒完整演示

流程:在制图图纸上用草图画一个矩形圈出要标记的区域 → 点「云线」→ 工具沿矩形外轮廓生成一圈连续云线。云线是内部版实现,公开仓库暂无对应代码,这里只展示视频,实现细节留在公司版本里。

三、后缀标号:规则比按钮更重要

这类功能不能只做成「把 (d) 改成 (D)」。真正可用,要先定规则。以下是 Step7_AppendSuffix.cpp 里最终落地的版本:

规则实现
作用范围只处理当前活动图纸;其它图纸、其它视图、坐标标注一律跳过并计数
类型白名单水平、平行、正交、直径、半径 → D 组;垂直 → L 组;其余类型跳过
分组语义车床件剖视图里,水平标注测径向(直径方向 → D),垂直标注测轴向(长度方向 → L),直径本身即 D 语义
编号方式按当前图纸独立从 1 起;组内按空间位置排序,编号顺序确定
保留关联只改附加文本槽位(AppendedText.SetAfter),公差本体视为不可动区域,不新建游离文本
幂等SetAfter 是全量替换语义——重复运行同一张图,结果相同,不会出现 (D1)(D1) 叠加
可审计信息窗输出:成功/失败、其它图纸、其它视图、坐标标注、其它类型各自计数

改造示意(以视频为准):

1
2
3
4
5
6
7
8
9
改造前:
  B 37.00 -0.025/-0.030       ← 直径标注
  54.50 +0.05/0.00            ← 水平标注(径向语义)
  38.20 ±0.05                 ← 垂直标注(轴向语义)

运行「后缀标号」后:
  B 37.00 -0.025/-0.030 (D1)
  54.50 +0.05/0.00 (D2)
  38.20 ±0.05 (L1)

三个值得单独说的点:

① 编号顺序不是「谁先谁后」,是空间排序。 录制宏里手工编号有过瑕疵——D7 重复出现、D6/D7 错序。代码里按标注的空间位置排序后重新编号,天然避开这类问题。

② 直径/半径必须换 Builder。 CreateLinearDimensionBuilder 只接受线性尺寸;直径、半径标注(子类型 9/10)必须走 CreateRadialDimensionBuilder,否则直接失败。

③ 幂等是「替换」不是「追加」。 用户不可能记得上次编到 D 几,所以不做增量追加——SetAfter 直接把后缀槽位替换成新标号,重跑结果一致。

简化伪代码(完整实现见仓库 Step7_AppendSuffix.cpp,705 行):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sheet = 当前活动图纸
for dim in sheet 上的标注:
    if 归属图纸 != sheet:         otherSheet++; continue
    if 子类型 不在白名单:          otherType++;  continue
    if 是坐标标注:                ordinate++;   continue
    组  = (子类型 == 垂直) ? L : D
    按组内空间位置排序             // 确定性编号
    后缀 = "(" + 组 + 序号 + ")"   // 每组从 1 起,按图纸独立
    builder = 直径/半径 ? CreateRadialDimensionBuilder(dim)
                        : CreateLinearDimensionBuilder(dim)
    builder->AppendedText()->SetAfter({后缀})   // 全量替换 → 天然幂等
    builder->Commit()
日志: 成功 / 失败 / 其它图纸 / 其它视图 / 坐标标注 / 其它类型

四、一个 NX12 特有的坑:GetViews() 会骗你

判断「标注属于哪张图纸」是这件事的核心,而 NX12 在这里埋了个雷:

NXOpen Annotation::GetViews() 在 NX12 中对制图标注会抛内部错误 3655004(“Object is not a displayable PMI”)——这个接口实际只对 PMI 显示实例可用。上一版实现因此全部判「未知」,日志实测:

1
明确当前图纸 0 / 明确其它图纸 0 / 未知 229

两百多个标注一个都没归上类,等于功能全废。最终改走 UF 层原始 tag 通道,绕开 NXOpen 的 View 指针包装:

  1. UF_DRF_ask_associative_origin → 取关联视图原始 tag;
  2. UF_DRF_ask_associativity_data → 取标注所测几何所在图纸(归属的权威依据,与放置位置无关);
  3. NXOpen GetViews() 保留兜底。

这个坑和前一篇《我给 NX 写出图插件》里「跨图纸误收」是同一个病根:NXOpen 包装层在制图场景下会失守,归属判断要落到 UF 原始 tag 上。

五、云线:本质是按闭合轮廓生成「均匀波动曲线」

云线看起来是画花边,实质是几个约束问题:闭合、等距、不交叉、密度可控、可重复生成。

工程上值得留意的几点:

  • 闭合方向决定内外:云线应沿轮廓法向一致偏置,不能一半朝里一半朝外,否则长边中段会交叉。
  • 采样要足:只拿 4 个角点画样条会尖,按弦长细分再生成才平滑;太多又会拖慢速度、增大文件。
  • 对象归属:云线应放独立图层/颜色,区分「设计几何」和「审图标记」,导出 DXF/PDF 时也方便过滤。
  • 清理策略:重复执行时是替换旧云线还是新增,要明确;是否删源草图做成开关。

云线为内部版实现,公开仓库暂无对应代码。视频为 33 秒完整演示,供了解交互流程。

六、价值不在炫技,在把口头规范变成按钮

  • 把口头规范变成按钮:以前「后缀统一大写、同图从 1 编号、云线别压尺寸」靠检查表和责任心;现在规则进代码,检查表变成日志。
  • 减少改版返工:模型改一处,尺寸后缀不会丢;评审区域重圈,云线按同一套规则重生成,视觉风格稳定。
  • 日志能当半个测试:成功/失败、来源视图、归组、计数都能回放。现场反馈「某个尺寸没编号」,先看日志是类型不在白名单、视图归属失败,还是目标不在当前图纸,定位会快很多。

七、可以继续做的

  • 批量图纸模式:多张 sheet 统一跑,输出「图纸-编号-对象 tag」CSV,方便和检验单核对。
  • 后缀模板:支持 (D1)、ØD1、孔位 D1 等模板;但别把公差、基准、测量要求混进同一个后缀。
  • 云线样式:线型、颜色、图层、是否避开尺寸/注释、是否只包局部视图边界。
  • 发布前校验:导出 PDF/DXF 前检查还有没有小写 (d1)、是否跳号、云线是否压住公差框。
  • 权限与审计:正式项目里自动改标注要留痕,和版本管理绑定,避免「工具改图」变成「无记录改图」。

这两个视频演示的是很小的事:一个改后缀,一个画云线。但在工程图场景里,小工具的价值恰恰在于把高频、易错、又必须统一的动作收进同一个入口。比起一次性写个大而全的「制图自动化平台」,我更喜欢这种从真实痛点长出来的小功能:按钮少,日志清,效果一眼能验收。

源码仓库:tan-wen-peng/UG_Draw_NXopen_Dill(后缀标号实现见 NX12_NXOpenCPP_Wizard1/Step7_AppendSuffix/) 相关阅读:我给 NX 写出图插件:跨图纸误收、垂直标注漏判、视图拾取三个坑