夏季里那丝清凉 发表于 2025-6-20 10:58:03

关于分割文件名,自动写入名称和图号属性的做法

关于日期自动写入属性的做法参考https://www.ugsnx.com/thread-353801-1-1.html

分割文件名并写入属性的方式,论坛里以前有使用表达式的方式。同日期自动写入属性一样,再次尝试使用自定义用户命令调用C#操作记录文件的方式来做。

文件名的命名我个人以前是"图号"+空格+"名称"的方式(例如:"Jix25060701 测试零件");或者直接文件名就是零件名,图号手动在制图里写。
分割文件名就是以文件名里的第一个空格将文件名分成两个,第一个空格前的字符作为图号,第一个空格后的字符作为零件名,如果文件名里没有空格,则文件名就是零件名。了解这个逻辑后就可以写代码了。

代码1:

using System;
using NXOpen;


public class SetDateAttribute
{
    public static void Main(string[] args)
    {
      // 获取当前会话和工作部件
      Session theSession = Session.GetSession();
      Part workPart = theSession.Parts.Work;
      
      // 获取当前日期
      string currentDate = DateTime.Now.ToString("yyyy-MM-dd");
       //获取工作部件文件名
      string partName = workPart.Name;
       //将文件名以第一个空格分割,此处单引号里有一个空格,如果是用其它字符分割文件名,将里面空格替换成对应字符
      int firstSpaceIndex = partName.IndexOf(' ');
       //定义图号变量并赋值空
      string partNamePrefix = "";
       //定义零件名变量并赋值空
      string partNameSuffix = "";
      
      //判断文件名是否被分割
         if (firstSpaceIndex >= 0)
            {
                // 找到空格,分割名称
                partNameSuffix = partName.Substring(0, firstSpaceIndex);
                partNamePrefix = partName.Substring(firstSpaceIndex + 1);
            }
            else
            {
                // 没有空格,整个名称作为零件名
                partNamePrefix = partName;
            }
      
      try
      {
            workPart.SetUserAttribute(
                "RELEASE_DATE",                //将日期写入属性RELEASE_DATE,可更改为实际要写入的属性名
                -1,            
                currentDate,   
                Update.Option.Now
            );
            
            workPart.SetUserAttribute(
                "DB_PART_NAME",            //写入零件名属性DB_PART_NAME,可更改为实际要写入的属性名
                -1,
                partNamePrefix,
                Update.Option.Now
            );
            
            // 设置第二个属性:部件名后缀
            workPart.SetUserAttribute(
                "DB_PART_NO",            //写入图号属性DB_PART_NO,可更改为实际要写入的属性名
                -1,
                partNameSuffix,
                Update.Option.Now
            );
             theSession.UpdateManager.DoUpdate(0);
      }
      catch
      {
         
      }
    }
}



这段代码效果与用表达式的方式相似



事实上是可以继续优化的,比如先判断部件属性是否有值,有就不用写入属性,没有才将分割的文件名写入,也可以设置弹窗来确认是否将分割文件名写入属性,甚至指派材料等等~~~

夏季里那丝清凉 发表于 2025-6-26 19:59:26

本帖最后由 夏季里那丝清凉 于 2025-6-26 20:09 编辑

150705 发表于 2025-6-26 15:57
重量倒是变成kg了,但默认属性名称及日期格式还是会跳回初始值,另外,如果原来有属性名称的话,会报错。 ...
名称和日期格式跳回初始值,我这边测试没发现有这种情况,能否提供完整步骤截图,或你测试的文件。
如果文件本身存在相同名字的属性导致的重量写不进去是因为代码里写入的字符类型与现有属性的字符类型不一样,导致无法写入数据,所以现在我在写入属性值前先把有这个名字的属性删掉,再设置属性写入值。


因为计算质量对于大型装配不太友好,后面考虑是不是加个按钮,由用户确认赋值前重新计算一遍质量。

再看看能不能增加用户定义默认设置的配置文件保存路径。
最后尝试用UG自己的UI样式编辑器来做交互界面。

zwaiwo* 发表于 2025-6-21 09:29:12

o1ojacko1o 发表于 2025-6-20 13:58
我知道 我这个要求有点过分,但是还是想问一句。
能否 写一个在装配体下 遍历整个装配体然后每个零件都 ...

记得好评!!!

zwaiwo* 发表于 2025-6-20 16:21:07

夏季里那丝清凉 发表于 2025-6-20 14:18
不想装vs配置开发环境(因为不会,而且配置开发环境来编译对于小白来说太复杂),这种用操作记录文件的方 ...

帮你编译了 顺手做了个UI

o1ojacko1o 发表于 2025-6-20 11:27:26

楼主 厉害   {:2_31:}
+10086

tongjiashan2 发表于 2025-6-20 12:00:19

牛!已收藏。
继续学习中……

谢谢。

gonghb 发表于 2025-6-20 13:17:07

很专业,省了很多事,谢谢楼主分享。

o1ojacko1o 发表于 2025-6-20 13:58:23

我知道 我这个要求有点过分,但是还是想问一句。
能否 写一个在装配体下 遍历整个装配体然后每个零件都做 执行一下这个程序呢?

zwaiwo* 发表于 2025-6-20 14:08:07

你直接编译个DLL文件出来大家直接用

夏季里那丝清凉 发表于 2025-6-20 14:18:16

zwaiwo* 发表于 2025-6-20 14:08
你直接编译个DLL文件出来大家直接用

不想装vs配置开发环境(因为不会,而且配置开发环境来编译对于小白来说太复杂),这种用操作记录文件的方式适合会一点点,不需要太专业,知道几个关键函数就能做些简单的功能

北欧男神 发表于 2025-6-20 14:22:45

不错,相比表达式又多了一个方法

周龙祥 发表于 2025-6-20 15:09:26

牛!已收藏。

867761306 发表于 2025-6-20 15:33:12

谢谢楼主分享。
页: [1] 2 3 4
查看完整版本: 关于分割文件名,自动写入名称和图号属性的做法