4670 lines
348 KiB
HTML
4670 lines
348 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>
|