1. 为什么直接 Ctrl+V 在 PCB 里总是得到一份"半残废"的复制品
1.1 网路并不会跟着图案一起走
我在刚开始画板子的时候犯过一个很蠢的错误:把已经布好线的一块电源电路,连同电阻电容一起选中,按下 Ctrl+C,再 Ctrl+V,看起来整块东西都复制过去了,位置也基本对得上。结果跑 DRC 的时候跳出来一堆 "Un-Routed Net" 和 "Duplicate Designator",我当时还以为是软件抽风。
后来才算真正搞明白:PCB 编辑器里的"复制"并不是把一块物理图形原样搬过去,你复制的是对象的图形属性加上附加属性。普通 Ctrl+V 走的是最简单的贴入逻辑,它会尽量把图形放在你鼠标附近,但不会主动帮你保留网路关系。网路是对象的逻辑属性,不是跟着铜皮外形走的。你复制一条 NetLabel 为12V的 Track,如果粘贴时没有告诉 AD20"我要保留网路名字",那贴出来的就是一条看起来一模一样、但 Net 一栏为 No Net 的铜线。这种东西放在板子上,视觉上好像连上了,实际上电气上完全断开。
这也就是很多人复制之后发现"明明线都搭上了,为什么还说开路"的根本原因。铜皮是铜皮,网路是网路,两者在 Altium 的数据模型里是分开的。你不能指望 Ctrl+V 去猜测你的意图,它只会做最低限度的粘贴操作。
1.2 参考点:第二个经常被忽略的关键
除了网路丢失,还有一个问题大家都遇到过:复制一整块电路后,粘贴时东西老是以你选中的原点为基准往外甩,鼠标拖到哪里,块就跟着偏移到哪里,想把它放到某个精确坐标旁边就得来回微调。这是因为在复制之前你没有设置参考点。
AD20 的 PCB 编辑器里,Edit > Set Location Marker这个命令就是干这个的。它的作用是告诉软件:接下来复制的内容,以我当前鼠标点的这个位置作为锚点。比如你要复制一个以 C1 为中心的区域,那就先在 C1 的某个焊盘上点一下 Location Marker,再选中、复制、粘贴,这样粘贴时鼠标就能精确地对准 C1 焊盘的位置。
很多教程不会强调这一步,因为它看起来和网路没啥关系。但实际做模块复制时,参考点直接决定了你后续摆放的效率。一次复制多个模块,如果每个模块都靠"放进去再微调",那效率基本就废了。我通常会在源电路里选一个最有代表性的焊盘或者元件原点作为 Location Marker,这样贴过去之后只需按一下G设置好栅格,就能非常精确地对齐到目标位置。
2. Paste Special 对话框里每一项都是什么意思
2.1 "Keep Net Names" 才是真正的救星
当你选中对象、按 Ctrl+C 后,不要急着 Ctrl+V,而是用Edit > Paste Special。弹出的这个对话框,才是 PCB 复制的高级入口。
里面最关键的选项就是Keep Net Names。它的作用非常直白:把复制对象身上的网路名字也一起放进剪贴板,并在粘贴时尝试将这些网路重新应用到你当前 PCB 上。
这里有个容易被误解的点。它不是说"粘贴后自动找最近的焊盘接上",而是说"如果这个 PCB 里已经存在同名的网路,那就把这个网路分配给粘贴出来的对象;如果不存在同名网路,就新建一个同名网路"。所以复制同板内容时,网路保留得非常干净;即使是复制到另一个项目、另一块 PCB,只要网路名匹配上,也能直接保留。
我在实际布线中几乎总是把这个选项勾上,不管对方是 Track、Via 还是元件引脚。就算暂时不需要网路,保留下来也不会带来副作用,真正该担心的是不勾它带来的后续麻烦。
2.2 "Duplicate Designator" 控制的是元件位号
处理元件的时候,第二个关键选项是Duplicate Designator。
勾选它的意思是:复制出来的元件,位号不要和源元件重复,AD20 会自动给新元件分配一个和当前 PCB 上已有位号不冲突的编号。比如说你复制了 R12,它会自动变成 R23 或其他未使用的编号,而不是让你在板子上出现两个 R12。
如果不勾选,那复制出来的元件位号会和源件一模一样,AD20 通常会在 DRC 时报 "Duplicate Designators"。有人说那我手工改一下位号就行了,但如果你复制的是一个包含大量元件的模块,手工去改几十个位号纯属给自己找罪受。
有一点必须说清楚:Duplicate Designator 只处理位号,不处理网路。网路保留与否完全看 2.1 那个选项,两者是独立的。很多人把这两个选项当成一回事,勾了 Keep Net Names 却没勾 Duplicate Designator,结果贴出来的元件位号全是一样的,然后又跑来问我为什么 DRC 里一片红。原因很简单,你少勾了一个。
2.3 其他选项什么时候用
- Paste on current layer:这个选项默认是关闭的。它的作用是强制把所有粘贴对象放到当前激活层,不管你复制的时候对象原本在 Top Layer 还是 Bottom Layer。如果你只是想把一段走线从顶层复制到底层,用它就很省事;但如果你复制的是包含多层走线的完整模块,那我建议不要勾,让它保留原有图层信息。
- Add to component class:在你用 Class 做规则管理时有用。比如把复制出来的一整块 DC-DC 电路自动归入某个 Component Class,方便统一设置布线宽度和间距规则。如果项目里还没用到 Class,那就无关紧要。
- Net Names 保持勾选:不用多说,见上文。
提示:Paste Special 对话框里的选项只影响当前这次粘贴,不会改变默认行为。所以你不用担心下次普通 Ctrl+V 会突然多出什么奇怪属性。
3. 复制 Track / Via / 铜皮区域时的正确操作顺序
3.1 从区域选择到摆放的完整流程
以最常见的"把一组电源走线连同过孔复制到另一块区域"为例,正确顺序是这样的:
- 在 PCB 里用鼠标框选要复制的图元,如果有不需要的元件,按住
Shift单击取消选择,或者用编辑器右下角的 Filter 面板把选择对象限定在 Tracks、Vias、Fills、Arcs 这几类,避免误选元件和丝印。 - 执行
Edit > Set Location Marker,然后在要复制的电路里点一个你熟悉的位置,比如某个滤波电容的焊盘中心。 - 按
Ctrl+C。注意此时命令行会提示选择参考点,但因为你已经设置过 Location Marker,它就直接以刚才的点为参考了。 - 执行
Edit > Paste Special,在对话框里勾上Keep Net Names,其他选项按你的目标图层决定。确认后鼠标会带着对象出现。 - 移动到目标位置,按
G切换栅格精度,找到对应的焊盘或坐标点放下。
这套流程看起来平淡无奇,但你仔细体会一下,里面的关键不是哪一步,而是每一步都在为下一步减少信息损失。Location Marker 保证的是空间位置不漂移,Keep Net Names 保证的是逻辑属性不丢失。
3.2 目标位置的网路已经存在会发生什么
这是很多人最担心的一个问题:我要贴过去的位置,本来就已经有3V3这个网路的焊盘了,那我贴过去的 Track 是3V3,它们会不会自动合并。
答案是会。AD20 会用你贴过去的对象所属的网路名字去匹配,只要名字一样,它就认为是同一个网路。你贴过去的 Track 只要和原来那个网路在物理上是连接的,DRC 就会把它当成同一个网路的一部分。不需要你做任何额外操作。
如果目标位置的网路名字和你剪贴板里的网路名字不一样,比如源文件里叫3V3_A,目标 PCB 里叫3V3,那贴过去之后这个 Track 的 Net 属性就是3V3_A。这时候哪怕它和3V3的焊盘外形完全重合,电气上也是两个网路,DRC 会报短路。遇到这种情况,不要想着"反正连上了",必须手动在 PCB Inspector 面板里把3V3_A改成3V3,或者通过Design > Netlist > Configure Physical Nets做一次网路合并。
3.3 用 PCB Inspector 确认粘贴结果
贴完之后我强烈建议你随手点一下贴过去的一根走线,打开 PCB Inspector 看看 Net 栏。这一步花不了两秒钟,但能避免你把一堆 No Net 的走线留到 DRC 阶段。尤其是从别的项目复制过来的内容,因为源文件的网路不在当前项目里,AD20 虽然会新建同名网路,但网路类、规则这些附加信息不会跟过来,你得自己在 Netlist 里补。
我见过不少人复制完,线看起来整整齐齐,结果后面手工补了一块铜皮,发现怎么铺都铺不进原来的网路,查了半天才发现是铜皮属性里 Net 是 No Net。这种事其实在复制粘贴场景里太常见了,根源就是你少看了一眼属性面板。
4. 复制元件并保留网路:一个电机驱动模块的实操记录
4.1 什么时候你才需要用这种方式复制元件
复制"带网路的元件"和复制"光秃秃的元件"是两码事。如果你只是想把一个封装复制出来,之后网路全靠原理图更新,那用普通复制粘贴就够了。但我碰到最多的情况是:在 PCB 里已经有完整网路的阶段,想在同一块板子上快速做重复通道。比如一个电机驱动板上有两路桥臂,第一路已经布好线、摆好位,第二路想完全照抄,然后再通过原理图同步把位号对回去。这时候你就需要在复制元件的同时保留它们焊盘上的网路。
另一种常见场景是,某个大 BGA 芯片周围有一圈去耦电容,你想在另一个引脚区域也摆上同样的一组电容。如果只是复制元件不带网路,你还得一个个手工去分配网路,那还不如直接放新元件然后按原理图更新。所以"保留网路"这个能力,真正的价值在于你已经知道目标区域的网路和源区域相同,或者你打算后续再利用这些网路名字做批量操作。
4.2 带元件的完整操作
我的习惯是把元件和它周围的去耦电容、走线、过孔一起选中,然后参考点放在电源芯片的某个输出引脚上。操作如下:
- 先选中要复制的元件组,包括它们的位号丝印。为了方便,可以用 Filter 把 Component、Track、Via、Fill 都勾上,Dangling 和 Error 之类临时标记不要勾。
- 设置 Location Marker,放在源电路最核心的焊盘上。
Ctrl+C复制。- 打开
Edit > Paste Special,勾选Keep Net Names和Duplicate Designator,其他按需选择。 - 放到目标区域。
贴完之后你会发现,新贴的元件位号已经被自动改成不冲突的编号,而且每个焊盘上的网路属性都保留着。比如源电容 C12 的两个焊盘分别属于VIN和GND,复制后出来的 C56 也是VIN和GND。画完板子之后,再把原理图里的重复通道位号同步过来就完事了。
4.3 AD20 "Unknown Pin" 和封装问题的坑
在复制元件的时候,偶尔会遇到选中一个元件,按下 Ctrl+C 之后状态栏提示 "Unknown Pin"。这个问题的根源通常不是复制本身,而是这个元件的 PCB 封装在本地库里找不到了,或者封装里的焊盘编号和原理图库不一致。AD20 在读取复制对象时,需要通过焊盘信息构建内部数据,一旦某个 Pin 的编号在封装里找不到对应位置,它就会报 Unknown Pin。
遇到这种事情,先别急着复制。你要做的是打开那个元件所在的 PCB Library,检查它的焊盘编号是否完整。比如原理图库里的引脚叫1, 2, 3,但 PCB 封装里只有一个1和一个3,那第 2 脚就是 Unknown Pin。这种元件即使你不复制,原封不动放板子上,之后做 DRC 也会有问题。复制操作只是把这个隐藏问题暴露出来了而已。
所以我的建议是:复制前养成一个习惯,凡是碰到 Unknown Pin,先停下来修复封装或库关系,不要带着问题继续复制。不然你复制出来的一整块模块里,某几个引脚是没有网路属性的,后面补起来非常痛苦。
5. 粘贴后网路变成_1、位号冲突、开路:修复流程一次讲透
5.1 网路多出_1后缀是怎么回事
粘贴后最诡异的现场是:网路名明明在源文件里叫VCC,贴完之后查看属性,发现它变成了VCC_1。很多人的第一反应是"AD20 出 bug 了"。其实不是 bug,而是 Altium 在试图避免网路冲突时采用的策略。
当你复制的内容里包含网路VCC,而当前 PCB 又已经存在VCC网路了,正常情况下它会直接匹配并合并。但如果你复制的对象里包含某种和源网路不完全一致的信息,比如网路类不同、物理连接不同,AD20 就会为了避免冲突而创建一个新的网路名字VCC_1。这常见于你从另一个 PCB 文件复制对象时,源项目的网路定义和目标项目不一致。
解决方式不复杂:打开 PCB 面板,切到 Nets 模式,找到VCC_1,右键选择属性,把它改成VCC。或者用Design > Netlist > Configure Physical Nets手动合并。改完以后注意看看连在VCC_1上的所有图元是不是都一起改了,有时候走线改了,过孔却漏了,会造成开路。
5.2 位号冲突的三种处理办法
勾了 Duplicate Designator 一般不会出现位号冲突,但如果你复制时没勾,就会出现重复位号。AD20 里处理重复位号有三种常用手段,按推荐程度排序:
- 重新标注:
Tools > Annotation > Force Annotate。它会扫描整个 PCB,把所有重复或空白的位号重新分配。注意它可能把原来正常的位号也动掉,如果你希望只修重复项,记得在 Annotation 配置里选择 "All" 之外的选项。 - 手动改 PCB Inspector:适合数量少的情况。点中重复的元件,在属性面板里把位号改成别的值,比如 R12 改成 R12A。
- 原理图反向更新:如果 PCB 是从原理图同步过来的,最稳妥的是回原理图里把位号改好,再 Design > Update PCB Document 同步回来。不要直接在 PCB 里乱改位号,否则下次同步会被打回原形。
5.3 贴完后开路,但视觉上明明搭上了
这是最让人抓狂的问题。我处理过好几次,现象都是:贴过去的 Track 和旁边焊盘接触得严丝合缝,DRC 却报 Un-Routed。检查后发现那条 Track 压根没有 Net。
这里有一个非常重要的排查思路:不要靠眼睛看,要用 DRC 和 Inspector 查。选中那条可疑的 Track,打开 PCB Inspector,看 Net 是不是你要的那个。如果显示 No Net,说明粘贴时 Keep Net Names 没生效,或者你复制的时候源对象就是 No Net。这时候用手工补 Net 也行,但我更建议你回看复制源文件,确认源文件里的对象到底属于哪个 Net,再重新复制一遍,不要拿一个坏对象硬修。
真正成熟的做法是:复制完一个大区域后,立刻跑一次Tools > Design Rule Check,只看 Un-Routed Net 和 Short-Circuit 这两项,把问题提前暴露出来。别等整板布线都画完再查,那时候几十个开路连在一起,你根本不知道哪些是这次复制新引入的。
6. 这类复制技巧的边界,以及我更推荐的长线做法
6.1 Paste Special 适合什么场景
说实话,Paste Special 在 AD20 里是一个偏向临场操作的技巧,它解决的是"这一次、这一块、同一个板子上快速复制"的问题。比如你正在布线中觉得某个扇出布局很对称,想复制到另一侧;或者你调试一块板子,需要临时复制几个测试点,这些场景用它非常顺手。它最大的优势是快速、可控,不需要额外建立什么库文件、模板文件。
但它并不是一个用来做"结构化复用"的工具。如果你发现自己每画一块新板子都要把同一块 DC-DC 电路复制来复制去,那说明项目复用方式有问题。PCB 层面的复制粘贴,网路、规则、元件类、设计约束都很难完整保留,每次都要人工检查和修补,时间长了一定会漏项。
6.2 什么时候该上 Snippets、Device Sheets 和 Multi-Channel
如果你要复用的是整个功能子电路,我建议走 Snippets 或者原理图层面的 Device Sheet。Snippets 适合小规模复用,比如一阶滤波、电平转换、ESD 保护这类几个元件的小电路。原理图里的 Device Sheet 适合完整的功能模块,比如一个隔离电源、一个接口保护模块。这些方案的好处是网路、参数、位号前缀这些东西在一开始就定义好,不用每次复制后补。
真的要在同一块板子里做重复通道,比如四路完全相同的电机驱动、八路完全相同的 IO 输入,那首选不是复制粘贴,而是 Multi-Channel 设计。在原理图里用 Repeat 语法声明通道数量,再通过 Room 复制把 PCB 布线和布局同步过去。这样你改一处,其他通道可以联动更新,不会出现"复制的第二路忘了改某个电阻值"这种低级错误。
6.3 我在实际项目里总结出的取舍标准
如果你让我给一个可执行的判断标准,我会这样分:
- 只是当前板子内部复制一小段走线、一小簇电容:直接 Paste Special,很快。
- 当前板子里复制一个中等规模的模块,并且你确定只复制这一次:Paste Special 可行,但复制完必须做 DRC 和网路核对。
- 同一块板子里要出现三次以上相同模块:用 Multi-Channel,别在 PCB 里手工复制。
- 多个项目之间要共用同一段电路:用 Device Sheet 或 Snippets,网路和参数从源头统一管理。
这套标准我用了很久,基本没出过大问题。复制粘贴这个功能,说到底是给"一次性、临时的图形搬运"准备的,你可以把它用得很熟练,但别把它当成设计复用的解决方案。
最后再分享一个我个人的小习惯:每次大规模的 Paste Special 操作之后,我会在 PCB 里放置一个临时的 Comment 文本,比如"复制自 R12/R13 区域,网路已核对",放在旁边提醒自己还有哪些待办项。等 DRC 全部通过、网路都确认无误后再删掉。这个习惯帮我避开了很多"当时觉得复制得挺完美,后来发现漏了一条 GND"的坑。