BOM是英文Bill of Material的缩写,中文翻译为“物料清单”,也称为产品结构表或产品结构树。它是计算机可以识别的产品结构数据文件,也是ERP的主导文件。BOM使系统识别产品结构,也是联系与沟通企业各项业务的纽带。ERP系统中的BOM的种类主要包括5类:缩排式BOM、汇总的BOM、反查用BOM、成本BOM、计划BOM。采用计算机辅助企业生产管理,首先要使计算机能够读出企业所制造的产品构成和所有要涉及的物料,为了便于计算机识别,必须把用图示表达的产品结构转化成某种数据格式,这种以数据格式来描述产品结构的文件就是物料清单,即是BOM。在某些工业领域,可能称为“配方”、“要素表”或其它名称。
当前打开一个Part文件,其树结构如下:
import win32com.client
import pywintypes # 导入pywintypes模块
# 启动CATIA应用
catia = win32com.client.Dispatch('CATIA.Application')
catia.visible=1
# 连接excel,同catia
excel=win32com.client.Dispatch('excel.application')
excel.visible=True
try:
# 新建一个工作簿,此处add方法不能加括号,a小写
book = excel.workbooks.add
# 获取第一个工作表
sheet = book.sheets(1)
# 重命名工作表
sheet.name = 'BOM'
# 初始化表头
sheet.cells(1, 1).value = '序号'
sheet.cells(1, 2).value = '层级'
sheet.cells(1, 3).value = '零件号'
sheet.cells(1, 4).value = '数量'
sheet.cells(1, 5).value = '实例名'
# 函数,计算数量
def calcnum(prd):
num = 0
for pr in prd.parent:
if pr.partnumber == prd.partnumber:
num += 1
return num
# 函数,读取节点的信息
def readinfo(prd):
global row
pn = prd.partnumber
instname = prd.name
num = (level == 0) and 1 or calcnum(prd)
# 将信息写到Excel中
sheet.cells(row, 1).value = row - 1
sheet.cells(row, 2).value = level
sheet.cells(row, 3).value = pn
sheet.cells(row, 4).value = num
sheet.cells(row, 5).value = instname
row += 1
# 定义遍历函数
def myloop(prds):
global level
# 开始遍历
level += 1
current_pns[level] = []
for prd in prds:
# 多个实例仅读取一次
if not prd.partnumber in current_pns[level]:
# 读取一级子节点信息
readinfo(prd)
current_pns[level].append(prd.partnumber)
# 如果有二级子节点,递归调用自身
if len(prd.products) > 0:
myloop(prd.products)
current_pns[level].clear()
level -= 1
# 初始化对象
rootprd = catia.activedocument.product
current_pns = {}
row = 2
level = 0
# 写入根节点信息
readinfo(rootprd)
# 递归调用根节点的products
myloop(rootprd.products)
except pywintypes.com_error as e:
# 如果出现错误,可能是因为没有活动文档
print("无法获取活动文档,请确保CATIA应用程序中已有打开的文档。")
print(e)
Excel格式BOM如下: