-
-
Notifications
You must be signed in to change notification settings - Fork 100
/
index.js
126 lines (96 loc) · 2.92 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// pcb-stackup main
'use strict'
var gerberToSvg = require('gerber-to-svg')
var shortId = require('shortid')
var whatsThatGerber = require('whats-that-gerber')
var createStackup = require('pcb-stackup-core')
var getInvalidLayers = function(layers) {
var hasNameOrType = function(layer) {
return layer.filename || layer.layerType
}
var hasValidType = function(layer) {
if (layer.layerType == null) {
return true
}
return whatsThatGerber.isValidType(layer.layerType)
}
return layers.reduce(function(result, layer, i) {
if (!hasNameOrType(layer)) {
result.argErrors.push(i)
}
if (!hasValidType(layer)) {
result.layerTypeErrors.push(i + ': "' + layer.layerType + '"')
}
return result
}, {argErrors: [], layerTypeErrors: []} )
}
var pcbStackup = function(layers, options, done) {
if (typeof options === 'function') {
done = options
options = {}
}
var invalidLayers = getInvalidLayers(layers)
var msg
if (invalidLayers.argErrors.length) {
msg = 'No filename or layerType given for layer(s): ' + invalidLayers.argErrors.join(', ')
return done(new Error(msg))
}
if (invalidLayers.layerTypeErrors.length) {
msg = 'Invalid layer type given for layer(s): ' + invalidLayers.layerTypeErrors.join(', ')
return done(new Error(msg))
}
options.id = options.id || shortId.generate()
if (options.maskWithOutline == null) {
options.maskWithOutline = true
}
if (options.createElement != null) {
layers.forEach(function(layer) {
layer.options = layer.options || {}
layer.options.createElement = options.createElement
})
}
var layerCount = layers.length
var stackupLayers = []
var finishLayer = function() {
if (--layerCount < 1) {
var stackup = createStackup(stackupLayers, options)
stackup.layers = stackupLayers.map(function(layer) {
return {
layerType: layer.type,
converter: layer.converter,
options: layer.options
}
})
return done(null, stackup)
}
}
if (layerCount === 0) {
return finishLayer()
}
layers.forEach(function(layer) {
var layerType = layer.layerType || whatsThatGerber(layer.filename)
var layerOptions = layer.options || {}
layerOptions.id = layerOptions.id || shortId.generate()
layerOptions.plotAsOutline = layerOptions.plotAsOutline || (layerType === 'out' )
if (options.outlineGapFill != null && layerOptions.plotAsOutline) {
layerOptions.plotAsOutline = options.outlineGapFill
}
var usePreConverted = layer.gerber == null
var converter
if (usePreConverted) {
converter = layer.converter
}
else {
converter = gerberToSvg(layer.gerber, layerOptions, finishLayer)
}
stackupLayers.push({
type: layerType,
converter: converter,
options: layerOptions
})
if (usePreConverted) {
finishLayer()
}
})
}
module.exports = pcbStackup