正好有人問我怎么獲得當前顯示部件的長寬高,我的理解應該是顯示當前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