NXOpen 12.0 代理模块

本文详细介绍了如何使用两个Python脚本来生成NXOpen12.0的Python代理模块,包括checkNXOpenInfo.py和genNXOpenAgent.py的使用方法,以及在不同环境下(如Pycharm、Eclipse等)的安装配置步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


搜索引擎看过来(NXOpen Python API Pycharm Eclipse Anaconda Spyder 安装 配置 设置 代理)

NXOpen 12.0 Python 代理模块

NXOpen 12.0 代理模块的截图如下,下载地址
NXOpen 12.0 代理模块
实际使用效果如下:
在这里插入图片描述

代理模块的生成方法

需要用2个脚本文件处理:

  1. checkNXOpenInfo.py,此脚本文件需要在NX12中运行(Alt+F11, 菜单–>工具–>操作记录–>编辑–>打开–>运行),在 dataDir 参数指定的目录生成 journal1_xxxx.txt
  2. genNXOpenAgent.py ,此脚本文件在任意python解释器下运行,读取 journal1_xxxx.txt文件,在agent子目录下创建代理文件。

checkNXOpenInfo.py

# -*- coding:UTF-8 -*-
import NXOpen
import sys,os,logging,re
logging.basicConfig(
    level=logging.DEBUG,
    filename=r'c:\temp.py',
    filemode='w',
    format='%(message)s'
)

dataDir = r'E:\win7admin\desktop\NXOpen_examples\develop'

attrs = []
infos = []

def recursivePrint(object, depth=1, maxdepth=5):
    global attrs
    global infos
    chars = '    '*depth
    if depth <= maxdepth:
        for name in dir(object):
            if name.startswith('_'): continue
            try:
                attr = getattr(object, name)
                if attr not in attrs:
                    attrs.append(attr)
                    # logging.info('%s%s  %s' % (chars,name,type(attr)))
                    infos.append('%s%s  %s' % (chars,name,type(attr)))
                    if type(attr) not in (int, float, str, list, tuple, dict, set):
                        if name != 'Null':   # 与上级相同
                            recursivePrint(attr, depth+1)
            except:
                pass
        
def writeNXOpenInfo1():
    """
    探索步骤1:
        help(NXOpen)
    结论1:
        NXOpen 有详细的说明文档
    """
    out = sys.stdout
    with open(os.path.join(dataDir,'journal1_NXOpen.txt'), 'w') as fp:
        sys.stdout = fp
        help(NXOpen)
    for name in dir(NXOpen):
        if name.startswith('_'): continue
        attr = getattr(NXOpen, name)
        if str(type(attr)).split("'")[1] == 'module':
            with open(os.path.join(dataDir,'journal1_%s.txt' % name), 'w') as fp:
                sys.stdout = fp
                help(attr)
        
    sys.stdout = out

def writeNXOpenInfo2():
    """
    探索步骤2:
        dir(NXOpen) 检查所有属性的类型,
        attr = getattr(NXOpen, name)
        type(attr) 均为 <class 'type'>
    结论1:
        所有非_开头的属性均为类,都可以用类代理
    """
    out = sys.stdout
    with open(os.path.join(dataDir,'journal2.txt'), 'w') as fp:
        sys.stdout = fp
        for name in dir(NXOpen):
            if name.startswith('_'): continue
            attr = getattr(NXOpen, name)
            print('**%-60s\t%s\t%s' % (name, type(attr), attr.__doc__))
        
        sys.stdout = out

def writeNXOpenInfo3():
    """
    探索步骤3:
        检查所有属性的属性 _ 开头除外
    结论3:
        类型较多,有重复
    """
    recursivePrint(NXOpen,0,5)
    with open(os.path.join(dataDir,'journal3.txt'), 'w') as fp:
        fp.write('\n'.join(infos))

def main():

    theSession  = NXOpen.Session.GetSession()
    # theUI = NXOpen.UI.GetUI()

    # Insert code here
    workPart = theSession.Parts.Work
    info = theSession.ListingWindow
    
    info.CloseWindow()
    info.Open()
    
    writeNXOpenInfo1()
    # writeNXOpenInfo2()
    # writeNXOpenInfo3()
    # info.WriteLine("%s" % (NXOpen.Session.GetSession.__doc__))

    info.WriteLine("Done!")
    
if __name__ == '__main__':
    main()


genNXOpenAgent.py

# -*- coding:gbk -*-
import os,re

with open('journal1_NXOpen.txt','r') as fp:
    lst = []
    isObject = False
    for i in fp.readlines():
        if isObject:
            if i.strip():  #valid
                lst.append(i.strip())
            else:
                break
        if i.rstrip() == '    builtins.object':
            isObject = True
    NXOpenTypeList = lst

