Files
PCB-Heater/kicad/pcb-heater/bom/ibom.html
2023-01-24 21:14:34 +03:00

4346 lines
275 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;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "fields": ["Value", "Footprint"], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* Utility functions */
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
pcbdata.metadata.revision + '__#';
var storage;
function initStorage(key) {
try {
window.localStorage.getItem("blank");
storage = window.localStorage;
} catch (e) {
// localStorage not available
}
if (!storage) {
try {
window.sessionStorage.getItem("blank");
storage = window.sessionStorage;
} catch (e) {
// sessionStorage also not available
}
}
}
function readStorage(key) {
if (storage) {
return storage.getItem(storagePrefix + key);
} else {
return null;
}
}
function writeStorage(key, value) {
if (storage) {
storage.setItem(storagePrefix + key, value);
}
}
function fancyDblClickHandler(el, onsingle, ondouble) {
return function() {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function() {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 200);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
}
function smoothScrollToRow(rowid) {
document.getElementById(rowid).scrollIntoView({
behavior: "smooth",
block: "center",
inline: "nearest"
});
}
function focusInputField(input) {
input.scrollIntoView(false);
input.focus();
input.select();
}
function copyToClipboard() {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text = text + node.firstChild.nodeValue;
}
if (node != bomhead.childNodes[0].lastChild) {
text += '\t';
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
text = text + '✓';
}
} else if (node.nodeName == "MARK") {
text = text + node.firstChild.nodeValue;
} else {
text = text + node.nodeValue;
}
}
if (cell != row.lastChild) {
text += '\t';
}
}
text += '\n';
}
var textArea = document.createElement("textarea");
textArea.classList.add('clipboard-temp');
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
if (document.execCommand('copy')) {
console.log('Bom copied to clipboard.');
}
} catch (err) {
console.log('Can not copy to clipboard.');
}
document.body.removeChild(textArea);
}
function removeGutterNode(node) {
for (var i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].classList &&
node.childNodes[i].classList.contains("gutter")) {
node.removeChild(node.childNodes[i]);
break;
}
}
}
function cleanGutters() {
removeGutterNode(document.getElementById("bot"));
removeGutterNode(document.getElementById("canvasdiv"));
}
var units = {
prefixes: {
giga: ["G", "g", "giga", "Giga", "GIGA"],
mega: ["M", "mega", "Mega", "MEGA"],
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
milli: ["m", "milli", "Milli", "MILLI"],
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
nano: ["N", "n", "nano", "Nano", "NANO"],
pico: ["P", "p", "pico", "Pico", "PICO"],
},
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
unitsLong: [
"OHM", "Ohm", "ohm", "ohms",
"FARAD", "Farad", "farad",
"HENRY", "Henry", "henry"
],
getMultiplier: function(s) {
if (this.prefixes.giga.includes(s)) return 1e9;
if (this.prefixes.mega.includes(s)) return 1e6;
if (this.prefixes.kilo.includes(s)) return 1e3;
if (this.prefixes.milli.includes(s)) return 1e-3;
if (this.prefixes.micro.includes(s)) return 1e-6;
if (this.prefixes.nano.includes(s)) return 1e-9;
if (this.prefixes.pico.includes(s)) return 1e-12;
return 1;
},
valueRegex: null,
}
function initUtils() {
var allPrefixes = units.prefixes.giga
.concat(units.prefixes.mega)
.concat(units.prefixes.kilo)
.concat(units.prefixes.milli)
.concat(units.prefixes.micro)
.concat(units.prefixes.nano)
.concat(units.prefixes.pico);
var allUnits = units.unitsShort.concat(units.unitsLong);
units.valueRegex = new RegExp("^([0-9\.]+)" +
"\\s*(" + allPrefixes.join("|") + ")?" +
"(" + allUnits.join("|") + ")?" +
"(\\b.*)?$", "");
units.valueAltRegex = new RegExp("^([0-9]*)" +
"(" + units.unitsShort.join("|") + ")?" +
"([GgMmKkUuNnPp])?" +
"([0-9]*)" +
"(\\b.*)?$", "");
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;
}
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);
var fontsize = 1.55;
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer == "B");
for (var c of ["bg", "fab", "silk", "highlight"]) {
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
}
}
function rotateVector(v, angle) {
angle = deg2rad(angle);
return [
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
];
}
function applyRotation(bbox) {
var corners = [
[bbox.minx, bbox.miny],
[bbox.minx, bbox.maxy],
[bbox.maxx, bbox.miny],
[bbox.maxx, bbox.maxy],
];
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
return {
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
}
}
function recalcLayerScale(layerdict, width, height) {
var bbox = applyRotation(pcbdata.edges_bbox);
var scalefactor = 0.98 * Math.min(
width / (bbox.maxx - bbox.minx),
height / (bbox.maxy - bbox.miny)
);
if (scalefactor < 0.1) {
scalefactor = 1;
}
layerdict.transform.s = scalefactor;
var flip = (layerdict.layer == "B");
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function 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) + "%)";
}
document.onkeydown = function (e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
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>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
</div>
</div>
</div>
</div>
</div>
<div id="fileinfodiv" style="overflow: auto;">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="bot" class="split" style="height: calc(100% - 80px)">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="copyToClipboard()"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" 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>