JavaScript - 将 Allegro 坐标文件转为嘉立创坐标文件(CSV 格式)的工具

将 Allegro 坐标文件转为嘉立创坐标文件(CSV 格式)的工具

Allegro 坐标文件格式:

在这里插入图片描述

工具:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Allegro Placement File to Jialichuang File</title>
    </head>
    <body>
        <input type="file" accept="*" />
        
        <script type="text/javascript">
            const LINE_BREAK = "\r\n";
            
            window.onload = (event) => {
                // console.log(event);
                main();
            }
            
            function main() {
                const inputFile = document.querySelector("input[type='file']");
                
                inputFile.onchange = inputFileOnChange;
            }
            
            function inputFileOnChange(event) {
                const files = event.target.files;
                if (files.length > 0) {
                    const file = files[0];
                    // console.log(file);
                    
                    const fileReader = new FileReader()
                    fileReader.onload = (event) => {
                        // console.log(event);
                        const text = fileReader.result;
                        console.log(text);
                        
                        /*
                         * 处理 place_txt.txt 文件
                         */
                        const lines = text.split(LINE_BREAK); // 分割成行
                        // console.log(lines.length, lines);
                        for (let i = 0; i < lines.length; i++) {
                            // console.log(lines[i]);
                            // 使用 filter 方法对数组进行拷贝,删除空字符串元素,保留其他元素
                            lines[i] = lines[i].split(" ").filter((element) => {
                                return element !== "";
                            });
                            console.log(`${i}:`, lines[i]);
                        }
                        
                        /*
                         * 删除不必要的行数
                         */
                        if (lines[0].length === 3) {
                            lines.splice(0, 1); // 删除首行:['UUNITS', '=', 'MILLIMETERS']
                        }
                        if (lines[lines.length - 1].length === 0) {
                            lines.splice(lines.length - 1, 1); // 删除末行:[]
                        }
                        // console.log(lines);
                        
                        /*
                         * 将 "m" 替换为 "B",表示该元件位于底层(Bottom);其他插入 "T",表示该元件位于顶层(Top)
                         */
                        for (let i = 0; i < lines.length; i++) {
                            if (lines[i].length === 5) {
                                lines[i].splice(lines[i].length - 1, 0, "T"); // 在最后一个元素之前插入一个 "T" 的元素
                            } else if (lines[i].length === 6) {
                                lines[i][lines[i].length - 2] = "B"; // 将倒数第二个元素("m")的内容替换为 "B"
                            }
                            
                            console.log(`${i}:`, lines[i]);
                        }
                        
                        /*
                         * 将 Allegro 文件的顺序改为嘉立创文件的顺序
                         */
                        // const header = ["Designator", "Footprint", "Mid X", "Mid Y", "Layer", "Rotation"]; // 嘉立创坐标文件的顺序
                        const header = ["Designator", "Mid X", "Mid Y", "Rotation", "Layer", "Footprint"]; // Allegro 坐标文件的顺序
                        lines.unshift(header); // 添加到数组的最前面
                        
                        console.log(lines);
                        
                        const INDEX_OF_DESIGNATOR = 0;
                        const INDEX_OF_MID_X = 1;
                        const INDEX_OF_MID_Y = 2;
                        const INDEX_OF_ROTATION = 3;
                        const INDEX_OF_LAYER = 4;
                        const INDEX_OF_FOOTPRINT = 5;
                        
                        // 按照嘉立创的顺序,将数组中的元素连接在 content 后面
                        let content = "";
                        for (let i = 0; i < lines.length; i++) {
                            content += lines[i][INDEX_OF_DESIGNATOR] + ",";
                            content += lines[i][INDEX_OF_FOOTPRINT] + ",";
                            content += lines[i][INDEX_OF_MID_X] + ",";
                            content += lines[i][INDEX_OF_MID_Y] + ",";
                            content += lines[i][INDEX_OF_LAYER] + ",";
                            content += lines[i][INDEX_OF_ROTATION] + ",";
                            content += LINE_BREAK;
                        }
                        
                        Tools_saveStringAsFile({
                            filename: "place_txt.csv",
                            type: "text/csv;charset=utf-8",
                            content: content
                        });
                    }
                    fileReader.readAsText(file, "GB2312");
                }
            }
            
            function Tools_saveStringAsFile(obj) {
                const blob = new Blob([ obj.content ], { type: obj.type });
                const objectURL = URL.createObjectURL(blob);
                
                const anchor = document.createElement("a");
                anchor.href = objectURL;
                anchor.download = obj.filename;
                
                anchor.click();
                
                URL.revokeObjectURL(objectURL);
            }
        </script>
    </body>
</html>

运行效果:

在这里插入图片描述

下载文件之后,使用记事本打开 CSV 文件,其的内容如下:

在这里插入图片描述

使用 WPS 打开 CSV 文件,其的内容如下:

在这里插入图片描述

参考

Allegro PCB Design GXL (legacy) - 导出 PCB 中元件的坐标文件

JavaScript - 将特定格式的字符串保存为 CSV 文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值