想将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在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个活:

可知, 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
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是SPB17.4提供的.
大小只有17KB, 想去看看.
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一个函数实现的, 他自己并没有干啥活.

0000000140002088 ABatchMainDll allegro_batch_sh64
可知 DLL名称为 allegro_batch_sh64.dll, 接口名称为ABatchMainDll

可知, 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

这是个接口, 从顶层函数看不出大体的处理逻辑.
具体实现要去单步调试,没兴趣了.
具体怎么根据命令行参数去干活, 能白瓢到更好, 瓢不到亦可.
到这里, 我的好奇心差不多被满足了.
换个思路, 看看命令文件的内容和导出的10个文件之间的逻辑关系.
打开 AllegroExportViews.txt, 和 Allegro2Altium.bat调用extracta.exe的命令行对比一下.
经过比对可知, AllegroExportViews.txt有明显的子参数区的分隔, 一个子参数区描述, 就对应导出一个文件.
打开AllegroExportViews.txt, 从上到下, 统计子参数区的个数, 整好是10个, 所以会导出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目录看, 有很多疑似都是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 初探 就到这打住了, 好奇心被满足了.
其实我不想实验的, 我根本就没有这个需求.



一路next, 参数可以选用默认的, 直到完成.
但是allego的板子还有规则文件啥的要导入(可选), 没有啊, 只能next
最后可以打开导入的.alg.
但是:

AD22导出/导入.alg的功能不完善. 也有可能是我不会用(小概率).
还有种可能, 参数文件中, 应该指定更多的参数区(因为导入.alg时, 有2种在.alg之外的文件没有), 但是这个就只有专业的PCB设计软件公司才搞的懂了.
可以看出, 将一种软件文件格式导入另外一种软件中, 是有风险的. 万一是肉眼看不出来的那种风险可咋弄?
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删