icm68m/gen/doc/icm68m-r1-ibom.html

4346 lines
275 KiB
HTML

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