def clear_type_dot(instr):
    lst = [
        'NXOpen',
        'Annotations',
        'CAE',
        'Display',
        'Drafting',
        'Features',
        'Fields',
        'Gateway',
        'GeometricUtilities',
        'Issue',
        'Report',
        'builtins'
        ]
    for l in lst:
        instr = instr.replace(l+'.', '')
    return instr


def getClassBlock(fp):
    """
    起始行:"    class ASCImporter(Builder)"
    中间行:"     |"
    终止行:"    "

    特殊行:
    "     |  Method resolution order:",
    "     |  Methods defined here:",
    "     |  ----------------------------------------------------------------------",
    "     |  Data descriptors defined here:",
    "     |  Data and other attributes defined here:",
    "     |  Data and other attributes inherited from xxxx:",
    "     |  Data descriptors inherited from xxxxx:",
    终止:"     |  "



    :param fp:
    :type fp: file
    :return:
    :rtype: list[str]
    """
    specialLines = [
        "|  Method resolution order:",
        "|  Methods defined here:",
        "|  ----------------------------------------------------------------------",
        "|  Data descriptors defined here:",
        "|  Data and other attributes defined here:",
        "|  Data and other attributes inherited from",
        "|  Data descriptors inherited from",
    ]
    def isSpecial(line):
        rst = False
        for d in specialLines:
            if d in line:
                rst = True
                break
        return rst

    def getBlock():  # 类块
        sline = fp.readline().strip()
        dat = []
        while sline:
            dat.append(sline)
            sline = fp.readline().strip()
        return dat

    def isMethodDecalrationLine(line):  # 声明行  "|  ApplicationSwitchImmediate(...)"
        if len(line) > 4 and (line[4].isalpha() or line[4] == '_'):
            return True
        else:
            return False
    def getMethodBlock(): # 方法块
        tzstr = '|  Methods defined here:'  # 特征字符串
        lst = []
        if tzstr in datalist:  # 不要继承的方法,只留基本方法
            id_ini = datalist.index(tzstr)+2
            id_end = len(datalist)
            for i in range(id_ini, len(datalist)):
                if isSpecial(datalist[i]):
                    id_end = i
                    break
            totalblock = datalist[id_ini:id_end]  # 类的所有方法

            methodblocks = []
            i = 0
            while i<len(totalblock):
                tlst = [totalblock[i]]
                i = i+1
                while i<len(totalblock):
                    line = totalblock[i]
                    if not isMethodDecalrationLine(line):  # 声明行  "|  ApplicationSwitchImmediate(...)"
                        tlst.append(line)
                        i = i + 1
                    else:
                        break
                methodblocks.append(tlst)
            return methodblocks
        else:
            return []

    def beutifyMethodBlocks(methodBlocks):  # 清理前缀,清理内置方法,方法参数替换,明确参数类型,返回值类型
        rst = []
        for mblock in methodBlocks:
            if mblock[0][3] == '_':  # 清理内置方法
                continue
            methodName = re.match('\|  (\w+)\(', mblock[0]).groups()[0]

            nblock = []

            # 基本文档信息
            docs = []
            if len(mblock) >= 3:
                docs.append('        """' + mblock[1][1:].strip()+'\n')  # 捕获第一行
            else:
                docs.append('        """N/A"""')  # 无帮助内容

            # 方法参数替换
            params = 'self, *args, **kwargs'
            for li in mblock:
                if ('Signature ``%s' % methodName) in li:
                    r = re.search('\((.+)\)', li)
                    if r:
                        params = r.groups()[0]
                        params = 'self, ' + clear_type_dot(params)
                        if 'from' in params: params = params.replace('from', 'from_')
                        # 多参数,补充参数类型
                        max_type_len = len(params.split(','))-1
                        tcnt = 0
                        for ti in mblock:
                            if ':type ' in ti:
                                tcnt+=1
                                if tcnt<= max_type_len:
                                    docs.append(clear_type_dot(ti[1:].strip().replace(':py:class:`','').replace('`','')))
                                else:
                                    break
                    else:
                        params = 'self'
                    break

            returns = '        return self' # 返回值
            # 补充返回值类型
            for li in mblock:
                if ':rtype:' in li:
                    typline = li[1:].strip().replace(':py:class:`','').replace('`','')
                    typ = clear_type_dot(typline.split(':')[-1].strip())
                    if ' ' in typ:
                        break
                    else:
                        docs.append(clear_type_dot(typline)+'"""')
                        returns = '        return %s()' % clear_type_dot(typline.split(':')[-1])
                        break

            if not docs[-1].endswith('"""'): docs[-1]+= '        """'

            nblock.append('    def %s(%s):' % (methodName, params))  # 定义行
            nblock.append('\n        '.join(docs))  # 文档
            nblock.append(returns)  # 返回值


            rst.append(nblock)
        return rst

    def getDataDescriptorsBlock(): # data descriptors
        tzstr = '|  Data descriptors defined here:'  # 特征字符串
        lst = []
        if tzstr in datalist:  #
            id_ini = datalist.index(tzstr)+2
            id_end = len(datalist)
            for i in range(id_ini, len(datalist)):
                if isSpecial(datalist[i]):
                    id_end = i
                    break
            totalblock = datalist[id_ini:id_end]  # 类的所有 data descriptors

            methodblocks = []
            i = 0
            while i<len(totalblock):
                tlst = [totalblock[i]]
                i = i+1
                while i<len(totalblock):
                    line = totalblock[i]
                    if not isMethodDecalrationLine(line):  # 声明行  "|  AfuManager"
                        tlst.append(line)
                        i = i + 1
                    else:
                        break
                methodblocks.append(tlst)
            return methodblocks
        else:
            return []

    def beutifyDataDescriptorsBlocks(methodBlocks):  # 返回值类型
        rst = []
        for mblock in methodBlocks:
            methodName = mblock[0][3:]
            # 补充返回值类型
            typ_ = 'str'
            for li in mblock:
                if ':rtype:' in li:
                    typline = clear_type_dot(li[1:].strip().replace(':py:class:`','').replace('`',''))
                    typ = typline.split(':')[-1].strip()
                    if ' ' in typ:
                        break
                    else:
                        typ_ = typ
                        break
            rst.append('        self.%s=%s()' % (methodName, typ_))
        return rst

    def getDataOtherAttributesBlock(): # |  Data and other attributes defined here:
        tzstr = '|  Data and other attributes defined here:'  # 特征字符串
        lst = []
        if tzstr in datalist:  #
            id_ini = datalist.index(tzstr)+2
            id_end = len(datalist)
            for i in range(id_ini, len(datalist)):
                if isSpecial(datalist[i]):
                    id_end = i
                    break
            totalblock = datalist[id_ini:id_end]  # 类的所有  Data and other attributes

            methodblocks = []
            i = 0
            while i<len(totalblock):
                tlst = [totalblock[i]]
                i = i+1
                while i<len(totalblock):
                    line = totalblock[i]
                    if not isMethodDecalrationLine(line):  # 声明行  "|  AfuManager"
                        tlst.append(line)
                        i = i + 1
                    else:
                        break
                methodblocks.append(tlst)
            return methodblocks
        else:
            return []

    def beutifyDataOtherAttributesBlocks(methodBlocks):  # 返回值类型
        # |  FaceAnalysis = <NXOpen.ViewRenderingStyleTypeMemberType object>
        # |  ShadedWithBodyColorEdges = <NXOpen.ViewRenderingStyleTypeMemberType ob...

        # |  Axis = <class 'NXOpen.WCSAxis'>
        # |  ProjectAssignmentObjectType = <class 'NXOpen.SessionProjectAssignmentO...

        # |  Null = <NXOpen.ASCImporter object>
        rst = []
        for mblock in methodBlocks:
            methodName = re.search('(\w+)',mblock[0]).groups()[0]
            if methodName == 'Null':
                rst.append('        self.Null = self')
                continue
            if 'class' in mblock[0]:  # classif '>' in mblock[0]:  # 完整定义型
                    t = re.search("<class '(.+)'", mblock[0]).groups()[0]
                    t = clear_type_dot(t)
                    rst.append('        self.%s=%s()' % (methodName, t))
                else:  # 残废型
                    t = re.search("<class '(.+)\.\.\.", mblock[0]).groups()[0]
                    t = clear_type_dot(t)
                    t_ = 'str'
                    for i in NXOpenTypeList:
                        if i.startswith(t):
                            t_ = i
                            break
                    rst.append('        self.%s=%s()' % (methodName, t_))
            else:  # objectif ' obj' in mblock[0]:  # 完整定义型
                    t = re.search("<(.+) obj", mblock[0]).groups()[0]
                    t = clear_type_dot(t)
                    rst.append('        self.%s=%s()' % (methodName, t))
                else:  # 残废型
                    t = re.search("<(.+)\.\.\.", mblock[0]).groups()[0]
                    t = clear_type_dot(t)
                    if ' ' in t:
                        t_ = t.split(' ')[0]
                    else:
                        t_ = 'str'
                        for i in NXOpenTypeList:
                            if i.startswith(t):
                                t_ = i
                                break
                    rst.append('        self.%s=%s()' % (methodName, t_))

        return rst

    # 获取类定义块列表
    datalist = getBlock()

    # 类头
    class_definition = datalist[0]+':'
    class_definition = clear_type_dot(class_definition)

    # 类 __doc__ (初始化用__init__)
    tmp = datalist[1].lstrip('|').strip()
    class_document = '' if isSpecial(tmp) else tmp

    # 方法
    methodblocks = beutifyMethodBlocks(getMethodBlock())

    # data descritors
    dataDescList = beutifyDataDescriptorsBlocks(getDataDescriptorsBlock())

    # data other attributes
    dataOtherAttrilist = beutifyDataOtherAttributesBlocks(getDataOtherAttributesBlock())

    return [class_definition, class_document, methodblocks, dataDescList+dataOtherAttrilist]


