mirror of
https://github.com/Alex-2-Graf/Leningrad2-DivMMC.git
synced 2026-04-16 04:24:22 +03:00
4720 lines
332 KiB
HTML
4720 lines
332 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Interactive BOM for KiCAD</title>
|
|
<style type="text/css">
|
|
:root {
|
|
--pcb-edge-color: black;
|
|
--pad-color: #878787;
|
|
--pad-hole-color: #CCCCCC;
|
|
--pad-color-highlight: #D04040;
|
|
--pad-color-highlight-both: #D0D040;
|
|
--pad-color-highlight-marked: #44a344;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #ffb629;
|
|
--pin1-outline-color-highlight-both: #fcbb39;
|
|
--pin1-outline-color-highlight-marked: #fdbe41;
|
|
--silkscreen-edge-color: #aa4;
|
|
--silkscreen-polygon-color: #4aa;
|
|
--silkscreen-text-color: #4aa;
|
|
--fabrication-edge-color: #907651;
|
|
--fabrication-polygon-color: #907651;
|
|
--fabrication-text-color: #a27c24;
|
|
--track-color: #def5f1;
|
|
--track-color-highlight: #D04040;
|
|
--zone-color: #def5f1;
|
|
--zone-color-highlight: #d0404080;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
margin: 0px;
|
|
height: 100%;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark.topmostdiv {
|
|
--pcb-edge-color: #eee;
|
|
--pad-color: #808080;
|
|
--pin1-outline-color: #ffa800;
|
|
--pin1-outline-color-highlight: #ccff00;
|
|
--track-color: #42524f;
|
|
--zone-color: #42524f;
|
|
background-color: #252c30;
|
|
color: #eee;
|
|
}
|
|
|
|
button {
|
|
background-color: #eee;
|
|
border: 1px solid #888;
|
|
color: black;
|
|
height: 44px;
|
|
width: 44px;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
display: inline-block;
|
|
font-size: 14px;
|
|
font-weight: bolder;
|
|
}
|
|
|
|
.dark button {
|
|
/* This will be inverted */
|
|
background-color: #c3b7b5;
|
|
}
|
|
|
|
button.depressed {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark button.depressed {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
button:focus {
|
|
outline: 0;
|
|
}
|
|
|
|
button#tb-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#lr-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#bom-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-grouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-ungrouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-netlist-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#copy {
|
|
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
|
|
background-position: 6px 6px;
|
|
background-repeat: no-repeat;
|
|
background-size: 26px 26px;
|
|
border-radius: 6px;
|
|
height: 40px;
|
|
width: 40px;
|
|
margin: 10px 5px;
|
|
}
|
|
|
|
button#copy:active {
|
|
box-shadow: inset 0px 0px 5px #6c6c6c;
|
|
}
|
|
|
|
textarea.clipboard-temp {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 2em;
|
|
height: 2em;
|
|
padding: 0;
|
|
border: None;
|
|
outline: None;
|
|
box-shadow: None;
|
|
background: transparent;
|
|
}
|
|
|
|
.left-most-button {
|
|
border-right: 0;
|
|
border-top-left-radius: 6px;
|
|
border-bottom-left-radius: 6px;
|
|
}
|
|
|
|
.middle-button {
|
|
border-right: 0;
|
|
}
|
|
|
|
.right-most-button {
|
|
border-top-right-radius: 6px;
|
|
border-bottom-right-radius: 6px;
|
|
}
|
|
|
|
.button-container {
|
|
font-size: 0;
|
|
margin: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.dark .button-container {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.button-container button {
|
|
background-size: 32px 32px;
|
|
background-position: 5px 5px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
@media print {
|
|
.hideonprint {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
canvas {
|
|
cursor: crosshair;
|
|
}
|
|
|
|
canvas:active {
|
|
cursor: grabbing;
|
|
}
|
|
|
|
.fileinfo {
|
|
width: 100%;
|
|
max-width: 1000px;
|
|
border: none;
|
|
padding: 3px;
|
|
}
|
|
|
|
.fileinfo .title {
|
|
font-size: 20pt;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.fileinfo td {
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
max-width: 1px;
|
|
width: 50%;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.bom {
|
|
border-collapse: collapse;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 10pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
margin-top: 1px;
|
|
position: relative;
|
|
}
|
|
|
|
.bom th,
|
|
.bom td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
.dark .bom th,
|
|
.dark .bom td {
|
|
border: 1px solid #777;
|
|
}
|
|
|
|
.bom th {
|
|
background-color: #CCCCCC;
|
|
background-clip: padding-box;
|
|
}
|
|
|
|
.dark .bom th {
|
|
background-color: #3b4749;
|
|
}
|
|
|
|
.bom tr.highlighted:nth-child(n) {
|
|
background-color: #cfc;
|
|
}
|
|
|
|
.dark .bom tr.highlighted:nth-child(n) {
|
|
background-color: #226022;
|
|
}
|
|
|
|
.bom tr:nth-child(even) {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.dark .bom tr:nth-child(even) {
|
|
background-color: #313b40;
|
|
}
|
|
|
|
.bom tr.checked {
|
|
color: #1cb53d;
|
|
}
|
|
|
|
.dark .bom tr.checked {
|
|
color: #2cce54;
|
|
}
|
|
|
|
.bom tr {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 30px;
|
|
}
|
|
|
|
.bom .value {
|
|
width: 15%;
|
|
}
|
|
|
|
.bom .quantity {
|
|
width: 65px;
|
|
}
|
|
|
|
.bom th .sortmark {
|
|
position: absolute;
|
|
right: 1px;
|
|
top: 1px;
|
|
margin-top: -5px;
|
|
border-width: 5px;
|
|
border-style: solid;
|
|
border-color: transparent transparent #221 transparent;
|
|
transform-origin: 50% 85%;
|
|
transition: opacity 0.2s, transform 0.4s;
|
|
}
|
|
|
|
.dark .bom th .sortmark {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.bom th .sortmark.none {
|
|
opacity: 0;
|
|
}
|
|
|
|
.bom th .sortmark.desc {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.bom th:hover .sortmark.none {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.bom .bom-checkbox {
|
|
width: 30px;
|
|
position: relative;
|
|
user-select: none;
|
|
-moz-user-select: none;
|
|
}
|
|
|
|
.bom .bom-checkbox:before {
|
|
content: "";
|
|
position: absolute;
|
|
border-width: 15px;
|
|
border-style: solid;
|
|
border-color: #51829f transparent transparent transparent;
|
|
visibility: hidden;
|
|
top: -15px;
|
|
}
|
|
|
|
.bom .bom-checkbox:after {
|
|
content: "Double click to set/unset all";
|
|
position: absolute;
|
|
color: white;
|
|
top: -35px;
|
|
left: -26px;
|
|
background: #51829f;
|
|
padding: 5px 15px;
|
|
border-radius: 8px;
|
|
white-space: nowrap;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.bom .bom-checkbox:hover:before,
|
|
.bom .bom-checkbox:hover:after {
|
|
visibility: visible;
|
|
transition: visibility 0.2s linear 1s;
|
|
}
|
|
|
|
.split {
|
|
-webkit-box-sizing: border-box;
|
|
-moz-box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
background-color: inherit;
|
|
}
|
|
|
|
.split.split-horizontal,
|
|
.gutter.gutter-horizontal {
|
|
height: 100%;
|
|
float: left;
|
|
}
|
|
|
|
.gutter {
|
|
background-color: #ddd;
|
|
background-repeat: no-repeat;
|
|
background-position: 50%;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
.dark .gutter {
|
|
background-color: #777;
|
|
}
|
|
|
|
.gutter.gutter-horizontal {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
|
|
cursor: ew-resize;
|
|
width: 5px;
|
|
}
|
|
|
|
.gutter.gutter-vertical {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
|
|
cursor: ns-resize;
|
|
height: 5px;
|
|
}
|
|
|
|
.searchbox {
|
|
float: left;
|
|
height: 40px;
|
|
margin: 10px 5px;
|
|
padding: 12px 32px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 18px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 6px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
|
|
background-position: 10px 10px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.dark .searchbox {
|
|
background-color: #111;
|
|
color: #eee;
|
|
}
|
|
|
|
.searchbox::placeholder {
|
|
color: #ccc;
|
|
}
|
|
|
|
.dark .searchbox::placeholder {
|
|
color: #666;
|
|
}
|
|
|
|
.filter {
|
|
width: calc(60% - 64px);
|
|
}
|
|
|
|
.reflookup {
|
|
width: calc(40% - 10px);
|
|
}
|
|
|
|
input[type=text]:focus {
|
|
background-color: white;
|
|
border: 1px solid #333;
|
|
}
|
|
|
|
.dark input[type=text]:focus {
|
|
background-color: #333;
|
|
border: 1px solid #ccc;
|
|
}
|
|
|
|
mark.highlight {
|
|
background-color: #5050ff;
|
|
color: #fff;
|
|
padding: 2px;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.dark mark.highlight {
|
|
background-color: #76a6da;
|
|
color: #111;
|
|
}
|
|
|
|
.menubtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.statsbtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.iobtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.visbtn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
padding: 15px;
|
|
}
|
|
|
|
#vismenu-content {
|
|
left: 0px;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark .statsbtn,
|
|
.dark .savebtn,
|
|
.dark .menubtn,
|
|
.dark .iobtn,
|
|
.dark .visbtn {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.flexbox {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
}
|
|
|
|
.savebtn {
|
|
background-color: #d6d6d6;
|
|
width: auto;
|
|
height: 30px;
|
|
flex-grow: 1;
|
|
margin: 5px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.savebtn:active {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark .savebtn:active {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
.stats {
|
|
border-collapse: collapse;
|
|
font-size: 12pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
min-width: 450px;
|
|
}
|
|
|
|
.dark .stats td {
|
|
border: 1px solid #bbb;
|
|
}
|
|
|
|
.stats td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
#checkbox-stats div {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
#checkbox-stats .bar {
|
|
background-color: rgba(28, 251, 0, 0.6);
|
|
}
|
|
|
|
.menu {
|
|
position: relative;
|
|
display: inline-block;
|
|
margin: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.menu-content {
|
|
font-size: 12pt !important;
|
|
text-align: left !important;
|
|
font-weight: normal !important;
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
right: 0;
|
|
min-width: 300px;
|
|
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
|
z-index: 100;
|
|
padding: 8px;
|
|
}
|
|
|
|
.dark .menu-content {
|
|
background-color: #111;
|
|
}
|
|
|
|
.menu:hover .menu-content {
|
|
display: block;
|
|
}
|
|
|
|
.menu:hover .menubtn,
|
|
.menu:hover .iobtn,
|
|
.menu:hover .statsbtn {
|
|
background-color: #eee;
|
|
}
|
|
|
|
.menu-label {
|
|
display: inline-block;
|
|
padding: 8px;
|
|
border: 1px solid #ccc;
|
|
border-top: 0;
|
|
width: calc(100% - 18px);
|
|
}
|
|
|
|
.menu-label-top {
|
|
border-top: 1px solid #ccc;
|
|
}
|
|
|
|
.menu-textbox {
|
|
float: left;
|
|
height: 24px;
|
|
margin: 10px 5px;
|
|
padding: 5px 5px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 14px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 4px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
width: calc(100% - 10px);
|
|
}
|
|
|
|
.menu-textbox.invalid,
|
|
.dark .menu-textbox.invalid {
|
|
color: red;
|
|
}
|
|
|
|
.dark .menu-textbox {
|
|
background-color: #222;
|
|
color: #eee;
|
|
}
|
|
|
|
.radio-container {
|
|
margin: 4px;
|
|
}
|
|
|
|
.topmostdiv {
|
|
display: flex;
|
|
flex-direction: column;
|
|
width: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
min-height: 100%;
|
|
}
|
|
|
|
#top {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: flex-end;
|
|
align-items: center;
|
|
}
|
|
|
|
#topdivider {
|
|
border-bottom: 2px solid black;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.dark #topdivider {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#topdivider>div {
|
|
position: relative;
|
|
}
|
|
|
|
#toptoggle {
|
|
cursor: pointer;
|
|
user-select: none;
|
|
position: absolute;
|
|
padding: 0.1rem 0.3rem;
|
|
top: -0.4rem;
|
|
left: -1rem;
|
|
font-size: 1.4rem;
|
|
line-height: 60%;
|
|
border: 1px solid black;
|
|
border-radius: 1rem;
|
|
background-color: #fff;
|
|
z-index: 100;
|
|
}
|
|
|
|
.flipped {
|
|
transform: rotate(0.5turn);
|
|
}
|
|
|
|
.dark #toptoggle {
|
|
border: 1px solid #fff;
|
|
background-color: #222;
|
|
}
|
|
|
|
#fileinfodiv {
|
|
flex: 20rem 1 0;
|
|
overflow: auto;
|
|
}
|
|
|
|
#bomcontrols {
|
|
display: flex;
|
|
flex-direction: row-reverse;
|
|
}
|
|
|
|
#bomcontrols>* {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
#dbg {
|
|
display: block;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #aaa;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #666;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #555;
|
|
}
|
|
|
|
.slider {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
margin: 3px 0;
|
|
padding: 0;
|
|
outline: none;
|
|
opacity: 0.7;
|
|
-webkit-transition: .2s;
|
|
transition: opacity .2s;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider:hover {
|
|
opacity: 1;
|
|
}
|
|
|
|
.slider:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-runnable-track {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
border: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin-top: -4px;
|
|
}
|
|
|
|
.dark .slider::-webkit-slider-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-moz-range-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.slider::-moz-range-track {
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.dark .slider::-moz-range-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-ms-track {
|
|
width: 100%;
|
|
height: 8px;
|
|
border-width: 3px 0;
|
|
background: transparent;
|
|
border-color: transparent;
|
|
color: transparent;
|
|
transition: opacity .2s;
|
|
}
|
|
|
|
.slider::-ms-fill-lower {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-fill-upper {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
|
|
.shameless-plug {
|
|
font-size: 0.8em;
|
|
text-align: center;
|
|
display: block;
|
|
}
|
|
|
|
a {
|
|
color: #0278a4;
|
|
}
|
|
|
|
.dark a {
|
|
color: #00b9fd;
|
|
}
|
|
|
|
#frontcanvas,
|
|
#backcanvas {
|
|
touch-action: none;
|
|
}
|
|
|
|
.placeholder {
|
|
border: 1px dashed #9f9fda !important;
|
|
background-color: #edf2f7 !important;
|
|
}
|
|
|
|
.dragging {
|
|
z-index: 999;
|
|
}
|
|
|
|
.dark .dragging>table>tbody>tr {
|
|
background-color: #252c30;
|
|
}
|
|
|
|
.dark .placeholder {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.column-spacer {
|
|
top: 0;
|
|
left: 0;
|
|
width: calc(100% - 4px);
|
|
position: absolute;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle {
|
|
top: 0;
|
|
right: 0;
|
|
width: 4px;
|
|
position: absolute;
|
|
cursor: col-resize;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle:hover {
|
|
background-color: #4f99bd;
|
|
}
|
|
|
|
.help-link {
|
|
border: 1px solid #0278a4;
|
|
padding-inline: 0.3rem;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.dark .help-link {
|
|
border: 1px solid #00b9fd;
|
|
}
|
|
|
|
.bom-color {
|
|
width: 20%;
|
|
}
|
|
|
|
.color-column input {
|
|
width: 1.6rem;
|
|
height: 1rem;
|
|
border: 1px solid black;
|
|
cursor: pointer;
|
|
padding: 0;
|
|
}
|
|
|
|
/* removes default styling from input color element */
|
|
::-webkit-color-swatch {
|
|
border: none;
|
|
}
|
|
|
|
::-webkit-color-swatch-wrapper {
|
|
padding: 0;
|
|
}
|
|
|
|
::-moz-color-swatch,
|
|
::-moz-focus-inner {
|
|
border: none;
|
|
}
|
|
|
|
::-moz-focus-inner {
|
|
padding: 0;
|
|
}
|
|
/* #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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Kq8qWm8Bn5v2XzhZb5oPnwQBPETXAm+XEFL2VVlsb54ams5ftlFvnJ+fjljea2+SQF2YAXZY75V2XmwDdlrvmnyril6OVpBaX5zqXS5RLlz/nveDjlq/nMuJqFBOUoJZH5O/naaKYgsfn6EmdlYICv3kn5euX45dC41DGa5SWFgOWBBdn5auXpqGTlBflK5aTl+fk3FhbmJOXC5fgFguXy5Znw8AWS8hHhLAXQBT7lQOU/sj9lPFCaKLf5zcjqMJ9MpuV1+Uv5hfmW5ZX5d/mh+W54UqVP+TTlkqp/ZTQFDOWcsBuFGeVnZdzlcAWMBcl49uYc5QQFY0Vu5ZwF8vml5Rjl6AVSiKuAY0V6WkgFweV55VAFJVBHQGNl4DJv6n6IE4jTZagyHeV2iIoFfZKDxZwyHrQCBd3lEjLD5aIF8JkPJfREu2UCLOoFaZpE5VnQkoXMiJr5NpRghZdlZIXQhdz5cKVL5VA4SKXqBf+ainQN+W4FelrfZbil3gWVZeqU5KUshcDl7/AaETT5vFRn5SiF0OUcJB9lOwVs+cj5H/nEhVvl3dRf5ZjlouUHBaWwIvnrBcPgGuXW8FL5OgWfBSX59uXACBPkDQXm5SEFEFC8hTP5K+V1BT/ZzOWc5YvlQTTZ5SzlmBU2IAdlvOWr5boFAuX+BWvlIuUb5aQVpvAQ5csFcoVe+T9lv+Wm8FwFABW45arlofnFBaAVBeV1BWcFffnG5YQVntI2qfTlqoVzWXX5t+QkFfCWlfksFb9UlQVO5YwVEBW4EbQVZfnzBTLlP/mw5ZvlT/nE0bKF8ibl5bKlc+X4FUtOHEW9BSfl7uWiFS0FavAUBYQVXBX7+TwVBwUlBc7Y2/klhW/lx/AJ5Rf0qQWu+THliqwuFV7liOV3YPkFq/nKFRilbBVb+c7lVeD+5GuK3BX+5RAV2ZrN5QP59eBGpfnlVBU8hXTlfhWEFdos1AXv+avgO/iGJqAFiuUwFVFgiRWsBaH5MRVwFXYVCBViFXvwZhVt5anohoUj5WtlPapmhX3la7RfJR2qDoWd5WwQo+U9qs0V9RViBd8lroWNpDoVdbCUzIMFRBWoZbZlihXghYhlT0BKhTMFg2qQJTvlahAzUBiFjgVJhU4ILcGXBe3FielPpS4Ih3Dn5cdMP6UlhdflclxpZToFYkBK7nJcmxXmFdEF1JigZXEFDhW8nOvmttweFTBlXWXUFQiF4xV5BZMUrnY7pXcFARWYZVFmCnmyFX8F4mUIRYUV2tokZRk0iBXzheplYwW+kWQlJFp0ZW4Ft26mWr8VZeCihcRl38J3BTvlHGVUhUCF+mW8Zbfl2JUczMAV+JUiZaf59BWAld58PhUSqIgEzWXfFfJlWJUWFZCVqxVkhqFlrGXoldSFYVqglYQVyl7k+VSVCvwyQACV+GVAlVIVykppIJZlqhVJmmhljJU0FeWajmWjFeUILmVwhaSV8pVQCE/lQwi+ZckFRxVhBS0cvWVHFdcF0pXhZWKVVWVYlVKVDRB9ULCaBpVU0LEl5IWw+RaV/YCcFRcVmWXyoMiVAIk0+VCGXgXfKOGlJpWnJW/KjRq9iFUVc2XKAG0Vfmh+ld6wH4AD5Rg61oUIWKtl1yUNqh0Vc2VbZWGVnAo/JQIsi7A2eeiiXYGGeZB5DnKg+V44TXkgYmSFOZUieQMiPdDouOkwwPlJ4B5gX8A4eUmFN5QfZYiKIUB9cKPYuKU6efqUztjFIgP5f7AcBW2V5KXu+Ax5EvCNlc6lzISseWjyiIKw5dQgEXmB8pgmX8DdeUjyTUDd1MJ54CXxtPmVEnnwJSmi2ZUiOjPIUeTplYp5zxEULPF6sqVXsEGAjBwtYjv5zZVE+UAULdqkeYd52brvmgg4UEhkBaW6wlq3lT9iqCDnldmVpZWhRMeVJYUFleAlV4z5lUh5avKtGQMg05U0oj8mQwTLeWG6IgSF+WOVknlAFP5UO7DrlR1En5VUeWRkiiWvlaf51YppeaW67VqkeZwGyORIVUV59/HRuvWEofmPsMZlz+SSQWiExXlP8lXZuaXzlRBVfVqBgHx5InkhmBeVlYS4VdJE2YiRoFOE7FW0pPNJJQo9IBGBIZhwVRCEO5V5xDMIJ5XORGeVwjhvlXyk95UsVTJVqZVtGhJV+BjEpMRVRYq1ebxVFFWNecxVDCm1le+Vpbo+BSDlKZUFUEG6QwbJ0BUVZVg3eUAUzuDRlWn4VlXtxY0ViepPeVvUm0I1Fcokb3ngwmRBCZXLpTPlC8VlJRb5YBUcedUleOV1Jc0lf+WC+VhFd2XigNUlT2U8QGfFTgVM+b/518XrFbT5zqUjJbQI4RU5JeT5l+Ug5Z/F9+VBFTBFniW49MgFGKVwJQjlGAWERVxFUVUOgFEl4VUcRWVVPPS0BdmF74Ut9Al6xOWIRQJEUBXZFR2FMxEroiIVhyU5hWrwBBVLhekI6BVtVamF64UuWhr5+vldJZ6F+eUoFcFV/VVVJWFVDBX/5VhFsuUNQGEloKjxFVtVjvkV5c1V8SXB+Tn5ySXsFTTld5g/hcgVTVX0RaolAojDVQslWiUvCGdVr8XW5aH5GCXSFftVb1VdVRDlLEVERfgFx1VQJa4VFSCbVeIlVflf8RFA0iXD+eHlVVAdhWWFmXDe5Qsl+iVRFeAF/SVyUJ35LeWlJd0lcRXu+cFVSRWzVb9VoNUc+etVbhXRhSwlxeXHVQwl+eUZ+SjV5AVWFdmFQ/rq+WYVPVWdVSnlguVZVSnl/1WrJdHl3VX3VWblaRXg1c9VuNUdVWTl8NXpVUjVreXelcVqvYgRGJwo1RW2VWZiFyUvkJPlCRrPJVs4rRVuVd+YKtWK1Y5Vs8XN+FpFXwAU1ahldGXVJZ8VzCUmGGMVf2gTFVhFJ6VtJaTVsdrzFbqA8VVLFVcVE1WrTAH+pxV8JfTVOxWUYNklr8UHFT7VGSWn2iKVt4V/xZcVsHSAJeIlcxU+Jb9V1tUrJbVVW5xFZXEluwXC9CQl9ZAoJRul5QVC1cp5ZJVPhUFyIJXJFrolRyXVcAyVI1UwlcuaRtWTVVJYjGV0JQbVxdUxVRyVeNVVVZ/oXCVm1UFKgmW7JcIlxJVCJb9V2dWJ1Wz5PJWFVS1VtJUF1RdAoRUkWiMV11UelSyVSCWjnOyV+dXyJTMl+mUfiM1ln1U4lVlQYiUTJQJlZxW4RStVNmW2JTvVaHwOJTvVSpU1VcIl0RDtwB4l1YU+ZZBlT+TFnDT5NETpJQxFFJxxZaElcdXxivbVlVW3Zc6armUNVYpYQqHr1YPVv9UJ1d+Fo9WzEGVlhVWLJbtY1WV01WyW+Vh1ZbNV/nJDWgZlfSX+VXjaCdUxVbVsYXmRVV/VfXlYNdfVeNV1xqsIKxWzVajhw2VB1fTQ1NWpZf7VfmwD/p6Vr1Uz1ZLaNiCahedVIDUDZQNVADUtEGcVvdUSqDXK6SXd1dRmOoAWVVLVFyXaXLOObyXCNXOwoZVT5ZiqLGoq1SI1gZUa1U/+m2WSNd0Vc8V61RHwqKBU4gFVuCC2CiSgeNkGqH1aSaCFeM2aDPBkJbr0RjUo5VNa5dymcJhao9ipYi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07CCswq907cUE2Oi0VAzug4Zpr/TtgQ/W7NDqq6LkpNbs4q7M7U9uqGzPbZmvg87i81HK66xs7cwWy6xc7ZMAa6+DrjKuU66rrJzucMEgjmuvgu+OrY+p5phqrz2s9Yo87glS0671r2hnyq9Krn2vF6zu7l8vY6/FbTzu068xawLvIa1Vrt6uXO4u7e2twu/6NCpW3u6arU7vbCle7Y7scRR1o9WuR/U9AzWuGu6jlP+Uda8JrarsIRVFrYbvQuBrrp8TF2mGrWXVja1G76XrDu5Lr5Kt6FbN887tSu+lrMFGJq+y7mQXTu6bwg6tba1y7uHvESsVrerv/uy+7YrsyFR+7krtAe95812sbq2B777usuW+ASrtoezwkqrua+sB7iLyau52rcCO/u7WNydyuUL+7g6tw61C7FGv3axO7cWxC4HNrnKsMa3x7g1AN9Jywz7tha9xrRVPUe3BQs+vRu8h7RZ7vqzxrGnufu/G7Z2t5awBr+1VU6wyr0nu4s0R7NGs3u6R7h6sXu/wIkrtz4Ke7fpoNNd87E/Qce/u7RbuHuwB7RgZ5u5u7gutIa6u7TVD8a6er8Gvqmf9hxGvpu4DrvnsSa4qsnntJu+a7cWt+u2+7eoW8GztbZbt7W82JB1vJAOrcOX59ENIIOmvdDYPbzbsV6KPb6/6qaxPbd2hzO9dECzu9u3PbcAwDuwh71I3v1Vzg/cQ6mJMoLmDYewEYCuvte2A77Wvzu4BwWOtyEIFiF9vztXYFqNu32/R7qnt9a1p0qivxe8XrcbCP22drOOuf2xp76OswcCPAaHuECbA7J9vkpcZ7m9XrBY+7tsyde1Z7oxhiOxR7iDt3FeIg3HsqO1PVPXv/uS0chGgq4Cv1gSvLmid71Yy8YaQ76pUwe0Qk73uQIw/Ky9sl+Ku7zXvUO7Tr4Ov0O4d7IPvX0BrrZOvGOxD743tQ+1w75aA9ext7XDveiS57d0iIO/d7s/2ae6I7q7tE6t2a/3v3ayx7Cju5O3u7a4Bl1Qqrl3uBO9d7gOt/axo7DABCe9o7y7yie8VrDjuP2/T70Pv2HhJ7L4DLayY7zqUdaCt7NjvbewVi8VsOO2t7eCOE6/o7rPtNe8z7YmbA+9L7Lo25wGz71TtoaPYV+3vhEIcVfPvEG43MppUksylr9TvsO8x74vtBO1tbyXst2x07aXsd2y2JWp4oK8m98IHoKwCANvsl0dgrGCu7wrb72CteicDCtvsVewWIVXsaG327KzuIQzQrn1uidVl1DCsBJiyiBrDaK4srT/IWBUJ5zyvR+z51EkNJK+tyCEumcvTU9qQ2OC0rJmLCq+iiosj+K4hxWNsU6NKrWrhKK0ii4ISXyw0rgXhCcu/Y9St7KyOAZ9AVlVOKhitP8uL2DEtbK/H7rmUMONkrkK6QJbYrlqvh+0UrDRUe28H7Dqt9K7fowtvZ7HClVrjG5l5EkNBleVa4ilmluviF2is/K8Xa0BRzBTggUpJq2wSg6/uB+1ZEv5UcRaH7MNuz+whFWStWK1auaXW8K137MTY1+6Yr4NvX+70rnftn+xP7c5XlK7Tbe5VQVTUrZ4DP5PXEMtPvdaBAt4wD+5cr6Lr7+9oreAGygN/7c/t1qRHb7/sAqxMrWSKzlazTWq7j+5mlydssOPkr4NsghTYrbfuluisEoAcdkdeVmRUSQ2AH15WfiC/78FLQB3toH/twBzgHP/tiK6zUWNtrmAP7m/tEJDhMEftiK6Kje/uQLCf7udRH+5QHsAdR+6W6pAes0wIHYVaZ+47UvAdl+8MrHAfBdXU0JbvrceW7pus8qebryQCNmwFodbu2607rjbsu652bOnCtu9Qu/DIzO5PbKhve6+obFCtvW6ObDVtDu1l1O+ujuxL6S1ucGwc72HWlW9C7HBuh6wu7zdM7m7uyILsZoeu71rvT6+tb9fDvO0XrHat8LRAb9jDHuxu7qFtEGyOAtzvb693rr7tnq0/knFsuB/QbXLsDI8wboVtiu3YH1+sKqImaP43fuxsiPHsFqxPrgHtse2tbnyjbu3R7hmPEdAGrcHvWByvrsHvIzdctlgfEu4ZjhVutqwhFB+t3ux7U2EzOB0a7UQcsG2mrAru+Wz0IvHvfLZkHe1XZW1Fbcwieq9VTSag1q7SrHlsS9Eh7SVs3KFK+qHsgG5x73NWQG86rwrvd1DsHA6t7q+jdgVtRe0CtJwfie/VTwFsF/BZ7HgfTB101HrtJB7/836t+B/Ob15tTq0EHDQd4a+57keSkW867/gftB/OryGtdB0/5iQcrm8J7Wu37BzVbhnvZW78HenstW+Nr6ntJWxUHxGvZB6sHvE6xey+rmwdue8m76VtrByBrpntyW267NwdTm4Nbcqsie1hby1tJuwur85vIh1hrEeVyB3ArtZsVu0pr8RaqBz3buXti+joHOXvaB3brI9uB3voH4OTYWPyHj1skK9PbPutmB377C9vKOjlbf3t4NZgbbgdwO0ZbC5uQO2HV/ZilWwfbrgfza1t7uVXLKOfb6ho5az4HN9vomCVbAQdze9N7c1tfa2aHhevhB8KxY3vX6+7UI4C/2waH8Qebe0bUTeuDBwSVt4WcWx17gCUuhzvbYjvP6xBbK9s6gNBb6Idj1VpbaXEYOzucHVu0h8972+vYW8Xa33skhwRbX3unysvrLQdxh0qH7QeyOxRbDBug+/VbDge0+9VTgVtFh6xb3PtU+/frOqtk+2EHtqjo+7k7PyGf65mH/+tr8I9rTYevB/JbRPsdW28HfDsQG9pblPtolaVVfYctHPp8elvAh4FlAYelWyz7dBtjhzz7hBseh7OHlwcOhyIGAvu5VTaH9jv60m+bLYd4+2/mZlsjBxOaYDVlh+U7c9XDJX6H4pXj1XcHiTtAW/MHBTvaBaNbsoCZOzRbQ9T8aw+H/gcph7LaSJX4W5vrl4cFh24Hu9UaJZOH8VCzhQBHSDVSJVCHjcxANTKH5HDDzCaHb4f1O347xt1NtM+HLTuF+XeHNZrHqCUyH+ugQGE7nQcXh9BH5+tXB9U7UTupB0eHS9XKAAyHu1tMh4oHiCvKB3IkE2hqB027bnAK4PRHAEk2WAb9egcdrO3kHbtGB09b3bvihyOb1e2sYOxrFKu6CofUzGudOPmVR9hZq+kH6TofgBh797vWCqJHo7ughzRLfoUru3K14uTZ+ye7D/tG5D6rB7sWOB2M0mtcLUX7DYwnK1pHCkuVozEHdpgtK6XhCQfBewDcWaunO1E6jXRSR4c7bkuWq8i7+ZWq9E+rwkeii8lqqHXYu3OVoLQW5vi7J/s6R6B7KwdiJIDAtQdNBy9cg1l4a3UHIkdvQIh7tasOOtB0IUdGCpJHckc9BzJHDhZDB/Urvd5yRwR79kdyR2MHmkvuR52rYareR2UH5p1fDrR7EUclXO+FywcpR9PqLasbB1QkxDYhBzIVfkfia3sHIUuxpEG7/QedICsgtzBWu+NVQTrOR1a7/yOJR7JHJnt3iaIg5Eepe5RHghuW+8kA1vtKFO2bTvv2++tHlQx2++OqfZvm+mtH+0cih4ObYoemB/xHOMO7++dk8yWH+9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cYF1/n3edS57gXuQD4FyAAB2dH5/rnlh2mzWPn4Bfl51PnN+cwFxKED+eMF3Nn3OcsF8VnBWbsF+LnnBc4Fztn/+cD57iwx+deCmWtIhdUsBQXkBcKfVXnTBez53AXchcL57IX0eczZ2gXihcE52nnRFEZ573neBf753wXh+erAMfnhCc6F+fnehcQF+IX0BfGF7Xn9BfwF4/n5hdI5/HnqBdv5+gXthdb5/YXO+dqF04XABeaFwXndD3CF14XfWc+Fz/h1BcWF6wA0hdP5/4XtWor56wX7+dKF3YXG3HYF5nn6hcEF4kXbufC4x7nqReacPoXvhds51kX6WdBFzIXoRcoF4tnERc2Fxvnyhfb5z3nf+fxFxoXAhfVF5y9KRdgF94XYhcZFxIXeRdSF6YXlhe350vn+RfyF8tn3Ref570XMRf9F9wXpgC8F/wXbhcF56MXo+d1F2Xnk+dTF34XzRc5FyEXd+cIF1YXXRecs1EXWBfAruUXgxeVF8MXRojMvc6NpBcM5xPnV+dUF9MX5xdzF9cXCxfIF2YXnReFF5EXPRclFzVnTxc8F84XB2fPp4rn2mfnZ2rnBmc3Z4Znd2cgALrnexdu5wFnKh2Z+FbESGcm53Zng4oOZ1a5jlIM525nH0geZ4mZxGcqZ2RnoOd+ZxZncd0yHUcX3xeUF6znRhexZ/FniWeh5ylnEecqABcXiBfNFwUXChd3FxCX0RelF48XjhcwlwAXuedEAO1nRWqdZwJdVh3HSF8XDRcRZyuQjwCSF37EApe85zMXHRc3F2CXqxcgAJgXKhfQl9sXsJdy5/CXWmenZ6oXyJfXZ9NIIACGZ2bq92fcZ49nq6dzTXtN6+O4WMJn72eOZx9IJJfkJkc45JcPfZSXXCbUl5Ws2gAg5+OnvGcel2vji03QbaqX6RfMh00XgedclyHnYefK85HnAJfBF4KX7RcglwaXIpft58aXHBd9F1wXcRfSlwPnspfyl88k7pdkmXGX++OoiomXkxfJlxyXeZf359mXbRdXFzmXBZcrF6KXaxeQlyTnqhdZ5y4XCjpWlzRniJfbZ3aXGucOl5rnrryQZ66Xeudu5zZ4yerwwBunBJdmAKbnn2drmAjoDOc25yRnNGD258eIUZdg57Bny5eWzboXaRfNl78XZxepl8HnSWe8l9y9HnDtl4EX+ZdAl7QXYRegl4WXH+fFl+sXEpeFZmaXOxeU51WXNOewZwywkVCHF+MXl5cnF9fnN5ddlzqXb5fMF+EXhpd9lz+XA5eS50OXFRcjl1UXddL9cxBXlueiF9BX15cpl3BXHZe5F0KXyxcqnuCX/Zfil1CXUpfmlwkXrxfdzEeAHxcXl/UXSZdEV62XJFcvl/MXWpevl9YXKFcml6WXGFfPF1hXjFeLzC7aLFcsl2qXMFfEV4sXsxfcV4CXvFfzF/xXRZeCVxsXZZfDl7sXQ+fdzOe6kleQV2xXV5cJ/JqXepec56RXlxdyV/qXQudFF/cXppd0V4BXhBenlxJXYxf4VxMXhFdGV1FnJlfPl3GIDBdkV22XgJcqV9+Xald/lw4XAxcVly8XWJd10sxXzldkFwRXPxfuV2sASlfZF2ZXuZddl8KXvZeqVyWX6lfCV2FXolcRV1PScFDnl1JX7FfxVwhXJhcKV92XpVcv50hXX5fFFzRXg5cAVxaXDlfYl1TkhVf6V8cXcVeV58ZX/xflV52XFld8V7cXGVe/l7RXoVf0V0MXeVclUi0GlJCsV+1XbJedVx5X3VfeV60XvlepVxRX+v5UV6hXdVfoVw1XDFfjV9I6Bv2rl21XrJcGF6W9sFd9V15X9gA+V+ZXwJfKVwNXgVeZV8FXsReaV64X2ldmEu+LYc2fF17nR1eNF5xXZ1dJVz1Xy1e/VxVXAVe1Vw8X/5d2V41X2FfeUi0GeFcxV65XHVdQF7JX11d/V4tXr5eJV0DXt1cg17ZXI1f2V/Lnj+cIlzaXSJdkQOrnqwCAZwAAygAA6rjI85dmZ7tXrXAJ+tReeDLG5xuXNIifZ0G4RxcOEJtIhmqKa5GXdJfRl8fn5hLpAN6rO5de52AgAOeigNzXP1dI1y0XqNeeV/5X5Bfhqsqa1Feg1yFXWxc412JXOegBcDLgP5MuV4kAotdYtEc4EZeS1++X2pfJV7qX5FfVV31nCtfZHEFXw1eq1xDX6td01//NM6PS6KqXOX7eEBLXXVd+V9LXPFey1+jXhReHOumoNldCV9tXlZfRAHnnCpewZ7gTTtfFQC7Xn1fp6O7XgjGI18bXplf/V1dXydc3V/7XmIqB12KXytePV5hXcJdHZ9aXyuebFxdnjWf2l/YAmueUAKZnPGerpweB7z34l7ZnQ6joZ9uX7Nc2ILbnB5c/4Q7nx5cMl7BnddeinYdX0lccV57X9gBB59yXGZccs5/o51dkQJdXKVeA12lXlFdGlzbX9Vfg1zKXYddylyBXbudfGAXzQ4hNl25Xc1cJV77X8Fdo1/PXa1eL1/dXttfll6NX4VcvVzOGZK1FV4ZX+9eVV3QXKNc+1+bXn5fpV3dXQ1fL19jX9te01+xMBv0dijrXBld71wjXRteYlEfXvtcn12wXQddZVyHX19e8ZwUsyeqAN7DXUFfw14YXw9eA1xA3b9c9lwvXAlfn19/Xdtc7VzfXOyKm/cg3u9doNydXSdfgN6bXT9cflzg3p9d4N1/XW1cr12NXxDeIN/XXQDczV8dXtzh/F17XWDde11A31lc511jXhDesNwg30IgcNyg3wDcUNzw3p1dS1/w3K1cW17g3g1doVz/ncDe5V2w3IFCSN+Q3s1egNxg38jc0N8fXq1fQN8I3wdcsN/A37pc8+v3XnDdfV6cXVDdlVy/XileQN8Y3QjdK1yI3l9dq17TXjMi5+vSzNjeD1yVXaNcKN3PXLjfrV0vXzDc/10Q3MZe1LNo3cdfFV4/XgTeGN843SjcMNyo3m1dqN+Y3GjdRN+dENfMD13E3ejfzV3w3iTfYN1ZXoTf4N+E3ojcWN5HXCpnb1/fXIDfoNwU3XFeONxVXRjfJNyY3bjdmNxE3Ghdjlydnxddll1OXJNeol1TXLpc018Q3kvPIN0zXiQABl/ZnRJdkl17nFJc8sFSXONY0l95nTuf0ly7nvGdjN2s4OjfcN+QAGpcNN2RAo9fplw+XYCpPl8jXF1dLV2nXiFfv18o3n9eqN2UXGTc552vX1ZeQ1x6DbQ41N7k3D9fgins3B9cLV+c3MtfFN8DXMDcPVyXXT1ejl4XX45cE15OXRNcolzOXL/3U1zXXsGf/i61XU2zrl5M3evlbl9Pirdc6VnbnnddHl7zXJ5du50i30VfbN99X+jfHOGmX95fh54+XWZep17PXUteCN6U3TDfpN503BBfAV/nnbudnTECkMNckt3Y3YDcON383r9cCNyE3Z9dMt/c3LLeZN+DnwS4kF9NXtjcyV3y3ARdNN71X9LfCt4w3dzeSl+K3WldPZx9T3LexN5839Tc/N4U3tLdm10K3rTeuNxtXudcgt/nXz1dPZzSw0re1NzI3FFhyN+nXZzfT1xc3dLfOt37XNVdAtxfXoLcvN7RHV1E6t+QXeTf6t7Q3JtdGt6G3/VfIV6k3FrcaV1a3TVeGcLa3yLdSN1w3pLf7NwY34bctN9c3KTe3N2k3YrcVNxK3iLcfU1NX9re6NyG3CTcZt0k3WbdtN+a37je+tw7X3Lj3mMW3Hzd1N5Q38rfP1wK3TjcAtxjX3rcENx43v9fEN5y3nhfNtw63Vlz2Nwq3HbfNN5W39DfVt2E3zLf5t5q3q6c02BpsxLe6ty23sjdjt+23rrf/Nya3Vbdmt7O3ebd9t5E3i7fhoUO3fjfBt623ZLfUNxW3XbdRtzm3MbfZV1fXBbcctye3eldnt3q3F7dptx63QTfKt6a3jLdqt2DXGrfWt4u3zsB2t8O3pbcftwa3jTcTt0q3HrcMtyK3/7cq14e3XTfgtz03uQCxF/03E6da58WA1ddul4i32e2a2qMqPpeEl03X4mcyycLXped7l9D4COjf1Hi3PmdrN+YAT2f4dyMqJbc7N6O3RteHN5S3mZf8l0U3O7fTt3u3ZTdzt0h3rLdPNxvXN0hYHquzB4I8t3K3l7f8t1u3greKN7u3f7e5t+q387dAd6BX4nfKBAoLb7drt463G7fyV4q3ANc/t4p38HfKdwB3qnfxt93MNAJKmtkcUndD15+3V7cGd5c3Aucqt9G3tbdxt363V6hTcMoLLHept5B3mDc8dwp3fHdKd/e36jcLt6eXRNHWdz53vLcyd+O3cnedt7x3JTcmdyF3Dzdqdxy3KY7ed2B3rHeZF4a3jnfut1c3QXdJd253Ildhdxy3fa2ad4rXybeyt3Z3fnfpt7l3xreBd4l3qremd4h3dbe0169AY9ISmlF30nf2d7J32Rdut/V3wTe/t4V3HTfmdx53tQCquBl32ncjt9l3UHdxd5O3N7det6Y3sDcpdxZ3afhPep13mXe+dxG3U9d9d9u3DXeAt0t3wLext8V3qXdJy6n++7OSd6u303e8N7N3u3fyd4N3xndNd8l3gHerdxdT2yDldzZ3V3fgd+u3bbf6d9B3hnewdy53d7dFdzlXJXc9xYzA/ifMd5t30Xc9d7F3d3fxd/t33beHdz637ncO1+13gmpQ91N333e6d793Ybd1d9t3cte3t5jXI3dCd0+3PcVldwR3XXfVdwT33tcI9w93BXdPdyD3j7dg955o6XcXd1T3ATeH1wF39PeNd653JP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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) {
|
|
var name = node.firstChild.nodeValue ?? "";
|
|
text += (output == 'csv' ? `"${name}"` : name);
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
let val = '';
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
val += '✓';
|
|
}
|
|
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
|
|
val += node.firstChild.nodeValue;
|
|
} else {
|
|
val += node.nodeValue;
|
|
}
|
|
}
|
|
if (output == 'csv') {
|
|
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
|
|
if (isNumeric(val)) {
|
|
val = +val; // use number
|
|
} else {
|
|
val = `"${val}"`; // enclosed within double-quote
|
|
}
|
|
}
|
|
text += val;
|
|
if (cell != row.lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
|
|
if (output != 'clipboard') {
|
|
// To file: csv or txt
|
|
var blob = new Blob([text], {
|
|
type: `text/${output}`
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
|
|
} else {
|
|
// To clipboard
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
/* https://stackoverflow.com/a/175787 */
|
|
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function (s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
valueAltRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
if (config.fields.includes("Value")) {
|
|
var index = config.fields.indexOf("Value");
|
|
pcbdata.bom["parsedValues"] = {};
|
|
var allList = getBomListByLayer('FB').flat();
|
|
for (var id in pcbdata.bom.fields) {
|
|
var ref_key = allList.find(item => item[1] == Number(id)) || [];
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index], ref_key[0] || '');
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
return unit[0];
|
|
}
|
|
|
|
var resarr = /^([a-z]+)\d+$/i.exec(ref);
|
|
switch (Array.isArray(resarr) && resarr[1].toLowerCase()) {
|
|
case "c": return 'f';
|
|
case "l": return 'h';
|
|
case "r":
|
|
case "rv": return 'r';
|
|
}
|
|
return null;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
if (Array.isArray(match)) {
|
|
var unit = inferUnit(match[3], ref);
|
|
var val_i = parseFloat(match[1]);
|
|
if (!unit) return null;
|
|
if (match[2]) {
|
|
val_i = val_i * units.getMultiplier(match[2]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
|
|
match = units.valueAltRegex.exec(val);
|
|
if (Array.isArray(match) && (match[1] || match[4])) {
|
|
var unit = inferUnit(match[2], ref);
|
|
var val_i = parseFloat(match[1] + "." + match[4]);
|
|
if (!unit) return null;
|
|
if (match[3]) {
|
|
val_i = val_i * units.getMultiplier(match[3]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function (e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function resetSettings() {
|
|
if (!confirm(
|
|
`This will reset all checkbox states and other settings.\n\n` +
|
|
`Press OK if you want to continue.`)) {
|
|
return;
|
|
}
|
|
if (storage) {
|
|
var keys = [];
|
|
for (var i = 0; i < storage.length; i++) {
|
|
var key = storage.key(i);
|
|
if (key.startsWith(storagePrefix)) keys.push(key);
|
|
}
|
|
for (var key of keys) storage.removeItem(key);
|
|
}
|
|
location.reload();
|
|
}
|
|
|
|
function overwriteSettings(newSettings) {
|
|
initDone = false;
|
|
Object.assign(settings, newSettings);
|
|
writeStorage("bomlayout", settings.bomlayout);
|
|
writeStorage("bommode", settings.bommode);
|
|
writeStorage("canvaslayout", settings.canvaslayout);
|
|
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
|
|
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
|
|
for (var checkbox of settings.checkboxes) {
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
}
|
|
writeStorage("markWhenChecked", settings.markWhenChecked);
|
|
padsVisible(settings.renderPads);
|
|
document.getElementById("padsCheckbox").checked = settings.renderPads;
|
|
fabricationVisible(settings.renderFabrication);
|
|
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
|
|
silkscreenVisible(settings.renderSilkscreen);
|
|
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
|
|
referencesVisible(settings.renderReferences);
|
|
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
|
|
valuesVisible(settings.renderValues);
|
|
document.getElementById("valuesCheckbox").checked = settings.renderValues;
|
|
tracksVisible(settings.renderTracks);
|
|
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
|
|
zonesVisible(settings.renderZones);
|
|
document.getElementById("zonesCheckbox").checked = settings.renderZones;
|
|
dnpOutline(settings.renderDnpOutline);
|
|
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
|
|
setRedrawOnDrag(settings.redrawOnDrag);
|
|
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
|
|
setHighlightRowOnClick(settings.highlightRowOnClick);
|
|
document.getElementById("highlightRowOnClickCheckbox").checked = settings.highlightRowOnClick;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
setOffsetBackRotation(settings.offsetBackRotation);
|
|
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
function saveFile(filename, blob) {
|
|
var link = document.createElement("a");
|
|
var objurl = URL.createObjectURL(blob);
|
|
link.download = filename;
|
|
link.href = objurl;
|
|
link.click();
|
|
}
|
|
|
|
function dataURLtoBlob(dataurl) {
|
|
var arr = dataurl.split(','),
|
|
mime = arr[0].match(/:(.*?);/)[1],
|
|
bstr = atob(arr[1]),
|
|
n = bstr.length,
|
|
u8arr = new Uint8Array(n);
|
|
while (n--) {
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new Blob([u8arr], {
|
|
type: mime
|
|
});
|
|
}
|
|
|
|
var settings = {
|
|
canvaslayout: "FB",
|
|
bomlayout: "left-right",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: "none",
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
offsetBackRotation: false,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
netColors: {},
|
|
}
|
|
|
|
function initDefaults() {
|
|
settings.bomlayout = readStorage("bomlayout");
|
|
if (settings.bomlayout === null) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
settings.bommode = readStorage("bommode");
|
|
if (settings.bommode === null) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (settings.bommode == "netlist" && !pcbdata.nets) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
settings.canvaslayout = readStorage("canvaslayout");
|
|
if (settings.canvaslayout === null) {
|
|
settings.canvaslayout = config.layer_view;
|
|
}
|
|
var bomCheckboxes = readStorage("bomCheckboxes");
|
|
if (bomCheckboxes === null) {
|
|
bomCheckboxes = config.checkboxes;
|
|
}
|
|
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
|
|
document.getElementById("bomCheckboxes").value = bomCheckboxes;
|
|
|
|
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
|
|
if (highlightpin1 === "false") highlightpin1 = "none";
|
|
if (highlightpin1 === "true") highlightpin1 = "all";
|
|
setHighlightPin1(highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
|
|
|
|
settings.markWhenChecked = readStorage("markWhenChecked") || "";
|
|
populateMarkWhenCheckedOptions();
|
|
|
|
function initBooleanSetting(storageString, def, elementId, func) {
|
|
var b = readStorage(storageString);
|
|
if (b === null) {
|
|
b = def;
|
|
} else {
|
|
b = (b == "true");
|
|
}
|
|
document.getElementById(elementId).checked = b;
|
|
func(b);
|
|
}
|
|
|
|
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
|
|
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
|
|
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
|
|
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
|
|
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
|
|
if ("tracks" in pcbdata) {
|
|
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
|
|
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
|
|
} else {
|
|
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
|
|
tracksVisible(false);
|
|
zonesVisible(false);
|
|
}
|
|
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
|
|
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
|
|
initBooleanSetting("highlightRowOnClick", false, "highlightRowOnClickCheckbox", setHighlightRowOnClick);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
|
|
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
|
|
var hcols = JSON.parse(readStorage("hiddenColumns"));
|
|
if (hcols === null) {
|
|
hcols = [];
|
|
}
|
|
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
|
|
|
|
var cord = JSON.parse(readStorage("columnOrder"));
|
|
if (cord === null) {
|
|
cord = fields;
|
|
} else {
|
|
cord = cord.filter(e => fields.includes(e));
|
|
if (cord.length != fields.length)
|
|
cord = fields;
|
|
}
|
|
settings.columnOrder = cord;
|
|
|
|
settings.boardRotation = readStorage("boardRotation");
|
|
if (settings.boardRotation === null) {
|
|
settings.boardRotation = config.board_rotation * 5;
|
|
} else {
|
|
settings.boardRotation = parseInt(settings.boardRotation);
|
|
}
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
|
|
|
|
settings.netColors = JSON.parse(readStorage("netColors")) || {};
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function () {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function (eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function (eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for (callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawText(ctx, text, color) {
|
|
if ("ref" in text && !settings.renderReferences) return;
|
|
if ("val" in text && !settings.renderValues) return;
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.lineWidth = text.thickness;
|
|
if ("svgpath" in text) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
if ("polygons" in text) {
|
|
ctx.fill(getPolygonsPath(text));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (config.kicad_text_formatting) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
offsety += interline;
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
if ("svgpath" in edge) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
if (edge.type == "rect") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(edge.start[0], edge.end[1]);
|
|
ctx.lineTo(...edge.end);
|
|
ctx.lineTo(edge.end[0], edge.start[1]);
|
|
ctx.lineTo(...edge.start);
|
|
}
|
|
if (edge.type == "arc") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
deg2rad(edge.startangle),
|
|
deg2rad(edge.endangle));
|
|
}
|
|
if (edge.type == "circle") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
0, 2 * Math.PI);
|
|
ctx.closePath();
|
|
}
|
|
if (edge.type == "curve") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
|
|
}
|
|
if("filled" in edge && edge.filled)
|
|
ctx.fill();
|
|
else
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
|
|
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
|
|
var path = new Path2D();
|
|
var width = size[0];
|
|
var height = size[1];
|
|
var x = width * -0.5;
|
|
var y = height * -0.5;
|
|
var chamfOffset = Math.min(width, height) * chamfratio;
|
|
path.moveTo(x, 0);
|
|
if (chamfpos & 4) {
|
|
path.lineTo(x, y + height - chamfOffset);
|
|
path.lineTo(x + chamfOffset, y + height);
|
|
path.lineTo(0, y + height);
|
|
} else {
|
|
path.arcTo(x, y + height, x + width, y + height, radius);
|
|
}
|
|
if (chamfpos & 8) {
|
|
path.lineTo(x + width - chamfOffset, y + height);
|
|
path.lineTo(x + width, y + height - chamfOffset);
|
|
path.lineTo(x + width, 0);
|
|
} else {
|
|
path.arcTo(x + width, y + height, x + width, y, radius);
|
|
}
|
|
if (chamfpos & 2) {
|
|
path.lineTo(x + width, y + chamfOffset);
|
|
path.lineTo(x + width - chamfOffset, y);
|
|
path.lineTo(0, y);
|
|
} else {
|
|
path.arcTo(x + width, y, x, y, radius);
|
|
}
|
|
if (chamfpos & 1) {
|
|
path.lineTo(x + chamfOffset, y);
|
|
path.lineTo(x, y + chamfOffset);
|
|
path.lineTo(x, 0);
|
|
} else {
|
|
path.arcTo(x, y, x, y + height, radius);
|
|
}
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getOblongPath(size) {
|
|
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
|
|
}
|
|
|
|
function getPolygonsPath(shape) {
|
|
if (shape.path2d) {
|
|
return shape.path2d;
|
|
}
|
|
if ("svgpath" in shape) {
|
|
shape.path2d = new Path2D(shape.svgpath);
|
|
} else {
|
|
var path = new Path2D();
|
|
for (var polygon of shape.polygons) {
|
|
path.moveTo(...polygon[0]);
|
|
for (var i = 1; i < polygon.length; i++) {
|
|
path.lineTo(...polygon[i]);
|
|
}
|
|
path.closePath();
|
|
}
|
|
shape.path2d = path;
|
|
}
|
|
return shape.path2d;
|
|
}
|
|
|
|
function drawPolygonShape(ctx, scalefactor, shape, color) {
|
|
ctx.save();
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
if("filled" in shape && !shape.filled) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.stroke(getPolygonsPath(shape));
|
|
} else {
|
|
ctx.fillStyle = color;
|
|
ctx.fill(getPolygonsPath(shape));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, drawing, color);
|
|
} else {
|
|
drawText(ctx, drawing, color);
|
|
}
|
|
}
|
|
|
|
function getCirclePath(radius) {
|
|
var path = new Path2D();
|
|
path.arc(0, 0, radius, 0, 2 * Math.PI);
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getCachedPadPath(pad) {
|
|
if (!pad.path2d) {
|
|
// if path2d is not set, build one and cache it on pad object
|
|
if (pad.shape == "rect") {
|
|
pad.path2d = new Path2D();
|
|
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
|
|
} else if (pad.shape == "oval") {
|
|
pad.path2d = getOblongPath(pad.size);
|
|
} else if (pad.shape == "circle") {
|
|
pad.path2d = getCirclePath(pad.size[0] / 2);
|
|
} else if (pad.shape == "roundrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
|
|
} else if (pad.shape == "chamfrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
|
|
} else if (pad.shape == "custom") {
|
|
pad.path2d = getPolygonsPath(pad);
|
|
}
|
|
}
|
|
return pad.path2d;
|
|
}
|
|
|
|
function drawPad(ctx, pad, color, outline) {
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
if (pad.offset) {
|
|
ctx.translate(...pad.offset);
|
|
}
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
var path = getCachedPadPath(pad);
|
|
if (outline) {
|
|
ctx.stroke(path);
|
|
} else {
|
|
ctx.fill(path);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawPadHole(ctx, pad, padHoleColor) {
|
|
if (pad.type != "th") return;
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
ctx.fillStyle = padHoleColor;
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else if (pad.drillshape == "rect") {
|
|
ctx.fill(getChamferedRectPath(pad.drillsize, 0, 0, 0));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (footprint.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...footprint.bbox.pos);
|
|
ctx.rotate(deg2rad(-footprint.bbox.angle));
|
|
ctx.translate(...footprint.bbox.relpos);
|
|
ctx.fillStyle = colors.pad;
|
|
ctx.fillRect(0, 0, ...footprint.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = colors.pad;
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
ctx.strokeRect(0, 0, ...footprint.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of footprint.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
|
|
}
|
|
}
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, colors.pad, outline);
|
|
if (pad.pin1 &&
|
|
(settings.highlightpin1 == "all" ||
|
|
settings.highlightpin1 == "selected" && highlight)) {
|
|
drawPad(ctx, pad, colors.outline, true);
|
|
}
|
|
}
|
|
}
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, colors.padHole);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawDrawing(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawFootprints(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
|
|
var colors = {
|
|
pad: style.getPropertyValue('--pad-color'),
|
|
padHole: style.getPropertyValue('--pad-hole-color'),
|
|
outline: style.getPropertyValue('--pin1-outline-color'),
|
|
}
|
|
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var mod = pcbdata.footprints[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
var h = highlightedFootprints.includes(i);
|
|
var d = markedFootprints.has(i);
|
|
if (highlight) {
|
|
if(h && d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
|
|
} else if (h) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
} else if (d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
|
|
}
|
|
}
|
|
if( h || d || !highlight) {
|
|
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata.drawings[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, d, polygonColor);
|
|
} else {
|
|
drawText(ctx, d, textColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawTracks(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineCap = "round";
|
|
|
|
var hasHole = (track) => (
|
|
'drillsize' in track &&
|
|
track.start[0] == track.end[0] &&
|
|
track.start[1] == track.end[1]);
|
|
|
|
// First draw tracks and tented vias
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (!hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
if ('radius' in track) {
|
|
ctx.arc(
|
|
...track.center,
|
|
track.radius,
|
|
deg2rad(track.startangle),
|
|
deg2rad(track.endangle));
|
|
} else {
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
// Second pass to draw untented vias
|
|
var style = getComputedStyle(topmostdiv);
|
|
var holeColor = style.getPropertyValue('--pad-hole-color')
|
|
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
ctx.strokeStyle = holeColor;
|
|
ctx.lineWidth = track.drillsize;
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
|
|
if (zone.width > 0) {
|
|
ctx.lineWidth = zone.width;
|
|
ctx.stroke(zone.path2d);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clearCanvas(canvas, color = null) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
if (color) {
|
|
ctx.fillStyle = color;
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
} else {
|
|
if (!window.matchMedia("print").matches)
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
if (highlightedNet !== null) {
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
drawFootprints(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer === "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox, flip) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var flip = (layerdict.layer === "B");
|
|
var bbox = applyRotation(pcbdata.edges_bbox, flip);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function modulo(n, mod) {
|
|
return ((n % mod) + mod) % mod;
|
|
}
|
|
|
|
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
|
|
var dx = x - xc;
|
|
var dy = y - yc;
|
|
var r_sq = dx * dx + dy * dy;
|
|
var rmin = Math.max(0, radius - d);
|
|
var rmax = radius + d;
|
|
|
|
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
|
|
return false;
|
|
|
|
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
|
|
var dx1 = xc + radius * Math.cos(angle1) - x;
|
|
var dy1 = yc + radius * Math.sin(angle1) - y;
|
|
if (dx1 * dx1 + dy1 * dy1 <= d * d)
|
|
return true;
|
|
|
|
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
|
|
var dx2 = xc + radius * Math.cos(angle2) - x;
|
|
var dy2 = yc + radius * Math.sin(angle2) - y;
|
|
if (dx2 * dx2 + dy2 * dy2 <= d * d)
|
|
return true;
|
|
|
|
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
|
|
if (angle1 > angle2)
|
|
return (angle >= angle2 || angle <= angle1);
|
|
else
|
|
return (angle >= angle1 && angle <= angle2);
|
|
}
|
|
|
|
function pointWithinPad(x, y, pad) {
|
|
var v = [x - pad.pos[0], y - pad.pos[1]];
|
|
v = rotateVector(v, pad.angle);
|
|
if (pad.offset) {
|
|
v[0] -= pad.offset[0];
|
|
v[1] -= pad.offset[1];
|
|
}
|
|
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
|
|
}
|
|
|
|
function netHitScan(layer, x, y) {
|
|
// Check track segments
|
|
if (settings.renderTracks && pcbdata.tracks) {
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if ('radius' in track) {
|
|
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
} else {
|
|
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var footprint of pcbdata.footprints) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinFootprintBbox(x, y, bbox) {
|
|
var v = [x - bbox.pos[0], y - bbox.pos[1]];
|
|
v = rotateVector(v, bbox.angle);
|
|
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
|
|
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
|
|
}
|
|
|
|
function bboxHitScan(layer, x, y) {
|
|
var result = [];
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var footprint = pcbdata.footprints[i];
|
|
if (footprint.layer == layer) {
|
|
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0 && e.button != 1) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
layerdict.pointerStates[e.pointerId] = {
|
|
distanceTravelled: 0,
|
|
lastX: e.offsetX,
|
|
lastY: e.offsetY,
|
|
downTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
function handleMouseClick(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var x = e.offsetX;
|
|
var y = e.offsetY;
|
|
var t = layerdict.transform;
|
|
var flip = layerdict.layer === "B";
|
|
if (flip) {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
|
|
} else {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
|
|
}
|
|
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
|
|
var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var footprints = bboxHitScan(layerdict.layer, ...v);
|
|
if (footprints.length > 0) {
|
|
footprintsClicked(footprints);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handlePointerLeave(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function resetTransform(layerdict) {
|
|
layerdict.transform.panx = 0;
|
|
layerdict.transform.pany = 0;
|
|
layerdict.transform.zoom = 1;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function handlePointerUp(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (e.button == 2) {
|
|
// Reset pan and zoom on right click.
|
|
resetTransform(layerdict);
|
|
layerdict.anotherPointerTapped = false;
|
|
return;
|
|
}
|
|
|
|
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
|
|
var ptr = layerdict.pointerStates[e.pointerId];
|
|
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
|
|
|
|
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
if (layerdict.anotherPointerTapped) {
|
|
// This is the second pointer coming off of a two-finger tap
|
|
resetTransform(layerdict);
|
|
} else {
|
|
// This is just a regular tap
|
|
handleMouseClick(e, layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
} else {
|
|
// This is the first finger coming off of what could become a two-finger tap
|
|
layerdict.anotherPointerTapped = true;
|
|
}
|
|
} else {
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function handlePointerMove(e, layerdict) {
|
|
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var thisPtr = layerdict.pointerStates[e.pointerId];
|
|
|
|
var dx = e.offsetX - thisPtr.lastX;
|
|
var dy = e.offsetY - thisPtr.lastY;
|
|
|
|
// If this number is low on pointer up, we count the action as a click
|
|
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
|
|
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
// This is a simple drag
|
|
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
|
|
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
|
|
} else if (Object.keys(layerdict.pointerStates).length == 2) {
|
|
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
|
|
|
|
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
|
|
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
|
|
|
|
var scaleFactor = newDist / oldDist;
|
|
|
|
if (scaleFactor != NaN) {
|
|
layerdict.transform.zoom *= scaleFactor;
|
|
|
|
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
|
|
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
|
|
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
|
|
}
|
|
}
|
|
|
|
thisPtr.lastX = e.offsetX;
|
|
thisPtr.lastY = e.offsetY;
|
|
|
|
if (settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
}
|
|
|
|
function handleMouseWheel(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var t = layerdict.transform;
|
|
var wheeldelta = e.deltaY;
|
|
if (e.deltaMode == 1) {
|
|
// FF only, scroll by lines
|
|
wheeldelta *= 30;
|
|
} else if (e.deltaMode == 2) {
|
|
wheeldelta *= 300;
|
|
}
|
|
var m = Math.pow(1.1, -wheeldelta / 40);
|
|
// Limit amount of zoom per tick.
|
|
if (m > 2) {
|
|
m = 2;
|
|
} else if (m < 0.5) {
|
|
m = 0.5;
|
|
}
|
|
t.zoom *= m;
|
|
var zoomd = (1 - m) / t.zoom;
|
|
t.panx += devicePixelRatio * e.offsetX * zoomd;
|
|
t.pany += devicePixelRatio * e.offsetY * zoomd;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function addMouseHandlers(div, layerdict) {
|
|
div.addEventListener("pointerdown", function(e) {
|
|
handlePointerDown(e, layerdict);
|
|
});
|
|
div.addEventListener("pointermove", function(e) {
|
|
handlePointerMove(e, layerdict);
|
|
});
|
|
div.addEventListener("pointerup", function(e) {
|
|
handlePointerUp(e, layerdict);
|
|
});
|
|
var pointerleave = function(e) {
|
|
handlePointerLeave(e, layerdict);
|
|
}
|
|
div.addEventListener("pointercancel", pointerleave);
|
|
div.addEventListener("pointerleave", pointerleave);
|
|
div.addEventListener("pointerout", pointerleave);
|
|
|
|
div.onwheel = function(e) {
|
|
handleMouseWheel(e, layerdict);
|
|
}
|
|
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
|
|
element.addEventListener("contextmenu", function(e) {
|
|
e.preventDefault();
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function setRedrawOnDrag(value) {
|
|
settings.redrawOnDrag = value;
|
|
writeStorage("redrawOnDrag", value);
|
|
}
|
|
|
|
function setBoardRotation(value) {
|
|
settings.boardRotation = value * 5;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
resizeAll();
|
|
}
|
|
|
|
function setOffsetBackRotation(value) {
|
|
settings.offsetBackRotation = value;
|
|
writeStorage("offsetBackRotation", value);
|
|
resizeAll();
|
|
}
|
|
|
|
function initRender() {
|
|
allcanvas = {
|
|
front: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("F_bg"),
|
|
fab: document.getElementById("F_fab"),
|
|
silk: document.getElementById("F_slk"),
|
|
highlight: document.getElementById("F_hl"),
|
|
layer: "F",
|
|
},
|
|
back: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("B_bg"),
|
|
fab: document.getElementById("B_fab"),
|
|
silk: document.getElementById("B_slk"),
|
|
highlight: document.getElementById("B_hl"),
|
|
layer: "B",
|
|
}
|
|
};
|
|
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
|
|
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*
|
|
* Table reordering via Drag'n'Drop
|
|
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
|
|
*/
|
|
|
|
function setBomHandlers() {
|
|
|
|
const bom = document.getElementById('bomtable');
|
|
|
|
let dragName;
|
|
let placeHolderElements;
|
|
let draggingElement;
|
|
let forcePopulation;
|
|
let xOffset;
|
|
let yOffset;
|
|
let wasDragged;
|
|
|
|
const mouseUpHandler = function(e) {
|
|
// Delete dragging element
|
|
draggingElement.remove();
|
|
|
|
// Make BOM selectable again
|
|
bom.style.removeProperty("userSelect");
|
|
|
|
// Remove listeners
|
|
document.removeEventListener('mousemove', mouseMoveHandler);
|
|
document.removeEventListener('mouseup', mouseUpHandler);
|
|
|
|
if (wasDragged) {
|
|
// Redraw whole BOM
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
const mouseMoveHandler = function(e) {
|
|
// Notice the dragging
|
|
wasDragged = true;
|
|
|
|
// Make the dragged element visible
|
|
draggingElement.style.removeProperty("display");
|
|
|
|
// Set elements position to mouse position
|
|
draggingElement.style.left = `${e.screenX - xOffset}px`;
|
|
draggingElement.style.top = `${e.screenY - yOffset}px`;
|
|
|
|
// Forced redrawing of BOM table
|
|
if (forcePopulation) {
|
|
forcePopulation = false;
|
|
// Copy array
|
|
phe = Array.from(placeHolderElements);
|
|
// populate BOM table again
|
|
populateBomHeader(dragName, phe);
|
|
populateBomBody(dragName, phe);
|
|
}
|
|
|
|
// Set up array of hidden columns
|
|
var hiddenColumns = Array.from(settings.hiddenColumns);
|
|
// In the ungrouped mode, quantity don't exist
|
|
if (settings.bommode === "ungrouped")
|
|
hiddenColumns.push("Quantity");
|
|
// If no checkbox fields can be found, we consider them hidden
|
|
if (settings.checkboxes.length == 0)
|
|
hiddenColumns.push("checkboxes");
|
|
|
|
// Get table headers and group them into checkboxes, extrafields and normal headers
|
|
const bh = document.getElementById("bomhead");
|
|
headers = Array.from(bh.querySelectorAll("th"))
|
|
headers.shift() // numCol is not part of the columnOrder
|
|
headerGroups = []
|
|
lastCompoundClass = null;
|
|
for (i = 0; i < settings.columnOrder.length; i++) {
|
|
cElem = settings.columnOrder[i];
|
|
if (hiddenColumns.includes(cElem)) {
|
|
// Hidden columns appear as a dummy element
|
|
headerGroups.push([]);
|
|
continue;
|
|
}
|
|
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
|
|
if (elem.classList.contains("bom-checkbox")) {
|
|
if (lastCompoundClass === "bom-checkbox") {
|
|
cbGroup = headerGroups.pop();
|
|
cbGroup.push(elem);
|
|
headerGroups.push(cbGroup);
|
|
} else {
|
|
lastCompoundClass = "bom-checkbox";
|
|
headerGroups.push([elem])
|
|
}
|
|
} else {
|
|
headerGroups.push([elem])
|
|
}
|
|
}
|
|
|
|
// Copy settings.columnOrder
|
|
var columns = Array.from(settings.columnOrder)
|
|
|
|
// Set up array with indices of hidden columns
|
|
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
|
|
var dragIndex = columns.indexOf(dragName);
|
|
var swapIndex = dragIndex;
|
|
var swapDone = false;
|
|
|
|
// Check if the current dragged element is swapable with the left or right element
|
|
if (dragIndex > 0) {
|
|
// Get left headers boundingbox
|
|
swapIndex = dragIndex - 1;
|
|
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
|
|
swapIndex--;
|
|
if (!hiddenIndices.includes(swapIndex)) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
|
|
// Get right headers boundingbox
|
|
swapIndex = dragIndex + 1;
|
|
while (hiddenIndices.includes(swapIndex))
|
|
swapIndex++;
|
|
if (swapIndex < headerGroups.length) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Write back change to storage
|
|
if (swapDone) {
|
|
settings.columnOrder = columns
|
|
writeStorage("columnOrder", JSON.stringify(columns));
|
|
}
|
|
|
|
}
|
|
|
|
const mouseDownHandler = function(e) {
|
|
var target = e.target;
|
|
if (target.tagName.toLowerCase() != "td")
|
|
target = target.parentElement;
|
|
|
|
// Used to check if a dragging has ever happened
|
|
wasDragged = false;
|
|
|
|
// Create new element which will be displayed as the dragged column
|
|
draggingElement = document.createElement("div")
|
|
draggingElement.classList.add("dragging");
|
|
draggingElement.style.display = "none";
|
|
draggingElement.style.position = "absolute";
|
|
draggingElement.style.overflow = "hidden";
|
|
|
|
// Get bomhead and bombody elements
|
|
const bh = document.getElementById("bomhead");
|
|
const bb = document.getElementById("bombody");
|
|
|
|
// Get all compound headers for the current column
|
|
var compoundHeaders;
|
|
if (target.classList.contains("bom-checkbox")) {
|
|
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
|
|
} else {
|
|
compoundHeaders = [target];
|
|
}
|
|
|
|
// Create new table which will display the column
|
|
var newTable = document.createElement("table");
|
|
newTable.classList.add("bom");
|
|
newTable.style.background = "white";
|
|
draggingElement.append(newTable);
|
|
|
|
// Create new header element
|
|
var newHeader = document.createElement("thead");
|
|
newTable.append(newHeader);
|
|
|
|
// Set up array for storing all placeholder elements
|
|
placeHolderElements = [];
|
|
|
|
// Add all compound headers to the new thead element and placeholders
|
|
compoundHeaders.forEach(function(h) {
|
|
clone = cloneElementWithDimensions(h);
|
|
newHeader.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
|
|
// Create new body element
|
|
var newBody = document.createElement("tbody");
|
|
newTable.append(newBody);
|
|
|
|
// Get indices for compound headers
|
|
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
|
|
|
|
// For each row in the BOM body...
|
|
var rows = bb.querySelectorAll("tr");
|
|
rows.forEach(function(row) {
|
|
// ..get the cells for the compound column
|
|
const tds = row.querySelectorAll("td");
|
|
var copytds = idxs.map(i => tds[i]);
|
|
// Add them to the new element and the placeholders
|
|
var newRow = document.createElement("tr");
|
|
copytds.forEach(function(td) {
|
|
clone = cloneElementWithDimensions(td);
|
|
newRow.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
newBody.append(newRow);
|
|
});
|
|
|
|
// Compute width for compound header
|
|
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
|
|
draggingElement.style.width = `${width}px`;
|
|
|
|
// Insert the new dragging element and disable selection on BOM
|
|
bom.insertBefore(draggingElement, null);
|
|
bom.style.userSelect = "none";
|
|
|
|
// Determine the mouse position offset
|
|
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
|
|
yOffset = e.screenY - compoundHeaders[0].offsetTop;
|
|
|
|
// Get name for the column in settings.columnOrder
|
|
dragName = getColumnOrderName(target);
|
|
|
|
// Change text and class for placeholder elements
|
|
placeHolderElements = placeHolderElements.map(function(e) {
|
|
newElem = cloneElementWithDimensions(e);
|
|
newElem.textContent = "";
|
|
newElem.classList.add("placeholder");
|
|
return newElem;
|
|
});
|
|
|
|
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
|
|
forcePopulation = true;
|
|
|
|
// Add listeners for move and up on mouse
|
|
document.addEventListener('mousemove', mouseMoveHandler);
|
|
document.addEventListener('mouseup', mouseUpHandler);
|
|
}
|
|
|
|
// In netlist mode, there is nothing to reorder
|
|
if (settings.bommode === "netlist")
|
|
return;
|
|
|
|
// Add mouseDownHandler to every column except the numCol
|
|
bom.querySelectorAll("th")
|
|
.forEach(function(head) {
|
|
if (!head.classList.contains("numCol")) {
|
|
head.onmousedown = mouseDownHandler;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function getBoundingClientRectFromMultiple(elements) {
|
|
var elems = Array.from(elements);
|
|
|
|
if (elems.length == 0)
|
|
return null;
|
|
|
|
var box = elems.shift()
|
|
.getBoundingClientRect();
|
|
|
|
elems.forEach(function(elem) {
|
|
var elembox = elem.getBoundingClientRect();
|
|
box.left = Math.min(elembox.left, box.left);
|
|
box.top = Math.min(elembox.top, box.top);
|
|
box.width += elembox.width;
|
|
box.height = Math.max(elembox.height, box.height);
|
|
});
|
|
|
|
return box;
|
|
}
|
|
|
|
function cloneElementWithDimensions(elem) {
|
|
var newElem = elem.cloneNode(true);
|
|
newElem.style.height = window.getComputedStyle(elem).height;
|
|
newElem.style.width = window.getComputedStyle(elem).width;
|
|
return newElem;
|
|
}
|
|
|
|
function getBomTableHeaderIndex(elem) {
|
|
const bh = document.getElementById('bomhead');
|
|
const ths = Array.from(bh.querySelectorAll("th"));
|
|
return ths.indexOf(elem);
|
|
}
|
|
|
|
function getColumnOrderName(elem) {
|
|
var cname = elem.getAttribute("col_name");
|
|
if (cname === "bom-checkbox")
|
|
return "checkboxes";
|
|
else
|
|
return cname;
|
|
}
|
|
|
|
function resizableGrid(tablehead) {
|
|
var cols = tablehead.firstElementChild.children;
|
|
var rowWidth = tablehead.offsetWidth;
|
|
|
|
for (var i = 1; i < cols.length; i++) {
|
|
if (cols[i].classList.contains("bom-checkbox"))
|
|
continue;
|
|
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
|
|
}
|
|
|
|
for (var i = 1; i < cols.length - 1; i++) {
|
|
var div = document.createElement('div');
|
|
div.className = "column-width-handle";
|
|
cols[i].appendChild(div);
|
|
setListeners(div);
|
|
}
|
|
|
|
function setListeners(div) {
|
|
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
|
|
|
|
div.addEventListener('mousedown', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
curCol = e.target.parentElement;
|
|
nxtCol = curCol.nextElementSibling;
|
|
startX = e.pageX;
|
|
|
|
var padding = paddingDiff(curCol);
|
|
|
|
rowWidth = curCol.parentElement.offsetWidth;
|
|
curColWidth = curCol.clientWidth - padding;
|
|
nxtColWidth = nxtCol.clientWidth - padding;
|
|
});
|
|
|
|
document.addEventListener('mousemove', function(e) {
|
|
if (startX) {
|
|
var diffX = e.pageX - startX;
|
|
diffX = -Math.min(-diffX, curColWidth - 20);
|
|
diffX = Math.min(diffX, nxtColWidth - 20);
|
|
|
|
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
|
|
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
|
|
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
curCol = undefined;
|
|
nxtCol = undefined;
|
|
startX = undefined;
|
|
nxtColWidth = undefined;
|
|
curColWidth = undefined
|
|
});
|
|
}
|
|
|
|
function paddingDiff(col) {
|
|
|
|
if (getStyleVal(col, 'box-sizing') == 'border-box') {
|
|
return 0;
|
|
}
|
|
|
|
var padLeft = getStyleVal(col, 'padding-left');
|
|
var padRight = getStyleVal(col, 'padding-right');
|
|
return (parseInt(padLeft) + parseInt(padRight));
|
|
|
|
}
|
|
|
|
function getStyleVal(elm, css) {
|
|
return (window.getComputedStyle(elm, null).getPropertyValue(css))
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var markedFootprints = new Set();
|
|
var highlightedFootprints = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
function setShowBOMColumn(field, value) {
|
|
if (field === "references") {
|
|
var rl = document.getElementById("reflookup");
|
|
rl.disabled = !value;
|
|
if (!value) {
|
|
rl.value = "";
|
|
updateRefLookup("");
|
|
}
|
|
}
|
|
|
|
var n = settings.hiddenColumns.indexOf(field);
|
|
if (value) {
|
|
if (n != -1) {
|
|
settings.hiddenColumns.splice(n, 1);
|
|
}
|
|
} else {
|
|
if (n == -1) {
|
|
settings.hiddenColumns.push(field);
|
|
}
|
|
}
|
|
|
|
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
|
|
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
|
|
function setFullscreen(value) {
|
|
if (value) {
|
|
document.documentElement.requestFullscreen();
|
|
} else {
|
|
document.exitFullscreen();
|
|
}
|
|
}
|
|
|
|
function fabricationVisible(value) {
|
|
writeStorage("fabricationVisible", value);
|
|
settings.renderFabrication = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function silkscreenVisible(value) {
|
|
writeStorage("silkscreenVisible", value);
|
|
settings.renderSilkscreen = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightPin1(value) {
|
|
writeStorage("highlightpin1", value);
|
|
settings.highlightpin1 = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightRowOnClick(value) {
|
|
settings.highlightRowOnClick = value;
|
|
writeStorage("highlightRowOnClick", value);
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
function getStoredCheckboxRefs(checkbox) {
|
|
function convert(ref) {
|
|
var intref = parseInt(ref);
|
|
if (isNaN(intref)) {
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.footprints[i].ref == ref) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
} else {
|
|
return intref;
|
|
}
|
|
}
|
|
if (!(checkbox in settings.checkboxStoredRefs)) {
|
|
var val = readStorage("checkbox_" + checkbox);
|
|
settings.checkboxStoredRefs[checkbox] = val ? val : "";
|
|
}
|
|
if (!settings.checkboxStoredRefs[checkbox]) {
|
|
return new Set();
|
|
} else {
|
|
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
|
|
}
|
|
}
|
|
|
|
function getCheckboxState(checkbox, references) {
|
|
var storedRefsSet = getStoredCheckboxRefs(checkbox);
|
|
var currentRefsSet = new Set(references.map(r => r[1]));
|
|
// Get difference of current - stored
|
|
var difference = new Set(currentRefsSet);
|
|
for (ref of storedRefsSet) {
|
|
difference.delete(ref);
|
|
}
|
|
if (difference.size == 0) {
|
|
// All the current refs are stored
|
|
return "checked";
|
|
} else if (difference.size == currentRefsSet.size) {
|
|
// None of the current refs are stored
|
|
return "unchecked";
|
|
} else {
|
|
// Some of the refs are stored
|
|
return "indeterminate";
|
|
}
|
|
}
|
|
|
|
function setBomCheckboxState(checkbox, element, references) {
|
|
var state = getCheckboxState(checkbox, references);
|
|
element.checked = (state == "checked");
|
|
element.indeterminate = (state == "indeterminate");
|
|
}
|
|
|
|
function createCheckboxHandlers(input, checkbox, references, row) {
|
|
var clickHandler = () => {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (input.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.add("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.add(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'checked';
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.remove("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.delete(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'unchecked';
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
|
|
}
|
|
|
|
return [
|
|
(e) => {
|
|
clickHandler();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
if (row.onmousemove) row.onmousemove();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
input.checked = !input.checked;
|
|
input.indeterminate = false;
|
|
clickHandler();
|
|
}
|
|
];
|
|
}
|
|
|
|
function clearHighlightedFootprints() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedFootprints = [];
|
|
highlightedNet = null;
|
|
}
|
|
}
|
|
|
|
function createRowHighlightHandler(rowid, refs, net) {
|
|
return function () {
|
|
if (currentHighlightedRowId) {
|
|
if (currentHighlightedRowId == rowid) {
|
|
return;
|
|
}
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
}
|
|
document.getElementById(rowid).classList.add("highlighted");
|
|
currentHighlightedRowId = rowid;
|
|
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
function updateNetColors() {
|
|
writeStorage("netColors", JSON.stringify(settings.netColors));
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function netColorChangeHandler(net) {
|
|
return (event) => {
|
|
settings.netColors[net] = event.target.value;
|
|
updateNetColors();
|
|
}
|
|
}
|
|
|
|
function netColorRightClick(net) {
|
|
return (event) => {
|
|
if (event.button == 2) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
event.target.value = defaultNetColor;
|
|
delete settings.netColors[net];
|
|
updateNetColors();
|
|
}
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
if (!settings.hiddenColumns.includes("References")) {
|
|
for (var ref of entry) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// check fields
|
|
for (var i in config.fields) {
|
|
var f = config.fields[i];
|
|
if (!settings.hiddenColumns.includes(f)) {
|
|
for (var ref of entry) {
|
|
if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry.filter(r => r[0].toLowerCase() == reflookup);
|
|
}
|
|
|
|
function highlightFilter(s) {
|
|
if (!filter) {
|
|
return s;
|
|
}
|
|
var parts = s.toLowerCase().split(filter);
|
|
if (parts.length == 1) {
|
|
return s;
|
|
}
|
|
var r = "";
|
|
var pos = 0;
|
|
for (var i in parts) {
|
|
if (i > 0) {
|
|
r += '<mark class="highlight">' +
|
|
s.substring(pos, pos + filter.length) +
|
|
'</mark>';
|
|
pos += filter.length;
|
|
}
|
|
r += s.substring(pos, pos + parts[i].length);
|
|
pos += parts[i].length;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function getBomListByLayer(layer) {
|
|
switch (layer) {
|
|
case 'F': return pcbdata.bom.F.slice();
|
|
case 'B': return pcbdata.bom.B.slice();
|
|
case 'FB': return pcbdata.bom.both.slice();
|
|
}
|
|
return [];
|
|
}
|
|
|
|
function getSelectedBomList() {
|
|
if (settings.bommode == "netlist") {
|
|
return pcbdata.nets.slice();
|
|
}
|
|
var out = getBomListByLayer(settings.canvaslayout);
|
|
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
var expandedTable = [];
|
|
for (var bomentry of out) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
return expandedTable;
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
function checkboxSetUnsetAllHandler(checkboxname) {
|
|
return function () {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var allset = true;
|
|
var checkbox;
|
|
var row;
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
if (!checkbox.checked || checkbox.indeterminate) {
|
|
allset = false;
|
|
break;
|
|
}
|
|
}
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = !allset;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
}
|
|
}
|
|
|
|
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
if (is_checkbox)
|
|
th.setAttribute("col_name", "bom-checkbox");
|
|
else
|
|
th.setAttribute("col_name", name);
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
var spacer = document.createElement("div");
|
|
spacer.className = "column-spacer";
|
|
th.appendChild(spacer);
|
|
spacer.onclick = function () {
|
|
if (currentSortColumn && th !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && th === currentSortColumn) {
|
|
// Already sorted by this column
|
|
if (currentSortOrder == "asc") {
|
|
// Sort by this column, descending order
|
|
bomSortFunction = function (a, b) {
|
|
return -comparator(a, b);
|
|
}
|
|
currentSortColumn.childNodes[1].classList.remove("asc");
|
|
currentSortColumn.childNodes[1].classList.add("desc");
|
|
currentSortOrder = "desc";
|
|
} else {
|
|
// Unsort
|
|
bomSortFunction = null;
|
|
currentSortColumn.childNodes[1].classList.remove("desc");
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
} else {
|
|
// Sort by this column, ascending order
|
|
bomSortFunction = comparator;
|
|
currentSortColumn = th;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
if (is_checkbox) {
|
|
spacer.onclick = fancyDblClickHandler(
|
|
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
|
|
var vismenu = document.createElement("div");
|
|
vismenu.id = "vismenu";
|
|
vismenu.classList.add("menu");
|
|
|
|
var visbutton = document.createElement("div");
|
|
visbutton.classList.add("visbtn");
|
|
visbutton.classList.add("hideonprint");
|
|
|
|
var viscontent = document.createElement("div");
|
|
viscontent.classList.add("menu-content");
|
|
viscontent.id = "vismenu-content";
|
|
|
|
settings.columnOrder.forEach(column => {
|
|
if (typeof column !== "string")
|
|
return;
|
|
|
|
// Skip empty columns
|
|
if (column === "checkboxes" && settings.checkboxes.length == 0)
|
|
return;
|
|
else if (column === "Quantity" && settings.bommode == "ungrouped")
|
|
return;
|
|
|
|
var label = document.createElement("label");
|
|
label.classList.add("menu-label");
|
|
|
|
var input = document.createElement("input");
|
|
input.classList.add("visibility_checkbox");
|
|
input.type = "checkbox";
|
|
input.onchange = function (e) {
|
|
setShowBOMColumn(column, e.target.checked)
|
|
};
|
|
input.checked = !(settings.hiddenColumns.includes(column));
|
|
|
|
label.appendChild(input);
|
|
if (column.length > 0)
|
|
label.append(column[0].toUpperCase() + column.slice(1));
|
|
|
|
viscontent.appendChild(label);
|
|
});
|
|
|
|
viscontent.childNodes[0].classList.add("menu-label-top");
|
|
|
|
vismenu.appendChild(visbutton);
|
|
if (settings.bommode != "netlist") {
|
|
vismenu.appendChild(viscontent);
|
|
th.appendChild(vismenu);
|
|
}
|
|
tr.appendChild(th);
|
|
|
|
var checkboxCompareClosure = function (checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a);
|
|
var stateB = getCheckboxState(checkbox, b);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
var stringFieldCompareClosure = function (fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
|
|
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
|
|
var compareRefs = (a, b) => {
|
|
var ra = referenceRegex.exec(a);
|
|
var rb = referenceRegex.exec(b);
|
|
if (ra === null || rb === null) {
|
|
if (a != b) return a > b ? 1 : -1;
|
|
return 0;
|
|
} else {
|
|
if (ra.groups.prefix != rb.groups.prefix) {
|
|
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
|
|
}
|
|
if (ra.groups.number != rb.groups.number) {
|
|
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
if (settings.bommode == "netlist") {
|
|
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
}));
|
|
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
|
|
return 0;
|
|
}));
|
|
} else {
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
var valueIndex = config.fields.indexOf("Value");
|
|
var footprintIndex = config.fields.indexOf("Footprint");
|
|
columns.forEach((column) => {
|
|
if (column === placeHolderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
|
|
tr.appendChild(th);
|
|
}
|
|
} else if (column === "References") {
|
|
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
|
|
var i = 0;
|
|
while (i < a.length && i < b.length) {
|
|
if (a[i][0] != b[i][0]) return compareRefs(a[i][0], b[i][0]);
|
|
i++;
|
|
}
|
|
return a.length - b.length;
|
|
}));
|
|
} else if (column === "Value") {
|
|
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
|
|
var ra = a[0][1], rb = b[0][1];
|
|
return valueCompare(
|
|
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
|
|
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
|
|
}));
|
|
return;
|
|
} else if (column === "Footprint") {
|
|
tr.appendChild(createColumnHeader(
|
|
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
|
|
return a.length - b.length;
|
|
}));
|
|
} else {
|
|
// Other fields
|
|
var i = config.fields.indexOf(column);
|
|
if (i < 0)
|
|
return;
|
|
tr.appendChild(createColumnHeader(
|
|
column, `field${i + 1}`, stringFieldCompareClosure(i)));
|
|
}
|
|
});
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
|
|
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
|
|
bomtable = getSelectedBomList();
|
|
|
|
if (bomSortFunction) {
|
|
bomtable = bomtable.sort(bomSortFunction);
|
|
}
|
|
for (var i in bomtable) {
|
|
var bomentry = bomtable[i];
|
|
if (filter && !entryMatches(bomentry)) {
|
|
continue;
|
|
}
|
|
var references = null;
|
|
var netname = null;
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
var rownum = +i + 1;
|
|
tr.id = "bomrow" + rownum;
|
|
td.textContent = rownum;
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "netlist") {
|
|
netname = bomentry;
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(netname ? netname : "<no net>");
|
|
tr.appendChild(td);
|
|
var color = settings.netColors[netname] || defaultNetColor;
|
|
td = document.createElement("TD");
|
|
var colorBox = document.createElement("INPUT");
|
|
colorBox.type = "color";
|
|
colorBox.value = color;
|
|
colorBox.onchange = netColorChangeHandler(netname);
|
|
colorBox.onmouseup = netColorRightClick(netname);
|
|
colorBox.oncontextmenu = (e) => e.preventDefault();
|
|
td.appendChild(colorBox);
|
|
td.classList.add("color-column");
|
|
tr.appendChild(td);
|
|
} else {
|
|
if (reflookup) {
|
|
references = findRefInEntry(bomentry);
|
|
if (references.length == 0) {
|
|
continue;
|
|
}
|
|
} else {
|
|
references = bomentry;
|
|
}
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
columns.forEach((column) => {
|
|
if (column === placeholderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
if (checkbox) {
|
|
td = document.createElement("TD");
|
|
var input = document.createElement("input");
|
|
input.type = "checkbox";
|
|
[input.onchange, td.ontouchstart, td.ontouchend] = createCheckboxHandlers(input, checkbox, references, tr);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
if (input.checked && settings.markWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
} else if (column === "References") {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = references.length;
|
|
tr.appendChild(td);
|
|
} else {
|
|
// All the other fields
|
|
var field_index = config.fields.indexOf(column)
|
|
if (field_index < 0)
|
|
return;
|
|
var valueSet = new Set();
|
|
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
|
|
td = document.createElement("TD");
|
|
var output = new Array();
|
|
for (let item of valueSet) {
|
|
const visible = highlightFilter(String(item));
|
|
if (typeof item === 'string' && item.match(urlRegex)) {
|
|
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
|
|
} else {
|
|
output.push(visible);
|
|
}
|
|
}
|
|
td.innerHTML = output.join(", ");
|
|
tr.appendChild(td);
|
|
}
|
|
});
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
if (settings.highlightRowOnClick) {
|
|
tr.onmousedown = handler;
|
|
} else {
|
|
tr.onmousemove = handler;
|
|
}
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
setBomHandlers();
|
|
resizableGrid(bomhead);
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0,
|
|
fp_b = 0,
|
|
pads_f = 0,
|
|
pads_b = 0,
|
|
pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("topmostdiv").style.height = "";
|
|
document.getElementById("topmostdiv").style.display = "block";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
var chkbxs = document.getElementsByClassName("visibility_checkbox");
|
|
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = true;
|
|
}
|
|
}
|
|
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var childNum = checkboxnum + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].childNodes[0];
|
|
checkbox.checked = !checkbox.checked;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function checkBomCheckbox(bomrowid, checkboxname) {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var childNum = checkboxnum + 1 + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
|
|
prepCheckboxes();
|
|
populateMarkWhenCheckedOptions();
|
|
setMarkWhenChecked(settings.markWhenChecked);
|
|
}
|
|
|
|
function setMarkWhenChecked(value) {
|
|
writeStorage("markWhenChecked", value);
|
|
settings.markWhenChecked = value;
|
|
markedFootprints.clear();
|
|
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
|
|
markedFootprints.add(ref);
|
|
}
|
|
populateBomTable();
|
|
drawHighlights();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateMarkWhenCheckedOptions() {
|
|
var container = document.getElementById("markWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "markWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "markWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setMarkWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.markWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
function constrain(number, min, max) {
|
|
return Math.min(Math.max(parseInt(number), min), max);
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowLeft":
|
|
case "ArrowRight":
|
|
if (document.activeElement.type != "text") {
|
|
e.preventDefault();
|
|
let boardRotationElement = document.getElementById("boardRotation")
|
|
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
|
|
if (e.key == "ArrowLeft") {
|
|
settings.boardRotation += 3; // 15 degrees
|
|
}
|
|
else {
|
|
settings.boardRotation -= 3;
|
|
}
|
|
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
|
|
boardRotationElement.value = settings.boardRotation
|
|
setBoardRotation(settings.boardRotation);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
function topToggle() {
|
|
var top = document.getElementById("top");
|
|
var toptoggle = document.getElementById("toptoggle");
|
|
if (top.style.display === "none") {
|
|
top.style.display = "flex";
|
|
toptoggle.classList.remove("flipped");
|
|
} else {
|
|
top.style.display = "none";
|
|
toptoggle.classList.add("flipped");
|
|
}
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
initUtils();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// 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="highlightRowOnClickCheckbox" type="checkbox" checked onchange="setHighlightRowOnClick(this.checked)">
|
|
Highlight row on click
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
Highlight first pin
|
|
<form id="highlightpin1">
|
|
<div class="flexbox">
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
|
|
None
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
|
|
All
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
|
|
Selected
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</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>
|