Siemens-NXUG二次開發-獲取prt中體與類型、實體面與類型、實體邊與類型、邊上點的Tag標識[Python UF][20240302]
- 1.python uf函數
- 1.1 NXOpen.UF.Obj.CycleObjsInPart
- 1.2 NXOpen.UF.Obj.AskTypeAndSubtype
- 1.3 NXOpen.UF.Modeling.AskBodyFaces
- 1.4 NXOpen.UF.Modeling.AskFaceEdges
- 1.5 NXOpen.UF.Modeling.AskEdgeVerts
- 1.6 NXOpen.UF.Modeling.AskEdgeType
- 1.7 NXOpen.UF.Modeling.AskFaceType
- 1.8 NXOpen.UF.Modeling.AskBodyType
- 2.示例代碼
- 2.1 pyuf_parse_prt.py
- 3.運行結果
- 3.1 內部模式
- 3.2 外部模式
1.python uf函數
1.1 NXOpen.UF.Obj.CycleObjsInPart
# 內部和外部模式可用
"""
官方文檔翻譯:返回所有層(包括不可寫或不可見的層)上指定類型prt中的所有對象,而不管其當前的可顯示狀態如何。
此例程不返回表達式、廢棄對象、臨時(系統創建的)對象或休眠對象。處于休眠狀態的對象是指已從模型中刪除的對象。例如,如果倒圓角一條邊,則該邊處于休眠狀態。除非已保存WCS,否則不會返回該WCS。
注意:當指定的類型為UF_feature_type時,此例程將循環零件中的特征。
在循環中循環數據庫時,不要嘗試刪除對象。刪除當前對象后,嘗試讀取下一個對象時可能會出現問題。要刪除對象,請保存包含對象的陣列,然后在完成循環后,使用UF_OBJ_delete_array_of_objects刪除已保存的對象陣列。
返回值:一個tag,元素類型為python的int類型,當次循環拿到具體的對象obj tag。
"""
def NXOpen.UF.Obj.CycleObjsInPart(self, part_tag, type, object_arg) '''part_tag 要在其中查找對象的prt的tagtype 想要在循環中查找的對象類型object_arg(Tag) 在輸入時,由該例程的最后一次調用找到的對象。如果尚未調用此例程,則將object設置為NULL_TAG以開始循環。在輸出時指定類型的下一個對象。如果沒有對象,并且循環完成,則返回NULL_TAG'''
1.2 NXOpen.UF.Obj.AskTypeAndSubtype
"""
官方文檔翻譯:返回標記的NX對象的對象類型和子類型。這些對象中的大多數都列在uf_object_types.h頭文件中。
除了uf_object_types.h中列出的對象之外,還有其他由標記唯一標識的NX對象。這些對象包括表達式和部件。這些對象未在uf_object_types.h頭文件中列出,它們生成類型為uf_OBJ_EXPR_type和子類型為0的uf_OBJ_PART_type。
此函數為表達式和部件返回的類型和子類型在任何其他Open API例程中都沒有用處。提供這些類型只是為了允許您通過NX對象的標識符(即其標簽)來確定NX對象類,這可以幫助您確定可以與該對象一起使用的其他Open API例程。有關對象類和可用于這些對象的開放式API例程的更詳細討論,請參閱開放式API程序員指南“NX對象模型”。
"""
def NXOpen.UF.Obj.AskTypeAndSubtype(self, object_id) '''object_id:(python int) 對象tag)返回值:一個元組(int, int),0-type;1-subtype'''
1.3 NXOpen.UF.Modeling.AskBodyFaces
# 內部和外部模式可用
"""
官方文檔翻譯:調用UF_MODL_ask_body_faces,并將實體tag(類型70,子類型0)作為輸入,將返回與該實體關聯的面的列表。可以使用UF_MODL_*_list*例程來處理此列表。該例程的適當輸入可以通過調用UF_MODL_ask_object()并輸入上述類型和子類型來獲得。
"""
def NXOpen.UF.Modeling.AskBodyFaces(self, body)'''body(Tag) 實體的tag返回值:一個python列表,包含該實體上所有實體面face的tag。'''
1.4 NXOpen.UF.Modeling.AskFaceEdges
"""
注意:NXOpen中實體邊的tag也可以直接用于曲線(UF_CURVE)操作函數傳參,即便在UG系統中認為實體邊edge和曲線curve中兩種數據類型。
官方文檔翻譯:UF_MODL_ask_face_edges的輸入是單個實體面。返回的是與該面關聯的實體邊的列表。可以使用UF_MODL_*_list*例程來處理此列表。
如果面是引用,則返回值是相對于引用的,而不是相對于原型的。
"""
def NXOpen.UF.Modeling.AskFaceEdges(self, face) '''face(Tag) 實體面的tag返回值:一個python列表,包含該實體面上所有實體邊edge的tag。'''
1.5 NXOpen.UF.Modeling.AskEdgeVerts
# 內部和外部模式可用
"""
官方文檔翻譯:給定一條實體邊作為輸入,返回邊的頂點(端點)。根據給定的邊,邊可以有零個、一個或兩個頂點。例如,圓是頂點為零的邊,線是頂點為兩個的邊。也可以創建具有一個頂點的圓形邊。一個例子是將三角形擠出到圓柱體中,然后對結果執行并集以獲得如圖所示的實體。
當輸入邊是引用時,點1和點2的坐標是相對于引用的。
"""
def NXOpen.UF.Modeling.AskEdgeVerts(self, edge)'''edge(Tag) 實體面上邊(實體邊)的tag返回值:一個python元組 (list of float, list of float, int)。0位置-(list of float): 實體邊的第一個終點.1位置-(list of float): 實體邊的第二個終點.2位置-(int): 返回的終點數量. 如果僅一個終點返回了,那么它在元組的0位置是"第一個終點".'''
1.6 NXOpen.UF.Modeling.AskEdgeType
# 內部和外部模式可用
"""
官方文檔翻譯:返回實體邊類型。查詢例程僅返回線性、圓形、橢圓形和樣條曲線邊的幾何數據。
"""
def NXOpen.UF.Modeling.AskEdgeType(self, edge_id)'''edge_id(Tag) 實體面上邊(實體邊)的tag返回值:一個python int值。#define UF_MODL_LINEAR_EDGE 3001 /* UF_MODL_ask_edge_type */#define UF_MODL_CIRCULAR_EDGE 3002 /* UF_MODL_ask_edge_type */#define UF_MODL_ELLIPTICAL_EDGE 3003 /* UF_MODL_ask_edge_type */#define UF_MODL_INTERSECTION_EDGE 3004 /* UF_MODL_ask_edge_type */#define UF_MODL_SPLINE_EDGE 3005 /* UF_MODL_ask_edge_type */#define UF_MODL_SP_CURVE_EDGE 3006 /* UF_MODL_ask_edge_type */#define UF_MODL_FOREIGN_EDGE 3007 /* UF_MODL_ask_edge_type */#define UF_MODL_CONST_PARAMETER_EDGE 3008 /* UF_MODL_ask_edge_type */#define UF_MODL_TRIMMED_CURVE_EDGE 3009 /* UF_MODL_ask_edge_type */#define UF_MODL_CONVERGENT_EDGE 100007 /* UF_MODL_ask_edge_type */'''
1.7 NXOpen.UF.Modeling.AskFaceType
# 內部和外部模式可用
"""
官方文檔翻譯:獲取實體面的類型
"""
def NXOpen.UF.Modeling.AskFaceType(self, face )'''face (Tag) 實體面的tag返回值:一個python int值。#define UF_MODL_CYLINDRICAL_FACE 16 /* UF_MODL_ask_face_type */#define UF_MODL_CONICAL_FACE 17 /* UF_MODL_ask_face_type */#define UF_MODL_SPHERICAL_FACE 18 /* UF_MODL_ask_face_type */#define UF_MODL_TOROIDAL_FACE 19 /* UF_MODL_ask_face_type */#define UF_MODL_SWEPT_FACE 20 /* UF_MODL_ask_face_type */#define UF_MODL_PLANAR_FACE 22 /* UF_MODL_ask_face_type */#define UF_MODL_BLENDING_FACE 23 /* UF_MODL_ask_face_type */#define UF_MODL_PARAMETRIC_FACE 43 /* UF_MODL_ask_face_type */#define UF_MODL_OFFSET_FACE 65 /* UF_MODL_ask_face_type */#define UF_MODL_FOREIGN_FACE 66 /* UF_MODL_ask_face_type */#define UF_MODL_CONVERGENT_FACE 67 /* UF_MODL_ask_face_type */'''
1.8 NXOpen.UF.Modeling.AskBodyType
# 內部和外部模式可用
"""
官方文檔翻譯:獲取體的類型,在UG中體分為實體(solid body)和片體(sheet body)
"""
def NXOpen.UF.Modeling.AskBodyType(self, body_id)'''body_id(Tag) 體的tag返回值:一個python int值。#define UF_MODL_SOLID_BODY 5601 /* UF_MODL_ask_body_type */#define UF_MODL_SHEET_BODY 5602 /* UF_MODL_ask_body_type */'''
2.示例代碼
2.1 pyuf_parse_prt.py
import NXOpen
import NXOpen.UF as UFimport jsondef get_uf_session():# 獲取當前UF會話return UF.UFSession.GetUFSession()def get_py_session():# 獲取當前UF會話return NXOpen.Session.GetSession()def pyuf_open_prt(the_pyuf_session, open_prt_file_name):"""功能:打開一個指定文件路徑和文件名的.prt文件備注:外部模式會報錯-NXOpen.NXException: Internal error: memory access violation,內部模式不會,使用python api本身的寫法“py_open_prt”打開"""# 由于要對Part進行操作,因此需要獲取Part實例對象pyuf_part_instance = the_pyuf_session.Part# Open方法位于Part類對象中return pyuf_part_instance.Open(open_prt_file_name)def py_open_prt(the_py_session, open_prt_file_name):"""功能:打開一個指定文件路徑和文件名的.prt文件返回值:(<NXOpen.Part object at 0x00000180F13DDCC0>, <NXOpen.PartLoadStatus object at 0x00000180F0F3DC70>)"""return the_py_session.Parts.OpenBaseDisplay(open_prt_file_name)def pyuf_close_prt(the_pyuf_session, part_tag, scope, mode):"""功能:關閉當前工作part"""# 由于要對Part進行操作,因此需要獲取Part實例對象pyuf_part_instance = the_pyuf_session.Part# Close方法位于Part類對象中return pyuf_part_instance.Close(part_tag, scope, mode)def get_part_solid_body_tags(the_pyuf_session, part_file_tag):"""功能:獲取.prt文件中的所有solidbody實體的tag標識"""pyuf_obj_instance = the_pyuf_session.Objsolid_body_tag_list = []solid_body_tag = 0while True:solid_body_tag = pyuf_obj_instance.CycleObjsInPart(part_file_tag, UF.UFConstants.UF_solid_type, solid_body_tag)if solid_body_tag == 0:breaktype, subtype= pyuf_obj_instance.AskTypeAndSubtype(solid_body_tag)if subtype == 0:solid_body_tag_list.append(solid_body_tag)return solid_body_tag_listdef get_solid_body_face_tags(the_pyuf_session, solid_body_tag):"""功能:獲取一個solidbody實體中的所有面的tag標識"""uf_modling_instance = the_pyuf_session.Modelingface_tag_list = uf_modling_instance.AskBodyFaces(solid_body_tag)return face_tag_listdef get_solid_body_face_edge_tags(the_pyuf_session, solid_body_face_tag):"""功能:獲取一個實體面中的所有實體邊的tag標識"""uf_modling_instance = the_pyuf_session.Modelingedge_tag_list = uf_modling_instance.AskFaceEdges(solid_body_face_tag)return edge_tag_listdef get_solid_body_face_edge_points(the_pyuf_session, solid_body_face_egde_tag):"""功能:獲取一個邊中的所有點的坐標"""uf_modling_instance = the_pyuf_session.Modelingedge_type = get_solid_body_edge_type(the_pyuf_session, solid_body_face_egde_tag)edge_data = uf_modling_instance.AskEdgeVerts(solid_body_face_egde_tag)edgeTypeString = get_uf_modl_edge_string(edge_type)return [edge_type, edgeTypeString, edge_data[2], edge_data[0], edge_data[1]]def get_solid_body_face_type(the_pyuf_session, solid_body_face_tag):"""功能:獲取一個實體面的類型"""uf_modling_instance = the_pyuf_session.Modelingface_type = uf_modling_instance.AskFaceType(solid_body_face_tag)return face_typedef get_solid_body_edge_type(the_pyuf_session, solid_body_edge_tag):"""功能:獲取一個實體邊的類型"""uf_modling_instance = the_pyuf_session.Modelingedge_type = uf_modling_instance.AskEdgeType(solid_body_edge_tag)return edge_typedef get_body_type(the_pyuf_session, body_tag):"""功能:獲取一個體的類型,在UG中體分為實體(solid body)和片體(sheet body)"""uf_modling_instance = the_pyuf_session.Modelingedge_type = uf_modling_instance.AskBodyType(body_tag)return edge_typedef get_uf_modl_body_string(uf_modl_body_type):"""功能:根據類型標識,獲取UG MODL body對象的字符串形式描述,UF_MODL_SOLID_BODY 5601UF_MODL_SHEET_BODY 5602"""if type(uf_modl_body_type) != type(0):return ""if uf_modl_body_type == UF.UFConstants.UF_MODL_SOLID_BODY:return "5601-UF_MODL_SOLID_BODY-Type"elif uf_modl_body_type == UF.UFConstants.UF_MODL_SHEET_BODY:return "5602-UF_MODL_SHEET_BODY-Type"return "00-unknow-ModlEdgeType"def get_uf_modl_face_string(uf_modl_face_type):"""功能:根據類型標識,獲取UG MODL face對象的字符串形式描述,UF_MODL_CYLINDRICAL_FACE 16UF_MODL_CONICAL_FACE 17UF_MODL_SPHERICAL_FACE 18UF_MODL_TOROIDAL_FACE 19UF_MODL_SWEPT_FACE 20UF_MODL_PLANAR_FACE 22UF_MODL_BLENDING_FACE 23UF_MODL_PARAMETRIC_FACE 43UF_MODL_OFFSET_FACE 65UF_MODL_FOREIGN_FACE 66UF_MODL_CONVERGENT_FACE 67 """if type(uf_modl_face_type) != type(0):return ""if uf_modl_face_type == UF.UFConstants.UF_MODL_CYLINDRICAL_FACE:return "16-UF_MODL_CYLINDRICAL_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_CONICAL_FACE:return "17-UF_MODL_CONICAL_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_SPHERICAL_FACE:return "18-UF_MODL_SPHERICAL_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_TOROIDAL_FACE:return "19-UF_MODL_TOROIDAL_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_SWEPT_FACE:return "20-UF_MODL_SWEPT_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_PLANAR_FACE:return "22-UF_MODL_PLANAR_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_BLENDING_FACE:return "23-UF_MODL_BLENDING_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_PARAMETRIC_FACE:return "43-UF_MODL_PARAMETRIC_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_OFFSET_FACE:return "65-UF_MODL_OFFSET_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_FOREIGN_FACE:return "66-UF_MODL_FOREIGN_FACE-Type"elif uf_modl_face_type == UF.UFConstants.UF_MODL_CONVERGENT_FACE:return "67-UF_MODL_CONVERGENT_FACE-Type"return "00-unknow-ModlEdgeType"def get_uf_modl_edge_string(uf_modl_edge_type):"""功能:根據類型標識,獲取UG MODL Edge對象的字符串形式描述,UF_MODL_LINEAR_EDGE 3001UF_MODL_CIRCULAR_EDGE 3002UF_MODL_ELLIPTICAL_EDGE 3003UF_MODL_INTERSECTION_EDGE 3004UF_MODL_SPLINE_EDGE 3005UF_MODL_SP_CURVE_EDGE 3006UF_MODL_FOREIGN_EDGE 3007UF_MODL_CONST_PARAMETER_EDGE 3008UF_MODL_TRIMMED_CURVE_EDGE 3009UF_MODL_CONVERGENT_EDGE 100007"""if type(uf_modl_edge_type) != type(0):return ""if uf_modl_edge_type == UF.UFConstants.UF_MODL_LINEAR_EDGE:return "3001-UF_MODL_LINEAR_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_CIRCULAR_EDGE:return "3002-UF_MODL_CIRCULAR_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_ELLIPTICAL_EDGE:return "3003-UF_MODL_ELLIPTICAL_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_INTERSECTION_EDGE:return "3004-UF_MODL_INTERSECTION_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_SPLINE_EDGE:return "3005-UF_MODL_SPLINE_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_SP_CURVE_EDGE:return "3006-UF_MODL_SP_CURVE_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_FOREIGN_EDGE:return "3007-UF_MODL_FOREIGN_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_CONST_PARAMETER_EDGE:return "3008-UF_MODL_CONST_PARAMETER_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_TRIMMED_CURVE_EDGE:return "3009-UF_MODL_TRIMMED_CURVE_EDGE-Type"elif uf_modl_edge_type == UF.UFConstants.UF_MODL_CONVERGENT_EDGE:return "100007-UF_MODL_CONVERGENT_EDGE-Type"return "00-unknow-ModlEdgeType"if __name__ == '__main__':# 獲取uf sessionthe_pyuf_session = get_uf_session()# 獲取python sessionthe_py_session = get_py_session()# 打開prt文件路徑與名稱open_prt_file_name = 'D:\\pyuf_parse_prt.prt'# 打開D盤根目錄下的示例.prt文件,并成為工作prt(work part)# 如果是在內部模式運行,則會在NX/UG界面打開一個名為pyuf_parse_prt_test.prt的文件窗口open_prt_file_python_instance = py_open_prt(the_py_session, open_prt_file_name)open_prt_file_uf_tag = open_prt_file_python_instance[0].Tagprint(open_prt_file_python_instance)# 外部模式運行,會在命令行中打印,但內部模式運行則無反應,因在UF.UI類中操作,才可在NX/UG界面顯示數據# 由于與NX/UG界面UI操作的方法都在UI類中,因此先獲取UF.UI示例對象pyuf_ui_instance = the_pyuf_session.Ui# 判斷信息窗口是否打開if pyuf_ui_instance.IsListingWindowOpen() == False:# 信息窗口未打開,先要將其打開# 打開信息窗口pyuf_ui_instance.OpenListingWindow()# 向信息窗口寫入內容pyuf_ui_instance.WriteListingWindow('\nopen_prt_file_name is:' + str(open_prt_file_name))pyuf_ui_instance.WriteListingWindow('\nopen_prt_file_tag type is:' + str(type(open_prt_file_uf_tag)))pyuf_ui_instance.WriteListingWindow('\nopen_prt_file_tag is:{}'.format(open_prt_file_uf_tag))part_data = dict()solid_body_tag_list = get_part_solid_body_tags(the_pyuf_session, open_prt_file_uf_tag)for item_solid_body_tag in solid_body_tag_list:item_solid_body_face_tag_list = get_solid_body_face_tags(the_pyuf_session, item_solid_body_tag)item_solid_body_type = get_body_type(the_pyuf_session, item_solid_body_tag)temp_face_data_dict = dict()for item_solid_body_face_tag in item_solid_body_face_tag_list:item_solid_body_face_edge_tag_list = get_solid_body_face_edge_tags(the_pyuf_session, item_solid_body_face_tag)item_solid_body_face_type = get_solid_body_face_type(the_pyuf_session, item_solid_body_face_tag)temp_edge_data_dict = dict()for item_solid_body_face_edge_tag in item_solid_body_face_edge_tag_list:item_solid_body_face_edge_points_data = get_solid_body_face_edge_points(the_pyuf_session, item_solid_body_face_edge_tag)temp_edge_data_dict[str(item_solid_body_face_edge_tag)] = str(item_solid_body_face_edge_points_data)temp_face_data_dict[str(item_solid_body_face_tag)] = temp_edge_data_dicttemp_face_data_dict[str(item_solid_body_face_tag)]["face_type"] = get_uf_modl_face_string(item_solid_body_face_type)part_data[str(item_solid_body_tag)] = temp_face_data_dictpart_data[str(item_solid_body_tag)]["body_type"] = get_uf_modl_body_string(item_solid_body_type)print(part_data)f = open("tttt.json", "w")f.write(json.dumps(part_data))f.close()pyuf_ui_instance.WriteListingWindow("{}".format(json.dumps(part_data)))# 將信息窗口的內容保存到指定文件中pyuf_ui_instance.SaveListingWindow('D:\\pyuf_listingwindow_content_test.txt')# 關閉信息窗口#pyuf_ui_instance.ExitListingWindow()
3.運行結果
3.1 內部模式
選中要運行的.py文件后,點擊“管道通路”即可。
運行結果:
3.2 外部模式
cmd命令:“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_parse_prt.py。
cmd命令:“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_parse_prt.py。
powershell命令:&“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_parse_prt.py。
powershell命令:&“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_parse_prt.py。
運行結果: