BOM 明细表
一句话
从装配体读组件清单,同一零件合并计数,材料直接从组件读,不用逐个打开零件。
命令
swforge bom # 当前打开的装配
swforge bom 总装.SLDASM # 指定文件
swforge bom 总装.SLDASM --csv bom.csv
输出:
装配:G:\proj\总装.SLDASM
种类 3 项,共计 5 件
| 序号 | 名称 | 数量 | 材料 |
|---:|---|---:|---|
| 1 | 底板 | 1 | Q235 |
| 2 | 立柱 | 2 | Q235 |
| 3 | 垫片 | 2 | 未指定 |
⚠ 这些零件没有材料:垫片
材料缺失时 SolidWorks 默认密度是 1000 kg/m³(水),质量会错约 7.85 倍。
missing_material 非空就该先补材料。
代码调用
from swforge import collect_bom, bom_to_csv
r = collect_bom("总装.SLDASM")
print(r["distinct_parts"], r["total_items"]) # 3 5
for row in r["rows"]:
print(row["seq"], row["name"], row["qty"], row["material"])
bom_to_csv(r["rows"], "bom.csv")
返回结构:
| 字段 | 含义 |
|---|---|
ok |
是否成功 |
rows |
明细行,每行 {seq, name, qty, material, path} |
distinct_parts |
零件种类数 |
total_items |
总件数(各数量之和) |
missing_material |
没有材料的零件名列表 |
三条必须知道的规则
1. 同一零件合并计数
装 3 个同样的垫片 → 一行「垫片 ×3」,不是三行。
路径比较时忽略大小写(Windows 路径大小写不敏感)。
否则 C:\Parts\Plate.SLDPRT 和 c:\parts\plate.SLDPRT 会被当成两个零件,
BOM 直接翻倍。
2. 压缩件默认不算,但可以要求算
被压缩的组件图上看不到,列进 BOM 会误导。默认排除。
做「全零件清单」而不是「图上清单」时:
r = collect_bom("总装.SLDASM", include_suppressed=True)
3. 「从明细表排除」永远生效
SolidWorks 允许把某个组件标记成「从明细表排除」(ExcludeFromBOM)。
这是用户的明确意图,无论 include_suppressed 怎么设都不列出来。
材料是怎么读的
IComponent2.GetMaterialUserName() # 优先,返回 Q235 这类用户可见名
IComponent2.GetMaterialIdName() # 退回,返回内部 ID
为什么不逐个打开零件去读?
SolidWorks 默认只允许同时打开 8 个文档。一个 20 个零件的装配, 逐个打开读材料会立刻撞上限,而且每个零件开关一次要几百毫秒。
组件对应的零件在装配打开时就已经加载了,直接问组件即可 —— 零额外开销。
没有材料为什么重要
SolidWorks 的默认密度是 1000 kg/m³,也就是水的密度。
没赋材质时它不会报错,只会让质量算错约 7.85 倍(钢是 7850)。
所以 BOM 里材料缺失不是「留个空格」这么简单:
if r["missing_material"]:
print("先补材料再出图")
group_components 会把缺失材料写成 「未指定」 而不是空字符串 ——
空单元格读起来像「材料就是空的」,而实际后果是质量错了 7.85 倍。
CSV 导出
bom_to_csv(rows, "bom.csv")
带 UTF-8 BOM。不带的话 Excel 打开中文表头是乱码 —— 这是国内用户最先撞上的问题,不是可选项。
列:序号, 名称, 数量, 材料, 路径
把 BOM 表插进工程图
from swforge import insert_bom_table
r = insert_bom_table("总装.SLDDRW", x=0.2, y=0.05, anchor="bottom-left")
print(r)
# {'ok': True, 'rows': 3, 'columns': 5, 'anchor': 'bottom-left'}
用 IView.InsertBomTable6(参数最多的版本,能控制编号方式和是否展开子装配)。
anchor 可选:bottom-left / top-left / top-right / bottom-right。
⚠️ 这一项只完成了一半。
实机验证结果:表格能建出来(返回
rows=3, columns=3, 图纸上确实有 1 个表格注解),但位置不可控 —— 导出 PDF 后表格不在页面上。原因是
TableAnnotation在 pywin32 后期绑定下GetPosition/SetPosition都取不到,位置既读不了也改不了。需要走 C# 早期绑定才能解决。数据提取(
swforge bom命令、CSV 导出)不受此影响,可以正常使用。
限制
| 限制 | 说明 |
|---|---|
| 插表位置不可控 | 表格能建出来但落在图框外,待用 C# 早期绑定解决 |
| 不含重量列 | 需要逐个组件算质量,会显著变慢;后续按需加 |
| 不含标准件标记 | 国标件库还没做 |
| 不处理子装配展开 | 目前只列顶层(swBOMType_TopLevel) |
| 材料名依赖 SolidWorks 返回 | 若返回内部 ID 而非 Q235,需要映射表 |