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