Siemens-NXUG二次开发-导入与导出(可移除参数)prt文件[Python UF][20240121]
- 1.python uf函数
- 1.1 NXOpen.UF.Part.Import
- 1.2 NXOpen.UF.Part.ImportPartModes
- 1.3 NXOpen.UF.Group.AskGroupData
- 1.4 NXOpen.UF.Obj.AskTypeAndSubtype
- 1.5 NXOpen.UF.Part.Export
- 1.6 NXOpen.UF.Part.ExportWithOptions
- 1.7 NXOpen.UF.Part.ExportOptions
- 1.8 UF_PART_export_params_mode_e
- 1.9 UF_PART_export_exp_mode_t
- 2.示例代码
- 2.1 pyuf_import_prt.py
- 2.2 pyuf_export_prt.py
- 3.运行结果
- 3.1 内部模式
- 3.2 外部模式
1.python uf函数
1.1 NXOpen.UF.Part.Import
# 内部和外部模式可用
"""
官方文档翻译:将NX零件或Solid Edge零件(.par或.psm文件扩展名)从磁盘合并到当前工作零件中。输入在“模式”结构中指定。Solid Edge零件将作为未参数化的实体导入。
请参阅模式结构的说明。
返回值:一个tag,元素类型为python的int类型,表示导入prt中体的组tag,注意是“组”tag,“组”tag包含导入内容的tag,需要通过查询组的函数获取组内成员tag,拿到具体的体tag。
"""
def NXOpen.UF.Part.Import(self, file_name, modes, dest_csys, dest_point, scale)'''file_name: (python str),文件名(包含路径)modes:(NXOpen.UF.Part.ImportPartModes) 导入模式类实例对象(需要设置过具体属性)dest_csys:(python list of float, len:6) 被导入零件安放的目标坐标系,dest_csys[0.2]是X方向矢量,dest_csys[3.5]是y方向矢量。这些被用作UF_MTX3_initialize的输入,以创建完整的坐标系矩阵。dest_point:(python list of float, len:3) 被导入零件的目标放置点scale:(python float) 被导入零件的缩放大小'''
1.2 NXOpen.UF.Part.ImportPartModes
# 内部和外部模式可用
"""
官方文档翻译:零件导入中使用的数据结构和常量。
"""
'''
layer_mode
int
0=在工作层上合并
1=在原始图层上合并group_mode
int
0=合并未分组
1=合并分组csys_mode
int
Open API应用程序未使用plist_mode
int
注意:不再使用plist_modeview_mode
int
0=不检索视图和布局。
1=检索视图和布局。cam_mode
logical
如果为true,则合并工具和参数集,如果为false,则不要。use_search_dirs
logical
这不是Open API应用程序使用的
'''
def NXOpen.UF.Part.ImportPartModes.CamMode(self)
def NXOpen.UF.Part.ImportPartModes.CamMode( self, value)
def NXOpen.UF.Part.ImportPartModes.CsysMode(self)
def NXOpen.UF.Part.ImportPartModes.CsysMode(self, value )
def NXOpen.UF.Part.ImportPartModes.GroupMode(self)
def NXOpen.UF.Part.ImportPartModes.GroupMode(self, value)
def NXOpen.UF.Part.ImportPartModes.LayerMode(self)
def NXOpen.UF.Part.ImportPartModes.LayerMode(self, value)
def NXOpen.UF.Part.ImportPartModes.PlistMode(self)
def NXOpen.UF.Part.ImportPartModes.PlistMode(self, value)
def NXOpen.UF.Part.ImportPartModes.UseSearchDirs(self)
def NXOpen.UF.Part.ImportPartModes.UseSearchDirs(self, value)
def NXOpen.UF.Part.ImportPartModes.ViewMode(self)
def NXOpen.UF.Part.ImportPartModes.ViewMode(self, value)
1.3 NXOpen.UF.Group.AskGroupData
"""
官方文档翻译:查询组的成员。使用group_members后,使用UF_free释放分配内存。
"""
def NXOpen.UF.Group.AskGroupData(self, group_tag)'''group_tag:(python int) 组的tag返回值: 一个元组(list of Tag, int),0-list of Tag:一个列表,包含组成员的tag。如果组成员的数量为0,则这将是一个NULL_TAG,使用UF_free(group_members)释放内存;1-int:组内成员个数'''
1.4 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.5 NXOpen.UF.Part.Export
# 内部和外部模式可用
"""
官方文档翻译:将指定的对象导出到指定的prt。对象将复制到目标prt中。调用此函数相当于使用以下选项调用UF_PART_export_with_options:new_PART=true, params_mode=UF_PART_maintain_params, expression_mode=UF_PART_copy_exp_deeply
有关此函数行为的更多详细信息以及返回值的描述,请参阅UF_PART_export_with_options。
"""
def NXOpen.UF.Part.Export(self, part_name, num_objects, object_array) '''part_name:(python str) 导出到的目标文件名.num_objects:(python int) ,object_array列表的长度:有n个要被导出的对象object_array:(python list of Tag) 要被导出对象的tag列表.'''
1.6 NXOpen.UF.Part.ExportWithOptions
# 内部和外部模式可用
"""
官方文档翻译:将指定的对象导出到指定的prt。对象将复制到目标prt中。给定对象所依赖的任何其他可转移对象也将导出。请注意,如果没有显示部件,则导出操作将失败。
注意:对象引用和prt引用不可导出。
如果一个对象依赖于另一个不可导出的对象,则不导出该对象,并返回警告值UF_PART_warn_objects_not_copied。但是,操作仍在继续,并且仍会导出其他请求的可导出对象。这种情况可能出现在两种情况下。
1.如果绘图对象的关联几何图形未导出,则不导出该绘图对象。
2.如果删除了要素参数,则无法导出基准。
如果发生任何其他错误,则操作不会成功,并返回相应的错误代码。
options参数控制此操作的行为:请参阅表格
"""
def NXOpen.UF.Part.ExportWithOptions(self, part_name, num_objects, object_array, options) '''part_name:(python str) 导出到的目标文件名.num_objects:(python int) ,object_array列表的长度:有n个要被导出的对象object_array:(python list of Tag) 要被导出对象的tag列表.options:(NXOpen.UF.Part.ExportOptions) 指向结构体的指针(实例对象),该结构包含用于控制对象导出方式的选项。'''
1.7 NXOpen.UF.Part.ExportOptions
# 内部和外部模式可用
"""
官方文档翻译:描述提供给导出操作的选项的类型。
"""
'''
new_part
logical
确定是否应将对象导出到新prt中。params_mode
UF_PART_export_params_mode_t
确定如何复制实体参数。expression_mode
UF_PART_export_exp_mode_t
确定如何复制表达式。
'''
def NXOpen.UF.Part.ExportOptions.ExpressionMode(self)
def NXOpen.UF.Part.ExportOptions.ExpressionMode(self, value)
def NXOpen.UF.Part.ExportOptions.NewPart(self)
def NXOpen.UF.Part.ExportOptions.NewPart(self, value)
def NXOpen.UF.Part.ExportOptions.ParamsMode(self)
def NXOpen.UF.Part.ExportOptions.ParamsMode(self, value)
1.8 UF_PART_export_params_mode_e
// 内部和外部模式可用
/*
官方文档翻译:描述在导出操作期间应如何处理实体参数的类型,注意:UF_PART_maintain_all_params是V15.0中新引入的选项。
在V15.0中,UF_PART_maintain_params和UF_PART_remove_params的行为与早期版本中的行为相同。
*/
enum UF_PART_export_params_mode_e
{/*在导出操作期间应保持实体参数。请注意,使用此选项,如果实体参数的有效性依赖于其他对象,则不会复制这些参数,除非这些其他对象无论如何都要复制。*/UF_PART_maintain_params, /* 实体参数将在导出操作期间删除。复制到目标prt中的实体将没有实体参数。*/UF_PART_remove_params, /*在导出操作期间,应保持所有实体参数。源对象中的所有实体参数都将复制到目标对象中。请注意,保持参数有效性所需的额外对象也将被复制。*/UF_PART_maintain_all_params
};
1.9 UF_PART_export_exp_mode_t
// 内部和外部模式可用
/*
官方文档翻译:描述在导出操作期间应如何处理表达式的类型:
*/
enum UF_PART_export_exp_mode_e
{/*表达方式会被深复制。如果一个表达式引用了同一部分中的另一个表达式,则该引用的表达式也将被复制。但是,不会复制其他prt中的任何引用表达式。*/UF_PART_copy_exp_deeply, /*表达式将被粗略地复制。如果一个表达式引用另一个表达式,则引用表达式的副本将引用同一个被引用的表达式。对于表达式的部分间引用和部分内引用都会发生这种情况。*/UF_PART_copy_exp_shallowly
} ;
2.示例代码
2.1 pyuf_import_prt.py
import NXOpen.UF as UFimport datetimedef get_uf_session():# 获取当前UF会话return UF.UFSession.GetUFSession()def getNowLocalString(split):if split == '\n' or split == '\r' or split == '\t' or split == '*':return ""if split == '\0':return datetime.datetime.now().strftime("%Y%m%d%H%M%S")return datetime.datetime.now().strftime("%Y{}%m{}%d{}%H{}%M{}%S".format(split, split, split, split, split))def get_group_member(group_tag):"""功能:从组tag中获取成员tag"""pyuf_group_instance = the_pyuf_session.Group# (list of Tag, int)return pyuf_group_instance.AskGroupData(group_tag)def get_obj_type_and_subType(obj_tag):"""功能:获取对象的类型"""pyuf_obj_instance = the_pyuf_session.Objreturn pyuf_obj_instance.AskTypeAndSubtype(obj_tag)def pyuf_new_prt(the_pyuf_session, new_prt_file_name, units = 1):"""功能:创建一个指定文件路径和文件名的.prt文件,默认单位制是米(m)"""# 由于要对Part进行操作,因此需要获取Part实例对象pyuf_part_instance = the_pyuf_session.Part# New方法位于Part类对象中new_prt_file_tag = pyuf_part_instance.New(new_prt_file_name, units)def pyuf_save_prt(the_pyuf_session):"""功能:保存当前工作part"""# 由于要对Part进行操作,因此需要获取Part实例对象pyuf_part_instance = the_pyuf_session.Part# Save方法位于Part类对象中return pyuf_part_instance.Save()def pyuf_import_prt(the_pyuf_session, file_name, modes = {"LayerMode":0, "GroupMode":1, "CsysMode":0, "PlistMode":0, "ViewMode":0, "CamMode":False, "UseSearchDirs":False}, dest_csys = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0], dest_point = [0.0, 0.0, 0.0], scale = 1.000000):"""功能:将指定.prt文件导入到当前工作prt中"""# 由于要对Part进行操作,因此需要获取Part实例对象pyuf_part_instance = the_pyuf_session.Part# 由于要对mtx进行操作,因此需要获取Mtx3示例对象pyuf_mtx3_instance = the_pyuf_session.Mtx3importPartModes = pyuf_part_instance.ImportPartModes()importPartModes.LayerMode = modes['LayerMode']importPartModes.GroupMode = modes['GroupMode']importPartModes.CsysMode = modes['CsysMode']importPartModes.PlistMode = modes['PlistMode']importPartModes.ViewMode = modes['ViewMode']importPartModes.CamMode = modes['CamMode']importPartModes.UseSearchDirs = modes['UseSearchDirs']# 初始化坐标系mtxmtx3 = pyuf_mtx3_instance.Initialize(dest_csys[0:3], dest_csys[3:])# 被导入的prt文件会以gruop的形式导入得到组tag,而非特征或体tagreturn pyuf_part_instance.Import(file_name, importPartModes, mtx3[0:6], dest_point, scale)if __name__ == '__main__':# 获取uf sessionthe_pyuf_session = get_uf_session()# 将要导入prt文件路径与名称import_prt_file_name = 'D:\\pyuf_import_export_prt_test.prt'# 创建一个新.prt文件new_prt_file_tag = pyuf_new_prt(the_pyuf_session, 'D:\\' + getNowLocalString('\0') + '.prt')# 执行导入操作,获取组tagimport_prt_group_tag = pyuf_import_prt(the_pyuf_session, import_prt_file_name)pyuf_save_prt(the_pyuf_session)# 从组tag中获取实体成员tagsolid_body_tag_list = []if import_prt_group_tag is not None and import_prt_group_tag != 0:member_tag_tuple = get_group_member(import_prt_group_tag)member_tag_tuple_value = member_tag_tuple[0]for item_tag in member_tag_tuple_value:type_subtype = get_obj_type_and_subType(item_tag)# 实体的type是70、subtype是0if type_subtype[0] == 70 and type_subtype[1] == 0:solid_body_tag_list.append(item_tag)# 外部模式或内部模式运行标识flag = 'internal'# 外部模式运行,会在命令行中打印,但内部模式运行则无反应,因在UF.UI类中操作,才可在NX/UG界面显示数据if flag == 'external':print('\nimport_prt_group_tag is:{}}'.format(import_prt_group_tag))elif flag == 'internal':# 由于与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('\nimport_prt_file_name is:{}'.format(import_prt_file_name))pyuf_ui_instance.WriteListingWindow('\nimport_prt_group_tag is:{}'.format(import_prt_group_tag))pyuf_ui_instance.WriteListingWindow('\nsolid_body_tag_list is:{}'.format(solid_body_tag_list))# 将信息窗口的内容保存到指定文件中pyuf_ui_instance.SaveListingWindow('D:\\pyuf_listingwindow_content_test.txt')# 关闭信息窗口#pyuf_ui_instance.ExitListingWindow()
2.2 pyuf_export_prt.py
import NXOpen.UF as UFimport datetimedef get_uf_session():# 获取当前UF会话return UF.UFSession.GetUFSession()def getNowLocalString(split):if split == '\n' or split == '\r' or split == '\t' or split == '*':return ""if split == '\0':return datetime.datetime.now().strftime("%Y%m%d%H%M%S")return datetime.datetime.now().strftime("%Y{}%m{}%d{}%H{}%M{}%S".format(split, split, split, split, split))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 pyuf_open_prt(the_pyuf_session, open_prt_file_name):"""功能:打开一个指定文件路径和文件名的.prt文件"""# 由于要对Part进行操作,因此需要获取Part实例对象pyuf_part_instance = the_pyuf_session.Part# Open方法位于Part类对象中return pyuf_part_instance.Open(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 pyuf_export_prt(the_pyuf_session, part_name, num_objects, object_array):"""功能:导出objct_array中的tag到指定part_name文件中"""# 由于要对Part进行操作,因此需要获取Part实例对象pyuf_part_instance = the_pyuf_session.Part# Export方法位于Part类对象中return pyuf_part_instance.Export(part_name, num_objects, object_array)def pyuf_export_with_options_prt(the_pyuf_session, part_name, num_objects, object_array, options = [True, 1, 1]):"""功能:导出objct_array中的tag到指定part_name文件中,可以设置导出选项,例如移除参数!"""# 由于要对Part进行操作,因此需要获取Part实例对象pyuf_part_instance = the_pyuf_session.Partexport_options = the_pyuf_session.Part.ExportOptions()export_options.NewPart = options[0]export_options.ParamsMode = pyuf_part_instance.ExportParamsMode.ValueOf(options[1])export_options.ExpressionMode = pyuf_part_instance.ExportExpMode.ValueOf(options[2])# Export方法位于Part类对象中return pyuf_part_instance.ExportWithOptions(part_name, num_objects, object_array, export_options)if __name__ == '__main__':# 获取uf sessionthe_pyuf_session = get_uf_session()# 将要导出prt文件路径与名称export_prt_file_name = 'D:\\pyuf_import_export_prt_test.prt'# 打开一个.prt文件open_prt_file_tag = pyuf_open_prt(the_pyuf_session, export_prt_file_name)[0]# 获取该prt中所有实体tag的列表solid_body_tag_list = get_part_solid_body_tags(the_pyuf_session, open_prt_file_tag)# 执行导出操作,导出列表中的第1个实体result_a = pyuf_export_prt(the_pyuf_session, 'D:\\' + getNowLocalString('\0') + '_body0.prt', 1, [solid_body_tag_list[0]])# 执行导出操作,导出列表中的第2实体并移除参数result_b = pyuf_export_with_options_prt(the_pyuf_session, 'D:\\' + getNowLocalString('\0') + '_body1.prt', 1, [solid_body_tag_list[1]])# 外部模式或内部模式运行标识flag = 'internal'# 外部模式运行,会在命令行中打印,但内部模式运行则无反应,因在UF.UI类中操作,才可在NX/UG界面显示数据if flag == 'external':passelif flag == 'internal':# 由于与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('\npyuf_export_prt result is:{}'.format(result_a))pyuf_ui_instance.WriteListingWindow('\npyuf_export_with_options_prt result is:{}'.format(result_b))# 将信息窗口的内容保存到指定文件中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_import_prt.py。
cmd命令:“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_export_prt.py。
powershell命令:&“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_import_prt.py。
powershell命令:&“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_export_prt.py。
运行结果:同上