forked from tracespace/tracespace
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
110 lines (85 loc) · 2.6 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
// pcb-stackup main
'use strict'
var extend = require('xtend')
var xid = require('@tracespace/xml-id')
var gerberToSvg = require('gerber-to-svg')
var createStackup = require('pcb-stackup-core')
var wtg = require('whats-that-gerber')
var getFilename = function(layer) {
return layer.filename
}
var getValidationMessage = function(layer) {
var result = wtg.validate(layer)
if (layer.filename || result.valid) return ''
if (!layer.type) return 'is missing filename or side/type'
return 'has invalid side/type (' + layer.side + '/' + layer.type + ')'
}
var pcbStackup = function(layers, options, done) {
if (typeof options === 'function') {
done = options
options = {}
} else if (options == null) {
options = {}
}
var validationMessage = layers
.map(getValidationMessage)
.map(function(msg, i) {
return msg && 'layer ' + i + ' ' + msg
})
.filter(Boolean)
.join(', ')
if (validationMessage) return done(new Error(validationMessage))
options.id = options.id || xid.random()
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
return done(null, stackup)
}
}
if (layerCount === 0) {
return finishLayer()
}
var gerberIds = wtg(layers.map(getFilename))
layers.forEach(function(layer) {
var gerberId = gerberIds[layer.filename]
var layerSide = layer.side || gerberId.side
var layerType = layer.type || gerberId.type
var layerOptions = extend(layer.options)
layerOptions.id = layerOptions.id || xid.random()
layerOptions.plotAsOutline =
layerOptions.plotAsOutline || layerType === wtg.TYPE_OUTLINE
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({
side: layerSide,
type: layerType,
filename: layer.filename,
converter: converter,
options: layerOptions,
})
if (usePreConverted) {
finishLayer()
}
})
}
module.exports = pcbStackup