UG二次开发NXOpen-Python(十一) 对象的遍历

  正好有人问我怎么获得当前显示部件的长宽高,我的理解应该是显示当前prt文件中没有被隐藏的实体的尺寸

  实现这个功能就要对workPart中的Body进行遍历,然后判断是否为实体、是否隐藏,最后再获取尺寸边界,对于对象的遍历,如果单独用NXOpen来做有点麻烦,对于一个prt文件来说,既可能是一个单独的零件也可能是一个装配体。

  对于单独的零件,要对体进行遍历,我们可以利用part.bodies来对体进行遍历,很简单

  但对于装配体,part.bodies不包含装配组件中的体,所以,要获取组件中的体,比较费事,首先要通过part.ComponentAssembly().RootComponent获取装配的根节点,然后对获取根节点的子节点,判定IsOccurence,如果是,获取其Prototype,再遍历体,就这样通过递归一直遍历到底,想想就头疼

  所以,这种事还得使用UF,我们可以利用NXOpen.UF.Obj.CycleObjsInPart函数对prt中特定的对象进行遍历,不管是不是装配体,都在这个函数的管辖范围,该函数原型如下:

int UF_OBJ_cycle_objs_in_part
(
tag_t part_tag,
int type,
tag_t * object
)
  • 第一个参数:workpart的Tag;
  • 第二个参数:遍历的类型,我们这里要遍历实体,UF对于对象类型定义在UF_OBJECT_TYPES中,#define UF_solid_type  70 ,所以这个参数为70
  • 第三个参数:该函数上一次调用的返回值,也就是每次调用获取一个对象,下一次调用时把上一次获取的对象作为第三个参数,第一次调用时用NULL_TAG,也就是0,当遍历完毕后也是返回0

  用法如下:

tag_t part_tag, obj_tag = NULL_TAG;
do
{
     obj_tag = UF_OBJ_cycle_all ( part_tag,  obj_tag );
                     /* more code */
}while ( obj_tag != NULL_TAG );

  

 1 import NXOpen
 2 import NXOpen.UF
 3 
 4 #=========================================================================
 5 # 初始化环境
 6 #=========================================================================
 7 theUfSession: NXOpen.UF.UFSession = NXOpen.UF.UFSession.GetUFSession()
 8 modl_g: NXOpen.UF.ModlGeneral = theUfSession.ModlGeneral
 9 uf_obj: NXOpen.UF.Obj = theUfSession.Obj
10 uf_layer: NXOpen.UF.Layer = theUfSession.Layer
11 theSession: NXOpen.Session = NXOpen.Session.GetSession()
12 workPart: NXOpen.Part = theSession.Parts.Work
13 lw: NXOpen.ListingWindow = theSession.ListingWindow
14 lw.Open()
15 
16 tag = 0
17 tag = uf_obj.CycleObjsInPart(workPart.Tag, 70, tag)
18 while tag:
19     #=========================================================================
20     # NXOpen对象获取Tag直接通过 Tag属性获取
21     # Tag获取NXOpen对象则需要通过NXOpen.TaggedObjectManager.GetTaggedObject函数
22     #=========================================================================
23     nxobj = NXOpen.TaggedObjectManager.GetTaggedObject(tag)
24 
25     #=========================================================================
26     # 判定该对象为实体且没有被隐藏,以及图层是否关闭
27     #=========================================================================
28     nxobj_layer = uf_obj.AskDisplayProperties(tag).Layer
29     nxobj_layer_status = uf_layer.AskStatus(nxobj_layer)
30     if type(nxobj) == NXOpen.Body and nxobj.IsSolidBody and\
31             not nxobj.IsBlanked and nxobj_layer_status != 4:
32 
33         # do someting
34         # 以AskBoundingBox为例
35 
36         lw.WriteLine(
37             str(tag) + ":" + str(modl_g.AskBoundingBox(tag)))
38     # 循环遍历
39     tag = uf_obj.CycleObjsInPart(workPart.Tag, 70, tag)

 

  

 

 注:

  • 1. UF_MODL_ask_bounding_box返回的可能不会准确
  • 2.如果要获取尺寸界限建议使用UF_MODL_ask_bounding_box_exact 
  • 3.使用1,2中的函数时,若传入的Tag是 occurrence,那么返回的坐标是装配体的,如果要返回原始的尺寸界限坐标,需要传入其对应的prototype的tag
posted @ 2021-12-08 16:42  hustmse0510  阅读(2053)  评论(6编辑  收藏  举报