mirror of
https://github.com/Alex-2-Graf/Leningrad2-BDI-TR-DOS.git
synced 2026-04-16 12:34:21 +03:00
4720 lines
357 KiB
HTML
4720 lines
357 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, "fields": ["Value", "Footprint"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function () {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function () {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function saveBomTable(output) {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
var name = node.firstChild.nodeValue ?? "";
|
|
text += (output == 'csv' ? `"${name}"` : name);
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
let val = '';
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
val += '✓';
|
|
}
|
|
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
|
|
val += node.firstChild.nodeValue;
|
|
} else {
|
|
val += node.nodeValue;
|
|
}
|
|
}
|
|
if (output == 'csv') {
|
|
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
|
|
if (isNumeric(val)) {
|
|
val = +val; // use number
|
|
} else {
|
|
val = `"${val}"`; // enclosed within double-quote
|
|
}
|
|
}
|
|
text += val;
|
|
if (cell != row.lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
|
|
if (output != 'clipboard') {
|
|
// To file: csv or txt
|
|
var blob = new Blob([text], {
|
|
type: `text/${output}`
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
|
|
} else {
|
|
// To clipboard
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
/* https://stackoverflow.com/a/175787 */
|
|
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function (s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
valueAltRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
if (config.fields.includes("Value")) {
|
|
var index = config.fields.indexOf("Value");
|
|
pcbdata.bom["parsedValues"] = {};
|
|
var allList = getBomListByLayer('FB').flat();
|
|
for (var id in pcbdata.bom.fields) {
|
|
var ref_key = allList.find(item => item[1] == Number(id)) || [];
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index], ref_key[0] || '');
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
return unit[0];
|
|
}
|
|
|
|
var resarr = /^([a-z]+)\d+$/i.exec(ref);
|
|
switch (Array.isArray(resarr) && resarr[1].toLowerCase()) {
|
|
case "c": return 'f';
|
|
case "l": return 'h';
|
|
case "r":
|
|
case "rv": return 'r';
|
|
}
|
|
return null;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
if (Array.isArray(match)) {
|
|
var unit = inferUnit(match[3], ref);
|
|
var val_i = parseFloat(match[1]);
|
|
if (!unit) return null;
|
|
if (match[2]) {
|
|
val_i = val_i * units.getMultiplier(match[2]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
|
|
match = units.valueAltRegex.exec(val);
|
|
if (Array.isArray(match) && (match[1] || match[4])) {
|
|
var unit = inferUnit(match[2], ref);
|
|
var val_i = parseFloat(match[1] + "." + match[4]);
|
|
if (!unit) return null;
|
|
if (match[3]) {
|
|
val_i = val_i * units.getMultiplier(match[3]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function (e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function resetSettings() {
|
|
if (!confirm(
|
|
`This will reset all checkbox states and other settings.\n\n` +
|
|
`Press OK if you want to continue.`)) {
|
|
return;
|
|
}
|
|
if (storage) {
|
|
var keys = [];
|
|
for (var i = 0; i < storage.length; i++) {
|
|
var key = storage.key(i);
|
|
if (key.startsWith(storagePrefix)) keys.push(key);
|
|
}
|
|
for (var key of keys) storage.removeItem(key);
|
|
}
|
|
location.reload();
|
|
}
|
|
|
|
function overwriteSettings(newSettings) {
|
|
initDone = false;
|
|
Object.assign(settings, newSettings);
|
|
writeStorage("bomlayout", settings.bomlayout);
|
|
writeStorage("bommode", settings.bommode);
|
|
writeStorage("canvaslayout", settings.canvaslayout);
|
|
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
|
|
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
|
|
for (var checkbox of settings.checkboxes) {
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
}
|
|
writeStorage("markWhenChecked", settings.markWhenChecked);
|
|
padsVisible(settings.renderPads);
|
|
document.getElementById("padsCheckbox").checked = settings.renderPads;
|
|
fabricationVisible(settings.renderFabrication);
|
|
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
|
|
silkscreenVisible(settings.renderSilkscreen);
|
|
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
|
|
referencesVisible(settings.renderReferences);
|
|
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
|
|
valuesVisible(settings.renderValues);
|
|
document.getElementById("valuesCheckbox").checked = settings.renderValues;
|
|
tracksVisible(settings.renderTracks);
|
|
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
|
|
zonesVisible(settings.renderZones);
|
|
document.getElementById("zonesCheckbox").checked = settings.renderZones;
|
|
dnpOutline(settings.renderDnpOutline);
|
|
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
|
|
setRedrawOnDrag(settings.redrawOnDrag);
|
|
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
|
|
setHighlightRowOnClick(settings.highlightRowOnClick);
|
|
document.getElementById("highlightRowOnClickCheckbox").checked = settings.highlightRowOnClick;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
setOffsetBackRotation(settings.offsetBackRotation);
|
|
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
function saveFile(filename, blob) {
|
|
var link = document.createElement("a");
|
|
var objurl = URL.createObjectURL(blob);
|
|
link.download = filename;
|
|
link.href = objurl;
|
|
link.click();
|
|
}
|
|
|
|
function dataURLtoBlob(dataurl) {
|
|
var arr = dataurl.split(','),
|
|
mime = arr[0].match(/:(.*?);/)[1],
|
|
bstr = atob(arr[1]),
|
|
n = bstr.length,
|
|
u8arr = new Uint8Array(n);
|
|
while (n--) {
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new Blob([u8arr], {
|
|
type: mime
|
|
});
|
|
}
|
|
|
|
var settings = {
|
|
canvaslayout: "FB",
|
|
bomlayout: "left-right",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: "none",
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
offsetBackRotation: false,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
netColors: {},
|
|
}
|
|
|
|
function initDefaults() {
|
|
settings.bomlayout = readStorage("bomlayout");
|
|
if (settings.bomlayout === null) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
settings.bommode = readStorage("bommode");
|
|
if (settings.bommode === null) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (settings.bommode == "netlist" && !pcbdata.nets) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
settings.canvaslayout = readStorage("canvaslayout");
|
|
if (settings.canvaslayout === null) {
|
|
settings.canvaslayout = config.layer_view;
|
|
}
|
|
var bomCheckboxes = readStorage("bomCheckboxes");
|
|
if (bomCheckboxes === null) {
|
|
bomCheckboxes = config.checkboxes;
|
|
}
|
|
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
|
|
document.getElementById("bomCheckboxes").value = bomCheckboxes;
|
|
|
|
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
|
|
if (highlightpin1 === "false") highlightpin1 = "none";
|
|
if (highlightpin1 === "true") highlightpin1 = "all";
|
|
setHighlightPin1(highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
|
|
|
|
settings.markWhenChecked = readStorage("markWhenChecked") || "";
|
|
populateMarkWhenCheckedOptions();
|
|
|
|
function initBooleanSetting(storageString, def, elementId, func) {
|
|
var b = readStorage(storageString);
|
|
if (b === null) {
|
|
b = def;
|
|
} else {
|
|
b = (b == "true");
|
|
}
|
|
document.getElementById(elementId).checked = b;
|
|
func(b);
|
|
}
|
|
|
|
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
|
|
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
|
|
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
|
|
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
|
|
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
|
|
if ("tracks" in pcbdata) {
|
|
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
|
|
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
|
|
} else {
|
|
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
|
|
tracksVisible(false);
|
|
zonesVisible(false);
|
|
}
|
|
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
|
|
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
|
|
initBooleanSetting("highlightRowOnClick", false, "highlightRowOnClickCheckbox", setHighlightRowOnClick);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
|
|
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
|
|
var hcols = JSON.parse(readStorage("hiddenColumns"));
|
|
if (hcols === null) {
|
|
hcols = [];
|
|
}
|
|
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
|
|
|
|
var cord = JSON.parse(readStorage("columnOrder"));
|
|
if (cord === null) {
|
|
cord = fields;
|
|
} else {
|
|
cord = cord.filter(e => fields.includes(e));
|
|
if (cord.length != fields.length)
|
|
cord = fields;
|
|
}
|
|
settings.columnOrder = cord;
|
|
|
|
settings.boardRotation = readStorage("boardRotation");
|
|
if (settings.boardRotation === null) {
|
|
settings.boardRotation = config.board_rotation * 5;
|
|
} else {
|
|
settings.boardRotation = parseInt(settings.boardRotation);
|
|
}
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
|
|
|
|
settings.netColors = JSON.parse(readStorage("netColors")) || {};
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function () {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function (eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function (eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for (callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawText(ctx, text, color) {
|
|
if ("ref" in text && !settings.renderReferences) return;
|
|
if ("val" in text && !settings.renderValues) return;
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.lineWidth = text.thickness;
|
|
if ("svgpath" in text) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
if ("polygons" in text) {
|
|
ctx.fill(getPolygonsPath(text));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (config.kicad_text_formatting) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
offsety += interline;
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
if ("svgpath" in edge) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
if (edge.type == "rect") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(edge.start[0], edge.end[1]);
|
|
ctx.lineTo(...edge.end);
|
|
ctx.lineTo(edge.end[0], edge.start[1]);
|
|
ctx.lineTo(...edge.start);
|
|
}
|
|
if (edge.type == "arc") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
deg2rad(edge.startangle),
|
|
deg2rad(edge.endangle));
|
|
}
|
|
if (edge.type == "circle") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
0, 2 * Math.PI);
|
|
ctx.closePath();
|
|
}
|
|
if (edge.type == "curve") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
|
|
}
|
|
if("filled" in edge && edge.filled)
|
|
ctx.fill();
|
|
else
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
|
|
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
|
|
var path = new Path2D();
|
|
var width = size[0];
|
|
var height = size[1];
|
|
var x = width * -0.5;
|
|
var y = height * -0.5;
|
|
var chamfOffset = Math.min(width, height) * chamfratio;
|
|
path.moveTo(x, 0);
|
|
if (chamfpos & 4) {
|
|
path.lineTo(x, y + height - chamfOffset);
|
|
path.lineTo(x + chamfOffset, y + height);
|
|
path.lineTo(0, y + height);
|
|
} else {
|
|
path.arcTo(x, y + height, x + width, y + height, radius);
|
|
}
|
|
if (chamfpos & 8) {
|
|
path.lineTo(x + width - chamfOffset, y + height);
|
|
path.lineTo(x + width, y + height - chamfOffset);
|
|
path.lineTo(x + width, 0);
|
|
} else {
|
|
path.arcTo(x + width, y + height, x + width, y, radius);
|
|
}
|
|
if (chamfpos & 2) {
|
|
path.lineTo(x + width, y + chamfOffset);
|
|
path.lineTo(x + width - chamfOffset, y);
|
|
path.lineTo(0, y);
|
|
} else {
|
|
path.arcTo(x + width, y, x, y, radius);
|
|
}
|
|
if (chamfpos & 1) {
|
|
path.lineTo(x + chamfOffset, y);
|
|
path.lineTo(x, y + chamfOffset);
|
|
path.lineTo(x, 0);
|
|
} else {
|
|
path.arcTo(x, y, x, y + height, radius);
|
|
}
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getOblongPath(size) {
|
|
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
|
|
}
|
|
|
|
function getPolygonsPath(shape) {
|
|
if (shape.path2d) {
|
|
return shape.path2d;
|
|
}
|
|
if ("svgpath" in shape) {
|
|
shape.path2d = new Path2D(shape.svgpath);
|
|
} else {
|
|
var path = new Path2D();
|
|
for (var polygon of shape.polygons) {
|
|
path.moveTo(...polygon[0]);
|
|
for (var i = 1; i < polygon.length; i++) {
|
|
path.lineTo(...polygon[i]);
|
|
}
|
|
path.closePath();
|
|
}
|
|
shape.path2d = path;
|
|
}
|
|
return shape.path2d;
|
|
}
|
|
|
|
function drawPolygonShape(ctx, scalefactor, shape, color) {
|
|
ctx.save();
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
if("filled" in shape && !shape.filled) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.stroke(getPolygonsPath(shape));
|
|
} else {
|
|
ctx.fillStyle = color;
|
|
ctx.fill(getPolygonsPath(shape));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, drawing, color);
|
|
} else {
|
|
drawText(ctx, drawing, color);
|
|
}
|
|
}
|
|
|
|
function getCirclePath(radius) {
|
|
var path = new Path2D();
|
|
path.arc(0, 0, radius, 0, 2 * Math.PI);
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getCachedPadPath(pad) {
|
|
if (!pad.path2d) {
|
|
// if path2d is not set, build one and cache it on pad object
|
|
if (pad.shape == "rect") {
|
|
pad.path2d = new Path2D();
|
|
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
|
|
} else if (pad.shape == "oval") {
|
|
pad.path2d = getOblongPath(pad.size);
|
|
} else if (pad.shape == "circle") {
|
|
pad.path2d = getCirclePath(pad.size[0] / 2);
|
|
} else if (pad.shape == "roundrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
|
|
} else if (pad.shape == "chamfrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
|
|
} else if (pad.shape == "custom") {
|
|
pad.path2d = getPolygonsPath(pad);
|
|
}
|
|
}
|
|
return pad.path2d;
|
|
}
|
|
|
|
function drawPad(ctx, pad, color, outline) {
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
if (pad.offset) {
|
|
ctx.translate(...pad.offset);
|
|
}
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
var path = getCachedPadPath(pad);
|
|
if (outline) {
|
|
ctx.stroke(path);
|
|
} else {
|
|
ctx.fill(path);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawPadHole(ctx, pad, padHoleColor) {
|
|
if (pad.type != "th") return;
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
ctx.fillStyle = padHoleColor;
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else if (pad.drillshape == "rect") {
|
|
ctx.fill(getChamferedRectPath(pad.drillsize, 0, 0, 0));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (footprint.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...footprint.bbox.pos);
|
|
ctx.rotate(deg2rad(-footprint.bbox.angle));
|
|
ctx.translate(...footprint.bbox.relpos);
|
|
ctx.fillStyle = colors.pad;
|
|
ctx.fillRect(0, 0, ...footprint.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = colors.pad;
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
ctx.strokeRect(0, 0, ...footprint.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of footprint.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
|
|
}
|
|
}
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, colors.pad, outline);
|
|
if (pad.pin1 &&
|
|
(settings.highlightpin1 == "all" ||
|
|
settings.highlightpin1 == "selected" && highlight)) {
|
|
drawPad(ctx, pad, colors.outline, true);
|
|
}
|
|
}
|
|
}
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, colors.padHole);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawDrawing(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawFootprints(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
|
|
var colors = {
|
|
pad: style.getPropertyValue('--pad-color'),
|
|
padHole: style.getPropertyValue('--pad-hole-color'),
|
|
outline: style.getPropertyValue('--pin1-outline-color'),
|
|
}
|
|
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var mod = pcbdata.footprints[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
var h = highlightedFootprints.includes(i);
|
|
var d = markedFootprints.has(i);
|
|
if (highlight) {
|
|
if(h && d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
|
|
} else if (h) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
} else if (d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
|
|
}
|
|
}
|
|
if( h || d || !highlight) {
|
|
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata.drawings[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, d, polygonColor);
|
|
} else {
|
|
drawText(ctx, d, textColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawTracks(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineCap = "round";
|
|
|
|
var hasHole = (track) => (
|
|
'drillsize' in track &&
|
|
track.start[0] == track.end[0] &&
|
|
track.start[1] == track.end[1]);
|
|
|
|
// First draw tracks and tented vias
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (!hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
if ('radius' in track) {
|
|
ctx.arc(
|
|
...track.center,
|
|
track.radius,
|
|
deg2rad(track.startangle),
|
|
deg2rad(track.endangle));
|
|
} else {
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
// Second pass to draw untented vias
|
|
var style = getComputedStyle(topmostdiv);
|
|
var holeColor = style.getPropertyValue('--pad-hole-color')
|
|
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
ctx.strokeStyle = holeColor;
|
|
ctx.lineWidth = track.drillsize;
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
|
|
if (zone.width > 0) {
|
|
ctx.lineWidth = zone.width;
|
|
ctx.stroke(zone.path2d);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clearCanvas(canvas, color = null) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
if (color) {
|
|
ctx.fillStyle = color;
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
} else {
|
|
if (!window.matchMedia("print").matches)
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
if (highlightedNet !== null) {
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
drawFootprints(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer === "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox, flip) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var flip = (layerdict.layer === "B");
|
|
var bbox = applyRotation(pcbdata.edges_bbox, flip);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function modulo(n, mod) {
|
|
return ((n % mod) + mod) % mod;
|
|
}
|
|
|
|
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
|
|
var dx = x - xc;
|
|
var dy = y - yc;
|
|
var r_sq = dx * dx + dy * dy;
|
|
var rmin = Math.max(0, radius - d);
|
|
var rmax = radius + d;
|
|
|
|
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
|
|
return false;
|
|
|
|
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
|
|
var dx1 = xc + radius * Math.cos(angle1) - x;
|
|
var dy1 = yc + radius * Math.sin(angle1) - y;
|
|
if (dx1 * dx1 + dy1 * dy1 <= d * d)
|
|
return true;
|
|
|
|
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
|
|
var dx2 = xc + radius * Math.cos(angle2) - x;
|
|
var dy2 = yc + radius * Math.sin(angle2) - y;
|
|
if (dx2 * dx2 + dy2 * dy2 <= d * d)
|
|
return true;
|
|
|
|
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
|
|
if (angle1 > angle2)
|
|
return (angle >= angle2 || angle <= angle1);
|
|
else
|
|
return (angle >= angle1 && angle <= angle2);
|
|
}
|
|
|
|
function pointWithinPad(x, y, pad) {
|
|
var v = [x - pad.pos[0], y - pad.pos[1]];
|
|
v = rotateVector(v, pad.angle);
|
|
if (pad.offset) {
|
|
v[0] -= pad.offset[0];
|
|
v[1] -= pad.offset[1];
|
|
}
|
|
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
|
|
}
|
|
|
|
function netHitScan(layer, x, y) {
|
|
// Check track segments
|
|
if (settings.renderTracks && pcbdata.tracks) {
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if ('radius' in track) {
|
|
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
} else {
|
|
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var footprint of pcbdata.footprints) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinFootprintBbox(x, y, bbox) {
|
|
var v = [x - bbox.pos[0], y - bbox.pos[1]];
|
|
v = rotateVector(v, bbox.angle);
|
|
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
|
|
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
|
|
}
|
|
|
|
function bboxHitScan(layer, x, y) {
|
|
var result = [];
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var footprint = pcbdata.footprints[i];
|
|
if (footprint.layer == layer) {
|
|
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0 && e.button != 1) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
layerdict.pointerStates[e.pointerId] = {
|
|
distanceTravelled: 0,
|
|
lastX: e.offsetX,
|
|
lastY: e.offsetY,
|
|
downTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
function handleMouseClick(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var x = e.offsetX;
|
|
var y = e.offsetY;
|
|
var t = layerdict.transform;
|
|
var flip = layerdict.layer === "B";
|
|
if (flip) {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
|
|
} else {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
|
|
}
|
|
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
|
|
var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var footprints = bboxHitScan(layerdict.layer, ...v);
|
|
if (footprints.length > 0) {
|
|
footprintsClicked(footprints);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handlePointerLeave(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function resetTransform(layerdict) {
|
|
layerdict.transform.panx = 0;
|
|
layerdict.transform.pany = 0;
|
|
layerdict.transform.zoom = 1;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function handlePointerUp(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (e.button == 2) {
|
|
// Reset pan and zoom on right click.
|
|
resetTransform(layerdict);
|
|
layerdict.anotherPointerTapped = false;
|
|
return;
|
|
}
|
|
|
|
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
|
|
var ptr = layerdict.pointerStates[e.pointerId];
|
|
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
|
|
|
|
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
if (layerdict.anotherPointerTapped) {
|
|
// This is the second pointer coming off of a two-finger tap
|
|
resetTransform(layerdict);
|
|
} else {
|
|
// This is just a regular tap
|
|
handleMouseClick(e, layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
} else {
|
|
// This is the first finger coming off of what could become a two-finger tap
|
|
layerdict.anotherPointerTapped = true;
|
|
}
|
|
} else {
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function handlePointerMove(e, layerdict) {
|
|
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var thisPtr = layerdict.pointerStates[e.pointerId];
|
|
|
|
var dx = e.offsetX - thisPtr.lastX;
|
|
var dy = e.offsetY - thisPtr.lastY;
|
|
|
|
// If this number is low on pointer up, we count the action as a click
|
|
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
|
|
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
// This is a simple drag
|
|
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
|
|
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
|
|
} else if (Object.keys(layerdict.pointerStates).length == 2) {
|
|
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
|
|
|
|
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
|
|
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
|
|
|
|
var scaleFactor = newDist / oldDist;
|
|
|
|
if (scaleFactor != NaN) {
|
|
layerdict.transform.zoom *= scaleFactor;
|
|
|
|
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
|
|
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
|
|
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
|
|
}
|
|
}
|
|
|
|
thisPtr.lastX = e.offsetX;
|
|
thisPtr.lastY = e.offsetY;
|
|
|
|
if (settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
}
|
|
|
|
function handleMouseWheel(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var t = layerdict.transform;
|
|
var wheeldelta = e.deltaY;
|
|
if (e.deltaMode == 1) {
|
|
// FF only, scroll by lines
|
|
wheeldelta *= 30;
|
|
} else if (e.deltaMode == 2) {
|
|
wheeldelta *= 300;
|
|
}
|
|
var m = Math.pow(1.1, -wheeldelta / 40);
|
|
// Limit amount of zoom per tick.
|
|
if (m > 2) {
|
|
m = 2;
|
|
} else if (m < 0.5) {
|
|
m = 0.5;
|
|
}
|
|
t.zoom *= m;
|
|
var zoomd = (1 - m) / t.zoom;
|
|
t.panx += devicePixelRatio * e.offsetX * zoomd;
|
|
t.pany += devicePixelRatio * e.offsetY * zoomd;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function addMouseHandlers(div, layerdict) {
|
|
div.addEventListener("pointerdown", function(e) {
|
|
handlePointerDown(e, layerdict);
|
|
});
|
|
div.addEventListener("pointermove", function(e) {
|
|
handlePointerMove(e, layerdict);
|
|
});
|
|
div.addEventListener("pointerup", function(e) {
|
|
handlePointerUp(e, layerdict);
|
|
});
|
|
var pointerleave = function(e) {
|
|
handlePointerLeave(e, layerdict);
|
|
}
|
|
div.addEventListener("pointercancel", pointerleave);
|
|
div.addEventListener("pointerleave", pointerleave);
|
|
div.addEventListener("pointerout", pointerleave);
|
|
|
|
div.onwheel = function(e) {
|
|
handleMouseWheel(e, layerdict);
|
|
}
|
|
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
|
|
element.addEventListener("contextmenu", function(e) {
|
|
e.preventDefault();
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function setRedrawOnDrag(value) {
|
|
settings.redrawOnDrag = value;
|
|
writeStorage("redrawOnDrag", value);
|
|
}
|
|
|
|
function setBoardRotation(value) {
|
|
settings.boardRotation = value * 5;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
resizeAll();
|
|
}
|
|
|
|
function setOffsetBackRotation(value) {
|
|
settings.offsetBackRotation = value;
|
|
writeStorage("offsetBackRotation", value);
|
|
resizeAll();
|
|
}
|
|
|
|
function initRender() {
|
|
allcanvas = {
|
|
front: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("F_bg"),
|
|
fab: document.getElementById("F_fab"),
|
|
silk: document.getElementById("F_slk"),
|
|
highlight: document.getElementById("F_hl"),
|
|
layer: "F",
|
|
},
|
|
back: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("B_bg"),
|
|
fab: document.getElementById("B_fab"),
|
|
silk: document.getElementById("B_slk"),
|
|
highlight: document.getElementById("B_hl"),
|
|
layer: "B",
|
|
}
|
|
};
|
|
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
|
|
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*
|
|
* Table reordering via Drag'n'Drop
|
|
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
|
|
*/
|
|
|
|
function setBomHandlers() {
|
|
|
|
const bom = document.getElementById('bomtable');
|
|
|
|
let dragName;
|
|
let placeHolderElements;
|
|
let draggingElement;
|
|
let forcePopulation;
|
|
let xOffset;
|
|
let yOffset;
|
|
let wasDragged;
|
|
|
|
const mouseUpHandler = function(e) {
|
|
// Delete dragging element
|
|
draggingElement.remove();
|
|
|
|
// Make BOM selectable again
|
|
bom.style.removeProperty("userSelect");
|
|
|
|
// Remove listeners
|
|
document.removeEventListener('mousemove', mouseMoveHandler);
|
|
document.removeEventListener('mouseup', mouseUpHandler);
|
|
|
|
if (wasDragged) {
|
|
// Redraw whole BOM
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
const mouseMoveHandler = function(e) {
|
|
// Notice the dragging
|
|
wasDragged = true;
|
|
|
|
// Make the dragged element visible
|
|
draggingElement.style.removeProperty("display");
|
|
|
|
// Set elements position to mouse position
|
|
draggingElement.style.left = `${e.screenX - xOffset}px`;
|
|
draggingElement.style.top = `${e.screenY - yOffset}px`;
|
|
|
|
// Forced redrawing of BOM table
|
|
if (forcePopulation) {
|
|
forcePopulation = false;
|
|
// Copy array
|
|
phe = Array.from(placeHolderElements);
|
|
// populate BOM table again
|
|
populateBomHeader(dragName, phe);
|
|
populateBomBody(dragName, phe);
|
|
}
|
|
|
|
// Set up array of hidden columns
|
|
var hiddenColumns = Array.from(settings.hiddenColumns);
|
|
// In the ungrouped mode, quantity don't exist
|
|
if (settings.bommode === "ungrouped")
|
|
hiddenColumns.push("Quantity");
|
|
// If no checkbox fields can be found, we consider them hidden
|
|
if (settings.checkboxes.length == 0)
|
|
hiddenColumns.push("checkboxes");
|
|
|
|
// Get table headers and group them into checkboxes, extrafields and normal headers
|
|
const bh = document.getElementById("bomhead");
|
|
headers = Array.from(bh.querySelectorAll("th"))
|
|
headers.shift() // numCol is not part of the columnOrder
|
|
headerGroups = []
|
|
lastCompoundClass = null;
|
|
for (i = 0; i < settings.columnOrder.length; i++) {
|
|
cElem = settings.columnOrder[i];
|
|
if (hiddenColumns.includes(cElem)) {
|
|
// Hidden columns appear as a dummy element
|
|
headerGroups.push([]);
|
|
continue;
|
|
}
|
|
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
|
|
if (elem.classList.contains("bom-checkbox")) {
|
|
if (lastCompoundClass === "bom-checkbox") {
|
|
cbGroup = headerGroups.pop();
|
|
cbGroup.push(elem);
|
|
headerGroups.push(cbGroup);
|
|
} else {
|
|
lastCompoundClass = "bom-checkbox";
|
|
headerGroups.push([elem])
|
|
}
|
|
} else {
|
|
headerGroups.push([elem])
|
|
}
|
|
}
|
|
|
|
// Copy settings.columnOrder
|
|
var columns = Array.from(settings.columnOrder)
|
|
|
|
// Set up array with indices of hidden columns
|
|
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
|
|
var dragIndex = columns.indexOf(dragName);
|
|
var swapIndex = dragIndex;
|
|
var swapDone = false;
|
|
|
|
// Check if the current dragged element is swapable with the left or right element
|
|
if (dragIndex > 0) {
|
|
// Get left headers boundingbox
|
|
swapIndex = dragIndex - 1;
|
|
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
|
|
swapIndex--;
|
|
if (!hiddenIndices.includes(swapIndex)) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
|
|
// Get right headers boundingbox
|
|
swapIndex = dragIndex + 1;
|
|
while (hiddenIndices.includes(swapIndex))
|
|
swapIndex++;
|
|
if (swapIndex < headerGroups.length) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Write back change to storage
|
|
if (swapDone) {
|
|
settings.columnOrder = columns
|
|
writeStorage("columnOrder", JSON.stringify(columns));
|
|
}
|
|
|
|
}
|
|
|
|
const mouseDownHandler = function(e) {
|
|
var target = e.target;
|
|
if (target.tagName.toLowerCase() != "td")
|
|
target = target.parentElement;
|
|
|
|
// Used to check if a dragging has ever happened
|
|
wasDragged = false;
|
|
|
|
// Create new element which will be displayed as the dragged column
|
|
draggingElement = document.createElement("div")
|
|
draggingElement.classList.add("dragging");
|
|
draggingElement.style.display = "none";
|
|
draggingElement.style.position = "absolute";
|
|
draggingElement.style.overflow = "hidden";
|
|
|
|
// Get bomhead and bombody elements
|
|
const bh = document.getElementById("bomhead");
|
|
const bb = document.getElementById("bombody");
|
|
|
|
// Get all compound headers for the current column
|
|
var compoundHeaders;
|
|
if (target.classList.contains("bom-checkbox")) {
|
|
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
|
|
} else {
|
|
compoundHeaders = [target];
|
|
}
|
|
|
|
// Create new table which will display the column
|
|
var newTable = document.createElement("table");
|
|
newTable.classList.add("bom");
|
|
newTable.style.background = "white";
|
|
draggingElement.append(newTable);
|
|
|
|
// Create new header element
|
|
var newHeader = document.createElement("thead");
|
|
newTable.append(newHeader);
|
|
|
|
// Set up array for storing all placeholder elements
|
|
placeHolderElements = [];
|
|
|
|
// Add all compound headers to the new thead element and placeholders
|
|
compoundHeaders.forEach(function(h) {
|
|
clone = cloneElementWithDimensions(h);
|
|
newHeader.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
|
|
// Create new body element
|
|
var newBody = document.createElement("tbody");
|
|
newTable.append(newBody);
|
|
|
|
// Get indices for compound headers
|
|
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
|
|
|
|
// For each row in the BOM body...
|
|
var rows = bb.querySelectorAll("tr");
|
|
rows.forEach(function(row) {
|
|
// ..get the cells for the compound column
|
|
const tds = row.querySelectorAll("td");
|
|
var copytds = idxs.map(i => tds[i]);
|
|
// Add them to the new element and the placeholders
|
|
var newRow = document.createElement("tr");
|
|
copytds.forEach(function(td) {
|
|
clone = cloneElementWithDimensions(td);
|
|
newRow.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
newBody.append(newRow);
|
|
});
|
|
|
|
// Compute width for compound header
|
|
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
|
|
draggingElement.style.width = `${width}px`;
|
|
|
|
// Insert the new dragging element and disable selection on BOM
|
|
bom.insertBefore(draggingElement, null);
|
|
bom.style.userSelect = "none";
|
|
|
|
// Determine the mouse position offset
|
|
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
|
|
yOffset = e.screenY - compoundHeaders[0].offsetTop;
|
|
|
|
// Get name for the column in settings.columnOrder
|
|
dragName = getColumnOrderName(target);
|
|
|
|
// Change text and class for placeholder elements
|
|
placeHolderElements = placeHolderElements.map(function(e) {
|
|
newElem = cloneElementWithDimensions(e);
|
|
newElem.textContent = "";
|
|
newElem.classList.add("placeholder");
|
|
return newElem;
|
|
});
|
|
|
|
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
|
|
forcePopulation = true;
|
|
|
|
// Add listeners for move and up on mouse
|
|
document.addEventListener('mousemove', mouseMoveHandler);
|
|
document.addEventListener('mouseup', mouseUpHandler);
|
|
}
|
|
|
|
// In netlist mode, there is nothing to reorder
|
|
if (settings.bommode === "netlist")
|
|
return;
|
|
|
|
// Add mouseDownHandler to every column except the numCol
|
|
bom.querySelectorAll("th")
|
|
.forEach(function(head) {
|
|
if (!head.classList.contains("numCol")) {
|
|
head.onmousedown = mouseDownHandler;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function getBoundingClientRectFromMultiple(elements) {
|
|
var elems = Array.from(elements);
|
|
|
|
if (elems.length == 0)
|
|
return null;
|
|
|
|
var box = elems.shift()
|
|
.getBoundingClientRect();
|
|
|
|
elems.forEach(function(elem) {
|
|
var elembox = elem.getBoundingClientRect();
|
|
box.left = Math.min(elembox.left, box.left);
|
|
box.top = Math.min(elembox.top, box.top);
|
|
box.width += elembox.width;
|
|
box.height = Math.max(elembox.height, box.height);
|
|
});
|
|
|
|
return box;
|
|
}
|
|
|
|
function cloneElementWithDimensions(elem) {
|
|
var newElem = elem.cloneNode(true);
|
|
newElem.style.height = window.getComputedStyle(elem).height;
|
|
newElem.style.width = window.getComputedStyle(elem).width;
|
|
return newElem;
|
|
}
|
|
|
|
function getBomTableHeaderIndex(elem) {
|
|
const bh = document.getElementById('bomhead');
|
|
const ths = Array.from(bh.querySelectorAll("th"));
|
|
return ths.indexOf(elem);
|
|
}
|
|
|
|
function getColumnOrderName(elem) {
|
|
var cname = elem.getAttribute("col_name");
|
|
if (cname === "bom-checkbox")
|
|
return "checkboxes";
|
|
else
|
|
return cname;
|
|
}
|
|
|
|
function resizableGrid(tablehead) {
|
|
var cols = tablehead.firstElementChild.children;
|
|
var rowWidth = tablehead.offsetWidth;
|
|
|
|
for (var i = 1; i < cols.length; i++) {
|
|
if (cols[i].classList.contains("bom-checkbox"))
|
|
continue;
|
|
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
|
|
}
|
|
|
|
for (var i = 1; i < cols.length - 1; i++) {
|
|
var div = document.createElement('div');
|
|
div.className = "column-width-handle";
|
|
cols[i].appendChild(div);
|
|
setListeners(div);
|
|
}
|
|
|
|
function setListeners(div) {
|
|
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
|
|
|
|
div.addEventListener('mousedown', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
curCol = e.target.parentElement;
|
|
nxtCol = curCol.nextElementSibling;
|
|
startX = e.pageX;
|
|
|
|
var padding = paddingDiff(curCol);
|
|
|
|
rowWidth = curCol.parentElement.offsetWidth;
|
|
curColWidth = curCol.clientWidth - padding;
|
|
nxtColWidth = nxtCol.clientWidth - padding;
|
|
});
|
|
|
|
document.addEventListener('mousemove', function(e) {
|
|
if (startX) {
|
|
var diffX = e.pageX - startX;
|
|
diffX = -Math.min(-diffX, curColWidth - 20);
|
|
diffX = Math.min(diffX, nxtColWidth - 20);
|
|
|
|
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
|
|
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
|
|
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
curCol = undefined;
|
|
nxtCol = undefined;
|
|
startX = undefined;
|
|
nxtColWidth = undefined;
|
|
curColWidth = undefined
|
|
});
|
|
}
|
|
|
|
function paddingDiff(col) {
|
|
|
|
if (getStyleVal(col, 'box-sizing') == 'border-box') {
|
|
return 0;
|
|
}
|
|
|
|
var padLeft = getStyleVal(col, 'padding-left');
|
|
var padRight = getStyleVal(col, 'padding-right');
|
|
return (parseInt(padLeft) + parseInt(padRight));
|
|
|
|
}
|
|
|
|
function getStyleVal(elm, css) {
|
|
return (window.getComputedStyle(elm, null).getPropertyValue(css))
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var markedFootprints = new Set();
|
|
var highlightedFootprints = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
function setShowBOMColumn(field, value) {
|
|
if (field === "references") {
|
|
var rl = document.getElementById("reflookup");
|
|
rl.disabled = !value;
|
|
if (!value) {
|
|
rl.value = "";
|
|
updateRefLookup("");
|
|
}
|
|
}
|
|
|
|
var n = settings.hiddenColumns.indexOf(field);
|
|
if (value) {
|
|
if (n != -1) {
|
|
settings.hiddenColumns.splice(n, 1);
|
|
}
|
|
} else {
|
|
if (n == -1) {
|
|
settings.hiddenColumns.push(field);
|
|
}
|
|
}
|
|
|
|
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
|
|
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
|
|
function setFullscreen(value) {
|
|
if (value) {
|
|
document.documentElement.requestFullscreen();
|
|
} else {
|
|
document.exitFullscreen();
|
|
}
|
|
}
|
|
|
|
function fabricationVisible(value) {
|
|
writeStorage("fabricationVisible", value);
|
|
settings.renderFabrication = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function silkscreenVisible(value) {
|
|
writeStorage("silkscreenVisible", value);
|
|
settings.renderSilkscreen = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightPin1(value) {
|
|
writeStorage("highlightpin1", value);
|
|
settings.highlightpin1 = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightRowOnClick(value) {
|
|
settings.highlightRowOnClick = value;
|
|
writeStorage("highlightRowOnClick", value);
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
function getStoredCheckboxRefs(checkbox) {
|
|
function convert(ref) {
|
|
var intref = parseInt(ref);
|
|
if (isNaN(intref)) {
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.footprints[i].ref == ref) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
} else {
|
|
return intref;
|
|
}
|
|
}
|
|
if (!(checkbox in settings.checkboxStoredRefs)) {
|
|
var val = readStorage("checkbox_" + checkbox);
|
|
settings.checkboxStoredRefs[checkbox] = val ? val : "";
|
|
}
|
|
if (!settings.checkboxStoredRefs[checkbox]) {
|
|
return new Set();
|
|
} else {
|
|
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
|
|
}
|
|
}
|
|
|
|
function getCheckboxState(checkbox, references) {
|
|
var storedRefsSet = getStoredCheckboxRefs(checkbox);
|
|
var currentRefsSet = new Set(references.map(r => r[1]));
|
|
// Get difference of current - stored
|
|
var difference = new Set(currentRefsSet);
|
|
for (ref of storedRefsSet) {
|
|
difference.delete(ref);
|
|
}
|
|
if (difference.size == 0) {
|
|
// All the current refs are stored
|
|
return "checked";
|
|
} else if (difference.size == currentRefsSet.size) {
|
|
// None of the current refs are stored
|
|
return "unchecked";
|
|
} else {
|
|
// Some of the refs are stored
|
|
return "indeterminate";
|
|
}
|
|
}
|
|
|
|
function setBomCheckboxState(checkbox, element, references) {
|
|
var state = getCheckboxState(checkbox, references);
|
|
element.checked = (state == "checked");
|
|
element.indeterminate = (state == "indeterminate");
|
|
}
|
|
|
|
function createCheckboxHandlers(input, checkbox, references, row) {
|
|
var clickHandler = () => {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (input.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.add("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.add(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'checked';
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
if (markWhenChecked) {
|
|
row.classList.remove("checked");
|
|
for (var ref of references) {
|
|
markedFootprints.delete(ref[1]);
|
|
}
|
|
drawHighlights();
|
|
}
|
|
eventArgs.state = 'unchecked';
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
|
|
}
|
|
|
|
return [
|
|
(e) => {
|
|
clickHandler();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
if (row.onmousemove) row.onmousemove();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
input.checked = !input.checked;
|
|
input.indeterminate = false;
|
|
clickHandler();
|
|
}
|
|
];
|
|
}
|
|
|
|
function clearHighlightedFootprints() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedFootprints = [];
|
|
highlightedNet = null;
|
|
}
|
|
}
|
|
|
|
function createRowHighlightHandler(rowid, refs, net) {
|
|
return function () {
|
|
if (currentHighlightedRowId) {
|
|
if (currentHighlightedRowId == rowid) {
|
|
return;
|
|
}
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
}
|
|
document.getElementById(rowid).classList.add("highlighted");
|
|
currentHighlightedRowId = rowid;
|
|
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
function updateNetColors() {
|
|
writeStorage("netColors", JSON.stringify(settings.netColors));
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function netColorChangeHandler(net) {
|
|
return (event) => {
|
|
settings.netColors[net] = event.target.value;
|
|
updateNetColors();
|
|
}
|
|
}
|
|
|
|
function netColorRightClick(net) {
|
|
return (event) => {
|
|
if (event.button == 2) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
event.target.value = defaultNetColor;
|
|
delete settings.netColors[net];
|
|
updateNetColors();
|
|
}
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
if (!settings.hiddenColumns.includes("References")) {
|
|
for (var ref of entry) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// check fields
|
|
for (var i in config.fields) {
|
|
var f = config.fields[i];
|
|
if (!settings.hiddenColumns.includes(f)) {
|
|
for (var ref of entry) {
|
|
if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry.filter(r => r[0].toLowerCase() == reflookup);
|
|
}
|
|
|
|
function highlightFilter(s) {
|
|
if (!filter) {
|
|
return s;
|
|
}
|
|
var parts = s.toLowerCase().split(filter);
|
|
if (parts.length == 1) {
|
|
return s;
|
|
}
|
|
var r = "";
|
|
var pos = 0;
|
|
for (var i in parts) {
|
|
if (i > 0) {
|
|
r += '<mark class="highlight">' +
|
|
s.substring(pos, pos + filter.length) +
|
|
'</mark>';
|
|
pos += filter.length;
|
|
}
|
|
r += s.substring(pos, pos + parts[i].length);
|
|
pos += parts[i].length;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function getBomListByLayer(layer) {
|
|
switch (layer) {
|
|
case 'F': return pcbdata.bom.F.slice();
|
|
case 'B': return pcbdata.bom.B.slice();
|
|
case 'FB': return pcbdata.bom.both.slice();
|
|
}
|
|
return [];
|
|
}
|
|
|
|
function getSelectedBomList() {
|
|
if (settings.bommode == "netlist") {
|
|
return pcbdata.nets.slice();
|
|
}
|
|
var out = getBomListByLayer(settings.canvaslayout);
|
|
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
var expandedTable = [];
|
|
for (var bomentry of out) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
return expandedTable;
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
function checkboxSetUnsetAllHandler(checkboxname) {
|
|
return function () {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var allset = true;
|
|
var checkbox;
|
|
var row;
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
if (!checkbox.checked || checkbox.indeterminate) {
|
|
allset = false;
|
|
break;
|
|
}
|
|
}
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = !allset;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
}
|
|
}
|
|
|
|
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
if (is_checkbox)
|
|
th.setAttribute("col_name", "bom-checkbox");
|
|
else
|
|
th.setAttribute("col_name", name);
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
var spacer = document.createElement("div");
|
|
spacer.className = "column-spacer";
|
|
th.appendChild(spacer);
|
|
spacer.onclick = function () {
|
|
if (currentSortColumn && th !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && th === currentSortColumn) {
|
|
// Already sorted by this column
|
|
if (currentSortOrder == "asc") {
|
|
// Sort by this column, descending order
|
|
bomSortFunction = function (a, b) {
|
|
return -comparator(a, b);
|
|
}
|
|
currentSortColumn.childNodes[1].classList.remove("asc");
|
|
currentSortColumn.childNodes[1].classList.add("desc");
|
|
currentSortOrder = "desc";
|
|
} else {
|
|
// Unsort
|
|
bomSortFunction = null;
|
|
currentSortColumn.childNodes[1].classList.remove("desc");
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
} else {
|
|
// Sort by this column, ascending order
|
|
bomSortFunction = comparator;
|
|
currentSortColumn = th;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
if (is_checkbox) {
|
|
spacer.onclick = fancyDblClickHandler(
|
|
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
|
|
var vismenu = document.createElement("div");
|
|
vismenu.id = "vismenu";
|
|
vismenu.classList.add("menu");
|
|
|
|
var visbutton = document.createElement("div");
|
|
visbutton.classList.add("visbtn");
|
|
visbutton.classList.add("hideonprint");
|
|
|
|
var viscontent = document.createElement("div");
|
|
viscontent.classList.add("menu-content");
|
|
viscontent.id = "vismenu-content";
|
|
|
|
settings.columnOrder.forEach(column => {
|
|
if (typeof column !== "string")
|
|
return;
|
|
|
|
// Skip empty columns
|
|
if (column === "checkboxes" && settings.checkboxes.length == 0)
|
|
return;
|
|
else if (column === "Quantity" && settings.bommode == "ungrouped")
|
|
return;
|
|
|
|
var label = document.createElement("label");
|
|
label.classList.add("menu-label");
|
|
|
|
var input = document.createElement("input");
|
|
input.classList.add("visibility_checkbox");
|
|
input.type = "checkbox";
|
|
input.onchange = function (e) {
|
|
setShowBOMColumn(column, e.target.checked)
|
|
};
|
|
input.checked = !(settings.hiddenColumns.includes(column));
|
|
|
|
label.appendChild(input);
|
|
if (column.length > 0)
|
|
label.append(column[0].toUpperCase() + column.slice(1));
|
|
|
|
viscontent.appendChild(label);
|
|
});
|
|
|
|
viscontent.childNodes[0].classList.add("menu-label-top");
|
|
|
|
vismenu.appendChild(visbutton);
|
|
if (settings.bommode != "netlist") {
|
|
vismenu.appendChild(viscontent);
|
|
th.appendChild(vismenu);
|
|
}
|
|
tr.appendChild(th);
|
|
|
|
var checkboxCompareClosure = function (checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a);
|
|
var stateB = getCheckboxState(checkbox, b);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
var stringFieldCompareClosure = function (fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
|
|
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
|
|
var compareRefs = (a, b) => {
|
|
var ra = referenceRegex.exec(a);
|
|
var rb = referenceRegex.exec(b);
|
|
if (ra === null || rb === null) {
|
|
if (a != b) return a > b ? 1 : -1;
|
|
return 0;
|
|
} else {
|
|
if (ra.groups.prefix != rb.groups.prefix) {
|
|
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
|
|
}
|
|
if (ra.groups.number != rb.groups.number) {
|
|
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
if (settings.bommode == "netlist") {
|
|
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
}));
|
|
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
|
|
return 0;
|
|
}));
|
|
} else {
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
var valueIndex = config.fields.indexOf("Value");
|
|
var footprintIndex = config.fields.indexOf("Footprint");
|
|
columns.forEach((column) => {
|
|
if (column === placeHolderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
|
|
tr.appendChild(th);
|
|
}
|
|
} else if (column === "References") {
|
|
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
|
|
var i = 0;
|
|
while (i < a.length && i < b.length) {
|
|
if (a[i][0] != b[i][0]) return compareRefs(a[i][0], b[i][0]);
|
|
i++;
|
|
}
|
|
return a.length - b.length;
|
|
}));
|
|
} else if (column === "Value") {
|
|
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
|
|
var ra = a[0][1], rb = b[0][1];
|
|
return valueCompare(
|
|
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
|
|
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
|
|
}));
|
|
return;
|
|
} else if (column === "Footprint") {
|
|
tr.appendChild(createColumnHeader(
|
|
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
|
|
return a.length - b.length;
|
|
}));
|
|
} else {
|
|
// Other fields
|
|
var i = config.fields.indexOf(column);
|
|
if (i < 0)
|
|
return;
|
|
tr.appendChild(createColumnHeader(
|
|
column, `field${i + 1}`, stringFieldCompareClosure(i)));
|
|
}
|
|
});
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
|
|
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
|
|
bomtable = getSelectedBomList();
|
|
|
|
if (bomSortFunction) {
|
|
bomtable = bomtable.sort(bomSortFunction);
|
|
}
|
|
for (var i in bomtable) {
|
|
var bomentry = bomtable[i];
|
|
if (filter && !entryMatches(bomentry)) {
|
|
continue;
|
|
}
|
|
var references = null;
|
|
var netname = null;
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
var rownum = +i + 1;
|
|
tr.id = "bomrow" + rownum;
|
|
td.textContent = rownum;
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "netlist") {
|
|
netname = bomentry;
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(netname ? netname : "<no net>");
|
|
tr.appendChild(td);
|
|
var color = settings.netColors[netname] || defaultNetColor;
|
|
td = document.createElement("TD");
|
|
var colorBox = document.createElement("INPUT");
|
|
colorBox.type = "color";
|
|
colorBox.value = color;
|
|
colorBox.onchange = netColorChangeHandler(netname);
|
|
colorBox.onmouseup = netColorRightClick(netname);
|
|
colorBox.oncontextmenu = (e) => e.preventDefault();
|
|
td.appendChild(colorBox);
|
|
td.classList.add("color-column");
|
|
tr.appendChild(td);
|
|
} else {
|
|
if (reflookup) {
|
|
references = findRefInEntry(bomentry);
|
|
if (references.length == 0) {
|
|
continue;
|
|
}
|
|
} else {
|
|
references = bomentry;
|
|
}
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
columns.forEach((column) => {
|
|
if (column === placeholderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
if (checkbox) {
|
|
td = document.createElement("TD");
|
|
var input = document.createElement("input");
|
|
input.type = "checkbox";
|
|
[input.onchange, td.ontouchstart, td.ontouchend] = createCheckboxHandlers(input, checkbox, references, tr);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
if (input.checked && settings.markWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
} else if (column === "References") {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = references.length;
|
|
tr.appendChild(td);
|
|
} else {
|
|
// All the other fields
|
|
var field_index = config.fields.indexOf(column)
|
|
if (field_index < 0)
|
|
return;
|
|
var valueSet = new Set();
|
|
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
|
|
td = document.createElement("TD");
|
|
var output = new Array();
|
|
for (let item of valueSet) {
|
|
const visible = highlightFilter(String(item));
|
|
if (typeof item === 'string' && item.match(urlRegex)) {
|
|
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
|
|
} else {
|
|
output.push(visible);
|
|
}
|
|
}
|
|
td.innerHTML = output.join(", ");
|
|
tr.appendChild(td);
|
|
}
|
|
});
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
if (settings.highlightRowOnClick) {
|
|
tr.onmousedown = handler;
|
|
} else {
|
|
tr.onmousemove = handler;
|
|
}
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
setBomHandlers();
|
|
resizableGrid(bomhead);
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0,
|
|
fp_b = 0,
|
|
pads_f = 0,
|
|
pads_b = 0,
|
|
pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("topmostdiv").style.height = "";
|
|
document.getElementById("topmostdiv").style.display = "block";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
var chkbxs = document.getElementsByClassName("visibility_checkbox");
|
|
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = true;
|
|
}
|
|
}
|
|
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var childNum = checkboxnum + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].childNodes[0];
|
|
checkbox.checked = !checkbox.checked;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function checkBomCheckbox(bomrowid, checkboxname) {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var childNum = checkboxnum + 1 + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
|
|
prepCheckboxes();
|
|
populateMarkWhenCheckedOptions();
|
|
setMarkWhenChecked(settings.markWhenChecked);
|
|
}
|
|
|
|
function setMarkWhenChecked(value) {
|
|
writeStorage("markWhenChecked", value);
|
|
settings.markWhenChecked = value;
|
|
markedFootprints.clear();
|
|
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
|
|
markedFootprints.add(ref);
|
|
}
|
|
populateBomTable();
|
|
drawHighlights();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateMarkWhenCheckedOptions() {
|
|
var container = document.getElementById("markWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "markWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "markWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setMarkWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.markWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
function constrain(number, min, max) {
|
|
return Math.min(Math.max(parseInt(number), min), max);
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowLeft":
|
|
case "ArrowRight":
|
|
if (document.activeElement.type != "text") {
|
|
e.preventDefault();
|
|
let boardRotationElement = document.getElementById("boardRotation")
|
|
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
|
|
if (e.key == "ArrowLeft") {
|
|
settings.boardRotation += 3; // 15 degrees
|
|
}
|
|
else {
|
|
settings.boardRotation -= 3;
|
|
}
|
|
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
|
|
boardRotationElement.value = settings.boardRotation
|
|
setBoardRotation(settings.boardRotation);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
function topToggle() {
|
|
var top = document.getElementById("top");
|
|
var toptoggle = document.getElementById("toptoggle");
|
|
if (top.style.display === "none") {
|
|
top.style.display = "flex";
|
|
toptoggle.classList.remove("flipped");
|
|
} else {
|
|
top.style.display = "none";
|
|
toptoggle.classList.add("flipped");
|
|
}
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
initUtils();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// 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>
|