Siemens-NXUG二次开发-打开与关闭prt文件[Python UF][20231206]

1.python uf函数

1.1 NXOpen.UF.Part.Open

# 内部和外部模式可用
"""
官方文档翻译:将现有NX part或Solid Edge part检索到会话中,并使其成为工作和显示part。
通过从Solid Edge part中提取Parasolids数据,然后将该数据导入到扩展名为.prt的新NX part中,可以打开Solid Edge部件(.par、.psm、.pwd或.asm文件扩展名)。
新NX part的文件名具有Solid Edge part名和“.prt”文件扩展名。
如果存在与Solid Edge part同名的现有NX part,则此函数将返回错误。
通过打开Solid Edge part文件创建的NX part文件包含一个或多个未参数化的实体。
可以通过此调用打开其他文件。
以下扩展名有效-.udf、.bkm、.xpk和.jt。
具有以下扩展名的外来文件也可以使用UF_PART_open打开-.igs、.stp、.dxf、.dwg和.model。
返回值:一个元素,0位置元素为打开part的tag(python语言的int类型),1位置元素为NXOpen.UF.Part.LoadStatus类对象
"""
def NXOpen.UF.Part.Open(self, part_name)

1.2 NXOpen.UF.Part.LoadStatus

# 内部和外部模式可用
类:NXOpen.UF.Part.LoadStatus(在NXOpen C API中是struct UF_PART_load_status_s)
对象方法:
# 如果加载失败并回滚,则为True
def NXOpen.UF.Part.LoadStatus.Failed(sel)	
def NXOpen.UF.Part.LoadStatus.Failed(self, value)

# (len:n_parts,free:UF_free_string_array)分配的文件名数组
def NXOpen.UF.Part.LoadStatus.FileNames(self)	
def NXOpen.UF.Part.LoadStatus.FileNames(self, value)

# 以下两个已分配数组的长度。加载时出现错误或警告的part数目,这是file_names和status数组中的元素个数(范围)。
def NXOpen.UF.Part.LoadStatus.NParts(self)	
def NXOpen.UF.Part.LoadStatus.NParts(self, value)

# (len:n_parts)为每个文件名分配的相关状态代码数组。对数组中的每个状态代码使用UF_get_fail_message来获取关联的消息字符串,必须释放已分配的数组
def NXOpen.UF.Part.LoadStatus.Statuses(self)	
def NXOpen.UF.Part.LoadStatus.Statuses(self, value)	

# 如果唯一的“失败”是用户中止,则为True	
def NXOpen.UF.Part.LoadStatus.UserAbort(self)	
def NXOpen.UF.Part.LoadStatus.UserAbort(self, value)	

1.3 NXOpen.UF.Part.Close

# 内部和外部模式可用
"""
官方文档翻译:关闭部件树中选定的零件以及它下面的所有零件(可选)。如果您在内部模式下运行此程序,系统会显示一个确认窗口,询问您是否应该关闭修改后的part。如果在外部模式下运行此程序,系统会认为该part应该关闭。
使用UF_part_close关闭part不会删除NX中的撤消标记。因此,如果使用此函数,可能会消耗大量内存。要释放此内存,请在调用UF_PART_close之后调用UF_UNDO_delete_all_marks。
scope指定要关闭的多少part:
0=仅指定部分;
1=part和所有子组件。
mode:
0=询问是否修改了零件(仅限内部,外部假设回答“是,删除”);
1=卸载part,即使已修改
2=仅在未修改的情况下卸载part
"""
def NXOpen.UF.Part.Close(self, part_tag, scope, mode)

1.4 NXOpen.UF.Part.AskUnits

# 内部和外部模式可用
"""
官方文档翻译:返回一个值,该值指示part的单位是英制还是公制。
返回值:
(NXOpen C API宏定义值)UF_PART_METRIC(NXOpen Python UF API:NXOpen.UF.UFConstants.UF_PART_METRIC);
(NXOpen C API宏定义值)UF_PART_ENGLISH(NXOpen Python UF API:NXOpen.UF.UFConstants.UF_PART_ENGLISH)。
"""
def NXOpen.UF.Part.AskUnits(self, part_tag)	

1.5 NXOpen.PartCollection.OpenBaseDisplay(filename)

# 内部和外部模式可用
"""
注意:这是NXOpen Python API本身的写法,不是使用NXOPen Python UF API包装的(UFUN)写法
官方文档翻译:打开现有零件并将此零件设置为活动显示零件。
这相当于具有选项NXOpen::DisplayPartOptionReplaceExisting的OpenActiveDisplay。
此方法将按照以下方式加载组件,具体取决于NXOpen::LoadOptions::ComponentsToLoad属性的设置方式:
1) “所有组件”(NXOpen::LoadOptions::LoadComponentsAll)将加载程序集的所有组件。
2) “上次使用的组件集”(NXOpen::LoadOptions::LoadComponentsLastSet)将加载上次保存的组件集中的组件。
返回值:一个元组((<NXOpen.Part object at 0x00000180F13DDCC0>, <NXOpen.PartLoadStatus object at 0x00000180F0F3DC70>)),0位置是打开的prt文件python语言对象实例,1-位置是打开状态信息类对象
"""
def NXOpen.PartCollection.OpenBaseDisplay(filename)	

2.示例代码

import NXOpen
import NXOpen.UF as UF

def get_uf_session():
    # 获取当前NXOpen Python UF会话
    return UF.UFSession.GetUFSession()

def get_py_session():
    # 获取当前NXOpen Python会话
    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 pyuf_get_prt_units(the_pyuf_session, part_tag):
    """
    功能:查询某prt的单位制
    """
    # 由于要对Part进行操作,因此需要获取Part实例对象
    pyuf_part_instance = the_pyuf_session.Part

    # AskUnits方法位于Part类对象中
    return pyuf_part_instance.AskUnits(part_tag)
    

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:\\temp_dividing_board.prt'
    
    # 打开D盘根目录下的示例.prt文件,并成为工作prt(work part)
    # 如果是在内部模式运行,则会在NX/UG界面打开一个名为pyuf_open_prt_test.prt的文件窗口
    # 如果是外部模式运行,则运行时不会有启动ug界面
    #open_prt_file_data = pyuf_open_prt(the_pyuf_session, open_prt_file_name)
    #open_prt_file_uf_tag = open_prt_file_data[0]

    
    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)

    # 查询prt的单位制
    unit_type = pyuf_get_prt_units(the_pyuf_session, open_prt_file_uf_tag)
    prt_unit_string = ""
    if unit_type == UF.UFConstants.UF_PART_METRIC:
        prt_unit_string = "metric"
    elif unit_type == UF.UFConstants.UF_PART_ENGLISH:
        prt_unit_string = "english"
    
    # 外部模式运行,会在命令行中打印,但内部模式运行则无反应,因在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))
    pyuf_ui_instance.WriteListingWindow('\nunit_type type is:{}'.format(type(unit_type)))
    pyuf_ui_instance.WriteListingWindow('\nunit_type is:{}'.format(unit_type))
    pyuf_ui_instance.WriteListingWindow('\nprt_unit_string is:{}'.format(prt_unit_string))

    # 将信息窗口的内容保存到指定文件中
    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_open_prt.py
powershell命令:&“D:\Siemens\NX 12.0\NXBIN\run_journal.exe” pyuf_open_prt.py

1.运行结果(内存访问违例,不知道为什!!!):
在这里插入图片描述
2.改进后使用Python Session中的打开.prt文件的函数成功打开,注意打开后返回的是python对象,要调用Tag转换为UF的tag值(是python int类型)
在这里插入图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值