def writeModule(inpModeName, outModName):
    dats = []
    with open(inpModeName,'r') as fp:
        pos = fp.tell()
        line = fp.readline()
        while (line):
            if line.startswith('    class'):
                fp.seek(pos)
                dats.append(getClassBlock(fp))
            pos = fp.tell()
            line = fp.readline()
    
    if not os.path.exists('agent'): os.mkdir('agent')
    with open(os.path.join('agent',outModName),'w') as fp:
        if 'NXOpen' in inpModeName:
            lst = [
                'import Annotations',
                'import CAE',
                'import Display',
                'import Drafting',
                'import Features',
                'import Fields',
                'import Gateway',
                'import GeometricUtilities',
                'import Issue',
                'import Report',
                ]
            fp.write('\n'.join(lst))
            fp.write('\n'*2)

        for classname, classdoc, methodblocks,attrlist in dats:
            fp.write('%s\n    """%s"""\n' % (classname, classdoc,))
            # fp.write('    "%d"\n' % (len(methodblocks),))
            fp.write('    def __init__(self, *args, **kwargs):\n')
            fp.write('        """%s"""\n' % classdoc)
            fp.write('\n'.join(attrlist))
            fp.write('\n\n')
            for i in methodblocks:
                fp.write('%s\n' % i[0])
                fp.write('%s\n' % i[1])
                fp.write('%s\n' % i[2])


