Half_Bridge_Inverter/bom/ibom.html

4415 lines
267 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html,
body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 10px 10px 10px 0px;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 5px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
position: relative;
}
.bom th,
.bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th,
.dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.bom .value {
width: 15%;
}
.bom .quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal,
.gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 10px 10px 10px 0px;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid,
.dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
width: 100%;
height: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
height: 78px;
border-bottom: 2px solid black;
}
.dark #top {
border-bottom: 2px solid #ccc;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas,
#backcanvas {
touch-action: none;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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uF+izGXT5XOljaX/ZS2lT0gd5fGA1RX4FdulvaWkZU0ViBWrFSb6r2WdxThlH2VmZUxlfjhPFQMV86VDFarlgOVQFd4VmhVwFX4VsxVBFfMVIaUI5Ypl9prLFT1lc9TpJhhGd8yDZaBCte4mrDsV+pRuZXjIEeVk5bNlDgBnFY0lV+XAuqS+d8wQZRBQiXDFFT9lMJUx5eUVJ2UfFbAAXxXWFT8VxGV9pSnlWRVX5RtYPoTMlXRlrJXGFVSVLOX1pYMVXJXDFfCVlhW85d8VMWUSZXVlUOUBFTDlyiVw5RiVHgDqJdiV2iUo5dvFVqW+CWpI4eIbFQ+la7bHQDaV2eVMlNrwWOBudGSlGRVWZToVUhXJZctlqE7uhN0cEGWCfB9ljyTmZQXlxWV5ZZ4VjyX+ZSFlgWWF5SVl4qXj5QMC9nAiZRMVgpU3ZcKV8BX/FUBlDKXmlUaEtCV0Zf6VxbDOleewOWXRlaGVHxWCpT8luWWipYVlaBXxlduI8eWTFUQV5xUelbZl2RVLAM/cKEbj3H6V2SzoUAWVP4xylVwAwWUFZQFlRWW8pZWVQ5XVlaqQtZWn5fWVEhXulbSlzZVr5Ufc7ZU7FfmVjCWBlYWV/RUipZ8lYZUeAGWV3GXFlaOVkZUFJXGVE5U2YHWVPxVplbOVuyXzlZmV7zLZlcHinZXf8N2VcuV9lbxlJZWjFTKAu5VRlSGVB5WlZceVYeWnlVOV55UolTJlaJWtZUnFCmVXgCtynWXdZajlvWX0knQ5tqU6ZdaVXHCJFdnlaVgTZeCVX2VHFTNlJxW0lXYVy2WMYQhVwJVdFVOlXKVQlazlCpWvFZzlvJX8lT4VdRVJ5Q0VIpXplWvlsKqW+oYYtxWbZZ9lVyXBldCVLxU8JXCV7xXvlZ3l4xVqlT2lUxW+pful+uVnFcel4FUI5RGlSKXGlZEVVuU2stpeC7QJpdjlmxUoVR+ko2USpehVJSWTZVhVnuWuld7lopU05dGyJ9BGXocknRWBJZxVZFXgFbxVf2X8VQDlglUIlaqVApXqlUKVfxWXlS2VR8GthJJeVlV35SRVRRV9JS+VpRWKlQJVK6UqlWeV6pXiVePFeuXalQblupXBFfqVMoARpRbluJWQ1HJQGj7qVUhVQ2UJFdpVOxV6VZmln6XkFF7lpxX4VeLlDhXjZkOwy5XvZdWl6TKPFfZVFFWclVRVFRWuVdFVieXJ5ReVjZXNFTIVVVUxROEgtVW2VQ1VkJVNVfKVLVVOVW8VkVWMFYiV5eUQ5ZqVklUJVdJVepVtZXJVClVdZZelsFVz1FjwrSSElRpVyFXcyGr0OlUupUVVqRW75TgAhxVGVccVmRXMVQylyI7DJEPAQ1XdFVxV4wCNVQIVDlWz5dyVIxXtVYBVHlUplV5VPVUAlf2gO1XjZgQMT1WkVSNVG5XjVXxVHOVtVVFVv1ViVcBVUlVzFWBVWOWYleEVilUrFQtcP6mBiDlV9qWKtqRAzA7Z5eSVDHmUlfnlZVV4VaZVfuWMlb6I46VSlcAlGBV75VDViuUTVbDVPJVCVZ8VIlXuVZ1VjFXdVfSVd1XilRdIdNVvZdKVjNWgQMzVB8WUVZNV1FUc1XyVXNV0VRqV0xValXYAgRWG5eiVq1UeAIXF56WY1RlV7N5zlANl+1V5VelBGECnxdZVyRV7FSGAHuUU1doVgNU+VS3UI+kvZYYVVbjBVedVq9ShVVLVbNUKfKGoP1VJlX9V9RWplQ2V/NXLZYDgMgRrZcRVW6W5LC7VvRVM1e7VrNUq5c5VKCU0VfLVSJWK1RJV8VUq1TqVC8UrVbJVHgAAACoAAArpGTrVW1WtlU8JVdhWlUbVfWCE1W4sgVXAgPWCbmWIdC6V11VulbbVnpWxpeeKXfDl1WbVRKC9xZhV3FXkVfWlFhV+ZVxlX5UjlVuVVZWUFfRlYICJlaJV4mWeVX04SNVLVSjVxuWhFSplOJUl1ZagyKj+RMHiRJXENKhV3dWnVQZVphXUlbhVNtVB1bGllyr5jn/FHFXPVeyVM+Ue1fHVU1Vc5VUVydVzVYql/1V3Zd5VLFWf6PsKK8Y31RDVrtW0FSUVD9UHxUqVLlXw1b7ViNWQ5YtVGdWJVVnVyVUa1TKAeqWZxdnFXgC5xQXF+cVx4EaVG1UmlbGlRBSpMnelhtWgQogULyCK5MAVwIC2zgSgvcXWwj2VFYwn1T6lcVX+FbA1y1UINTnVMoAAAIrEJevVppVz1BYYGbAZkBXVskASTmygW5nZ5bm0GbBO5UGV1tV0lQelLRVd8jnwh6S3FeVlL1WofKFVQ9VeFW5VCtV81bI1Q+U2sgo1V8BKNVHVQZUD1d5l6jUv1SIVWjWB1To1c9SOhvw11aCGNR9lz5U8VeYVahXmNRoVb9WEFTOVjZVX5RUqdjXQkOQ1JeRGNeuVajWuNWMVFjUp1do1UlUtFXo1dL6HKA419VWu1UWVHhVJ1eE1HjW2Ff3lV+XyNbE19jXd1eFljjXM5c41g9WhNRrlr9WwFek1khU+Ndjo+jX19AE1FcxBNb2VhTWmNcU1wlWpNWU1kTVLVS0VtjXrOIo1uTVSpfk1iTUS1bPlEDWz1SwVMjUkFX7lnQ50vgIYHFW4ZU41JjVF5duVJTWtNbUVvxWf1bbVmTViCP0O9OWCZbM1BTXzNUM1M1WaNRE1VjXjNTXlqGhjDr01jOV1FcY1Y1VNNUIVbjWzVW01JzUXFdTVmzXTNZc1uzUDNSE19zVhNe41TzVeNefVLRXAipJB2zVvZVc1czW3NQs1KTV/NSs17TVSFVfl5zU0QaC1IJV3Fdc1wTWNNVC1stW0Vcc1ALUPZXdVMpggtTM1JSVotQ01+zVmNb81jzWwtc818LV3VZM1kw4fNcS1ELXvVS41PzVLNTC105Vn1Xi1fuV8Nd01/OhjZWDcFCBMtSUV5LVstZS1kxWL1cw1y9ULFeGl0FWbVTw1hSQNHC6ae1W5VaxkKaVQEmNlKRVH1eMAl1XSNRVVLRWKtR8aSRD/1fU1VHRvVcA1cdWgNRFVz9UUtUc1aTXz1Y0VX9V3VQa1CcGjXBtlt9WQ1bHVMNWP1TLVPtUjNb4V0DXp1arVSVXq1Ww1GiXQGcXV8rUgZTblZLSCNcFCOYzPpWhVqjC2JYNgsUA6tcZV5VVZFW3V16WgZdRKg2AQZRio9AAPFaNVzLVFNay1HGURlUKlFZXj1WOVOzWMtey1yZX+1QDVNmUgAHZlF9XWaFTGndS1NbkQUGVFtRLVdyWK8qWVFbXllfuV1bWHlRtlnzW2tW01ErVBtfA1IbVo1aEV68U4NUpVAJRFKqCmeNXxFVpVR1WFVeNl+lV91dq1pVXptZTVt1UTNau1zB7g1Sa1r1XFtea1XrWWtQnV1rWitZO1KzX2tUxVjrUntcuUYNXGtf010dU4AGa1HJU3tV9VypWHNR1VOuUBtUw1M7UyVfO1ixWHQOlVG9V3oDQlVcS71VVA8bXm/Im1GCD7FSFVV1U4VTdVr7X/5UT6PeFVxOO1YJV2VSW1LNX/tWA101UaNcB1BCXPtXC1vVVz1ETI/kQEdbW1l9DEdde1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XdXlZgBuJZMdcwATxcsdXyVxXYsdiV2rHT+A6x2bHdFdil1PnS+dCQDvnRQAn51yAN+dv51gAP+d+dWAXcBd4F2QXdBdbl0mnVTlK3L29bnV0ewlgB7toF2Fxbil+y5uXTwErJ0/gE5dPW0uXchdcgA7AG4l8KX9HYXFimXzHZUA5R1VHbilokB1HWaAYWxjQJhAsYDmXSwAXR3z+dZdPx0jHX8dQ10UXXBd0YAiXfmdg11cACIAbiWrnYEA651zAEudK51rnfOdV11bnfnVO520IPudNsCHnced9ACnnUNdnF1U5UxwYZ0enV6dPp3+nYGdMZ2hnW6dEZ1RnbnVIN3bHVOdw51yAEkdA13sXXIAefiAnXKdCF2qXbpdTZ3SAGddt10bnfb1y50lgOdds513XYudD11PXXudB519HUed+SUnnX7t2x3dXYOlimWvgEQARx34XT2dV4BgAAYAlHn3HUQAfp0oAKRwYiXmXT2dll2CAOsdsx27chnFr4BBADtdXACSQJpd5p0dnc5d3Z29nf1Ux10gAPJtNKWeXd5dvl30CBQAAV1BXTidIV1hXaMQEV0UAFFd9wAUljSlDV1NXcRALV3wAG1dHV1bHXIAkQAjXWNdE11yACUdU12VHdUddiDzXYtdZADLXZ0d+F1rXT5dLcibXaRd0t0gAGpAsV0LHQldcx3u3THdMx2lHWldjAAZXY7dXAD6QK2dwJ0sXbxdrl1O3bBdIADoXZhdcgDc3SZduF1mXfhd7x3C3WHdtl3m3dWdVOXCXSpdNF1yXU2d9iCZ3dpdOd2q3VmAUl1knRSdnZ3UnbSd9J2MnXEA1eUMANHdUx2x3ZR5yV0T3WAAyd2p3SPdil1tnRadFABWnV2dtp3SBCrdiN1cAFJABl24gIddtF3ZHZHFN4A1jAXt4+1r7RktXB0gEGXtB+2v7ViVB+1P7V/tde029I3tJIDN7cplre277Q/dne033T3tCbB77f3tbB3iHYplw+0AHX/dQB0CeJPtSOXiCHYdiOUr7SA9X+3L7QgdW+0b7R2tSD1aJR/dwh1pVdEAl91hpcft6D1L7eft90CX7S/dQh1L7Xft2D2P7dA9Jy1cHa/tHA1sHZQdN+1hQAftv+0Rpf/tlD1gPVf06+1gHZQ9kB3QPTAd0QBwHdrViB1UQDGNyB28PegdjB2xjWwd993CHbgdwSX4HVBVB+2EPSZtOh1kHZBVFB3QPSGdRngsHVolFqxMHS/dLB0D7SQ9PB3CddwdaU1sHfwdhdUIHUY9oh3BJeIdOQ1sHVIde+0yHQft9D2mHegda+0qHWwdJh0KHZodyh3a1bode+3qJfodWh0Y1RDA6h1V7RYdfU3WHYE9th3qHQ4d+YJ0pY1lkcXs8JLd8AD27fIAl4CRxWnF4e3wANRwZCUHcm+AMoDUcEwoWwA78kAAAA=="))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* Utility functions */
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
pcbdata.metadata.revision + '__#';
var storage;
function initStorage(key) {
try {
window.localStorage.getItem("blank");
storage = window.localStorage;
} catch (e) {
// localStorage not available
}
if (!storage) {
try {
window.sessionStorage.getItem("blank");
storage = window.sessionStorage;
} catch (e) {
// sessionStorage also not available
}
}
}
function readStorage(key) {
if (storage) {
return storage.getItem(storagePrefix + key);
} else {
return null;
}
}
function writeStorage(key, value) {
if (storage) {
storage.setItem(storagePrefix + key, value);
}
}
function fancyDblClickHandler(el, onsingle, ondouble) {
return function() {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function() {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 200);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
}
function smoothScrollToRow(rowid) {
document.getElementById(rowid).scrollIntoView({
behavior: "smooth",
block: "center",
inline: "nearest"
});
}
function focusInputField(input) {
input.scrollIntoView(false);
input.focus();
input.select();
}
function saveBomTable(output) {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
}
if (node != bomhead.childNodes[0].lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
let val = '';
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
val += '✓';
}
} else if (node.nodeName == "MARK") {
val += node.firstChild.nodeValue;
} else {
val += node.nodeValue;
}
}
if (output == 'csv') {
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
if (isNumeric(val)) {
val = +val; // use number
} else {
val = `"${val}"`; // enclosed within double-quote
}
}
text += val;
if (cell != row.lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
}
if (output != 'clipboard') {
// To file: csv or txt
var blob = new Blob([text], {
type: `text/${output}`
});
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
} else {
// To clipboard
var textArea = document.createElement("textarea");
textArea.classList.add('clipboard-temp');
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
if (document.execCommand('copy')) {
console.log('Bom copied to clipboard.');
}
} catch (err) {
console.log('Can not copy to clipboard.');
}
document.body.removeChild(textArea);
}
}
function isNumeric(str) {
/* https://stackoverflow.com/a/175787 */
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}
function removeGutterNode(node) {
for (var i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].classList &&
node.childNodes[i].classList.contains("gutter")) {
node.removeChild(node.childNodes[i]);
break;
}
}
}
function cleanGutters() {
removeGutterNode(document.getElementById("bot"));
removeGutterNode(document.getElementById("canvasdiv"));
}
var units = {
prefixes: {
giga: ["G", "g", "giga", "Giga", "GIGA"],
mega: ["M", "mega", "Mega", "MEGA"],
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
milli: ["m", "milli", "Milli", "MILLI"],
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
nano: ["N", "n", "nano", "Nano", "NANO"],
pico: ["P", "p", "pico", "Pico", "PICO"],
},
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
unitsLong: [
"OHM", "Ohm", "ohm", "ohms",
"FARAD", "Farad", "farad",
"HENRY", "Henry", "henry"
],
getMultiplier: function(s) {
if (this.prefixes.giga.includes(s)) return 1e9;
if (this.prefixes.mega.includes(s)) return 1e6;
if (this.prefixes.kilo.includes(s)) return 1e3;
if (this.prefixes.milli.includes(s)) return 1e-3;
if (this.prefixes.micro.includes(s)) return 1e-6;
if (this.prefixes.nano.includes(s)) return 1e-9;
if (this.prefixes.pico.includes(s)) return 1e-12;
return 1;
},
valueRegex: null,
}
function initUtils() {
var allPrefixes = units.prefixes.giga
.concat(units.prefixes.mega)
.concat(units.prefixes.kilo)
.concat(units.prefixes.milli)
.concat(units.prefixes.micro)
.concat(units.prefixes.nano)
.concat(units.prefixes.pico);
var allUnits = units.unitsShort.concat(units.unitsLong);
units.valueRegex = new RegExp("^([0-9\.]+)" +
"\\s*(" + allPrefixes.join("|") + ")?" +
"(" + allUnits.join("|") + ")?" +
"(\\b.*)?$", "");
units.valueAltRegex = new RegExp("^([0-9]*)" +
"(" + units.unitsShort.join("|") + ")?" +
"([GgMmKkUuNnPp])?" +
"([0-9]*)" +
"(\\b.*)?$", "");
if (config.fields.includes("Value")) {
var index = config.fields.indexOf("Value");
pcbdata.bom["parsedValues"] = {};
for (var id in pcbdata.bom.fields) {
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
}
}
}
function parseValue(val, ref) {
var inferUnit = (unit, ref) => {
if (unit) {
unit = unit.toLowerCase();
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
unit = 'r';
}
unit = unit[0];
} else {
ref = /^([a-z]+)\d+$/i.exec(ref);
if (ref) {
ref = ref[1].toLowerCase();
if (ref == "c") unit = 'f';
else if (ref == "l") unit = 'h';
else if (ref == "r" || ref == "rv") unit = 'r';
else unit = null;
}
}
return unit;
};
val = val.replace(/,/g, "");
var match = units.valueRegex.exec(val);
var unit;
if (match) {
val = parseFloat(match[1]);
if (match[2]) {
val = val * units.getMultiplier(match[2]);
}
unit = inferUnit(match[3], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[4],
}
}
match = units.valueAltRegex.exec(val);
if (match && (match[1] || match[4])) {
val = parseFloat(match[1] + "." + match[4]);
if (match[3]) {
val = val * units.getMultiplier(match[3]);
}
unit = inferUnit(match[2], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[5],
}
}
return null;
}
function valueCompare(a, b, stra, strb) {
if (a === null && b === null) {
// Failed to parse both values, compare them as strings.
if (stra != strb) return stra > strb ? 1 : -1;
else return 0;
} else if (a === null) {
return 1;
} else if (b === null) {
return -1;
} else {
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
else return 0;
}
}
function validateSaveImgDimension(element) {
var valid = false;
var intValue = 0;
if (/^[1-9]\d*$/.test(element.value)) {
intValue = parseInt(element.value);
if (intValue <= 16000) {
valid = true;
}
}
if (valid) {
element.classList.remove("invalid");
} else {
element.classList.add("invalid");
}
return intValue;
}
function saveImage(layer) {
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
var bgcolor = null;
if (!document.getElementById("render-save-transparent").checked) {
var style = getComputedStyle(topmostdiv);
bgcolor = style.getPropertyValue("background-color");
}
if (!width || !height) return;
// Prepare image
var canvas = document.createElement("canvas");
var layerdict = {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
bg: canvas,
fab: canvas,
silk: canvas,
highlight: canvas,
layer: layer,
}
// Do the rendering
recalcLayerScale(layerdict, width, height);
prepareLayer(layerdict);
clearCanvas(canvas, bgcolor);
drawBackground(layerdict, false);
drawHighlightsOnLayer(layerdict, false);
// Save image
var imgdata = canvas.toDataURL("image/png");
var filename = pcbdata.metadata.title;
if (pcbdata.metadata.revision) {
filename += `.${pcbdata.metadata.revision}`;
}
filename += `.${layer}.png`;
saveFile(filename, dataURLtoBlob(imgdata));
}
function saveSettings() {
var data = {
type: "InteractiveHtmlBom settings",
version: 1,
pcbmetadata: pcbdata.metadata,
settings: settings,
}
var blob = new Blob([JSON.stringify(data, null, 4)], {
type: "application/json"
});
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}
function loadSettings() {
var input = document.createElement("input");
input.type = "file";
input.accept = ".settings.json";
input.onchange = function(e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = readerEvent => {
var content = readerEvent.target.result;
var newSettings;
try {
newSettings = JSON.parse(content);
} catch (e) {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
if (newSettings.type != "InteractiveHtmlBom settings") {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
if (metadataMatches) {
for (var k in pcbdata.metadata) {
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
metadataMatches = false;
}
}
}
if (!metadataMatches) {
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
if (!confirm(
`Settins file metadata does not match current metadata.\n\n` +
`Page metadata:\n${currentMetadata}\n\n` +
`Settings file metadata:\n${fileMetadata}\n\n` +
`Press OK if you would like to import settings anyway.`)) {
return;
}
}
overwriteSettings(newSettings.settings);
}
reader.readAsText(file, 'UTF-8');
}
input.click();
}
function overwriteSettings(newSettings) {
initDone = false;
Object.assign(settings, newSettings);
writeStorage("bomlayout", settings.bomlayout);
writeStorage("bommode", settings.bommode);
writeStorage("canvaslayout", settings.canvaslayout);
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
for (var checkbox of settings.checkboxes) {
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
}
writeStorage("markWhenChecked", settings.markWhenChecked);
padsVisible(settings.renderPads);
document.getElementById("padsCheckbox").checked = settings.renderPads;
fabricationVisible(settings.renderFabrication);
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
silkscreenVisible(settings.renderSilkscreen);
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
referencesVisible(settings.renderReferences);
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
valuesVisible(settings.renderValues);
document.getElementById("valuesCheckbox").checked = settings.renderValues;
tracksVisible(settings.renderTracks);
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
zonesVisible(settings.renderZones);
document.getElementById("zonesCheckbox").checked = settings.renderZones;
dnpOutline(settings.renderDnpOutline);
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
setRedrawOnDrag(settings.redrawOnDrag);
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
setDarkMode(settings.darkMode);
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
setHighlightPin1(settings.highlightpin1);
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
showFootprints(settings.show_footprints);
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
initDone = true;
prepCheckboxes();
changeBomLayout(settings.bomlayout);
}
function saveFile(filename, blob) {
var link = document.createElement("a");
var objurl = URL.createObjectURL(blob);
link.download = filename;
link.href = objurl;
link.click();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime
});
}
var settings = {
canvaslayout: "default",
bomlayout: "default",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: false,
redrawOnDrag: true,
boardRotation: 0,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
columnOrder: [],
hiddenColumns: [],
}
function initDefaults() {
settings.bomlayout = readStorage("bomlayout");
if (settings.bomlayout === null) {
settings.bomlayout = config.bom_view;
}
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
settings.bomlayout = config.bom_view;
}
settings.bommode = readStorage("bommode");
if (settings.bommode === null) {
settings.bommode = "grouped";
}
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
settings.bommode = "grouped";
}
settings.canvaslayout = readStorage("canvaslayout");
if (settings.canvaslayout === null) {
settings.canvaslayout = config.layer_view;
}
var bomCheckboxes = readStorage("bomCheckboxes");
if (bomCheckboxes === null) {
bomCheckboxes = config.checkboxes;
}
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
document.getElementById("bomCheckboxes").value = bomCheckboxes;
settings.markWhenChecked = readStorage("markWhenChecked") || "";
populateMarkWhenCheckedOptions();
function initBooleanSetting(storageString, def, elementId, func) {
var b = readStorage(storageString);
if (b === null) {
b = def;
} else {
b = (b == "true");
}
document.getElementById(elementId).checked = b;
func(b);
}
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
if ("tracks" in pcbdata) {
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
} else {
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
tracksVisible(false);
zonesVisible(false);
}
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
var hcols = JSON.parse(readStorage("hiddenColumns"));
if (hcols === null) {
hcols = [];
}
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
var cord = JSON.parse(readStorage("columnOrder"));
if (cord === null) {
cord = fields;
} else {
cord = cord.filter(e => fields.includes(e));
if (cord.length != fields.length)
cord = fields;
}
settings.columnOrder = cord;
settings.boardRotation = readStorage("boardRotation");
if (settings.boardRotation === null) {
settings.boardRotation = config.board_rotation * 5;
} else {
settings.boardRotation = parseInt(settings.boardRotation);
}
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function() {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function(eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function(eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for (callback of this.callbacks[eventType])
callback(event);
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
var point = [
linepoint[0] * text.width + offsetx,
linepoint[1] * text.height + offsety
];
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
return point;
}
function drawText(ctx, text, color) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if ("svgpath" in text) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
if ("polygons" in text) {
ctx.fill(getPolygonsPath(text));
ctx.restore();
return;
}
ctx.translate(...text.pos);
ctx.translate(text.thickness * 0.5, 0);
var angle = -text.angle;
if (text.attr.includes("mirrored")) {
ctx.scale(-1, 1);
angle = -angle;
}
var tilt = 0;
if (text.attr.includes("italic")) {
tilt = 0.125;
}
var interline = text.height * 1.5 + text.thickness;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
for (var i in txt) {
var lineWidth = text.thickness + interline / 2 * tilt;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
}
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
}
}
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
var inOverbar = false;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
} else if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
if (txt[i][j] != '~') {
inOverbar = !inOverbar;
}
}
var glyph = pcbdata.font_data[txt[i][j]];
if (inOverbar) {
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
if (!lastHadOverbar) {
overbarStart[0] += text.height * 1.4 * tilt;
lastHadOverbar = true;
}
ctx.beginPath();
ctx.moveTo(...overbarStart);
ctx.lineTo(...overbarEnd);
ctx.stroke();
} else {
lastHadOverbar = false;
}
for (var line of glyph.l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var k = 1; k < line.length; k++) {
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
}
ctx.stroke();
}
offsetx += glyph.w * text.width;
}
offsety += interline;
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
if ("svgpath" in edge) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "rect") {
ctx.moveTo(...edge.start);
ctx.lineTo(edge.start[0], edge.end[1]);
ctx.lineTo(...edge.end);
ctx.lineTo(edge.end[0], edge.start[1]);
ctx.lineTo(...edge.start);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
if("filled" in edge && edge.filled)
ctx.fill();
else
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if ("svgpath" in shape) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, scalefactor, shape, color) {
ctx.save();
if (!("svgpath" in shape)) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
if("filled" in shape && !shape.filled) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke(getPolygonsPath(shape));
} else {
ctx.fillStyle = color;
ctx.fill(getPolygonsPath(shape));
}
ctx.restore();
}
function drawDrawing(ctx, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, scalefactor, drawing, color);
} else {
drawText(ctx, drawing, color);
}
}
function getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline) {
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
if (pad.offset) {
ctx.translate(...pad.offset);
}
ctx.fillStyle = color;
ctx.strokeStyle = color;
var path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
ctx.restore();
}
function drawPadHole(ctx, pad, padHoleColor) {
if (pad.type != "th") return;
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
ctx.fillStyle = padHoleColor;
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
ctx.restore();
}
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
if (highlight) {
// draw bounding box
if (footprint.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...footprint.bbox.pos);
ctx.rotate(deg2rad(-footprint.bbox.angle));
ctx.translate(...footprint.bbox.relpos);
ctx.fillStyle = colors.pad;
ctx.fillRect(0, 0, ...footprint.bbox.size);
ctx.globalAlpha = 1;
ctx.strokeStyle = colors.pad;
ctx.strokeRect(0, 0, ...footprint.bbox.size);
ctx.restore();
}
}
// draw drawings
for (var drawing of footprint.drawings) {
if (drawing.layer == layer) {
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
}
}
// draw pads
if (settings.renderPads) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, colors.pad, outline);
if (pad.pin1 && settings.highlightpin1) {
drawPad(ctx, pad, colors.outline, true);
}
}
}
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, colors.padHole);
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawDrawing(ctx, scalefactor, edge, edgecolor);
}
}
function drawFootprints(canvas, layer, scalefactor, highlight) {
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3 / scalefactor;
var style = getComputedStyle(topmostdiv);
var colors = {
pad: style.getPropertyValue('--pad-color'),
padHole: style.getPropertyValue('--pad-hole-color'),
outline: style.getPropertyValue('--pin1-outline-color'),
}
for (var i = 0; i < pcbdata.footprints.length; i++) {
var mod = pcbdata.footprints[i];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
var h = highlightedFootprints.includes(i);
var d = markedFootprints.has(i);
if (highlight) {
if(h && d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
} else if (h) {
colors.pad = style.getPropertyValue('--pad-color-highlight');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
} else if (d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
}
}
if( h || d || !highlight) {
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata.drawings[layername][layer]) {
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, scalefactor, d, polygonColor);
} else {
drawText(ctx, d, textColor);
}
}
}
function drawTracks(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.lineCap = "round";
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
ctx.lineWidth = track.width;
ctx.beginPath();
if ('radius' in track) {
ctx.arc(
...track.center,
track.radius,
deg2rad(track.startangle),
deg2rad(track.endangle));
} else {
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
}
ctx.stroke();
}
}
function drawZones(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineJoin = "round";
for (var zone of pcbdata.zones[layer]) {
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
if (highlight && highlightedNet != zone.net) continue;
ctx.fill(zone.path2d);
if (zone.width > 0) {
ctx.lineWidth = zone.width;
ctx.stroke(zone.path2d);
}
}
}
function clearCanvas(canvas, color = null) {
var ctx = canvas.getContext("2d");
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
if (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
} else {
if (!window.matchMedia("print").matches)
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var padHoleColor = style.getPropertyValue('--pad-hole-color');
var ctx = canvas.getContext("2d");
for (var footprint of pcbdata.footprints) {
// draw pads
var padDrawn = false;
for (var pad of footprint.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false);
padDrawn = true;
}
}
if (padDrawn) {
// redraw all pad holes because some pads may overlap
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, padHoleColor);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
drawFootprints(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawFootprints(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
function prepareCanvas(canvas, flip, transform) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer == "B");
for (var c of ["bg", "fab", "silk", "highlight"]) {
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
}
}
function rotateVector(v, angle) {
angle = deg2rad(angle);
return [
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
];
}
function applyRotation(bbox) {
var corners = [
[bbox.minx, bbox.miny],
[bbox.minx, bbox.maxy],
[bbox.maxx, bbox.miny],
[bbox.maxx, bbox.maxy],
];
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
return {
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
}
}
function recalcLayerScale(layerdict, width, height) {
var bbox = applyRotation(pcbdata.edges_bbox);
var scalefactor = 0.98 * Math.min(
width / (bbox.maxx - bbox.minx),
height / (bbox.maxy - bbox.miny)
);
if (scalefactor < 0.1) {
scalefactor = 1;
}
layerdict.transform.s = scalefactor;
var flip = (layerdict.layer == "B");
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function modulo(n, mod) {
return ((n % mod) + mod) % mod;
}
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
var dx = x - xc;
var dy = y - yc;
var r_sq = dx * dx + dy * dy;
var rmin = Math.max(0, radius - d);
var rmax = radius + d;
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
return false;
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
var dx1 = xc + radius * Math.cos(angle1) - x;
var dy1 = yc + radius * Math.sin(angle1) - y;
if (dx1 * dx1 + dy1 * dy1 <= d * d)
return true;
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
var dx2 = xc + radius * Math.cos(angle2) - x;
var dy2 = yc + radius * Math.sin(angle2) - y;
if (dx2 * dx2 + dy2 * dy2 <= d * d)
return true;
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
if (angle1 > angle2)
return (angle >= angle2 || angle <= angle1);
else
return (angle >= angle1 && angle <= angle2);
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for (var track of pcbdata.tracks[layer]) {
if ('radius' in track) {
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
return track.net;
}
} else {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
}
// Check pads
if (settings.renderPads) {
for (var footprint of pcbdata.footprints) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinFootprintBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.footprints.length; i++) {
var footprint = pcbdata.footprints[i];
if (footprint.layer == layer) {
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0 && e.button != 1) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
if (layerdict.layer == "B") {
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
} else {
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
}
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
var v = rotateVector([x, y], -settings.boardRotation);
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var footprints = bboxHitScan(layerdict.layer, ...v);
if (footprints.length > 0) {
footprintsClicked(footprints);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist / oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
}
function handleMouseWheel(e, layerdict) {
e.preventDefault();
e.stopPropagation();
var t = layerdict.transform;
var wheeldelta = e.deltaY;
if (e.deltaMode == 1) {
// FF only, scroll by lines
wheeldelta *= 30;
} else if (e.deltaMode == 2) {
wheeldelta *= 300;
}
var m = Math.pow(1.1, -wheeldelta / 40);
// Limit amount of zoom per tick.
if (m > 2) {
m = 2;
} else if (m < 0.5) {
m = 0.5;
}
t.zoom *= m;
var zoomd = (1 - m) / t.zoom;
t.panx += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function initRender() {
allcanvas = {
front: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("F_bg"),
fab: document.getElementById("F_fab"),
silk: document.getElementById("F_slk"),
highlight: document.getElementById("F_hl"),
layer: "F",
},
back: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("B_bg"),
fab: document.getElementById("B_fab"),
silk: document.getElementById("B_slk"),
highlight: document.getElementById("B_hl"),
layer: "B",
}
};
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/*
* Table reordering via Drag'n'Drop
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
*/
function setBomHandlers() {
const bom = document.getElementById('bomtable');
let dragName;
let placeHolderElements;
let draggingElement;
let forcePopulation;
let xOffset;
let yOffset;
let wasDragged;
const mouseUpHandler = function(e) {
// Delete dragging element
draggingElement.remove();
// Make BOM selectable again
bom.style.removeProperty("userSelect");
// Remove listeners
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
if (wasDragged) {
// Redraw whole BOM
populateBomTable();
}
}
const mouseMoveHandler = function(e) {
// Notice the dragging
wasDragged = true;
// Make the dragged element visible
draggingElement.style.removeProperty("display");
// Set elements position to mouse position
draggingElement.style.left = `${e.screenX - xOffset}px`;
draggingElement.style.top = `${e.screenY - yOffset}px`;
// Forced redrawing of BOM table
if (forcePopulation) {
forcePopulation = false;
// Copy array
phe = Array.from(placeHolderElements);
// populate BOM table again
populateBomHeader(dragName, phe);
populateBomBody(dragName, phe);
}
// Set up array of hidden columns
var hiddenColumns = Array.from(settings.hiddenColumns);
// In the ungrouped mode, quantity don't exist
if (settings.bommode === "ungrouped")
hiddenColumns.push("Quantity");
// If no checkbox fields can be found, we consider them hidden
if (settings.checkboxes.length == 0)
hiddenColumns.push("checkboxes");
// Get table headers and group them into checkboxes, extrafields and normal headers
const bh = document.getElementById("bomhead");
headers = Array.from(bh.querySelectorAll("th"))
headers.shift() // numCol is not part of the columnOrder
headerGroups = []
lastCompoundClass = null;
for (i = 0; i < settings.columnOrder.length; i++) {
cElem = settings.columnOrder[i];
if (hiddenColumns.includes(cElem)) {
// Hidden columns appear as a dummy element
headerGroups.push([]);
continue;
}
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
if (elem.classList.contains("bom-checkbox")) {
if (lastCompoundClass === "bom-checkbox") {
cbGroup = headerGroups.pop();
cbGroup.push(elem);
headerGroups.push(cbGroup);
} else {
lastCompoundClass = "bom-checkbox";
headerGroups.push([elem])
}
} else {
headerGroups.push([elem])
}
}
// Copy settings.columnOrder
var columns = Array.from(settings.columnOrder)
// Set up array with indices of hidden columns
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
var dragIndex = columns.indexOf(dragName);
var swapIndex = dragIndex;
var swapDone = false;
// Check if the current dragged element is swapable with the left or right element
if (dragIndex > 0) {
// Get left headers boundingbox
swapIndex = dragIndex - 1;
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
swapIndex--;
if (!hiddenIndices.includes(swapIndex)) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
// Get right headers boundingbox
swapIndex = dragIndex + 1;
while (hiddenIndices.includes(swapIndex))
swapIndex++;
if (swapIndex < headerGroups.length) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
// Write back change to storage
if (swapDone) {
settings.columnOrder = columns
writeStorage("columnOrder", JSON.stringify(columns));
}
}
const mouseDownHandler = function(e) {
var target = e.target;
if (target.tagName.toLowerCase() != "td")
target = target.parentElement;
// Used to check if a dragging has ever happened
wasDragged = false;
// Create new element which will be displayed as the dragged column
draggingElement = document.createElement("div")
draggingElement.classList.add("dragging");
draggingElement.style.display = "none";
draggingElement.style.position = "absolute";
draggingElement.style.overflow = "hidden";
// Get bomhead and bombody elements
const bh = document.getElementById("bomhead");
const bb = document.getElementById("bombody");
// Get all compound headers for the current column
var compoundHeaders;
if (target.classList.contains("bom-checkbox")) {
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
} else {
compoundHeaders = [target];
}
// Create new table which will display the column
var newTable = document.createElement("table");
newTable.classList.add("bom");
newTable.style.background = "white";
draggingElement.append(newTable);
// Create new header element
var newHeader = document.createElement("thead");
newTable.append(newHeader);
// Set up array for storing all placeholder elements
placeHolderElements = [];
// Add all compound headers to the new thead element and placeholders
compoundHeaders.forEach(function(h) {
clone = cloneElementWithDimensions(h);
newHeader.append(clone);
placeHolderElements.push(clone);
});
// Create new body element
var newBody = document.createElement("tbody");
newTable.append(newBody);
// Get indices for compound headers
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
// For each row in the BOM body...
var rows = bb.querySelectorAll("tr");
rows.forEach(function(row) {
// ..get the cells for the compound column
const tds = row.querySelectorAll("td");
var copytds = idxs.map(i => tds[i]);
// Add them to the new element and the placeholders
var newRow = document.createElement("tr");
copytds.forEach(function(td) {
clone = cloneElementWithDimensions(td);
newRow.append(clone);
placeHolderElements.push(clone);
});
newBody.append(newRow);
});
// Compute width for compound header
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
draggingElement.style.width = `${width}px`;
// Insert the new dragging element and disable selection on BOM
bom.insertBefore(draggingElement, null);
bom.style.userSelect = "none";
// Determine the mouse position offset
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
yOffset = e.screenY - compoundHeaders[0].offsetTop;
// Get name for the column in settings.columnOrder
dragName = getColumnOrderName(target);
// Change text and class for placeholder elements
placeHolderElements = placeHolderElements.map(function(e) {
newElem = cloneElementWithDimensions(e);
newElem.textContent = "";
newElem.classList.add("placeholder");
return newElem;
});
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
forcePopulation = true;
// Add listeners for move and up on mouse
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
// In netlist mode, there is nothing to reorder
if (settings.bommode === "netlist")
return;
// Add mouseDownHandler to every column except the numCol
bom.querySelectorAll("th")
.forEach(function(head) {
if (!head.classList.contains("numCol")) {
head.onmousedown = mouseDownHandler;
}
});
}
function getBoundingClientRectFromMultiple(elements) {
var elems = Array.from(elements);
if (elems.length == 0)
return null;
var box = elems.shift()
.getBoundingClientRect();
elems.forEach(function(elem) {
var elembox = elem.getBoundingClientRect();
box.left = Math.min(elembox.left, box.left);
box.top = Math.min(elembox.top, box.top);
box.width += elembox.width;
box.height = Math.max(elembox.height, box.height);
});
return box;
}
function cloneElementWithDimensions(elem) {
var newElem = elem.cloneNode(true);
newElem.style.height = window.getComputedStyle(elem).height;
newElem.style.width = window.getComputedStyle(elem).width;
return newElem;
}
function getBomTableHeaderIndex(elem) {
const bh = document.getElementById('bomhead');
const ths = Array.from(bh.querySelectorAll("th"));
return ths.indexOf(elem);
}
function getColumnOrderName(elem) {
var cname = elem.getAttribute("col_name");
if (cname === "bom-checkbox")
return "checkboxes";
else
return cname;
}
function resizableGrid(tablehead) {
var cols = tablehead.firstElementChild.children;
var rowWidth = tablehead.offsetWidth;
for (var i = 1; i < cols.length; i++) {
if (cols[i].classList.contains("bom-checkbox"))
continue;
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
}
for (var i = 1; i < cols.length - 1; i++) {
var div = document.createElement('div');
div.className = "column-width-handle";
cols[i].appendChild(div);
setListeners(div);
}
function setListeners(div) {
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
div.addEventListener('mousedown', function(e) {
e.preventDefault();
e.stopPropagation();
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
startX = e.pageX;
var padding = paddingDiff(curCol);
rowWidth = curCol.parentElement.offsetWidth;
curColWidth = curCol.clientWidth - padding;
nxtColWidth = nxtCol.clientWidth - padding;
});
document.addEventListener('mousemove', function(e) {
if (startX) {
var diffX = e.pageX - startX;
diffX = -Math.min(-diffX, curColWidth - 20);
diffX = Math.min(diffX, nxtColWidth - 20);
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
}
});
document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
startX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}
function paddingDiff(col) {
if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}
var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));
}
function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* DOM manipulation and misc code */
var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
var highlightedNet = null;
var lastClicked;
function dbg(html) {
dbgdiv.innerHTML = html;
}
function redrawIfInitDone() {
if (initDone) {
redrawCanvas(allcanvas.front);
redrawCanvas(allcanvas.back);
}
}
function padsVisible(value) {
writeStorage("padsVisible", value);
settings.renderPads = value;
redrawIfInitDone();
}
function referencesVisible(value) {
writeStorage("referencesVisible", value);
settings.renderReferences = value;
redrawIfInitDone();
}
function valuesVisible(value) {
writeStorage("valuesVisible", value);
settings.renderValues = value;
redrawIfInitDone();
}
function tracksVisible(value) {
writeStorage("tracksVisible", value);
settings.renderTracks = value;
redrawIfInitDone();
}
function zonesVisible(value) {
writeStorage("zonesVisible", value);
settings.renderZones = value;
redrawIfInitDone();
}
function dnpOutline(value) {
writeStorage("dnpOutline", value);
settings.renderDnpOutline = value;
redrawIfInitDone();
}
function setDarkMode(value) {
if (value) {
topmostdiv.classList.add("dark");
} else {
topmostdiv.classList.remove("dark");
}
writeStorage("darkmode", value);
settings.darkMode = value;
redrawIfInitDone();
}
function setShowBOMColumn(field, value) {
if (field === "references") {
var rl = document.getElementById("reflookup");
rl.disabled = !value;
if (!value) {
rl.value = "";
updateRefLookup("");
}
}
var n = settings.hiddenColumns.indexOf(field);
if (value) {
if (n != -1) {
settings.hiddenColumns.splice(n, 1);
}
} else {
if (n == -1) {
settings.hiddenColumns.push(field);
}
}
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
if (initDone) {
populateBomTable();
}
redrawIfInitDone();
}
function setFullscreen(value) {
if (value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
function getStoredCheckboxRefs(checkbox) {
function convert(ref) {
var intref = parseInt(ref);
if (isNaN(intref)) {
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.footprints[i].ref == ref) {
return i;
}
}
return -1;
} else {
return intref;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
function getCheckboxState(checkbox, references) {
var storedRefsSet = getStoredCheckboxRefs(checkbox);
var currentRefsSet = new Set(references.map(r => r[1]));
// Get difference of current - stored
var difference = new Set(currentRefsSet);
for (ref of storedRefsSet) {
difference.delete(ref);
}
if (difference.size == 0) {
// All the current refs are stored
return "checked";
} else if (difference.size == currentRefsSet.size) {
// None of the current refs are stored
return "unchecked";
} else {
// Some of the refs are stored
return "indeterminate";
}
}
function setBomCheckboxState(checkbox, element, references) {
var state = getCheckboxState(checkbox, references);
element.checked = (state == "checked");
element.indeterminate = (state == "indeterminate");
}
function createCheckboxChangeHandler(checkbox, references, row) {
return function () {
refsSet = getStoredCheckboxRefs(checkbox);
var markWhenChecked = settings.markWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (markWhenChecked) {
row.classList.add("checked");
for (var ref of references) {
markedFootprints.add(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (markWhenChecked) {
row.classList.remove("checked");
for (var ref of references) {
markedFootprints.delete(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'unchecked';
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
}
}
function clearHighlightedFootprints() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedFootprints = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function () {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
EventHandler.emitEvent(
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
rowid: rowid,
refs: refs,
net: net
});
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
if (!settings.hiddenColumns.includes("references")) {
for (var ref of entry) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
// check fields
for (var i in config.fields) {
var f = config.fields[i];
if (!settings.hiddenColumns.includes(f)) {
for (var ref of entry) {
if (pcbdata.bom.fields[ref[1]][i].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
}
return false;
}
function findRefInEntry(entry) {
return entry.filter(r => r[0].toLowerCase() == reflookup);
}
function highlightFilter(s) {
if (!filter) {
return s;
}
var parts = s.toLowerCase().split(filter);
if (parts.length == 1) {
return s;
}
var r = "";
var pos = 0;
for (var i in parts) {
if (i > 0) {
r += '<mark class="highlight">' +
s.substring(pos, pos + filter.length) +
'</mark>';
pos += filter.length;
}
r += s.substring(pos, pos + parts[i].length);
pos += parts[i].length;
}
return r;
}
function checkboxSetUnsetAllHandler(checkboxname) {
return function () {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (checkboxnum >= settings.checkboxes.length) {
return;
}
var allset = true;
var checkbox;
var row;
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
if (!checkbox.checked || checkbox.indeterminate) {
allset = false;
break;
}
}
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = !allset;
checkbox.indeterminate = false;
checkbox.onchange();
}
}
}
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
if (is_checkbox)
th.setAttribute("col_name", "bom-checkbox");
else
th.setAttribute("col_name", name);
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
var spacer = document.createElement("div");
spacer.className = "column-spacer";
th.appendChild(spacer);
spacer.onclick = function () {
if (currentSortColumn && th !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && th === currentSortColumn) {
// Already sorted by this column
if (currentSortOrder == "asc") {
// Sort by this column, descending order
bomSortFunction = function (a, b) {
return -comparator(a, b);
}
currentSortColumn.childNodes[1].classList.remove("asc");
currentSortColumn.childNodes[1].classList.add("desc");
currentSortOrder = "desc";
} else {
// Unsort
bomSortFunction = null;
currentSortColumn.childNodes[1].classList.remove("desc");
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
} else {
// Sort by this column, ascending order
bomSortFunction = comparator;
currentSortColumn = th;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
if (is_checkbox) {
spacer.onclick = fancyDblClickHandler(
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
}
return th;
}
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
var vismenu = document.createElement("div");
vismenu.id = "vismenu";
vismenu.classList.add("menu");
var visbutton = document.createElement("div");
visbutton.classList.add("visbtn");
visbutton.classList.add("hideonprint");
var viscontent = document.createElement("div");
viscontent.classList.add("menu-content");
viscontent.id = "vismenu-content";
settings.columnOrder.forEach(column => {
if (typeof column !== "string")
return;
// Skip empty columns
if (column === "checkboxes" && settings.checkboxes.length == 0)
return;
else if (column === "Quantity" && settings.bommode == "ungrouped")
return;
var label = document.createElement("label");
label.classList.add("menu-label");
var input = document.createElement("input");
input.classList.add("visibility_checkbox");
input.type = "checkbox";
input.onchange = function (e) {
setShowBOMColumn(column, e.target.checked)
};
input.checked = !(settings.hiddenColumns.includes(column));
label.appendChild(input);
if (column.length > 0)
label.append(column[0].toUpperCase() + column.slice(1));
viscontent.appendChild(label);
});
viscontent.childNodes[0].classList.add("menu-label-top");
vismenu.appendChild(visbutton);
if (settings.bommode != "netlist") {
vismenu.appendChild(viscontent);
th.appendChild(vismenu);
}
tr.appendChild(th);
var checkboxCompareClosure = function (checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a);
var stateB = getCheckboxState(checkbox, b);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
var stringFieldCompareClosure = function (fieldIndex) {
return (a, b) => {
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
var compareRefs = (a, b) => {
var ra = referenceRegex.exec(a);
var rb = referenceRegex.exec(b);
if (ra === null || rb === null) {
if (a != b) return a > b ? 1 : -1;
return 0;
} else {
if (ra.groups.prefix != rb.groups.prefix) {
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
}
if (ra.groups.number != rb.groups.number) {
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
}
return 0;
}
}
if (settings.bommode == "netlist") {
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
});
tr.appendChild(th);
} else {
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
var valueIndex = config.fields.indexOf("Value");
var footprintIndex = config.fields.indexOf("Footprint");
columns.forEach((column) => {
if (column === placeHolderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
tr.appendChild(th);
}
} else if (column === "References") {
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
var i = 0;
while (i < a.length && i < b.length) {
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
i++;
}
return a.length - b.length;
}));
} else if (column === "Value") {
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
var ra = a[0][1], rb = b[0][1];
return valueCompare(
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
}));
return;
} else if (column === "Footprint") {
tr.appendChild(createColumnHeader(
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
} else if (column === "Quantity" && settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
return a.length - b.length;
}));
} else {
// Other fields
var i = config.fields.indexOf(column);
if (i < 0)
return;
tr.appendChild(createColumnHeader(
column, `field${i + 1}`, stringFieldCompareClosure(i)));
}
});
}
bomhead.appendChild(tr);
}
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
footprintIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
if (settings.bommode == "netlist") {
bomtable = pcbdata.nets.slice();
} else {
switch (settings.canvaslayout) {
case 'F':
bomtable = pcbdata.bom.F.slice();
break;
case 'FB':
bomtable = pcbdata.bom.both.slice();
break;
case 'B':
bomtable = pcbdata.bom.B.slice();
break;
}
if (settings.bommode == "ungrouped") {
// expand bom table
expandedTable = []
for (var bomentry of bomtable) {
for (var ref of bomentry) {
expandedTable.push([ref]);
}
}
bomtable = expandedTable;
}
}
if (bomSortFunction) {
bomtable = bomtable.sort(bomSortFunction);
}
for (var i in bomtable) {
var bomentry = bomtable[i];
if (filter && !entryMatches(bomentry)) {
continue;
}
var references = null;
var netname = null;
var tr = document.createElement("TR");
var td = document.createElement("TD");
var rownum = +i + 1;
tr.id = "bomrow" + rownum;
td.textContent = rownum;
tr.appendChild(td);
if (settings.bommode == "netlist") {
netname = bomentry;
td = document.createElement("TD");
td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
tr.appendChild(td);
} else {
if (reflookup) {
references = findRefInEntry(bomentry);
if (references.length == 0) {
continue;
}
} else {
references = bomentry;
}
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
columns.forEach((column) => {
if (column === placeholderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
if (checkbox) {
td = document.createElement("TD");
var input = document.createElement("input");
input.type = "checkbox";
input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
setBomCheckboxState(checkbox, input, references);
if (input.checked && settings.markWhenChecked == checkbox) {
tr.classList.add("checked");
}
td.appendChild(input);
tr.appendChild(td);
}
}
} else if (column === "References") {
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
} else if (column === "Quantity" && settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = references.length;
tr.appendChild(td);
} else {
// All the other fields
var field_index = config.fields.indexOf(column)
if (field_index < 0)
return;
var valueSet = new Set();
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
td = document.createElement("TD");
td.innerHTML = highlightFilter(Array.from(valueSet).join(", "));
tr.appendChild(td);
}
});
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
footprintIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
if ((filter || reflookup) && first) {
handler();
first = false;
}
}
EventHandler.emitEvent(
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
filter: filter,
reflookup: reflookup,
checkboxes: settings.checkboxes,
bommode: settings.bommode,
});
}
function highlightPreviousRow() {
if (!currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[0].id == currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
for (var i = 0; i < highlightHandlers.length - 1; i++) {
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function highlightNextRow() {
if (!currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
for (var i = 1; i < highlightHandlers.length; i++) {
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function populateBomTable() {
populateBomHeader();
populateBomBody();
setBomHandlers();
resizableGrid(bomhead);
}
function footprintsClicked(footprintIndexes) {
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
for (var i = 1; i <= footprintIndexes.length; i++) {
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
if (refIndex in footprintIndexToHandler) {
lastClicked = refIndex;
footprintIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedFootprints();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
function changeCanvasLayout(layout) {
document.getElementById("fl-btn").classList.remove("depressed");
document.getElementById("fb-btn").classList.remove("depressed");
document.getElementById("bl-btn").classList.remove("depressed");
switch (layout) {
case 'F':
document.getElementById("fl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
function populateMetadata() {
document.getElementById("title").innerHTML = pcbdata.metadata.title;
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
document.getElementById("company").innerHTML = pcbdata.metadata.company;
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
if (pcbdata.metadata.title != "") {
document.title = pcbdata.metadata.title + " BOM";
}
// Calculate board stats
var fp_f = 0,
fp_b = 0,
pads_f = 0,
pads_b = 0,
pads_th = 0;
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.footprints[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
// Update version string
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}
function changeBomLayout(layout) {
document.getElementById("bom-btn").classList.remove("depressed");
document.getElementById("lr-btn").classList.remove("depressed");
document.getElementById("tb-btn").classList.remove("depressed");
switch (layout) {
case 'bom-only':
document.getElementById("bom-btn").classList.add("depressed");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
document.getElementById("frontcanvas").style.display = "none";
document.getElementById("backcanvas").style.display = "none";
document.getElementById("bot").style.height = "";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.remove("split-horizontal");
document.getElementById("canvasdiv").classList.remove("split-horizontal");
document.getElementById("frontcanvas").classList.add("split-horizontal");
document.getElementById("backcanvas").classList.add("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
direction: "vertical",
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
onDragEnd: resizeAll
});
break;
case 'left-right':
document.getElementById("lr-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.add("split-horizontal");
document.getElementById("canvasdiv").classList.add("split-horizontal");
document.getElementById("frontcanvas").classList.remove("split-horizontal");
document.getElementById("backcanvas").classList.remove("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeAll
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
var chkbxs = document.getElementsByClassName("visibility_checkbox");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = true;
}
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedFootprints();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
prepCheckboxes();
populateMarkWhenCheckedOptions();
setMarkWhenChecked(settings.markWhenChecked);
}
function setMarkWhenChecked(value) {
writeStorage("markWhenChecked", value);
settings.markWhenChecked = value;
markedFootprints.clear();
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
markedFootprints.add(ref);
}
populateBomTable();
drawHighlights();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function populateMarkWhenCheckedOptions() {
var container = document.getElementById("markWhenCheckedContainer");
if (settings.checkboxes.length == 0) {
container.parentElement.style.display = "none";
return;
}
container.innerHTML = '';
container.parentElement.style.display = "inline-block";
function createOption(name, displayName) {
var id = "markWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "markWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setMarkWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.markWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
function constrain(number, min, max){
return Math.min(Math.max(parseInt(number), min), max);
}
document.onkeydown = function (e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
case "ArrowLeft":
case "ArrowRight":
if (document.activeElement.type != "text"){
e.preventDefault();
let boardRotationElement = document.getElementById("boardRotation")
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
if (e.key == "ArrowLeft"){
settings.boardRotation += 3; // 15 degrees
}
else{
settings.boardRotation -= 3;
}
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
boardRotationElement.value = settings.boardRotation
setBoardRotation(settings.boardRotation);
}
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
e.preventDefault();
}
}
}
function hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
window.onload = function (e) {
initUtils();
initRender();
initStorage();
initDefaults();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
// Triggers render
changeBomLayout(settings.bomlayout);
// Users may leave fullscreen without touching the checkbox. Uncheck.
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement)
document.getElementById('fullscreenCheckbox').checked = false;
});
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div style="float: right; height: 100%;">
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="menubtn"></button>
<div class="menu-content">
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label><!-- This comment eats space! All of it!
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
Full Screen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Pads
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP outlined
</label>
<label class="menu-label">
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
Highlight first pin
</label>
<label class="menu-label">
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
<span>Board rotation</span>
<span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Bom checkboxes</div>
<input id="bomCheckboxes" class="menu-textbox" type=text
oninput="setBomCheckboxes(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Mark when checked</div>
<div id="markWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Save bom table as</span>
<div class="flexbox">
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
</div>
</div>
</div>
</div>
</div>
<div id="fileinfodiv" style="overflow: auto;">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="bot" class="split" style="height: calc(100% - 80px)">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="saveBomTable('clipboard')"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>