From bec6b26269fee8d5f8d0a8b9680e8471e288d8ab Mon Sep 17 00:00:00 2001 From: Nick Playfair Date: Tue, 26 Jan 2021 21:47:10 +0000 Subject: [PATCH] Initial commit --- .gitignore | 4 + README.md | 4 +- index.js | 32 +++++++ package-lock.json | 221 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 23 +++++ 5 files changed, 283 insertions(+), 1 deletion(-) create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 6704566..563a36d 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,7 @@ dist # TernJS port file .tern-port + +.DS_Store +gerber/ +hello.txt \ No newline at end of file diff --git a/README.md b/README.md index aff0fb6..a6bb98b 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -# npe_gerber \ No newline at end of file +# npe_gerber + +Requires node version 10 or higher \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..e00a027 --- /dev/null +++ b/index.js @@ -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); +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..10ded0d --- /dev/null +++ b/package-lock.json @@ -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==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f1cd578 --- /dev/null +++ b/package.json @@ -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" + } +}