Initial commit

This commit is contained in:
Nick Playfair 2021-01-26 21:47:10 +00:00
parent dba9e0ea0d
commit bec6b26269
5 changed files with 283 additions and 1 deletions

4
.gitignore vendored
View File

@ -102,3 +102,7 @@ dist
# TernJS port file
.tern-port
.DS_Store
gerber/
hello.txt

View File

@ -1 +1,3 @@
# npe_gerber
Requires node version 10 or higher

32
index.js Normal file
View File

@ -0,0 +1,32 @@
const fs = require('fs');
const pcbStackup = require('pcb-stackup');
async function writeSVG(filepath, data) {
try {
await fs.promises.writeFile(filepath, data, { flag: 'w' });
} catch (e) {
console.error(`Error writing file: ${e.message}`);
}
}
const fileNames = [
'./gerber/default/copper_bottom.gbr',
'./gerber/default/copper_top.gbr',
'./gerber/default/drill_1_16.xln',
'./gerber/default/silkscreen_bottom.gbr',
'./gerber/default/silkscreen_top.gbr',
'./gerber/default/soldermask_bottom.gbr',
'./gerber/default/soldermask_top.gbr',
'./gerber/default/solderpaste_top.gbr',
'./gerber/default/solderpaste_bottom.gbr',
'./gerber/default/profile.gbr',
]
const layers = fileNames.map(filename => ({
filename,
gerber: fs.createReadStream(filename),
}));
pcbStackup(layers).then(stackup => {
writeSVG('./gerber/pcb.svg', stackup.top.svg);
});

221
package-lock.json generated Normal file
View File

