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>
|