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_mode
view_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 UF
import datetime
def 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.Obj
return 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.Mtx3
importPartModes = 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']
# 初始化坐标系mtx
mtx3 = pyuf_mtx3_instance.Initialize(dest_csys[0:3], dest_csys[3:])
# 被导入的prt文件会以gruop的形式导入得到组tag,而非特征或体tag
return pyuf_part_instance.Import(file_name, importPartModes, mtx3[0:6], dest_point, scale)
if __name__ == '__main__':
# 获取uf session
the_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')
# 执行导入操作,获取组tag
import_prt_group_tag = pyuf_import_prt(the_pyuf_session, import_prt_file_name)
pyuf_save_prt(the_pyuf_session)
# 从组tag中获取实体成员tag
solid_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是0
if 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 UF
import datetime
def 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.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 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.Part
export_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 session
the_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':
pass
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('\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。
运行结果:同上