Files
UTIL-002_AdvancedKeys/Rev. 1/MainModule/bom/ibom.html
2025-12-29 18:07:02 -05:00

4710 lines
303 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html,
body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 3px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
position: relative;
}
.bom th,
.bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th,
.dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.bom .value {
width: 15%;
}
.bom .quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal,
.gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid,
.dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
display: flex;
flex-direction: column;
width: 100%;
background-color: white;
transition: background-color 0.3s;
min-height: 100%;
}
#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;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint", "Description", "Reference"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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Psq+8xDVPs/g14AtPv0+ykIjPuNKMz7czts+yT7nPsMu7z7cNYC+0L7LQBNAKL74vvlg1L7LLuy+/L7QLtK+277vbsa+1r72Xs0e3+7Qnsie5TKpzsSewyAMntye/c7aPvdAMp7fICqe+p7GUOSAHUz2nsMu3p7hnvGe6Z75nuWe32D8NaWAHZ7DntOewQAEkOuewX7lwCee+i73nsOtAP7fnvou/37L3tNezR7OHt6+zD7TQBw+wj7ugBI+yb7qPuKe2X7GPt++7j78ND4+y+7kgDO+6T7fQDk+0G7qvt9u9T7GwDe+7kADPs2+4wAAfus+9gA7Ptt+1oAXPth+/z7gvsEAML70fti+8bbcfvS+4n7Cvsp+xT7J/vp+5IAdeN8e0wA5bO4eyi7BHvcey6AxHv4uwl7WbsO++t7l+O0e46Y1LvESHS7DLuwAEy7rHtsu+x7nHswB1j6aNOZ++AHIXsigLW7c3vRe427i3txe717CAere0gHBPu2g5t7/bvA+3874Io5AOojkAf4e5p7hHuwB7i78Acrezv7KXsgAKgHv3DoB7S7jHtYBzgHrLtQAOy7CNYce9y7vLtEB0+knActe7QjwntD1GJ7AXtF+38A8ntr++X7lfsaeyEL2nsmALp7BntGeyZ7Znv+u6371nuhu537S/vd+737XHtueycAg/vD+24HY/sBey97dxicB1N7tCOXAEQAasune+d7GPvsMjQA13u3e/d70HtPey97b3vdg187XPvfexSAf3tU+4D7Zgfbe5fjC9ucBwd7tCP7AGc72AJqy4J7mLsLQDJ7BQDbKWc7ZAAN+4J72ABaAC0AQQC1e327FePEAFL7vrum1GAA7ntQAL7b9AilO5wHEPu0I0d7P3MhB9XTl3sRB/c7N3vLe9EH8ADUgLEHkgCve/4AH3shg197P3upB6f76QdsByd7e3uSAI3LNbuiu4V783vUB6m7S3t0B0IHjAe7+6l7b7sjexl7DXu2g8qhnAfZ+wMHTVhDB2d7IwfhBxQAkQeTB6bwj3vPe3MH8QeLB0kHKwcm22kHLioZB2N7J3scB9sHM/uIuxO7FAczu1QHJXs0B2V7fXuJe5V7yXsbe5cHW3tgh9+7E3uSAPaDLkOaB9mZmnuuB7oHbwD6B+j7KnseAFX7agCSAKC7nvtgANgAFfu5AGQAZzsoAI7b9IfVB0371gcWe1Z77fu2e2YH9nuOB857sAB9+757Q/s+e4F7JAeheyF7w0DI+yaDvAgI1nrbVvsg1m0HQQDwAMNGYwDwAK5zfYPG2997l+NQ+0/7Frvu23eDfYOYh5l7orttO8a7uXsBB0EHJ3svBxd7bwcfBycHUwczBz8HTADzB+97iQfLBykHQIdrByCHGweSAMNzBmNyBC5Dgwe2h6EHowfvB+MHUQdfBzEHrodz038HnocBu4CH/3uwAOsHmQebB5KH1FQuQ/kH5hj4S8UH3Vj7AGUHHHv0CD3J1LsnO30AvSMUAJS7rnN9AJx7oLvrB7SHUAB8h9gAzztnO8872ACCe/UHGIcdhyUHC9O1O8a7uQeiB0d7J3vPO2d7NtQJu2lQSrvz4Hc7socJB597SYfehymH6weje2aH3vNBh/0HoXvdACDrEXtwh8V7N7uIh7d7j7tVe+cHzAfdhyuHNwcd80GHuvuPB88H4YcOh1GHnwdGwN8HcQcLB4mHyQe/ez6HN/tph1iHF/NBhw8HIABHe31gYYevB1d7D4dOhzGH0wezB26HCYfzh++Hqwdfh36H6YcBh+vbxrtQhwBHTwfAR/aHoEcye9GHT4exhy+HHoewR8mHwIdA+0hHQ3NgByAAhYCvg3yA+nugQ/QINEdou0Y7YwfwAEbjXgBCCPRHBABQAEUA/rtgAIQAWgBge/IHnLv8u8qLkbshe5VAs3u7h117pXuHh/17x4ciB/m7jQemhxeHFEc6ktwHjIDQB8oHcAeke6cHqIeO+ygHYgCUu2gH9HuYB8x7zLuyB4JHigdce8oH/LsEFJG76gebh7CHV7sLe0cHtAfleyiHA3snhwpHhbtKRyD7doO+B5IAX8CvgzKHewcdewcHCIcuR0iH9AfCB+iHikesB2RHYjv+R0wAA4BBR8OHAYejhzaD44dRe5OHGbvTh3gAs4f/B16HH4dLh36H54cg+0CzBmNHQEFHRsASR05HhweLu65HyIeIB7pHyAc1e95HcUc/h1I7FUfXh6IHeHvqR7wHhAdaRwS7R4doh/pHVYd0exgHUgemR7gHcgf4B0oHPHuae1P7SUf/h0i7UAf9R5pHAgfaR8NHekf0CGIHiIASBwx7QgjSByx75kezR1ZH80chC3cHAUdoR8FHU7uhR/CH+4cRRzJH7kdyRzFHbUelR4e7BmNGwK+DmgfPQNoHI/skh/sAZIfr+xSHanvGBzordfvmB437Vgct+zyHNnsOB457QocihwyA7gc+e8jHXgcj+y97FEfPAK+DoYcBh3aHYQfYRxMH4Ed4R5BHcYfuh3OHSwcLh0VHJEegh6uHudufR1aHQ4c1R517zkf1R5FHOkceR/JHLAfvR9s7IWJVu/ZHlwDdAGrLO4e1R+FHbMdPR01HnMevR/97PMffu7ZHkgDIwDjHGEd4x3eHhMe4R5GHpMcERxTHAIeLhzTH/odby1jHg4dwe3a7EHsge+a7YHv2u467LkcweyDwoHvwe4h7Jts+u+Z7qfuhu/QIGTtVuxuHkYDMx2FHD0fix8t7W0ctR0N7Z4fXB75HKEcKx91H+QeFB/QI+YelB9J75Qf0CJUH1Qe1B12HsUfNB0QArQdNWO0HnQfdBzX7iUcgALse/7vmx5a7psewe3bHJsdeAFbH9Uc2x6cIZcdyBw7HxQDIe0f7aHuux+G7kodYQK+DgsfCx/sH90fde8cHbkeSxy9H3buxR7LHC2OqB5IABGCvg6eA3sc9x9JH/seyRyNHrUcyxyHHfzvyx0wApCkhh01Y5YCYRwTHzEdEx0q7zodQR/GHr4dER7rHvoekRx1HQLMAvKO7jMehwLoA28cRh46H+8cQRy6HWscFR1TH8EcA+4hHF8dHu+PH9kcMR/RHtEfHO+PATzusRxb7VyOSAHyAnEfcR9gAvEcm2wJH+AfCRxRHOU0uQ0bjFPvwAOWA2PuHANMHLirbKab75vuW+00A1vsVYFv7yMDRR5fj+/uw1of7qfse+zT7dPuX+777mCc3+wMAgfv3+8H7vtt1ACAHi0cgADnASse3hyBHu8fqx8+HvwfHx5THcEefh5/H58d0x4XbBmO6XC5Dm8dDB6OHoUc+MvK77dCru92wZCf5R2+HxEdXB/rHX3OVO6O73Uf4ONPHe4e9xw1HUUdnB1zHwce6Jx3zkodcYK+DXseORyzHdUc9e/3HDAfNR0wHXkdLx9YnrjGju2hHU8eOJz7HpifsxwHHHifcx8vH2ztXx5IAscC8J/fH94c4R4+HGscvx8InhEeiJ9onCEeSJzcHQLM4h0wA2ZnZh2e7ASczxweHc8fPRwvHQcfDx+En37uRJzknjMe4x0Nz+McPx2BHT8ckx0kn0EciJzrH1Mdnx7THmSdqQAZji4ApR/knIUeUByYns8cnByEnnkdhJ94nXCcUwDEnKsf8JxrHe8cZuwfHZMcwR6knp8fpJ10nZUdVJyAAFwD2J2pbF7t3R8MnRSejJ/PH20dlJ29HFScLY2D7UScbh3qyd8ezJ1hHAicJJ0InrScpJ+0nH8eph1/HUicT68e73UcrRzwHIQt8B9i7G0dDRycngcdMALtHtAD7RyZH2AfHR2x7CgcEB9ZHmnsQhzkn/4e1J19z9SdxJwsnLztLJ6/HWidrJxInGydZByJHUSdoRz9Heftue4X7snt6ByX7BgdhB0YH1ftMALX7LqSQx5YHzfs2B7DH9gf8h137iMcuB/37KMcj+557/nsYx3MHyKcgAMyAQUe9R6i7gKeDR+Yn7icnhxCnUKeTRzCnZkdwp5y7c0d8u5p7ecdqgClH57v6h/KHRodP+4QnyoeZx6qH6oeah9qHcNZ6h3KHhoeKhzon8UetO5KHontqR1KnA0fAp7KnUsejR4ZH4gfGR0qnMgeqp5ZHhAfCRwZj04AzJ3UnqsePJ8THiSeHx+THb8diJ8VHGSdlR6Zrv7v+B+hHfCcPJ/Mngif4R8kn2seFR+8n34dSJ5dHTACqbC5DMYDGJ1JHRyeuJxonZydeJ/an3yeSAL6Aoafop+GnGadPJ1mnLyc5p+/H4icfJwmnWQeKtL+73Ue3J7Enasetp5rH2aexp2knBKe6JxRbwafLR5KnGkdEe26nHMeDxztHBkfjR5IHh0dTRydH8Kfqp0QHW2u/u9dHAye3R0Mn5aePR8UnA8elJxcH5SfWJ+jT2HsCe/HbaCcYJ6IA8ABjALxHOCfI+6v75IdY+0+ndvvb+xYnTvvB+677gAfu+6f7dIcX+1f7ogBMJyz7Qfsc++wnPPt8+y6kb/sf+zH73/uS+7/77/ty+//7wwDK+0Bnafua+yAHoqfRQLsnh6f7J8enrMcuJ41Hbicep4vHdXv2pxzbf6ODg/YA9DsJ23ikjdsp28U7X3Pp2yE7RuNZ25V48dt52w47X3NF21k7RuOl27xnSKtqW7HAjduuO7XbSKv121xndqst20irbds9O0irndui5KPb4DvRO6D7/ducO7w75UedVd3bidvlO3pn4jthCN3bs9vDO6I7C9twAt3bK9sCO1ZnsDsaGpI7QLPb2/ZnTGfIq/vbemeH231oMDvn2/fbV9vsZ4XDjeMtcyQ7yKtZOx3zFJrjO6I7hcOf2yQ739vEmL/biwCBZ6x6gDuCO047oDtiO+A7ujtBy6k7bmc32xSaZ4bP2wg7X9vIO5I7NoNoO/fbmDtlZzg72WeNyz54ZWfAs8AWX9tkOx07IwtqW147QUOL22VnbGP6bPfbLDtb4mVnY9u6Z9FnUSwMlkA7/DtlZ8I7DWdZ28Zn0Wc9J0eow2ctO3I7T0SKO0lns2f0O6o7SdjqO43jWjs523cjiwC6O6BD+jvsZ0Y7SWcnZ2Y7ITugQ5Y76me4SzY7N2cCuyY4Ljuz25dnrjuRgO47t9uKGi47USy+OxE7ATtV20E7cYr/Z2E7kjuRO7E4/2dcs6IAIOeJO5I7KTsBJlXbGTuFePDnOTvw5ynbBTuN47L83UOlO3qYzmeVOwgYBTs121FnLTuNO4pYZWdtOzw8kjtdO1Y4VdugByA74TuiO4M794oU520C7ngDO5M78Tt6g8zDhoM/O/AABtt8AM6DkNbv++7b8AAkgBJDrsfeCCSAzlA0AC9wQAAA="))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* 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) {
var name = node.firstChild.nodeValue ?? "";
text += (output == 'csv' ? `"${name}"` : name);
}
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,
valueAltRegex: 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"] = {};
var allList = getBomListByLayer('FB').flat();
for (var id in pcbdata.bom.fields) {
var ref_key = allList.find(item => item[1] == Number(id)) || [];
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index], ref_key[0] || '');
}
}
}
function parseValue(val, ref) {
var inferUnit = (unit, ref) => {
if (unit) {
unit = unit.toLowerCase();
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
unit = 'r';
}
return unit[0];
}
var resarr = /^([a-z]+)\d+$/i.exec(ref);
switch (Array.isArray(resarr) && resarr[1].toLowerCase()) {
case "c": return 'f';
case "l": return 'h';
case "r":
case "rv": return 'r';
}
return null;
};
val = val.replace(/,/g, "");
var match = units.valueRegex.exec(val);
if (Array.isArray(match)) {
var unit = inferUnit(match[3], ref);
var val_i = parseFloat(match[1]);
if (!unit) return null;
if (match[2]) {
val_i = val_i * units.getMultiplier(match[2]);
}
return {
val: val_i,
unit: unit,
extra: match[4],
}
}
match = units.valueAltRegex.exec(val);
if (Array.isArray(match) && (match[1] || match[4])) {
var unit = inferUnit(match[2], ref);
var val_i = parseFloat(match[1] + "." + match[4]);
if (!unit) return null;
if (match[3]) {
val_i = val_i * units.getMultiplier(match[3]);
}
return {
val: val_i,
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;
setHighlightRowOnClick(settings.highlightRowOnClick);
document.getElementById("highlightRowOnClickCheckbox").checked = settings.highlightRowOnClick;
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("highlightRowOnClick", false, "highlightRowOnClickCheckbox", setHighlightRowOnClick);
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 if (pad.drillshape == "rect") {
ctx.fill(getChamferedRectPath(pad.drillsize, 0, 0, 0));
} 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 setHighlightRowOnClick(value) {
settings.highlightRowOnClick = value;
writeStorage("highlightRowOnClick", value);
if (initDone) {
populateBomTable();
}
}
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 createCheckboxHandlers(input, checkbox, references, row) {
var clickHandler = () => {
refsSet = getStoredCheckboxRefs(checkbox);
var markWhenChecked = settings.markWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (input.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);
}
return [
(e) => {
clickHandler();
},
(e) => {
e.preventDefault();
if (row.onmousemove) row.onmousemove();
},
(e) => {
e.preventDefault();
input.checked = !input.checked;
input.indeterminate = false;
clickHandler();
}
];
}
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 getBomListByLayer(layer) {
switch (layer) {
case 'F': return pcbdata.bom.F.slice();
case 'B': return pcbdata.bom.B.slice();
case 'FB': return pcbdata.bom.both.slice();
}
return [];
}
function getSelectedBomList() {
if (settings.bommode == "netlist") {
return pcbdata.nets.slice();
}
var out = getBomListByLayer(settings.canvaslayout);
if (settings.bommode == "ungrouped") {
// expand bom table
var expandedTable = [];
for (var bomentry of out) {
for (var ref of bomentry) {
expandedTable.push([ref]);
}
}
return expandedTable;
}
return out;
}
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][0] != b[i][0]) 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();
bomtable = getSelectedBomList();
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, td.ontouchstart, td.ontouchend] = createCheckboxHandlers(input, 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);
if (settings.highlightRowOnClick) {
tr.onmousedown = handler;
} else {
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 childNum = checkboxnum + settings.columnOrder.indexOf("checkboxes");
var checkbox = bomrow.childNodes[childNum].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 childNum = checkboxnum + 1 + settings.columnOrder.indexOf("checkboxes");
var checkbox = bomrow.childNodes[childNum].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) {
initRender();
initStorage();
initDefaults();
initUtils();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
// Triggers render
changeBomLayout(settings.bomlayout);
// Users may leave fullscreen without touching the checkbox. Uncheck.
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement)
document.getElementById('fullscreenCheckbox').checked = false;
});
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div id="fileinfodiv">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
<div id="bomcontrols">
<div class="hideonprint menu">
<button class="menubtn"></button>
<div class="menu-content">
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label><!-- This comment eats space! All of it!
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
Full Screen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Pads
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP outlined
</label>
<label class="menu-label">
<input id="highlightRowOnClickCheckbox" type="checkbox" checked onchange="setHighlightRowOnClick(this.checked)">
Highlight row on click
</label>
<label class="menu-label">
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
Highlight first pin
<form id="highlightpin1">
<div class="flexbox">
<label>
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
None
</label>
<label>
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
All
</label>
<label>
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
Selected
</label>
</div>
</form>
</label>
<label class="menu-label">
<span>Board rotation</span>
<span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
</label>
<label class="menu-label">
<input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
Offset back rotation
</label>
<label class="menu-label">
<div style="margin-left: 5px">Bom checkboxes</div>
<input id="bomCheckboxes" class="menu-textbox" type=text
oninput="setBomCheckboxes(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Mark when checked</div>
<div id="markWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
<button class="savebtn" onclick="resetSettings()">Reset</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Save bom table as</span>
<div class="flexbox">
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="topdivider">
<div class="hideonprint">
<div id="toptoggle" onclick="topToggle()"></div>
</div>
</div>
<div id="bot" class="split" style="flex: 1 1">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="saveBomTable('clipboard')"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>