Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
<!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;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html, body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
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");
}
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");
}
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");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
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;
margin: 10px 10px 10px 0px;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@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;
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;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 10px 10px 10px 0px;
}
.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, .menu:hover .iobtn, .menu:hover .statsbtn {
background-color: #eee;
}
.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);
}
.menu-textbox.invalid, .dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.topmostdiv {
width: 100%;
height: 100%;
background-color: white;
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;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas, #backcanvas {
touch-action: none;
}
</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}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": true, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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rO5PUiOxo38sCXB7OuA1qOg038O362nW/Z1jOo50Lqk5276+o2yG8vXCAImCIW3cCfOkZ2OOz50wWig38sDgCIW5k2gusB3SWoB32OrG0Wmg83261a1P2rO0falPUfWrF1zalh0iGtF29Gnq1wuuO0GOnB0zm+F1P6iU0/Ogl2ZWth3DGsE3d2+W0Bmpl2pGsO0J256296ju3c23F00mwo3vmnTUFGtvVHmhTXhWoc0iOzXX8sKIBPm0l2ROwV2fayO3GWxp3tG/p2BO8LXJO8l3pW/LUwOuA0MO89UUmnJ00Otl2Oat+2cu6G1kO2o0kO5E1UO9F29O1V1n26W2vWjA3mOlu0IuxvW2u4l0tOkq0sAOGDeOl81qu8106ug53Nas53lWz11PG3l00u113n2jF34OvF3ia5m1vGx43Za0V0CavS0Jqhw3g20134O1B29WjK1pu/jWdm21VJuzk0/27HUElRy1Ku7B3IO/+2Bu/W1rq8t2DqyV2A6+5Wwu1F0QOr22Vuta3VuvW3Uu4U20uoN2NuzV372n020Onu2suqzVEOoNV0ulN0manF3Rux13Z2uN3yOhN26a0t36Wud2Kawt2ra2+2JW1w0eums3Kuxl1Tu7l1NmrZ32G/lhQAWF2YOix0Huh43kdey0oulM2O8Fl0Uu+K3auhLXs2q/U4gJi0Lugd2/u8w1Du2LW/ugJ0kuzB3yu512eG+t0qu9E2DunHXdGkd3eWht0ge7u1nW/V2Za7J2AmjD0Fqpx3Ma2d2Wu743WuyM0Ru1N1LGh13u25d3e2wZ2Ue7F1SWw9016+d0tuuC3CAeNjAuxZ0xup10yOra2ce7O09W8N29u6R2KOo61fKt93su0h3b22D11O152427908ekN1pmmC1iG/liYAf10ieql2fu1D20e/F38enK0FOje2TujLWZmzT2qq/dUMurtVt2nR0meyh0KerXX5u4N1721E0wWxq0kcNT1cuwT0JOlD2metW1nOuV2rO+934mux1vmhx2bu0j3zuld3OOtd2xq4O2Lqz413u8T02uol2Ru4T3ue3h21G5j1Wa/lj4wbW2AWjT32e4d22e5OhnOj62fG5Z0buzN20ukl0dun810erz02e2t2p69+04gMY38sZGA5e+636ex60pei11Lu7F26ejr3WO9h1t2xj3bu8j1we3j21e7t2Yuib34ukL0VesL2je910Puvd3/G+j3LeiF2+ezB2smxJ20Ghb05azJ0xaqL08qv62NGo70xq/ZCde5U1bu/b1aQMl0LqmzXbe271XGmzUXWu80le/lhKyHFXda2p2xm+D1DeiT2du3+11er/UTu7r3BujZ242pT3JG/lgIwRC2EOmD0Jekj2cWp91g+gr3pO4w3Gu091YenXU4ejHUsmyo3Ae7z2Eet43qu51XXegTUxe+DVnevlVyW6b29e2b3Puvh1Jesj1LewL1X24M07e0w14eptXMW7N0IO1n1imtD2wOub2Kql73mepa0eevi32u8b2S++U0ZejLX8sKIjte+G30+xN2E++r2Xe19X9elX1peoj0Ieym1owu11Se370zetX3e2qt3aes32D2pn0jem70BewX1Iu4L0C+kzWVelp1um/lhBANz09ey33ru9X2jqxH0aa780Ce230U+sJ0266n1xi2n3xu032++xn2uWvb2h+532KajN2i+vN3AmvN38++30u+3V1k68r2i+pt360qP2ruhH3R2gD2y+rr3Wer/Xyu+X04a/ljYgL70q60E1Y+wH0VugP2lakv3qGv72O+9k1Ie/m1x+zo1J2jLV5+6zWGu7D1Qenv3vWj63+2rA1p2ps1h+wnWz+3w0Eep1Vem8Y20O9P2Y+oz1Ber81++wl0h+mbXz+6rUR+9SF/qn92q+2P3vul13M+pj3euq438sP/gN+6vX5erT2a+he2V+vf01enT1hu3L05u+R2k+uNXE+zk3/uut3X+xb2j2xU0x+6L0Re5jXH+qVAtOwQ38sWwA3uxF2f+q337+3d0beyFDv+/dXxe5/1E+5l352iz0A+u73Ie431KWrv2/+yL0l+wQ0F+8I2G+9b2ASvV01+79X8sdNiP+ufUkB4LWwB6f2qG7gPa+6q0Q+qu27+qA1ieogOJelv3v6n73kBjv1n+iF0tO5T3v8R50l28/1QB6X3Se8v2w23X3JuyAPHeyF3XW4QCUcdgMCm6J2oBi/1SBva2Ve3z3Ve3APw+jQOm2tv0auk91D+4QOu2zP3o+yLWuB8w16BznX8scFVGBnrUmBi61retn0++6L09Wq53cB4IMO+1/0/q4q13+1r0IwCAD+EOAASUqDhjYVIMBEAIDJ4CtggAJyhVYbYAZgedUCRXfgp5S8ZgOCABSwG3B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"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* 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 bom_type of ["both", "F", "B"]) {
for (var row of pcbdata.bom[bom_type]) {
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;
};
if (val.includes(",")) {
return null;
}
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;
}
}
function validateSaveImgDimension(element) {
var valid = false;
var intValue = 0;
if (/^[1-9]\d*$/.test(element.value)) {
intValue = parseInt(element.value);
if (intValue <= 16000) {
valid = true;
}
}
if (valid) {
element.classList.remove("invalid");
} else {
element.classList.add("invalid");
}
return intValue;
}
function saveImage(layer) {
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
var bgcolor = null;
if (!document.getElementById("render-save-transparent").checked) {
var style = getComputedStyle(topmostdiv);
bgcolor = style.getPropertyValue("background-color");
}
if (!width || !height) return;
// Prepare image
var canvas = document.createElement("canvas");
var layerdict = {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
bg: canvas,
fab: canvas,
silk: canvas,
highlight: canvas,
layer: layer,
}
// Do the rendering
recalcLayerScale(layerdict, width, height);
prepareLayer(layerdict);
clearCanvas(canvas, bgcolor);
drawBackground(layerdict, false);
drawHighlightsOnLayer(layerdict, false);
// Save image
var imgdata = canvas.toDataURL("image/png");
var filename = pcbdata.metadata.title;
if (pcbdata.metadata.revision) {
filename += `.${pcbdata.metadata.revision}`;
}
filename += `.${layer}.png`;
saveFile(filename, dataURLtoBlob(imgdata));
}
function saveSettings() {
var data = {
type: "InteractiveHtmlBom settings",
version: 1,
pcbmetadata: pcbdata.metadata,
settings: settings,
}
var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}
function loadSettings() {
var input = document.createElement("input");
input.type = "file";
input.accept = ".settings.json";
input.onchange = function(e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = readerEvent => {
var content = readerEvent.target.result;
var newSettings;
try {
newSettings = JSON.parse(content);
} catch(e) {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
if (newSettings.type != "InteractiveHtmlBom settings") {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
if (metadataMatches) {
for (var k in pcbdata.metadata) {
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
metadataMatches = false;
}
}
}
if (!metadataMatches) {
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
if (!confirm(
`Settins file metadata does not match current metadata.\n\n` +
`Page metadata:\n${currentMetadata}\n\n` +
`Settings file metadata:\n${fileMetadata}\n\n` +
`Press OK if you would like to import settings anyway.`)) {
return;
}
}
overwriteSettings(newSettings.settings);
}
reader.readAsText(file, 'UTF-8');
}
input.click();
}
function overwriteSettings(newSettings) {
initDone = false;
Object.assign(settings, newSettings);
writeStorage("bomlayout", settings.bomlayout);
writeStorage("bommode", settings.bommode);
writeStorage("canvaslayout", settings.canvaslayout);
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
for (var checkbox of settings.checkboxes) {
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
}
padsVisible(settings.renderPads);
document.getElementById("padsCheckbox").checked = settings.renderPads;
fabricationVisible(settings.renderFabrication);
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
silkscreenVisible(settings.renderSilkscreen);
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
referencesVisible(settings.renderReferences);
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
valuesVisible(settings.renderValues);
document.getElementById("valuesCheckbox").checked = settings.renderValues;
tracksVisible(settings.renderTracks);
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
zonesVisible(settings.renderZones);
document.getElementById("zonesCheckbox").checked = settings.renderZones;
dnpOutline(settings.renderDnpOutline);
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
setRedrawOnDrag(settings.redrawOnDrag);
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
setDarkMode(settings.darkMode);
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
setHighlightPin1(settings.highlightpin1);
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
initDone = true;
prepCheckboxes();
changeBomLayout(settings.bomlayout);
}
function saveFile(filename, blob) {
var link = document.createElement("a");
var objurl = URL.createObjectURL(blob);
link.download = filename;
link.href = objurl;
link.click();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
var settings = {
canvaslayout: "default",
bomlayout: "default",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: false,
redrawOnDrag: true,
boardRotation: 0,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
}
function initDefaults() {
settings.bomlayout = readStorage("bomlayout");
if (settings.bomlayout === null) {
settings.bomlayout = config.bom_view;
}
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
settings.bomlayout = config.bom_view;
}
settings.bommode = readStorage("bommode");
if (settings.bommode === null) {
settings.bommode = "grouped";
}
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
settings.bommode = "grouped";
}
settings.canvaslayout = readStorage("canvaslayout");
if (settings.canvaslayout === null) {
settings.canvaslayout = config.layer_view;
}
var bomCheckboxes = readStorage("bomCheckboxes");
if (bomCheckboxes === null) {
bomCheckboxes = config.checkboxes;
}
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
document.getElementById("bomCheckboxes").value = bomCheckboxes;
function initBooleanSetting(storageString, def, elementId, func) {
var b = readStorage(storageString);
if (b === null) {
b = def;
} else {
b = (b == "true");
}
document.getElementById(elementId).checked = b;
func(b);
}
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
if ("tracks" in pcbdata) {
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
} else {
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
tracksVisible(false);
zonesVisible(false);
}
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
settings.boardRotation = readStorage("boardRotation");
if (settings.boardRotation === null) {
settings.boardRotation = config.board_rotation * 5;
} else {
settings.boardRotation = parseInt(settings.boardRotation);
}
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
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) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if (text.svgpath) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
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));
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]) {
if (c == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
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]) {
if (c == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
}
for (var line of pcbdata.font_data[c].l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var i = 1; i < line.length; i++) {
ctx.lineTo(...calcFontPoint(line[i], 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.svgpath) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if (shape.svgpath) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, shape, color) {
ctx.save();
ctx.fillStyle = color;
if (!shape.svgpath) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
ctx.fill(getPolygonsPath(shape));
ctx.restore();
}
function drawDrawing(ctx, layer, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve"].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 getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline, hole) {
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 path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
if (pad.type == "th" && hole) {
if (pad.offset) {
ctx.translate(-pad.offset[0], -pad.offset[1]);
}
ctx.fillStyle = "#CCCCCC";
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
}
ctx.restore();
}
function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
if (highlight) {
// draw bounding box
if (module.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...module.bbox.pos);
ctx.rotate(deg2rad(-module.bbox.angle));
ctx.translate(...module.bbox.relpos);
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
if (settings.renderPads) {
for (var pad of module.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padcolor, outline, true);
if (pad.pin1 && settings.highlightpin1) {
drawPad(ctx, pad, outlinecolor, true, false);
}
}
}
}
}
function drawEdgeCuts(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) {
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];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
if (!highlight || highlightedModules.includes(i)) {
drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata[layername][layer]) {
if (["segment", "arc", "circle", "curve"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, d, polygonColor);
} else {
drawtext(ctx, d, textColor, layer == "B");
}
}
}
function drawTracks(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.lineCap = "round";
for(var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
ctx.lineWidth = track.width;
ctx.beginPath();
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
ctx.stroke();
}
}
function drawZones(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineJoin = "round";
for(var zone of pcbdata.zones[layer]) {
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
if (highlight && highlightedNet != zone.net) continue;
ctx.lineWidth = zone.width ? zone.width : 0;
ctx.fill(zone.path2d);
ctx.stroke(zone.path2d);
}
}
function clearCanvas(canvas, color = null) {
var ctx = canvas.getContext("2d");
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
if (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
} else {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var ctx = canvas.getContext("2d");
for (var mod of pcbdata.modules) {
// draw pads
for (var pad of mod.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false, true);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (highlightedModules.length > 0) {
drawModules(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawModules(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
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(settings.boardRotation));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer == "B");
for (var c of ["bg", "fab", "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, settings.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(layerdict, width, height) {
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;
}
layerdict.transform.s = scalefactor;
var flip = (layerdict.layer == "B");
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, -pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for(var track of pcbdata.tracks[layer]) {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
// Check pads
if (settings.renderPads) {
for (var mod of pcbdata.modules) {
for(var pad of mod.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinModuleBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.modules.length; i++) {
var module = pcbdata.modules[i];
if (module.layer == layer) {
if (pointWithinModuleBbox(x, y, module.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
if (layerdict.layer == "B") {
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
} else {
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
}
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
var v = rotateVector([x, y], -settings.boardRotation);
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var modules = bboxHitScan(layerdict.layer, ...v);
if (modules.length > 0) {
modulesClicked(modules);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist/oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.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 += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function initRender() {
allcanvas = {
front: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("F_bg"),
fab: document.getElementById("F_fab"),
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,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("B_bg"),
fab: document.getElementById("B_fab"),
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 initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var moduleIndexToHandler = {};
var netsToHandler = {};
var highlightedModules = [];
var highlightedNet = null;
var lastClicked;
function dbg(html) {
dbgdiv.innerHTML = html;
}
function redrawIfInitDone() {
if (initDone) {
redrawCanvas(allcanvas.front);
redrawCanvas(allcanvas.back);
}
}
function padsVisible(value) {
writeStorage("padsVisible", value);
settings.renderPads = value;
redrawIfInitDone();
}
function referencesVisible(value) {
writeStorage("referencesVisible", value);
settings.renderReferences = value;
redrawIfInitDone();
}
function valuesVisible(value) {
writeStorage("valuesVisible", value);
settings.renderValues = value;
redrawIfInitDone();
}
function tracksVisible(value) {
writeStorage("tracksVisible", value);
settings.renderTracks = value;
redrawIfInitDone();
}
function zonesVisible(value) {
writeStorage("zonesVisible", value);
settings.renderZones = value;
redrawIfInitDone();
}
function dnpOutline(value) {
writeStorage("dnpOutline", value);
settings.renderDnpOutline = value;
redrawIfInitDone();
}
function setDarkMode(value) {
if (value) {
topmostdiv.classList.add("dark");
} else {
topmostdiv.classList.remove("dark");
}
writeStorage("darkmode", value);
settings.darkMode = value;
redrawIfInitDone();
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
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;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
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]);
}
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
}
}
function clearHighlightedModules() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedModules = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function() {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedModules = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
for (var ref of entry[3]) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
// check extra fields
for (var i in config.extra_fields) {
if (entry[4][i].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 < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (checkboxnum >= settings.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);
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;
}
}
if (settings.bommode == "netlist") {
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
});
tr.appendChild(th);
} else {
for (var checkbox of settings.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;
}));
if (settings.bommode == "grouped") {
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 = [];
moduleIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
if (settings.bommode == "netlist") {
bomtable = pcbdata.nets.slice();
} else {
switch (settings.canvaslayout) {
case 'F':
bomtable = pcbdata.bom.F.slice();
break;
case 'FB':
bomtable = pcbdata.bom.both.slice();
break;
case 'B':
bomtable = pcbdata.bom.B.slice();
break;
}
if (settings.bommode == "ungrouped") {
// expand bom table
expandedTable = []
for (var bomentry of bomtable) {
for (var ref of bomentry[3]) {
expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
}
}
bomtable = expandedTable;
}
}
if (bomSortFunction) {
bomtable = bomtable.sort(bomSortFunction);
}
for (var i in bomtable) {
var bomentry = bomtable[i];
if (filter && !entryMatches(bomentry)) {
continue;
}
var references = null;
var netname = null;
var tr = document.createElement("TR");
var td = document.createElement("TD");
var rownum = +i + 1;
tr.id = "bomrow" + rownum;
td.textContent = rownum;
tr.appendChild(td);
if (settings.bommode == "netlist") {
netname = bomentry;
td = document.createElement("TD");
td.innerHTML = highlightFilter(netname ? netname : "<no net>");
tr.appendChild(td);
} else {
if (reflookup) {
references = findRefInEntry(bomentry);
if (references.length == 0) {
continue;
}
} else {
references = bomentry[3];
}
// Checkboxes
for (var checkbox of settings.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);
if (settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = bomentry[3].length;
tr.appendChild(td);
}
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
moduleIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
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);
for (var i = 1; i <= moduleIndexes.length; i++) {
var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
if (refIndex in moduleIndexToHandler) {
lastClicked = refIndex;
moduleIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedModules();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
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 (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
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";
}
var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
for (var i = 0; i < pcbdata.modules.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.modules[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
}
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
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedModules();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.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 < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.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) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").filter((e) => e);
prepCheckboxes();
populateBomTable();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
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 hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
window.onload = function(e) {
initUtils();
initRender();
initStorage();
initDefaults();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
prepCheckboxes();
// Triggers render
changeBomLayout(settings.bomlayout);
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div style="float: right; height: 100%;">
<div class="hideonprint menu" style="float: right; 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="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Show footprint pads
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP components outlined
</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; 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; 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 class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
</div>
</div>
</div>
</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">
Company
</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="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<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" touch-action="none" 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_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" 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_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
a79b79047This file is pinned to the selected release. Download the original to open it in your design tool.