news 2026/9/18 22:11:24

用Altium Designer生成交互式BOM:三种方案与工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Altium Designer生成交互式BOM:三种方案与工程实践

1. 交互式BOM是什么,它到底解决了什么问题

做PCB设计到现在快十年,最让我烦躁的除了改版,就是交BOM表。早年间给产线、给采购、给贴片厂发BOM,打开Excel从头翻到尾,对方还是要反复打电话问“R12在板子哪个位置”“这个电容封装是不是0402”。一张张静态表格既看不到元件长在哪,也查不了位号对应的实物位置,尤其在评审和试产阶段,效率低到让人抓狂。

后来接触到交互式BOM,也就是大家常说的智能交互式BOM(Interactive BOM,简称iBOM),才意识到这件事完全可以换一种玩法。所谓交互式BOM,是把元件明细表和PCB几何位置结合起来:左边是能搜索、排序、筛选的元件表格,右边是带坐标缩放的PCB板图,点表格里的任意一行,板图上对应元件立刻高亮;反过来点板图上的元件,表格也会跳到对应记录。有的方案还支持按封装、按面层、按供应商过滤,最终导出一份HTML文件,浏览器打开就能用,不需要安装任何EDA软件。

这篇内容就是围绕“用Altium Designer(AD)生成智能交互式BOM”的几种落地方法展开。适合三类人看:第一类是经常需要给生产、采购、硬件评审发BOM的PCB工程师;第二类是负责DFM可制造性检查的同事;第三类是搞小批量试产、希望减少沟通成本的硬件创业团队。不需要你有脚本基础,但如果你会一点Python,第二种方案的玩法会更多。

1.1 静态BOM的三个痛点,几乎是行业通病

先别急着上方案,有必要把问题拆清楚。我在几个不同规模的公司都待过,BOM交付形态各不相同,但痛点高度一致。

一是元件位置对不上。Excel里写“C1 100nF 0603”,但C1贴在哪、旁边是什么网络,完全看不出来。产线领料、手贴样板、维修找料时,只能对着PCB实物一个个找丝印。板子稍微密一点,找个电阻能找五分钟,纯靠眼神。

二是评审沟通成本高。硬件评审时,大家围着一块板子,手里拿着一张按位号排序的表,想看某个区域有哪些元件,得来回对照原理图和PCB。板子一复杂,十分钟都说不清一块供电区域覆盖了哪些料。

三是版本和变更容易乱。同一块板有多个版本,BOM文件名、日期、差异说明全靠口口相传,稍不注意就用了旧表。交互式BOM把“元件清单+板图”绑定到一个文件里,哪个版本一眼可辨,减少了不少扯皮。我自己就吃过一次亏,用旧BOM买的料有几颗封装不对,最后全部重新下单,交期白等一周。

1.2 交互式BOM的核心能力,不只是“能点”

网上很多人把交互式BOM理解成“网页版Excel”,这个理解太浅了。它真正的价值是双链路联动。

第一,表格和板图联动。这在查位号时特别省事。比如供应商反馈“L5封装焊盘偏小”,你在表格里搜L5,板图瞬间定位到对应电感,还能看清它周围有没有大铜皮、禁布区,当场就能判断是设计问题还是来料问题。

第二,灵活过滤与统计。按顶层/底层过滤,能快速估算单面元件数量;按封装过滤,能看清哪些元件需要换封装;按供应商字段过滤,能对照替代料覆盖是否完整。这些都是Excel透视表很难直观做到的事,尤其当BOM有两三百行的时候,差距非常明显。

第三,交付零门槛。离线HTML方案生成的是一个自包含的.html文件,对方电脑上只要有浏览器就能打开。你不用关心对方装没装AD、有没有许可证、会不会操作,这点在跨公司协作时尤其重要。发文件比发链接省事,链接还得担心权限过期,文件发出去就是一份快照。

基于这三种能力,后面三个方案我会按“云服务、离线脚本、AD生态内配置”三条路线展开,你可以根据团队情况直接选,不需要三个都搭。

2. 方案一:Altium 365云服务,配置好项目就能在线看iBOM

如果你用的是较新的AD版本,并且团队能用Altium 365工作区,这其实是最省事的一条路。Altium 365的网页端Viewer自带一套交互式BOM面板,不需要自己写脚本,也不需要维护HTML模板。

2.1 前置条件:把项目同步到工作区

这个方案的前提是你的工程文件不是散落在本地的孤儿工程,而是与Altium 365工作区关联过。通常在AD中通过“Project → Save to Server”,或者在Altium 365 Workspace里直接打开工程,项目进入云端后会生成可分享的版本快照。

