Files
GravityHW/Exports/iBOM/ibom.html

4670 lines
309 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html,
body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 3px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
position: relative;
}
.bom th,
.bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th,
.dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.bom .value {
width: 15%;
}
.bom .quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal,
.gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid,
.dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
display: flex;
flex-direction: column;
width: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
align-items: center;
}
#topdivider {
border-bottom: 2px solid black;
display: flex;
justify-content: center;
align-items: center;
}
.dark #topdivider {
border-bottom: 2px solid #ccc;
}
#topdivider>div {
position: relative;
}
#toptoggle {
cursor: pointer;
user-select: none;
position: absolute;
padding: 0.1rem 0.3rem;
top: -0.4rem;
left: -1rem;
font-size: 1.4rem;
line-height: 60%;
border: 1px solid black;
border-radius: 1rem;
background-color: #fff;
z-index: 100;
}
.flipped {
transform: rotate(0.5turn);
}
.dark #toptoggle {
border: 1px solid #fff;
background-color: #222;
}
#fileinfodiv {
flex: 20rem 1 0;
overflow: auto;
}
#bomcontrols {
display: flex;
flex-direction: row-reverse;
}
#bomcontrols>* {
flex-shrink: 0;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas,
#backcanvas {
touch-action: none;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
.bom-color {
width: 20%;
}
.color-column input {
width: 1.6rem;
height: 1rem;
border: 1px solid black;
cursor: pointer;
padding: 0;
}
/* removes default styling from input color element */
::-webkit-color-swatch {
border: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-moz-color-swatch,
::-moz-focus-inner {
border: none;
}
::-moz-focus-inner {
padding: 0;
}
/* #bomhead {
position: sticky;
top: 0px;
z-index: 1;
} */
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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uOmxmbMpvgW4BbkFuDm/mbzZuwW5GA8FulmxqbiFuQm9CbM5uwm/CbagCIm8ibaTprm2obUgBSgDubZv7YW2FwwMni/feAxhvHm+YbLACWG+wD+Fv0m7C+7SjOG8RbD5vsm4ubnJu1m5Gb1vqneXVF3gA/m2JUCRu3m6g4yZudmySA6RuZG+RbzpvzG1RbjFiKm0Cb6HRUQH6bTFsBmyjaQZtEAE0bqFvqW+Gbmlv1m6SRkbB8dvJbwpsa+MMbGvijGyZbVICkWzcxoFuymzZbUFuem82bdkjxG1sbCFvI2sg4lZteW9WbBptGm3ubflsvQFv4gVuWmwd4IxtGW+EC4VtwgJFbHxv9kF8bYFt9m12b/0h2W7EbMCTT0E5buxsuW2lbbFuzm5xbrADcW8ubvFttayAAahtbm7ibqAD4myJb+5tw6JFwR5tAQBSbkaJUm1YbBVsOG4pbPEmjG5UAqltPmxlbL5tZW1hbOVu1RSXGcZvlYPEbMyZimwBbaRtgAMBbagDRW5RbdVs0qA1b6xsOW5UbzlsTmw0b7lu6mxtb6FtbW1pbT5W5MGX9C1v3G8VbxIqlWx2bEVuxW5VbJIDVWzFb11sUW7RbQJsVxESwLVtlm6lbkJvQkGhbGFvZW7yb41sFQPlbelvNm39boVslW0mbQNvlWyDb3ZuWW72b1luQ21Zb8Vsw20M4zVtqAClbwEAHG1ObWZvsW6eA85tcW4ubPFuom/1b65sta0JbwwB7m32geFugSJJb01unmzJb55sLW1ebPABtmy7Na1u0gEcbb1uo29tb6NvW6GNo9zFRGwlbv5v1MP+bJFtUW+ZbIFuk2zVb5NuSmzdbQ5t0W2v1Q2Dw28xbiNtamyhbU4Ao2x9b9ZuloGsApDALW+GW/mArWydbJtsG21VbmZtG26sbFVsKm2bb9hv0W5bbdNuPWyxbXtBM22BbLNtzm7SAC5utG5zbq5vc2zibIAB82wSb6NvoSSDJwtvkm2LbVJsS29jbl5viUDebANvIgPebUEBsm+tbrRsaW2+bn1vIeM95FQUa2wRbh1ue27rbp1vnW6wAl1u1W97blNtxm6HbJKj02/UbblseW/bbituO2x+bAoJrANnbTduxG4Rb2tvEW6ZbaZs0qF3bxttL21Db0Fvm24JIYdtqmxHbNtuTmx1bHFts291bHNu9W1zb0jAgAOibd4APgIYCadsjW7ub6NtjVhit9TASW+SbPuGhgAaAPeu/W3nawxvaRmFbrhsV24+b8tteG2PbEZu+W4TAA8buoL9bINoKlvjbLO4iyIvb4oAoAF4xF1uG2xDbPdtk21TbsRt9KEWwg9sHG8Pbr1vV295btdu+W4EiGSZQO9g7HwZEa/A7wNv9kEg7GiEoO77b69sB28Tb9VvB21g78Ru+cLg7YIrpW4Q7mVugOx+bdlHPxlDwcZtitX/goxvEawg7apvIO53bqDtXW+g7/tv7W9A7nDu72wzb3DvI2yA7PlsCO7xhprHkO/EblDvY/tQ7RNu0O9I7Ogjg23I7a9u92z+b2DvKO61bT1vR20eAsdtdW8A7idun28nb59tqG6nb6dtjW1nb4ltTW1YAM1tNVLJbM+gLW44bSls4RjrbctvugArbvDubW/w73jtTQWd5cID6W/Q4hlul2+2b4psQW/rbDDtg237baDsWOxg7ijv3W6CbKjtD23xAdts8O2GbfDuaO/E7BbABW4XbgxvBWw8bcFDHW23b8jsr28w7FNsFOz+bsNvJWyU7jNvqOzE771txO3ub6El5W7+GIjuNO/9bTxuA2xk7LDvL27I73dv5Owo73Ts029Z8JZu2O5Hb+9vTm51bR9vOO34bSdvDAGub65sCW9ubd9vCWztb5QWHmyLb/jt52x/boK2S28XbMtucQJE71gB7O20bVTvEOwI7LwY6sI3bSTua23PbrduSO61rHdumO7k75jsDm0Hb0NuTJFvbA9t9O4GbZTsvWyGbgztK23XbHoAQnT87OGiKOwC7sDtJGzQ7bTsLO6vbELusO1C7vpIwu4xbGzt721pAB9us2/Hb7NsuO6wAK5uHO/1bWJsnO8Nb2hvnO5nbyulb/oYb1zumG5qoFhuazhebAQDHcJEAPV1pOxUA5dt8QJXbQDsO28M7D9sOQBUoQrtBWzJw1puoOPL9QLtZOzI7jDu924HbxLsb20Cb1jtW221b0gTam4i7nlvIu+PbNTtaOLdoEzsqu0876rt4u0s77Ts5m26bNFv6u+w7MXA2OwjbqjsVmwM7lTuxO9U7IzvK6R0oujs4ayRSbwAOu0Y7+LvauwU7urum2yS73puGu+HbFLs+u2lbfrvvOwG7nztjW0uIgun1O7SAH6DXm7wDzJuzO507oLtMOy671FuQu+67QVuhgCAgRrt2O+m7NduYW6i71Ua5uzPb+btP7h+goxuRuxW7ZFsxuwo7cbvluwWbwP44ax8GXDu+u8MAsruBu5nbSrBlXaG7qrvhAj27g7vZO84AZjuLO0S78bvVu4m7HDv1u5s7hxtvO027aNtRmxmoc7t5u5abdrvhu9wAS7tzOz7bOTvlu8u7XTua20m7O9spu/Ub9jswmzS77oAJ2/s7rjtMu+475I5su6NbFzv6GyJZG468u+6AATsCu3JbZ7uLW1L0ylvGW//bUruAO1E7B7tEO827vluZpdwobttxG7dBzTsL24674oCau2W7Ors3u5Y7mttFO7u7lLv4O0i7/rtDO9O7x7vMWH0bMHu4248bOttAu327d7ske6W7t1vemz07cFDju2m7k7saO1m7wHuAHcT6EztFW3jb4rtjGwR7rrsk2/27eTsbu0O7mttNW2s7AnusW9s7h9u0u8fb9LsdG2fbzgBqG54DgHv321Gb6El9mDy75JvSW3Nb0Hvtu+6AoTvLWzi7zzsAO2pbFrtyu6Z7u1tBGIo7BltHWzabhNsVu0R7zrsPu8s75Hs02w9br7t4Owi7I9sVOxm7dHsiezO74XA/W8x7kztSe9M7BNslu9G7nHuxu6R7j7sw2yk7vTvhe2o7Qnuue/R7ehuMcOCtUDuSe6x7vnvpe067BLsdO/I7PHuFm6p7xTsFexWb1Ltx21+7dLs/uwy7fVvuO4r1t9vsu/zbKtu/eZNb4HuWAJB7MlvzWzB79nsqlo57q1vOe1XbtHsou07bCTu6W7Z7hZvee3h7CHs1e4R7Z1sWWwp74Ltye3q7mDt3W6F7LXveu6U7yFtmu6PbxXtxe1Gbgtv+W+WMFXu7kFM7LTvse1FbdXu9u3Fbijt8e5R7qbtI20V7S3uWuwLbU0HgO897IVtVe9t7Xtu1ewd767tHe5u7J3u8e6s753vW2/97Udvte047PVs9e/p74oDrm0Z7A3tAe/F7uTDq261rY3snm1vN4tv3OzB7Utsl26l7HD0vO9E7QPtue7tdggCu2zB77ttEW88brTvOAAF7n3tBe417/dvkuxd7EXtXe1F7jbtoe0e7tiu4W2tdmLs/m9i70ns7e/D7t7uru2C7cPuVu8d7fdsW27C7rXvtW5p7n7uWAN+7S5vY+247zgDrm/17Xjsg+5c7z9t+O6YbtzsF2+t7NPtPO/N7SHsue0z7JXsmm2Tt09t/O83bt0GAu7J7wLv7e5l7A7vZe8F7Idta+0L7qPuXe6a7YvuA+zF7y3sfm87bGLvfm/87Ldtze9D7Snsru+KAa7uEu0r7ZHth+2S7f3tvuxj7uztY+3p7JvvqG7zbZztDe/d7pDGje5Z7YovWe8E703tLW7N7CvuSuy8k0rsoe1O7d3sX3QYIpTnYe5t7f9uK+wH7yvtZ+6r7Ofvq+wj7hTtne4X7IvvR+wQ7bvs9+2UF31tPe0l7lXtbezM76fu5+1q7QfuKe9v7ofuNW3l7/HtwuxO7jPtx+8D7w3twMeV7a/sveyl7b3v++xx7Kvv3uyH7jXv2kUlbKPvGu+j7evsdewb7XXtG+2X7f7sGe9xTFvuX+yB7LaU2+xB7VntBO2DacZsze/B7m/u6AAz7qHsfO+h7CfuYezNBXnspOz57XPsau3t7o/ud2+P79XtLO6/7dS4xcGF7wvvwu6L7C/vn+8z7y/tpgEx763ssexv7Zdvc+xn7O/tP+1x7DXtsO+sbv3vJuxQHp/vIB5m7qAdjWw971xvg+007fvtRuzD7u/uHe5P7ynvU2+/7s/vcO8X72ntvOwc7KhvMu5ib5vtV+xnb93vEm6trFntSW5Sb1JuFy7AHxaZscEybsgQsmwt7MrvCe8IHAtummwXQC0ve+w07F7tD+1v7cgeZ+wQHz/vce9wH3psqm2ObJ/tIW/P7NHs0B+77FtCOB9tl87tPO2VbX3ug2xwHWXu+Bwm7hZsBB0oHrluRe9QHh7vK2/d7htgHWEq757shW5e7WgB+e0F7gXsv+34HKQejm2kHgntn+1kHLbt1llnQ0gS2u4UH7gesB/v7ZQdJB1u7lQcxcIEHOvsae8zbOzuqB6X7jLsaB+fbZvueOzoH2btvlf8Y1vtk++i0Z5vYNQtb0/YhWyxITySIa4gHNgdd+4rbkvuoVdeV8O7re/Rb0eNUO8P7vPvB0HgABwB8B5H7c/vlO+L71Zs7B5BV702wzQcHa/VHBwY7Jwd4B14HcIDnB1KA6ntf+wMHWnudezp73XuYWzj7rAAAAEpOQIJbkwcjOxxAA1WGB9NbDzgWG7tW+QeWADpe8RvhhmsH1gcu+4t7cfv3B0NoMnCp+rwzijvF+Elb4juGO/57KABpALUARHs3QU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f+J7JHgSeoJ6wAAACCeYfhJ19bPoC+O2T7dC4yW/81bttJ+ig1HUdc+1jHwicchyBFckCMCNh7MKghx2x7VUdfh7D7E/u2W7wnSjvLhy5Ht0dpJ7Yn/JgKg1Y6DAaKO4snaccsB64nJjs9hzwnyQcWJ9sn1id7J7QHFtClXQIDsvua26cnM4dUW24nF0cmJ9wnyickB74nAMelJ/snTycKg6IDHwYnJ3o7HyfGO/Q73yeKJ54nGvtWOzu7f8do+/cn3ftlJyCnccwT9gIIEKcxcGcnHD0XJzCnxHuJB2Yn3ie3J8inb7uaJ48nKPCgpyE2L0fvJ2n7rodfJ0SnwfudB6SnWyfkp/07i8dCBzMnzyfx9scnP5v0p237jKeXJ3OHrKfEh0inzSf/x5Sn4Qf9rGqEnAT2KAsnkKcMpwSn8iewpx4n/PubJwCn9cdAp1SnNf7yNrSn5kcMvmI7yqeGJyKnaydKJ/v7/ycSp+onUqdcp7F76Keyp1k2gRiKp7inUKckgEynVyd/J5qn1qd9x9KnS/vT8hID4KcCp0qnQqcqp8YncKcapzcn7KeSpyinB8e3ew6nd/VzJ0VBLqfGp6GnpqeEp56nlqfep567dydxp9MnD0dhGAsEPNApp0sn+HvsJ9sbZqcyB2r7GydRp1qn+8c6pzKneqf8XhTtdKchp/rHw/sep6KnJKfipzmnHKeFezYnuqeFp9ZmbgIlp3inuLvlp52n5qfwp1P7iKe9pzGnFKd2p/QnIzviYNZmR4Ojp26nzgCTp1Wn6yffe7OnkWi5pw2n/qeOp1mmGhDrpyanE6eVpwkHLKfdp3un/Cfap36nCadDp52mEseCp+2nHgdbp1ene/ueBzl7Hrv7p32nAgdop6GH2njylgVGOKepp2+nwqcZp12n1yfmJ9GnNqexp4enj6crp7ityftAm6+nyycXp1BnU6eRp7BndadWJ3mnYQdHp02nFG6Rloan6Gdlp7Inl6dj+6YnMGdsp3hn3seLp8Cnx6dISMmnraeup+enlGdYZ9unFqffpyon27tzp/BnC6cDp42nsycErqRnAkfem+RnOAfpp6qnzKdfpzWnuGc+p4CnD6dAZ3KnrYeee8Gn7Gdpp5hnsmeZp7xnVqcCZ76njGe6p6JnKGdnp9pnnGe6Z9BnXqe1p0pn96fGZyJnzye54Pynbydtpxhnlmfhp+qn84eKZ4ZnymcOZ0RnpmfUHi+nbmcUZxBbH6fUZ78nWae2Z75n9mfCZwFnTmcZEEGnrmdaZxBnYafuJzRnNmc+Z3+n86ecp3FnCaeBZyzAGmfJZ+Bn7mdhZ1RnXCfEp7RnPafZZ4JnuWcPJ45nhycOHqhnsRtSZwGS76flZz8nlWeZZ3Rndmf1p60nQ0fyR6hH4IdfIRqHvScW0MxYTEjEJ3c7psjzRxujcZu6R6Kz+scpJ9iHtgfYx/UHzFjnyK/Hjod7R7Un5adHR/kn2cfRcImHvccCJxkHXEcJxyt7l0E2xfjH2Sc7Z7knm8dfx4dn3oczx7Ant8dCx/1nyCfDRyqHYIfAB/uHNfvhcGZHpPv6hzNncSdzZwWbC2dmh1D7GwcrZ1sHa2dO29dnyV2A57yHd2fSex9H4ccHZ93HDwCNJ69n/6f1R65Hi6czJ5tniOchx8jnb0eo5yUH6OcnR1fHOcfY5+JHcCfvZxFHQwdRR0Ena5tqh1DHf2elexNbpJtk+7EnloDxJ+t7EOcrRwdHUycMx+OHCOeKMFEnhqfVJ1ZHUOcQJ1TnUCdHZ+dHSYdvZ7THZ2f0x9xH44dE5xLnDnCk59GH70cU55nHj2eY58HaL2d05yrnLSeM5wEnzOcdJ6qHgQB4JwlHfSdc51NnvOfaRwLniSeLZzQnMOf5R+yHOMfi507nL0fS5/tHsud1J0bnP0c3x7jnw4e7J43Hvlta5/7nUuc5J+TnF8fy5wUnpuc9R+bn/8cfZ0hHKCffZxh6o2cO5+TwSAqeNjVnuEcxJ5pHfOdg582bgufdu7eH5Ec4hxrnCfszaPKneOA3Zwa7Cef6xyJHnceh5w0nqeeXR/TnquecR+rnF2cN54Xn8v1ZJ63nKOft50nnvMc05z3nXwd95xbnQMeRRyDHNucQh+znE0fkvizozudl567nEmeoh+7nkOeLuzXneUd0J82HTz5xq1UnbeeMRw9nGOdh598nDIfz51R7audCJ6LnE9tUHqIDY+dYO5fnH4fX58nnT2eQgLTnaecR5wgnjjtL58CHLOf9W2qHAHvxRxy7x7u/UesAk2fRJ6YbLuf857vnVefJJ7lHVocn5zjHcBfHUB/nqidf55zHHcc8+/UnfMcAF73n6eexpyUnPsceRzgXCOe7R2TnocdEF2THXeekF7Pn9+cUF0X7ludtJ9bnKoc2QOgn65voJ/bnMBcEmO6mv6rc5/qHs1sf28k9budUtBg1nud3h3XnEvsPRxa5r5M6joan+if655BHnCedZ9enVWe3p5Yn10dUF/5n+WeiO5TgaxaSJ04nBic6Z55nGWdRZ1lnd6f1pypnyheiOynYXkYWFzFwzifB59YX6WeRZ/pn2ac1Z0ZneWczJy4X2h6OJx4XVhceZz4XXWd2Fz1nMWeOF8YXwRcg2iMmA17uFxwgERdlZ1xnn6eyBwpnsRcBF4CnmedyR9FHQ2eqh2vnY2dG0GJb0FMl50gX2+coF/Nn++dC51DnIuf15yIHfucejvQXeueJ53knv+fG58dnRSenZwPnz+fNFw4HP24oQG0XAecEFwgHcufT54rnZBdz5xwXjNsFF+0n32dDW9AX1fuc589HYHvA54RI5edbZ5Xn9Rf6R6kn0eev51tHoxfTR+MXE+cyJ0bH3Re358rnQBd/h/jnWBc8R7HnGxe75xZHDBeXF5Tn0xfPZ+HnOWdph4vnTOfL5znnPSf55z0b3keIF7NHNRcV5/YbaBedF9DnCherZz7nPEd+52CX8ecXFy4nIec3593nPxe1Z5QHrIeDF0Pn3jux5yiXrxevRx0X+sdo54bnmJesF9iXfidcFwNnRRdgx+KAEIe6AEIXaxfUR+pmk0Bb5yDnOxcUJ/sX6BdH55gXaSe2hxP17+e7F+Pn7xedRz/nXxf/52wXV0f953iXpSfCly8HCugjx7dnEpeEF1Pn8sfUl3fncpcL5/BHCoefZ4NnjJesANmHpRcgl5eCzRM4RxAHJCfDqhN8VJuBbBlHNYeogHWHKluHF02HBacth/soU4dCRxZnmTurJ9xn06fyB5MkoYB6x8UnT+eIZ0qXlpcSJz+b04ccZ7OH2GfeZ94n/Yehl/kXdJeGlwyXwSem+1AX0Mcb5yUOU2fzB5T7hEfre5lHluhX500XBJcjO2C+yXqgR2VHEyeH511HxifsF3cXN0eZBxWXmdtVly/udEc+l5PnDZc0l6mX/xdW54CXCkdqh6yXWod0B5GwZxebFxpH3Jc753UXDbQe58Lnbpdw5wn7rReTlySXgefpF58XWpcz532X9cdGF48XTtvPF2uXuuc1J5oXXRfSl1jnspcP5whnixc8F8OXBECjl9m7YYfuBlyX2xezl+DnfJfSe8tn8Jew54iXvlvPl0Tn7Renl+PH55fblzMXV5fzF7iXDUdHF0+XV2cnF0BXMufpx5qXkcfgV7uXfWdpl1nnX2fDl9mXHOfjl992r5dIh7UXH5fzlwfnaXvt+7XnCJcv5y0XJxfa5xfnaJdeF9zHVJc7lzqX15dR+9BXh8eHlyMXtFcIV0HnkxcYl9cXWJcsV5BXbXsYV4UX4Bfn2+DHwJfCF47nYl7gl+N7iMdUm8jHC1uox5426Mf8l+RXx+dClzjH/scvJ2oXJJfBx2OnBsfIV9TniucwJ2bnzZf7l1pXg8fS+wI6lKCgJ6WnGpegVyhXvFgnZ7FnVlcYe2In3Ulrx2AnkpdTF2BXLld9F25XMFc5W5rHtldil7EbBle7Z4xXAlfXx0JXzZeKlzjHtsd8R1T7hqeRV/dnflfOVz3HgVfxFweXAjs6V2FX3lcOV0hXTlcmVwFXTSc4lwBnHFcCO0lX+kMt5xFX78fpV/xXF5cauq5XOVfuV187JccmWHVX6xtpVyBXUpf+V1lX5VeBF+1XUwdiJzdwhVeGV2HHlJcxV9AnEFfxV9QX2Bc2V11XE1dRV1cXzVfRx0NXfme5V9m7K8e6V91X3pu9V4wXxlcK52VXOOe/F5VXy5fZu8fHe1crV41Xe2ckF7NXaFf4ZwlXT8dFhJbQ4Vc9Vw1XfVcZV6VXg1dnVxVXNQcjVzlbu1cFV/ZXk1dMF9W2D1emV3NX51dyh/qXSCeYV0aXmZe4+79n6+dZBe1d4hfHmwWXZ4dFl7vnJZfXhxBHGleCl8FXKtsjXnLgbUe1l9XnvZdxV7DXkeetl0vHw+f1Xq8n+fvdl1fnuAfMR5tX2qe3l0OXxRcQh1JXbJdrrlI+lRfWl9Nnb5dEV3sXJFcNF+EC35cUV7+XVFdYR2v1FtZ4F4m7ExdvAFNXnedMV6hXNNcA13TX52cM1947IpdxXvtXPieq13A7x1cp509XDOcDl9wXPNfGl6qHlfto18RVOrDYC0Dn05di11CXVgAwl+SXiHs/l97n8tcP260XLtcnl4hXZFf9V5lXl5eW1/KX7FeXVyFXXFeRsEHX22fql3xX91csF8xXtxe018AXMkf0l+JXo0fNAI+XlZdP7ktFBFezZx9X7oBe12WXS5d/l8cX+FBnRaqX4pdkl2zXTVcDVxHX2tdhlwMXL1di54XXQ1il1y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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>