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