rgmii-pmod/bom/ibom.html

4670 lines
290 KiB
HTML

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