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的tag
type 想要在循环中查找的对象类型
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 UF
import json
def 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.Obj
solid_body_tag_list = []
solid_body_tag = 0
while True:
solid_body_tag = pyuf_obj_instance.CycleObjsInPart(part_file_tag, UF.UFConstants.UF_solid_type, solid_body_tag)
if solid_body_tag == 0:
break
type, subtype= pyuf_obj_instance.AskTypeAndSubtype(solid_body_tag)
if subtype == 0:
solid_body_tag_list.append(solid_body_tag)
return solid_body_tag_list
def get_solid_body_face_tags(the_pyuf_session, solid_body_tag):
"""
功能:获取一个solidbody实体中的所有面的tag标识
"""
uf_modling_instance = the_pyuf_session.Modeling
face_tag_list = uf_modling_instance.AskBodyFaces(solid_body_tag)
return face_tag_list
def get_solid_body_face_edge_tags(the_pyuf_session, solid_body_face_tag):
"""
功能:获取一个实体面中的所有实体边的tag标识
"""
uf_modling_instance = the_pyuf_session.Modeling
edge_tag_list = uf_modling_instance.AskFaceEdges(solid_body_face_tag)
return edge_tag_list
def get_solid_body_face_edge_points(the_pyuf_session, solid_body_face_egde_tag):
"""
功能:获取一个边中的所有点的坐标
"""
uf_modling_instance = the_pyuf_session.Modeling
edge_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.Modeling
face_type = uf_modling_instance.AskFaceType(solid_body_face_tag)
return face_type
def get_solid_body_edge_type(the_pyuf_session, solid_body_edge_tag):
"""
功能:获取一个实体边的类型
"""
uf_modling_instance = the_pyuf_session.Modeling
edge_type = uf_modling_instance.AskEdgeType(solid_body_edge_tag)
return edge_type
def get_body_type(the_pyuf_session, body_tag):
"""
功能:获取一个体的类型,在UG中体分为实体(solid body)和片体(sheet body)
"""
uf_modling_instance = the_pyuf_session.Modeling
edge_type = uf_modling_instance.AskBodyType(body_tag)
return edge_type
def get_uf_modl_body_string(uf_modl_body_type):
"""
功能:根据类型标识,获取UG MODL body对象的字符串形式描述,
UF_MODL_SOLID_BODY 5601
UF_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 16
UF_MODL_CONICAL_FACE 17
UF_MODL_SPHERICAL_FACE 18
UF_MODL_TOROIDAL_FACE 19
UF_MODL_SWEPT_FACE 20
UF_MODL_PLANAR_FACE 22
UF_MODL_BLENDING_FACE 23
UF_MODL_PARAMETRIC_FACE 43
UF_MODL_OFFSET_FACE 65
UF_MODL_FOREIGN_FACE 66
UF_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 3001
UF_MODL_CIRCULAR_EDGE 3002
UF_MODL_ELLIPTICAL_EDGE 3003
UF_MODL_INTERSECTION_EDGE 3004
UF_MODL_SPLINE_EDGE 3005
UF_MODL_SP_CURVE_EDGE 3006
UF_MODL_FOREIGN_EDGE 3007
UF_MODL_CONST_PARAMETER_EDGE 3008
UF_MODL_TRIMMED_CURVE_EDGE 3009
UF_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 session
the_pyuf_session = get_uf_session()
# 获取python session
the_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].Tag
print(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_dict
temp_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_dict
part_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。
运行结果: