custom-keyboard/tests_pcb/sample_stm32/bom/ibom.html
2018-08-01 15:17:45 +02:00

950 lines
72 KiB
HTML

<!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">
html,
body {
margin: 0px;
height: 100%;
font-family: "Helvetica Neue", Helvetica, Verdana, sans-serif;
}
button {
/* Gray */
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;
}
button.depressed {
background-color: #0a0;
color: white;
}
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;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
margin: 1px;
}
.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, 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;
}
.bom th {
background-color: #CCCCCC;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.bom tr {
transition: background-color 0.2s;
}
.bom tr:hover {
background-color: #cfc;
}
.bom .numCol {
width: 25px;
}
.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: #eee;
background-repeat: no-repeat;
background-position: 50%;
}
.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", 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;
}
.searchbox::placeholder {
color: #ccc;
}
.filter {
width: calc(60% - 10px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
</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}}});
</script>
<script type="text/javascript">
///////////////////////////////////////////////
var pcbdata = {"silkscreen": {"B": [{"angle": 0.0, "horiz_justify": 0, "text": "SMT32 test board\nJul 2018 - v0.1\nThomas Schwery", "pos": [47.05, 116.35], "height": 1.0, "width": 1.0}, {"angle": 90.0, "horiz_justify": 0, "text": "C4", "pos": [51.555, 86.7], "height": 1.0, "width": 1.0}, {"start": [48.595, 87.35], "end": [48.595, 86.05], "type": "segment", "width": 0.12}, {"start": [50.415, 87.35], "end": [50.415, 86.05], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C3", "pos": [54.199999999999996, 86.705], "height": 1.0, "width": 1.0}, {"start": [53.059999999999995, 87.35499999999999], "end": [53.059999999999995, 86.05499999999999], "type": "segment", "width": 0.12}, {"start": [51.239999999999995, 87.35499999999999], "end": [51.239999999999995, 86.05499999999999], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C2", "pos": [48.15, 79.85], "height": 1.0, "width": 1.0}, {"start": [45.19, 80.5], "end": [45.19, 79.2], "type": "segment", "width": 0.12}, {"start": [47.01, 80.5], "end": [47.01, 79.2], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C1", "pos": [45.15, 79.85499999999999], "height": 1.0, "width": 1.0}, {"start": [44.01, 80.505], "end": [44.01, 79.205], "type": "segment", "width": 0.12}, {"start": [42.19, 80.505], "end": [42.19, 79.205], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "D_2", "pos": [44.6, 102.8], "height": 1.0, "width": 1.0}, {"start": [46.85, 103.8], "end": [46.85, 105.8], "type": "segment", "width": 0.12}, {"start": [46.85, 105.8], "end": [42.949999999999996, 105.8], "type": "segment", "width": 0.12}, {"start": [46.85, 103.8], "end": [42.949999999999996, 103.8], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "D_1", "pos": [44.6, 121.75], "height": 1.0, "width": 1.0}, {"start": [46.85, 122.75], "end": [46.85, 124.75], "type": "segment", "width": 0.12}, {"start": [46.85, 124.75], "end": [42.949999999999996, 124.75], "type": "segment", "width": 0.12}, {"start": [46.85, 122.75], "end": [42.949999999999996, 122.75], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "U1", "pos": [50.65, 77.0], "height": 1.0, "width": 1.0}, {"start": [49.75, 78.28999999999999], "end": [52.199999999999996, 78.28999999999999], "type": "segment", "width": 0.12}, {"start": [51.55, 81.50999999999999], "end": [49.75, 81.50999999999999], "type": "segment", "width": 0.12}], "F": [{"angle": 90.0, "horiz_justify": 0, "text": "R1", "pos": [40.8, 94.6], "height": 1.0, "width": 1.0}, {"start": [40.019999999999996, 93.6], "end": [40.019999999999996, 95.6], "type": "segment", "width": 0.12}, {"start": [37.879999999999995, 95.6], "end": [37.879999999999995, 93.6], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C9", "pos": [45.199999999999996, 93.905], "height": 1.0, "width": 1.0}, {"start": [44.059999999999995, 93.255], "end": [44.059999999999995, 94.55499999999999], "type": "segment", "width": 0.12}, {"start": [42.239999999999995, 93.255], "end": [42.239999999999995, 94.55499999999999], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "C8", "pos": [47.4, 96.55], "height": 1.0, "width": 1.0}, {"start": [48.05, 93.58999999999999], "end": [46.75, 93.58999999999999], "type": "segment", "width": 0.12}, {"start": [48.05, 95.41], "end": [46.75, 95.41], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C7", "pos": [53.55, 79.695], "height": 1.0, "width": 1.0}, {"start": [52.41, 79.045], "end": [52.41, 80.345], "type": "segment", "width": 0.12}, {"start": [50.589999999999996, 79.045], "end": [50.589999999999996, 80.345], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C6", "pos": [45.15, 79.85499999999999], "height": 1.0, "width": 1.0}, {"start": [42.19, 79.205], "end": [42.19, 80.505], "type": "segment", "width": 0.12}, {"start": [44.01, 79.205], "end": [44.01, 80.505], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "C5", "pos": [51.15, 94.44999999999999], "height": 1.0, "width": 1.0}, {"start": [52.29, 95.1], "end": [52.29, 93.8], "type": "segment", "width": 0.12}, {"start": [54.11, 95.1], "end": [54.11, 93.8], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "R2", "pos": [44.3, 79.75], "height": 1.0, "width": 1.0}, {"start": [47.22, 78.75], "end": [47.22, 80.75], "type": "segment", "width": 0.12}, {"start": [45.08, 80.75], "end": [45.08, 78.75], "type": "segment", "width": 0.12}, {"angle": 90.0, "horiz_justify": 0, "text": "R3", "pos": [46.699999999999996, 79.75], "height": 1.0, "width": 1.0}, {"start": [47.48, 80.75], "end": [47.48, 78.75], "type": "segment", "width": 0.12}, {"start": [49.62, 78.75], "end": [49.62, 80.75], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "K_1", "pos": [46.75, 132.275], "height": 1.27, "width": 1.524}, {"start": [40.4, 124.52799999999999], "end": [40.4, 122.75], "type": "segment", "width": 0.381}, {"start": [40.4, 135.45], "end": [40.4, 133.672], "type": "segment", "width": 0.381}, {"start": [42.178, 135.45], "end": [40.4, 135.45], "type": "segment", "width": 0.381}, {"start": [53.099999999999994, 135.45], "end": [51.321999999999996, 135.45], "type": "segment", "width": 0.381}, {"start": [53.099999999999994, 133.672], "end": [53.099999999999994, 135.45], "type": "segment", "width": 0.381}, {"start": [53.099999999999994, 122.75], "end": [53.099999999999994, 124.52799999999999], "type": "segment", "width": 0.381}, {"start": [51.321999999999996, 122.75], "end": [53.099999999999994, 122.75], "type": "segment", "width": 0.381}, {"start": [40.4, 122.75], "end": [42.178, 122.75], "type": "segment", "width": 0.381}, {"angle": 0.0, "horiz_justify": 0, "text": "SW2", "pos": [51.39, 100.88], "height": 1.0, "width": 1.0}, {"start": [54.73, 99.88], "end": [48.69, 99.88], "type": "segment", "width": 0.12}, {"start": [54.089999999999996, 97.22], "end": [48.69, 97.22], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "J2", "pos": [47.199999999999996, 77.3], "height": 1.0, "width": 1.0}, {"start": [51.349999999999994, 74.45], "end": [51.349999999999994, 73.05], "type": "segment", "width": 0.15}, {"start": [51.349999999999994, 70.64999999999999], "end": [51.349999999999994, 70.5], "type": "segment", "width": 0.15}, {"start": [51.349999999999994, 70.5], "end": [51.05, 70.5], "type": "segment", "width": 0.15}, {"start": [51.05, 70.5], "end": [51.05, 70.05], "type": "segment", "width": 0.15}, {"start": [43.35, 70.05], "end": [43.35, 70.5], "type": "segment", "width": 0.15}, {"start": [43.35, 70.5], "end": [43.05, 70.5], "type": "segment", "width": 0.15}, {"start": [43.05, 70.5], "end": [43.05, 70.64999999999999], "type": "segment", "width": 0.15}, {"start": [43.05, 73.05], "end": [43.05, 74.45], "type": "segment", "width": 0.15}, {"start": [48.275, 76.625], "end": [49.0, 76.625], "type": "segment", "width": 0.15}, {"start": [49.0, 76.625], "end": [49.0, 76.2], "type": "segment", "width": 0.15}, {"start": [49.0, 76.2], "end": [49.724999999999994, 76.2], "type": "segment", "width": 0.15}, {"start": [45.4, 76.2], "end": [44.675, 76.2], "type": "segment", "width": 0.15}, {"angle": 90.0, "horiz_justify": 0, "text": "U2", "pos": [41.725001, 87.61500099999999], "height": 1.0, "width": 1.0}, {"start": [51.285001, 91.175001], "end": [51.285001, 90.755001], "type": "segment", "width": 0.12}, {"start": [44.165001, 91.175001], "end": [44.585001, 91.175001], "type": "segment", "width": 0.12}, {"start": [44.585001, 91.175001], "end": [44.585001, 92.55500099999999], "type": "segment", "width": 0.12}, {"start": [44.165001, 84.05500099999999], "end": [44.165001, 84.47500099999999], "type": "segment", "width": 0.12}, {"start": [51.285001, 84.05500099999999], "end": [51.285001, 84.47500099999999], "type": "segment", "width": 0.12}, {"start": [44.165001, 91.175001], "end": [44.165001, 90.755001], "type": "segment", "width": 0.12}, {"start": [51.285001, 91.175001], "end": [50.865001, 91.175001], "type": "segment", "width": 0.12}, {"start": [51.285001, 84.05500099999999], "end": [50.865001, 84.05500099999999], "type": "segment", "width": 0.12}, {"start": [44.165001, 84.05500099999999], "end": [44.585001, 84.05500099999999], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "K_2", "pos": [46.75, 112.925], "height": 1.27, "width": 1.524}, {"start": [40.4, 105.178], "end": [40.4, 103.39999999999999], "type": "segment", "width": 0.381}, {"start": [40.4, 116.1], "end": [40.4, 114.32199999999999], "type": "segment", "width": 0.381}, {"start": [42.178, 116.1], "end": [40.4, 116.1], "type": "segment", "width": 0.381}, {"start": [53.099999999999994, 116.1], "end": [51.321999999999996, 116.1], "type": "segment", "width": 0.381}, {"start": [53.099999999999994, 114.32199999999999], "end": [53.099999999999994, 116.1], "type": "segment", "width": 0.381}, {"start": [53.099999999999994, 103.39999999999999], "end": [53.099999999999994, 105.178], "type": "segment", "width": 0.381}, {"start": [51.321999999999996, 103.39999999999999], "end": [53.099999999999994, 103.39999999999999], "type": "segment", "width": 0.381}, {"start": [40.4, 103.39999999999999], "end": [42.178, 103.39999999999999], "type": "segment", "width": 0.381}, {"angle": 0.0, "horiz_justify": 0, "text": "J1", "pos": [38.699999999999996, 69.02], "height": 1.0, "width": 1.0}, {"start": [37.37, 70.02], "end": [38.699999999999996, 70.02], "type": "segment", "width": 0.12}, {"start": [37.37, 71.35], "end": [37.37, 70.02], "type": "segment", "width": 0.12}, {"start": [37.37, 72.61999999999999], "end": [40.03, 72.61999999999999], "type": "segment", "width": 0.12}, {"start": [40.03, 72.61999999999999], "end": [40.03, 90.46], "type": "segment", "width": 0.12}, {"start": [37.37, 72.61999999999999], "end": [37.37, 90.46], "type": "segment", "width": 0.12}, {"start": [37.37, 90.46], "end": [40.03, 90.46], "type": "segment", "width": 0.12}, {"angle": 0.0, "horiz_justify": 0, "text": "SW1", "pos": [41.05, 100.78], "height": 1.0, "width": 1.0}, {"start": [44.39, 99.78], "end": [38.35, 99.78], "type": "segment", "width": 0.12}, {"start": [43.75, 97.11999999999999], "end": [38.35, 97.11999999999999], "type": "segment", "width": 0.12}]}, "edges": [{"start": [56.25, 138.5], "end": [37.35, 138.5], "type": "segment", "width": 0.15}, {"start": [37.35, 70.0], "end": [56.25, 70.0], "type": "segment", "width": 0.15}, {"start": [37.35, 138.5], "end": [37.35, 70.0], "type": "segment", "width": 0.15}, {"start": [56.25, 70.0], "end": [56.25, 138.5], "type": "segment", "width": 0.15}], "modules": {"U1": {"layer": "B", "center": [50.65, 79.89999999999999], "pads": [{"layers": ["B"], "angle": -180.0, "pos": [49.55, 78.95], "shape": "rect", "pin1": false, "type": "smd", "size": [1.06, 0.65]}, {"layers": ["B"], "angle": -180.0, "pos": [49.55, 80.85], "shape": "rect", "pin1": false, "type": "smd", "size": [1.06, 0.65]}, {"layers": ["B"], "angle": -180.0, "pos": [51.75, 80.85], "shape": "rect", "pin1": false, "type": "smd", "size": [1.06, 0.65]}, {"layers": ["B"], "angle": -180.0, "pos": [51.75, 79.89999999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.06, 0.65]}, {"layers": ["B"], "angle": -180.0, "pos": [51.75, 78.95], "shape": "rect", "pin1": true, "type": "smd", "size": [1.06, 0.65]}], "drawings": [], "ref": "U1", "bbox": {"pos": [48.724999, 78.07499899999999], "size": [3.850002, 3.6500019999999997]}}, "U2": {"layer": "F", "center": [47.725001, 87.61500099999999], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [43.375001, 90.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 89.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 89.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 88.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 88.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 87.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 87.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 86.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 86.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 85.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 85.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [43.375001, 84.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [44.975001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [45.475001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [45.975001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [46.475001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [46.975001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [47.475001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [47.975001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [48.475001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [48.975001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [49.475001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [49.975001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [50.475001, 83.265001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 84.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 85.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 85.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 86.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 86.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 87.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 87.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 88.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 88.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 89.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 89.86500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -180.0, "pos": [52.075001, 90.36500099999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [50.475001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [49.975001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [49.475001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [48.975001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [48.475001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [47.975001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [47.475001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [46.975001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [46.475001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [45.975001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [45.475001, 91.965001], "shape": "rect", "pin1": false, "type": "smd", "size": [1.3, 0.25]}, {"layers": ["F"], "angle": -90.0, "pos": [44.975001, 91.965001], "shape": "rect", "pin1": true, "type": "smd", "size": [1.3, 0.25]}], "drawings": [], "ref": "U2", "bbox": {"pos": [42.449999999999996, 82.33999999999999], "size": [10.550002, 10.550002]}}, "K_1": {"layer": "F", "center": [46.75, 129.1], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [51.83, 129.1], "drillsize": [1.7018, 1.7018], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7018, 1.7018]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [41.669999999999995, 129.1], "drillsize": [1.7018, 1.7018], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7018, 1.7018]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [46.75, 129.1], "drillsize": [3.9878, 3.9878], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [3.9878, 3.9878]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [42.94, 126.55999999999999], "drillsize": [1.4986, 1.4986], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [2.286, 2.286]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [49.29, 124.02], "drillsize": [1.4986, 1.4986], "shape": "circle", "drillshape": "circle", "pin1": true, "type": "th", "size": [2.286, 2.286]}], "drawings": [], "ref": "K_1", "bbox": {"pos": [37.275799, 119.625799], "size": [18.948401999999998, 18.948401999999998]}}, "C9": {"layer": "F", "center": [43.15, 93.905], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [43.15, 92.39999999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["F"], "angle": -270.0, "pos": [43.15, 95.41], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C9", "bbox": {"pos": [41.974999, 91.58999899999999], "size": [2.350002, 4.630002]}}, "C8": {"layer": "F", "center": [47.4, 94.5], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [45.894999999999996, 94.5], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["F"], "angle": -180.0, "pos": [48.905, 94.5], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C8", "bbox": {"pos": [45.084998999999996, 93.32499899999999], "size": [4.630002, 2.350002]}}, "C3": {"layer": "B", "center": [52.15, 86.705], "pads": [{"layers": ["B"], "angle": -90.0, "pos": [52.15, 88.21], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["B"], "angle": -90.0, "pos": [52.15, 85.2], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C3", "bbox": {"pos": [50.974999, 84.389999], "size": [2.350002, 4.630002]}}, "C2": {"layer": "B", "center": [46.1, 79.85], "pads": [{"layers": ["B"], "angle": -90.0, "pos": [46.1, 78.345], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["B"], "angle": -90.0, "pos": [46.1, 81.35499999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C2", "bbox": {"pos": [44.924999, 77.534999], "size": [2.350002, 4.630002]}}, "C1": {"layer": "B", "center": [43.1, 79.85499999999999], "pads": [{"layers": ["B"], "angle": -90.0, "pos": [43.1, 81.36], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["B"], "angle": -90.0, "pos": [43.1, 78.35], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C1", "bbox": {"pos": [41.924999, 77.539999], "size": [2.350002, 4.630002]}}, "C7": {"layer": "F", "center": [51.5, 79.695], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [51.5, 78.19], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["F"], "angle": -270.0, "pos": [51.5, 81.2], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C7", "bbox": {"pos": [50.324999, 77.379999], "size": [2.350002, 4.630002]}}, "C6": {"layer": "F", "center": [43.1, 79.85499999999999], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [43.1, 81.36], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["F"], "angle": -270.0, "pos": [43.1, 78.35], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C6", "bbox": {"pos": [41.924999, 77.539999], "size": [2.350002, 4.630002]}}, "C5": {"layer": "F", "center": [53.199999999999996, 94.44999999999999], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [53.199999999999996, 95.955], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["F"], "angle": -90.0, "pos": [53.199999999999996, 92.945], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C5", "bbox": {"pos": [52.024999, 92.134999], "size": [2.350002, 4.630002]}}, "C4": {"layer": "B", "center": [49.504999999999995, 86.7], "pads": [{"layers": ["B"], "angle": -90.0, "pos": [49.504999999999995, 85.195], "shape": "rect", "pin1": false, "type": "smd", "size": [1.07, 1.7999999999999998]}, {"layers": ["B"], "angle": -90.0, "pos": [49.504999999999995, 88.205], "shape": "rect", "pin1": true, "type": "smd", "size": [1.07, 1.7999999999999998]}], "drawings": [], "ref": "C4", "bbox": {"pos": [48.329999, 84.384999], "size": [2.350002, 4.630002]}}, "K_2": {"layer": "F", "center": [46.75, 109.75], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [51.83, 109.75], "drillsize": [1.7018, 1.7018], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7018, 1.7018]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [41.669999999999995, 109.75], "drillsize": [1.7018, 1.7018], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7018, 1.7018]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [46.75, 109.75], "drillsize": [3.9878, 3.9878], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [3.9878, 3.9878]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [42.94, 107.21], "drillsize": [1.4986, 1.4986], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [2.286, 2.286]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [49.29, 104.67], "drillsize": [1.4986, 1.4986], "shape": "circle", "drillshape": "circle", "pin1": true, "type": "th", "size": [2.286, 2.286]}], "drawings": [], "ref": "K_2", "bbox": {"pos": [37.275799, 100.27579899999999], "size": [18.948401999999998, 18.948401999999998]}}, "R1": {"layer": "F", "center": [38.949999999999996, 94.6], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [38.949999999999996, 96.05], "shape": "rect", "pin1": false, "type": "smd", "size": [0.8999999999999999, 1.7]}, {"layers": ["F"], "angle": -270.0, "pos": [38.949999999999996, 93.14999999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [0.8999999999999999, 1.7]}], "drawings": [], "ref": "R1", "bbox": {"pos": [37.819998999999996, 92.424999], "size": [2.265002, 4.350002]}}, "R2": {"layer": "F", "center": [46.15, 79.75], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [46.15, 81.2], "shape": "rect", "pin1": true, "type": "smd", "size": [0.8999999999999999, 1.7]}, {"layers": ["F"], "angle": -90.0, "pos": [46.15, 78.3], "shape": "rect", "pin1": false, "type": "smd", "size": [0.8999999999999999, 1.7]}], "drawings": [], "ref": "R2", "bbox": {"pos": [45.014998999999996, 77.57499899999999], "size": [2.265002, 4.350002]}}, "R3": {"layer": "F", "center": [48.55, 79.75], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [48.55, 78.3], "shape": "rect", "pin1": false, "type": "smd", "size": [0.8999999999999999, 1.7]}, {"layers": ["F"], "angle": -90.0, "pos": [48.55, 81.2], "shape": "rect", "pin1": true, "type": "smd", "size": [0.8999999999999999, 1.7]}], "drawings": [], "ref": "R3", "bbox": {"pos": [47.414998999999995, 77.57499899999999], "size": [2.265002, 4.350002]}}, "D_2": {"layer": "B", "center": [44.6, 104.8], "pads": [{"layers": ["B"], "angle": -180.0, "pos": [46.25, 104.8], "shape": "rect", "pin1": true, "type": "smd", "size": [0.8999999999999999, 1.2]}, {"layers": ["B"], "angle": -180.0, "pos": [42.949999999999996, 104.8], "shape": "rect", "pin1": false, "type": "smd", "size": [0.8999999999999999, 1.2]}], "drawings": [], "ref": "D_2", "bbox": {"pos": [42.224999, 103.62499899999999], "size": [4.750001999999999, 2.350002]}}, "D_1": {"layer": "B", "center": [44.6, 123.75], "pads": [{"layers": ["B"], "angle": -180.0, "pos": [46.25, 123.75], "shape": "rect", "pin1": true, "type": "smd", "size": [0.8999999999999999, 1.2]}, {"layers": ["B"], "angle": -180.0, "pos": [42.949999999999996, 123.75], "shape": "rect", "pin1": false, "type": "smd", "size": [0.8999999999999999, 1.2]}], "drawings": [], "ref": "D_1", "bbox": {"pos": [42.224999, 122.57499899999999], "size": [4.750001999999999, 2.350002]}}, "J1": {"layer": "F", "center": [38.699999999999996, 71.35], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [38.699999999999996, 89.13], "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": [38.699999999999996, 86.58999999999999], "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": [38.699999999999996, 84.05], "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": [38.699999999999996, 81.50999999999999], "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": [38.699999999999996, 78.97], "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": [38.699999999999996, 76.42999999999999], "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": [38.699999999999996, 73.89], "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": [38.699999999999996, 71.35], "drillsize": [1.0, 1.0], "shape": "rect", "drillshape": "circle", "pin1": true, "type": "th", "size": [1.7, 1.7]}], "drawings": [], "ref": "J1", "bbox": {"pos": [36.874998999999995, 69.524999], "size": [3.6500019999999997, 21.400002]}}, "J2": {"layer": "F", "center": [47.199999999999996, 73.8], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [48.5, 75.7], "shape": "rect", "pin1": true, "type": "smd", "size": [0.44999999999999996, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [47.849999999999994, 75.7], "shape": "rect", "pin1": false, "type": "smd", "size": [0.44999999999999996, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [47.199999999999996, 75.7], "shape": "rect", "pin1": false, "type": "smd", "size": [0.44999999999999996, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [46.55, 75.7], "shape": "rect", "pin1": false, "type": "smd", "size": [0.44999999999999996, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [45.9, 75.7], "shape": "rect", "pin1": false, "type": "smd", "size": [0.44999999999999996, 1.3]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [50.925, 75.64999999999999], "drillsize": [1.4, 1.4], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [2.0, 2.0]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [43.475, 75.64999999999999], "drillsize": [1.4, 1.4], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [2.0, 2.0]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [51.074999999999996, 71.85], "drillsize": [1.2, 1.2], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7999999999999998, 1.7999999999999998]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [43.324999999999996, 71.85], "drillsize": [1.2, 1.2], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [1.7999999999999998, 1.7999999999999998]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [49.699999999999996, 74.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [0.7999999999999999, 0.7999999999999999]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [44.699999999999996, 74.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "drillshape": "circle", "pin1": false, "type": "th", "size": [0.7999999999999999, 0.7999999999999999]}], "drawings": [], "ref": "J2", "bbox": {"pos": [41.894999, 68.924999], "size": [10.600002, 8.240002]}}, "SW1": {"layer": "F", "center": [41.05, 98.44999999999999], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [43.589999999999996, 98.44999999999999], "shape": "rect", "pin1": true, "type": "smd", "size": [1.5999999999999999, 0.76]}, {"layers": ["F"], "angle": -180.0, "pos": [38.51, 98.44999999999999], "shape": "rect", "pin1": false, "type": "smd", "size": [1.5999999999999999, 0.76]}], "drawings": [], "ref": "SW1", "bbox": {"pos": [37.424999, 96.82499899999999], "size": [7.250001999999999, 3.250002]}}, "SW2": {"layer": "F", "center": [51.39, 98.55], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [53.93, 98.55], "shape": "rect", "pin1": true, "type": "smd", "size": [1.5999999999999999, 0.76]}, {"layers": ["F"], "angle": -180.0, "pos": [48.849999999999994, 98.55], "shape": "rect", "pin1": false, "type": "smd", "size": [1.5999999999999999, 0.76]}], "drawings": [], "ref": "SW2", "bbox": {"pos": [47.764998999999996, 96.924999], "size": [7.250001999999999, 3.250002]}}}, "bom": {"both": [[5, "100nF", "C_1206_3216Metric", ["C5", "C6", "C7", "C8", "C9"]], [2, "10uF", "C_1206_3216Metric", ["C2", "C4"]], [2, "33pF", "C_1206_3216Metric", ["C1", "C3"]], [2, "22", "R_1206", ["R2", "R3"]], [1, "220", "R_1206", ["R1"]], [2, "D", "D_SOD-123", ["D_1", "D_2"]], [1, "AP2204K-3.3", "SOT-23-5", ["U1"]], [1, "STM32L053C6Tx", "LQFP-48_7x7mm_P0.5mm", ["U2"]], [2, "SW_Push", "SW_DIP_x1_W5.08mm_Slide_Copal_CHS-A", ["SW1", "SW2"]], [2, "KEYSW", "CHERRY_PCB_100H", ["K_1", "K_2"]], [1, "Conn_01x08", "PinHeader_1x08_P2.54mm_Vertical", ["J1"]], [1, "USB_A", "USB_Micro-B_Wuerth-629105150521_CircularHoles", ["J2"]]], "B": [[2, "10uF", "C_1206_3216Metric", ["C2", "C4"]], [2, "33pF", "C_1206_3216Metric", ["C1", "C3"]], [2, "D", "D_SOD-123", ["D_1", "D_2"]], [1, "AP2204K-3.3", "SOT-23-5", ["U1"]]], "F": [[5, "100nF", "C_1206_3216Metric", ["C5", "C6", "C7", "C8", "C9"]], [2, "22", "R_1206", ["R2", "R3"]], [1, "220", "R_1206", ["R1"]], [1, "STM32L053C6Tx", "LQFP-48_7x7mm_P0.5mm", ["U2"]], [2, "SW_Push", "SW_DIP_x1_W5.08mm_Slide_Copal_CHS-A", ["SW1", "SW2"]], [2, "KEYSW", "CHERRY_PCB_100H", ["K_1", "K_2"]], [1, "Conn_01x08", "PinHeader_1x08_P2.54mm_Vertical", ["J1"]], [1, "USB_A", "USB_Micro-B_Wuerth-629105150521_CircularHoles", ["J2"]]]}, "metadata": {"date": "2018-07-25 21:53:22", "company": "", "revision": "", "title": "keyboard_pcb"}}
///////////////////////////////////////////////
var frontscale = 12;
var backscale = 12;
var canvaslayout = "default";
var bomlayout = "default";
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function dbg(str) {
dbgdiv.textContent = str;
}
function getEdgesBoundaries(edges) {
var minx = edges.reduce((min, edge) => {
return Math.min(min, edge.start[0]);
}, Infinity);
var maxx = edges.reduce((min, edge) => {
return Math.max(min, edge.start[0]);
}, -Infinity);
var miny = edges.reduce((min, edge) => {
return Math.min(min, edge.start[1]);
}, Infinity);
var maxy = edges.reduce((min, edge) => {
return Math.max(min, edge.start[1]);
}, -Infinity);
return [minx, maxx, miny, maxy];
}
function drawtext(ctx, scalefactor, text, color, flip) {
ctx.save();
ctx.translate(...text.pos.map(c => c * scalefactor));
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;
}
spacing = 1.6 * scalefactor;
for (i = 0; i < txt.length; i++) {
offset = -(txt.length - 1) * spacing / 2 + i * spacing;
ctx.fillText(txt[i], 0, offset);
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1, edge.width * scalefactor)
ctx.lineCap = "round";
if (edge.type == "segment") {
ctx.beginPath();
ctx.moveTo(...edge.start.map(c => c * scalefactor));
ctx.lineTo(...edge.end.map(c => c * scalefactor));
ctx.stroke();
}
if (edge.type == "arc") {
ctx.beginPath();
ctx.arc(
...edge.start.map(c => c * scalefactor),
edge.radius * scalefactor,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
ctx.stroke();
}
if (edge.type == "circle") {
ctx.beginPath();
ctx.arc(
...edge.start.map(c => c * scalefactor),
edge.radius * scalefactor,
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] * scalefactor;
var from = [-size[0] * scalefactor / 2 + size[1] * scalefactor / 2, 0];
var to = [-from[0], 0];
} else {
ctx.lineWidth = size[0] * scalefactor;
var from = [0, -size[1] * scalefactor / 2 + size[0] * scalefactor / 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 * scalefactor;
y = size[1] * -0.5 * scalefactor;
width = size[0] * scalefactor;
height = size[1] * scalefactor;
radius = radius * scalefactor;
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[0] * scalefactor, vertex[1] * scalefactor)
}
ctx.closePath();
ctx.fill();
}
}
function drawPolygonShape(ctx, scalefactor, shape, color) {
ctx.save();
ctx.translate(...shape.pos.map(c => c * scalefactor));
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.map(c => c * scalefactor));
ctx.fillStyle = "#D04040";
ctx.fillRect(
0, 0,
...module.bbox.size.map(c => c * scalefactor));
ctx.globalAlpha = 1;
ctx.strokeStyle = "#D04040";
ctx.lineWidth = 2;
ctx.strokeRect(
0, 0,
...module.bbox.size.map(c => c * scalefactor));
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.map(c => c * scalefactor));
ctx.rotate(deg2rad(pad.angle));
ctx.fillStyle = padcolor;
if (pad.shape == "rect") {
ctx.fillRect(
...pad.size.map(c => -c * scalefactor * 0.5),
...pad.size.map(c => c * scalefactor));
} 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] * scalefactor / 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] * scalefactor / 2, 0, 2 * Math.PI);
ctx.fill();
}
}
ctx.restore();
}
}
}
function drawModules(canvas, layer, scalefactor, highlightRefs) {
var ctx = canvas.getContext("2d");
for (edge of pcbdata.edges) {
drawedge(ctx, scalefactor, edge, "black");
}
for (i in pcbdata.modules) {
var mod = pcbdata.modules[i];
var highlight = highlightRefs.includes(mod.ref);
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 drawHighlights(highlightRefs) {
clearCanvas(allcanvas.front.highlight);
clearCanvas(allcanvas.back.highlight);
drawModules(allcanvas.front.highlight, "F", frontscale, highlightRefs);
drawModules(allcanvas.back.highlight, "B", backscale, highlightRefs);
}
function drawBackground() {
clearCanvas(allcanvas.front.bg);
clearCanvas(allcanvas.back.bg);
clearCanvas(allcanvas.front.silk);
clearCanvas(allcanvas.back.silk);
drawModules(allcanvas.front.highlight, "F", frontscale, []);
drawModules(allcanvas.back.highlight, "B", backscale, []);
drawSilkscreen(allcanvas.front.silk, "F", frontscale);
drawSilkscreen(allcanvas.back.silk, "B", backscale);
}
function prepareCanvas(canvas, layer, scalefactor, tx, ty) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
fontsize = 1.5 * scalefactor;
ctx.font = "bold " + fontsize + "px Consolas,\"DejaVu Sans Mono\",monospace";
ctx.textBaseline = "middle";
if (layer == "F") {
ctx.translate(tx, ty);
} else {
ctx.scale(-1, 1);
ctx.translate(tx, ty);
}
}
function resizeLayerCanvas(canvaslist, canvasdivid, layer) {
var width = document.getElementById(canvasdivid).clientWidth * 2 - 10;
var height = document.getElementById(canvasdivid).clientHeight * 2 - 10;
var [minx, maxx, miny, maxy] = getEdgesBoundaries(pcbdata.edges);
var scalefactor = Math.min(
width * 0.98 / (maxx - minx),
height * 0.98 / (maxy - miny)
);
if (scalefactor < 0) {
scalefactor = 0.1;
}
console.log("Scale factor " + canvasdivid + ": " + scalefactor)
if (layer == "B") {
var tx = -((maxx + minx) * scalefactor + width) * 0.5;
} else {
var tx = -((maxx + minx) * scalefactor - width) * 0.5;
}
var ty = -((maxy + miny) * scalefactor - height) * 0.5;
for (c in canvaslist) {
canvas = canvaslist[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / 2) + "px";
canvas.style.height = (height / 2) + "px";
prepareCanvas(canvas, layer, scalefactor, tx, ty);
}
return scalefactor;
}
function resizeCanvas() {
frontscale = resizeLayerCanvas(allcanvas.front, "frontcanvas", "F")
backscale = resizeLayerCanvas(allcanvas.back, "backcanvas", "B")
drawBackground();
drawHighlights([]);
}
function createRowMouseEnterHandler(refs) {
return function() {
drawHighlights(refs);
}
}
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 (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 populateBomTable() {
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
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 (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);
// 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);
tr.onmouseenter = createRowMouseEnterHandler(references);
if ((filter || reflookup) && first) {
drawHighlights(references);
first = false;
}
}
}
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 = "";
} else {
allcanvas.front.silk.style.display = "none";
allcanvas.back.silk.style.display = "none";
}
}
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;
resizeCanvas();
populateBomTable(layout);
}
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 (["LR", "TB"].includes(bomlayout)) {
bomsplit.destroy();
canvassplit.destroy();
}
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 (["LR", "TB"].includes(bomlayout)) {
bomsplit.destroy();
canvassplit.destroy();
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeCanvas,
direction: "vertical",
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
onDragEnd: resizeCanvas
});
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 (["LR", "TB"].includes(bomlayout)) {
bomsplit.destroy();
canvassplit.destroy();
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeCanvas,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeCanvas
});
}
bomlayout = layout;
if (bomlayout != "BOM") {
changeCanvasLayout(canvaslayout);
}
}
function removeGutterNode(node) {
for(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"));
}
window.onload = function(e) {
cleanGutters();
allcanvas = {};
allcanvas.front = {};
allcanvas.back = {};
allcanvas.front.bg = document.getElementById("F_bg");
allcanvas.front.silk = document.getElementById("F_slk");
allcanvas.front.highlight = document.getElementById("F_hl");
allcanvas.back.bg = document.getElementById("B_bg");
allcanvas.back.silk = document.getElementById("B_slk");
allcanvas.back.highlight = document.getElementById("B_hl");
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomlayout = "none";
canvaslayout = "FB";
filter = "";
reflookup = "";
populateMetadata();
resizeCanvas();
changeBomLayout('LR');
}
window.onresize = resizeCanvas;
window.matchMedia("print").addListener(resizeCanvas);
</script>
</head>
<body>
<div id="topmostdiv" style="width: 100%; height: 100%">
<div id="top" class="split" style="height: 80px; border-bottom: 2px solid black;">
<div style="float: right;">
<div class="hideonprint" style="float: right; margin: 10px; position: relative; top: 20px">
<input type="checkbox" name="silkscreen" value="silkscreen" checked
onchange="silkscreenVisible(this.checked)">Silkscreen
</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 class="searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input class="searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
</div>
<div id="dbg"></div>
<table class="bom">
<thead>
<tr>
<th class="numCol"></th>
<th class="References">References</th>
<th class="Value">Value</th>
<th class="Footprint">Footprint</th>
<th class="Quantity">Quantity</th>
</tr>
</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>