KiCAD-Projects/Production/prod_esp32-wroom-table-lights/bom/esp32-wroom-table-lights BOM.html
Alexandre B febc01d758 .
2024-07-24 16:51:42 -04:00

4649 lines
315 KiB
HTML

<!DOCTYPE html>
<!-- saved from url=(0122)file:///C:/Users/alex/github/KiCAD-Projects/Production/prod_esp32-wroom-table-lights/bom/ESP32-Node_Bill-of-Materials.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>esp32-wroom-table-lights BOM</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": true, "show_silkscreen": true, "highlight_pin1": "all", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed,Received", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Description", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* Utility functions */
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
pcbdata.metadata.revision + '__#';
var storage;
function initStorage(key) {
try {
window.localStorage.getItem("blank");
storage = window.localStorage;
} catch (e) {
// localStorage not available
}
if (!storage) {
try {
window.sessionStorage.getItem("blank");
storage = window.sessionStorage;
} catch (e) {
// sessionStorage also not available
}
}
}
function readStorage(key) {
if (storage) {
return storage.getItem(storagePrefix + key);
} else {
return null;
}
}
function writeStorage(key, value) {
if (storage) {
storage.setItem(storagePrefix + key, value);
}
}
function fancyDblClickHandler(el, onsingle, ondouble) {
return function () {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function () {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 200);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
}
function smoothScrollToRow(rowid) {
document.getElementById(rowid).scrollIntoView({
behavior: "smooth",
block: "center",
inline: "nearest"
});
}
function focusInputField(input) {
input.scrollIntoView(false);
input.focus();
input.select();
}
function 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><style>[touch-action="none"]{ -ms-touch-action: none; touch-action: none; }
[touch-action="auto"]{ -ms-touch-action: auto; touch-action: auto; }
[touch-action="pan-x"]{ -ms-touch-action: pan-x; touch-action: pan-x; }
[touch-action="pan-y"]{ -ms-touch-action: pan-y; touch-action: pan-y; }
[touch-action="pan-x pan-y"],[touch-action="pan-y pan-x"]{ -ms-touch-action: pan-x pan-y; touch-action: pan-x pan-y; }
</style>
</head>
<body>
<div id="topmostdiv" class="topmostdiv dark" style="height: 100%; display: flex;">
<div id="top">
<div id="fileinfodiv">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">esp32-wroom-table-lights</td>
<td id="revision" class="title" style="width: 30%">Rev: </td>
</tr>
<tr>
<td id="company"></td>
<td id="filedate">2024-07-24 16:40:42</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" style="display: none;">
<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(&#39;none&#39;)">
None
</label>
<label>
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1(&#39;all&#39;)">
All
</label>
<label>
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1(&#39;selected&#39;)">
Selected
</label>
</div>
</form>
</label>
<label class="menu-label">
<span>Board rotation</span>
<span style="float: right"><span id="rotationDegree">0</span>°</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" style="display: inline-block;">
<div style="margin-left: 5px">Mark when checked</div>
<div id="markWhenCheckedContainer"><div class="radio-container"><input type="radio" name="markWhenChecked" value="" id="markWhenChecked-"><label for="markWhenChecked-">None</label></div><div class="radio-container"><input type="radio" name="markWhenChecked" value="Sourced" id="markWhenChecked-Sourced"><label for="markWhenChecked-Sourced">Sourced</label></div><div class="radio-container"><input type="radio" name="markWhenChecked" value="Placed" id="markWhenChecked-Placed"><label for="markWhenChecked-Placed">Placed</label></div><div class="radio-container"><input type="radio" name="markWhenChecked" value="Received" id="markWhenChecked-Received"><label for="markWhenChecked-Received">Received</label></div></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&nbsp;v2.9</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 depressed" onclick="changeCanvasLayout(&#39;F&#39;)" title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout(&#39;FB&#39;)" title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout(&#39;B&#39;)" title="Back only">B
</button>
</div>
<div class="button-container hideonprint">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout(&#39;bom-only&#39;)" title="BOM only"></button>
<button id="lr-btn" class="middle-button depressed" onclick="changeBomLayout(&#39;left-right&#39;)" title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout(&#39;top-bottom&#39;)" title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode(&#39;grouped&#39;)" title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="right-most-button depressed" onclick="changeBomMode(&#39;ungrouped&#39;)" title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode(&#39;netlist&#39;)" title="Netlist" style="display: none;"></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">66</td>
<td id="stats-components-back">2</td>
<td id="stats-components-total">68</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">20</td>
<td id="stats-groups-back">2</td>
<td id="stats-groups-total">22</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">196</td>
<td id="stats-smd-pads-back">0</td>
<td id="stats-smd-pads-total">196</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan="3" id="stats-th-pads">32</td>
</tr>
</tbody>
</table>
<table class="stats">
<colgroup><col width="40%"><col>
</colgroup><tbody id="checkbox-stats">
<tr>
<td colspan="2" style="border-top: 0">Checkboxes</td>
</tr>
<tr><td>Sourced</td><td id="checkbox-stats-Sourced"><div class="bar" style="width: 0%;"></div><div class="text">0/68 (0%)</div></td></tr><tr><td>Placed</td><td id="checkbox-stats-Placed"><div class="bar" style="width: 0%;"></div><div class="text">0/68 (0%)</div></td></tr><tr><td>Received</td><td id="checkbox-stats-Received"><div class="bar" style="width: 0%;"></div><div class="text">0/68 (0%)</div></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(&#39;F&#39;)">Front</button>
<button class="savebtn" onclick="saveImage(&#39;B&#39;)">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(&#39;csv&#39;)">csv</button>
<button class="savebtn" onclick="saveBomTable(&#39;txt&#39;)">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" style="width: calc(50% - 2.5px);">
<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(&#39;clipboard&#39;)"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<thead id="bomhead"><tr><th class="numCol"><div id="vismenu" class="menu"><div class="visbtn hideonprint"></div><div class="menu-content" id="vismenu-content"><label class="menu-label menu-label-top"><input class="visibility_checkbox" type="checkbox">Checkboxes</label><label class="menu-label"><input class="visibility_checkbox" type="checkbox">References</label><label class="menu-label"><input class="visibility_checkbox" type="checkbox">Value</label><label class="menu-label"><input class="visibility_checkbox" type="checkbox">Description</label><label class="menu-label"><input class="visibility_checkbox" type="checkbox">Footprint</label></div></div></th><th class="bom-checkbox" col_name="bom-checkbox">Sourced<span class="sortmark none"></span><div class="column-spacer"></div><div class="column-width-handle"></div></th><th class="bom-checkbox" col_name="bom-checkbox">Placed<span class="sortmark none"></span><div class="column-spacer"></div><div class="column-width-handle"></div></th><th class="bom-checkbox" col_name="bom-checkbox">Received<span class="sortmark none"></span><div class="column-spacer"></div><div class="column-width-handle"></div></th><th class="references" col_name="References" style="width: 21.8605%;">References<span class="sortmark none"></span><div class="column-spacer"></div><div class="column-width-handle"></div></th><th class="value" col_name="Value" style="width: 14.9767%;">Value<span class="sortmark none"></span><div class="column-spacer"></div><div class="column-width-handle"></div></th><th class="field2" col_name="Description" style="width: 21.9535%;">Description<span class="sortmark none"></span><div class="column-spacer"></div><div class="column-width-handle"></div></th><th class="footprint" col_name="Footprint" style="width: 21.8605%;">Footprint<span class="sortmark none"></span><div class="column-spacer"></div></th></tr></thead>
<tbody id="bombody"><tr id="bomrow1"><td>1</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>C8</td><td>1uF</td><td></td><td>CP_Elec_3x5.3</td></tr><tr id="bomrow2"><td>2</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>C9</td><td>1uF</td><td></td><td>CP_Elec_3x5.3</td></tr><tr id="bomrow3"><td>3</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>C10</td><td>1uF</td><td></td><td>CP_Elec_3x5.3</td></tr><tr id="bomrow4"><td>4</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>C11</td><td>10uF</td><td></td><td>CP_Elec_3x5.3</td></tr><tr id="bomrow5"><td>5</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>C12</td><td>10uF</td><td></td><td>CP_Elec_3x5.3</td></tr><tr id="bomrow6"><td>6</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>C13</td><td>0.1uF</td><td></td><td>CP_Elec_3x5.3</td></tr><tr id="bomrow7"><td>7</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>C14</td><td>0.1uF</td><td></td><td>CP_Elec_3x5.3</td></tr><tr id="bomrow8"><td>8</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow9"><td>9</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow10"><td>10</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow11"><td>11</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow12"><td>12</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow13"><td>13</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow14"><td>14</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow15"><td>15</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow16"><td>16</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow17"><td>17</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow18"><td>18</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow19"><td>19</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow20"><td>20</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow21"><td>21</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow22"><td>22</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow23"><td>23</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow24"><td>24</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow25"><td>25</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow26"><td>26</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow27"><td>27</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R3</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow28"><td>28</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R5</td><td>10R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow29"><td>29</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R6</td><td>R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow30"><td>30</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>R8</td><td>R</td><td>Resistor</td><td>R_1206_3216Metric_Pad1.30x1.75mm_HandSolder</td></tr><tr id="bomrow31"><td>31</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow32"><td>32</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow33"><td>33</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow34"><td>34</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow35"><td>35</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow36"><td>36</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow37"><td>37</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow38"><td>38</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow39"><td>39</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow40"><td>40</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow41"><td>41</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow42"><td>42</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow43"><td>43</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow44"><td>44</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow45"><td>45</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow46"><td>46</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow47"><td>47</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow48"><td>48</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow49"><td>49</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow50"><td>50</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D5</td><td>LED-5050</td><td>Cree PLCC6 3 in 1 SMD LED, PLCC-6</td><td>LED_5050-6</td></tr><tr id="bomrow51"><td>51</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D6</td><td>5050</td><td>Light emitting diode</td><td>LED_1210_3225Metric_Pad1.42x2.65mm_HandSolder</td></tr><tr id="bomrow52"><td>52</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>D7</td><td>D</td><td>Diode</td><td>D_1206_3216Metric_Pad1.42x1.75mm_HandSolder</td></tr><tr id="bomrow53"><td>53</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>U4</td><td>ESP32-C3 SuperMini</td><td></td><td>ESP32-C3_SuperMini</td></tr><tr id="bomrow54"><td>54</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>U5</td><td>AMS1117-3V3</td><td>AMS1117</td><td>AMS1117 SOT-223</td></tr><tr id="bomrow55"><td>55</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>U6</td><td>AMS1117-5V</td><td>AMS1117</td><td>AMS1117 SOT-223</td></tr><tr id="bomrow56"><td>56</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>H2</td><td>MountingHole_M3</td><td>3.2mm Diameter Mounting Hole (M3)</td><td>MountingHole_3.2mm_M3</td></tr><tr id="bomrow57"><td>57</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>H2</td><td>MountingHole_M3</td><td>3.2mm Diameter Mounting Hole (M3)</td><td>MountingHole_3.2mm_M3</td></tr><tr id="bomrow58"><td>58</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>H2</td><td>MountingHole_M3</td><td>3.2mm Diameter Mounting Hole (M3)</td><td>MountingHole_3.2mm_M3</td></tr><tr id="bomrow59"><td>59</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>BRD2</td><td>~</td><td></td><td>Circle-44R</td></tr><tr id="bomrow60"><td>60</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>Q1</td><td>NPN</td><td>Bipolar transistor symbol for simulation only, substrate tied to the emitter</td><td>TO-92L_Inline_Wide</td></tr><tr id="bomrow61"><td>61</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>TP5</td><td>VIN</td><td>test point</td><td>TestPoint_Pad_D1.5mm</td></tr><tr id="bomrow62"><td>62</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>TP6</td><td>GND</td><td>test point</td><td>TestPoint_Pad_D1.5mm</td></tr><tr id="bomrow63"><td>63</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>TP7</td><td>3V3</td><td>test point</td><td>TestPoint_Pad_D1.5mm</td></tr><tr id="bomrow64"><td>64</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>TP8</td><td>5V</td><td>test point</td><td>TestPoint_Pad_D1.5mm</td></tr><tr id="bomrow65"><td>65</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>J1</td><td>I2C</td><td>I2C connector, single row, 01x04</td><td>Conn_I2C</td></tr><tr id="bomrow66"><td>66</td><td><input type="checkbox"></td><td><input type="checkbox"></td><td><input type="checkbox"></td><td>J3</td><td>PWR</td><td></td><td>PinSocket_1x02_P2.54mm_Vertical</td></tr></tbody>
</table>
</div>
<div class="gutter gutter-horizontal" style="width: 5px;"></div><div id="canvasdiv" class="split split-horizontal" style="width: calc(50% - 2.5px);">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden; height: calc(99.7153% - 2.5px);">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0px; top: 0px; z-index: 0; width: 1084px; height: 873px;" width="1084" height="873"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0px; top: 0px; z-index: 1; width: 1084px; height: 873px;" width="1084" height="873"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0px; top: 0px; z-index: 2; width: 1084px; height: 873px;" width="1084" height="873"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0px; top: 0px; z-index: 3; width: 1084px; height: 873px;" width="1084" height="873"></canvas>
</div>
</div>
<div class="gutter gutter-vertical" style="height: 5px;"></div><div id="backcanvas" class="split" touch-action="none" style="overflow: hidden; height: calc(0.284738% - 2.5px);">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0px; top: 0px; z-index: 0; width: 1084px; height: 0px;" width="1084" height="0"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0px; top: 0px; z-index: 1; width: 1084px; height: 0px;" width="1084" height="0"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0px; top: 0px; z-index: 2; width: 1084px; height: 0px;" width="1084" height="0"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0px; top: 0px; z-index: 3; width: 1084px; height: 0px;" width="1084" height="0"></canvas>
</div>
</div>
</div>
</div>
</div>
</body></html>