mirror of
https://github.com/garrettsworkshop/RAM128.git
synced 2024-11-25 13:30:49 +00:00
4346 lines
304 KiB
HTML
4346 lines
304 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: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.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: 5px;
|
|
}
|
|
|
|
.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: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.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 {
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
#top {
|
|
height: 78px;
|
|
border-bottom: 2px solid black;
|
|
}
|
|
|
|
.dark #top {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#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;
|
|
}
|
|
|
|
|
|
</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": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "fields": ["Value", "Footprint"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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JFsEmpdqB6iYrE7bAyqcKpkygbSSGpSqn4UK9cnqluqSdJibauqfBUKUmpqVapL6hsoA8AzkAwycip50hYyWCAl1Q8qYFwxqn8yIKwuaBlIAGpbbQRqYNQ3X56iXXE9wnrsL2puakjqU9wR2ChqaBQORaJwBxQuhDziReq43AMSE6ps6kWDGEwVBCmHB7g+QkGqPOp06mFqZigyWxBwAepAalA8OqwzClhSdWpwanJ6LVJ+QlpBjfAaUgnQHKJBZEysjepZ6RHia+pLMgcUCfIgCn4UEQSDqk8zFjI/6l86KapVqB7cCmpR4KPqeNAkcIpqcepN6kCmmepe6knqYOph6mHVFzI67D0oHMgUanUsDGp4GmAySKpA6lAacyJ+VTHFjepv6lhSXGENXAXCWIYYal/SJupjKDPqWGpuGk0sPQJUUlRqXdgK6lTRFepyGk3qQwMDyAHSbp00GkkhhaJKyhukLuw46mZqdnYrGlMDKJpZwzJMLmgI8DziQmpDGkQ3Nhp+FB5flxpiGm5qf+mhcBjqcmpoFBgfIywuaBYaSdJJlDiaeuwlJBdYMoACKlIqeoAqKm83EPQAbhSMHbgTmmROCEo+CgWCaMorml5UM5ptgnLUDHQpw5NiLSpeFA+acVQCTQJyI5pMihBaR5pDmkBadFpEWkZCVFp8lB+abFpFQktqVypsoArSR2pBkBnCWcgwsh4ifCJtS7eoFeEAmnuiT8aOWClabmpk1CJSQ8o2wl3SUOMZyD1GIFJ5WmNaUsgyiDKiQ1ptWmjOAlqxIldgQGgqsQeSV1pA2k0gIVp9/RtaRIJ66EsCN0J7UDxCacEJ0mXyMOwc2m2mi+pQCimoOA25qnwiUOK8QmTUCuJ787+IMZQqsAriQtcnaAbaZ1p7on4yFogz5zsae6JuUmnaSvQ6kl1CfJyI2lTacyJkFATaYNp38B6iTVpI2l29J+pYdSJSfIgzcBcSSgMjW4cICNE+yQpSZN68WDyIFBeUOnbaRIJa5gbiYsJxWng6Qaed6nrCftpaOlIwOdpZowTFtjpwOk1sO6JHM4u4PwQN2khyEQK2OlofH+p72mA6adwU4lPaRVpaOk42sBpFOlpSRIJ+K6QSXvUnokc6bNCcUhz0PUABABwQKCAEVDrCalYk2mjVKpAr4DqAGRAISjNqRnIyIDtqQ1QQJBQ8B1AQu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BqeRx5/HnPPFaIT1BT3LZJKlD6eTuwSBmg4AqowyRuNDp53cBGeWLgbjTseeHYnHl2eV9p11C13q4w3xkW2V55AyCmoElA9GkSeY55xZClRIApvHmheeyQvSYU2Rgar/jskN0WA7AIzNKsCXnSaQDQulmqYPUQ+kC80DceyUB1kDyQVnnTIEtuO5B5qgZ5N/DNsOyQpeC8WfIZTjjrkI84wtCJHAl5KS5zcIZ5YXkPqa55mkGREOF5pDmNed1QwXm/sN4QgXm96b2J+HDMeRmQ2cDs0K157JDp0owZkXmBaMWQnTh3qUx5BUmwyOninXDyGe6i7pBeeNhp9BnrkIF0PHlTeekQDw6M0Id5JHm1hC15H6Bm4Am4inlQ6qagV6AOSKDwDhlcSGbgVsCKWUgZk0ABoFegHMAU2UV58YgDgGvgxNme4fN57pBcuUD5fon/ed95DACmeW55WiAqMDfpo3kreUpAc2bgec554Pm9oGEYI3nLeWj57SGTeTD5xeA1eDd5MSDxYNqp9cnKGRw0tuCGsdV5v3lpEAWIHmauebqythAbgJakF3lsIEtpo+D+REzZ3iAZGOWgH2Ac+YLZuRGBwHIQZOxLeXF5LMi0+atgc3Bg+SZJlPm80FL5+JCFGHjZ/nnxeaLgwTwvuYi4CIhTYOnsDnnA+RxJ0khi2ad5ckkHeXj5ueB7yDl5l3lCEMqQF3mDecXggxBLeTUez3n/YJJETNnCebJJf3yE+cV5ueBDNhd5DPnp4Jb5rnmQOhvg9OlU+SW07OmG+ePpWPnS+RYYeIlzeeD5KJwSie95OgyFSXQYanly+Un5gOYXeZ15IKD39PMcNABhuQtZ/4jJCSbQynCOcvtIRfmxyAjx6vCNufLwUdla0BX5eEg1+arIiZxe8PlIMKgDeSVIXwyl+Q35zohyyOWI5bktluX56sh4cA4Ztfk9+VuIVfkXiF35FtAiYLeIfXaN+dP5lfkkWf2ZqRmwGYx5KAwg2UEozFlLUH7mDqnk2Sh5sUiuqQC5gtmlSntwExnjWQTQ2ppa2TzZXKDo2eGw2tlLUCkcCmm42Tt5NoAyKQxph/kE0NQEDNlg2R/5pNlymU0QtNk2MO3kZNl3+UhQEPDc2RrZkYxO6erZTNmQBVzZlWBA2W2iOhlG2Tx5XxwFICLZNF4XsCFYYAUhXmyggbCNYGbZ7l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U3qZ90N9k5xVcEKGmkdo/ZGcXCimXFyTmlRYcsZcWbOfHFDwXUxV7Z0cU4hTepgcUAwL2gEcUpaa3FwcWoRW7F5IXDRZB4PcU0xfkpwrmTxXbFMVBp2XxpScXPIB7Ks8X12RdFBViJxdrF+Sm9MrHF/MVXoJc5i8Vbxecg8kW2xYzFdSkyhW7FjcVgYN6QVpk1xfzA28UChWXF2TlvRTtGLcUCOW9FdWZWmb3Fb0Waoihp38UJECpyNanKQBA5F0W72JhFKgiIuTjFxkiGmXfFfcVBsPNMZcWnORdFKeKFBcXFyfDnobiF+cXJ8GAlhYXZxQAlqJqRxenF+RDhhbIFS8XGhNGFpCVHxUNuhYVRxQkQ4h79BWHFdCXphVqwaCXmWBQly2COuc3QJxI+md/FvQDWoX/FNMWroFIBb8UgJUHQNYVlxa05XCW5rEAlF4VcJV/0ZcU4uXIl4IJasPuFsMVLXN7FqqjguVwli1IchWHFQiX0xZ7oAzlcJfwlh8W+xb0AiFCFhXHFYxB3hRYF6cXBECyKhYV6JTgoYLF8aZc5aiVl7ELFPrjFBbdFvprVxYolwRBI6DAlsiX2JeLFEiXA1O4lrPm3xa3F5iWBlB3Fa8UvEG+FKWmZBc3Q61aYRZbFc+ApEAmg+wX0hFPZzdCCQRbFksUvkJAoWrBQRc3QdI6pxQ1AoiVr8vCFvtCCJawgKxRxJQbFpYBWxj6ZwCX8wJoQuEUNxSI5zdB0fMbFsCU9JWXWKWlIJaWAgyWyBcXFIyUOxXoFx9k9JbtohQXZxc0ldqg0JXYl9SUjxT7FTSXm6SfFJsXrJeUlHIVRxdOA4kWhxZJFZSXFMABF4yUbJZ4lnCVJQHT2AcV1JQtoaSVWJa5kNsWLlEYlQuBXAaYl6yW3nJuFgcWmRTR5wUWlCIbFDdBG5kypddCApUFFi1kwqEzFQ9DpCeQoaOCgpdFFfyXgKOLI9/kJRSeoSKVYkWClBfnwaJClxigopQkAIKU4pRilLfnQSM3QqEBcIk3Q+KVEUMjYDkXfCJUJ6UUhBSNggXB+8DNZcpmnGdTQfvDjWVsZTAX68CXcVRnbGf9wy2AGWVsZ2tnspci+jAXw+X7wDxxWBTQaqMgcJcY56lDdGdPwMYm8NlDZAxn68KSmXGljBHiJy9DXNjWpkxk98G2MROLhsHMZzvA7+UsZzvD/+YaZeb78papQgIxbGdDZJqUGBVyl2qUCBSylccYn8F8ctqX5hfOZiqU2pc9FFbRTScvQiPj2GfNB07mBpb4Fqmny2T6lhFh4abUUdXCBpRlZo0VgWtYINjDhpXcZGllRpW7oppmPhd6laqXgxQGFulk+pT6WDqmojjKluHodOdmlilkipYbZN4wSiX7wgqVRmUmlhaX1pWOph3SFpRylu7CRpdylzKW7sBGaUgDExV25IJlICGCZmUWN8BUoIvDQmXagsJmiGDisPpmH0VNQFSjMFpiZi9j/SAul7pkvsGJhbKVcoHaZ+JHZnNPwZqKjMlsZTJnTpTvF5JncmXuld0aRmYOwFJnnpZ6wcZlXpdlAPqVMmCiZbJmEScvQT6Wnpc4EJ/ANKETYcpmCmfrw76W/pUTYX6UQ4D+lY7AI+KDwb6WjhOVF4GXWpesuutkqmfqln+A6mZewGjmPpX48KGnBsDTI3dHrTCKZMfKPpaWEVplcUNHowGVtHtCZDs47sAul26XHHIMQN6WLpS6ZPMS0ZWul9YUsGD3wW6U+mSEmN6XjpVaZiODwDDelAoXuhRmZN6U5QdsFgmXHpbJCAZlttmhlyGVpoLJMUmVpmbpIghQ/JQEFCKU/sMvQqbkxUPtItnC+Rb2ZMUW+8KVKBZmaZT2pBmWEpT1IBsj6ZdFpmmXmZfqwOmUqZU7wamWIsCWZBnBGZRZlGKWLSZlpGUUMpaOlX1xKBRalHMj+MDv53/nt8DrJUqX2pb3wxUrZGRnAivlhZUjZhpls2RzIL0A0BYQFYAhxNCSI8NlRZYHkhNnv+djIv/noRTDF2WVU2X/5gIzkyGoYaBAkBRzICik7+QtFlYl82WVl1WXLRYuwzFm0yMLZPUXoWbTIEtnoBX55iMgs2XLZxxYn8O50ONkSBb3w3lFFRb5l7fBg1GBp0LQUZfK08YiDsOGlHMjG2tkZoVbzpWgi5AVGKblZ4/DCBT4FQlnj8O4FV6XiWePw3gXrpa4FC/CTSgOpu/nX8NchZNmhZTXCzgVP+dYIK2UH+cKlwg7lpUll/3DTZdgFkWXYaUNlVtkTGUTF6emAmcplNKUZaUDG8iUu2XAZcwisKmklizlzCEsQBiXQ5buaLMW3BbM5KlAakpWFmQUo5ekFMYVMyLqoniVp2YTI+eHsJYLA9mL45fsem4U1BS+JvfAD6DUlK4UtIBzISzj7Be4inXCU5ZuMvIWGuZTlfQVIRXTlQP6s5cjlvfAjGsbFOwXt8Pzl/QUMhULlcxjGxZ/siLnt8BlMZoUbBdLlewXbBZM5AnkK5UhFxWXhJmuFkkXYyOcFS4UThWFlUMEaRX5l6PQ85fPZYWXIhTrlG9lhZR8F1QWBhUFlUIV0RQU5QWVghVGZtrlhZU7lHAUSubblVcXvqUqFQWVW5e+piIWm5c3F94XahWFlRuWc5UFl+uVoRa9I2uXB5cw5r0ikhQup5IXZZRPFUeWM6HSFeoXFZUJ4FSWC5YjI9cIchaLlKYkGuMblqMh46I/FWOWViQqEQsU55UQUmyWqRbTIzrj+5XKFtMgKhd7lVWocyPOam4Wz3NggfWUfkKslWEW5cOvCuoWYhWy5Q2X8HoUF0OX1tAQlseW5cNUc9MXlNPy532XQJa3lI9ljZW6F4IUe5UNla+XO5W45Y2XehVGZAIVDZcxKOYU25UNlwYXm5VDIu0AkJT+FATnj8NmFBuUnZZqFCYW65bC0pZz5hZrl4/DJhRmFO+W35XDQOYWKRTPwT4VR5eV0U4VAFY8IwiXT5dfw62EVJWLON9kL8GrOjYU55EAIN1SURRCgmOBwFUeW5GmqJXAVDYXbBW4lcBUvOMJFlrkz8BWF5+XX8MV+VeVK5dl0sSVI5SblUXQ2JeOFFuXztKElb+Ur5TPwZ4X75QOFM/BHhVGZWBVcFZUaVAUnhWwVLiUahYgVZBVXhWSF4SUL8CHSKIW0uQAV1BVHYIcFU/nLQJhFfoG0FadwiSU0FRTl2/Ca6IfFxQVwFQGYAuVgRYaJEEWnhQXZC/CZnNAVshWdwIhFoBWafoWF0OX7mIslWoVx5SgQjEV4RU3lMtlPJcRFC/ATQCgVBLmGiWTiX+WehQEVkyWPYPRFholuFQGF3wXmFRhFOYWXBY7Q3EX35Y7Qo6AUFWzl55h0EqQV5hXSRRJFrBVmiQclCkXf5QUm/EVBFXmFv/DKReHl4AjdcOxFlBXaNBLlukX8CPpFSRWNVsZFw+VGEEplZZkBNvFFm9CdFdFpnkWdubplNnBCOFFFiQin8L5FfRUfWcm5EOUuRbilp9CWmF0V8KXgpXmZUxXzFSMV9fxhReMVqFDtmZm5yUVApRrIQxW9Fa5ltKXuZfSlOcjV6a0oLAQjZY1lISUfZYFlrShlRb9l5RmJcE6cEWWUBU8V9UW1ZU8VzUUfFSkQ7UWn+V1ZiXCDaJlloWUpECNFoNl5ZQCVoJUb+Z5ZeXAvIAzZwqUJJR9lVWV5cBNcPplxZUFwday+qfAFYAhjKZTpY7BGVNYIL5BoBcqZnWUIlUVF8tkn8FoAyMUNZUqpVXDRgFCV2JXgadWlmND1cJt4ktkCBdPwgYCSiGBlJJXPIGoFTPnbZYGAuMVglZWlnJUzZbQF+0lVcCvyUqWvFXsp+fHfFWmgq2WvZRyVr5i3ZZ9lBJUTYjjZWWWJcF3AmWW3FULgvtmDsODFypVg4DjZk2V+CJSVt2VCEq+lSUCbJFYFS2U98LKV1aX2lcqVHMAEBVaVtyklcFyVe2WFiSVwQpVHZdjo/aWBBWCAZMVg5bUJyDBxzlDlI+Xo0CFA9hVRleNgV+XLxbzl+Sm8xQup6OXIMNvKPEVJlVNuteV45YJwiRQ5hUYV+SnSxdUFUEUAcAhY1OX/uHHl93l1jNsF7QVllRrFxeXT8PvFjtgi5XGVQeQC5akFbnDmxY2VAHBrxBbFBeXJ8N2V76nLBQBw70Wy5bj4J/AJEP7FSRVTlfkVChVzBU8VSew5FRI5TxUDxT+p8RWroN3FMYXKlX4gTyU55WMQQeXrlaGFrSiZxVEVLEVBcNv2VeUH5cEQhcXAhd/lN5WlxVQF/hXBELnFy+UrlQEl9cWyhQvlB5VDhVmFIeWeEO3FrRUm5ZuVqoVAVajIvQBrlX+VceW9AEuVEhWhBBSVg5QaJXXlvhAzxRnlMXALxduV6FUrxWhVJXAbxUkVvhA7xRpFCFW6JqkVN+WaECKFUeUjJRfF9AlN5aWA+4VvlblwBFVl5amVRrYIVTIplYWyFUlAn8UVFUlAv8U8VUJIU+VwRf+V2qBUxdaF35Xh5hWV3hUlcCgl6+XFhMqVs3JV5S7lgpVL5fvl4RWclaJVzEXdOVVwgCWZFa1wCZX7lYIMhOUGVexVulUfSMwlw4Xv5WZVr+UFFcEVQXm/5SUVTOV10BYl/FU1wZ4l0OV10E1kHFXCVd7G0BW7OYlwlhAaJWh855X+VfIlAhXthUFwreCURRDqFuVjSH2FHBXiVT5VhBWWVb849MUiReaVCLKbJQZVKfCZlcBVVlD0FVqSuuVaAA4ly5WMVeV5oFWPYJwVWgC+JZgVN8XGldVVYVVoFdqVgSXnhaIVQXCkKpWFflVaAJElzhWlVdlVquVdcCaZ74WshbBYRlWdlfUQWSUqRbmVAPBHrqBFxOVdcKEsphVzBRtAqJgyFdqF/XA2FWBV93BqaLGVxoXDJE4VEBXo8LMljeXbhUWUoRX7SivlnUAusmRFHuWXVaMlVaAghadVe5W+hSIonSVRmTbll1UtJZkVl1XbVfflG0DjMKRVBDlXlBkVT+U9hdcQc5XrKhdVYNUaJbmFc3B9lMUV2+XeOVdw1yXh5SNwd8w5VdDwcYheFfUVwCC0qNnl3zn6ZBWVnIXtFZMV82ArFWbIpNU7FSZlk0iqZcnwwxWISNMAdNWpRSTVHvDtsLsVeHBucIzVXkUDFdJQ4ZVk1W5FDNV2RSGATNXc1dlQAtVWsDMV6tBi1RowGxXIgCTFZFknFdio8UA6AJaYzBodQJlIiMXM1CfIatWsJnjZytWTBO6wRCLYxZ6I8qna1VVEM0V2yHJZptV1GffAQ44aWdrVbrY21f5KEPClSkB5ytU2bEWwBkiuBW7VYsqysMrKf0WrjvOZ2tU1wLHAttXfqfKiMhlu1ZJZ8wUHmW7V3gTssF5K+UV81JuZS1BJkDdFmtUvSdKgMdX+qqrV8wVx1azALlRypff0p5nK1UTcXfCZ1RjA3tCeUtrVqdUzRcfU1mDV1WuZd4DFIIyw5dUAwDHKNXBF1bVJTdVf+mEwdJytpd3VcCZB1a+ZbdVigDxYQdV1IWXgOQxxxqbVJRld4CSwg9X6sLPVgZWL+Y7ZdHrkxZHVghTa1c80UaAAwIr0bbZb1ZuQbtW4+L7VdaC77rvVeVV/wSKwGJnn1f4YXGAH1T8QVdTJTFvVlpk31dMYppmlIgUMr9WnoBtJUsLUma/VT9VSsM3c59Ux/C3VRUmB6VXU39XV1SyZ+dUNBHw5ayiCmSXV8orGwJ6R9OgwNYxkBtVE5dHoN9UnePHVzyA8Xtg1MfJQNdG0N9X+USfVFdTgNSI07dkoNXhY59X7CjNwnpHENYg1ejlSsDjiMDVKvk9wOQajMrQ1oOL31fzA3tDPSQfVZ9VN1V1iN8CPjEI15qossrw1I9VLlPQ1rZ471U3VPvzINTdQzgTSNYo12tVQzLHA5qqm+eo1QDUl1XO8UDX06Ko1b+hKNeQ1ufk2admZZkWLFf8loqCt0CpATKk2Nb5pVNUSKPuozSBOadwwNDApAE41yigMKK41gih2NeQoDjUisF41e6hKMHeAI4huxe41bjULFZjJpFkDmR5lpxVwGSnp/1mFZUDZIyW5RYJQeWUp6R7JIWV0BRJgJ/lpZTt5FhACSbf5PNnCYDf56lB3+YGAQkl/FYr5aEAGImdl9qV1NTll6lCBZU01BWX0lezZSUDdZfwFp5kcKJLo8gVHsJRwTJWjZd7pKoH82SM1TlVO2b+lgzUvqITZygUDsHXQQAUama2lHChGydTZnaVoQKr0A6nulYtQNpXMGeAFTNmLNaVlJTUa2eNV7C4pNYcJdTh5eRc1gYlgWPu5ZpnMiZtGxmkgIhjpA5nwxShle+lS4AaVa2W8WdIwp2UMaSHgyOl/NbtlGTWKWX81m2VQ2a1ZdzWJZWqVAwlXNXAFaJVoQBhEz0WItfUQCTk1NYU10/wEBVllSLX6BcKVFNn1ED9lL7AOBbs1/cjaBc6VHCjDZQDZGgWktbCk4gXslZS16LUimTM1yLW62Raly9VA5bE1kbjO2Qx5T1D5KZniO1UEOcnwsQWCtZpFCriI5dfltQUl0MolqZUfhURQqOVEVfK17yCFBbmVVFArpOxFYEVUUKTlJZVmFWhAVOVk5U0FHCj05bWVLSBPUJDFIEW/VWMQLZUo1UHQwwXl5WhAwuWWtYGpTyWchWa1zrUS5SOVaEAy5TWpkuWpKV61KuWYVf614NWutRwo6uUlVaS1jXDB6CDV6dnTGVuVmhWktTIOHZU9BZoQh5UMFTG1OnwVldWg55Up6XblqlUO5SnpbuX3VTvlBbWPle7lclUcKMHuQsXeFSnpfuVflVLlWTWptf3lCbVh5WhFKemR5ZtVobUx5UJVXLmBgAnlzCnA1G61AYIARdEFH0jp5WBVbrVZ5QZFybW4kNhV47WrNUXlTrUd5YKFv4V9NZXlAkXTtenyblUJBUVV1FVjEfW1VVU3xQxVpLVLtRkFrFXo4L3lXlXMOX81yHH55du1l+UStQcFxoVotYJVUFVzcPUQR+XHVfu1IQAqVUmFbeWUtVvlZbWwFUi1AHVFtdRFhLU/tWEV+bXvtRpVj3rZtc+10NVvBeNV+lWTOX81d+WYVX81j+VHlROFfzWf5SwVEjk4deZVoHX4daC49lUI1XmF0jBElqK1cLXBcLXlizkUdSQVB1XSMFAVtYWSFUx1OBUtVeeVTHUYFQ1VcomknlFVWBVsdXFV/wUDhUx1BBXhtee1EbypVZcFFHXXeeu1ATkUdYAV8bUSdf5awkXSdUWUzBUWVSvlFHXsFcJ1/LkUddwVO4W1VRJ1BnVthWgV2nXCFQupF4USdeIVieWsdSIo+VVVhQp18hWPtaE5PsjKFWjlcrVudRoVkrVdSU5KSFW5lUx1BhWzVYMF0jCJkH3l5OVdCejkwNXdtbx18KKE1XR1XSgNJR210jC7PioVtLmhdZEVdbVAicW6XhU+5aF1gRVPlR7l+XVkAmR1sXXPQQLlAIUZda9VP6k25Sl1sRWZFSl1iRXodVAw8NVKdSl1yUjZ5Wp12qDg1XloWnVf8NDVtrkpdSkV7oWKRdIw6CzDtWy50jBYWKlVKHX2JIBVQgW+uee1Wlx41Ya50jA4UbiF/tnE1SLVnShzFYLVgci7dcVQMtUsgOW5lSnrFTRwFwCc1f0VtmUYSKd1e3V9KAd1vtBC1VzV13Us8GhAX6jS1ft1xUQfddE1RKV5ubd14tU2ReplH0CHFcDlV0hDYJ5lQIimMFCIhchQ9WCI3fCeMMEIqghDyCtA9oBeMFoIGoj2gEm4WXAAKLlAITBz8ENwuPVRMEvwqIjxMHcRqWWzcGkwFIjw9TkwNIjsiHdA5TCqdOQFd3DlMMZIriB09YpgNTANqEKw5MD/Zfn5bmXQuBnACtV9uXwASdL1wNsSC1Ai9S2y10Di9dDgIvU37IKwaCJmYOTgIvW+SkWwekY2mSr12AqysIr1ONQyYPv0RJXS9S2Vo0Ai9az810DudbL1/sjdyWb1rDUi9e4Q9hnmdCj1Y4yBWOywDvV69SMeL0k69RL12aoGlRccGvWgnB715oBK9TJgKaWvOQrQlBwS9SH1L0m+9a1AwfVnllH1L6hYNZj1pPYu9Qn178BJ9c+py+nh9bL1ZAVHSdH1yvU1iMwZ4Ngc+LUg9oD61eywrbTGNWkwS6KH6YH1fvVbjgH1WfVOMHP2T3AV9bCZRUjGWfXAyrLwwH1I+TXEIE9YKjUhMOW49cAOOm+gg/Xx9dzQA/UVSL31Xaguxk31HfXS9YJlRUhvYJiI54xpMN1F0vUFEBH1vgT29TBpdfVl9WL1CcBOMOb2avVpoJD8sfV/Ae6wefUc9Ql0YvWb9cr1YgkieT3pjf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IGu4G7truvQxBrPLtWWKm7ybtigPqb/Lvpu0rLDrvT/E67KrsaHAG7VnRVu+BrGpvnkDnwS5gqu9K7z6gRuy27gRv6gENA5rv8u0ypU7vduxq7hbsiCf7g07vOu6a7j8Tzu810i7tYpWlYK7squ6l0u7uau/u7HbusKC3k9buau0Qpx7tlu7hSG7tBu9W7/btHu08oFrswKDu7Z7tbuxClaLgHu1e7KmA3u727mGvyu5O74eaXu4CzrBQ/ux676pv2u6G70kRAewK7UHtuu5W7YHuEqRYS0HtMqUh7cHs9uwh7Xrsvu2h7C7uAsw+7Dwk4e8a7rbu3gCO7+vA5u3q7Wbuju2m7d7sQex0AWHtJCDO75Ch0ezq7sbvHdV67gruTzau7AHuJuxx7LHso82x7jbuge5RodbvYe5u7SRkCCRjJNbsfAOipXvEWUPSpcoB04yEo44CEqeSpDKlN0Cp7dIAye2nw7KlYa2ipOKlaAGp74zKqe1p7hKnYhSVIaUgqu6Z7A0gvWIp7UMm6AKiAsMkoACgA5gBWAIjJrgDsaKAADal2AAAAUn2lygDIAOgAbkBqAbxQ9/QZAEoC7dDOQCsAgdb1zGmIKmiw/LZLNkAAAF6Qij2A7ArYADvZVtDEQJsA9nvRQBAA7nsgACsAogAcAGAA3gDsaCAAnkBYhOxod4A4qftO7dCJe5CKgdksAK5z6t6/gKRA4ECwAIUAogCYUN4AKABjAHEAzkD1AEBQoZOBOO7oDvB4APEAygAoADDJMMkOAM8A8ID7NMQAfaWWNQV7RXsle6YAZXsgABV7m0gvlaF7lOyDAHV7AoCivY17qqjNe9pAsunte517GIDde717ZkBgAAN79amLy/8ArejKAF+wY3sPAJN703tgALN7ZED8aOeAy3vFe6V75XvppgtdO3tinB4ABABJewd7mKrYAE1752HZaK17HgAde117PXt9e7d7g3sPe+cAT3usAC9743usAO97M3v7ehU4Jk5/e6t7/gDre5t7BwhbzCD7jUT2AOD79XuHe9D7x3uw+y176YDne0j713v9e2j765sY+yN72Ptve1N7+PsRboT7v3uFe/97a3uA+1fR/kkUqTV7e3u0+5D7cngw+3fRcPss+4j7l3vI+zd7d3vfAOj7w3vem7z7E3v8+597BPvQuET7Ivsk++0AZPtA+yTIVPu1e7L7PoD0+wr72gFK+2d7Kvt2AFd7KPsa+3EZXPva+8978DCve3r7H3tfe+CAP3tsgMT7APsbe+mmzeVW+zL7EPu2+1D79vvEQMz7TvsXey77avsc+/d7nvvWMjr7Pvs4+yAAePsG+4L7RvvC+yt7ofvk+0vQJGv7QLt7YPvR+7kS8vuM+4r7Cftte877tQCu++r7nPvS6V77WPtZ+3z7/vuG+0H7VwAh+2L7YftX0bZwJCjS+5X7dPux+7X7Dvv1+wj7SftN+yn7qPtp+237Gfve+85Qvvu4+/r7AftC+8H7JvvF++H7YymR+2P7cvu0gHH7smTT+80AjfuYQPP77vvw2497PPud+377Avv65Fv7ffs7+wP7JfugMF8EB/vNADb71fvH+5P78funew37s/uX++z7C/ua++n79Okr++2Aa/s5+xv7PfuYhIX7ovuk++L7QXsTRSP7Ffvf+1X7NhI1+0q4U/uABzP7bPtu+637JenL+x37q/vZ+7n7m/sF+9v7Rftv+1z+oTxf+zT7WAcNewz7uAcAB/D75/vAB0MAV/vEB3TAmPujexQHcAf5+737oAD9+8gHg/tBe/awjAf7ezH7OAcqQOwHyvtcB837qfvgB0v7kAdkB9AHggfd+8IHCAc0B0gHZvsoB3tBFxPSBz/72Ad/+2wHp/v4B5wHhAct+4v7JAfqBwIHXfuP+6nkz/uiB6/74gfv+yxZB/zl+6D7mAfj+3IHJ3scB/YAF/vcB6AH1/tDe6QHjgcP+3n7T/vUBy/7tAceB+mmhSidHD4H1PsyB7/7R3sWB6UsZ/vBB0oHPAd2B3wHd/vkB04HMQcuB3EHbgcJBwYHEgd7QUGJCFCpB9b7zAd2+//7lgdBB6z7qvthB7wHt/uZ+8UH0QdUByIH+XvuB2b7ggmeB7UHJgeNBxP7WQc6nDkHbQfJ+x0HBQddB1AHnIAwB5QH8AdtKIgHpvsmACAAwwdJB+QZYwf+B+YH8gctB4oHNgcqBx77agf8B7r76/vaB7EH/QdiB0MH1Qca9rUoUvsYB0wH+weZB4cH2QdWB7kHJwdgB2cH9gcXB/f7VwfOB3N7ugfxB/oHmwfbB1fRxgd0gKP7fgdH++8HgQfHB+0HRAfzB9z73QeaByUHfQeghxUH4Ifm+2r+grPPB74Hrwfwh6wHHwdTB18HMwdz+3MHqgf/B0UHGIe9B6sHxvuVBxCHDwdBbrSgewckhyf7nwetByEHyge/Bzf7aIeLB5qAywdCBzcH2IcDB8yHWwesh4pwgjj1B1H7bwekh4iHifs/B+EHWvuRB5cHsAfXB2UHtweDByyHngd99dV7LwfpB2YHCIdM+xSHvIf5BzSHhQfoh0sHWgfAh9974od3B3qHe/uncByHsgcHB0qHQAcqh50HgocaB7aHmIeMh+sHpXuQh5IHw/tuhxkHiodmhzyHeQfUh38H1odCh80AIodahyCHawd6BxsHUoeeB6ao1zByh4f77oemh3X75ocxhyiHVocLB36Hwod2h6UHKYdMh7iHIYd7QRH7MIdGh6YHLAdch+SH0Yfeh6iH7ftRB0CHlYcOh6mHYIfph7WHGvZ4yOGHJoeRhwWHbYfIh7YHJYe+h12Hmof2h4H7joe6hxmHQPshew2HRIfGh82HzQfch0iHswfFh3GHpYezhysHOgd9hziHA4fShxT7m/Ajh5uHkwcJgIWH7YfTh52HGodHh2KHJ4cSh7iHhgcFLDYghofrh02HTQc3hz+Ad4eTh6cHAoePh4CHc4c9hwuHr4dOh8uHEvvswFeHf4dkh7eHE4e7h1OH+4czh0+Hoofah4uHkoeDh+xoFg11B7CHxId5h2OHeAfIR1SHe4cgR+qHYEfPh1hHUEdLh7hHm0ht2/BHEweIRwBHZEcgBxRHEQcOBxhHyYe9h9WHZ4fv+0XwG2Y5h3CHxEcth0hHO4fkR6hHlEfcR9RHmEdVh0GHa3sMR4VIfMjMRwEHUYeSRxxH0kdcRwCHPQfdh1iHdEc4R+eH7QDoYGpHHocaR8qHQEf8hzpHdIf+hwyHx4f8R8GHxkeE88BjZkf5h6RHmkehB5xHaoeyR3pH4EcGR45HSkfOR1+HbkckRwoHlkcoR8BHNkc2h+WHAYcOR4pHpPvKRyZHgPihR+JHbEeeR3yHqocQB7pH9If6R4GHaYdOR+/7aAepR1uHrYcZR5aHaEegR35HNEcKRwVHdAf4h65Ha4dpB7+HLEeehwQHVkdZR+cHtkexR/ZHL4eBR4lHzkdVeyVH/4c4ANMHFoexhzJHOUd2R3lH8Ud1R4kH+IcJEMNHrEejR4BHkUfWRz5HU0c9RzNHfUcJR1UHgkeqR01HDQcKh2lHK0fsR15H2kcbR91HiYcVhwFHu0ebBx+HeEcWlktHbUfWBx1HPodVR7lH/kf5R/2Hu/tq/ib134fNR+MH6kfjh+VHE0fRRwmH9gBJh/OHQvumQOZAxABQAOxogwDE+3YAnkDngJ57tQAAAMK+e6wA/nuSAKAANQeGSlClPERH65F7BSz55lTUnPDGhzSrCD5tDVpArXvZeyMAeXvQRw9HUoCRjETHZnAbhxR7ksAvR98Hb0cdh6T0aRk8R9DHRvsdmAt7C1nMx85HsFBXYOzH8ocHe00+PMeUh1pHUUc+RxgVZYfXR3FHO0ewx6IAFkAIx6YASMcm+yjHUtDox6wA7kAAAJIAACIV2zjHqAB4x5IHYulGyDEJ6emkx+xoYBhU1FbQxofW3b2YzXtgQAzHuXtCCRLHIwfLm6EJk5ZER+9G5tjNe26gEUe1AFDbaseQxzdHjIeix0QAi3tAmVrHOseIx8oAyMe1AKjHbIDGxyAAAAAS2McgALjHgXuB1pjADdgXEyGTYADOx6YArscAGO7HpgeexzoTsPtZex2YjMf+x0uHnkDKAElHtbuaYeUTsse2+6Fq6tTNe55HMccScEiAygBmQLZAKwCKx2EZxxPTy5PHKwDTx7+Hg8cOUIMANUd8R4nHyccoqanH8Mfpx6wAmccmx0bHx+usAHnHw6NFxzbHJcePB0HHkjkogxF7UXtWrHXH/ccIEgg+CEjx+z7Hrcd+x/4Ap4eh+13Hksf2x8LLHZa5hyjYK8eTAUz7kcdeh5Dbc8cPADCw48esAAvH08chB6PH8CecxyAnHjhfRw5Hm8dNqTvHlkB6xxnHBsdZx0fHgJllexbHh+vFx2jJdsfXx0gZJ8wkx/fHFHuux0/H4VhsQF7HzcfkgL7HTMcdx3/HlCckTAhInMcVmTOy8fsjx1AnEMewAFDHEEeE+5gn9mnYJ7rH/gD6xyt7hsdox8fHIAAYx6QnF8fkJ3tBmRlD0PJwd8dkx5WsUaRzbKHH4VgrkRl7p/vvx8+4bcdfx2+H6Ycsx3ejVIO0oAwn28TMARHHQJDtR2tHnUf2B/u0wieiJwFHEidlLQHHFvtUgzFQ9ie7dV1kTiegx95HEAceJ7HHIifxx/FHUid7x5Yn8ic5x4onAABKhcdkJ1cANQf1ffFQoBlVx7Qn4cwkGJTHpgfUx5GAn+Dq3oAHbCftx5KH1id9W+91ohBBJyuRCsfjR+EnageRJ4eH8kcbx8+4YsdLexwnIwfqwqcw9cdYBw4nSDiNJ0WHF0cRJyrIbSe8R5BHfAkTx3DHOCcyJ3gncicEJwonRCcAAKpAwA8A6Sf4x+ZOcBBQpTkn1cf+AHk0/7QMJy6cCD7rTcRApicKZOYn7QDfx/VHkgfcuUPQJRq8J+a4oSdRx0rH60cQBzFH6se9R7RHAmhdJ74nPSdc/rsneVBPJ7+HC4fLRz50zievR64n70eqgJ4nMSc7R3NHe0dc/ingjycMJ4kZpUCvJxAnMKf8x2bLkyfCxzqHVSeSx331MdByCc8nHFhYpy4nUkfKx58n8Kcax78nd0d4h/cnWSdXoOinDocQp0c0UKe8xzinD4dwp1EnXieBh3EnuCf7x/gnh8crJ3YAqydWx+fHAXtqJ08h2QIBJfsnUXvSyLF7EOADJ5CKfapHe4WZb8ctx2Ynn8c3J5Ynv0fMp5sIZz1qpwd7M9zGJ9kHYSdjJ2oHoCx0pz8nVYc+J4DlfidQh1ggaGigp40H5qfDx28n50c0pzanEydCx2In5QcGp3cnRgeLR4357qd0+56nTPtWp76n9ge2p/ynCKcMp0in90fEp2Gn0uWmp7b7Uad1+zGnHyd+pyazAae3R8mnTKehp8QtKlBkp7+HWadT+zmnbifYyf6nckdTJ64HwafzR/cnaafco2ynlacCJ96nmUewp3K6gsf1pwSn2Efvh6mnpad2EO2nNLgWp1MH1ac9p/Gn+KeBp4SnQ6f6h2mn/3kZpymS46dep9in1Ke5p3GndafVR+0n0yeMp9UnyjAjp2jgY6fb8uunVKfvJzWnyIA7p59H68f7p0Wnh6fytQNIK6fq2B2np/tTp7inM6cFp99HtyfNpyWnRVAzo6enMjznp9Cnm6dXpyyAN6fTR+gniKc/RyGn5k6up9oTIYCcx2+nlqddpxVHMkdfp/2nc6eDp1Ynw6cAZ9aLQGfbcCBn3KdgZ9OnkGdbR9BnSaewZ3+n8GfGp0IFhGe1fdmnaGdgxz5HmGe7pw2nQafOp0anFZlTYAxnyC2dpxunl6dkZ/mnWGeFp9RnyKcup8anoc18ZxOnCYAfp7ynvad2p9tHVGe/pxJn3GeKQKWAMmfEZzPH3aefp+Rn3yfKZ7VH4mcpp/qHCGdPI1pn0afMZ80n26ciZ+xnA6eGRwunXP5mZ+EdFmdMZ4JnPqdbp7Wntme3p3unjadcZ0YHzmdpWK5nVadWZ9anNmd9p3Zn2GdrB0KnCycip0snYqdJJ2snS2vWxzKnGSfmThqneVBgLdonLsemFMcnQCcXRGbQklbexzqnVyd6p2YATadqZ0YHRqCkp2yn4KfFZ6FnsafYyUpnlGcOp50nScfix4CnUIcZZ9VNtWcvJ0z7YEAXpx5n4GeV6Qmn9KdGZ6pnJmdc/huANWf5ZxinnjX9Z/JnlUd8p7OnYmcTZ8Wn6Wcr7SCnvWcUpwtnDWeeZ4rpo2f2p3xHB6fEp9VnW2ezZ+yn9WfuZ7pnCmdfJ3HHY2fHZzFn7QCyJ8V7iSdXALnH6ydSp1snqAdXoFm5iqc6J9rQf2Ivp6cnJSfnJyYnJWc5e+wnRKdFR/DggWnbZ5inu2fXZ+hnXEd3Z9EnD2fTJ46nJ2cw54jzxVDw5/NndfsDZ6BnQmefp81nd6d+Z51nqAeZDXDnF2d1Z4jng2c3Z0tneKffp7NHxmfrZ5V7VOeCKEhnYKd9ZwTni2cYZ6TnvmecZxTnpcew55zneOccp4TnJGfE57dnAuccZz97T2cmAC9n3gBvZx57iicYxzCD0qe2x3WHMYmaJ/9nOWfm8MruDCc9FfG5V2cVJxYn/mca9v8raKf5Z0MnISdgJ1ynOmfI5yrH+mf3Z0dnGOdtZ1vHWOfh+zrn0Wn1JwMUsmc/gOAn9OdO5+Mn3mdQZ2TnBfsK50rnKudH60lnGuffZ3WHs0R7J5XHBydBiqGczhsGJyDnRWeI52bn+qcW5w2YXHkzZ6JHYcc7Z7zne2fDZ8tnzOd9R5jnD6eSx7TIBbnlp40HtOdl50jnLGe0p4dnhmfHZ7XnmYd48zIojed0+83nU/uS547nbec2p7Ln9mf9R5Vnlue95/aw4udXZ8Hno+dxp+PnUWeT55NnQ/visNbnxefAFDznQ+d85yjny+e3R1HniyevZ8sniWcSp3YgmyeqJ2lnBecf/eulKee0J87ZTGLA57ZF2ect57nn5Wf550gwoc1F5wYnc2cS53vnrGcH5wnHHucdZ9DnLofmKP3ncsc759qn5efTp0AXLOdrZ4+nbK0/5+SnCOct5wvn1mdNZx3nLWdd56znSBdhu+dnW+d/5/PnROdDZ3AX2BcR5/OnuGeZh9/nhBe/55dndOekFwzn/OcUF4Ln8uezJ9rHu8fCpwknp+fvZ2rnZ8cJ5wUsJdWt0M+AuScA5/xqIbqFJ1gHxueMZw775Scfx1Dnjmdq/neAqblG6zbnwSedmSDHsBe4p60nVee/JzXneBeDR80gcktc54MnGhdap0cH2hcKZ7oXomeCpxwXacfcFwfH63vip7UAqyf0AJfnqWfbJ0FuWgBWRVlnYhf654/nkmzP5y8wr+e756wnCheVJ0oX9ye9ACgX3Oel52EXreeYFwdnK2fAFwpk/ydOp8Ln5k4+F7EXTefQF+DnVheM56jnAqcIFxVna+d2x10NVFCQF7b7g+cwF4kXYWdYFykXJRef57WAFRd2JzTneRfZB8PnTSf1F8kXehfjZ6UXbOfy0DEXdBeoF/jnCRcYFz0XLIDwF5rH9hdcF7FnPBcJZ3wXayeaAB4XWucFLPaAPtDbxPfnZMdl89Jos8EMJ/pLDPsWF6UsEOfXJx/nmRd4Ry5UpzCmF5Gna6eMF1LnZBd6Z2HnFGeUFxmq6Rde539HGmVeCcFntRcTF41n16fPFwZnOBf3p4YXgkcay8vQHMcVp3cX6BdMFyHneacRZz5ncuc4Z4angdamMDBokJcep9CX4xewl4vnXmcIl+HnbBfIl3BneEfSoN8XF2coZ1MHXRejJ/8XEGeAl67nnecgl4gXzketME2YEJc/F/kXdRc0l5BUdJdo527n5OdgF39HpJcyy+yXnRcAF58nLue8lwyX/JdRF6iXPueayyKXlJdil/CX0xcqZwMXh6cbF9cXCpcJgFSX94eFFxKXxRcwZ0yXgkdfF8KX5JdYl78XOJdJF7SX+JcvF4SXDmfUF0EmW0hHWc4gWpegQEqX4Wcql/0XzRdosKnDmpdml2en9xcj51aX3Jc2l0CXrxf2lyiX6xe+l8+oGJe3FwGXMJcPF8wXKOf6l4mnXpcXF1t7K1lsl/6XwGeBl90XXJc0qqGX9JfAlzDHsxfzJ89nx+fK57wXqudJZ3QAqxeXx2yHIGsOiHrnNce7FyFo+xf5Z4cXnGjq3qcXZWdGl1z+xhd+l0QXDutEZ7mX1Jf7Z9aXnpcdJ2kX7WfdJwKX9yeXsGSXQ5cUl9qX7pd4l5OXjJdql8Sn8stZl0uX5pccl38X45chl+uX0pcOl1CH5kv68LGXZqd7l6KXBRcYZymX6Ocnl5GXx2Hb7ezgrpejRzqXfMe3Z/eXfJdC53OXRgcDlzGXb5chaB+XPKd6lzyXBpeql96XG3qoQC6X2ZcjlwmXQZeTF0eXrBdIlxGXxJfy0OeXRstAV4mAq5cAl4WXkpfFl7+XMpcbZ2pQsFe7l/GX2JeJl3CXHpcoVxPnHxfzl7P58pdwV7IXFpdUV7iXeFfHl0RXp5ctp5TzZFf0F8uXbpe3l8mX4Fepl7gXfZdQh+K7ppfkVzmXCFd5l4eXBZecV1QXT5dDF1zHO5f8V9eXipdCV6xn35dSl1xXyle20Lf9r5fMV/xn+5eWl0hXCle0VyvnUMmll9In5ZdxZyfnixfVl3YAWMdpJ1fnXhfk4xRrg1DbF/rnEhenLFIXkIoyFyZXN5d0AO/n4lehh5igi5cGJ7bnmhdT+0HnZlf5l0cIIlcPlyLHIBezl8RXBecRVzV9KkDGh9FXxxdTB3FXbFfBl32USVc/l+wXcCdzJ7ZXiucVlzHnH2e/kH57blehhxSlTZfeVy2XnYh7F6qnBxfbFV2XLCchVxEX5ufpl+7wX3V8V8hnGlcrl1pX4pclV7pX83szlwCnf5fmTloTF5fYVyBXpGdPF/hXEFdpl3NXN+ebZ4tXxlcB5++XuFcTl5ZXq2ebl5mH96NqVyNXFFesV4hXCVdsZ4iXdFfd5+H7MVCRVxdXMleUV9dX8leKZ0dXP6cnV97nB3XnV1CXl1emV4VX5lefV40Xhpc/V0P7T1dSV+pXgNfBVweXFeeg130XYlcQ141XF3XQ1y9X8FdvV3JXCNe3VwSXqFer54MX/dBNV8NXANevV1dX2NfCZ2tXolcbl1BXq3CDlzDXZNdA1+9XONc6V4RXSlfoV8bQG+fo16TXmNfk12OXLNeTV2zXRJc0Z0FuSefc15iXsNeaV5yXH1e417aX+Nf0V0YHYtc7V9JXvNdM1xTXq1eKV8LXU+ei11BrRlcq1yxXatf815TXmtfRZzZX8SdOF9nHSxfOVyUtKWdrF3hH0HDIXdlnNce6J4bn+WeBV3tXwFc9l4oX3Feolw7XgFfqF07+HtecpwdXAgKC1+GXfyczVxkXm1cL7bf9mmcB1/7nlKfxVx9XNheRZ4fnZteOF6Knzhdn564XNtea5/WXSDBRgKUJfhep567irXjtl1vnnZcxV5l74Re6p97X+lff0OocWFe7VyQXwNc3V6zX4dcGF2FXdYfNuf7X+tdBV1LX8NfG119XTRcDV0vQhde91wzXqtdw10nXAtdU18lX7Nci10gw7pjPVzzXBtfT163XMtft13aXBNePp3zlK9cS14zX69fM10PXYNeQV6PXY9AACPvXcZeH1wPXM9cn10jXNNfn10Ll9NcY12vXt9cb17PXJtc713Xny9fi19fXU9fv18fXGtfD1+DXtNeO0C/Xq9f912NX0tef1yA3Z9fR1/3QPddMV33XQdfLV9LnYFdz16VXWtdlF93X21dN1yg3LddAN1+XYdfb1wrXlufbzhA3B9cAN9A3g9fAN6fXG1fpV0gwFDcT16/XUDeCVzA399e2FyPXCDdL0M4gV9dXl5LXNDd313Q3D9cll+VXnBdll1VX9leVl45XsefOV3VXttf51wcIrsCO1/4XztcG55IXL6fu16bnfVd550/XHF38N1bMgdeJ1x/XPacp13dXK+ed1yjX6icqN1lXfueOJ/bnIdfFV5g3U1cIB0fn0jc1V4onqyeBg4o3sqcSZGOARdfNl4cnrZeAHLZ+BieV13lXaYA116Vnddcc1yxQIOfIN5PXb9dCN6Y3IjdcN9XnqVezV4w3Bwg2m3rXSTdsN/tX41fKl3A3DDc+10OHATcsN5A3qDdON4jX6TfwN9k3LFAxHIY3q6eCN+w3tDfENy43QtdoV4vXTpulp/9XVDfJN203wjcdN1/XZDcSZAk3/Tf/14M3hTccN2k3qdffV7TXv92UN1M3BTee10U3NFf0N8jXizdNN3/XAjc31yk3RDcYN6M3D1cS+xU3iTesN9U36zdrlyU3Wzf6N/zj+Df5N5c3szcjNzc3j9c8N8F78gDLN3s31DdDN6k3LzebN283DTeFLLUnyEBLVzU3stdhl6Q3JzeSB1pJ6Jdgt1c3HFevN4+XcTcfN3C3zdejl7qXd5ckN/LX7jcLF1nXVteYx3+AdZd+N/LQxlCqNyXXj/h6J/5XpgDaNznnujfnF+83KbnNN2FkxjeONwi3BjBb1/jXVje01xW5SC32Nz5YQdcFV4c3MkfmN3jXdFe4txbXhCfOV9wgxLfX5w2Zx+3hvTQn4hfafPonHscHddM3aze9V7XXkRdlNxJkwRDMt7lXgrcO5+rX1hectxPn3Lf6N/q3djfx1w43dftCtya3jOeit3LX4rfp1/MXkrcuF6wAGMc+N3nXJLemkd2Zl7AtV4cnLteaN0bn6rerNzhX0TeQ5zq39dcbev63M7I5V+YXRrc1N063kLdct5k3UddAt9QZ1Odb54a3JjfCt1xHKbdFl+HX1lfiNw4XbreZ15bXTleuF65XnhdBe6mgYIG049gESrc5Z5ny0mjWqVo3D8fSAKuOZSf0x/S3XdfrF9rR9siITPQXPLJSWHm3DrcYZ503Hdfpt2M3ektaprBKbKejt6ubbLfPN4UXU7dQt6CXQSbaC4wUOQI3Fwd7S7dBCfH79rdG15+n67fy19C3gdatyD8cu7eLt9vc47cnt7dnZ7f3V5u3+IeH5Au3F2cHt/e3mLco50+3VlcXt5+Hj5hDt1qcI7d3tyu37Tdrt8c3L7c/Z3Da77dDl5+3YHfDNxB3SLd6Vyi3tMWAchnqt7d9DF+3n5dIdwC3yLc9N4XQp0l8u0mkIHdYdwh3fze4d6I3KHcEdx0ATCXEd0EJnMfwd3a3xrcPt5R3dTelNzG3pECuOPR7JHeMd6B3zHfgt7+3x1dQV60w2xhf8h+3/HexVyx337esZ0J3Czfn16qzqxGmqJcSpHdWONh3oFeTt5B3/bfsaFe3tyiaqAx3v4dMd1J3gndad9Y3n4f6C3p3Knd8d2R3Anfst2kIpndQV4rTeqbKd7x3hneSd0e30nc4d5p3yHcL19rXBigs6pZ3rneNB0Z3Hncmdz532DeE1yZHeQOBdwZ3wXfud6f7x7cyd58ncnfcN0C3ZGCBKC53sXd0+yF3CXeedxp3P7cOd+fXSYC8po+7VndudzZ3xnd2d4ejeHfUd353Kkf3CvR3mHdqd+R3+beyd4V37zf9AO5YjXcSdxV3oXdVd2jXNXe+dzg36xdfLkB3IsLWd813tnert953g3cRd+qXo3fdd3B38XfZB4l3XncFd+F33Td1d2iwX1CLd6p33LjqdytXj7ftd0C3IvWdSjx3WXf7t8t3+Vd5d4d3bHfzN6l3urebSIR+sHd7d2O3LXcTt+t3s3ebd8N3eEfisi93E3f7d+93rHczd1R3Q3eRd4XwVGj/d+V3k3eVd9N3n3eg93N3wUdB0GN31lQA9293U3fgdyD37He3N+83Z0tX2De3PXcw9313cPdtdxt339fv+1qgxvLid0t3vXe5d2F3X3czJ6W3cxd2V3i3lbdyN7UAyScCFw1X6ieHo7rDQT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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 copyToClipboard() {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text = text + node.firstChild.nodeValue;
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
text = text + '✓';
|
|
}
|
|
} else if (node.nodeName == "MARK") {
|
|
text = text + node.firstChild.nodeValue;
|
|
} else {
|
|
text = text + node.nodeValue;
|
|
}
|
|
}
|
|
if (cell != row.lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
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 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 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.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
|
|
showFootprints(settings.show_footprints);
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
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: "default",
|
|
bomlayout: "default",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: false,
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
}
|
|
|
|
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 (!["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;
|
|
|
|
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);
|
|
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
|
|
|
|
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;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
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 (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.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);
|
|
}
|
|
}
|
|
// 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) {
|
|
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, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
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();
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.fill(zone.path2d);
|
|
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.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, 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);
|
|
var fontsize = 1.55;
|
|
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));
|
|
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) {
|
|
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));
|
|
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 bbox = applyRotation(pcbdata.edges_bbox);
|
|
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;
|
|
var flip = (layerdict.layer == "B");
|
|
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;
|
|
if (layerdict.layer == "B") {
|
|
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);
|
|
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 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();
|
|
}
|
|
|
|
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 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 (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") {
|
|
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
});
|
|
tr.appendChild(th);
|
|
} 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) {
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
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);
|
|
} 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");
|
|
td.innerHTML = highlightFilter(Array.from(valueSet).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("bot").style.height = "";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
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("bot").style.height = "calc(100% - 80px)";
|
|
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) + "%)";
|
|
}
|
|
|
|
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;
|
|
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";
|
|
}
|
|
|
|
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);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div style="float: right; height: 100%;">
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<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="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
|
|
Highlight first pin
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</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">
|
|
<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>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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" style="float: right; top: 8px;">
|
|
<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" style="float: right; top: 8px;">
|
|
<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>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="fileinfodiv" style="overflow: auto;">
|
|
<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>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<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="copyToClipboard()"></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>
|