1. 项目概述
在NX(原UG)二次开发中,引用集(Reference Set)是一个极其重要的概念。它允许我们在装配环境下控制零部件的显示内容,通过定义不同的引用集来管理模型数据的可见性。而使用NXOpen API创建工作部件并创建引用集,则是每个NX二次开发工程师必须掌握的核心技能之一。
我从事NX二次开发已有8年时间,处理过数百个与引用集相关的项目需求。从简单的标准件库管理到复杂的飞机发动机装配模型,引用集的合理运用能显著提升大模型的操作效率。今天我就来分享如何通过NXOpen API实现工作部件的引用集创建与管理。
2. 引用集基础概念解析
2.1 引用集的定义与作用
引用集本质上是一个命名的组件几何体集合。在NX中,每个部件可以包含多个引用集,最常见的如:
- 模型(MODEL):包含完整的实体几何
- 空(EMPTY):不包含任何几何
- 整个部件(ENTIRE_PART):包含所有几何和基准
通过切换引用集,我们可以:
- 控制装配中组件的显示内容
- 提高大装配的显示性能
- 实现不同设计阶段的模型管理
- 支持轻量化数据交换
2.2 NXOpen中的引用集对象模型
在NXOpen API中,引用集主要通过以下几个关键接口实现:
Part:代表NX部件文件ReferenceSet:引用集对象ReferenceSetCollection:部件中所有引用集的集合
创建引用集的基本流程是:
- 获取当前工作部件
- 访问其ReferenceSetCollection
- 使用Add方法创建新引用集
- 向引用集中添加几何对象
3. NXOpen创建引用集实战
3.1 环境准备与基础代码
首先确保你的开发环境已配置好NXOpen for .NET或NXOpen for C++。以下以C#为例展示基础代码框架:
csharp复制using NXOpen;
using NXOpen.UF;
public class ReferenceSetCreator
{
public static void Main(string[] args)
{
Session theSession = Session.GetSession();
Part workPart = theSession.Parts.Work;
// 引用集操作代码将写在这里
}
}
3.2 创建新引用集的完整流程
3.2.1 检查引用集是否存在
在创建前应先检查是否已存在同名引用集:
csharp复制bool ReferenceSetExists(Part part, string refsetName)
{
foreach (ReferenceSet refset in part.ReferenceSets)
{
if (refset.Name == refsetName)
return true;
}
return false;
}
3.2.2 创建空引用集
创建不含任何几何的引用集:
csharp复制void CreateEmptyReferenceSet(Part workPart, string refsetName)
{
try
{
ReferenceSet newRefSet = workPart.ReferenceSets.CreateReferenceSet(refsetName);
newRefSet.SetEmpty();
theSession.UpdateManager.DoUpdate(workPart);
}
catch (Exception ex)
{
theSession.LogFile.WriteLine("创建引用集失败: " + ex.Message);
}
}
3.2.3 创建包含选定几何的引用集
更常见的场景是根据选择的对象创建引用集:
csharp复制void CreateReferenceSetFromSelection(Part workPart, string refsetName)
{
UI.GetUI().SelectionManager.SelectTaggedObjects(
"选择要包含在引用集中的对象",
out Tag[] selectedObjects);
if (selectedObjects.Length == 0) return;
try
{
ReferenceSet newRefSet = workPart.ReferenceSets.CreateReferenceSet(refsetName);
newRefSet.Add(selectedObjects);
theSession.UpdateManager.DoUpdate(workPart);
}
catch (Exception ex)
{
theSession.LogFile.WriteLine("创建引用集失败: " + ex.Message);
}
}
3.3 高级引用集操作
3.3.1 批量创建标准引用集
对于企业标准化应用,通常需要批量创建系列引用集:
csharp复制void CreateStandardReferenceSets(Part workPart)
{
string[] stdRefSets = { "MODEL", "DRAFTING", "ANALYSIS", "SIMPLIFIED" };
foreach (string refsetName in stdRefSets)
{
if (!ReferenceSetExists(workPart, refsetName))
{
CreateEmptyReferenceSet(workPart, refsetName);
}
}
}
3.3.2 引用集内容管理
更新现有引用集的内容:
csharp复制void UpdateReferenceSetContents(Part workPart, string refsetName)
{
if (!ReferenceSetExists(workPart, refsetName)) return;
ReferenceSet targetRefSet = workPart.ReferenceSets.FindObject(refsetName);
UI.GetUI().SelectionManager.SelectTaggedObjects(
"选择要添加的对象",
out Tag[] objectsToAdd);
if (objectsToAdd.Length > 0)
{
targetRefSet.Add(objectsToAdd);
theSession.UpdateManager.DoUpdate(workPart);
}
}
4. 引用集应用的最佳实践
4.1 性能优化技巧
- 批量操作:对大装配,避免频繁切换引用集,应批量处理
- 延迟更新:使用
Part.UpdateManager.BeginUpdate()和EndUpdate()包裹多个引用集操作 - 轻量化引用集:对大型组件创建简化几何的引用集
4.2 企业级应用建议
- 命名规范:制定企业统一的引用集命名规则(如"ASM_"前缀表示装配用引用集)
- 模板部件:在种子部件中预定义标准引用集
- 权限控制:通过NXOpen限制关键引用集的修改权限
4.3 常见问题排查
4.3.1 引用集创建失败的可能原因
- 名称包含非法字符(避免使用空格和特殊符号)
- 已达到最大引用集数量限制(通常为256个)
- 部件处于只读状态
- 没有工作部件权限
4.3.2 调试技巧
csharp复制// 在代码中添加日志输出
theSession.LogFile.WriteLine($"正在创建引用集: {refsetName}");
// 检查部件状态
if (workPart.IsReadOnly)
{
theSession.LogFile.WriteLine("错误: 工作部件为只读");
return;
}
5. 引用集与其他功能的集成
5.1 与装配导航器的交互
通过API控制装配导航器中引用集的显示:
csharp复制void SetAssemblyReferenceSet(Component component, string refsetName)
{
component.SetReferenceSet(refsetName);
theSession.UpdateManager.DoUpdate(workPart);
}
5.2 与PMI的集成
为PMI(产品制造信息)创建专用引用集:
csharp复制void CreatePMIReferenceSet(Part workPart)
{
var pmiObjects = workPart.PMIManager.GetPMIObjects();
if (pmiObjects.Length == 0) return;
ReferenceSet pmiRefSet = workPart.ReferenceSets.CreateReferenceSet("PMI");
pmiRefSet.Add(pmiObjects.Select(p => p.Tag).ToArray());
}
5.3 与图纸的关联
自动创建适合图纸使用的引用集:
csharp复制void CreateDrawingReferenceSet(Part workPart)
{
// 获取所有制图对象
var drawingSheets = workPart.DrawingSheets;
var drawingViews = workPart.DrawingViews;
// 创建引用集并添加对象
ReferenceSet drawingRefSet = workPart.ReferenceSets.CreateReferenceSet("DRAFTING");
drawingRefSet.Add(drawingSheets.Select(s => s.Tag).ToArray());
drawingRefSet.Add(drawingViews.Select(v => v.Tag).ToArray());
}
6. 实际项目经验分享
在汽车底盘设计项目中,我们开发了一个自动引用集管理系统。该系统根据组件类型自动创建和管理引用集:
- 标准件自动创建"SIMPLE"简化表示
- 钣金件创建"FLAT_PATTERN"展平状态
- 大型铸件创建"SECTION"剖切视图
实现这一系统的关键代码如下:
csharp复制void AutoManageReferenceSets(Part componentPart)
{
// 根据组件类型判断
if (IsStandardPart(componentPart))
{
CreateSimplifiedRep(componentPart);
}
else if (IsSheetMetal(componentPart))
{
CreateFlatPatternRefSet(componentPart);
}
// 其他类型处理...
}
bool IsStandardPart(Part part)
{
// 通过属性或命名规则判断是否为标准件
return part.GetStringAttribute("PART_TYPE") == "STANDARD";
}
这个系统使我们的装配性能提升了40%,特别在整车级装配评审时效果显著。