Files
2023-11-14 22:23:51 +01:00

4670 lines
298 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: 0.4rem 0.4rem 0.4rem 0;
}
.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: 3px;
}
.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: 0.4rem 0.4rem 0.4rem 0;
}
.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 {
display: flex;
flex-direction: column;
width: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
align-items: center;
}
#topdivider {
border-bottom: 2px solid black;
display: flex;
justify-content: center;
align-items: center;
}
.dark #topdivider {
border-bottom: 2px solid #ccc;
}
#topdivider>div {
position: relative;
}
#toptoggle {
cursor: pointer;
user-select: none;
position: absolute;
padding: 0.1rem 0.3rem;
top: -0.4rem;
left: -1rem;
font-size: 1.4rem;
line-height: 60%;
border: 1px solid black;
border-radius: 1rem;
background-color: #fff;
z-index: 100;
}
.flipped {
transform: rotate(0.5turn);
}
.dark #toptoggle {
border: 1px solid #fff;
background-color: #222;
}
#fileinfodiv {
flex: 20rem 1 0;
overflow: auto;
}
#bomcontrols {
display: flex;
flex-direction: row-reverse;
}
#bomcontrols>* {
flex-shrink: 0;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas,
#backcanvas {
touch-action: none;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
.bom-color {
width: 20%;
}
.color-column input {
width: 1.6rem;
height: 1rem;
border: 1px solid black;
cursor: pointer;
padding: 0;
}
/* removes default styling from input color element */
::-webkit-color-swatch {
border: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-moz-color-swatch,
::-moz-focus-inner {
border: none;
}
::-moz-focus-inner {
padding: 0;
}
/* #bomhead {
position: sticky;
top: 0px;
z-index: 1;
} */
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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5vu+AJb71vu1AL+7GdObe/t7AACam7swe917RIAcu2ZywlsEe3N7EHtQe1IA2Xvie0h7+XtSe0V7fAAle2D7FXuKe1IA2kC6U6z7m7vM+6aArPsdexz7XPs8+0IAfPufAEoAmfuZe/97sfsiAED70nvFe7J7uHup+wR733uR+3970ftie7971fvx+8D7dfug+3J74Pul+5D7Lfsie237APt5ewV7tftJ+/X75XuMAJV76ftBewz78ABS+2L7EvtC+yL7h7uy+/L73GuK+zQAyvtq+wR79PuVuwN7lKDze0cz5Pv7u2oABnuXe1IA3Gube/u7RIC6QOe7ADP1AB7AMus5M8SAmfur+9L74vu5+5/76/ty+wr7UVw7+6r76vv0e617Q/tZe+37gPtd+xP7yft9+4379HsR+zV7z3uhew17qvBNey579Htne+AHlfsd+4wANfuJ+7AHDfsz+2n7bADvAMj7RAAru2u76Ps7u1IAe7uHu6e757uXuyoA17u3u/e7j7to+6+7eblk+xT7v7v/uxZTNPsgew+TkvYnS6Q7YIBSu/lzYICyuz178rtRu2h7Vru+u2HzKbsKBxq7sgfau/27NrsAM6nxBrtAM2IHibsWu2a7CruWu73AegflKym7qQAOu/W7zruuu0Ng7rueu3FQ3rspu1G7v1P+u8jggbtiB0hgIbtWu5q7yPMpux27XKspu94H8bssQHoHybvkwCEHrrstuza7JzNggOoH/qAgAEczebt6B0W7Ygcdu2W7vcCpB7xrmrNFELq7dbtWux4HfGvdu5EHcQdtuyrTUbtduym7BrvtO2IHsQd8M8LrVrtGyLeTa7MPk0+TKwDwAJi70gCOoA+TBACCu/AA+nKhU6L2RACeAPpyJaCCAJw6QAAA"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* Utility functions */
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
pcbdata.metadata.revision + '__#';
var storage;
function initStorage(key) {
try {
window.localStorage.getItem("blank");
storage = window.localStorage;
} catch (e) {
// localStorage not available
}
if (!storage) {
try {
window.sessionStorage.getItem("blank");
storage = window.sessionStorage;
} catch (e) {
// sessionStorage also not available
}
}
}
function readStorage(key) {
if (storage) {
return storage.getItem(storagePrefix + key);
} else {
return null;
}
}
function writeStorage(key, value) {
if (storage) {
storage.setItem(storagePrefix + key, value);
}
}
function fancyDblClickHandler(el, onsingle, ondouble) {
return function () {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function () {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 200);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
}
function smoothScrollToRow(rowid) {
document.getElementById(rowid).scrollIntoView({
behavior: "smooth",
block: "center",
inline: "nearest"
});
}
function focusInputField(input) {
input.scrollIntoView(false);
input.focus();
input.select();
}
function saveBomTable(output) {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
}
if (node != bomhead.childNodes[0].lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
let val = '';
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
val += '✓';
}
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
val += node.firstChild.nodeValue;
} else {
val += node.nodeValue;
}
}
if (output == 'csv') {
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
if (isNumeric(val)) {
val = +val; // use number
} else {
val = `"${val}"`; // enclosed within double-quote
}
}
text += val;
if (cell != row.lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
}
if (output != 'clipboard') {
// To file: csv or txt
var blob = new Blob([text], {
type: `text/${output}`
});
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
} else {
// To clipboard
var textArea = document.createElement("textarea");
textArea.classList.add('clipboard-temp');
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
if (document.execCommand('copy')) {
console.log('Bom copied to clipboard.');
}
} catch (err) {
console.log('Can not copy to clipboard.');
}
document.body.removeChild(textArea);
}
}
function isNumeric(str) {
/* https://stackoverflow.com/a/175787 */
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}
function removeGutterNode(node) {
for (var i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].classList &&
node.childNodes[i].classList.contains("gutter")) {
node.removeChild(node.childNodes[i]);
break;
}
}
}
function cleanGutters() {
removeGutterNode(document.getElementById("bot"));
removeGutterNode(document.getElementById("canvasdiv"));
}
var units = {
prefixes: {
giga: ["G", "g", "giga", "Giga", "GIGA"],
mega: ["M", "mega", "Mega", "MEGA"],
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
milli: ["m", "milli", "Milli", "MILLI"],
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
nano: ["N", "n", "nano", "Nano", "NANO"],
pico: ["P", "p", "pico", "Pico", "PICO"],
},
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
unitsLong: [
"OHM", "Ohm", "ohm", "ohms",
"FARAD", "Farad", "farad",
"HENRY", "Henry", "henry"
],
getMultiplier: function (s) {
if (this.prefixes.giga.includes(s)) return 1e9;
if (this.prefixes.mega.includes(s)) return 1e6;
if (this.prefixes.kilo.includes(s)) return 1e3;
if (this.prefixes.milli.includes(s)) return 1e-3;
if (this.prefixes.micro.includes(s)) return 1e-6;
if (this.prefixes.nano.includes(s)) return 1e-9;
if (this.prefixes.pico.includes(s)) return 1e-12;
return 1;
},
valueRegex: null,
}
function initUtils() {
var allPrefixes = units.prefixes.giga
.concat(units.prefixes.mega)
.concat(units.prefixes.kilo)
.concat(units.prefixes.milli)
.concat(units.prefixes.micro)
.concat(units.prefixes.nano)
.concat(units.prefixes.pico);
var allUnits = units.unitsShort.concat(units.unitsLong);
units.valueRegex = new RegExp("^([0-9\.]+)" +
"\\s*(" + allPrefixes.join("|") + ")?" +
"(" + allUnits.join("|") + ")?" +
"(\\b.*)?$", "");
units.valueAltRegex = new RegExp("^([0-9]*)" +
"(" + units.unitsShort.join("|") + ")?" +
"([GgMmKkUuNnPp])?" +
"([0-9]*)" +
"(\\b.*)?$", "");
if (config.fields.includes("Value")) {
var index = config.fields.indexOf("Value");
pcbdata.bom["parsedValues"] = {};
for (var id in pcbdata.bom.fields) {
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
}
}
}
function parseValue(val, ref) {
var inferUnit = (unit, ref) => {
if (unit) {
unit = unit.toLowerCase();
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
unit = 'r';
}
unit = unit[0];
} else {
ref = /^([a-z]+)\d+$/i.exec(ref);
if (ref) {
ref = ref[1].toLowerCase();
if (ref == "c") unit = 'f';
else if (ref == "l") unit = 'h';
else if (ref == "r" || ref == "rv") unit = 'r';
else unit = null;
}
}
return unit;
};
val = val.replace(/,/g, "");
var match = units.valueRegex.exec(val);
var unit;
if (match) {
val = parseFloat(match[1]);
if (match[2]) {
val = val * units.getMultiplier(match[2]);
}
unit = inferUnit(match[3], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[4],
}
}
match = units.valueAltRegex.exec(val);
if (match && (match[1] || match[4])) {
val = parseFloat(match[1] + "." + match[4]);
if (match[3]) {
val = val * units.getMultiplier(match[3]);
}
unit = inferUnit(match[2], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[5],
}
}
return null;
}
function valueCompare(a, b, stra, strb) {
if (a === null && b === null) {
// Failed to parse both values, compare them as strings.
if (stra != strb) return stra > strb ? 1 : -1;
else return 0;
} else if (a === null) {
return 1;
} else if (b === null) {
return -1;
} else {
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
else return 0;
}
}
function validateSaveImgDimension(element) {
var valid = false;
var intValue = 0;
if (/^[1-9]\d*$/.test(element.value)) {
intValue = parseInt(element.value);
if (intValue <= 16000) {
valid = true;
}
}
if (valid) {
element.classList.remove("invalid");
} else {
element.classList.add("invalid");
}
return intValue;
}
function saveImage(layer) {
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
var bgcolor = null;
if (!document.getElementById("render-save-transparent").checked) {
var style = getComputedStyle(topmostdiv);
bgcolor = style.getPropertyValue("background-color");
}
if (!width || !height) return;
// Prepare image
var canvas = document.createElement("canvas");
var layerdict = {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
bg: canvas,
fab: canvas,
silk: canvas,
highlight: canvas,
layer: layer,
}
// Do the rendering
recalcLayerScale(layerdict, width, height);
prepareLayer(layerdict);
clearCanvas(canvas, bgcolor);
drawBackground(layerdict, false);
drawHighlightsOnLayer(layerdict, false);
// Save image
var imgdata = canvas.toDataURL("image/png");
var filename = pcbdata.metadata.title;
if (pcbdata.metadata.revision) {
filename += `.${pcbdata.metadata.revision}`;
}
filename += `.${layer}.png`;
saveFile(filename, dataURLtoBlob(imgdata));
}
function saveSettings() {
var data = {
type: "InteractiveHtmlBom settings",
version: 1,
pcbmetadata: pcbdata.metadata,
settings: settings,
}
var blob = new Blob([JSON.stringify(data, null, 4)], {
type: "application/json"
});
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}
function loadSettings() {
var input = document.createElement("input");
input.type = "file";
input.accept = ".settings.json";
input.onchange = function (e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = readerEvent => {
var content = readerEvent.target.result;
var newSettings;
try {
newSettings = JSON.parse(content);
} catch (e) {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
if (newSettings.type != "InteractiveHtmlBom settings") {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
if (metadataMatches) {
for (var k in pcbdata.metadata) {
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
metadataMatches = false;
}
}
}
if (!metadataMatches) {
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
if (!confirm(
`Settins file metadata does not match current metadata.\n\n` +
`Page metadata:\n${currentMetadata}\n\n` +
`Settings file metadata:\n${fileMetadata}\n\n` +
`Press OK if you would like to import settings anyway.`)) {
return;
}
}
overwriteSettings(newSettings.settings);
}
reader.readAsText(file, 'UTF-8');
}
input.click();
}
function resetSettings() {
if (!confirm(
`This will reset all checkbox states and other settings.\n\n` +
`Press OK if you want to continue.`)) {
return;
}
if (storage) {
var keys = [];
for (var i = 0; i < storage.length; i++) {
var key = storage.key(i);
if (key.startsWith(storagePrefix)) keys.push(key);
}
for (var key of keys) storage.removeItem(key);
}
location.reload();
}
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.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
setOffsetBackRotation(settings.offsetBackRotation);
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
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: "FB",
bomlayout: "left-right",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: "none",
redrawOnDrag: true,
boardRotation: 0,
offsetBackRotation: false,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
columnOrder: [],
hiddenColumns: [],
netColors: {},
}
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 (settings.bommode == "netlist" && !pcbdata.nets) {
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;
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
if (highlightpin1 === "false") highlightpin1 = "none";
if (highlightpin1 === "true") highlightpin1 = "all";
setHighlightPin1(highlightpin1);
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
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);
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;
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
settings.netColors = JSON.parse(readStorage("netColors")) || {};
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function () {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function (eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function (eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for (callback of this.callbacks[eventType])
callback(event);
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
var point = [
linepoint[0] * text.width + offsetx,
linepoint[1] * text.height + offsety
];
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
return point;
}
function drawText(ctx, text, color) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if ("svgpath" in text) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
if ("polygons" in text) {
ctx.fill(getPolygonsPath(text));
ctx.restore();
return;
}
ctx.translate(...text.pos);
ctx.translate(text.thickness * 0.5, 0);
var angle = -text.angle;
if (text.attr.includes("mirrored")) {
ctx.scale(-1, 1);
angle = -angle;
}
var tilt = 0;
if (text.attr.includes("italic")) {
tilt = 0.125;
}
var interline = text.height * 1.5 + text.thickness;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
for (var i in txt) {
var lineWidth = text.thickness + interline / 2 * tilt;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
}
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
}
}
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
var inOverbar = false;
for (var j = 0; j < txt[i].length; j++) {
if (config.kicad_text_formatting) {
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.lineWidth = 3 / scalefactor;
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);
}
}
ctx.lineWidth = 3 / scalefactor;
// 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 == "all" ||
settings.highlightpin1 == "selected" && highlight)) {
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, defaultColor, highlight) {
ctx = canvas.getContext("2d");
ctx.lineCap = "round";
var hasHole = (track) => (
'drillsize' in track &&
track.start[0] == track.end[0] &&
track.start[1] == track.end[1]);
// First draw tracks and tented vias
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
if (!hasHole(track)) {
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
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();
}
}
// Second pass to draw untented vias
var style = getComputedStyle(topmostdiv);
var holeColor = style.getPropertyValue('--pad-hole-color')
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
if (hasHole(track)) {
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
ctx.lineWidth = track.width;
ctx.beginPath();
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
ctx.stroke();
ctx.strokeStyle = holeColor;
ctx.lineWidth = track.drillsize;
ctx.lineTo(...track.end);
ctx.stroke();
}
}
}
function drawZones(canvas, layer, defaultColor, highlight) {
ctx = canvas.getContext("2d");
ctx.lineJoin = "round";
for (var zone of pcbdata.zones[layer]) {
if (highlight && highlightedNet != zone.net) continue;
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
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.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var padHoleColor = style.getPropertyValue('--pad-hole-color');
var ctx = canvas.getContext("2d");
for (var footprint of pcbdata.footprints) {
// draw pads
var padDrawn = false;
for (var pad of footprint.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false);
padDrawn = true;
}
}
if (padDrawn) {
// redraw all pad holes because some pads may overlap
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, padHoleColor);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
drawFootprints(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawFootprints(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
function prepareCanvas(canvas, flip, transform) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
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, flip) {
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 + (flip && settings.offsetBackRotation ? - 180 : 0)));
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 flip = (layerdict.layer === "B");
var bbox = applyRotation(pcbdata.edges_bbox, flip);
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;
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;
var flip = layerdict.layer === "B";
if (flip) {
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 + (flip && settings.offsetBackRotation ? - 180 : 0));
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 setOffsetBackRotation(value) {
settings.offsetBackRotation = value;
writeStorage("offsetBackRotation", value);
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();
if (initDone) {
populateBomTable();
}
}
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 updateNetColors() {
writeStorage("netColors", JSON.stringify(settings.netColors));
redrawIfInitDone();
}
function netColorChangeHandler(net) {
return (event) => {
settings.netColors[net] = event.target.value;
updateNetColors();
}
}
function netColorRightClick(net) {
return (event) => {
if(event.button == 2) {
event.preventDefault();
event.stopPropagation();
var style = getComputedStyle(topmostdiv);
var defaultNetColor = style.getPropertyValue('--track-color').trim();
event.target.value = defaultNetColor;
delete settings.netColors[net];
updateNetColors();
}
}
}
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 (String(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") {
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
}));
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
return 0;
}));
} 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) {
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
footprintIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
var style = getComputedStyle(topmostdiv);
var defaultNetColor = style.getPropertyValue('--track-color').trim();
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);
var color = settings.netColors[netname] || defaultNetColor;
td = document.createElement("TD");
var colorBox = document.createElement("INPUT");
colorBox.type = "color";
colorBox.value = color;
colorBox.onchange = netColorChangeHandler(netname);
colorBox.onmouseup = netColorRightClick(netname);
colorBox.oncontextmenu = (e) => e.preventDefault();
td.appendChild(colorBox);
td.classList.add("color-column");
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");
var output = new Array();
for (let item of valueSet) {
const visible = highlightFilter(String(item));
if (typeof item === 'string' && item.match(urlRegex)) {
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
} else {
output.push(visible);
}
}
td.innerHTML = output.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("topmostdiv").style.height = "";
document.getElementById("topmostdiv").style.display = "block";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("topmostdiv").style.height = "100%";
document.getElementById("topmostdiv").style.display = "flex";
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("topmostdiv").style.height = "100%";
document.getElementById("topmostdiv").style.display = "flex";
document.getElementById("bomdiv").classList.add("split-horizontal");
document.getElementById("canvasdiv").classList.add("split-horizontal");
document.getElementById("frontcanvas").classList.remove("split-horizontal");
document.getElementById("backcanvas").classList.remove("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeAll
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
var chkbxs = document.getElementsByClassName("visibility_checkbox");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = true;
}
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedFootprints();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
prepCheckboxes();
populateMarkWhenCheckedOptions();
setMarkWhenChecked(settings.markWhenChecked);
}
function setMarkWhenChecked(value) {
writeStorage("markWhenChecked", value);
settings.markWhenChecked = value;
markedFootprints.clear();
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
markedFootprints.add(ref);
}
populateBomTable();
drawHighlights();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function populateMarkWhenCheckedOptions() {
var container = document.getElementById("markWhenCheckedContainer");
if (settings.checkboxes.length == 0) {
container.parentElement.style.display = "none";
return;
}
container.innerHTML = '';
container.parentElement.style.display = "inline-block";
function createOption(name, displayName) {
var id = "markWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "markWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setMarkWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.markWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
function constrain(number, min, max){
return Math.min(Math.max(parseInt(number), min), max);
}
document.onkeydown = function (e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
case "ArrowLeft":
case "ArrowRight":
if (document.activeElement.type != "text"){
e.preventDefault();
let boardRotationElement = document.getElementById("boardRotation")
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
if (e.key == "ArrowLeft"){
settings.boardRotation += 3; // 15 degrees
}
else{
settings.boardRotation -= 3;
}
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
boardRotationElement.value = settings.boardRotation
setBoardRotation(settings.boardRotation);
}
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
e.preventDefault();
}
}
}
function hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
function topToggle() {
var top = document.getElementById("top");
var toptoggle = document.getElementById("toptoggle");
if (top.style.display === "none") {
top.style.display = "flex";
toptoggle.classList.remove("flipped");
} else {
top.style.display = "none";
toptoggle.classList.add("flipped");
}
}
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);
///////////////////////////////////////////////
///////////////////////////////////////////////
// EventHandler.registerCallback(IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, () => {
// for(var tr of bom.childNodes) {
// tr.onclick = tr.onmousemove;
// tr.onmousemove = null;
// };
// });
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div id="fileinfodiv">
<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 id="bomcontrols">
<div class="hideonprint menu">
<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="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
Highlight first pin
<form id="highlightpin1">
<div class="flexbox">
<label>
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
None
</label>
<label>
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
All
</label>
<label>
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
Selected
</label>
</div>
</form>
</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">
<input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
Offset back rotation
</label>
<label class="menu-label">
<div style="margin-left: 5px">Bom checkboxes</div>
<input id="bomCheckboxes" class="menu-textbox" type=text
oninput="setBomCheckboxes(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Mark when checked</div>
<div id="markWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint">
<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">
<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">
<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">
<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">
<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>
<button class="savebtn" onclick="resetSettings()">Reset</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Save bom table as</span>
<div class="flexbox">
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="topdivider">
<div class="hideonprint">
<div id="toptoggle" onclick="topToggle()"></div>
</div>
</div>
<div id="bot" class="split" style="flex: 1 1">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="saveBomTable('clipboard')"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>