对于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));
输出如下: