mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-12-27 05:21:55 +01:00
4415 lines
324 KiB
HTML
Generated
4415 lines
324 KiB
HTML
Generated
<!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;
|
|
}
|
|
|
|
.help-link {
|
|
border: 1px solid #0278a4;
|
|
padding-inline: 0.3rem;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.dark .help-link {
|
|
border: 1px solid #00b9fd;
|
|
}
|
|
|
|
|
|
</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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tKwQy/3L3+NRy5tLqsuOZ1Pz+0vTy6nLxMuGy9ZLy8v5y7TLtsuMy8MALMvHy8iL58uDS9fLvsudy8nwPcutC5/Lw8vbS+PLoCu4S5Ar88vwK5TLyCuWy/RLpcuOy+9L3Uvcy43LgMuCy4/Ljzr0K8qLzCvGXCPL5md5S8nL4YvQK7GLiCumAAXLjEvly4ornMviC+or/MvrBStg4fjyS6SLyUuiXGtLyMvIS4nLwYv8K6RLwivXS+Ir68vSK7vL2CuHy8oroSuXy5or6wVUK9bDEsuMK/DL5ivsK9Yrk8u8K44rgivky5UrniuoK9vLmCu4K+0r/UuBS8NLlCu6K4EcBiv7y6YrqSAWK8Ar2surK6Urmyu5y7srkiuNS8crrSvBK5cr3svhS/7L8za/gkkrzSufK7HL6sucK4CrhMvrK9nLtUuwq/TLmYv7y+1L+Cuey7cr2KvUK/q9VwBKS6SrkyvfK7Mr/yv2K4yroKusq6vLsoAby74r8iv5i6irvMuty/fLxN01HgSriquyy/ovFKuAK8yL9Kv6y64roivQq7Ur8Ku8q80rgqvnK86rt8v9CbVUYaxOtcSr+i8eS9pLmquRq7qrsauLy4mrtEvpq69L9qu1y6or3SuRK5JLxWCVq6/LiAupS5krysu5K7Srnavpy7Ar4Kvsq6mr3Kujq95Lk6udK6QrvSuLq/+8KN6Hi5ur6SvPxr8r7auFK8Cr50vdSLer5qv1K4iruauOq+ErrquBtDEoDVM24GurkEvbq9Brrav+i9Gr56vxq9srg6uPq/4r46uny9Or36vzq+qphxn0a68ry0usa82r/8uYy9wrs8uGq+hrpqv7gBarsiv8q5XL+auka8Wr0SvFYPUwCw81q6tL7GvGa/krxkvFK6hrlEv2a4WATmuNK6crxGuzq+Rr6wU+WGpr1auKq/Wr6Uu/y4er8yvma6lrmcu2a9Ur2GvDq5Jrr6uya5+r1yvkK9irjGAeUxproGvMa5Brhmvda9qriGv6q+lrpsvja45ruGuZq8Vr76voq+Kr40ueVDRrjWuLS61ru6uwa9xrp6vOK72rwmveK65r2auea6VrimuVa/c0esWrq9pr8Ouxa5dr8GvJa8hrw2uZa69ruWufa8+rrsuLa4Dr62vjS+/mEOuMa6krgQAI65xrtiu3a92r5SuQq6Jr6Cvfa8ir/2uFq77LsSuM64druuuNq6Grpmu8a5jr1uuYa+9r02u2q/NrhCvya6trv6v/i/Vr2uu6a6dr4euJa7jL/OuXq8arouubAHlr+Guk6+7rvmu/i4c+YajIyNprgavfy9kr2Uu9a9HrzKuja8mrk2via+nrsuvZ68trmKvG85Prnqiyq6Mrxiuqq7Xrx6vm6/xr2Ou26/jrhWuu6/LrnuvhS8/r+Kvz64PL0yvxa4AbvOv3a4Lrz2uH68nrp+vua4Erw+vla/5rtOuU48BL80vpC/pr/+ub6+jru+vC67Qb4uup68wb0mvX64rrhevoG+scWBvkq51r6+vXa6QbluvXq9lr3euS67Nrl+uiq8rr2LSpByruPqvhy5Ybq+vxy8QbjevkG63r++v264crzuuEa+wblOvcG8dEYRv6K4Hryqvyy/gbnOuo68AbseuuG53r2AA968Ubg+uIG6PrqBvaMs3wZhu/69YbyRvSG/0b8hvUG/kb1quaG5nrgRuGG6sb1cAbG+0b6quEG4cbjhugG/Hr7hvjG94b5+vCq8Qr+evKa8YboRHiy8Ib4yvfG5Ib9hvpG84b7evKG54b6hvE66wb8xucG+PrrxvBy80bi+usK/8b5JvgK83rgmuQG/sr1xusm9objxvom68b3sNyq7Eb2xuJG9SrgJuUm6Cbwxv0m9CbzJu/a5yblRu8m7EHYMufG8Gruxu2m9KbyyuZG4qbieuqG4wbmpv3G8ib9+vVL0FrmBhha81r0Wvna7Yb3OuOm4MbtJuXG4Trvpu6G8gb40vba6Fr0RuiG9XrsZvhq70bwJvdm7kb0Bv96+ybo5uLG5OblZuCG5Fr4hurm5HrshvWa4ob/ZuwG6Ub/puom9TrqmuyS7WbsOuNm6Sb7Zuym6mb4BuZm4ybuZvDm7qbkFumSFNLiSv1m8+b1pvrm6br25unG+4r/5vHm/mL3Qvli95gIvP1i5/zrYuzC7aaEAAAAGFZDBsLw4u68+FLrC1/qhbzy4uTi/cLii3u8+/mWmv/C8e1Q1ASG7CLmfPPi8WbwOuDYUFrjltzm60LjYBui8jrnFudm7xb8ooQm5Mb0uv389qLwgvRW8EbhK0Vm877QpuZwFlbxuuLK5Zrj2uHQCdcAlvTG4or4lv9C7Jb3QBjC6mAUwuBQHMLgABxAAA5AAARawuQAFsLplvjS+hIBzSe9HZb4kvOW4oQbvOPklprgF5GABzjl2cQYCFbiIvkW9Ub3Dx/W6ab6Qv0QHnAaNupG5AAC7UVC5yrjuvVW7wLggvV1CtblYubW6YAO1umAAdbooBzC6sLz1vvW5wAewuoG7OLgtQpIBcLoNuPC4EALwurYE0bvlufpSub0Iv3i+FbpxVnm9ybqBvMKH+qKVvOi55Lqr1ei6NnaFvJm9Sb27QJi6qbg5uHy/zb9Vuv881bhhuhyZQ8cdv7y66LiN7p2/XrmFv526KLoxuVW74bkxUi29JbwwvbW71LylvHW+pbmlvKkERAWtuigD+Ln6k+U9ZhFtuO87bb7lvvC67b8vlAi97bnCZY25Fbueulm/hczfMvOlgbmVv92/SLmdubm4Vb35vxi51gB5uLW9wL34uC2/qLjdvKa66MNlJkYWTb6VvJ278b9mc+i/lbo9vOm5dLs1vUO9VbhYumACWL61vr29Lb29v7W+2Lh9ua28ZbutvVG8jiYewA26uL79uuW+wADtuyW0Sr7tvAO6xbmNv+27jb7DuQW6Jif7x50D1bmDup26Pzw9u524o7hduUO6XbgFuVy9Xb3Evea+Hb8gvzARsCeTuCO8qLxTviO4pAFTvjW5Qb01uNO5zbhRuaO8vb1YuVgHJbzYuWO6pbpzQQAB2L3AmGW9rzzju/i6Yse1xWmj47owAe84zcdtuVTVprsmBsAEGoIauJO9+Lj4vB2/jb/zvhkG5SYVITO8Hrh0BZC+U7jNvVO7ubkkBT27Cbtxvqi8w7vEvpO9UbgHZhqKxSHduV6/rrugv7q4s7nLurO9kb/Lvum7Pb8Ju9O4Gb4UuKu8Ng10vNG6zrrLv/y8s7g2vmu7PIVrvCu/mb/huyu+S78aIeu60SD5uQa4G76WdGu+G7gmvDwHNbmjvk6+Bb8ruurD5cBe2+u9FrxbuGu/ab8ju8u9G79bvz2467rbv/O5274Gdc0327rGvDu7hdCZumu9W7grvem/AbodvOu8bz63JrXqq7zOuDu9i75bvym9jrtbvqO4u7zbvwO6zDG7uaLEjsebvau8e7pmdnu5W7kHu3u8RbrSvHO5Lbuhu728rb6ludi4eWA4vfO9fbhtv/NMfkZtvA247zpyZwu6IYzRubosYASj2D25oAEDvEu6m7kdv4TB6oqhB9u4CEB0BNtAZ747vcu8VbgMIwe/CbnTuNW7A7sVvH41EIHqiCm/S7y0uue/uhoDuhu+B75SuV8iF7oruIm7F7rVupU0l77hx7YE5716B5e6xb0jujW+R75XvlW/G7pFuWe4/r2aEOqN17mXvaPR5Lnnu4O8V72FvTe9R73Nvwe+Ubq7uoG+t7tYPl6/t77nuhq6N7/Wule5srlXvNO8JbhZuNe83b80gOqI57u3uJewd7wPv4O7I7/nukO7HSVXuJu4vbxYu9C+Lbxjuse7c7+9uPO4sL4D0X2/rbj+uzi+jmXjuOW5/bwTueW//biWce2/E7xnvJO9A7t+vxe9ATFL4NU1gbvdulO8G7oHuXe5srxdu7O+qbuCuRe/XbqPvom9Hbrvu9W5778zunu9nbl7vY66H796v3e/a7jHu8+7Lb1fP3O+sAHYuzTIJ7o4u/i9CIU0uLi+C7nwB7Z2sGUNupz0zr+I5I24L+IauI52b7+LuB25WAIFvIe4f1tMm4m5Fr24hMu7BOOQucu+erjPvR+4w7tdusO4n7kFu2fBgb/bvv+8TABnw/+757gAfw+7Q7yPu2+81794BdVA0caruSWB5L3EBYB6Pz2Av4B9ArwAePu6S74UvLvEgH+PvoB7RAXAf/y/wHiZuEB+H75dvAW8+7r3vG89W8cgef66pLygecB6Gr2gfZ2/oHlfv7O4971/v2+8rJ7OPP+/Wbrgff+7wHxguEO9aaQgfEB427z3u3+8Bzdgf4m5BLyQfqB/ZnXgfZB/rLogemB5IH1gf8VswHnlBsB6kHmgeZB5T7/gfH69X7tXvLu+UH3z6MB/+7jQeeB4sHiyurB/QbmwfM+7sHkQe0M1ZTjTaoB8PAGAeXB5U79wfZm88Hi3uwB9Ubpz1VB6/7wIeqB+CH//v5B4YHrTunm4MHg4A8yf8Hige4h+4Hq5vtB8sHpIeBB5H74gfLe6dxux6VNoCH0wfNB4pAPIe3B4KH6wfBB/a7iHufB65rRweKh5/7qoeOABqH3CvQh4Rb8Ifih8iH/zuvNuRgNoegh9yH1wfuh7qHjweGh9sHpofUB7qxmIeJB+yHswetB/GHxAvJh7CH6YevB9mHhevbkQWHiFvnB7GHkIf1h96HzYeIh5QHnYff9syHjgfLS4OHrFuuh7WHtgvkh4j7ybuBh667qsnyh6yHyoeEh4IHx4fCh8YHsxvmB+UH2VE9h5TbpYeOh5wAe4eWC56Hnpu0e/0Hkoex/gyHnNgnB7BH74e6B+OHmEe+h7hH14fvu6rJpEeRh/iHw4fEh9+H+oeih6xH84fKa4cO1ofPh/aH1Ee+B/RHtruZh6UH5ofLh7xH6kfRh7uH1YeoR/pH83v+h/JHkFvdh68cP3uTB5pHwkefh+zbv4eUh9qb+Efw8cFT2MX8R5yHjkejh+JHqYfSR4BHtIfPcdVB1kfrh6wHkUfFR6JH8UeSR/+H1IfpR98AFofJHCFH24f6u86HzkelC+hHhketh6ZHuYeg8hEvC0eUR9FHtEflR42H1UfjR+xHhUAhxa1HtQfOB7dHvUexR7d704feR/obymv+XBdH5Eevh/dHukfPR5OH70epR99HpGBNR7EoeUflh+qHm0fYS7tHnkeyR8jH8Ae4VoDH2Ie4x5DHj0eDR5VHo0eUx75H1RvPdxBHiAvLR7gHisewx+TH5AfCx6iH1FaSx8WHsserR4hHnMeNGm5H97uCx+ObhUB847lHtkeCR/LHhMfKx69H6sf2x9HHiUAy4+7H/Yfgx77H4/OlR9nHpMf5x5eH2sfD++sCQUfYx91H9cfIR9tHocfYR7VHk0ecnhjHzMfwR43H/UfWx53H9Xu9x9IHt3GJx+1H4Uf2R5PHgce5B8THjEfwx5HHl5uWoDbFjMfJx4VH78fNx8fHyUeFx6An1kBfcffHwMebh7XH5seZx6gn54fnx47Hv4uIORvHsCesx+tHyCexu+HHy8fUx/9AdzqEJ9LH48eUJ50HvMeiJ59Hl8fG89j8Bsf1B+Qn6QeCJ/O7xofHR4XrxifDx9vH2kfqJ/PHzEfiJ/ong4AszHNHo8evx6on/Ie/x/tHs4fMJ+FLykexJ94n+Mf+J+kn/MehJ7knhifER9Anj8emx9Ynh8fCJ4vHuieNJ4OAXEftJ8QnnUeJJ70n0MeDJ8EnoyfFx9Inj/vjB90n8we2J70H9Sf7J/GgU0GPh50nlieXJ/0n9ifGR+EHuYeQkiYnoMfex8kn2ofVJ9onmsfjJ8p8MQenJ98nlYfXJ4UHi7v1+7WLm9uKW4L7nHuPO52L+luvW447onvG8/eZZvOye9P7twuCPnbbnnZaa7UhxgB8CHv7t4un+6k7kiftwSQ0q1RS+JFr8yADe4gn/vvj2/RCNyfvS7H70AfhJ88Z+Lo2p/+7zqfgpOUnlPvF+9d7myeAJ/cn2CfmXHifMaf9u4mnx3u/J757mafQ+7N76KeYJ/070FxL4hWn+Pu1p74n6aeTe+2ntCekB93H2KfmXEOngZJWYQ6nxPupp+N7kPuXS7D7p4erp4wnjye38gYQHDKHp/Wbk6fnp+D7gfu3p52nwyeYp++ns5lttUStVaenp+nHnQetp9Bny6fFB6CnheunjdZT4C5xp7hn7qfNp/OnpGe5p7bHnUu0p+c7jKfXO/Lb1juPO5pb/YufO4P75lvIXBQ8Nluyp8MATluhMV/bztuZe9E7gVuvm7i744uEu5f7wEefB6kjJK1qu/WAIjuoW4RnvGf1O7Bn2yf0O+OLkrvvB7mHoWfBW2Xr0WeHQF773Ruzp9enqWfkZ9Sn7PuSW6c7wwAXO48AbHvQAHMLlQAAADV2O8J7svvKMtqhpXcgu+r71hBQ29YQTRuI24kAAlb02+oAJnv+Z/VH6wU/W5lpAjwv+4CLufvEe+hbrNudZ+F74AfdO+Jnw2fSZ+NnrKfTZ+pbiwvO5Rpnn1uWi/CctgdGZ8dn1mfa+7/bjmeAO65npvuvZ5b75nvmp+LQQOJLoBn7sWerm+d73qfTW4jntXvBp9K7suf4i8zn7vvq56LnpHutZ5Pbgmenx9o7kAB6O9z79KemO8yn8mft+6mAAAApfHvU5787+SfSS8lULOeg25zMdtvBqLt7giDEgDsKEOfBO4an3mfn++Lz32fxoHiYQiwFLRn71Nv4rAiniYeop/Bn7Ev5Z+2HqMfaVBu1dsx4+/fUW9oL54eHrcf/x8Jnr6fFp8PnqiQhUjheKAfU29ZhN+euR6vnmWe9p6+7ukB90eugbsWRa6ygAIu7x9PH3MeBJ/mnuyef59l8B2BPDnEQfbvOwBxhIGf354bnh0fUZ6jH/GpwVnisEWvcF+AXqyeWx97n6Cfrp++notp6XGTcU+eAi/Pn6hfUJ9oX9CeFZ64no+eBkkpnGXvTQdAN+GepJ4/nmSeIx4YX3he/EjenRKvBF7YXjaeaF4CnoheBZ+Cn3heNBixwFhfHtTkXpKf/J/6niGf0F8YXp/XpF/6r1UGhF5xnhRfdF4gXlgeoF5VTK46NF85kU6fIp9EXtSe0F/2n4sBuU2J8Kr0ZF8Fr0xeQF7PHsBfUF70X1xe39Zy9V6h9u5fngjxfF+QX/xev5/7nweer2+Hn/Pux58L7nfuS+4Knm2faYD53VOMq+9bbrdvBO+GjZeuoYQkAQtXPZ+9n/eerx8MZzBeIAvEHiFvMW/XH2ue1O7+bixfiu5AH5ufhp+ZcJIaYtCFH2pfPZ67nkGf7m5SnjifiF5Bbiyq2L2CB/7vul+y73Gfu5+cbppfv56CXwIaU+o1TLpfLm87nhfvJZ8aXgZfAp+UXheuRl4Br6peLm9q7zZv5+4ln6Zf8W9mX7hecO+9YvRJll8OXwHupl76XjZePp5Rn7ZfLl8WX7sxjB4mXvvv7l7rn/avzl7vn4Zerl5T9G5eh65rnnqeGl5mXzZelF4PnjFm2LxsScZeVl7qXsFfTu7OXyFfZJ++n3ZebAjQDe7uEV56XtZfTl9+X1FfxF/QXjFfRCX2X4Gvbl9BX75fwV5RXp5ehB5eX4ZfXoatlFWe4G63n+pfkV4JX2lfBl/pX1RuKl6/rslfHa4pX1ZeTl4eXiFfOV62X6Fe5jBMPEZvL68RXqlf2V7jrwlfAJ/mX8Z2pV71b8RvZV96Xn5eFV7FXqFerx/SMVVeBF5ZXu5fNV+pXjleJR64X/5fVG5idg1frh6KbnRuju5NX+VfKm51XtFfiV9OgG1fEJ7tX1lekV4F751fzV8+ni5fhl/Ot2FrQ6+/LlpuNV7xXkVeaV/9X55eJV6EEkNfmV/VX3FfhV61Xv1fDR7oXuZfIF8z2f3APV68XpNfJl8dX31f4W8/nvufLV7fbivv5D2lX4pulu7lXotfpZ4CXyxflB50uXNfjF/zXr5fC17T7s1f014tXzifKa95XmPPbtXj7z5ea147Xk1uu16rHjNfA16tXtqTK17VX8Nfk181nqNfx17nHydey1+FL/+EW1+abxJvKV9HX6zvl1+3H1dfe1+GX3MCE16rX+1fjl8XX1Nfi17EXpVes15wCO40mV7PX71fa187X7VeY17pX6Feu/EXR0NeEm9GboVfL19NXt9fu14DXtdfG8/78Tdew1+3X/9eXp6XXoDeJ157XoZfVG4T8CDff15lXhdeYN6vX+teYl9A3nMr/Z8fXudeoN4jXlNfAN7TX+DeQN6PXpDfrtVPXgje/16I3gDenV+vX5xfAl7vXjzpGV9nXw1e215HXyNfMN8IX11flV/7XqkePx+HXh1fuN5I3xjfdp/oX9Bf51hQ33+vCN/Q34GeeN84X8jfEN7+L7rYZN+8r+deC19E3hjesN9LXijfVN+gC9jfbV6NXndftN7rX3jeiV+VXllP1N60b2jf5N9vr19fSN5XXhDfuV9U391fqN443zTf217M3xzfxN+vnyTerN+DX/DfPN7k3rTfiN503izfb16sX2mB41+C34zfON5E38LfzN6U32Nerx+sXGzevV+NXnzex17g35zflN9c34UuqFwy3kzfoN4U3sTfdN8PXlTfCt+thDzf4t683rjekt983ireXN+hXgTfRi2BX7WvSt4c3nLenN4PXlre0t5nX4TOQt7s3sLf6N+S3xRe+N5Y3j2qGoaM3z1eSt7o3jDfyt8i3haerN5PXuLe5t4S3i9fFt4i3lLeP17S3h9fZt7zX+rfEt7G3prflt5cXqbeW52K3zbfQ58a3nre/N/AXgLfLt46X6YsPl5xX0bftt/G3v5f9N+FLtrf98HhXwVeFt7K3nbeJt8s357esvB17/leMu4br7ze7t73X3Le+t/y31reXt4vwAHeQV663n5v7t+a3pHfyl5R3qqE0d863oHfut/h33reS18q3greip5e381zsV8B3+zfMd5J3h7eG16e36Lf2l4h3izqOt5h3hrfTt6x387fmN5Z3gQI8d8aboTf3t9h37neGd+x31Ley57+3urMCd853k7fPt7O33beuV+R3tner41l37Ov5d+B3r7fFV5W38HeC9V20DneNd623rXfFd9B3qLflB+l3hncad/R3onf6d5G76NfgN8l3tpeBd9V3iQt1d6OX27exd/t3/deyd/63qXe8d56sa3fCd7p3xxvTd++3qrfKd9d33qih15F3rneFd553pXfxV9x313eRPHd3rLe4d+93hHffd5x3/3fVd7hXoPe5d+N34nfM99J3m9fdd/536Fl9d/g8Q3ePd9dnXdeS98Z37Deft8j3qvfx1jT30zeM9+mbiXe9t9z31vf+Ynb3jHfQ94T3s3fy94t3lHffTAH323eh9/F33nfG158Hv7e08YL3o3fPd/j3mffE991X3vfKl6XISfeQ99xbsPedd4u3iveF97MnuHubd933xDvh9/D3infQXGu9AwJnyLq30LfRd9X3hvfu9+V3/bfaodK0EWf5t/P3k7vtd5dXsHeK97pgKS97942347ei97t3rvfZ9+Z3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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function() {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function() {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function saveBomTable(output) {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
let val = '';
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
val += '✓';
|
|
}
|
|
} else if (node.nodeName == "MARK") {
|
|
val += node.firstChild.nodeValue;
|
|
} else {
|
|
val += node.nodeValue;
|
|
}
|
|
}
|
|
if (output == 'csv') {
|
|
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
|
|
if (isNumeric(val)) {
|
|
val = +val; // use number
|
|
} else {
|
|
val = `"${val}"`; // enclosed within double-quote
|
|
}
|
|
}
|
|
text += val;
|
|
if (cell != row.lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
|
|
if (output != 'clipboard') {
|
|
// To file: csv or txt
|
|
var blob = new Blob([text], {
|
|
type: `text/${output}`
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
|
|
} else {
|
|
// To clipboard
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
/* https://stackoverflow.com/a/175787 */
|
|
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function(s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
if (config.fields.includes("Value")) {
|
|
var index = config.fields.indexOf("Value");
|
|
pcbdata.bom["parsedValues"] = {};
|
|
for (var id in pcbdata.bom.fields) {
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
unit = unit[0];
|
|
} else {
|
|
ref = /^([a-z]+)\d+$/i.exec(ref);
|
|
if (ref) {
|
|
ref = ref[1].toLowerCase();
|
|
if (ref == "c") unit = 'f';
|
|
else if (ref == "l") unit = 'h';
|
|
else if (ref == "r" || ref == "rv") unit = 'r';
|
|
else unit = null;
|
|
}
|
|
}
|
|
return unit;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
var unit;
|
|
if (match) {
|
|
val = parseFloat(match[1]);
|
|
if (match[2]) {
|
|
val = val * units.getMultiplier(match[2]);
|
|
}
|
|
unit = inferUnit(match[3], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
match = units.valueAltRegex.exec(val);
|
|
if (match && (match[1] || match[4])) {
|
|
val = parseFloat(match[1] + "." + match[4]);
|
|
if (match[3]) {
|
|
val = val * units.getMultiplier(match[3]);
|
|
}
|
|
unit = inferUnit(match[2], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function(e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function 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;
|
|
}
|
|
if ("polygons" in text) {
|
|
ctx.fill(getPolygonsPath(text));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (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);
|
|
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) + "%)";
|
|
}
|
|
|
|
function constrain(number, min, max){
|
|
return Math.min(Math.max(parseInt(number), min), max);
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowLeft":
|
|
case "ArrowRight":
|
|
if (document.activeElement.type != "text"){
|
|
e.preventDefault();
|
|
let boardRotationElement = document.getElementById("boardRotation")
|
|
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
|
|
if (e.key == "ArrowLeft"){
|
|
settings.boardRotation += 3; // 15 degrees
|
|
}
|
|
else{
|
|
settings.boardRotation -= 3;
|
|
}
|
|
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
|
|
boardRotationElement.value = settings.boardRotation
|
|
setBoardRotation(settings.boardRotation);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
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>
|
|
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
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 class="menu-label">
|
|
<span style="margin-left: 5px;">Save bom table as</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
|
|
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div 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="saveBomTable('clipboard')"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom" id="bomtable">
|
|
<thead id="bomhead">
|
|
</thead>
|
|
<tbody id="bombody">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="canvasdiv" class="split split-horizontal">
|
|
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|