Commit | Line | Data |
---|---|---|
51129dfe IS |
1 | <!DOCTYPE html>\r |
2 | <html lang="en">\r | |
3 | \r | |
4 | <head>\r | |
5 | <meta charset="UTF-8">\r | |
6 | <meta name="viewport" content="width=device-width, initial-scale=1.0">\r | |
7 | <title>Interactive BOM for KiCAD</title>\r | |
8 | <style type="text/css">\r | |
9 | :root {\r | |
10 | --pcb-edge-color: black;\r | |
11 | --pad-color: #878787;\r | |
12 | --pad-color-highlight: #D04040;\r | |
13 | --pin1-outline-color: #ffb629;\r | |
14 | --pin1-outline-color-highlight: #b4ff03;\r | |
15 | }\r | |
16 | \r | |
17 | html, body {\r | |
18 | margin: 0px;\r | |
19 | height: 100%;\r | |
20 | font-family: Verdana, sans-serif;\r | |
21 | }\r | |
22 | \r | |
23 | .dark {\r | |
24 | --pcb-edge-color: #eee;\r | |
25 | --pad-color: #808080;\r | |
26 | --pin1-outline-color: #ffa800;\r | |
27 | --pin1-outline-color-highlight: #ccff00;\r | |
28 | background-color: #252c30;\r | |
29 | color: #eee;\r | |
30 | }\r | |
31 | \r | |
32 | button {\r | |
33 | background-color: #eee;\r | |
34 | border: 1px solid #888;\r | |
35 | color: black;\r | |
36 | height: 44px;\r | |
37 | width: 44px;\r | |
38 | text-align: center;\r | |
39 | text-decoration: none;\r | |
40 | display: inline-block;\r | |
41 | font-size: 14px;\r | |
42 | font-weight: bolder;\r | |
43 | }\r | |
44 | \r | |
45 | .dark button {\r | |
46 | /* This will be inverted */\r | |
47 | background-color: #c3b7b5;\r | |
48 | }\r | |
49 | \r | |
50 | button.depressed {\r | |
51 | background-color: #0a0;\r | |
52 | color: white;\r | |
53 | }\r | |
54 | \r | |
55 | .dark button.depressed {\r | |
56 | /* This will be inverted */\r | |
57 | background-color: #b3b;\r | |
58 | }\r | |
59 | \r | |
60 | button:focus {\r | |
61 | outline: 0;\r | |
62 | }\r | |
63 | \r | |
64 | button#tb-btn {\r | |
65 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");\r | |
66 | background-size: 32px 32px;\r | |
67 | background-position: 5px 5px;\r | |
68 | background-repeat: no-repeat;\r | |
69 | }\r | |
70 | \r | |
71 | button#lr-btn {\r | |
72 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");\r | |
73 | background-size: 32px 32px;\r | |
74 | background-position: 5px 5px;\r | |
75 | background-repeat: no-repeat;\r | |
76 | }\r | |
77 | \r | |
78 | button#bom-btn {\r | |
79 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");\r | |
80 | background-size: 32px 32px;\r | |
81 | background-position: 5px 5px;\r | |
82 | background-repeat: no-repeat;\r | |
83 | }\r | |
84 | \r | |
85 | button#copy {\r | |
86 | background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");\r | |
87 | background-position: 6px 6px;\r | |
88 | background-repeat: no-repeat;\r | |
89 | background-size: 26px 26px;\r | |
90 | border-radius: 6px;\r | |
91 | height: 40px;\r | |
92 | width: 40px;\r | |
93 | margin: 10px 5px;\r | |
94 | }\r | |
95 | \r | |
96 | button#copy:active {\r | |
97 | box-shadow: inset 0px 0px 5px #6c6c6c;\r | |
98 | }\r | |
99 | \r | |
100 | textarea.clipboard-temp {\r | |
101 | position: fixed;\r | |
102 | top: 0;\r | |
103 | left: 0;\r | |
104 | width: 2em;\r | |
105 | height: 2em;\r | |
106 | padding: 0;\r | |
107 | border: None;\r | |
108 | outline: None;\r | |
109 | box-shadow: None;\r | |
110 | background: transparent;\r | |
111 | }\r | |
112 | \r | |
113 | .left-most-button {\r | |
114 | border-right: 0;\r | |
115 | border-top-left-radius: 6px;\r | |
116 | border-bottom-left-radius: 6px;\r | |
117 | }\r | |
118 | \r | |
119 | .middle-button {\r | |
120 | border-right: 0;\r | |
121 | }\r | |
122 | \r | |
123 | .right-most-button {\r | |
124 | border-top-right-radius: 6px;\r | |
125 | border-bottom-right-radius: 6px;\r | |
126 | }\r | |
127 | \r | |
128 | .button-container {\r | |
129 | font-size: 0;\r | |
130 | }\r | |
131 | \r | |
132 | .dark .button-container {\r | |
133 | filter: invert(1);\r | |
134 | }\r | |
135 | \r | |
136 | @media print {\r | |
137 | .hideonprint {\r | |
138 | display: none;\r | |
139 | }\r | |
140 | }\r | |
141 | \r | |
142 | canvas {\r | |
143 | cursor: crosshair;\r | |
144 | }\r | |
145 | \r | |
146 | canvas:active {\r | |
147 | cursor: grabbing;\r | |
148 | }\r | |
149 | \r | |
150 | .fileinfo {\r | |
151 | width: 100%;\r | |
152 | max-width: 1000px;\r | |
153 | border: none;\r | |
154 | padding: 5px;\r | |
155 | }\r | |
156 | \r | |
157 | .fileinfo .title {\r | |
158 | font-size: 20pt;\r | |
159 | font-weight: bold;\r | |
160 | }\r | |
161 | \r | |
162 | .fileinfo td {\r | |
163 | overflow: hidden;\r | |
164 | white-space: nowrap;\r | |
165 | max-width: 1px;\r | |
166 | width: 50%;\r | |
167 | text-overflow: ellipsis;\r | |
168 | }\r | |
169 | \r | |
170 | .bom {\r | |
171 | border-collapse: collapse;\r | |
172 | font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;\r | |
173 | font-size: 10pt;\r | |
174 | table-layout: fixed;\r | |
175 | width: 100%;\r | |
176 | margin-top: 1px;\r | |
177 | }\r | |
178 | \r | |
179 | .bom th, .bom td {\r | |
180 | border: 1px solid black;\r | |
181 | padding: 5px;\r | |
182 | word-wrap: break-word;\r | |
183 | text-align: center;\r | |
184 | position: relative;\r | |
185 | }\r | |
186 | \r | |
187 | .dark .bom th, .dark .bom td {\r | |
188 | border: 1px solid #777;\r | |
189 | }\r | |
190 | \r | |
191 | .bom th {\r | |
192 | background-color: #CCCCCC;\r | |
193 | background-clip: padding-box;\r | |
194 | }\r | |
195 | \r | |
196 | .dark .bom th {\r | |
197 | background-color: #3b4749;\r | |
198 | }\r | |
199 | \r | |
200 | .bom tr.highlighted:nth-child(n) {\r | |
201 | background-color: #cfc;\r | |
202 | }\r | |
203 | \r | |
204 | .dark .bom tr.highlighted:nth-child(n) {\r | |
205 | background-color: #226022;\r | |
206 | }\r | |
207 | \r | |
208 | .bom tr:nth-child(even) {\r | |
209 | background-color: #f2f2f2;\r | |
210 | }\r | |
211 | \r | |
212 | .dark .bom tr:nth-child(even) {\r | |
213 | background-color: #313b40;\r | |
214 | }\r | |
215 | \r | |
216 | .bom tr {\r | |
217 | transition: background-color 0.2s;\r | |
218 | }\r | |
219 | \r | |
220 | .bom .numCol {\r | |
221 | width: 25px;\r | |
222 | }\r | |
223 | \r | |
224 | .bom .Description {\r | |
225 | width: 10%;\r | |
226 | }\r | |
227 | \r | |
228 | .bom .Part {\r | |
229 | width: 10%;\r | |
230 | }\r | |
231 | \r | |
232 | .bom .Value {\r | |
233 | width: 15%;\r | |
234 | }\r | |
235 | \r | |
236 | .bom .Quantity {\r | |
237 | width: 65px;\r | |
238 | }\r | |
239 | \r | |
240 | .bom th .sortmark {\r | |
241 | position: absolute;\r | |
242 | right: 1px;\r | |
243 | top: 1px;\r | |
244 | margin-top: -5px;\r | |
245 | border-width: 5px;\r | |
246 | border-style: solid;\r | |
247 | border-color: transparent transparent #221 transparent;\r | |
248 | transform-origin: 50% 85%;\r | |
249 | transition: opacity 0.2s, transform 0.4s;\r | |
250 | }\r | |
251 | \r | |
252 | .dark .bom th .sortmark {\r | |
253 | filter: invert(1);\r | |
254 | }\r | |
255 | \r | |
256 | .bom th .sortmark.none {\r | |
257 | opacity: 0;\r | |
258 | }\r | |
259 | \r | |
260 | .bom th .sortmark.desc {\r | |
261 | transform: rotate(180deg);\r | |
262 | }\r | |
263 | \r | |
264 | .bom th:hover .sortmark.none {\r | |
265 | opacity: 0.5;\r | |
266 | }\r | |
267 | \r | |
268 | .bom .bom-checkbox {\r | |
269 | width: 30px;\r | |
270 | position: relative;\r | |
271 | user-select: none;\r | |
272 | -moz-user-select: none;\r | |
273 | }\r | |
274 | \r | |
275 | .bom .bom-checkbox:before {\r | |
276 | content: "";\r | |
277 | position: absolute;\r | |
278 | border-width: 15px;\r | |
279 | border-style: solid;\r | |
280 | border-color: #51829f transparent transparent transparent;\r | |
281 | visibility: hidden;\r | |
282 | top: -15px;\r | |
283 | }\r | |
284 | \r | |
285 | .bom .bom-checkbox:after {\r | |
286 | content: "Double click to set/unset all";\r | |
287 | position: absolute;\r | |
288 | color: white;\r | |
289 | top: -35px;\r | |
290 | left: -26px;\r | |
291 | background: #51829f;\r | |
292 | padding: 5px 15px;\r | |
293 | border-radius: 8px;\r | |
294 | white-space: nowrap;\r | |
295 | visibility: hidden;\r | |
296 | }\r | |
297 | \r | |
298 | .bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {\r | |
299 | visibility: visible;\r | |
300 | transition: visibility 0.2s linear 1s;\r | |
301 | }\r | |
302 | \r | |
303 | .split {\r | |
304 | -webkit-box-sizing: border-box;\r | |
305 | -moz-box-sizing: border-box;\r | |
306 | box-sizing: border-box;\r | |
307 | overflow-y: auto;\r | |
308 | overflow-x: hidden;\r | |
309 | background-color: inherit;\r | |
310 | }\r | |
311 | \r | |
312 | .split.split-horizontal, .gutter.gutter-horizontal {\r | |
313 | height: 100%;\r | |
314 | float: left;\r | |
315 | }\r | |
316 | \r | |
317 | .gutter {\r | |
318 | background-color: #ddd;\r | |
319 | background-repeat: no-repeat;\r | |
320 | background-position: 50%;\r | |
321 | transition: background-color 0.3s;\r | |
322 | }\r | |
323 | \r | |
324 | .dark .gutter {\r | |
325 | background-color: #777;\r | |
326 | }\r | |
327 | \r | |
328 | .gutter.gutter-horizontal {\r | |
329 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');\r | |
330 | cursor: ew-resize;\r | |
331 | width: 5px;\r | |
332 | }\r | |
333 | \r | |
334 | .gutter.gutter-vertical {\r | |
335 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');\r | |
336 | cursor: ns-resize;\r | |
337 | height: 5px;\r | |
338 | }\r | |
339 | \r | |
340 | .searchbox {\r | |
341 | float: left;\r | |
342 | height: 40px;\r | |
343 | margin: 10px 5px;\r | |
344 | padding: 12px 32px;\r | |
345 | font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;\r | |
346 | font-size: 18px;\r | |
347 | box-sizing: border-box;\r | |
348 | border: 1px solid #888;\r | |
349 | border-radius: 6px;\r | |
350 | outline: none;\r | |
351 | background-color: #eee;\r | |
352 | transition: background-color 0.2s, border 0.2s;\r | |
353 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');\r | |
354 | background-position: 10px 10px;\r | |
355 | background-repeat: no-repeat;\r | |
356 | }\r | |
357 | \r | |
358 | .dark .searchbox {\r | |
359 | background-color: #111;\r | |
360 | color: #eee;\r | |
361 | }\r | |
362 | \r | |
363 | .searchbox::placeholder {\r | |
364 | color: #ccc;\r | |
365 | }\r | |
366 | \r | |
367 | .dark .searchbox::placeholder {\r | |
368 | color: #666;\r | |
369 | }\r | |
370 | \r | |
371 | .filter {\r | |
372 | width: calc(60% - 64px);\r | |
373 | }\r | |
374 | \r | |
375 | .reflookup {\r | |
376 | width: calc(40% - 10px);\r | |
377 | }\r | |
378 | \r | |
379 | input[type=text]:focus {\r | |
380 | background-color: white;\r | |
381 | border: 1px solid #333;\r | |
382 | }\r | |
383 | \r | |
384 | .dark input[type=text]:focus {\r | |
385 | background-color: #333;\r | |
386 | border: 1px solid #ccc;\r | |
387 | }\r | |
388 | \r | |
389 | mark.highlight {\r | |
390 | background-color: #5050ff;\r | |
391 | color: #fff;\r | |
392 | padding: 2px;\r | |
393 | border-radius: 6px;\r | |
394 | }\r | |
395 | \r | |
396 | .dark mark.highlight {\r | |
397 | background-color: #76a6da;\r | |
398 | color: #111;\r | |
399 | }\r | |
400 | \r | |
401 | .menubtn {\r | |
402 | background-color: white;\r | |
403 | font-size: 16px;\r | |
404 | border: none;\r | |
405 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");\r | |
406 | background-position: center;\r | |
407 | background-repeat: no-repeat;\r | |
408 | }\r | |
409 | \r | |
410 | .dark .menubtn {\r | |
411 | filter: invert(1);\r | |
412 | }\r | |
413 | \r | |
414 | .menu {\r | |
415 | position: relative;\r | |
416 | display: inline-block;\r | |
417 | }\r | |
418 | \r | |
419 | .menu-content {\r | |
420 | display: none;\r | |
421 | position: absolute;\r | |
422 | background-color: white;\r | |
423 | right: 0;\r | |
424 | min-width: 300px;\r | |
425 | box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);\r | |
426 | z-index: 100;\r | |
427 | padding: 8px;\r | |
428 | }\r | |
429 | \r | |
430 | .dark .menu-content {\r | |
431 | background-color: #111;\r | |
432 | }\r | |
433 | \r | |
434 | .menu:hover .menu-content {\r | |
435 | display: block;\r | |
436 | }\r | |
437 | \r | |
438 | .menu:hover .menubtn {\r | |
439 | background-color: #eee;\r | |
440 | }\r | |
441 | \r | |
442 | .dark .menu:hover .menubtn {}\r | |
443 | \r | |
444 | .menu-label {\r | |
445 | display: inline-block;\r | |
446 | padding: 8px;\r | |
447 | border: 1px solid #ccc;\r | |
448 | border-top: 0;\r | |
449 | width: calc(100% - 18px);\r | |
450 | }\r | |
451 | \r | |
452 | .menu-label-top {\r | |
453 | border-top: 1px solid #ccc;\r | |
454 | }\r | |
455 | \r | |
456 | .menu-textbox {\r | |
457 | float: left;\r | |
458 | height: 24px;\r | |
459 | margin: 10px 5px;\r | |
460 | padding: 5px 5px;\r | |
461 | font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;\r | |
462 | font-size: 14px;\r | |
463 | box-sizing: border-box;\r | |
464 | border: 1px solid #888;\r | |
465 | border-radius: 4px;\r | |
466 | outline: none;\r | |
467 | background-color: #eee;\r | |
468 | transition: background-color 0.2s, border 0.2s;\r | |
469 | width: calc(100% - 10px);\r | |
470 | }\r | |
471 | \r | |
472 | .dark .menu-textbox {\r | |
473 | background-color: #222;\r | |
474 | color: #eee;\r | |
475 | }\r | |
476 | \r | |
477 | #topmostdiv {\r | |
478 | transition: background-color 0.3s;\r | |
479 | }\r | |
480 | \r | |
481 | #top {\r | |
482 | height: 78px;\r | |
483 | border-bottom: 2px solid black;\r | |
484 | }\r | |
485 | \r | |
486 | .dark #top {\r | |
487 | border-bottom: 2px solid #ccc;\r | |
488 | }\r | |
489 | \r | |
490 | #dbg {\r | |
491 | display: block;\r | |
492 | }\r | |
493 | \r | |
494 | ::-webkit-scrollbar {\r | |
495 | width: 8px;\r | |
496 | }\r | |
497 | \r | |
498 | ::-webkit-scrollbar-track {\r | |
499 | background: #aaa;\r | |
500 | }\r | |
501 | \r | |
502 | ::-webkit-scrollbar-thumb {\r | |
503 | background: #666;\r | |
504 | border-radius: 3px;\r | |
505 | }\r | |
506 | \r | |
507 | ::-webkit-scrollbar-thumb:hover {\r | |
508 | background: #555;\r | |
509 | }\r | |
510 | \r | |
511 | .slider {\r | |
512 | -webkit-appearance: none;\r | |
513 | width: 100%;\r | |
514 | margin: 3px 0;\r | |
515 | padding: 0;\r | |
516 | outline: none;\r | |
517 | opacity: 0.7;\r | |
518 | -webkit-transition: .2s;\r | |
519 | transition: opacity .2s;\r | |
520 | border-radius: 3px;\r | |
521 | }\r | |
522 | \r | |
523 | .slider:hover {\r | |
524 | opacity: 1;\r | |
525 | }\r | |
526 | \r | |
527 | .slider:focus {\r | |
528 | outline: none;\r | |
529 | }\r | |
530 | \r | |
531 | .slider::-webkit-slider-runnable-track {\r | |
532 | -webkit-appearance: none;\r | |
533 | width: 100%;\r | |
534 | height: 8px;\r | |
535 | background: #d3d3d3;\r | |
536 | border-radius: 3px;\r | |
537 | border: none;\r | |
538 | }\r | |
539 | \r | |
540 | .slider::-webkit-slider-thumb {\r | |
541 | -webkit-appearance: none;\r | |
542 | width: 15px;\r | |
543 | height: 15px;\r | |
544 | border-radius: 50%;\r | |
545 | background: #0a0;\r | |
546 | cursor: pointer;\r | |
547 | margin-top: -4px;\r | |
548 | }\r | |
549 | \r | |
550 | .dark .slider::-webkit-slider-thumb {\r | |
551 | background: #3d3;\r | |
552 | }\r | |
553 | \r | |
554 | .slider::-moz-range-thumb {\r | |
555 | width: 15px;\r | |
556 | height: 15px;\r | |
557 | border-radius: 50%;\r | |
558 | background: #0a0;\r | |
559 | cursor: pointer;\r | |
560 | }\r | |
561 | \r | |
562 | .slider::-moz-range-track {\r | |
563 | height: 8px;\r | |
564 | background: #d3d3d3;\r | |
565 | border-radius: 3px;\r | |
566 | }\r | |
567 | \r | |
568 | .dark .slider::-moz-range-thumb {\r | |
569 | background: #3d3;\r | |
570 | }\r | |
571 | \r | |
572 | .slider::-ms-track {\r | |
573 | width: 100%;\r | |
574 | height: 8px;\r | |
575 | border-width: 3px 0;\r | |
576 | background: transparent;\r | |
577 | border-color: transparent;\r | |
578 | color: transparent;\r | |
579 | transition: opacity .2s;\r | |
580 | }\r | |
581 | \r | |
582 | .slider::-ms-fill-lower {\r | |
583 | background: #d3d3d3;\r | |
584 | border: none;\r | |
585 | border-radius: 3px;\r | |
586 | }\r | |
587 | \r | |
588 | .slider::-ms-fill-upper {\r | |
589 | background: #d3d3d3;\r | |
590 | border: none;\r | |
591 | border-radius: 3px;\r | |
592 | }\r | |
593 | \r | |
594 | .slider::-ms-thumb {\r | |
595 | width: 15px;\r | |
596 | height: 15px;\r | |
597 | border-radius: 50%;\r | |
598 | background: #0a0;\r | |
599 | cursor: pointer;\r | |
600 | margin: 0;\r | |
601 | }\r | |
602 | \r | |
603 | .shameless-plug {\r | |
604 | font-size: 0.8em;\r | |
605 | text-align: center;\r | |
606 | display: block;\r | |
607 | }\r | |
608 | \r | |
609 | .shameless-plug a {\r | |
610 | color: #0278a4;\r | |
611 | }\r | |
612 | \r | |
613 | .dark .shameless-plug a {\r | |
614 | color: #00b9fd;\r | |
615 | }\r | |
616 | \r | |
617 | </style>\r | |
618 | <script type="text/javascript" >\r | |
619 | ///////////////////////////////////////////////\r | |
620 | /*\r | |
621 | Split.js - v1.3.5\r | |
622 | MIT License\r | |
623 | https://github.com/nathancahill/Split.js\r | |
624 | */\r | |
625 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});\r | |
626 | \r | |
627 | ///////////////////////////////////////////////\r | |
628 | \r | |
629 | ///////////////////////////////////////////////\r | |
630 | var config = {"redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "layer_view": "FB"}\r | |
631 | ///////////////////////////////////////////////\r | |
632 | \r | |
633 | ///////////////////////////////////////////////\r | |
273f8d46 | 634 | var pcbdata = {"font_data": {"J": {"l": [[[0.5238095238095237, -1.0476190476190474], [0.5238095238095237, -0.3333333333333333], [0.47619047619047616, -0.19047619047619047], [0.38095238095238093, -0.09523809523809523], [0.23809523809523808, -0.047619047619047616], [0.14285714285714285, -0.047619047619047616]]], "w": 0.7619047619047619}, "*": {"l": [[[0.38095238095238093, -1.0476190476190474], [0.38095238095238093, -0.8095238095238095]], [[0.14285714285714285, -0.9047619047619047], [0.38095238095238093, -0.8095238095238095], [0.6190476190476191, -0.9047619047619047]], [[0.23809523809523808, -0.6190476190476191], [0.38095238095238093, -0.8095238095238095], [0.5238095238095237, -0.6190476190476191]]], "w": 0.7619047619047619}, "N": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.8095238095238094, -0.047619047619047616], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "1": {"l": [[[0.7619047619047619, -0.047619047619047616], [0.19047619047619047, -0.047619047619047616]], [[0.47619047619047616, -0.047619047619047616], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -0.9047619047619047], [0.2857142857142857, -0.8095238095238095], [0.19047619047619047, -0.7619047619047619]]], "w": 0.9523809523809523}, "P": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "3": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.7619047619047619, -1.0476190476190474], [0.42857142857142855, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.2857142857142857, -0.047619047619047616], [0.19047619047619047, -0.09523809523809523], [0.14285714285714285, -0.14285714285714285]]], "w": 0.9523809523809523}, "2": {"l": [[[0.19047619047619047, -0.9523809523809523], [0.23809523809523808, -1.0], [0.3333333333333333, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666666, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.7619047619047619], [0.7142857142857142, -0.6190476190476191], [0.14285714285714285, -0.047619047619047616], [0.7619047619047619, -0.047619047619047616]]], "w": 0.9523809523809523}, "5": {"l": [[[0.7142857142857142, -1.0476190476190474], [0.23809523809523808, -1.0476190476190474], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6190476190476191], [0.3333333333333333, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.14285714285714285]]], "w": 0.9523809523809523}, "4": {"l": [[[0.6666666666666666, -0.7142857142857142], [0.6666666666666666, -0.047619047619047616]], [[0.42857142857142855, -1.0952380952380951], [0.19047619047619047, -0.38095238095238093], [0.8095238095238095, -0.38095238095238093]]], "w": 0.9523809523809523}, "7": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.8095238095238095, -1.0476190476190474], [0.38095238095238093, -0.047619047619047616]]], "w": 0.9523809523809523}, "6": {"l": [[[0.6666666666666666, -1.0476190476190474], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -1.0], [0.3333333333333333, -0.9523809523809523], [0.23809523809523808, -0.8095238095238095], [0.19047619047619047, -0.6190476190476191], [0.19047619047619047, -0.23809523809523808], [0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.47619047619047616], [0.7142857142857142, -0.5714285714285714], [0.6666666666666666, -0.6190476190476191], [0.5714285714285714, -0.6666666666666666], [0.38095238095238093, -0.6666666666666666], [0.2857142857142857, -0.6190476190476191], [0.23809523809523808, -0.5714285714285714], [0.19047619047619047, -0.47619047619047616]]], "w": 0.9523809523809523}, "9": {"l": [[[0.2857142857142857, -0.047619047619047616], [0.47619047619047616, -0.047619047619047616], [0.5714285714285714, -0.09523809523809523], [0.6190476190476191, -0.14285714285714285], [0.7142857142857142, -0.2857142857142857], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.8571428571428571], [0.7142857142857142, -0.9523809523809523], [0.6666666666666666, -1.0], [0.5714285714285714, -1.0476190476190474], [0.38095238095238093, -1.0476190476190474], [0.2857142857142857, -1.0], [0.23809523809523808, -0.9523809523809523], [0.19047619047619047, -0.8571428571428571], [0.19047619047619047, -0.6190476190476191], [0.23809523809523808, -0.5238095238095237], [0.2857142857142857, -0.47619047619047616], [0.38095238095238093, -0.42857142857142855], [0.5714285714285714, -0.42857142857142855], [0.6666666666666666, -0.47619047619047616], [0.7142857142857142, -0.5238095238095237], [0.7619047619047619, -0.6190476190476191]]], "w": 0.9523809523809523}, "8": {"l": [[[0.38095238095238093, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.23809523809523808, -0.7142857142857142], [0.19047619047619047, -0.8095238095238095], [0.19047619047619047, -0.8571428571428571], [0.23809523809523808, -0.9523809523809523], [0.2857142857142857, -1.0], [0.38095238095238093, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666666, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.8095238095238095], [0.7142857142857142, -0.7142857142857142], [0.6666666666666666, -0.6666666666666666], [0.5714285714285714, -0.6190476190476191], [0.38095238095238093, -0.6190476190476191], [0.2857142857142857, -0.5714285714285714], [0.23809523809523808, -0.5238095238095237], [0.19047619047619047, -0.42857142857142855], [0.19047619047619047, -0.23809523809523808], [0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.42857142857142855], [0.7142857142857142, -0.5238095238095237], [0.6666666666666666, -0.5714285714285714], [0.5714285714285714, -0.6190476190476191]]], "w": 0.9523809523809523}, "R": {"l": [[[0.8095238095238094, -0.047619047619047616], [0.4761904761904761, -0.5238095238095237]], [[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "U": {"l": [[[0.23809523809523803, -1.0476190476190474], [0.23809523809523803, -0.23809523809523808], [0.28571428571428564, -0.14285714285714285], [0.33333333333333326, -0.09523809523809523], [0.4285714285714285, -0.047619047619047616], [0.619047619047619, -0.047619047619047616], [0.7142857142857142, -0.09523809523809523], [0.7619047619047619, -0.14285714285714285], [0.8095238095238094, -0.23809523809523808], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}}, "modules": [{"layer": "F", "center": [94.726, 64.5], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [94.726, 64.5], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H1", "bbox": {"pos": [92.250999, 62.024998999999994], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [94.726, 144.00199999999998], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [94.726, 144.00199999999998], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H2", "bbox": {"pos": [92.250999, 141.526999], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [179.054, 144.00199999999998], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [179.054, 144.00199999999998], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H3", "bbox": {"pos": [176.57899899999998, 141.526999], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [179.054, 64.5], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [179.054, 64.5], "drillsize": [2.1999999999999997, 2.1999999999999997], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.1999999999999997, 2.1999999999999997]}], "drawings": [], "ref": "H4", "bbox": {"pos": [176.57899899999998, 62.024998999999994], "size": [4.950002, 4.950002]}}, {"layer": "F", "center": [99.298, 112.252], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 94.472], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 97.012], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 99.55199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 102.092], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 104.63199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 107.172], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 109.71199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 112.252], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J1", "bbox": {"pos": [95.66579899999999, 91.982799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [175.244, 137.652], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 119.872], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 122.41199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 124.952], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 127.49199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 130.03199999999998], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 132.572], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 135.112], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 137.652], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J2", "bbox": {"pos": [171.611799, 117.38279899999999], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [99.298, 86.85199999999999], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 69.072], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 71.612], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 74.152], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 76.692], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 79.232], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 81.77199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 84.312], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 86.85199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J3", "bbox": {"pos": [95.66579899999999, 66.582799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [175.244, 86.85199999999999], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 69.072], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 71.612], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 74.152], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 76.692], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 79.232], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 81.77199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 84.312], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 86.85199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J4", "bbox": {"pos": [171.611799, 66.582799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [99.298, 137.652], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 119.872], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 122.41199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 124.952], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 127.49199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 130.03199999999998], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 132.572], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 135.112], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [99.298, 137.652], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J5", "bbox": {"pos": [95.66579899999999, 117.38279899999999], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [175.244, 112.252], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 94.472], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 97.012], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 99.55199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 102.092], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 104.63199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 107.172], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 109.71199999999999], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [175.244, 112.252], "drillsize": [1.016, 1.016], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.524, 1.524]}], "drawings": [], "ref": "J6", "bbox": {"pos": [171.611799, 91.982799], "size": [6.375401999999999, 21.869401999999997]}}, {"layer": "F", "center": [134.477, 139.684], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [139.477, 139.684], "drillsize": [1.524, 1.524], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [2.032, 2.032]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [134.477, 139.684], "drillsize": [1.524, 1.524], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.032, 2.032]}], "drawings": [], "ref": "J7", "bbox": {"pos": [130.753999, 134.857999], "size": [11.557001999999999, 9.652002]}}, {"layer": "F", "center": [115.93499999999999, 141.081], "pads": [{"layers": ["F", "B"], "angle": -180.0, "pos": [115.93499999999999, 141.081], "drillsize": [1.02, 1.02], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.53, 1.53]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [118.475, 141.081], "drillsize": [1.02, 1.02], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.53, 1.53]}], "drawings": [], "ref": "J8", "bbox": {"pos": [114.38999899999999, 137.630999], "size": [5.630002, 6.905002]}}, {"layer": "F", "center": [111.23599999999999, 69.326], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [113.776, 69.326], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [111.23599999999999, 69.326], "drillsize": [1.016, 1.016], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}], "drawings": [], "ref": "P8", "bbox": {"pos": [109.460999, 67.55099899999999], "size": [6.100002, 59.450002]}}, {"layer": "F", "center": [159.75, 69.326], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 125.20599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 122.666], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 120.12599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 117.586], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 115.04599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 112.506], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 109.966], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 107.426], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 104.886], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 102.34599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 99.806], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 97.26599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 94.726], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 92.18599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 89.646], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 87.106], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 84.566], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 82.026], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 79.48599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 76.946], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 74.40599999999999], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 71.866], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [162.29, 69.326], "drillsize": [1.016, 1.016], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [159.75, 69.326], "drillsize": [1.016, 1.016], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.7271999999999998, 1.7271999999999998]}], "drawings": [], "ref": "P9", "bbox": {"pos": [157.974999, 67.55099899999999], "size": [6.100002, 59.450002]}}, {"layer": "F", "center": [105.648, 114.792], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 94.472], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 97.012], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 99.55199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 102.092], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 104.63199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 107.172], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 109.71199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 112.252], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 114.792], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN1", "bbox": {"pos": [104.122999, 92.94699899999999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [167.624, 89.392], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 69.072], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 71.612], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 74.152], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 76.692], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 79.232], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 81.77199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 84.312], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 86.85199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 89.392], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN2", "bbox": {"pos": [166.098999, 67.546999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [167.878, 140.192], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 119.872], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 122.41199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 124.952], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 127.49199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 130.03199999999998], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 132.572], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 135.112], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 137.652], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.878, 140.192], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN3", "bbox": {"pos": [166.35299899999998, 118.346999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [105.648, 140.192], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 119.872], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 122.41199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 124.952], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 127.49199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 130.03199999999998], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 132.572], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 135.112], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 137.652], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 140.192], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN4", "bbox": {"pos": [104.122999, 118.346999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [105.648, 89.392], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 69.072], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 71.612], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 74.152], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 76.692], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 79.232], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 81.77199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 84.312], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 86.85199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [105.648, 89.392], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN5", "bbox": {"pos": [104.122999, 67.546999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [167.624, 114.792], "pads": [{"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 94.472], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 97.012], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 99.55199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 102.092], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 104.63199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 107.172], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 109.71199999999999], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 112.252], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}, {"layers": ["F", "B"], "angle": -90.0, "pos": [167.624, 114.792], "drillsize": [0.8099999999999999, 0.8099999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.8099999999999998, 1.8099999999999998]}], "drawings": [], "ref": "RN6", "bbox": {"pos": [166.098999, 92.94699899999999], "size": [3.0500019999999997, 23.360001999999998]}}, {"layer": "F", "center": [140.7, 108.94999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 91.17], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 91.17], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U1", "bbox": {"pos": [132.24179999999998, 90.128599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [140.7, 86.08999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 68.31], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [140.7, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [133.07999999999998, 68.31], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U2", "bbox": {"pos": [132.24179999999998, 67.268599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [128.0, 131.81], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 114.03], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 114.03], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U3", "bbox": {"pos": [119.5418, 112.988599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [128.0, 108.94999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 91.17], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 91.17], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U4", "bbox": {"pos": [119.5418, 90.128599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [153.13, 131.81], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 114.03], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.13, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 131.81], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 129.26999999999998], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 126.72999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 124.19], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 121.64999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 119.11], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 116.57], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.51, 114.03], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U5", "bbox": {"pos": [144.6718, 112.988599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [128.0, 86.08999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 68.31], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [128.0, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [120.38, 68.31], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U6", "bbox": {"pos": [119.5418, 67.268599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [153.4, 86.08999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 68.31], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 86.08999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 83.55], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 81.00999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 78.47], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 75.92999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 73.39], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 70.85], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 68.31], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U7", "bbox": {"pos": [144.9418, 67.268599], "size": [9.2964, 19.862802]}}, {"layer": "F", "center": [153.4, 108.94999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 91.17], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [153.4, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 108.94999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 106.41], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 103.86999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 101.33], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 98.78999999999999], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 96.25], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 93.71], "drillsize": [1.1176, 1.1176], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.6764, 1.6764]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [145.78, 91.17], "drillsize": [1.1176, 1.1176], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.6764, 1.6764]}], "drawings": [], "ref": "U8", "bbox": {"pos": [144.9418, 90.128599], "size": [9.2964, 19.862802]}}], "edges": [{"start": [182.60999999999999, 60.943999999999996], "end": [182.60999999999999, 147.558], "type": "segment", "width": 0.0025399999999999997}, {"start": [91.17, 60.943999999999996], "end": [182.60999999999999, 60.943999999999996], "type": "segment", "width": 0.0025399999999999997}, {"start": [91.17, 147.558], "end": [182.60999999999999, 147.558], "type": "segment", "width": 0.0025399999999999997}, {"start": [91.17, 60.943999999999996], "end": [91.17, 147.558], "type": "segment", "width": 0.0025399999999999997}], "bom": {"both": [[6, "74166", "NEW-DIP254P762X508-16", [["U3", 22], ["U4", 23], ["U5", 24], ["U6", 25], ["U7", 26], ["U8", 27]], []], [2, "4504", "NEW-DIP254P762X508-16", [["U1", 20], ["U2", 21]], []], [6, "4609X-101-103LF", "USE-SIP-9_P2.54mm", [["RN1", 14], ["RN2", 15], ["RN3", 16], ["RN4", 17], ["RN5", 18], ["RN6", 19]], []], [6, "CONN8_640456-8", "640456-8", [["J1", 4], ["J2", 5], ["J3", 6], ["J4", 7], ["J5", 8], ["J6", 9]], []], [1, "CON2_P5MM_VER_STERM-BLK", "796683-2", [["J7", 10]], []], [1, "640456-2", "TE_640456-2", [["J8", 11]], []], [2, "BeagleBone_Black_Header", "Socket_BeagleBone_Black", [["P8", 12], ["P9", 13]], []]], "B": [], "F": [[6, "74166", "NEW-DIP254P762X508-16", [["U3", 22], ["U4", 23], ["U5", 24], ["U6", 25], ["U7", 26], ["U8", 27]], []], [2, "4504", "NEW-DIP254P762X508-16", [["U1", 20], ["U2", 21]], []], [6, "4609X-101-103LF", "USE-SIP-9_P2.54mm", [["RN1", 14], ["RN2", 15], ["RN3", 16], ["RN4", 17], ["RN5", 18], ["RN6", 19]], []], [6, "CONN8_640456-8", "640456-8", [["J1", 4], ["J2", 5], ["J3", 6], ["J4", 7], ["J5", 8], ["J6", 9]], []], [1, "CON2_P5MM_VER_STERM-BLK", "796683-2", [["J7", 10]], []], [1, "640456-2", "TE_640456-2", [["J8", 11]], []], [2, "BeagleBone_Black_Header", "Socket_BeagleBone_Black", [["P8", 12], ["P9", 13]], []]]}, "silkscreen": {"B": [{"start": [99.298, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [175.244, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [99.298, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [175.244, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [99.298, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [175.244, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [131.2112, 139.684], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}], "F": [{"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J1", "thickness": 0.15, "pos": [96.50399999999999, 114.538], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [99.298, 112.252], "height": 1.0}, {"start": [101.838, 113.649], "end": [101.838, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [101.838, 93.075], "end": [95.869, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 93.075], "end": [95.869, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 113.649], "end": [101.838, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [99.298, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J2", "thickness": 0.15, "pos": [177.27599999999998, 140.192], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [175.244, 137.652], "height": 1.0}, {"start": [177.784, 139.049], "end": [177.784, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [177.784, 118.475], "end": [171.815, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 118.475], "end": [171.815, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 139.049], "end": [177.784, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [175.244, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J3", "thickness": 0.15, "pos": [96.25, 89.13799999999999], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [99.298, 86.85199999999999], "height": 1.0}, {"start": [101.838, 88.249], "end": [101.838, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [101.838, 67.675], "end": [95.869, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 67.675], "end": [95.869, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 88.249], "end": [101.838, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [99.298, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J4", "thickness": 0.15, "pos": [177.27599999999998, 89.392], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [175.244, 86.85199999999999], "height": 1.0}, {"start": [177.784, 88.249], "end": [177.784, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [177.784, 67.675], "end": [171.815, 67.675], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 67.675], "end": [171.815, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 88.249], "end": [177.784, 88.249], "type": "segment", "width": 0.15239999999999998}, {"start": [175.244, 67.03999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J5", "thickness": 0.15, "pos": [96.50399999999999, 140.192], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [99.298, 137.652], "height": 1.0}, {"start": [101.838, 139.049], "end": [101.838, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [101.838, 118.475], "end": [95.869, 118.475], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 118.475], "end": [95.869, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [95.869, 139.049], "end": [101.838, 139.049], "type": "segment", "width": 0.15239999999999998}, {"start": [99.298, 117.83999999999999], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J6", "thickness": 0.15, "pos": [177.27599999999998, 114.792], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [175.244, 112.252], "height": 1.0}, {"start": [177.784, 113.649], "end": [177.784, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [177.784, 93.075], "end": [171.815, 93.075], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 93.075], "end": [171.815, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [171.815, 113.649], "end": [177.784, 113.649], "type": "segment", "width": 0.15239999999999998}, {"start": [175.244, 92.44], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J7", "thickness": 0.15, "pos": [130.667, 135.874], "height": 1.0}, {"start": [131.2112, 139.684], "radius": 0.381, "type": "circle", "width": 0.15239999999999998}, {"start": [131.84619999999998, 135.06119999999999], "end": [131.84619999999998, 144.30679999999998], "type": "segment", "width": 0.15239999999999998}, {"start": [142.1078, 135.06119999999999], "end": [131.84619999999998, 135.06119999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [142.1078, 144.30679999999998], "end": [142.1078, 135.06119999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [131.84619999999998, 144.30679999999998], "end": [142.1078, 144.30679999999998], "type": "segment", "width": 0.15239999999999998}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "*", "thickness": 0.15, "pos": [134.477, 139.684], "height": 1.0}, {"width": 1.0003499999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J8", "thickness": 0.049999999999999996, "pos": [121.015, 143.62099999999998], "height": 1.0003499999999999}, {"start": [115.93499999999999, 137.831], "radius": 0.09999999999999999, "type": "circle", "width": 0.19999999999999998}, {"start": [119.74499999999999, 138.541], "end": [119.74499999999999, 144.261], "type": "segment", "width": 0.127}, {"start": [114.66499999999999, 138.541], "end": [119.74499999999999, 138.541], "type": "segment", "width": 0.127}, {"start": [114.66499999999999, 144.261], "end": [114.66499999999999, 138.541], "type": "segment", "width": 0.127}, {"start": [119.74499999999999, 144.261], "end": [114.66499999999999, 144.261], "type": "segment", "width": 0.127}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "P8", "thickness": 0.15, "pos": [110.47399999999999, 66.786], "height": 1.0}, {"start": [109.68599999999999, 67.776], "end": [109.68599999999999, 69.326], "type": "segment", "width": 0.15}, {"start": [112.506, 70.596], "end": [109.966, 70.596], "type": "segment", "width": 0.15}, {"start": [112.506, 68.056], "end": [112.506, 70.596], "type": "segment", "width": 0.15}, {"start": [111.23599999999999, 67.776], "end": [109.68599999999999, 67.776], "type": "segment", "width": 0.15}, {"start": [115.04599999999999, 68.056], "end": [112.506, 68.056], "type": "segment", "width": 0.15}, {"start": [115.04599999999999, 126.476], "end": [109.966, 126.476], "type": "segment", "width": 0.15}, {"start": [109.966, 126.476], "end": [109.966, 70.596], "type": "segment", "width": 0.15}, {"start": [115.04599999999999, 126.476], "end": [115.04599999999999, 68.056], "type": "segment", "width": 0.15}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "P9", "thickness": 0.15, "pos": [158.988, 66.786], "height": 1.0}, {"start": [158.2, 67.776], "end": [158.2, 69.326], "type": "segment", "width": 0.15}, {"start": [161.01999999999998, 70.596], "end": [158.48, 70.596], "type": "segment", "width": 0.15}, {"start": [161.01999999999998, 68.056], "end": [161.01999999999998, 70.596], "type": "segment", "width": 0.15}, {"start": [159.75, 67.776], "end": [158.2, 67.776], "type": "segment", "width": 0.15}, {"start": [163.56, 68.056], "end": [161.01999999999998, 68.056], "type": "segment", "width": 0.15}, {"start": [163.56, 126.476], "end": [158.48, 126.476], "type": "segment", "width": 0.15}, {"start": [158.48, 126.476], "end": [158.48, 70.596], "type": "segment", "width": 0.15}, {"start": [163.56, 126.476], "end": [163.56, 68.056], "type": "segment", "width": 0.15}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN1", "thickness": 0.15, "pos": [105.648, 117.332], "height": 1.0}, {"start": [107.048, 116.192], "end": [107.048, 115.692], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 116.192], "end": [107.048, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 115.692], "end": [104.24799999999999, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 93.092], "end": [104.24799999999999, 93.592], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 93.092], "end": [104.74799999999999, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 93.092], "end": [106.548, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 93.092], "end": [107.048, 93.592], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN2", "thickness": 0.15, "pos": [167.624, 91.932], "height": 1.0}, {"start": [169.024, 90.792], "end": [169.024, 90.292], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 90.792], "end": [169.024, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 90.292], "end": [166.224, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 67.692], "end": [166.224, 68.192], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 67.692], "end": [166.724, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 67.692], "end": [168.524, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 67.692], "end": [169.024, 68.192], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN3", "thickness": 0.15, "pos": [167.878, 142.732], "height": 1.0}, {"start": [169.278, 141.59199999999998], "end": [169.278, 141.09199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 141.59199999999998], "end": [169.278, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 141.09199999999998], "end": [166.47799999999998, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 118.49199999999999], "end": [166.47799999999998, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [166.47799999999998, 118.49199999999999], "end": [166.97799999999998, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [169.278, 118.49199999999999], "end": [168.778, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [169.278, 118.49199999999999], "end": [169.278, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN4", "thickness": 0.15, "pos": [105.648, 142.732], "height": 1.0}, {"start": [107.048, 141.59199999999998], "end": [107.048, 141.09199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 141.59199999999998], "end": [107.048, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 141.09199999999998], "end": [104.24799999999999, 141.59199999999998], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 118.49199999999999], "end": [104.24799999999999, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 118.49199999999999], "end": [104.74799999999999, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 118.49199999999999], "end": [106.548, 118.49199999999999], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 118.49199999999999], "end": [107.048, 118.99199999999999], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN5", "thickness": 0.15, "pos": [105.648, 91.932], "height": 1.0}, {"start": [107.048, 90.792], "end": [107.048, 90.292], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 90.792], "end": [107.048, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 90.292], "end": [104.24799999999999, 90.792], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 67.692], "end": [104.24799999999999, 68.192], "type": "segment", "width": 0.09999999999999999}, {"start": [104.24799999999999, 67.692], "end": [104.74799999999999, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 67.692], "end": [106.548, 67.692], "type": "segment", "width": 0.09999999999999999}, {"start": [107.048, 67.692], "end": [107.048, 68.192], "type": "segment", "width": 0.09999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "RN6", "thickness": 0.15, "pos": [167.624, 117.332], "height": 1.0}, {"start": [169.024, 116.192], "end": [169.024, 115.692], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 116.192], "end": [169.024, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 115.692], "end": [166.224, 116.192], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 93.092], "end": [166.224, 93.592], "type": "segment", "width": 0.09999999999999999}, {"start": [166.224, 93.092], "end": [166.724, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 93.092], "end": [168.524, 93.092], "type": "segment", "width": 0.09999999999999999}, {"start": [169.024, 93.092], "end": [169.024, 93.592], "type": "segment", "width": 0.09999999999999999}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U1", "thickness": 0.049999999999999996, "pos": [136.12165, 88.6271], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [136.89, 90.20479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [136.5852, 90.20479999999999], "end": [134.4008, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [137.1948, 90.20479999999999], "end": [136.5852, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [139.811, 90.20479999999999], "end": [137.1948, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [133.969, 109.9152], "end": [139.811, 109.9152], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U2", "thickness": 0.049999999999999996, "pos": [136.12165, 65.7671], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [136.89, 67.34479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [136.5852, 67.34479999999999], "end": [134.4008, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [137.1948, 67.34479999999999], "end": [136.5852, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [139.811, 67.34479999999999], "end": [137.1948, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [133.969, 87.0552], "end": [139.811, 87.0552], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U3", "thickness": 0.049999999999999996, "pos": [123.42165, 111.4871], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [124.19, 113.06479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [123.8852, 113.06479999999999], "end": [121.7008, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [124.4948, 113.06479999999999], "end": [123.8852, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [127.11099999999999, 113.06479999999999], "end": [124.4948, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [121.26899999999999, 132.77519999999998], "end": [127.11099999999999, 132.77519999999998], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U4", "thickness": 0.049999999999999996, "pos": [123.42165, 88.6271], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [124.19, 90.20479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [123.8852, 90.20479999999999], "end": [121.7008, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [124.4948, 90.20479999999999], "end": [123.8852, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [127.11099999999999, 90.20479999999999], "end": [124.4948, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [121.26899999999999, 109.9152], "end": [127.11099999999999, 109.9152], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U5", "thickness": 0.049999999999999996, "pos": [148.55165, 111.4871], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [149.32, 113.06479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [149.0152, 113.06479999999999], "end": [146.83079999999998, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [149.6248, 113.06479999999999], "end": [149.0152, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [152.24099999999999, 113.06479999999999], "end": [149.6248, 113.06479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [146.399, 132.77519999999998], "end": [152.24099999999999, 132.77519999999998], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U6", "thickness": 0.049999999999999996, "pos": [123.42165, 65.7671], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [124.19, 67.34479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [123.8852, 67.34479999999999], "end": [121.7008, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [124.4948, 67.34479999999999], "end": [123.8852, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [127.11099999999999, 67.34479999999999], "end": [124.4948, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [121.26899999999999, 87.0552], "end": [127.11099999999999, 87.0552], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U7", "thickness": 0.049999999999999996, "pos": [148.82165, 65.7671], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [149.59, 67.34479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [149.2852, 67.34479999999999], "end": [147.1008, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [149.8948, 67.34479999999999], "end": [149.2852, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [152.511, 67.34479999999999], "end": [149.8948, 67.34479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [146.66899999999998, 87.0552], "end": [152.511, 87.0552], "type": "segment", "width": 0.15239999999999998}, {"width": 1.64228, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "U8", "thickness": 0.049999999999999996, "pos": [148.82165, 88.6271], "height": 1.64228}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [149.59, 90.20479999999999], "radius": 0.30479999999999996, "startangle": 0.0, "type": "arc"}, {"start": [149.2852, 90.20479999999999], "end": [147.1008, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [149.8948, 90.20479999999999], "end": [149.2852, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [152.511, 90.20479999999999], "end": [149.8948, 90.20479999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [146.66899999999998, 109.9152], "end": [152.511, 109.9152], "type": "segment", "width": 0.15239999999999998}]}, "edges_bbox": {"minx": 91.168729, "miny": 60.942729, "maxx": 182.611271, "maxy": 147.559271}, "metadata": {"date": "2019-01-18", "company": "kremlinware unlimited", "revision": "K2", "title": "bort's brain"}}\r |
51129dfe IS |
635 | ///////////////////////////////////////////////\r |
636 | \r | |
637 | ///////////////////////////////////////////////\r | |
638 | /* Utility functions */\r | |
639 | \r | |
640 | var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +\r | |
641 | pcbdata.metadata.revision + '__';\r | |
642 | var storage;\r | |
643 | \r | |
644 | function initStorage(key) {\r | |
645 | try {\r | |
646 | window.localStorage.getItem("blank");\r | |
647 | storage = window.localStorage;\r | |
648 | } catch (e) {\r | |
649 | // localStorage not available\r | |
650 | }\r | |
651 | if (!storage) {\r | |
652 | try {\r | |
653 | window.sessionStorage.getItem("blank");\r | |
654 | storage = window.sessionStorage;\r | |
655 | } catch (e) {\r | |
656 | // sessionStorage also not available\r | |
657 | }\r | |
658 | }\r | |
659 | }\r | |
660 | \r | |
661 | function readStorage(key) {\r | |
662 | if (storage) {\r | |
663 | return storage.getItem(storagePrefix + '#' + key);\r | |
664 | } else {\r | |
665 | return null;\r | |
666 | }\r | |
667 | }\r | |
668 | \r | |
669 | function writeStorage(key, value) {\r | |
670 | if (storage) {\r | |
671 | storage.setItem(storagePrefix + '#' + key, value);\r | |
672 | }\r | |
673 | }\r | |
674 | \r | |
675 | function fancyDblClickHandler(el, onsingle, ondouble) {\r | |
676 | return function() {\r | |
677 | if (el.getAttribute("data-dblclick") == null) {\r | |
678 | el.setAttribute("data-dblclick", 1);\r | |
679 | setTimeout(function() {\r | |
680 | if (el.getAttribute("data-dblclick") == 1) {\r | |
681 | onsingle();\r | |
682 | }\r | |
683 | el.removeAttribute("data-dblclick");\r | |
684 | }, 200);\r | |
685 | } else {\r | |
686 | el.removeAttribute("data-dblclick");\r | |
687 | ondouble();\r | |
688 | }\r | |
689 | }\r | |
690 | }\r | |
691 | \r | |
692 | function smoothScrollToRow(rowid) {\r | |
693 | document.getElementById(rowid).scrollIntoView({\r | |
694 | behavior: "smooth",\r | |
695 | block: "center",\r | |
696 | inline: "nearest"\r | |
697 | });\r | |
698 | }\r | |
699 | \r | |
700 | function focusInputField(input) {\r | |
701 | input.scrollIntoView(false);\r | |
702 | input.focus();\r | |
703 | input.select();\r | |
704 | }\r | |
705 | \r | |
706 | function copyToClipboard() {\r | |
707 | var text = '';\r | |
708 | for (var node of bomhead.childNodes[0].childNodes) {\r | |
709 | if (node.firstChild) {\r | |
710 | text = text + node.firstChild.nodeValue;\r | |
711 | }\r | |
712 | if (node != bomhead.childNodes[0].lastChild) {\r | |
713 | text += '\t';\r | |
714 | }\r | |
715 | }\r | |
716 | text += '\n';\r | |
717 | for (var row of bombody.childNodes) {\r | |
718 | for (var cell of row.childNodes) {\r | |
719 | for (var node of cell.childNodes) {\r | |
720 | if (node.nodeName == "INPUT") {\r | |
721 | if (node.checked) {\r | |
722 | text = text + '✓';\r | |
723 | }\r | |
724 | } else if (node.nodeName == "MARK") {\r | |
725 | text = text + node.firstChild.nodeValue;\r | |
726 | } else {\r | |
727 | text = text + node.nodeValue;\r | |
728 | }\r | |
729 | }\r | |
730 | if (cell != row.lastChild) {\r | |
731 | text += '\t';\r | |
732 | }\r | |
733 | }\r | |
734 | text += '\n';\r | |
735 | }\r | |
736 | var textArea = document.createElement("textarea");\r | |
737 | textArea.classList.add('clipboard-temp');\r | |
738 | textArea.value = text;\r | |
739 | \r | |
740 | document.body.appendChild(textArea);\r | |
741 | textArea.focus();\r | |
742 | textArea.select();\r | |
743 | \r | |
744 | try {\r | |
745 | if (document.execCommand('copy')) {\r | |
746 | console.log('Bom copied to clipboard.');\r | |
747 | }\r | |
748 | } catch (err) {\r | |
749 | console.log('Can not copy to clipboard.');\r | |
750 | }\r | |
751 | \r | |
752 | document.body.removeChild(textArea);\r | |
753 | }\r | |
754 | \r | |
755 | function removeGutterNode(node) {\r | |
756 | for (var i = 0; i < node.childNodes.length; i++) {\r | |
757 | if (node.childNodes[i].classList &&\r | |
758 | node.childNodes[i].classList.contains("gutter")) {\r | |
759 | node.removeChild(node.childNodes[i]);\r | |
760 | break;\r | |
761 | }\r | |
762 | }\r | |
763 | }\r | |
764 | \r | |
765 | function cleanGutters() {\r | |
766 | removeGutterNode(document.getElementById("bot"));\r | |
767 | removeGutterNode(document.getElementById("canvasdiv"));\r | |
768 | }\r | |
769 | \r | |
770 | var units = {\r | |
771 | prefixes: {\r | |
772 | giga: ["G", "g", "giga", "Giga", "GIGA"],\r | |
773 | mega: ["M", "mega", "Mega", "MEGA"],\r | |
774 | kilo: ["K", "k", "kilo", "Kilo", "KILO"],\r | |
775 | milli: ["m", "milli", "Milli", "MILLI"],\r | |
776 | micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ\r | |
777 | nano: ["N", "n", "nano", "Nano", "NANO"],\r | |
778 | pico: ["P", "p", "pico", "Pico", "PICO"],\r | |
779 | },\r | |
780 | unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],\r | |
781 | unitsLong: [\r | |
782 | "OHM", "Ohm", "ohm", "ohms",\r | |
783 | "FARAD", "Farad", "farad",\r | |
784 | "HENRY", "Henry", "henry"\r | |
785 | ],\r | |
786 | getMultiplier: function(s) {\r | |
787 | if (this.prefixes.giga.includes(s)) return 1e9;\r | |
788 | if (this.prefixes.mega.includes(s)) return 1e6;\r | |
789 | if (this.prefixes.kilo.includes(s)) return 1e3;\r | |
790 | if (this.prefixes.milli.includes(s)) return 1e-3;\r | |
791 | if (this.prefixes.micro.includes(s)) return 1e-6;\r | |
792 | if (this.prefixes.nano.includes(s)) return 1e-9;\r | |
793 | if (this.prefixes.pico.includes(s)) return 1e-12;\r | |
794 | return 1;\r | |
795 | },\r | |
796 | valueRegex: null,\r | |
797 | }\r | |
798 | \r | |
799 | function initUtils() {\r | |
800 | var allPrefixes = units.prefixes.giga\r | |
801 | .concat(units.prefixes.mega)\r | |
802 | .concat(units.prefixes.kilo)\r | |
803 | .concat(units.prefixes.milli)\r | |
804 | .concat(units.prefixes.micro)\r | |
805 | .concat(units.prefixes.nano)\r | |
806 | .concat(units.prefixes.pico);\r | |
807 | var allUnits = units.unitsShort.concat(units.unitsLong);\r | |
808 | units.valueRegex = new RegExp("^([0-9\.]+)" +\r | |
809 | "\\s*(" + allPrefixes.join("|") + ")?" +\r | |
810 | "(" + allUnits.join("|") + ")?" +\r | |
811 | "(\\b.*)?$", "");\r | |
812 | units.valueAltRegex = new RegExp("^([0-9]*)" +\r | |
813 | "(" + units.unitsShort.join("|") + ")?" +\r | |
814 | "([GgMmKkUuNnPp])?" +\r | |
815 | "([0-9]*)" +\r | |
816 | "(\\b.*)?$", "");\r | |
817 | for (var bomtable of Object.values(pcbdata.bom)) {\r | |
818 | for (var row of bomtable) {\r | |
819 | row.push(parseValue(row[1], row[3][0][0]));\r | |
820 | }\r | |
821 | }\r | |
822 | }\r | |
823 | \r | |
824 | function parseValue(val, ref) {\r | |
825 | var inferUnit = (unit, ref) => {\r | |
826 | if (unit) {\r | |
827 | unit = unit.toLowerCase();\r | |
828 | if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {\r | |
829 | unit = 'r';\r | |
830 | }\r | |
831 | unit = unit[0];\r | |
832 | } else {\r | |
833 | ref = /^([a-z]+)\d+$/i.exec(ref);\r | |
834 | if (ref) {\r | |
835 | ref = ref[1].toLowerCase();\r | |
836 | if (ref == "c") unit = 'f';\r | |
837 | else if (ref == "l") unit = 'h';\r | |
838 | else if (ref == "r" || ref == "rv") unit = 'r';\r | |
839 | else unit = null;\r | |
840 | }\r | |
841 | }\r | |
842 | return unit;\r | |
843 | };\r | |
844 | val = val.replace(/,/g, "");\r | |
845 | var match = units.valueRegex.exec(val);\r | |
846 | var unit;\r | |
847 | if (match) {\r | |
848 | val = parseFloat(match[1]);\r | |
849 | if (match[2]) {\r | |
850 | val = val * units.getMultiplier(match[2]);\r | |
851 | }\r | |
852 | unit = inferUnit(match[3], ref);\r | |
853 | if (!unit) return null;\r | |
854 | else return {\r | |
855 | val: val,\r | |
856 | unit: unit,\r | |
857 | extra: match[4],\r | |
858 | }\r | |
859 | }\r | |
860 | match = units.valueAltRegex.exec(val);\r | |
861 | if (match && (match[1] || match[4])) {\r | |
862 | val = parseFloat(match[1] + "." + match[4]);\r | |
863 | if (match[3]) {\r | |
864 | val = val * units.getMultiplier(match[3]);\r | |
865 | }\r | |
866 | unit = inferUnit(match[2], ref);\r | |
867 | if (!unit) return null;\r | |
868 | else return {\r | |
869 | val: val,\r | |
870 | unit: unit,\r | |
871 | extra: match[5],\r | |
872 | }\r | |
873 | }\r | |
874 | return null;\r | |
875 | }\r | |
876 | \r | |
877 | function valueCompare(a, b, stra, strb) {\r | |
878 | if (a === null && b === null) {\r | |
879 | // Failed to parse both values, compare them as strings.\r | |
880 | if (stra != strb) return stra > strb ? 1 : -1;\r | |
881 | else return 0;\r | |
882 | } else if (a === null) {\r | |
883 | return 1;\r | |
884 | } else if (b === null) {\r | |
885 | return -1;\r | |
886 | } else {\r | |
887 | if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;\r | |
888 | else if (a.val != b.val) return a.val > b.val ? 1 : -1;\r | |
889 | else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;\r | |
890 | else return 0;\r | |
891 | }\r | |
892 | }\r | |
893 | \r | |
894 | ///////////////////////////////////////////////\r | |
895 | \r | |
896 | ///////////////////////////////////////////////\r | |
897 | /* PCB rendering code */\r | |
898 | \r | |
899 | var redrawOnDrag = true;\r | |
900 | var boardRotation = 0;\r | |
901 | \r | |
902 | function deg2rad(deg) {\r | |
903 | return deg * Math.PI / 180;\r | |
904 | }\r | |
905 | \r | |
906 | function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {\r | |
907 | var point = [\r | |
908 | linepoint[0] * text.width + offsetx,\r | |
909 | linepoint[1] * text.height + offsety\r | |
910 | ];\r | |
911 | // Adding half a line height here is technically a bug\r | |
912 | // but pcbnew currently does the same, text is slightly shifted.\r | |
913 | point[0] -= (point[1] + text.height * 0.5) * tilt;\r | |
914 | return point;\r | |
915 | }\r | |
916 | \r | |
917 | function drawtext(ctx, text, color, flip) {\r | |
918 | ctx.save();\r | |
919 | ctx.translate(...text.pos);\r | |
920 | var angle = -text.angle;\r | |
921 | if (text.attr.includes("mirrored")) {\r | |
922 | ctx.scale(-1, 1);\r | |
923 | angle = -angle;\r | |
924 | }\r | |
925 | var tilt = 0;\r | |
926 | if (text.attr.includes("italic")) {\r | |
927 | tilt = 0.125;\r | |
928 | }\r | |
929 | var interline = (text.height * 1.5 + text.thickness) / 2;\r | |
930 | var txt = text.text.split("\n");\r | |
931 | // KiCad ignores last empty line.\r | |
932 | if (txt[txt.length-1] == '') txt.pop();\r | |
933 | ctx.rotate(deg2rad(angle));\r | |
934 | ctx.fillStyle = color;\r | |
935 | ctx.strokeStyle = color;\r | |
936 | ctx.lineCap = "round";\r | |
937 | ctx.lineWidth = text.thickness;\r | |
938 | for (var i in txt) {\r | |
939 | var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;\r | |
940 | var lineWidth = 0;\r | |
941 | for (var c of txt[i]) {\r | |
942 | lineWidth += pcbdata.font_data[c].w * text.width;\r | |
943 | }\r | |
944 | var offsetx = 0;\r | |
945 | switch (text.horiz_justify) {\r | |
946 | case -1:\r | |
947 | // Justify left, do nothing\r | |
948 | break;\r | |
949 | case 0:\r | |
950 | // Justify center\r | |
951 | offsetx -= lineWidth / 2;\r | |
952 | break;\r | |
953 | case 1:\r | |
954 | // Justify right\r | |
955 | offsetx -= lineWidth;\r | |
956 | break;\r | |
957 | }\r | |
958 | for (var c of txt[i]) {\r | |
959 | for (var line of pcbdata.font_data[c].l) {\r | |
960 | // Drawing each segment separately instead of\r | |
961 | // polyline because round line caps don't work in joints\r | |
962 | for (var i = 0; i < line.length - 1; i++) {\r | |
963 | ctx.beginPath();\r | |
964 | ctx.moveTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));\r | |
965 | ctx.lineTo(...calcFontPoint(line[i + 1], text, offsetx, offsety, tilt));\r | |
966 | ctx.stroke();\r | |
967 | }\r | |
968 | }\r | |
969 | offsetx += pcbdata.font_data[c].w * text.width;\r | |
970 | }\r | |
971 | }\r | |
972 | ctx.restore();\r | |
973 | }\r | |
974 | \r | |
975 | function drawedge(ctx, scalefactor, edge, color) {\r | |
976 | ctx.strokeStyle = color;\r | |
977 | ctx.lineWidth = Math.max(1 / scalefactor, edge.width);\r | |
978 | ctx.lineCap = "round";\r | |
979 | if (edge.type == "segment") {\r | |
980 | ctx.beginPath();\r | |
981 | ctx.moveTo(...edge.start);\r | |
982 | ctx.lineTo(...edge.end);\r | |
983 | ctx.stroke();\r | |
984 | }\r | |
985 | if (edge.type == "arc") {\r | |
986 | ctx.beginPath();\r | |
987 | ctx.arc(\r | |
988 | ...edge.start,\r | |
989 | edge.radius,\r | |
990 | deg2rad(edge.startangle),\r | |
991 | deg2rad(edge.endangle));\r | |
992 | ctx.stroke();\r | |
993 | }\r | |
994 | if (edge.type == "circle") {\r | |
995 | ctx.beginPath();\r | |
996 | ctx.arc(\r | |
997 | ...edge.start,\r | |
998 | edge.radius,\r | |
999 | 0, 2 * Math.PI);\r | |
1000 | ctx.closePath();\r | |
1001 | ctx.stroke();\r | |
1002 | }\r | |
1003 | }\r | |
1004 | \r | |
1005 | function drawRoundRect(ctx, color, size, radius, ctxmethod) {\r | |
1006 | ctx.beginPath();\r | |
1007 | ctx.strokeStyle = color;\r | |
1008 | var x = size[0] * -0.5;\r | |
1009 | var y = size[1] * -0.5;\r | |
1010 | var width = size[0];\r | |
1011 | var height = size[1];\r | |
1012 | ctx.moveTo(x, 0);\r | |
1013 | ctx.arcTo(x, y + height, x + width, y + height, radius);\r | |
1014 | ctx.arcTo(x + width, y + height, x + width, y, radius);\r | |
1015 | ctx.arcTo(x + width, y, x, y, radius);\r | |
1016 | ctx.arcTo(x, y, x, y + height, radius);\r | |
1017 | ctx.closePath();\r | |
1018 | ctxmethod();\r | |
1019 | }\r | |
1020 | \r | |
1021 | function drawOblong(ctx, color, size, ctxmethod) {\r | |
1022 | drawRoundRect(ctx, color, size, Math.min(size[0], size[1]) / 2, ctxmethod);\r | |
1023 | }\r | |
1024 | \r | |
1025 | function drawPolygons(ctx, color, polygons, ctxmethod) {\r | |
1026 | ctx.fillStyle = color;\r | |
1027 | for (var polygon of polygons) {\r | |
1028 | ctx.beginPath();\r | |
1029 | for (var vertex of polygon) {\r | |
1030 | ctx.lineTo(...vertex)\r | |
1031 | }\r | |
1032 | ctx.closePath();\r | |
1033 | ctxmethod();\r | |
1034 | }\r | |
1035 | }\r | |
1036 | \r | |
1037 | function drawPolygonShape(ctx, shape, color) {\r | |
1038 | ctx.save();\r | |
1039 | ctx.translate(...shape.pos);\r | |
1040 | ctx.rotate(deg2rad(-shape.angle));\r | |
1041 | drawPolygons(ctx, color, shape.polygons, ctx.fill.bind(ctx));\r | |
1042 | ctx.restore();\r | |
1043 | }\r | |
1044 | \r | |
1045 | function drawDrawing(ctx, layer, scalefactor, drawing, color) {\r | |
1046 | if (["segment", "arc", "circle"].includes(drawing.type)) {\r | |
1047 | drawedge(ctx, scalefactor, drawing, color);\r | |
1048 | } else if (drawing.type == "polygon") {\r | |
1049 | drawPolygonShape(ctx, drawing, color);\r | |
1050 | } else {\r | |
1051 | drawtext(ctx, drawing, color, layer == "B");\r | |
1052 | }\r | |
1053 | }\r | |
1054 | \r | |
1055 | function drawCircle(ctx, radius, ctxmethod) {\r | |
1056 | ctx.beginPath();\r | |
1057 | ctx.arc(0, 0, radius, 0, 2 * Math.PI);\r | |
1058 | ctx.closePath();\r | |
1059 | ctxmethod();\r | |
1060 | }\r | |
1061 | \r | |
1062 | function drawPad(ctx, pad, color, outline) {\r | |
1063 | ctx.save();\r | |
1064 | ctx.translate(...pad.pos);\r | |
1065 | ctx.rotate(deg2rad(pad.angle));\r | |
1066 | if (pad.offset) {\r | |
1067 | ctx.translate(...pad.offset);\r | |
1068 | }\r | |
1069 | ctx.fillStyle = color;\r | |
1070 | ctx.strokeStyle = color;\r | |
1071 | var ctxmethod = outline ? ctx.stroke.bind(ctx) : ctx.fill.bind(ctx);\r | |
1072 | if (pad.shape == "rect") {\r | |
1073 | var rect = [...pad.size.map(c => -c * 0.5), ...pad.size];\r | |
1074 | if (outline) {\r | |
1075 | ctx.strokeRect(...rect);\r | |
1076 | } else {\r | |
1077 | ctx.fillRect(...rect);\r | |
1078 | }\r | |
1079 | } else if (pad.shape == "oval") {\r | |
1080 | drawOblong(ctx, color, pad.size, ctxmethod);\r | |
1081 | } else if (pad.shape == "circle") {\r | |
1082 | drawCircle(ctx, pad.size[0] / 2, ctxmethod);\r | |
1083 | } else if (pad.shape == "roundrect") {\r | |
1084 | drawRoundRect(ctx, color, pad.size, pad.radius, ctxmethod);\r | |
1085 | } else if (pad.shape == "custom") {\r | |
1086 | drawPolygons(ctx, color, pad.polygons, ctxmethod);\r | |
1087 | }\r | |
1088 | if (pad.type == "th" && !outline) {\r | |
1089 | ctx.fillStyle = "#CCCCCC";\r | |
1090 | if (pad.drillshape == "oblong") {\r | |
1091 | drawOblong(ctx, "#CCCCCC", pad.drillsize, ctxmethod);\r | |
1092 | } else {\r | |
1093 | drawCircle(ctx, pad.drillsize[0] / 2, ctxmethod);\r | |
1094 | }\r | |
1095 | }\r | |
1096 | ctx.restore();\r | |
1097 | }\r | |
1098 | \r | |
1099 | function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight) {\r | |
1100 | if (highlight) {\r | |
1101 | // draw bounding box\r | |
1102 | if (module.layer == layer) {\r | |
1103 | ctx.save();\r | |
1104 | ctx.globalAlpha = 0.2;\r | |
1105 | ctx.translate(...module.bbox.pos);\r | |
1106 | ctx.fillStyle = padcolor;\r | |
1107 | ctx.fillRect(\r | |
1108 | 0, 0,\r | |
1109 | ...module.bbox.size);\r | |
1110 | ctx.globalAlpha = 1;\r | |
1111 | ctx.strokeStyle = padcolor;\r | |
1112 | ctx.strokeRect(\r | |
1113 | 0, 0,\r | |
1114 | ...module.bbox.size);\r | |
1115 | ctx.restore();\r | |
1116 | }\r | |
1117 | }\r | |
1118 | // draw drawings\r | |
1119 | for (var drawing of module.drawings) {\r | |
1120 | if (drawing.layer == layer) {\r | |
1121 | drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);\r | |
1122 | }\r | |
1123 | }\r | |
1124 | // draw pads\r | |
1125 | for (var pad of module.pads) {\r | |
1126 | if (pad.layers.includes(layer)) {\r | |
1127 | drawPad(ctx, pad, padcolor, false);\r | |
1128 | if (pad.pin1 && highlightpin1) {\r | |
1129 | drawPad(ctx, pad, outlinecolor, true);\r | |
1130 | }\r | |
1131 | }\r | |
1132 | }\r | |
1133 | }\r | |
1134 | \r | |
1135 | function drawEdges(canvas, scalefactor) {\r | |
1136 | var ctx = canvas.getContext("2d");\r | |
1137 | var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');\r | |
1138 | for (var edge of pcbdata.edges) {\r | |
1139 | drawedge(ctx, scalefactor, edge, edgecolor);\r | |
1140 | }\r | |
1141 | }\r | |
1142 | \r | |
1143 | function drawModules(canvas, layer, scalefactor, highlightedModules) {\r | |
1144 | var ctx = canvas.getContext("2d");\r | |
1145 | ctx.lineWidth = 3 / scalefactor;\r | |
1146 | var style = getComputedStyle(topmostdiv);\r | |
1147 | var padcolor = style.getPropertyValue('--pad-color');\r | |
1148 | var outlinecolor = style.getPropertyValue('--pin1-outline-color');\r | |
1149 | if (highlightedModules.length > 0) {\r | |
1150 | padcolor = style.getPropertyValue('--pad-color-highlight');\r | |
1151 | outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');\r | |
1152 | }\r | |
1153 | for (var i = 0; i < pcbdata.modules.length; i++) {\r | |
1154 | var mod = pcbdata.modules[i];\r | |
1155 | var highlight = highlightedModules.includes(i);\r | |
1156 | if (highlightedModules.length == 0 || highlight) {\r | |
1157 | drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight);\r | |
1158 | }\r | |
1159 | }\r | |
1160 | }\r | |
1161 | \r | |
1162 | function drawSilkscreen(canvas, layer, scalefactor) {\r | |
1163 | var ctx = canvas.getContext("2d");\r | |
1164 | for (var d of pcbdata.silkscreen[layer]) {\r | |
1165 | if (["segment", "arc", "circle"].includes(d.type)) {\r | |
1166 | drawedge(ctx, scalefactor, d, "#aa4");\r | |
1167 | } else if (d.type == "polygon") {\r | |
1168 | drawPolygonShape(ctx, d, "#4aa");\r | |
1169 | } else {\r | |
1170 | drawtext(ctx, d, "#4aa", layer == "B");\r | |
1171 | }\r | |
1172 | }\r | |
1173 | }\r | |
1174 | \r | |
1175 | function clearCanvas(canvas) {\r | |
1176 | var ctx = canvas.getContext("2d");\r | |
1177 | ctx.save();\r | |
1178 | ctx.setTransform(1, 0, 0, 1, 0, 0);\r | |
1179 | ctx.clearRect(0, 0, canvas.width, canvas.height);\r | |
1180 | ctx.restore();\r | |
1181 | }\r | |
1182 | \r | |
1183 | function drawHighlightsOnLayer(canvasdict) {\r | |
1184 | clearCanvas(canvasdict.highlight);\r | |
1185 | drawModules(canvasdict.highlight, canvasdict.layer,\r | |
1186 | canvasdict.transform.s, highlightedModules);\r | |
1187 | }\r | |
1188 | \r | |
1189 | function drawHighlights() {\r | |
1190 | drawHighlightsOnLayer(allcanvas.front);\r | |
1191 | drawHighlightsOnLayer(allcanvas.back);\r | |
1192 | }\r | |
1193 | \r | |
1194 | function drawBackground(canvasdict) {\r | |
1195 | clearCanvas(canvasdict.bg);\r | |
1196 | clearCanvas(canvasdict.silk);\r | |
1197 | drawEdges(canvasdict.bg, canvasdict.transform.s);\r | |
1198 | drawModules(canvasdict.bg, canvasdict.layer, canvasdict.transform.s, []);\r | |
1199 | drawSilkscreen(canvasdict.silk, canvasdict.layer, canvasdict.transform.s);\r | |
1200 | }\r | |
1201 | \r | |
1202 | function prepareCanvas(canvas, flip, transform) {\r | |
1203 | var ctx = canvas.getContext("2d");\r | |
1204 | ctx.setTransform(1, 0, 0, 1, 0, 0);\r | |
1205 | var fontsize = 1.55;\r | |
1206 | ctx.scale(transform.zoom, transform.zoom);\r | |
1207 | ctx.translate(transform.panx, transform.pany);\r | |
1208 | if (flip) {\r | |
1209 | ctx.scale(-1, 1);\r | |
1210 | }\r | |
1211 | ctx.translate(transform.x, transform.y);\r | |
1212 | ctx.rotate(deg2rad(boardRotation));\r | |
1213 | ctx.scale(transform.s, transform.s);\r | |
1214 | }\r | |
1215 | \r | |
1216 | function prepareLayer(canvasdict) {\r | |
1217 | var flip = (canvasdict.layer == "B");\r | |
1218 | for (var c of ["bg", "silk", "highlight"]) {\r | |
1219 | prepareCanvas(canvasdict[c], flip, canvasdict.transform);\r | |
1220 | }\r | |
1221 | }\r | |
1222 | \r | |
1223 | function rotateVector(v, angle) {\r | |
1224 | angle = deg2rad(angle);\r | |
1225 | return [\r | |
1226 | v[0] * Math.cos(angle) - v[1] * Math.sin(angle),\r | |
1227 | v[0] * Math.sin(angle) + v[1] * Math.cos(angle)\r | |
1228 | ];\r | |
1229 | }\r | |
1230 | \r | |
1231 | function applyRotation(bbox) {\r | |
1232 | var corners = [\r | |
1233 | [bbox.minx, bbox.miny],\r | |
1234 | [bbox.minx, bbox.maxy],\r | |
1235 | [bbox.maxx, bbox.miny],\r | |
1236 | [bbox.maxx, bbox.maxy],\r | |
1237 | ];\r | |
1238 | corners = corners.map((v) => rotateVector(v, boardRotation));\r | |
1239 | return {\r | |
1240 | minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),\r | |
1241 | miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),\r | |
1242 | maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),\r | |
1243 | maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),\r | |
1244 | }\r | |
1245 | }\r | |
1246 | \r | |
1247 | function recalcLayerScale(canvasdict) {\r | |
1248 | var canvasdivid = {\r | |
1249 | "F": "frontcanvas",\r | |
1250 | "B": "backcanvas"\r | |
1251 | } [canvasdict.layer];\r | |
1252 | var width = document.getElementById(canvasdivid).clientWidth * 2;\r | |
1253 | var height = document.getElementById(canvasdivid).clientHeight * 2;\r | |
1254 | var bbox = applyRotation(pcbdata.edges_bbox);\r | |
1255 | var scalefactor = 0.98 * Math.min(\r | |
1256 | width / (bbox.maxx - bbox.minx),\r | |
1257 | height / (bbox.maxy - bbox.miny)\r | |
1258 | );\r | |
1259 | if (scalefactor < 0.1) {\r | |
1260 | scalefactor = 1;\r | |
1261 | }\r | |
1262 | canvasdict.transform.s = scalefactor;\r | |
1263 | var flip = (canvasdict.layer == "B");\r | |
1264 | if (flip) {\r | |
1265 | canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;\r | |
1266 | } else {\r | |
1267 | canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;\r | |
1268 | }\r | |
1269 | canvasdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;\r | |
1270 | for (var c of ["bg", "silk", "highlight"]) {\r | |
1271 | canvas = canvasdict[c];\r | |
1272 | canvas.width = width;\r | |
1273 | canvas.height = height;\r | |
1274 | canvas.style.width = (width / 2) + "px";\r | |
1275 | canvas.style.height = (height / 2) + "px";\r | |
1276 | }\r | |
1277 | console.log("Scale factor " + canvasdivid + ": ", canvasdict.transform);\r | |
1278 | }\r | |
1279 | \r | |
1280 | function redrawCanvas(layerdict) {\r | |
1281 | prepareLayer(layerdict);\r | |
1282 | drawBackground(layerdict);\r | |
1283 | drawHighlightsOnLayer(layerdict);\r | |
1284 | }\r | |
1285 | \r | |
1286 | function resizeCanvas(layerdict) {\r | |
1287 | recalcLayerScale(layerdict);\r | |
1288 | redrawCanvas(layerdict);\r | |
1289 | }\r | |
1290 | \r | |
1291 | function resizeAll() {\r | |
1292 | resizeCanvas(allcanvas.front);\r | |
1293 | resizeCanvas(allcanvas.back);\r | |
1294 | }\r | |
1295 | \r | |
1296 | function bboxScan(layer, x, y) {\r | |
1297 | var result = [];\r | |
1298 | for (var i = 0; i < pcbdata.modules.length; i++) {\r | |
1299 | var module = pcbdata.modules[i];\r | |
1300 | if (module.layer == layer) {\r | |
1301 | var b = module.bbox;\r | |
1302 | if (b.pos[0] <= x && b.pos[0] + b.size[0] >= x &&\r | |
1303 | b.pos[1] <= y && b.pos[1] + b.size[1] >= y) {\r | |
1304 | result.push(i);\r | |
1305 | }\r | |
1306 | }\r | |
1307 | }\r | |
1308 | return result;\r | |
1309 | }\r | |
1310 | \r | |
1311 | function handleMouseDown(e, layerdict) {\r | |
1312 | if (e.which != 1) {\r | |
1313 | return;\r | |
1314 | }\r | |
1315 | e.preventDefault();\r | |
1316 | e.stopPropagation();\r | |
1317 | layerdict.transform.mousestartx = e.offsetX;\r | |
1318 | layerdict.transform.mousestarty = e.offsetY;\r | |
1319 | layerdict.transform.mousedownx = e.offsetX;\r | |
1320 | layerdict.transform.mousedowny = e.offsetY;\r | |
1321 | layerdict.transform.mousedown = true;\r | |
1322 | }\r | |
1323 | \r | |
1324 | function handleMouseClick(e, layerdict) {\r | |
1325 | var x = e.offsetX;\r | |
1326 | var y = e.offsetY;\r | |
1327 | var t = layerdict.transform;\r | |
1328 | if (layerdict.layer == "B") {\r | |
1329 | x = (2 * x / t.zoom - t.panx + t.x) / -t.s;\r | |
1330 | } else {\r | |
1331 | x = (2 * x / t.zoom - t.panx - t.x) / t.s;\r | |
1332 | }\r | |
1333 | y = (2 * y / t.zoom - t.y - t.pany) / t.s;\r | |
1334 | var v = rotateVector([x, y], -boardRotation);\r | |
1335 | var modules = bboxScan(layerdict.layer, v[0], v[1]);\r | |
1336 | if (modules.length > 0) {\r | |
1337 | modulesClicked(modules);\r | |
1338 | drawHighlights();\r | |
1339 | }\r | |
1340 | }\r | |
1341 | \r | |
1342 | function handleMouseUp(e, layerdict) {\r | |
1343 | e.preventDefault();\r | |
1344 | e.stopPropagation();\r | |
1345 | if (e.which == 1 &&\r | |
1346 | layerdict.transform.mousedown &&\r | |
1347 | layerdict.transform.mousedownx == e.offsetX &&\r | |
1348 | layerdict.transform.mousedowny == e.offsetY) {\r | |
1349 | // This is just a click\r | |
1350 | handleMouseClick(e, layerdict);\r | |
1351 | layerdict.transform.mousedown = false;\r | |
1352 | return;\r | |
1353 | }\r | |
1354 | if (e.which == 3) {\r | |
1355 | // Reset pan and zoom on right click.\r | |
1356 | layerdict.transform.panx = 0;\r | |
1357 | layerdict.transform.pany = 0;\r | |
1358 | layerdict.transform.zoom = 1;\r | |
1359 | redrawCanvas(layerdict);\r | |
1360 | } else if (!redrawOnDrag) {\r | |
1361 | redrawCanvas(layerdict);\r | |
1362 | }\r | |
1363 | layerdict.transform.mousedown = false;\r | |
1364 | }\r | |
1365 | \r | |
1366 | function handleMouseMove(e, layerdict) {\r | |
1367 | if (!layerdict.transform.mousedown) {\r | |
1368 | return;\r | |
1369 | }\r | |
1370 | e.preventDefault();\r | |
1371 | e.stopPropagation();\r | |
1372 | var dx = e.offsetX - layerdict.transform.mousestartx;\r | |
1373 | var dy = e.offsetY - layerdict.transform.mousestarty;\r | |
1374 | layerdict.transform.panx += 2 * dx / layerdict.transform.zoom;\r | |
1375 | layerdict.transform.pany += 2 * dy / layerdict.transform.zoom;\r | |
1376 | layerdict.transform.mousestartx = e.offsetX;\r | |
1377 | layerdict.transform.mousestarty = e.offsetY;\r | |
1378 | if (redrawOnDrag) {\r | |
1379 | redrawCanvas(layerdict);\r | |
1380 | }\r | |
1381 | }\r | |
1382 | \r | |
1383 | function handleMouseWheel(e, layerdict) {\r | |
1384 | e.preventDefault();\r | |
1385 | e.stopPropagation();\r | |
1386 | var t = layerdict.transform;\r | |
1387 | var wheeldelta = e.deltaY;\r | |
1388 | if (e.deltaMode == 1) {\r | |
1389 | // FF only, scroll by lines\r | |
1390 | wheeldelta *= 30;\r | |
1391 | } else if (e.deltaMode == 2) {\r | |
1392 | wheeldelta *= 300;\r | |
1393 | }\r | |
1394 | var m = Math.pow(1.1, -wheeldelta / 40);\r | |
1395 | // Limit amount of zoom per tick.\r | |
1396 | if (m > 2) {\r | |
1397 | m = 2;\r | |
1398 | } else if (m < 0.5) {\r | |
1399 | m = 0.5;\r | |
1400 | }\r | |
1401 | t.zoom *= m;\r | |
1402 | var zoomd = (1 - m) / t.zoom;\r | |
1403 | t.panx += 2 * e.offsetX * zoomd;\r | |
1404 | t.pany += 2 * e.offsetY * zoomd;\r | |
1405 | redrawCanvas(layerdict);\r | |
1406 | console.log(layerdict.transform.zoom);\r | |
1407 | }\r | |
1408 | \r | |
1409 | function addMouseHandlers(div, layerdict) {\r | |
1410 | div.onmousedown = function(e) {\r | |
1411 | handleMouseDown(e, layerdict);\r | |
1412 | };\r | |
1413 | div.onmousemove = function(e) {\r | |
1414 | handleMouseMove(e, layerdict);\r | |
1415 | };\r | |
1416 | div.onmouseup = function(e) {\r | |
1417 | handleMouseUp(e, layerdict);\r | |
1418 | };\r | |
1419 | div.onmouseout = function(e) {\r | |
1420 | handleMouseUp(e, layerdict);\r | |
1421 | }\r | |
1422 | div.onwheel = function(e) {\r | |
1423 | handleMouseWheel(e, layerdict);\r | |
1424 | }\r | |
1425 | for (var element of [div, layerdict.bg, layerdict.silk, layerdict.highlight]) {\r | |
1426 | element.addEventListener("contextmenu", function(e) {\r | |
1427 | e.preventDefault();\r | |
1428 | }, false);\r | |
1429 | }\r | |
1430 | }\r | |
1431 | \r | |
1432 | function setRedrawOnDrag(value) {\r | |
1433 | redrawOnDrag = value;\r | |
1434 | writeStorage("redrawOnDrag", value);\r | |
1435 | }\r | |
1436 | \r | |
1437 | function setBoardRotation(value) {\r | |
1438 | boardRotation = value * 5;\r | |
1439 | writeStorage("boardRotation", boardRotation);\r | |
1440 | document.getElementById("rotationDegree").textContent = boardRotation;\r | |
1441 | resizeAll();\r | |
1442 | }\r | |
1443 | \r | |
1444 | function initRender() {\r | |
1445 | allcanvas = {\r | |
1446 | front: {\r | |
1447 | transform: {\r | |
1448 | x: 0,\r | |
1449 | y: 0,\r | |
1450 | s: 1,\r | |
1451 | panx: 0,\r | |
1452 | pany: 0,\r | |
1453 | zoom: 1,\r | |
1454 | mousestartx: 0,\r | |
1455 | mousestarty: 0,\r | |
1456 | mousedown: false,\r | |
1457 | },\r | |
1458 | bg: document.getElementById("F_bg"),\r | |
1459 | silk: document.getElementById("F_slk"),\r | |
1460 | highlight: document.getElementById("F_hl"),\r | |
1461 | layer: "F",\r | |
1462 | },\r | |
1463 | back: {\r | |
1464 | transform: {\r | |
1465 | x: 0,\r | |
1466 | y: 0,\r | |
1467 | s: 1,\r | |
1468 | panx: 0,\r | |
1469 | pany: 0,\r | |
1470 | zoom: 1,\r | |
1471 | mousestartx: 0,\r | |
1472 | mousestarty: 0,\r | |
1473 | mousedown: false,\r | |
1474 | },\r | |
1475 | bg: document.getElementById("B_bg"),\r | |
1476 | silk: document.getElementById("B_slk"),\r | |
1477 | highlight: document.getElementById("B_hl"),\r | |
1478 | layer: "B",\r | |
1479 | }\r | |
1480 | };\r | |
1481 | addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);\r | |
1482 | addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);\r | |
1483 | }\r | |
1484 | \r | |
1485 | ///////////////////////////////////////////////\r | |
1486 | \r | |
1487 | ///////////////////////////////////////////////\r | |
1488 | /* DOM manipulation and misc code */\r | |
1489 | \r | |
1490 | var bomsplit;\r | |
1491 | var canvassplit;\r | |
1492 | var canvaslayout = "default";\r | |
1493 | var bomlayout = "default";\r | |
1494 | var bomSortFunction = null;\r | |
1495 | var currentSortColumn = null;\r | |
1496 | var currentSortOrder = null;\r | |
1497 | var currentHighlightedRowId;\r | |
1498 | var highlightHandlers = [];\r | |
1499 | var highlightedModules = [];\r | |
1500 | var checkboxes = [];\r | |
1501 | var bomCheckboxes = "";\r | |
1502 | var highlightpin1 = false;\r | |
1503 | var lastClicked;\r | |
1504 | \r | |
1505 | function dbg(html) {\r | |
1506 | dbgdiv.innerHTML = html;\r | |
1507 | }\r | |
1508 | \r | |
1509 | function setDarkMode(value) {\r | |
1510 | if (value) {\r | |
1511 | topmostdiv.classList.add("dark");\r | |
1512 | } else {\r | |
1513 | topmostdiv.classList.remove("dark");\r | |
1514 | }\r | |
1515 | writeStorage("darkmode", value);\r | |
1516 | redrawCanvas(allcanvas.front);\r | |
1517 | redrawCanvas(allcanvas.back);\r | |
1518 | }\r | |
1519 | \r | |
1520 | function setHighlightPin1(value) {\r | |
1521 | writeStorage("highlightpin1", value);\r | |
1522 | highlightpin1 = value;\r | |
1523 | redrawCanvas(allcanvas.front);\r | |
1524 | redrawCanvas(allcanvas.back);\r | |
1525 | }\r | |
1526 | \r | |
1527 | function getStoredCheckboxRefs(checkbox) {\r | |
1528 | function convert(ref) {\r | |
1529 | var intref = parseInt(ref);\r | |
1530 | if (isNaN(intref)) {\r | |
1531 | for (var i = 0; i < pcbdata.modules.length; i++) {\r | |
1532 | if (pcbdata.modules[i].ref == ref) {\r | |
1533 | return i;\r | |
1534 | }\r | |
1535 | }\r | |
1536 | return -1;\r | |
1537 | } else {\r | |
1538 | return intref;\r | |
1539 | }\r | |
1540 | }\r | |
1541 | var existingRefs = readStorage("checkbox_" + checkbox);\r | |
1542 | if (!existingRefs) {\r | |
1543 | return new Set();\r | |
1544 | } else {\r | |
1545 | return new Set(existingRefs.split(",").map(r => convert(r)));\r | |
1546 | }\r | |
1547 | }\r | |
1548 | \r | |
1549 | function getCheckboxState(checkbox, references) {\r | |
1550 | var storedRefsSet = getStoredCheckboxRefs(checkbox);\r | |
1551 | var currentRefsSet = new Set(references.map(r => r[1]));\r | |
1552 | // Get difference of current - stored\r | |
1553 | var difference = new Set(currentRefsSet);\r | |
1554 | for (ref of storedRefsSet) {\r | |
1555 | difference.delete(ref);\r | |
1556 | }\r | |
1557 | if (difference.size == 0) {\r | |
1558 | // All the current refs are stored\r | |
1559 | return "checked";\r | |
1560 | } else if (difference.size == currentRefsSet.size) {\r | |
1561 | // None of the current refs are stored\r | |
1562 | return "unchecked";\r | |
1563 | } else {\r | |
1564 | // Some of the refs are stored\r | |
1565 | return "indeterminate";\r | |
1566 | }\r | |
1567 | }\r | |
1568 | \r | |
1569 | function setBomCheckboxState(checkbox, element, references) {\r | |
1570 | var state = getCheckboxState(checkbox, references);\r | |
1571 | element.checked = (state == "checked");\r | |
1572 | element.indeterminate = (state == "indeterminate");\r | |
1573 | }\r | |
1574 | \r | |
1575 | function createCheckboxChangeHandler(checkbox, references) {\r | |
1576 | return function() {\r | |
1577 | refsSet = getStoredCheckboxRefs(checkbox);\r | |
1578 | if (this.checked) {\r | |
1579 | // checkbox ticked\r | |
1580 | for (var ref of references) {\r | |
1581 | refsSet.add(ref[1]);\r | |
1582 | }\r | |
1583 | } else {\r | |
1584 | // checkbox unticked\r | |
1585 | for (var ref of references) {\r | |
1586 | refsSet.delete(ref[1]);\r | |
1587 | }\r | |
1588 | }\r | |
1589 | writeStorage("checkbox_" + checkbox, [...refsSet].join(","));\r | |
1590 | }\r | |
1591 | }\r | |
1592 | \r | |
1593 | function createRowHighlightHandler(rowid, refs) {\r | |
1594 | return function() {\r | |
1595 | if (currentHighlightedRowId) {\r | |
1596 | if (currentHighlightedRowId == rowid) {\r | |
1597 | return;\r | |
1598 | }\r | |
1599 | document.getElementById(currentHighlightedRowId).classList.remove("highlighted");\r | |
1600 | }\r | |
1601 | document.getElementById(rowid).classList.add("highlighted");\r | |
1602 | currentHighlightedRowId = rowid;\r | |
1603 | highlightedModules = refs.map(r => r[1]);\r | |
1604 | drawHighlights();\r | |
1605 | }\r | |
1606 | }\r | |
1607 | \r | |
1608 | function entryMatches(entry) {\r | |
1609 | // check refs\r | |
1610 | for (var ref of entry[3]) {\r | |
1611 | if (ref[0].toLowerCase().indexOf(filter) >= 0) {\r | |
1612 | return true;\r | |
1613 | }\r | |
1614 | }\r | |
1615 | // check value\r | |
1616 | if (entry[1].toLowerCase().indexOf(filter) >= 0) {\r | |
1617 | return true;\r | |
1618 | }\r | |
1619 | // check footprint\r | |
1620 | if (entry[2].toLowerCase().indexOf(filter) >= 0) {\r | |
1621 | return true;\r | |
1622 | }\r | |
1623 | return false;\r | |
1624 | }\r | |
1625 | \r | |
1626 | function findRefInEntry(entry) {\r | |
1627 | return entry[3].filter(r => r[0].toLowerCase() == reflookup);\r | |
1628 | }\r | |
1629 | \r | |
1630 | function highlightFilter(s) {\r | |
1631 | if (!filter) {\r | |
1632 | return s;\r | |
1633 | }\r | |
1634 | var parts = s.toLowerCase().split(filter);\r | |
1635 | if (parts.length == 1) {\r | |
1636 | return s;\r | |
1637 | }\r | |
1638 | var r = "";\r | |
1639 | var pos = 0;\r | |
1640 | for (var i in parts) {\r | |
1641 | if (i > 0) {\r | |
1642 | r += '<mark class="highlight">' +\r | |
1643 | s.substring(pos, pos + filter.length) +\r | |
1644 | '</mark>';\r | |
1645 | pos += filter.length;\r | |
1646 | }\r | |
1647 | r += s.substring(pos, pos + parts[i].length);\r | |
1648 | pos += parts[i].length;\r | |
1649 | }\r | |
1650 | return r;\r | |
1651 | }\r | |
1652 | \r | |
1653 | function checkboxSetUnsetAllHandler(checkboxname) {\r | |
1654 | return function() {\r | |
1655 | var checkboxnum = 0;\r | |
1656 | while (checkboxnum < checkboxes.length &&\r | |
1657 | checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {\r | |
1658 | checkboxnum++;\r | |
1659 | }\r | |
1660 | if (checkboxnum >= checkboxes.length) {\r | |
1661 | return;\r | |
1662 | }\r | |
1663 | var allset = true;\r | |
1664 | var checkbox;\r | |
1665 | var row;\r | |
1666 | for (row of bombody.childNodes) {\r | |
1667 | checkbox = row.childNodes[checkboxnum + 1].childNodes[0];\r | |
1668 | if (!checkbox.checked || checkbox.indeterminate) {\r | |
1669 | allset = false;\r | |
1670 | break;\r | |
1671 | }\r | |
1672 | }\r | |
1673 | for (row of bombody.childNodes) {\r | |
1674 | checkbox = row.childNodes[checkboxnum + 1].childNodes[0];\r | |
1675 | checkbox.checked = !allset;\r | |
1676 | checkbox.indeterminate = false;\r | |
1677 | checkbox.onchange();\r | |
1678 | }\r | |
1679 | }\r | |
1680 | }\r | |
1681 | \r | |
1682 | function createColumnHeader(name, cls, comparator) {\r | |
1683 | var th = document.createElement("TH");\r | |
1684 | th.innerHTML = name;\r | |
1685 | th.classList.add(cls);\r | |
1686 | th.style.cursor = "pointer";\r | |
1687 | var span = document.createElement("SPAN");\r | |
1688 | span.classList.add("sortmark");\r | |
1689 | span.classList.add("none");\r | |
1690 | th.appendChild(span);\r | |
1691 | th.onclick = function() {\r | |
1692 | if (currentSortColumn && this !== currentSortColumn) {\r | |
1693 | // Currently sorted by another column\r | |
1694 | currentSortColumn.childNodes[1].classList.remove(currentSortOrder);\r | |
1695 | currentSortColumn.childNodes[1].classList.add("none");\r | |
1696 | currentSortColumn = null;\r | |
1697 | currentSortOrder = null;\r | |
1698 | }\r | |
1699 | if (currentSortColumn && this === currentSortColumn) {\r | |
1700 | // Already sorted by this column\r | |
1701 | if (currentSortOrder == "asc") {\r | |
1702 | // Sort by this column, descending order\r | |
1703 | bomSortFunction = function(a, b) {\r | |
1704 | return -comparator(a, b);\r | |
1705 | }\r | |
1706 | currentSortColumn.childNodes[1].classList.remove("asc");\r | |
1707 | currentSortColumn.childNodes[1].classList.add("desc");\r | |
1708 | currentSortOrder = "desc";\r | |
1709 | } else {\r | |
1710 | // Unsort\r | |
1711 | bomSortFunction = null;\r | |
1712 | currentSortColumn.childNodes[1].classList.remove("desc");\r | |
1713 | currentSortColumn.childNodes[1].classList.add("none");\r | |
1714 | currentSortColumn = null;\r | |
1715 | currentSortOrder = null;\r | |
1716 | }\r | |
1717 | } else {\r | |
1718 | // Sort by this column, ascending order\r | |
1719 | bomSortFunction = comparator;\r | |
1720 | currentSortColumn = this;\r | |
1721 | currentSortColumn.childNodes[1].classList.remove("none");\r | |
1722 | currentSortColumn.childNodes[1].classList.add("asc");\r | |
1723 | currentSortOrder = "asc";\r | |
1724 | }\r | |
1725 | populateBomBody();\r | |
1726 | }\r | |
1727 | return th;\r | |
1728 | }\r | |
1729 | \r | |
1730 | function populateBomHeader() {\r | |
1731 | while (bomhead.firstChild) {\r | |
1732 | bomhead.removeChild(bomhead.firstChild);\r | |
1733 | }\r | |
1734 | var tr = document.createElement("TR");\r | |
1735 | var th = document.createElement("TH");\r | |
1736 | th.classList.add("numCol");\r | |
1737 | tr.appendChild(th);\r | |
1738 | checkboxes = bomCheckboxes.split(",").filter((e) => e);\r | |
1739 | var checkboxCompareClosure = function(checkbox) {\r | |
1740 | return (a, b) => {\r | |
1741 | var stateA = getCheckboxState(checkbox, a[3]);\r | |
1742 | var stateB = getCheckboxState(checkbox, b[3]);\r | |
1743 | if (stateA > stateB) return -1;\r | |
1744 | if (stateA < stateB) return 1;\r | |
1745 | return 0;\r | |
1746 | }\r | |
1747 | }\r | |
1748 | for (var checkbox of checkboxes) {\r | |
1749 | th = createColumnHeader(\r | |
1750 | checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));\r | |
1751 | th.onclick = fancyDblClickHandler(\r | |
1752 | th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));\r | |
1753 | tr.appendChild(th);\r | |
1754 | }\r | |
1755 | tr.appendChild(createColumnHeader("References", "References", (a, b) => {\r | |
1756 | var i = 0;\r | |
1757 | while (i < a[3].length && i < b[3].length) {\r | |
1758 | if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;\r | |
1759 | i++;\r | |
1760 | }\r | |
1761 | return a[3].length - b[3].length;\r | |
1762 | }));\r | |
1763 | // Extra fields\r | |
1764 | if (config.extra_fields.length > 0) {\r | |
1765 | var extraFieldCompareClosure = function(fieldIndex) {\r | |
1766 | return (a, b) => {\r | |
1767 | var fa = a[4][fieldIndex];\r | |
1768 | var fb = b[4][fieldIndex];\r | |
1769 | if (fa != fb) return fa > fb ? 1 : -1;\r | |
1770 | else return 0;\r | |
1771 | }\r | |
1772 | }\r | |
1773 | for (var i in config.extra_fields) {\r | |
1774 | tr.appendChild(createColumnHeader(\r | |
1775 | config.extra_fields[i], "extra", extraFieldCompareClosure(i)));\r | |
1776 | }\r | |
1777 | }\r | |
1778 | tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {\r | |
1779 | return valueCompare(a[5], b[5], a[1], b[1]);\r | |
1780 | }));\r | |
1781 | tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {\r | |
1782 | if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;\r | |
1783 | else return 0;\r | |
1784 | }));\r | |
1785 | tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {\r | |
1786 | return a[3].length - b[3].length;\r | |
1787 | }));\r | |
1788 | bomhead.appendChild(tr);\r | |
1789 | }\r | |
1790 | \r | |
1791 | function populateBomBody() {\r | |
1792 | while (bom.firstChild) {\r | |
1793 | bom.removeChild(bom.firstChild);\r | |
1794 | }\r | |
1795 | highlightHandlers = [];\r | |
1796 | currentHighlightedRowId = null;\r | |
1797 | var first = true;\r | |
1798 | switch (canvaslayout) {\r | |
1799 | case 'F':\r | |
1800 | bomtable = pcbdata.bom.F;\r | |
1801 | break;\r | |
1802 | case 'FB':\r | |
1803 | bomtable = pcbdata.bom.both;\r | |
1804 | break;\r | |
1805 | case 'B':\r | |
1806 | bomtable = pcbdata.bom.B;\r | |
1807 | break;\r | |
1808 | }\r | |
1809 | if (bomSortFunction) {\r | |
1810 | bomtable = bomtable.slice().sort(bomSortFunction);\r | |
1811 | }\r | |
1812 | for (var i in bomtable) {\r | |
1813 | var bomentry = bomtable[i];\r | |
1814 | if (filter && !entryMatches(bomentry)) {\r | |
1815 | continue;\r | |
1816 | }\r | |
1817 | var references = bomentry[3];\r | |
1818 | if (reflookup) {\r | |
1819 | references = findRefInEntry(bomentry);\r | |
1820 | if (references.length == 0) {\r | |
1821 | continue;\r | |
1822 | }\r | |
1823 | }\r | |
1824 | var tr = document.createElement("TR");\r | |
1825 | var td = document.createElement("TD");\r | |
1826 | var rownum = +i + 1;\r | |
1827 | tr.id = "bomrow" + rownum;\r | |
1828 | td.textContent = rownum;\r | |
1829 | tr.appendChild(td);\r | |
1830 | // Checkboxes\r | |
1831 | for (var checkbox of checkboxes) {\r | |
1832 | if (checkbox) {\r | |
1833 | td = document.createElement("TD");\r | |
1834 | var input = document.createElement("input");\r | |
1835 | input.type = "checkbox";\r | |
1836 | input.onchange = createCheckboxChangeHandler(checkbox, references);\r | |
1837 | setBomCheckboxState(checkbox, input, references);\r | |
1838 | td.appendChild(input);\r | |
1839 | tr.appendChild(td);\r | |
1840 | }\r | |
1841 | }\r | |
1842 | // References\r | |
1843 | td = document.createElement("TD");\r | |
1844 | td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));\r | |
1845 | tr.appendChild(td);\r | |
1846 | // Extra fields\r | |
1847 | for (var i in config.extra_fields) {\r | |
1848 | td = document.createElement("TD");\r | |
1849 | td.innerHTML = highlightFilter(bomentry[4][i]);\r | |
1850 | tr.appendChild(td);\r | |
1851 | }\r | |
1852 | // Value\r | |
1853 | td = document.createElement("TD");\r | |
1854 | td.innerHTML = highlightFilter(bomentry[1]);\r | |
1855 | tr.appendChild(td);\r | |
1856 | // Footprint\r | |
1857 | td = document.createElement("TD");\r | |
1858 | td.innerHTML = highlightFilter(bomentry[2]);\r | |
1859 | tr.appendChild(td);\r | |
1860 | // Quantity\r | |
1861 | td = document.createElement("TD");\r | |
1862 | td.textContent = bomentry[3].length;\r | |
1863 | tr.appendChild(td);\r | |
1864 | bom.appendChild(tr);\r | |
1865 | var handler = createRowHighlightHandler(tr.id, references);\r | |
1866 | tr.onmousemove = handler;\r | |
1867 | highlightHandlers.push({\r | |
1868 | id: tr.id,\r | |
1869 | handler: handler,\r | |
1870 | refs: references\r | |
1871 | });\r | |
1872 | if ((filter || reflookup) && first) {\r | |
1873 | handler();\r | |
1874 | first = false;\r | |
1875 | }\r | |
1876 | }\r | |
1877 | }\r | |
1878 | \r | |
1879 | function highlightPreviousRow() {\r | |
1880 | if (!currentHighlightedRowId) {\r | |
1881 | highlightHandlers[highlightHandlers.length - 1].handler();\r | |
1882 | } else {\r | |
1883 | if (highlightHandlers.length > 1 &&\r | |
1884 | highlightHandlers[0].id == currentHighlightedRowId) {\r | |
1885 | highlightHandlers[highlightHandlers.length - 1].handler();\r | |
1886 | } else {\r | |
1887 | for (var i = 0; i < highlightHandlers.length - 1; i++) {\r | |
1888 | if (highlightHandlers[i + 1].id == currentHighlightedRowId) {\r | |
1889 | highlightHandlers[i].handler();\r | |
1890 | break;\r | |
1891 | }\r | |
1892 | }\r | |
1893 | }\r | |
1894 | }\r | |
1895 | smoothScrollToRow(currentHighlightedRowId);\r | |
1896 | }\r | |
1897 | \r | |
1898 | function highlightNextRow() {\r | |
1899 | if (!currentHighlightedRowId) {\r | |
1900 | highlightHandlers[0].handler();\r | |
1901 | } else {\r | |
1902 | if (highlightHandlers.length > 1 &&\r | |
1903 | highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {\r | |
1904 | highlightHandlers[0].handler();\r | |
1905 | } else {\r | |
1906 | for (var i = 1; i < highlightHandlers.length; i++) {\r | |
1907 | if (highlightHandlers[i - 1].id == currentHighlightedRowId) {\r | |
1908 | highlightHandlers[i].handler();\r | |
1909 | break;\r | |
1910 | }\r | |
1911 | }\r | |
1912 | }\r | |
1913 | }\r | |
1914 | smoothScrollToRow(currentHighlightedRowId);\r | |
1915 | }\r | |
1916 | \r | |
1917 | function populateBomTable() {\r | |
1918 | populateBomHeader();\r | |
1919 | populateBomBody();\r | |
1920 | }\r | |
1921 | \r | |
1922 | function modulesClicked(moduleIndexes) {\r | |
1923 | var lastClickedIndex = moduleIndexes.indexOf(lastClicked);\r | |
1924 | var index = moduleIndexes[(lastClickedIndex + 1) % moduleIndexes.length];\r | |
1925 | for (var handler of highlightHandlers) {\r | |
1926 | if (handler.refs.map(r => r[1]).indexOf(index) >= 0) {\r | |
1927 | lastClicked = index;\r | |
1928 | handler.handler();\r | |
1929 | smoothScrollToRow(currentHighlightedRowId);\r | |
1930 | break;\r | |
1931 | }\r | |
1932 | }\r | |
1933 | }\r | |
1934 | \r | |
1935 | function updateFilter(input) {\r | |
1936 | filter = input.toLowerCase();\r | |
1937 | populateBomTable();\r | |
1938 | }\r | |
1939 | \r | |
1940 | function updateRefLookup(input) {\r | |
1941 | reflookup = input.toLowerCase();\r | |
1942 | populateBomTable();\r | |
1943 | }\r | |
1944 | \r | |
1945 | function silkscreenVisible(visible) {\r | |
1946 | if (visible) {\r | |
1947 | allcanvas.front.silk.style.display = "";\r | |
1948 | allcanvas.back.silk.style.display = "";\r | |
1949 | writeStorage("silkscreenVisible", true);\r | |
1950 | } else {\r | |
1951 | allcanvas.front.silk.style.display = "none";\r | |
1952 | allcanvas.back.silk.style.display = "none";\r | |
1953 | writeStorage("silkscreenVisible", false);\r | |
1954 | }\r | |
1955 | }\r | |
1956 | \r | |
1957 | function changeCanvasLayout(layout) {\r | |
1958 | document.getElementById("fl-btn").classList.remove("depressed");\r | |
1959 | document.getElementById("fb-btn").classList.remove("depressed");\r | |
1960 | document.getElementById("bl-btn").classList.remove("depressed");\r | |
1961 | switch (layout) {\r | |
1962 | case 'F':\r | |
1963 | document.getElementById("fl-btn").classList.add("depressed");\r | |
1964 | if (bomlayout != "bom-only") {\r | |
1965 | canvassplit.collapse(1);\r | |
1966 | }\r | |
1967 | break;\r | |
1968 | case 'B':\r | |
1969 | document.getElementById("bl-btn").classList.add("depressed");\r | |
1970 | if (bomlayout != "bom-only") {\r | |
1971 | canvassplit.collapse(0);\r | |
1972 | }\r | |
1973 | break;\r | |
1974 | default:\r | |
1975 | document.getElementById("fb-btn").classList.add("depressed");\r | |
1976 | if (bomlayout != "bom-only") {\r | |
1977 | canvassplit.setSizes([50, 50]);\r | |
1978 | }\r | |
1979 | }\r | |
1980 | canvaslayout = layout;\r | |
1981 | writeStorage("canvaslayout", layout);\r | |
1982 | resizeAll();\r | |
1983 | populateBomTable();\r | |
1984 | }\r | |
1985 | \r | |
1986 | function populateMetadata() {\r | |
1987 | document.getElementById("title").innerHTML = pcbdata.metadata.title;\r | |
1988 | document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;\r | |
1989 | document.getElementById("company").innerHTML = pcbdata.metadata.company;\r | |
1990 | document.getElementById("filedate").innerHTML = pcbdata.metadata.date;\r | |
1991 | if (pcbdata.metadata.title != "") {\r | |
1992 | document.title = pcbdata.metadata.title + " BOM";\r | |
1993 | }\r | |
1994 | }\r | |
1995 | \r | |
1996 | function changeBomLayout(layout) {\r | |
1997 | document.getElementById("bom-btn").classList.remove("depressed");\r | |
1998 | document.getElementById("lr-btn").classList.remove("depressed");\r | |
1999 | document.getElementById("tb-btn").classList.remove("depressed");\r | |
2000 | switch (layout) {\r | |
2001 | case 'bom-only':\r | |
2002 | document.getElementById("bom-btn").classList.add("depressed");\r | |
2003 | if (bomsplit) {\r | |
2004 | bomsplit.destroy();\r | |
2005 | bomsplit = null;\r | |
2006 | canvassplit.destroy();\r | |
2007 | canvassplit = null;\r | |
2008 | }\r | |
2009 | document.getElementById("frontcanvas").style.display = "none";\r | |
2010 | document.getElementById("backcanvas").style.display = "none";\r | |
2011 | document.getElementById("bot").style.height = "";\r | |
2012 | break;\r | |
2013 | case 'top-bottom':\r | |
2014 | document.getElementById("tb-btn").classList.add("depressed");\r | |
2015 | document.getElementById("frontcanvas").style.display = "";\r | |
2016 | document.getElementById("backcanvas").style.display = "";\r | |
2017 | document.getElementById("bot").style.height = "calc(100% - 80px)";\r | |
2018 | document.getElementById("bomdiv").classList.remove("split-horizontal");\r | |
2019 | document.getElementById("canvasdiv").classList.remove("split-horizontal");\r | |
2020 | document.getElementById("frontcanvas").classList.add("split-horizontal");\r | |
2021 | document.getElementById("backcanvas").classList.add("split-horizontal");\r | |
2022 | if (bomsplit) {\r | |
2023 | bomsplit.destroy();\r | |
2024 | bomsplit = null;\r | |
2025 | canvassplit.destroy();\r | |
2026 | canvassplit = null;\r | |
2027 | }\r | |
2028 | bomsplit = Split(['#bomdiv', '#canvasdiv'], {\r | |
2029 | sizes: [50, 50],\r | |
2030 | onDragEnd: resizeAll,\r | |
2031 | direction: "vertical",\r | |
2032 | gutterSize: 5\r | |
2033 | });\r | |
2034 | canvassplit = Split(['#frontcanvas', '#backcanvas'], {\r | |
2035 | sizes: [50, 50],\r | |
2036 | gutterSize: 5,\r | |
2037 | onDragEnd: resizeAll\r | |
2038 | });\r | |
2039 | break;\r | |
2040 | case 'left-right':\r | |
2041 | document.getElementById("lr-btn").classList.add("depressed");\r | |
2042 | document.getElementById("frontcanvas").style.display = "";\r | |
2043 | document.getElementById("backcanvas").style.display = "";\r | |
2044 | document.getElementById("bot").style.height = "calc(100% - 80px)";\r | |
2045 | document.getElementById("bomdiv").classList.add("split-horizontal");\r | |
2046 | document.getElementById("canvasdiv").classList.add("split-horizontal");\r | |
2047 | document.getElementById("frontcanvas").classList.remove("split-horizontal");\r | |
2048 | document.getElementById("backcanvas").classList.remove("split-horizontal");\r | |
2049 | if (bomsplit) {\r | |
2050 | bomsplit.destroy();\r | |
2051 | bomsplit = null;\r | |
2052 | canvassplit.destroy();\r | |
2053 | canvassplit = null;\r | |
2054 | }\r | |
2055 | bomsplit = Split(['#bomdiv', '#canvasdiv'], {\r | |
2056 | sizes: [50, 50],\r | |
2057 | onDragEnd: resizeAll,\r | |
2058 | gutterSize: 5\r | |
2059 | });\r | |
2060 | canvassplit = Split(['#frontcanvas', '#backcanvas'], {\r | |
2061 | sizes: [50, 50],\r | |
2062 | gutterSize: 5,\r | |
2063 | direction: "vertical",\r | |
2064 | onDragEnd: resizeAll\r | |
2065 | });\r | |
2066 | }\r | |
2067 | bomlayout = layout;\r | |
2068 | writeStorage("bomlayout", layout);\r | |
2069 | changeCanvasLayout(canvaslayout);\r | |
2070 | }\r | |
2071 | \r | |
2072 | function focusFilterField() {\r | |
2073 | focusInputField(document.getElementById("filter"));\r | |
2074 | }\r | |
2075 | \r | |
2076 | function focusRefLookupField() {\r | |
2077 | focusInputField(document.getElementById("reflookup"));\r | |
2078 | }\r | |
2079 | \r | |
2080 | function toggleBomCheckbox(bomrowid, checkboxnum) {\r | |
2081 | if (!bomrowid || checkboxnum > checkboxes.length) {\r | |
2082 | return;\r | |
2083 | }\r | |
2084 | var bomrow = document.getElementById(bomrowid);\r | |
2085 | var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];\r | |
2086 | checkbox.checked = !checkbox.checked;\r | |
2087 | checkbox.indeterminate = false;\r | |
2088 | checkbox.onchange();\r | |
2089 | }\r | |
2090 | \r | |
2091 | function checkBomCheckbox(bomrowid, checkboxname) {\r | |
2092 | var checkboxnum = 0;\r | |
2093 | while (checkboxnum < checkboxes.length &&\r | |
2094 | checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {\r | |
2095 | checkboxnum++;\r | |
2096 | }\r | |
2097 | if (!bomrowid || checkboxnum >= checkboxes.length) {\r | |
2098 | return;\r | |
2099 | }\r | |
2100 | var bomrow = document.getElementById(bomrowid);\r | |
2101 | var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];\r | |
2102 | checkbox.checked = true;\r | |
2103 | checkbox.indeterminate = false;\r | |
2104 | checkbox.onchange();\r | |
2105 | }\r | |
2106 | \r | |
2107 | function setBomCheckboxes(value) {\r | |
2108 | bomCheckboxes = value;\r | |
2109 | writeStorage("bomCheckboxes", value);\r | |
2110 | populateBomTable();\r | |
2111 | }\r | |
2112 | \r | |
2113 | document.onkeydown = function(e) {\r | |
2114 | switch (e.key) {\r | |
2115 | case "n":\r | |
2116 | if (document.activeElement.type == "text") {\r | |
2117 | return;\r | |
2118 | }\r | |
2119 | if (currentHighlightedRowId !== null) {\r | |
2120 | checkBomCheckbox(currentHighlightedRowId, "placed");\r | |
2121 | highlightNextRow();\r | |
2122 | e.preventDefault();\r | |
2123 | }\r | |
2124 | break;\r | |
2125 | case "ArrowUp":\r | |
2126 | highlightPreviousRow();\r | |
2127 | e.preventDefault();\r | |
2128 | break;\r | |
2129 | case "ArrowDown":\r | |
2130 | highlightNextRow();\r | |
2131 | e.preventDefault();\r | |
2132 | break;\r | |
2133 | default:\r | |
2134 | break;\r | |
2135 | }\r | |
2136 | if (e.altKey) {\r | |
2137 | switch (e.key) {\r | |
2138 | case "f":\r | |
2139 | focusFilterField();\r | |
2140 | e.preventDefault();\r | |
2141 | break;\r | |
2142 | case "r":\r | |
2143 | focusRefLookupField();\r | |
2144 | e.preventDefault();\r | |
2145 | break;\r | |
2146 | case "z":\r | |
2147 | changeBomLayout("bom-only");\r | |
2148 | e.preventDefault();\r | |
2149 | break;\r | |
2150 | case "x":\r | |
2151 | changeBomLayout("left-right");\r | |
2152 | e.preventDefault();\r | |
2153 | break;\r | |
2154 | case "c":\r | |
2155 | changeBomLayout("top-bottom");\r | |
2156 | e.preventDefault();\r | |
2157 | break;\r | |
2158 | case "v":\r | |
2159 | changeCanvasLayout("F");\r | |
2160 | e.preventDefault();\r | |
2161 | break;\r | |
2162 | case "b":\r | |
2163 | changeCanvasLayout("FB");\r | |
2164 | e.preventDefault();\r | |
2165 | break;\r | |
2166 | case "n":\r | |
2167 | changeCanvasLayout("B");\r | |
2168 | e.preventDefault();\r | |
2169 | break;\r | |
2170 | default:\r | |
2171 | break;\r | |
2172 | }\r | |
2173 | if (e.key >= '1' && e.key <= '9') {\r | |
2174 | toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));\r | |
2175 | }\r | |
2176 | }\r | |
2177 | }\r | |
2178 | \r | |
2179 | function initDefaults() {\r | |
2180 | bomlayout = readStorage("bomlayout");\r | |
2181 | if (bomlayout === null) {\r | |
2182 | bomlayout = config.bom_view;\r | |
2183 | }\r | |
2184 | if (!['bom-only', 'left-right', 'top-bottom'].includes(bomlayout)) {\r | |
2185 | bomlayout = config.bom_view;\r | |
2186 | }\r | |
2187 | canvaslayout = readStorage("canvaslayout");\r | |
2188 | if (canvaslayout === null) {\r | |
2189 | canvaslayout = config.layer_view;\r | |
2190 | }\r | |
2191 | bomCheckboxes = readStorage("bomCheckboxes");\r | |
2192 | if (bomCheckboxes === null) {\r | |
2193 | bomCheckboxes = config.checkboxes;\r | |
2194 | }\r | |
2195 | document.getElementById("bomCheckboxes").value = bomCheckboxes;\r | |
2196 | \r | |
2197 | var b = readStorage("silkscreenVisible");\r | |
2198 | if (b === null) {\r | |
2199 | b = config.show_silkscreen;\r | |
2200 | }\r | |
2201 | document.getElementById("silkscreenCheckbox").checked = b;\r | |
2202 | silkscreenVisible(b);\r | |
2203 | \r | |
2204 | b = readStorage("redrawOnDrag");\r | |
2205 | if (b === null) {\r | |
2206 | b = config.redraw_on_drag;\r | |
2207 | }\r | |
2208 | document.getElementById("dragCheckbox").checked = b;\r | |
2209 | setRedrawOnDrag(b);\r | |
2210 | \r | |
2211 | b = readStorage("darkmode");\r | |
2212 | if (b === null) {\r | |
2213 | b = config.dark_mode;\r | |
2214 | }\r | |
2215 | document.getElementById("darkmodeCheckbox").checked = b;\r | |
2216 | setDarkMode(b);\r | |
2217 | \r | |
2218 | b = readStorage("highlightpin1");\r | |
2219 | if (b === null) {\r | |
2220 | b = config.highlight_pin1;\r | |
2221 | }\r | |
2222 | document.getElementById("highlightpin1Checkbox").checked = b;\r | |
2223 | setHighlightPin1(b);\r | |
2224 | \r | |
2225 | boardRotation = readStorage("boardRotation");\r | |
2226 | if (boardRotation === null) {\r | |
2227 | boardRotation = config.board_rotation * 5;\r | |
2228 | } else {\r | |
2229 | boardRotation = parseInt(boardRotation);\r | |
2230 | }\r | |
2231 | document.getElementById("boardRotation").value = boardRotation / 5;\r | |
2232 | document.getElementById("rotationDegree").textContent = boardRotation;\r | |
2233 | }\r | |
2234 | \r | |
2235 | window.onload = function(e) {\r | |
2236 | initUtils();\r | |
2237 | initRender();\r | |
2238 | initStorage();\r | |
2239 | initDefaults();\r | |
2240 | cleanGutters();\r | |
2241 | populateMetadata();\r | |
2242 | dbgdiv = document.getElementById("dbg");\r | |
2243 | bom = document.getElementById("bombody");\r | |
2244 | bomhead = document.getElementById("bomhead");\r | |
2245 | filter = "";\r | |
2246 | reflookup = "";\r | |
2247 | // Triggers render\r | |
2248 | changeBomLayout(bomlayout);\r | |
2249 | }\r | |
2250 | \r | |
2251 | window.onresize = resizeAll;\r | |
2252 | window.matchMedia("print").addListener(resizeAll);\r | |
2253 | \r | |
2254 | ///////////////////////////////////////////////\r | |
2255 | \r | |
2256 | </script>\r | |
2257 | </head>\r | |
2258 | \r | |
2259 | <body>\r | |
2260 | <div id="topmostdiv" style="width: 100%; height: 100%">\r | |
2261 | <div id="top">\r | |
2262 | <div style="float: right;">\r | |
2263 | <div class="hideonprint menu" style="float: right; margin: 10px; top: 8px;">\r | |
2264 | <button class="menubtn"></button>\r | |
2265 | <div class="menu-content">\r | |
2266 | <label class="menu-label menu-label-top">\r | |
2267 | <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">\r | |
2268 | Dark mode\r | |
2269 | </label>\r | |
2270 | <label class="menu-label">\r | |
2271 | <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">\r | |
2272 | Show silkscreen\r | |
2273 | </label>\r | |
2274 | <label class="menu-label">\r | |
2275 | <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">\r | |
2276 | Highlight first pin\r | |
2277 | </label>\r | |
2278 | <label class="menu-label">\r | |
2279 | <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">\r | |
2280 | Continuous redraw on drag\r | |
2281 | </label>\r | |
2282 | <label class="menu-label">\r | |
2283 | <span>Board rotation</span>\r | |
2284 | <span style="float: right"><span id="rotationDegree">0</span>°</span>\r | |
2285 | <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">\r | |
2286 | </label>\r | |
2287 | <label class="menu-label">\r | |
2288 | <div style="margin-left: 5px">Bom checkboxes</div>\r | |
2289 | <input id="bomCheckboxes" class="menu-textbox" type=text\r | |
2290 | oninput="setBomCheckboxes(this.value)">\r | |
2291 | </label>\r | |
2292 | <label class="menu-label">\r | |
2293 | <span class="shameless-plug">\r | |
2294 | <span>Created using</span>\r | |
2295 | <a target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>\r | |
2296 | </span>\r | |
2297 | </label>\r | |
2298 | </div>\r | |
2299 | </div>\r | |
2300 | <div class="button-container hideonprint"\r | |
2301 | style="float: right; margin: 10px; position: relative; top: 8px">\r | |
2302 | <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"\r | |
2303 | title="Front only">F\r | |
2304 | </button>\r | |
2305 | <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"\r | |
2306 | title="Front and Back">FB\r | |
2307 | </button>\r | |
2308 | <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"\r | |
2309 | title="Back only">B\r | |
2310 | </button>\r | |
2311 | </div>\r | |
2312 | <div class="button-container hideonprint"\r | |
2313 | style="float: right; margin: 10px; position: relative; top: 8px">\r | |
2314 | <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"\r | |
2315 | title="BOM only"></button>\r | |
2316 | <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"\r | |
2317 | title="BOM left, drawings right"></button>\r | |
2318 | <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"\r | |
2319 | title="BOM top, drawings bot"></button>\r | |
2320 | </div>\r | |
2321 | </div>\r | |
2322 | <div id="fileinfodiv" style="overflow: auto;">\r | |
2323 | <table class="fileinfo">\r | |
2324 | <tbody>\r | |
2325 | <tr>\r | |
2326 | <td id="title" class="title" style="width: 70%">\r | |
2327 | Title\r | |
2328 | </td>\r | |
2329 | <td id="revision" class="title" style="width: 30%">\r | |
2330 | Revision\r | |
2331 | </td>\r | |
2332 | </tr>\r | |
2333 | <tr>\r | |
2334 | <td id="company">\r | |
2335 | Kicad version\r | |
2336 | </td>\r | |
2337 | <td id="filedate">\r | |
2338 | Date\r | |
2339 | </td>\r | |
2340 | </tr>\r | |
2341 | </tbody>\r | |
2342 | </table>\r | |
2343 | </div>\r | |
2344 | </div>\r | |
2345 | <div id="bot" class="split" style="height: calc(100% - 80px)">\r | |
2346 | <div id="bomdiv" class="split split-horizontal">\r | |
2347 | <div style="width: 100%">\r | |
2348 | <input id="reflookup" class="searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"\r | |
2349 | oninput="updateRefLookup(this.value)">\r | |
2350 | <input id="filter" class="searchbox filter hideonprint" type="text" placeholder="Filter"\r | |
2351 | oninput="updateFilter(this.value)">\r | |
2352 | <div class="button-container hideonprint" style="float: left">\r | |
2353 | <button id="copy" title="Copy bom table to clipboard"\r | |
2354 | onclick="copyToClipboard()"></button>\r | |
2355 | </div>\r | |
2356 | </div>\r | |
2357 | <div id="dbg"></div>\r | |
2358 | <table class="bom">\r | |
2359 | <thead id="bomhead">\r | |
2360 | </thead>\r | |
2361 | <tbody id="bombody">\r | |
2362 | </tbody>\r | |
2363 | </table>\r | |
2364 | </div>\r | |
2365 | <div id="canvasdiv" class="split split-horizontal">\r | |
2366 | <div id="frontcanvas" class="split" style="overflow: hidden">\r | |
2367 | <div style="position: relative; width: 100%; height: 100%;">\r | |
2368 | <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>\r | |
2369 | <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>\r | |
2370 | <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>\r | |
2371 | </div>\r | |
2372 | </div>\r | |
2373 | <div id="backcanvas" class="split" style="overflow: hidden">\r | |
2374 | <div style="position: relative; width: 100%; height: 100%;">\r | |
2375 | <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>\r | |
2376 | <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>\r | |
2377 | <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>\r | |
2378 | </div>\r | |
2379 | </div>\r | |
2380 | </div>\r | |
2381 | </div>\r | |
2382 | </div>\r | |
2383 | </body>\r | |
2384 | \r | |
2385 | </html>\r |