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