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#)-装配-获取装配体中所有组件的名称的主要内容,如果未能解决你的问题,请参考以下文章

UG NX二次开发(C#)-模型处理功能

UG NX二次开发(C#)-装配-替换组件

UG NX二次开发(C#)-装配-替换组件

UG NX二次开发(C#)-装配-替换组件

UG NX二次开发(C#)-装配-删除阵列矩阵

UG NX二次开发(C#)-装配-添加组件