mirror of
https://github.com/Alex-2-Graf/ZX-Spectrum-BDI-TR-DOS-interface.git
synced 2026-06-15 04:11:34 +03:00
4670 lines
310 KiB
HTML
4670 lines
310 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Interactive BOM for KiCAD</title>
|
|
<style type="text/css">
|
|
:root {
|
|
--pcb-edge-color: black;
|
|
--pad-color: #878787;
|
|
--pad-hole-color: #CCCCCC;
|
|
--pad-color-highlight: #D04040;
|
|
--pad-color-highlight-both: #D0D040;
|
|
--pad-color-highlight-marked: #44a344;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #ffb629;
|
|
--pin1-outline-color-highlight-both: #fcbb39;
|
|
--pin1-outline-color-highlight-marked: #fdbe41;
|
|
--silkscreen-edge-color: #aa4;
|
|
--silkscreen-polygon-color: #4aa;
|
|
--silkscreen-text-color: #4aa;
|
|
--fabrication-edge-color: #907651;
|
|
--fabrication-polygon-color: #907651;
|
|
--fabrication-text-color: #a27c24;
|
|
--track-color: #def5f1;
|
|
--track-color-highlight: #D04040;
|
|
--zone-color: #def5f1;
|
|
--zone-color-highlight: #d0404080;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
margin: 0px;
|
|
height: 100%;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark.topmostdiv {
|
|
--pcb-edge-color: #eee;
|
|
--pad-color: #808080;
|
|
--pin1-outline-color: #ffa800;
|
|
--pin1-outline-color-highlight: #ccff00;
|
|
--track-color: #42524f;
|
|
--zone-color: #42524f;
|
|
background-color: #252c30;
|
|
color: #eee;
|
|
}
|
|
|
|
button {
|
|
background-color: #eee;
|
|
border: 1px solid #888;
|
|
color: black;
|
|
height: 44px;
|
|
width: 44px;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
display: inline-block;
|
|
font-size: 14px;
|
|
font-weight: bolder;
|
|
}
|
|
|
|
.dark button {
|
|
/* This will be inverted */
|
|
background-color: #c3b7b5;
|
|
}
|
|
|
|
button.depressed {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark button.depressed {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
button:focus {
|
|
outline: 0;
|
|
}
|
|
|
|
button#tb-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#lr-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#bom-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-grouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-ungrouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-netlist-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#copy {
|
|
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
|
|
background-position: 6px 6px;
|
|
background-repeat: no-repeat;
|
|
background-size: 26px 26px;
|
|
border-radius: 6px;
|
|
height: 40px;
|
|
width: 40px;
|
|
margin: 10px 5px;
|
|
}
|
|
|
|
button#copy:active {
|
|
box-shadow: inset 0px 0px 5px #6c6c6c;
|
|
}
|
|
|
|
textarea.clipboard-temp {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 2em;
|
|
height: 2em;
|
|
padding: 0;
|
|
border: None;
|
|
outline: None;
|
|
box-shadow: None;
|
|
background: transparent;
|
|
}
|
|
|
|
.left-most-button {
|
|
border-right: 0;
|
|
border-top-left-radius: 6px;
|
|
border-bottom-left-radius: 6px;
|
|
}
|
|
|
|
.middle-button {
|
|
border-right: 0;
|
|
}
|
|
|
|
.right-most-button {
|
|
border-top-right-radius: 6px;
|
|
border-bottom-right-radius: 6px;
|
|
}
|
|
|
|
.button-container {
|
|
font-size: 0;
|
|
margin: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.dark .button-container {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.button-container button {
|
|
background-size: 32px 32px;
|
|
background-position: 5px 5px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
@media print {
|
|
.hideonprint {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
canvas {
|
|
cursor: crosshair;
|
|
}
|
|
|
|
canvas:active {
|
|
cursor: grabbing;
|
|
}
|
|
|
|
.fileinfo {
|
|
width: 100%;
|
|
max-width: 1000px;
|
|
border: none;
|
|
padding: 3px;
|
|
}
|
|
|
|
.fileinfo .title {
|
|
font-size: 20pt;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.fileinfo td {
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
max-width: 1px;
|
|
width: 50%;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.bom {
|
|
border-collapse: collapse;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 10pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
margin-top: 1px;
|
|
position: relative;
|
|
}
|
|
|
|
.bom th,
|
|
.bom td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
.dark .bom th,
|
|
.dark .bom td {
|
|
border: 1px solid #777;
|
|
}
|
|
|
|
.bom th {
|
|
background-color: #CCCCCC;
|
|
background-clip: padding-box;
|
|
}
|
|
|
|
.dark .bom th {
|
|
background-color: #3b4749;
|
|
}
|
|
|
|
.bom tr.highlighted:nth-child(n) {
|
|
background-color: #cfc;
|
|
}
|
|
|
|
.dark .bom tr.highlighted:nth-child(n) {
|
|
background-color: #226022;
|
|
}
|
|
|
|
.bom tr:nth-child(even) {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.dark .bom tr:nth-child(even) {
|
|
background-color: #313b40;
|
|
}
|
|
|
|
.bom tr.checked {
|
|
color: #1cb53d;
|
|
}
|
|
|
|
.dark .bom tr.checked {
|
|
color: #2cce54;
|
|
}
|
|
|
|
.bom tr {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 30px;
|
|
}
|
|
|
|
.bom .value {
|
|
width: 15%;
|
|
}
|
|
|
|
.bom .quantity {
|
|
width: 65px;
|
|
}
|
|
|
|
.bom th .sortmark {
|
|
position: absolute;
|
|
right: 1px;
|
|
top: 1px;
|
|
margin-top: -5px;
|
|
border-width: 5px;
|
|
border-style: solid;
|
|
border-color: transparent transparent #221 transparent;
|
|
transform-origin: 50% 85%;
|
|
transition: opacity 0.2s, transform 0.4s;
|
|
}
|
|
|
|
.dark .bom th .sortmark {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.bom th .sortmark.none {
|
|
opacity: 0;
|
|
}
|
|
|
|
.bom th .sortmark.desc {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.bom th:hover .sortmark.none {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.bom .bom-checkbox {
|
|
width: 30px;
|
|
position: relative;
|
|
user-select: none;
|
|
-moz-user-select: none;
|
|
}
|
|
|
|
.bom .bom-checkbox:before {
|
|
content: "";
|
|
position: absolute;
|
|
border-width: 15px;
|
|
border-style: solid;
|
|
border-color: #51829f transparent transparent transparent;
|
|
visibility: hidden;
|
|
top: -15px;
|
|
}
|
|
|
|
.bom .bom-checkbox:after {
|
|
content: "Double click to set/unset all";
|
|
position: absolute;
|
|
color: white;
|
|
top: -35px;
|
|
left: -26px;
|
|
background: #51829f;
|
|
padding: 5px 15px;
|
|
border-radius: 8px;
|
|
white-space: nowrap;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.bom .bom-checkbox:hover:before,
|
|
.bom .bom-checkbox:hover:after {
|
|
visibility: visible;
|
|
transition: visibility 0.2s linear 1s;
|
|
}
|
|
|
|
.split {
|
|
-webkit-box-sizing: border-box;
|
|
-moz-box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
background-color: inherit;
|
|
}
|
|
|
|
.split.split-horizontal,
|
|
.gutter.gutter-horizontal {
|
|
height: 100%;
|
|
float: left;
|
|
}
|
|
|
|
.gutter {
|
|
background-color: #ddd;
|
|
background-repeat: no-repeat;
|
|
background-position: 50%;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
.dark .gutter {
|
|
background-color: #777;
|
|
}
|
|
|
|
.gutter.gutter-horizontal {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
|
|
cursor: ew-resize;
|
|
width: 5px;
|
|
}
|
|
|
|
.gutter.gutter-vertical {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
|
|
cursor: ns-resize;
|
|
height: 5px;
|
|
}
|
|
|
|
.searchbox {
|
|
float: left;
|
|
height: 40px;
|
|
margin: 10px 5px;
|
|
padding: 12px 32px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 18px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 6px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
|
|
background-position: 10px 10px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.dark .searchbox {
|
|
background-color: #111;
|
|
color: #eee;
|
|
}
|
|
|
|
.searchbox::placeholder {
|
|
color: #ccc;
|
|
}
|
|
|
|
.dark .searchbox::placeholder {
|
|
color: #666;
|
|
}
|
|
|
|
.filter {
|
|
width: calc(60% - 64px);
|
|
}
|
|
|
|
.reflookup {
|
|
width: calc(40% - 10px);
|
|
}
|
|
|
|
input[type=text]:focus {
|
|
background-color: white;
|
|
border: 1px solid #333;
|
|
}
|
|
|
|
.dark input[type=text]:focus {
|
|
background-color: #333;
|
|
border: 1px solid #ccc;
|
|
}
|
|
|
|
mark.highlight {
|
|
background-color: #5050ff;
|
|
color: #fff;
|
|
padding: 2px;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.dark mark.highlight {
|
|
background-color: #76a6da;
|
|
color: #111;
|
|
}
|
|
|
|
.menubtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.statsbtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.iobtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.visbtn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
padding: 15px;
|
|
}
|
|
|
|
#vismenu-content {
|
|
left: 0px;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark .statsbtn,
|
|
.dark .savebtn,
|
|
.dark .menubtn,
|
|
.dark .iobtn,
|
|
.dark .visbtn {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.flexbox {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
}
|
|
|
|
.savebtn {
|
|
background-color: #d6d6d6;
|
|
width: auto;
|
|
height: 30px;
|
|
flex-grow: 1;
|
|
margin: 5px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.savebtn:active {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark .savebtn:active {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
.stats {
|
|
border-collapse: collapse;
|
|
font-size: 12pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
min-width: 450px;
|
|
}
|
|
|
|
.dark .stats td {
|
|
border: 1px solid #bbb;
|
|
}
|
|
|
|
.stats td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
#checkbox-stats div {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
#checkbox-stats .bar {
|
|
background-color: rgba(28, 251, 0, 0.6);
|
|
}
|
|
|
|
.menu {
|
|
position: relative;
|
|
display: inline-block;
|
|
margin: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.menu-content {
|
|
font-size: 12pt !important;
|
|
text-align: left !important;
|
|
font-weight: normal !important;
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
right: 0;
|
|
min-width: 300px;
|
|
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
|
z-index: 100;
|
|
padding: 8px;
|
|
}
|
|
|
|
.dark .menu-content {
|
|
background-color: #111;
|
|
}
|
|
|
|
.menu:hover .menu-content {
|
|
display: block;
|
|
}
|
|
|
|
.menu:hover .menubtn,
|
|
.menu:hover .iobtn,
|
|
.menu:hover .statsbtn {
|
|
background-color: #eee;
|
|
}
|
|
|
|
.menu-label {
|
|
display: inline-block;
|
|
padding: 8px;
|
|
border: 1px solid #ccc;
|
|
border-top: 0;
|
|
width: calc(100% - 18px);
|
|
}
|
|
|
|
.menu-label-top {
|
|
border-top: 1px solid #ccc;
|
|
}
|
|
|
|
.menu-textbox {
|
|
float: left;
|
|
height: 24px;
|
|
margin: 10px 5px;
|
|
padding: 5px 5px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 14px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 4px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
width: calc(100% - 10px);
|
|
}
|
|
|
|
.menu-textbox.invalid,
|
|
.dark .menu-textbox.invalid {
|
|
color: red;
|
|
}
|
|
|
|
.dark .menu-textbox {
|
|
background-color: #222;
|
|
color: #eee;
|
|
}
|
|
|
|
.radio-container {
|
|
margin: 4px;
|
|
}
|
|
|
|
.topmostdiv {
|
|
display: flex;
|
|
flex-direction: column;
|
|
width: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
#top {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: flex-end;
|
|
align-items: center;
|
|
}
|
|
|
|
#topdivider {
|
|
border-bottom: 2px solid black;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.dark #topdivider {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#topdivider>div {
|
|
position: relative;
|
|
}
|
|
|
|
#toptoggle {
|
|
cursor: pointer;
|
|
user-select: none;
|
|
position: absolute;
|
|
padding: 0.1rem 0.3rem;
|
|
top: -0.4rem;
|
|
left: -1rem;
|
|
font-size: 1.4rem;
|
|
line-height: 60%;
|
|
border: 1px solid black;
|
|
border-radius: 1rem;
|
|
background-color: #fff;
|
|
z-index: 100;
|
|
}
|
|
|
|
.flipped {
|
|
transform: rotate(0.5turn);
|
|
}
|
|
|
|
.dark #toptoggle {
|
|
border: 1px solid #fff;
|
|
background-color: #222;
|
|
}
|
|
|
|
#fileinfodiv {
|
|
flex: 20rem 1 0;
|
|
overflow: auto;
|
|
}
|
|
|
|
#bomcontrols {
|
|
display: flex;
|
|
flex-direction: row-reverse;
|
|
}
|
|
|
|
#bomcontrols>* {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
#dbg {
|
|
display: block;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #aaa;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #666;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #555;
|
|
}
|
|
|
|
.slider {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
margin: 3px 0;
|
|
padding: 0;
|
|
outline: none;
|
|
opacity: 0.7;
|
|
-webkit-transition: .2s;
|
|
transition: opacity .2s;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider:hover {
|
|
opacity: 1;
|
|
}
|
|
|
|
.slider:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-runnable-track {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
border: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin-top: -4px;
|
|
}
|
|
|
|
.dark .slider::-webkit-slider-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-moz-range-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.slider::-moz-range-track {
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.dark .slider::-moz-range-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-ms-track {
|
|
width: 100%;
|
|
height: 8px;
|
|
border-width: 3px 0;
|
|
background: transparent;
|
|
border-color: transparent;
|
|
color: transparent;
|
|
transition: opacity .2s;
|
|
}
|
|
|
|
.slider::-ms-fill-lower {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-fill-upper {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
|
|
.shameless-plug {
|
|
font-size: 0.8em;
|
|
text-align: center;
|
|
display: block;
|
|
}
|
|
|
|
a {
|
|
color: #0278a4;
|
|
}
|
|
|
|
.dark a {
|
|
color: #00b9fd;
|
|
}
|
|
|
|
#frontcanvas,
|
|
#backcanvas {
|
|
touch-action: none;
|
|
}
|
|
|
|
.placeholder {
|
|
border: 1px dashed #9f9fda !important;
|
|
background-color: #edf2f7 !important;
|
|
}
|
|
|
|
.dragging {
|
|
z-index: 999;
|
|
}
|
|
|
|
.dark .dragging>table>tbody>tr {
|
|
background-color: #252c30;
|
|
}
|
|
|
|
.dark .placeholder {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.column-spacer {
|
|
top: 0;
|
|
left: 0;
|
|
width: calc(100% - 4px);
|
|
position: absolute;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle {
|
|
top: 0;
|
|
right: 0;
|
|
width: 4px;
|
|
position: absolute;
|
|
cursor: col-resize;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle:hover {
|
|
background-color: #4f99bd;
|
|
}
|
|
|
|
.help-link {
|
|
border: 1px solid #0278a4;
|
|
padding-inline: 0.3rem;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.dark .help-link {
|
|
border: 1px solid #00b9fd;
|
|
}
|
|
|
|
.bom-color {
|
|
width: 20%;
|
|
}
|
|
|
|
.color-column input {
|
|
width: 1.6rem;
|
|
height: 1rem;
|
|
border: 1px solid black;
|
|
cursor: pointer;
|
|
padding: 0;
|
|
}
|
|
|
|
/* removes default styling from input color element */
|
|
::-webkit-color-swatch {
|
|
border: none;
|
|
}
|
|
|
|
::-webkit-color-swatch-wrapper {
|
|
padding: 0;
|
|
}
|
|
|
|
::-moz-color-swatch,
|
|
::-moz-focus-inner {
|
|
border: none;
|
|
}
|
|
|
|
::-moz-focus-inner {
|
|
padding: 0;
|
|
}
|
|
/* #bomhead {
|
|
position: sticky;
|
|
top: 0px;
|
|
z-index: 1;
|
|
} */
|
|
</style>
|
|
<script type="text/javascript" >
|
|
///////////////////////////////////////////////
|
|
/*
|
|
Split.js - v1.3.5
|
|
MIT License
|
|
https://github.com/nathancahill/Split.js
|
|
*/
|
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
|
|
// This work is free. You can redistribute it and/or modify it
|
|
// under the terms of the WTFPL, Version 2
|
|
// For more information see LICENSE.txt or http://www.wtfpl.net/
|
|
//
|
|
// For more information, the home page:
|
|
// http://pieroxy.net/blog/pages/lz-string/testing.html
|
|
//
|
|
// LZ-based compression algorithm, version 1.4.4
|
|
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*!
|
|
* PEP v0.4.3 | https://github.com/jquery/PEP
|
|
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
|
|
*/
|
|
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
|
|
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
|
|
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
|
|
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
|
|
for(var b=a;b.parentNode;)b=b.parentNode;
|
|
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
|
|
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
|
|
//
|
|
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
|
|
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
|
|
var b=x(a,this.findElements,this);
|
|
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
|
|
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
|
|
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
|
|
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
|
|
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
|
|
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
|
|
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
|
|
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
|
|
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
|
|
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
|
|
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
|
|
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
|
|
b=!1;else if("XY"===c)
|
|
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
|
|
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
|
|
vacuumTouches:function(a){var b=a.touches;
|
|
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
|
|
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
|
|
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
|
|
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
|
|
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
|
|
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
|
|
if(this.isPrimaryTouch(c)){
|
|
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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sea+Zr3muAa8xrIGtga+xrtEmca4Vr3GsNq9+x/Gsuq26rgmudq2kq4qtSq7KrfauKq6tV0Wv3nc+dJYAK49po46tDq+YABquPCaNr8WvmaxarowBWqzerhoBaa5JpOmtBAKAAYWtBAPBr3quGa4erDugPnf1rspboayprhwAFq0WruGsfWbZrn6vnJllruNAvqyAAP6sEaxlr1Gs5axRr5muHa9xAQGssa6BrbGuMa0FrX1kha4Jwdau1a/WA9WvNq41rbasrAB2rwoCiq2KrFD2iAGJrSqvDayOj3D2Da7JrOqszqywA8msvU8prZqtD+ruS6muza9b482tfWYtrhwDLa8Dr+mvra0Zr37Hw69NmBoQJaxZr5wDJaxWK3eh3q7dr+Wv3a6wA2WuFa7lrzOusAO5ruWvFa/+rPmuva+VrH2tLkF9rtgA/a3coK2uHAGtr+6sba0hrFOvRLfWCZ6v7a7TrV6tmwgzru0DeAFzrIAAoAAX0F2sPUFdrN2uua9zrBWvXa0Vryusla0xrrAB+a+9rAWuVaxKG1Wum6/9rvGuHAA1rravNa+DrrWsAAMoAAOr6ujDr3WvDa1h4VG2AbakqSOtBAAar7CCo6/dNe2uY6yowqGhIQNZrx/QQyBurDqu6ayTr4WsGa+TrbcP6I5+I8G0068Tgy6u4gOrrp2vg0DrrsrB66+DQBusea1rrPOuPa8rrJ0BXq7iA1usVa59r01WVAJLr5gDS65Frsus9a9h8OevN2nnr5msF64WrmQCJ6wMCGuvggFrrZevLUBXrjgBV65zrRutrACbrtGv16xrzJ0CC6/5r9GuBa23rxOutq6TrMutZ66PDBHz7yMhtZmur6/KApEhj64zrt/pa612AqwB+gOzrpusL62drR4Mr62arrUCMa+5CzevC629ZwWtEADWrMHwd613rUWuB62R84ciD6+frLACX67jroJoT604AU+u662zrl2ukaxzrFGs168vrZuvv67QAn+sb6zbrW+t26zvrTqvp66trEWsgG8ZrYBsJCKEINOsN66DTV+twG3lrVuuIG4mrKBtP62gbi+u167mr5uvYG0uQX+tvay3rIuu8aX9rPGuA66wAAmug60JrrWsAAKrdoNDr/auw68hrgwiF0Mw9UGqI68Nr8muDlGjrE2vK653M1oBAYGPryevaa6nrS2tEG3vrGetk65tr0fCzw8obGsAx6xerdOtq66sWJeuOAHfrD+vIG05rz+tUa+drqBucG1gbYnGla1brfBs/6xBrf+sAGxLrxBtS66QbPevDax1RXuUSkLYbmGv2G/obThsrANPrxGtuGw9rLmsv69+rmBt/q34bluva64Ebtuut6/8AQBuRG4frqIB2frEb1Ovma0yoqutJG0zri+upG7PrKwDz62wbWRvuG3XrvhuMa75rhRv4G8UbwoClG5nrFhve8O/jVuXVG6vriRswG8/6k+uNG0wbj+uG6+0bGRs06xbrPRtC60UbAhslG+EbnetlG8MbdUjiI/rl4xuY60lrDhtP+mlrCBvl60gb+ussGwsbnhuv6zkbAWt5G6sbm+s/sdvrmxumGyQbQxty6xVIVhsHG0rrRxuTG8drpxvJG4wbFxvMGx0bmRu3G9kbvOtcG48buBv8GxxrAxtbG8AbURsKG/sbCj1aG/8bdRtTG2cbsxugm/Mb1evsGxgb0JtdGwLrZWvPG5Wrbxs7q2YbB+u7G2kKZkqOPBibdhtYm4CbDtg4mw9QTRuXG5Xr1xsEm4sb3hvLG/zr/hsFG2sbfRsbG4ib7xsRG58bvevBAJUb1huMmwkbzJspa44bDRvsm3Mb6Rt8m+gbrOusGz4buRvdG3CbQRv262KbVJsfG+YbXxuBgCorIj1ym4lrAJuKm0Cbypul66qbVxvgmwwbS+uam2/rOpukmwEbwpsvGwQblJuwa8abNJummxUbz1LsPZabKuvYaycbrJvAm9rrDptcm06bGpteG1qb/Juwm2SbeBvem/0b7etImzsbgZvSmzxDFpt/G0yb4Zv1GzfruJsz65ybc+vcmx4bd2sJm26bDxu6mymb8JtVa4abfpsSmyabUpvbihvJR/j5m/KbhZvYm1GbHJtgm0sb8Zt3G8Sb7puCm9/r6xsImxmb4pvbG5Kb0RucE1UbXZtWmwqbqWt9mzGb5Ztxm4Sbrpv3G1vryZuem+SbrxtCG3VrTauiG8Dr7uuVABDrfutyGwHrxmvR7Z3MY6th61OrKOuKa3sQi5s3SNvgy6sgIiubDIAp61urmZuzmzebNrPqpMiz1BvHG0Wbmuubmwmb+JuVmyzr1Zvbmy8bu5tCm/ubBBuQa//r0Gt/m62bgevR7UuBr5u1Gz2bLJuaa3abjgD9m1BbbRuQm06bfOsIW+ObIpsca4ebAOvHmyYbTWviGy1rAnAgAJIbUOuia1eblQBw6z8b+8jSMzJrahsE4ajr10CvmzoblYqCAEWbP5tp69ObyJvlG1vdU8NSM6GbuFtWa72bhFsrAC4baRuOm4ObEFvDm50bo5v5G1RbaZsCGyhboRu+m/vr3euyWzEb9BqHGwWbylv4WzZrqlsgm6WbA5vqm9pbUJu6W7WbHpuIW6mbFJtNm2ZbZBvfsY6D+BrWW92btls2m5GbDlvRm3ibapuJm0Obblvamx5bY5u9G4Zbk5u760abLZsBm1KbdJtBWzhboFsqW8WbKptRW5pbLlu8m4mbFFt1m3ub3luvG75b1JvmW7Sb+xuwGsFbS5t4W2FbBFv5W/abhVuxm1pbJVs1mzub5VteWw2bBptTm2lbM5sYWwobPxsNWzlb1ptfm21bRFtrmy0bFZukW1WbOlvxW71bnlsGWz5bQ1vNmyNbGVtw62ibOPKKW7lbdlv2+BFbxFvRWzcbS1txW0mbfVvrW1Vbm1t+WyibFOujGwpbk1vLm0qbM1spG3NbbOsLWxCbF1vkWzCb11tJWxtbqVtbWzJbuxuBW7QdfFtn65ibzVvTW+BbBVtOWyRbP1swW8tbV1trW4Dbt1vA2/dbFlvXyIzaj9QvWzDbb1tw2+1bCNtnWzybZFtLG2VbaNtem0DbDFsg21mbbZvzmxDbB1tTW4TbMxvw2xpbnVvFW+TbfJuU24lb1NsY27TbWNtg29OKweuZkxjrNlv066zb8Bslmxzb65tdW9zbpVv/W1TbSFvpm5jbNVv+W60AuZtWW/jboVuw22zbxNuy2/NbG5vdW3BbKxt6mxObjZt3W+rbD1utAMGbE1vxG01buttS286bp1tFWzFbrlt/WySbfNsq2xsbtFvO6+YAruuMW6wAYOvnm1IbvauyG11rXFvIa4Y6cIk3naobyGugyMwqs6snjA7b0ptBmFAb04Jj6+urhhu/m9Jb9NvRG+bo/rDj6qnbX+CF61nbn1ku259bjRDG2wrbPVvmAKXbI+tN6+jbPpvVW/6btVvZmzHbL505W/vw+XZfa3hrEVvqW80bX1s1279bFNur6+s68gDm29RbwRvfa6hboWvoWztb0duF23lxB1s929IQ5durmx1bcttc26PbPNvj21eruuI3Wy3bVttt2xrbh51bJYuJUNsXq2vbM9v92+9bjluG28Pb8tu724rbRxsT24fbzdvFG37bIhu022ebIquta2KrzZ3+61HbAVtLXTj+95sCWwpraOsSetQbRo0fm0Xrb1uSW8YbgxujW6A76ZPLXTrbktu2m/fbLpuQW6Tb0FvG61ubI5sJW/pbn9tGWyEbaFt52/+baDsrw8b4mDsRm61bRNuzW1vbRtvP28jbl1u826Q7/Ns+m9/b9FtiG8HbEhssW5IbWzgR2+Jr3FvyW6qRrrCaq5A7GhvCW6nboltqvBJbOdtSW8NboNvZm4obRkKma04ANRuHWy1b9ls4O4PbZZusOzvb7Due23pbTxuVW8hbFDvz21Q7qDutAOabGWONW2GbTtvYO0w7H1ssO0/bJjuEO7BbxDurW97bljuq24Lb1tvY27GC7WNOO0pbWDvhWzg7rtuc2+7bJtu+O/BbANvcO4E7KDuL249buXiOO/Q7YFv628w7JNtu2+dbpjtj217bXDs+2ylbQTun2zbb0fBom8I04Tu6O3rb0tvs20Pb1dtsO947KNucOxY7A1uEG6k77duZWzxbNTtZO3lbbjsP2007rRtI2607HDtK2/47nTumW8E7dVsxIJPdabBX2yFbkTuMOzk77jt5O7E7BTvjO2Y7JDsdO/qbXTsL2z07cOtPW5I7AztHW9MbDTsG2yM731vOmxwbqNtTO/s7MzsVOyE74egXTfzzIFss2647azvDO0Y7njtxO7XbptsCmyU7ATuimyfb6VtHO9HbONsLO+87OjufO1E7QzuRWxs729v/Oy/bddtm2/Wbjzut2+C7Z9tBm+3DbzvM269bXzuXO7k7j9vNO147uDttO5M7wLvTO1i721sQuwFbItvQuwS7BNtEu5XbHjtkuyi7hTt728U7ezsW24NbatvPO8LbWtuW1ono4tvLOww7+jsIuzE7yLtbOxS7Ezs8u1PbyVuW2wK72LuVO7i79FMiu7U7cLurO8S76zuku6M7tztEm+5bfjvUu487vDt8a0DrbutMWx7rLFtiq1FkojvyG5JrsWuK6/HbcmtPm9A7OFtwOyPrn5uIO8o7yDuHOzi7qbrOu8jZqdsROxK7x1s4Ow5r+DuLW1y7r9vmO4q7lavGW5Q7qjv52wBbae0I62K7jtsrO5K73zuIu/q7NzuxWzs7Jru8u9Pb9uvmuy7rlrtB2/BrzFuOAJIbSmYcW5Hbg6vR2ypLiZgpeBA7CduCW8+bGGo066Jb9wbuQtNbSDtE6+U7qrsWWy27S5LIlKG7dTvO27frYAD36/m7I9uxu2i7QLslu0q7ouvi6087I7tg28vbH1AaapO72rs5u7q7PzvOW5y72ztFO/G7GLt8uwc7tjtpO1Tqqku7u5m7zjvZuxG7UrtV2wa7hbtnu7s7CbsC2907gbtS6OSyF1D3u0s7Wbvhuxc7bLtIu8Y7J7tyu0W7iTvK2yC7ZTs/u2q7zkvqWDu7+5IPu2G72TuHu3m71zsLu6e73LvnuxVbNLtgu3S7v7utAcJ8NyPMuy478Lu5u9K7EHuyu3c77Ttfu8fbKrvEe4h7HuQgTYB72jsTG4S7VHuYezR7fzt0e0a7K1swew87l7sbuyx7o7tDmgB7qHtAe4+7IHtsm1c7vzscuwJ7RDvGu8J7pruie7S7ajttm17RrbsTu2h7U7usu+cb4Hv8e2TbqLuAu5RbZDvwewG7rHuke7p7r/H6e/u7z7vUe6+7Bbse2x+7xbuMeyk71nsWW3bUxFJtu3u73Hs6u2B787stO1B77ntqeyu7NNsIez57qbR2e1vSHzuBewe7wXvYe6F79HtUu5F737vee2DbOkLXPXp7Mnvoe4M7znvsu2+7bnt4e5+7F7ulu1e7KbvUO25Gf8P+ew57iXtOe7x7Lns4e2F7ZXseexV7q7tVe3TbNXu9a07ouXv2e/l7Bns8e8l7insle/E7qnvouwR7mLtEe1p7Bdvbayh78vNDe457oHtGeyF75Ltpewq7nXsUm+W7AduVuyDrAjs1uysAXatAO5xbTbtHq7Yg2Vuuu8jrUDtKazJ7S6veuwg72DuDu5YAw7vie7sbsAhXew17LLsje++7Y3uuexN7QntTe/1b+ztJuzY71Xt2O+TWuWIehN97lHtBe397x7vKez47k3vLu557vttca8IbfDunm9a7odssWwAAUjIbDbtiO9Hbtf75CM9R7kLSOwnbhq7+cQarKXGce4urd7BicTHuY+v46/aruduqO4G7xiRk+wlC7kIgWzl8F1BooCz7A9uzu64bQtB4AEkA23vb62D7gBtIm7+7/Qaa6OT7k7v8+x9QgvtTG1Gbhjt+mOL7koBH21570lu/u6T7ygCK+/p7yvvM+2r7wvtzu007sABa+5L7THtve/S7xNqX+Ib7PPtK+9LppvvnO+r7Ivuku1b7EvvTexp7s3v6+zYDRvtDeyb7qvvu++b7ovumsNb7vvuVe2J79vsqM5IzQfv0+xerIfvBdhWKHvsW+4p73vva+5Z7yrt2+7+7k12J+3z7rvuh+3o7pYoIuxr7uzhR+yD7fvvMe3H7R0m6AlEAzvvG+8X7qfvn9On7Efu1AFX7Ovugu7X7+fvsIU77T3Au+0z7Jftp++H7Xvtd+zn7/Lt5+6x70gqi6IX7Ojsp+1bio/sGO577lvsT+8k7PfvT+xZbegmN+4P7zfvD+637Nqtj+2v7PvvV+zH7mnuc+09b8/ur64v7Qvsr+xn7mvun+937Vnt6+6x7BFyjAE37wfst+0v7bfvH+5n76/ulO7n7QBu/u8nO3Pt7+1/7B/s/+0f79/sd+2SAAAdwe0AHsvtv+yPIA/vS8EP7AvuH+yXmf/uP+9n7G/sv+xz7rHuuNGRAu/toB/v7GAdQB1gHMAfj+0/7k/vdex6rv7vLJNmA1/tHG7f7ZvtUByf7uAeAB1P7wAeEB5J7H/vgB0n7mGusB2H77Af/+zQHeAeIB6/7o7sluswHyfvf+3f75fur+2IHnAcIB9wHSAc+e2p6sgdCB/IHbAeKBw/7lfviB1wHdAdwayR7ogKoB7gdRfuQBwoHubsV+z7o8AeEe737rHsym/wHpAcQB+QH1geYe7YHYvuGB6oHxgera7+7ULskBxYHC/s6ByIHegewB+CA9gcze44H2NvCu1oHiWvCB6X7IuvhB9QHKgcOB1v7YNvF2gGrn/uCBwkHoQdJB+37qQc2+7r7BAcWW8kQc/s5B5YH7ge6BzYHSgc4B8UHm/s8B2UHdZPmB7z7IQdWBzUHngd1BwYHaQfRB3b7A4CyW1z7rQfoByr7mAdza9gHPQcNB/gHPXtlB3aLQQdtBzf7+QfL+ykHHAdTB5IH1XsWWwb78wcjB277BQcTB3YHPgfpB4MbmweO+9sHZAejBxQH4weiB/UH0ftde7H7Awdg21oDwwfnB7sHywe1B/oHBwe9BzX7/Qesezza8QcWa4kHbwddBx8H3gdfB+f7s3sPBx3bBfuVB+0H1QdhB+8HEQdOAFEH3wfHB2Db89RgB64HuQcAh0sHv/vXB5MHtwdRe3+bFltQLtkHAgdVBxcHHgfOm14HkfuHB30HqIdQhwDszwduBxSHnQdUh90HnwdrB2oHVDvb+1ngTIdYh/p+HQfwh8CHiIdZ+5yHfgcSm4MHV/swh4sHgod7B3iHHIcEh5l73Idg2+/7/wcCh3CHcocrB8oHYof3B2/7Gkp8h+SHrwe4h1qHNwdn+3cHmnuQh22bTIykh5iHhocj+8aHCIdFB4qHtvv0h9p76XAGh7CHLIdCh2yHIIc0h2CH5ocQh4QHp+JnB8yHRofQByaH+Idmh4SHyocd22O7LgfBBzKHGodAhz6HIofIh+CHtfuWh9EbOnshh/yHhhCyh8mHM7u+h537tIcoh0SH2XuaB9KHLAc4h+GHjoerB86HJQczB9l7Zgc5h3aHYwe/APKHoIc6hxaHTgehOy2Hnodhh5QHEYcKh1GHSocbB8LbDjvxhwsHVYf5hw6HwodOhyOHLodlhx3bjLt9h4mHXoeah7WH2of1h40HS4dtm1kHHodrhwOHVwdDh52H24fTB/prZQcSEAeH04dJh7OHKYfzh8/76weNhx3bnkRMB5WHcgczhzWHc4d1hwuHX9sY+0ebFrsnm1a7h3s2u7W7ImsgAMA753vfG/Jb5Hvtu267zpSaGyJbT+C6G+JbeVsvexmHvXve8D8bsEcBez978PuL69SHMrume4u75ntJO0YH0vthG9e7dfvSmxOHo6u4R3D7SXtreyl7G3uCe/c76nvphz8HkPsVG72HH1Boa7D7T7urezLbzEeQe5t7+Hu/hzuHVEeX+xk7vEeNXPRHAkfyeyS7wkdI+5S7W3tnh0+HQtvqO/sbdEf8R3J7m9vGe0p7xEe4e3G75XtqR1yHEPs3u5YbMEd8R8t7jXuCR407/3ute6JHJkfiR+eHszuaR/M7UntLe7mHK3sKR3q7SkeGR217xkcde6ZH4ofve+o7T1s4RzpHGHuje4j7AUdOR8FHLkfqR25HDNs8R5FHNkd4R4xHQkcOR6l7rEcMe12HgYdcRzRHtlKLexR78kd6R+t7Ike5R+l7aPuuR4K7y4fBm2lH3ke2R75HR7uI24a7KntA+6j7+UcYR4VH7Zv7UBx7CXsZR017MUdtRwj7S7sWexIHZkc9e71HK4cyR1uAcke6RydbLXs5Rx1HbEcZe4uHkkdOBw1H1kdNR0NHdkcKe7FHBDuBR+NHZEe+Bw7rNYBO6z/b/DvVu6BHKwB4+yI7RPuOu8TaBMSYgKiYuuKU+3Jr1PtR6+jtD7uSEh3xmDR3++hHGQfuR1IjGZw/GecHAMesh0xHW4eJR2u7c9sy+1IHmQdzBzmAb0cjB5DH3ofQx6aHj4dTR/QHvwcvRyWAqMcQxzjglIeYx5GH2MehR9RHflmvR3XSaMfEx1DHWUdYx7QHsfsB+wYBKMc0x0THaSIFhwzHZMdMxxf7vweyM6404MfMh+jHG4fNe+y7oochR8zHM/sFk4LHdPvkhyLHXMf2R4zHk0cUx/n7Dftsx0LHuYfK+wrHd4ekx8OH5MdSx8SH/fsEx+zHwsd0xxjH3Mf6x7zH/vsz+4yHJseax/LH5seixyNHVscqx4bHKoe8h/bHcseehzrHX4cux6eHsMeqx4h7WVtex7rijsecx7rHlscBxwbHfMfb+z+cGsfex2uHvseDh0V7+kcSx4HH7scd26AH1McOxz7HTseKxwdHPMdux7HHKocoB6HHtMcRx37HesfRx9bHMQdg20QHdQKyx2HHeceVxynHYsdpx2mHAYd1x7GHwYcJx83HScf5x5HHSsdFx0YHmcfae3wHYMeJxzeHvACDx1XHUcd+h91HwMfaexW6TccVxxgiBceKRzDHMcc2xxoHl1KTx/3H08fJx8eHqccPh7XHS8fRG757OcdTxx+H6QCzx23H/scLx5LHJcfLhzxH+8drxyTH88fFh/6H0YelB+OHxUdvxxzH68dDx4XHrsejx8/HDNvCuwAnZsetx8fH7cenx8XHO8eZB0WBV8cHxzfHM8cwJ+2HL7vix53HP8cg23L7V4flx4AnH8fDx6AnZ0fgJ9Ebr4coJ+/H9MckJzXHCCcYR4MHaJurx0QnNCcgJ3QnYCeBh7MHgVJ9x9QnFse0J4/HGcfdh5sH+Mc8JywnfCdsJwIn28cMJ48HpweiJ9AnQCdzx/wnX8eLx66H0RtPB4Qn8ifEJxInyidPx5wnjwcCx4THmiesJ5vHysccJ9InUIcyx4YnWsfS6UfHmCcnxz+HUic/B8SH6sdQJ9YnYnG2J2X79idbx2fHqifR2ySHVCdiJ87H1ceSJz4nu4fRG7P7ASdGJ+InJicjx2QneidZx57HciduJ7fHGCeeJ3AnDiehJzGHmVsnO8wnUSdBJ5/HcAclhxxHvicBW+/7rifhxwon98fBJzongifxJ1aH+ocaJ8kn6C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dYp6Bn0RvdJ1eG6GeKJ9onlBfD59QXKBe0F7/nyAd03oyz/adce/AXS0cL545Hwhd5p7onJueUxzwX2LNau7ZHCBeRp1QXPmc0FxAXt+fcF2XH+trc49HnIHuaF1Tn2hc059VH92d0F6XHEhcAF0wXGGcsF1oXQhc6FyIXehc2F1CH++cORVgXaKc4Fx9namcF53FnhBdiF9v7hhfGQpeSFufQZyanF6cuF5YXEmeiF+Hn0duqF5/wUhfQ225nZhd65xYXBue6F88nXBdJF4YX9tsOF/wXkyfOF0gXYBej56gX+hf5F3YX5Cs+F+cn6Ke4F7EX2RduF7kXaBddJwUX4Dt1FxkXghdlF+F74BetF1UXpSeGF7pTfBdVJ8AX/hetZ4EXEOecF20XEYrDF+tnF2dRF3x7jRe9F+17ihe1J8oXIAfDF94XRRdjFxQXQ+erF7mn/Rc/Z3kXQxd2FwfnoxdAF/sXKxdsF1znK+elh4MXVkr75wsXkRdAp9EXNucKF8cXNKchF2iH++eGU7sXVxcCFwcXtxdTFxwXuCeJF+gX/+dKpyYXSxfXZ2JncRdJ5wMXHhd35+rHtRcAl9gX4xeL5wEXy+dBFw8XyJd751CX0YTol74XmJfyF64X6xeVF/iXUBdQl8pCxJf1F34XWJeTFziX0xfgl8lHBJegbeEXlxcYl9cXExdg53cXuJeQ52vnpef855vnrWtw54T75GdPR4WYBZP7W/XnMucn537nPbst54HnY+sE5+VnmxfSx9mTspd1F9nnBEfsh6UXIJfMl2CXUvv055Pn+fsFk6QXMJdTG7qXPJeMl3yXoJfrR3+HxecARxW7haccp6KXtrsSl9XnJaqIViMXpmfH5+IiHruhuwrnPrvQBx3nVJcBW7BaX2Jy+F0XOucm6x8X5JdfF6D7ppcalxZb27t+l3SX3RfAlzmnJ0cCl3cHDuful+XnrABdq16XQ2dL28s0gJqH55A7p7AMZxYQr5ssZxcacVYcZxQA4Zc/Fx3b+uCiQlwrdJdKZ4WHiIe8l/nnRpeOl+Q73+fg+22XYGe+QmiXVpfnOz2XzWesFzmX7BdDlzRbQpeul0RnAucQ667nZZeUZ3wHiIJylwGXs6sWZ/Ln75uPe1fnKudh52yXzbvblyZnmZdxl5qbCZcIlzkXvgcp56cXJapeSzuXsZfz5+9ndpcDl3dnmmfOlwRnK5dl50d78OeXm7vnJPuyM9qXXuc/p4GXTecPuwHnR/iqlyHn/qeplwqnVjN42zqX9Bu9lxVHCeflFwQXl7tPl7MXrTyqM4Sz6FdZlzcX85f8lyyXB5vLl3t7bpe6Z61rePtV55uXt7svOgTh/pd34PuXVugl2xmQlqsNZxG7rZcQl8xXGG1d6VrHV6uhCGGnmFejp1kXyBcWa7bYToAdZyOXAWdjlwXbv1gsV0BESvuiV9FHDJdkl/eXiWuyVzPbeGd/l9pn1qePp4LncOeDZ6BXTrvpu5mzbFeY56GbcFd452ennGfX59xnjxfmgBmz0nNTl76n+wcGl+RXDpfyV/GnE+fIV0GnibPEV3SXxqfLF/2X+Bf3F4KXhld85xvnRZcgAHDnwueSl8jnYucRBdZXkFc3ewqXdlfKl/BXaEfql6nnnPtSczR8ixfDpxJX8ee7Z80XFJdG5ymXhVfBxyJzoVeeV+JXpJcrRzpX1VduxwWXdFdCOyBXFGfQR0obYitSO3lnGOeyO6fn5msKO3ob+VfOV0tnEZd9V366hqtNV9O7epev59mXcGe051/nAVc/5wJXZpv/x0Bb6hd7R+FXcJfYV30XFRcJF+eXfyevO5Sze1ebZ6RXkVefFydX7hdKVwobJzu7V1yXmactVzdnVVdJl3iXj1cU63tbmBdhVzdXX5dRV3mXrJd1R707EjsvV3UXB1dyF61Xn1f3V0iXP1cVSGib27wvZ5pX71fwl3DXuFfFJwRXdUgnOyjXr1f7RyUX5hdNF9JXX1fY165X3EcXV/jXUNeA19pXmNfRVzMXFNdFR5KpA1cE19DXn5d016TX8NcnFzjXc21zV80rrxeOVx+XWFeVV1zXWNeM1zNXgYCQJ9TXANeyFxzXsNdi1wzXoNebu8uHkCeQ17LXwteSVyTXOFdK1wcnW1fqu1xK/1cLV4Z76NdHV2sXZNf5l9RXOmcmV92riOcpV6Lng6pHnTLXUufVl4wUgZd1l6nbDZfiIk2XbAf8V2dXt7tCK6jXbxeD52RXq1dWFyFH+FdM10bo/NdB18/ngUd3l/TXINdUV7FX6+eO50BXbWtpZ51rvVd9ewGrAvKZV+HrBWeO2EVnD7slZzNrwGcFV8+XOdeG+3nXMnvtZ4pn/ecK2wnX0ld11xHXR2edVzbXXuve66WXFlcAXeRwbQsDCy7XVPsvm6jrmWDN594I0ntJB2qXU1dBV22bc3SisI2mplCp2ygQuOe64trnkbvxl3OXYddHG6ZxHQC7p8dnjmedCCkLBdBL1/IAK9d0Gx5nG9c+V1vXF6s71/7ClJeI1xBdfddNCwPXWscnp66wa9cIu7rnPReGl/ybHFk+gv5X67sM57+7H50QZkrySvtv10HndyYYV7OXV9dL57/X/nH/1/mnVtfGV71ngueSG8lX3pdcaMjH0JfjZ+6nI1fdu2NXyEcDAncgJ5eh5zfnkteSaNg3nRfXlx2HxNeHF7mXlFdWOwpXiacP15Q33CeMF8bXexdAl6HXcDdrV6dXYNdqJzWnW+CBZZw3gJdE15kX2tfHV+LXytdhR9WnrMdKMwTXtNcK1zrXSdcbRxQ3eNo1p+rXojfcl9w3t1eJl9zX3xf61xo38jcwF4o3ctci16AXUje612o3rDfGN8n59hfaNySXtpec1yo3jDcNh0Y3kYhGSpZCZjea1xVXljfm1wY3wRceN4enKRc+N29nFjdSV643xpc2N8E3NgOFF4439Jem16LXUTeLl0lHAjck+3E3XZcJN0o3H1eK16o37jf+11g33CeTl6VXcdcRV0DXd1fSN3rXhTc9p6zHODeC1+QXujcVN/o3VTcxNzU3N0jYN0SX2TfmN1rX9DcLl3vXQDese/L7jkKDNjQ34Te9Nz/XfDcPVx43wzdBQhEXcBfpFz03fjeRN1Y3+TcSR+o3WJQFww43pTeNN+I339e+V4OXAzdml0M3yMd1yLAX0heLN743MRd9NxRX0TcFN+k3AVuzN2oXYTfs55vXvDfh1xsXdVdcJ1s3Cjfvl+M3yzeSNwE3rTdOl47rJecAVyKXCVeSG3bXmDdYR/JbODcfRzd7+Dc5V9/JE1dC137XDzezV/4asddeV7Q3Ejc3N35XYoeR1xs3gQf8+DsXCTfs1xE3gLdHF4E331ceN84HF11XV2VHSzfXN5M3Hzf310Y3Icekt786Gtf/Nyy3Bzc/l583ldfe8PsbDLds1zk3GNd5N2436ze2Nxo7212Mt69nrzewN9iXArfst+03Qwds/TTXzLdN1yk3Rzcz18c70kf1Nws3TLdXN9q3qzdSt7VHKtcpR687hrcXN8a3vLemt0C31jf3N5a3c5sThza3aRd2t4q3dDest/EX0zftN3zXWLdit1q3bzfKt1M3CNd0t8K77rcS2wq31ucht0yXKrf8Ny63kLvCu6K3mrcmt3G39peHN9YXtjcBt3Nd8rdo1843yjdmt3c36Psp18KX8Vfp12Kr5lfZ1zJCr5c+S/nXDefQVweX4qdHlz6n7ecV17zXgiu1C702CTczlyVbDrfUt8C3w5cbV6OXHjdxh2pLdRd9t003LjfFt6k3ZbvIN7RXHdf4+z1XUpcyQn+WOxO7l6WYHFfTZ2arQHxQG9IszZfot0m3kZfrt30T6lfYa2JXJ2veV963/LcDp1erX2vrV4A3xzc+e82HNtpNpcH7Glf11+K3Zte5p/po2GsPt4m3sjc3J3vHzkggInz7n7fTlw3XezcrV+83Rxt6VwB3frcYt26qr7cZSGB3C/sQdzZnUHdOFze319eYa/B3urdfN+WHIHeQZ8b7GHd32/a3Gbffl3e3/7cEd0K3SHviSAUIJHcftxe3zZcUd0q38bfUd3JX2bceN7Z7vGgZ56R3LHdft8G37HeZtyBb+Hfcd/63byejo/x3zHedcKx3Xrd4tz63F6vid0oXhHevJ2p6ofiSUOe3cndCd+m3IndUd6vrKneCt523r7eadyb44HeCd5B337fJN+F7f7dcd6p3dHcS1A6zZ7cCdzp3VnfCdzh3sHfKd/e3tHedt+u3l/rady6q7nd6d553obeGdz53EndIdzJCKHcjlMHoFndud5h31nf+N7+3ztj2d8Z3Ude8d8f6aleud0F3iXced4p3t7fhdzR3kXfHtyWqMXesVzl3l7d950l3KzdrF3Z3+leAd3N70duZd/jg5nfod5Z3eXchdwV3uHe6VxF3Dncmd8h7rXc5W6JGuXfkdwp3+zc9dzJXfXfpdxs3LXcD4KbW8Xejd1e3XXcTd153eHfTdwZXoLculzRXq5cel8+nK7epV33rFugS5yb4CLcY5zWX7tdNp8xnucSNlw5XcodHt0B35BvH6yd3LzciZ3y3k3cW14m7tVd0d6MQx3cdK2M3ubtf1zB3YXe+t6PH7deoNxDr7WvpZyLnUEcRipU0aYm+1md3U6uoxGu830cNy9fHgYCQICWjraekXoDJnXcPdyoXnnYN5VQbfOsIN1s8wXef15fXISfJ523XC7erlyV2DutuAL4AEACLgGIASqtWAAQAVgAO2CAAAABaAAAa2A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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function () {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function () {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function saveBomTable(output) {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
let val = '';
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
val += '✓';
|
|
}
|
|
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
|
|
val += node.firstChild.nodeValue;
|
|
} else {
|
|
val += node.nodeValue;
|
|
}
|
|
}
|
|
if (output == 'csv') {
|
|
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
|
|
if (isNumeric(val)) {
|
|
val = +val; // use number
|
|
} else {
|
|
val = `"${val}"`; // enclosed within double-quote
|
|
}
|
|
}
|
|
text += val;
|
|
if (cell != row.lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
|
|
if (output != 'clipboard') {
|
|
// To file: csv or txt
|
|
var blob = new Blob([text], {
|
|
type: `text/${output}`
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
|
|
} else {
|
|
// To clipboard
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
/* https://stackoverflow.com/a/175787 */
|
|
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function (s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
if (config.fields.includes("Value")) {
|
|
var index = config.fields.indexOf("Value");
|
|
pcbdata.bom["parsedValues"] = {};
|
|
for (var id in pcbdata.bom.fields) {
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
unit = unit[0];
|
|
} else {
|
|
ref = /^([a-z]+)\d+$/i.exec(ref);
|
|
if (ref) {
|
|
ref = ref[1].toLowerCase();
|
|
if (ref == "c") unit = 'f';
|
|
else if (ref == "l") unit = 'h';
|
|
else if (ref == "r" || ref == "rv") unit = 'r';
|
|
else unit = null;
|
|
}
|
|
}
|
|
return unit;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
var unit;
|
|
if (match) {
|
|
val = parseFloat(match[1]);
|
|
if (match[2]) {
|
|
val = val * units.getMultiplier(match[2]);
|
|
}
|
|
unit = inferUnit(match[3], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
match = units.valueAltRegex.exec(val);
|
|
if (match && (match[1] || match[4])) {
|
|
val = parseFloat(match[1] + "." + match[4]);
|
|
if (match[3]) {
|
|
val = val * units.getMultiplier(match[3]);
|
|
}
|
|
unit = inferUnit(match[2], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function (e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function resetSettings() {
|
|
if (!confirm(
|
|
`This will reset all checkbox states and other settings.\n\n` +
|
|
`Press OK if you want to continue.`)) {
|
|
return;
|
|
}
|
|
if (storage) {
|
|
var keys = [];
|
|
for (var i = 0; i < storage.length; i++) {
|
|
var key = storage.key(i);
|
|
if (key.startsWith(storagePrefix)) keys.push(key);
|
|
}
|
|
for (var key of keys) storage.removeItem(key);
|
|
}
|
|
location.reload();
|
|
}
|
|
|
|
function overwriteSettings(newSettings) {
|
|
initDone = false;
|
|
Object.assign(settings, newSettings);
|
|
writeStorage("bomlayout", settings.bomlayout);
|
|
writeStorage("bommode", settings.bommode);
|
|
writeStorage("canvaslayout", settings.canvaslayout);
|
|
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
|
|
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
|
|
for (var checkbox of settings.checkboxes) {
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
}
|
|
writeStorage("markWhenChecked", settings.markWhenChecked);
|
|
padsVisible(settings.renderPads);
|
|
document.getElementById("padsCheckbox").checked = settings.renderPads;
|
|
fabricationVisible(settings.renderFabrication);
|
|
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
|
|
silkscreenVisible(settings.renderSilkscreen);
|
|
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
|
|
referencesVisible(settings.renderReferences);
|
|
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
|
|
valuesVisible(settings.renderValues);
|
|
document.getElementById("valuesCheckbox").checked = settings.renderValues;
|
|
tracksVisible(settings.renderTracks);
|
|
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
|
|
zonesVisible(settings.renderZones);
|
|
document.getElementById("zonesCheckbox").checked = settings.renderZones;
|
|
dnpOutline(settings.renderDnpOutline);
|
|
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
|
|
setRedrawOnDrag(settings.redrawOnDrag);
|
|
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
setOffsetBackRotation(settings.offsetBackRotation);
|
|
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
function saveFile(filename, blob) {
|
|
var link = document.createElement("a");
|
|
var objurl = URL.createObjectURL(blob);
|
|
link.download = filename;
|
|
link.href = objurl;
|
|
link.click();
|
|
}
|
|
|
|
function dataURLtoBlob(dataurl) {
|
|
var arr = dataurl.split(','),
|
|
mime = arr[0].match(/:(.*?);/)[1],
|
|
bstr = atob(arr[1]),
|
|
n = bstr.length,
|
|
u8arr = new Uint8Array(n);
|
|
while (n--) {
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new Blob([u8arr], {
|
|
type: mime
|
|
});
|
|
}
|
|
|
|
var settings = {
|
|
canvaslayout: "FB",
|
|
bomlayout: "left-right",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: "none",
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
offsetBackRotation: false,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
netColors: {},
|
|
}
|
|
|
|
function initDefaults() {
|
|
settings.bomlayout = readStorage("bomlayout");
|
|
if (settings.bomlayout === null) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
settings.bommode = readStorage("bommode");
|
|
if (settings.bommode === null) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (settings.bommode == "netlist" && !pcbdata.nets) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
settings.canvaslayout = readStorage("canvaslayout");
|
|
if (settings.canvaslayout === null) {
|
|
settings.canvaslayout = config.layer_view;
|
|
}
|
|
var bomCheckboxes = readStorage("bomCheckboxes");
|
|
if (bomCheckboxes === null) {
|
|
bomCheckboxes = config.checkboxes;
|
|
}
|
|
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
|
|
document.getElementById("bomCheckboxes").value = bomCheckboxes;
|
|
|
|
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
|
|
if (highlightpin1 === "false") highlightpin1 = "none";
|
|
if (highlightpin1 === "true") highlightpin1 = "all";
|
|
setHighlightPin1(highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
|
|
|
|
settings.markWhenChecked = readStorage("markWhenChecked") || "";
|
|
populateMarkWhenCheckedOptions();
|
|
|
|
function initBooleanSetting(storageString, def, elementId, func) {
|
|
var b = readStorage(storageString);
|
|
if (b === null) {
|
|
b = def;
|
|
} else {
|
|
b = (b == "true");
|
|
}
|
|
document.getElementById(elementId).checked = b;
|
|
func(b);
|
|
}
|
|
|
|
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
|
|
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
|
|
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
|
|
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
|
|
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
|
|
if ("tracks" in pcbdata) {
|
|
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
|
|
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
|
|
} else {
|
|
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
|
|
tracksVisible(false);
|
|
zonesVisible(false);
|
|
}
|
|
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
|
|
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
|
|
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
|
|
var hcols = JSON.parse(readStorage("hiddenColumns"));
|
|
if (hcols === null) {
|
|
hcols = [];
|
|
}
|
|
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
|
|
|
|
var cord = JSON.parse(readStorage("columnOrder"));
|
|
if (cord === null) {
|
|
cord = fields;
|
|
} else {
|
|
cord = cord.filter(e => fields.includes(e));
|
|
if (cord.length != fields.length)
|
|
cord = fields;
|
|
}
|
|
settings.columnOrder = cord;
|
|
|
|
settings.boardRotation = readStorage("boardRotation");
|
|
if (settings.boardRotation === null) {
|
|
settings.boardRotation = config.board_rotation * 5;
|
|
} else {
|
|
settings.boardRotation = parseInt(settings.boardRotation);
|
|
}
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
|
|
|
|
settings.netColors = JSON.parse(readStorage("netColors")) || {};
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function () {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function (eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function (eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for (callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawText(ctx, text, color) {
|
|
if ("ref" in text && !settings.renderReferences) return;
|
|
if ("val" in text && !settings.renderValues) return;
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.lineWidth = text.thickness;
|
|
if ("svgpath" in text) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
if ("polygons" in text) {
|
|
ctx.fill(getPolygonsPath(text));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (config.kicad_text_formatting) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
offsety += interline;
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
if ("svgpath" in edge) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
if (edge.type == "rect") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(edge.start[0], edge.end[1]);
|
|
ctx.lineTo(...edge.end);
|
|
ctx.lineTo(edge.end[0], edge.start[1]);
|
|
ctx.lineTo(...edge.start);
|
|
}
|
|
if (edge.type == "arc") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
deg2rad(edge.startangle),
|
|
deg2rad(edge.endangle));
|
|
}
|
|
if (edge.type == "circle") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
0, 2 * Math.PI);
|
|
ctx.closePath();
|
|
}
|
|
if (edge.type == "curve") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
|
|
}
|
|
if("filled" in edge && edge.filled)
|
|
ctx.fill();
|
|
else
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
|
|
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
|
|
var path = new Path2D();
|
|
var width = size[0];
|
|
var height = size[1];
|
|
var x = width * -0.5;
|
|
var y = height * -0.5;
|
|
var chamfOffset = Math.min(width, height) * chamfratio;
|
|
path.moveTo(x, 0);
|
|
if (chamfpos & 4) {
|
|
path.lineTo(x, y + height - chamfOffset);
|
|
path.lineTo(x + chamfOffset, y + height);
|
|
path.lineTo(0, y + height);
|
|
} else {
|
|
path.arcTo(x, y + height, x + width, y + height, radius);
|
|
}
|
|
if (chamfpos & 8) {
|
|
path.lineTo(x + width - chamfOffset, y + height);
|
|
path.lineTo(x + width, y + height - chamfOffset);
|
|
path.lineTo(x + width, 0);
|
|
} else {
|
|
path.arcTo(x + width, y + height, x + width, y, radius);
|
|
}
|
|
if (chamfpos & 2) {
|
|
path.lineTo(x + width, y + chamfOffset);
|
|
path.lineTo(x + width - chamfOffset, y);
|
|
path.lineTo(0, y);
|
|
} else {
|
|
path.arcTo(x + width, y, x, y, radius);
|
|
}
|
|
if (chamfpos & 1) {
|
|
path.lineTo(x + chamfOffset, y);
|
|
path.lineTo(x, y + chamfOffset);
|
|
path.lineTo(x, 0);
|
|
} else {
|
|
path.arcTo(x, y, x, y + height, radius);
|
|
}
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getOblongPath(size) {
|
|
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
|
|
}
|
|
|
|
function getPolygonsPath(shape) {
|
|
if (shape.path2d) {
|
|
return shape.path2d;
|
|
}
|
|
if ("svgpath" in shape) {
|
|
shape.path2d = new Path2D(shape.svgpath);
|
|
} else {
|
|
var path = new Path2D();
|
|
for (var polygon of shape.polygons) {
|
|
path.moveTo(...polygon[0]);
|
|
for (var i = 1; i < polygon.length; i++) {
|
|
path.lineTo(...polygon[i]);
|
|
}
|
|
path.closePath();
|
|
}
|
|
shape.path2d = path;
|
|
}
|
|
return shape.path2d;
|
|
}
|
|
|
|
function drawPolygonShape(ctx, scalefactor, shape, color) {
|
|
ctx.save();
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
if("filled" in shape && !shape.filled) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.stroke(getPolygonsPath(shape));
|
|
} else {
|
|
ctx.fillStyle = color;
|
|
ctx.fill(getPolygonsPath(shape));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, drawing, color);
|
|
} else {
|
|
drawText(ctx, drawing, color);
|
|
}
|
|
}
|
|
|
|
function getCirclePath(radius) {
|
|
var path = new Path2D();
|
|
path.arc(0, 0, radius, 0, 2 * Math.PI);
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getCachedPadPath(pad) {
|
|
if (!pad.path2d) {
|
|
// if path2d is not set, build one and cache it on pad object
|
|
if (pad.shape == "rect") {
|
|
pad.path2d = new Path2D();
|
|
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
|
|
} else if (pad.shape == "oval") {
|
|
pad.path2d = getOblongPath(pad.size);
|
|
} else if (pad.shape == "circle") {
|
|
pad.path2d = getCirclePath(pad.size[0] / 2);
|
|
} else if (pad.shape == "roundrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
|
|
} else if (pad.shape == "chamfrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
|
|
} else if (pad.shape == "custom") {
|
|
pad.path2d = getPolygonsPath(pad);
|
|
}
|
|
}
|
|
return pad.path2d;
|
|
}
|
|
|
|
function drawPad(ctx, pad, color, outline) {
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
if (pad.offset) {
|
|
ctx.translate(...pad.offset);
|
|
}
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
var path = getCachedPadPath(pad);
|
|
if (outline) {
|
|
ctx.stroke(path);
|
|
} else {
|
|
ctx.fill(path);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawPadHole(ctx, pad, padHoleColor) {
|
|
if (pad.type != "th") return;
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
ctx.fillStyle = padHoleColor;
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (footprint.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...footprint.bbox.pos);
|
|
ctx.rotate(deg2rad(-footprint.bbox.angle));
|
|
ctx.translate(...footprint.bbox.relpos);
|
|
ctx.fillStyle = colors.pad;
|
|
ctx.fillRect(0, 0, ...footprint.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = colors.pad;
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
ctx.strokeRect(0, 0, ...footprint.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of footprint.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
|
|
}
|
|
}
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, colors.pad, outline);
|
|
if (pad.pin1 &&
|
|
(settings.highlightpin1 == "all" ||
|
|
settings.highlightpin1 == "selected" && highlight)) {
|
|
drawPad(ctx, pad, colors.outline, true);
|
|
}
|
|
}
|
|
}
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, colors.padHole);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawDrawing(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawFootprints(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
|
|
var colors = {
|
|
pad: style.getPropertyValue('--pad-color'),
|
|
padHole: style.getPropertyValue('--pad-hole-color'),
|
|
outline: style.getPropertyValue('--pin1-outline-color'),
|
|
}
|
|
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var mod = pcbdata.footprints[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
var h = highlightedFootprints.includes(i);
|
|
var d = markedFootprints.has(i);
|
|
if (highlight) {
|
|
if(h && d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
|
|
} else if (h) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
} else if (d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
|
|
}
|
|
}
|
|
if( h || d || !highlight) {
|
|
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata.drawings[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, d, polygonColor);
|
|
} else {
|
|
drawText(ctx, d, textColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawTracks(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineCap = "round";
|
|
|
|
var hasHole = (track) => (
|
|
'drillsize' in track &&
|
|
track.start[0] == track.end[0] &&
|
|
track.start[1] == track.end[1]);
|
|
|
|
// First draw tracks and tented vias
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (!hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
if ('radius' in track) {
|
|
ctx.arc(
|
|
...track.center,
|
|
track.radius,
|
|
deg2rad(track.startangle),
|
|
deg2rad(track.endangle));
|
|
} else {
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
// Second pass to draw untented vias
|
|
var style = getComputedStyle(topmostdiv);
|
|
var holeColor = style.getPropertyValue('--pad-hole-color')
|
|
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
ctx.strokeStyle = holeColor;
|
|
ctx.lineWidth = track.drillsize;
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
|
|
if (zone.width > 0) {
|
|
ctx.lineWidth = zone.width;
|
|
ctx.stroke(zone.path2d);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clearCanvas(canvas, color = null) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
if (color) {
|
|
ctx.fillStyle = color;
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
} else {
|
|
if (!window.matchMedia("print").matches)
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
if (highlightedNet !== null) {
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
drawFootprints(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer === "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox, flip) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var flip = (layerdict.layer === "B");
|
|
var bbox = applyRotation(pcbdata.edges_bbox, flip);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function modulo(n, mod) {
|
|
return ((n % mod) + mod) % mod;
|
|
}
|
|
|
|
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
|
|
var dx = x - xc;
|
|
var dy = y - yc;
|
|
var r_sq = dx * dx + dy * dy;
|
|
var rmin = Math.max(0, radius - d);
|
|
var rmax = radius + d;
|
|
|
|
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
|
|
return false;
|
|
|
|
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
|
|
var dx1 = xc + radius * Math.cos(angle1) - x;
|
|
var dy1 = yc + radius * Math.sin(angle1) - y;
|
|
if (dx1 * dx1 + dy1 * dy1 <= d * d)
|
|
return true;
|
|
|
|
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
|
|
var dx2 = xc + radius * Math.cos(angle2) - x;
|
|
var dy2 = yc + radius * Math.sin(angle2) - y;
|
|
if (dx2 * dx2 + dy2 * dy2 <= d * d)
|
|
return true;
|
|
|
|
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
|
|
if (angle1 > angle2)
|
|
return (angle >= angle2 || angle <= angle1);
|
|
else
|
|
return (angle >= angle1 && angle <= angle2);
|
|
}
|
|
|
|
function pointWithinPad(x, y, pad) {
|
|
var v = [x - pad.pos[0], y - pad.pos[1]];
|
|
v = rotateVector(v, pad.angle);
|
|
if (pad.offset) {
|
|
v[0] -= pad.offset[0];
|
|
v[1] -= pad.offset[1];
|
|
}
|
|
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
|
|
}
|
|
|
|
function netHitScan(layer, x, y) {
|
|
// Check track segments
|
|
if (settings.renderTracks && pcbdata.tracks) {
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if ('radius' in track) {
|
|
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
} else {
|
|
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var footprint of pcbdata.footprints) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinFootprintBbox(x, y, bbox) {
|
|
var v = [x - bbox.pos[0], y - bbox.pos[1]];
|
|
v = rotateVector(v, bbox.angle);
|
|
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
|
|
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
|
|
}
|
|
|
|
function bboxHitScan(layer, x, y) {
|
|
var result = [];
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var footprint = pcbdata.footprints[i];
|
|
if (footprint.layer == layer) {
|
|
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0 && e.button != 1) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
layerdict.pointerStates[e.pointerId] = {
|
|
distanceTravelled: 0,
|
|
lastX: e.offsetX,
|
|
lastY: e.offsetY,
|
|
downTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
function handleMouseClick(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var x = e.offsetX;
|
|
var y = e.offsetY;
|
|
var t = layerdict.transform;
|
|
var flip = layerdict.layer === "B";
|
|
if (flip) {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
|
|
} else {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
|
|
}
|
|
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
|
|
var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var footprints = bboxHitScan(layerdict.layer, ...v);
|
|
if (footprints.length > 0) {
|
|
footprintsClicked(footprints);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handlePointerLeave(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function resetTransform(layerdict) {
|
|
layerdict.transform.panx = 0;
|
|
layerdict.transform.pany = 0;
|
|
layerdict.transform.zoom = 1;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function handlePointerUp(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (e.button == 2) {
|
|
// Reset pan and zoom on right click.
|
|
resetTransform(layerdict);
|
|
layerdict.anotherPointerTapped = false;
|
|
return;
|
|
}
|
|
|
|
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
|
|
var ptr = layerdict.pointerStates[e.pointerId];
|
|
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
|
|
|
|
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
if (layerdict.anotherPointerTapped) {
|
|
// This is the second pointer coming off of a two-finger tap
|
|
resetTransform(layerdict);
|
|
} else {
|
|
// This is just a regular tap
|
|
handleMouseClick(e, layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
} else {
|
|
// This is the first finger coming off of what could become a two-finger tap
|
|
layerdict.anotherPointerTapped = true;
|
|
}
|
|
} else {
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function handlePointerMove(e, layerdict) {
|
|
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var thisPtr = layerdict.pointerStates[e.pointerId];
|
|
|
|
var dx = e.offsetX - thisPtr.lastX;
|
|
var dy = e.offsetY - thisPtr.lastY;
|
|
|
|
// If this number is low on pointer up, we count the action as a click
|
|
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
|
|
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
// This is a simple drag
|
|
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
|
|
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
|
|
} else if (Object.keys(layerdict.pointerStates).length == 2) {
|
|
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
|
|
|
|
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
|
|
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
|
|
|
|
var scaleFactor = newDist / oldDist;
|
|
|
|
if (scaleFactor != NaN) {
|
|
layerdict.transform.zoom *= scaleFactor;
|
|
|
|
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
|
|
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
|
|
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
|
|
}
|
|
}
|
|
|
|
thisPtr.lastX = e.offsetX;
|
|
thisPtr.lastY = e.offsetY;
|
|
|
|
if (settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
}
|
|
|
|
function handleMouseWheel(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var t = layerdict.transform;
|
|
var wheeldelta = e.deltaY;
|
|
if (e.deltaMode == 1) {
|
|
// FF only, scroll by lines
|
|
wheeldelta *= 30;
|
|
} else if (e.deltaMode == 2) {
|
|
wheeldelta *= 300;
|
|
}
|
|
var m = Math.pow(1.1, -wheeldelta / 40);
|
|
// Limit amount of zoom per tick.
|
|
if (m > 2) {
|
|
m = 2;
|
|
} else if (m < 0.5) {
|
|
m = 0.5;
|
|
}
|
|
t.zoom *= m;
|
|
var zoomd = (1 - m) / t.zoom;
|
|
t.panx += devicePixelRatio * e.offsetX * zoomd;
|
|
t.pany += devicePixelRatio * e.offsetY * zoomd;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function addMouseHandlers(div, layerdict) {
|
|
div.addEventListener("pointerdown", function(e) {
|
|
handlePointerDown(e, layerdict);
|
|
});
|
|
div.addEventListener("pointermove", function(e) {
|
|
handlePointerMove(e, layerdict);
|
|
});
|
|
div.addEventListener("pointerup", function(e) {
|
|
handlePointerUp(e, layerdict);
|
|
});
|
|
var pointerleave = function(e) {
|
|
handlePointerLeave(e, layerdict);
|
|
}
|
|
div.addEventListener("pointercancel", pointerleave);
|
|
div.addEventListener("pointerleave", pointerleave);
|
|
div.addEventListener("pointerout", pointerleave);
|
|
|
|
div.onwheel = function(e) {
|
|
handleMouseWheel(e, layerdict);
|
|
}
|
|
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
|
|
element.addEventListener("contextmenu", function(e) {
|
|
e.preventDefault();
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function setRedrawOnDrag(value) {
|
|
settings.redrawOnDrag = value;
|
|
writeStorage("redrawOnDrag", value);
|
|
}
|
|
|
|
function setBoardRotation(value) {
|
|
settings.boardRotation = value * 5;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
resizeAll();
|
|
}
|
|
|
|
function setOffsetBackRotation(value) {
|
|
settings.offsetBackRotation = value;
|
|
writeStorage("offsetBackRotation", value);
|
|
resizeAll();
|
|
}
|
|
|
|
function initRender() {
|
|
allcanvas = {
|
|
front: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("F_bg"),
|
|
fab: document.getElementById("F_fab"),
|
|
silk: document.getElementById("F_slk"),
|
|
highlight: document.getElementById("F_hl"),
|
|
layer: "F",
|
|
},
|
|
back: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("B_bg"),
|
|
fab: document.getElementById("B_fab"),
|
|
silk: document.getElementById("B_slk"),
|
|
highlight: document.getElementById("B_hl"),
|
|
layer: "B",
|
|
}
|
|
};
|
|
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
|
|
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*
|
|
* Table reordering via Drag'n'Drop
|
|
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
|
|
*/
|
|
|
|
function setBomHandlers() {
|
|
|
|
const bom = document.getElementById('bomtable');
|
|
|
|
let dragName;
|
|
let placeHolderElements;
|
|
let draggingElement;
|
|
let forcePopulation;
|
|
let xOffset;
|
|
let yOffset;
|
|
let wasDragged;
|
|
|
|
const mouseUpHandler = function(e) {
|
|
// Delete dragging element
|
|
draggingElement.remove();
|
|
|
|
// Make BOM selectable again
|
|
bom.style.removeProperty("userSelect");
|
|
|
|
// Remove listeners
|
|
document.removeEventListener('mousemove', mouseMoveHandler);
|
|
document.removeEventListener('mouseup', mouseUpHandler);
|
|
|
|
if (wasDragged) {
|
|
// Redraw whole BOM
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
const mouseMoveHandler = function(e) {
|
|
// Notice the dragging
|
|
wasDragged = true;
|
|
|
|
// Make the dragged element visible
|
|
draggingElement.style.removeProperty("display");
|
|
|
|
// Set elements position to mouse position
|
|
draggingElement.style.left = `${e.screenX - xOffset}px`;
|
|
draggingElement.style.top = `${e.screenY - yOffset}px`;
|
|
|
|
// Forced redrawing of BOM table
|
|
if (forcePopulation) {
|
|
forcePopulation = false;
|
|
// Copy array
|
|
phe = Array.from(placeHolderElements);
|
|
// populate BOM table again
|
|
populateBomHeader(dragName, phe);
|
|
populateBomBody(dragName, phe);
|
|
}
|
|
|
|
// Set up array of hidden columns
|
|
var hiddenColumns = Array.from(settings.hiddenColumns);
|
|
// In the ungrouped mode, quantity don't exist
|
|
if (settings.bommode === "ungrouped")
|
|
hiddenColumns.push("Quantity");
|
|
// If no checkbox fields can be found, we consider them hidden
|
|
if (settings.checkboxes.length == 0)
|
|
hiddenColumns.push("checkboxes");
|
|
|
|
// Get table headers and group them into checkboxes, extrafields and normal headers
|
|
const bh = document.getElementById("bomhead");
|
|
headers = Array.from(bh.querySelectorAll("th"))
|
|
headers.shift() // numCol is not part of the columnOrder
|
|
headerGroups = []
|
|
lastCompoundClass = null;
|
|
for (i = 0; i < settings.columnOrder.length; i++) {
|
|
cElem = settings.columnOrder[i];
|
|
if (hiddenColumns.includes(cElem)) {
|
|
// Hidden columns appear as a dummy element
|
|
headerGroups.push([]);
|
|
continue;
|
|
}
|
|
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
|
|
if (elem.classList.contains("bom-checkbox")) {
|
|
if (lastCompoundClass === "bom-checkbox") {
|
|
cbGroup = headerGroups.pop();
|
|
cbGroup.push(elem);
|
|
headerGroups.push(cbGroup);
|
|
} else {
|
|
lastCompoundClass = "bom-checkbox";
|
|
headerGroups.push([elem])
|
|
}
|
|
} else {
|
|
headerGroups.push([elem])
|
|
}
|
|
}
|
|
|
|
// Copy settings.columnOrder
|
|
var columns = Array.from(settings.columnOrder)
|
|
|
|
// Set up array with indices of hidden columns
|
|
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
|
|
var dragIndex = columns.indexOf(dragName);
|
|
var swapIndex = dragIndex;
|
|
var swapDone = false;
|
|
|
|
// Check if the current dragged element is swapable with the left or right element
|
|
if (dragIndex > 0) {
|
|
// Get left headers boundingbox
|
|
swapIndex = dragIndex - 1;
|
|
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
|
|
swapIndex--;
|
|
if (!hiddenIndices.includes(swapIndex)) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
|
|
// Get right headers boundingbox
|
|
swapIndex = dragIndex + 1;
|
|
while (hiddenIndices.includes(swapIndex))
|
|
swapIndex++;
|
|
if (swapIndex < headerGroups.length) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Write back change to storage
|
|
if (swapDone) {
|
|
settings.columnOrder = columns
|
|
writeStorage("columnOrder", JSON.stringify(columns));
|
|
}
|
|
|
|
}
|
|
|
|
const mouseDownHandler = function(e) {
|
|
var target = e.target;
|
|
if (target.tagName.toLowerCase() != "td")
|
|
target = target.parentElement;
|
|
|
|
// Used to check if a dragging has ever happened
|
|
wasDragged = false;
|
|
|
|
// Create new element which will be displayed as the dragged column
|
|
draggingElement = document.createElement("div")
|
|
draggingElement.classList.add("dragging");
|
|
draggingElement.style.display = "none";
|
|
draggingElement.style.position = "absolute";
|
|
draggingElement.style.overflow = "hidden";
|
|
|
|
// Get bomhead and bombody elements
|
|
const bh = document.getElementById("bomhead");
|
|
const bb = document.getElementById("bombody");
|
|
|
|
// Get all compound headers for the current column
|
|
var compoundHeaders;
|
|
if (target.classList.contains("bom-checkbox")) {
|
|
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
|
|
} else {
|
|
compoundHeaders = [target];
|
|
}
|
|
|
|
// Create new table which will display the column
|
|
var newTable = document.createElement("table");
|
|
newTable.classList.add("bom");
|
|
newTable.style.background = "white";
|
|
draggingElement.append(newTable);
|
|
|
|
// Create new header element
|
|
var newHeader = document.createElement("thead");
|
|
newTable.append(newHeader);
|
|
|
|
// Set up array for storing all placeholder elements
|
|
placeHolderElements = [];
|
|
|
|
// Add all compound headers to the new thead element and placeholders
|
|
compoundHeaders.forEach(function(h) {
|
|
clone = cloneElementWithDimensions(h);
|
|
newHeader.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
|
|
// Create new body element
|
|
var newBody = document.createElement("tbody");
|
|
newTable.append(newBody);
|
|
|
|
// Get indices for compound headers
|
|
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
|
|
|
|
// For each row in the BOM body...
|
|
var rows = bb.querySelectorAll("tr");
|
|
rows.forEach(function(row) {
|
|
// ..get the cells for the compound column
|
|
const tds = row.querySelectorAll("td");
|
|
var copytds = idxs.map(i => tds[i]);
|
|
// Add them to the new element and the placeholders
|
|
var newRow = document.createElement("tr");
|
|
copytds.forEach(function(td) {
|
|
clone = cloneElementWithDimensions(td);
|
|
newRow.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
newBody.append(newRow);
|
|
});
|
|
|
|
// Compute width for compound header
|
|
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
|
|
draggingElement.style.width = `${width}px`;
|
|
|
|
// Insert the new dragging element and disable selection on BOM
|
|
bom.insertBefore(draggingElement, null);
|
|
bom.style.userSelect = "none";
|
|
|
|
// Determine the mouse position offset
|
|
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
|
|
yOffset = e.screenY - compoundHeaders[0].offsetTop;
|
|
|
|
// Get name for the column in settings.columnOrder
|
|
dragName = getColumnOrderName(target);
|
|
|
|
// Change text and class for placeholder elements
|
|
placeHolderElements = placeHolderElements.map(function(e) {
|
|
newElem = cloneElementWithDimensions(e);
|
|
newElem.textContent = "";
|
|
newElem.classList.add("placeholder");
|
|
return newElem;
|
|
});
|
|
|
|
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
|
|
forcePopulation = true;
|
|
|
|
// Add listeners for move and up on mouse
|
|
document.addEventListener('mousemove', mouseMoveHandler);
|
|
document.addEventListener('mouseup', mouseUpHandler);
|
|
}
|
|
|
|
// In netlist mode, there is nothing to reorder
|
|
if (settings.bommode === "netlist")
|
|
return;
|
|
|
|
// Add mouseDownHandler to every column except the numCol
|
|
bom.querySelectorAll("th")
|
|
.forEach(function(head) {
|
|
if (!head.classList.contains("numCol")) {
|
|
head.onmousedown = mouseDownHandler;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function getBoundingClientRectFromMultiple(elements) {
|
|
var elems = Array.from(elements);
|
|
|
|
if (elems.length == 0)
|
|
return null;
|
|
|
|
var box = elems.shift()
|
|
.getBoundingClientRect();
|
|
|
|
elems.forEach(function(elem) {
|
|
var elembox = elem.getBoundingClientRect();
|
|
box.left = Math.min(elembox.left, box.left);
|
|
box.top = Math.min(elembox.top, box.top);
|
|
box.width += elembox.width;
|
|
box.height = Math.max(elembox.height, box.height);
|
|
});
|
|
|
|
return box;
|
|
}
|
|
|
|
function cloneElementWithDimensions(elem) {
|
|
var newElem = elem.cloneNode(true);
|
|
newElem.style.height = window.getComputedStyle(elem).height;
|
|
newElem.style.width = window.getComputedStyle(elem).width;
|
|
return newElem;
|
|
}
|
|
|
|
function getBomTableHeaderIndex(elem) {
|
|
const bh = document.getElementById('bomhead');
|
|
const ths = Array.from(bh.querySelectorAll("th"));
|
|
return ths.indexOf(elem);
|
|
}
|
|
|
|
function getColumnOrderName(elem) {
|
|
var cname = elem.getAttribute("col_name");
|
|
if (cname === "bom-checkbox")
|
|
return "checkboxes";
|
|
else
|
|
return cname;
|
|
}
|
|
|
|
function resizableGrid(tablehead) {
|
|
var cols = tablehead.firstElementChild.children;
|
|
var rowWidth = tablehead.offsetWidth;
|
|
|
|
for (var i = 1; i < cols.length; i++) {
|
|
if (cols[i].classList.contains("bom-checkbox"))
|
|
continue;
|
|
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
|
|
}
|
|
|
|
for (var i = 1; i < cols.length - 1; i++) {
|
|
var div = document.createElement('div');
|
|
div.className = "column-width-handle";
|
|
cols[i].appendChild(div);
|
|
setListeners(div);
|
|
}
|
|
|
|
function setListeners(div) {
|
|
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
|
|
|
|
div.addEventListener('mousedown', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
curCol = e.target.parentElement;
|
|
nxtCol = curCol.nextElementSibling;
|
|
startX = e.pageX;
|
|
|
|
var padding = paddingDiff(curCol);
|
|
|
|
rowWidth = curCol.parentElement.offsetWidth;
|
|
curColWidth = curCol.clientWidth - padding;
|
|
nxtColWidth = nxtCol.clientWidth - padding;
|
|
});
|
|
|
|
document.addEventListener('mousemove', function(e) {
|
|
if (startX) {
|
|
var diffX = e.pageX - startX;
|
|
diffX = -Math.min(-diffX, curColWidth - 20);
|
|
diffX = Math.min(diffX, nxtColWidth - 20);
|
|
|
|
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
|
|
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
|
|
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
curCol = undefined;
|
|
nxtCol = undefined;
|
|
startX = undefined;
|
|
nxtColWidth = undefined;
|
|
curColWidth = undefined
|
|
});
|
|
}
|
|
|
|
function paddingDiff(col) {
|
|
|
|
if (getStyleVal(col, 'box-sizing') == 'border-box') {
|
|
return 0;
|
|
}
|
|
|
|
var padLeft = getStyleVal(col, 'padding-left');
|
|
var padRight = getStyleVal(col, 'padding-right');
|
|
return (parseInt(padLeft) + parseInt(padRight));
|
|
|
|
}
|
|
|
|
function getStyleVal(elm, css) {
|
|
return (window.getComputedStyle(elm, null).getPropertyValue(css))
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var markedFootprints = new Set();
|
|
var highlightedFootprints = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
function setShowBOMColumn(field, value) {
|
|
if (field === "references") {
|
|
var rl = document.getElementById("reflookup");
|
|
rl.disabled = !value;
|
|
if (!value) {
|
|
rl.value = "";
|
|
updateRefLookup("");
|
|
}
|
|
}
|
|
|
|
var n = settings.hiddenColumns.indexOf(field);
|
|
if (value) {
|
|
if (n != -1) {
|
|
settings.hiddenColumns.splice(n, 1);
|
|
}
|
|
} else {
|
|
if (n == -1) {
|
|
settings.hiddenColumns.push(field);
|
|
}
|
|
}
|
|
|
|
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
|
|
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
|
|
function setFullscreen(value) {
|
|
if (value) {
|
|
document.documentElement.requestFullscreen();
|
|
} else {
|
|
document.exitFullscreen();
|
|
}
|
|
}
|
|
|
|
function fabricationVisible(value) {
|
|
writeStorage("fabricationVisible", value);
|
|
settings.renderFabrication = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function silkscreenVisible(value) {
|
|
writeStorage("silkscreenVisible", value);
|
|
settings.renderSilkscreen = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightPin1(value) {
|
|
writeStorage("highlightpin1", value);
|
|
settings.highlightpin1 = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function getStoredCheckboxRefs(checkbox) {
|
|
function convert(ref) {
|
|
var intref = parseInt(ref);
|
|
if (isNaN(intref)) {
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.footprints[i].ref == ref) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
} else {
|
|
return intref;
|
|
}
|
|
}
|
|
if (!(checkbox in settings.checkboxStoredRefs)) {
|
|
var val = readStorage("checkbox_" + checkbox);
|
|
settings.checkboxStoredRefs[checkbox] = val ? val : "";
|
|
}
|
|
if (!settings.checkboxStoredRefs[checkbox]) {
|
|
return new Set();
|
|
} else {
|
|
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
|
|
}
|
|
}
|
|
|
|
function getCheckboxState(checkbox, references) {
|
|
var storedRefsSet = getStoredCheckboxRefs(checkbox);
|
|
var currentRefsSet = new Set(references.map(r => r[1]));
|
|
// Get difference of current - stored
|
|
var difference = new Set(currentRefsSet);
|
|
for (ref of storedRefsSet) {
|
|
difference.delete(ref);
|
|
}
|
|
if (difference.size == 0) {
|
|
// All the current refs are stored
|
|
return "checked";
|
|
} else if (difference.size == currentRefsSet.size) {
|
|
// None of the current refs are stored
|
|
return "unchecked";
|
|
} else {
|
|
// Some of the refs are stored
|
|
return "indeterminate";
|
|
}
|
|
}
|
|
|
|
function setBomCheckboxState(checkbox, element, references) {
|
|
var state = getCheckboxState(checkbox, references);
|
|
element.checked = (state == "checked");
|
|
element.indeterminate = (state == "indeterminate");
|
|
}
|
|
|
|
function createCheckboxChangeHandler(checkbox, references, row) {
|
|
return function () {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (this.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.add("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.add(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'checked';
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.remove("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.delete(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'unchecked';
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
|
|
}
|
|
}
|
|
|
|
function clearHighlightedFootprints() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedFootprints = [];
|
|
highlightedNet = null;
|
|
}
|
|
}
|
|
|
|
function createRowHighlightHandler(rowid, refs, net) {
|
|
return function () {
|
|
if (currentHighlightedRowId) {
|
|
if (currentHighlightedRowId == rowid) {
|
|
return;
|
|
}
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
}
|
|
document.getElementById(rowid).classList.add("highlighted");
|
|
currentHighlightedRowId = rowid;
|
|
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
function updateNetColors() {
|
|
writeStorage("netColors", JSON.stringify(settings.netColors));
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function netColorChangeHandler(net) {
|
|
return (event) => {
|
|
settings.netColors[net] = event.target.value;
|
|
updateNetColors();
|
|
}
|
|
}
|
|
|
|
function netColorRightClick(net) {
|
|
return (event) => {
|
|
if (event.button == 2) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
event.target.value = defaultNetColor;
|
|
delete settings.netColors[net];
|
|
updateNetColors();
|
|
}
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
if (!settings.hiddenColumns.includes("references")) {
|
|
for (var ref of entry) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// check fields
|
|
for (var i in config.fields) {
|
|
var f = config.fields[i];
|
|
if (!settings.hiddenColumns.includes(f)) {
|
|
for (var ref of entry) {
|
|
if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry.filter(r => r[0].toLowerCase() == reflookup);
|
|
}
|
|
|
|
function highlightFilter(s) {
|
|
if (!filter) {
|
|
return s;
|
|
}
|
|
var parts = s.toLowerCase().split(filter);
|
|
if (parts.length == 1) {
|
|
return s;
|
|
}
|
|
var r = "";
|
|
var pos = 0;
|
|
for (var i in parts) {
|
|
if (i > 0) {
|
|
r += '<mark class="highlight">' +
|
|
s.substring(pos, pos + filter.length) +
|
|
'</mark>';
|
|
pos += filter.length;
|
|
}
|
|
r += s.substring(pos, pos + parts[i].length);
|
|
pos += parts[i].length;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function checkboxSetUnsetAllHandler(checkboxname) {
|
|
return function () {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var allset = true;
|
|
var checkbox;
|
|
var row;
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
if (!checkbox.checked || checkbox.indeterminate) {
|
|
allset = false;
|
|
break;
|
|
}
|
|
}
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = !allset;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
}
|
|
}
|
|
|
|
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
if (is_checkbox)
|
|
th.setAttribute("col_name", "bom-checkbox");
|
|
else
|
|
th.setAttribute("col_name", name);
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
var spacer = document.createElement("div");
|
|
spacer.className = "column-spacer";
|
|
th.appendChild(spacer);
|
|
spacer.onclick = function () {
|
|
if (currentSortColumn && th !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && th === currentSortColumn) {
|
|
// Already sorted by this column
|
|
if (currentSortOrder == "asc") {
|
|
// Sort by this column, descending order
|
|
bomSortFunction = function (a, b) {
|
|
return -comparator(a, b);
|
|
}
|
|
currentSortColumn.childNodes[1].classList.remove("asc");
|
|
currentSortColumn.childNodes[1].classList.add("desc");
|
|
currentSortOrder = "desc";
|
|
} else {
|
|
// Unsort
|
|
bomSortFunction = null;
|
|
currentSortColumn.childNodes[1].classList.remove("desc");
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
} else {
|
|
// Sort by this column, ascending order
|
|
bomSortFunction = comparator;
|
|
currentSortColumn = th;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
if (is_checkbox) {
|
|
spacer.onclick = fancyDblClickHandler(
|
|
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
|
|
var vismenu = document.createElement("div");
|
|
vismenu.id = "vismenu";
|
|
vismenu.classList.add("menu");
|
|
|
|
var visbutton = document.createElement("div");
|
|
visbutton.classList.add("visbtn");
|
|
visbutton.classList.add("hideonprint");
|
|
|
|
var viscontent = document.createElement("div");
|
|
viscontent.classList.add("menu-content");
|
|
viscontent.id = "vismenu-content";
|
|
|
|
settings.columnOrder.forEach(column => {
|
|
if (typeof column !== "string")
|
|
return;
|
|
|
|
// Skip empty columns
|
|
if (column === "checkboxes" && settings.checkboxes.length == 0)
|
|
return;
|
|
else if (column === "Quantity" && settings.bommode == "ungrouped")
|
|
return;
|
|
|
|
var label = document.createElement("label");
|
|
label.classList.add("menu-label");
|
|
|
|
var input = document.createElement("input");
|
|
input.classList.add("visibility_checkbox");
|
|
input.type = "checkbox";
|
|
input.onchange = function (e) {
|
|
setShowBOMColumn(column, e.target.checked)
|
|
};
|
|
input.checked = !(settings.hiddenColumns.includes(column));
|
|
|
|
label.appendChild(input);
|
|
if (column.length > 0)
|
|
label.append(column[0].toUpperCase() + column.slice(1));
|
|
|
|
viscontent.appendChild(label);
|
|
});
|
|
|
|
viscontent.childNodes[0].classList.add("menu-label-top");
|
|
|
|
vismenu.appendChild(visbutton);
|
|
if (settings.bommode != "netlist") {
|
|
vismenu.appendChild(viscontent);
|
|
th.appendChild(vismenu);
|
|
}
|
|
tr.appendChild(th);
|
|
|
|
var checkboxCompareClosure = function (checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a);
|
|
var stateB = getCheckboxState(checkbox, b);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
var stringFieldCompareClosure = function (fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
|
|
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
|
|
var compareRefs = (a, b) => {
|
|
var ra = referenceRegex.exec(a);
|
|
var rb = referenceRegex.exec(b);
|
|
if (ra === null || rb === null) {
|
|
if (a != b) return a > b ? 1 : -1;
|
|
return 0;
|
|
} else {
|
|
if (ra.groups.prefix != rb.groups.prefix) {
|
|
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
|
|
}
|
|
if (ra.groups.number != rb.groups.number) {
|
|
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
if (settings.bommode == "netlist") {
|
|
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
}));
|
|
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
|
|
return 0;
|
|
}));
|
|
} else {
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
var valueIndex = config.fields.indexOf("Value");
|
|
var footprintIndex = config.fields.indexOf("Footprint");
|
|
columns.forEach((column) => {
|
|
if (column === placeHolderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
|
|
tr.appendChild(th);
|
|
}
|
|
} else if (column === "References") {
|
|
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
|
|
var i = 0;
|
|
while (i < a.length && i < b.length) {
|
|
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
|
|
i++;
|
|
}
|
|
return a.length - b.length;
|
|
}));
|
|
} else if (column === "Value") {
|
|
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
|
|
var ra = a[0][1], rb = b[0][1];
|
|
return valueCompare(
|
|
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
|
|
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
|
|
}));
|
|
return;
|
|
} else if (column === "Footprint") {
|
|
tr.appendChild(createColumnHeader(
|
|
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
|
|
return a.length - b.length;
|
|
}));
|
|
} else {
|
|
// Other fields
|
|
var i = config.fields.indexOf(column);
|
|
if (i < 0)
|
|
return;
|
|
tr.appendChild(createColumnHeader(
|
|
column, `field${i + 1}`, stringFieldCompareClosure(i)));
|
|
}
|
|
});
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
|
|
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
if (settings.bommode == "netlist") {
|
|
bomtable = pcbdata.nets.slice();
|
|
} else {
|
|
switch (settings.canvaslayout) {
|
|
case 'F':
|
|
bomtable = pcbdata.bom.F.slice();
|
|
break;
|
|
case 'FB':
|
|
bomtable = pcbdata.bom.both.slice();
|
|
break;
|
|
case 'B':
|
|
bomtable = pcbdata.bom.B.slice();
|
|
break;
|
|
}
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
expandedTable = []
|
|
for (var bomentry of bomtable) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
bomtable = expandedTable;
|
|
}
|
|
}
|
|
if (bomSortFunction) {
|
|
bomtable = bomtable.sort(bomSortFunction);
|
|
}
|
|
for (var i in bomtable) {
|
|
var bomentry = bomtable[i];
|
|
if (filter && !entryMatches(bomentry)) {
|
|
continue;
|
|
}
|
|
var references = null;
|
|
var netname = null;
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
var rownum = +i + 1;
|
|
tr.id = "bomrow" + rownum;
|
|
td.textContent = rownum;
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "netlist") {
|
|
netname = bomentry;
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(netname ? netname : "<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 = createCheckboxChangeHandler(checkbox, references, tr);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
if (input.checked && settings.markWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
} else if (column === "References") {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = references.length;
|
|
tr.appendChild(td);
|
|
} else {
|
|
// All the other fields
|
|
var field_index = config.fields.indexOf(column)
|
|
if (field_index < 0)
|
|
return;
|
|
var valueSet = new Set();
|
|
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
|
|
td = document.createElement("TD");
|
|
var output = new Array();
|
|
for (let item of valueSet) {
|
|
const visible = highlightFilter(String(item));
|
|
if (typeof item === 'string' && item.match(urlRegex)) {
|
|
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
|
|
} else {
|
|
output.push(visible);
|
|
}
|
|
}
|
|
td.innerHTML = output.join(", ");
|
|
tr.appendChild(td);
|
|
}
|
|
});
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
tr.onmousemove = handler;
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
setBomHandlers();
|
|
resizableGrid(bomhead);
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0,
|
|
fp_b = 0,
|
|
pads_f = 0,
|
|
pads_b = 0,
|
|
pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("topmostdiv").style.height = "";
|
|
document.getElementById("topmostdiv").style.display = "block";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
var chkbxs = document.getElementsByClassName("visibility_checkbox");
|
|
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = true;
|
|
}
|
|
}
|
|
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
|
|
checkbox.checked = !checkbox.checked;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function checkBomCheckbox(bomrowid, checkboxname) {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
|
|
prepCheckboxes();
|
|
populateMarkWhenCheckedOptions();
|
|
setMarkWhenChecked(settings.markWhenChecked);
|
|
}
|
|
|
|
function setMarkWhenChecked(value) {
|
|
writeStorage("markWhenChecked", value);
|
|
settings.markWhenChecked = value;
|
|
markedFootprints.clear();
|
|
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
|
|
markedFootprints.add(ref);
|
|
}
|
|
populateBomTable();
|
|
drawHighlights();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateMarkWhenCheckedOptions() {
|
|
var container = document.getElementById("markWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "markWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "markWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setMarkWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.markWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
function constrain(number, min, max) {
|
|
return Math.min(Math.max(parseInt(number), min), max);
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowLeft":
|
|
case "ArrowRight":
|
|
if (document.activeElement.type != "text") {
|
|
e.preventDefault();
|
|
let boardRotationElement = document.getElementById("boardRotation")
|
|
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
|
|
if (e.key == "ArrowLeft") {
|
|
settings.boardRotation += 3; // 15 degrees
|
|
}
|
|
else {
|
|
settings.boardRotation -= 3;
|
|
}
|
|
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
|
|
boardRotationElement.value = settings.boardRotation
|
|
setBoardRotation(settings.boardRotation);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
function topToggle() {
|
|
var top = document.getElementById("top");
|
|
var toptoggle = document.getElementById("toptoggle");
|
|
if (top.style.display === "none") {
|
|
top.style.display = "flex";
|
|
toptoggle.classList.remove("flipped");
|
|
} else {
|
|
top.style.display = "none";
|
|
toptoggle.classList.add("flipped");
|
|
}
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initUtils();
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// EventHandler.registerCallback(IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, () => {
|
|
// for(var tr of bom.childNodes) {
|
|
// tr.onclick = tr.onmousemove;
|
|
// tr.onmousemove = null;
|
|
// };
|
|
// });
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div id="fileinfodiv">
|
|
<table class="fileinfo">
|
|
<tbody>
|
|
<tr>
|
|
<td id="title" class="title" style="width: 70%">
|
|
Title
|
|
</td>
|
|
<td id="revision" class="title" style="width: 30%">
|
|
Revision
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="company">
|
|
Company
|
|
</td>
|
|
<td id="filedate">
|
|
Date
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="bomcontrols">
|
|
<div class="hideonprint menu">
|
|
<button class="menubtn"></button>
|
|
<div class="menu-content">
|
|
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
|
|
Full Screen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
|
|
Fab layer
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
|
|
Silkscreen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
|
|
References
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
|
|
Values
|
|
</label>
|
|
<div id="tracksAndZonesCheckboxes">
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
|
|
Tracks
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
|
|
Zones
|
|
</label>
|
|
</div>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Pads
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
Highlight first pin
|
|
<form id="highlightpin1">
|
|
<div class="flexbox">
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
|
|
None
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
|
|
All
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
|
|
Selected
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</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>
|