UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

Posted GimiGimmy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象相关的知识,希望对你有一定的参考价值。

1、前言

在 UG NX中,有时需要批量删除某文件夹下多个.prt文件中固定一些图层中的体对象和曲线对象,这时如果采用手动逐个打开模型,并选择针对的图层删除,即耗时也容易遗漏,因此采用外部模式来处理比较方便。本文介绍批量删除某些图层中的体对象和曲线对象。

2、获取所有文件和图层标识

2.1 解析图层标识

 				Console.WriteLine("========开始执行删除程序\\n");
                #region 解析图层 
                string[] argsSplit = args[2].Split(',');
                List<int> layers = new List<int>();
                foreach(var sp in argsSplit)
                
                    if(sp.Contains("~"))
                    
                        string[] spsplit = sp.Split('~');
                        for(int  i=int.Parse( spsplit[0]);i<=int.Parse(spsplit[1]);i++)
                        
                            layers.Add(i);
                        
                    
                    else
                    
                        layers.Add(int.Parse(sp));
                    
                
                #endregion

2.2 获取所有.prt文件地址

 				 string path = args[0];
                Console.WriteLine("========文件目录为" + args[0] + "\\n");
                DirectoryInfo root = new DirectoryInfo(path);
                GetAllFiles(root);
static void GetAllFiles(DirectoryInfo root)
        
            //获取当前程序所在的文件路径

            string topPath = root.FullName;//上上级目录
            StreamWriter sw = null;
            try
            
                //创建输出流,将得到文件名子目录名保存到txt中
                getDirectory(sw, topPath, 2);
            
            catch (IOException e)
            
                Console.WriteLine(e.Message);
            
        

        /// <summary>
        /// 获得指定路径下所有文件名
        /// </summary>
        /// <param name="sw">文件写入流</param>
        /// <param name="path">文件写入流</param>
        /// <param name="indent">输出时的缩进量</param>
        public static void getFileName(StreamWriter sw, string path, int indent)
        
            DirectoryInfo root = new DirectoryInfo(path);
            foreach (FileInfo f in root.GetFiles())
            
                allFileList.Add(f.FullName);
            
        

        /// <summary>
        /// 获得指定路径下所有子目录名
        /// </summary>
        /// <param name="sw">文件写入流</param>
        /// <param name="path">文件夹路径</param>
        /// <param name="indent">输出时的缩进量</param>
        public static void getDirectory(StreamWriter sw, string path, int indent)
        
            getFileName(sw, path, indent);
            DirectoryInfo root = new DirectoryInfo(path);
            foreach (DirectoryInfo d in root.GetDirectories())
            
                getDirectory(sw, d.FullName, indent + 2);
            
        

3 执行循环删除图层中的体对象和曲线对象

   Console.WriteLine("========执行循环删除\\n");
                #region 针对目录下的每一个.prt
                foreach (var fl in allFileList)
                
                    if (fl.Contains(".prt"))
                    
                        Console.WriteLine("========删除文件" + fl + "\\n");
                        Console.WriteLine("========打开模型文件\\n");
                        #region 打开.prt文件
                        Tag partTag = Tag.Null;
                        NXOpen.UF.UFPart.LoadStatus partLoadStatus;
                        uFPart.Open(fl, out partTag, out partLoadStatus);
                        workPart = theSession.Parts.Work;
                        #endregion
                        Console.WriteLine("========获取1~10的体\\n");

                        #region 获取所有的体和曲线             
                        BodyCollection bodyCollection = workPart.Bodies;
                        List<Body> bodiesList = new List<Body>();
                        Body[] bodies = bodyCollection.ToArray();
                        TaggedObject[] taggedObjects = new TaggedObject[0];
                        foreach (var bd in bodies)
                        
                            if (layers.Contains(bd.Layer))
                            
                                Array.Resize(ref taggedObjects, taggedObjects.Length + 1);
                                taggedObjects[taggedObjects.Length - 1] = bd;
                                bodiesList.Add(bd);
                            
                        
                        Console.WriteLine("========获取1~10的曲线\\n");
                        CurveCollection curveCollection = workPart.Curves;
                        Curve[] curves = curveCollection.ToArray();
                        foreach (var cv in curves)
                        
                            if (layers.Contains(cv.Layer))
                            
                                Array.Resize(ref taggedObjects, taggedObjects.Length + 1);
                                taggedObjects[taggedObjects.Length - 1] = cv;
                            
                        
                        #endregion
                        Console.WriteLine("========删除1~10的体和曲线\\n");
                        #region 删除对象
                        DeleteObjects(taggedObjects);
                        #endregion
                        Console.WriteLine("========保存并关闭文件\\n");
                        #region 保存并关闭
                        uFModl.Update();
                        Tag[] tags;
                        int count;
                        int[] errorList;
                        uFPart.SaveAll(out count, out tags, out errorList);
                        uFPart.CloseAll();
                        #endregion
                    
                
                #endregion

4、测试用例

我们在一个文件夹中建立两个模型,第一个模型为:

曲线在61层,正方体在21层,长方体在1层(工作层)。
第二个模型:

球在工作层,长方体在21层,曲线在61层。
我们选择删除21~61层的体对象和曲线对象

5、编译完成外部exe

生成外部程序exe,并在批处理文件中输入:
D:\\TrainPart\\DeleteObjectsByLayers 21,61
执行批处理文件,能删除这两个模型61层和21中曲线和体对象。
对于第二个模型,其删除后为:

完整的代码见:https://download.csdn.net/download/yang19861007/86727167?spm=1001.2014.3001.5503

以上是关于UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象的主要内容,如果未能解决你的问题,请参考以下文章

UG NX二次开发(C#)-外部模式-导出dwg格式的文件

UG NX二次开发(C#)-外部模式-导出dwg格式的文件

UG NX二次开发(C#)-外部模式-创建一个新的空模型文件

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

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

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