if __name__ == '__main__':
    # writeModule('help_test_input.txt', 'tmp.txt')
    import glob
    for name in glob.glob('journal1_*.txt'):
        writeModule(name, name[9:-3]+'py')
### 回答1: NXOpen是一种用于开发Siemens NX软件的编程接口,可以通过它来扩展和自定义NX软件的功能。它是一种强大的工具,可用于创建自定义的插件、宏和工具,提高工作效率和自动化任务。 NXOpen 12.0是最新版本的NXOpen,它包含了许多新的功能和改进。其中一些功能包括增强的API文档和示例、改进的功能库和命令集,以及更好的性能和稳定性。 NXOpen 12.0的官方帮助是一个详细而全面的参考手册,可以帮助开发人员快速了解和使用NXOpen的各个方面。它提供了详细的说明、示例代码和操作步骤,涵盖了NXOpen的各个模块和功能,包括几何建模、组件管理、装配、绘图、表达式、曲面设计等。 通过官方帮助,开发人员可以学习如何创建自定义命令、操作对象、进行几何操作等。它还提供了其他有用的信息,如常见问题解答、最佳实践和调试技巧。 总之,NXOpen 12.0的官方帮助是一个重要的资源,帮助开发人员充分利用NXOpen的功能,提高他们的工作效率和灵活性。无论是初学者还是经验丰富的开发人员,都可以从官方帮助中获得有价值的信息和指导。 ### 回答2: nxopen 12.0是Siemens PLM Software公司推出的一款功能强大的产品开发平台。它提供了各种工具和API,使用户能够自定义和扩展NX软件的功能。 官方帮助是指由Siemens PLM Software官方提供的关于nxopen 12.0的详细文档和教程资源。这些官方帮助包含了大量的示例代码、使用说明和解决方案,帮助用户更好地理解和使用nxopen 12.0。 官方帮助的主要内容包括以下几个方面: 1. 入门指南:介绍了nxopen 12.0的基本概念、工作流程和常用功能,适合初学者快速上手。 2. API文档:提供了完整的API参考手册,包括类、方法和属性的详细说明,帮助用户了解nxopen 12.0提供的各种功能和接口。 3. 示例代码:提供了一系列实用的示例代码,覆盖了不同领域和应用场景,用户可以通过学习和修改这些示例代码,快速实现自己的需求。 4. 教程和案例:通过实际案例和教程,向用户展示了nxopen 12.0在实际工程项目中的应用,帮助用户更好地理解和掌握nxopen 12.0的使用技巧。 总而言之,nxopen 12.0官方帮助是学习和使用nxopen 12.0不可或缺的重要资源,它为用户提供了详细的文档、教程和示例代码,帮助用户更好地使用和扩展nxopen 12.0的功能。通过官方帮助,用户可以更高效地开发和使用nxopen 12.0,提升工作效率和产品质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值