osmo-e1-hardware/hardware/icE1usb/r1.0/icE1usb-ibom.html

3620 lines
240 KiB
HTML

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