UG/NX 二开开发(C#) Tag,Handle在不同场景下的分析(一)

 对于NX二开的初学者来说,Tag,TaggedObject,Handle这三个基本对象是解决问题经常会遇到的。如果理解不够深入,常常会把这三者混淆使用,给开发带来诸多不便,这里我就这三个对象在不同场景下的使用做一次简单的介绍:

先引用西门子官方解释,如下

 

这里我以一个简单的对象分别在装配前后进行分析:

1、在建模环境下:

public static void Main(string[] args)
    {
        try
        {
            theSession = Session.GetSession();
            displayPart = theSession.Parts.Display;
            theUFSession = UFSession.GetUFSession();
            workPart = theSession.Parts.Work;

            Body bodyblock = (Body)workPart.Bodies.FindObject("BLOCK(1)");
            Auto_Init.BodyInit init = new Auto_Init.BodyInit(bodyblock);
            BodyModel model = init.ProcBody();

            //这里分别选取体、面、边作为参考对象
            Body targetBody = bodyblock;
            FaceModel targetFace = model.FaceList[0];
            EdgeModel targetEdge = model.FaceList[0].EdgeList[0];
            Debug.WriteLine(string.Format("体的Tag:{0},面1的Tag:{1},边1的Tag:{2}", targetBody.Tag, targetFace.Tag, targetEdge.Tag));

            string targetBodyHand = theUFSession.Tag.AskHandleOfTag(targetBody.Tag);
            string targetFaceHand = theUFSession.Tag.AskHandleOfTag(targetFace.Tag);
            string targetEdgeHand = theUFSession.Tag.AskHandleOfTag(targetEdge.Tag);
            Debug.WriteLine(string.Format("体的Hand:{0},面1的Hand:{1},边1的Hand:{2}", targetBodyHand, targetFaceHand, targetEdgeHand));
        }
        catch (NXOpen.NXException ex)
        {
            theUI.NXMessageBox.Show("Block Styler", NXMessageBox.DialogType.Error, ex.ToString());
        }
    }

输出结果如下:

转换关系分析:

Tag 和 Hand之间用ufun转换是最方便的:

theUFSession.Tag.AskHandleOfTag

theUFSession.Tag.AskTagOfHandle

Tag和TaggedObject的转换:

 //tag 转 TaggedObject, TaggedObject可以强制转换成Bogy/Face/Edge
Body targetBody1 = (Body)NXObjectManager.Get(targetBody.Tag);

 2、在装配环境下:

还是刚才的block,添加到装配之后,再用(Body)workPart.Bodies.FindObject("BLOCK(1)")方法来获取对象就报错了:

这时,我们需要从组件里面找到block,直接上代码(这里只对比tag和hand,获取过程可以参考我的另一篇文章UG/NX二次开发(C#) 获取组件里面的部件实体_MarcoPro的博客-CSDN博客):

    public static void Main(string[] args)
    {
        try
        {
            theSession = Session.GetSession();
            displayPart = theSession.Parts.Display;
            theUFSession = UFSession.GetUFSession();
            workPart = theSession.Parts.Work;

            List<Component> compList = new List<Component>();
            List<Body> bodyList = new List<Body>();
            Dictionary<string, Component> dicComp = new Dictionary<string, Component>();
            Dictionary<string, Body> dicBody = new Dictionary<string, Body>();
 
            ComponentTool.GetBodyListFromComponet(ref compList, ref bodyList);

            Body bodyblock = bodyList[0];
            Auto_Init.BodyInit init = new Auto_Init.BodyInit(bodyblock);
            BodyModel model = init.ProcBody();

            //这里分别选取体、面、边作为参考对象
            Body targetBody = bodyblock;
            FaceModel targetFace = model.FaceList[0];
            EdgeModel targetEdge = model.FaceList[0].EdgeList[0];
            Debug.WriteLine(string.Format("体的Tag:{0},面1的Tag:{1},边1的Tag:{2}", targetBody.Tag, targetFace.Tag, targetEdge.Tag));

            string targetBodyHand = theUFSession.Tag.AskHandleOfTag(targetBody.Tag);
            string targetFaceHand = theUFSession.Tag.AskHandleOfTag(targetFace.Tag);
            string targetEdgeHand = theUFSession.Tag.AskHandleOfTag(targetEdge.Tag);
            Debug.WriteLine(string.Format("体的Hand:{0},面1的Hand:{1},边1的Hand:{2}", targetBodyHand, targetFaceHand, targetEdgeHand));

            //tag 转 TaggedObject, TaggedObject可以强制转换成Bogy/Face/Edge
            Body targetBody1 = (Body)NXObjectManager.Get(targetBody.Tag); 

        }
        catch (NXOpen.NXException ex)
        {
            theUI.NXMessageBox.Show("Block Styler", NXMessageBox.DialogType.Error, ex.ToString());
        }
    }

 输出结果如下:

 对比一下上面装配前的输出结果:

Tag在装配前后,Tag变了,Hand没变,所以在获取装配后的部件的时候,通过Hand就能获取到新的tag

            //直接用Hand取tag,会怎么样呢?
            Tag tagBody = theUFSession.Tag.AskTagOfHandle(targetBodyHand);
            Tag tagFace = theUFSession.Tag.AskTagOfHandle(targetFaceHand);
            Tag tagEdge = theUFSession.Tag.AskTagOfHandle(targetEdgeHand);
            Debug.WriteLine(string.Format("直接用Hand取tag,体的Tag:{0},面1的Tag:{1},边1的Tag:{2}", targetBody.Tag, targetFace.Tag, targetEdge.Tag));

输出如下:

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值