mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-24 22:56:52 +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", "Notes"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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1Uujy5dLk8uUy89Lucv0y4vLsEvDS/TTQMvRS+DLiUuey5pL8Mv6S53L0su9y4EHDmRDy++L7Yvvy/dLxsu/y+bLgUuii7bL4CuVy5zL00upi/NL3suoK4eLwwAni+HL5kv9y40qRCvnS+QrqSBTy6bLjMvAK6zL68v7gFvL8CvCK8grukuSK7IrxUvE47GsAiiNi7kLzov6y8VnXUvDi/1Lpiury5Arm8uwK+7Ljiuwy64rm0umS85xDlwTQbq1j8vYgA6Lusu3S4bLsSvzy4kr1sugK+zL0Cvcy4Ir/MvOK8fL6Cvny93L5tRHvH4r9Yvqy98ALSv3C5/LnIu9S+JLySuSi+kr1ivZK/XLi0viK6Ur8ivOcSEoNSuBK8croSvtK+TL1Cu9K75LgCvDK+Yr7yuFgDYruSvzK4UryyvuK/lLxUvszFCrhyv4y4irlyvoq9TL9CvGK/irqSvcK5Mr/CvQy4fLrcurK9IrzKuRy7m9lovUi/Cr5yusi9crnkviq7irrCujK5YrpKvfK7Mrjcu+y9lLuquXy4ar4SZQmfUr1wAWq9rLgqvdK6Kr9yuWy+6rhKvyq5kr0yuqq9uL9KvAq8VLzwJ+U0mrqsu8q9arrUu5q9/LhavMK79LoUucK/0L/qv1q83L/suny5GrmyvzwgmrsKuDq5mrtqvCq5Or8SuPK9KrryuVq58rtav7y42rmquMq9GruwvBxfsr6iuay55SSKv6K86rgyulq7Krq6uAa4grtKvga62rsavc9ByryGunK7ero6vRK/mrr6vFq/Or7CvjK9WryqvAa9ur4aueK4xrz2CIa40r9Ivoa9mr/GvPq/0r76uEa9+rpGvya5Rr6qu7q9qr6mu884nKZ6vcq9kLw6uRK4BLgmvWa6JrpcuyS7+rvqvka/krnmuqa/qrgWuhMp0qbGupy6TL2GvTq8XL/0uZa85rtcuBq/8rxSuSy+Ur0tRVa4OW9Wvjy7or9qvZy+1ry8uOa87L8UuUq8GrgKuTa6Crs2u8/x0cCcvPy9orvGvxa5Zr2Kv4a+JrnqvEq5sAZKu/K6Ir42uYK9NrhaXLqMrLpwuRa9xrsWudS4lrwOu2a+Dr5av9a6driOuLK7Rrt2umi8AWawdZmmFrpCvsS81rm2uzy7TrqWvda/bLrOu7y+5roGvea5Brx6vC69uo7Mx6a/NLr8vra4+rtyvCa7Or6Wva68dr+uuFa8brpWvQa4jUc2uhKA7rhMuu679rlOuA6/nLoOuB68uroev2K9SrxWuBy+sr2CuStM9rh0vLa9nr5OuPS97ryWv+65rrlevVy+zrw2vI682r/OuGq9br9hwVS6mrycura7nro+uOq7trzyvly7rrteuXa6jrreuY653ryTL0S+9r0uvNS8PrtCuP65+rr+vV6+dro2ub6+jr92vB1F3r6gh9699r8BuYq8Xr9Ovl69Jr/6uua5HrymvN64er7evP5iLrwdjUG7LrlCvjq+PrquvT64urnBu5a7wb9evR68Ib/muJ6+QbirNyG7AbnSvma+obzBvq67ob3quw6+urimuhq5Yb5WvOcSz0SQvmq9erxmv3q6ob9+u+651rgRvQ69gAcOur69zrpuv0a7sLnauUi5AbhmuBABhriuuGK66rjOvEa5gbnOvUa80b2+vtG+SL/wY9G6hrgxuma/9r3hv/y6Xrs+v6G6Eb+WumG4Ib+6vWG5zUbKuKy8cLwSvRa+4b5xuFG5PrpRuSa8Eb1RvhG4brnxu+a/Eb/xvbG/jr4Juk69Cb+euXG4wryJuQ69lrzxvGG5dr5AveYGIANAufAAwL+4vsC+PIPAuAAGEZDGIL1ABSC8QbgrRDqI6UBq0aC5HL8vPonkYL3PRsa6bz7EvnonQbmgBeC67z1oYx68erjf83qgfgaev1gDcL1Gcta8Ub+2uHQGBcXJuYm68bwavRC4sLm/OxG/Hr4PRbG5W7KZuZwFnzoxu4a6wbmuulm+/r2BuiK8Kb1AvE87Kbu/OKm9wLrIYQAAAAZQAAdXTz3QASC+zzhqu6rVrDBVxZYBLz9pu8fEYLtlJp6+KUAQBCAlfrjxIhm/4L0ZviG6EjfZIS65cL2yBQH0PrlYpU67zaX0vzG/UbqUv1m6IAa/PshlhbgBvGI2EgxFv2i+RbqdZvZzRbhevAQUxbi+vh6+8by/O8W8sLrZuxm4kL3GFSW6cr8lvX66pbzJuzq6xbm6vRG98bxJuHdDZbmvJsa42k93huW4qq3lvaW7wrg2uBW6QL3QBuYCKb/mAbm90AQQv7m4FAPAuAAHEAADkAABF3m7qbrPOcADILsavYSBC02QwAW7Lz/5JK89tb6evwyUYAcMlX654L0Qu+C5GbllviG+Q8S1v9q5Fr9EB5wG9nDBuQAEz6REB+W5Eb3Fv8W4KAK5vim7VbpgANW6mAHAutW8ebtPOjW5AAT5vTW8ab++B1DCMSf5uxC46brSSq85tgaevem5JlQ+v287db4ZvQlSsbhBuC68uoSRxUKn2b15RDm/dL02dMm5Kr9mvFm5UbtRuBW4jb5luhW+2bnNjcvmzby2um2+/z7ovW2/Cbmhvsm/ALrtvYm/wb9xVo29Vb9Av1W/KbhNvKm8ebqpvqkAzz+puvm7zzloEYrWLrXNv2m+DAAtvum+Lbg9FS2/SbxIAE52hbj1v+28erpExqXEthX1uTC42AZtvOZwnb22v5m8/rgopom+7b8NvGi42bglvPW6JbnoxBUmfbhOvX25mb7uuP2/nzydu+G9obtsuzm7DbuJuF26VblAuY2+XbuNvV26YARNuigGqb1Nv026KAJovzYmb9VpvrW6MAfNvK87Pbp+uG85LblvOr29dbxov3W6rbwlvM25RiBndktVo7qDuHQFmb7oug26ybhZvf29nb1ZuLS97bzZv727hb2wFKhnnAdku327Hb90uBO/bb0xud871gFDv528VbpgBlW+ubrDum681b/DvHm/wL6WqPm53bjNumi/IsGlxqC4o7nwAmZ0+RO1v8XGnry6BsADGoF1vBm4rbmFuQO8zbx7Yi66JSDlv8q4pb/jv0W9cbk5uhS8PAc5uLG4vz8TvgO8k7olvvO8FSMpnQW+crgLvFO6C7wTuf26tAcLvsW43rmLuvO9GQQVJU0nFbpLvXO+pbtLuoG/yAETv8m7gbvOua24aruLvI4IcqVJvGa+S72WdUu+U7geuwu/U7hlvXa5q7vPPTcjEyye3Eu5mr5ru851a7kxv2u4q7+VuRG+67/+uvO96salwCu8G7prviu7bbsbua6467uluf66q76tuZu/M7ubvc5iNIxbvHG+G78JyVu7cb0LuJu8vrhVu/66Ib2Lu9u+6nPzuiu8PrpTvVu/O75Zv/29Q7zTuQAG07zDvSm5Xbu5u124ebvXQCC5CtEzuTW+I7u+uarHRLv5u2m7LzjKZ7O4a7xyv65sYARD2f87c75jvK25WAarudu7vrn95bqJoQRLvNBAdAVHxUe5K7tru1u7/buduGW6i7kcA2O9rbuExbqJwIQrvCe8FTstu4O6/biJuhO/FSTrvf6/gb7HuBa9x7h+vIkAJ7zGAWe6vbz9vK64Q76duuTG57rbvae7vrnzplS6F77juXC+Z7k6Gxe7Z7iXvgu/4btsvWshl76+use5u7zNvQTXgr5+Qme5F7tXuoq9g757uzu517invRO/177bvDe4LrhXv3i6vAYJvVe+J78duNe+Mbm3vDS917jbuLm8grxduSm5WAW5usC4B7pNuge5Tz5F8iO7NbgWvIe+lxKzu825Pb6jvq8/Pbm8FL28t7kbvqAFvb1jvPO+d72gUTQZHb6Dvlu/g7rXvEO8NLiAu5W8u7gDuFS6A7mnv8+5x7nJUi+8bbkvunu9G733uZ27e7ynuCm/Q7lVuQ+8MAMPuPAH070AA8C/wL0SzjW4abpovwiAcLovPrO7oL7wZGC4RYVExQW8jhJ1u3GVfrj2c0e4VLljvMe8d7vxv/QFrJ0FbEu/uIB0BcQD+8SlvpW7L7omu9e5pL6nvpu6d7hquIfDMcexunK9P7xMAL++6Lnlvr+75bgPuIu+YbnLvp+/wuL2vCu/f7tEBP+/dL7/v2e8JL3/vq+/pbnnuDe4P76A7T+Oj8E/vDwA/7qVuBO9gHiqvJu4+767ukB8G8cOPj++V79ouwB/P7zAfUu+wHsmvcB407/AfhW/eAFOPiB5fblwuyB9ARS/usB9lbnAea+7wH3nvH+7zzmFIX+9AH9AfwB4oHkruqB9wbmgeuu7oHgdv3gH5W1AeSB7f74QfyB9Rbq/voB4xb3UBb+8sbuXv+B/ha98uFB+pYNwvlB6vbqAfNe5v7v/usu4AHhJuZB7gzIgf5B+YH0gelB7YHr/vVB9MH8QeGG8kHhAf9+/oH/DNLqLsHyDuWB8cHiAfOZxMHpsu3B7ybjwfZe8b7vPPz90EHtAfDB6cHyAeXB9CHzgfqB+4H2gfeB4IH1WRYh/0HvlB4h6CHikAQh/QrsIeVm8q7h3vtB87DF0G/B+Cb1gf8h44AQofl8+KH97v0h8QH7weLMeyH+wfFB7yH0QeZW40H8weru4yH1ofHfBAHuIez+4SH4Iekh6KHlIeJB7SHqQeBh+sH95F2h/8Hhweuh5UHjgfeh7gHzbuyh6iHjxxyDqYHpYfOh9GH2oecAHqHtQvGh577yIfAB9q7o/uqh5armofuh5/7qYf3B5mHzwfyh+mLFAe+wxyHu4fVh8oHx4fwh+eHi4erB8ervMN/HAe7r4fjB4mHhoffh5KHiIeth8uH3rvayYf2kYeMB++HsQeoR6aH2YeWh+sHmD5Fh+qHwIf7h7UHmlv1h64H+AeAR+br4hvzzBBHoQeVh/BHtYfQ276HqbvpB6BHtA6xNCpHw4f8R9cHtEfzh9hHwEfyR6GH7xxQR7xHlEeeh7pHjYfA+60H7YeWwzy2xEfPh8FHmkefh6JH1IeSR+5Hskfbu9tdqeuZR+pHrPu6h4hH04fOR/t7jRvXh958RMAXHAFHzUf2B/lHkUfiR82Hg0eJR958GcXpR46Hgwe2R6FHh4eFR+mHpUebR7hHhUBexYdH/YenR+RHuUfUR7dHp4ePR/FHr0eJQF0H30fcR7NH5wfaR4u70Mfsu55HolucsEpHpEeRB5dHgkezB9FH//v4m5VHzNuIWhxH24fZR61H44edR7yLs4f9R7DHpMfM24EHk0fWR4DHkseJADLHmAe9R9KHz0fqx+n7lOOox6LHmMfEh7jH7vvKx8THvMfp+4zjlke0x6MHxseTh/LH1seYR/bH4cen+8ICOsfxx7GHgofmx/UHy0fFR+tHqsf5x/4H4Af+R/rH9MfAx+FH+Metx6HHrRuFQAzxsceNR+dHo8fXR43H90fTx8sHnceWoFHF9UfHR9yHm8fJx7XHwkf7x5DHx8fcx/PH1kAA8avH98ewR6/H/sfMu/6HzEfHq4o5VMfrx4bH80egx9/Hv4eEx6fHwCf/QB867seDq7AnxCfjx4HHtsftx/Qn8aB8gWGH+CfDx/Ani0eTx7FHs8frG4OAEif9x+XHo4emx4gnzQeaJ567g4AAm5Anv0ePx4Qn2MfKJ/wn2cfCJ9onqLlw46wnv1vix9wnu8eqJ5zHwVuOx4armIelx7InicfJJ8zHiseCJ7YnvnuDgARHt8fuJ5wnviekJ+kniweAJ+EnjCfKh4+H0CeJJ/0nvCfIJ4ZHuYeYJ8dBm4fsJ8snvsf+J5snngfoJ+IbjxJCx6cn3sfxh5Yn+kf3J68H6we7Qm8n8SffJ9XH/yfsx6MntDutO4w7pdvfu+w7/7vcO/XboHv8C9qbtNvTO/B7vPOEWXqtJPv2m8oeyvOhdmxrtDbGAEIITfuoW/c7u9u5J+ynkjAYrXX44JvzIFF7iifSe5e723vDJ57bwDumW4k76qftpNKVOqfCu8ani3uVJ9MHsnvQu7t79Se0J5MnwVwGHxJMeqeWq8Gnz3uXJ5anzvvpe4Cn5oegp8erkNJ+p8S7haf2R597kLu2p4En/4flR6IninKIvpVqHae3C8WnvyeO+4Onv3vxp8EnjSe+B+2kmafcYWLrBqerp72n45vte/un9qfbJ48noluAWRJcC6ech92njMeRp9an36ejp9Qn4yf2J5zNw8IGMven+afPp/Bn/aefp9hKVifoi+D72Nu9O4j7gzuge6qboguMp7B7uPuP3Gab3PQ8p5tbivOum7T7hQf6O/6bq9uKp/R7jzvwx4d0VSvTYUmbhQfpm947mDueG+v70aekO7U7taeqe86nyNuH+4IH+9gdqLhT/Zv5O747nuv+Z8hn8AuhZ6inhVvsZ907+Nvkp8B76wAVAAAANUI7zKfSZ5zUC1vn2itb5Pv2ECX79hAHW6q9Z1v2+5z7yqe8+9ZnlqTc+jrDaofm895nk7uy+5Dbv6fUO/v7tWeEp9xnzWfI++sAFPOEZVj79jv2DnIHaHv5+8MAKjuaZ6LbumeL24Y7xsemO537jHuk88NHi0AvofGb1vueZ9L7zMeBZ8r772f52/v7xkfiG+IaSOfi+9zn22fTu7unrvu3J407v2fQ+7+78PvA5/xn6wAAACkQe8n73duDgEe8ZUJyO7zbzYxK8+JI1fuOIMSAMwp3Z8tnFOfO85ZnnqejpwaSYWbG2/9brtRhp+SH4MeUJ//HxluxZ9Ln5MfndBFcM5l3x4S8OsNV58mH9efoR+OnucfTp5TB+PG8uWqH/1vi6xPnyEez5/RHl4fbR/eARPVQVi7UYJvOwE4L5qfrJ8xn2GfNJ4lAD+ffDkkQRLuf54fnqyepJ+hnzefxZ+8HjSH0AmieRLusoGbzpiepx5bH5+euR8vnqaekwoaSfLgR2+Xnr6en5+Qn8+eYZ9kn58f55/2SLacuZ7VhWqBUZ9PnkheX59JHq+fkmGGh0lAl5+bzleeoF9UnmceL56EnuGf/QFYX60Bq9Q4X7EuuF6Wn/+fhZ9fnx2fcF9yk9eJRF9RYIhfdR8wXwcfJp4EXzqc+UxROhRe6F9vHnheVF4mnwBfnp8oX34JUZ3ZLw6idF7/n6Bf654xHjafPJ7Gofeev55aro+f2YEfn5RfGF6wXsMvG58H75ufh+7xn0fvDO5j7g2fM24lKTzq6wyPbm1vFyaX7xcmHW/FhSKhiu9z7vfuM55qVnlI5ZkK7tJvk59un9GezG6kXsTvRZ77buefcXCCGidQHu/SXwNvMl4r7zOuAF/IX06ew+cCe1/v8q7kb7Pua56yXh2ucl5OnnBfal9CZkpfZG7zniGeVp9aXlWf/p9sX0DuG2JNB+peQm4yX5afa5+yXwZfAp6SXzpedEm6XxxvGl49n/OfFZ5mXq0fqJ7UXoBeAhtSfAJnzJ+4n0pfAu6mXlpfoG7aX7Bf1F58q/S8BTDSXnpfq54Vn/pezl9mX9af5l9GX5v1xl6OXlLuTl4qXjZfNx62XwxeCB4WXtgKll7cLlZec42aXn5eBl82XmSe4F+sHoFfUl8O70Ffel7RnyFenl+hX6KfYV4fbhaGHD04b6cvjl4hXqXuoV7+XmFed58zbpJXbqOJgRFfhK8Y78pfCV7RX4leMV9JXpouFjD+al6ufa4obyeefZwJXznvz6+eXmxf5l4Ot2w9cV/Lrr5fuV/S73lf0V6gn4ZfM27SMVleOW41ryhuml4eX6ZeiV4fH/5fql46XlpItDzZX0Bu8V9FX5VfTl71rqpfMV+IbrHk5V+FXxVfVl76XlVf6V7VXkle7J9NXma2cV/2bg+uaV++XulejV/OX/hedl5kGIrBzV5dXtBu3V7FXsrvB669Xp6fAV/Oh7Vf5V5fr+5e1l8eXz1e+V+kXgpeZBgT7oVeA145X5Ffvp9RXhNfJV6GX+Ze4YSjXi1fOV+t7m1ec14ZXqVekl/JX9hxNqPfHz5eWu/dXnlePG9IX2BemV4ar/sZ05yz/GhfXV8mX4NeO27LXu1fGV4dX0DvO0mdXrtfA157Xg1fs19DXxNfmF46X7OdC1/TXrhuJ17jX0tfp19zXuZe3590RZCxR146HhVfi19pXxteHp74X8NfvB4qR/1ex14zX2NfrV8NXtdfy17zXzdfG/HPX3deY16DXydePV9vXgdeK14fXmaSd1/2HvdfM18gbvteP17/H9VeTV6JbwLpf1/ZL7teyl4bX8Vem16YX9pfLl9V8J9e/15fX5dfr16nXiVe7143XmRe0RhQ3qDfx15g33teVO9tXkDf7V4Bnsleil9maD5e7l9fXldeb16w3z9f719w3p1SF14vXpdeiN7fXw9ei5/5Xh9fBV8Yz1DfoN/xXrje4N6PXshewN+CXigK01/Y3vVf61+I37BuxN5bXodfJN42h6Tfn16E3/Vf6N8w3+DePF5PX6wfPE/w3xyv/16vXlFf318Y3sjfB14o3povIE8M35+uNN7k3kTeQ1/M3jefQN9bXvPPNF1s39leON+E3rTezN5031ReAV9PXyNfIN6M3tDfON9837jeYF9c35TfrN9TXgTeCN8vXujeMN783xTfot6s3hqvjAU833VeRV4c3iLfRN543pNeKF8KX6oWzHBBX6lf0N9M3yLfrF8K306e4ASy3mivEt4q3rNeUt4K32dekN5HXtTfBN8I3nzfkt6q341e3N4fBedeQt7s37rfNN963/Leot/I36VfrN9s1YbevN9k3pVe8t6c3/zeDF41Xy5enfvq3zuvRt9y38bflt9S3qbfK16o39XBbl+WXgDfv27231rfEN59X5JeDEYxL6avaN6a3wDeSN/7Xizev15kXqteSrBo307eTN+a3vrew1+2Xoxfit6lVEqwyt8MbsbfKt4m36re2t+u3j7fgG5O3pFeft6e3hTfLt4uXmHeqN8/cqlewd523iHeLt8m3yzfpt4ar2HeUG8x3pxvwV8c3oDfnN+bXtLeCd+yno7f4iHh38rfwt923ineVt8engHeCB6J3jhuSd7BXrlfyd+e34DeXN4O3zdfOd/xcnIe618W35nf+d8p3hDfUd8B33OaSt/LUUHfSd953pbeWd/23/HfDt4V3wJuvt4R3pLecd7V3lHfvV7l3m7fy2KV3nneS14Y31nfj1/Z37wfOd/6sbnezt457yHf+t5i3wne6d5HnsXeHt6Z3/Xepd6t38TeBt5LmrXe8lAZ3rHeJd5935He8d7e35NeTd/eXkPfld4t37Tf1d6j3orf5d+B336ozd8d3qdu/t5nXq7fjd6J3zFg49/N3g9fnd/+3wLfrB/z3mtfDl693nrfw9/cbpPfmN+j3/PfHJ8Tr6vfwd9+3kvec99l3jnejt7FIQvfM98l77Pf115eX4Xee9/brz3fvt7139vfcd6h33Pfu96D3sSfNK/F3q1fa9+UbyPeG95T3tJxatJa1mTect7D3qfeDd7X3nDfo9+vBSOJpG/m33ffl9/3333f696P3jfekYC33s/fst8tXsnfVd+v3w3e9N82n9Hf89HH33XfHt/O3g/eZ967309fO0nxl1/vjN8n3pHe69/f3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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>
|