如何为Inventor中结构化BOM的缩进列表编号?
缩进式BOM层级编号实现方案
核心思路
用层级计数器列表跟踪各层级的当前编号,依托BOM行的正确父子顺序,通过调整计数器列表的长度和数值,生成符合缩进层级的编号(如1, 1.1, 1.2, 2, 2.1...),逻辑简单且效率较高。
具体步骤
- 初始化空的计数器列表,用于存储每个层级的当前编号
- 逐行处理BOM数据:
- 按
|分割每行,提取当前缩进层级(转成整数)、组件路径、父级关联信息 - 根据当前层级调整计数器列表:
- 若当前层级 > 计数器列表长度:进入子层级,向列表末尾添加
1 - 若当前层级 == 计数器列表长度:当前层级的编号加1
- 若当前层级 < 计数器列表长度:截断列表到当前层级的长度,再将最后一个元素加1
- 若当前层级 > 计数器列表长度:进入子层级,向列表末尾添加
- 将计数器列表用
.拼接,得到当前行的层级编号 - 组合编号与组件信息,生成新的条目
- 按
代码示例(Python)
# 模拟Inventor导出的BOM数据,每行格式:缩进层级|组件路径|父级组件 bom_lines = [ "1|MainAssembly.iam|", "2|FramePart.ipt|MainAssembly.iam", "2|SubAssembly.iam|MainAssembly.iam", "3|ScrewPart.ipt|SubAssembly.iam", "3|NutPart.ipt|SubAssembly.iam", "1|OtherAssembly.iam|", "2|CoverPart.ipt|OtherAssembly.iam" ] level_counters = [] numbered_bom = [] for line in bom_lines: parts = line.split('|') current_level = int(parts[0].strip()) component_path = parts[1].strip() parent_component = parts[2].strip() # 调整层级计数器 if current_level > len(level_counters): level_counters.append(1) elif current_level == len(level_counters): level_counters[-1] += 1 else: level_counters = level_counters[:current_level] level_counters[-1] += 1 # 生成格式化编号 item_number = '.'.join(map(str, level_counters)) numbered_bom.append(f"{item_number} | {component_path} | {parent_component}") # 输出结果 for item in numbered_bom: print(item)
方案说明
- 利用列表动态调整匹配缩进层级,无需复杂的字典映射,逻辑清晰且执行高效
- 因为Inventor生成的BOM行顺序已严格遵循父子结构,所以仅靠缩进层级即可完成编号,无需额外校验父级关联
- 若需适配特殊场景(如异常层级跳转),可结合父级组件信息增加校验逻辑,当前方案已覆盖常规BOM编号需求
内容的提问来源于stack exchange,提问作者Check Master
相关产品推荐
相关产品推荐