这里有个容易踩的坑:很多老工程师习惯用OutJob把文件输出到本地同步盘,以为存到网盘就等于“上云”。Altium 365看的是工作区里的项目对象,不是单纯的磁盘文件。如果工作区关联没问题,Projects面板里项目名旁边会显示同步状态;确认状态正常再往下走。

另外要提醒一句,AD版本太老的话,和365工作区的协作能力会打折。我建议至少用AD 20以后的版本,越新的版本,Web Viewer的BOM联动越顺畅。这个方案在第一次同步时可能比较慢,尤其是原理图库里嵌入了大量封装和3D模型,全量上传要花几分钟,别误以为卡死了。

2.2 分享和查看iBOM的操作路径

项目发布到工作区后,在浏览器里打开对应的项目详情页,进入Web Viewer视图。页面上一般会有元件列表区域,展开BOM面板后,能看到按位号、值、封装、供应商组织出来的表格。点击表格任意元件,右侧或下方的PCB渲染图会同步高亮该元件的位置;反过来点板图上的元件,表格也会滚到对应行。

如果说得更细一点,在Web Viewer里还能做不少和本地工程不太一样的操作:比如按网络高亮、按元件类过滤、查看属性变更记录等。对于需要给不在同一个网段的同事、供应商发链接的场景,这个方案比发文件更可控,因为权限可以随时回收,链接也可以设置有效期。

我试过把某块测试板的iBOM链接直接发给产线工程师,对方在手机浏览器上打开,搜位号查位置,全程没有让我重新解释过任何一条记录。这个体验确实比发Excel好太多,尤其适合产线或者工厂端需要快速确认元件的场景。

2.3 云方案的短板,用之前要想清楚

云方案最大的问题其实不在技术,而在管理和合规。有些公司对设计数据出网有严格限制,或者客户要求PCB原文件不能上传到第三方服务器,那么哪怕Altium 365再好用也只能放弃。之前同事所在的军品供应商就有类似规定,所有设计文件只允许在内网流转,遇到这种情况,云方案直接出局。

其次是灵活性。Web Viewer里的BOM面板展示格式是固定的,你想加一列“成本归属地”或者“替代料状态”,得回AD里调整项目属性再同步,没有本地HTML那种想怎么改就怎么改的自由度。

再有就是账号成本。团队里有人只负责评审、不画板,如果需要给他们开工作区账号,也是一笔开销。个人开发者或小团队如果项目不多,用免费额度凑合一下可以,长期频繁使用还是得算账。

综合来看,Altium 365适合“团队已经在用工作区、跨地域协作需求多、对数据出网没有硬性限制”的情况。如果你的场景恰好相反,建议直接跳到下面的离线方案,那个方案完全不依赖外网。

3. 方案二:BOM+坐标文件,用Python生成离线交互式HTML

这是我最推荐个人作者、小团队以及公司内部优先尝试的方案。它的思路不依赖任何云服务,也不要求别人装AD,只要能从AD导出两种文件,就能在本地生成一份可以在任意浏览器打开的交互式BOM。

3.1 核心原理:Pick-and-Place坐标是iBOM的地基

为什么需要坐标文件?因为交互式BOM的“板图”本质上是一个可点击的坐标地图。AD自带的Pick and Place输出(也叫贴片机坐标文件)记录了每个元件的位号、封装、中点坐标、旋转角度、所在面层等信息。BOM文件则记录元件级联的属性。两者以位号(Designator)为关联键合并后,就同时拥有了“属性表”和“位置表”。

打个比方,普通BOM就是一本没有目录的菜谱,只有原料清单;坐标文件则是厨房的布局图,告诉你每种原料放在哪个位置。交互式BOM把菜谱和布局图钉在同一块板上,找东西自然快。

关键点在于,AD里导出BOM和导出坐标文件时,位号的格式必须一致。比如BOM里如果按“C1, C2”合并成了一个单元格,脚本就要能正确拆分;如果坐标文件里某些元件带“_1”后缀(别问,问就是遇到过),也要提前清洗。这些细节我在第5部分详细讲,先按步骤把流程走通。

3.2 从AD导出两份关键文件:BOM与Pick-and-Place

先导出BOM。AD菜单路径基本上是“Reports → Bill of Materials”,中文版叫“报表 → 元件清单”,各版本翻译略有差异。在弹出的对话框里,建议勾选并保持以下列:Designator、Footprint、Comment、Quantity、Manufacturer Part Number、Supplier 1。导出格式选CSV,编码如果可选手动选UTF-8。需要注意,CSV导出时有些版本默认用系统区域设置,可能导致列分隔符不是逗号,后面解析会踩坑,我习惯在导出设置里强制指定逗号分隔。

