mirror of
https://github.com/Alex-2-Graf/Leningrad2-Upgrade-Kit.git
synced 2026-04-16 04:24:23 +03:00
4728 lines
330 KiB
HTML
4728 lines
330 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: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.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: 3px;
|
|
}
|
|
|
|
.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: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.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 {
|
|
display: flex;
|
|
flex-direction: column;
|
|
width: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
min-height: 100%;
|
|
}
|
|
|
|
#top {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: flex-end;
|
|
align-items: center;
|
|
}
|
|
|
|
#topdivider {
|
|
border-bottom: 2px solid black;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.dark #topdivider {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#topdivider>div {
|
|
position: relative;
|
|
}
|
|
|
|
#toptoggle {
|
|
cursor: pointer;
|
|
user-select: none;
|
|
position: absolute;
|
|
padding: 0.1rem 0.3rem;
|
|
top: -0.4rem;
|
|
left: -1rem;
|
|
font-size: 1.4rem;
|
|
line-height: 60%;
|
|
border: 1px solid black;
|
|
border-radius: 1rem;
|
|
background-color: #fff;
|
|
z-index: 100;
|
|
}
|
|
|
|
.flipped {
|
|
transform: rotate(0.5turn);
|
|
}
|
|
|
|
.dark #toptoggle {
|
|
border: 1px solid #fff;
|
|
background-color: #222;
|
|
}
|
|
|
|
#fileinfodiv {
|
|
flex: 20rem 1 0;
|
|
overflow: auto;
|
|
}
|
|
|
|
#bomcontrols {
|
|
display: flex;
|
|
flex-direction: row-reverse;
|
|
}
|
|
|
|
#bomcontrols>* {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
#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;
|
|
}
|
|
|
|
.bom-color {
|
|
width: 20%;
|
|
}
|
|
|
|
.color-column input {
|
|
width: 1.6rem;
|
|
height: 1rem;
|
|
border: 1px solid black;
|
|
cursor: pointer;
|
|
padding: 0;
|
|
}
|
|
|
|
/* removes default styling from input color element */
|
|
::-webkit-color-swatch {
|
|
border: none;
|
|
}
|
|
|
|
::-webkit-color-swatch-wrapper {
|
|
padding: 0;
|
|
}
|
|
|
|
::-moz-color-swatch,
|
|
::-moz-focus-inner {
|
|
border: none;
|
|
}
|
|
|
|
::-moz-focus-inner {
|
|
padding: 0;
|
|
}
|
|
/* #bomhead {
|
|
position: sticky;
|
|
top: 0px;
|
|
z-index: 1;
|
|
} */
|
|
</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": "none", "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, "mark_when_checked": "", "fields": ["Value", "Footprint"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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fvHB8wH5wexh7y73Qf9B9e1NYeMlBCb+1Zch+gH/Tvuh9+H3nv3+6UHxEehe/37hwf1B6P7v/vph8Z76Xvme5nby4f/vo77yAfJB4f7noeSh7L7soeBh6QH8tuhh4BHzEff+6wHrru6h4z7/EeVvihH7ivFe5JHu4e1e4eH6kfvh5RH6ke0R/h7jEeNB9GHlkeGh5b7l7PjWOk82/vO+46HmAeitX6Hmwf5B4pH5EflR+i7kfuVB7QHg3uGR5qHzzuJR+b74AfpR6Gb4NZ2h/v7tfuie6f73oeaR41Hhbude7sH9EfdR7FH7EeXB4o7twegB6z7gkeOR+HYc0e8h8VHp3v+R6sHqkeVR4qHuke1B5dHpkfUe/dH+oejR69H9keZR4GoYkfRu4VH+Ee7R/B74Mft+9DHv4fVB9FHrEeox+8H3EeL+/47wkfgu79HuEf7h9kH7MekR4qHq0f1R/DHvMfGR+BHw0e5+/jHk0exdFwPcsepB68FKsfNR+tHtUfax7f7sMf/h4jH/Mfmx9P72MfWx8v79sfTNB6L2Efux5PaPkfqx4FH9MeHR+1H+wfnR7HH2oeJx9ZHqUe0vh9Htkv5x7JHxEeVx7rH4cfcx83Hpsftx9cHycfPR+nH/cfEx5qvLsfjx6DHm0frB77H+seRx8bH/Ue3u5BHu8f+O9EHya9nx8tHocf2AFPH0CfbR4bHy8efx/F7lsf/x4YH4wNZx5hH+UeLR8L73sf7R+j7t8eQx4/H88edR+/7vUegR+vHmMfdx+NHqHOCQwrBOUfuR9THysfCh+XHzMefh6FHvfuRR+gnwieDR53HyUfSJ5LORCeyx65HlMfUJ4DHpcecJ7An+ifBR+rH4Ufk+5GH10e/x7xHvceuJ8uTjlxgJ7Qn2iehJ5rHvoezx5zHvCfqh9Yn38e4J5knzieGFnInkFhFJ4En9CeMx6wnrMeVJ/En4YeMB+N77AfdJ+LHhCf5J4ny5CeqJ/4ntMf1J9Un20ePJ6sn+kfIx/HHm8eSJ7bHsifta+xNG4f8e+on3kfTJ+q7kSfVx4a7x0fmJ/wnvyeiJ6LHzPv7x7kn8ieFe9Pb1yf/R/cniCfwJ+UH2kevx5Yn2yfmR/YnuMe0p+KUMyXUm6ynviecp5onhEfXx4HHtSeIJ58n0cerx7YngKeOJ6Cn9KeHYaE73ifbh4ins3tAx7on8yeGJ7EnpieJJ5snzQeyp6nHgCfuJ91DYyfcp/JHhwBSh4snjCeE+/XHp0fEp63HjqfiJ66niqfAJ/8blyfap4rHyKflJ/Wnkvump68nlqeJp+snwEeSp+jHlKe2R/hzpyeum6PHkCflp+vaVaexp8sn26ffJ52nnSeZp/gnkQf5p+TGELuUJ7qns6eGp5Gnq6f3x4un2wfNp4SnrSeHp8LH/3u9J+6ngyfkaXxbsKew+8Gnnsfzp7Mn2GfsJ/hnz8eLx+2n9qfAZ86n8qe5p6cn46uap4Gntyf6p9in/vuiZ7WnxbvEZ8mn+6fpp6pn2afHJ4JDVXF6Z/CnxmeoZ+Zny6eVp8pHtme1x8KnsmfkZ+5nvafqZ75nsnX2U0Fn3GfhZ6GnwSeSZ+KH8Wf1R+8nv6e2p5gn6fugZ/Rng6f5p8PHiGfTp/VnqKfMJ9Znn6fNZ40njcfyZ4NnuyejZ4cni4eDx71b82eFx5776GeVJ/yn1Ee9Z+/H7SfYJ5dn1KeaZ4JDGqv3p6Unn2e7Z88nuGf2Z+lnzSfJJ4LHnEe0Z9dn70fEx7pnnGf8+7xnxcerZ5Zn7WfBx4Knyof/p4pn4OeeZ+Bn9Oehm6W7SOeTJ4Jn6KfRp9En36f4p85ngieUZ5TnwAfjZ5LHn0ewZ8WnpmePJ79nxifm57un1ue5Z6en2SfKp+ObyieTp69n2Ae65+tngufmp6LnqCfHZ6Dnw2fy587nyEfEx4PLXueRZ/7nmKfdZ6HnkuenZ9Kn9eeaO87bzweiB7dH1jvh2/8HkAA2W55uZYe6B4xnhnPWc9k+aIe2B9iHjgeJW7z7rduVW8U7s4fhB5nbl+eeU36nlNu1YDTbqOfRZ/7Hhefrp6Xnz/vCO6Tn/yf5Z9BH2IB/O4hHrHuRcwSb0BftO/AXy9u+5/m7lDvT1i1nr6eJZ9tn+OfKh4QXqafxR5Dnl1QJh8IHvwBox+vn8gfb54AAKSoAWge+O6t77LXxc+E70Tvth4UqVIRxW5oCBIflu4x1b4Bsi3/ntIfzh6AXnGUsgApSPPuUoGVb2xAXx5hnmBe456ln2DvFF4PrFFMkp92nsef9J66aORf7poUXvq5tF+oOJaeTx/3nm6f4p60XlKBEF+Sn1OfQ57WHlbOwOhlzkruiOEyQFRffZ6sXuBfz25iAapB7F70XxxfGh/BHkFMGB6o8YvPkx+O7jxfjsQsXxqe1F+Jn8he7e/8X6B9dF8pn5BeK58TOVJLIl4kHmJfzF/wXz6ewJ9IXxueY5+FH9wUAl6oXqSf7J6cXrHvZfi5tnhfsF7g7vJevF5jngefxp/in8pfUl4BnsueMl43n2peq7THz3JegoE8Xj6fLF4bnqBfSZ+O7lJeGJzSXnpf9F4xnyyR0tQaXlWeml+GX2JeCl7GXm2eSl6SXkkfpl8CX9Jf5l4qn5g1qRWWXrOf2xiNb9Zfd57ynnxf/Z46X1d4Kl65n6hfT55qXmduEjW5FU5f3F7WX/Jerl8KX96YdZ+sXxGfOl5mX7pe1596XtOfw/mbuHJfGl/OXsrvLl8tnuef855IX/5ffF6mXo1vgV9Ln0FfDl/47lBooU4+Xu3vml9GX+JekV8Ln25fAV/uXrpeMV+dn55fnp9PrkoioV5WXmFf2xhaXwmeEl8lnuKeyV72Xypfk57dHrFe1h4NEelezl8yQC5fvl/hX6OeWV+JXxefSV4TnlNvOV8eXqpeaF/Hn20uElFcX6QFPl+FX5lf6562XiZfcJ5lXtFf9l7mX4JfFV+jUAVe1V9hXkVf8Z7FXzVfWV7IXjRfkl71XrlekF95XrHugQBswE1f8V6+XjVf554lX2BepV5K72VeR56eXsFeXl57+N543V5JHglfIF73n8ZeD545X+1e5V+5X6SfwV9v+U5AavjcX91f1V8JX1RfvV/UX9lfpV+07/1fZl8xXw1f9J6s6TrW8V/DXj1fM1+8X6NeAV7zXuDuC15BXqleg15pX1/5iXDDX89uI19rny1evV6KX5FffV7tXsrv0V+Pnx6fi14xnpJP21+iXytfI1+uXmteUV91Xwdf9V6LXjuek15yudvgJ15Tbzte4l6zX3teSV8Hn2NeF14dXhxfl1+DX6a5FNHXX7TvN142Xoled18lXvde616BXxdem16dXgkelUXPX1ZeM1+nX35fvp+2X21fdl7jXgNf5V+pX8eeZKhOX+XOGV6FXs1fPV8RXm9efV7vXv1f/18LXp9fR14qn4il3l7A3wVfL15+XzZfrV5/X3Nf4N4PX+NfHV+Q3grvbM5VXqJeN16nXrte7R6eHkzvVgFeHizuPh+fQGpgyqFjnxJff178XhDfG15Pn5tfx5/QMYrPy147Xyjet1+rXrVeY1/vX8leh19XnpDfj15bX1LO318ZXkZfP1+w37Ne2N7w3gdeHl4A3hNfql9k3t9Y0N7TXiteP16o3qNfRN9rX/DeNN8Q37jfn16DWYa95N4g3pleq19aXm5e4N/U3ilfh19RnmTfx59v02zfMN9FX7VfhJ9nX/te/14I3zTeiN483/Sea8W1eATfJ18M34TfHN4C35zegt/M3rjeR17C3jGegOHYttShyN4vXoTer1+3Xv5fd1/aX/dekt8pXyzfiN/CX4iUwzky3oZeYt9y3kTecN783yCfEt9c3qTfSt9S3g6fsl8q3xeRqt8g3hzfxV5g3nNeNp/E3hteSt5S3j0e+l5nbupf3bSq36Fe7N8U3ozeZ15M3udf81843kbf3N7G3ldeMaHT1abfwN583i1eGt7aXpueit+a3tueeV7K32pfTbl1ObbeMN5y3rDfr1/y329fCt6G3lbe3N/bn9beT19AgdNVLt663mbfdt9znhFexZ5U3tlfBt7M347fR57O315eukC+3sngft5u33zfjN/q3sTeQd8k3k7fE1/e3iwlIV8636Hedt9h3vbf4d8B3m1e1N6a35Hewd7a37FfQNyh3z1FTV/s3pTe7t+/Xhreyl4k3x9fWt7e32TffalVOK7eqd7m32Le+t/u32DfHt6R3pnfRt9vH8beVvn5XzHfKd/TXnread7y3unfEd5c34nfA16s37Ilmugp3rLf316l3+bev1+KX+nemJ4fXw9egl9J3+Nv9c7itjnfJd+p3zXflN/631Tfgd/l3wXe1t+F3jbeCHUzwciYJd4M3jXfud6tX/HfcN5t3one7d9e3h3e0d5qwCRMXd7V3hTe4V9x3hbeEd9M323f9d4OX8He1/hTX1Xfut/N3j3ee1953gbetR6e34LeLN6F3wKeKp9LX6kVTd7d3lPfat7i3xbfAt4437Pfkt/t3vPf+O6WOIdgQ9+T3rnfS95532Xfo99932PeDV8N3rHvx1/F30PfZt/D3v7fu1+g39Pfrd8z3gXfO96XXlnfgN7XXvvem98H372f9t6c3/neY98I3o9fp9/0n6952d++37Heat9u3mXftd7l3jve194N3jfe0t9fXufeYd733uHfI9693nXe7l+G3l7fTt+73loed7KT3q/f3d5b3z3erd6B38ffV95C39feA99k31Df39933z/f99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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) {
|
|
var name = node.firstChild.nodeValue ?? "";
|
|
text += (output == 'csv' ? `"${name}"` : name);
|
|
}
|
|
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,
|
|
valueAltRegex: 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"] = {};
|
|
var allList = getBomListByLayer('FB').flat();
|
|
for (var id in pcbdata.bom.fields) {
|
|
var ref_key = allList.find(item => item[1] == Number(id)) || [];
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index], ref_key[0] || '');
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
return unit[0];
|
|
}
|
|
|
|
var resarr = /^([a-z]+)\d+$/i.exec(ref);
|
|
switch (Array.isArray(resarr) && resarr[1].toLowerCase()) {
|
|
case "c": return 'f';
|
|
case "l": return 'h';
|
|
case "r":
|
|
case "rv": return 'r';
|
|
}
|
|
return null;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
if (Array.isArray(match)) {
|
|
var unit = inferUnit(match[3], ref);
|
|
var val_i = parseFloat(match[1]);
|
|
if (!unit) return null;
|
|
if (match[2]) {
|
|
val_i = val_i * units.getMultiplier(match[2]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
|
|
match = units.valueAltRegex.exec(val);
|
|
if (Array.isArray(match) && (match[1] || match[4])) {
|
|
var unit = inferUnit(match[2], ref);
|
|
var val_i = parseFloat(match[1] + "." + match[4]);
|
|
if (!unit) return null;
|
|
if (match[3]) {
|
|
val_i = val_i * units.getMultiplier(match[3]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
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 resetSettings() {
|
|
if (!confirm(
|
|
`This will reset all checkbox states and other settings.\n\n` +
|
|
`Press OK if you want to continue.`)) {
|
|
return;
|
|
}
|
|
if (storage) {
|
|
var keys = [];
|
|
for (var i = 0; i < storage.length; i++) {
|
|
var key = storage.key(i);
|
|
if (key.startsWith(storagePrefix)) keys.push(key);
|
|
}
|
|
for (var key of keys) storage.removeItem(key);
|
|
}
|
|
location.reload();
|
|
}
|
|
|
|
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;
|
|
setHighlightRowOnClick(settings.highlightRowOnClick);
|
|
document.getElementById("highlightRowOnClickCheckbox").checked = settings.highlightRowOnClick;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = 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: "FB",
|
|
bomlayout: "left-right",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: "none",
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
offsetBackRotation: false,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
netColors: {},
|
|
}
|
|
|
|
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 (settings.bommode == "netlist" && !pcbdata.nets) {
|
|
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;
|
|
|
|
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
|
|
if (highlightpin1 === "false") highlightpin1 = "none";
|
|
if (highlightpin1 === "true") highlightpin1 = "all";
|
|
setHighlightPin1(highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
|
|
|
|
settings.markWhenChecked = readStorage("markWhenChecked");
|
|
if (settings.markWhenChecked == null) {
|
|
settings.markWhenChecked = config.mark_when_checked;
|
|
}
|
|
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("highlightRowOnClick", false, "highlightRowOnClickCheckbox", setHighlightRowOnClick);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
|
|
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);
|
|
|
|
settings.netColors = JSON.parse(readStorage("netColors")) || {};
|
|
}
|
|
|
|
// 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";
|
|
if ("svgpath" in text) {
|
|
if ("thickness" in text) {
|
|
ctx.lineWidth = text.thickness;
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
} else if ("fillrule" in text) {
|
|
ctx.fill(new Path2D(text.svgpath), text.fillrule);
|
|
}
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.lineWidth = text.thickness;
|
|
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 if (pad.drillshape == "rect") {
|
|
ctx.fill(getChamferedRectPath(pad.drillsize, 0, 0, 0));
|
|
} 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 == "all" ||
|
|
settings.highlightpin1 == "selected" && highlight)) {
|
|
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, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineCap = "round";
|
|
|
|
var hasHole = (track) => (
|
|
'drillsize' in track &&
|
|
track.start[0] == track.end[0] &&
|
|
track.start[1] == track.end[1]);
|
|
|
|
// First draw tracks and tented vias
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (!hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
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();
|
|
}
|
|
}
|
|
// Second pass to draw untented vias
|
|
var style = getComputedStyle(topmostdiv);
|
|
var holeColor = style.getPropertyValue('--pad-hole-color')
|
|
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
ctx.strokeStyle = holeColor;
|
|
ctx.lineWidth = track.drillsize;
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
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.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, 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("user-select");
|
|
|
|
// 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();
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
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 setHighlightRowOnClick(value) {
|
|
settings.highlightRowOnClick = value;
|
|
writeStorage("highlightRowOnClick", value);
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
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 createCheckboxHandlers(input, checkbox, references, row) {
|
|
var clickHandler = () => {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (input.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);
|
|
}
|
|
|
|
return [
|
|
(e) => {
|
|
clickHandler();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
if (row.onmousemove) row.onmousemove();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
input.checked = !input.checked;
|
|
input.indeterminate = false;
|
|
clickHandler();
|
|
}
|
|
];
|
|
}
|
|
|
|
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 updateNetColors() {
|
|
writeStorage("netColors", JSON.stringify(settings.netColors));
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function netColorChangeHandler(net) {
|
|
return (event) => {
|
|
settings.netColors[net] = event.target.value;
|
|
updateNetColors();
|
|
}
|
|
}
|
|
|
|
function netColorRightClick(net) {
|
|
return (event) => {
|
|
if (event.button == 2) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
event.target.value = defaultNetColor;
|
|
delete settings.netColors[net];
|
|
updateNetColors();
|
|
}
|
|
}
|
|
}
|
|
|
|
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 (String(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 getBomListByLayer(layer) {
|
|
switch (layer) {
|
|
case 'F': return pcbdata.bom.F.slice();
|
|
case 'B': return pcbdata.bom.B.slice();
|
|
case 'FB': return pcbdata.bom.both.slice();
|
|
}
|
|
return [];
|
|
}
|
|
|
|
function getSelectedBomList() {
|
|
if (settings.bommode == "netlist") {
|
|
return pcbdata.nets.slice();
|
|
}
|
|
var out = getBomListByLayer(settings.canvaslayout);
|
|
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
var expandedTable = [];
|
|
for (var bomentry of out) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
return expandedTable;
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
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") {
|
|
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
}));
|
|
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
|
|
return 0;
|
|
}));
|
|
} 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][0] != b[i][0]) 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;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
|
|
bomtable = getSelectedBomList();
|
|
|
|
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);
|
|
var color = settings.netColors[netname] || defaultNetColor;
|
|
td = document.createElement("TD");
|
|
var colorBox = document.createElement("INPUT");
|
|
colorBox.type = "color";
|
|
colorBox.value = color;
|
|
colorBox.onchange = netColorChangeHandler(netname);
|
|
colorBox.onmouseup = netColorRightClick(netname);
|
|
colorBox.oncontextmenu = (e) => e.preventDefault();
|
|
td.appendChild(colorBox);
|
|
td.classList.add("color-column");
|
|
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, td.ontouchstart, td.ontouchend] = createCheckboxHandlers(input, 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(String(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);
|
|
if (settings.highlightRowOnClick) {
|
|
tr.onmousedown = handler;
|
|
} else {
|
|
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("topmostdiv").style.height = "";
|
|
document.getElementById("topmostdiv").style.display = "block";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
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("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
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 childNum = checkboxnum + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].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 childNum = checkboxnum + 1 + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].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";
|
|
}
|
|
|
|
function topToggle() {
|
|
var top = document.getElementById("top");
|
|
var toptoggle = document.getElementById("toptoggle");
|
|
if (top.style.display === "none") {
|
|
top.style.display = "flex";
|
|
toptoggle.classList.remove("flipped");
|
|
} else {
|
|
top.style.display = "none";
|
|
toptoggle.classList.add("flipped");
|
|
}
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
initUtils();
|
|
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);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// EventHandler.registerCallback(IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, () => {
|
|
// for(var tr of bom.childNodes) {
|
|
// tr.onclick = tr.onmousemove;
|
|
// tr.onmousemove = null;
|
|
// };
|
|
// });
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div id="fileinfodiv">
|
|
<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 id="bomcontrols">
|
|
<div class="hideonprint menu">
|
|
<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="highlightRowOnClickCheckbox" type="checkbox" checked onchange="setHighlightRowOnClick(this.checked)">
|
|
Highlight row on click
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
Highlight first pin
|
|
<form id="highlightpin1">
|
|
<div class="flexbox">
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
|
|
None
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
|
|
All
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
|
|
Selected
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</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">
|
|
<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">
|
|
<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">
|
|
<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">
|
|
<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">
|
|
<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>
|
|
<button class="savebtn" onclick="resetSettings()">Reset</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>
|
|
<div id="topdivider">
|
|
<div class="hideonprint">
|
|
<div id="toptoggle" onclick="topToggle()">︽</div>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="flex: 1 1">
|
|
<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>
|