3433 lines
251 KiB
HTML
3433 lines
251 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Interactive BOM for KiCAD</title>
|
|
<style type="text/css">
|
|
:root {
|
|
--pcb-edge-color: black;
|
|
--pad-color: #878787;
|
|
--pad-color-highlight: #D04040;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #b4ff03;
|
|
--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;
|
|
}
|
|
|
|
.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 {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 25px;
|
|
}
|
|
|
|
.bom .Description {
|
|
width: 10%;
|
|
}
|
|
|
|
.bom .Part {
|
|
width: 10%;
|
|
}
|
|
|
|
.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;
|
|
}
|
|
|
|
.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
|
|
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 {
|
|
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;
|
|
}
|
|
|
|
.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;
|
|
}
|
|
|
|
</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", "extra_fields": []}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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JyZRJgCDPGHPJO/FVyQPJS8kwybnJbsn5yRdJzcmlSf9JvsnTyZ3JoWFAfFdhaclMyYfJk0nL0cvJKXGryRfJ68njyVTJd3EUSYLJvrHJ/ET088n2ydXJb8knyfXJ80lryU1xG8lFyRbJJcl3yYApE/zYyUHJ/cmvya4x78nqcVApX8kwKT/J5sl/yQNJgCBIKQ6C3mR2yRNJB0l9ic1Jx0kfySPJ0CmXcctJ+Ck3SR3Jd0n3ydkCj8m9ybtJL8kUKeApVCmwySvJtCk4KfQpsCmlCVvJ3ompScQp2wLPGGQpr0mu8TwpR0l8KTQpDck3QKPJhckiKfAp28kAKV2JwYKMyf34aCncKRgpECnDyUopfl50KVrxDCmbyeopYimIKVoppio6KcHJi8kGKbwpp8mfyd1Jl8m9SdfJU8lJyYkYe8m/UEeJB8kLyWAprjHZycTJkClkyaYpPwBeyRPJHikIKSwps8m+KdIpIcmviSYQwSkyyUYp2CmuKd/JLclRKT7Jnik7yaURNsmxFqgpXClvScfJTimhKdHJKiluKVdJOSkxKRtJZclkfgkpDil6SYYp/CnGKS3U4SlUgJEpv8lMKbfJLCkpyfEpRSkBKUfJQSm1ySEpaSlhKYIpZinCKfqJPSleKZ3eCDaFKU/JuinFKbIpIymYKXNJEykZKbgpWSndKWjJzCkbSf3gjN44PiAp5CklKWspLSmKKekpP0lVKa3JCclWKSwp6skDKUsp9imBKc0pZSnjKRUpHSk8yeYpcCkLifrxxInGiaSJMEl5idsWgUmW8TSJN8ihoGyCoUmugLLekUlRNHCp3vHRSVTgsUkoqfFJM4iJSX8JyUn/yWIJUKklyhlJk3BZSYPJFylYKZ1Jb5GXPGPJOymMKXspvSlatsSWC1BL2CcpMikwidDJ7ymtKa5JbSnnSVspQil4KRYpBCmqyWjA9KkJCHYpeilnKQTJ6ylRyQjJlSmZKVfJNSkaKWIJQqmYpI0prykmEFLJdckfKVKpXyldKdSpN8lzKYKpUH7FGMqpwyniqSSpGymfKZMpESm8yXypsyl5KRjmc/yMqf4poCnGqaqphMnqqa0pVylIyTcp2SltybUpM2ZeSiKpKyksqZLJrqljKe6pmynXKTKp7ilyqfcpdKlQfqAYRqnoKSapbKmXKeGpnqmRqdUpPqnyqZ3J2NjfCgmp+ilJqfIpzikCKdypUym8qb8pNqml8Zrg7TZ5qWKpySmjKakpYanmqSWplqk/KWop/KlWyWjAA5b6vDWpqylvKYWp5SmaqRapnSlWqeWpNKl6qV+a//LWSXVJgak4iaUp/akaqe7JWqkjqW2pFam4qffBQSQ9qUGp5ynJqaSpTakRqdspsqmZqTGpNF6TqQGpQymJqXWpEql5yY3JQ6nfKdMpqMm6qbap91pSpD3Izymiqb2pl6mmqZKpi6m3qdqp1qljqU+pt9KnqZups6nbqfOpjamDqc2pw6mtqTMpAGnkCfH41iQgaVKJxKk7qWapkGn7qTypVKn/qY+p5AmwAcY2/thMqYkp+MmJcV+p16nKKUupMGkPqbkpuGmI0eQK8amDKU6pF6kHceBpKal7qWmpB6lRqUepKUmdyTgQdWH+SmepjGn5qSRpqGnfqefJUGl3qWWpK6lwaWfxvGnupAAsSGlQyXIpzsnUKbup6GnsaZhph6l3Kdxpd0myadikhqkMaacpH6nMacppCimqaT+p4ml/qaOpOGkyaXhpOPJKqQZpzKmgaW+JImlkaSYpv6nLqbBp1mk8abZptiptUYRpTSnCaSxpZmliaRhppalYaVZp1Gk2abRpfoqn6AppEsmOKUFpaGnmaaFpLan3qZPJvqnIrAhpv1A2UP5pKqkOSfWpBslnyTepFmkeaVRpGWmXTity2WlxaTrJYGkmaUWpnKkxyQfaqimeaZFp2akJsAsW1WmhybVpEcnsyRBpyWnqaWFpmmmiKdppWrbM0h1pDmlEaY7JV6lFaeRp7mmUaelpWal3Sex4Ryk5aY6phmlbqX2pdWkDqf1pCsleqbspXmlLaeaY42lvqTOpyGlzqVtpC6khaQNpqWmSaS1p5WksPuupCeidaUkp+WnTaS4pKWnQaWlp0SmLaVq2yWDHaRwp6cnnqUJpr2mkaTNpbmklafNpUPGGiR1xaFA5ieSJy1BklohJorBz/HaJFdFosF3RlYnhSeyJLdFxSctUuOnniZNYfLiECY2JrWl3Scjp3fwEqTZARKnnaT1pLsmsaQjJ5Kk2wpSpQ2mWKSNpieaYlgQqAmnraU5pLqlvaeWx7Unvaddpn2m3aWVpP2ns6SrQSDDPacRpdhhqqaGp9Ok7aSbJzWmi6cepIrAc6cVknXS5ac6pMukhqQ2p8ul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NxU0lkjk7BVxl9HE3FVo45NT3FU0C7MVPFSbZQeVsFW8V5OWnRXdJ5lHDSj8VdhQcOYoxZ+UHRVI5JuWzKTcVHohgBmtqQYX/Ff7Z7RU8OXVFJhUfFQaFXxUb+qiVfxUhOcGlUcU+OdiVtaX6hWfxtxUolVQqaJXElecVMBUOOTBlioUHFePsjXBXStCVy7CwlduFWBW32SDlORXRpXKAlMXZ0R/6UhXuFTDo+sKLFXpFo9mLmXNZM+U94CtZmxWKleDFZTleJXQVlJWdyY4wLzl2VJCVCsWnFfSVzxWkla8V0UXcuVBF0mysJLqVAUX6lTCV9yWQZcaV5JWTZRqVnlkXAooGDxWcla/lDJXE5ckwVxW4lYj5a7iWlY9Z1jkGlQCVseVklZZliJWCyVYwuKqElY8VwZUYlYCVyRnwldflppWCybPk0ZW0lUSVNpXupTvl9pXhlWOpZpUycTGGGZWxlVmVJJV2lao5JpVOOZjFMtz34TGV7pWIxS/FTmW8lWg5JuV4FUKV9+V+kaYRUOWiIYYR0ZEwhfOZcpW48asVhcXrFcqVsmBbFStFqpV2pcEVkEUGhZwkoEoBlScV4WXolZnZ1UVhlT6VTpX92dG6rpW/FSWVXJW2lTmVFZUOlQJFNxUOQnMS97BQlXo5pZWelfMFfJUIlfmVBoWFWOeVxxUIOdaV+5XZlRcVd5XJlVWVj5VEylNkdZVXle+VZZWHlerFwJU4lZuVZAaeCP+VxZX1ldyVZmVgVRSVoJVblfkc0FUclYBVHpWGleWVoFWVlVV5NxXzlQMSAFVBldeVmFVd5SMVjIiiFYnFkxVkCfDp2gb6pYAgZRFSlT6FMpUrFcsVj4U46WOVvAATlSqVD1gL2XsVYQlmlQAsXhEXlXqVy5VxlauVBhWJlQhVjpVIVYkYK8TEBi+VcEVEVUBVN5VwlVJVJ5WCyYUw0oKLla+VolXEVSGVqYUtld+VuFWCydHM8lVulehVDZVUJc9l2FXHlQgVZpWmVahVB+ywVQeVn5WGVfAVJ0VmlZpVNgaEVW+VGFX6VS3FtCVqVXZVgslyVY5VhmW6KWI5KlXixUFVHlWaKZdIBJUwVRZVcFVExYDlNlWWZW2V1FWeef6RsxXSFWXxdxHChqnhSxWDlbXRw5Xyld9QHFUrtKuZBOk8VQglQBW+ldmpWljPleZVSlV+VfGVoZW5lRuVMlUA8JwBlxHNVb5VllV6JcrlgVU4VV+ZUEUlRU1Vu5XOVR+VjJXelcyV+xViCQqQcFzaVYpV/VXJVUCVI1URlQtVbqRhVR45YlWNlRJV9DkbVQ+VYgkLynMSPlW6VcpVJFWuVUyV95VQxWIJPVVlBudV59krlftVpmXB5TFVuXljVY1VO1V0lXpVbVWf2cVlSZXuVTflWGW5FcCJNFWERck5PSC+Ee8S3wZFVZhJLFWDlSuZUXmcVWOVi+W8VTOV1xXkCWRmvVWTVUlVLlUzVUDVDhXBVTJpP9BmVXjVLVUDVb0lo2VE1VkV0lVQRWkYNeThBn1VF1WtVeJVb1XrVbZVsVUyaQ9I5NWXlZTVa1WSVUdVd1U8abzVP1WZlZdV/lUvFUeVeZUi1TppOLS7ZE9VTMmRVVdVhNUfVSmVpNXKXOLVe5Vs1a9VmJWROVzVn1XY1dxmBFWJVQLVBNVGKYDV6tUjJQKVvaWZVVPF/pFuFdDl3pEikTyG8NWouaVVbFVSYBVVXFXVVQKAGNWe5fNV2ak/MjuV/NWrVRbVt5VuVcTV3NWdyaUAG0Kh1SJVz1V7VVZVQ1XkVXNV/FVCiXn4+YbCVVaVrNVU1RgVatXC1Z4prEUMlrjVYdV51YLVh1WG1RrVsdWl1Y9VZtXh1dNVXpW01cYViFWsRVnV2tVTVcBV11WzVbdVxdVCiah8ndX41U3VkdU3VUZVo1WVqSHVRZVoVebVI9WKKVbVI1UZVeDVWVU1vtbl7hX54IYsjFUDlQjVQ5WsVcjVq1lo1WQwuxWY1fVVOmmh+kcVLNVJ1X9V7NX61euV6dXrRfBpx2AX1RTVjdXd1YXV1dU/lWupDyDpkTnVgZWv1VFV8FVF1RjFlalZ8M/V5dVX1ZLV/1UBVWnVfdXANWIJoDVD1bPVb9XN1dbVxlVf1eQO9ZFK1RFVL1Up1WuVHVX31bOVMmmB+DSVM9X/1arVKDVANViFNGl0Uk4QDdUV1RHV89W2FS3VauXZFU4VYNXClakxkKijRUjpNULLkWlFzFW71UjVU9k+1YfVxEkB1eqVXVXJuWRq4QZ62btV19V61QmVVdWy1f3VZ/EKqCgS41GyNb9VkDU31Yo1WJXKNXA1pukckEcVmjUS1brVuDUHVXo1nVUbRQV4xjU4xcrVODWDVXg1MtVWNaXx2oI0laEFSDUANe9VlDUslao1RjXQVR41ZDVS1UaVzjUENVjVqjWHuBT8vOh2BWKa8jXmNRzVQtUf1Wg1+blU4O41MTWFCdo1CjWx5QvVSTWm5aDVgpX21RMlXDUBetzlDLlZhvv67tWylTvV+9VKlVVV6NW1VUOFD9Vn8W44th5Xhi1C4VWxNZk18TW31fg1sDVUNc01OLy4qu01cjVdNY41FjUG1fo1/TWdyQ466NzM7BoUXdVeNZzVkzW+NdM1rDAWlcM1WjVmNWM1CTVKNS41zTVrNemVPZqJJAs15DWj1b3V49WbVdM1vrqHNV/KJzXBNVhVw1W5NZc1AcWDNdBVRzV/+Z01WzXU1dZVjzXLNUHVAcVJ3OD0j9m3NcPVyDXn5WRVlxX8lWw1BTXL1Q7VcP5r1c7Vz3xxURaGOcVhScVVEtl71cI1VVWo1XU1R9XiNXVVEFU7Os6GigYmNTrV+dXQFRQ1TzXHVZqVPgxDNWF5IzVfNQXVlLV/NRnV1dmTzpshdjXYNcnV2zU9NaE1fTUrNRjZGcR0taS1dzVQNdLVaVV7NZqVQrUBNek1KtX3NSBVvzWStRjZ7LWJDAy15LU01ag1E9XV2bS1MrXBOXE1PLW6NRM1SrV2cUciRZWBNfQ1c9U8lRC1X5XA1SYlkmUwtRw1OrHFNQUVuVWeGF4GiYb8NaxVJVWYtUspGxVrmaI1G1kNNVXFrLVnRcAyAlEKkLK1DjXfNanVkLX8tf81VTYvmkxREbV6taM10bVONRK1YTWn1VU2Z2zyVea1EDWMtRS1ZzXMNV0VzzVVNhnUubWRtdy1abXjNXfVcbUhtWTp5bVvNXR5xzWgtYs1iTUstU01puk5tU21L9mttac1qlU+NfG1ieaJtQJRTDy9tZ41/bXRVYO19bVVNl+0ZVFjtYnV9jVVtUy14LWpVYq1ULX2tXbVsLVFNbt5cxVVnhjKj1q6Lqi1dpnotZXRThjEcX/5WAkyhfCpu3oNMSfVdGXFLnvQSCwWFbcFtFnZSCKlxJnNua4FC4VOeGsEYIhHtWOFEAr+5e+1SqWftRV5cRUimVkuES4AdQ5FQHV7cSB1BKUTeUPF0YkbtbflzhUdlSAAJag5VevV1qjNLuumCOWOmQTx0JlheQTxDvkPkFFl2+DJ8NsVB7bL5beJsdWRSnh1Y+DxCaLQe0VeCa4JeqZ/OX+JALnLOUC5qzl9OaC5XQVAiaxFty5xQNuu/rniSR+1MMnsdXJ5HTlcdUs52Qnf8cC5/HUQdVU5DzlLabh1OfBidaqFdAnS6UBFYHWCFd+Jy/HzOec53HUKdUmZynXnBXk1bOXiFVMVcoAlqGKViLW/tYGyyLppRYR1BHHY+G515VBkdSdgFHVciWask5UYhXxVrTFbObCq9XhhqCuFxbkSdaB1UnUqCYqJZnVjiWZ1wZkWdTf5BCUhda7mdTwcwd/lpEWHOZJ15XkGdSh17TnGdf858nWeCUl1E8ACdd2lttXs5XkV2dGurnRVdxjZdaAVY6XAsXrZRHUedSR1U7HeddXRO/gmsFFld7WB1f/JaXW5fv00AGgNOVF1iHW8KdJ1cznxdRc5PHWKdXx15XUqdd6JQ3VSYOxWTXVjdTl10XWTdbF1nHWLObM5sYnzddc5yXVf+ct1anX92aveIeYvtWa543WahTF1bgmqCbJ1e3UnOYC5h3VMySC5S3XNiSt178GupqJ1r+XMdbp1SMWMCVN1D3VFdXJ1+3ULOa91uinvdZZ1FalfdTXh/6jOrtp1N3Wsdc55epm7dewJpnWldb05i3WWdUvVLhV8ACWoLrXuFQZoPajaaK51HXUTcZ51zRXu0OR1buXb4PRm1HVBtVLlwXVndaF1HhQueA4UG3U5wLl18inA9XF1KImzdYl12PXNCSd1n3Ws9el10u6drsaFkXWbdRN1zXkueUZ1M3WY9Qd15nU49Sl1drVodWDV+PWYdSzI9XW6JLuuJ0H9lXhxrXXudZXRJvVedR2JDPUImTYO2xVM9fc5kjX8xGbYb4a8FWS5yPVCZZ4AfPXo9V4JnAmASUd1avWi9YN14vUQbvdw0/DK1oB5bvUx5UoJO3WK9QL1yvUQ9ar1IvWBBad1DvVcRE71dZJc9Sx17vVygJ71MfUq9Ql1WPVKdf71SfVi9Sn1YMROBJ4YiZky9dz1XwU59YV1SvUldSr1ZXWJ9RkFqnWl9SlEZtg5NDrlsrkR9foVJBm19R8Aj3UY9Q318fVN9es5xfWB9W31f65haPLlVfWZ9ZH1HwD99Z4Ag/Xe9XkJvHV+9c31xQUT9VBFALAd9euYGfUA9cwFd3Ucdbn18fX59Y31wvVj9S31yfXb9SH19mg3Bdd1svWd5Yv1coDL9Wf1I/UX9bc5V/U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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function() {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function() {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function copyToClipboard() {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text = text + node.firstChild.nodeValue;
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
text = text + '✓';
|
|
}
|
|
} else if (node.nodeName == "MARK") {
|
|
text = text + node.firstChild.nodeValue;
|
|
} else {
|
|
text = text + node.nodeValue;
|
|
}
|
|
}
|
|
if (cell != row.lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function(s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
for (var bom_type of ["both", "F", "B"]) {
|
|
for (var row of pcbdata.bom[bom_type]) {
|
|
row.push(parseValue(row[1], row[3][0][0]));
|
|
}
|
|
}
|
|
}
|
|
|
|
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]);
|
|
}
|
|
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;
|
|
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,
|
|
}
|
|
|
|
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;
|
|
|
|
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);
|
|
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;
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* 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
|
|
];
|
|
// Adding half a line height here is technically a bug
|
|
// but pcbnew currently does the same, text is slightly shifted.
|
|
point[0] -= (point[1] + text.height * 0.5) * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawtext(ctx, text, color, flip) {
|
|
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 (text.svgpath) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
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) / 2;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
for (var i in txt) {
|
|
var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
|
|
var lineWidth = 0;
|
|
for (var c of txt[i]) {
|
|
if (c == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
lineWidth += pcbdata.font_data[c].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = 0;
|
|
switch (text.horiz_justify) {
|
|
case -1:
|
|
// Justify left, do nothing
|
|
break;
|
|
case 0:
|
|
// Justify center
|
|
offsetx -= lineWidth / 2;
|
|
break;
|
|
case 1:
|
|
// Justify right
|
|
offsetx -= lineWidth;
|
|
break;
|
|
}
|
|
for (var c of txt[i]) {
|
|
if (c == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
}
|
|
for (var line of pcbdata.font_data[c].l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var i = 1; i < line.length; i++) {
|
|
ctx.lineTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += pcbdata.font_data[c].w * text.width;
|
|
}
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
if (edge.svgpath) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
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);
|
|
}
|
|
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 (shape.svgpath) {
|
|
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, shape, color) {
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
if (!shape.svgpath) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
ctx.fill(getPolygonsPath(shape));
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, layer, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, drawing, color);
|
|
} else {
|
|
drawtext(ctx, drawing, color, layer == "B");
|
|
}
|
|
}
|
|
|
|
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, hole) {
|
|
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);
|
|
}
|
|
if (pad.type == "th" && hole) {
|
|
if (pad.offset) {
|
|
ctx.translate(-pad.offset[0], -pad.offset[1]);
|
|
}
|
|
ctx.fillStyle = "#CCCCCC";
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (module.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...module.bbox.pos);
|
|
ctx.rotate(deg2rad(-module.bbox.angle));
|
|
ctx.translate(...module.bbox.relpos);
|
|
ctx.fillStyle = padcolor;
|
|
ctx.fillRect(0, 0, ...module.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = padcolor;
|
|
ctx.strokeRect(0, 0, ...module.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of module.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
|
|
}
|
|
}
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of module.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padcolor, outline, true);
|
|
if (pad.pin1 && settings.highlightpin1) {
|
|
drawPad(ctx, pad, outlinecolor, true, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawedge(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawModules(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var padcolor = style.getPropertyValue('--pad-color');
|
|
var outlinecolor = style.getPropertyValue('--pin1-outline-color');
|
|
if (highlight) {
|
|
padcolor = style.getPropertyValue('--pad-color-highlight');
|
|
outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
}
|
|
for (var i = 0; i < pcbdata.modules.length; i++) {
|
|
var mod = pcbdata.modules[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
if (!highlight || highlightedModules.includes(i)) {
|
|
drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, d, polygonColor);
|
|
} else {
|
|
drawtext(ctx, d, textColor, layer == "B");
|
|
}
|
|
}
|
|
}
|
|
|
|
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();
|
|
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.lineWidth = zone.width ? zone.width : 0;
|
|
ctx.fill(zone.path2d);
|
|
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 {
|
|
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 ctx = canvas.getContext("2d");
|
|
for (var mod of pcbdata.modules) {
|
|
// draw pads
|
|
for (var pad of mod.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (highlightedModules.length > 0) {
|
|
drawModules(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);
|
|
drawModules(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
var fontsize = 1.55;
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer == "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var bbox = applyRotation(pcbdata.edges_bbox);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
var flip = (layerdict.layer == "B");
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function 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 (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var mod of pcbdata.modules) {
|
|
for(var pad of mod.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinModuleBbox(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.modules.length; i++) {
|
|
var module = pcbdata.modules[i];
|
|
if (module.layer == layer) {
|
|
if (pointWithinModuleBbox(x, y, module.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0) {
|
|
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 modules = bboxHitScan(layerdict.layer, ...v);
|
|
if (modules.length > 0) {
|
|
modulesClicked(modules);
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* 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 moduleIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var highlightedModules = [];
|
|
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 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.modules.length; i++) {
|
|
if (pcbdata.modules[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) {
|
|
return function() {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
if (this.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function clearHighlightedModules() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedModules = [];
|
|
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;
|
|
highlightedModules = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
for (var ref of entry[3]) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
// check extra fields
|
|
for (var i in config.extra_fields) {
|
|
if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
// check value
|
|
if (entry[1].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
// check footprint
|
|
if (entry[2].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry[3].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) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
th.style.cursor = "pointer";
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
th.onclick = function() {
|
|
if (currentSortColumn && this !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && this === 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 = this;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader() {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
tr.appendChild(th);
|
|
var checkboxCompareClosure = function(checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a[3]);
|
|
var stateB = getCheckboxState(checkbox, b[3]);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 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 {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
|
|
th.onclick = fancyDblClickHandler(
|
|
th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
|
|
tr.appendChild(th);
|
|
}
|
|
tr.appendChild(createColumnHeader("References", "References", (a, b) => {
|
|
var i = 0;
|
|
while (i < a[3].length && i < b[3].length) {
|
|
if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
|
|
i++;
|
|
}
|
|
return a[3].length - b[3].length;
|
|
}));
|
|
// Extra fields
|
|
if (config.extra_fields.length > 0) {
|
|
var extraFieldCompareClosure = function(fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = a[4][fieldIndex];
|
|
var fb = b[4][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
for (var i in config.extra_fields) {
|
|
tr.appendChild(createColumnHeader(
|
|
config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
|
|
}
|
|
}
|
|
tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
|
|
return valueCompare(a[5], b[5], a[1], b[1]);
|
|
}));
|
|
tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
|
|
if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
|
|
else return 0;
|
|
}));
|
|
if (settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
|
|
return a[3].length - b[3].length;
|
|
}));
|
|
}
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody() {
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
moduleIndexToHandler = {};
|
|
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[3]) {
|
|
expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
|
|
}
|
|
}
|
|
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[3];
|
|
}
|
|
// 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);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
// References
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
// Extra fields
|
|
for (var i in config.extra_fields) {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[4][i]);
|
|
tr.appendChild(td);
|
|
}
|
|
// Value
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[1]);
|
|
tr.appendChild(td);
|
|
// Footprint
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[2]);
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = bomentry[3].length;
|
|
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])) {
|
|
moduleIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
function modulesClicked(moduleIndexes) {
|
|
var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= moduleIndexes.length; i++) {
|
|
var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
|
|
if (refIndex in moduleIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
moduleIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedModules();
|
|
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.modules.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.modules[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");
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
}
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedModules();
|
|
}
|
|
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(",").filter((e) => e);
|
|
prepCheckboxes();
|
|
populateBomTable();
|
|
}
|
|
|
|
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 updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
document.onkeydown = function(e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
prepCheckboxes();
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
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">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Show footprint pads
|
|
</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">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP components 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">
|
|
<span class="shameless-plug">
|
|
<span>Created using</span>
|
|
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
|
|
title="Front only">F
|
|
</button>
|
|
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
|
|
title="Front and Back">FB
|
|
</button>
|
|
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
|
|
title="Back only">B
|
|
</button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
|
|
title="BOM only"></button>
|
|
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
|
|
title="BOM left, drawings right"></button>
|
|
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
|
|
title="BOM top, drawings bot"></button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
|
|
title="Grouped BOM"></button>
|
|
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
|
|
title="Ungrouped BOM"></button>
|
|
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
|
|
title="Netlist"></button>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="statsbtn"></button>
|
|
<div class="menu-content">
|
|
<table class="stats">
|
|
<tbody>
|
|
<tr>
|
|
<td width="40%">Board stats</td>
|
|
<td>Front</td>
|
|
<td>Back</td>
|
|
<td>Total</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Components</td>
|
|
<td id="stats-components-front">~</td>
|
|
<td id="stats-components-back">~</td>
|
|
<td id="stats-components-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Groups</td>
|
|
<td id="stats-groups-front">~</td>
|
|
<td id="stats-groups-back">~</td>
|
|
<td id="stats-groups-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>SMD pads</td>
|
|
<td id="stats-smd-pads-front">~</td>
|
|
<td id="stats-smd-pads-back">~</td>
|
|
<td id="stats-smd-pads-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>TH pads</td>
|
|
<td colspan=3 id="stats-th-pads">~</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="stats">
|
|
<col width="40%"/><col />
|
|
<tbody id="checkbox-stats">
|
|
<tr>
|
|
<td colspan=2 style="border-top: 0">Checkboxes</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="iobtn"></button>
|
|
<div class="menu-content">
|
|
<div class="menu-label menu-label-top">
|
|
<div style="margin-left: 5px;">Save board image</div>
|
|
<div class="flexbox">
|
|
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
<span>X</span>
|
|
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
</div>
|
|
<label>
|
|
<input id="render-save-transparent" type="checkbox">
|
|
Transparent background
|
|
</label>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveImage('F')">Front</button>
|
|
<button class="savebtn" onclick="saveImage('B')">Back</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Config and checkbox state</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveSettings()">Export</button>
|
|
<button class="savebtn" onclick="loadSettings()">Import</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="fileinfodiv" style="overflow: auto;">
|
|
<table class="fileinfo">
|
|
<tbody>
|
|
<tr>
|
|
<td id="title" class="title" style="width: 70%">
|
|
Title
|
|
</td>
|
|
<td id="revision" class="title" style="width: 30%">
|
|
Revision
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="company">
|
|
Company
|
|
</td>
|
|
<td id="filedate">
|
|
Date
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<div id="bomdiv" class="split split-horizontal">
|
|
<div style="width: 100%">
|
|
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
|
|
oninput="updateRefLookup(this.value)">
|
|
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
|
|
oninput="updateFilter(this.value)">
|
|
<div class="button-container hideonprint" style="float: left; margin: 0;">
|
|
<button id="copy" title="Copy bom table to clipboard"
|
|
onclick="copyToClipboard()"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom">
|
|
<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>
|