rusefi_documentation/ibom-backup/hw48na_V0.2.html

3582 lines
254 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
: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.checked {
color: #aaa;
}
.dark .bom tr.checked {
color: #666;
}
.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;
}
.radio-container {
margin: 4px;
}
.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": false, "bom_view": "left-right", "board_rotation": 0.0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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f5m/mZ+TK5jTk3KerZqOn5+XD5ZPlw2cAF3nmgeQW5x3mWGdx5xvniWXN5Zvl4GawFTflTOW9Z8XnE+eLZpYk7eWEKllY9cNT5evnXuZN5YTny+eQseiDj+fs5dAXpufE58AUaeaahcwpoeVc5xAWkefA5zdmC+bI5qfkb+VIFLzkS+aH5wbkYBdDBMeEg+YX5OgXSBaf5k/kMBRm5nele+coFugW5uWN56gXu+Te5FfkZWVX5WVl8eT0Z8JleBdIFX/keObb5i+li2UnZPjk7uRE5EQVtuTMZKPkP+fS5kHmABeT5eIiEbH4yKnlyBQh5mgV2mQgFTgVtuU95BgV8+WXOnLmqaZH5uHnmBfBM3gWW2dRZJTnvOeH5nznCXg4FzAWJgbkFpooNOTn543n5aQq5c2kF+V0F6qEqBWq53TmuBedZ6QWXWdwFz/mPuZj5z7nY+QIFPQUYEia5rhk/+QnZ9vnWuY4FcJo5eD35agU5qWB5nHmD+XnZjvmP2QqKejl7OewFdmnT+eAF7+kXBfsFFzlI2VtSiflfKXLpNQVr+XV50fnQ7qZ52/lL+VL5SfkC+eQFh/meBRQwTwXHmcr5ffmq+YwFF/mSBUFWqHk+Bbf5AwU32ZwF6VlP+SW563Cm+csF4QXghYiFUQWieTEFFrmGmVa523kQBXiFpnntudCFM2m0+fcFowUCHhCFSKLXeX15cAXFBdoFewVaeeUFAIWYeXv5dWnQuS5ZJNl3eRSFynm/eau5LQXoBSv57QXA+Ym5ILmXBb0F2fk6GSyFsIVGOfCFaCiMhSX57DngeYEFGIX3uSF5iwVheWEF0llqhYiFBPlNCl+5ogVomSfZOwX0hdPRi4qsOb35moUnBcc5Q/nVOQB5MYpXBcz5N3l32ZkFHdm90Y3w/rkVea8Fz3m8hWjZ2dlzuXL5QoUbimVgRHm1KZI5koVA+Y3unQWd+XCadoWQhSKZKIUoWXS5swUqheSFUYWrOUlZebl+BUDZaIVTeY4pEYpluci55vkHiv6F6LlC2QH2ItkbeWQZpIUSBbmF7oWBOQd5joVdudEZLoWJBQ551YXRhdAFsnkFBYV5bPlshYk5I/l5hWUFrLmS+TyFQIXGBVy5XwVR+YH5ph41hYK5hAUJ+cGFc4VkBd1pEYVghZOF8oWt6VMFAQWtOQ+RGvn7hRMFPnkZhQ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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;
};
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]);
}
writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
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;
settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
populateDarkenWhenCheckedOptions();
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;
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function() {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function(eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function(eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for(callback of this.callbacks[eventType])
callback(event);
for(callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* 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 setFullscreen(value) {
if (value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
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(evt) {
refsSet = getStoredCheckboxRefs(checkbox);
var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (darkenWhenChecked) {
evt.target.parentElement.parentElement.classList.add("checked");
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (darkenWhenChecked) {
evt.target.parentElement.parentElement.classList.remove("checked");
}
eventArgs.state = 'unchecked';
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
}
}
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();
EventHandler.emitEvent(
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
{
rowid: rowid,
refs: refs,
net: net
});
}
}
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 : "&lt;no net&gt;");
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);
if (input.checked && settings.darkenWhenChecked == checkbox) {
tr.classList.add("checked");
}
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";
}
// Calculate board stats
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;
// Update version string
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}
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();
populateDarkenWhenCheckedOptions();
}
function setDarkenWhenChecked(value) {
writeStorage("darkenWhenChecked", value);
settings.darkenWhenChecked = value;
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 populateDarkenWhenCheckedOptions() {
var container = document.getElementById("darkenWhenCheckedContainer");
if (settings.checkboxes.length == 0) {
container.parentElement.style.display = "none";
return;
}
container.innerHTML = '';
container.parentElement.style.display = "inline-block";
function createOption(name, displayName) {
var id = "darkenWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "darkenWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setDarkenWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.darkenWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, 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);
// Users may leave fullscreen without touching the checkbox. Uncheck.
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement)
document.getElementById('fullscreenCheckbox').checked = false;
});
}
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" style="width: calc(50% - 18px)">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label><!-- This comment eats space! All of it!
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
Full Screen
</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" style="width: calc(50% - 18px)">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Pads
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP 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>&#176;</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">
<div style="margin-left: 5px">Darken when checked</div>
<div id="darkenWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" 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>