4415 lines
305 KiB
HTML
4415 lines
305 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: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.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: 5px;
|
|
}
|
|
|
|
.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: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.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 {
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
#top {
|
|
height: 78px;
|
|
border-bottom: 2px solid black;
|
|
}
|
|
|
|
.dark #top {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#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;
|
|
}
|
|
|
|
|
|
</style>
|
|
<script type="text/javascript" >
|
|
///////////////////////////////////////////////
|
|
/*
|
|
Split.js - v1.3.5
|
|
MIT License
|
|
https://github.com/nathancahill/Split.js
|
|
*/
|
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
|
|
// This work is free. You can redistribute it and/or modify it
|
|
// under the terms of the WTFPL, Version 2
|
|
// For more information see LICENSE.txt or http://www.wtfpl.net/
|
|
//
|
|
// For more information, the home page:
|
|
// http://pieroxy.net/blog/pages/lz-string/testing.html
|
|
//
|
|
// LZ-based compression algorithm, version 1.4.4
|
|
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*!
|
|
* PEP v0.4.3 | https://github.com/jquery/PEP
|
|
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
|
|
*/
|
|
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
|
|
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
|
|
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
|
|
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
|
|
for(var b=a;b.parentNode;)b=b.parentNode;
|
|
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
|
|
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
|
|
//
|
|
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
|
|
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
|
|
var b=x(a,this.findElements,this);
|
|
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
|
|
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
|
|
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
|
|
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
|
|
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
|
|
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
|
|
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
|
|
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
|
|
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
|
|
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
|
|
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
|
|
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
|
|
b=!1;else if("XY"===c)
|
|
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
|
|
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
|
|
vacuumTouches:function(a){var b=a.touches;
|
|
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
|
|
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
|
|
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
|
|
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
|
|
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
|
|
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
|
|
if(this.isPrimaryTouch(c)){
|
|
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "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") {
|
|
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 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.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
|
|
showFootprints(settings.show_footprints);
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
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: "default",
|
|
bomlayout: "default",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: false,
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
}
|
|
|
|
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 (!["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;
|
|
|
|
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);
|
|
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
|
|
|
|
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;
|
|
}
|
|
|
|
// 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 (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.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);
|
|
}
|
|
}
|
|
// 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) {
|
|
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, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
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();
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.fill(zone.path2d);
|
|
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.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, 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));
|
|
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) {
|
|
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));
|
|
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 bbox = applyRotation(pcbdata.edges_bbox);
|
|
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;
|
|
var flip = (layerdict.layer == "B");
|
|
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;
|
|
if (layerdict.layer == "B") {
|
|
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);
|
|
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 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();
|
|
}
|
|
|
|
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 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 (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") {
|
|
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
});
|
|
tr.appendChild(th);
|
|
} 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) {
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
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);
|
|
} 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");
|
|
td.innerHTML = highlightFilter(Array.from(valueSet).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("bot").style.height = "";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
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("bot").style.height = "calc(100% - 80px)";
|
|
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";
|
|
}
|
|
|
|
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);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div style="float: right; height: 100%;">
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<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="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
|
|
Highlight first pin
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</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">
|
|
<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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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"
|
|
style="float: right; position: relative; top: 8px">
|
|
<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" style="float: right; top: 8px;">
|
|
<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" style="float: right; top: 8px;">
|
|
<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>
|
|
</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 id="fileinfodiv" style="overflow: auto;">
|
|
<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>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<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>
|