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