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对于对象类型定义在中,#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 );
1import NXOpen
2import NXOpen.UF
3
4#=========================================================================
5# 初始化环境
6#=========================================================================
7 theUfSession: NXOpen.UF.UFSession = NXOpen.UF.UFSession.GetUFSession()writeline使用方法python
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)
18while 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)
30if type(nxobj) == NXOpen.Body and nxobj.IsSolidBody and\
31not 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. 返回的可能不会准确
2.如果要获取尺⼨界限建议使⽤
3.使⽤1,2中的函数时,若传⼊的Tag是 occurrence,那么返回的坐标是装配体的,如果要返回原始的尺⼨界限坐标,需要传⼊其对
应的prototype的tag

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。