NX二次开发(C#)-装配-获取装配体中所有组件的名称
Posted GimiGimmy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NX二次开发(C#)-装配-获取装配体中所有组件的名称相关的知识,希望对你有一定的参考价值。
前言
在UG NX中的装配体中,每个组件有两个名称:自身组件名称和装配导航器的显示名称。本文的代码完整读取装配体中所有组件的名称。
1、装配体中组件的名称
1.1 组件自身的名称
组件自身的名称,是指其在属性中的名称。如下图所示。
在代码中用
componentName = newComponent.Name;
1.2 浏览器的显示名称
装配体导航浏览器中的显示名称(其与添加时的part名称相同,不可更改)运用代码:
componentName = newComponent.DisplayName;
2 采用外部模式读取组件的名称
2.1 建立一个nxopen(C#)的工程
选择外部模式的exe
2.2 添加代码
//本应用程序用于获取装配体浏览器的名称和个数
//装配体浏览器的名称是Component.DisplayName
//装配体组件的属性名称是Component.Name
using System;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using NXOpen;
using NXOpen.BlockStyler;
using NXOpen.UF;
using NXOpen.Utilities;
using NXOpen.Assemblies;
public class ComponentName
{
public string name { set; get; }
public int nameNum { set; get; }
};
public class GetComponentsApplication
{
// class members
private static Session theSession;
private static UFSession theUFSession;
private static UFPart uFPart;
private static UFAssem uFAssem;
private static Part workPart;
private static UFObj uFObj;
public static List<ComponentName> componentNameList = new List<ComponentName>();
public static GetComponentsApplication theProgram;
public static bool isDisposeCalled;
//------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
public GetComponentsApplication()
{
try
{
theSession = Session.GetSession();
theUFSession = UFSession.GetUFSession();
uFAssem = theUFSession.Assem;
uFPart = theUFSession.Part;
workPart = theSession.Parts.Work;
uFObj = theUFSession.Obj;
isDisposeCalled = false;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
// UI.GetUI().NXMessageBox.Show("Message", NXMessageBox.DialogType.Error, ex.Message);
}
}
//------------------------------------------------------------------------------
// Explicit Activation
// This entry point is used to activate the application explicitly
//------------------------------------------------------------------------------
public static int Main(string[] args)
{
int retValue = 0;
try
{
theProgram = new GetComponentsApplication();
//TODO: Add your application code here
Console.WriteLine("============组件名称和个数程序开始执行==========");
#region 创建并清空链表
componentNameList.Clear();
#endregion
#region 读取装配体的绝对路径
string partPath = args[0];
string nameType = args[2];
#endregion
#region 根据绝对路径,打开prt文件
Tag part;
UFPart.LoadStatus error_status;
uFPart.Open(partPath, out part, out error_status);
workPart = theSession.Parts.Work;
#endregion
Console.WriteLine("============文件已经打开 完成20%==========");
#region 遍历装配体
Tag componentTag = Tag.Null;
uFObj.CycleObjsInPart(uFAssem.AskWorkPart(), 63, ref componentTag); //根据类型遍历装配体中的组件,按次序读取,一次读取一个
while (componentTag != Tag.Null) //以读取的组件为空为结束条件
{
NXObjectManager nXObjectManager = new NXObjectManager();
TaggedObject taggedObject = nXObjectManager.GetTaggedObject(componentTag); //将tag转化为TaggedObject对象
Component newComponent = (Component)taggedObject; //将taggedObject转化为Component对象
string componentName = "";
if (nameType == "1")
{
componentName = newComponent.DisplayName;
}
else if(nameType=="2")
{
componentName = newComponent.Name;
}
bool isexsit = false;
if(componentNameList.Count==0)
{
ComponentName componentName0 = new ComponentName();
componentName0.name = componentName;
componentName0.nameNum = 1;
componentNameList.Add(componentName0);
}
else
{
componentNameList.ForEach(CN =>
{
if (CN.name == componentName)
{
CN.nameNum++;
isexsit = true;
}
else
{
}
});
if(isexsit==false)
{
ComponentName componentName0 = new ComponentName();
componentName0.name = componentName;
componentName0.nameNum = 1;
componentNameList.Add(componentName0);
}
}
uFObj.CycleObjsInPart(uFAssem.AskWorkPart(), 63, ref componentTag); //读取下一个组件
}
Console.WriteLine("============组件遍历已完成 完成60%==========");
#endregion
#region 把装配体中组件的名称输出到文件中
//string newFile = @"d:\\ComponentNameFile.txt";
string newFile = args[1];
FileStream fileStream = File.Create(newFile);
string text;
text = "组件名称 数量\\n";
int i;
componentNameList.ForEach(CN =>
{
text = text + CN.name + " " + CN.nameNum + "\\n";
});
byte[] bytes = new UTF8Encoding(true).GetBytes(text);
fileStream.Write(bytes, 0, bytes.Length);
fileStream.Close();
#endregion
Console.WriteLine("============文件已经输出 完成100%==========");
#region 关闭装配体文件
uFPart.CloseAll();
#endregion
theProgram.Dispose();
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
}
return retValue;
}
//------------------------------------------------------------------------------
// Following method disposes all the class members
//------------------------------------------------------------------------------
public void Dispose()
{
try
{
if (isDisposeCalled == false)
{
//TODO: Add your application code here
}
isDisposeCalled = true;
}
catch (NXOpen.NXException ex)
{
// ---- Enter your exception handling code here -----
}
}
public static int GetUnloadOption(string arg)
{
//Unloads the image explicitly, via an unload dialog
//return System.Convert.ToInt32(Session.LibraryUnloadOption.Explicitly);
//Unloads the image immediately after execution within NX
return System.Convert.ToInt32(Session.LibraryUnloadOption.Immediately);
//Unloads the image when the NX session terminates
// return System.Convert.ToInt32(Session.LibraryUnloadOption.AtTermination);
}
}
3 调用exe
3.1 编写批处理文件
在生成的文件中,新建一个批处理文件,后缀名为.bat
填写如下批处理命令:
~dp0GetComponentsApplication.exe *.prt 1 *.txt
保存文件
3.2 执行批处理文件
读取装配体中的组件名称。
以上是关于NX二次开发(C#)-装配-获取装配体中所有组件的名称的主要内容,如果未能解决你的问题,请参考以下文章