4563 lines
321 KiB
HTML
4563 lines
321 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Interactive BOM for KiCAD</title>
|
|
<style type="text/css">
|
|
:root {
|
|
--pcb-edge-color: black;
|
|
--pad-color: #878787;
|
|
--pad-hole-color: #CCCCCC;
|
|
--pad-color-highlight: #D04040;
|
|
--pad-color-highlight-both: #D0D040;
|
|
--pad-color-highlight-marked: #44a344;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #ffb629;
|
|
--pin1-outline-color-highlight-both: #fcbb39;
|
|
--pin1-outline-color-highlight-marked: #fdbe41;
|
|
--silkscreen-edge-color: #aa4;
|
|
--silkscreen-polygon-color: #4aa;
|
|
--silkscreen-text-color: #4aa;
|
|
--fabrication-edge-color: #907651;
|
|
--fabrication-polygon-color: #907651;
|
|
--fabrication-text-color: #a27c24;
|
|
--track-color: #def5f1;
|
|
--track-color-highlight: #D04040;
|
|
--zone-color: #def5f1;
|
|
--zone-color-highlight: #d0404080;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
margin: 0px;
|
|
height: 100%;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark.topmostdiv {
|
|
--pcb-edge-color: #eee;
|
|
--pad-color: #808080;
|
|
--pin1-outline-color: #ffa800;
|
|
--pin1-outline-color-highlight: #ccff00;
|
|
--track-color: #42524f;
|
|
--zone-color: #42524f;
|
|
background-color: #252c30;
|
|
color: #eee;
|
|
}
|
|
|
|
button {
|
|
background-color: #eee;
|
|
border: 1px solid #888;
|
|
color: black;
|
|
height: 44px;
|
|
width: 44px;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
display: inline-block;
|
|
font-size: 14px;
|
|
font-weight: bolder;
|
|
}
|
|
|
|
.dark button {
|
|
/* This will be inverted */
|
|
background-color: #c3b7b5;
|
|
}
|
|
|
|
button.depressed {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark button.depressed {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
button:focus {
|
|
outline: 0;
|
|
}
|
|
|
|
button#tb-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#lr-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#bom-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-grouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-ungrouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-netlist-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#copy {
|
|
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
|
|
background-position: 6px 6px;
|
|
background-repeat: no-repeat;
|
|
background-size: 26px 26px;
|
|
border-radius: 6px;
|
|
height: 40px;
|
|
width: 40px;
|
|
margin: 10px 5px;
|
|
}
|
|
|
|
button#copy:active {
|
|
box-shadow: inset 0px 0px 5px #6c6c6c;
|
|
}
|
|
|
|
textarea.clipboard-temp {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 2em;
|
|
height: 2em;
|
|
padding: 0;
|
|
border: None;
|
|
outline: None;
|
|
box-shadow: None;
|
|
background: transparent;
|
|
}
|
|
|
|
.left-most-button {
|
|
border-right: 0;
|
|
border-top-left-radius: 6px;
|
|
border-bottom-left-radius: 6px;
|
|
}
|
|
|
|
.middle-button {
|
|
border-right: 0;
|
|
}
|
|
|
|
.right-most-button {
|
|
border-top-right-radius: 6px;
|
|
border-bottom-right-radius: 6px;
|
|
}
|
|
|
|
.button-container {
|
|
font-size: 0;
|
|
margin: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.dark .button-container {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.button-container button {
|
|
background-size: 32px 32px;
|
|
background-position: 5px 5px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
@media print {
|
|
.hideonprint {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
canvas {
|
|
cursor: crosshair;
|
|
}
|
|
|
|
canvas:active {
|
|
cursor: grabbing;
|
|
}
|
|
|
|
.fileinfo {
|
|
width: 100%;
|
|
max-width: 1000px;
|
|
border: none;
|
|
padding: 5px;
|
|
}
|
|
|
|
.fileinfo .title {
|
|
font-size: 20pt;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.fileinfo td {
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
max-width: 1px;
|
|
width: 50%;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.bom {
|
|
border-collapse: collapse;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 10pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
margin-top: 1px;
|
|
position: relative;
|
|
}
|
|
|
|
.bom th,
|
|
.bom td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
.dark .bom th,
|
|
.dark .bom td {
|
|
border: 1px solid #777;
|
|
}
|
|
|
|
.bom th {
|
|
background-color: #CCCCCC;
|
|
background-clip: padding-box;
|
|
}
|
|
|
|
.dark .bom th {
|
|
background-color: #3b4749;
|
|
}
|
|
|
|
.bom tr.highlighted:nth-child(n) {
|
|
background-color: #cfc;
|
|
}
|
|
|
|
.dark .bom tr.highlighted:nth-child(n) {
|
|
background-color: #226022;
|
|
}
|
|
|
|
.bom tr:nth-child(even) {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.dark .bom tr:nth-child(even) {
|
|
background-color: #313b40;
|
|
}
|
|
|
|
.bom tr.checked {
|
|
color: #1cb53d;
|
|
}
|
|
|
|
.dark .bom tr.checked {
|
|
color: #2cce54;
|
|
}
|
|
|
|
.bom tr {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 30px;
|
|
}
|
|
|
|
.bom .value {
|
|
width: 15%;
|
|
}
|
|
|
|
.bom .quantity {
|
|
width: 65px;
|
|
}
|
|
|
|
.bom th .sortmark {
|
|
position: absolute;
|
|
right: 1px;
|
|
top: 1px;
|
|
margin-top: -5px;
|
|
border-width: 5px;
|
|
border-style: solid;
|
|
border-color: transparent transparent #221 transparent;
|
|
transform-origin: 50% 85%;
|
|
transition: opacity 0.2s, transform 0.4s;
|
|
}
|
|
|
|
.dark .bom th .sortmark {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.bom th .sortmark.none {
|
|
opacity: 0;
|
|
}
|
|
|
|
.bom th .sortmark.desc {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.bom th:hover .sortmark.none {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.bom .bom-checkbox {
|
|
width: 30px;
|
|
position: relative;
|
|
user-select: none;
|
|
-moz-user-select: none;
|
|
}
|
|
|
|
.bom .bom-checkbox:before {
|
|
content: "";
|
|
position: absolute;
|
|
border-width: 15px;
|
|
border-style: solid;
|
|
border-color: #51829f transparent transparent transparent;
|
|
visibility: hidden;
|
|
top: -15px;
|
|
}
|
|
|
|
.bom .bom-checkbox:after {
|
|
content: "Double click to set/unset all";
|
|
position: absolute;
|
|
color: white;
|
|
top: -35px;
|
|
left: -26px;
|
|
background: #51829f;
|
|
padding: 5px 15px;
|
|
border-radius: 8px;
|
|
white-space: nowrap;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.bom .bom-checkbox:hover:before,
|
|
.bom .bom-checkbox:hover:after {
|
|
visibility: visible;
|
|
transition: visibility 0.2s linear 1s;
|
|
}
|
|
|
|
.split {
|
|
-webkit-box-sizing: border-box;
|
|
-moz-box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
background-color: inherit;
|
|
}
|
|
|
|
.split.split-horizontal,
|
|
.gutter.gutter-horizontal {
|
|
height: 100%;
|
|
float: left;
|
|
}
|
|
|
|
.gutter {
|
|
background-color: #ddd;
|
|
background-repeat: no-repeat;
|
|
background-position: 50%;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
.dark .gutter {
|
|
background-color: #777;
|
|
}
|
|
|
|
.gutter.gutter-horizontal {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
|
|
cursor: ew-resize;
|
|
width: 5px;
|
|
}
|
|
|
|
.gutter.gutter-vertical {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
|
|
cursor: ns-resize;
|
|
height: 5px;
|
|
}
|
|
|
|
.searchbox {
|
|
float: left;
|
|
height: 40px;
|
|
margin: 10px 5px;
|
|
padding: 12px 32px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 18px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 6px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
|
|
background-position: 10px 10px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.dark .searchbox {
|
|
background-color: #111;
|
|
color: #eee;
|
|
}
|
|
|
|
.searchbox::placeholder {
|
|
color: #ccc;
|
|
}
|
|
|
|
.dark .searchbox::placeholder {
|
|
color: #666;
|
|
}
|
|
|
|
.filter {
|
|
width: calc(60% - 64px);
|
|
}
|
|
|
|
.reflookup {
|
|
width: calc(40% - 10px);
|
|
}
|
|
|
|
input[type=text]:focus {
|
|
background-color: white;
|
|
border: 1px solid #333;
|
|
}
|
|
|
|
.dark input[type=text]:focus {
|
|
background-color: #333;
|
|
border: 1px solid #ccc;
|
|
}
|
|
|
|
mark.highlight {
|
|
background-color: #5050ff;
|
|
color: #fff;
|
|
padding: 2px;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.dark mark.highlight {
|
|
background-color: #76a6da;
|
|
color: #111;
|
|
}
|
|
|
|
.menubtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.statsbtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.iobtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.visbtn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
padding: 15px;
|
|
}
|
|
|
|
#vismenu-content {
|
|
left: 0px;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark .statsbtn,
|
|
.dark .savebtn,
|
|
.dark .menubtn,
|
|
.dark .iobtn,
|
|
.dark .visbtn {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.flexbox {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
}
|
|
|
|
.savebtn {
|
|
background-color: #d6d6d6;
|
|
width: auto;
|
|
height: 30px;
|
|
flex-grow: 1;
|
|
margin: 5px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.savebtn:active {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark .savebtn:active {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
.stats {
|
|
border-collapse: collapse;
|
|
font-size: 12pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
min-width: 450px;
|
|
}
|
|
|
|
.dark .stats td {
|
|
border: 1px solid #bbb;
|
|
}
|
|
|
|
.stats td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
#checkbox-stats div {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
#checkbox-stats .bar {
|
|
background-color: rgba(28, 251, 0, 0.6);
|
|
}
|
|
|
|
.menu {
|
|
position: relative;
|
|
display: inline-block;
|
|
margin: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.menu-content {
|
|
font-size: 12pt !important;
|
|
text-align: left !important;
|
|
font-weight: normal !important;
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
right: 0;
|
|
min-width: 300px;
|
|
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
|
z-index: 100;
|
|
padding: 8px;
|
|
}
|
|
|
|
.dark .menu-content {
|
|
background-color: #111;
|
|
}
|
|
|
|
.menu:hover .menu-content {
|
|
display: block;
|
|
}
|
|
|
|
.menu:hover .menubtn,
|
|
.menu:hover .iobtn,
|
|
.menu:hover .statsbtn {
|
|
background-color: #eee;
|
|
}
|
|
|
|
.menu-label {
|
|
display: inline-block;
|
|
padding: 8px;
|
|
border: 1px solid #ccc;
|
|
border-top: 0;
|
|
width: calc(100% - 18px);
|
|
}
|
|
|
|
.menu-label-top {
|
|
border-top: 1px solid #ccc;
|
|
}
|
|
|
|
.menu-textbox {
|
|
float: left;
|
|
height: 24px;
|
|
margin: 10px 5px;
|
|
padding: 5px 5px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 14px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 4px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
width: calc(100% - 10px);
|
|
}
|
|
|
|
.menu-textbox.invalid,
|
|
.dark .menu-textbox.invalid {
|
|
color: red;
|
|
}
|
|
|
|
.dark .menu-textbox {
|
|
background-color: #222;
|
|
color: #eee;
|
|
}
|
|
|
|
.radio-container {
|
|
margin: 4px;
|
|
}
|
|
|
|
.topmostdiv {
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
#top {
|
|
height: 78px;
|
|
border-bottom: 2px solid black;
|
|
}
|
|
|
|
.dark #top {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#dbg {
|
|
display: block;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #aaa;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #666;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #555;
|
|
}
|
|
|
|
.slider {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
margin: 3px 0;
|
|
padding: 0;
|
|
outline: none;
|
|
opacity: 0.7;
|
|
-webkit-transition: .2s;
|
|
transition: opacity .2s;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider:hover {
|
|
opacity: 1;
|
|
}
|
|
|
|
.slider:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-runnable-track {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
border: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin-top: -4px;
|
|
}
|
|
|
|
.dark .slider::-webkit-slider-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-moz-range-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.slider::-moz-range-track {
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.dark .slider::-moz-range-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-ms-track {
|
|
width: 100%;
|
|
height: 8px;
|
|
border-width: 3px 0;
|
|
background: transparent;
|
|
border-color: transparent;
|
|
color: transparent;
|
|
transition: opacity .2s;
|
|
}
|
|
|
|
.slider::-ms-fill-lower {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-fill-upper {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
|
|
.shameless-plug {
|
|
font-size: 0.8em;
|
|
text-align: center;
|
|
display: block;
|
|
}
|
|
|
|
a {
|
|
color: #0278a4;
|
|
}
|
|
|
|
.dark a {
|
|
color: #00b9fd;
|
|
}
|
|
|
|
#frontcanvas,
|
|
#backcanvas {
|
|
touch-action: none;
|
|
}
|
|
|
|
.placeholder {
|
|
border: 1px dashed #9f9fda !important;
|
|
background-color: #edf2f7 !important;
|
|
}
|
|
|
|
.dragging {
|
|
z-index: 999;
|
|
}
|
|
|
|
.dark .dragging>table>tbody>tr {
|
|
background-color: #252c30;
|
|
}
|
|
|
|
.dark .placeholder {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.column-spacer {
|
|
top: 0;
|
|
left: 0;
|
|
width: calc(100% - 4px);
|
|
position: absolute;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle {
|
|
top: 0;
|
|
right: 0;
|
|
width: 4px;
|
|
position: absolute;
|
|
cursor: col-resize;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle:hover {
|
|
background-color: #4f99bd;
|
|
}
|
|
|
|
.help-link {
|
|
border: 1px solid #0278a4;
|
|
padding-inline: 0.3rem;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.dark .help-link {
|
|
border: 1px solid #00b9fd;
|
|
}
|
|
|
|
.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"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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0EOb/lvGK5Fb3Juty4ubwNvCm+1bplvdW7Ar9ZuIW8ebzRvmC7H8cpJnW79by1vyAGpb0Nv36+Qb1FvAW4Zbp1uFC7Bbt1u2W8NbjlvQlXKSWpv3m/FL28h/W/gb+1uWm9tbuZu4S4WbnNvOq51bl1v8277r91u8G6NbnZvbfIVb9JveW8rblNuwZTTbmtvEG5brzNvLm86b5tuI29bb0puC25jbmVvIa57b3JYeW6VbvlvB25ObzVuQm7eAYNv/m5HbrVvDC/FbmdvJW7nbg1uPW6Jb+Nv/Al7b8luB25Vbq1vvm73brdvaG/yb9NvJ29S6Z1unG5PbxWvz2+qLluUfW+vbzJvGm+tb+EuNW6zb0VuD25bbj9v228Lbs9uu2+hbrxu0m//bylvU26A7s5u625Dbh9urm/Db99vXW77r9hvRK7UbsevQAHCLxYBBG5nr6ouLwi13JDdxG+XronPV69JzupuyAxZLwdvd6+Ub/evoc6/b2DuJy713WVoqO/Nbr2vmO/vbtAu9a+fr8xu1y5VLoNuwm93bhtuHW/Nr7ivLa7/r2dvba6YLlaucG4Xb5JuxawHaXjvy29nLmBuBO4Fb6hvH27yb8duX26Bb/iuu6+ZbqNv8W+g7ztvi29gryjv94n/b+culYUE7zwvm69Cb59uMO8nb5EuFO+PbqDv526Lb2Vvzsk4eI4TDBe07l8vdO9vb2UB9O4zrqwuM2+sbzdvMO5/rlhu225Lr/zuYO9s79HJFPRC73Sv+2/orvvOXO8LLtzvt28k7ulvs28dbszv5O9xbyzvVC7w71mvxK84AGsvx665r4kuoi8Ursjuoc/nPKLoSzWFr2kvaO5JlBkuwu43rqWuci+BLzWFhy+5L0Bu42+qLzrvAukVbj5v+O8i7xQA2i6obrwATG+6LkTuS/Qsbqh44u4xb0Dv92+YbkCvFO8Ab5Tv7a+WLgZunm52b67pZu77b1duyG97ztGUQS4DbmLuvy5274VvPO9M77zuqu8Wrqzu0u5s7wLv7ulrYLrubu/m7iLv7u9p5R7vq26br2LuQO4nbj7uAy587vVv+67ELwev8O/q7nnPeG68AbmuUwda7xsvBgDiLpV9jfCiuHrvOy5Xr/ru168G79hRhu/rrkEvxu4VrybvPW6FLgnvAUHvKDJunO41hKZu1u6frpUuxO8sbpBv4u727sNuku8O73zvju5NL07ury/O7qbuhS+thLwZV+0c71OuseWW76qvmK9e7u1vpO7K72TuiK/M7yNvvu9Zb37utm84774uI4ll73JVWe4V79nuCu5V7mHuTO6bbz7uLO917/VuOO4y7//UknWP5Fnvcu7Z7pnkpm6t7tDupO6CbmTu+y7t7nXvi6+jb09u/u4rrmrmTe6iuM3vqe6V7tCvoe9970ruwO4O78Ovqu8d7+nvv26FL8REo+/d727u8u4e7uPvUy4T7vnvdu9h723v4e6+7kPuMS6ErrEu6u6rLhrvJK74b7mv5K5x7vmvvi+JzOQh5W+o73ru0i7J7+juKe5A+JjvFu5p7uWuRy4z7w3vGe+d/f0YS0vl72PuOe+E77nuwod57sdv+e7L78rug+6PbvVuXG7O7yFuLu+hbqSJO+5n7vjvQe8OLy3uiu6fb4zv3u/L77XvN+7T71TuAu4j73+EvRmB4WfvB24h7lbuoe5e763ur+/X7ivv7e6r7vXuw+4N753ucekP7l/vj+7u70/vou8/70dv3O8v79Xvk+7k7guvK+7Wbn7ugB6hbuIvt0rAH2xQY+7f7wvu/a+L7lfvS+5t73/ub+8g71Lv0B7372euC0Wf7nAePe/N7r3uz+8IHuAfV+5IHzXuKu+QH//vUB5q7mvvyy7r70eueG85rpvuZK+x76eu8e8orgSthQDd5JIul64JzrSvX850rkqv9K7BlMiB666UbpnOx+7cbyGuXDVgIdNEoG9rrmKuGB4brgruzG6vQOmvb+4d7+/uQq52bnQfhQCz8/QeAS8MHtQeOe/1rwzvYAHMH8gfQ+7Wr7QfJB6Kr4hQdq4stcqvB299r/y7Ua9OrjGvLq6xrqdvca6Jrh6vSa96rgmuRq6+rgmvKa7+r3Jv3B8BriweAB7dz8XuQG8l7nwfFrkuBEhu4a/RL/auZa4K78vwwh/RrlqvMa+iADqugodxrn6u4h6er9EvEh4aH96uWh9+r76vSOSpr6av0h48HnDuKB+8H5JvbB677HPDA+8CHhGuwe9Vbioeqh6qLiIerq5xr96vYh5erlYe2h7JruIfUh+ayPoe3B4GHlLvfC94HlmvrB4I7wQemu6b70gPW+6Eb+cJpENGbuRBu+5J7vruey5y7xovmS63rhcv8i9H7ibvJe4Z7/bIbh/8IVhZcB8W7+fvTG9cHzbuee+277/uEB/27pAeMG64HzKvt+4l73fupe8FWBy5+lg/QV/ugR6YHr/vE+4S7rzu/++D77gf0+++HzPvBVhfMNEeAR/oH+uvve/P7ozvWB5/79geN+88H6vuB69r744e0e8a7ojuua5b7sQeL8++LrYNCVg1pGQeOy6fzyRvpG7qb2RvXumG4A6uWO40Hr4ekR5+H/C5aaR/+GeJk28W7kIfVu4X71cul+4hHnEeBe8S7iXPD26ZHs8uVO47b4Af/u+7oLF4yVmNsxDvnB4qHm1uS+7e7qEfBe4NHiDvBh68H8fuQB8LYAUeA+htH4IeUO7Rbh0e1e/97jXvom9dH/Ye0B6d780ed10JWa0eIB4A71yv/R9rbwMf62+DHxAfc29Bbo7v3R+JHifucHmc5slZBR99HtUfEx9gH4ruPO6dH/UfGW+w78MfAB8jHx/vOzL8H4YRCx+mHyqvix4k7ssfUx+hH9MeUB/ub/XuMB6N7lR1zbUR9VUfmx59r1sfDO53bpPvOx6nbqsfMx4jHj0eox5l7q0e2oKbH6Ue7R+A73Ue1+/YHt9u829nHmsf5x4rrz2IOLmVHhweQe5vbkcfjB+gHjsfxx5K73EfTO+3HjMeRe6zH+UeSR6pMcTcGx60dYcfVx8vH6Zv1x+TH9Dvyx9fb9wvux6lb2sfkm/xIj2Rjx5XH8ofvx/Vbjce2B9DH6dujR6JH58ecx8VHtY5MtQ/H3LukO4vHp7vyx8hHq8eKx67HuEeQJ/3HsCeE4wgn2MeKe4mbv0e1x9Q7v8e/e5/Hxtvyu/vH4CfP29InnZvQhCnGyCe4x+wn9Ue8J7gn+keEJ5nHx8e5x+zHkAfe1hjH5ceeJ9tHmCf7R6IHx0eCJ8Anw0e3R9EnlCfxJ7pVfMefR+knmifZJ9/H+Segx8YngPvsW+EnxHvTR77HxnuNJ/fHk8eK2/jHlsfaJ4DH/SeUx8MnkMfjJ53HkSe9x7EnqMeY8s0nocesJ5kn3CeCJ/wn5ye0x+nHtyfTJ+s7s0eK6+8nqyeoJ+1rscfVe6cn4Outx6An4ie2J88nqKfqHJ8nlUe/J50ngKfgp7bH+AfFJ7vHlKeCR57HygfkR5PATKeYp+0nosf7J6THxyf/x6KnptuWJ9Snvzvyp4VHlpBk4sHH7Ke8+94n+Kegp6SnoSewp7v7syeqB75H/JXup+snnTuzx6/HvKfYJ/onycfnR8rH4afLB9GniqfOp8WS6qeqJ4tb2qfdJ7onhqeGJ8Gn1yeHx/Cn3sexp6FL+EdvR98n3qf/J8h7wKeBJ4An4qflJ+rH5CfY246nwEAIeaXHxseap/PHvif7p4Wn28fmp5KnrIfCR6sH8PuwJ7DfLKepp/C7mafoJ7mnuSeWB+IHwSfjp9YntqfQJ44nyGetp/+L08fbJ9HHuqeSx4v7ukfHp6Bn56fdx9entTuOJ7laGk45gSkn7aflW9+n/qeHp6an5ifgZ6QnsGfIp7AnuoUigm4nume1292n+Ge9J8RnhSf8p6WnoifSp5In9KfOZ5E1LGfPx7hnu6eRZ4SnxqeFZ6UnsMeyZ/Zn8yeFxg21HmfsZ5snvqf8Z4KnomfmZ+Sn0mf3J/Jnh/vOZ8aeL6fMJ5un3Kf5Z/mng6fFp8In0KeTp5GniKeNZ4rxS0fJp9intOv9Z+vH9sflZ6en1WfTZ6R7jPwUe/4H7huG+4x7txpRB7a78QflK+7hX758cHuHp/OkhoUHtFGSq+/zmrJcZ5JldQeVG/Y79ifoW7jlROfBIdlnrJvvx9MHgafc65Znk2et+5O74Bv1Z/On/bJWC44xJOefp6lL6kfmB9LHwqeA55JnoOfTp/anl8eBoCywYuffW5ynxbuN26L77EeAZ71HlWfEJ5UnngeWR74Htkf6+/R7oQfMe5krlrueR8Ln4dqSiHDMZOfHq/kHkmVFB/Xr5QfDK50n2nvVG/NL7Qed59WBWKuqJ6cH22eP+8XrjbvZq8yHtmfTR+vni3YS8KBgRyuH5/5n+WeK54Br9Kv557NniGuRh5vnmmf285KHvavbp6fnmqvQgBOr6oeLq8WH5xuiK4SHkmukh+Jr4auth5SHjYfth5prvSA9h7JnhEe8h6RHz+emnkuBAIf4a7KHuKfZh4QXtGv5h5qHyIe6h+urpTu3C+erxIemh9WHnGVca86Hqmvxq5+r3oeCF9GAIhfg57Wn8heddhZNdevdq6CH8efh24iuuYevi4WHqIelh48LvGvmh7WHjBecF4prvBfv4B2Hswe355AXkOfN86Xn4evKy4EHyOe15/hz4v0t5+YL+/nDuJniYnun89J7p4eZG+yL+uud64+HvevNB7Un80f7F5MD6Ge3C+vr88eJ54fr9bvF+8NrnUfp583HiYeyB5AXkheG5/Wn8nJgwLaIHqecZ897oduO56nnh2fAZ9IHyrvWp6GHgue7F5SXt1kjuN5nyAeka+/Hn3vol/gnzuv8l/FnpmvDh44brhv989OHzkem+7RAUju458eqAtDaRKFr2QeHh9771xfxR/cX8+fPh7p7yWfKZ96X6qBldEBHhmeTB81Hl+u0wFVLmpfkZ6Ar+peQZ/hHuufXG98X8Bvpl4GuWZfKR8fn5XuaR4nH3JeGR/xHzZeJZ92Xzmf9l4v3D2ujl//nuBfql5yXmee4e7iXl6fjF7Dn5eeLF9Xns4fMe86gLpfeR8Z7g2TtcA1iJxfHq5cXgbudZ8RAQfu3h8V7mUe857OnpJes4aogDWI5l6gHvKfOe9MHzXOol9eXmJe6l84HhpelO7F7+ue1p/en/ZM0V8CXuiuMl/f7k5fO58JnpGfiZ7yXolerl7Snm5eOJ4nZsFfqV7rrvAesl4Jn2kemV6Nn2JeNl/fnt2fG54rxOy7uV4xH88e6V/j77JehZ4Mno6f1l9ZXsVfkV4pXz9cqV5lXzFf5Z5eXxVfEp6rni5ePl7Vn8lfB5+0GJPVpV7jH2lf8B4M7xWfDp8NXkVfVV6MX2rufl4jnv5f2l4BX+gAgV/37/n0nZAgYCFf+q6hX8nuYV5mOUZfdp4vn/OfJl59X+7Zi1IeXvPuMl7+nzouQR4273Fe368rn2xujV9FX+Jftl537t6ezV7paitAj3jjX9JejB8TXvVeu58NnnueWV9hH4lfCl6jXuIvfV69GXxhtV7ln55fTl5vHt5fr+6zXz5eXV7MXsSuV545HmHOm++xAb1frS8xEM0qZ7ADX0Wu6O97L3YvXh5G72hejAAjX9Vf81/ltCdeeV+CX2aeAF8WX0TvtR7TXpmeq18zXp1eXp4SX01fUJ6ltO4kd0wt+K1fS1/5Xg2ehV8PXx1ea17ZXtGeil/JL8dfTwhnsDFfW1/pXhVeK14fX5Vehe9T7ywfe184b8xe3V8HX8IuUgFHX74vI9AcBKpzqS5SLoNf++5DXobvlgHhXuyel1/GXy+e319dr62J3Vnl0FtfF16xXndewR73XlZf8V9qXlVfn16Qn09fxV5RXuDfngRf2IjefZ6qX9tf/Z8A3lPuEe9dnldfz1+lKfDeaZ8I3m9fYF9/XgVez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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function () {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function () {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function saveBomTable(output) {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
let val = '';
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
val += '✓';
|
|
}
|
|
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
|
|
val += node.firstChild.nodeValue;
|
|
} else {
|
|
val += node.nodeValue;
|
|
}
|
|
}
|
|
if (output == 'csv') {
|
|
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
|
|
if (isNumeric(val)) {
|
|
val = +val; // use number
|
|
} else {
|
|
val = `"${val}"`; // enclosed within double-quote
|
|
}
|
|
}
|
|
text += val;
|
|
if (cell != row.lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
|
|
if (output != 'clipboard') {
|
|
// To file: csv or txt
|
|
var blob = new Blob([text], {
|
|
type: `text/${output}`
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
|
|
} else {
|
|
// To clipboard
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
/* https://stackoverflow.com/a/175787 */
|
|
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function (s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
if (config.fields.includes("Value")) {
|
|
var index = config.fields.indexOf("Value");
|
|
pcbdata.bom["parsedValues"] = {};
|
|
for (var id in pcbdata.bom.fields) {
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
unit = unit[0];
|
|
} else {
|
|
ref = /^([a-z]+)\d+$/i.exec(ref);
|
|
if (ref) {
|
|
ref = ref[1].toLowerCase();
|
|
if (ref == "c") unit = 'f';
|
|
else if (ref == "l") unit = 'h';
|
|
else if (ref == "r" || ref == "rv") unit = 'r';
|
|
else unit = null;
|
|
}
|
|
}
|
|
return unit;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
var unit;
|
|
if (match) {
|
|
val = parseFloat(match[1]);
|
|
if (match[2]) {
|
|
val = val * units.getMultiplier(match[2]);
|
|
}
|
|
unit = inferUnit(match[3], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
match = units.valueAltRegex.exec(val);
|
|
if (match && (match[1] || match[4])) {
|
|
val = parseFloat(match[1] + "." + match[4]);
|
|
if (match[3]) {
|
|
val = val * units.getMultiplier(match[3]);
|
|
}
|
|
unit = inferUnit(match[2], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function (e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function 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;
|
|
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("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 {
|
|
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";
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
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();
|
|
}
|
|
}
|
|
|
|
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.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
if (highlightedNet !== null) {
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
drawFootprints(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer === "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox, flip) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var flip = (layerdict.layer === "B");
|
|
var bbox = applyRotation(pcbdata.edges_bbox, flip);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function modulo(n, mod) {
|
|
return ((n % mod) + mod) % mod;
|
|
}
|
|
|
|
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
|
|
var dx = x - xc;
|
|
var dy = y - yc;
|
|
var r_sq = dx * dx + dy * dy;
|
|
var rmin = Math.max(0, radius - d);
|
|
var rmax = radius + d;
|
|
|
|
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
|
|
return false;
|
|
|
|
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
|
|
var dx1 = xc + radius * Math.cos(angle1) - x;
|
|
var dy1 = yc + radius * Math.sin(angle1) - y;
|
|
if (dx1 * dx1 + dy1 * dy1 <= d * d)
|
|
return true;
|
|
|
|
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
|
|
var dx2 = xc + radius * Math.cos(angle2) - x;
|
|
var dy2 = yc + radius * Math.sin(angle2) - y;
|
|
if (dx2 * dx2 + dy2 * dy2 <= d * d)
|
|
return true;
|
|
|
|
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
|
|
if (angle1 > angle2)
|
|
return (angle >= angle2 || angle <= angle1);
|
|
else
|
|
return (angle >= angle1 && angle <= angle2);
|
|
}
|
|
|
|
function pointWithinPad(x, y, pad) {
|
|
var v = [x - pad.pos[0], y - pad.pos[1]];
|
|
v = rotateVector(v, pad.angle);
|
|
if (pad.offset) {
|
|
v[0] -= pad.offset[0];
|
|
v[1] -= pad.offset[1];
|
|
}
|
|
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
|
|
}
|
|
|
|
function netHitScan(layer, x, y) {
|
|
// Check track segments
|
|
if (settings.renderTracks && pcbdata.tracks) {
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if ('radius' in track) {
|
|
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
} else {
|
|
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var footprint of pcbdata.footprints) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinFootprintBbox(x, y, bbox) {
|
|
var v = [x - bbox.pos[0], y - bbox.pos[1]];
|
|
v = rotateVector(v, bbox.angle);
|
|
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
|
|
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
|
|
}
|
|
|
|
function bboxHitScan(layer, x, y) {
|
|
var result = [];
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var footprint = pcbdata.footprints[i];
|
|
if (footprint.layer == layer) {
|
|
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0 && e.button != 1) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
layerdict.pointerStates[e.pointerId] = {
|
|
distanceTravelled: 0,
|
|
lastX: e.offsetX,
|
|
lastY: e.offsetY,
|
|
downTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
function handleMouseClick(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var x = e.offsetX;
|
|
var y = e.offsetY;
|
|
var t = layerdict.transform;
|
|
var flip = layerdict.layer === "B";
|
|
if (flip) {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
|
|
} else {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
|
|
}
|
|
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
|
|
var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var footprints = bboxHitScan(layerdict.layer, ...v);
|
|
if (footprints.length > 0) {
|
|
footprintsClicked(footprints);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handlePointerLeave(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function resetTransform(layerdict) {
|
|
layerdict.transform.panx = 0;
|
|
layerdict.transform.pany = 0;
|
|
layerdict.transform.zoom = 1;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function handlePointerUp(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (e.button == 2) {
|
|
// Reset pan and zoom on right click.
|
|
resetTransform(layerdict);
|
|
layerdict.anotherPointerTapped = false;
|
|
return;
|
|
}
|
|
|
|
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
|
|
var ptr = layerdict.pointerStates[e.pointerId];
|
|
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
|
|
|
|
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
if (layerdict.anotherPointerTapped) {
|
|
// This is the second pointer coming off of a two-finger tap
|
|
resetTransform(layerdict);
|
|
} else {
|
|
// This is just a regular tap
|
|
handleMouseClick(e, layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
} else {
|
|
// This is the first finger coming off of what could become a two-finger tap
|
|
layerdict.anotherPointerTapped = true;
|
|
}
|
|
} else {
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function handlePointerMove(e, layerdict) {
|
|
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var thisPtr = layerdict.pointerStates[e.pointerId];
|
|
|
|
var dx = e.offsetX - thisPtr.lastX;
|
|
var dy = e.offsetY - thisPtr.lastY;
|
|
|
|
// If this number is low on pointer up, we count the action as a click
|
|
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
|
|
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
// This is a simple drag
|
|
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
|
|
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
|
|
} else if (Object.keys(layerdict.pointerStates).length == 2) {
|
|
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
|
|
|
|
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
|
|
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
|
|
|
|
var scaleFactor = newDist / oldDist;
|
|
|
|
if (scaleFactor != NaN) {
|
|
layerdict.transform.zoom *= scaleFactor;
|
|
|
|
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
|
|
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
|
|
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
|
|
}
|
|
}
|
|
|
|
thisPtr.lastX = e.offsetX;
|
|
thisPtr.lastY = e.offsetY;
|
|
|
|
if (settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
}
|
|
|
|
function handleMouseWheel(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var t = layerdict.transform;
|
|
var wheeldelta = e.deltaY;
|
|
if (e.deltaMode == 1) {
|
|
// FF only, scroll by lines
|
|
wheeldelta *= 30;
|
|
} else if (e.deltaMode == 2) {
|
|
wheeldelta *= 300;
|
|
}
|
|
var m = Math.pow(1.1, -wheeldelta / 40);
|
|
// Limit amount of zoom per tick.
|
|
if (m > 2) {
|
|
m = 2;
|
|
} else if (m < 0.5) {
|
|
m = 0.5;
|
|
}
|
|
t.zoom *= m;
|
|
var zoomd = (1 - m) / t.zoom;
|
|
t.panx += devicePixelRatio * e.offsetX * zoomd;
|
|
t.pany += devicePixelRatio * e.offsetY * zoomd;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function addMouseHandlers(div, layerdict) {
|
|
div.addEventListener("pointerdown", function(e) {
|
|
handlePointerDown(e, layerdict);
|
|
});
|
|
div.addEventListener("pointermove", function(e) {
|
|
handlePointerMove(e, layerdict);
|
|
});
|
|
div.addEventListener("pointerup", function(e) {
|
|
handlePointerUp(e, layerdict);
|
|
});
|
|
var pointerleave = function(e) {
|
|
handlePointerLeave(e, layerdict);
|
|
}
|
|
div.addEventListener("pointercancel", pointerleave);
|
|
div.addEventListener("pointerleave", pointerleave);
|
|
div.addEventListener("pointerout", pointerleave);
|
|
|
|
div.onwheel = function(e) {
|
|
handleMouseWheel(e, layerdict);
|
|
}
|
|
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
|
|
element.addEventListener("contextmenu", function(e) {
|
|
e.preventDefault();
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function setRedrawOnDrag(value) {
|
|
settings.redrawOnDrag = value;
|
|
writeStorage("redrawOnDrag", value);
|
|
}
|
|
|
|
function setBoardRotation(value) {
|
|
settings.boardRotation = value * 5;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
resizeAll();
|
|
}
|
|
|
|
function setOffsetBackRotation(value) {
|
|
settings.offsetBackRotation = value;
|
|
writeStorage("offsetBackRotation", value);
|
|
resizeAll();
|
|
}
|
|
|
|
function initRender() {
|
|
allcanvas = {
|
|
front: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("F_bg"),
|
|
fab: document.getElementById("F_fab"),
|
|
silk: document.getElementById("F_slk"),
|
|
highlight: document.getElementById("F_hl"),
|
|
layer: "F",
|
|
},
|
|
back: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("B_bg"),
|
|
fab: document.getElementById("B_fab"),
|
|
silk: document.getElementById("B_slk"),
|
|
highlight: document.getElementById("B_hl"),
|
|
layer: "B",
|
|
}
|
|
};
|
|
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
|
|
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*
|
|
* Table reordering via Drag'n'Drop
|
|
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
|
|
*/
|
|
|
|
function setBomHandlers() {
|
|
|
|
const bom = document.getElementById('bomtable');
|
|
|
|
let dragName;
|
|
let placeHolderElements;
|
|
let draggingElement;
|
|
let forcePopulation;
|
|
let xOffset;
|
|
let yOffset;
|
|
let wasDragged;
|
|
|
|
const mouseUpHandler = function(e) {
|
|
// Delete dragging element
|
|
draggingElement.remove();
|
|
|
|
// Make BOM selectable again
|
|
bom.style.removeProperty("userSelect");
|
|
|
|
// Remove listeners
|
|
document.removeEventListener('mousemove', mouseMoveHandler);
|
|
document.removeEventListener('mouseup', mouseUpHandler);
|
|
|
|
if (wasDragged) {
|
|
// Redraw whole BOM
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
const mouseMoveHandler = function(e) {
|
|
// Notice the dragging
|
|
wasDragged = true;
|
|
|
|
// Make the dragged element visible
|
|
draggingElement.style.removeProperty("display");
|
|
|
|
// Set elements position to mouse position
|
|
draggingElement.style.left = `${e.screenX - xOffset}px`;
|
|
draggingElement.style.top = `${e.screenY - yOffset}px`;
|
|
|
|
// Forced redrawing of BOM table
|
|
if (forcePopulation) {
|
|
forcePopulation = false;
|
|
// Copy array
|
|
phe = Array.from(placeHolderElements);
|
|
// populate BOM table again
|
|
populateBomHeader(dragName, phe);
|
|
populateBomBody(dragName, phe);
|
|
}
|
|
|
|
// Set up array of hidden columns
|
|
var hiddenColumns = Array.from(settings.hiddenColumns);
|
|
// In the ungrouped mode, quantity don't exist
|
|
if (settings.bommode === "ungrouped")
|
|
hiddenColumns.push("Quantity");
|
|
// If no checkbox fields can be found, we consider them hidden
|
|
if (settings.checkboxes.length == 0)
|
|
hiddenColumns.push("checkboxes");
|
|
|
|
// Get table headers and group them into checkboxes, extrafields and normal headers
|
|
const bh = document.getElementById("bomhead");
|
|
headers = Array.from(bh.querySelectorAll("th"))
|
|
headers.shift() // numCol is not part of the columnOrder
|
|
headerGroups = []
|
|
lastCompoundClass = null;
|
|
for (i = 0; i < settings.columnOrder.length; i++) {
|
|
cElem = settings.columnOrder[i];
|
|
if (hiddenColumns.includes(cElem)) {
|
|
// Hidden columns appear as a dummy element
|
|
headerGroups.push([]);
|
|
continue;
|
|
}
|
|
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
|
|
if (elem.classList.contains("bom-checkbox")) {
|
|
if (lastCompoundClass === "bom-checkbox") {
|
|
cbGroup = headerGroups.pop();
|
|
cbGroup.push(elem);
|
|
headerGroups.push(cbGroup);
|
|
} else {
|
|
lastCompoundClass = "bom-checkbox";
|
|
headerGroups.push([elem])
|
|
}
|
|
} else {
|
|
headerGroups.push([elem])
|
|
}
|
|
}
|
|
|
|
// Copy settings.columnOrder
|
|
var columns = Array.from(settings.columnOrder)
|
|
|
|
// Set up array with indices of hidden columns
|
|
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
|
|
var dragIndex = columns.indexOf(dragName);
|
|
var swapIndex = dragIndex;
|
|
var swapDone = false;
|
|
|
|
// Check if the current dragged element is swapable with the left or right element
|
|
if (dragIndex > 0) {
|
|
// Get left headers boundingbox
|
|
swapIndex = dragIndex - 1;
|
|
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
|
|
swapIndex--;
|
|
if (!hiddenIndices.includes(swapIndex)) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
|
|
// Get right headers boundingbox
|
|
swapIndex = dragIndex + 1;
|
|
while (hiddenIndices.includes(swapIndex))
|
|
swapIndex++;
|
|
if (swapIndex < headerGroups.length) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Write back change to storage
|
|
if (swapDone) {
|
|
settings.columnOrder = columns
|
|
writeStorage("columnOrder", JSON.stringify(columns));
|
|
}
|
|
|
|
}
|
|
|
|
const mouseDownHandler = function(e) {
|
|
var target = e.target;
|
|
if (target.tagName.toLowerCase() != "td")
|
|
target = target.parentElement;
|
|
|
|
// Used to check if a dragging has ever happened
|
|
wasDragged = false;
|
|
|
|
// Create new element which will be displayed as the dragged column
|
|
draggingElement = document.createElement("div")
|
|
draggingElement.classList.add("dragging");
|
|
draggingElement.style.display = "none";
|
|
draggingElement.style.position = "absolute";
|
|
draggingElement.style.overflow = "hidden";
|
|
|
|
// Get bomhead and bombody elements
|
|
const bh = document.getElementById("bomhead");
|
|
const bb = document.getElementById("bombody");
|
|
|
|
// Get all compound headers for the current column
|
|
var compoundHeaders;
|
|
if (target.classList.contains("bom-checkbox")) {
|
|
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
|
|
} else {
|
|
compoundHeaders = [target];
|
|
}
|
|
|
|
// Create new table which will display the column
|
|
var newTable = document.createElement("table");
|
|
newTable.classList.add("bom");
|
|
newTable.style.background = "white";
|
|
draggingElement.append(newTable);
|
|
|
|
// Create new header element
|
|
var newHeader = document.createElement("thead");
|
|
newTable.append(newHeader);
|
|
|
|
// Set up array for storing all placeholder elements
|
|
placeHolderElements = [];
|
|
|
|
// Add all compound headers to the new thead element and placeholders
|
|
compoundHeaders.forEach(function(h) {
|
|
clone = cloneElementWithDimensions(h);
|
|
newHeader.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
|
|
// Create new body element
|
|
var newBody = document.createElement("tbody");
|
|
newTable.append(newBody);
|
|
|
|
// Get indices for compound headers
|
|
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
|
|
|
|
// For each row in the BOM body...
|
|
var rows = bb.querySelectorAll("tr");
|
|
rows.forEach(function(row) {
|
|
// ..get the cells for the compound column
|
|
const tds = row.querySelectorAll("td");
|
|
var copytds = idxs.map(i => tds[i]);
|
|
// Add them to the new element and the placeholders
|
|
var newRow = document.createElement("tr");
|
|
copytds.forEach(function(td) {
|
|
clone = cloneElementWithDimensions(td);
|
|
newRow.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
newBody.append(newRow);
|
|
});
|
|
|
|
// Compute width for compound header
|
|
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
|
|
draggingElement.style.width = `${width}px`;
|
|
|
|
// Insert the new dragging element and disable selection on BOM
|
|
bom.insertBefore(draggingElement, null);
|
|
bom.style.userSelect = "none";
|
|
|
|
// Determine the mouse position offset
|
|
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
|
|
yOffset = e.screenY - compoundHeaders[0].offsetTop;
|
|
|
|
// Get name for the column in settings.columnOrder
|
|
dragName = getColumnOrderName(target);
|
|
|
|
// Change text and class for placeholder elements
|
|
placeHolderElements = placeHolderElements.map(function(e) {
|
|
newElem = cloneElementWithDimensions(e);
|
|
newElem.textContent = "";
|
|
newElem.classList.add("placeholder");
|
|
return newElem;
|
|
});
|
|
|
|
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
|
|
forcePopulation = true;
|
|
|
|
// Add listeners for move and up on mouse
|
|
document.addEventListener('mousemove', mouseMoveHandler);
|
|
document.addEventListener('mouseup', mouseUpHandler);
|
|
}
|
|
|
|
// In netlist mode, there is nothing to reorder
|
|
if (settings.bommode === "netlist")
|
|
return;
|
|
|
|
// Add mouseDownHandler to every column except the numCol
|
|
bom.querySelectorAll("th")
|
|
.forEach(function(head) {
|
|
if (!head.classList.contains("numCol")) {
|
|
head.onmousedown = mouseDownHandler;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function getBoundingClientRectFromMultiple(elements) {
|
|
var elems = Array.from(elements);
|
|
|
|
if (elems.length == 0)
|
|
return null;
|
|
|
|
var box = elems.shift()
|
|
.getBoundingClientRect();
|
|
|
|
elems.forEach(function(elem) {
|
|
var elembox = elem.getBoundingClientRect();
|
|
box.left = Math.min(elembox.left, box.left);
|
|
box.top = Math.min(elembox.top, box.top);
|
|
box.width += elembox.width;
|
|
box.height = Math.max(elembox.height, box.height);
|
|
});
|
|
|
|
return box;
|
|
}
|
|
|
|
function cloneElementWithDimensions(elem) {
|
|
var newElem = elem.cloneNode(true);
|
|
newElem.style.height = window.getComputedStyle(elem).height;
|
|
newElem.style.width = window.getComputedStyle(elem).width;
|
|
return newElem;
|
|
}
|
|
|
|
function getBomTableHeaderIndex(elem) {
|
|
const bh = document.getElementById('bomhead');
|
|
const ths = Array.from(bh.querySelectorAll("th"));
|
|
return ths.indexOf(elem);
|
|
}
|
|
|
|
function getColumnOrderName(elem) {
|
|
var cname = elem.getAttribute("col_name");
|
|
if (cname === "bom-checkbox")
|
|
return "checkboxes";
|
|
else
|
|
return cname;
|
|
}
|
|
|
|
function resizableGrid(tablehead) {
|
|
var cols = tablehead.firstElementChild.children;
|
|
var rowWidth = tablehead.offsetWidth;
|
|
|
|
for (var i = 1; i < cols.length; i++) {
|
|
if (cols[i].classList.contains("bom-checkbox"))
|
|
continue;
|
|
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
|
|
}
|
|
|
|
for (var i = 1; i < cols.length - 1; i++) {
|
|
var div = document.createElement('div');
|
|
div.className = "column-width-handle";
|
|
cols[i].appendChild(div);
|
|
setListeners(div);
|
|
}
|
|
|
|
function setListeners(div) {
|
|
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
|
|
|
|
div.addEventListener('mousedown', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
curCol = e.target.parentElement;
|
|
nxtCol = curCol.nextElementSibling;
|
|
startX = e.pageX;
|
|
|
|
var padding = paddingDiff(curCol);
|
|
|
|
rowWidth = curCol.parentElement.offsetWidth;
|
|
curColWidth = curCol.clientWidth - padding;
|
|
nxtColWidth = nxtCol.clientWidth - padding;
|
|
});
|
|
|
|
document.addEventListener('mousemove', function(e) {
|
|
if (startX) {
|
|
var diffX = e.pageX - startX;
|
|
diffX = -Math.min(-diffX, curColWidth - 20);
|
|
diffX = Math.min(diffX, nxtColWidth - 20);
|
|
|
|
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
|
|
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
|
|
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
curCol = undefined;
|
|
nxtCol = undefined;
|
|
startX = undefined;
|
|
nxtColWidth = undefined;
|
|
curColWidth = undefined
|
|
});
|
|
}
|
|
|
|
function paddingDiff(col) {
|
|
|
|
if (getStyleVal(col, 'box-sizing') == 'border-box') {
|
|
return 0;
|
|
}
|
|
|
|
var padLeft = getStyleVal(col, 'padding-left');
|
|
var padRight = getStyleVal(col, 'padding-right');
|
|
return (parseInt(padLeft) + parseInt(padRight));
|
|
|
|
}
|
|
|
|
function getStyleVal(elm, css) {
|
|
return (window.getComputedStyle(elm, null).getPropertyValue(css))
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var markedFootprints = new Set();
|
|
var highlightedFootprints = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
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 getStoredCheckboxRefs(checkbox) {
|
|
function convert(ref) {
|
|
var intref = parseInt(ref);
|
|
if (isNaN(intref)) {
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.footprints[i].ref == ref) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
} else {
|
|
return intref;
|
|
}
|
|
}
|
|
if (!(checkbox in settings.checkboxStoredRefs)) {
|
|
var val = readStorage("checkbox_" + checkbox);
|
|
settings.checkboxStoredRefs[checkbox] = val ? val : "";
|
|
}
|
|
if (!settings.checkboxStoredRefs[checkbox]) {
|
|
return new Set();
|
|
} else {
|
|
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
|
|
}
|
|
}
|
|
|
|
function getCheckboxState(checkbox, references) {
|
|
var storedRefsSet = getStoredCheckboxRefs(checkbox);
|
|
var currentRefsSet = new Set(references.map(r => r[1]));
|
|
// Get difference of current - stored
|
|
var difference = new Set(currentRefsSet);
|
|
for (ref of storedRefsSet) {
|
|
difference.delete(ref);
|
|
}
|
|
if (difference.size == 0) {
|
|
// All the current refs are stored
|
|
return "checked";
|
|
} else if (difference.size == currentRefsSet.size) {
|
|
// None of the current refs are stored
|
|
return "unchecked";
|
|
} else {
|
|
// Some of the refs are stored
|
|
return "indeterminate";
|
|
}
|
|
}
|
|
|
|
function setBomCheckboxState(checkbox, element, references) {
|
|
var state = getCheckboxState(checkbox, references);
|
|
element.checked = (state == "checked");
|
|
element.indeterminate = (state == "indeterminate");
|
|
}
|
|
|
|
function createCheckboxChangeHandler(checkbox, references, row) {
|
|
return function () {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (this.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.add("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.add(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'checked';
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.remove("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.delete(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'unchecked';
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
|
|
}
|
|
}
|
|
|
|
function clearHighlightedFootprints() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedFootprints = [];
|
|
highlightedNet = null;
|
|
}
|
|
}
|
|
|
|
function createRowHighlightHandler(rowid, refs, net) {
|
|
return function () {
|
|
if (currentHighlightedRowId) {
|
|
if (currentHighlightedRowId == rowid) {
|
|
return;
|
|
}
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
}
|
|
document.getElementById(rowid).classList.add("highlighted");
|
|
currentHighlightedRowId = rowid;
|
|
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
function 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 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] != b[i]) return compareRefs(a[i][0], b[i][0]);
|
|
i++;
|
|
}
|
|
return a.length - b.length;
|
|
}));
|
|
} else if (column === "Value") {
|
|
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
|
|
var ra = a[0][1], rb = b[0][1];
|
|
return valueCompare(
|
|
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
|
|
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
|
|
}));
|
|
return;
|
|
} else if (column === "Footprint") {
|
|
tr.appendChild(createColumnHeader(
|
|
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
|
|
return a.length - b.length;
|
|
}));
|
|
} else {
|
|
// Other fields
|
|
var i = config.fields.indexOf(column);
|
|
if (i < 0)
|
|
return;
|
|
tr.appendChild(createColumnHeader(
|
|
column, `field${i + 1}`, stringFieldCompareClosure(i)));
|
|
}
|
|
});
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
|
|
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
if (settings.bommode == "netlist") {
|
|
bomtable = pcbdata.nets.slice();
|
|
} else {
|
|
switch (settings.canvaslayout) {
|
|
case 'F':
|
|
bomtable = pcbdata.bom.F.slice();
|
|
break;
|
|
case 'FB':
|
|
bomtable = pcbdata.bom.both.slice();
|
|
break;
|
|
case 'B':
|
|
bomtable = pcbdata.bom.B.slice();
|
|
break;
|
|
}
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
expandedTable = []
|
|
for (var bomentry of bomtable) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
bomtable = expandedTable;
|
|
}
|
|
}
|
|
if (bomSortFunction) {
|
|
bomtable = bomtable.sort(bomSortFunction);
|
|
}
|
|
for (var i in bomtable) {
|
|
var bomentry = bomtable[i];
|
|
if (filter && !entryMatches(bomentry)) {
|
|
continue;
|
|
}
|
|
var references = null;
|
|
var netname = null;
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
var rownum = +i + 1;
|
|
tr.id = "bomrow" + rownum;
|
|
td.textContent = rownum;
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "netlist") {
|
|
netname = bomentry;
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(netname ? netname : "<no net>");
|
|
tr.appendChild(td);
|
|
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 = createCheckboxChangeHandler(checkbox, references, tr);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
if (input.checked && settings.markWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
} else if (column === "References") {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = references.length;
|
|
tr.appendChild(td);
|
|
} else {
|
|
// All the other fields
|
|
var field_index = config.fields.indexOf(column)
|
|
if (field_index < 0)
|
|
return;
|
|
var valueSet = new Set();
|
|
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
|
|
td = document.createElement("TD");
|
|
var output = new Array();
|
|
for (let item of valueSet) {
|
|
const visible = highlightFilter(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);
|
|
tr.onmousemove = handler;
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
setBomHandlers();
|
|
resizableGrid(bomhead);
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0,
|
|
fp_b = 0,
|
|
pads_f = 0,
|
|
pads_b = 0,
|
|
pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("bot").style.height = "";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
var chkbxs = document.getElementsByClassName("visibility_checkbox");
|
|
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = true;
|
|
}
|
|
}
|
|
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
|
|
checkbox.checked = !checkbox.checked;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function checkBomCheckbox(bomrowid, checkboxname) {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
|
|
prepCheckboxes();
|
|
populateMarkWhenCheckedOptions();
|
|
setMarkWhenChecked(settings.markWhenChecked);
|
|
}
|
|
|
|
function setMarkWhenChecked(value) {
|
|
writeStorage("markWhenChecked", value);
|
|
settings.markWhenChecked = value;
|
|
markedFootprints.clear();
|
|
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
|
|
markedFootprints.add(ref);
|
|
}
|
|
populateBomTable();
|
|
drawHighlights();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateMarkWhenCheckedOptions() {
|
|
var container = document.getElementById("markWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "markWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "markWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setMarkWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.markWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
function constrain(number, min, max){
|
|
return Math.min(Math.max(parseInt(number), min), max);
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowLeft":
|
|
case "ArrowRight":
|
|
if (document.activeElement.type != "text"){
|
|
e.preventDefault();
|
|
let boardRotationElement = document.getElementById("boardRotation")
|
|
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
|
|
if (e.key == "ArrowLeft"){
|
|
settings.boardRotation += 3; // 15 degrees
|
|
}
|
|
else{
|
|
settings.boardRotation -= 3;
|
|
}
|
|
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
|
|
boardRotationElement.value = settings.boardRotation
|
|
setBoardRotation(settings.boardRotation);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initUtils();
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div style="float: right; height: 100%;">
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="menubtn"></button>
|
|
<div class="menu-content">
|
|
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
|
|
Full Screen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
|
|
Fab layer
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
|
|
Silkscreen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
|
|
References
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
|
|
Values
|
|
</label>
|
|
<div id="tracksAndZonesCheckboxes">
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
|
|
Tracks
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
|
|
Zones
|
|
</label>
|
|
</div>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Pads
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
|
|
title="Front only">F
|
|
</button>
|
|
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
|
|
title="Front and Back">FB
|
|
</button>
|
|
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
|
|
title="Back only">B
|
|
</button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
|
|
title="BOM only"></button>
|
|
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
|
|
title="BOM left, drawings right"></button>
|
|
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
|
|
title="BOM top, drawings bot"></button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
|
|
title="Grouped BOM"></button>
|
|
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
|
|
title="Ungrouped BOM"></button>
|
|
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
|
|
title="Netlist"></button>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="statsbtn"></button>
|
|
<div class="menu-content">
|
|
<table class="stats">
|
|
<tbody>
|
|
<tr>
|
|
<td width="40%">Board stats</td>
|
|
<td>Front</td>
|
|
<td>Back</td>
|
|
<td>Total</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Components</td>
|
|
<td id="stats-components-front">~</td>
|
|
<td id="stats-components-back">~</td>
|
|
<td id="stats-components-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Groups</td>
|
|
<td id="stats-groups-front">~</td>
|
|
<td id="stats-groups-back">~</td>
|
|
<td id="stats-groups-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>SMD pads</td>
|
|
<td id="stats-smd-pads-front">~</td>
|
|
<td id="stats-smd-pads-back">~</td>
|
|
<td id="stats-smd-pads-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>TH pads</td>
|
|
<td colspan=3 id="stats-th-pads">~</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="stats">
|
|
<col width="40%"/><col />
|
|
<tbody id="checkbox-stats">
|
|
<tr>
|
|
<td colspan=2 style="border-top: 0">Checkboxes</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="iobtn"></button>
|
|
<div class="menu-content">
|
|
<div class="menu-label menu-label-top">
|
|
<div style="margin-left: 5px;">Save board image</div>
|
|
<div class="flexbox">
|
|
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
<span>X</span>
|
|
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
</div>
|
|
<label>
|
|
<input id="render-save-transparent" type="checkbox">
|
|
Transparent background
|
|
</label>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveImage('F')">Front</button>
|
|
<button class="savebtn" onclick="saveImage('B')">Back</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Config and checkbox state</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveSettings()">Export</button>
|
|
<button class="savebtn" onclick="loadSettings()">Import</button>
|
|
<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 id="fileinfodiv" style="overflow: auto;">
|
|
<table class="fileinfo">
|
|
<tbody>
|
|
<tr>
|
|
<td id="title" class="title" style="width: 70%">
|
|
Title
|
|
</td>
|
|
<td id="revision" class="title" style="width: 30%">
|
|
Revision
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="company">
|
|
Company
|
|
</td>
|
|
<td id="filedate">
|
|
Date
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<div id="bomdiv" class="split split-horizontal">
|
|
<div style="width: 100%">
|
|
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
|
|
oninput="updateRefLookup(this.value)">
|
|
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
|
|
oninput="updateFilter(this.value)">
|
|
<div class="button-container hideonprint" style="float: left; margin: 0;">
|
|
<button id="copy" title="Copy bom table to clipboard"
|
|
onclick="saveBomTable('clipboard')"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom" id="bomtable">
|
|
<thead id="bomhead">
|
|
</thead>
|
|
<tbody id="bombody">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="canvasdiv" class="split split-horizontal">
|
|
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|