<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Interactive BOM for KiCAD</title> <style type="text/css"> :root { --pcb-edge-color: black; } html, body { margin: 0px; height: 100%; font-family: Verdana, sans-serif; } .dark { --pcb-edge-color: #eee; background-color: #252c30; color: #eee; } button { background-color: #eee; border: 1px solid #888; color: black; height: 44px; width: 44px; text-align: center; text-decoration: none; display: inline-block; font-size: 14px; font-weight: bolder; } .dark button { background-color: #c3b7b5; /* This will be inverted */ } button.depressed { background-color: #0a0; color: white; } .dark button.depressed { background-color: #b3b; /* This will be inverted */ } button:focus { outline: 0; } button#tb-btn { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFAAAABQUFCAgICQkJCgoKEBAQFhYWFxcXGxsbHBwcISEhIyMjJCQkKSkpLS0tLi4uMTExNzc3PDw8QEBAQkJCRERERkZGSEhIT09PWlpaW1tbXFxcYGBgaWlpd3d3eXl5enp6f39/gICAgYGBgoKCi4uLjIyMkpKSk5OTlJSUlpaWl5eXmZmZnJycn5+foqKipqamr6+vtLS0uLi4v7+/w8PDyMjIy8vLz8/P1dXV19fX3Nzc5ubm6urq7+/v8fHx9fX1+Pj4////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkhsDgAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAAA/klEQVQ4T9WT21bCMBBFB0UQRAWrVEmtDYgtXlC03m8l//9PwyQZSRfSLF/dLzmr2WtyHjqAKIJKBCJgI80rSRsIIlUeUgFBTud0LS9K5YEVorXMnFDJnwWeuULpCW61QqlkJf+mQ8wDLdmYgyUmIeRKloMOB0v464lpxMHCHYozy5yF1yRJ5O23Ez5hb6ApWJhBf3BUb32UhKGep2GBPt7DtV94hgePcPN01T6ltBQ2tohHJ+zub3ZpgBMi/ZN/OSFXxTlc+DuoXssvzDs7HuHw5Hi7drcUCqlHGozwJqUcXb5TIkFMzMUPRnBMBGAzM3vKxCEHQ9ak7fauP+ICTGDKoEYZFYYAAAAASUVORK5CYII='); background-position: 5px 5px; background-repeat: no-repeat; } button#lr-btn { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURQAAABYWFhcXFzIyMjc3Nzw8PD09PUBAQE9PT1ZWVldXV1paWlxcXGFhYWNjY2dnZ2xsbG5ubnFxcXNzc3V1dXZ2dnl5eYCAgIaGhpKSkpOTk5SUlJycnKKioqampqysrLGxsbe3t7+/v8XFxcnJydTU1NbW1tnZ2ebm5u/v7/z8/P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJTAHzkAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjE51NayZAAAAO5JREFUOE+tk9kSgjAMRatRcakbrogL4q7//30xobFUpOiD56XJ9ExzpzNRiDrwohEV1qLUAeQ0RDVUOno4JJBIZYi0ClKpM4pCGpQKYY/h3giJRYRB90jkAlheQsiXjGfEd6FJEbbcV2W45YIEIP6XoSBIAMIjSABChJySEaE8ZigRCnxmKHtBZOKXDCyEw9k8vnDvEeirz2vYU2UEmUe8BP6HxcgKEoBwhf7GCg4itMZzmHDvz3A6wI6qqgwpWEECEK5whrt/BAnXaYcqnwDQaC/pARZ0nN0IRsiJtcL6SjY14315V3Xa7sr1R3wC/SGCp4FJdscAAAAASUVORK5CYII='); background-position: 5px 5px; background-repeat: no-repeat; } button#bom-btn { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAwBQTFRFAAAAFhYWFxcXQEBAXFxcYGBgkpKSk5OTlJSUn5+fr6+vv7+/z8/P////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQtWgtgAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTnU1rJkAAAAaElEQVQ4T+3T0QqAIAwF0JlrWub/f+5NcpCIk16Fzosv4+6CjAD2JgYITpJJHIglTwiTT+U9hq6ck68D+9D5Dpg+D2hmp1mhrTpNSdNSHTSz8/9FtVAHjk+WITJhC3qpA2Er1z09f+AGC2MyfYdXtvQAAAAASUVORK5CYII='); background-position: 5px 5px; background-repeat: no-repeat; } .left-most-button { border-right: 0; border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .middle-button { border-right: 0; } .right-most-button { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .button-container { font-size: 0; } .dark .button-container { filter: invert(1); } @media print { .hideonprint { display: none; } } canvas { cursor: crosshair; } canvas:active { cursor: grabbing; } .fileinfo { width: 100%; max-width: 1000px; border: none; padding: 5px; } .fileinfo .title { font-size: 20pt; font-weight: bold; } .fileinfo td { overflow: hidden; white-space: nowrap; max-width: 1px; width: 50%; text-overflow: ellipsis; } .bom { border-collapse: collapse; font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace; font-size: 10pt; table-layout: fixed; width: 100%; margin-top: 1px; } .bom th, .bom td { border: 1px solid black; padding: 5px; word-wrap: break-word; text-align: center; } .dark .bom th, .dark .bom td { border: 1px solid #777; } .bom th { background-color: #CCCCCC; } .dark .bom th { background-color: #3b4749; } .bom tr.highlighted:nth-child(n) { background-color: #cfc; } .dark .bom tr.highlighted:nth-child(n) { background-color: #226022; } .bom tr:nth-child(even) { background-color: #f2f2f2; } .dark .bom tr:nth-child(even) { background-color: #313b40; } .bom tr { transition: background-color 0.2s; } .bom .numCol { width: 25px; } .bom .bom-checkbox { width: 30px; } .bom .Description { width: 10%; } .bom .Part { width: 10%; } .bom .Value { width: 15%; } .bom .Quantity { width: 65px; } .split { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; overflow-y: auto; overflow-x: hidden; } .split.split-horizontal, .gutter.gutter-horizontal { height: 100%; float: left; } .gutter { background-color: #ddd; background-repeat: no-repeat; background-position: 50%; transition: background-color 0.3s; } .dark .gutter { background-color: #777; } .gutter.gutter-horizontal { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=='); cursor: ew-resize; width: 5px; } .gutter.gutter-vertical { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII='); cursor: ns-resize; height: 5px; } .searchbox { float: left; height: 40px; margin: 10px 5px; padding: 12px 32px; font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace; font-size: 18px; box-sizing: border-box; border: 1px solid #888; border-radius: 6px; outline: none; background-color: #eee; transition: background-color 0.2s, border 0.2s; 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=='); background-position: 10px 10px; background-repeat: no-repeat; } .dark .searchbox { background-color: #111; color: #eee; } .searchbox::placeholder { color: #ccc; } .dark .searchbox::placeholder { color: #666; } .filter { width: calc(60% - 10px); } .reflookup { width: calc(40% - 10px); } input[type=text]:focus { background-color: white; border: 1px solid #333; } .dark input[type=text]:focus { background-color: #333; border: 1px solid #ccc; } mark.highlight { background-color: #5050ff; color: #fff; padding: 2px; border-radius: 6px; } .dark mark.highlight { background-color: #76a6da; color: #111; } .menubtn { background-color: white; font-size: 16px; border: none; 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"); background-position: center; background-repeat: no-repeat; } .dark .menubtn { filter: invert(1); } .menu { position: relative; display: inline-block; } .menu-content { display: none; position: absolute; background-color: white; right: 0; min-width: 300px; box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); z-index: 100; padding: 8px; } .dark .menu-content { background-color: #111; } .menu:hover .menu-content { display: block; } .menu:hover .menubtn { background-color: #eee; } .dark .menu:hover .menubtn { } .menu-label { display: inline-block; padding: 8px; border: 1px solid #ccc; border-top: 0; width: calc(100% - 18px); } .menu-label-top { border-top: 1px solid #ccc; } .menu-textbox { float: left; height: 24px; margin: 10px 5px; padding: 5px 5px; font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace; font-size: 14px; box-sizing: border-box; border: 1px solid #888; border-radius: 4px; outline: none; background-color: #eee; transition: background-color 0.2s, border 0.2s; width: calc(100% - 10px); } .dark .menu-textbox { background-color: #222; color: #eee; } #topmostdiv { transition: background-color 0.3s; } #top { height: 78px; border-bottom: 2px solid black; } .dark #top { border-bottom: 2px solid #ccc; } #dbg { display: block; } ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #aaa; } ::-webkit-scrollbar-thumb { background: #666; border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: #555; } </style> <script type="text/javascript" > /////////////////////////////////////////////// /* Split.js - v1.3.5 MIT License https://github.com/nathancahill/Split.js */ !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}}}); /////////////////////////////////////////////// /////////////////////////////////////////////// var pcbdata = {"modules": {"U5": {"layer": "F", "center": [129.1336, 71.755], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [126.78156, 70.25386], "shape": "rect", "pin1": true, "type": "smd", "size": [1.0007599999999999, 2.5019]}, {"layers": ["F"], "angle": -270.0, "pos": [126.78156, 71.755], "shape": "rect", "pin1": false, "type": "smd", "size": [1.0007599999999999, 2.5019]}, {"layers": ["F"], "angle": -270.0, "pos": [126.78156, 73.25614], "shape": "rect", "pin1": false, "type": "smd", "size": [1.0007599999999999, 2.5019]}, {"layers": ["F"], "angle": -270.0, "pos": [130.7338, 71.755], "shape": "rect", "pin1": false, "type": "smd", "size": [1.99898, 4.0005]}], "drawings": [], "ref": "U5", "bbox": {"pos": [125.53061, 69.429559], "size": [7.20344, 4.650882]}}, "U1": {"layer": "F", "center": [135.1026, 82.5754], "pads": [{"layers": ["F"], "angle": -135.0, "pos": [135.562219, 85.50989299999999], "shape": "rect", "pin1": true, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [135.915773, 85.15634], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [136.269326, 84.802786], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [136.62287999999998, 84.44923299999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [136.976433, 84.09568], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [137.329986, 83.742126], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [137.68354, 83.388573], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [138.037093, 83.03501899999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [138.037093, 82.115781], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [137.68354, 81.762227], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [137.329986, 81.40867399999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [136.976433, 81.05512], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [136.62287999999998, 80.701567], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [136.269326, 80.34801399999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [135.915773, 79.99445999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [135.562219, 79.640907], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [134.642981, 79.640907], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [134.289427, 79.99445999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [133.93587399999998, 80.34801399999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [133.58231999999998, 80.701567], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [133.228767, 81.05512], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [132.875214, 81.40867399999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [132.52166, 81.762227], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [132.168107, 82.115781], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [132.168107, 83.03501899999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [132.52166, 83.388573], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [132.875214, 83.742126], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [133.228767, 84.09568], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [133.58231999999998, 84.44923299999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [133.93587399999998, 84.802786], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [134.289427, 85.15634], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -225.0, "pos": [134.642981, 85.50989299999999], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7, 0.25]}, {"layers": ["F"], "angle": -135.0, "pos": [135.1026, 81.35564099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["F"], "angle": -135.0, "pos": [133.88284099999998, 82.5754], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["F"], "angle": -135.0, "pos": [136.322359, 82.5754], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["F"], "angle": -135.0, "pos": [135.1026, 83.795159], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["B"], "angle": -135.0, "pos": [135.1026, 83.79671499999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["B"], "angle": -135.0, "pos": [133.881285, 82.5754], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["B"], "angle": -135.0, "pos": [136.323915, 82.5754], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["B"], "angle": -135.0, "pos": [135.1026, 81.354085], "shape": "rect", "pin1": false, "type": "smd", "size": [1.7249999999999999, 1.7249999999999999]}, {"layers": ["F", "B"], "angle": -135.0, "pos": [135.1026, 83.79671499999999], "drillsize": [0.3, 0.3], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [0.6, 0.6]}, {"layers": ["F", "B"], "angle": -135.0, "pos": [133.881285, 82.5754], "drillsize": [0.3, 0.3], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [0.6, 0.6]}, {"layers": ["F", "B"], "angle": -135.0, "pos": [136.323915, 82.5754], "drillsize": [0.3, 0.3], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [0.6, 0.6]}, {"layers": ["F", "B"], "angle": -135.0, "pos": [135.1026, 81.354085], "drillsize": [0.3, 0.3], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [0.6, 0.6]}, {"layers": ["F", "B"], "angle": -135.0, "pos": [135.1026, 82.5754], "drillsize": [0.3, 0.3], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [0.6, 0.6]}], "drawings": [], "ref": "U1", "bbox": {"pos": [130.834958, 78.30775799999999], "size": [8.535283999999999, 8.535283999999999]}}, "U3": {"layer": "F", "center": [144.2085, 92.9005], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [144.2085, 92.9005], "shape": "rect", "pin1": true, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [146.2085, 92.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [148.2085, 92.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [150.2085, 92.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [152.2085, 92.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [154.2085, 92.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [156.2085, 92.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [158.2085, 92.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [158.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [156.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [154.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [152.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [150.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [148.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [146.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}, {"layers": ["F"], "angle": -90.0, "pos": [144.2085, 76.9005], "shape": "rect", "pin1": false, "type": "smd", "size": [2.0, 1.0]}], "drawings": [], "ref": "U3", "bbox": {"pos": [143.133499, 75.9005], "size": [16.150002, 18.0]}}, "U2": {"layer": "F", "center": [151.257, 79.43849999999999], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [144.257, 88.93849999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -90.0, "pos": [146.257, 88.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -90.0, "pos": [148.257, 88.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -90.0, "pos": [150.257, 88.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -90.0, "pos": [152.257, 88.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -90.0, "pos": [154.257, 88.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -90.0, "pos": [156.257, 88.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -90.0, "pos": [158.257, 88.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [158.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [156.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [154.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [152.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [150.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [148.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [146.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}, {"layers": ["F"], "angle": -270.0, "pos": [144.257, 69.93849999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [3.1999999999999997, 1.5]}], "drawings": [], "ref": "U2", "bbox": {"pos": [142.577757, 68.3385], "size": [16.754244, 22.2]}}, "C12": {"layer": "F", "center": [139.5984, 89.2302], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [138.64839999999998, 89.2302], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -0.0, "pos": [140.5484, 89.2302], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C12", "bbox": {"pos": [137.723399, 88.455199], "size": [3.750002, 1.5500019999999999]}}, "C11": {"layer": "F", "center": [141.24939999999998, 87.22359999999999], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [140.2994, 87.22359999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -0.0, "pos": [142.1994, 87.22359999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C11", "bbox": {"pos": [139.37439899999998, 86.448599], "size": [3.750002, 1.5500019999999999]}}, "C10": {"layer": "F", "center": [130.40359999999998, 75.7936], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [128.97611999999998, 75.7936], "shape": "rect", "pin1": true, "type": "smd", "size": [1.143, 1.651]}, {"layers": ["F"], "angle": -0.0, "pos": [131.83108, 75.7936], "shape": "rect", "pin1": false, "type": "smd", "size": [1.143, 1.651]}], "drawings": [], "ref": "C10", "bbox": {"pos": [128.40462, 74.956599], "size": [3.99796, 1.674002]}}, "MOUNTING_HOLE1": {"layer": "F", "center": [163.394, 69.372], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [163.394, 69.372], "drillsize": [2.6, 2.6], "shape": "rect", "drillshape": "circle", "pin1": true, "type": "th", "size": [5.8, 5.8]}], "drawings": [], "ref": "MOUNTING_HOLE1", "bbox": {"pos": [160.494, 66.472], "size": [5.8, 5.8]}}, "MOUNTING_HOLE2": {"layer": "F", "center": [163.394, 93.572], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [163.394, 93.572], "drillsize": [2.6, 2.6], "shape": "rect", "drillshape": "circle", "pin1": true, "type": "th", "size": [5.8, 5.8]}], "drawings": [], "ref": "MOUNTING_HOLE2", "bbox": {"pos": [160.494, 90.672], "size": [5.8, 5.8]}}, "C9": {"layer": "F", "center": [143.891, 73.7235], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [145.31848, 73.7235], "shape": "rect", "pin1": true, "type": "smd", "size": [1.143, 1.651]}, {"layers": ["F"], "angle": -180.0, "pos": [142.46352, 73.7235], "shape": "rect", "pin1": false, "type": "smd", "size": [1.143, 1.651]}], "drawings": [], "ref": "C9", "bbox": {"pos": [141.89202, 72.886499], "size": [3.99796, 1.674002]}}, "C8": {"layer": "F", "center": [151.1935, 74.803], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [150.24349999999998, 74.803], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -0.0, "pos": [152.1435, 74.803], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C8", "bbox": {"pos": [149.318499, 74.027999], "size": [3.750002, 1.5500019999999999]}}, "C3": {"layer": "F", "center": [131.572, 84.8868], "pads": [{"layers": ["F"], "angle": -135.0, "pos": [132.243751, 85.558551], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -135.0, "pos": [130.900249, 84.215049], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C3", "bbox": {"pos": [129.708521, 83.023321], "size": [3.7269579999999998, 3.7269579999999998]}}, "C2": {"layer": "F", "center": [131.191, 86.5124], "pads": [{"layers": ["F"], "angle": -315.0, "pos": [130.519249, 85.840649], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -315.0, "pos": [131.862751, 87.184151], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C2", "bbox": {"pos": [129.327521, 84.648921], "size": [3.7269579999999998, 3.7269579999999998]}}, "C1": {"layer": "F", "center": [139.63649999999998, 79.81949999999999], "pads": [{"layers": ["F"], "angle": -225.0, "pos": [140.30825099999998, 79.14774899999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -225.0, "pos": [138.96474899999998, 80.49125099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C1", "bbox": {"pos": [137.773021, 77.95602099999999], "size": [3.7269579999999998, 3.7269579999999998]}}, "C7": {"layer": "F", "center": [123.9266, 71.7042], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [123.9266, 72.6542], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -90.0, "pos": [123.9266, 70.7542], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C7", "bbox": {"pos": [123.15159899999999, 69.829199], "size": [1.5500019999999999, 3.750002]}}, "C6": {"layer": "F", "center": [128.72719999999998, 68.1736], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [129.6772, 68.1736], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -180.0, "pos": [127.7772, 68.1736], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C6", "bbox": {"pos": [126.852199, 67.39859899999999], "size": [3.750002, 1.5500019999999999]}}, "C5": {"layer": "F", "center": [162.62349999999998, 87.884], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [162.62349999999998, 89.31147999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.143, 1.651]}, {"layers": ["F"], "angle": -90.0, "pos": [162.62349999999998, 86.45652], "shape": "rect", "pin1": false, "type": "smd", "size": [1.143, 1.651]}], "drawings": [], "ref": "C5", "bbox": {"pos": [161.786499, 85.88502], "size": [1.674002, 3.99796]}}, "C4": {"layer": "F", "center": [160.655, 88.011], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [160.655, 88.961], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.75]}, {"layers": ["F"], "angle": -90.0, "pos": [160.655, 87.06099999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.75]}], "drawings": [], "ref": "C4", "bbox": {"pos": [159.879999, 86.135999], "size": [1.5500019999999999, 3.750002]}}, "R4": {"layer": "F", "center": [121.98349999999999, 81.28], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [121.98349999999999, 80.17999999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.8999999999999999]}, {"layers": ["F"], "angle": -270.0, "pos": [121.98349999999999, 82.38], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.8999999999999999]}], "drawings": [], "ref": "R4", "bbox": {"pos": [121.15849899999999, 79.254999], "size": [1.650002, 4.050002]}}, "R5": {"layer": "F", "center": [123.63449999999999, 85.0265], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [123.63449999999999, 83.92649999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.8999999999999999]}, {"layers": ["F"], "angle": -270.0, "pos": [123.63449999999999, 86.1265], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.8999999999999999]}], "drawings": [], "ref": "R5", "bbox": {"pos": [122.80949899999999, 83.001499], "size": [1.650002, 4.050002]}}, "R6": {"layer": "F", "center": [130.6576, 89.408], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [129.5576, 89.408], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.8999999999999999]}, {"layers": ["F"], "angle": -0.0, "pos": [131.7576, 89.408], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.8999999999999999]}], "drawings": [], "ref": "R6", "bbox": {"pos": [128.632599, 88.582999], "size": [4.050002, 1.650002]}}, "P1": {"layer": "F", "center": [126.619, 78.74], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [126.619, 78.74], "drillsize": [1.0, 1.0], "shape": "rect", "drillshape": "circle", "pin1": true, "type": "th", "size": [1.7, 1.7]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [126.619, 81.28], "drillsize": [1.0, 1.0], "shape": "oval", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7, 1.7]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [126.619, 83.82], "drillsize": [1.0, 1.0], "shape": "oval", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7, 1.7]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [126.619, 86.36], "drillsize": [1.0, 1.0], "shape": "oval", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7, 1.7]}], "drawings": [], "ref": "P1", "bbox": {"pos": [124.99399899999999, 77.114999], "size": [3.250002, 10.850002]}}, "R1": {"layer": "F", "center": [130.0734, 81.5848], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [130.0734, 80.48479999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.8999999999999999]}, {"layers": ["F"], "angle": -270.0, "pos": [130.0734, 82.6848], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.8999999999999999]}], "drawings": [], "ref": "R1", "bbox": {"pos": [129.248399, 79.559799], "size": [1.650002, 4.050002]}}, "R2": {"layer": "F", "center": [134.1755, 72.7075], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [134.1755, 71.6075], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.8999999999999999]}, {"layers": ["F"], "angle": -270.0, "pos": [134.1755, 73.80749999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.8999999999999999]}], "drawings": [], "ref": "R2", "bbox": {"pos": [133.35049899999999, 70.68249899999999], "size": [1.650002, 4.050002]}}, "REF**": {"layer": "F", "center": [129.159, 71.11999999999999], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [129.159, 71.11999999999999], "drillsize": [0.3, 0.3], "shape": "circle", "drillshape": "circle", "pin1": true, "type": "th", "size": [0.6, 0.6]}], "drawings": [], "ref": "REF**", "bbox": {"pos": [128.85899999999998, 70.82], "size": [0.6, 0.6]}}, "PR1": {"layer": "F", "center": [133.54049999999998, 92.45599999999999], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [131.54049999999998, 91.45599999999999], "shape": "circle", "pin1": false, "type": "smd", "size": [1.2, 1.2]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [130.04049999999998, 92.45599999999999], "drillsize": [1.0, 1.0], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.0, 1.0]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [137.1405, 91.45599999999999], "drillsize": [1.0, 1.0], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.0, 1.0]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [137.1405, 93.45599999999999], "drillsize": [1.0, 1.0], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.0, 1.0]}, {"layers": ["F"], "angle": -0.0, "pos": [131.54049999999998, 93.45599999999999], "shape": "circle", "pin1": true, "type": "smd", "size": [1.2, 1.2]}, {"layers": ["F"], "angle": -0.0, "pos": [133.54049999999998, 93.45599999999999], "shape": "circle", "pin1": false, "type": "smd", "size": [1.2, 1.2]}, {"layers": ["F"], "angle": -0.0, "pos": [133.54049999999998, 91.45599999999999], "shape": "circle", "pin1": false, "type": "smd", "size": [1.2, 1.2]}, {"layers": ["F"], "angle": -0.0, "pos": [135.54049999999998, 91.45599999999999], "shape": "circle", "pin1": false, "type": "smd", "size": [1.2, 1.2]}, {"layers": ["F"], "angle": -0.0, "pos": [135.54049999999998, 93.45599999999999], "shape": "circle", "pin1": false, "type": "smd", "size": [1.2, 1.2]}], "drawings": [], "ref": "PR1", "bbox": {"pos": [126.915499, 89.230999], "size": [13.250002, 6.450002]}}, "L1": {"layer": "F", "center": [140.71599999999998, 80.899], "pads": [{"layers": ["F"], "angle": -225.0, "pos": [141.493817, 80.121183], "shape": "rect", "pin1": true, "type": "smd", "size": [1.2, 0.8999999999999999]}, {"layers": ["F"], "angle": -225.0, "pos": [139.93818299999998, 81.676817], "shape": "rect", "pin1": false, "type": "smd", "size": [1.2, 0.8999999999999999]}], "drawings": [], "ref": "L1", "bbox": {"pos": [138.7111, 78.8941], "size": [4.0098, 4.0098]}}, "F1": {"layer": "F", "center": [123.317, 75.4888], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [124.41699999999999, 75.4888], "shape": "rect", "pin1": true, "type": "smd", "size": [1.0, 1.5]}, {"layers": ["F"], "angle": -180.0, "pos": [122.217, 75.4888], "shape": "rect", "pin1": false, "type": "smd", "size": [1.0, 1.5]}], "drawings": [], "ref": "F1", "bbox": {"pos": [121.441999, 74.463799], "size": [3.750002, 2.050002]}}, "E1": {"layer": "F", "center": [163.7792, 80.69579999999999], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [163.7792, 79.2208], "shape": "rect", "pin1": false, "type": "smd", "size": [1.05, 2.1999999999999997]}, {"layers": ["F"], "angle": -270.0, "pos": [163.7792, 82.1708], "shape": "rect", "pin1": false, "type": "smd", "size": [1.05, 2.1999999999999997]}, {"layers": ["F"], "angle": -270.0, "pos": [162.2542, 80.69579999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.0, 1.05]}], "drawings": [], "ref": "E1", "bbox": {"pos": [161.7292, 78.69579999999999], "size": [3.425001, 4.0]}}, "G***": {"layer": "F", "center": [137.0965, 72.3265], "pads": [], "drawings": [], "ref": "G***", "bbox": {"pos": [135.437108, 67.636391], "size": [3.449346, 9.287795]}}, "J1": {"layer": "F", "center": [116.744, 77.622], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [116.744, 69.672], "shape": "rect", "pin1": true, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 70.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 71.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 72.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 72.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 73.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 74.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 75.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 70.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 79.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 70.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 71.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 72.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 73.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 74.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 74.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 75.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 80.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 80.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 81.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 82.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 83.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 84.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 84.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 85.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 86.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 87.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 88.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 88.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 89.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 90.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 91.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 92.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["F"], "angle": -0.0, "pos": [116.744, 92.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 79.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 80.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 81.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 82.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 82.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 83.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 84.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 85.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 86.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 86.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 87.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 88.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 89.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 90.072], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 90.872], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 91.672], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 92.472], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}, {"layers": ["B"], "angle": -0.0, "pos": [116.744, 93.27199999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [2.3, 0.6]}], "drawings": [], "ref": "J1", "bbox": {"pos": [115.594, 69.372], "size": [2.3, 24.2]}}, "Y1": {"layer": "F", "center": [137.7188, 86.76639999999999], "pads": [{"layers": ["F"], "angle": -225.0, "pos": [138.61503, 85.87017], "shape": "rect", "pin1": true, "type": "smd", "size": [1.016, 1.778]}, {"layers": ["F"], "angle": -225.0, "pos": [136.820774, 87.66442599999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.016, 1.778]}], "drawings": [], "ref": "Y1", "bbox": {"pos": [135.832946, 84.882342], "size": [3.7699119999999997, 3.7699119999999997]}}, "D1": {"layer": "F", "center": [134.1755, 68.961], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [134.1755, 69.761], "shape": "rect", "pin1": false, "type": "smd", "size": [0.7999999999999999, 0.7999999999999999]}, {"layers": ["F"], "angle": -90.0, "pos": [134.1755, 68.161], "shape": "rect", "pin1": true, "type": "smd", "size": [0.7999999999999999, 0.7999999999999999]}], "drawings": [], "ref": "D1", "bbox": {"pos": [133.500499, 67.48599899999999], "size": [1.350002, 2.950002]}}}, "edges": [{"width": 0.09999999999999999, "endangle": 360.0, "start": [118.594, 77.622], "radius": 0.75, "startangle": 270.0, "type": "arc"}, {"width": 0.09999999999999999, "endangle": 90.0, "start": [118.594, 77.622], "radius": 0.75, "startangle": 0.0, "type": "arc"}, {"start": [115.344, 76.872], "end": [118.594, 76.872], "type": "segment", "width": 0.09999999999999999}, {"start": [115.344, 78.372], "end": [118.594, 78.372], "type": "segment", "width": 0.09999999999999999}, {"start": [115.344, 94.322], "end": [115.344, 78.372], "type": "segment", "width": 0.09999999999999999}, {"start": [115.344, 68.622], "end": [115.344, 76.872], "type": "segment", "width": 0.09999999999999999}, {"start": [117.744, 68.622], "end": [115.344, 68.622], "type": "segment", "width": 0.09999999999999999}, {"start": [117.744, 94.322], "end": [115.344, 94.322], "type": "segment", "width": 0.09999999999999999}, {"width": 0.09999999999999999, "endangle": 90.0, "start": [117.744, 67.822], "radius": 0.7999999999999999, "startangle": 0.0, "type": "arc"}, {"width": 0.09999999999999999, "endangle": 360.0, "start": [117.744, 95.122], "radius": 0.7999999999999999, "startangle": 270.0, "type": "arc"}, {"start": [118.544, 96.472], "end": [118.544, 95.122], "type": "segment", "width": 0.09999999999999999}, {"start": [118.544, 66.472], "end": [118.544, 67.822], "type": "segment", "width": 0.09999999999999999}, {"start": [166.29399999999998, 96.472], "end": [118.544, 96.472], "type": "segment", "width": 0.09999999999999999}, {"start": [166.29399999999998, 66.472], "end": [118.544, 66.472], "type": "segment", "width": 0.09999999999999999}, {"start": [166.29399999999998, 66.472], "end": [166.29399999999998, 96.472], "type": "segment", "width": 0.09999999999999999}], "bom": {"both": [[3, "47uF/6.3V", "CT-A", ["C5", "C9", "C10"]], [5, "1uF", "C_0603_HandSoldering", ["C1", "C2", "C3", "C6", "C7"]], [2, "100nF", "C_0603_HandSoldering", ["C4", "C8"]], [2, "15pF", "C_0603_HandSoldering", ["C11", "C12"]], [3, "10k", "R_0603_HandSoldering", ["R1", "R4", "R5"]], [1, "1k5", "R_0603_HandSoldering", ["R2"]], [1, "1k", "R_0603_HandSoldering", ["R6"]], [1, "BLM18PG471SN1", "R_0603_HandSoldering", ["L1"]], [1, "0603LED", "LED_0603", ["D1"]], [1, "ATSAMD21E", "QFN-32-1EP_5x5mm_Pitch0.5mm", ["U1"]], [1, "RFM69HW", "RFM69HW", ["U2"]], [1, "RFM95HW", "RFM92_95_96_98", ["U3"]], [1, "HT7833_SOT89", "SOT89-3_Housing_Handsoldering", ["U5"]], [1, "32.768kHz", "XT_FC-135", ["Y1"]], [1, "F_Small", "MF-PSMF020X", ["F1"]], [1, "LOGO", "Logo_silk_WEEE_8x10mm", ["G***"]], [1, "LOGO", "PBLogo_Tiny", ["G***"]], [2, "CONN_1", "PIN_ARRAY_1", ["MOUNTING_HOLE1", "MOUNTING_HOLE2"]], [1, "Prog_xPablo_6pin_X", "PROG_6pin", ["PR1"]], [94, "VIA-0.6mm", "VIA-0.6mm", ["REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**"]], [1, "ANT", "coaxial_u.fl-r-smt-1", ["E1"]], [1, "LOGO", "tolora", ["G***"]], [1, "PCIE-MINI", "miniPCIeConn", ["J1"]], [1, "CONN_01X04", "Pin_Header_Straight_1x04_Pitch2.54mm", ["P1"]]], "B": [[1, "LOGO", "Logo_silk_WEEE_8x10mm", ["G***"]]], "F": [[3, "47uF/6.3V", "CT-A", ["C5", "C9", "C10"]], [5, "1uF", "C_0603_HandSoldering", ["C1", "C2", "C3", "C6", "C7"]], [2, "100nF", "C_0603_HandSoldering", ["C4", "C8"]], [2, "15pF", "C_0603_HandSoldering", ["C11", "C12"]], [3, "10k", "R_0603_HandSoldering", ["R1", "R4", "R5"]], [1, "1k5", "R_0603_HandSoldering", ["R2"]], [1, "1k", "R_0603_HandSoldering", ["R6"]], [1, "BLM18PG471SN1", "R_0603_HandSoldering", ["L1"]], [1, "0603LED", "LED_0603", ["D1"]], [1, "ATSAMD21E", "QFN-32-1EP_5x5mm_Pitch0.5mm", ["U1"]], [1, "RFM69HW", "RFM69HW", ["U2"]], [1, "RFM95HW", "RFM92_95_96_98", ["U3"]], [1, "HT7833_SOT89", "SOT89-3_Housing_Handsoldering", ["U5"]], [1, "32.768kHz", "XT_FC-135", ["Y1"]], [1, "F_Small", "MF-PSMF020X", ["F1"]], [1, "LOGO", "PBLogo_Tiny", ["G***"]], [2, "CONN_1", "PIN_ARRAY_1", ["MOUNTING_HOLE1", "MOUNTING_HOLE2"]], [1, "Prog_xPablo_6pin_X", "PROG_6pin", ["PR1"]], [94, "VIA-0.6mm", "VIA-0.6mm", ["REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**", "REF**"]], [1, "ANT", "coaxial_u.fl-r-smt-1", ["E1"]], [1, "LOGO", "tolora", ["G***"]], [1, "PCIE-MINI", "miniPCIeConn", ["J1"]], [1, "CONN_01X04", "Pin_Header_Straight_1x04_Pitch2.54mm", ["P1"]]]}, "silkscreen": {"B": [{"angle": [180.0], "type": "polygon", "pos": [162.1155, 78.1685], "polygons": []}, {"angle": [180.0], "type": "polygon", "pos": [162.1155, 78.1685], "polygons": []}, {"angle": [180.0], "type": "polygon", "pos": [162.1155, 78.1685], "polygons": []}], "F": [{"angle": 90.0, "horiz_justify": 0, "text": "Rev.A 1/17", "pos": [140.2715, 72.517], "height": 1.0, "width": 1.0}, {"angle": 0.0, "horiz_justify": 0, "text": "xPablo.cz", "pos": [124.5235, 94.93249999999999], "height": 1.2, "width": 1.2}, {"angle": 45.0, "horiz_justify": 0, "text": "L1", "pos": [141.732, 81.787999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [139.88514999999998, 80.775256], "end": [140.592256, 80.06815], "type": "segment", "width": 0.15}, {"start": [141.54685, 81.022744], "end": [140.839744, 81.72985], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "C4", "pos": [160.655, 85.344], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [160.055, 88.36099999999999], "end": [160.055, 87.661], "type": "segment", "width": 0.12}, {"start": [161.255, 87.661], "end": [161.255, 88.36099999999999], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C5", "pos": [164.338, 87.884], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [163.38549999999998, 88.8365], "end": [161.8615, 88.8365], "type": "segment", "width": 0.15}, {"start": [163.38549999999998, 88.9635], "end": [161.8615, 88.9635], "type": "segment", "width": 0.15}, {"start": [163.38549999999998, 89.09049999999999], "end": [161.8615, 89.09049999999999], "type": "segment", "width": 0.15}, {"start": [163.38549999999998, 89.2175], "end": [161.8615, 89.2175], "type": "segment", "width": 0.15}, {"start": [163.38549999999998, 89.3445], "end": [161.8615, 89.3445], "type": "segment", "width": 0.15}, {"start": [163.38549999999998, 89.47149999999999], "end": [161.8615, 89.47149999999999], "type": "segment", "width": 0.15}, {"start": [163.38549999999998, 86.2965], "end": [161.8615, 86.2965], "type": "segment", "width": 0.15}, {"start": [161.8615, 86.2965], "end": [161.8615, 89.47149999999999], "type": "segment", "width": 0.15}, {"start": [163.38549999999998, 86.2965], "end": [163.38549999999998, 89.47149999999999], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "R1", "pos": [128.778, 82.042], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [129.39839999999998, 82.0848], "end": [129.39839999999998, 81.0848], "type": "segment", "width": 0.15}, {"start": [130.7484, 81.0848], "end": [130.7484, 82.0848], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "R2", "pos": [134.239, 75.438], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [133.5005, 73.2075], "end": [133.5005, 72.2075], "type": "segment", "width": 0.15}, {"start": [134.85049999999998, 72.2075], "end": [134.85049999999998, 73.2075], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "R4", "pos": [120.6627, 81.30539999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [121.3085, 81.78], "end": [121.3085, 80.78], "type": "segment", "width": 0.15}, {"start": [122.65849999999999, 80.78], "end": [122.65849999999999, 81.78], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "R5", "pos": [122.36449999999999, 86.42349999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [122.95949999999999, 85.5265], "end": [122.95949999999999, 84.5265], "type": "segment", "width": 0.15}, {"start": [124.3095, 84.5265], "end": [124.3095, 85.5265], "type": "segment", "width": 0.15}, {"angle": 45.0, "horiz_justify": 0, "text": "C1", "pos": [139.446, 78.232], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [140.30825099999998, 79.99627699999999], "end": [139.813277, 80.49125099999999], "type": "segment", "width": 0.12}, {"start": [138.96474899999998, 79.64272299999999], "end": [139.459723, 79.14774899999999], "type": "segment", "width": 0.12}, {"angle": -45.0, "horiz_justify": 0, "text": "C2", "pos": [129.159, 86.23299899999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [131.367777, 85.840649], "end": [131.862751, 86.335623], "type": "segment", "width": 0.12}, {"start": [131.014223, 87.184151], "end": [130.519249, 86.689177], "type": "segment", "width": 0.12}, {"angle": -45.0, "horiz_justify": 0, "text": "C3", "pos": [133.22299999999998, 86.741], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [131.395223, 85.558551], "end": [130.900249, 85.063577], "type": "segment", "width": 0.12}, {"start": [131.748777, 84.215049], "end": [132.243751, 84.71002299999999], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "C6", "pos": [131.31799999999998, 68.199], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [129.0772, 68.7736], "end": [128.3772, 68.7736], "type": "segment", "width": 0.12}, {"start": [128.3772, 67.5736], "end": [129.0772, 67.5736], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C7", "pos": [122.55499999999999, 71.755], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [123.3266, 72.0542], "end": [123.3266, 71.35419999999999], "type": "segment", "width": 0.12}, {"start": [124.52659999999999, 71.35419999999999], "end": [124.52659999999999, 72.0542], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "P1", "pos": [126.619, 76.35], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [125.229, 80.00999999999999], "end": [125.229, 87.75], "type": "segment", "width": 0.12}, {"start": [125.229, 87.75], "end": [128.009, 87.75], "type": "segment", "width": 0.12}, {"start": [128.009, 87.75], "end": [128.009, 80.00999999999999], "type": "segment", "width": 0.12}, {"start": [128.009, 80.00999999999999], "end": [125.229, 80.00999999999999], "type": "segment", "width": 0.12}, {"start": [125.229, 78.74], "end": [125.229, 77.35], "type": "segment", "width": 0.12}, {"start": [125.229, 77.35], "end": [126.619, 77.35], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "U5", "pos": [131.69899999999998, 73.66], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [128.93294, 69.85508], "end": [129.23265999999998, 70.104], "type": "segment", "width": 0.15}, {"start": [129.23265999999998, 70.104], "end": [129.38252, 70.20559999999999], "type": "segment", "width": 0.15}, {"start": [129.38252, 70.20559999999999], "end": [128.53415999999999, 70.20559999999999], "type": "segment", "width": 0.15}, {"start": [130.43408, 69.50456], "end": [128.63322, 69.50456], "type": "segment", "width": 0.15}, {"start": [130.43408, 69.50456], "end": [130.43408, 70.1548], "type": "segment", "width": 0.15}, {"start": [130.43408, 74.00544], "end": [128.63322, 74.00544], "type": "segment", "width": 0.15}, {"start": [130.43408, 74.00544], "end": [130.43408, 73.3552], "type": "segment", "width": 0.15}, {"angle": 0.0, "horiz_justify": 0, "text": "C8", "pos": [149.987, 73.66], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [150.8435, 74.203], "end": [151.5435, 74.203], "type": "segment", "width": 0.12}, {"start": [151.5435, 75.40299999999999], "end": [150.8435, 75.40299999999999], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "C9", "pos": [144.14499999999998, 72.26299999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [144.8435, 72.9615], "end": [144.8435, 74.4855], "type": "segment", "width": 0.15}, {"start": [144.9705, 72.9615], "end": [144.9705, 74.4855], "type": "segment", "width": 0.15}, {"start": [145.0975, 72.9615], "end": [145.0975, 74.4855], "type": "segment", "width": 0.15}, {"start": [145.2245, 72.9615], "end": [145.2245, 74.4855], "type": "segment", "width": 0.15}, {"start": [145.3515, 72.9615], "end": [145.3515, 74.4855], "type": "segment", "width": 0.15}, {"start": [145.4785, 72.9615], "end": [145.4785, 74.4855], "type": "segment", "width": 0.15}, {"start": [142.30349999999999, 72.9615], "end": [142.30349999999999, 74.4855], "type": "segment", "width": 0.15}, {"start": [142.30349999999999, 74.4855], "end": [145.4785, 74.4855], "type": "segment", "width": 0.15}, {"start": [142.30349999999999, 72.9615], "end": [145.4785, 72.9615], "type": "segment", "width": 0.15}, {"angle": 0.0, "horiz_justify": 0, "text": "C10", "pos": [130.46456, 77.53349999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [129.4511, 76.5556], "end": [129.4511, 75.0316], "type": "segment", "width": 0.15}, {"start": [129.3241, 76.5556], "end": [129.3241, 75.0316], "type": "segment", "width": 0.15}, {"start": [129.1971, 76.5556], "end": [129.1971, 75.0316], "type": "segment", "width": 0.15}, {"start": [129.0701, 76.5556], "end": [129.0701, 75.0316], "type": "segment", "width": 0.15}, {"start": [128.9431, 76.5556], "end": [128.9431, 75.0316], "type": "segment", "width": 0.15}, {"start": [128.8161, 76.5556], "end": [128.8161, 75.0316], "type": "segment", "width": 0.15}, {"start": [131.9911, 76.5556], "end": [131.9911, 75.0316], "type": "segment", "width": 0.15}, {"start": [131.9911, 75.0316], "end": [128.8161, 75.0316], "type": "segment", "width": 0.15}, {"start": [131.9911, 76.5556], "end": [128.8161, 76.5556], "type": "segment", "width": 0.15}, {"angle": 0.0, "horiz_justify": 0, "text": "C11", "pos": [141.224, 85.85199999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [140.89939999999999, 86.6236], "end": [141.5994, 86.6236], "type": "segment", "width": 0.12}, {"start": [141.5994, 87.8236], "end": [140.89939999999999, 87.8236], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "C12", "pos": [139.7, 90.678], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [139.2484, 88.6302], "end": [139.9484, 88.6302], "type": "segment", "width": 0.12}, {"start": [139.9484, 89.83019999999999], "end": [139.2484, 89.83019999999999], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "D1", "pos": [132.9563, 68.7324], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [134.6755, 67.661], "end": [133.6755, 67.661], "type": "segment", "width": 0.12}, {"start": [133.6755, 67.661], "end": [133.6755, 69.761], "type": "segment", "width": 0.12}, {"start": [134.6755, 67.661], "end": [134.6755, 69.761], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "F1", "pos": [123.317, 77.089], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [123.717, 74.8138], "end": [122.91699999999999, 74.8138], "type": "segment", "width": 0.15}, {"start": [123.717, 76.1638], "end": [122.91699999999999, 76.1638], "type": "segment", "width": 0.15}, {"angle": 0.0, "horiz_justify": 0, "text": "R6", "pos": [130.048, 88.011], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [131.1576, 90.083], "end": [130.1576, 90.083], "type": "segment", "width": 0.15}, {"start": [130.1576, 88.73299999999999], "end": [131.1576, 88.73299999999999], "type": "segment", "width": 0.15}, {"angle": 45.0, "horiz_justify": 0, "text": "Y1", "pos": [139.319, 84.455], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [137.01169299999998, 88.18061399999999], "end": [136.304586, 87.473507], "type": "segment", "width": 0.15}, {"start": [139.133014, 86.059293], "end": [138.425907, 85.352186], "type": "segment", "width": 0.15}, {"start": [138.072353, 85.281476], "end": [136.23387599999998, 87.119953], "type": "segment", "width": 0.15}, {"start": [139.203724, 85.98858299999999], "end": [138.496617, 85.281476], "type": "segment", "width": 0.15}, {"start": [137.36524699999998, 88.251324], "end": [139.203724, 86.412847], "type": "segment", "width": 0.15}, {"start": [136.940983, 88.251324], "end": [136.23387599999998, 87.54421699999999], "type": "segment", "width": 0.15}, {"width": 0.15, "endangle": 225.0, "start": [139.415856, 86.200715], "radius": 0.3, "startangle": 135.0, "type": "arc"}, {"width": 0.15, "endangle": 135.0, "start": [138.284485, 85.069344], "radius": 0.3, "startangle": 45.0, "type": "arc"}, {"width": 0.15, "endangle": 405.0, "start": [136.02174399999998, 87.33208499999999], "radius": 0.3, "startangle": 315.0, "type": "arc"}, {"width": 0.15, "endangle": 315.0, "start": [137.15311499999999, 88.463456], "radius": 0.3, "startangle": 225.0, "type": "arc"}, {"angle": 0.0, "horiz_justify": 0, "text": "PR1", "pos": [137.541, 95.12299999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [135.144, 90.551], "end": [137.14552, 90.551], "type": "segment", "width": 0.15}, {"start": [135.144, 94.36099999999999], "end": [137.13281999999998, 94.36099999999999], "type": "segment", "width": 0.15}, {"start": [135.144, 94.36099999999999], "end": [130.4577, 94.36099999999999], "type": "segment", "width": 0.15}, {"start": [135.144, 90.551], "end": [130.4577, 90.551], "type": "segment", "width": 0.15}, {"start": [129.2766, 93.17989999999999], "end": [130.4577, 94.36099999999999], "type": "segment", "width": 0.15}, {"start": [129.2766, 91.7321], "end": [130.4577, 90.551], "type": "segment", "width": 0.15}, {"width": 0.15, "endangle": 225.0, "start": [130.0005, 92.45599999999999], "radius": 1.023749, "startangle": 135.0, "type": "arc"}, {"start": [138.0965, 91.5035], "end": [138.0965, 93.40849999999999], "type": "segment", "width": 0.15}, {"width": 0.15, "endangle": 90.0, "start": [137.144, 93.40849999999999], "radius": 0.9524999999999999, "startangle": 0.0, "type": "arc"}, {"width": 0.15, "endangle": 360.0, "start": [137.144, 91.5035], "radius": 0.9524999999999999, "startangle": 270.0, "type": "arc"}, {"angle": [0.0], "type": "polygon", "pos": [124.46, 90.932], "polygons": []}, {"angle": [0.0], "type": "polygon", "pos": [124.46, 90.932], "polygons": []}, {"angle": 90.0, "horiz_justify": 0, "text": "U3", "pos": [142.367, 93.59899999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [143.5989, 92.9005], "end": [143.2179, 92.3163], "type": "segment", "width": 0.15}, {"start": [143.2085, 92.9005], "end": [159.2085, 92.9005], "type": "segment", "width": 0.15}, {"start": [159.2085, 92.9005], "end": [159.2085, 76.9005], "type": "segment", "width": 0.15}, {"start": [159.2085, 76.9005], "end": [143.2085, 76.9005], "type": "segment", "width": 0.15}, {"start": [143.2085, 76.9005], "end": [143.2085, 92.9005], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "U2", "pos": [142.367, 90.678], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [142.84959999999998, 89.2683], "radius": 0.071842, "type": "circle", "width": 0.39999999999999997}, {"start": [143.257, 89.2885], "end": [143.257, 69.5885], "type": "segment", "width": 0.15}, {"start": [143.257, 69.5885], "end": [159.257, 69.5885], "type": "segment", "width": 0.15}, {"start": [159.257, 69.5885], "end": [159.257, 89.2885], "type": "segment", "width": 0.15}, {"start": [159.257, 89.2885], "end": [143.257, 89.2885], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "E1", "pos": [163.703, 77.343], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [163.7792, 80.69579999999999], "radius": 0.09999999999999999, "type": "circle", "width": 0.15}, {"start": [163.7792, 80.69579999999999], "radius": 1.0, "type": "circle", "width": 0.15}, {"start": [162.7792, 79.3958], "end": [164.7792, 79.3958], "type": "segment", "width": 0.15}, {"start": [162.4792, 81.69579999999999], "end": [162.4792, 79.69579999999999], "type": "segment", "width": 0.15}, {"start": [164.7792, 81.9958], "end": [162.7792, 81.9958], "type": "segment", "width": 0.15}, {"start": [165.0792, 79.69579999999999], "end": [165.0792, 81.69579999999999], "type": "segment", "width": 0.15}, {"width": 0.15, "endangle": 270.0, "start": [162.7792, 79.69579999999999], "radius": 0.3, "startangle": 180.0, "type": "arc"}, {"width": 0.15, "endangle": 180.0, "start": [162.7792, 81.69579999999999], "radius": 0.3, "startangle": 90.0, "type": "arc"}, {"width": 0.15, "endangle": 90.0, "start": [164.7792, 81.69579999999999], "radius": 0.3, "startangle": 0.0, "type": "arc"}, {"width": 0.15, "endangle": 360.0, "start": [164.7792, 79.69579999999999], "radius": 0.3, "startangle": 270.0, "type": "arc"}, {"start": [164.664, 70.642], "end": [162.124, 70.642], "type": "segment", "width": 0.15239999999999998}, {"start": [162.124, 68.102], "end": [164.664, 68.102], "type": "segment", "width": 0.15239999999999998}, {"start": [162.124, 70.642], "end": [162.124, 68.102], "type": "segment", "width": 0.15239999999999998}, {"start": [164.664, 68.102], "end": [164.664, 70.642], "type": "segment", "width": 0.15239999999999998}, {"start": [164.664, 94.842], "end": [162.124, 94.842], "type": "segment", "width": 0.15239999999999998}, {"start": [162.124, 92.30199999999999], "end": [164.664, 92.30199999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [162.124, 94.842], "end": [162.124, 92.30199999999999], "type": "segment", "width": 0.15239999999999998}, {"start": [164.664, 92.30199999999999], "end": [164.664, 94.842], "type": "segment", "width": 0.15239999999999998}, {"angle": 90.0, "horiz_justify": 0, "text": "J1", "pos": [119.253, 76.2], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"angle": 45.0, "horiz_justify": 0, "text": "U1", "pos": [134.9375, 87.37599999999999], "height": 0.7999999999999999, "width": 0.7999999999999999}, {"start": [135.138521, 86.454871], "radius": 0.1016, "type": "circle", "width": 0.19999999999999998}, {"start": [131.390289, 82.5754], "end": [131.76152, 82.204169], "type": "segment", "width": 0.15}, {"start": [138.814911, 82.5754], "end": [138.44368, 82.946631], "type": "segment", "width": 0.15}, {"start": [135.1026, 78.863089], "end": [134.731369, 79.23432], "type": "segment", "width": 0.15}, {"start": [138.814911, 82.5754], "end": [138.44368, 82.204169], "type": "segment", "width": 0.15}, {"start": [135.1026, 78.863089], "end": [135.473831, 79.23432], "type": "segment", "width": 0.15}, {"start": [131.390289, 82.5754], "end": [131.76152, 82.946631], "type": "segment", "width": 0.15}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}, {"angle": [90.0], "type": "polygon", "pos": [137.0965, 72.3265], "polygons": []}]}, "edges_bbox": {"minx": 115.293999, "miny": 66.421999, "maxx": 166.344001, "maxy": 96.52200099999999}, "metadata": {"date": "2018-09-19 20:13:01", "company": "xPablo.cz", "revision": "A", "title": "PCIeLoRa"}} /////////////////////////////////////////////// /////////////////////////////////////////////// /* PCB rendering code */ var redrawOnDrag = true; function deg2rad(deg) { return deg * Math.PI / 180; } function drawtext(ctx, scalefactor, text, color, flip) { ctx.save(); ctx.translate(...text.pos); angle = -text.angle; if (flip) { ctx.scale(-1, 1); angle = -angle; } txt = text.text.split("\n") ctx.rotate(deg2rad(angle)); ctx.scale(text.width, text.height); ctx.fillStyle = color; switch (text.horiz_justify) { case -1: ctx.textAlign = "left"; break; case 0: ctx.textAlign = "center"; break; case 1: ctx.textAlign = "right"; break; } for (i = 0; i < txt.length; i++) { offset = -(txt.length - 1) * 0.8 + i * 1.6; ctx.fillText(txt[i], 0, offset); } ctx.restore(); } function drawedge(ctx, scalefactor, edge, color) { ctx.strokeStyle = color; ctx.lineWidth = Math.max(1 / scalefactor, edge.width); ctx.lineCap = "round"; if (edge.type == "segment") { ctx.beginPath(); ctx.moveTo(...edge.start); ctx.lineTo(...edge.end); ctx.stroke(); } if (edge.type == "arc") { ctx.beginPath(); ctx.arc( ...edge.start, edge.radius, deg2rad(edge.startangle), deg2rad(edge.endangle)); ctx.stroke(); } if (edge.type == "circle") { ctx.beginPath(); ctx.arc( ...edge.start, edge.radius, 0, 2 * Math.PI); ctx.stroke(); } } function drawOblong(ctx, scalefactor, color, size) { ctx.beginPath(); ctx.strokeStyle = color; ctx.lineCap = "round"; if (size[0] > size[1]) { ctx.lineWidth = size[1]; var from = [-size[0] / 2 + size[1] / 2, 0]; var to = [-from[0], 0]; } else { ctx.lineWidth = size[0]; var from = [0, -size[1] / 2 + size[0] / 2]; var to = [0, -from[1]]; } ctx.moveTo(...from); ctx.lineTo(...to); ctx.stroke(); } function drawRoundRect(ctx, scalefactor, color, size, radius) { ctx.beginPath(); ctx.strokeStyle = color; x = size[0] * -0.5; y = size[1] * -0.5; width = size[0]; height = size[1]; ctx.moveTo(x, 0); ctx.arcTo(x, y + height, x + width, y + height, radius); ctx.arcTo(x + width, y + height, x + width, y, radius); ctx.arcTo(x + width, y, x, y, radius); ctx.arcTo(x, y, x, y + height, radius); ctx.closePath(); ctx.fill(); } function drawPolygons(ctx, scalefactor, color, polygons) { ctx.fillStyle = color; for (polygon of polygons) { ctx.beginPath(); for (vertex of polygon) { ctx.lineTo(...vertex) } ctx.closePath(); ctx.fill(); } } function drawPolygonShape(ctx, scalefactor, shape, color) { ctx.save(); ctx.translate(...shape.pos); ctx.rotate(deg2rad(-shape.angle)); drawPolygons(ctx, scalefactor, color, shape.polygons); ctx.restore(); } function drawDrawing(ctx, layer, scalefactor, drawing, color) { if (["segment", "arc", "circle"].includes(drawing.type)) { drawedge(ctx, scalefactor, drawing, color); } else if (drawing.type == "polygon") { drawPolygonShape(ctx, scalefactor, drawing, color); } else { drawtext(ctx, scalefactor, drawing, color, layer == "B"); } } function drawModule(ctx, layer, scalefactor, module, highlight) { var padcolor = "#808080"; if (highlight) { padcolor = "#D04040"; // draw bounding box if (module.layer == layer) { ctx.save(); ctx.globalAlpha = 0.2; ctx.translate(...module.bbox.pos); ctx.fillStyle = "#D04040"; ctx.fillRect( 0, 0, ...module.bbox.size); ctx.globalAlpha = 1; ctx.strokeStyle = "#D04040"; ctx.lineWidth = 2 / scalefactor; ctx.strokeRect( 0, 0, ...module.bbox.size); ctx.restore(); } } // draw drawings for (drawing of module.drawings) { if (drawing.layer == layer) { drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor); } } // draw pads for (pad of module.pads) { if (pad.layers.includes(layer)) { ctx.save(); ctx.translate(...pad.pos); ctx.rotate(deg2rad(pad.angle)); ctx.fillStyle = padcolor; if (pad.shape == "rect") { ctx.fillRect( ...pad.size.map(c => -c * 0.5), ...pad.size); } else if (pad.shape == "oval") { drawOblong(ctx, scalefactor, padcolor, pad.size) } else if (pad.shape == "circle") { ctx.beginPath(); ctx.arc(0, 0, pad.size[0] / 2, 0, 2 * Math.PI); ctx.fill(); } else if (pad.shape == "roundrect") { drawRoundRect(ctx, scalefactor, padcolor, pad.size, pad.radius) } else if (pad.shape == "custom") { drawPolygons(ctx, scalefactor, padcolor, pad.polygons) } if (pad.type == "th") { if (pad.drillshape == "oblong") { drawOblong(ctx, scalefactor, "#CCCCCC", pad.drillsize) } else { ctx.fillStyle = "#CCCCCC" ctx.beginPath(); ctx.arc(0, 0, pad.drillsize[0] / 2, 0, 2 * Math.PI); ctx.fill(); } } ctx.restore(); } } } function drawEdges(canvas, scalefactor) { var ctx = canvas.getContext("2d"); var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color'); for (edge of pcbdata.edges) { drawedge(ctx, scalefactor, edge, edgecolor); } } function drawModules(canvas, layer, scalefactor, highlightedRefs) { var ctx = canvas.getContext("2d"); for (i in pcbdata.modules) { var mod = pcbdata.modules[i]; var highlight = highlightedRefs.includes(mod.ref); if (highlightedRefs.length == 0 || highlight) { drawModule(ctx, layer, scalefactor, mod, highlight); } } } function drawSilkscreen(canvas, layer, scalefactor) { var ctx = canvas.getContext("2d"); for (d of pcbdata.silkscreen[layer]) { if (["segment", "arc", "circle"].includes(d.type)) { drawedge(ctx, scalefactor, d, "#aa4"); } else if (d.type == "polygon") { drawPolygonShape(ctx, scalefactor, d, "#4aa"); } else { drawtext(ctx, scalefactor, d, "#4aa", layer == "B"); } } } function clearCanvas(canvas) { var ctx = canvas.getContext("2d"); ctx.save(); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.restore(); } function drawHighlightsOnLayer(canvasdict) { clearCanvas(canvasdict.highlight); drawModules(canvasdict.highlight, canvasdict.layer, canvasdict.transform.s, highlightedRefs); } function drawHighlights() { drawHighlightsOnLayer(allcanvas.front); drawHighlightsOnLayer(allcanvas.back); } function drawBackground(canvasdict) { clearCanvas(canvasdict.bg); clearCanvas(canvasdict.silk); drawEdges(canvasdict.bg, canvasdict.transform.s); drawModules(canvasdict.bg, canvasdict.layer, canvasdict.transform.s, []); drawSilkscreen(canvasdict.silk, canvasdict.layer, canvasdict.transform.s); } function prepareCanvas(canvas, flip, transform) { var ctx = canvas.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); fontsize = 1.55; ctx.font = "bold " + fontsize + "px Consolas,\"DejaVu Sans Mono\",Monaco,monospace"; ctx.textBaseline = "middle"; ctx.scale(transform.zoom, transform.zoom); ctx.translate(transform.panx, transform.pany); if (flip) { ctx.scale(-1, 1); } ctx.translate(transform.x, transform.y); ctx.scale(transform.s, transform.s); } function prepareLayer(canvasdict) { var flip = (canvasdict.layer == "B"); for (c of ["bg", "silk", "highlight"]) { prepareCanvas(canvasdict[c], flip, canvasdict.transform); } } function recalcLayerScale(canvasdict) { canvasdivid = { "F": "frontcanvas", "B": "backcanvas" }[canvasdict.layer]; var width = document.getElementById(canvasdivid).clientWidth * 2; var height = document.getElementById(canvasdivid).clientHeight * 2; var bbox = pcbdata.edges_bbox; var scalefactor = 0.98 * Math.min( width / (bbox.maxx - bbox.minx), height / (bbox.maxy - bbox.miny) ); if (scalefactor < 0.1) { scalefactor = 1; } canvasdict.transform.s = scalefactor; var flip = (canvasdict.layer == "B"); if (flip) { canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5; } else { canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5; } canvasdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5; for (c of ["bg", "silk", "highlight"]) { canvas = canvasdict[c]; canvas.width = width; canvas.height = height; canvas.style.width = (width / 2) + "px"; canvas.style.height = (height / 2) + "px"; } console.log("Scale factor " + canvasdivid + ": ", canvasdict.transform); } function redrawCanvas(layerdict) { prepareLayer(layerdict); drawBackground(layerdict); drawHighlights(layerdict); } function resizeCanvas(layerdict) { recalcLayerScale(layerdict); redrawCanvas(layerdict); } function resizeAll() { resizeCanvas(allcanvas.front); resizeCanvas(allcanvas.back); } function bboxScan(layer, x, y) { var result = []; for (var i in pcbdata.modules) { var module = pcbdata.modules[i]; if (module.layer == layer) { var b = module.bbox; if (b.pos[0] <= x && b.pos[0] + b.size[0] >= x && b.pos[1] <= y && b.pos[1] + b.size[1] >= y) { result.push(module.ref); } } } return result; } function handleMouseDown(e, layerdict) { if (e.which != 1) { return; } e.preventDefault(); e.stopPropagation(); layerdict.transform.mousestartx = e.offsetX; layerdict.transform.mousestarty = e.offsetY; layerdict.transform.mousedownx = e.offsetX; layerdict.transform.mousedowny = e.offsetY; layerdict.transform.mousedown = true; } function handleMouseClick(e, layerdict) { var x = e.offsetX; var y = e.offsetY; var t = layerdict.transform; if (layerdict.layer == "B") { x = (2 * x / t.zoom - t.panx + t.x) / -t.s; } else { x = (2 * x / t.zoom - t.panx - t.x) / t.s; } y = (2 * y / t.zoom - t.y - t.pany) / t.s; var reflist = bboxScan(layerdict.layer, x, y); if (reflist.length > 0) { modulesClicked(reflist); } } function handleMouseUp(e, layerdict) { e.preventDefault(); e.stopPropagation(); if (e.which == 1 && layerdict.transform.mousedown && layerdict.transform.mousedownx == e.offsetX && layerdict.transform.mousedowny == e.offsetY) { // This is just a click handleMouseClick(e, layerdict); } layerdict.transform.mousedown = false; if (e.which == 3) { // Reset pan and zoom on right click. layerdict.transform.panx = 0; layerdict.transform.pany = 0; layerdict.transform.zoom = 1; } redrawCanvas(layerdict); } function handleMouseMove(e, layerdict) { if (!layerdict.transform.mousedown) { return; } e.preventDefault(); e.stopPropagation(); dx = e.offsetX - layerdict.transform.mousestartx; dy = e.offsetY - layerdict.transform.mousestarty; layerdict.transform.panx += 2 * dx / layerdict.transform.zoom; layerdict.transform.pany += 2 * dy / layerdict.transform.zoom; layerdict.transform.mousestartx = e.offsetX; layerdict.transform.mousestarty = e.offsetY; if (redrawOnDrag) { redrawCanvas(layerdict); } } function handleMouseWheel(e, layerdict) { e.preventDefault(); e.stopPropagation(); var t = layerdict.transform; var wheeldelta = e.deltaY; if (e.deltaMode == 1) { // FF only, scroll by lines wheeldelta *= 30; } else if (e.deltaMode == 2) { wheeldelta *= 300; } var m = Math.pow(1.1, -wheeldelta / 40); // Limit amount of zoom per tick. if (m > 2) { m = 2; } else if (m < 0.5) { m = 0.5; } t.zoom *= m; var zoomd = (1 - m) / t.zoom; t.panx += 2 * e.offsetX * zoomd; t.pany += 2 * e.offsetY * zoomd; redrawCanvas(layerdict); console.log(layerdict.transform.zoom); } function addMouseHandlers(div, layerdict) { div.onmousedown = function(e) { handleMouseDown(e, layerdict); }; div.onmousemove = function(e) { handleMouseMove(e, layerdict); }; div.onmouseup = function(e) { handleMouseUp(e, layerdict); }; div.onmouseout = function(e) { handleMouseUp(e, layerdict); } div.onwheel = function(e) { handleMouseWheel(e, layerdict); } for (element of [div, layerdict.bg, layerdict.silk, layerdict.highlight]) { element.addEventListener("contextmenu", function(e) { e.preventDefault(); }, false); } } function setRedrawOnDrag(value) { redrawOnDrag = value; writeStorage("redrawOnDrag", value); } function initRender() { allcanvas = { front: { transform: { x: 0, y: 0, s: 1, panx: 0, pany: 0, zoom: 1, mousestartx: 0, mousestarty: 0, mousedown: false, }, bg: document.getElementById("F_bg"), silk: document.getElementById("F_slk"), highlight: document.getElementById("F_hl"), layer: "F", }, back: { transform: { x: 0, y: 0, s: 1, panx: 0, pany: 0, zoom: 1, mousestartx: 0, mousestarty: 0, mousedown: false, }, bg: document.getElementById("B_bg"), silk: document.getElementById("B_slk"), highlight: document.getElementById("B_hl"), layer: "B", } }; addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front); addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back); } /////////////////////////////////////////////// /////////////////////////////////////////////// /* DOM manipulation and misc code */ var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' + pcbdata.metadata.revision + '__'; var bomsplit; var canvassplit; var canvaslayout = "default"; var bomlayout = "default"; var currentHighlightedRowId; var highlightHandlers = []; var highlightedRefs = []; var checkboxes = []; var bomCheckboxes = ""; var storage; var lastClickedRef; function initStorage(key) { try { window.localStorage.getItem("blank"); storage = window.localStorage; } catch (e) { // localStorage not available } if (!storage) { try { window.sessionStorage.getItem("blank"); storage = window.sessionStorage; } catch (e) { // sessionStorage also not available } } } function readStorage(key) { if (storage) { return storage.getItem(storagePrefix + '#' + key); } else { return null; } } function writeStorage(key, value) { if (storage) { storage.setItem(storagePrefix + '#' + key, value); } } function dbg(html) { dbgdiv.innerHTML = html; } function setDarkMode(value) { if (value) { topmostdiv.classList.add("dark"); } else { topmostdiv.classList.remove("dark"); } writeStorage("darkmode", value); redrawCanvas(allcanvas.front); redrawCanvas(allcanvas.back); } function getStoredCheckboxRefs(checkbox) { existingRefs = readStorage("checkbox_" + checkbox); if (!existingRefs) { refsSet = new Set(); } else { refsSet = new Set(existingRefs.split(",")); } return refsSet; } function setBomCheckboxState(checkbox, element, references) { var storedRefsSet = getStoredCheckboxRefs(checkbox); var currentRefsSet = new Set(references); // Get difference of current - stored var difference = new Set(currentRefsSet); for (ref of storedRefsSet) { difference.delete(ref); } if (difference.size == 0) { // All the current refs are stored element.checked = true; } else if (difference.size == currentRefsSet.size) { // None of the current refs are stored element.checked = false; } else { // Some of the refs are stored element.checked = false; element.indeterminate = true; } } function createCheckboxChangeHandler(checkbox, references) { return function() { refsSet = getStoredCheckboxRefs(checkbox); if (this.checked) { // checkbox ticked for (ref of references) { refsSet.add(ref); } } else { // checkbox unticked for (ref of references) { refsSet.delete(ref); } } writeStorage("checkbox_" + checkbox, [...refsSet].join(",")); } } function createRowHighlightHandler(rowid, refs) { return function() { if (currentHighlightedRowId) { if (currentHighlightedRowId == rowid) { return; } document.getElementById(currentHighlightedRowId).classList.remove("highlighted"); } document.getElementById(rowid).classList.add("highlighted"); currentHighlightedRowId = rowid; highlightedRefs = refs; drawHighlights(); } } function entryMatches(entry) { // check refs for (ref of entry[3]) { if (ref.toLowerCase().indexOf(filter) >= 0) { return true; } } // check value if (entry[1].toLowerCase().indexOf(filter) >= 0) { return true; } // check footprint if (entry[2].toLowerCase().indexOf(filter) >= 0) { return true; } return false; } function findRefInEntry(entry) { for (ref of entry[3]) { if (ref.toLowerCase() == reflookup) { return [ref]; } } return false; } function highlightFilter(s) { if (!filter) { return s; } var parts = s.toLowerCase().split(filter); if (parts.length == 1) { return s; } var r = ""; var pos = 0; for (var i in parts) { if (i > 0) { r += '<mark class="highlight">' + s.substring(pos, pos + filter.length) + '</mark>'; pos += filter.length; } r += s.substring(pos, pos + parts[i].length); pos += parts[i].length; } return r; } function populateBomHeader() { var tr = document.createElement("TR"); var td = document.createElement("TH"); td.classList.add("numCol"); tr.appendChild(td); checkboxes = bomCheckboxes.split(","); for (checkbox of checkboxes) { if (checkbox) { td = document.createElement("TH"); td.classList.add("bom-checkbox"); td.innerHTML = checkbox; tr.appendChild(td); } } td = document.createElement("TH"); td.classList.add("References"); td.innerHTML = "References"; tr.appendChild(td); td = document.createElement("TH"); td.classList.add("Value"); td.innerHTML = "Value"; tr.appendChild(td); td = document.createElement("TH"); td.classList.add("Footprint"); td.innerHTML = "Footprint"; tr.appendChild(td); td = document.createElement("TH"); td.classList.add("Quantity"); td.innerHTML = "Quantity"; tr.appendChild(td); bomhead.appendChild(tr); } function populateBomBody() { highlightHandlers = []; currentHighlightedRowId = null; var first = true; switch (canvaslayout) { case 'F': bomtable = pcbdata.bom.F; break; case 'FB': bomtable = pcbdata.bom.both; break; case 'B': bomtable = pcbdata.bom.B; break; } for (var i in bomtable) { var bomentry = bomtable[i]; if (filter && !entryMatches(bomentry)) { continue; } references = bomentry[3]; if (reflookup) { references = findRefInEntry(bomentry); if (!references) { continue; } } var tr = document.createElement("TR"); var td = document.createElement("TD"); var rownum = +i + 1; tr.id = "bomrow" + rownum; td.textContent = rownum; tr.appendChild(td); // Checkboxes for (checkbox of checkboxes) { if (checkbox) { td = document.createElement("TD"); input = document.createElement("input"); input.type = "checkbox"; input.onchange = createCheckboxChangeHandler(checkbox, references); setBomCheckboxState(checkbox, input, references); td.appendChild(input); tr.appendChild(td); } } // References td = document.createElement("TD"); td.innerHTML = highlightFilter(references.join(", ")); tr.appendChild(td); // Value td = document.createElement("TD"); td.innerHTML = highlightFilter(bomentry[1]); tr.appendChild(td); // Footprint td = document.createElement("TD"); td.innerHTML = highlightFilter(bomentry[2]); tr.appendChild(td); // Quantity td = document.createElement("TD"); td.textContent = bomentry[3].length; tr.appendChild(td); bom.appendChild(tr); var handler = createRowHighlightHandler(tr.id, references); tr.onmousemove = handler; highlightHandlers.push({ id: tr.id, handler: handler, refs: references }); if ((filter || reflookup) && first) { highlightedRefs = references; drawHighlights(); first = false; } } } function smoothScrollToRow(rowid) { document.getElementById(rowid).scrollIntoView({ behavior: "smooth", block: "center", inline: "nearest" });} function highlightPreviousRow() { if (!currentHighlightedRowId) { highlightHandlers[highlightHandlers.length - 1].handler(); } else { if (highlightHandlers.length > 1 && highlightHandlers[0].id == currentHighlightedRowId) { highlightHandlers[highlightHandlers.length - 1].handler(); } else { for (var i = 0; i < highlightHandlers.length - 1; i++) { if (highlightHandlers[i + 1].id == currentHighlightedRowId) { highlightHandlers[i].handler(); break; } } } } smoothScrollToRow(currentHighlightedRowId); } function highlightNextRow() { if (!currentHighlightedRowId) { highlightHandlers[0].handler(); } else { if (highlightHandlers.length > 1 && highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) { highlightHandlers[0].handler(); } else { for (var i = 1; i < highlightHandlers.length; i++) { if (highlightHandlers[i - 1].id == currentHighlightedRowId) { highlightHandlers[i].handler(); break; } } } } smoothScrollToRow(currentHighlightedRowId); } function populateBomTable() { while (bom.firstChild) { bom.removeChild(bom.firstChild); } while (bomhead.firstChild) { bomhead.removeChild(bomhead.firstChild); } populateBomHeader(); populateBomBody(); } function modulesClicked(references) { var lastClickedIndex = references.indexOf(lastClickedRef); var ref = references[(lastClickedIndex + 1) % references.length]; for (var handler of highlightHandlers) { if (handler.refs.indexOf(ref) >= 0) { lastClickedRef = ref; handler.handler(); smoothScrollToRow(currentHighlightedRowId); break; } } } function updateFilter(input) { filter = input.toLowerCase(); populateBomTable(); } function updateRefLookup(input) { reflookup = input.toLowerCase(); populateBomTable(); } function silkscreenVisible(visible) { if (visible) { allcanvas.front.silk.style.display = ""; allcanvas.back.silk.style.display = ""; writeStorage("silkscreenVisible", true); } else { allcanvas.front.silk.style.display = "none"; allcanvas.back.silk.style.display = "none"; writeStorage("silkscreenVisible", false); } } function changeCanvasLayout(layout) { document.getElementById("fl-btn").classList.remove("depressed"); document.getElementById("fb-btn").classList.remove("depressed"); document.getElementById("bl-btn").classList.remove("depressed"); switch (layout) { case 'F': document.getElementById("fl-btn").classList.add("depressed"); if (bomlayout != "BOM") { canvassplit.collapse(1); } break; case 'B': document.getElementById("bl-btn").classList.add("depressed"); if (bomlayout != "BOM") { canvassplit.collapse(0); } break; default: document.getElementById("fb-btn").classList.add("depressed"); if (bomlayout != "BOM") { canvassplit.setSizes([50, 50]); } } canvaslayout = layout; writeStorage("canvaslayout", layout); resizeAll(); populateBomTable(); } function populateMetadata() { document.getElementById("title").innerHTML = pcbdata.metadata.title; document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision; document.getElementById("company").innerHTML = pcbdata.metadata.company; document.getElementById("filedate").innerHTML = pcbdata.metadata.date; if (pcbdata.metadata.title != "") { document.title = pcbdata.metadata.title + " BOM"; } } function changeBomLayout(layout) { document.getElementById("bom-btn").classList.remove("depressed"); document.getElementById("lr-btn").classList.remove("depressed"); document.getElementById("tb-btn").classList.remove("depressed"); switch (layout) { case 'BOM': document.getElementById("bom-btn").classList.add("depressed"); if (bomsplit) { bomsplit.destroy(); bomsplit = null; canvassplit.destroy(); canvassplit = null; } document.getElementById("frontcanvas").style.display = "none"; document.getElementById("backcanvas").style.display = "none"; document.getElementById("bot").style.height = ""; break; case 'TB': document.getElementById("tb-btn").classList.add("depressed"); document.getElementById("frontcanvas").style.display = ""; document.getElementById("backcanvas").style.display = ""; document.getElementById("bot").style.height = "calc(100% - 80px)"; document.getElementById("bomdiv").classList.remove("split-horizontal"); document.getElementById("canvasdiv").classList.remove("split-horizontal"); document.getElementById("frontcanvas").classList.add("split-horizontal"); document.getElementById("backcanvas").classList.add("split-horizontal"); if (bomsplit) { bomsplit.destroy(); bomsplit = null; canvassplit.destroy(); canvassplit = null; } bomsplit = Split(['#bomdiv', '#canvasdiv'], { sizes: [50, 50], onDragEnd: resizeAll, direction: "vertical", gutterSize: 5 }); canvassplit = Split(['#frontcanvas', '#backcanvas'], { sizes: [50, 50], gutterSize: 5, onDragEnd: resizeAll }); break; case 'LR': document.getElementById("lr-btn").classList.add("depressed"); document.getElementById("frontcanvas").style.display = ""; document.getElementById("backcanvas").style.display = ""; document.getElementById("bot").style.height = "calc(100% - 80px)"; document.getElementById("bomdiv").classList.add("split-horizontal"); document.getElementById("canvasdiv").classList.add("split-horizontal"); document.getElementById("frontcanvas").classList.remove("split-horizontal"); document.getElementById("backcanvas").classList.remove("split-horizontal"); if (bomsplit) { bomsplit.destroy(); bomsplit = null; canvassplit.destroy(); canvassplit = null; } bomsplit = Split(['#bomdiv', '#canvasdiv'], { sizes: [50, 50], onDragEnd: resizeAll, gutterSize: 5 }); canvassplit = Split(['#frontcanvas', '#backcanvas'], { sizes: [50, 50], gutterSize: 5, direction: "vertical", onDragEnd: resizeAll }); } bomlayout = layout; writeStorage("bomlayout", layout); changeCanvasLayout(canvaslayout); } function focusInputField(input) { input.scrollIntoView(false); input.focus(); input.select(); } function focusFilterField() { focusInputField(document.getElementById("filter")); } function focusRefLookupField() { focusInputField(document.getElementById("reflookup")); } function toggleBomCheckbox(bomrowid, checkboxnum) { if (!bomrowid || checkboxnum > checkboxes.length) { return; } var bomrow = document.getElementById(bomrowid); var checkbox = bomrow.childNodes[checkboxnum].childNodes[0]; checkbox.checked = !checkbox.checked; checkbox.indeterminate = false; checkbox.onchange(); } function removeGutterNode(node) { for (var i = 0; i < node.childNodes.length; i++) { if (node.childNodes[i].classList && node.childNodes[i].classList.contains("gutter")) { node.removeChild(node.childNodes[i]); break; } } } function cleanGutters() { removeGutterNode(document.getElementById("bot")); removeGutterNode(document.getElementById("canvasdiv")); } function setBomCheckboxes(value) { bomCheckboxes = value; writeStorage("bomCheckboxes", value); populateBomTable(); } document.onkeydown = function(e) { switch (e.key) { case "ArrowUp": highlightPreviousRow(); e.preventDefault(); break; case "ArrowDown": highlightNextRow(); e.preventDefault(); break; default: break; } if (e.altKey) { switch (e.key) { case "f": focusFilterField(); e.preventDefault(); break; case "r": focusRefLookupField(); e.preventDefault(); break; case "z": changeBomLayout("BOM"); e.preventDefault(); break; case "x": changeBomLayout("LR"); e.preventDefault(); break; case "c": changeBomLayout("TB"); e.preventDefault(); break; case "v": changeCanvasLayout("F"); e.preventDefault(); break; case "b": changeCanvasLayout("FB"); e.preventDefault(); break; case "n": changeCanvasLayout("B"); e.preventDefault(); break; default: break; } if (e.key >= '1' && e.key <= '9') { toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key)); } } } window.onload = function(e) { initStorage(); cleanGutters(); initRender(); dbgdiv = document.getElementById("dbg"); bom = document.getElementById("bombody"); bomhead = document.getElementById("bomhead"); bomlayout = readStorage("bomlayout"); if (!bomlayout) { bomlayout = "LR"; } canvaslayout = readStorage("canvaslayout"); if (!canvaslayout) { canvaslayout = "FB"; } filter = ""; reflookup = ""; populateMetadata(); bomCheckboxes = readStorage("bomCheckboxes"); if (bomCheckboxes === null) { bomCheckboxes = "Sourced,Placed"; } document.getElementById("bomCheckboxes").value = bomCheckboxes; if (readStorage("silkscreenVisible") === "false") { document.getElementById("silkscreenCheckbox").checked = false; silkscreenVisible(false); } if (readStorage("redrawOnDrag") === "false") { document.getElementById("dragCheckbox").checked = false; setRedrawOnDrag(false); } if (readStorage("darkmode") === "true") { document.getElementById("darkmodeCheckbox").checked = true; setDarkMode(true); } // Triggers render changeBomLayout(bomlayout); } window.onresize = resizeAll; window.matchMedia("print").addListener(resizeAll); /////////////////////////////////////////////// </script> </head> <body> <div id="topmostdiv" style="width: 100%; height: 100%"> <div id="top"> <div style="float: right;"> <div class="hideonprint menu" style="float: right; margin: 10px; top: 8px;"> <button class="menubtn"></button> <div class="menu-content"> <label class="menu-label menu-label-top"> <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)"> Dark mode </label> <label class="menu-label"> <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)"> Show silkscreen </label> <label class="menu-label"> <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)"> Continuous redraw on drag </label> <label class="menu-label"> <div style="margin-left: 5px">Bom checkboxes</div> <input id="bomCheckboxes" class="menu-textbox" type=text oninput="setBomCheckboxes(this.value)"> </label> </div> </div> <div class="button-container hideonprint" style="float: right; margin: 10px; position: relative; top: 8px"> <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')" title="Front only">F </button> <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')" title="Front and Back">FB </button> <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')" title="Back only">B </button> </div> <div class="button-container hideonprint" style="float: right; margin: 10px; position: relative; top: 8px"> <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('BOM')" title="BOM only"></button> <button id="lr-btn" class="middle-button" onclick="changeBomLayout('LR')" title="BOM left, drawings right"></button> <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('TB')" title="BOM top, drawings bot"></button> </div> </div> <div id="fileinfodiv" style="overflow: auto;"> <table class="fileinfo"> <tbody> <tr> <td id="title" class="title" style="width: 70%"> Title </td> <td id="revision" class="title" style="width: 30%"> Revision </td> </tr> <tr> <td id="company"> Kicad version </td> <td id="filedate"> Date </td> </tr> </tbody> </table> </div> </div> <div id="bot" class="split" style="height: calc(100% - 80px)"> <div id="bomdiv" class="split split-horizontal"> <div style="width: 100%"> <input id="reflookup" class="searchbox reflookup hideonprint" type="text" placeholder="Ref lookup" oninput="updateRefLookup(this.value)"> <input id="filter" class="searchbox filter hideonprint" type="text" placeholder="Filter" oninput="updateFilter(this.value)"> </div> <div id="dbg"></div> <table class="bom"> <thead id="bomhead"> </thead> <tbody id="bombody"> </tbody> </table> </div> <div id="canvasdiv" class="split split-horizontal"> <div id="frontcanvas" class="split" style="overflow: hidden"> <div style="position: relative; width: 100%; height: 100%;"> <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas> <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas> <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas> </div> </div> <div id="backcanvas" class="split" style="overflow: hidden"> <div style="position: relative; width: 100%; height: 100%;"> <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas> <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas> <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas> </div> </div> </div> </div> </div> </body> </html>