NXOpen 12.0 代理模块
搜索引擎看过来(NXOpen Python API Pycharm Eclipse Anaconda Spyder 安装 配置 设置 代理)
NXOpen 12.0 Python 代理模块
NXOpen 12.0 代理模块的截图如下,下载地址
实际使用效果如下:
代理模块的生成方法
需要用2个脚本文件处理:
- checkNXOpenInfo.py,此脚本文件需要在NX12中运行(Alt+F11, 菜单–>工具–>操作记录–>编辑–>打开–>运行),在 dataDir 参数指定的目录生成 journal1_xxxx.txt
- 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]: # class 型
if '>' 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: # object 型
if ' 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')