1
0
mirror of https://github.com/UzixLS/zx-sizif-128.git synced 2025-07-18 23:01:28 +03:00
Files
zx-sizif-128/out/bom_interactive.rev.A.html
2020-10-12 21:46:56 +03:00

3429 lines
222 KiB
HTML
Vendored

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-color-highlight: #D04040;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #b4ff03;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html, body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 10px 10px 10px 0px;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 5px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
}
.bom th, .bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th, .dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 25px;
}
.bom .Description {
width: 10%;
}
.bom .Part {
width: 10%;
}
.bom .Value {
width: 15%;
}
.bom .Quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal, .gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 10px 10px 10px 0px;
}
.menu-content {
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid, .dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.topmostdiv {
width: 100%;
height: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
height: 78px;
border-bottom: 2px solid black;
}
.dark #top {
border-bottom: 2px solid #ccc;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas, #backcanvas {
touch-action: none;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* 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]);
}
padsVisible(settings.renderPads);
document.getElementById("padsCheckbox").checked = settings.renderPads;
fabricationVisible(settings.renderFabrication);
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
silkscreenVisible(settings.renderSilkscreen);
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
referencesVisible(settings.renderReferences);
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
valuesVisible(settings.renderValues);
document.getElementById("valuesCheckbox").checked = settings.renderValues;
tracksVisible(settings.renderTracks);
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
zonesVisible(settings.renderZones);
document.getElementById("zonesCheckbox").checked = settings.renderZones;
dnpOutline(settings.renderDnpOutline);
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
setRedrawOnDrag(settings.redrawOnDrag);
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
setDarkMode(settings.darkMode);
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
setHighlightPin1(settings.highlightpin1);
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
initDone = true;
prepCheckboxes();
changeBomLayout(settings.bomlayout);
}
function saveFile(filename, blob) {
var link = document.createElement("a");
var objurl = URL.createObjectURL(blob);
link.download = filename;
link.href = objurl;
link.click();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
var settings = {
canvaslayout: "default",
bomlayout: "default",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: false,
redrawOnDrag: true,
boardRotation: 0,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
}
function initDefaults() {
settings.bomlayout = readStorage("bomlayout");
if (settings.bomlayout === null) {
settings.bomlayout = config.bom_view;
}
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
settings.bomlayout = config.bom_view;
}
settings.bommode = readStorage("bommode");
if (settings.bommode === null) {
settings.bommode = "grouped";
}
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
settings.bommode = "grouped";
}
settings.canvaslayout = readStorage("canvaslayout");
if (settings.canvaslayout === null) {
settings.canvaslayout = config.layer_view;
}
var bomCheckboxes = readStorage("bomCheckboxes");
if (bomCheckboxes === null) {
bomCheckboxes = config.checkboxes;
}
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
document.getElementById("bomCheckboxes").value = bomCheckboxes;
function initBooleanSetting(storageString, def, elementId, func) {
var b = readStorage(storageString);
if (b === null) {
b = def;
} else {
b = (b == "true");
}
document.getElementById(elementId).checked = b;
func(b);
}
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
if ("tracks" in pcbdata) {
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
} else {
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
tracksVisible(false);
zonesVisible(false);
}
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
settings.boardRotation = readStorage("boardRotation");
if (settings.boardRotation === null) {
settings.boardRotation = config.board_rotation * 5;
} else {
settings.boardRotation = parseInt(settings.boardRotation);
}
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
var point = [
linepoint[0] * text.width + offsetx,
linepoint[1] * text.height + offsety
];
// Adding half a line height here is technically a bug
// but pcbnew currently does the same, text is slightly shifted.
point[0] -= (point[1] + text.height * 0.5) * tilt;
return point;
}
function drawtext(ctx, text, color, flip) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if (text.svgpath) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
ctx.translate(...text.pos);
var angle = -text.angle;
if (text.attr.includes("mirrored")) {
ctx.scale(-1, 1);
angle = -angle;
}
var tilt = 0;
if (text.attr.includes("italic")) {
tilt = 0.125;
}
var interline = (text.height * 1.5 + text.thickness) / 2;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
for (var i in txt) {
var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
var lineWidth = 0;
for (var c of txt[i]) {
if (c == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
lineWidth += pcbdata.font_data[c].w * text.width;
}
}
var offsetx = 0;
switch (text.horiz_justify) {
case -1:
// Justify left, do nothing
break;
case 0:
// Justify center
offsetx -= lineWidth / 2;
break;
case 1:
// Justify right
offsetx -= lineWidth;
break;
}
for (var c of txt[i]) {
if (c == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
}
for (var line of pcbdata.font_data[c].l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var i = 1; i < line.length; i++) {
ctx.lineTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));
}
ctx.stroke();
}
offsetx += pcbdata.font_data[c].w * text.width;
}
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
ctx.lineCap = "round";
if (edge.svgpath) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if (shape.svgpath) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, shape, color) {
ctx.save();
ctx.fillStyle = color;
if (!shape.svgpath) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
ctx.fill(getPolygonsPath(shape));
ctx.restore();
}
function drawDrawing(ctx, layer, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, drawing, color);
} else {
drawtext(ctx, drawing, color, layer == "B");
}
}
function getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline, hole) {
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(deg2rad(pad.angle));
if (pad.offset) {
ctx.translate(...pad.offset);
}
ctx.fillStyle = color;
ctx.strokeStyle = color;
var path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
if (pad.type == "th" && hole) {
if (pad.offset) {
ctx.translate(-pad.offset[0], -pad.offset[1]);
}
ctx.fillStyle = "#CCCCCC";
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
}
ctx.restore();
}
function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
if (highlight) {
// draw bounding box
if (module.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...module.bbox.pos);
ctx.rotate(deg2rad(-module.bbox.angle));
ctx.translate(...module.bbox.relpos);
ctx.fillStyle = padcolor;
ctx.fillRect(0, 0, ...module.bbox.size);
ctx.globalAlpha = 1;
ctx.strokeStyle = padcolor;
ctx.strokeRect(0, 0, ...module.bbox.size);
ctx.restore();
}
}
// draw drawings
for (var drawing of module.drawings) {
if (drawing.layer == layer) {
drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
}
}
// draw pads
if (settings.renderPads) {
for (var pad of module.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padcolor, outline, true);
if (pad.pin1 && settings.highlightpin1) {
drawPad(ctx, pad, outlinecolor, true, false);
}
}
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawedge(ctx, scalefactor, edge, edgecolor);
}
}
function drawModules(canvas, layer, scalefactor, highlight) {
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3 / scalefactor;
var style = getComputedStyle(topmostdiv);
var padcolor = style.getPropertyValue('--pad-color');
var outlinecolor = style.getPropertyValue('--pin1-outline-color');
if (highlight) {
padcolor = style.getPropertyValue('--pad-color-highlight');
outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
}
for (var i = 0; i < pcbdata.modules.length; i++) {
var mod = pcbdata.modules[i];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
if (!highlight || highlightedModules.includes(i)) {
drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata[layername][layer]) {
if (["segment", "arc", "circle", "curve"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, d, polygonColor);
} else {
drawtext(ctx, d, textColor, layer == "B");
}
}
}
function drawTracks(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.lineCap = "round";
for(var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
ctx.lineWidth = track.width;
ctx.beginPath();
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
ctx.stroke();
}
}
function drawZones(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineJoin = "round";
for(var zone of pcbdata.zones[layer]) {
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
if (highlight && highlightedNet != zone.net) continue;
ctx.lineWidth = zone.width ? zone.width : 0;
ctx.fill(zone.path2d);
ctx.stroke(zone.path2d);
}
}
function clearCanvas(canvas, color = null) {
var ctx = canvas.getContext("2d");
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
if (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
} else {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var ctx = canvas.getContext("2d");
for (var mod of pcbdata.modules) {
// draw pads
for (var pad of mod.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false, true);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (highlightedModules.length > 0) {
drawModules(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawModules(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
function prepareCanvas(canvas, flip, transform) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
var fontsize = 1.55;
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer == "B");
for (var c of ["bg", "fab", "silk", "highlight"]) {
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
}
}
function rotateVector(v, angle) {
angle = deg2rad(angle);
return [
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
];
}
function applyRotation(bbox) {
var corners = [
[bbox.minx, bbox.miny],
[bbox.minx, bbox.maxy],
[bbox.maxx, bbox.miny],
[bbox.maxx, bbox.maxy],
];
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
return {
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
}
}
function recalcLayerScale(layerdict, width, height) {
var bbox = applyRotation(pcbdata.edges_bbox);
var scalefactor = 0.98 * Math.min(
width / (bbox.maxx - bbox.minx),
height / (bbox.maxy - bbox.miny)
);
if (scalefactor < 0.1) {
scalefactor = 1;
}
layerdict.transform.s = scalefactor;
var flip = (layerdict.layer == "B");
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, -pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for(var track of pcbdata.tracks[layer]) {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
// Check pads
if (settings.renderPads) {
for (var mod of pcbdata.modules) {
for(var pad of mod.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinModuleBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.modules.length; i++) {
var module = pcbdata.modules[i];
if (module.layer == layer) {
if (pointWithinModuleBbox(x, y, module.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
if (layerdict.layer == "B") {
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
} else {
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
}
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
var v = rotateVector([x, y], -settings.boardRotation);
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var modules = bboxHitScan(layerdict.layer, ...v);
if (modules.length > 0) {
modulesClicked(modules);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist/oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
}
function handleMouseWheel(e, layerdict) {
e.preventDefault();
e.stopPropagation();
var t = layerdict.transform;
var wheeldelta = e.deltaY;
if (e.deltaMode == 1) {
// FF only, scroll by lines
wheeldelta *= 30;
} else if (e.deltaMode == 2) {
wheeldelta *= 300;
}
var m = Math.pow(1.1, -wheeldelta / 40);
// Limit amount of zoom per tick.
if (m > 2) {
m = 2;
} else if (m < 0.5) {
m = 0.5;
}
t.zoom *= m;
var zoomd = (1 - m) / t.zoom;
t.panx += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function initRender() {
allcanvas = {
front: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("F_bg"),
fab: document.getElementById("F_fab"),
silk: document.getElementById("F_slk"),
highlight: document.getElementById("F_hl"),
layer: "F",
},
back: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("B_bg"),
fab: document.getElementById("B_fab"),
silk: document.getElementById("B_slk"),
highlight: document.getElementById("B_hl"),
layer: "B",
}
};
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* DOM manipulation and misc code */
var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var moduleIndexToHandler = {};
var netsToHandler = {};
var highlightedModules = [];
var highlightedNet = null;
var lastClicked;
function dbg(html) {
dbgdiv.innerHTML = html;
}
function redrawIfInitDone() {
if (initDone) {
redrawCanvas(allcanvas.front);
redrawCanvas(allcanvas.back);
}
}
function padsVisible(value) {
writeStorage("padsVisible", value);
settings.renderPads = value;
redrawIfInitDone();
}
function referencesVisible(value) {
writeStorage("referencesVisible", value);
settings.renderReferences = value;
redrawIfInitDone();
}
function valuesVisible(value) {
writeStorage("valuesVisible", value);
settings.renderValues = value;
redrawIfInitDone();
}
function tracksVisible(value) {
writeStorage("tracksVisible", value);
settings.renderTracks = value;
redrawIfInitDone();
}
function zonesVisible(value) {
writeStorage("zonesVisible", value);
settings.renderZones = value;
redrawIfInitDone();
}
function dnpOutline(value) {
writeStorage("dnpOutline", value);
settings.renderDnpOutline = value;
redrawIfInitDone();
}
function setDarkMode(value) {
if (value) {
topmostdiv.classList.add("dark");
} else {
topmostdiv.classList.remove("dark");
}
writeStorage("darkmode", value);
settings.darkMode = value;
redrawIfInitDone();
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
function getStoredCheckboxRefs(checkbox) {
function convert(ref) {
var intref = parseInt(ref);
if (isNaN(intref)) {
for (var i = 0; i < pcbdata.modules.length; i++) {
if (pcbdata.modules[i].ref == ref) {
return i;
}
}
return -1;
} else {
return intref;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
function getCheckboxState(checkbox, references) {
var storedRefsSet = getStoredCheckboxRefs(checkbox);
var currentRefsSet = new Set(references.map(r => r[1]));
// Get difference of current - stored
var difference = new Set(currentRefsSet);
for (ref of storedRefsSet) {
difference.delete(ref);
}
if (difference.size == 0) {
// All the current refs are stored
return "checked";
} else if (difference.size == currentRefsSet.size) {
// None of the current refs are stored
return "unchecked";
} else {
// Some of the refs are stored
return "indeterminate";
}
}
function setBomCheckboxState(checkbox, element, references) {
var state = getCheckboxState(checkbox, references);
element.checked = (state == "checked");
element.indeterminate = (state == "indeterminate");
}
function createCheckboxChangeHandler(checkbox, references) {
return function() {
refsSet = getStoredCheckboxRefs(checkbox);
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
}
}
function clearHighlightedModules() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedModules = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function() {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedModules = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
for (var ref of entry[3]) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
// check extra fields
for (var i in config.extra_fields) {
if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
// check value
if (entry[1].toLowerCase().indexOf(filter) >= 0) {
return true;
}
// check footprint
if (entry[2].toLowerCase().indexOf(filter) >= 0) {
return true;
}
return false;
}
function findRefInEntry(entry) {
return entry[3].filter(r => r[0].toLowerCase() == reflookup);
}
function highlightFilter(s) {
if (!filter) {
return s;
}
var parts = s.toLowerCase().split(filter);
if (parts.length == 1) {
return s;
}
var r = "";
var pos = 0;
for (var i in parts) {
if (i > 0) {
r += '<mark class="highlight">' +
s.substring(pos, pos + filter.length) +
'</mark>';
pos += filter.length;
}
r += s.substring(pos, pos + parts[i].length);
pos += parts[i].length;
}
return r;
}
function checkboxSetUnsetAllHandler(checkboxname) {
return function() {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (checkboxnum >= settings.checkboxes.length) {
return;
}
var allset = true;
var checkbox;
var row;
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
if (!checkbox.checked || checkbox.indeterminate) {
allset = false;
break;
}
}
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = !allset;
checkbox.indeterminate = false;
checkbox.onchange();
}
}
}
function createColumnHeader(name, cls, comparator) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
th.style.cursor = "pointer";
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
th.onclick = function() {
if (currentSortColumn && this !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && this === currentSortColumn) {
// Already sorted by this column
if (currentSortOrder == "asc") {
// Sort by this column, descending order
bomSortFunction = function(a, b) {
return -comparator(a, b);
}
currentSortColumn.childNodes[1].classList.remove("asc");
currentSortColumn.childNodes[1].classList.add("desc");
currentSortOrder = "desc";
} else {
// Unsort
bomSortFunction = null;
currentSortColumn.childNodes[1].classList.remove("desc");
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
} else {
// Sort by this column, ascending order
bomSortFunction = comparator;
currentSortColumn = this;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
return th;
}
function populateBomHeader() {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
tr.appendChild(th);
var checkboxCompareClosure = function(checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a[3]);
var stateB = getCheckboxState(checkbox, b[3]);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
if (settings.bommode == "netlist") {
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
});
tr.appendChild(th);
} else {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
th.onclick = fancyDblClickHandler(
th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
tr.appendChild(th);
}
tr.appendChild(createColumnHeader("References", "References", (a, b) => {
var i = 0;
while (i < a[3].length && i < b[3].length) {
if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
i++;
}
return a[3].length - b[3].length;
}));
// Extra fields
if (config.extra_fields.length > 0) {
var extraFieldCompareClosure = function(fieldIndex) {
return (a, b) => {
var fa = a[4][fieldIndex];
var fb = b[4][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
for (var i in config.extra_fields) {
tr.appendChild(createColumnHeader(
config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
}
}
tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
return valueCompare(a[5], b[5], a[1], b[1]);
}));
tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
else return 0;
}));
if (settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
return a[3].length - b[3].length;
}));
}
}
bomhead.appendChild(tr);
}
function populateBomBody() {
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
moduleIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
if (settings.bommode == "netlist") {
bomtable = pcbdata.nets.slice();
} else {
switch (settings.canvaslayout) {
case 'F':
bomtable = pcbdata.bom.F.slice();
break;
case 'FB':
bomtable = pcbdata.bom.both.slice();
break;
case 'B':
bomtable = pcbdata.bom.B.slice();
break;
}
if (settings.bommode == "ungrouped") {
// expand bom table
expandedTable = []
for (var bomentry of bomtable) {
for (var ref of bomentry[3]) {
expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
}
}
bomtable = expandedTable;
}
}
if (bomSortFunction) {
bomtable = bomtable.sort(bomSortFunction);
}
for (var i in bomtable) {
var bomentry = bomtable[i];
if (filter && !entryMatches(bomentry)) {
continue;
}
var references = null;
var netname = null;
var tr = document.createElement("TR");
var td = document.createElement("TD");
var rownum = +i + 1;
tr.id = "bomrow" + rownum;
td.textContent = rownum;
tr.appendChild(td);
if (settings.bommode == "netlist") {
netname = bomentry;
td = document.createElement("TD");
td.innerHTML = highlightFilter(netname ? netname : "&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);
td.appendChild(input);
tr.appendChild(td);
}
}
// References
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
// Extra fields
for (var i in config.extra_fields) {
td = document.createElement("TD");
td.innerHTML = highlightFilter(bomentry[4][i]);
tr.appendChild(td);
}
// Value
td = document.createElement("TD");
td.innerHTML = highlightFilter(bomentry[1]);
tr.appendChild(td);
// Footprint
td = document.createElement("TD");
td.innerHTML = highlightFilter(bomentry[2]);
tr.appendChild(td);
if (settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = bomentry[3].length;
tr.appendChild(td);
}
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
moduleIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
if ((filter || reflookup) && first) {
handler();
first = false;
}
}
}
function highlightPreviousRow() {
if (!currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[0].id == currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
for (var i = 0; i < highlightHandlers.length - 1; i++) {
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function highlightNextRow() {
if (!currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
for (var i = 1; i < highlightHandlers.length; i++) {
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function populateBomTable() {
populateBomHeader();
populateBomBody();
}
function modulesClicked(moduleIndexes) {
var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
for (var i = 1; i <= moduleIndexes.length; i++) {
var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
if (refIndex in moduleIndexToHandler) {
lastClicked = refIndex;
moduleIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedModules();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
function changeCanvasLayout(layout) {
document.getElementById("fl-btn").classList.remove("depressed");
document.getElementById("fb-btn").classList.remove("depressed");
document.getElementById("bl-btn").classList.remove("depressed");
switch (layout) {
case 'F':
document.getElementById("fl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
function populateMetadata() {
document.getElementById("title").innerHTML = pcbdata.metadata.title;
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
document.getElementById("company").innerHTML = pcbdata.metadata.company;
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
if (pcbdata.metadata.title != "") {
document.title = pcbdata.metadata.title + " BOM";
}
var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
for (var i = 0; i < pcbdata.modules.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.modules[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
}
function changeBomLayout(layout) {
document.getElementById("bom-btn").classList.remove("depressed");
document.getElementById("lr-btn").classList.remove("depressed");
document.getElementById("tb-btn").classList.remove("depressed");
switch (layout) {
case 'bom-only':
document.getElementById("bom-btn").classList.add("depressed");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
document.getElementById("frontcanvas").style.display = "none";
document.getElementById("backcanvas").style.display = "none";
document.getElementById("bot").style.height = "";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.remove("split-horizontal");
document.getElementById("canvasdiv").classList.remove("split-horizontal");
document.getElementById("frontcanvas").classList.add("split-horizontal");
document.getElementById("backcanvas").classList.add("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
direction: "vertical",
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
onDragEnd: resizeAll
});
break;
case 'left-right':
document.getElementById("lr-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.add("split-horizontal");
document.getElementById("canvasdiv").classList.add("split-horizontal");
document.getElementById("frontcanvas").classList.remove("split-horizontal");
document.getElementById("backcanvas").classList.remove("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeAll
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedModules();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").filter((e) => e);
prepCheckboxes();
populateBomTable();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
document.onkeydown = function(e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
}
}
}
function hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
window.onload = function(e) {
initUtils();
initRender();
initStorage();
initDefaults();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
prepCheckboxes();
// Triggers render
changeBomLayout(settings.bomlayout);
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div style="float: right; height: 100%;">
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="menubtn"></button>
<div class="menu-content">
<label class="menu-label menu-label-top">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label>
<label class="menu-label">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Show footprint pads
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP components outlined
</label>
<label class="menu-label">
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
Highlight first pin
</label>
<label class="menu-label">
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
<span>Board rotation</span>
<span style="float: right"><span id="rotationDegree">0</span>&#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">
<span class="shameless-plug">
<span>Created using</span>
<a target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
</div>
</div>
</div>
</div>
</div>
<div id="fileinfodiv" style="overflow: auto;">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="bot" class="split" style="height: calc(100% - 80px)">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="copyToClipboard()"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>