想将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设计软件公司才搞的懂了.
可以看出, 将一种软件文件格式导入另外一种软件中, 是有风险的. 万一是肉眼看不出来的那种风险可咋弄?