将 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 文件,其的内容如下: