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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM