4670 lines
342 KiB
HTML
4670 lines
342 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": true, "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>
|