4710 lines
330 KiB
HTML
4710 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;
|
|
}
|
|
|
|
</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, "fields": ["Value", "Footprint", "Description", "Function"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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7oEfMp5T7ybuFNA+KCZPCJ46noqfnJ9Knlfv3J/X7zyfkp9mHusfJR78n+qe2B7lH81vWx7bCUdkNAXyn+NuZp6cnyNcXJ/inkCfGJ4HH8Cfqp8Gnkfvhp9fH7af6++yniaeIp7wqdqfCp5OnlQezp56ny6fKp+vHm6fJJ7Yn6Sfv+62nxqfdp89by9FfjBb746f1R68H+aetR/Kn0Se+x9rH+Fv1p+BnmUfQZ6iHhCeLR9nHq0eQB5tH6mAZ69LAFcf8B7MqNvH1dh9bmkftx7yH+yeJUKoqfcfje8sn0meVynJn7w2aJ+ZHuEe+x6RnryeHx9un9of7p4ynx6f3x5zHkKfwZ9DKNPGKZ4jH9weYp+KnjUeTe6RbhKelp6Sn+8eFe9RHp8eNp5Bn8fusZ/knoHv1AET75SeNm7tgEmfJu+ZopXZ3SNwn2xv8J5pnqWfMe+In0seMu6Znk2eEerN8kyeRh66n+Wf6J8rHxKfqx5VnlGfUp7unp3uIh6xH7ie8x7Xr03ySe4Enz6ebu++nxWfpe437sCfPZ4gntWffJ/Rnk0fAp6nH+dvEJ71n5Cf5x62H4kfLgGNnmxuqAt5dhAeqZ4DbgifaZ8UHpkfZZ/IAQ8e2R/UH+pNTgDSc12f/x6ArQCfYx5Vn7meVp4kntaf1Z9Tnicf055DnpqfG5+2uH8faZ7dn5kf25/hH2OeVu/jnvqf/p4GnwGehp8DnkaehZ7NHmIecZ8Un/EeDZ+SH0kfoB+Zn2+5wWer5C2f+u6MnmbvsO6rnhmeQ1xmrDxuyJ6snkMf3gvI8y/uJ55rn6TY6J4zb36e7x/6n3mel54Dn6Ue059GnmtvRZ+ynw+feZu9Hv8eZZ4AngTv4Z4Vni6fvZ6Yn32eWJ9/n/meV54enxqedZ94Hucf8Z4XH6mAwB4t5zSf958m7+gX4B8pnvrvkB8pI1AfCJ/QHqcZMB4snu+fmZ+IXmZy2p7hbkge/oJz79+fhO96nsSfGe6QXz8qsMazAZef/54HnwBeh54wXy0f+B9zn1CfFx82bjxEMJ/JHzDkQOm74fSfT27mhK5uHREv769vm6Fvb6+e658DH9kf757Y7xRf+hJtnwJuP29471+ep565nrhfkZ94X1Ge+57qnzWej+7XnoKe+e+Hnisue8h/CJKNn57MX2VuLF+gXjufv54qnr+eF55/n3ueU54cXjGetZ5P7sWepKJqRcBeam58X8iooF44X/9uu58QXlKewu6BniJeAF+cXjOe6u8wXvGfCR7zntSfZF92HrSfmZ82wJxmDzRPnyI4Bu5LQjRf364y81+fb5/rn8oe04jN+KpfGInenxyfYZ/0HgJfqYHjHxae45+Wn9JfVp7sX8Jf0p9knriePx7BHwJIOl47H+JeYZ/YX7qeZ572QEZfAl79nzJfBF/HHoOfJx7cXxtvxy7AmL5uCp56X5ZePZ5+n+Berp8TngGewl9qnyZeGp6xnsWfKl6nGROToZ4+n3pfhJ9WXmXv55+unxefbl6yX+5fMZ+iX56evW4jGTpNpp/eXs5eY57gXpWefZ42X2xf/Z5QXoRfdl/Tn/Ze0ePSAI5e3l9OX92foV8Rn6xeeZ9Vn1MeAV4FnqZfUV7FnxmJtCWbbk5fIF9OnmBfzp7xXz+eE5/EnyCetl7/nnZfV57BnkFflrlFQLFeaV6+nuleLl9hXhBf4V4yX+sf0R8cXyIeT+7EX3GeJF+wX4pfCZ9KXghenR+anjDKeu+kH90faR+tn75vL55In9tvHZ5sbnUoLu8jn3pfOZ4JXtJeRV7GXxFeGx5JXh5f5R5Fnz8e1x5QF/Ep2Z9fn01fgJ4ZXy5e/p9+X0Jfxl7uXm1egV7/76ces5/1nyReVJ+pgSHvlx7kX56fGldcQ5ReLO8DiOQfA4guHl4pd4B7Hlpe9F4bnwCqulYjnrPvr+9hH3seqe7AANyepe9nn9ZeQl8JXsvvh+6RX9le0F6iHoefyV5jXtXEul+47hfvXV4LX91ehl9LX5WeLV57nt/uq1+tX1BfBZ85X5mer3U7g5+fW15jH6eeYV+GX7tfy15Rn6Dcry22XjifSV8AXtFfR15VI8eeJ1+N73FfO17WX2dfvV4rX5nv+1/FXyJenF+HX8aeY18on8de8145n9teyp93X75fuF5L73teF19gy6tfl19tXnafo1/KVixrr17PLI3u3h4FXr5e556fXswfbF9fXh3uNZ9PXyVev15HXmNfaxb/X/3v818+X6deu17hXudfwN/t75XuYJ4lX+CeG1/KVyu83p5bXm9e215Q3j1ehV6uX5led++PXnDfoN7knjeeFJ+znpSfQ142bveflV4OH/cotoTjXvCfNV9WtEyedV/tnuWf9V/uH41XSqufn1ufAN/6Xg9fzV4w30Ve0Z+yX4Rfcl/rX7KfHLImqkKyXV8nXiXvgN7LXg9fNl7FX2jecl/QXhjfdZ5DXuVepF8JnugMlV8wnta55aqmn0heDJ+pnvjfK58uHwTfa5/TXm+vM19vaWzeYQQ03tuf/F9A3r2eKN69X65e/l99X4lfB15XXpTeZl54n/dolarwEcTe+V/w7/zetN9Q3vdf0N903hFfWV/fX/yfIt6M3nEfN56Y37eeWN+SH/Be9h4PngBrZwXIqGpfeN/PnmzuXN/9H1QfWl+PHtsez0QgahLfOp+ZHuoezV/xX7ueWV/03qDfDN7rX6LfQ58qrMluuN5bnxLeZgC63jteS17S34VfZN8tXrLeB1+RXjlftZ+M3gpfZV6KX8zemAAMbwueRN++mP10QrOq3xzfat+G7s0TdV7LHxreM17aXwJJHHkO3mn5fN8k3gLebx8ZXn5eQt59Xq1eT18G3u1fgp4dXrzelHHu39rfZp+3XuleP589X4JeMt7k3+xfAV6iXwNfM54K30zett7DXnbfFV7K3ybuZap5Msat1V4c38uetV7hbuBg7O5z7m+eAx483m7f/t4uaeJfaG463vxeUl4Yn8HemV54XqHeJl/9X2HeOB+G3tFeMd7mlIHeo5/472nfAt5nX9Lf3t8PX5Bflt5rXode1t/y3xjfEd8SH5HenW8jXspfCF4NXzhdYuu43y2feN6zA6puCd8GKMNvSJ6a38ifmp+V3qLqJt+p3uaepN6F3mTfId8W3/rf+55RXkRf2d/JXxfqVd+N34Hf+V7N3wVeBd/m3y3fe18+3gzfFN7y3oNeEd5znszfZd6JntjfrN/+CWs2Ch2O33HenN5MXoif6Z4u30By8e713gxeH68j37pXx54k3y7ezp7B3oLeId6F3vTf5N5h3s9eht/tX2ZfyG4LTjPe496p3l3fs96A31LfH15sXpne/V4i3z9eau+lXreesF6R3truw9/kXiGfqULX6+zfTh/V3+Jetd7eT0jeSd6DH1Peiwkd3hvrnd553uWec984X17fnt5uXsLel15y3tvfhZ9+38vecp8i6wffq95fnzTf7+4b3kDem96t3oveWd5L3qVf1t/EXhIfQB8MASHvUd/KXzkeNDtywVXfOtITX3Iek18Inv0T84zwqdxvJ9/0X5mfl8RS73Nf/14a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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") || "";
|
|
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";
|
|
ctx.lineWidth = text.thickness;
|
|
if ("svgpath" in text) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
if ("polygons" in text) {
|
|
ctx.fill(getPolygonsPath(text));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (config.kicad_text_formatting) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
offsety += interline;
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
if ("svgpath" in edge) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
if (edge.type == "rect") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(edge.start[0], edge.end[1]);
|
|
ctx.lineTo(...edge.end);
|
|
ctx.lineTo(edge.end[0], edge.start[1]);
|
|
ctx.lineTo(...edge.start);
|
|
}
|
|
if (edge.type == "arc") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
deg2rad(edge.startangle),
|
|
deg2rad(edge.endangle));
|
|
}
|
|
if (edge.type == "circle") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
0, 2 * Math.PI);
|
|
ctx.closePath();
|
|
}
|
|
if (edge.type == "curve") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
|
|
}
|
|
if("filled" in edge && edge.filled)
|
|
ctx.fill();
|
|
else
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
|
|
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
|
|
var path = new Path2D();
|
|
var width = size[0];
|
|
var height = size[1];
|
|
var x = width * -0.5;
|
|
var y = height * -0.5;
|
|
var chamfOffset = Math.min(width, height) * chamfratio;
|
|
path.moveTo(x, 0);
|
|
if (chamfpos & 4) {
|
|
path.lineTo(x, y + height - chamfOffset);
|
|
path.lineTo(x + chamfOffset, y + height);
|
|
path.lineTo(0, y + height);
|
|
} else {
|
|
path.arcTo(x, y + height, x + width, y + height, radius);
|
|
}
|
|
if (chamfpos & 8) {
|
|
path.lineTo(x + width - chamfOffset, y + height);
|
|
path.lineTo(x + width, y + height - chamfOffset);
|
|
path.lineTo(x + width, 0);
|
|
} else {
|
|
path.arcTo(x + width, y + height, x + width, y, radius);
|
|
}
|
|
if (chamfpos & 2) {
|
|
path.lineTo(x + width, y + chamfOffset);
|
|
path.lineTo(x + width - chamfOffset, y);
|
|
path.lineTo(0, y);
|
|
} else {
|
|
path.arcTo(x + width, y, x, y, radius);
|
|
}
|
|
if (chamfpos & 1) {
|
|
path.lineTo(x + chamfOffset, y);
|
|
path.lineTo(x, y + chamfOffset);
|
|
path.lineTo(x, 0);
|
|
} else {
|
|
path.arcTo(x, y, x, y + height, radius);
|
|
}
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getOblongPath(size) {
|
|
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
|
|
}
|
|
|
|
function getPolygonsPath(shape) {
|
|
if (shape.path2d) {
|
|
return shape.path2d;
|
|
}
|
|
if ("svgpath" in shape) {
|
|
shape.path2d = new Path2D(shape.svgpath);
|
|
} else {
|
|
var path = new Path2D();
|
|
for (var polygon of shape.polygons) {
|
|
path.moveTo(...polygon[0]);
|
|
for (var i = 1; i < polygon.length; i++) {
|
|
path.lineTo(...polygon[i]);
|
|
}
|
|
path.closePath();
|
|
}
|
|
shape.path2d = path;
|
|
}
|
|
return shape.path2d;
|
|
}
|
|
|
|
function drawPolygonShape(ctx, scalefactor, shape, color) {
|
|
ctx.save();
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
if("filled" in shape && !shape.filled) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.stroke(getPolygonsPath(shape));
|
|
} else {
|
|
ctx.fillStyle = color;
|
|
ctx.fill(getPolygonsPath(shape));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, drawing, color);
|
|
} else {
|
|
drawText(ctx, drawing, color);
|
|
}
|
|
}
|
|
|
|
function getCirclePath(radius) {
|
|
var path = new Path2D();
|
|
path.arc(0, 0, radius, 0, 2 * Math.PI);
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getCachedPadPath(pad) {
|
|
if (!pad.path2d) {
|
|
// if path2d is not set, build one and cache it on pad object
|
|
if (pad.shape == "rect") {
|
|
pad.path2d = new Path2D();
|
|
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
|
|
} else if (pad.shape == "oval") {
|
|
pad.path2d = getOblongPath(pad.size);
|
|
} else if (pad.shape == "circle") {
|
|
pad.path2d = getCirclePath(pad.size[0] / 2);
|
|
} else if (pad.shape == "roundrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
|
|
} else if (pad.shape == "chamfrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
|
|
} else if (pad.shape == "custom") {
|
|
pad.path2d = getPolygonsPath(pad);
|
|
}
|
|
}
|
|
return pad.path2d;
|
|
}
|
|
|
|
function drawPad(ctx, pad, color, outline) {
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
if (pad.offset) {
|
|
ctx.translate(...pad.offset);
|
|
}
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
var path = getCachedPadPath(pad);
|
|
if (outline) {
|
|
ctx.stroke(path);
|
|
} else {
|
|
ctx.fill(path);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawPadHole(ctx, pad, padHoleColor) {
|
|
if (pad.type != "th") return;
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
ctx.fillStyle = padHoleColor;
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else 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("userSelect");
|
|
|
|
// Remove listeners
|
|
document.removeEventListener('mousemove', mouseMoveHandler);
|
|
document.removeEventListener('mouseup', mouseUpHandler);
|
|
|
|
if (wasDragged) {
|
|
// Redraw whole BOM
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
const mouseMoveHandler = function(e) {
|
|
// Notice the dragging
|
|
wasDragged = true;
|
|
|
|
// Make the dragged element visible
|
|
draggingElement.style.removeProperty("display");
|
|
|
|
// Set elements position to mouse position
|
|
draggingElement.style.left = `${e.screenX - xOffset}px`;
|
|
draggingElement.style.top = `${e.screenY - yOffset}px`;
|
|
|
|
// Forced redrawing of BOM table
|
|
if (forcePopulation) {
|
|
forcePopulation = false;
|
|
// Copy array
|
|
phe = Array.from(placeHolderElements);
|
|
// populate BOM table again
|
|
populateBomHeader(dragName, phe);
|
|
populateBomBody(dragName, phe);
|
|
}
|
|
|
|
// Set up array of hidden columns
|
|
var hiddenColumns = Array.from(settings.hiddenColumns);
|
|
// In the ungrouped mode, quantity don't exist
|
|
if (settings.bommode === "ungrouped")
|
|
hiddenColumns.push("Quantity");
|
|
// If no checkbox fields can be found, we consider them hidden
|
|
if (settings.checkboxes.length == 0)
|
|
hiddenColumns.push("checkboxes");
|
|
|
|
// Get table headers and group them into checkboxes, extrafields and normal headers
|
|
const bh = document.getElementById("bomhead");
|
|
headers = Array.from(bh.querySelectorAll("th"))
|
|
headers.shift() // numCol is not part of the columnOrder
|
|
headerGroups = []
|
|
lastCompoundClass = null;
|
|
for (i = 0; i < settings.columnOrder.length; i++) {
|
|
cElem = settings.columnOrder[i];
|
|
if (hiddenColumns.includes(cElem)) {
|
|
// Hidden columns appear as a dummy element
|
|
headerGroups.push([]);
|
|
continue;
|
|
}
|
|
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
|
|
if (elem.classList.contains("bom-checkbox")) {
|
|
if (lastCompoundClass === "bom-checkbox") {
|
|
cbGroup = headerGroups.pop();
|
|
cbGroup.push(elem);
|
|
headerGroups.push(cbGroup);
|
|
} else {
|
|
lastCompoundClass = "bom-checkbox";
|
|
headerGroups.push([elem])
|
|
}
|
|
} else {
|
|
headerGroups.push([elem])
|
|
}
|
|
}
|
|
|
|
// Copy settings.columnOrder
|
|
var columns = Array.from(settings.columnOrder)
|
|
|
|
// Set up array with indices of hidden columns
|
|
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
|
|
var dragIndex = columns.indexOf(dragName);
|
|
var swapIndex = dragIndex;
|
|
var swapDone = false;
|
|
|
|
// Check if the current dragged element is swapable with the left or right element
|
|
if (dragIndex > 0) {
|
|
// Get left headers boundingbox
|
|
swapIndex = dragIndex - 1;
|
|
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
|
|
swapIndex--;
|
|
if (!hiddenIndices.includes(swapIndex)) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
|
|
// Get right headers boundingbox
|
|
swapIndex = dragIndex + 1;
|
|
while (hiddenIndices.includes(swapIndex))
|
|
swapIndex++;
|
|
if (swapIndex < headerGroups.length) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Write back change to storage
|
|
if (swapDone) {
|
|
settings.columnOrder = columns
|
|
writeStorage("columnOrder", JSON.stringify(columns));
|
|
}
|
|
|
|
}
|
|
|
|
const mouseDownHandler = function(e) {
|
|
var target = e.target;
|
|
if (target.tagName.toLowerCase() != "td")
|
|
target = target.parentElement;
|
|
|
|
// Used to check if a dragging has ever happened
|
|
wasDragged = false;
|
|
|
|
// Create new element which will be displayed as the dragged column
|
|
draggingElement = document.createElement("div")
|
|
draggingElement.classList.add("dragging");
|
|
draggingElement.style.display = "none";
|
|
draggingElement.style.position = "absolute";
|
|
draggingElement.style.overflow = "hidden";
|
|
|
|
// Get bomhead and bombody elements
|
|
const bh = document.getElementById("bomhead");
|
|
const bb = document.getElementById("bombody");
|
|
|
|
// Get all compound headers for the current column
|
|
var compoundHeaders;
|
|
if (target.classList.contains("bom-checkbox")) {
|
|
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
|
|
} else {
|
|
compoundHeaders = [target];
|
|
}
|
|
|
|
// Create new table which will display the column
|
|
var newTable = document.createElement("table");
|
|
newTable.classList.add("bom");
|
|
newTable.style.background = "white";
|
|
draggingElement.append(newTable);
|
|
|
|
// Create new header element
|
|
var newHeader = document.createElement("thead");
|
|
newTable.append(newHeader);
|
|
|
|
// Set up array for storing all placeholder elements
|
|
placeHolderElements = [];
|
|
|
|
// Add all compound headers to the new thead element and placeholders
|
|
compoundHeaders.forEach(function(h) {
|
|
clone = cloneElementWithDimensions(h);
|
|
newHeader.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
|
|
// Create new body element
|
|
var newBody = document.createElement("tbody");
|
|
newTable.append(newBody);
|
|
|
|
// Get indices for compound headers
|
|
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
|
|
|
|
// For each row in the BOM body...
|
|
var rows = bb.querySelectorAll("tr");
|
|
rows.forEach(function(row) {
|
|
// ..get the cells for the compound column
|
|
const tds = row.querySelectorAll("td");
|
|
var copytds = idxs.map(i => tds[i]);
|
|
// Add them to the new element and the placeholders
|
|
var newRow = document.createElement("tr");
|
|
copytds.forEach(function(td) {
|
|
clone = cloneElementWithDimensions(td);
|
|
newRow.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
newBody.append(newRow);
|
|
});
|
|
|
|
// Compute width for compound header
|
|
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
|
|
draggingElement.style.width = `${width}px`;
|
|
|
|
// Insert the new dragging element and disable selection on BOM
|
|
bom.insertBefore(draggingElement, null);
|
|
bom.style.userSelect = "none";
|
|
|
|
// Determine the mouse position offset
|
|
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
|
|
yOffset = e.screenY - compoundHeaders[0].offsetTop;
|
|
|
|
// Get name for the column in settings.columnOrder
|
|
dragName = getColumnOrderName(target);
|
|
|
|
// Change text and class for placeholder elements
|
|
placeHolderElements = placeHolderElements.map(function(e) {
|
|
newElem = cloneElementWithDimensions(e);
|
|
newElem.textContent = "";
|
|
newElem.classList.add("placeholder");
|
|
return newElem;
|
|
});
|
|
|
|
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
|
|
forcePopulation = true;
|
|
|
|
// Add listeners for move and up on mouse
|
|
document.addEventListener('mousemove', mouseMoveHandler);
|
|
document.addEventListener('mouseup', mouseUpHandler);
|
|
}
|
|
|
|
// In netlist mode, there is nothing to reorder
|
|
if (settings.bommode === "netlist")
|
|
return;
|
|
|
|
// Add mouseDownHandler to every column except the numCol
|
|
bom.querySelectorAll("th")
|
|
.forEach(function(head) {
|
|
if (!head.classList.contains("numCol")) {
|
|
head.onmousedown = mouseDownHandler;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function getBoundingClientRectFromMultiple(elements) {
|
|
var elems = Array.from(elements);
|
|
|
|
if (elems.length == 0)
|
|
return null;
|
|
|
|
var box = elems.shift()
|
|
.getBoundingClientRect();
|
|
|
|
elems.forEach(function(elem) {
|
|
var elembox = elem.getBoundingClientRect();
|
|
box.left = Math.min(elembox.left, box.left);
|
|
box.top = Math.min(elembox.top, box.top);
|
|
box.width += elembox.width;
|
|
box.height = Math.max(elembox.height, box.height);
|
|
});
|
|
|
|
return box;
|
|
}
|
|
|
|
function cloneElementWithDimensions(elem) {
|
|
var newElem = elem.cloneNode(true);
|
|
newElem.style.height = window.getComputedStyle(elem).height;
|
|
newElem.style.width = window.getComputedStyle(elem).width;
|
|
return newElem;
|
|
}
|
|
|
|
function getBomTableHeaderIndex(elem) {
|
|
const bh = document.getElementById('bomhead');
|
|
const ths = Array.from(bh.querySelectorAll("th"));
|
|
return ths.indexOf(elem);
|
|
}
|
|
|
|
function getColumnOrderName(elem) {
|
|
var cname = elem.getAttribute("col_name");
|
|
if (cname === "bom-checkbox")
|
|
return "checkboxes";
|
|
else
|
|
return cname;
|
|
}
|
|
|
|
function resizableGrid(tablehead) {
|
|
var cols = tablehead.firstElementChild.children;
|
|
var rowWidth = tablehead.offsetWidth;
|
|
|
|
for (var i = 1; i < cols.length; i++) {
|
|
if (cols[i].classList.contains("bom-checkbox"))
|
|
continue;
|
|
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
|
|
}
|
|
|
|
for (var i = 1; i < cols.length - 1; i++) {
|
|
var div = document.createElement('div');
|
|
div.className = "column-width-handle";
|
|
cols[i].appendChild(div);
|
|
setListeners(div);
|
|
}
|
|
|
|
function setListeners(div) {
|
|
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
|
|
|
|
div.addEventListener('mousedown', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
curCol = e.target.parentElement;
|
|
nxtCol = curCol.nextElementSibling;
|
|
startX = e.pageX;
|
|
|
|
var padding = paddingDiff(curCol);
|
|
|
|
rowWidth = curCol.parentElement.offsetWidth;
|
|
curColWidth = curCol.clientWidth - padding;
|
|
nxtColWidth = nxtCol.clientWidth - padding;
|
|
});
|
|
|
|
document.addEventListener('mousemove', function(e) {
|
|
if (startX) {
|
|
var diffX = e.pageX - startX;
|
|
diffX = -Math.min(-diffX, curColWidth - 20);
|
|
diffX = Math.min(diffX, nxtColWidth - 20);
|
|
|
|
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
|
|
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
|
|
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
curCol = undefined;
|
|
nxtCol = undefined;
|
|
startX = undefined;
|
|
nxtColWidth = undefined;
|
|
curColWidth = undefined
|
|
});
|
|
}
|
|
|
|
function paddingDiff(col) {
|
|
|
|
if (getStyleVal(col, 'box-sizing') == 'border-box') {
|
|
return 0;
|
|
}
|
|
|
|
var padLeft = getStyleVal(col, 'padding-left');
|
|
var padRight = getStyleVal(col, 'padding-right');
|
|
return (parseInt(padLeft) + parseInt(padRight));
|
|
|
|
}
|
|
|
|
function getStyleVal(elm, css) {
|
|
return (window.getComputedStyle(elm, null).getPropertyValue(css))
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var markedFootprints = new Set();
|
|
var highlightedFootprints = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
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);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</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>
|