mirror of
https://github.com/garrettsworkshop/Warp-SE.git
synced 2024-11-22 23:31:10 +00:00
4346 lines
314 KiB
HTML
4346 lines
314 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Interactive BOM for KiCAD</title>
|
|
<style type="text/css">
|
|
:root {
|
|
--pcb-edge-color: black;
|
|
--pad-color: #878787;
|
|
--pad-hole-color: #CCCCCC;
|
|
--pad-color-highlight: #D04040;
|
|
--pad-color-highlight-both: #D0D040;
|
|
--pad-color-highlight-marked: #44a344;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #ffb629;
|
|
--pin1-outline-color-highlight-both: #fcbb39;
|
|
--pin1-outline-color-highlight-marked: #fdbe41;
|
|
--silkscreen-edge-color: #aa4;
|
|
--silkscreen-polygon-color: #4aa;
|
|
--silkscreen-text-color: #4aa;
|
|
--fabrication-edge-color: #907651;
|
|
--fabrication-polygon-color: #907651;
|
|
--fabrication-text-color: #a27c24;
|
|
--track-color: #def5f1;
|
|
--track-color-highlight: #D04040;
|
|
--zone-color: #def5f1;
|
|
--zone-color-highlight: #d0404080;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
margin: 0px;
|
|
height: 100%;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark.topmostdiv {
|
|
--pcb-edge-color: #eee;
|
|
--pad-color: #808080;
|
|
--pin1-outline-color: #ffa800;
|
|
--pin1-outline-color-highlight: #ccff00;
|
|
--track-color: #42524f;
|
|
--zone-color: #42524f;
|
|
background-color: #252c30;
|
|
color: #eee;
|
|
}
|
|
|
|
button {
|
|
background-color: #eee;
|
|
border: 1px solid #888;
|
|
color: black;
|
|
height: 44px;
|
|
width: 44px;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
display: inline-block;
|
|
font-size: 14px;
|
|
font-weight: bolder;
|
|
}
|
|
|
|
.dark button {
|
|
/* This will be inverted */
|
|
background-color: #c3b7b5;
|
|
}
|
|
|
|
button.depressed {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark button.depressed {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
button:focus {
|
|
outline: 0;
|
|
}
|
|
|
|
button#tb-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#lr-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#bom-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-grouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-ungrouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-netlist-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#copy {
|
|
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
|
|
background-position: 6px 6px;
|
|
background-repeat: no-repeat;
|
|
background-size: 26px 26px;
|
|
border-radius: 6px;
|
|
height: 40px;
|
|
width: 40px;
|
|
margin: 10px 5px;
|
|
}
|
|
|
|
button#copy:active {
|
|
box-shadow: inset 0px 0px 5px #6c6c6c;
|
|
}
|
|
|
|
textarea.clipboard-temp {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 2em;
|
|
height: 2em;
|
|
padding: 0;
|
|
border: None;
|
|
outline: None;
|
|
box-shadow: None;
|
|
background: transparent;
|
|
}
|
|
|
|
.left-most-button {
|
|
border-right: 0;
|
|
border-top-left-radius: 6px;
|
|
border-bottom-left-radius: 6px;
|
|
}
|
|
|
|
.middle-button {
|
|
border-right: 0;
|
|
}
|
|
|
|
.right-most-button {
|
|
border-top-right-radius: 6px;
|
|
border-bottom-right-radius: 6px;
|
|
}
|
|
|
|
.button-container {
|
|
font-size: 0;
|
|
margin: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.dark .button-container {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.button-container button {
|
|
background-size: 32px 32px;
|
|
background-position: 5px 5px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
@media print {
|
|
.hideonprint {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
canvas {
|
|
cursor: crosshair;
|
|
}
|
|
|
|
canvas:active {
|
|
cursor: grabbing;
|
|
}
|
|
|
|
.fileinfo {
|
|
width: 100%;
|
|
max-width: 1000px;
|
|
border: none;
|
|
padding: 5px;
|
|
}
|
|
|
|
.fileinfo .title {
|
|
font-size: 20pt;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.fileinfo td {
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
max-width: 1px;
|
|
width: 50%;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.bom {
|
|
border-collapse: collapse;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 10pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
margin-top: 1px;
|
|
position: relative;
|
|
}
|
|
|
|
.bom th,
|
|
.bom td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
.dark .bom th,
|
|
.dark .bom td {
|
|
border: 1px solid #777;
|
|
}
|
|
|
|
.bom th {
|
|
background-color: #CCCCCC;
|
|
background-clip: padding-box;
|
|
}
|
|
|
|
.dark .bom th {
|
|
background-color: #3b4749;
|
|
}
|
|
|
|
.bom tr.highlighted:nth-child(n) {
|
|
background-color: #cfc;
|
|
}
|
|
|
|
.dark .bom tr.highlighted:nth-child(n) {
|
|
background-color: #226022;
|
|
}
|
|
|
|
.bom tr:nth-child(even) {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.dark .bom tr:nth-child(even) {
|
|
background-color: #313b40;
|
|
}
|
|
|
|
.bom tr.checked {
|
|
color: #1cb53d;
|
|
}
|
|
|
|
.dark .bom tr.checked {
|
|
color: #2cce54;
|
|
}
|
|
|
|
.bom tr {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 30px;
|
|
}
|
|
|
|
.bom .value {
|
|
width: 15%;
|
|
}
|
|
|
|
.bom .quantity {
|
|
width: 65px;
|
|
}
|
|
|
|
.bom th .sortmark {
|
|
position: absolute;
|
|
right: 1px;
|
|
top: 1px;
|
|
margin-top: -5px;
|
|
border-width: 5px;
|
|
border-style: solid;
|
|
border-color: transparent transparent #221 transparent;
|
|
transform-origin: 50% 85%;
|
|
transition: opacity 0.2s, transform 0.4s;
|
|
}
|
|
|
|
.dark .bom th .sortmark {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.bom th .sortmark.none {
|
|
opacity: 0;
|
|
}
|
|
|
|
.bom th .sortmark.desc {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.bom th:hover .sortmark.none {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.bom .bom-checkbox {
|
|
width: 30px;
|
|
position: relative;
|
|
user-select: none;
|
|
-moz-user-select: none;
|
|
}
|
|
|
|
.bom .bom-checkbox:before {
|
|
content: "";
|
|
position: absolute;
|
|
border-width: 15px;
|
|
border-style: solid;
|
|
border-color: #51829f transparent transparent transparent;
|
|
visibility: hidden;
|
|
top: -15px;
|
|
}
|
|
|
|
.bom .bom-checkbox:after {
|
|
content: "Double click to set/unset all";
|
|
position: absolute;
|
|
color: white;
|
|
top: -35px;
|
|
left: -26px;
|
|
background: #51829f;
|
|
padding: 5px 15px;
|
|
border-radius: 8px;
|
|
white-space: nowrap;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.bom .bom-checkbox:hover:before,
|
|
.bom .bom-checkbox:hover:after {
|
|
visibility: visible;
|
|
transition: visibility 0.2s linear 1s;
|
|
}
|
|
|
|
.split {
|
|
-webkit-box-sizing: border-box;
|
|
-moz-box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
background-color: inherit;
|
|
}
|
|
|
|
.split.split-horizontal,
|
|
.gutter.gutter-horizontal {
|
|
height: 100%;
|
|
float: left;
|
|
}
|
|
|
|
.gutter {
|
|
background-color: #ddd;
|
|
background-repeat: no-repeat;
|
|
background-position: 50%;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
.dark .gutter {
|
|
background-color: #777;
|
|
}
|
|
|
|
.gutter.gutter-horizontal {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
|
|
cursor: ew-resize;
|
|
width: 5px;
|
|
}
|
|
|
|
.gutter.gutter-vertical {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
|
|
cursor: ns-resize;
|
|
height: 5px;
|
|
}
|
|
|
|
.searchbox {
|
|
float: left;
|
|
height: 40px;
|
|
margin: 10px 5px;
|
|
padding: 12px 32px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 18px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 6px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
|
|
background-position: 10px 10px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.dark .searchbox {
|
|
background-color: #111;
|
|
color: #eee;
|
|
}
|
|
|
|
.searchbox::placeholder {
|
|
color: #ccc;
|
|
}
|
|
|
|
.dark .searchbox::placeholder {
|
|
color: #666;
|
|
}
|
|
|
|
.filter {
|
|
width: calc(60% - 64px);
|
|
}
|
|
|
|
.reflookup {
|
|
width: calc(40% - 10px);
|
|
}
|
|
|
|
input[type=text]:focus {
|
|
background-color: white;
|
|
border: 1px solid #333;
|
|
}
|
|
|
|
.dark input[type=text]:focus {
|
|
background-color: #333;
|
|
border: 1px solid #ccc;
|
|
}
|
|
|
|
mark.highlight {
|
|
background-color: #5050ff;
|
|
color: #fff;
|
|
padding: 2px;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.dark mark.highlight {
|
|
background-color: #76a6da;
|
|
color: #111;
|
|
}
|
|
|
|
.menubtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.statsbtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.iobtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.visbtn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
padding: 15px;
|
|
}
|
|
|
|
#vismenu-content {
|
|
left: 0px;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark .statsbtn,
|
|
.dark .savebtn,
|
|
.dark .menubtn,
|
|
.dark .iobtn,
|
|
.dark .visbtn {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.flexbox {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
}
|
|
|
|
.savebtn {
|
|
background-color: #d6d6d6;
|
|
width: auto;
|
|
height: 30px;
|
|
flex-grow: 1;
|
|
margin: 5px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.savebtn:active {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark .savebtn:active {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
.stats {
|
|
border-collapse: collapse;
|
|
font-size: 12pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
min-width: 450px;
|
|
}
|
|
|
|
.dark .stats td {
|
|
border: 1px solid #bbb;
|
|
}
|
|
|
|
.stats td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
#checkbox-stats div {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
#checkbox-stats .bar {
|
|
background-color: rgba(28, 251, 0, 0.6);
|
|
}
|
|
|
|
.menu {
|
|
position: relative;
|
|
display: inline-block;
|
|
margin: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.menu-content {
|
|
font-size: 12pt !important;
|
|
text-align: left !important;
|
|
font-weight: normal !important;
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
right: 0;
|
|
min-width: 300px;
|
|
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
|
z-index: 100;
|
|
padding: 8px;
|
|
}
|
|
|
|
.dark .menu-content {
|
|
background-color: #111;
|
|
}
|
|
|
|
.menu:hover .menu-content {
|
|
display: block;
|
|
}
|
|
|
|
.menu:hover .menubtn,
|
|
.menu:hover .iobtn,
|
|
.menu:hover .statsbtn {
|
|
background-color: #eee;
|
|
}
|
|
|
|
.menu-label {
|
|
display: inline-block;
|
|
padding: 8px;
|
|
border: 1px solid #ccc;
|
|
border-top: 0;
|
|
width: calc(100% - 18px);
|
|
}
|
|
|
|
.menu-label-top {
|
|
border-top: 1px solid #ccc;
|
|
}
|
|
|
|
.menu-textbox {
|
|
float: left;
|
|
height: 24px;
|
|
margin: 10px 5px;
|
|
padding: 5px 5px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 14px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 4px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
width: calc(100% - 10px);
|
|
}
|
|
|
|
.menu-textbox.invalid,
|
|
.dark .menu-textbox.invalid {
|
|
color: red;
|
|
}
|
|
|
|
.dark .menu-textbox {
|
|
background-color: #222;
|
|
color: #eee;
|
|
}
|
|
|
|
.radio-container {
|
|
margin: 4px;
|
|
}
|
|
|
|
.topmostdiv {
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
#top {
|
|
height: 78px;
|
|
border-bottom: 2px solid black;
|
|
}
|
|
|
|
.dark #top {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#dbg {
|
|
display: block;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #aaa;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #666;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #555;
|
|
}
|
|
|
|
.slider {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
margin: 3px 0;
|
|
padding: 0;
|
|
outline: none;
|
|
opacity: 0.7;
|
|
-webkit-transition: .2s;
|
|
transition: opacity .2s;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider:hover {
|
|
opacity: 1;
|
|
}
|
|
|
|
.slider:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-runnable-track {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
border: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin-top: -4px;
|
|
}
|
|
|
|
.dark .slider::-webkit-slider-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-moz-range-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.slider::-moz-range-track {
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.dark .slider::-moz-range-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-ms-track {
|
|
width: 100%;
|
|
height: 8px;
|
|
border-width: 3px 0;
|
|
background: transparent;
|
|
border-color: transparent;
|
|
color: transparent;
|
|
transition: opacity .2s;
|
|
}
|
|
|
|
.slider::-ms-fill-lower {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-fill-upper {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
|
|
.shameless-plug {
|
|
font-size: 0.8em;
|
|
text-align: center;
|
|
display: block;
|
|
}
|
|
|
|
a {
|
|
color: #0278a4;
|
|
}
|
|
|
|
.dark a {
|
|
color: #00b9fd;
|
|
}
|
|
|
|
#frontcanvas,
|
|
#backcanvas {
|
|
touch-action: none;
|
|
}
|
|
|
|
.placeholder {
|
|
border: 1px dashed #9f9fda !important;
|
|
background-color: #edf2f7 !important;
|
|
}
|
|
|
|
.dragging {
|
|
z-index: 999;
|
|
}
|
|
|
|
.dark .dragging>table>tbody>tr {
|
|
background-color: #252c30;
|
|
}
|
|
|
|
.dark .placeholder {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.column-spacer {
|
|
top: 0;
|
|
left: 0;
|
|
width: calc(100% - 4px);
|
|
position: absolute;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle {
|
|
top: 0;
|
|
right: 0;
|
|
width: 4px;
|
|
position: absolute;
|
|
cursor: col-resize;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle:hover {
|
|
background-color: #4f99bd;
|
|
}
|
|
|
|
|
|
</style>
|
|
<script type="text/javascript" >
|
|
///////////////////////////////////////////////
|
|
/*
|
|
Split.js - v1.3.5
|
|
MIT License
|
|
https://github.com/nathancahill/Split.js
|
|
*/
|
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
|
|
// This work is free. You can redistribute it and/or modify it
|
|
// under the terms of the WTFPL, Version 2
|
|
// For more information see LICENSE.txt or http://www.wtfpl.net/
|
|
//
|
|
// For more information, the home page:
|
|
// http://pieroxy.net/blog/pages/lz-string/testing.html
|
|
//
|
|
// LZ-based compression algorithm, version 1.4.4
|
|
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*!
|
|
* PEP v0.4.3 | https://github.com/jquery/PEP
|
|
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
|
|
*/
|
|
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
|
|
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
|
|
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
|
|
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
|
|
for(var b=a;b.parentNode;)b=b.parentNode;
|
|
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
|
|
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
|
|
//
|
|
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
|
|
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
|
|
var b=x(a,this.findElements,this);
|
|
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
|
|
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
|
|
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
|
|
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
|
|
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
|
|
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
|
|
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
|
|
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
|
|
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
|
|
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
|
|
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
|
|
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
|
|
b=!1;else if("XY"===c)
|
|
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
|
|
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
|
|
vacuumTouches:function(a){var b=a.touches;
|
|
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
|
|
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
|
|
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
|
|
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
|
|
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
|
|
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
|
|
if(this.isPrimaryTouch(c)){
|
|
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "fields": ["Value", "Footprint"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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aalgCXqTBXaTZwRsE6lkyW1pfylysXzRaFF4qWhpcRlt6XRpf2l1GXDpfRlqaX/pZmloGXcJZBl3SWrpZy6YmWYZcel/qXVhapl7aXaJYlFxCWPpYclr6WnJZql1iXMZdZlv8XcZe8l/GX9JediHmXToFJliCWCpYplmcWEZdel3aWYpfFll0Bvpecl2qXXJdllnGXgZbxl5XICZZrfQswjJa6ljsXYZcglzWWtpeGl2mXkZfpliWX4paZl46XTZfVFrSW5pc5lsGXdjELeW6XoZdVlh6X1pcdlzaXBZZdl3WWxZZiFyWXfpeZlmWWGpbll82WFZctl/SWMxxVl7qXw5bJl0KWnZejlmmXY5fsl+OXPZZcllIWU5bNl9mWLZbhgLmXp+2zl+2W+ZYLliKX4Jddl5A4UZY9ltGXy5amOH2WvJZalnyWrZYIjDt5IZZ5F3mWI5Y1lqOWW5Z2lkWX3pZLlqqWjZellk2XK5d9ltKWA5cHlhmSG5eCl8eXyZcnll6XW5eLljuWDZYTlo6XppeXlvuWLpYHlpWXk0E3ltWXzJYGlwuWdZZnlumXPpaPlsuXjZYrl06W2Zb9ljmXLpcDlomob5dzl9WWd5fhl6iWi5aflt2WX5dvAQ2WpZYxlpeXP5dTl6uX05drlv+WtXQAVh2WJ5ZAVkqXH5dsl0WW55YOln6WT5ZZls+X5Zf7l6aA23l+MO+dspdylq/m75YFlqeXhZZwV2eXD5agV4+WvZdPl+BWq5e/lmuXyRE2cTehn/CMl6hXn/FoVi0X6FbKlnYW45fnlmBWk5bgVwGWEFa4VpBWXVF4VnLsqFexXPKWgFfzl3eXtZf3l8BX25fdl1+Wu5fflnuXiFbTl0hW5YBNgPYxKFZDlwRXlJbhloqXRFaRl3RXIFZ2AaBXE5e9l4xXEFdMV5BX15ZKAtBWm5c0V0BXsFfKlvWXS5YMVxeWP5dkVzhXV5dalyMA7YMsVkeXFRZQcNRXhFcpl+xW25b2lpxXyQBcVwhXk5Y4VleX/Zdal0DaKFdAbARXVFZoV2xX75dSVg+W9FZYVt+WwlaMV3JXz5fSlr0mYTDiV8kAXxcSlxJWylcjlzBXqZcCV8RW8FYZlghW2FaIVhpWSFYvl6aAZjiKV/hX2lamlzpWhFfKVuhW95enlxhXn5f1lmpXQldgV8JXsZbyVn+X1cioQJRXWlZKVuZWbFe6VuxWllYYVoJWJFfwVheXNlfqViJWdle4V5BgDleKVmZXrFb8VnpWhZbEVuyXmFecV1hXu5fql0ZWTFfGVo6BSlpaVl5WoZbeV7eWNFY+VmOWdFfSVtZXfldqV25WAVfuVxpXQxfDoZ5XplYhV0pX5ldOVipXzla+V3BWflcyVv5XDFZRV7ZW0VbEl5e6+FefF7FXjlfeVs5WtFeWVy5WBlc7lxmX/laxls6XuFfBvWJXwVZLFnFWTlYwVxlWAle0VlZWIFYRVklWkVekVrZWuVYUVtqX/EghltpWoZbtlreW85b6l5uWCVYcV+FWQlfZVslXOVa/lqJX/bOpV5RWrFYFVhlX8VaZVi5X+leJV2AAsleGVnJXUVbGVgiWNkl5VrFX+VfpVqFX1Vf8VrBXRVZZVm1W7VY5V3uWnVfRVlARXVdpV91XPBa6VoVWLVZFV5lXrVeqVxFWNlelVu5WKVeDVu4WbzTDVlRWPVbVVp6XhVZ9VuNXvlYTVyVWk1bcVwFWPFeBVlnZK3hpVrNXI1dxV6NXFlctVwlWmFaLV21XSVbqV8lXZVc8VklFM1dNV7NX1Fa9VmFWwFbFVxxWJVdbVqVXS1cdVoFWCJfIVsFW3VYSV2tXBVeAVvNXeld9V+NWMlbHVktX2FcnV8tWCJf0K2dXw1fnVzBCo1aXVmNX81atVwtX11YDVvVWg1anV9FWoOB7V+JWtxb7V5JWtZdjV89WiVZbVq9X21f1VuRXDVebmcxXq1d7VhdXzVYbVt9Wm1dWVnVWhlcDV9xX5Fa7V+VXvEkMlmZWVVdvlhZWRFc1VtJXglckV1xWt1dTV29W7hZiVqZWD1afV4DXPVdzV09WV1YLVj9XL1bbV5FWf1ciV/JWfIFXBzZwioF8V0jX+ZbQ1xtWtVcw165WpFYnV3DWd1fRVpjWt3RtlpDWSZcAVl9XnZaHVv1XP1Zo15NWO1YNVhjX59CE1pTxh5aVV0eWw5fQVk9XQNbPV8DXxVcg1m5W5Nbo1h5WFFfMaOwSN5ZDl5DXxNdQ1lJX0NaqV6jXx1Zw1ztWK1crMszXPhtY1nNX2NZs1zjWMNauVwZWDNb41pzWCJeU1unoRNeVVsTXNNehV5dXPla413zW2Vag169WYNb/V8yBgtfH7dzX+1bI17TWKNffV5tX7Nc3VkZXt1dg15zXTNfMV/TA0tYk1h+XV1YvV0dWv1do1m9WBNbuFlLWesDK16zXX1Z01mLXWVf0V3VXv1bq1wrXQZe8VjxBmtbxVzLXotZ81jrX1la612rXEtcU15LWu/p3yRVXbZfC1kDWONbA19rX/Vdk1gLWFNd2VpTXZtdbfRDWwtbHljzWNVe81uzXqtfW1xzXNte5VlLXo4EG1+tXltba10bW1tYc1/LX+Nd61wTWdtdsMPbX1NZzliLWB1ai12FXh1e1VrDXslZkVl7WktcygFLWXRgs1xbW2NaO1lbWHtZk1p7WHVdB16bXwdfe1rfIbta01u7Wstd01kdX9Nd4187Xf1ZR1lzWTYE9QjHXItfI1kbWTtbx17DXntcC1t7WBYHASVTWFtYO19LXPNda17HXVtYR1vLWkdbp1hrW0dagQMnXftYp1/7XpNdy1ibXDNZ61sHXide/1T7XApY01pbWvNbh1qnWgdftVkHXedcvlyzIR3ih1lnXytcqVuFXuNb81/HXadYu1kzXgtZcKQXWMtax1ynX9ddi1zrX4te61qbWttZm1hnWENYt1tnXJNb6VqrXqdeB1mVWTda7V4rWFVdC1r7XG5Zh171WOdfh1sXX7dcm1stXXtb51l3XFtyZ10TWddZa1j3XKtao107XEdbV1v3WitbN1kFA3ddh1+7XldZ41mnWedez1oLW0dfkofPWw9et1gHWDdbi1/zWCdfo1p3XCoC7eYtYG2hrVo9W61cx1xXXC9Zt1sbXE1fF1jbXCdeb1y8D23n8RIjWOlZI1w7Xq9ZF1tdWM9e51rPXh9e5V+9XMTCyloDXO9cXV8nXhtdn1r3WVdeg1mPWpdbqMsfX29fX1rqWFdfZ1mvXRdfn1wfXG9eM1uDWuZafQqvXB1c919PXvddV133Wl9ZM1mdW29dJF15WzVdD15/W09Zy16/Wo9Yl1x3XuVZlKY/Xf9bpVqfXWdYL18PWi9cN1kvXF9ab17lWF7p/1ifXZldgN3XXbNb71x7WF9Y/11A2TNYzV1fXx9Y71s/WADb+1qTW59bf1/fWCtcP10NXSDZP1x9XJ9Y318/XU9co14A3aDYS1g/WideO0TKWyDdP1pJWU9Yq1zg2INb31ng36Db4N/a4oDcwNyFXp9cANsQ29NYkNh3XeDZH1nlWmDegNiNW2DcoN4XXqDd314vWfdZTV9XX59HElzQ25Df/1hQ2qDZf1rg2VDej1qQ31DbuOWQ3yDeENobWrdZ311/W7DbANtQ3HlYf1/JAn9esNoA3xDcMN9/XjDbL13SXQVYwNlw3j1a319w39Dc8NkI26DeR1kfWnlecNoQ2YjaF17fX4jdsNxI3JDeSNx5X9lbSNlg2sDZ0Nqw29DZsN4I2kDaMN+TXP9bg1yZWVDOYNtTXD1YoNso2sjYqN5Q3cjdUNhw3HleaVqI30ja712I2e9YQNvA2udZv143Xajec19qASdcZ5LQ3mjdcN27Whjcv1mg2vDaH1og24NYI1ho3ZjeI10o24DZn17I3Kjfr1o3XS9YmN9KWe2vMN6I2BjcyNuI32jdx1lY3b9cpVxppW9ZmNiw3n1ZENvXXa9dt18bXQDdWNu/XJjb3Vvo3ijfkN3Y3FDey1g427dYb1lmXdxc9F7iXtld9Fk8X/RfgFwcAShdQAMoXnNfpamUwTiULMO8W2RYfF4kXWhZDlt8XN9dRAHQBaRcGFkw2EBn4Go2qRMGJlsiW+Za4ga42gjcBFhiXDjeQNswXxhZVFnsXwjYwF9E2K2hl2Gk2wJfIlyCX6TcWNjw33paCYUY3vjemlqE2uJd+AbIXeJbYAY8W+gFRFs1BkTZQF4MW0TcOM/0xbxbqF+8WiReIF/E3ijcJNuk3Pxfwl78W1QG6NhRWeTZhBDpGFtdpNtjW/BbaNxk36JYlNiE3MZfZN9yXVRZON0MWrTb7sfk3I1b5lh02GTaUN503I9ddNk2XpTfhF2U3vRZsFuE2lTYRNjmBVTdRNq8WUPHzMFoQpJZxNvU2WhdLaIyWjTbY11SWvxfUl8038jctN3WI4zC9s4o2PBaPVgM2a40dN4M2pRZdNo43XJfdNrCXJdaJ1lM3SzEwNys2JBftNms2gzdBNpk2GzdZNnuWIzf3F2E2+Jb9FrRoQAAElwMWUTcxFu4Xo4GgxZ/xsTYIF5vpiRfZe7KXGcZQEJuWvZFJN7MWuTZ8gNER8LEisMxTrcmKN9IBPBaJN44BZTFrN/s37QFioO43/pebNjyWvTfTVmsNl4AATaRHQXBDl883MEMvNo4Brzb7NnHXTJdDNxs3CDd+N9KXBEDO8eS08CuXgbKWfzZWgPmWALZFN/Y2YqBAtoc2ajbWNorWB/rowJfQ7xRo9OC3cICMgRC2pimQtm43gLZANsM23RY4lj0WZTbVAOU2YzfHN+E3JzYEl9EXZzfVNq8X4gmBAO2wGMVwF+8WFNuIFuWDOpbolMIBxTkYgOgWTTcYFsk39zYojQagLPoGybKW/qG+gfyWPNcDN0i2nTaKsNC3qjbclls3wDYUVu2x9cnwPWXXXxcxqDsXCzCkF3s21LbrNiZLuDa6N4s2u1YUiuS31dpzNky3GwDMtnwXVLYv10U2Uo0HNrS3WzZH19bzToDQ2py2ZlcUt0y3qzZBNoC3rLYfN443MLavFhaTz7Hktgk2XLeUt1nWPLY4N282NLYot0C2wjZfN0+wH6Mctoy21QFCt1y3wrcCNqy2+Iayt9C2jNYeN+Ul8rZLPX7wFLeStxVXzLYitmLXbSWitlA3wLdDF+K2pSQatpK2VGjCtns3WrZ819q3OjfsNuy3nNYCtwux//katga2SraGtsq2Mraitsa3vDYtN+y3vjXqto3pnLbmtlK2WrcWtyK2KrZst8a3yTb+AfS3prcPgWa3wKvmtlS2LLc8tlC2MzE0t0I2MLa6tjAWNpISt4K2oZeKt3a33Ldut9K2DrdGtqo2nreqttNXT7GiZc62+rcNNpq23LcgltK3RDaWtw62OrbAtmq2cdKFmTa3CraoFqG3SrfKN9S3lrcBtpI2TreRsP9A0bcutpS3mrZ+t4a3Y5YBtlk3fLd0trtWHs2Jt/q2rre+tmG3frbht/62fLaBtvy3uFb6zLOxQgi2tkK3MbYWt7G3yrapt8E3sreet5G35PGcPBm3IbZ2tsm2WbYptm3XRba+Nyi2crdit0MX8EXBt/m3PrcFtm63FbY+N5W2B9clN8Y31bdetmoYZbaaN4y25behtgqXYbfeNy5XDbeLVsY2YrZetjTxZLYtt7a2mbflt223Wbftt8RXHbY3V523OrcltpqGY8Het9G2vre9tysW7bdwNg22Obfxt6S3NSWlt9exErdltr22bbejt323Y7Ydt+O28jYJtnm2CrZJtwa29bf2ttq3c7dst/O3dNPDtou3rrdStrO3jtaVt8u3jrcTt+Txy/kLtxm3SbYzt0KWY7YbtuO3HrYTt3K2KI1hBdu207c7trG2bzfZt/u287Zbt5HEhqhTtj62Ohd1tuu39bZztqe3utZHNmE3DxYVN/iXJzYAAKWElti3LxbZFo6lODELpdM2VzZx/I4BUjE7N96ZfCMpFjiAaRbUlqS3h9ZEAAyYa5YYpaOlr2gIt45wqRPYNqmWz8LY8PEAOJckgfIB2dYAdoSAQHaMlqkTWAF/tgg21bZ2V1+3m9Y/t+X4/6Utt58B2SNgd1o2sdYAdokwgHbYACB38gFAdwaXwHYsmQh2oHYwdmd0g7aRtpqXEHfftisBvYRwccBw0HeMl9wjvYN0Nie2YtbMwZxgJVbwdkAACHaId/+27cPgw/h3bTc8F3JjVbdyY84WPTc5Nl+22ADftpBWT7etlxiAFtdYd+2CcDdgwoR2HcNwdjoBgHbId4h3NHbJAER3RNe+1HLmJHeBt4GXaHYUd+h3T7f9DEcXRNdUdtqV1Hb0wgx2Mld4dkR39Hb6Qwx3SHdAd4x2xHaZAMx2/LcsdzxXFHd+MIPWxBYcdv834DZwdlKA3He8dsB2XHfwduJ3fHcwQ8R3xbfMd9mWgnYrVkJ3XOWJliJ2/7Z6QhJ3AHZ0dxJ3IHY8d+3CvHcgd5J3q2Kod+B3mRcyd7UXsncs4cqAVHbAlxx23jf9Qwp3tHYqdvR3BHc8d3R2fHbC1kx3UnaqtwJ25HaQd6x36ii9mis21H1/NyJ2w9eid9yBYndKd3p3ynf6d0R2Unf8dtJ3RnZAAeR3gnYmdyepCXGmdvJ32Hewdzp2YneKdvh24nbKd4R2kncGdvx24HYltmh2xnbodmVYqDF+0XJ3WnbmdnpWFnbeAJZ2enYKdvp2SnbIdqp3THa2dx3X6nePt/Z2QGzCd+YXjnawdoY2fnYcAP52BHYBd1Z2gXYGdnkWhnc2dkZ3wXeedqx3XnaQzcxAPnYvNr53l1cRd2UBkXfidwF3Lncqdu52NnYed9J3v5YhdmAWQnaryYl3Znfydjp3qXa6dtZ3rnYdwox26Xeqd422XbbqdvF29nYJd/hNlHfsdz53OXY0d7l3zne6dlF2uXbRdml3gXcFd0F2cXbUN5l2qQH2dqbk7HbC1uF3gTbJds53FnYud9x2VnZud2l3MXfudmp3HnYsdsV2snd1dm6SodcNdpx2acJNd352zXaudi13+Xdud6136Xdtdxl3uBe1d38BdXYYodl22Hfhdql2VXZ5d9F3o3ctdtV3/XaFdgJ3cXZ2d8Z2CXcZmCN21HfaduV2Y3YVd3l2fXcVd9Z3k3bBdrV2HXYad/Z2GYSldg12ZXZOdhF2PXaRdr13lndRdhN2MXaNFm13hXeDtp5203ZedjrBoMTNcF13a3ajdvl2yQFjd1V2lXdzd1t3i3Y1dmm2y3Z7d/F2+3YoxcpajnaHdo13yNfJd7QWm3f+d5V2p3ZBd4Z3Z3YcNkN2/7AJd6Sos3badtw363fld012i3ZHdtZ293exdg93kjaPd2BwCXcpJs93SXfXdht2KXa3did3nHepdgV2k3Zndzm3U3d2dx12CXeREGF3XhdddnN2/3bzd692C3Zbd312rXfbdgN3O3eod+1353fFdxd28gurdnkXoPYvd+N2tHfzduN3b3bjd+92GXe2d0D2K3dfdw2p33dld2D34MLHd813EPaLd8j3A3co99N3sPfLN5h3IVBJd+j33Xavdz12b3cLdu931Xf3d4D253ao9yF3wPZ14Zp3pXb49ut3CPdHd4j3x3aU90T3APfE9ge2m9efd1l3k6Fw98J3V3bdd0/Cv3c3d4T2WPfU9lD2S3c1dw93y3ek9xd21En1dvD3DPZg9gT24PaE9hD2d3aQ9xN3LPaA9rT2EHds9ll39nZ4UKTEWnYU94d2RPZ4dn921PbI9sT2H3Yk9mz3MPbA9+z2QEhom0L2OXcU90j2inbM9zz3WPdi9ij2QPc49hh34Fzk9mt2wvbXdzLWN3Yx4bL3J3a89tt3SJY7dlN3JPfGdv0AwHEc9gz2yvaM9yr3KXcy9gD2fPc096e3ZHcS9it2WvaDl0HA6PYy9iL2svY89mr3cvY09uL2/PdFdob3IXZG91YM2vdhd5z2CPcy9pj3vXfM9mL25vfy9pr26HZW9vYxIPZYdjb2Fjei9qb2SPcm93r36vdQ9xr2Evak9wL2RvZydwd2OvZc94z3BPcbd6r2GPdq96d3+vYrtzbWdPZ8dDhwmnfG98L3dvau91T2evb9dvr35vYG97T2AvZ1dl73k+nB98r3Tna+9792fvdc93d28vfY9gr2jvZVZZqs1vag9873u9cu97b3m3Zy9iz27vas9x92zpeB9kb3oIjR9zr2TPaq96b3fvdm9uH2Dvce95r2VWWhdln2Pva69qL2YfeQ92n3fPYR9/z2lvee9/n2uwMF9zb3Jvcp97d2ZvZp914WsXZ59p92kfdDdlb3SxHl9i72tvZU95j3qfb297n38fcO9qx2mfdGkP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Y4rM4pjmzOtM7szvWOuY8czm/x/DbUzjjPXM8AtqmPtM8Jjk6OKo6wxYTOSE9Ez1tPbo+CziGPdM4qjt0YAo+hl7GPZY7czxGPYs4ejyVOZnfehCLPDM4ITzTP0s48z5qOzM8ASOKOcs5czjTO0s7ZjkzPpo4cz8zOLk9a4CrOBY4Kz6rOMs+OjjaPWM8SzprPUs8Czp2O904fDrzPrY+sE3LO5M96zhqO2s6VjgTOAGSG8brOHY7GzhTOis/gDwbPSs+mz5zO/M5Ez0KXjM4mzn6Ops7iqSYBZs5ZjlrOhY+2z0zPls6hj9NZ9M6xj9TPms6qz47PFs8kz7hXWM4oWA7PTY6Oz82OTs+vVu9O8M4fTwoXCM9rjkjPQxZsj8sp9iA/Ty+OqM6OAGjPmHbozrVPQpYAzl1OiY8Ez9VgXs6izt7Oeo4+zlhP4M+ij3bOEYn5jgzPRs7Hj0GP0c9GD5TOKo41+kbPrM/mz2zP+s9FjurPzk7PKJLPXo8izzbPos7xjonPaY5JzmZ3uBXJzgLOCc6Cz+7O2E80T0nOiLfWzpnOjM5Zz7WO2c85jqXX0Y4ZTbnPKs8pz9zPqc5FdsWO6c/kuZHPmc9RzmLP+c5MTtGOws6r8dXOxc81z1nPtc7JTwXOLM/edkXO8s/qTo3OJc5Nzp5OpE7CzqrnLc/xzr+OcbeceO3OgM4Njm/wnc6ljlLO5s95zvrPq08P9+LOLM6Rz53OKc4Dz8bOPc4Rz6bOLc99z67Oes8jzhbOlc/szkrPzs5vFtqU8c4jz13ORbZqz4POQ7dYz53wDc/yz27P3s+jzme3C8/ykYvPrc9LztHPy846zuKPifGrzrbP68+VjxvPX9XDznnOc88+jvPPic5Vz9POtqgZzsmP/M/lzpPOqc6Dz29OcM57T+9O+09lAQjOn08HTzRORsEbsfphQc98T8HPIc6Ml6HO/zbhzjFPlM7tDLgsSfeSzhPP/c+7zwnP7s9rTx6OD89SsfN5m8/Fzg/JJc4GzqXXOk+FROXObs4VzwrOU888z5/PKzZ+JO/Obc4fz1vPMU5fzjBUs867z/RPA84zjmnO085ALwBWwC9Hzs/O+c6/z4rOzs5fz6yEQA+ljq3OW8+QLpbOf85x/Iux/89rzrXOcC4ezy03f8+ZGQguP89azoAvi09/zxeBKC7HzxXOJ8/Zz/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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function() {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function() {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function copyToClipboard() {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text = text + node.firstChild.nodeValue;
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
text = text + '✓';
|
|
}
|
|
} else if (node.nodeName == "MARK") {
|
|
text = text + node.firstChild.nodeValue;
|
|
} else {
|
|
text = text + node.nodeValue;
|
|
}
|
|
}
|
|
if (cell != row.lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function(s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
if (config.fields.includes("Value")) {
|
|
var index = config.fields.indexOf("Value");
|
|
pcbdata.bom["parsedValues"] = {};
|
|
for (var id in pcbdata.bom.fields) {
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
unit = unit[0];
|
|
} else {
|
|
ref = /^([a-z]+)\d+$/i.exec(ref);
|
|
if (ref) {
|
|
ref = ref[1].toLowerCase();
|
|
if (ref == "c") unit = 'f';
|
|
else if (ref == "l") unit = 'h';
|
|
else if (ref == "r" || ref == "rv") unit = 'r';
|
|
else unit = null;
|
|
}
|
|
}
|
|
return unit;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
var unit;
|
|
if (match) {
|
|
val = parseFloat(match[1]);
|
|
if (match[2]) {
|
|
val = val * units.getMultiplier(match[2]);
|
|
}
|
|
unit = inferUnit(match[3], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
match = units.valueAltRegex.exec(val);
|
|
if (match && (match[1] || match[4])) {
|
|
val = parseFloat(match[1] + "." + match[4]);
|
|
if (match[3]) {
|
|
val = val * units.getMultiplier(match[3]);
|
|
}
|
|
unit = inferUnit(match[2], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function(e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function overwriteSettings(newSettings) {
|
|
initDone = false;
|
|
Object.assign(settings, newSettings);
|
|
writeStorage("bomlayout", settings.bomlayout);
|
|
writeStorage("bommode", settings.bommode);
|
|
writeStorage("canvaslayout", settings.canvaslayout);
|
|
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
|
|
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
|
|
for (var checkbox of settings.checkboxes) {
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
}
|
|
writeStorage("markWhenChecked", settings.markWhenChecked);
|
|
padsVisible(settings.renderPads);
|
|
document.getElementById("padsCheckbox").checked = settings.renderPads;
|
|
fabricationVisible(settings.renderFabrication);
|
|
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
|
|
silkscreenVisible(settings.renderSilkscreen);
|
|
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
|
|
referencesVisible(settings.renderReferences);
|
|
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
|
|
valuesVisible(settings.renderValues);
|
|
document.getElementById("valuesCheckbox").checked = settings.renderValues;
|
|
tracksVisible(settings.renderTracks);
|
|
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
|
|
zonesVisible(settings.renderZones);
|
|
document.getElementById("zonesCheckbox").checked = settings.renderZones;
|
|
dnpOutline(settings.renderDnpOutline);
|
|
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
|
|
setRedrawOnDrag(settings.redrawOnDrag);
|
|
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
|
|
showFootprints(settings.show_footprints);
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
function saveFile(filename, blob) {
|
|
var link = document.createElement("a");
|
|
var objurl = URL.createObjectURL(blob);
|
|
link.download = filename;
|
|
link.href = objurl;
|
|
link.click();
|
|
}
|
|
|
|
function dataURLtoBlob(dataurl) {
|
|
var arr = dataurl.split(','),
|
|
mime = arr[0].match(/:(.*?);/)[1],
|
|
bstr = atob(arr[1]),
|
|
n = bstr.length,
|
|
u8arr = new Uint8Array(n);
|
|
while (n--) {
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new Blob([u8arr], {
|
|
type: mime
|
|
});
|
|
}
|
|
|
|
var settings = {
|
|
canvaslayout: "default",
|
|
bomlayout: "default",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: false,
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
}
|
|
|
|
function initDefaults() {
|
|
settings.bomlayout = readStorage("bomlayout");
|
|
if (settings.bomlayout === null) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
settings.bommode = readStorage("bommode");
|
|
if (settings.bommode === null) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
settings.canvaslayout = readStorage("canvaslayout");
|
|
if (settings.canvaslayout === null) {
|
|
settings.canvaslayout = config.layer_view;
|
|
}
|
|
var bomCheckboxes = readStorage("bomCheckboxes");
|
|
if (bomCheckboxes === null) {
|
|
bomCheckboxes = config.checkboxes;
|
|
}
|
|
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
|
|
document.getElementById("bomCheckboxes").value = bomCheckboxes;
|
|
|
|
settings.markWhenChecked = readStorage("markWhenChecked") || "";
|
|
populateMarkWhenCheckedOptions();
|
|
|
|
function initBooleanSetting(storageString, def, elementId, func) {
|
|
var b = readStorage(storageString);
|
|
if (b === null) {
|
|
b = def;
|
|
} else {
|
|
b = (b == "true");
|
|
}
|
|
document.getElementById(elementId).checked = b;
|
|
func(b);
|
|
}
|
|
|
|
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
|
|
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
|
|
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
|
|
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
|
|
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
|
|
if ("tracks" in pcbdata) {
|
|
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
|
|
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
|
|
} else {
|
|
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
|
|
tracksVisible(false);
|
|
zonesVisible(false);
|
|
}
|
|
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
|
|
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
|
|
|
|
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
|
|
var hcols = JSON.parse(readStorage("hiddenColumns"));
|
|
if (hcols === null) {
|
|
hcols = [];
|
|
}
|
|
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
|
|
|
|
var cord = JSON.parse(readStorage("columnOrder"));
|
|
if (cord === null) {
|
|
cord = fields;
|
|
} else {
|
|
cord = cord.filter(e => fields.includes(e));
|
|
if (cord.length != fields.length)
|
|
cord = fields;
|
|
}
|
|
settings.columnOrder = cord;
|
|
|
|
settings.boardRotation = readStorage("boardRotation");
|
|
if (settings.boardRotation === null) {
|
|
settings.boardRotation = config.board_rotation * 5;
|
|
} else {
|
|
settings.boardRotation = parseInt(settings.boardRotation);
|
|
}
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function() {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function(eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function(eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for (callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawText(ctx, text, color) {
|
|
if ("ref" in text && !settings.renderReferences) return;
|
|
if ("val" in text && !settings.renderValues) return;
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.lineWidth = text.thickness;
|
|
if ("svgpath" in text) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
offsety += interline;
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
if ("svgpath" in edge) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
if (edge.type == "rect") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(edge.start[0], edge.end[1]);
|
|
ctx.lineTo(...edge.end);
|
|
ctx.lineTo(edge.end[0], edge.start[1]);
|
|
ctx.lineTo(...edge.start);
|
|
}
|
|
if (edge.type == "arc") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
deg2rad(edge.startangle),
|
|
deg2rad(edge.endangle));
|
|
}
|
|
if (edge.type == "circle") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
0, 2 * Math.PI);
|
|
ctx.closePath();
|
|
}
|
|
if (edge.type == "curve") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
|
|
}
|
|
if("filled" in edge && edge.filled)
|
|
ctx.fill();
|
|
else
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
|
|
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
|
|
var path = new Path2D();
|
|
var width = size[0];
|
|
var height = size[1];
|
|
var x = width * -0.5;
|
|
var y = height * -0.5;
|
|
var chamfOffset = Math.min(width, height) * chamfratio;
|
|
path.moveTo(x, 0);
|
|
if (chamfpos & 4) {
|
|
path.lineTo(x, y + height - chamfOffset);
|
|
path.lineTo(x + chamfOffset, y + height);
|
|
path.lineTo(0, y + height);
|
|
} else {
|
|
path.arcTo(x, y + height, x + width, y + height, radius);
|
|
}
|
|
if (chamfpos & 8) {
|
|
path.lineTo(x + width - chamfOffset, y + height);
|
|
path.lineTo(x + width, y + height - chamfOffset);
|
|
path.lineTo(x + width, 0);
|
|
} else {
|
|
path.arcTo(x + width, y + height, x + width, y, radius);
|
|
}
|
|
if (chamfpos & 2) {
|
|
path.lineTo(x + width, y + chamfOffset);
|
|
path.lineTo(x + width - chamfOffset, y);
|
|
path.lineTo(0, y);
|
|
} else {
|
|
path.arcTo(x + width, y, x, y, radius);
|
|
}
|
|
if (chamfpos & 1) {
|
|
path.lineTo(x + chamfOffset, y);
|
|
path.lineTo(x, y + chamfOffset);
|
|
path.lineTo(x, 0);
|
|
} else {
|
|
path.arcTo(x, y, x, y + height, radius);
|
|
}
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getOblongPath(size) {
|
|
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
|
|
}
|
|
|
|
function getPolygonsPath(shape) {
|
|
if (shape.path2d) {
|
|
return shape.path2d;
|
|
}
|
|
if ("svgpath" in shape) {
|
|
shape.path2d = new Path2D(shape.svgpath);
|
|
} else {
|
|
var path = new Path2D();
|
|
for (var polygon of shape.polygons) {
|
|
path.moveTo(...polygon[0]);
|
|
for (var i = 1; i < polygon.length; i++) {
|
|
path.lineTo(...polygon[i]);
|
|
}
|
|
path.closePath();
|
|
}
|
|
shape.path2d = path;
|
|
}
|
|
return shape.path2d;
|
|
}
|
|
|
|
function drawPolygonShape(ctx, scalefactor, shape, color) {
|
|
ctx.save();
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
if("filled" in shape && !shape.filled) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.stroke(getPolygonsPath(shape));
|
|
} else {
|
|
ctx.fillStyle = color;
|
|
ctx.fill(getPolygonsPath(shape));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, drawing, color);
|
|
} else {
|
|
drawText(ctx, drawing, color);
|
|
}
|
|
}
|
|
|
|
function getCirclePath(radius) {
|
|
var path = new Path2D();
|
|
path.arc(0, 0, radius, 0, 2 * Math.PI);
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getCachedPadPath(pad) {
|
|
if (!pad.path2d) {
|
|
// if path2d is not set, build one and cache it on pad object
|
|
if (pad.shape == "rect") {
|
|
pad.path2d = new Path2D();
|
|
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
|
|
} else if (pad.shape == "oval") {
|
|
pad.path2d = getOblongPath(pad.size);
|
|
} else if (pad.shape == "circle") {
|
|
pad.path2d = getCirclePath(pad.size[0] / 2);
|
|
} else if (pad.shape == "roundrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
|
|
} else if (pad.shape == "chamfrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
|
|
} else if (pad.shape == "custom") {
|
|
pad.path2d = getPolygonsPath(pad);
|
|
}
|
|
}
|
|
return pad.path2d;
|
|
}
|
|
|
|
function drawPad(ctx, pad, color, outline) {
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(deg2rad(pad.angle));
|
|
if (pad.offset) {
|
|
ctx.translate(...pad.offset);
|
|
}
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
var path = getCachedPadPath(pad);
|
|
if (outline) {
|
|
ctx.stroke(path);
|
|
} else {
|
|
ctx.fill(path);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawPadHole(ctx, pad, padHoleColor) {
|
|
if (pad.type != "th") return;
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(deg2rad(pad.angle));
|
|
ctx.fillStyle = padHoleColor;
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (footprint.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...footprint.bbox.pos);
|
|
ctx.rotate(deg2rad(-footprint.bbox.angle));
|
|
ctx.translate(...footprint.bbox.relpos);
|
|
ctx.fillStyle = colors.pad;
|
|
ctx.fillRect(0, 0, ...footprint.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = colors.pad;
|
|
ctx.strokeRect(0, 0, ...footprint.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of footprint.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
|
|
}
|
|
}
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, colors.pad, outline);
|
|
if (pad.pin1 && settings.highlightpin1) {
|
|
drawPad(ctx, pad, colors.outline, true);
|
|
}
|
|
}
|
|
}
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, colors.padHole);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawDrawing(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawFootprints(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
|
|
var colors = {
|
|
pad: style.getPropertyValue('--pad-color'),
|
|
padHole: style.getPropertyValue('--pad-hole-color'),
|
|
outline: style.getPropertyValue('--pin1-outline-color'),
|
|
}
|
|
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var mod = pcbdata.footprints[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
var h = highlightedFootprints.includes(i);
|
|
var d = markedFootprints.has(i);
|
|
if (highlight) {
|
|
if(h && d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
|
|
} else if (h) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
} else if (d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
|
|
}
|
|
}
|
|
if( h || d || !highlight) {
|
|
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata.drawings[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, d, polygonColor);
|
|
} else {
|
|
drawText(ctx, d, textColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawTracks(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
if ('radius' in track) {
|
|
ctx.arc(
|
|
...track.center,
|
|
track.radius,
|
|
deg2rad(track.startangle),
|
|
deg2rad(track.endangle));
|
|
} else {
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.fill(zone.path2d);
|
|
if (zone.width > 0) {
|
|
ctx.lineWidth = zone.width;
|
|
ctx.stroke(zone.path2d);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clearCanvas(canvas, color = null) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
if (color) {
|
|
ctx.fillStyle = color;
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
} else {
|
|
if (!window.matchMedia("print").matches)
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
if (highlightedNet !== null) {
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
drawFootprints(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
var fontsize = 1.55;
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer == "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var bbox = applyRotation(pcbdata.edges_bbox);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
var flip = (layerdict.layer == "B");
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function modulo(n, mod) {
|
|
return ((n % mod) + mod) % mod;
|
|
}
|
|
|
|
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
|
|
var dx = x - xc;
|
|
var dy = y - yc;
|
|
var r_sq = dx * dx + dy * dy;
|
|
var rmin = Math.max(0, radius - d);
|
|
var rmax = radius + d;
|
|
|
|
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
|
|
return false;
|
|
|
|
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
|
|
var dx1 = xc + radius * Math.cos(angle1) - x;
|
|
var dy1 = yc + radius * Math.sin(angle1) - y;
|
|
if (dx1 * dx1 + dy1 * dy1 <= d * d)
|
|
return true;
|
|
|
|
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
|
|
var dx2 = xc + radius * Math.cos(angle2) - x;
|
|
var dy2 = yc + radius * Math.sin(angle2) - y;
|
|
if (dx2 * dx2 + dy2 * dy2 <= d * d)
|
|
return true;
|
|
|
|
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
|
|
if (angle1 > angle2)
|
|
return (angle >= angle2 || angle <= angle1);
|
|
else
|
|
return (angle >= angle1 && angle <= angle2);
|
|
}
|
|
|
|
function pointWithinPad(x, y, pad) {
|
|
var v = [x - pad.pos[0], y - pad.pos[1]];
|
|
v = rotateVector(v, -pad.angle);
|
|
if (pad.offset) {
|
|
v[0] -= pad.offset[0];
|
|
v[1] -= pad.offset[1];
|
|
}
|
|
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
|
|
}
|
|
|
|
function netHitScan(layer, x, y) {
|
|
// Check track segments
|
|
if (settings.renderTracks && pcbdata.tracks) {
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if ('radius' in track) {
|
|
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
} else {
|
|
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var footprint of pcbdata.footprints) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinFootprintBbox(x, y, bbox) {
|
|
var v = [x - bbox.pos[0], y - bbox.pos[1]];
|
|
v = rotateVector(v, bbox.angle);
|
|
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
|
|
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
|
|
}
|
|
|
|
function bboxHitScan(layer, x, y) {
|
|
var result = [];
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var footprint = pcbdata.footprints[i];
|
|
if (footprint.layer == layer) {
|
|
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0 && e.button != 1) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
layerdict.pointerStates[e.pointerId] = {
|
|
distanceTravelled: 0,
|
|
lastX: e.offsetX,
|
|
lastY: e.offsetY,
|
|
downTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
function handleMouseClick(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var x = e.offsetX;
|
|
var y = e.offsetY;
|
|
var t = layerdict.transform;
|
|
if (layerdict.layer == "B") {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
|
|
} else {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
|
|
}
|
|
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
|
|
var v = rotateVector([x, y], -settings.boardRotation);
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var footprints = bboxHitScan(layerdict.layer, ...v);
|
|
if (footprints.length > 0) {
|
|
footprintsClicked(footprints);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handlePointerLeave(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function resetTransform(layerdict) {
|
|
layerdict.transform.panx = 0;
|
|
layerdict.transform.pany = 0;
|
|
layerdict.transform.zoom = 1;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function handlePointerUp(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (e.button == 2) {
|
|
// Reset pan and zoom on right click.
|
|
resetTransform(layerdict);
|
|
layerdict.anotherPointerTapped = false;
|
|
return;
|
|
}
|
|
|
|
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
|
|
var ptr = layerdict.pointerStates[e.pointerId];
|
|
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
|
|
|
|
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
if (layerdict.anotherPointerTapped) {
|
|
// This is the second pointer coming off of a two-finger tap
|
|
resetTransform(layerdict);
|
|
} else {
|
|
// This is just a regular tap
|
|
handleMouseClick(e, layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
} else {
|
|
// This is the first finger coming off of what could become a two-finger tap
|
|
layerdict.anotherPointerTapped = true;
|
|
}
|
|
} else {
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function handlePointerMove(e, layerdict) {
|
|
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var thisPtr = layerdict.pointerStates[e.pointerId];
|
|
|
|
var dx = e.offsetX - thisPtr.lastX;
|
|
var dy = e.offsetY - thisPtr.lastY;
|
|
|
|
// If this number is low on pointer up, we count the action as a click
|
|
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
|
|
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
// This is a simple drag
|
|
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
|
|
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
|
|
} else if (Object.keys(layerdict.pointerStates).length == 2) {
|
|
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
|
|
|
|
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
|
|
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
|
|
|
|
var scaleFactor = newDist / oldDist;
|
|
|
|
if (scaleFactor != NaN) {
|
|
layerdict.transform.zoom *= scaleFactor;
|
|
|
|
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
|
|
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
|
|
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
|
|
}
|
|
}
|
|
|
|
thisPtr.lastX = e.offsetX;
|
|
thisPtr.lastY = e.offsetY;
|
|
|
|
if (settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
}
|
|
|
|
function handleMouseWheel(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var t = layerdict.transform;
|
|
var wheeldelta = e.deltaY;
|
|
if (e.deltaMode == 1) {
|
|
// FF only, scroll by lines
|
|
wheeldelta *= 30;
|
|
} else if (e.deltaMode == 2) {
|
|
wheeldelta *= 300;
|
|
}
|
|
var m = Math.pow(1.1, -wheeldelta / 40);
|
|
// Limit amount of zoom per tick.
|
|
if (m > 2) {
|
|
m = 2;
|
|
} else if (m < 0.5) {
|
|
m = 0.5;
|
|
}
|
|
t.zoom *= m;
|
|
var zoomd = (1 - m) / t.zoom;
|
|
t.panx += devicePixelRatio * e.offsetX * zoomd;
|
|
t.pany += devicePixelRatio * e.offsetY * zoomd;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function addMouseHandlers(div, layerdict) {
|
|
div.addEventListener("pointerdown", function(e) {
|
|
handlePointerDown(e, layerdict);
|
|
});
|
|
div.addEventListener("pointermove", function(e) {
|
|
handlePointerMove(e, layerdict);
|
|
});
|
|
div.addEventListener("pointerup", function(e) {
|
|
handlePointerUp(e, layerdict);
|
|
});
|
|
var pointerleave = function(e) {
|
|
handlePointerLeave(e, layerdict);
|
|
}
|
|
div.addEventListener("pointercancel", pointerleave);
|
|
div.addEventListener("pointerleave", pointerleave);
|
|
div.addEventListener("pointerout", pointerleave);
|
|
|
|
div.onwheel = function(e) {
|
|
handleMouseWheel(e, layerdict);
|
|
}
|
|
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
|
|
element.addEventListener("contextmenu", function(e) {
|
|
e.preventDefault();
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function setRedrawOnDrag(value) {
|
|
settings.redrawOnDrag = value;
|
|
writeStorage("redrawOnDrag", value);
|
|
}
|
|
|
|
function setBoardRotation(value) {
|
|
settings.boardRotation = value * 5;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
resizeAll();
|
|
}
|
|
|
|
function initRender() {
|
|
allcanvas = {
|
|
front: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("F_bg"),
|
|
fab: document.getElementById("F_fab"),
|
|
silk: document.getElementById("F_slk"),
|
|
highlight: document.getElementById("F_hl"),
|
|
layer: "F",
|
|
},
|
|
back: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("B_bg"),
|
|
fab: document.getElementById("B_fab"),
|
|
silk: document.getElementById("B_slk"),
|
|
highlight: document.getElementById("B_hl"),
|
|
layer: "B",
|
|
}
|
|
};
|
|
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
|
|
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*
|
|
* Table reordering via Drag'n'Drop
|
|
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
|
|
*/
|
|
|
|
function setBomHandlers() {
|
|
|
|
const bom = document.getElementById('bomtable');
|
|
|
|
let dragName;
|
|
let placeHolderElements;
|
|
let draggingElement;
|
|
let forcePopulation;
|
|
let xOffset;
|
|
let yOffset;
|
|
let wasDragged;
|
|
|
|
const mouseUpHandler = function(e) {
|
|
// Delete dragging element
|
|
draggingElement.remove();
|
|
|
|
// Make BOM selectable again
|
|
bom.style.removeProperty("userSelect");
|
|
|
|
// Remove listeners
|
|
document.removeEventListener('mousemove', mouseMoveHandler);
|
|
document.removeEventListener('mouseup', mouseUpHandler);
|
|
|
|
if (wasDragged) {
|
|
// Redraw whole BOM
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
const mouseMoveHandler = function(e) {
|
|
// Notice the dragging
|
|
wasDragged = true;
|
|
|
|
// Make the dragged element visible
|
|
draggingElement.style.removeProperty("display");
|
|
|
|
// Set elements position to mouse position
|
|
draggingElement.style.left = `${e.screenX - xOffset}px`;
|
|
draggingElement.style.top = `${e.screenY - yOffset}px`;
|
|
|
|
// Forced redrawing of BOM table
|
|
if (forcePopulation) {
|
|
forcePopulation = false;
|
|
// Copy array
|
|
phe = Array.from(placeHolderElements);
|
|
// populate BOM table again
|
|
populateBomHeader(dragName, phe);
|
|
populateBomBody(dragName, phe);
|
|
}
|
|
|
|
// Set up array of hidden columns
|
|
var hiddenColumns = Array.from(settings.hiddenColumns);
|
|
// In the ungrouped mode, quantity don't exist
|
|
if (settings.bommode === "ungrouped")
|
|
hiddenColumns.push("Quantity");
|
|
// If no checkbox fields can be found, we consider them hidden
|
|
if (settings.checkboxes.length == 0)
|
|
hiddenColumns.push("checkboxes");
|
|
|
|
// Get table headers and group them into checkboxes, extrafields and normal headers
|
|
const bh = document.getElementById("bomhead");
|
|
headers = Array.from(bh.querySelectorAll("th"))
|
|
headers.shift() // numCol is not part of the columnOrder
|
|
headerGroups = []
|
|
lastCompoundClass = null;
|
|
for (i = 0; i < settings.columnOrder.length; i++) {
|
|
cElem = settings.columnOrder[i];
|
|
if (hiddenColumns.includes(cElem)) {
|
|
// Hidden columns appear as a dummy element
|
|
headerGroups.push([]);
|
|
continue;
|
|
}
|
|
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
|
|
if (elem.classList.contains("bom-checkbox")) {
|
|
if (lastCompoundClass === "bom-checkbox") {
|
|
cbGroup = headerGroups.pop();
|
|
cbGroup.push(elem);
|
|
headerGroups.push(cbGroup);
|
|
} else {
|
|
lastCompoundClass = "bom-checkbox";
|
|
headerGroups.push([elem])
|
|
}
|
|
} else {
|
|
headerGroups.push([elem])
|
|
}
|
|
}
|
|
|
|
// Copy settings.columnOrder
|
|
var columns = Array.from(settings.columnOrder)
|
|
|
|
// Set up array with indices of hidden columns
|
|
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
|
|
var dragIndex = columns.indexOf(dragName);
|
|
var swapIndex = dragIndex;
|
|
var swapDone = false;
|
|
|
|
// Check if the current dragged element is swapable with the left or right element
|
|
if (dragIndex > 0) {
|
|
// Get left headers boundingbox
|
|
swapIndex = dragIndex - 1;
|
|
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
|
|
swapIndex--;
|
|
if (!hiddenIndices.includes(swapIndex)) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
|
|
// Get right headers boundingbox
|
|
swapIndex = dragIndex + 1;
|
|
while (hiddenIndices.includes(swapIndex))
|
|
swapIndex++;
|
|
if (swapIndex < headerGroups.length) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Write back change to storage
|
|
if (swapDone) {
|
|
settings.columnOrder = columns
|
|
writeStorage("columnOrder", JSON.stringify(columns));
|
|
}
|
|
|
|
}
|
|
|
|
const mouseDownHandler = function(e) {
|
|
var target = e.target;
|
|
if (target.tagName.toLowerCase() != "td")
|
|
target = target.parentElement;
|
|
|
|
// Used to check if a dragging has ever happened
|
|
wasDragged = false;
|
|
|
|
// Create new element which will be displayed as the dragged column
|
|
draggingElement = document.createElement("div")
|
|
draggingElement.classList.add("dragging");
|
|
draggingElement.style.display = "none";
|
|
draggingElement.style.position = "absolute";
|
|
draggingElement.style.overflow = "hidden";
|
|
|
|
// Get bomhead and bombody elements
|
|
const bh = document.getElementById("bomhead");
|
|
const bb = document.getElementById("bombody");
|
|
|
|
// Get all compound headers for the current column
|
|
var compoundHeaders;
|
|
if (target.classList.contains("bom-checkbox")) {
|
|
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
|
|
} else {
|
|
compoundHeaders = [target];
|
|
}
|
|
|
|
// Create new table which will display the column
|
|
var newTable = document.createElement("table");
|
|
newTable.classList.add("bom");
|
|
newTable.style.background = "white";
|
|
draggingElement.append(newTable);
|
|
|
|
// Create new header element
|
|
var newHeader = document.createElement("thead");
|
|
newTable.append(newHeader);
|
|
|
|
// Set up array for storing all placeholder elements
|
|
placeHolderElements = [];
|
|
|
|
// Add all compound headers to the new thead element and placeholders
|
|
compoundHeaders.forEach(function(h) {
|
|
clone = cloneElementWithDimensions(h);
|
|
newHeader.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
|
|
// Create new body element
|
|
var newBody = document.createElement("tbody");
|
|
newTable.append(newBody);
|
|
|
|
// Get indices for compound headers
|
|
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
|
|
|
|
// For each row in the BOM body...
|
|
var rows = bb.querySelectorAll("tr");
|
|
rows.forEach(function(row) {
|
|
// ..get the cells for the compound column
|
|
const tds = row.querySelectorAll("td");
|
|
var copytds = idxs.map(i => tds[i]);
|
|
// Add them to the new element and the placeholders
|
|
var newRow = document.createElement("tr");
|
|
copytds.forEach(function(td) {
|
|
clone = cloneElementWithDimensions(td);
|
|
newRow.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
newBody.append(newRow);
|
|
});
|
|
|
|
// Compute width for compound header
|
|
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
|
|
draggingElement.style.width = `${width}px`;
|
|
|
|
// Insert the new dragging element and disable selection on BOM
|
|
bom.insertBefore(draggingElement, null);
|
|
bom.style.userSelect = "none";
|
|
|
|
// Determine the mouse position offset
|
|
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
|
|
yOffset = e.screenY - compoundHeaders[0].offsetTop;
|
|
|
|
// Get name for the column in settings.columnOrder
|
|
dragName = getColumnOrderName(target);
|
|
|
|
// Change text and class for placeholder elements
|
|
placeHolderElements = placeHolderElements.map(function(e) {
|
|
newElem = cloneElementWithDimensions(e);
|
|
newElem.textContent = "";
|
|
newElem.classList.add("placeholder");
|
|
return newElem;
|
|
});
|
|
|
|
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
|
|
forcePopulation = true;
|
|
|
|
// Add listeners for move and up on mouse
|
|
document.addEventListener('mousemove', mouseMoveHandler);
|
|
document.addEventListener('mouseup', mouseUpHandler);
|
|
}
|
|
|
|
// In netlist mode, there is nothing to reorder
|
|
if (settings.bommode === "netlist")
|
|
return;
|
|
|
|
// Add mouseDownHandler to every column except the numCol
|
|
bom.querySelectorAll("th")
|
|
.forEach(function(head) {
|
|
if (!head.classList.contains("numCol")) {
|
|
head.onmousedown = mouseDownHandler;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function getBoundingClientRectFromMultiple(elements) {
|
|
var elems = Array.from(elements);
|
|
|
|
if (elems.length == 0)
|
|
return null;
|
|
|
|
var box = elems.shift()
|
|
.getBoundingClientRect();
|
|
|
|
elems.forEach(function(elem) {
|
|
var elembox = elem.getBoundingClientRect();
|
|
box.left = Math.min(elembox.left, box.left);
|
|
box.top = Math.min(elembox.top, box.top);
|
|
box.width += elembox.width;
|
|
box.height = Math.max(elembox.height, box.height);
|
|
});
|
|
|
|
return box;
|
|
}
|
|
|
|
function cloneElementWithDimensions(elem) {
|
|
var newElem = elem.cloneNode(true);
|
|
newElem.style.height = window.getComputedStyle(elem).height;
|
|
newElem.style.width = window.getComputedStyle(elem).width;
|
|
return newElem;
|
|
}
|
|
|
|
function getBomTableHeaderIndex(elem) {
|
|
const bh = document.getElementById('bomhead');
|
|
const ths = Array.from(bh.querySelectorAll("th"));
|
|
return ths.indexOf(elem);
|
|
}
|
|
|
|
function getColumnOrderName(elem) {
|
|
var cname = elem.getAttribute("col_name");
|
|
if (cname === "bom-checkbox")
|
|
return "checkboxes";
|
|
else
|
|
return cname;
|
|
}
|
|
|
|
function resizableGrid(tablehead) {
|
|
var cols = tablehead.firstElementChild.children;
|
|
var rowWidth = tablehead.offsetWidth;
|
|
|
|
for (var i = 1; i < cols.length; i++) {
|
|
if (cols[i].classList.contains("bom-checkbox"))
|
|
continue;
|
|
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
|
|
}
|
|
|
|
for (var i = 1; i < cols.length - 1; i++) {
|
|
var div = document.createElement('div');
|
|
div.className = "column-width-handle";
|
|
cols[i].appendChild(div);
|
|
setListeners(div);
|
|
}
|
|
|
|
function setListeners(div) {
|
|
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
|
|
|
|
div.addEventListener('mousedown', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
curCol = e.target.parentElement;
|
|
nxtCol = curCol.nextElementSibling;
|
|
startX = e.pageX;
|
|
|
|
var padding = paddingDiff(curCol);
|
|
|
|
rowWidth = curCol.parentElement.offsetWidth;
|
|
curColWidth = curCol.clientWidth - padding;
|
|
nxtColWidth = nxtCol.clientWidth - padding;
|
|
});
|
|
|
|
document.addEventListener('mousemove', function(e) {
|
|
if (startX) {
|
|
var diffX = e.pageX - startX;
|
|
diffX = -Math.min(-diffX, curColWidth - 20);
|
|
diffX = Math.min(diffX, nxtColWidth - 20);
|
|
|
|
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
|
|
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
|
|
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
curCol = undefined;
|
|
nxtCol = undefined;
|
|
startX = undefined;
|
|
nxtColWidth = undefined;
|
|
curColWidth = undefined
|
|
});
|
|
}
|
|
|
|
function paddingDiff(col) {
|
|
|
|
if (getStyleVal(col, 'box-sizing') == 'border-box') {
|
|
return 0;
|
|
}
|
|
|
|
var padLeft = getStyleVal(col, 'padding-left');
|
|
var padRight = getStyleVal(col, 'padding-right');
|
|
return (parseInt(padLeft) + parseInt(padRight));
|
|
|
|
}
|
|
|
|
function getStyleVal(elm, css) {
|
|
return (window.getComputedStyle(elm, null).getPropertyValue(css))
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var markedFootprints = new Set();
|
|
var highlightedFootprints = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setShowBOMColumn(field, value) {
|
|
if (field === "references") {
|
|
var rl = document.getElementById("reflookup");
|
|
rl.disabled = !value;
|
|
if (!value) {
|
|
rl.value = "";
|
|
updateRefLookup("");
|
|
}
|
|
}
|
|
|
|
var n = settings.hiddenColumns.indexOf(field);
|
|
if (value) {
|
|
if (n != -1) {
|
|
settings.hiddenColumns.splice(n, 1);
|
|
}
|
|
} else {
|
|
if (n == -1) {
|
|
settings.hiddenColumns.push(field);
|
|
}
|
|
}
|
|
|
|
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
|
|
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
|
|
function setFullscreen(value) {
|
|
if (value) {
|
|
document.documentElement.requestFullscreen();
|
|
} else {
|
|
document.exitFullscreen();
|
|
}
|
|
}
|
|
|
|
function fabricationVisible(value) {
|
|
writeStorage("fabricationVisible", value);
|
|
settings.renderFabrication = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function silkscreenVisible(value) {
|
|
writeStorage("silkscreenVisible", value);
|
|
settings.renderSilkscreen = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightPin1(value) {
|
|
writeStorage("highlightpin1", value);
|
|
settings.highlightpin1 = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function getStoredCheckboxRefs(checkbox) {
|
|
function convert(ref) {
|
|
var intref = parseInt(ref);
|
|
if (isNaN(intref)) {
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.footprints[i].ref == ref) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
} else {
|
|
return intref;
|
|
}
|
|
}
|
|
if (!(checkbox in settings.checkboxStoredRefs)) {
|
|
var val = readStorage("checkbox_" + checkbox);
|
|
settings.checkboxStoredRefs[checkbox] = val ? val : "";
|
|
}
|
|
if (!settings.checkboxStoredRefs[checkbox]) {
|
|
return new Set();
|
|
} else {
|
|
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
|
|
}
|
|
}
|
|
|
|
function getCheckboxState(checkbox, references) {
|
|
var storedRefsSet = getStoredCheckboxRefs(checkbox);
|
|
var currentRefsSet = new Set(references.map(r => r[1]));
|
|
// Get difference of current - stored
|
|
var difference = new Set(currentRefsSet);
|
|
for (ref of storedRefsSet) {
|
|
difference.delete(ref);
|
|
}
|
|
if (difference.size == 0) {
|
|
// All the current refs are stored
|
|
return "checked";
|
|
} else if (difference.size == currentRefsSet.size) {
|
|
// None of the current refs are stored
|
|
return "unchecked";
|
|
} else {
|
|
// Some of the refs are stored
|
|
return "indeterminate";
|
|
}
|
|
}
|
|
|
|
function setBomCheckboxState(checkbox, element, references) {
|
|
var state = getCheckboxState(checkbox, references);
|
|
element.checked = (state == "checked");
|
|
element.indeterminate = (state == "indeterminate");
|
|
}
|
|
|
|
function createCheckboxChangeHandler(checkbox, references, row) {
|
|
return function () {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (this.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.add("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.add(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'checked';
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.remove("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.delete(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'unchecked';
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
|
|
}
|
|
}
|
|
|
|
function clearHighlightedFootprints() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedFootprints = [];
|
|
highlightedNet = null;
|
|
}
|
|
}
|
|
|
|
function createRowHighlightHandler(rowid, refs, net) {
|
|
return function () {
|
|
if (currentHighlightedRowId) {
|
|
if (currentHighlightedRowId == rowid) {
|
|
return;
|
|
}
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
}
|
|
document.getElementById(rowid).classList.add("highlighted");
|
|
currentHighlightedRowId = rowid;
|
|
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
if (!settings.hiddenColumns.includes("references")) {
|
|
for (var ref of entry) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// check fields
|
|
for (var i in config.fields) {
|
|
var f = config.fields[i];
|
|
if (!settings.hiddenColumns.includes(f)) {
|
|
for (var ref of entry) {
|
|
if (pcbdata.bom.fields[ref[1]][i].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry.filter(r => r[0].toLowerCase() == reflookup);
|
|
}
|
|
|
|
function highlightFilter(s) {
|
|
if (!filter) {
|
|
return s;
|
|
}
|
|
var parts = s.toLowerCase().split(filter);
|
|
if (parts.length == 1) {
|
|
return s;
|
|
}
|
|
var r = "";
|
|
var pos = 0;
|
|
for (var i in parts) {
|
|
if (i > 0) {
|
|
r += '<mark class="highlight">' +
|
|
s.substring(pos, pos + filter.length) +
|
|
'</mark>';
|
|
pos += filter.length;
|
|
}
|
|
r += s.substring(pos, pos + parts[i].length);
|
|
pos += parts[i].length;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function checkboxSetUnsetAllHandler(checkboxname) {
|
|
return function () {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var allset = true;
|
|
var checkbox;
|
|
var row;
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
if (!checkbox.checked || checkbox.indeterminate) {
|
|
allset = false;
|
|
break;
|
|
}
|
|
}
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = !allset;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
}
|
|
}
|
|
|
|
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
if (is_checkbox)
|
|
th.setAttribute("col_name", "bom-checkbox");
|
|
else
|
|
th.setAttribute("col_name", name);
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
var spacer = document.createElement("div");
|
|
spacer.className = "column-spacer";
|
|
th.appendChild(spacer);
|
|
spacer.onclick = function () {
|
|
if (currentSortColumn && th !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && th === currentSortColumn) {
|
|
// Already sorted by this column
|
|
if (currentSortOrder == "asc") {
|
|
// Sort by this column, descending order
|
|
bomSortFunction = function (a, b) {
|
|
return -comparator(a, b);
|
|
}
|
|
currentSortColumn.childNodes[1].classList.remove("asc");
|
|
currentSortColumn.childNodes[1].classList.add("desc");
|
|
currentSortOrder = "desc";
|
|
} else {
|
|
// Unsort
|
|
bomSortFunction = null;
|
|
currentSortColumn.childNodes[1].classList.remove("desc");
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
} else {
|
|
// Sort by this column, ascending order
|
|
bomSortFunction = comparator;
|
|
currentSortColumn = th;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
if (is_checkbox) {
|
|
spacer.onclick = fancyDblClickHandler(
|
|
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
|
|
var vismenu = document.createElement("div");
|
|
vismenu.id = "vismenu";
|
|
vismenu.classList.add("menu");
|
|
|
|
var visbutton = document.createElement("div");
|
|
visbutton.classList.add("visbtn");
|
|
visbutton.classList.add("hideonprint");
|
|
|
|
var viscontent = document.createElement("div");
|
|
viscontent.classList.add("menu-content");
|
|
viscontent.id = "vismenu-content";
|
|
|
|
settings.columnOrder.forEach(column => {
|
|
if (typeof column !== "string")
|
|
return;
|
|
|
|
// Skip empty columns
|
|
if (column === "checkboxes" && settings.checkboxes.length == 0)
|
|
return;
|
|
else if (column === "Quantity" && settings.bommode == "ungrouped")
|
|
return;
|
|
|
|
var label = document.createElement("label");
|
|
label.classList.add("menu-label");
|
|
|
|
var input = document.createElement("input");
|
|
input.classList.add("visibility_checkbox");
|
|
input.type = "checkbox";
|
|
input.onchange = function (e) {
|
|
setShowBOMColumn(column, e.target.checked)
|
|
};
|
|
input.checked = !(settings.hiddenColumns.includes(column));
|
|
|
|
label.appendChild(input);
|
|
if (column.length > 0)
|
|
label.append(column[0].toUpperCase() + column.slice(1));
|
|
|
|
viscontent.appendChild(label);
|
|
});
|
|
|
|
viscontent.childNodes[0].classList.add("menu-label-top");
|
|
|
|
vismenu.appendChild(visbutton);
|
|
if (settings.bommode != "netlist") {
|
|
vismenu.appendChild(viscontent);
|
|
th.appendChild(vismenu);
|
|
}
|
|
tr.appendChild(th);
|
|
|
|
var checkboxCompareClosure = function (checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a);
|
|
var stateB = getCheckboxState(checkbox, b);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
var stringFieldCompareClosure = function (fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
|
|
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
|
|
var compareRefs = (a, b) => {
|
|
var ra = referenceRegex.exec(a);
|
|
var rb = referenceRegex.exec(b);
|
|
if (ra === null || rb === null) {
|
|
if (a != b) return a > b ? 1 : -1;
|
|
return 0;
|
|
} else {
|
|
if (ra.groups.prefix != rb.groups.prefix) {
|
|
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
|
|
}
|
|
if (ra.groups.number != rb.groups.number) {
|
|
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
if (settings.bommode == "netlist") {
|
|
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
});
|
|
tr.appendChild(th);
|
|
} else {
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
var valueIndex = config.fields.indexOf("Value");
|
|
var footprintIndex = config.fields.indexOf("Footprint");
|
|
columns.forEach((column) => {
|
|
if (column === placeHolderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
|
|
tr.appendChild(th);
|
|
}
|
|
} else if (column === "References") {
|
|
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
|
|
var i = 0;
|
|
while (i < a.length && i < b.length) {
|
|
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
|
|
i++;
|
|
}
|
|
return a.length - b.length;
|
|
}));
|
|
} else if (column === "Value") {
|
|
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
|
|
var ra = a[0][1], rb = b[0][1];
|
|
return valueCompare(
|
|
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
|
|
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
|
|
}));
|
|
return;
|
|
} else if (column === "Footprint") {
|
|
tr.appendChild(createColumnHeader(
|
|
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
|
|
return a.length - b.length;
|
|
}));
|
|
} else {
|
|
// Other fields
|
|
var i = config.fields.indexOf(column);
|
|
if (i < 0)
|
|
return;
|
|
tr.appendChild(createColumnHeader(
|
|
column, `field${i + 1}`, stringFieldCompareClosure(i)));
|
|
}
|
|
});
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
if (settings.bommode == "netlist") {
|
|
bomtable = pcbdata.nets.slice();
|
|
} else {
|
|
switch (settings.canvaslayout) {
|
|
case 'F':
|
|
bomtable = pcbdata.bom.F.slice();
|
|
break;
|
|
case 'FB':
|
|
bomtable = pcbdata.bom.both.slice();
|
|
break;
|
|
case 'B':
|
|
bomtable = pcbdata.bom.B.slice();
|
|
break;
|
|
}
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
expandedTable = []
|
|
for (var bomentry of bomtable) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
bomtable = expandedTable;
|
|
}
|
|
}
|
|
if (bomSortFunction) {
|
|
bomtable = bomtable.sort(bomSortFunction);
|
|
}
|
|
for (var i in bomtable) {
|
|
var bomentry = bomtable[i];
|
|
if (filter && !entryMatches(bomentry)) {
|
|
continue;
|
|
}
|
|
var references = null;
|
|
var netname = null;
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
var rownum = +i + 1;
|
|
tr.id = "bomrow" + rownum;
|
|
td.textContent = rownum;
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "netlist") {
|
|
netname = bomentry;
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(netname ? netname : "<no net>");
|
|
tr.appendChild(td);
|
|
} else {
|
|
if (reflookup) {
|
|
references = findRefInEntry(bomentry);
|
|
if (references.length == 0) {
|
|
continue;
|
|
}
|
|
} else {
|
|
references = bomentry;
|
|
}
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
columns.forEach((column) => {
|
|
if (column === placeholderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
if (checkbox) {
|
|
td = document.createElement("TD");
|
|
var input = document.createElement("input");
|
|
input.type = "checkbox";
|
|
input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
if (input.checked && settings.markWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
} else if (column === "References") {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = references.length;
|
|
tr.appendChild(td);
|
|
} else {
|
|
// All the other fields
|
|
var field_index = config.fields.indexOf(column)
|
|
if (field_index < 0)
|
|
return;
|
|
var valueSet = new Set();
|
|
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(Array.from(valueSet).join(", "));
|
|
tr.appendChild(td);
|
|
}
|
|
});
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
tr.onmousemove = handler;
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
setBomHandlers();
|
|
resizableGrid(bomhead);
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0,
|
|
fp_b = 0,
|
|
pads_f = 0,
|
|
pads_b = 0,
|
|
pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("bot").style.height = "";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
var chkbxs = document.getElementsByClassName("visibility_checkbox");
|
|
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = true;
|
|
}
|
|
}
|
|
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
|
|
checkbox.checked = !checkbox.checked;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function checkBomCheckbox(bomrowid, checkboxname) {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
|
|
prepCheckboxes();
|
|
populateMarkWhenCheckedOptions();
|
|
setMarkWhenChecked(settings.markWhenChecked);
|
|
}
|
|
|
|
function setMarkWhenChecked(value) {
|
|
writeStorage("markWhenChecked", value);
|
|
settings.markWhenChecked = value;
|
|
markedFootprints.clear();
|
|
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
|
|
markedFootprints.add(ref);
|
|
}
|
|
populateBomTable();
|
|
drawHighlights();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateMarkWhenCheckedOptions() {
|
|
var container = document.getElementById("markWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "markWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "markWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setMarkWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.markWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initUtils();
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div style="float: right; height: 100%;">
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="menubtn"></button>
|
|
<div class="menu-content">
|
|
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
|
|
Full Screen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
|
|
Fab layer
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
|
|
Silkscreen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
|
|
References
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
|
|
Values
|
|
</label>
|
|
<div id="tracksAndZonesCheckboxes">
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
|
|
Tracks
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
|
|
Zones
|
|
</label>
|
|
</div>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Pads
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
|
|
Highlight first pin
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</span>
|
|
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Bom checkboxes</div>
|
|
<input id="bomCheckboxes" class="menu-textbox" type=text
|
|
oninput="setBomCheckboxes(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Mark when checked</div>
|
|
<div id="markWhenCheckedContainer"></div>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span class="shameless-plug">
|
|
<span>Created using</span>
|
|
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
|
|
title="Front only">F
|
|
</button>
|
|
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
|
|
title="Front and Back">FB
|
|
</button>
|
|
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
|
|
title="Back only">B
|
|
</button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
|
|
title="BOM only"></button>
|
|
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
|
|
title="BOM left, drawings right"></button>
|
|
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
|
|
title="BOM top, drawings bot"></button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
|
|
title="Grouped BOM"></button>
|
|
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
|
|
title="Ungrouped BOM"></button>
|
|
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
|
|
title="Netlist"></button>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="statsbtn"></button>
|
|
<div class="menu-content">
|
|
<table class="stats">
|
|
<tbody>
|
|
<tr>
|
|
<td width="40%">Board stats</td>
|
|
<td>Front</td>
|
|
<td>Back</td>
|
|
<td>Total</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Components</td>
|
|
<td id="stats-components-front">~</td>
|
|
<td id="stats-components-back">~</td>
|
|
<td id="stats-components-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Groups</td>
|
|
<td id="stats-groups-front">~</td>
|
|
<td id="stats-groups-back">~</td>
|
|
<td id="stats-groups-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>SMD pads</td>
|
|
<td id="stats-smd-pads-front">~</td>
|
|
<td id="stats-smd-pads-back">~</td>
|
|
<td id="stats-smd-pads-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>TH pads</td>
|
|
<td colspan=3 id="stats-th-pads">~</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="stats">
|
|
<col width="40%"/><col />
|
|
<tbody id="checkbox-stats">
|
|
<tr>
|
|
<td colspan=2 style="border-top: 0">Checkboxes</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="iobtn"></button>
|
|
<div class="menu-content">
|
|
<div class="menu-label menu-label-top">
|
|
<div style="margin-left: 5px;">Save board image</div>
|
|
<div class="flexbox">
|
|
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
<span>X</span>
|
|
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
</div>
|
|
<label>
|
|
<input id="render-save-transparent" type="checkbox">
|
|
Transparent background
|
|
</label>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveImage('F')">Front</button>
|
|
<button class="savebtn" onclick="saveImage('B')">Back</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Config and checkbox state</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveSettings()">Export</button>
|
|
<button class="savebtn" onclick="loadSettings()">Import</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="fileinfodiv" style="overflow: auto;">
|
|
<table class="fileinfo">
|
|
<tbody>
|
|
<tr>
|
|
<td id="title" class="title" style="width: 70%">
|
|
Title
|
|
</td>
|
|
<td id="revision" class="title" style="width: 30%">
|
|
Revision
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="company">
|
|
Company
|
|
</td>
|
|
<td id="filedate">
|
|
Date
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<div id="bomdiv" class="split split-horizontal">
|
|
<div style="width: 100%">
|
|
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
|
|
oninput="updateRefLookup(this.value)">
|
|
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
|
|
oninput="updateFilter(this.value)">
|
|
<div class="button-container hideonprint" style="float: left; margin: 0;">
|
|
<button id="copy" title="Copy bom table to clipboard"
|
|
onclick="copyToClipboard()"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom" id="bomtable">
|
|
<thead id="bomhead">
|
|
</thead>
|
|
<tbody id="bombody">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="canvasdiv" class="split split-horizontal">
|
|
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|