4443 lines
308 KiB
HTML
4443 lines
308 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;
|
|
}
|
|
|
|
.help-link {
|
|
border: 1px solid #0278a4;
|
|
padding-inline: 0.3rem;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.dark .help-link {
|
|
border: 1px solid #00b9fd;
|
|
}
|
|
|
|
|
|
</style>
|
|
<script type="text/javascript" >
|
|
///////////////////////////////////////////////
|
|
/*
|
|
Split.js - v1.3.5
|
|
MIT License
|
|
https://github.com/nathancahill/Split.js
|
|
*/
|
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
|
|
// This work is free. You can redistribute it and/or modify it
|
|
// under the terms of the WTFPL, Version 2
|
|
// For more information see LICENSE.txt or http://www.wtfpl.net/
|
|
//
|
|
// For more information, the home page:
|
|
// http://pieroxy.net/blog/pages/lz-string/testing.html
|
|
//
|
|
// LZ-based compression algorithm, version 1.4.4
|
|
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*!
|
|
* PEP v0.4.3 | https://github.com/jquery/PEP
|
|
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
|
|
*/
|
|
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
|
|
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
|
|
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
|
|
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
|
|
for(var b=a;b.parentNode;)b=b.parentNode;
|
|
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
|
|
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
|
|
//
|
|
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
|
|
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
|
|
var b=x(a,this.findElements,this);
|
|
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
|
|
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
|
|
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
|
|
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
|
|
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
|
|
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
|
|
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
|
|
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
|
|
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
|
|
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
|
|
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
|
|
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
|
|
b=!1;else if("XY"===c)
|
|
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
|
|
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
|
|
vacuumTouches:function(a){var b=a.touches;
|
|
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
|
|
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
|
|
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
|
|
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
|
|
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
|
|
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
|
|
if(this.isPrimaryTouch(c)){
|
|
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": true, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint", "Manufacturer_Name", "Manufacturer_Part_Number", "Mouser Part Number"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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UB7V7xvs0BwcHHAAj+wkHDAenByAAAACSzAesB5kHPEQHsJcRSoNu+2N7D7lFjkUHMfv8iNXK2/sG+78HIfu2BzUH0Xsn0GCE/cRvB6p7qwSPJKgHPgDQh7CHiIcDB7379Ifzu/n7aIdgBxiHWIfrrAFBc9BRsZh7MfsmgFUQmocw49qHSwe6h137+ocUBx+7LIBmhxMH1ZxUvVYenlAlwGqHffsahzf7jodse86HFIeuh9n75gcohwyHnof/B+MHgIe6IrO4T/AtUAGHa/tBh/aHIYdQh+GHQkCRh1sHgwddiGK0YXvxh5iH3oemordFfofWh4GHOFCZh2ZKWodhh127Loc0h0iHBYffezV7cYcKhwCH2IfJh5cRjaU2h0oHdoclEA6H2YeNhxGHzYduhzsHoXsdh8X7XYeGezrgHjqqh+mHNYdDh1mHiwejh7mH44dRh8iHhodThw0AXoeJhwKHwAUqh4aEPnuDh+2gw4drhxx7TYdhQP0HW4eth/37+9z7h92HlofHh/2HTbtarOeHq4dtB1eHY4c3h7SH0Yc7h+2He4clh+aHPod1ya+H1YelkLWHPFr1hyd764dP+5uH+YcGh4WHsYfAR52HCYfdhzoJC4cnh7aHH4c0cF+HTofwR1oH+wC3h0hH7oe7h1UH6EelhweHrZWHeAdUaYf4h++HwYd1h6GHcEc/hxuHf4cth8hHbYePhyBHZYdwe+BH9EfVhKeHeEc7wQvAsEdkh9eHy4CkR3SHKEe7B9EHzIfHAHEHRwfshycHTgD8+wj7SPv+ACj76iDo+wUgc4Di+3yH1we6Ikvrr9BiICKHS/v1sC6oFbAa+wSHpmE4tJwT/ns5WBUHFgB7B417LIfgBxb7gbvJBzb77tUgABkHxkdP0Hqdk7BL8Wn7eQePBwUH7wgSh3ZHUUKUeIz70iDM+5IHT4fReygpA9CuURf7swctu0IWZIcXuy37XQft+wiHeYeyRzxHVgf/e6aHfEc0R4ZjienpR5BHc4W1+9lH0Ie5RysHaftrB4VHiEfFRw+HjIeEB2z77kdKR4cHgHvHB+P7nIe8h9P7/IfkNZcx7doWR/kH5ebZrrGExQc5u9O5C3tyh0lHFUfdh57+kxGgh6MAJAeGhDVmhEcce01Huofp+/e77UcAR3JHpAcgByaHowerR+us5ewbR7VH20dlB87Ul4dJ+wdHFIdHR8RHzgAyR6dHPEddR72APUem+2yHG7tqR0wHzq2jR4FHZ9wUNQUCQGvhR8EAeMpcyI21kEeBoshABIrxR3VwiUeVB1IHiofVnI9r5KB7TfdHY0L0AA1HSwevR/lH8IfUh5xHE4cxh0aHF0dlR1dHVEegR+WHYOBQxxlHxgcl6U8ARMftByn7pMclYcdHFMd3h9xHnUduRwDH8QdAx0NHTgAAACoAAApS+5cHDvuweyZHbkmsZtDH7vsRR9phwy6VyEuHFPbIQA2S+HvLRxjH+4cyBylHSMK+A5rHpsCWe//7Cwffh2d7yBsfRzoHJXuBBwQHwQesx6EHFsdkR5OHrsc0xwteQse0BypHosdJB5yHGkeC+9pHwvsUAKL7VAAX5hQARkeO+7oijXAatK7CDwewx3AksoyMR5YAeKXTrEe7GBiDjNq0YgcJRxIHfUdMh/sH+ceeR4NH/sfge6DHssdsB+9m+CEsWVwHMMeI8BKYXQMYwD57cpHnUL+kuse5x38H9MdH+yf7pjyw1X8IXKwpx1tHUwC1+3oCt4QjhxJ7vgdOey/7X/v2x94HQQdEBwOHfSBWOBdAHUeRB6VHNgczhwmHhsebe9XHBFm56dX7w8cnTsuWPFqkhw7Hk8fZe9PHhgezxxe5jscLx0xHQ2DKeKvHRYfThxAH1Efbx/17u8cP3HNHxAeHx10kxIeO9OPH1sc4eH4Hr/vXxxPHNsczx497i8dn6I/H30edRy/HdgfH+5VHmNTN0JOwWWYHxyPwf8eiB1bHt3sQJ9zQdsdue3PHt8dGB/fHy8dmB9uHZ0dAR5RHm8dvx/YHqrRPOdfAW7ibR5WwmCc4Wdgne0dAJy5JICeQJ+oH88ckJ+qHD8crx3AnkQe/R9+7hceuR/1H4Pslx95HnIdzgBfmaQf+R1cH0cetTDTLtcJTR6rH1sgSRNFHvvslBydOAfveJJAWesdWAJjHs4f8TmBwKWFqJ5rHdUdHxwn7jUcdB4dHrUfkx9JH/4cUJyVHv3u0x8WHXcfIJ2nJmYhz0JYng8eLoHMHdfsGJxwnTfskx6sH3QfrB0VHwidFh97HHkeAx4kHMidOALb73XsVx2NHimlachy+uQcqx7DHkUdaJ2+HYIexR/on4nC7rDnHaMd5x8YnyUc+h8cFHKne+wEnsftZRwRHDYf7R/Ynb0eOJ7zHzidcR+RHHscjB54nNCcMx3B7NSc8qSQQhNBNB0EnF4c4J2tQ4SctR5EnbUd8x27HVMehe3EnRccJJxyHySdLu2DHyicCqQmMfv7qJ7kn1ViFBwUnz3u6J3S8ModlJwW7ncf9J/xHSYfAwAuVdSe2R64HzQfzBzBHrEc5R60n3MdUhx0nLQBfR64nD4frx+iH10fVJ/xdJblHJ4EnjScsR4AnYSfvJxEnBUdOJ98nLif3hyInyycSJ6yHIseJJxoHnIcAAOIAAFS4p1HH8sd6GLFGrLoJx2QYuYbiyM7wTccx+9V1DNBIB6+NY6Lf0C5HyKfKRwNHqkdix5sA1vupJ4oncsflhz5oJni1xzkniPBe+9onhScjjHFHHwKlJ4YnHcfyh1cn3ieuPlYe3ePCp1tHTyfBJ+JwEkd2J1zHMKdkx18nz4A/J4inqIceJwgnWMc8p/OHzZV2+FYnwIctBxCnz0dQpxqnMyewp9qnJEcIpwLHSKcKR+InzKdSJ6ynpcdMB35HAUdbJ1TAlQkwiI5dD/sCp1JEXnYIx5rHSMeWe2JHLSouR9Qnr8cDJzHHFhCTsEGnDyeMewTHAIhtu+qneUeapzzHH0ewALqnzqf6pxvH8afXJy8CQiMqgE5C1fvppxzHLSe2p3CHuae9B/MnT8cMh0ynkideRxinobsXB1ynlccQwu0+qtkyVCSnT8BrhobokEdhVebHKqeOxpKn5SeXJyWnsqf8fmp44qiQR4e7Nicnu28ndaeUh0yAUugOp59HTqfdJzW7vSeGp6YnDZYp4g0HzCc0UP89zyeZp8TH0Kd2p2THk4J5pwWne6eiJ/9HPscsp37HSSebAFLHpCWbJwSntoAuLje5mKx1x0ow4y4hrKOn5LCHe/hHlsexpyYnW8d0J5t7/6c1TAgHVKdSIKbAtidEJ+fHl3uXx9d7N8cGB07HjydHu67HzafUx70nraeop77H6KdW+7b7kcc/pzG7j5RI+Yr7Iaee+4cnYGdFJ49HLUpTpxcn0qezp9iH/asKYYIp90fKpzWnL0c3p/WnnycPp7un7sf7p5dHfSfcZ7AGjHP0Z2en1ieWp/tOkydwgNMnomebp9un+acSZ4snA/uup71HKKfFx56nH6ccAAAAihsnaSfgx1TAPp0ocOtYeye81mVgJQuQR7PJKHA+kNgn0GcYh9iHxwGfIOThyYjV+9OMl6djx9anD/u/h50nlMeAR7xHVEdeZ+fxtmd8kPdHAWcTpzW0wWcaB6Fn8KddJ5JnMmem+077NpaxZz3wqadbRwln7CfNJ0n7UkdpZ+FnlCeRZzQnXmeowLlnfmfEB4Vn3weQpyFnHEdhZ/zHT6eHp0XHTvsj5uDgfVHxZ/VHjWfJZ81HjaetZwsnEWeZZxz7TvsxZwh4vWfmpw1nZkqnxzmHCEdNpzEnqEdxp1lnJkc5Z9NnFHB9Zyun82dNZylnLWdlZ21nGWcdZ4ZnTvs1Z1tntiX+Z/1ne2eDZ6VnOqc6Z2Nnp2cJp0/QBkXkrNFF5qcux0VnbEclZ6lnD2fpZ7pnUmcGp2hHMqfRZz5F1kUXQE0HBGffZ5JHf2eOpwDnT2cg57JnZfvGPaZFAmfQ5wNnqmdDZ3qHx2eA5+NnR6dO+5VZaOefZxjnt2dY5/dn8OflZz9Hz2elpz3mUUXKeFDnf/sw5zqHcOc7pwjnFWf45xhH0Xuo500dDOchB6TnJ8f7Z9jn0Se/JyInNOeyp20j18D2RejnTOeY56EnzWdLZyNnRGcURzBn1EdeZ29n0uck57LnZOfy5wdniudHZ6NnHOfi515nNmdbZ+nKxQeQcF68zOeLZ+Jn7Oc/R6RnRmfvpx2n7KcKJ76nv6chwCanA7j8p8r7BydRR6Cn2buip8UnEayyh1KnK0deJ15nkAUx6fcnYyfgpy8nQufqZxunPQc454bnbifGh8Dna2dGp077kecLlWan9SdKZ4Fn09hqp9en66fvR8NnBufK53pnBccGZ+6n7adW+4HHWkc6RyL7YvsX5ru9lmd+p71A6bFKx9knPufheKEIrFD5Z1VaAJg72Lr7h+ZLR6HnRcd/RzEHKydop2snmwBge63n3afpJ8OiAuL5ERzQg6fbwEvLwy6r+/UnG/sfgGcnHGfox5UnFUfvx7P7K+f+JwPn4kJIBxMnuufC51PH/ge6BzhneCd4Z4x7X2dU538n7ifFp4gnPce6IqB5rfPn54gHJ07IB/lhryfoBw57ZefaB1hnAQfoZ0/nd8cv5wLnFedRB1XnwsfkZ7PnKQcyx4vnVme9QGEeltne50v7mietIIqniB6B52xndYA/B+PnR+fh59F72BdR54QXDSc3Z3Hng2cJ56XnyecIF/8n5UeUF2X71Bc556MnmUf0F+JHIBfF59mnt6cNpywXK2fyR0gXr6cep07nVvvMB9+nbefu5w3AE2W+QmFHjGek+eOu38cxR8jHi0cxp0YnGecE5yZHzHJw+VX7/OdHxyQXvFo/ZzanQhcaZ0nnIud6p5YHH+cApxwX5YfEk0YXimcPR0JnlhfY58wXtheFpy2n+mfIF2+nFGc+R3InFmcYF+3nLoRFpM46a+dAZ0xnfucsZ8QX7cfTp1xnYfvQFvrpGfNmVDHnfBf1+zfnTBftJ7bnb+drxw4X7Beg59AWbI1+J/aMF+f554lnzFE5FyJniedRJydHouexJ/4Xkhe158EXF+ZyF2EXChcRFzMVhHjr53knBBf+5377eidmFyHnSRdh5yUX2MdpF+f7AmfjJ60HtRcl53kX4BeU57jnEWdsF3THkxcNlmUX8Acsx48ncxeWxwsXVhf1F3MnSudiF0snLRfxJzPnwMcpB50XbuemonIxqYy7JyoXPuf4F8278RelB/vnHmeAp/cXCiMIwdHnvBe7ZwwXWOe5F7MncKf/ZwUXRaeOF5sXcHu/FyCnsxex5/wX8ed1F94XjRd2F+IX3UdT54ZnqyfXFzb7UQD4pw2WqcD9p93neBdCp0MXJydip0lO5yeH53oXXOfYx26pp6fwl1kXngeHF14XSxeiF00X9hdp55/nmecxx5GEUmYzB87H+xcqZyyXDiegl1pnj6cZZw7n2Jdsp3z7cPuaR0L7+iBhxxfm5cddF/cXl4Rxx8SXHvtJx1qMEacvljCaEVDJWJjnjKcXF9PnKBc4l8wHnKd3FzCXkMdXXpqXGifwx9woLGdaFypJY+fjF/rH3xfWl9s4tpcy578aaGecx0cXKJfLZxyXxGfSZ8bn66yMYoKpyhd55+4X8xfFZ54Xopf2p/kXqxcc51KXVxcylyAA9ecKl2j7GPuY+5Jg+JdaAnckDJl2l4nHY5RoJGU0F+cSgcJw5zIyuK0HxpcSF5cXZpfpl5mXwcfqIAAAoiG7Ibui+7cXSifdF5nNXJDsvcWXy3jA5PqYH57Rl6xWABC/GhUQiRecZx5Hk+eKR1iXaZdepxwAYHvdl9ynBZcYDTSI9mfnwEC9K/s8F8YH4NSuZ0AXTyBfF14nJ+c/52/1ftH3R1f7R5dC5xTn5qH352AnnCcPl1An+Gfa5ynn7+dcl1CXs6dnl0IgbXWPYPXRV5dX57GXFhfZ+2AX+CeQFw/n4Cc4eM/nSqfwF2cXVCeq51AHSCfYhzgNPGGAV4AXfpfpe2BX3CdXx4Qnj+fQV7AXsFdvlwgXnOe0J8hXsAbt7gdUFKSVFyIAQFcHF3GXoFeZe8sX95egJ3hXUFdSe4RXi6BwV8GXKucGx3BncvvUDXiHNFfXl5hXTgAYB/rnEBfPl7wnxCcleyYXpgcQl6tniFfdx7Knf5fGiDqR6FfFYKJXmwDiV7bHEFePl7gnBFf8J0RX8lfJl/bnJpcLl42XS5cgAGB76BdWlzHHU1Qq0KNUW5cb5w6X2+cX57vnW/vip2QXbpcUFzKnP5cQwg5XMxfmpyJXTScgV3rnuldSV2fHMBdGV1xXxFfwV0Dn3JcAh/5XZbT3aEFX0ZchV1anqmc6V8xXBCfSV7hnnFfkqNxXaJfnF/WXppeBF6gXIACS+/mXJkcEO0rHgGeqFzNH6hdklwtHLpc6F+QXNJdq59F7Glp1Vz6X+dgeF1MnyJdslz4Xe6frF6RXL2cyfZWIJsfRl6EHO0dqB1mnrJdil0mX75cup6VXFlflVziXzZeN56HHg0Ci+9VX72aP/P2MP6bOVyK0Ueyb3GenZUDg6Ee7ckg1l1BnRiepl5ZXJmcZl3KXQcc6R6oArZetlxVIe1eO2f0I3fRXUP0XzbTWgrQI7lf+OIXUBpdZx0FnB+cVJ/dX61dNl89XDeeo++9Xn1c0Z077snB29D30/1dKjOP0lKd2R4rwFbQL2IaXZOd1lxiX85c159InzucpByqXdlfliD9xRoz1V0m77SoTexhmVieMSrh7sYQLwBKnJ5fQl7vqNNfvZ//cPnvjAJ8Hs1eF5wIXREfMV9pnducfl57HX5cpF/xOPNdhI2enAtfhgH1XoVew54dn4JemV4LH5lek18Zn5NcgAB17q5c9pzyAopDpANfAi4RM8ufQMRfjewfAk3uax7N7m/tB5zGAnNffl/xXWgLG13bwQ3vm12Bn18Bve/RXYVcZYThX2GfsV1JXMfsvez7Xy1eQl8jB0NdSF0EXnIemZ67nPZdql40dXozOV5PeG5BOZ5rHLmcXuG5nRpe6F6rn3YejQrlnbhdzZ4Lnd2es5+LXClceh0jn62c8RJR+hdc7Z8pn2cfk52XXEpd456dnz4ct4HXXs2dMlySHt5fN149nRudV1xNnJkeCDJ3X0ZfF143XN+d3l+XXGtdi54PXHkfWl5+AmuH1PtdngJcT1wxX4Vdi1y3XiOcdV5hHOz2XZ0XX3dcAJ6XXatcrF+HXileeZxaHHdf71/XXBec918fXElen1yRXbddKh32M19dd16vXENeT133XEtez1x1X41fGQwAQ1kW7F3AXb5dr12FXt+dBl8VXPSehl3PXtJf3F/6MmR3TVwLnYDeq1w/XbOcV17xXHpc3J0nXZR1a5yZXJddN1yfX6Dcz18/HsDedV2X7tPSINzRXr+c65+vXEDenFzxXCFdVJ8anrR17Tozn+DcoNyznRDfT12fXldd/17TnimmsN8A3xlekB5w3Nueb1/3X1OdkN//XFkNCN71XrsdiN6LX7JdQN5VnyOf3FwkdvOfCN7FXHDef13Q3U9db1wPX/Deyp8BppCBw7Vo3I7KW53hUijfsR2g3PDckV1HXbRechyG78ddrl0mHFKyaXYOXSjCMzP8XdkdzBw7Xy4pO1zLXPxfGxymnIkewuGYXRiKoN0tXrBdFFxsXajcE+5NXoTe4R+E3/Vcb18o3vhfol3OXbqdtp2TXMhcG10vnrDU93WVUTkL/V/B4DrTNV86X9KdLwIE3PJdUe56hztCVp3JXyteUl8CXg1eLVxI3P9cR13E3QTfWl2aQDTduFzNXETeqyGunAZdDV6iXGTclV8TX2TdkZzDXVldge5aXCdco1wxMpLWDjOvn574bkP7V/udtdW/wEXWoxzOX7penly7XJkcmBys35jd9kjMAtQCpN+SHHyeaZxFXrFd5V9FXslesxxlXvDfnRwen0jfKV92HC5Yxk36TwNck4BiIqTfZV+BXkVfQF4ZXTzeuBy83T9cfN5F7xjfeTKc3YGf/N5c3q6egF0xXwLf3N1FXYLcvl4l7dFevN5XnUzfV5zk3Otd153DXWZftl2G74vtdp1TXyd6STR1Mx1ePLK8sZ1eQR1nuLGDZQtWXLDQ8WmMX+zeGZ1k3BLczN9HXFVe2+/k3mBdHQBDG+kAgU3S3rxe7hO8XIxefF7nXzDdO+6K3tSe0F1UX1+d0NyCXiZcdNxg30Dfp50pXEueKt8Mn9maMlx/XwtdIl4sX7TfpN0+nDje5Nz5HUscuN4bXq8Go4FNXGgcNV1pyYXi0Fw2SEGfRpwYnNTdJV0c3KieOt1ojpscoZ6I32Rfr1/7Xd+fot6C3HFcxV4VXcVeMNwlXAPta14S30hc+R2B7LAfI1z/nuYCEzcrHLxcNx0fJkEctx6zXe06ul1y3RjfJV3qs6KW819jXrge/x2wncudhtwQHAddQF/hX0bfgtwInZCdatwm3xRfO1+RXxTpZt2Rt90e1t8fH1jdPl3c3PCcYt623WLdBh4In5CcqN2NXnzcUV8iitLGDt6wnw7e6N37XjbcRt+O3UbfB19AnM7edt/O3MLcoVz3BKqwAiBgnrLdrt5CHyWfhtxfHILctt7u3pCf2OEIn8beHt+W34IAnt9m35jd/xyPH/8dJZ6pnN7eYZ3e3Qdf3N7hHMCfPt3O3VrdEtz5HIbsL51S3mITigwpdA6cxF2x5eF62wPNHzpfVF8eXcrdYN7+Xx4T8l2eny6cN16G34Dfqt3enCmEWt5Jno1dhl/xOXQMMl5rHhHe3109HrTdmt7Cn96eatyQ3fherV9rXKbcBxyS3LZfZlwUgIbtX5hm3PETboTKBCtn/V5Hsc4aNZMDXwgRtkidO11fst+zX3ldct5B3PHfrJ7ZXizdJh7Rm7kOeQqU3pJfSt6cnLZY+t3A3cHvpsc5DrvufZ0KXV6f+lwtXGrcUd4DnVHfQt/nX0kS6dwM31ndzV4IXdndap9E38VfPp5iX3Hcx1xLHksehF3B3oHgqXU63kncgZxrHO+fgZ697kGcct1SXFSdlt363jtkt7IG39Sdmx9gAqGfAVw83wCdbt7hXeXeTt+w3YQfxV6NXandBdzD7fHevV4jXjKBfV9bCP1eD7OjXMRd5nFnimxy6l6EAtbeoehZhjddE1zy3ARf8txtX1XcI1x2XVACtl9Rn8hfHp8cxsAl010v7K9ytnFTkwNfQMKwnine2wCW3h+cVdxVX4vuwd1p3QUeQx1aRnjdwx4iedew+e5Gn2XcJd85H2HdOF9b0OMeTsDae+MdEXhmnnne2dwmXPnfsd7i3XbfdN7U3PFnmPPd35qfVp8i3XnevdyIXw1eSl0m3fLeON+pHw3dtlx2XrKD1d9/c5acsPM5XsgL5mOWXPnu5SQaQdXis0tOXG3fg947nlXeylwL78Ne6R3OA6gDyJzt3rje/l8aWh1dr8c63SburWQkCH+BhAvdH9WDePJL04yBrd/X7fXdiJ7y3+PcCtxT39rcuhGH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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function() {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function() {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function saveBomTable(output) {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
let val = '';
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
val += '✓';
|
|
}
|
|
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
|
|
val += node.firstChild.nodeValue;
|
|
} else {
|
|
val += node.nodeValue;
|
|
}
|
|
}
|
|
if (output == 'csv') {
|
|
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
|
|
if (isNumeric(val)) {
|
|
val = +val; // use number
|
|
} else {
|
|
val = `"${val}"`; // enclosed within double-quote
|
|
}
|
|
}
|
|
text += val;
|
|
if (cell != row.lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
|
|
if (output != 'clipboard') {
|
|
// To file: csv or txt
|
|
var blob = new Blob([text], {
|
|
type: `text/${output}`
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
|
|
} else {
|
|
// To clipboard
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
/* https://stackoverflow.com/a/175787 */
|
|
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function(s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
if (config.fields.includes("Value")) {
|
|
var index = config.fields.indexOf("Value");
|
|
pcbdata.bom["parsedValues"] = {};
|
|
for (var id in pcbdata.bom.fields) {
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
unit = unit[0];
|
|
} else {
|
|
ref = /^([a-z]+)\d+$/i.exec(ref);
|
|
if (ref) {
|
|
ref = ref[1].toLowerCase();
|
|
if (ref == "c") unit = 'f';
|
|
else if (ref == "l") unit = 'h';
|
|
else if (ref == "r" || ref == "rv") unit = 'r';
|
|
else unit = null;
|
|
}
|
|
}
|
|
return unit;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
var unit;
|
|
if (match) {
|
|
val = parseFloat(match[1]);
|
|
if (match[2]) {
|
|
val = val * units.getMultiplier(match[2]);
|
|
}
|
|
unit = inferUnit(match[3], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
match = units.valueAltRegex.exec(val);
|
|
if (match && (match[1] || match[4])) {
|
|
val = parseFloat(match[1] + "." + match[4]);
|
|
if (match[3]) {
|
|
val = val * units.getMultiplier(match[3]);
|
|
}
|
|
unit = inferUnit(match[2], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function(e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function overwriteSettings(newSettings) {
|
|
initDone = false;
|
|
Object.assign(settings, newSettings);
|
|
writeStorage("bomlayout", settings.bomlayout);
|
|
writeStorage("bommode", settings.bommode);
|
|
writeStorage("canvaslayout", settings.canvaslayout);
|
|
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
|
|
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
|
|
for (var checkbox of settings.checkboxes) {
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
}
|
|
writeStorage("markWhenChecked", settings.markWhenChecked);
|
|
padsVisible(settings.renderPads);
|
|
document.getElementById("padsCheckbox").checked = settings.renderPads;
|
|
fabricationVisible(settings.renderFabrication);
|
|
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
|
|
silkscreenVisible(settings.renderSilkscreen);
|
|
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
|
|
referencesVisible(settings.renderReferences);
|
|
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
|
|
valuesVisible(settings.renderValues);
|
|
document.getElementById("valuesCheckbox").checked = settings.renderValues;
|
|
tracksVisible(settings.renderTracks);
|
|
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
|
|
zonesVisible(settings.renderZones);
|
|
document.getElementById("zonesCheckbox").checked = settings.renderZones;
|
|
dnpOutline(settings.renderDnpOutline);
|
|
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
|
|
setRedrawOnDrag(settings.redrawOnDrag);
|
|
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
setOffsetBackRotation(settings.offsetBackRotation);
|
|
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
|
|
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,
|
|
offsetBackRotation: false,
|
|
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;
|
|
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function() {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function(eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function(eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for (callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawText(ctx, text, color) {
|
|
if ("ref" in text && !settings.renderReferences) return;
|
|
if ("val" in text && !settings.renderValues) return;
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.lineWidth = text.thickness;
|
|
if ("svgpath" in text) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
if ("polygons" in text) {
|
|
ctx.fill(getPolygonsPath(text));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (config.kicad_text_formatting) {
|
|
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.lineWidth = 3 / scalefactor;
|
|
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);
|
|
}
|
|
}
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
// 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, zone.fillrule || "nonzero");
|
|
if (zone.width > 0) {
|
|
ctx.lineWidth = zone.width;
|
|
ctx.stroke(zone.path2d);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clearCanvas(canvas, color = null) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
if (color) {
|
|
ctx.fillStyle = color;
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
} else {
|
|
if (!window.matchMedia("print").matches)
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
if (highlightedNet !== null) {
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
drawFootprints(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
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, flip) {
|
|
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 + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
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 flip = (layerdict.layer === "B");
|
|
var bbox = applyRotation(pcbdata.edges_bbox, flip);
|
|
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;
|
|
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;
|
|
var flip = layerdict.layer === "B";
|
|
if (flip) {
|
|
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 + (flip && settings.offsetBackRotation ? - 180 : 0));
|
|
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 setOffsetBackRotation(value) {
|
|
settings.offsetBackRotation = value;
|
|
writeStorage("offsetBackRotation", value);
|
|
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) {
|
|
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
|
|
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");
|
|
var output = new Array();
|
|
for (let item of valueSet) {
|
|
const visible = highlightFilter(item);
|
|
if (typeof item === 'string' && item.match(urlRegex)) {
|
|
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
|
|
} else {
|
|
output.push(visible);
|
|
}
|
|
}
|
|
td.innerHTML = output.join(", ");
|
|
tr.appendChild(td);
|
|
}
|
|
});
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
tr.onmousemove = handler;
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
setBomHandlers();
|
|
resizableGrid(bomhead);
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0,
|
|
fp_b = 0,
|
|
pads_f = 0,
|
|
pads_b = 0,
|
|
pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("bot").style.height = "";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
var chkbxs = document.getElementsByClassName("visibility_checkbox");
|
|
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = true;
|
|
}
|
|
}
|
|
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
|
|
checkbox.checked = !checkbox.checked;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function checkBomCheckbox(bomrowid, checkboxname) {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
|
|
prepCheckboxes();
|
|
populateMarkWhenCheckedOptions();
|
|
setMarkWhenChecked(settings.markWhenChecked);
|
|
}
|
|
|
|
function setMarkWhenChecked(value) {
|
|
writeStorage("markWhenChecked", value);
|
|
settings.markWhenChecked = value;
|
|
markedFootprints.clear();
|
|
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
|
|
markedFootprints.add(ref);
|
|
}
|
|
populateBomTable();
|
|
drawHighlights();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateMarkWhenCheckedOptions() {
|
|
var container = document.getElementById("markWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "markWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "markWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setMarkWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.markWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
function constrain(number, min, max){
|
|
return Math.min(Math.max(parseInt(number), min), max);
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowLeft":
|
|
case "ArrowRight":
|
|
if (document.activeElement.type != "text"){
|
|
e.preventDefault();
|
|
let boardRotationElement = document.getElementById("boardRotation")
|
|
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
|
|
if (e.key == "ArrowLeft"){
|
|
settings.boardRotation += 3; // 15 degrees
|
|
}
|
|
else{
|
|
settings.boardRotation -= 3;
|
|
}
|
|
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
|
|
boardRotationElement.value = settings.boardRotation
|
|
setBoardRotation(settings.boardRotation);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initUtils();
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div style="float: right; height: 100%;">
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="menubtn"></button>
|
|
<div class="menu-content">
|
|
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
|
|
Full Screen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
|
|
Fab layer
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
|
|
Silkscreen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
|
|
References
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
|
|
Values
|
|
</label>
|
|
<div id="tracksAndZonesCheckboxes">
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
|
|
Tracks
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
|
|
Zones
|
|
</label>
|
|
</div>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Pads
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
|
|
Highlight first pin
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</span>
|
|
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
|
|
Offset back rotation
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Bom checkboxes</div>
|
|
<input id="bomCheckboxes" class="menu-textbox" type=text
|
|
oninput="setBomCheckboxes(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Mark when checked</div>
|
|
<div id="markWhenCheckedContainer"></div>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span class="shameless-plug">
|
|
<span>Created using</span>
|
|
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
|
|
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
|
|
title="Front only">F
|
|
</button>
|
|
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
|
|
title="Front and Back">FB
|
|
</button>
|
|
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
|
|
title="Back only">B
|
|
</button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
|
|
title="BOM only"></button>
|
|
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
|
|
title="BOM left, drawings right"></button>
|
|
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
|
|
title="BOM top, drawings bot"></button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
|
|
title="Grouped BOM"></button>
|
|
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
|
|
title="Ungrouped BOM"></button>
|
|
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
|
|
title="Netlist"></button>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="statsbtn"></button>
|
|
<div class="menu-content">
|
|
<table class="stats">
|
|
<tbody>
|
|
<tr>
|
|
<td width="40%">Board stats</td>
|
|
<td>Front</td>
|
|
<td>Back</td>
|
|
<td>Total</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Components</td>
|
|
<td id="stats-components-front">~</td>
|
|
<td id="stats-components-back">~</td>
|
|
<td id="stats-components-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Groups</td>
|
|
<td id="stats-groups-front">~</td>
|
|
<td id="stats-groups-back">~</td>
|
|
<td id="stats-groups-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>SMD pads</td>
|
|
<td id="stats-smd-pads-front">~</td>
|
|
<td id="stats-smd-pads-back">~</td>
|
|
<td id="stats-smd-pads-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>TH pads</td>
|
|
<td colspan=3 id="stats-th-pads">~</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="stats">
|
|
<col width="40%"/><col />
|
|
<tbody id="checkbox-stats">
|
|
<tr>
|
|
<td colspan=2 style="border-top: 0">Checkboxes</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="iobtn"></button>
|
|
<div class="menu-content">
|
|
<div class="menu-label menu-label-top">
|
|
<div style="margin-left: 5px;">Save board image</div>
|
|
<div class="flexbox">
|
|
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
<span>X</span>
|
|
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
</div>
|
|
<label>
|
|
<input id="render-save-transparent" type="checkbox">
|
|
Transparent background
|
|
</label>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveImage('F')">Front</button>
|
|
<button class="savebtn" onclick="saveImage('B')">Back</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Config and checkbox state</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveSettings()">Export</button>
|
|
<button class="savebtn" onclick="loadSettings()">Import</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Save bom table as</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
|
|
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="fileinfodiv" style="overflow: auto;">
|
|
<table class="fileinfo">
|
|
<tbody>
|
|
<tr>
|
|
<td id="title" class="title" style="width: 70%">
|
|
Title
|
|
</td>
|
|
<td id="revision" class="title" style="width: 30%">
|
|
Revision
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="company">
|
|
Company
|
|
</td>
|
|
<td id="filedate">
|
|
Date
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<div id="bomdiv" class="split split-horizontal">
|
|
<div style="width: 100%">
|
|
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
|
|
oninput="updateRefLookup(this.value)">
|
|
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
|
|
oninput="updateFilter(this.value)">
|
|
<div class="button-container hideonprint" style="float: left; margin: 0;">
|
|
<button id="copy" title="Copy bom table to clipboard"
|
|
onclick="saveBomTable('clipboard')"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom" id="bomtable">
|
|
<thead id="bomhead">
|
|
</thead>
|
|
<tbody id="bombody">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="canvasdiv" class="split split-horizontal">
|
|
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|