@ -0,0 +1,221 @@
{
"name": "npe_gerber",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@tracespace/xml-id": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@tracespace/xml-id/-/xml-id-4.0.0.tgz",
"integrity": "sha512-bEAqLh8sxNHHVOErgQrF4cj/PlmaayrTTIWT3uKQKnFk8KlubUQeW+Ip6W9sa+J/bUii927qD0HE5sFxsPo/IQ=="
},
"@types/node": {
"version": "13.13.40",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.40.tgz",
"integrity": "sha512-eKaRo87lu1yAXrzEJl0zcJxfUMDT5/mZalFyOkT44rnQps41eS2pfWzbaulSPpQLFNy29bFqn+Y5lOTL8ATlEQ=="
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"color-string": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz",
"integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==",
"requires": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"gerber-parser": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/gerber-parser/-/gerber-parser-4.2.4.tgz",
"integrity": "sha512-Dn+nM+URswnKc1uOihOnmkbLqjiftPO3rYbBCFSz2WFFVOxDt7/nNNzX7U3OPoAoCYGrHbKsgLERj3YERaDLtA==",
"requires": {
"@types/node": "^13.1.6",
"inherits": "^2.0.4",
"lodash.isfinite": "^3.3.2",
"lodash.padend": "^4.6.1",
"lodash.padstart": "^4.6.1",
"readable-stream": "^3.4.0"
}
},
"gerber-plotter": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/gerber-plotter/-/gerber-plotter-4.2.5.tgz",
"integrity": "sha512-8zU9sambodzYTzCC3p3hlar3QdGC9uwC+rDCkxKhVf7rlL2lo6S7c46Q2hyNI2SpuY3WAE8EGCXHMP+MMo+2Ew==",
"requires": {
"@types/node": "^13.1.6",
"inherits": "^2.0.4",
"lodash.fill": "^3.4.0",
"lodash.isfinite": "^3.3.2",
"lodash.isfunction": "^3.0.9",
"readable-stream": "^3.4.0"
}
},
"gerber-to-svg": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/gerber-to-svg/-/gerber-to-svg-4.2.5.tgz",
"integrity": "sha512-1yR/j3bVZ/j0SKjvc+xYFrnYfccmH1jAh1oe4dw31eCOsNLYG43Sun6mOOYz5ylN95pStRRo7yU0T76wtgY74A==",
"requires": {
"@tracespace/xml-id": "^4.0.0",
"@types/node": "^13.1.6",
"escape-html": "^1.0.3",
"gerber-parser": "^4.2.4",
"gerber-plotter": "^4.2.5",
"inherits": "^2.0.4",
"lodash.isfinite": "^3.3.2",
"readable-stream": "^3.4.0",
"xml-element-string": "^1.0.0"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
},
"lodash.fill": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/lodash.fill/-/lodash.fill-3.4.0.tgz",
"integrity": "sha1-o8dK5kDQU63w3CB5+HIHiOi/74U="
},
"lodash.isfinite": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
"integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M="
},
"lodash.isfunction": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
"integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
},
"lodash.padend": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
"integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4="
},
"lodash.padstart": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz",
"integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs="
},
"node-stream-zip": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.12.0.tgz",
"integrity": "sha512-HZ3XehqShTFj9gHauRJ3Bri9eiCTOII7/crtXzURtT14NdnOFs9Ia5E82W7z3izVBNx760tqwddxrBJVG52Y1Q=="
},
"pcb-stackup": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/pcb-stackup/-/pcb-stackup-4.2.5.tgz",
"integrity": "sha512-js/8fAjinLgyK9znctFKwidbDohMCJlhzLID44PU3WSkd2e9zC62YIomNF0/MJXwoE5VtEymAnTXZzzIwT39OA==",
"requires": {
"@tracespace/xml-id": "^4.0.0",
"@types/node": "^13.1.6",
"gerber-to-svg": "^4.2.5",
"pcb-stackup-core": "^4.2.5",
"run-parallel": "^1.1.9",
"run-waterfall": "^1.1.6",
"whats-that-gerber": "^4.2.2",
"xtend": "^4.0.2"
}
},
"pcb-stackup-core": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/pcb-stackup-core/-/pcb-stackup-core-4.2.5.tgz",
"integrity": "sha512-iXx3khjlgh+mE7ucW8EFKFHLZmAsGViOdcYW0J6nV25Xxsyp/NMMiGuEbIpCt6nRmkScM5WZ0ROdGTnTrmAtKA==",
"requires": {
"@tracespace/xml-id": "^4.0.0",
"@types/node": "^13.1.6",
"color-string": "^1.5.3",
"gerber-to-svg": "^4.2.5",
"viewbox": "^1.0.0",
"whats-that-gerber": "^4.2.2",
"xml-element-string": "^1.0.0",
"xtend": "^4.0.2"
}
},
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
},
"run-parallel": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
"integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw=="
},
"run-waterfall": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz",
"integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ=="
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
"requires": {
"is-arrayish": "^0.3.1"
}
},
"string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"requires": {
"safe-buffer": "~5.2.0"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"viewbox": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/viewbox/-/viewbox-1.0.0.tgz",
"integrity": "sha1-eWDGEGvx1+yiG4lLagZlvjaNgso="
},
"whats-that-gerber": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/whats-that-gerber/-/whats-that-gerber-4.2.2.tgz",
"integrity": "sha512-2agpMEj0a0SYYdvxlRJHMEiTbu25qgri5Le6Q1acKjU1s567J6hK6henR0a7I1XWNFxsALk5hl45xR1ZJFukFQ==",
"requires": {
"xtend": "^4.0.2"
}
},
"xml-element-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/xml-element-string/-/xml-element-string-1.0.0.tgz",
"integrity": "sha1-g8XWM1Jl8nCZJEwzrgyT1Ke6DIw=",
"requires": {
"escape-html": "^1.0.3"
}
},
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
}
}
}

23
package.json Normal file
View File

@ -0,0 +1,23 @@
{
"name": "npe_gerber",
"version": "1.0.0",
"description": "Create a PCB image from gerber files",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/nplayfair/npe_gerber.git"
},
"author": "nplayfair",
"license": "ISC",
"bugs": {
"url": "https://github.com/nplayfair/npe_gerber/issues"
},
"homepage": "https://github.com/nplayfair/npe_gerber#readme",
"dependencies": {
"node-stream-zip": "^1.12.0",
"pcb-stackup": "^4.2.5"
}
}