diff options
Diffstat (limited to 'heater/bom/ibom.html')
-rw-r--r-- | heater/bom/ibom.html | 2388 |
1 files changed, 2388 insertions, 0 deletions
diff --git a/heater/bom/ibom.html b/heater/bom/ibom.html new file mode 100644 index 0000000..d0622da --- /dev/null +++ b/heater/bom/ibom.html @@ -0,0 +1,2388 @@ +<!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; + --pad-color: #878787; + --pad-color-highlight: #D04040; + --pin1-outline-color: #ffb629; + --pin1-outline-color-highlight: #b4ff03; +} + +html, body { + margin: 0px; + height: 100%; + font-family: Verdana, sans-serif; +} + +.dark { + --pcb-edge-color: #eee; + --pad-color: #808080; + --pin1-outline-color: #ffa800; + --pin1-outline-color-highlight: #ccff00; + 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 { + /* This will be inverted */ + background-color: #c3b7b5; +} + +button.depressed { + background-color: #0a0; + color: white; +} + +.dark button.depressed { + /* This will be inverted */ + background-color: #b3b; +} + +button:focus { + outline: 0; +} + +button#tb-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A"); + background-size: 32px 32px; + background-position: 5px 5px; + background-repeat: no-repeat; +} + +button#lr-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A"); + background-size: 32px 32px; + background-position: 5px 5px; + background-repeat: no-repeat; +} + +button#bom-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E"); + background-size: 32px 32px; + background-position: 5px 5px; + background-repeat: no-repeat; +} + +button#copy { + background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E"); + background-position: 6px 6px; + background-repeat: no-repeat; + background-size: 26px 26px; + border-radius: 6px; + height: 40px; + width: 40px; + margin: 10px 5px; +} + +button#copy:active { + box-shadow: inset 0px 0px 5px #6c6c6c; +} + +textarea.clipboard-temp { + position: fixed; + top: 0; + left: 0; + width: 2em; + height: 2em; + padding: 0; + border: None; + outline: None; + box-shadow: None; + background: transparent; +} + +.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; + position: relative; +} + +.dark .bom th, .dark .bom td { + border: 1px solid #777; +} + +.bom th { + background-color: #CCCCCC; + background-clip: padding-box; +} + +.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 .Description { + width: 10%; +} + +.bom .Part { + width: 10%; +} + +.bom .Value { + width: 15%; +} + +.bom .Quantity { + width: 65px; +} + +.bom th .sortmark { + position: absolute; + right: 1px; + top: 1px; + margin-top: -5px; + border-width: 5px; + border-style: solid; + border-color: transparent transparent #221 transparent; + transform-origin: 50% 85%; + transition: opacity 0.2s, transform 0.4s; +} + +.dark .bom th .sortmark { + filter: invert(1); +} + +.bom th .sortmark.none { + opacity: 0; +} + +.bom th .sortmark.desc { + transform: rotate(180deg); +} + +.bom th:hover .sortmark.none { + opacity: 0.5; +} + +.bom .bom-checkbox { + width: 30px; + position: relative; + user-select: none; + -moz-user-select: none; +} + +.bom .bom-checkbox:before { + content: ""; + position: absolute; + border-width: 15px; + border-style: solid; + border-color: #51829f transparent transparent transparent; + visibility: hidden; + top: -15px; +} + +.bom .bom-checkbox:after { + content: "Double click to set/unset all"; + position: absolute; + color: white; + top: -35px; + left: -26px; + background: #51829f; + padding: 5px 15px; + border-radius: 8px; + white-space: nowrap; + visibility: hidden; +} + +.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after { + visibility: visible; + transition: visibility 0.2s linear 1s; +} + +.split { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow-y: auto; + overflow-x: hidden; + background-color: inherit; +} + +.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% - 64px); +} + +.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; +} + +.slider { + -webkit-appearance: none; + width: 100%; + margin: 3px 0; + padding: 0; + outline: none; + opacity: 0.7; + -webkit-transition: .2s; + transition: opacity .2s; + border-radius: 3px; +} + +.slider:hover { + opacity: 1; +} + +.slider:focus { + outline: none; +} + +.slider::-webkit-slider-runnable-track { + -webkit-appearance: none; + width: 100%; + height: 8px; + background: #d3d3d3; + border-radius: 3px; + border: none; +} + +.slider::-webkit-slider-thumb { + -webkit-appearance: none; + width: 15px; + height: 15px; + border-radius: 50%; + background: #0a0; + cursor: pointer; + margin-top: -4px; +} + +.dark .slider::-webkit-slider-thumb { + background: #3d3; +} + +.slider::-moz-range-thumb { + width: 15px; + height: 15px; + border-radius: 50%; + background: #0a0; + cursor: pointer; +} + +.slider::-moz-range-track { + height: 8px; + background: #d3d3d3; + border-radius: 3px; +} + +.dark .slider::-moz-range-thumb { + background: #3d3; +} + +.slider::-ms-track { + width: 100%; + height: 8px; + border-width: 3px 0; + background: transparent; + border-color: transparent; + color: transparent; + transition: opacity .2s; +} + +.slider::-ms-fill-lower { + background: #d3d3d3; + border: none; + border-radius: 3px; +} + +.slider::-ms-fill-upper { + background: #d3d3d3; + border: none; + border-radius: 3px; +} + +.slider::-ms-thumb { + width: 15px; + height: 15px; + border-radius: 50%; + background: #0a0; + cursor: pointer; + margin: 0; +} + +.shameless-plug { + font-size: 0.8em; + text-align: center; + display: block; +} + +.shameless-plug a { + color: #0278a4; +} + +.dark .shameless-plug a { + color: #00b9fd; +} + + </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 config = {"redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0.0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "layer_view": "FB"} +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +var pcbdata = {"font_data": {" ": {"l": [], "w": 0.7619047619047619}, ".": {"l": [[[0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.23809523809523808, -0.047619047619047616], [0.19047619047619047, -0.09523809523809523], [0.23809523809523808, -0.14285714285714285], [0.23809523809523808, -0.047619047619047616]]], "w": 0.47619047619047616}, "1": {"l": [[[0.7619047619047619, -0.047619047619047616], [0.19047619047619047, -0.047619047619047616]], [[0.47619047619047616, -0.047619047619047616], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -0.9047619047619047], [0.2857142857142857, -0.8095238095238095], [0.19047619047619047, -0.7619047619047619]]], "w": 0.9523809523809523}, "0": {"l": [[[0.42857142857142855, -1.0476190476190474], [0.5238095238095237, -1.0476190476190474], [0.6190476190476191, -1.0], [0.6666666666666666, -0.9523809523809523], [0.7142857142857142, -0.8571428571428571], [0.7619047619047619, -0.6666666666666666], [0.7619047619047619, -0.42857142857142855], [0.7142857142857142, -0.23809523809523808], [0.6666666666666666, -0.14285714285714285], [0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.42857142857142855, -0.047619047619047616], [0.3333333333333333, -0.09523809523809523], [0.2857142857142857, -0.14285714285714285], [0.23809523809523808, -0.23809523809523808], [0.19047619047619047, -0.42857142857142855], [0.19047619047619047, -0.6666666666666666], [0.23809523809523808, -0.8571428571428571], [0.2857142857142857, -0.9523809523809523], [0.3333333333333333, -1.0], [0.42857142857142855, -1.0476190476190474]]], "w": 0.9523809523809523}, "3": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.7619047619047619, -1.0476190476190474], [0.42857142857142855, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.2857142857142857, -0.047619047619047616], [0.19047619047619047, -0.09523809523809523], [0.14285714285714285, -0.14285714285714285]]], "w": 0.9523809523809523}, "2": {"l": [[[0.19047619047619047, -0.9523809523809523], [0.23809523809523808, -1.0], [0.3333333333333333, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666666, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.7619047619047619], [0.7142857142857142, -0.6190476190476191], [0.14285714285714285, -0.047619047619047616], [0.7619047619047619, -0.047619047619047616]]], "w": 0.9523809523809523}, "5": {"l": [[[0.7142857142857142, -1.0476190476190474], [0.23809523809523808, -1.0476190476190474], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6190476190476191], [0.3333333333333333, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.14285714285714285]]], "w": 0.9523809523809523}, "4": {"l": [[[0.6666666666666666, -0.7142857142857142], [0.6666666666666666, -0.047619047619047616]], [[0.42857142857142855, -1.0952380952380951], [0.19047619047619047, -0.38095238095238093], [0.8095238095238095, -0.38095238095238093]]], "w": 0.9523809523809523}, "7": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.8095238095238095, -1.0476190476190474], [0.38095238095238093, -0.047619047619047616]]], "w": 0.9523809523809523}, "6": {"l": [[[0.6666666666666666, -1.0476190476190474], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -1.0], [0.3333333333333333, -0.9523809523809523], [0.23809523809523808, -0.8095238095238095], [0.19047619047619047, -0.6190476190476191], [0.19047619047619047, -0.23809523809523808], [0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.47619047619047616], [0.7142857142857142, -0.5714285714285714], [0.6666666666666666, -0.6190476190476191], [0.5714285714285714, -0.6666666666666666], [0.38095238095238093, -0.6666666666666666], [0.2857142857142857, -0.6190476190476191], [0.23809523809523808, -0.5714285714285714], [0.19047619047619047, -0.47619047619047616]]], "w": 0.9523809523809523}, "A": {"l": [[[0.19047619047619047, -0.3333333333333333], [0.6666666666666666, -0.3333333333333333]], [[0.09523809523809523, -0.047619047619047616], [0.42857142857142855, -1.0476190476190474], [0.7619047619047619, -0.047619047619047616]]], "w": 0.8571428571428571}, "C": {"l": [[[0.8095238095238095, -0.14285714285714285], [0.7619047619047619, -0.09523809523809523], [0.6190476190476191, -0.047619047619047616], [0.5238095238095237, -0.047619047619047616], [0.38095238095238093, -0.09523809523809523], [0.2857142857142857, -0.19047619047619047], [0.23809523809523808, -0.2857142857142857], [0.19047619047619047, -0.47619047619047616], [0.19047619047619047, -0.6190476190476191], [0.23809523809523808, -0.8095238095238095], [0.2857142857142857, -0.9047619047619047], [0.38095238095238093, -1.0], [0.5238095238095237, -1.0476190476190474], [0.6190476190476191, -1.0476190476190474], [0.7619047619047619, -1.0], [0.8095238095238095, -0.9523809523809523]]], "w": 1.0}, "B": {"l": [[[0.5714285714285714, -0.5714285714285714], [0.7142857142857142, -0.5238095238095237], [0.7619047619047619, -0.47619047619047616], [0.8095238095238094, -0.38095238095238093], [0.8095238095238094, -0.23809523809523808], [0.7619047619047619, -0.14285714285714285], [0.7142857142857142, -0.09523809523809523], [0.619047619047619, -0.047619047619047616], [0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666665, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.7619047619047619], [0.7142857142857142, -0.6666666666666666], [0.6666666666666665, -0.6190476190476191], [0.5714285714285714, -0.5714285714285714], [0.23809523809523803, -0.5714285714285714]]], "w": 1.0}, "E": {"l": [[[0.23809523809523808, -0.5714285714285714], [0.5714285714285714, -0.5714285714285714]], [[0.7142857142857142, -0.047619047619047616], [0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474], [0.7142857142857142, -1.0476190476190474]]], "w": 0.9047619047619047}, "D": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.4761904761904761, -1.0476190476190474], [0.619047619047619, -1.0], [0.7142857142857142, -0.9047619047619047], [0.7619047619047619, -0.8095238095238095], [0.8095238095238094, -0.6190476190476191], [0.8095238095238094, -0.47619047619047616], [0.7619047619047619, -0.2857142857142857], [0.7142857142857142, -0.19047619047619047], [0.619047619047619, -0.09523809523809523], [0.4761904761904761, -0.047619047619047616], [0.23809523809523803, -0.047619047619047616]]], "w": 1.0}, "G": {"l": [[[0.7619047619047619, -1.0], [0.6666666666666666, -1.0476190476190474], [0.5238095238095237, -1.0476190476190474], [0.38095238095238093, -1.0], [0.2857142857142857, -0.9047619047619047], [0.23809523809523808, -0.8095238095238095], [0.19047619047619047, -0.6190476190476191], [0.19047619047619047, -0.47619047619047616], [0.23809523809523808, -0.2857142857142857], [0.2857142857142857, -0.19047619047619047], [0.38095238095238093, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.6190476190476191, -0.047619047619047616], [0.7619047619047619, -0.09523809523809523], [0.8095238095238095, -0.14285714285714285], [0.8095238095238095, -0.47619047619047616], [0.6190476190476191, -0.47619047619047616]]], "w": 1.0}, "F": {"l": [[[0.5714285714285714, -0.5714285714285714], [0.23809523809523808, -0.5714285714285714]], [[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474], [0.7142857142857142, -1.0476190476190474]]], "w": 0.8571428571428571}, "I": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]]], "w": 0.47619047619047616}, "H": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474]], [[0.23809523809523803, -0.5714285714285714], [0.8095238095238094, -0.5714285714285714]], [[0.8095238095238094, -0.047619047619047616], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "J": {"l": [[[0.5238095238095237, -1.0476190476190474], [0.5238095238095237, -0.3333333333333333], [0.47619047619047616, -0.19047619047619047], [0.38095238095238093, -0.09523809523809523], [0.23809523809523808, -0.047619047619047616], [0.14285714285714285, -0.047619047619047616]]], "w": 0.7619047619047619}, "M": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474], [0.5714285714285714, -0.3333333333333333], [0.9047619047619047, -1.0476190476190474], [0.9047619047619047, -0.047619047619047616]]], "w": 1.1428571428571428}, "L": {"l": [[[0.7142857142857142, -0.047619047619047616], [0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]]], "w": 0.8095238095238095}, "O": {"l": [[[0.4285714285714285, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.8095238095238094, -0.9047619047619047], [0.857142857142857, -0.7142857142857142], [0.857142857142857, -0.38095238095238093], [0.8095238095238094, -0.19047619047619047], [0.7142857142857142, -0.09523809523809523], [0.619047619047619, -0.047619047619047616], [0.4285714285714285, -0.047619047619047616], [0.33333333333333326, -0.09523809523809523], [0.23809523809523803, -0.19047619047619047], [0.1904761904761904, -0.38095238095238093], [0.1904761904761904, -0.7142857142857142], [0.23809523809523803, -0.9047619047619047], [0.33333333333333326, -1.0], [0.4285714285714285, -1.0476190476190474]]], "w": 1.0476190476190474}, "N": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.8095238095238094, -0.047619047619047616], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "Q": {"l": [[[0.9047619047619047, 0.047619047619047616], [0.8095238095238094, 0.0], [0.7142857142857142, -0.09523809523809523], [0.5714285714285714, -0.23809523809523808], [0.4761904761904761, -0.2857142857142857], [0.3809523809523809, -0.2857142857142857]], [[0.4285714285714285, -0.047619047619047616], [0.33333333333333326, -0.09523809523809523], [0.23809523809523803, -0.19047619047619047], [0.1904761904761904, -0.38095238095238093], [0.1904761904761904, -0.7142857142857142], [0.23809523809523803, -0.9047619047619047], [0.33333333333333326, -1.0], [0.4285714285714285, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.8095238095238094, -0.9047619047619047], [0.857142857142857, -0.7142857142857142], [0.857142857142857, -0.38095238095238093], [0.8095238095238094, -0.19047619047619047], [0.7142857142857142, -0.09523809523809523], [0.619047619047619, -0.047619047619047616], [0.4285714285714285, -0.047619047619047616]]], "w": 1.0476190476190474}, "P": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "S": {"l": [[[0.19047619047619047, -0.09523809523809523], [0.3333333333333333, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.3333333333333333], [0.7142857142857142, -0.42857142857142855], [0.6666666666666666, -0.47619047619047616], [0.5714285714285714, -0.5238095238095237], [0.38095238095238093, -0.5714285714285714], [0.2857142857142857, -0.6190476190476191], [0.23809523809523808, -0.6666666666666666], [0.19047619047619047, -0.7619047619047619], [0.19047619047619047, -0.8571428571428571], [0.23809523809523808, -0.9523809523809523], [0.2857142857142857, -1.0], [0.38095238095238093, -1.0476190476190474], [0.6190476190476191, -1.0476190476190474], [0.7619047619047619, -1.0]]], "w": 0.9523809523809523}, "R": {"l": [[[0.8095238095238094, -0.047619047619047616], [0.4761904761904761, -0.5238095238095237]], [[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "U": {"l": [[[0.23809523809523803, -1.0476190476190474], [0.23809523809523803, -0.23809523809523808], [0.28571428571428564, -0.14285714285714285], [0.33333333333333326, -0.09523809523809523], [0.4285714285714285, -0.047619047619047616], [0.619047619047619, -0.047619047619047616], [0.7142857142857142, -0.09523809523809523], [0.7619047619047619, -0.14285714285714285], [0.8095238095238094, -0.23809523809523808], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "T": {"l": [[[0.09523809523809523, -1.0476190476190474], [0.6666666666666666, -1.0476190476190474]], [[0.38095238095238093, -0.047619047619047616], [0.38095238095238093, -1.0476190476190474]]], "w": 0.7619047619047619}, "V": {"l": [[[0.09523809523809523, -1.0476190476190474], [0.42857142857142855, -0.047619047619047616], [0.7619047619047619, -1.0476190476190474]]], "w": 0.8571428571428571}, "a": {"l": [[[0.6666666666666666, -0.047619047619047616], [0.6666666666666666, -0.5714285714285714], [0.6190476190476191, -0.6666666666666666], [0.5238095238095237, -0.7142857142857142], [0.3333333333333333, -0.7142857142857142], [0.23809523809523808, -0.6666666666666666]], [[0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.19047619047619047], [0.19047619047619047, -0.2857142857142857], [0.23809523809523808, -0.38095238095238093], [0.3333333333333333, -0.42857142857142855], [0.5714285714285714, -0.42857142857142855], [0.6666666666666666, -0.47619047619047616]]], "w": 0.9047619047619047}, "e": {"l": [[[0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.19047619047619047], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6666666666666666], [0.3333333333333333, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.5714285714285714], [0.6666666666666666, -0.47619047619047616], [0.19047619047619047, -0.38095238095238093]]], "w": 0.8571428571428571}, "f": {"l": [[[0.09523809523809523, -0.7142857142857142], [0.47619047619047616, -0.7142857142857142]], [[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.9047619047619047], [0.2857142857142857, -1.0], [0.38095238095238093, -1.0476190476190474], [0.47619047619047616, -1.0476190476190474]]], "w": 0.5714285714285714}, "i": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.7142857142857142]], [[0.23809523809523808, -1.0476190476190474], [0.19047619047619047, -1.0], [0.23809523809523808, -0.9523809523809523], [0.2857142857142857, -1.0], [0.23809523809523808, -1.0476190476190474], [0.23809523809523808, -0.9523809523809523]]], "w": 0.47619047619047616}, "h": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]], [[0.6666666666666666, -0.047619047619047616], [0.6666666666666666, -0.5714285714285714], [0.6190476190476191, -0.6666666666666666], [0.5238095238095237, -0.7142857142857142], [0.38095238095238093, -0.7142857142857142], [0.2857142857142857, -0.6666666666666666], [0.23809523809523808, -0.6190476190476191]]], "w": 0.9047619047619047}, "k": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]], [[0.3333333333333333, -0.42857142857142855], [0.6190476190476191, -0.047619047619047616]], [[0.6190476190476191, -0.7142857142857142], [0.23809523809523808, -0.3333333333333333]]], "w": 0.8095238095238095}, "m": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.7142857142857142]], [[0.23809523809523808, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.38095238095238093, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.5714285714285714], [0.6666666666666666, -0.047619047619047616]], [[0.6666666666666666, -0.5714285714285714], [0.7142857142857142, -0.6666666666666666], [0.8095238095238095, -0.7142857142857142], [0.9523809523809523, -0.7142857142857142], [1.0476190476190474, -0.6666666666666666], [1.0952380952380951, -0.5714285714285714], [1.0952380952380951, -0.047619047619047616]]], "w": 1.3333333333333333}, "o": {"l": [[[0.38095238095238093, -0.047619047619047616], [0.2857142857142857, -0.09523809523809523], [0.23809523809523808, -0.14285714285714285], [0.19047619047619047, -0.23809523809523808], [0.19047619047619047, -0.5238095238095237], [0.23809523809523808, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.38095238095238093, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5238095238095237], [0.7142857142857142, -0.23809523809523808], [0.6666666666666666, -0.14285714285714285], [0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.38095238095238093, -0.047619047619047616]]], "w": 0.9047619047619047}, "n": {"l": [[[0.23809523809523808, -0.7142857142857142], [0.23809523809523808, -0.047619047619047616]], [[0.23809523809523808, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.38095238095238093, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.5714285714285714], [0.6666666666666666, -0.047619047619047616]]], "w": 0.9047619047619047}, "p": {"l": [[[0.23809523809523808, -0.7142857142857142], [0.23809523809523808, 0.2857142857142857]], [[0.23809523809523808, -0.6666666666666666], [0.3333333333333333, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5238095238095237], [0.7142857142857142, -0.23809523809523808], [0.6666666666666666, -0.14285714285714285], [0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523]]], "w": 0.9047619047619047}, "s": {"l": [[[0.19047619047619047, -0.09523809523809523], [0.2857142857142857, -0.047619047619047616], [0.47619047619047616, -0.047619047619047616], [0.5714285714285714, -0.09523809523809523], [0.6190476190476191, -0.19047619047619047], [0.6190476190476191, -0.23809523809523808], [0.5714285714285714, -0.3333333333333333], [0.47619047619047616, -0.38095238095238093], [0.3333333333333333, -0.38095238095238093], [0.23809523809523808, -0.42857142857142855], [0.19047619047619047, -0.5238095238095237], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6666666666666666], [0.3333333333333333, -0.7142857142857142], [0.47619047619047616, -0.7142857142857142], [0.5714285714285714, -0.6666666666666666]]], "w": 0.8095238095238095}, "r": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.7142857142857142]], [[0.23809523809523808, -0.5238095238095237], [0.2857142857142857, -0.6190476190476191], [0.3333333333333333, -0.6666666666666666], [0.42857142857142855, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142]]], "w": 0.6190476190476191}, "u": {"l": [[[0.6666666666666666, -0.7142857142857142], [0.6666666666666666, -0.047619047619047616]], [[0.23809523809523808, -0.7142857142857142], [0.23809523809523808, -0.19047619047619047], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5238095238095237, -0.047619047619047616], [0.6190476190476191, -0.09523809523809523], [0.6666666666666666, -0.14285714285714285]]], "w": 0.9047619047619047}, "t": {"l": [[[0.09523809523809523, -0.7142857142857142], [0.47619047619047616, -0.7142857142857142]], [[0.23809523809523808, -1.0476190476190474], [0.23809523809523808, -0.19047619047619047], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.47619047619047616, -0.047619047619047616]]], "w": 0.5714285714285714}, "w": {"l": [[[0.1428571428571428, -0.7142857142857142], [0.33333333333333326, -0.047619047619047616], [0.5238095238095237, -0.5238095238095237], [0.7142857142857142, -0.047619047619047616], [0.9047619047619047, -0.7142857142857142]]], "w": 1.0476190476190474}}, "modules": [{"layer": "F", "center": [171.4, 95.89999999999999], "pads": [{"layers": ["F", "B"], "angle": -180.0, "pos": [130.76, 95.89999999999999], "drillsize": [1.2, 1.2], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [2.4, 2.4]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [171.4, 95.89999999999999], "drillsize": [1.2, 1.2], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.4, 2.4]}], "drawings": [], "ref": "R2", "bbox": {"pos": [129.274999, 91.024999], "size": [43.600001999999996, 9.750002]}}, {"layer": "F", "center": [178.04999999999998, 91.1], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [176.7, 91.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -0.0, "pos": [179.4, 91.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R6", "bbox": {"pos": [175.67499899999999, 90.159999], "size": [4.750001999999999, 1.880002]}}, {"layer": "F", "center": [184.35, 91.1], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [185.7, 91.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [183.0, 91.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "D2", "bbox": {"pos": [181.974999, 90.174999], "size": [4.750001999999999, 1.850002]}}, {"layer": "F", "center": [184.35, 85.1], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [183.0, 85.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [185.7, 85.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "D1", "bbox": {"pos": [181.974999, 84.174999], "size": [4.750001999999999, 1.850002]}}, {"layer": "F", "center": [178.04999999999998, 85.1], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [179.4, 85.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -0.0, "pos": [176.7, 85.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R1", "bbox": {"pos": [175.67499899999999, 84.159999], "size": [4.750001999999999, 1.880002]}}, {"layer": "F", "center": [141.5, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [149.0, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [146.5, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [144.0, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [141.5, 86.8], "drillsize": [1.0, 1.0], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J1", "bbox": {"pos": [138.52499899999998, 83.924999], "size": [13.450002, 6.800002]}}, {"layer": "F", "center": [156.4, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [161.4, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [158.9, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [156.4, 86.8], "drillsize": [1.0, 1.0], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J2", "bbox": {"pos": [153.42499899999999, 83.924999], "size": [10.950002, 6.800002]}}, {"layer": "F", "center": [168.79999999999998, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [171.29999999999998, 86.8], "drillsize": [1.05, 1.05], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [168.79999999999998, 86.8], "drillsize": [1.05, 1.05], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J4", "bbox": {"pos": [165.824999, 83.924999], "size": [8.450002, 6.800002]}}, {"layer": "F", "center": [156.0, 95.94999999999999], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [156.0, 94.6], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -90.0, "pos": [156.0, 97.3], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R5", "bbox": {"pos": [155.059999, 93.57499899999999], "size": [1.880002, 4.750001999999999]}}, {"layer": "F", "center": [165.000001, 95.6], "pads": [{"layers": ["F", "B"], "angle": -270.0, "pos": [165.000001, 95.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [159.92000099999998, 95.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [162.460001, 95.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}], "drawings": [], "ref": "Q2", "bbox": {"pos": [158.885, 93.564999], "size": [7.150002, 4.790001999999999]}}, {"layer": "F", "center": [131.5, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [131.5, 86.8], "drillsize": [1.05, 1.05], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [134.0, 86.8], "drillsize": [1.05, 1.05], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J3", "bbox": {"pos": [128.524999, 83.924999], "size": [8.450002, 6.800001]}}, {"layer": "F", "center": [147.79999999999998, 95.5], "pads": [{"layers": ["F", "B"], "angle": -270.0, "pos": [147.79999999999998, 95.5], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [142.72, 95.5], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [145.26, 95.5], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}], "drawings": [], "ref": "Q1", "bbox": {"pos": [141.684999, 93.46499899999999], "size": [7.150002, 4.790001999999999]}}, {"layer": "F", "center": [151.0, 95.94999999999999], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [151.0, 97.3], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -270.0, "pos": [151.0, 94.6], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R3", "bbox": {"pos": [150.059999, 93.57499899999999], "size": [1.880002, 4.750001999999999]}}, {"layer": "F", "center": [136.25, 95.5], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [136.25, 96.85], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -90.0, "pos": [136.25, 94.14999999999999], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R4", "bbox": {"pos": [135.309999, 93.124999], "size": [1.880002, 4.750001999999999]}}, {"layer": "F", "center": [123.19, 98.044], "pads": [], "drawings": [], "ref": "REF***", "bbox": {"pos": [118.788845, 94.326691], "size": [8.80231, 7.452731999999999]}}], "edges": [{"start": [115.057082, 97.94291799999999], "radius": 3.1999999999999997, "type": "circle", "width": 0.09999999999999999}, {"start": [190.199999, 83.8], "end": [190.199999, 99.8], "type": "segment", "width": 0.09999999999999999}, {"width": 0.09999999999999999, "endangle": 0.0, "start": [187.2, 83.8], "radius": 2.999999, "startangle": -90.0, "type": "arc"}, {"start": [185.342918, 97.94291799999999], "radius": 3.1999999999999997, "type": "circle", "width": 0.09999999999999999}, {"width": 0.09999999999999999, "endangle": 90.00001909859319, "start": [187.200001, 99.8], "radius": 3.0, "startangle": 1.9098593179478487e-05, "type": "arc"}, {"start": [187.2, 102.8], "end": [113.19999999999999, 102.8], "type": "segment", "width": 0.09999999999999999}, {"width": 0.09999999999999999, "endangle": 270.0, "start": [113.19999999999999, 83.8], "radius": 3.0, "startangle": 180.0, "type": "arc"}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [113.19999999999999, 99.8], "radius": 3.0000009999999997, "startangle": 90.0, "type": "arc"}, {"start": [113.19999999999999, 80.8], "end": [187.2, 80.800001], "type": "segment", "width": 0.09999999999999999}, {"start": [110.19999899999999, 99.8], "end": [110.19999999999999, 83.800001], "type": "segment", "width": 0.09999999999999999}], "bom": {"both": [[2, "470", "R_0805_HandSoldering", [["R1", 4], ["R6", 1]], []], [1, "4.7", "R_0805_HandSoldering", [["R3", 12]], []], [1, "1k", "R_0805_HandSoldering", [["R4", 13]], []], [1, "4.7k", "R_0805_HandSoldering", [["R5", 8]], []], [1, "27", "R_Axial_Power_L38.0mm_W9.0mm_P40.64mm", [["R2", 0]], []], [1, "HEATon", "LED_0805_HandSoldering", [["D1", 3]], []], [1, "FANon", "LED_0805_HandSoldering", [["D2", 2]], []], [2, "BC517", "TO-92_Inline_Wide", [["Q1", 11], ["Q2", 9]], []], [1, "thermistor", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J3", 10]], []], [1, "fan", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J4", 7]], []], [1, "MCUpins", "JST_XH_B03B-XH-A_03x2.50mm_Straight", [["J2", 6]], []], [1, "power Input", "JST_XH_B04B-XH-A_04x2.50mm_Straight", [["J1", 5]], []]], "B": [], "F": [[2, "470", "R_0805_HandSoldering", [["R1", 4], ["R6", 1]], []], [1, "4.7", "R_0805_HandSoldering", [["R3", 12]], []], [1, "1k", "R_0805_HandSoldering", [["R4", 13]], []], [1, "4.7k", "R_0805_HandSoldering", [["R5", 8]], []], [1, "27", "R_Axial_Power_L38.0mm_W9.0mm_P40.64mm", [["R2", 0]], []], [1, "HEATon", "LED_0805_HandSoldering", [["D1", 3]], []], [1, "FANon", "LED_0805_HandSoldering", [["D2", 2]], []], [2, "BC517", "TO-92_Inline_Wide", [["Q1", 11], ["Q2", 9]], []], [1, "thermistor", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J3", 10]], []], [1, "fan", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J4", 7]], []], [1, "MCUpins", "JST_XH_B03B-XH-A_03x2.50mm_Straight", [["J2", 6]], []], [1, "power Input", "JST_XH_B04B-XH-A_04x2.50mm_Straight", [["J1", 5]], []]]}, "silkscreen": {"B": [], "F": [{"width": 1.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "heater\n", "thickness": 0.19999999999999998, "pos": [177.79999999999998, 97.536], "height": 1.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "temp", "thickness": 0.09999999999999999, "pos": [161.4, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "GND", "thickness": 0.09999999999999999, "pos": [141.5, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "5V", "thickness": 0.09999999999999999, "pos": [144.0, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "12V", "thickness": 0.09999999999999999, "pos": [146.4, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "heat\n", "thickness": 0.09999999999999999, "pos": [158.9, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "fan\n", "thickness": 0.09999999999999999, "pos": [156.4, 83.5], "height": 0.5}, {"width": 2.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "OpenPLC\nFOSSEE", "thickness": 0.39999999999999997, "pos": [120.142, 87.37599999999999], "height": 2.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "R2", "thickness": 0.15, "pos": [151.07999999999998, 101.46], "height": 1.0}, {"start": [132.01999999999998, 91.33999999999999], "end": [132.01999999999998, 94.52], "type": "segment", "width": 0.12}, {"start": [170.14, 91.33999999999999], "end": [132.01999999999998, 91.33999999999999], "type": "segment", "width": 0.12}, {"start": [170.14, 94.52], "end": [170.14, 91.33999999999999], "type": "segment", "width": 0.12}, {"start": [132.01999999999998, 100.46], "end": [132.01999999999998, 97.28], "type": "segment", "width": 0.12}, {"start": [170.14, 100.46], "end": [132.01999999999998, 100.46], "type": "segment", "width": 0.12}, {"start": [170.14, 97.28], "end": [170.14, 100.46], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "R6", "thickness": 0.15, "pos": [178.04999999999998, 89.39999999999999], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "470", "thickness": 0.15, "pos": [178.04999999999998, 92.85], "height": 1.0}, {"start": [178.65, 91.97999999999999], "end": [177.45, 91.97999999999999], "type": "segment", "width": 0.12}, {"start": [177.45, 90.22], "end": [178.65, 90.22], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "D2", "thickness": 0.15, "pos": [184.35, 92.8], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "FANon", "thickness": 0.15, "pos": [184.35, 89.35], "height": 1.0}, {"start": [183.35, 90.35], "end": [186.54999999999998, 90.35], "type": "segment", "width": 0.12}, {"start": [186.54999999999998, 91.85], "end": [183.35, 91.85], "type": "segment", "width": 0.12}, {"start": [186.54999999999998, 91.85], "end": [186.54999999999998, 90.35], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "D1", "thickness": 0.15, "pos": [184.35, 86.8], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "HEATon", "thickness": 0.15, "pos": [184.35, 83.35], "height": 1.0}, {"start": [186.54999999999998, 85.85], "end": [186.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [186.54999999999998, 85.85], "end": [183.35, 85.85], "type": "segment", "width": 0.12}, {"start": [183.35, 84.35], "end": [186.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "R1", "thickness": 0.15, "pos": [178.04999999999998, 83.39999999999999], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "470", "thickness": 0.15, "pos": [178.04999999999998, 86.85], "height": 1.0}, {"start": [177.45, 84.22], "end": [178.65, 84.22], "type": "segment", "width": 0.12}, {"start": [178.65, 85.97999999999999], "end": [177.45, 85.97999999999999], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J1", "thickness": 0.13999999999999999, "pos": [152.7, 86.8], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "power Input", "thickness": 0.15, "pos": [145.29999999999998, 81.89999999999999], "height": 1.0}, {"start": [138.65, 84.05], "end": [138.65, 86.55], "type": "segment", "width": 0.12}, {"start": [141.15, 84.05], "end": [138.65, 84.05], "type": "segment", "width": 0.12}, {"start": [150.79999999999998, 89.55], "end": [145.25, 89.55], "type": "segment", "width": 0.12}, {"start": [150.79999999999998, 86.6], "end": [150.79999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 86.6], "end": [150.79999999999998, 86.6], "type": "segment", "width": 0.12}, {"start": [139.7, 89.55], "end": [145.25, 89.55], "type": "segment", "width": 0.12}, {"start": [139.7, 86.6], "end": [139.7, 89.55], "type": "segment", "width": 0.12}, {"start": [138.95, 86.6], "end": [139.7, 86.6], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 84.35], "end": [149.75, 84.35], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 85.1], "end": [151.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [149.75, 85.1], "end": [151.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [149.75, 84.35], "end": [149.75, 85.1], "type": "segment", "width": 0.12}, {"start": [140.75, 84.35], "end": [138.95, 84.35], "type": "segment", "width": 0.12}, {"start": [140.75, 85.1], "end": [140.75, 84.35], "type": "segment", "width": 0.12}, {"start": [138.95, 85.1], "end": [140.75, 85.1], "type": "segment", "width": 0.12}, {"start": [138.95, 84.35], "end": [138.95, 85.1], "type": "segment", "width": 0.12}, {"start": [148.25, 84.35], "end": [142.25, 84.35], "type": "segment", "width": 0.12}, {"start": [148.25, 85.1], "end": [148.25, 84.35], "type": "segment", "width": 0.12}, {"start": [142.25, 85.1], "end": [148.25, 85.1], "type": "segment", "width": 0.12}, {"start": [142.25, 84.35], "end": [142.25, 85.1], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 84.35], "end": [138.95, 84.35], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 90.3], "end": [151.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [138.95, 90.3], "end": [151.54999999999998, 90.3], "type": "segment", "width": 0.12}, {"start": [138.95, 84.35], "end": [138.95, 90.3], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J2", "thickness": 0.13999999999999999, "pos": [165.1, 87.1], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "MCUpins", "thickness": 0.15, "pos": [158.9, 81.89999999999999], "height": 1.0}, {"start": [153.54999999999998, 84.05], "end": [153.54999999999998, 86.55], "type": "segment", "width": 0.12}, {"start": [156.04999999999998, 84.05], "end": [153.54999999999998, 84.05], "type": "segment", "width": 0.12}, {"start": [163.2, 89.55], "end": [158.9, 89.55], "type": "segment", "width": 0.12}, {"start": [163.2, 86.6], "end": [163.2, 89.55], "type": "segment", "width": 0.12}, {"start": [163.95, 86.6], "end": [163.2, 86.6], "type": "segment", "width": 0.12}, {"start": [154.6, 89.55], "end": [158.9, 89.55], "type": "segment", "width": 0.12}, {"start": [154.6, 86.6], "end": [154.6, 89.55], "type": "segment", "width": 0.12}, {"start": [153.85, 86.6], "end": [154.6, 86.6], "type": "segment", "width": 0.12}, {"start": [163.95, 84.35], "end": [162.15, 84.35], "type": "segment", "width": 0.12}, {"start": [163.95, 85.1], "end": [163.95, 84.35], "type": "segment", "width": 0.12}, {"start": [162.15, 85.1], "end": [163.95, 85.1], "type": "segment", "width": 0.12}, {"start": [162.15, 84.35], "end": [162.15, 85.1], "type": "segment", "width": 0.12}, {"start": [155.65, 84.35], "end": [153.85, 84.35], "type": "segment", "width": 0.12}, {"start": [155.65, 85.1], "end": [155.65, 84.35], "type": "segment", "width": 0.12}, {"start": [153.85, 85.1], "end": [155.65, 85.1], "type": "segment", "width": 0.12}, {"start": [153.85, 84.35], "end": [153.85, 85.1], "type": "segment", "width": 0.12}, {"start": [160.65, 84.35], "end": [157.15, 84.35], "type": "segment", "width": 0.12}, {"start": [160.65, 85.1], "end": [160.65, 84.35], "type": "segment", "width": 0.12}, {"start": [157.15, 85.1], "end": [160.65, 85.1], "type": "segment", "width": 0.12}, {"start": [157.15, 84.35], "end": [157.15, 85.1], "type": "segment", "width": 0.12}, {"start": [163.95, 84.35], "end": [153.85, 84.35], "type": "segment", "width": 0.12}, {"start": [163.95, 90.3], "end": [163.95, 84.35], "type": "segment", "width": 0.12}, {"start": [153.85, 90.3], "end": [163.95, 90.3], "type": "segment", "width": 0.12}, {"start": [153.85, 84.35], "end": [153.85, 90.3], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J4", "thickness": 0.13999999999999999, "pos": [175.1, 87.1], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "fan", "thickness": 0.15, "pos": [170.04999999999998, 81.89999999999999], "height": 1.0}, {"start": [165.95, 84.05], "end": [165.95, 86.55], "type": "segment", "width": 0.12}, {"start": [168.45, 84.05], "end": [165.95, 84.05], "type": "segment", "width": 0.12}, {"start": [173.1, 89.55], "end": [170.04999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [173.1, 86.6], "end": [173.1, 89.55], "type": "segment", "width": 0.12}, {"start": [173.85, 86.6], "end": [173.1, 86.6], "type": "segment", "width": 0.12}, {"start": [167.0, 89.55], "end": [170.04999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [167.0, 86.6], "end": [167.0, 89.55], "type": "segment", "width": 0.12}, {"start": [166.25, 86.6], "end": [167.0, 86.6], "type": "segment", "width": 0.12}, {"start": [173.85, 84.35], "end": [172.04999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [173.85, 85.1], "end": [173.85, 84.35], "type": "segment", "width": 0.12}, {"start": [172.04999999999998, 85.1], "end": [173.85, 85.1], "type": "segment", "width": 0.12}, {"start": [172.04999999999998, 84.35], "end": [172.04999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [168.04999999999998, 84.35], "end": [166.25, 84.35], "type": "segment", "width": 0.12}, {"start": [168.04999999999998, 85.1], "end": [168.04999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [166.25, 85.1], "end": [168.04999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [166.25, 84.35], "end": [166.25, 85.1], "type": "segment", "width": 0.12}, {"start": [170.54999999999998, 84.35], "end": [169.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [170.54999999999998, 85.1], "end": [170.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [169.54999999999998, 85.1], "end": [170.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [169.54999999999998, 84.35], "end": [169.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [173.85, 84.35], "end": [166.25, 84.35], "type": "segment", "width": 0.12}, {"start": [173.85, 90.3], "end": [173.85, 84.35], "type": "segment", "width": 0.12}, {"start": [166.25, 90.3], "end": [173.85, 90.3], "type": "segment", "width": 0.12}, {"start": [166.25, 84.35], "end": [166.25, 90.3], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "R5", "thickness": 0.15, "pos": [156.2, 99.19999999999999], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "4.7k", "thickness": 0.15, "pos": [155.79999999999998, 92.8], "height": 1.0}, {"start": [155.12, 96.55], "end": [155.12, 95.35], "type": "segment", "width": 0.12}, {"start": [156.88, 95.35], "end": [156.88, 96.55], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "Q2", "thickness": 0.15, "pos": [162.460001, 99.16], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "BC517", "thickness": 0.15, "pos": [162.460001, 92.81], "height": 1.0}, {"width": 0.12, "endangle": 225.78482460299193, "start": [162.460001, 95.6], "radius": 2.581182, "startangle": 205.78482460299193, "type": "arc"}, {"width": 0.12, "endangle": 155.0, "start": [162.460001, 95.6], "radius": 2.6, "startangle": 90.0, "type": "arc"}, {"width": 0.12, "endangle": 90.0, "start": [162.460001, 95.6], "radius": 2.6, "startangle": 25.0, "type": "arc"}, {"width": 0.12, "endangle": 334.2151753970081, "start": [162.460001, 95.6], "radius": 2.581182, "startangle": 314.2151753970081, "type": "arc"}, {"start": [164.260001, 93.75], "end": [160.660001, 93.75], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J3", "thickness": 0.13999999999999999, "pos": [137.7, 86.8], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "thermistor", "thickness": 0.15, "pos": [132.5, 82.0], "height": 1.0}, {"start": [128.95, 84.35], "end": [128.95, 90.3], "type": "segment", "width": 0.12}, {"start": [128.95, 90.3], "end": [136.54999999999998, 90.3], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 90.3], "end": [136.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 84.35], "end": [128.95, 84.35], "type": "segment", "width": 0.12}, {"start": [132.25, 84.349999], "end": [132.250001, 85.1], "type": "segment", "width": 0.12}, {"start": [132.250001, 85.1], "end": [133.249999, 85.1], "type": "segment", "width": 0.12}, {"start": [133.249999, 85.1], "end": [133.249999, 84.35], "type": "segment", "width": 0.12}, {"start": [133.249999, 84.35], "end": [132.25, 84.349999], "type": "segment", "width": 0.12}, {"start": [128.95, 84.35], "end": [128.95, 85.1], "type": "segment", "width": 0.12}, {"start": [128.95, 85.1], "end": [130.749999, 85.1], "type": "segment", "width": 0.12}, {"start": [130.749999, 85.1], "end": [130.75, 84.349999], "type": "segment", "width": 0.12}, {"start": [130.75, 84.349999], "end": [128.95, 84.35], "type": "segment", "width": 0.12}, {"start": [134.75, 84.349999], "end": [134.750001, 85.1], "type": "segment", "width": 0.12}, {"start": [134.750001, 85.1], "end": [136.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 85.1], "end": [136.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 84.35], "end": [134.75, 84.349999], "type": "segment", "width": 0.12}, {"start": [128.95, 86.6], "end": [129.7, 86.6], "type": "segment", "width": 0.12}, {"start": [129.7, 86.6], "end": [129.7, 89.55], "type": "segment", "width": 0.12}, {"start": [129.7, 89.55], "end": [132.75, 89.55], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 86.6], "end": [135.79999999999998, 86.6], "type": "segment", "width": 0.12}, {"start": [135.79999999999998, 86.6], "end": [135.79999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [135.79999999999998, 89.55], "end": [132.75, 89.55], "type": "segment", "width": 0.12}, {"start": [131.15, 84.05], "end": [128.65, 84.05], "type": "segment", "width": 0.12}, {"start": [128.65, 84.05], "end": [128.65, 86.55], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "Q1", "thickness": 0.15, "pos": [145.26, 99.06], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "BC517", "thickness": 0.15, "pos": [145.26, 92.71], "height": 1.0}, {"width": 0.12, "endangle": 225.78482460299193, "start": [145.26, 95.5], "radius": 2.581182, "startangle": 205.78482460299193, "type": "arc"}, {"width": 0.12, "endangle": 155.0, "start": [145.26, 95.5], "radius": 2.6, "startangle": 90.0, "type": "arc"}, {"width": 0.12, "endangle": 90.0, "start": [145.26, 95.5], "radius": 2.6, "startangle": 25.0, "type": "arc"}, {"width": 0.12, "endangle": 334.2151753970081, "start": [145.26, 95.5], "radius": 2.581182, "startangle": 314.2151753970081, "type": "arc"}, {"start": [147.06, 93.64999999999999], "end": [143.45999999999998, 93.64999999999999], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "R3", "thickness": 0.15, "pos": [151.1, 99.3], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "4.7", "thickness": 0.15, "pos": [150.9, 92.7], "height": 1.0}, {"start": [151.88, 95.35], "end": [151.88, 96.55], "type": "segment", "width": 0.12}, {"start": [150.12, 96.55], "end": [150.12, 95.35], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "R4", "thickness": 0.15, "pos": [136.2, 98.89999999999999], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "1k", "thickness": 0.15, "pos": [136.2, 92.3], "height": 1.0}, {"start": [137.13, 94.89999999999999], "end": [137.13, 96.1], "type": "segment", "width": 0.12}, {"start": [135.37, 96.1], "end": [135.37, 94.89999999999999], "type": "segment", "width": 0.12}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-3.231114, 2.584505], [-3.1564609999999997, 2.621727], [-3.090569, 2.690261], [-3.0724229999999997, 2.715648], [-3.0526549999999997, 2.748866], [-3.039828, 2.784945], [-3.0324899999999997, 2.8330979999999997], [-3.029187, 2.902536], [-3.0284619999999998, 2.9942059999999997], [-3.0317369999999997, 3.11983], [-3.043123, 3.2141539999999997], [-3.064959, 3.2845229999999996], [-3.0995809999999997, 3.3382859999999996], [-3.14933, 3.3827879999999997], [-3.152986, 3.385423], [-3.202015, 3.4123769999999998], [-3.261055, 3.425712], [-3.336141, 3.429], [-3.458205, 3.429], [-3.458256, 3.547497], [-3.459392, 3.613492], [-3.4663139999999997, 3.652202], [-3.4844019999999998, 3.6754189999999998], [-3.5190379999999997, 3.694933], [-3.527355, 3.6989199999999998], [-3.56628, 3.717603], [-3.5964169999999998, 3.729403], [-3.618826, 3.730422], [-3.6345669999999997, 3.716761], [-3.644698, 3.684522], [-3.650277, 3.629804], [-3.6523649999999996, 3.548711], [-3.6520189999999997, 3.437344], [-3.6502999999999997, 3.2918019999999997], [-3.6497629999999996, 3.248269], [-3.6478279999999996, 3.0982049999999997], [-3.646096, 3.0000419999999997], [-3.4583079999999997, 3.0000419999999997], [-3.457252, 3.083364], [-3.452562, 3.13788], [-3.4419489999999997, 3.173837], [-3.4231279999999997, 3.201482], [-3.4103499999999998, 3.214965], [-3.35811, 3.2544169999999997], [-3.311858, 3.257628], [-3.2641329999999997, 3.225049], [-3.262923, 3.223846], [-3.243506, 3.198668], [-3.231693, 3.164447], [-3.225735, 3.111748], [-3.22388, 3.031131], [-3.223846, 3.013271], [-3.2283299999999997, 2.9021749999999997], [-3.2429259999999998, 2.825161], [-3.2693499999999998, 2.7781469999999997], [-3.309317, 2.75705], [-3.332416, 2.754923], [-3.387238, 2.7649], [-3.424842, 2.797752], [-3.4474769999999997, 2.857857], [-3.457394, 2.949598], [-3.4583079999999997, 3.0000419999999997], [-3.646096, 3.0000419999999997], [-3.645778, 2.9820599999999997], [-3.643127, 2.894679], [-3.639394, 2.830905], [-3.634093, 2.785582], [-3.6267419999999997, 2.753555], [-3.616857, 2.7296679999999998], [-3.603954, 2.708764], [-3.5984209999999996, 2.700898], [-3.525031, 2.626595], [-3.4322399999999997, 2.584467], [-3.3249039999999996, 2.5727219999999997], [-3.231114, 2.584505]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-1.7283359999999999, 2.5950889999999998], [-1.665633, 2.631358], [-1.622039, 2.6673579999999997], [-1.590155, 2.705075], [-1.56819, 2.7511989999999997], [-1.554351, 2.812421], [-1.5468469999999999, 2.895431], [-1.543883, 3.006919], [-1.543539, 3.087062], [-1.543539, 3.382065], [-1.7096149999999999, 3.456515], [-1.719385, 3.133402], [-1.7234209999999999, 3.0127289999999998], [-1.7276559999999999, 2.925141], [-1.7329029999999999, 2.8646499999999997], [-1.7399749999999998, 2.825268], [-1.7496889999999998, 2.801007], [-1.762856, 2.7858799999999997], [-1.767081, 2.782606], [-1.831091, 2.757034], [-1.895792, 2.767153], [-1.934308, 2.794], [-1.949975, 2.813024], [-1.96082, 2.8379879999999997], [-1.967712, 2.875834], [-1.9715209999999999, 2.933502], [-1.973117, 3.017935], [-1.973385, 3.105928], [-1.9734369999999999, 3.216323], [-1.975328, 3.294463], [-1.981655, 3.347165], [-1.9950169999999998, 3.381242], [-2.018015, 3.403511], [-2.053246, 3.420787], [-2.100303, 3.438738], [-2.151697, 3.458278], [-2.1455789999999997, 3.111485], [-2.143116, 2.986468], [-2.140233, 2.894082], [-2.1361019999999997, 2.827881], [-2.129893, 2.78142], [-2.120774, 2.748256], [-2.107917, 2.7219439999999997], [-2.092416, 2.6987289999999997], [-2.017629, 2.6245689999999997], [-1.926372, 2.581684], [-1.8271169999999999, 2.571412], [-1.7283359999999999, 2.5950889999999998]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-3.9831139999999996, 2.587256], [-3.891536, 2.6354089999999997], [-3.8239509999999997, 2.7129049999999997], [-3.799943, 2.762727], [-3.781262, 2.837533], [-3.771699, 2.9320519999999997], [-3.7707919999999997, 3.0352099999999997], [-3.778079, 3.135935], [-3.793097, 3.223153], [-3.815385, 3.2857909999999997], [-3.8222349999999996, 3.296579], [-3.903368, 3.377105], [-3.9997339999999997, 3.4253359999999997], [-4.104299, 3.43945], [-4.210032, 3.417629], [-4.239457, 3.404547], [-4.296759, 3.3642309999999997], [-4.347049999999999, 3.310775], [-4.351802999999999, 3.303995], [-4.371122, 3.271321], [-4.3838919999999995, 3.2363939999999998], [-4.391436, 3.1904139999999996], [-4.3950759999999995, 3.124584], [-4.396135, 3.030105], [-4.396154, 3.008923], [-4.396106, 3.002182], [-4.200769, 3.002182], [-4.199632, 3.0913489999999997], [-4.195158999999999, 3.1505199999999998], [-4.185754, 3.188741], [-4.169824, 3.2150529999999997], [-4.1616919999999995, 3.223846], [-4.114942, 3.2572609999999997], [-4.069553, 3.255737], [-4.02366, 3.226752], [-3.996288, 3.1958089999999997], [-3.9800769999999996, 3.1506429999999996], [-3.970974, 3.07942], [-3.9703489999999997, 3.0711139999999997], [-3.9687959999999998, 2.942037], [-3.985035, 2.8461719999999997], [-4.018848, 2.7841069999999997], [-4.070016, 2.7564319999999998], [-4.08828, 2.754923], [-4.13624, 2.7625129999999998], [-4.169047, 2.788808], [-4.189105, 2.839095], [-4.198822, 2.9186639999999997], [-4.200769, 3.002182], [-4.396106, 3.002182], [-4.395426, 2.908249], [-4.392371, 2.837906], [-4.3856779999999995, 2.789163], [-4.37404, 2.753288], [-4.356147, 2.721548], [-4.352192, 2.715648], [-4.285733, 2.636104], [-4.213315, 2.5899289999999997], [-4.125151, 2.571599], [-4.095213, 2.570703], [-3.9831139999999996, 2.587256]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-2.4657459999999998, 2.599745], [-2.388714, 2.651567], [-2.3291839999999997, 2.726412], [-2.293622, 2.8216539999999997], [-2.286429, 2.891756], [-2.287246, 2.9210089999999997], [-2.294086, 2.9434069999999997], [-2.312888, 2.9634739999999997], [-2.349592, 2.9857329999999997], [-2.410138, 3.014709], [-2.500466, 3.0549269999999997], [-2.500923, 3.055129], [-2.5840669999999997, 3.09321], [-2.652247, 3.1270249999999997], [-2.698495, 3.152933], [-2.715842, 3.1672949999999997], [-2.715846, 3.167411], [-2.700557, 3.198685], [-2.6648039999999997, 3.233157], [-2.623758, 3.25799], [-2.602963, 3.262923], [-2.54623, 3.245862], [-2.497373, 3.203133], [-2.473535, 3.156155], [-2.450603, 3.1215219999999997], [-2.405682, 3.082081], [-2.352877, 3.048009], [-2.3062899999999997, 3.02948], [-2.296548, 3.0284619999999998], [-2.285582, 3.045215], [-2.2849209999999998, 3.0880389999999998], [-2.29298, 3.145781], [-2.308173, 3.207289], [-2.3289139999999997, 3.261409], [-2.329962, 3.2635099999999997], [-2.392379, 3.35066], [-2.473274, 3.409939], [-2.565144, 3.439034], [-2.660487, 3.435634], [-2.751802, 3.3974279999999997], [-2.755862, 3.394741], [-2.8276939999999997, 3.3296419999999998], [-2.874927, 3.2447049999999997], [-2.9010659999999997, 3.133021], [-2.9045739999999998, 3.1016429999999997], [-2.910787, 2.9535359999999997], [-2.903339, 2.884468], [-2.715846, 2.884468], [-2.7134099999999997, 2.927552], [-2.7000859999999998, 2.940126], [-2.666868, 2.930719], [-2.614506, 2.908483], [-2.555976, 2.88061], [-2.554521, 2.8798719999999998], [-2.504911, 2.853777], [-2.485, 2.836363], [-2.48991, 2.818107], [-2.5105839999999997, 2.79412], [-2.5631809999999997, 2.759406], [-2.619823, 2.756856], [-2.6706309999999998, 2.782119], [-2.705724, 2.830847], [-2.715846, 2.884468], [-2.903339, 2.884468], [-2.898008, 2.8350359999999997], [-2.8652219999999997, 2.741055], [-2.819579, 2.6752149999999997], [-2.737198, 2.608681], [-2.646454, 2.575676], [-2.5538149999999997, 2.5735729999999997], [-2.4657459999999998, 2.599745]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-0.840154, 2.49212], [-0.834428, 2.57198], [-0.827851, 2.619039], [-0.818738, 2.639566], [-0.805402, 2.6398289999999998], [-0.8010769999999999, 2.637378], [-0.743556, 2.619636], [-0.668732, 2.620672], [-0.592661, 2.63891], [-0.545082, 2.662505], [-0.49629799999999996, 2.700198], [-0.460636, 2.742855], [-0.43615499999999996, 2.7970569999999997], [-0.420913, 2.8693839999999997], [-0.41297, 2.9664189999999997], [-0.41038399999999997, 3.0947419999999997], [-0.410338, 3.119358], [-0.410308, 3.39587], [-0.47183899999999995, 3.4173199999999997], [-0.515541, 3.4319119999999996], [-0.5395179999999999, 3.438706], [-0.540223, 3.4387689999999997], [-0.542585, 3.4203449999999997], [-0.544594, 3.369526], [-0.546099, 3.292993], [-0.546947, 3.1974299999999998], [-0.5470769999999999, 3.139329], [-0.547349, 3.024771], [-0.548748, 2.9426669999999997], [-0.552151, 2.886393], [-0.558433, 2.849326], [-0.568471, 2.8248439999999997], [-0.583139, 2.8063249999999997], [-0.592298, 2.797406], [-0.655211, 2.761466], [-0.723864, 2.758775], [-0.786152, 2.78917], [-0.797671, 2.800144], [-0.8145669999999999, 2.820779], [-0.826286, 2.845256], [-0.8337669999999999, 2.8806469999999997], [-0.837946, 2.934026], [-0.8397629999999999, 3.012466], [-0.840154, 3.1206169999999998], [-0.840154, 3.39587], [-0.901685, 3.4173199999999997], [-0.945387, 3.4319119999999996], [-0.969364, 3.438706], [-0.97007, 3.4387689999999997], [-0.9718739999999999, 3.420069], [-0.9734999999999999, 3.3673219999999997], [-0.9748829999999999, 3.285557], [-0.975958, 3.179805], [-0.97666, 3.055094], [-0.976923, 2.916455], [-0.976923, 2.381806], [-0.849923, 2.328236], [-0.840154, 2.49212]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[0.053501, 2.626303], [0.13005999999999998, 2.654733], [0.130936, 2.6552789999999997], [0.178285, 2.690127], [0.21324099999999999, 2.730852], [0.23782499999999998, 2.783925], [0.254062, 2.855814], [0.263975, 2.952992], [0.269586, 3.081928], [0.270077, 3.100298], [0.27714099999999997, 3.377287], [0.217695, 3.408028], [0.174681, 3.4288019999999997], [0.14870999999999998, 3.438646], [0.147509, 3.4387689999999997], [0.143014, 3.420606], [0.13944399999999998, 3.371612], [0.13724799999999998, 3.3000309999999997], [0.136769, 3.2420679999999997], [0.136758, 3.14817], [0.132466, 3.089203], [0.117503, 3.061079], [0.085482, 3.059706], [0.030014, 3.0809979999999997], [-0.053731, 3.120136], [-0.115311, 3.152643], [-0.146983, 3.1808449999999997], [-0.156294, 3.211582], [-0.156308, 3.213104], [-0.14094299999999998, 3.266054], [-0.095453, 3.29466], [-0.025834, 3.298803], [0.024312999999999998, 3.298084], [0.050754, 3.3125269999999998], [0.067243, 3.347218], [0.076733, 3.391416], [0.063057, 3.416493], [0.057907, 3.420082], [0.009425, 3.4344959999999998], [-0.058469, 3.436537], [-0.128388, 3.426983], [-0.17793199999999998, 3.409522], [-0.24642999999999998, 3.351364], [-0.285366, 3.2704079999999998], [-0.293077, 3.20716], [-0.287193, 3.150111], [-0.265899, 3.103542], [-0.223735, 3.062181], [-0.155241, 3.020755], [-0.054956, 2.9739929999999997], [-0.048846, 2.9713499999999997], [0.04149, 2.929617], [0.097235, 2.895391], [0.121129, 2.864635], [0.11591299999999999, 2.8333109999999997], [0.084328, 2.797383], [0.07488299999999999, 2.789116], [0.011616999999999999, 2.757058], [-0.053936, 2.758407], [-0.111028, 2.789838], [-0.14890699999999998, 2.8480239999999997], [-0.152426, 2.8594459999999997], [-0.1867, 2.914837], [-0.23019099999999998, 2.941518], [-0.293077, 2.9679599999999997], [-0.293077, 2.899548], [-0.27394799999999997, 2.8001099999999997], [-0.217169, 2.7089019999999997], [-0.18762199999999998, 2.6783889999999997], [-0.120458, 2.6392279999999997], [-0.035044, 2.6214999999999997], [0.053501, 2.626303]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[0.7133619999999999, 2.62467], [0.802117, 2.657421], [0.874022, 2.71535], [0.902144, 2.756128], [0.9328019999999999, 2.8309539999999997], [0.9321649999999999, 2.885058], [0.899987, 2.921446], [0.888081, 2.9276329999999997], [0.836675, 2.946925], [0.810422, 2.941982], [0.80153, 2.9095869999999997], [0.8010769999999999, 2.891692], [0.784797, 2.825859], [0.7423649999999999, 2.779807], [0.683388, 2.757564], [0.617475, 2.7631609999999998], [0.5638949999999999, 2.792229], [0.545798, 2.80881], [0.532971, 2.828925], [0.5243059999999999, 2.8593319999999998], [0.5186959999999999, 2.9067879999999997], [0.515035, 2.97805], [0.512215, 3.079875], [0.5114839999999999, 3.1121149999999997], [0.5088199999999999, 3.22241], [0.505792, 3.300036], [0.50125, 3.351396], [0.494046, 3.3828899999999997], [0.483033, 3.4009199999999997], [0.46706, 3.411888], [0.45683399999999996, 3.416733], [0.413406, 3.4333009999999997], [0.38784199999999996, 3.4387689999999997], [0.379395, 3.4205069999999997], [0.374239, 3.365296], [0.372346, 3.272499], [0.373689, 3.1414779999999998], [0.37410699999999997, 3.121269], [0.377058, 3.0017329999999998], [0.380548, 2.914449], [0.38551399999999997, 2.852591], [0.392893, 2.809336], [0.403624, 2.77786], [0.418645, 2.7513389999999998], [0.426502, 2.739975], [0.471553, 2.689692], [0.52194, 2.650581], [0.528108, 2.647167], [0.618458, 2.620212], [0.7133619999999999, 2.62467]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[1.6020809999999999, 2.780289], [1.6018329999999998, 2.92632], [1.6008719999999999, 3.038655], [1.5987939999999998, 3.122678], [1.5951929999999999, 3.183769], [1.5896649999999999, 3.227309], [1.581804, 3.258679], [1.571207, 3.2832619999999997], [1.5631819999999998, 3.297294], [1.4967279999999998, 3.373388], [1.41247, 3.421084], [1.319249, 3.438199], [1.2259, 3.4225459999999996], [1.170312, 3.394418], [1.1119569999999999, 3.34576], [1.0721859999999999, 3.286333], [1.04819, 3.208507], [1.037161, 3.1046519999999997], [1.035599, 3.0284619999999998], [1.035809, 3.022986], [1.172308, 3.022986], [1.173141, 3.1103549999999998], [1.176961, 3.168192], [1.185746, 3.206029], [1.201474, 3.2333979999999998], [1.2202659999999999, 3.2540419999999997], [1.283375, 3.2938899999999998], [1.351137, 3.2972949999999996], [1.415179, 3.2640249999999997], [1.420164, 3.2595169999999998], [1.441439, 3.236067], [1.454779, 3.208166], [1.4620009999999999, 3.166641], [1.464923, 3.102316], [1.465385, 3.0311999999999997], [1.464383, 2.941858], [1.460238, 2.8822579999999998], [1.451236, 2.843089], [1.435667, 2.8150399999999998], [1.422902, 2.800144], [1.3636, 2.762575], [1.295301, 2.758057], [1.23011, 2.786753], [1.217528, 2.797406], [1.196111, 2.8210629999999997], [1.182744, 2.8492509999999998], [1.1755659999999999, 2.891245], [1.1727189999999998, 2.9563189999999997], [1.172308, 3.022986], [1.035809, 3.022986], [1.040322, 2.9057649999999997], [1.056362, 2.813577], [1.086528, 2.744269], [1.133629, 2.6902109999999997], [1.170312, 2.662505], [1.23699, 2.6325719999999997], [1.3142719999999999, 2.618678], [1.38611, 2.622397], [1.426308, 2.6374], [1.4420819999999999, 2.64167], [1.45255, 2.62575], [1.459856, 2.5830889999999997], [1.465385, 2.518106], [1.4714369999999999, 2.445732], [1.479844, 2.402187], [1.4951409999999998, 2.377287], [1.5218639999999999, 2.360845], [1.538654, 2.353564], [1.6021539999999999, 2.326963], [1.6020809999999999, 2.780289]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[2.3959289999999998, 2.636662], [2.398911, 2.688068], [2.4012469999999997, 2.7661919999999998], [2.402749, 2.8648569999999998], [2.403231, 2.968343], [2.403231, 3.318533], [2.341401, 3.380363], [2.298793, 3.418462], [2.26139, 3.4338949999999997], [2.21027, 3.432918], [2.189978, 3.430433], [2.126554, 3.4232], [2.074095, 3.4190549999999997], [2.061308, 3.418672], [2.018199, 3.421176], [1.9565439999999998, 3.427462], [1.9326379999999999, 3.430433], [1.8739219999999999, 3.435028], [1.8344639999999999, 3.425046], [1.7953379999999999, 3.394228], [1.781215, 3.380363], [1.719385, 3.318533], [1.719385, 2.663503], [1.76915, 2.640829], [1.812002, 2.624034], [1.837073, 2.618154], [1.8435009999999998, 2.636736], [1.8495089999999998, 2.688655], [1.8546969999999998, 2.768172], [1.8586639999999999, 2.8695459999999997], [1.860577, 2.955192], [1.865923, 3.2922309999999997], [1.9125599999999998, 3.298825], [1.9549759999999998, 3.2942139999999998], [1.97576, 3.279287], [1.9815699999999998, 3.2513769999999997], [1.98653, 3.191925], [1.990246, 3.108466], [1.992324, 3.0085319999999998], [1.992624, 2.9571039999999997], [1.992923, 2.661054], [2.054454, 2.639604], [2.098004, 2.6250199999999997], [2.1216939999999997, 2.618219], [2.1223769999999997, 2.618154], [2.124754, 2.6366419999999997], [2.127366, 2.687906], [2.129995, 2.765649], [2.132421, 2.863574], [2.134115, 2.955192], [2.139461, 3.2922309999999997], [2.2566919999999997, 3.2922309999999997], [2.262072, 2.984746], [2.267451, 2.6772609999999997], [2.324601, 2.647707], [2.366797, 2.6274129999999998], [2.3917699999999997, 2.618204], [2.3924909999999997, 2.618154], [2.3959289999999998, 2.636662]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[2.887333, 2.633528], [2.94359, 2.6591169999999997], [2.9877469999999997, 2.690124], [3.020101, 2.724795], [3.0424379999999998, 2.76952], [3.056546, 2.830692], [3.064211, 2.914701], [3.06722, 3.02794], [3.067538, 3.102509], [3.067538, 3.39342], [3.017773, 3.416095], [2.978576, 3.432667], [2.959157, 3.4387689999999997], [2.9554419999999997, 3.42061], [2.952495, 3.371648], [2.950691, 3.300153], [2.9503079999999997, 3.243385], [2.948661, 3.161371], [2.944222, 3.0963089999999998], [2.93774, 3.056467], [2.93259, 3.048], [2.897977, 3.0566459999999998], [2.8436399999999997, 3.078823], [2.780722, 3.108886], [2.7203679999999997, 3.1411919999999998], [2.673721, 3.170098], [2.651926, 3.189961], [2.651839, 3.190175], [2.653714, 3.2269349999999997], [2.670525, 3.2620259999999996], [2.700039, 3.2905279999999997], [2.7431159999999997, 3.300061], [2.779932, 3.29895], [2.832074, 3.298133], [2.859444, 3.310349], [2.875882, 3.342624], [2.877955, 3.3487099999999996], [2.885081, 3.394739], [2.866024, 3.422687], [2.816353, 3.436007], [2.7626969999999997, 3.4384699999999997], [2.666142, 3.42021], [2.6161589999999997, 3.394131], [2.554429, 3.332868], [2.52169, 3.25767], [2.518753, 3.1782109999999997], [2.546424, 3.104167], [2.588047, 3.057769], [2.629604, 3.031793], [2.694922, 2.998907], [2.771038, 2.965557], [2.7837259999999997, 2.960461], [2.867333, 2.923565], [2.91553, 2.891046], [2.93103, 2.858718], [2.91655, 2.822394], [2.891692, 2.794], [2.8329389999999997, 2.759039], [2.768293, 2.756417], [2.709008, 2.7833579999999998], [2.666339, 2.837088], [2.660739, 2.8509499999999997], [2.628133, 2.901936], [2.58053, 2.939787], [2.520461, 2.97085], [2.520461, 2.882768], [2.523997, 2.828951], [2.5391559999999997, 2.786534], [2.572768, 2.741279], [2.605035, 2.70642], [2.6552089999999997, 2.657062], [2.694193, 2.630547], [2.736064, 2.619911], [2.78346, 2.618154], [2.887333, 2.633528]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[3.570807, 2.6367819999999997], [3.5941609999999997, 2.646988], [3.649902, 2.691134], [3.6975689999999997, 2.7549669999999997], [3.727048, 2.8230869999999997], [3.731846, 2.85667], [3.71576, 2.903556], [3.680475, 2.928365], [3.6426439999999998, 2.943387], [3.625321, 2.946155], [3.616886, 2.926066], [3.60023, 2.882351], [3.592923, 2.8625979999999998], [3.551948, 2.7942709999999997], [3.492622, 2.760191], [3.416552, 2.7612389999999998], [3.4109179999999997, 2.762581], [3.3703049999999997, 2.7818359999999998], [3.340448, 2.819375], [3.320055, 2.879809], [3.307836, 2.967751], [3.3024999999999998, 3.0878129999999997], [3.302, 3.1516979999999997], [3.301752, 3.2524029999999997], [3.3001259999999997, 3.3210539999999997], [3.295801, 3.364673], [3.287454, 3.390282], [3.273765, 3.404903], [3.253411, 3.415558], [3.252234, 3.416095], [3.213038, 3.432667], [3.193619, 3.4387689999999997], [3.190635, 3.4203189999999997], [3.188081, 3.369323], [3.18614, 3.292308], [3.1849969999999996, 3.195805], [3.1847689999999997, 3.125184], [3.1859319999999998, 2.9885249999999997], [3.190479, 2.884851], [3.199999, 2.808108], [3.216081, 2.752246], [3.240313, 2.7112119999999997], [3.274286, 2.678954], [3.307833, 2.65644], [3.388499, 2.626476], [3.4823809999999997, 2.6197179999999998], [3.570807, 2.6367819999999997]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[4.245223999999999, 2.6478379999999997], [4.322528, 2.698361], [4.359814, 2.7435899999999998], [4.389353, 2.825663], [4.391699, 2.8906069999999997], [4.386385, 2.977445], [4.186115, 3.0651029999999997], [4.0887389999999995, 3.109887], [4.025113, 3.1459129999999997], [3.9920289999999996, 3.177117], [3.98628, 3.207436], [4.004658, 3.240805], [4.024923, 3.262923], [4.083889, 3.298393], [4.1480239999999995, 3.3008789999999997], [4.206926, 3.2732349999999997], [4.250197, 3.21832], [4.257936, 3.198928], [4.295006, 3.1383639999999997], [4.337654, 3.112552], [4.396154, 3.090471], [4.396154, 3.174184], [4.390982, 3.23115], [4.370723, 3.2791889999999997], [4.328262, 3.334346], [4.321950999999999, 3.3415139999999997], [4.274719999999999, 3.3905849999999997], [4.234121, 3.4169199999999997], [4.1833279999999995, 3.429035], [4.14122, 3.433003], [4.0659019999999995, 3.433991], [4.012286, 3.4214659999999997], [3.9788379999999997, 3.402869], [3.926268, 3.3619749999999997], [3.8898789999999996, 3.317748], [3.86685, 3.262126], [3.8543589999999996, 3.1870469999999997], [3.8495869999999996, 3.0844489999999998], [3.8492059999999997, 3.0323759999999997], [3.850501, 2.969948], [3.9684709999999996, 2.969948], [3.969839, 3.003438], [3.973249, 3.008923], [3.9957529999999997, 3.0014719999999997], [4.044182, 2.981753], [4.108908, 2.953718], [4.122443, 2.947692], [4.204244, 2.906096], [4.249312, 2.869538], [4.259217, 2.835296], [4.235526, 2.800648], [4.21596, 2.785339], [4.14536, 2.754721], [4.07928, 2.7597799999999997], [4.023959, 2.797151], [3.985636, 2.863473], [3.973349, 2.9161159999999997], [3.9684709999999996, 2.969948], [3.850501, 2.969948], [3.85173, 2.91072], [3.861032, 2.82071], [3.87946, 2.7551669999999997], [3.90936, 2.706912], [3.95308, 2.668767], [3.9721409999999997, 2.65644], [4.058726, 2.624336], [4.153522, 2.622316], [4.245223999999999, 2.6478379999999997]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[0.139878, -3.712224], [0.245612, -3.711645], [0.322132, -3.7100779999999998], [0.374372, -3.7070279999999998], [0.407263, -3.7020039999999996], [0.425737, -3.694511], [0.434727, -3.684056], [0.43916299999999997, -3.670147], [0.439594, -3.6683459999999997], [0.446333, -3.635855], [0.458808, -3.571748], [0.475719, -3.482849], [0.49577099999999996, -3.375981], [0.517664, -3.257967], [0.518429, -3.253822], [0.5403589999999999, -3.138169], [0.560877, -3.035986], [0.5786589999999999, -2.953402], [0.5923809999999999, -2.896544], [0.600718, -2.871542], [0.601116, -2.871099], [0.6256769999999999, -2.8588899999999997], [0.676315, -2.8385439999999997], [0.742095, -2.8144549999999997], [0.7424609999999999, -2.814326], [0.825317, -2.783182], [0.9229999999999999, -2.743509], [1.015077, -2.7036189999999998], [1.019434, -2.701647], [1.1694069999999999, -2.63358], [1.501498, -2.8603609999999997], [1.6033739999999999, -2.929496], [1.695657, -2.991303], [1.7730029999999999, -3.042267], [1.830064, -3.0788729999999997], [1.861495, -3.097606], [1.864479, -3.0989959999999996], [1.8873209999999998, -3.09281], [1.9299819999999999, -3.0629649999999997], [1.994128, -3.008053], [2.0814209999999997, -2.926666], [2.170535, -2.8400779999999997], [2.2564409999999997, -2.754753], [2.3333269999999997, -2.676892], [2.3965639999999997, -2.611303], [2.441523, -2.562795], [2.4635759999999998, -2.536175], [2.464396, -2.534805], [2.466834, -2.516537], [2.4576499999999997, -2.4867049999999997], [2.434574, -2.4412789999999998], [2.395337, -2.37623], [2.3376699999999997, -2.28753], [2.260795, -2.173343], [2.19257, -2.072838], [2.131582, -1.982697], [2.081356, -1.908151], [2.045416, -1.8544349999999998], [2.027287, -1.826782], [2.026146, -1.824905], [2.028359, -1.7984099999999998], [2.045138, -1.7469139999999999], [2.073142, -1.680149], [2.083122, -1.658828], [2.126672, -1.563841], [2.173134, -1.4560629999999999], [2.210877, -1.362808], [2.238073, -1.293594], [2.259675, -1.240994], [2.2721579999999997, -1.213503], [2.2737089999999998, -1.211384], [2.296668, -1.207876], [2.350786, -1.198262], [2.428868, -1.183911], [2.523719, -1.166193], [2.6281429999999997, -1.146475], [2.734944, -1.126126], [2.836926, -1.106514], [2.926894, -1.089009], [2.9976529999999997, -1.074978], [3.0420059999999998, -1.065791], [3.052885, -1.063193], [3.064122, -1.0567819999999999], [3.072605, -1.042303], [3.0787139999999997, -1.014867], [3.082832, -0.9695889999999999], [3.0853409999999997, -0.9015799999999999], [3.086621, -0.8059529999999999], [3.0870539999999997, -0.67782], [3.087077, -0.6252989999999999], [3.087077, -0.198155], [2.9844999999999997, -0.17790899999999998], [2.927431, -0.16693], [2.842269, -0.15090499999999998], [2.739372, -0.131767], [2.629096, -0.11144899999999999], [2.5986149999999997, -0.10586799999999999], [2.496855, -0.08608299999999999], [2.4082049999999997, -0.06662699999999999], [2.340108, -0.049303], [2.300004, -0.035912], [2.293323, -0.031921], [2.276919, -0.003658], [2.253399, 0.051108999999999995], [2.227316, 0.12158799999999999], [2.222142, 0.136769], [2.187956, 0.230896], [2.145523, 0.337101], [2.103997, 0.432473], [2.103792, 0.43291599999999997], [2.03464, 0.582525], [2.489512, 1.251617], [2.1975, 1.5441159999999998], [2.10918, 1.63117], [2.028625, 1.707909], [1.9603599999999999, 1.7702369999999998], [1.9089079999999998, 1.814056], [1.8787939999999999, 1.83527], [1.874474, 1.836616], [1.849111, 1.8260159999999999], [1.797358, 1.796547], [1.7248679999999998, 1.7517049999999998], [1.637294, 1.6949839999999998], [1.5426119999999999, 1.631462], [1.446516, 1.566668], [1.3608369999999999, 1.510287], [1.291016, 1.4657879999999999], [1.242494, 1.436639], [1.220782, 1.426308], [1.194293, 1.43505], [1.144062, 1.458087], [1.080451, 1.490631], [1.0737079999999999, 1.494249], [0.988046, 1.53721], [0.929306, 1.558279], [0.892772, 1.558503], [0.8737309999999999, 1.5389279999999999], [0.87362, 1.538654], [0.8641019999999999, 1.515472], [0.841403, 1.4604409999999999], [0.8072819999999999, 1.3778219999999999], [0.7635, 1.271872], [0.711816, 1.146852], [0.653992, 1.00702], [0.5979909999999999, 0.871637], [0.536447, 0.7222339999999999], [0.479939, 0.583832], [0.43016099999999996, 0.460673], [0.388806, 0.357002], [0.357568, 0.277059], [0.33814099999999997, 0.22508799999999998], [0.332154, 0.20569199999999999], [0.347168, 0.183443], [0.386439, 0.147982], [0.438807, 0.108887], [0.5879409999999999, -0.014754999999999999], [0.704511, -0.156478], [0.787118, -0.31329599999999996], [0.8343659999999999, -0.48222499999999996], [0.844857, -0.6602779999999999], [0.837231, -0.7424609999999999], [0.795682, -0.9129689999999999], [0.724123, -1.0635409999999998], [0.626995, -1.192691], [0.508734, -1.2989359999999999], [0.37378, -1.38079], [0.226571, -1.436768], [0.071544, -1.465385], [-0.086861, -1.465156], [-0.24420599999999998, -1.4345949999999998], [-0.39605399999999996, -1.372218], [-0.537965, -1.27654], [-0.597197, -1.2224279999999998], [-0.710797, -1.08348], [-0.789894, -0.931639], [-0.8350139999999999, -0.7713329999999999], [-0.846684, -0.606988], [-0.8254309999999999, -0.443029], [-0.7717799999999999, -0.28388199999999997], [-0.68626, -0.13397499999999998], [-0.569395, 0.002267], [-0.438807, 0.108887], [-0.384412, 0.149642], [-0.34598599999999996, 0.184718], [-0.332154, 0.205726], [-0.339397, 0.22863499999999998], [-0.359995, 0.283365], [-0.392254, 0.365672], [-0.434479, 0.471315], [-0.484977, 0.59605], [-0.542052, 0.735636], [-0.598146, 0.87167], [-0.660033, 1.021201], [-0.717356, 1.159767], [-0.7683559999999999, 1.283107], [-0.8112729999999999, 1.3869639999999999], [-0.844347, 1.46708], [-0.865819, 1.5191949999999999], [-0.873775, 1.538654], [-0.892571, 1.558423], [-0.9289259999999999, 1.558365], [-0.987521, 1.5374409999999998], [-1.073032, 1.494613], [-1.0737079999999999, 1.494249], [-1.138093, 1.461012], [-1.1901389999999998, 1.436802], [-1.219488, 1.426404], [-1.220783, 1.426308], [-1.2428759999999999, 1.436855], [-1.291652, 1.466184], [-1.361669, 1.510827], [-1.4474859999999998, 1.5673139999999999], [-1.5426119999999999, 1.631462], [-1.63946, 1.696411], [-1.726747, 1.752896], [-1.798819, 1.797421], [-1.850023, 1.82649], [-1.874474, 1.836616], [-1.89699, 1.823307], [-1.9422579999999998, 1.786112], [-2.005756, 1.729128], [-2.082961, 1.6564489999999998], [-2.169349, 1.572171], [-2.1976009999999997, 1.5440159999999998], [-2.489713, 1.2514159999999999], [-2.267369, 0.9251039999999999], [-2.199798, 0.824897], [-2.1404929999999998, 0.7349629999999999], [-2.092783, 0.6605099999999999], [-2.059993, 0.6067509999999999], [-2.045452, 0.578894], [-2.045026, 0.576912], [-2.052692, 0.550655], [-2.073311, 0.497837], [-2.103315, 0.42730999999999997], [-2.124375, 0.38009299999999996], [-2.163752, 0.289694], [-2.200835, 0.198366], [-2.2295849999999997, 0.12119999999999999], [-2.237395, 0.097692], [-2.259583, 0.034915999999999996], [-2.281273, -0.013588999999999999], [-2.293187, -0.031921], [-2.319477, -0.043141], [-2.376858, -0.059045999999999994], [-2.4578819999999997, -0.077833], [-2.5551049999999997, -0.097701], [-2.5986149999999997, -0.10586799999999999], [-2.709104, -0.126171], [-2.8150839999999997, -0.14583], [-2.906199, -0.162912], [-2.972092, -0.175482], [-2.9844999999999997, -0.17790899999999998], [-3.087077, -0.198155], [-3.087077, -0.6252989999999999], [-3.0868469999999997, -0.7657539999999999], [-3.085901, -0.8720209999999999], [-3.083859, -0.9489869999999999], [-3.080338, -1.0015399999999999], [-3.074957, -1.034567], [-3.067334, -1.0529549999999999], [-3.057088, -1.0615919999999999], [-3.052885, -1.063193], [-3.02753, -1.068873], [-2.971516, -1.0802049999999999], [-2.892036, -1.095821], [-2.7962879999999997, -1.114353], [-2.691467, -1.134431], [-2.584768, -1.154688], [-2.483387, -1.173754], [-2.3945209999999997, -1.190261], [-2.325363, -1.202841], [-2.283111, -1.210125], [-2.27371, -1.211384], [-2.265193, -1.228237], [-2.24634, -1.2731299999999999], [-2.220676, -1.33757], [-2.210877, -1.362808], [-2.1713519999999997, -1.460314], [-2.124808, -1.568041], [-2.083123, -1.658828], [-2.05245, -1.7282469999999999], [-2.032044, -1.7852899999999998], [-2.025232, -1.820223], [-2.026318, -1.824905], [-2.040715, -1.847009], [-2.073588, -1.896169], [-2.12141, -1.967152], [-2.180652, -2.054722], [-2.247785, -2.1536429999999998], [-2.261059, -2.17317], [-2.3389539999999998, -2.28886], [-2.396213, -2.376956], [-2.435119, -2.4415139999999997], [-2.457956, -2.486589], [-2.467006, -2.516237], [-2.464552, -2.534515], [-2.464489, -2.534631], [-2.445173, -2.558639], [-2.402449, -2.605053], [-2.3409489999999997, -2.669063], [-2.2653019999999997, -2.7458549999999997], [-2.180139, -2.830618], [-2.170535, -2.8400779999999997], [-2.0632099999999998, -2.9440109999999997], [-1.9803849999999998, -3.0203249999999997], [-1.9203949999999999, -3.070429], [-1.8815769999999998, -3.0957299999999996], [-1.86448, -3.0989959999999996], [-1.839527, -3.0847499999999997], [-1.787745, -3.051844], [-1.71448, -3.003792], [-1.6250799999999999, -2.94411], [-1.524889, -2.876312], [-1.501499, -2.8603609999999997], [-1.1694069999999999, -2.63358], [-1.0194349999999999, -2.701647], [-0.92823, -2.7413149999999997], [-0.8303309999999999, -2.781209], [-0.746169, -2.813017], [-0.742462, -2.814326], [-0.676631, -2.838424], [-0.625884, -2.8588], [-0.601158, -2.871064], [-0.601116, -2.871099], [-0.593271, -2.8932659999999997], [-0.579934, -2.947783], [-0.56243, -3.02852], [-0.542083, -3.12935], [-0.520218, -3.244144], [-0.518429, -3.253822], [-0.496496, -3.372096], [-0.47636, -3.4794579999999997], [-0.45932, -3.569083], [-0.44667199999999996, -3.634149], [-0.439716, -3.6678319999999998], [-0.439594, -3.6683459999999997], [-0.435361, -3.6826749999999997], [-0.427129, -3.6934929999999997], [-0.40996699999999997, -3.701294], [-0.378942, -3.706571], [-0.32912199999999997, -3.709818], [-0.25557599999999997, -3.711528], [-0.15337099999999998, -3.7121929999999996], [-0.017575, -3.712307], [0.0, -3.7123079999999997], [0.139878, -3.712224]]]}]}, "edges_bbox": {"minx": 110.149998, "miny": 80.749999, "maxx": 190.250002, "maxy": 102.85000199999999}, "metadata": {"date": "2019-01-14 15:38:20", "company": "", "revision": "", "title": "heater"}} +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +/* Utility functions */ + +var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' + + pcbdata.metadata.revision + '__'; +var storage; + +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 fancyDblClickHandler(el, onsingle, ondouble) { + return function() { + if (el.getAttribute("data-dblclick") == null) { + el.setAttribute("data-dblclick", 1); + setTimeout(function() { + if (el.getAttribute("data-dblclick") == 1) { + onsingle(); + } + el.removeAttribute("data-dblclick"); + }, 200); + } else { + el.removeAttribute("data-dblclick"); + ondouble(); + } + } +} + +function smoothScrollToRow(rowid) { + document.getElementById(rowid).scrollIntoView({ + behavior: "smooth", + block: "center", + inline: "nearest" + }); +} + +function focusInputField(input) { + input.scrollIntoView(false); + input.focus(); + input.select(); +} + +function copyToClipboard() { + var text = ''; + for (var node of bomhead.childNodes[0].childNodes) { + if (node.firstChild) { + text = text + node.firstChild.nodeValue; + } + if (node != bomhead.childNodes[0].lastChild) { + text += '\t'; + } + } + text += '\n'; + for (var row of bombody.childNodes) { + for (var cell of row.childNodes) { + for (var node of cell.childNodes) { + if (node.nodeName == "INPUT") { + if (node.checked) { + text = text + '✓'; + } + } else if (node.nodeName == "MARK") { + text = text + node.firstChild.nodeValue; + } else { + text = text + node.nodeValue; + } + } + if (cell != row.lastChild) { + text += '\t'; + } + } + text += '\n'; + } + var textArea = document.createElement("textarea"); + textArea.classList.add('clipboard-temp'); + textArea.value = text; + + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + if (document.execCommand('copy')) { + console.log('Bom copied to clipboard.'); + } + } catch (err) { + console.log('Can not copy to clipboard.'); + } + + document.body.removeChild(textArea); +} + +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")); +} + +var units = { + prefixes: { + giga: ["G", "g", "giga", "Giga", "GIGA"], + mega: ["M", "mega", "Mega", "MEGA"], + kilo: ["K", "k", "kilo", "Kilo", "KILO"], + milli: ["m", "milli", "Milli", "MILLI"], + micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ + nano: ["N", "n", "nano", "Nano", "NANO"], + pico: ["P", "p", "pico", "Pico", "PICO"], + }, + unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"], + unitsLong: [ + "OHM", "Ohm", "ohm", "ohms", + "FARAD", "Farad", "farad", + "HENRY", "Henry", "henry" + ], + getMultiplier: function(s) { + if (this.prefixes.giga.includes(s)) return 1e9; + if (this.prefixes.mega.includes(s)) return 1e6; + if (this.prefixes.kilo.includes(s)) return 1e3; + if (this.prefixes.milli.includes(s)) return 1e-3; + if (this.prefixes.micro.includes(s)) return 1e-6; + if (this.prefixes.nano.includes(s)) return 1e-9; + if (this.prefixes.pico.includes(s)) return 1e-12; + return 1; + }, + valueRegex: null, +} + +function initUtils() { + var allPrefixes = units.prefixes.giga + .concat(units.prefixes.mega) + .concat(units.prefixes.kilo) + .concat(units.prefixes.milli) + .concat(units.prefixes.micro) + .concat(units.prefixes.nano) + .concat(units.prefixes.pico); + var allUnits = units.unitsShort.concat(units.unitsLong); + units.valueRegex = new RegExp("^([0-9\.]+)" + + "\\s*(" + allPrefixes.join("|") + ")?" + + "(" + allUnits.join("|") + ")?" + + "(\\b.*)?$", ""); + units.valueAltRegex = new RegExp("^([0-9]*)" + + "(" + units.unitsShort.join("|") + ")?" + + "([GgMmKkUuNnPp])?" + + "([0-9]*)" + + "(\\b.*)?$", ""); + for (var bomtable of Object.values(pcbdata.bom)) { + for (var row of bomtable) { + row.push(parseValue(row[1], row[3][0][0])); + } + } +} + +function parseValue(val, ref) { + var inferUnit = (unit, ref) => { + if (unit) { + unit = unit.toLowerCase(); + if (unit == 'Ω' || unit == "ohm" || unit == "ohms") { + unit = 'r'; + } + unit = unit[0]; + } else { + ref = /^([a-z]+)\d+$/i.exec(ref); + if (ref) { + ref = ref[1].toLowerCase(); + if (ref == "c") unit = 'f'; + else if (ref == "l") unit = 'h'; + else if (ref == "r" || ref == "rv") unit = 'r'; + else unit = null; + } + } + return unit; + }; + val = val.replace(/,/g, ""); + var match = units.valueRegex.exec(val); + var unit; + if (match) { + val = parseFloat(match[1]); + if (match[2]) { + val = val * units.getMultiplier(match[2]); + } + unit = inferUnit(match[3], ref); + if (!unit) return null; + else return { + val: val, + unit: unit, + extra: match[4], + } + } + match = units.valueAltRegex.exec(val); + if (match && (match[1] || match[4])) { + val = parseFloat(match[1] + "." + match[4]); + if (match[3]) { + val = val * units.getMultiplier(match[3]); + } + unit = inferUnit(match[2], ref); + if (!unit) return null; + else return { + val: val, + unit: unit, + extra: match[5], + } + } + return null; +} + +function valueCompare(a, b, stra, strb) { + if (a === null && b === null) { + // Failed to parse both values, compare them as strings. + if (stra != strb) return stra > strb ? 1 : -1; + else return 0; + } else if (a === null) { + return 1; + } else if (b === null) { + return -1; + } else { + if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1; + else if (a.val != b.val) return a.val > b.val ? 1 : -1; + else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1; + else return 0; + } +} + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +/* PCB rendering code */ + +var redrawOnDrag = true; +var boardRotation = 0; + +function deg2rad(deg) { + return deg * Math.PI / 180; +} + +function calcFontPoint(linepoint, text, offsetx, offsety, tilt) { + var point = [ + linepoint[0] * text.width + offsetx, + linepoint[1] * text.height + offsety + ]; + // Adding half a line height here is technically a bug + // but pcbnew currently does the same, text is slightly shifted. + point[0] -= (point[1] + text.height * 0.5) * tilt; + return point; +} + +function drawtext(ctx, text, color, flip) { + ctx.save(); + ctx.translate(...text.pos); + var angle = -text.angle; + if (text.attr.includes("mirrored")) { + ctx.scale(-1, 1); + angle = -angle; + } + var tilt = 0; + if (text.attr.includes("italic")) { + tilt = 0.125; + } + var interline = (text.height * 1.5 + text.thickness) / 2; + var txt = text.text.split("\n"); + // KiCad ignores last empty line. + if (txt[txt.length-1] == '') txt.pop(); + ctx.rotate(deg2rad(angle)); + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.lineCap = "round"; + ctx.lineWidth = text.thickness; + for (var i in txt) { + var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2; + var lineWidth = 0; + for (var c of txt[i]) { + lineWidth += pcbdata.font_data[c].w * text.width; + } + var offsetx = 0; + switch (text.horiz_justify) { + case -1: + // Justify left, do nothing + break; + case 0: + // Justify center + offsetx -= lineWidth / 2; + break; + case 1: + // Justify right + offsetx -= lineWidth; + break; + } + for (var c of txt[i]) { + for (var line of pcbdata.font_data[c].l) { + // Drawing each segment separately instead of + // polyline because round line caps don't work in joints + for (var i = 0; i < line.length - 1; i++) { + ctx.beginPath(); + ctx.moveTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt)); + ctx.lineTo(...calcFontPoint(line[i + 1], text, offsetx, offsety, tilt)); + ctx.stroke(); + } + } + offsetx += pcbdata.font_data[c].w * text.width; + } + } + 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.closePath(); + ctx.stroke(); + } +} + +function drawRoundRect(ctx, color, size, radius, ctxmethod) { + ctx.beginPath(); + ctx.strokeStyle = color; + var x = size[0] * -0.5; + var y = size[1] * -0.5; + var width = size[0]; + var 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(); + ctxmethod(); +} + +function drawOblong(ctx, color, size, ctxmethod) { + drawRoundRect(ctx, color, size, Math.min(size[0], size[1]) / 2, ctxmethod); +} + +function drawPolygons(ctx, color, polygons, ctxmethod) { + ctx.fillStyle = color; + for (var polygon of polygons) { + ctx.beginPath(); + for (var vertex of polygon) { + ctx.lineTo(...vertex) + } + ctx.closePath(); + ctxmethod(); + } +} + +function drawPolygonShape(ctx, shape, color) { + ctx.save(); + ctx.translate(...shape.pos); + ctx.rotate(deg2rad(-shape.angle)); + drawPolygons(ctx, color, shape.polygons, ctx.fill.bind(ctx)); + 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, drawing, color); + } else { + drawtext(ctx, drawing, color, layer == "B"); + } +} + +function drawCircle(ctx, radius, ctxmethod) { + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, 2 * Math.PI); + ctx.closePath(); + ctxmethod(); +} + +function drawPad(ctx, pad, color, outline) { + ctx.save(); + ctx.translate(...pad.pos); + ctx.rotate(deg2rad(pad.angle)); + if (pad.offset) { + ctx.translate(...pad.offset); + } + ctx.fillStyle = color; + ctx.strokeStyle = color; + var ctxmethod = outline ? ctx.stroke.bind(ctx) : ctx.fill.bind(ctx); + if (pad.shape == "rect") { + var rect = [...pad.size.map(c => -c * 0.5), ...pad.size]; + if (outline) { + ctx.strokeRect(...rect); + } else { + ctx.fillRect(...rect); + } + } else if (pad.shape == "oval") { + drawOblong(ctx, color, pad.size, ctxmethod); + } else if (pad.shape == "circle") { + drawCircle(ctx, pad.size[0] / 2, ctxmethod); + } else if (pad.shape == "roundrect") { + drawRoundRect(ctx, color, pad.size, pad.radius, ctxmethod); + } else if (pad.shape == "custom") { + drawPolygons(ctx, color, pad.polygons, ctxmethod); + } + if (pad.type == "th" && !outline) { + ctx.fillStyle = "#CCCCCC"; + if (pad.drillshape == "oblong") { + drawOblong(ctx, "#CCCCCC", pad.drillsize, ctxmethod); + } else { + drawCircle(ctx, pad.drillsize[0] / 2, ctxmethod); + } + } + ctx.restore(); +} + +function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight) { + if (highlight) { + // draw bounding box + if (module.layer == layer) { + ctx.save(); + ctx.globalAlpha = 0.2; + ctx.translate(...module.bbox.pos); + ctx.fillStyle = padcolor; + ctx.fillRect( + 0, 0, + ...module.bbox.size); + ctx.globalAlpha = 1; + ctx.strokeStyle = padcolor; + ctx.strokeRect( + 0, 0, + ...module.bbox.size); + ctx.restore(); + } + } + // draw drawings + for (var drawing of module.drawings) { + if (drawing.layer == layer) { + drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor); + } + } + // draw pads + for (var pad of module.pads) { + if (pad.layers.includes(layer)) { + drawPad(ctx, pad, padcolor, false); + if (pad.pin1 && highlightpin1) { + drawPad(ctx, pad, outlinecolor, true); + } + } + } +} + +function drawEdges(canvas, scalefactor) { + var ctx = canvas.getContext("2d"); + var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color'); + for (var edge of pcbdata.edges) { + drawedge(ctx, scalefactor, edge, edgecolor); + } +} + +function drawModules(canvas, layer, scalefactor, highlight) { + var ctx = canvas.getContext("2d"); + ctx.lineWidth = 3 / scalefactor; + var style = getComputedStyle(topmostdiv); + var padcolor = style.getPropertyValue('--pad-color'); + var outlinecolor = style.getPropertyValue('--pin1-outline-color'); + if (highlight > 0) { + padcolor = style.getPropertyValue('--pad-color-highlight'); + outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight'); + } + for (var i = 0; i < pcbdata.modules.length; i++) { + var mod = pcbdata.modules[i]; + if (!highlight || highlightedModules.includes(i)) { + drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight); + } + } +} + +function drawSilkscreen(canvas, layer, scalefactor) { + var ctx = canvas.getContext("2d"); + for (var d of pcbdata.silkscreen[layer]) { + if (["segment", "arc", "circle"].includes(d.type)) { + drawedge(ctx, scalefactor, d, "#aa4"); + } else if (d.type == "polygon") { + drawPolygonShape(ctx, d, "#4aa"); + } else { + drawtext(ctx, 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 * canvasdict.transform.zoom, true); +} + +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 * canvasdict.transform.zoom, false); + 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); + var fontsize = 1.55; + 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.rotate(deg2rad(boardRotation)); + ctx.scale(transform.s, transform.s); +} + +function prepareLayer(canvasdict) { + var flip = (canvasdict.layer == "B"); + for (var c of ["bg", "silk", "highlight"]) { + prepareCanvas(canvasdict[c], flip, canvasdict.transform); + } +} + +function rotateVector(v, angle) { + angle = deg2rad(angle); + return [ + v[0] * Math.cos(angle) - v[1] * Math.sin(angle), + v[0] * Math.sin(angle) + v[1] * Math.cos(angle) + ]; +} + +function applyRotation(bbox) { + var corners = [ + [bbox.minx, bbox.miny], + [bbox.minx, bbox.maxy], + [bbox.maxx, bbox.miny], + [bbox.maxx, bbox.maxy], + ]; + corners = corners.map((v) => rotateVector(v, boardRotation)); + return { + minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity), + miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity), + maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity), + maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity), + } +} + +function recalcLayerScale(canvasdict) { + var canvasdivid = { + "F": "frontcanvas", + "B": "backcanvas" + } [canvasdict.layer]; + var width = document.getElementById(canvasdivid).clientWidth * 2; + var height = document.getElementById(canvasdivid).clientHeight * 2; + var bbox = applyRotation(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 (var 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"; + } +} + +function redrawCanvas(layerdict) { + prepareLayer(layerdict); + drawBackground(layerdict); + drawHighlightsOnLayer(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 = 0; i < pcbdata.modules.length; i++) { + 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(i); + } + } + } + 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 v = rotateVector([x, y], -boardRotation); + var modules = bboxScan(layerdict.layer, v[0], v[1]); + if (modules.length > 0) { + modulesClicked(modules); + } +} + +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; + return; + } + 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); + } else if (!redrawOnDrag) { + redrawCanvas(layerdict); + } + layerdict.transform.mousedown = false; +} + +function handleMouseMove(e, layerdict) { + if (!layerdict.transform.mousedown) { + return; + } + e.preventDefault(); + e.stopPropagation(); + var dx = e.offsetX - layerdict.transform.mousestartx; + var 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); +} + +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 (var 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 setBoardRotation(value) { + boardRotation = value * 5; + writeStorage("boardRotation", boardRotation); + document.getElementById("rotationDegree").textContent = boardRotation; + resizeAll(); +} + +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 bomsplit; +var canvassplit; +var canvaslayout = "default"; +var bomlayout = "default"; +var initDone = false; +var bomSortFunction = null; +var currentSortColumn = null; +var currentSortOrder = null; +var currentHighlightedRowId; +var highlightHandlers = []; +var highlightedModules = []; +var checkboxes = []; +var bomCheckboxes = ""; +var highlightpin1 = false; +var lastClicked; + +function dbg(html) { + dbgdiv.innerHTML = html; +} + +function setDarkMode(value) { + if (value) { + topmostdiv.classList.add("dark"); + } else { + topmostdiv.classList.remove("dark"); + } + writeStorage("darkmode", value); + if (initDone) { + redrawCanvas(allcanvas.front); + redrawCanvas(allcanvas.back); + } +} + +function setHighlightPin1(value) { + writeStorage("highlightpin1", value); + highlightpin1 = value; + if (initDone) { + redrawCanvas(allcanvas.front); + redrawCanvas(allcanvas.back); + } +} + +function getStoredCheckboxRefs(checkbox) { + function convert(ref) { + var intref = parseInt(ref); + if (isNaN(intref)) { + for (var i = 0; i < pcbdata.modules.length; i++) { + if (pcbdata.modules[i].ref == ref) { + return i; + } + } + return -1; + } else { + return intref; + } + } + var existingRefs = readStorage("checkbox_" + checkbox); + if (!existingRefs) { + return new Set(); + } else { + return new Set(existingRefs.split(",").map(r => convert(r))); + } +} + +function getCheckboxState(checkbox, references) { + var storedRefsSet = getStoredCheckboxRefs(checkbox); + var currentRefsSet = new Set(references.map(r => r[1])); + // 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 + return "checked"; + } else if (difference.size == currentRefsSet.size) { + // None of the current refs are stored + return "unchecked"; + } else { + // Some of the refs are stored + return "indeterminate"; + } +} + +function setBomCheckboxState(checkbox, element, references) { + var state = getCheckboxState(checkbox, references); + element.checked = (state == "checked"); + element.indeterminate = (state == "indeterminate"); +} + +function createCheckboxChangeHandler(checkbox, references) { + return function() { + refsSet = getStoredCheckboxRefs(checkbox); + if (this.checked) { + // checkbox ticked + for (var ref of references) { + refsSet.add(ref[1]); + } + } else { + // checkbox unticked + for (var ref of references) { + refsSet.delete(ref[1]); + } + } + 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; + highlightedModules = refs.map(r => r[1]); + drawHighlights(); + } +} + +function entryMatches(entry) { + // check refs + for (var ref of entry[3]) { + if (ref[0].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) { + return entry[3].filter(r => r[0].toLowerCase() == reflookup); +} + +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 checkboxSetUnsetAllHandler(checkboxname) { + return function() { + var checkboxnum = 0; + while (checkboxnum < checkboxes.length && + checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) { + checkboxnum++; + } + if (checkboxnum >= checkboxes.length) { + return; + } + var allset = true; + var checkbox; + var row; + for (row of bombody.childNodes) { + checkbox = row.childNodes[checkboxnum + 1].childNodes[0]; + if (!checkbox.checked || checkbox.indeterminate) { + allset = false; + break; + } + } + for (row of bombody.childNodes) { + checkbox = row.childNodes[checkboxnum + 1].childNodes[0]; + checkbox.checked = !allset; + checkbox.indeterminate = false; + checkbox.onchange(); + } + } +} + +function createColumnHeader(name, cls, comparator) { + var th = document.createElement("TH"); + th.innerHTML = name; + th.classList.add(cls); + th.style.cursor = "pointer"; + var span = document.createElement("SPAN"); + span.classList.add("sortmark"); + span.classList.add("none"); + th.appendChild(span); + th.onclick = function() { + if (currentSortColumn && this !== currentSortColumn) { + // Currently sorted by another column + currentSortColumn.childNodes[1].classList.remove(currentSortOrder); + currentSortColumn.childNodes[1].classList.add("none"); + currentSortColumn = null; + currentSortOrder = null; + } + if (currentSortColumn && this === currentSortColumn) { + // Already sorted by this column + if (currentSortOrder == "asc") { + // Sort by this column, descending order + bomSortFunction = function(a, b) { + return -comparator(a, b); + } + currentSortColumn.childNodes[1].classList.remove("asc"); + currentSortColumn.childNodes[1].classList.add("desc"); + currentSortOrder = "desc"; + } else { + // Unsort + bomSortFunction = null; + currentSortColumn.childNodes[1].classList.remove("desc"); + currentSortColumn.childNodes[1].classList.add("none"); + currentSortColumn = null; + currentSortOrder = null; + } + } else { + // Sort by this column, ascending order + bomSortFunction = comparator; + currentSortColumn = this; + currentSortColumn.childNodes[1].classList.remove("none"); + currentSortColumn.childNodes[1].classList.add("asc"); + currentSortOrder = "asc"; + } + populateBomBody(); + } + return th; +} + +function populateBomHeader() { + while (bomhead.firstChild) { + bomhead.removeChild(bomhead.firstChild); + } + var tr = document.createElement("TR"); + var th = document.createElement("TH"); + th.classList.add("numCol"); + tr.appendChild(th); + checkboxes = bomCheckboxes.split(",").filter((e) => e); + var checkboxCompareClosure = function(checkbox) { + return (a, b) => { + var stateA = getCheckboxState(checkbox, a[3]); + var stateB = getCheckboxState(checkbox, b[3]); + if (stateA > stateB) return -1; + if (stateA < stateB) return 1; + return 0; + } + } + for (var checkbox of checkboxes) { + th = createColumnHeader( + checkbox, "bom-checkbox", checkboxCompareClosure(checkbox)); + th.onclick = fancyDblClickHandler( + th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox)); + tr.appendChild(th); + } + tr.appendChild(createColumnHeader("References", "References", (a, b) => { + var i = 0; + while (i < a[3].length && i < b[3].length) { + if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1; + i++; + } + return a[3].length - b[3].length; + })); + // Extra fields + if (config.extra_fields.length > 0) { + var extraFieldCompareClosure = function(fieldIndex) { + return (a, b) => { + var fa = a[4][fieldIndex]; + var fb = b[4][fieldIndex]; + if (fa != fb) return fa > fb ? 1 : -1; + else return 0; + } + } + for (var i in config.extra_fields) { + tr.appendChild(createColumnHeader( + config.extra_fields[i], "extra", extraFieldCompareClosure(i))); + } + } + tr.appendChild(createColumnHeader("Value", "Value", (a, b) => { + return valueCompare(a[5], b[5], a[1], b[1]); + })); + tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => { + if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1; + else return 0; + })); + tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => { + return a[3].length - b[3].length; + })); + bomhead.appendChild(tr); +} + +function populateBomBody() { + while (bom.firstChild) { + bom.removeChild(bom.firstChild); + } + 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; + } + if (bomSortFunction) { + bomtable = bomtable.slice().sort(bomSortFunction); + } + for (var i in bomtable) { + var bomentry = bomtable[i]; + if (filter && !entryMatches(bomentry)) { + continue; + } + var references = bomentry[3]; + if (reflookup) { + references = findRefInEntry(bomentry); + if (references.length == 0) { + 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 (var checkbox of checkboxes) { + if (checkbox) { + td = document.createElement("TD"); + var 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.map(r => r[0]).join(", ")); + tr.appendChild(td); + // Extra fields + for (var i in config.extra_fields) { + td = document.createElement("TD"); + td.innerHTML = highlightFilter(bomentry[4][i]); + 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) { + handler(); + first = false; + } + } +} + +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() { + populateBomHeader(); + populateBomBody(); +} + +function modulesClicked(moduleIndexes) { + var lastClickedIndex = moduleIndexes.indexOf(lastClicked); + var index = moduleIndexes[(lastClickedIndex + 1) % moduleIndexes.length]; + for (var handler of highlightHandlers) { + if (handler.refs.map(r => r[1]).indexOf(index) >= 0) { + lastClicked = index; + 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-only") { + canvassplit.collapse(1); + } + break; + case 'B': + document.getElementById("bl-btn").classList.add("depressed"); + if (bomlayout != "bom-only") { + canvassplit.collapse(0); + } + break; + default: + document.getElementById("fb-btn").classList.add("depressed"); + if (bomlayout != "bom-only") { + 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-only': + 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 'top-bottom': + 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 'left-right': + 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 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 checkBomCheckbox(bomrowid, checkboxname) { + var checkboxnum = 0; + while (checkboxnum < checkboxes.length && + checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) { + checkboxnum++; + } + if (!bomrowid || checkboxnum >= checkboxes.length) { + return; + } + var bomrow = document.getElementById(bomrowid); + var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0]; + checkbox.checked = true; + checkbox.indeterminate = false; + checkbox.onchange(); +} + +function setBomCheckboxes(value) { + bomCheckboxes = value; + writeStorage("bomCheckboxes", value); + populateBomTable(); +} + +document.onkeydown = function(e) { + switch (e.key) { + case "n": + if (document.activeElement.type == "text") { + return; + } + if (currentHighlightedRowId !== null) { + checkBomCheckbox(currentHighlightedRowId, "placed"); + highlightNextRow(); + e.preventDefault(); + } + break; + 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-only"); + e.preventDefault(); + break; + case "x": + changeBomLayout("left-right"); + e.preventDefault(); + break; + case "c": + changeBomLayout("top-bottom"); + 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)); + } + } +} + +function initDefaults() { + bomlayout = readStorage("bomlayout"); + if (bomlayout === null) { + bomlayout = config.bom_view; + } + if (!['bom-only', 'left-right', 'top-bottom'].includes(bomlayout)) { + bomlayout = config.bom_view; + } + canvaslayout = readStorage("canvaslayout"); + if (canvaslayout === null) { + canvaslayout = config.layer_view; + } + bomCheckboxes = readStorage("bomCheckboxes"); + if (bomCheckboxes === null) { + bomCheckboxes = config.checkboxes; + } + document.getElementById("bomCheckboxes").value = bomCheckboxes; + + var b = readStorage("silkscreenVisible"); + if (b === null) { + b = config.show_silkscreen; + } + document.getElementById("silkscreenCheckbox").checked = b; + silkscreenVisible(b); + + b = readStorage("redrawOnDrag"); + if (b === null) { + b = config.redraw_on_drag; + } + document.getElementById("dragCheckbox").checked = b; + setRedrawOnDrag(b); + + b = readStorage("darkmode"); + if (b === null) { + b = config.dark_mode; + } + document.getElementById("darkmodeCheckbox").checked = b; + setDarkMode(b); + + b = readStorage("highlightpin1"); + if (b === null) { + b = config.highlight_pin1; + } + document.getElementById("highlightpin1Checkbox").checked = b; + setHighlightPin1(b); + + boardRotation = readStorage("boardRotation"); + if (boardRotation === null) { + boardRotation = config.board_rotation * 5; + } else { + boardRotation = parseInt(boardRotation); + } + document.getElementById("boardRotation").value = boardRotation / 5; + document.getElementById("rotationDegree").textContent = boardRotation; +} + +window.onload = function(e) { + initUtils(); + initRender(); + initStorage(); + initDefaults(); + cleanGutters(); + populateMetadata(); + dbgdiv = document.getElementById("dbg"); + bom = document.getElementById("bombody"); + bomhead = document.getElementById("bomhead"); + filter = ""; + reflookup = ""; + initDone = 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="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)"> + Highlight first pin + </label> + <label class="menu-label"> + <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)"> + Continuous redraw on drag + </label> + <label class="menu-label"> + <span>Board rotation</span> + <span style="float: right"><span id="rotationDegree">0</span>°</span> + <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)"> + </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> + <label class="menu-label"> + <span class="shameless-plug"> + <span>Created using</span> + <a target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a> + </span> + </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-only')" + title="BOM only"></button> + <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')" + title="BOM left, drawings right"></button> + <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')" + 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 class="button-container hideonprint" style="float: left"> + <button id="copy" title="Copy bom table to clipboard" + onclick="copyToClipboard()"></button> + </div> + </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> |