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


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

    Allegro 坐标文件格式:

    在这里插入图片描述

    工具:

    DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>Allegro Placement File to Jialichuang Filetitle>
        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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126

    运行效果:

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    参考

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

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

  • 相关阅读:
    制作 2D 素材|基于 AI 5 天创建一个农场游戏,第 4 天
    解决数据重复插入问题(sql与锁方法)
    L56.linux命令每日一练 -- 第八章 Linux磁盘与文件系统管理命令 -- swapoff和sync
    PE文件-C++-MFC-IDA-逆向分析-x32dbg
    计算机网络(文章链接汇总)
    linux系统安全
    LSH-局部敏感哈希
    react代码编译+部署完成,运行前:如何修改配置文件以改变代码中对应变量的值?
    针对移动硬盘发生I/O请求失败无法访问的问题
    【JavaEE】SpringBoot 拦截器详解 (统⼀功能处理)
  • 原文地址:https://blog.csdn.net/qq_29761395/article/details/126870790