Start working on file processing functions
This commit is contained in:
parent
3eb6f68926
commit
a1b06686fe
156
fileProcessor.js
Normal file
156
fileProcessor.js
Normal file
@ -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;
|
59
index.js
59
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')
|
98
package-lock.json
generated
98
package-lock.json
generated
@ -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",
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user