文章目录
- cadence SPB17.4 - allegro - Allegro2Altium.bat 初探
- 概述
- 笔记
- 查找Allegro2Altium.bat的位置
- 查找命令文件 AllegroExportViews.txt 的位置
- 看看Allegro2Altium.bat调用的extracta.exe 为啥写写一个命令文件, 确要导出10个文件
- 查extracta.exe的位置
- 查看extracta.exe实现
- 查看这个外部DLL函数所在的DLL名称
- 查找allegro_batch_sh64.dll位置
- 大致猜一下为啥给1个命令参数文件, 要导出10个文件
- 手工调用extracta.exe, 不指定这10个输出文件, 看看SPB17.4会不会让我们指定这10个文件的名称
- 为啥参数文件是 AllegroExportViews.txt?
- 备注
- 最后试试AD22是否可以导入SPB17.4导出的.alg文件
- 备注
- END
cadence SPB17.4 - allegro - Allegro2Altium.bat 初探
概述
想将allegro的brd导出坐标文件给openpnp用, 在查周边的资料.
看到有个思路是将allegro 的.brd转成AD的PCB工程, 然后再导出AD格式的坐标文件, 这样就可以用openpnp导入AD软件的坐标文件了.
我的本本上正好装了AD22和SPB17.4, 有条件搞. 不过感觉这个思路有点复杂, 有未知风险(版本都降级了, 真的一点SPB17.4的数据都没丢失?). 不想这么搞. 应该不用费这么大事吧?
我就是要将allegro的坐标文件整的和AD的坐标文件格式一样就行, 不用这么绕这么远的路.
我的思路, 比较一下allegro导出的坐标文件, 看看和AD格式坐标文件有啥区别.
大概看了一眼,区别不大.
openpnp支持导入好几种格式的坐标文件, 只要写个小程序将文本格式改了(看看openpnp支持哪种最简单的坐标文件格式, 我就改哪种)就O了, 就这样简单的事.
但是看到了上面那个思路用的方法中用了AD22将allegro的板子转成.alg(ascii格式的allegro板子文件), 用到了Allegro2Altium.bat.
有点好奇, 看看Allegro2Altium.bat具体是怎么将allegro.brd导出为.alg的?
准备先花一点时间看一下, 满足一下自己的好奇心后, 再去做正经事情.
笔记
查找Allegro2Altium.bat的位置
可知, Allegro2Altium.bat在AD22的目录中.
将 C:\Program Files\Altium\AD22\System 加入环境变量
将要转换的.brd拷贝到临时目录(不拷贝也行)清爽一些, e.g. Z:
新开一个cmd, 尝试转换板子
尝试运行命令行 Allegro2Altium.bat test.brd
Z:\>Allegro2Altium.bat test.brd
Z:\>extracta.exe test.brd AllegroExportViews.txt AllegroBoard.txt AllegroLayer.txt AllegroConnectivity.txt AllegroNetRules.txt AllegroPadStack.txt AllegroGeometry.txt AllegroSymbolDefinitions.txt AllegroSymbolInstances.txt AllegroAddlGeometry.txt AllegroMultiStackup.txt
No match found for 'AllegroExportViews.txt' in the search path.
Extract Command File (*.txt):
到这里就走不下去了,说缺少 AllegroExportViews.txt, 根据提示, AllegroExportViews.txt是一个解压的命令文件, 如果没有这个命令文件, 这个脚本不知道怎么干活.
打开脚本看一下, 整理一下内容
extracta.exe %1 AllegroExportViews.txt AllegroBoard.txt AllegroLayer.txt AllegroConnectivity.txt AllegroNetRules.txt AllegroPadStack.txt AllegroGeometry.txt AllegroSymbolDefinitions.txt AllegroSymbolInstances.txt AllegroAddlGeometry.txt AllegroMultiStackup.txt
COPY AllegroBoard.txt+AllegroLayer.txt+AllegroConnectivity.txt+AllegroNetRules.txt+AllegroPadStack.txt+AllegroGeometry.txt+AllegroSymbolDefinitions.txt+AllegroSymbolInstances.txt+AllegroAddlGeometry.txt+AllegroMultiStackup.txt AllegroASCII.txt
DEL AllegroBoard.txt AllegroLayer.txt AllegroConnectivity.txt AllegroNetRules.txt AllegroPadStack.txt AllegroGeometry.txt AllegroSymbolDefinitions.txt AllegroSymbolInstances.txt AllegroAddlGeometry.txt AllegroMultiStackup.txt
MOVE /-Y AllegroASCII.txt %1.alg
可知, 这个脚本一共干了4个活:
- 先使用 extracta.exe, 指定 AllegroExportViews.txt 为命令文件, 从.brd中解压出 AllegroExportViews.txt 中规定的所有文件(共10个)
- 再用copy命令将这10个文本文件合并为1个文本文件AllegroASCII.txt
- 删掉导出的10个文本文件
- 将AllegroASCII.txt改名为 .brd同名的前缀, 加上后缀为.alg
查找命令文件 AllegroExportViews.txt 的位置
可知, AllegroExportViews.txt的位置就和Allegro2Altium.bat一个目录, 但是工作目录变了.
那只能将AllegroExportViews.txt拷贝到Z盘来.
中止cmd的执行, 重新在Z盘中的cmd中运行 Allegro2Altium.bat
Z:\>Allegro2Altium.bat test.brd
Z:\>extracta.exe test.brd AllegroExportViews.txt AllegroBoard.txt AllegroLayer.txt AllegroConnectivity.txt AllegroNetRules.txt AllegroPadStack.txt AllegroGeometry.txt AllegroSymbolDefinitions.txt AllegroSymbolInstances.txt AllegroAddlGeometry.txt AllegroMultiStackup.txt
Extract started ... command file is 'AllegroExportViews.txt'.
Extract: processed 404 records.
Extract: processed 404 records.
Extract: processed 2254 records.
Extract: processed 6254 records.
Extract: processed 8661 records.
Extract: processed 8661 records.
Extract: processed 8661 records.
Extract: processed 1746 records.
Extract: processed 1746 records.
Extract: processed 3380 records.
Extract: processed 7380 records.
Extract: processed 11380 records.
Extract ended.
Z:\>COPY AllegroBoard.txt+AllegroLayer.txt+AllegroConnectivity.txt+AllegroNetRules.txt+AllegroPadStack.txt+AllegroGeometry.txt+AllegroSymbolDefinitions.txt+AllegroSymbolInstances.txt+AllegroAddlGeometry.txt+AllegroMultiStackup.txt AllegroASCII.txt
AllegroBoard.txt
AllegroLayer.txt
AllegroConnectivity.txt
AllegroNetRules.txt
AllegroPadStack.txt
AllegroGeometry.txt
AllegroSymbolDefinitions.txt
AllegroSymbolInstances.txt
已复制 1 个文件。
Z:\>DEL AllegroBoard.txt AllegroLayer.txt AllegroConnectivity.txt AllegroNetRules.txt AllegroPadStack.txt AllegroGeometry.txt AllegroSymbolDefinitions.txt AllegroSymbolInstances.txt AllegroAddlGeometry.txt AllegroMultiStackup.txt
Z:\>MOVE /-Y AllegroASCII.txt test.brd.alg
移动了 1 个文件。
Z:\>
这回脚本正常执行完了.
我就是想看看Allegro2Altium.bat怎么用, 并不想用AD导入.alg
看看Allegro2Altium.bat调用的extracta.exe 为啥写写一个命令文件, 确要导出10个文件
extracta.exe %1 AllegroExportViews.txt AllegroBoard.txt AllegroLayer.txt AllegroConnectivity.txt AllegroNetRules.txt AllegroPadStack.txt AllegroGeometry.txt AllegroSymbolDefinitions.txt AllegroSymbolInstances.txt AllegroAddlGeometry.txt AllegroMultiStackup.txt
查extracta.exe的位置
可知, extracta.exe是SPB17.4提供的.
大小只有17KB, 想去看看.
extracta.exe很小啊, 如果我们自己写个命令行程序, 这么小的体积, 应该也干不了大活吧?
查看extracta.exe实现
用IDA64打开extracta.exe
; int __cdecl main(int argc, const char **argv, const char **envp)
main proc near
sub rsp, 28h
call cs:ABatchMainDll
xor eax, eax
add rsp, 28h
retn
main endp
看main函数, 是调用了外部DLL一个函数实现的, 他自己并没有干啥活.
查看这个外部DLL函数所在的DLL名称
0000000140002088 ABatchMainDll allegro_batch_sh64
可知 DLL名称为 allegro_batch_sh64.dll, 接口名称为ABatchMainDll
查找allegro_batch_sh64.dll位置
可知, allegro_batch_sh64.dll是SPB17.4提供的.
不过体积有点大…
去看看吧, 用IDA64打开allegro_batch_sh64.dll
可知, allegro_batch_sh64.dll确实提供了一个接口, 名称为ABatchMainDll
从接口命名看, 是一个批处理的DLL.
去看看ABatchMainDll接口的实现
public ABatchMainDll
ABatchMainDll proc near
jmp ABatchMainDll_0
ABatchMainDll endp
这是个接口, 从顶层函数看不出大体的处理逻辑.
具体实现要去单步调试,没兴趣了.
具体怎么根据命令行参数去干活, 能白瓢到更好, 瓢不到亦可.
到这里, 我的好奇心差不多被满足了.
大致猜一下为啥给1个命令参数文件, 要导出10个文件
换个思路, 看看命令文件的内容和导出的10个文件之间的逻辑关系.
打开 AllegroExportViews.txt, 和 Allegro2Altium.bat调用extracta.exe的命令行对比一下.
经过比对可知, AllegroExportViews.txt有明显的子参数区的分隔, 一个子参数区描述, 就对应导出一个文件.
打开AllegroExportViews.txt, 从上到下, 统计子参数区的个数, 整好是10个, 所以会导出10个文件.
手工调用extracta.exe, 不指定这10个输出文件, 看看SPB17.4会不会让我们指定这10个文件的名称
手工调用命令行如下:
extracta.exe test.brd AllegroExportViews.txt
Z:\>extracta.exe test.brd AllegroExportViews.txt
Extract started ... command file is 'AllegroExportViews.txt'.
A!BOARD_NAME!BOARD_UNITS!BOARD_EXTENTS_X1!BOARD_EXTENTS_Y1!BOARD_EXTENTS_X2!BOARD_EXTENTS_Y2!BOARD_THICKNESS!
J!Z:/test.brd!Fri Nov 11 21:08:35 2022!-65012.47!-61830.93!9903.92!8095.21!0.01!mils!STC15_EXP_BOX4_MB!10.400000 mil!2!UP TO DATE!
S!Z:/test.brd!mils!-65012.47!-61830.93!9903.92!8095.21!10.400000 mil!
Extract ended ... see extract.log for errors.
Z:\>
没有指定那10个输出文件的名称, extracta没执行成功.
根据提示, 打开 extract.log看看具体错误是啥.
# Start of Allegro to Altium Designer Board View
BOARD
BOARD_NAME
BOARD_UNITS
BOARD_EXTENTS_X1
BOARD_EXTENTS_Y1
BOARD_EXTENTS_X2
BOARD_EXTENTS_Y2
BOARD_THICKNESS
END
# End of Allegro to Altium Designer Board View
# Start of Allegro to Altium Designer Layer View
LAYER
ERROR(SPMHDX-8): Could not open output file ''.
可知, 执行了一个命令子参数区, 但是没指定输出文件名.
到此, 就知道了, 给定了参数命令文件后, 必须指定此参数区的输出文件名称.
因为 AllegroExportViews.txt 作为命令文件, 有10个参数区, 就必须在调用 extracta.exe test.brd AllegroExportViews.txt 的后面给10个对应输出参数区的输出文件名称.
为啥参数文件是 AllegroExportViews.txt?
去 AllegroExportViews.txt目录看, 有很多疑似都是extracta.exe的命令文件.
按照类型排列, 可以看到很多Allegro*.txt, 打开查看, 都是命令参数的格式.
为啥参数文件不是其他的命令文件?
可以看到, 这个目录中有11个命令参数文件, 其中AllegroExportViews.txt内容最多, 有10个参数区.
比对AllegroExportViews.txt和其他参数文件的内容, 可以发现,其他的参数文件, 只是AllegroExportViews.txt中的一部分.
这就可以知道, AllegroExportViews.txt是最全的参数文件. extracta.exe要将 AllegroExportViews.txt作为参数文件.
备注
为啥AD公司能知道这么调用extracta.exe?
那人家是专门做PCB软件的, 专业呗.
各种将其他家的文档转成自己家格式的.
好像每种软件都这么搞, 没有看到会很上心的提供将自家格式转成N种其他家格式的软件.
这次 Allegro2Altium.bat 初探 就到这打住了, 好奇心被满足了.
最后试试AD22是否可以导入SPB17.4导出的.alg文件
其实我不想实验的, 我根本就没有这个需求.
一路next, 参数可以选用默认的, 直到完成.
但是allego的板子还有规则文件啥的要导入(可选), 没有啊, 只能next
最后可以打开导入的.alg.
但是:
- 铺铜没了
- 调好的丝印都乱了
- 在板框层加的logo文字都没有了.
这就导致, 能生产用的板子, 经过AD22脚本转为.alg再导入AD后, 板子不能用于生产了, 这还有啥意义?
但是焊盘和走线都在, 估计出个AD格式的坐标文件, 应该还可以.
备注
AD22导出/导入.alg的功能不完善. 也有可能是我不会用(小概率).
还有种可能, 参数文件中, 应该指定更多的参数区(因为导入.alg时, 有2种在.alg之外的文件没有), 但是这个就只有专业的PCB设计软件公司才搞的懂了.
可以看出, 将一种软件文件格式导入另外一种软件中, 是有风险的. 万一是肉眼看不出来的那种风险可咋弄?