1. 为什么说互转是PCB设计里绕不开的“保命操作”
在说具体命令之前,先聊聊我自己的经历。刚接触Allegro那会儿,有一次要做一块电源板,结构那边发来的DXF板框文件,里面是一条条的Line线段,而Allegro里做板框、做Route Keepin、做禁布区,用的都是Shape。我当时不知道有互转这个说法,傻乎乎地拿着光标沿着线段边界一点点描,花了将近一个小时才描出一个勉强闭合的边框,还因为没有完全闭合,后面Z-Copy各种报错。
后来被旁边一位老工程师看到,他一句话点醒我:“你先用Compose Shape把线转成Shape,或者直接用Z-Copy,两分钟的事。” 那一刻我才意识到,Line和Shape互转这件小事,是真的能决定一块板子设计效率的关键操作。
再看看现在热词里提到的“Allegro铜皮只有轮廓”、“修改板框”、“导入DXF”这些高频问题,本质上都绕不开Line与Shape的相互转换。所以这篇文章我就把这块内容系统拆一遍,包括两条主路线:
- Shape → Line:把铜皮边界、禁布区边界变成可编辑的线条;
- Line → Shape:把板框线、结构线、异形走线路径变成真正的铜皮或约束区;
顺便把我这些年用下来踩过的坑、排查过的奇怪问题一并整理出来。每个操作步骤背后是什么原理、为什么必须这样设置,我都会尽量讲透,而不是只丢一个菜单路径给你。
2. Shape转Line:操作路径、参数含义和底层原理
2.1 菜单命令与基本操作
Allegro从16.x到17.x、甚至最新版本,Shape转Line的入口基本集中在同一个位置:菜单栏的Shape → Convert Shape to Lines。
点击之后,命令行会提示你选择一个Shape对象。这个对象可以是动态铜皮、静态铜皮,也可以是Route Keepin、Package Keepin这类约束形状。选中后右键Done,系统会弹出转换选项对话框。不同版本对话框里的叫法略有不同,但核心参数基本一致。
我习惯的操作顺序是先选Shape、再在对话框里确认输出层和转换类型。举个例子,假如我在TOP层有一块动态铜皮,想把它变成单独的闭合线条输出到Board Geometry的Silkscreen层,用来做丝印边框标注,我会:
- 执行Shape → Convert Shape to Lines;
- 点击Top层那块铜皮,右键Done;
- 在弹出的选项中选择输出层为 Board Geometry / Silkscreen_Top;
- 勾选 Delete original shape(删除原Shape),这样不会在板子上留两份同样边界的数据;
- 确认后执行,检查线条是否闭合、线宽是否合适。
这个功能最常见的用途,是把铜皮边界提取出来做工艺边、做外形标注,或者把原本整块铜皮的轮廓输出给结构工程师做干涉检查。还有一个高频场景是出光绘时,有些工厂要求特定标记必须用Line而不是Shape,这时互转就能快速搞定。
2.2 转换面板里的关键选项,一个都别瞎选
这个对话框里的参数看似简单,实际上每一项都可能影响最终结果。
对话框中的常见选项可以对照着看:
| 参数项 | 作用 | 我的建议 |
|---|---|---|
| Layer / Subclass | 指定转换后线条所在的层 | 务必先想清楚线条用途,再选层 |
| Delete original shape | 是否删除原Shape | 建议勾选,避免出现相同边界的两份对象 |
| Line width | 转换后线条的宽度 | 按实际出图需求设置,别用默认0 |
| Convert to Lines or Composing | 是否将多段线段合并为闭合折线 | 建议选择合并为闭合线,便于后续操作 |
这里特别说一下Line width。Allegro在把Shape转换成Line时,如果不在设计里给线条指定宽度,转换出来的Line会是一段宽度为0的路径。屏幕上看可能没问题,但出光绘或者后续转DXF时,就会遇到“图形太细看不清”甚至“工厂那边说线没了”的问题。
我自己的习惯是:如果线条只是用来做标注或辅助线,宽度设成0.1mm到0.2mm就够了;如果是要用来做金属加工或外形切割路径,那就要跟板厂确认线宽,通常设置在0.2mm以上比较稳。
2.3 为什么转完只剩“空壳”:Shape与Line的本质区别
很多新手在转换后容易疑惑:明明是一块填实的铜皮,怎么转换完变成一条细线了?这里需要理解Allegro对Shape和Line的底层定义。
Shape在Allegro里是一个具备边界和填充属性的闭合区域对象,它内部的填充信息(比如填充网络、填充间距、热焊盘连接方式)都跟着Shape走。当执行Convert Shape to Lines时,Allegro只是把Shape的“边界”提取出来,转换结果是一个闭合的多段线,原来Shape内部的填充信息、网络属性、挖空区域(void)统统不会保留。
所以这个命令天然就不适合用来“复制一块铜皮出来”,更适合用来提取边界轮廓。如果你想保留铜皮的形状信息,同时又想得到一组可独立编辑的线条,更稳妥的做法是把铜皮复制一份、然后把副本转成线条,留着原件继续用。复制快捷键是Ctrl+C/Ctrl+V或者用Duplicate命令,这样原件和转换结果互不影响。
3. Line转Shape:Z-Copy命令才是真正的“万能钥匙”
3.1 典型场景:板框线、结构线、异形走线路径
反过来,把Line转成Shape,我在实际项目里用得比Shape转Line还要多。最典型的是这几个场景:
- 从DXF导入的结构外形线,闭合后转成板框Shape;
- 用Route Keepin时,先有板框Line,再用Z-Copy生成禁止布线区;
- 画异形焊盘时,先用Line勾出外形路径,再转成Shape铜皮;
- 用走线路径生成局部铜皮,比如某些大电流区域需要根据走线形状铺铜。
这些场景里,最核心的命令就是Edit → Z-Copy。Z-Copy的官方定义是把已有的Line、Shape、Symbol等对象,按一定偏移量“复制”生成一个Shape对象。它的适用范围非常广,能处理的对象类型包括Line、Arc、Circle、Polyline、甚至Shape本身。
3.2 参数详解:线宽和偏移方向决定边界
Z-Copy的面板我用了很多年,每次用都会提醒自己检查三个核心参数:Copy to Class/Subclass、Offset Type、Line width。
第一个参数决定你要把新的Shape放到哪一层、哪个类。比如从板框生成Route Keepin,就选Route Keepin / All;从板框生成Package Keepin,就选Package Keepin / All;从结构线生成板框Shape,就选Board Geometry / Outline。
第二个参数是偏移方向(Offset Type):可以选择Center、Inside或Outside。这个偏移方向是相对于原始线的中心线来算的:
- Center方式生成的Shape边界会落在原始线条的中心线上,适合“严格按线框位置生成”的场景;
- Inside方式生成的Shape边界会落在原始线条的内侧,适合做内缩禁布区,比如板框内生成Shape时留出走线空间;
- Outside方式生成的Shape边界会落在原始线条的外侧,适合做外扩的包络区域。
第三个参数就是Line width,很容易被忽略但影响很大。Z-Copy在生成Shape时,会把原始线条的宽度也考虑进去。如果你的原始线条宽度是0,那么Shape边界就严格按照线条的几何位置来;如果线条本身设置了宽度,比如一条10mil宽的Line,那么生成的Shape边界会向外各偏移5mil(也就是半个线宽),再加上你设置的偏移值。
这个细节为什么重要?因为很多人从DXF导入的结构线默认是0宽度,但有些同事喜欢在板框线上设置宽度,这样Z-Copy生成Route Keepin时,如果没注意,Keepin会比预想的大出一圈或者小一圈,等到布局布线时才发现在板边附近老是报DRC,就是这里埋下的坑。
3.3 从DXF导入的Line如何顺利转成Shape
再说一个高频痛点:DXF导入的线经常是“碎片化”的。结构工程师导出的外形,可能每个边就是一条独立线段,甚至在圆弧处被拆成了几十个小段。如果直接用Z-Copy,Allegro会提示无法生成Shape,根本原因就是对象不是闭合的。
所以从DXF导入后,先别急着转,养成一套固定流程:
- 导入DXF后把所有线放到一个临时层,比如Board Geometry / DXF_Temp;
- 检查线条是否闭合:用Display → Element去查询线条端点,或者直接用Visibility面板把层打开,肉眼观察断口;
- 如果有断口,用Edit → Delete删掉多余短线,用Edit → Move/Copy或Edit → Vertex调整端点位置,确保首尾相接;
- 用合并命令把相邻线段变成多段线,让整个外形是一个连续对象;
- 确认闭合后,再用Z-Copy生成Shape。
还有一个更省事的做法:直接用Shape → Compose Shape。这个命令把封闭区域的Line/Arc/Circle组合成一个Shape,它比Z-Copy更能容忍线条之间的微小间隙。我实测过,当线端间隙小于设定的snap距离时,Compose Shape能自动把缝隙补上。所以在DXF导入的场景下,Compose Shape往往是更优选择。
4. 常见问题排查:我踩过的坑和解决办法
4.1 铜皮只有轮廓没有填充?先别急着重画
热词里就有“Allegro铜皮只有轮廓”,这个我来说说。它和Shape转Line、以及动态铜皮的状态都有关系。
一个Shape在屏幕上显示成空壳,通常有三个原因:
- 原因一:Shape处于Unfilled状态。执行Display → Status或者按快捷键,看看有没有显示Shape填充不完整的提示。动态Shape在移动、修改边界之后,有时候填充不会实时更新,需要执行Shape → Update Shapes或按Update快捷键让它重新填充。
- 原因二:颜色开关没打开。有些层的填充层和轮廓层是分开显示的,如果只在颜色面板里勾了轮廓层,把填充层关掉了,看起来自然就是空壳。去Color/Visibility面板里,检查对应层级的Fill和Silver是否打开。
- 原因三:Shape本身已经变成了Line。之前转换操作后,原Shape被删除,只剩下一圈线框,如果线宽又很小,屏幕上看着就像只留了个轮廓。
排查顺序我建议是:先查颜色设置(最快的),再查Shape填充状态(动态Shape需要Update),最后确认对象类型是不是已经被转换成了Line。三步走完,绝大部分“空壳”问题都能找到答案。
4.2 Z-Copy出来的Shape整体偏移或尺寸不对
这个问题的根源,我在前面也提到了,基本上离不开两点:一是Offset Type选错了方向,二是Line width影响了边界计算。
举个真实的例子,有一次我用Z-Copy做板框内缩5mm的Route Keepin。板框是用0宽度的Line画的,Offset Type我选了Inside,Offset距离填了5mm。结果生成出来的Shape歪歪扭扭,某些位置离板框比预期远,某些位置又比预期近。查了一会儿才发现,那条板框线并不是一条连续的多段线,而是由好几段不同方向的Line组成的,其中有一段圆弧线本身的宽度是0.3mm。Allegro在处理有宽度的圆弧时,Z-Copy的边界计算会以圆弧的中心线为基准再叠加半个线宽,所以那一段侧边就比其他段多退出了0.15mm。
后来我的做法是:在做Z-Copy之前,统一把所有参与转换的线设置为0宽度,这样结果完全可控。如果只是为了显示好看,可以在转换完成后再改线宽,Shape的边界不受影响,改的只是线条本身的视觉效果。
4.3 线条明明闭合了,怎么还是生成不了Shape
“Can't create shape”这类提示我碰到过好几次,每次都让人头大。线条看起来首尾相连,但Allegro就是不认。
这里要区分Allegro的“视觉闭合”和“几何闭合”。视觉上两条线端点重叠,不代表它们在数据库里的坐标完全一致。可能是0.0001mm级别的微小间隙,或者存在重叠的重复线段。
排查技巧:
- 用Display → Element查询线段端点坐标,肉眼对比两段线的End Coord和下一段的Start Coord是否完全一致;
- 用Setup → Design Parameter Editor把全局线宽改小,然后把视图放得很大,沿着整条线走一遍,看有没有颜色变浅的交叠区域;
- 善用Edit → Delete中的“删除重复对象”筛选,把重叠线段清理掉;
- 还不行的话,用Edit → Change把线宽全部改成0,有时线段叠加重叠是因为线宽渲染造成的“看起来重叠”。
一旦找出问题线段,要么重新捕捉端点,要么直接删除后重新画一小段连接,再执行Z-Copy或Compose Shape就能成功了。
4.4 转换后到了错误的层,怎么批量挪回来
我在Shape转Line或者Z-Copy时,经常因为面板上的目标层选错,导致生成的Line或Shape跑到了别的层。比如想把Route Keepin生成到All楼层,结果选成了TOP层,这样整块板的禁布区域只在顶层生效,底层照样自由布线,后期查DRC时才反应过来。
解决办法有两种:
- 如果是少量对象,直接选中后用Edit → Change修改Class和Subclass;
- 如果是大量对象,用Tools → Quick Report先确认哪些对象在当前层,再用Edit → Group批量选中,统一Change。
这里还有一个喝酒后容易犯错的点:Edit → Change修改层时,选项栏里的“Update symbol instances”不要勾选,否则可能会把所有引用该封装的实例全部改掉,到时候板子上几百个封装层信息全乱了,就等着哭吧。
4.5 转换后出光绘,线条以“0宽度”输出
Shape转Line后如果线宽是0,出光绘时可能只在Gerber里留下一段极细或者不显示的图形,导致板厂那边出现资料缺失或短路风险。这类问题在有铜皮边界走线输出的场景下特别危险,因为0宽度的线条在光绘解释器里可能被当作没有实际铜箔,加工出来就是断开的。
所以每次转完线,我都要求自己执行一遍Display → Element去检查线宽属性。如果你的项目里线条就是用来做参考线的,出光绘时也可以单独设置某个层的线条统一加粗。在Artwork Control Form里,有个“Line Width”的全局设置选项,可以把所有0宽度线条按统一宽度输出。但这个方法只影响输出,不能替代设计文件里实际的线宽,所以保险起见还是回到设计里把线宽改掉,再出光绘。
5. 把互转变成“肌肉记忆”:快捷键、Script与避坑清单
5.1 快捷键设置:把常用命令绑到顺手的位置
Allegro里几乎所有命令都可以绑定快捷键。在env文件中添加自定义alias即可,env文件一般在安装目录的share/pcb/text下,或者用Setup → User Preference Editor里的“UI/Common”相关配置。
我自己常用的是:
alias sz "edit z-copy" alias sc "shape convert shape to lines" alias cc "compose shape" alias up "update shapes"如果你是17.2以上版本,还可以用Tools → Utilities → Keyboard Shortcuts界面去改,不用手动编辑env文件。绑定好之后,我平时做板框转Route Keepin,基本就是按两下键、点两下鼠标,十几秒搞定。
5.2 Script脚本:把重复操作录下来一键重放
Allegro自带Script录制功能,在File → Script里可以开始录制。录制时它会记录你的鼠标点击和键盘输入,生成一个.scr文件。下次执行File → Replay选择该脚本,就能重复之前的操作。
这个功能特别适合线路图一致、只是坐标不同的重复性转换。比如给你十个相同的结构外形线,每个都要转换成Route Keepin,手动做十遍确实浪费时间。你只需要录制一遍完整操作,后续替换选择对象引用即可。
录制时有一点要注意:脚本中记录的坐标是绝对的。如果你的每个目标对象位于不同位置,脚本里的坐标就不会自动匹配。解决方法是先全选所有目标对象(用Find面板按Line选中),然后在脚本中执行Z-Copy时,对象选择用Previous Selection或All On,这样就能对全部对象批量处理。
5.3 实用避坑清单
最后把我这些年总结的经验浓缩成一份清单,每条都是真金白银换来的:
| 检查项 | 操作建议 |
|---|---|
| 对象是否闭合 | 转Shape之前用Display→Element检查,或者用Compose Shape自动补缝 |
| 线宽是否为0 | 转Shape前统一设置为0,转Shape后按实际需求重新设置 |
| 目标层是否正确 | 每次转换前确认Class/Subclass下拉框,特别是多层板时注意选择All或指定内层 |
| 原始Shape是否保留 | 需要保留原铜皮时,先复制再转换,别直接删除 |
| 动态Shape是否需要更新 | 修改边界后执行Shape→Update Shapes,避免看起来像空壳 |
| 出光绘前复查 | 执行Tools→Database Check,再Quick Report检查线宽、零长度对象等异常 |
| 坐标精度 | 从DXF导入的线有时会有微小偏差,把全局Grid设小或开启Snap to Vertex再操作 |
数据库检查这一项值得单独说。Allegro里有一些数据错误是光靠肉眼看不出来的,但会在出光绘或后期仿真时突然爆发。每做完一次批量转换,花个几十秒跑一遍Tools → Database Check,勾上“Update all DRC”、“Check shape outlines”等选项,能提前发现很多隐患。
写在最后的一点体会
Line与Shape互转这个功能,单看命令好像很不起眼,但它几乎贯穿了板级设计的整个流程:从前期的结构导入、板框绘制,到中期的禁布区约束、局部铜皮优化,再到后期的工艺标注、光绘输出,都会用到。把这个操作练熟,你就能把更多精力放在布局布线的核心问题上,而不是被这些“边角料”操作拖住。
我自己现在做个新项目,只要结构图一到手,习惯性动作就是:导入DXF、查闭合、Compose Shape成板框、Z-Copy生成Route Keepin和Package Keepin,整套流程不超过五分钟。省下来的时间,去多绕几条高难度走线、多调几版电源环路,那才是真正创造价值的地方。希望这篇整理对你有帮助,也欢迎你在评论区分享你遇到的互转怪问题,我看到了会尽量回复。