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