Siemens-NXUG二次开发-导入与导出(可移除参数)prt文件[Python UF][20240121]

发布时间:2024年01月21日

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

运行结果:同上

文章来源:https://blog.csdn.net/weixin_54698498/article/details/135036915
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。