Files
PCB-VU-Meter/VUmeter/bom/ibom.html

4415 lines
288 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-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--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;
position: relative;
}
.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: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.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;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
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 {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
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;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// 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": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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5PD3YE9sZjDgyM+AMMjuMN2w6wjiQA/g3mDf4NLQ7MjHsPXI3EjtyOpkHzsU7GfwzmDQHbsQ0gjYkSXw1FDuyOxw98j9cNAI2cjtSM3Q2lDGcOxI5Ajr8Oow5+cOQaJseMjyG4bI7/DdKMswwyj18NMo0cj8iPsw7fDICOAo9gj6sO4IwpDoKPaw+CjzSOQo3YAp4Owo50j8KM3gz0jVuTi8XaxONqzw0MjNsNvg5ij4yM4o7TBv8M8I4kAoABmI5Yjk8OCdnOq+3HtqOMjRcOIQ5sjF8Oywx8jfEMSowcjCcPHI3lapyORI/KjPMP2ACYj4CNco1AjqYMu9cUoAq1uo4HDDsMeo9SjoUMyw1DafiMYQ58jjKMBoz8jQaNQ2iGjcqPNg4EArcMaw3gjiQAEI2qjSYMaoz1DHSNjw10jCKP0Q7U667KJaMajDCMTQzjDtsNhaJajhMPBgzSjTkMEo7wj0aM8o5PDZybTebggWKPlAHtD58POvKOeGaOyI4AjfyPAIwCjxaMPw5cjnKNEo9yjjqNNoxqRLKb+QyfD06PEw3OjziPyw9fDLKOho6ujpaNKo5DDO8OzAN3DJCO9wyaDaVpwozpDqMNZopZJL0MAI6ijiQCTQxij3aNJowTDhjB9o2mjyCO2o2YAt6MPQ8LDgMUNvpBpk6MII/tDk4M+o1fDaCMAw8rDK6PrgxcjHKNPw8Oj26PPpou+sGOCo4ejNKPvI8hj1UMyo2hjNSNho3UjiqMNIyqjt6P3o0aDvcOng8+jOqOvo7eD/8lrfXNY5ikmo2ijZqOjIxSj34NpBrijUyNvIxvD0QDuw0Ojm6Mxo+xjJ8kjnLSwk6Mpo6HDjiMoI+hD4qMCQz8VdcNSozfDFGPcw4rCKUNYYzEjUmMjo3cAHGOp8g7ICmPrI56jGSMqY/Sj2aP+oxpjhyMAYNpj1SO6Y9kAV6O0YxWjYKMHgxCjPcOtIxpDFCMNo3qjgLr6Q3/O/kM8Yz+jnaPmo/+jr0MOw7ZDRMP9o+fUYGP2ozhjJKNjo0uphkMAY/TDZ8NHo2VD86OoI2RjQjqFo+hjIeyYY3dDu8M3I4kju6Njqfuj8CNEYyBjwIC5YyejFxWLo6hjLmMtw8Cj5aMmAJWj3mPqo75jdgAaQ4bDrGMmw6OjnSHIFi2BAyPYw+6DUWOWQ5ljgmNAY/ZDTxWJY4OjdqMQYwsjwsNpY2NjGWMxY1/DH0M5YyRjv0Nno0ujrKNUY+yjZWMeQ1ujqWNVY+LpW2MBQw7D8GMzo2FD+2Onoyhj5GNtY/fD7mMgo55jqqM9Y9WjfWM9QxzNQ2PdI8FjLaNLdmFj7aOmo1NjeMM9o/NjImOzo0tj4mNbwytjDqOpY75DIxk3Yweju2MJY09jzWOHY61j/yOUY6ujpWNXI+VjxKOVYwMZbvJwY3VjYcMNY9jjACO4469j+OOuYyWjHWPKo19j9GM+Yw+jrSOngwDj9aO6o2/DrvGzoazQE2OMI6+D/GOTo1ajzsM0o1wjYmP2ABJjSOMpY9lDAuOu+vnDFmMvI16jzryJRNsjvqNVw+pjU1GaY05j56NFoxhjvMPro9hjRmO4YxpFoTTjRm7i7qOWY6mj1OOa4zZjYqN2Y7rjT1GBo9KjhWOyo8VjCqPeI9ejjSOEI79jnOP9Y/lugOONo8DjUzbhag864WOug5FjUOOzY9ijvaMLY8tR8OOy44jj4GPI44kjqOOOhKsjd2NU44tjtON7I4bj3uPho/pjZ2OQY2/DkGHB2dy+hGOY4/Vjx6OZoy1jDOPLowTj64MfY51j3WN3oxzjjGPQo9deoeNBY086dlDko22j36Mx49KZXaNjI/HjEyO/g7DjhYNJY6tjFWPrY2Ei+ZBKsYRjVKNKY19DoqMVw36jruOZGsyjR2MXo8bjEaOm44ZjJOMXY4kjn0TY1arYq+MAYPbjiGN5Y6pjLuPA2rmje+N4483jTONqw77jHmNdY15jneO9Y0HjupCng73jvONsY/RDzrn+uUajwuMdo2PjUWMT49tjpgAS43ijyeMzIwjjcyOn49JjTaNlxPiot3b4gLbjauN7Y1rjD+Pb40/jDmPu485jjONGIybjBmNRo+bjJKNZAK7eCaM4E5PjimOvI3DjBeNqY8QTeuOOY78jr+PHY5ejLOM3o00jgePd48HjiMMvo8NjTaOjY/akUePg47xjkONeg9DjkiNJ42HsA6MoE4SjaBPGY4cJJumupDnjO2NSw3XjjWMN4/TjnuM6YxQTR+NUEw6gGePrY1djyyQ6E1ljiCP6EwXjjePGE29jbKPM4zRjn2Pf499jv+NCEwAjfmPKgEjDIBPh49gFYOMj47+jXaMzY3ATc2OKEzPjYNop4xGDqBPnY+gTmhNoB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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 saveBomTable(output) {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
}
if (node != bomhead.childNodes[0].lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
let val = '';
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
val += '✓';
}
} else if (node.nodeName == "MARK") {
val += node.firstChild.nodeValue;
} else {
val += node.nodeValue;
}
}
if (output == 'csv') {
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
if (isNumeric(val)) {
val = +val; // use number
} else {
val = `"${val}"`; // enclosed within double-quote
}
}
text += val;
if (cell != row.lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
}
if (output != 'clipboard') {
// To file: csv or txt
var blob = new Blob([text], {
type: `text/${output}`
});
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
} else {
// To clipboard
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 isNumeric(str) {
/* https://stackoverflow.com/a/175787 */
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}
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.*)?$", "");
if (config.fields.includes("Value")) {
var index = config.fields.indexOf("Value");
pcbdata.bom["parsedValues"] = {};
for (var id in pcbdata.bom.fields) {
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
}
}
}
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("markWhenChecked", settings.markWhenChecked);
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;
showFootprints(settings.show_footprints);
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,
columnOrder: [],
hiddenColumns: [],
}
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.markWhenChecked = readStorage("markWhenChecked") || "";
populateMarkWhenCheckedOptions();
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);
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
var hcols = JSON.parse(readStorage("hiddenColumns"));
if (hcols === null) {
hcols = [];
}
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
var cord = JSON.parse(readStorage("columnOrder"));
if (cord === null) {
cord = fields;
} else {
cord = cord.filter(e => fields.includes(e));
if (cord.length != fields.length)
cord = fields;
}
settings.columnOrder = cord;
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.justify[0])) * text.height * tilt;
return point;
}
function drawText(ctx, text, color) {
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 ("svgpath" in text) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
if ("polygons" in text) {
ctx.fill(getPolygonsPath(text));
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;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
for (var i in txt) {
var lineWidth = text.thickness + interline / 2 * 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 = -lineWidth * (text.justify[0] + 1) / 2;
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;
}
offsety += interline;
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
if ("svgpath" in edge) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "rect") {
ctx.moveTo(...edge.start);
ctx.lineTo(edge.start[0], edge.end[1]);
ctx.lineTo(...edge.end);
ctx.lineTo(edge.end[0], edge.start[1]);
ctx.lineTo(...edge.start);
}
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);
}
if("filled" in edge && edge.filled)
ctx.fill();
else
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 ("svgpath" in shape) {
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, scalefactor, shape, color) {
ctx.save();
if (!("svgpath" in shape)) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
if("filled" in shape && !shape.filled) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke(getPolygonsPath(shape));
} else {
ctx.fillStyle = color;
ctx.fill(getPolygonsPath(shape));
}
ctx.restore();
}
function drawDrawing(ctx, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, scalefactor, drawing, color);
} else {
drawText(ctx, drawing, color);
}
}
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) {
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);
}
ctx.restore();
}
function drawPadHole(ctx, pad, padHoleColor) {
if (pad.type != "th") return;
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
ctx.fillStyle = padHoleColor;
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
ctx.restore();
}
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
if (highlight) {
// draw bounding box
if (footprint.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...footprint.bbox.pos);
ctx.rotate(deg2rad(-footprint.bbox.angle));
ctx.translate(...footprint.bbox.relpos);
ctx.fillStyle = colors.pad;
ctx.fillRect(0, 0, ...footprint.bbox.size);
ctx.globalAlpha = 1;
ctx.strokeStyle = colors.pad;
ctx.strokeRect(0, 0, ...footprint.bbox.size);
ctx.restore();
}
}
// draw drawings
for (var drawing of footprint.drawings) {
if (drawing.layer == layer) {
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
}
}
// draw pads
if (settings.renderPads) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, colors.pad, outline);
if (pad.pin1 && settings.highlightpin1) {
drawPad(ctx, pad, colors.outline, true);
}
}
}
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, colors.padHole);
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawDrawing(ctx, scalefactor, edge, edgecolor);
}
}
function drawFootprints(canvas, layer, scalefactor, highlight) {
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3 / scalefactor;
var style = getComputedStyle(topmostdiv);
var colors = {
pad: style.getPropertyValue('--pad-color'),
padHole: style.getPropertyValue('--pad-hole-color'),
outline: style.getPropertyValue('--pin1-outline-color'),
}
for (var i = 0; i < pcbdata.footprints.length; i++) {
var mod = pcbdata.footprints[i];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
var h = highlightedFootprints.includes(i);
var d = markedFootprints.has(i);
if (highlight) {
if(h && d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
} else if (h) {
colors.pad = style.getPropertyValue('--pad-color-highlight');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
} else if (d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
}
}
if( h || d || !highlight) {
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata.drawings[layername][layer]) {
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, scalefactor, d, polygonColor);
} else {
drawText(ctx, d, textColor);
}
}
}
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();
if ('radius' in track) {
ctx.arc(
...track.center,
track.radius,
deg2rad(track.startangle),
deg2rad(track.endangle));
} else {
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.fill(zone.path2d);
if (zone.width > 0) {
ctx.lineWidth = zone.width;
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 {
if (!window.matchMedia("print").matches)
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 padHoleColor = style.getPropertyValue('--pad-hole-color');
var ctx = canvas.getContext("2d");
for (var footprint of pcbdata.footprints) {
// draw pads
var padDrawn = false;
for (var pad of footprint.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false);
padDrawn = true;
}
}
if (padDrawn) {
// redraw all pad holes because some pads may overlap
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, padHoleColor);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
drawFootprints(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);
drawFootprints(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
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);
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 modulo(n, mod) {
return ((n % mod) + mod) % mod;
}
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
var dx = x - xc;
var dy = y - yc;
var r_sq = dx * dx + dy * dy;
var rmin = Math.max(0, radius - d);
var rmax = radius + d;
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
return false;
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
var dx1 = xc + radius * Math.cos(angle1) - x;
var dy1 = yc + radius * Math.sin(angle1) - y;
if (dx1 * dx1 + dy1 * dy1 <= d * d)
return true;
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
var dx2 = xc + radius * Math.cos(angle2) - x;
var dy2 = yc + radius * Math.sin(angle2) - y;
if (dx2 * dx2 + dy2 * dy2 <= d * d)
return true;
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
if (angle1 > angle2)
return (angle >= angle2 || angle <= angle1);
else
return (angle >= angle1 && angle <= angle2);
}
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 ('radius' in track) {
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
return track.net;
}
} else {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
}
// Check pads
if (settings.renderPads) {
for (var footprint of pcbdata.footprints) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinFootprintBbox(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.footprints.length; i++) {
var footprint = pcbdata.footprints[i];
if (footprint.layer == layer) {
if (pointWithinFootprintBbox(x, y, footprint.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 footprints = bboxHitScan(layerdict.layer, ...v);
if (footprints.length > 0) {
footprintsClicked(footprints);
}
}
}
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);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/*
* Table reordering via Drag'n'Drop
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
*/
function setBomHandlers() {
const bom = document.getElementById('bomtable');
let dragName;
let placeHolderElements;
let draggingElement;
let forcePopulation;
let xOffset;
let yOffset;
let wasDragged;
const mouseUpHandler = function(e) {
// Delete dragging element
draggingElement.remove();
// Make BOM selectable again
bom.style.removeProperty("userSelect");
// Remove listeners
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
if (wasDragged) {
// Redraw whole BOM
populateBomTable();
}
}
const mouseMoveHandler = function(e) {
// Notice the dragging
wasDragged = true;
// Make the dragged element visible
draggingElement.style.removeProperty("display");
// Set elements position to mouse position
draggingElement.style.left = `${e.screenX - xOffset}px`;
draggingElement.style.top = `${e.screenY - yOffset}px`;
// Forced redrawing of BOM table
if (forcePopulation) {
forcePopulation = false;
// Copy array
phe = Array.from(placeHolderElements);
// populate BOM table again
populateBomHeader(dragName, phe);
populateBomBody(dragName, phe);
}
// Set up array of hidden columns
var hiddenColumns = Array.from(settings.hiddenColumns);
// In the ungrouped mode, quantity don't exist
if (settings.bommode === "ungrouped")
hiddenColumns.push("Quantity");
// If no checkbox fields can be found, we consider them hidden
if (settings.checkboxes.length == 0)
hiddenColumns.push("checkboxes");
// Get table headers and group them into checkboxes, extrafields and normal headers
const bh = document.getElementById("bomhead");
headers = Array.from(bh.querySelectorAll("th"))
headers.shift() // numCol is not part of the columnOrder
headerGroups = []
lastCompoundClass = null;
for (i = 0; i < settings.columnOrder.length; i++) {
cElem = settings.columnOrder[i];
if (hiddenColumns.includes(cElem)) {
// Hidden columns appear as a dummy element
headerGroups.push([]);
continue;
}
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
if (elem.classList.contains("bom-checkbox")) {
if (lastCompoundClass === "bom-checkbox") {
cbGroup = headerGroups.pop();
cbGroup.push(elem);
headerGroups.push(cbGroup);
} else {
lastCompoundClass = "bom-checkbox";
headerGroups.push([elem])
}
} else {
headerGroups.push([elem])
}
}
// Copy settings.columnOrder
var columns = Array.from(settings.columnOrder)
// Set up array with indices of hidden columns
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
var dragIndex = columns.indexOf(dragName);
var swapIndex = dragIndex;
var swapDone = false;
// Check if the current dragged element is swapable with the left or right element
if (dragIndex > 0) {
// Get left headers boundingbox
swapIndex = dragIndex - 1;
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
swapIndex--;
if (!hiddenIndices.includes(swapIndex)) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
// Get right headers boundingbox
swapIndex = dragIndex + 1;
while (hiddenIndices.includes(swapIndex))
swapIndex++;
if (swapIndex < headerGroups.length) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
// Write back change to storage
if (swapDone) {
settings.columnOrder = columns
writeStorage("columnOrder", JSON.stringify(columns));
}
}
const mouseDownHandler = function(e) {
var target = e.target;
if (target.tagName.toLowerCase() != "td")
target = target.parentElement;
// Used to check if a dragging has ever happened
wasDragged = false;
// Create new element which will be displayed as the dragged column
draggingElement = document.createElement("div")
draggingElement.classList.add("dragging");
draggingElement.style.display = "none";
draggingElement.style.position = "absolute";
draggingElement.style.overflow = "hidden";
// Get bomhead and bombody elements
const bh = document.getElementById("bomhead");
const bb = document.getElementById("bombody");
// Get all compound headers for the current column
var compoundHeaders;
if (target.classList.contains("bom-checkbox")) {
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
} else {
compoundHeaders = [target];
}
// Create new table which will display the column
var newTable = document.createElement("table");
newTable.classList.add("bom");
newTable.style.background = "white";
draggingElement.append(newTable);
// Create new header element
var newHeader = document.createElement("thead");
newTable.append(newHeader);
// Set up array for storing all placeholder elements
placeHolderElements = [];
// Add all compound headers to the new thead element and placeholders
compoundHeaders.forEach(function(h) {
clone = cloneElementWithDimensions(h);
newHeader.append(clone);
placeHolderElements.push(clone);
});
// Create new body element
var newBody = document.createElement("tbody");
newTable.append(newBody);
// Get indices for compound headers
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
// For each row in the BOM body...
var rows = bb.querySelectorAll("tr");
rows.forEach(function(row) {
// ..get the cells for the compound column
const tds = row.querySelectorAll("td");
var copytds = idxs.map(i => tds[i]);
// Add them to the new element and the placeholders
var newRow = document.createElement("tr");
copytds.forEach(function(td) {
clone = cloneElementWithDimensions(td);
newRow.append(clone);
placeHolderElements.push(clone);
});
newBody.append(newRow);
});
// Compute width for compound header
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
draggingElement.style.width = `${width}px`;
// Insert the new dragging element and disable selection on BOM
bom.insertBefore(draggingElement, null);
bom.style.userSelect = "none";
// Determine the mouse position offset
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
yOffset = e.screenY - compoundHeaders[0].offsetTop;
// Get name for the column in settings.columnOrder
dragName = getColumnOrderName(target);
// Change text and class for placeholder elements
placeHolderElements = placeHolderElements.map(function(e) {
newElem = cloneElementWithDimensions(e);
newElem.textContent = "";
newElem.classList.add("placeholder");
return newElem;
});
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
forcePopulation = true;
// Add listeners for move and up on mouse
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
// In netlist mode, there is nothing to reorder
if (settings.bommode === "netlist")
return;
// Add mouseDownHandler to every column except the numCol
bom.querySelectorAll("th")
.forEach(function(head) {
if (!head.classList.contains("numCol")) {
head.onmousedown = mouseDownHandler;
}
});
}
function getBoundingClientRectFromMultiple(elements) {
var elems = Array.from(elements);
if (elems.length == 0)
return null;
var box = elems.shift()
.getBoundingClientRect();
elems.forEach(function(elem) {
var elembox = elem.getBoundingClientRect();
box.left = Math.min(elembox.left, box.left);
box.top = Math.min(elembox.top, box.top);
box.width += elembox.width;
box.height = Math.max(elembox.height, box.height);
});
return box;
}
function cloneElementWithDimensions(elem) {
var newElem = elem.cloneNode(true);
newElem.style.height = window.getComputedStyle(elem).height;
newElem.style.width = window.getComputedStyle(elem).width;
return newElem;
}
function getBomTableHeaderIndex(elem) {
const bh = document.getElementById('bomhead');
const ths = Array.from(bh.querySelectorAll("th"));
return ths.indexOf(elem);
}
function getColumnOrderName(elem) {
var cname = elem.getAttribute("col_name");
if (cname === "bom-checkbox")
return "checkboxes";
else
return cname;
}
function resizableGrid(tablehead) {
var cols = tablehead.firstElementChild.children;
var rowWidth = tablehead.offsetWidth;
for (var i = 1; i < cols.length; i++) {
if (cols[i].classList.contains("bom-checkbox"))
continue;
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
}
for (var i = 1; i < cols.length - 1; i++) {
var div = document.createElement('div');
div.className = "column-width-handle";
cols[i].appendChild(div);
setListeners(div);
}
function setListeners(div) {
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
div.addEventListener('mousedown', function(e) {
e.preventDefault();
e.stopPropagation();
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
startX = e.pageX;
var padding = paddingDiff(curCol);
rowWidth = curCol.parentElement.offsetWidth;
curColWidth = curCol.clientWidth - padding;
nxtColWidth = nxtCol.clientWidth - padding;
});
document.addEventListener('mousemove', function(e) {
if (startX) {
var diffX = e.pageX - startX;
diffX = -Math.min(-diffX, curColWidth - 20);
diffX = Math.min(diffX, nxtColWidth - 20);
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
}
});
document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
startX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}
function paddingDiff(col) {
if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}
var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));
}
function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* 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 footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
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 setShowBOMColumn(field, value) {
if (field === "references") {
var rl = document.getElementById("reflookup");
rl.disabled = !value;
if (!value) {
rl.value = "";
updateRefLookup("");
}
}
var n = settings.hiddenColumns.indexOf(field);
if (value) {
if (n != -1) {
settings.hiddenColumns.splice(n, 1);
}
} else {
if (n == -1) {
settings.hiddenColumns.push(field);
}
}
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
if (initDone) {
populateBomTable();
}
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.footprints.length; i++) {
if (pcbdata.footprints[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 markWhenChecked = settings.markWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (markWhenChecked) {
row.classList.add("checked");
for (var ref of references) {
markedFootprints.add(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (markWhenChecked) {
row.classList.remove("checked");
for (var ref of references) {
markedFootprints.delete(ref[1]);
}
drawHighlights();
}
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 clearHighlightedFootprints() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedFootprints = [];
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;
highlightedFootprints = 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
if (!settings.hiddenColumns.includes("references")) {
for (var ref of entry) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
// check fields
for (var i in config.fields) {
var f = config.fields[i];
if (!settings.hiddenColumns.includes(f)) {
for (var ref of entry) {
if (pcbdata.bom.fields[ref[1]][i].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
}
return false;
}
function findRefInEntry(entry) {
return entry.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, is_checkbox = false) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
if (is_checkbox)
th.setAttribute("col_name", "bom-checkbox");
else
th.setAttribute("col_name", name);
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
var spacer = document.createElement("div");
spacer.className = "column-spacer";
th.appendChild(spacer);
spacer.onclick = function () {
if (currentSortColumn && th !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && th === 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 = th;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
if (is_checkbox) {
spacer.onclick = fancyDblClickHandler(
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
}
return th;
}
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
var vismenu = document.createElement("div");
vismenu.id = "vismenu";
vismenu.classList.add("menu");
var visbutton = document.createElement("div");
visbutton.classList.add("visbtn");
visbutton.classList.add("hideonprint");
var viscontent = document.createElement("div");
viscontent.classList.add("menu-content");
viscontent.id = "vismenu-content";
settings.columnOrder.forEach(column => {
if (typeof column !== "string")
return;
// Skip empty columns
if (column === "checkboxes" && settings.checkboxes.length == 0)
return;
else if (column === "Quantity" && settings.bommode == "ungrouped")
return;
var label = document.createElement("label");
label.classList.add("menu-label");
var input = document.createElement("input");
input.classList.add("visibility_checkbox");
input.type = "checkbox";
input.onchange = function (e) {
setShowBOMColumn(column, e.target.checked)
};
input.checked = !(settings.hiddenColumns.includes(column));
label.appendChild(input);
if (column.length > 0)
label.append(column[0].toUpperCase() + column.slice(1));
viscontent.appendChild(label);
});
viscontent.childNodes[0].classList.add("menu-label-top");
vismenu.appendChild(visbutton);
if (settings.bommode != "netlist") {
vismenu.appendChild(viscontent);
th.appendChild(vismenu);
}
tr.appendChild(th);
var checkboxCompareClosure = function (checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a);
var stateB = getCheckboxState(checkbox, b);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
var stringFieldCompareClosure = function (fieldIndex) {
return (a, b) => {
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
var compareRefs = (a, b) => {
var ra = referenceRegex.exec(a);
var rb = referenceRegex.exec(b);
if (ra === null || rb === null) {
if (a != b) return a > b ? 1 : -1;
return 0;
} else {
if (ra.groups.prefix != rb.groups.prefix) {
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
}
if (ra.groups.number != rb.groups.number) {
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -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 {
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
var valueIndex = config.fields.indexOf("Value");
var footprintIndex = config.fields.indexOf("Footprint");
columns.forEach((column) => {
if (column === placeHolderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
tr.appendChild(th);
}
} else if (column === "References") {
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
var i = 0;
while (i < a.length && i < b.length) {
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
i++;
}
return a.length - b.length;
}));
} else if (column === "Value") {
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
var ra = a[0][1], rb = b[0][1];
return valueCompare(
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
}));
return;
} else if (column === "Footprint") {
tr.appendChild(createColumnHeader(
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
} else if (column === "Quantity" && settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
return a.length - b.length;
}));
} else {
// Other fields
var i = config.fields.indexOf(column);
if (i < 0)
return;
tr.appendChild(createColumnHeader(
column, `field${i + 1}`, stringFieldCompareClosure(i)));
}
});
}
bomhead.appendChild(tr);
}
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
footprintIndexToHandler = {};
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) {
expandedTable.push([ref]);
}
}
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;
}
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
columns.forEach((column) => {
if (column === placeholderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "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.markWhenChecked == checkbox) {
tr.classList.add("checked");
}
td.appendChild(input);
tr.appendChild(td);
}
}
} else if (column === "References") {
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
} else if (column === "Quantity" && settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = references.length;
tr.appendChild(td);
} else {
// All the other fields
var field_index = config.fields.indexOf(column)
if (field_index < 0)
return;
var valueSet = new Set();
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
td = document.createElement("TD");
td.innerHTML = highlightFilter(Array.from(valueSet).join(", "));
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])) {
footprintIndexToHandler[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();
setBomHandlers();
resizableGrid(bomhead);
}
function footprintsClicked(footprintIndexes) {
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
for (var i = 1; i <= footprintIndexes.length; i++) {
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
if (refIndex in footprintIndexToHandler) {
lastClicked = refIndex;
footprintIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedFootprints();
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.footprints.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.footprints[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");
var chkbxs = document.getElementsByClassName("visibility_checkbox");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = true;
}
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedFootprints();
}
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(",").map((e) => e.trim()).filter((e) => e);
prepCheckboxes();
populateMarkWhenCheckedOptions();
setMarkWhenChecked(settings.markWhenChecked);
}
function setMarkWhenChecked(value) {
writeStorage("markWhenChecked", value);
settings.markWhenChecked = value;
markedFootprints.clear();
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
markedFootprints.add(ref);
}
populateBomTable();
drawHighlights();
}
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 populateMarkWhenCheckedOptions() {
var container = document.getElementById("markWhenCheckedContainer");
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 = "markWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "markWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setMarkWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.markWhenChecked) {
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.footprints.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) + "%)";
}
function constrain(number, min, max){
return Math.min(Math.max(parseInt(number), min), max);
}
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;
case "ArrowLeft":
case "ArrowRight":
if (document.activeElement.type != "text"){
e.preventDefault();
let boardRotationElement = document.getElementById("boardRotation")
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
if (e.key == "ArrowLeft"){
settings.boardRotation += 3; // 15 degrees
}
else{
settings.boardRotation -= 3;
}
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
boardRotationElement.value = settings.boardRotation
setBoardRotation(settings.boardRotation);
}
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));
e.preventDefault();
}
}
}
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;
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
// 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">Mark when checked</div>
<div id="markWhenCheckedContainer"></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>
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></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 class="menu-label">
<span style="margin-left: 5px;">Save bom table as</span>
<div class="flexbox">
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
<button class="savebtn" onclick="saveBomTable('txt')">txt</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="saveBomTable('clipboard')"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<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>