From a1b06686fe5bf90150d9b4454ef5223b25377e87 Mon Sep 17 00:00:00 2001 From: Nick Playfair Date: Wed, 27 Jan 2021 20:18:30 +0000 Subject: [PATCH] Start working on file processing functions --- fileProcessor.js | 156 ++++++++++++++++++++++++++++++++++++++++++++++ index.js | 59 ++++++++++++------ package-lock.json | 98 +++++++++++++++++++++++++++++ package.json | 2 + 4 files changed, 296 insertions(+), 19 deletions(-) create mode 100644 fileProcessor.js diff --git a/fileProcessor.js b/fileProcessor.js new file mode 100644 index 0000000..543367e --- /dev/null +++ b/fileProcessor.js @@ -0,0 +1,156 @@ +const StreamZip = require('node-stream-zip'); +const fs = require('fs-extra'); +const path = require('path'); + +// Filenames we need to extract from the archive +const gerberFiles = [ + 'CAMOutputs/DrillFiles/drills.xln', + 'CAMOutputs/GerberFiles/copper_top.gbr', + 'CAMOutputs/GerberFiles/silkscreen_top.gbr', + 'CAMOutputs/GerberFiles/soldermask_top.gbr', + 'CAMOutputs/GerberFiles/solderpaste_top.gbr', + 'CAMOutputs/GerberFiles/profile.gbr' +] + +let newLayers = []; + +// Use a sample zip archive + +const zip = new StreamZip({ + file: './gerber/sho_v2.zip', + storeEntries: true +}); + +function countFiles() { + // Read the zip file + zip.on('ready', () => { + console.log('Entries read: ' + zip.entriesCount); + for (const entry of Object.values(zip.entries())) { + const desc = entry.isDirectory ? 'directory' : `${entry.size} bytes`; + console.log(`Entry ${entry.name}: ${desc}`); + } + zip.close() + }); +} + +function getFiles() { + // Get the gerber files from the zip archive + zip.on('ready', () => { + let fileName = 'CAMOutputs/GerberFiles/silkscreen_top.gbr'; + zip.stream(fileName, (err, stm) => { + newLayers.push({ + filename: fileName, + gerber: stm + }); + stm.on('end', () => zip.close()); + console.log(newLayers); + }); + }); +} + +async function getLayers2(fileName) { + const tempDir = path.join(__dirname, 'gerber', 'tmp', 'archive'); + const archive = new StreamZip({ + file: fileName, + storeEntries: true + }); + try { + archive.on('ready', () => { + fs.mkdirSync(tempDir, { recursive: true }); + archive.extract(null, tempDir, (err, count) => { + console.log(err ? 'Extract error' : `Extracted ${count} entries`); + const layers = gerberFiles.map(fileName => ({ + filename: fileName, + gerber: fs.createReadStream(path.join(tempDir, fileName)) + })); + archive.close(); + return layers; + }); + }); + } catch (err) { + console.error(err); + } +} + +async function getLayers(fileName) { + try { + const tempDir = path.join(__dirname, 'gerber', 'tmp', 'archive'); + extractArchive(fileName) + .then(numfiles => { + // const layers = gerberFiles.map(fileName => ({ + // filename: fileName, + // gerber: fs.createReadStream(path.join(tempDir, fileName)) + // })); + // console.log(layers); + console.log(`${numfiles} files extracted successfully`); + }) + .catch(e => { + console.log(e); + }) + } catch (err) { + console.error(err); + } +} + +function extractArchive(fileName) { + // Configure archive to use + const archive = new StreamZip({ + file: fileName, + storeEntries: true + }); + return new Promise((resolve, reject) => { + // Try to extract + archive.on('ready', () => { + let extDir = path.join(__dirname, 'gerber', 'tmp', 'archive'); + fs.mkdirSync(extDir, { recursive: true }); + archive.extract(null, extDir, (err, count) => { + if(!err) { + archive.close(); + resolve(count); + } else { + const errMsg = 'Error extracting archive'; + console.err(errMsg); + archive.close(); + reject(errMsg) + } + }) + }) + }) +} + +// Helper methods +function validFiles(file) { + return gerberFiles.includes(file); +} + +function layerBuild(filename) { + fs.createReadStream(filename); +} + +async function cleanupFiles() { + try { + let folder = path.join(__dirname, 'gerber', 'tmp'); + await fs.emptyDirSync(folder); + console.log('Temp files removed.'); + } catch (err) { + console.error(err); + } +} + +function getStream(fileName) { + let stream; + zip.on('ready', () => { + stream = zip.entryDataSync(fileName); + zip.close(); + console.log(stream); + }) +} + + +// We want to return an array of layers + + +exports.countFiles = countFiles; +exports.extractArchive = extractArchive; +exports.cleanupFiles = cleanupFiles; +exports.getLayers = getLayers; \ No newline at end of file diff --git a/index.js b/index.js index 2b4ca44..dba97d5 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,8 @@ const fs = require('fs'); +const { file } = require('jszip'); const pcbStackup = require('pcb-stackup'); const sharp = require('sharp'); +const fileProc = require('./fileProcessor.js'); // Configuration const resizeWidth = 600; @@ -9,7 +11,7 @@ const compLevel = 1; const destfile = './gerber/pcb3.png'; //Sample gerber -const fileNames = [ +const sampleNames = [ './gerber/default/copper_top.gbr', './gerber/default/drill_1_16.xln', './gerber/default/silkscreen_top.gbr', @@ -18,25 +20,44 @@ const fileNames = [ './gerber/default/profile.gbr', ] -const layers = fileNames.map(filename => ({ +const layers = sampleNames.map(filename => ({ filename, gerber: fs.createReadStream(filename), })); -pcbStackup(layers).then(stackup => { - // Create buffer from SVG string - sharp(Buffer.from(stackup.top.svg), { density: density }) - .resize({ width: resizeWidth }) - .png({ - compressionLevel: compLevel }) - .toFile(destfile) - .then((info) => { - console.log(info) - }) - .catch((e) => { - console.error(e); - }) -}) -.catch((e) => { - console.error(e); -}); +// pcbStackup(layers).then(stackup => { +// // Create buffer from SVG string +// sharp(Buffer.from(stackup.top.svg), { density: density }) +// .resize({ width: resizeWidth }) +// .png({ +// compressionLevel: compLevel }) +// .toFile(destfile) +// .then((info) => { +// console.log(info) +// }) +// .catch((e) => { +// console.error(e); +// }) +// }) +// .catch((e) => { +// console.error(e); +// }); + +// fileProc.jsTest(); +// console.log(layers); + +// fileProc.getLayers(); +// fileProc.getStream('CAMOutputs/GerberFiles/silkscreen_top.gbr'); +// fileProc.extractArchive('./gerber/sho_v2.zip') +// fileProc.cleanupFiles(); + +// async () => { +// const templayers = await fileProc.getLayers('./gerber/sho_v2.zip'); +// console.log(templayers); +// } +// fileProc.extractArchive('./gerber/sho_v2.zip') +// .then(msg => { +// console.log('done'); +// }) + +fileProc.getLayers('./gerber/sho_v2.zip') \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 682dfaf..61bbe05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,6 +67,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -195,6 +200,17 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -257,6 +273,11 @@ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -267,6 +288,11 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -295,6 +321,63 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jszip": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lodash.fill": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/lodash.fill/-/lodash.fill-3.4.0.tgz", @@ -407,6 +490,11 @@ "wrappy": "1" } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "pcb-stackup": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/pcb-stackup/-/pcb-stackup-4.2.5.tgz", @@ -534,6 +622,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, "sharp": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.27.0.tgz", @@ -656,6 +749,11 @@ "safe-buffer": "^5.0.1" } }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 34cc01f..d323d78 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ }, "homepage": "https://github.com/nplayfair/npe_gerber#readme", "dependencies": { + "fs-extra": "^9.1.0", + "jszip": "^3.5.0", "node-stream-zip": "^1.12.0", "pcb-stackup": "^4.2.5", "sharp": "^0.27.0"