再导出坐标文件。路径一般是“File → Assembly Outputs → Generates Pick and Place Files”,部分版本在“Fabrication Outputs”下。设置里格式选CSV或Text,单位选Metric(毫米),注意勾选“只输出贴装元件”,不要混入测试点、工具孔之类的东西。生成后的文件通常在工程目录的Output文件夹下,文件名类似“板名-PickAndPlace.txt”或带Top/Bottom后缀。

两份文件都有了,我们的目标就明确了:写一个脚本,读取BOM的CSV和坐标文件的CSV,把同一个位号对应的属性与位置合并,最后输出一个自包含的HTML。整个过程中AD只负责导出数据,剩下的交给脚本,脱离AD环境也能重复使用。

3.3 Python脚本:解析、合并、生成HTML

直接贴一个能跑通的完整版,我每周给同事发板前就是跑这个脚本。代码不长,逻辑也不复杂,但“表格搜索、表格与板图联动高亮、按层区分颜色”这几个核心功能都是齐的。

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ bom_to_ibom.py 把AD导出的BOM CSV和Pick-and-Place CSV合并,生成交互式HTML。 用法: python bom_to_ibom.py <bom.csv> <pnp.csv> [-o output.html] """ import csv import re import html import argparse import webbrowser def read_csv(path): with open(path, encoding='utf-8-sig') as f: return list(csv.DictReader(f)) def split_designators(text): return [d.strip() for d in re.split(r'[,;\s]+', text.strip()) if d.strip()] def to_float(value): try: return float(str(value).replace('mm', '').replace('mil', '').strip()) except ValueError: return 0.0 def main(): parser = argparse.ArgumentParser() parser.add_argument('bom') parser.add_argument('pnp') parser.add_argument('-o', '--output', default='ibom.html') args = parser.parse_args() bom_rows = [] for raw in read_csv(args.bom): des_list = split_designators(raw.get('Designator', '')) if not des_list: continue bom_rows.append({ 'designators': des_list, 'comment': raw.get('Comment') or raw.get('Value') or '', 'footprint': raw.get('Footprint') or '', 'mpn': raw.get('Manufacturer Part Number') or '', }) comps = {} for raw in read_csv(args.pnp): des = raw.get('Designator', '').strip() if des and des not in comps: comps[des] = { 'x': to_float(raw.get('Mid X')), 'y': to_float(raw.get('Mid Y')), 'layer': raw.get('Layer', 'Top Layer'), 'rotation': raw.get('Rotation', '0'), } if not comps: print('没有解析到任何坐标数据,请检查Pick-and-Place文件。') return xs = [c['x'] for c in comps.values()] ys = [c['y'] for c in comps.values()] min_x, max_x = min(xs) - 10, max(xs) + 10 min_y, max_y = min(ys) - 10, max(ys) + 10 scale = min(800 / (max_x - min_x), 500 / (max_y - min_y)) def px(x): return round((x - min_x) * scale + 20, 1) def py(y): return round((max_y - y) * scale + 20, 1) circles = [] rows_html = [] for row in bom_rows: for des in row['designators']: comp = comps.get(des) if not comp: continue is_bottom = 'bottom' in comp['layer'].lower() color = '#d62728' if is_bottom else '#1f77b4' clazz = 'bottom' if is_bottom else 'top' cx, cy = px(comp['x']), py(comp['y']) circles.append( '<circle id="s{des}" class="part {clazz}" cx="{cx}" cy="{cy}" r="5" ' 'fill="{color}">
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 22:11:16

个人微信API接口如何承接AI搜索流量?GEO时代微信私域的应用新思路

GEO内容让品牌出现在AI的回答里&#xff0c;这只是获客的前半段。用户通过AI了解品牌后要进入微信私域&#xff0c;后半段的承接如果接不住——加了好友没人理、来源分不清、转化算不清账——前半段的内容投入就浪费了。承接是一条独立的运营链路&#xff0c;有四个关键环节。一…

作者头像 李华
网站建设 2026/9/18 22:06:57

C语言回调函数实战:从函数指针到工程级应用

我最早对回调函数有“顿悟感”&#xff0c;是在维护一个串口通信模块的时候。那会儿协议解析、数据分包、命令分发全写在一个循环里&#xff0c;每加一个功能就要改主逻辑&#xff0c;眼看着代码越来越像一团打了结的耳机线。后来把“收到数据之后干什么”这个动作抽出来&#…

作者头像 李华
网站建设 2026/9/18 22:06:45

Hugo 模板函数 crypto.MD5 完全指南:md5 哈希与 Gravatar 头像实战

Hugo 模板函数 crypto.MD5 完全指南&#xff1a;md5 哈希与 Gravatar 头像实战 【免费下载链接】hugo The world’s fastest framework for building websites. 项目地址: https://gitcode.com/gh_mirrors/hu/hugo crypto.MD5 是 Hugo 模板系统中 crypto 命名空间下的哈…

作者头像 李华