4710 lines
346 KiB
HTML
4710 lines
346 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Interactive BOM for KiCAD</title>
|
|
<style type="text/css">
|
|
:root {
|
|
--pcb-edge-color: black;
|
|
--pad-color: #878787;
|
|
--pad-hole-color: #CCCCCC;
|
|
--pad-color-highlight: #D04040;
|
|
--pad-color-highlight-both: #D0D040;
|
|
--pad-color-highlight-marked: #44a344;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #ffb629;
|
|
--pin1-outline-color-highlight-both: #fcbb39;
|
|
--pin1-outline-color-highlight-marked: #fdbe41;
|
|
--silkscreen-edge-color: #aa4;
|
|
--silkscreen-polygon-color: #4aa;
|
|
--silkscreen-text-color: #4aa;
|
|
--fabrication-edge-color: #907651;
|
|
--fabrication-polygon-color: #907651;
|
|
--fabrication-text-color: #a27c24;
|
|
--track-color: #def5f1;
|
|
--track-color-highlight: #D04040;
|
|
--zone-color: #def5f1;
|
|
--zone-color-highlight: #d0404080;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
margin: 0px;
|
|
height: 100%;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark.topmostdiv {
|
|
--pcb-edge-color: #eee;
|
|
--pad-color: #808080;
|
|
--pin1-outline-color: #ffa800;
|
|
--pin1-outline-color-highlight: #ccff00;
|
|
--track-color: #42524f;
|
|
--zone-color: #42524f;
|
|
background-color: #252c30;
|
|
color: #eee;
|
|
}
|
|
|
|
button {
|
|
background-color: #eee;
|
|
border: 1px solid #888;
|
|
color: black;
|
|
height: 44px;
|
|
width: 44px;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
display: inline-block;
|
|
font-size: 14px;
|
|
font-weight: bolder;
|
|
}
|
|
|
|
.dark button {
|
|
/* This will be inverted */
|
|
background-color: #c3b7b5;
|
|
}
|
|
|
|
button.depressed {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark button.depressed {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
button:focus {
|
|
outline: 0;
|
|
}
|
|
|
|
button#tb-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#lr-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#bom-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-grouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-ungrouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-netlist-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#copy {
|
|
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
|
|
background-position: 6px 6px;
|
|
background-repeat: no-repeat;
|
|
background-size: 26px 26px;
|
|
border-radius: 6px;
|
|
height: 40px;
|
|
width: 40px;
|
|
margin: 10px 5px;
|
|
}
|
|
|
|
button#copy:active {
|
|
box-shadow: inset 0px 0px 5px #6c6c6c;
|
|
}
|
|
|
|
textarea.clipboard-temp {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 2em;
|
|
height: 2em;
|
|
padding: 0;
|
|
border: None;
|
|
outline: None;
|
|
box-shadow: None;
|
|
background: transparent;
|
|
}
|
|
|
|
.left-most-button {
|
|
border-right: 0;
|
|
border-top-left-radius: 6px;
|
|
border-bottom-left-radius: 6px;
|
|
}
|
|
|
|
.middle-button {
|
|
border-right: 0;
|
|
}
|
|
|
|
.right-most-button {
|
|
border-top-right-radius: 6px;
|
|
border-bottom-right-radius: 6px;
|
|
}
|
|
|
|
.button-container {
|
|
font-size: 0;
|
|
margin: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.dark .button-container {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.button-container button {
|
|
background-size: 32px 32px;
|
|
background-position: 5px 5px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
@media print {
|
|
.hideonprint {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
canvas {
|
|
cursor: crosshair;
|
|
}
|
|
|
|
canvas:active {
|
|
cursor: grabbing;
|
|
}
|
|
|
|
.fileinfo {
|
|
width: 100%;
|
|
max-width: 1000px;
|
|
border: none;
|
|
padding: 3px;
|
|
}
|
|
|
|
.fileinfo .title {
|
|
font-size: 20pt;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.fileinfo td {
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
max-width: 1px;
|
|
width: 50%;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.bom {
|
|
border-collapse: collapse;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 10pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
margin-top: 1px;
|
|
position: relative;
|
|
}
|
|
|
|
.bom th,
|
|
.bom td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
.dark .bom th,
|
|
.dark .bom td {
|
|
border: 1px solid #777;
|
|
}
|
|
|
|
.bom th {
|
|
background-color: #CCCCCC;
|
|
background-clip: padding-box;
|
|
}
|
|
|
|
.dark .bom th {
|
|
background-color: #3b4749;
|
|
}
|
|
|
|
.bom tr.highlighted:nth-child(n) {
|
|
background-color: #cfc;
|
|
}
|
|
|
|
.dark .bom tr.highlighted:nth-child(n) {
|
|
background-color: #226022;
|
|
}
|
|
|
|
.bom tr:nth-child(even) {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.dark .bom tr:nth-child(even) {
|
|
background-color: #313b40;
|
|
}
|
|
|
|
.bom tr.checked {
|
|
color: #1cb53d;
|
|
}
|
|
|
|
.dark .bom tr.checked {
|
|
color: #2cce54;
|
|
}
|
|
|
|
.bom tr {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 30px;
|
|
}
|
|
|
|
.bom .value {
|
|
width: 15%;
|
|
}
|
|
|
|
.bom .quantity {
|
|
width: 65px;
|
|
}
|
|
|
|
.bom th .sortmark {
|
|
position: absolute;
|
|
right: 1px;
|
|
top: 1px;
|
|
margin-top: -5px;
|
|
border-width: 5px;
|
|
border-style: solid;
|
|
border-color: transparent transparent #221 transparent;
|
|
transform-origin: 50% 85%;
|
|
transition: opacity 0.2s, transform 0.4s;
|
|
}
|
|
|
|
.dark .bom th .sortmark {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.bom th .sortmark.none {
|
|
opacity: 0;
|
|
}
|
|
|
|
.bom th .sortmark.desc {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.bom th:hover .sortmark.none {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.bom .bom-checkbox {
|
|
width: 30px;
|
|
position: relative;
|
|
user-select: none;
|
|
-moz-user-select: none;
|
|
}
|
|
|
|
.bom .bom-checkbox:before {
|
|
content: "";
|
|
position: absolute;
|
|
border-width: 15px;
|
|
border-style: solid;
|
|
border-color: #51829f transparent transparent transparent;
|
|
visibility: hidden;
|
|
top: -15px;
|
|
}
|
|
|
|
.bom .bom-checkbox:after {
|
|
content: "Double click to set/unset all";
|
|
position: absolute;
|
|
color: white;
|
|
top: -35px;
|
|
left: -26px;
|
|
background: #51829f;
|
|
padding: 5px 15px;
|
|
border-radius: 8px;
|
|
white-space: nowrap;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.bom .bom-checkbox:hover:before,
|
|
.bom .bom-checkbox:hover:after {
|
|
visibility: visible;
|
|
transition: visibility 0.2s linear 1s;
|
|
}
|
|
|
|
.split {
|
|
-webkit-box-sizing: border-box;
|
|
-moz-box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
background-color: inherit;
|
|
}
|
|
|
|
.split.split-horizontal,
|
|
.gutter.gutter-horizontal {
|
|
height: 100%;
|
|
float: left;
|
|
}
|
|
|
|
.gutter {
|
|
background-color: #ddd;
|
|
background-repeat: no-repeat;
|
|
background-position: 50%;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
.dark .gutter {
|
|
background-color: #777;
|
|
}
|
|
|
|
.gutter.gutter-horizontal {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
|
|
cursor: ew-resize;
|
|
width: 5px;
|
|
}
|
|
|
|
.gutter.gutter-vertical {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
|
|
cursor: ns-resize;
|
|
height: 5px;
|
|
}
|
|
|
|
.searchbox {
|
|
float: left;
|
|
height: 40px;
|
|
margin: 10px 5px;
|
|
padding: 12px 32px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 18px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 6px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
|
|
background-position: 10px 10px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.dark .searchbox {
|
|
background-color: #111;
|
|
color: #eee;
|
|
}
|
|
|
|
.searchbox::placeholder {
|
|
color: #ccc;
|
|
}
|
|
|
|
.dark .searchbox::placeholder {
|
|
color: #666;
|
|
}
|
|
|
|
.filter {
|
|
width: calc(60% - 64px);
|
|
}
|
|
|
|
.reflookup {
|
|
width: calc(40% - 10px);
|
|
}
|
|
|
|
input[type=text]:focus {
|
|
background-color: white;
|
|
border: 1px solid #333;
|
|
}
|
|
|
|
.dark input[type=text]:focus {
|
|
background-color: #333;
|
|
border: 1px solid #ccc;
|
|
}
|
|
|
|
mark.highlight {
|
|
background-color: #5050ff;
|
|
color: #fff;
|
|
padding: 2px;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.dark mark.highlight {
|
|
background-color: #76a6da;
|
|
color: #111;
|
|
}
|
|
|
|
.menubtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.statsbtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.iobtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.visbtn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
padding: 15px;
|
|
}
|
|
|
|
#vismenu-content {
|
|
left: 0px;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark .statsbtn,
|
|
.dark .savebtn,
|
|
.dark .menubtn,
|
|
.dark .iobtn,
|
|
.dark .visbtn {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.flexbox {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
}
|
|
|
|
.savebtn {
|
|
background-color: #d6d6d6;
|
|
width: auto;
|
|
height: 30px;
|
|
flex-grow: 1;
|
|
margin: 5px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.savebtn:active {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark .savebtn:active {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
.stats {
|
|
border-collapse: collapse;
|
|
font-size: 12pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
min-width: 450px;
|
|
}
|
|
|
|
.dark .stats td {
|
|
border: 1px solid #bbb;
|
|
}
|
|
|
|
.stats td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
#checkbox-stats div {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
#checkbox-stats .bar {
|
|
background-color: rgba(28, 251, 0, 0.6);
|
|
}
|
|
|
|
.menu {
|
|
position: relative;
|
|
display: inline-block;
|
|
margin: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.menu-content {
|
|
font-size: 12pt !important;
|
|
text-align: left !important;
|
|
font-weight: normal !important;
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
right: 0;
|
|
min-width: 300px;
|
|
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
|
z-index: 100;
|
|
padding: 8px;
|
|
}
|
|
|
|
.dark .menu-content {
|
|
background-color: #111;
|
|
}
|
|
|
|
.menu:hover .menu-content {
|
|
display: block;
|
|
}
|
|
|
|
.menu:hover .menubtn,
|
|
.menu:hover .iobtn,
|
|
.menu:hover .statsbtn {
|
|
background-color: #eee;
|
|
}
|
|
|
|
.menu-label {
|
|
display: inline-block;
|
|
padding: 8px;
|
|
border: 1px solid #ccc;
|
|
border-top: 0;
|
|
width: calc(100% - 18px);
|
|
}
|
|
|
|
.menu-label-top {
|
|
border-top: 1px solid #ccc;
|
|
}
|
|
|
|
.menu-textbox {
|
|
float: left;
|
|
height: 24px;
|
|
margin: 10px 5px;
|
|
padding: 5px 5px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 14px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 4px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
width: calc(100% - 10px);
|
|
}
|
|
|
|
.menu-textbox.invalid,
|
|
.dark .menu-textbox.invalid {
|
|
color: red;
|
|
}
|
|
|
|
.dark .menu-textbox {
|
|
background-color: #222;
|
|
color: #eee;
|
|
}
|
|
|
|
.radio-container {
|
|
margin: 4px;
|
|
}
|
|
|
|
.topmostdiv {
|
|
display: flex;
|
|
flex-direction: column;
|
|
width: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
min-height: 100%;
|
|
}
|
|
|
|
#top {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: flex-end;
|
|
align-items: center;
|
|
}
|
|
|
|
#topdivider {
|
|
border-bottom: 2px solid black;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.dark #topdivider {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#topdivider>div {
|
|
position: relative;
|
|
}
|
|
|
|
#toptoggle {
|
|
cursor: pointer;
|
|
user-select: none;
|
|
position: absolute;
|
|
padding: 0.1rem 0.3rem;
|
|
top: -0.4rem;
|
|
left: -1rem;
|
|
font-size: 1.4rem;
|
|
line-height: 60%;
|
|
border: 1px solid black;
|
|
border-radius: 1rem;
|
|
background-color: #fff;
|
|
z-index: 100;
|
|
}
|
|
|
|
.flipped {
|
|
transform: rotate(0.5turn);
|
|
}
|
|
|
|
.dark #toptoggle {
|
|
border: 1px solid #fff;
|
|
background-color: #222;
|
|
}
|
|
|
|
#fileinfodiv {
|
|
flex: 20rem 1 0;
|
|
overflow: auto;
|
|
}
|
|
|
|
#bomcontrols {
|
|
display: flex;
|
|
flex-direction: row-reverse;
|
|
}
|
|
|
|
#bomcontrols>* {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
#dbg {
|
|
display: block;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #aaa;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #666;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #555;
|
|
}
|
|
|
|
.slider {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
margin: 3px 0;
|
|
padding: 0;
|
|
outline: none;
|
|
opacity: 0.7;
|
|
-webkit-transition: .2s;
|
|
transition: opacity .2s;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider:hover {
|
|
opacity: 1;
|
|
}
|
|
|
|
.slider:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-runnable-track {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
border: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin-top: -4px;
|
|
}
|
|
|
|
.dark .slider::-webkit-slider-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-moz-range-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.slider::-moz-range-track {
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.dark .slider::-moz-range-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-ms-track {
|
|
width: 100%;
|
|
height: 8px;
|
|
border-width: 3px 0;
|
|
background: transparent;
|
|
border-color: transparent;
|
|
color: transparent;
|
|
transition: opacity .2s;
|
|
}
|
|
|
|
.slider::-ms-fill-lower {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-fill-upper {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
|
|
.shameless-plug {
|
|
font-size: 0.8em;
|
|
text-align: center;
|
|
display: block;
|
|
}
|
|
|
|
a {
|
|
color: #0278a4;
|
|
}
|
|
|
|
.dark a {
|
|
color: #00b9fd;
|
|
}
|
|
|
|
#frontcanvas,
|
|
#backcanvas {
|
|
touch-action: none;
|
|
}
|
|
|
|
.placeholder {
|
|
border: 1px dashed #9f9fda !important;
|
|
background-color: #edf2f7 !important;
|
|
}
|
|
|
|
.dragging {
|
|
z-index: 999;
|
|
}
|
|
|
|
.dark .dragging>table>tbody>tr {
|
|
background-color: #252c30;
|
|
}
|
|
|
|
.dark .placeholder {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.column-spacer {
|
|
top: 0;
|
|
left: 0;
|
|
width: calc(100% - 4px);
|
|
position: absolute;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle {
|
|
top: 0;
|
|
right: 0;
|
|
width: 4px;
|
|
position: absolute;
|
|
cursor: col-resize;
|
|
user-select: none;
|
|
height: 100%;
|
|
}
|
|
|
|
.column-width-handle:hover {
|
|
background-color: #4f99bd;
|
|
}
|
|
|
|
.help-link {
|
|
border: 1px solid #0278a4;
|
|
padding-inline: 0.3rem;
|
|
border-radius: 3px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.dark .help-link {
|
|
border: 1px solid #00b9fd;
|
|
}
|
|
|
|
.bom-color {
|
|
width: 20%;
|
|
}
|
|
|
|
.color-column input {
|
|
width: 1.6rem;
|
|
height: 1rem;
|
|
border: 1px solid black;
|
|
cursor: pointer;
|
|
padding: 0;
|
|
}
|
|
|
|
/* removes default styling from input color element */
|
|
::-webkit-color-swatch {
|
|
border: none;
|
|
}
|
|
|
|
::-webkit-color-swatch-wrapper {
|
|
padding: 0;
|
|
}
|
|
|
|
::-moz-color-swatch,
|
|
::-moz-focus-inner {
|
|
border: none;
|
|
}
|
|
|
|
::-moz-focus-inner {
|
|
padding: 0;
|
|
}
|
|
|
|
</style>
|
|
<script type="text/javascript" >
|
|
///////////////////////////////////////////////
|
|
/*
|
|
Split.js - v1.3.5
|
|
MIT License
|
|
https://github.com/nathancahill/Split.js
|
|
*/
|
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
|
|
// This work is free. You can redistribute it and/or modify it
|
|
// under the terms of the WTFPL, Version 2
|
|
// For more information see LICENSE.txt or http://www.wtfpl.net/
|
|
//
|
|
// For more information, the home page:
|
|
// http://pieroxy.net/blog/pages/lz-string/testing.html
|
|
//
|
|
// LZ-based compression algorithm, version 1.4.4
|
|
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*!
|
|
* PEP v0.4.3 | https://github.com/jquery/PEP
|
|
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
|
|
*/
|
|
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
|
|
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
|
|
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
|
|
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
|
|
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
|
|
for(var b=a;b.parentNode;)b=b.parentNode;
|
|
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
|
|
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
|
|
//
|
|
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
|
|
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
|
|
var b=x(a,this.findElements,this);
|
|
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
|
|
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
|
|
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
|
|
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
|
|
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
|
|
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
|
|
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
|
|
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
|
|
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
|
|
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
|
|
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
|
|
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
|
|
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
|
|
b=!1;else if("XY"===c)
|
|
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
|
|
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
|
|
vacuumTouches:function(a){var b=a.touches;
|
|
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
|
|
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
|
|
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
|
|
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
|
|
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
|
|
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
|
|
if(this.isPrimaryTouch(c)){
|
|
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
var storage;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
function readStorage(key) {
|
|
if (storage) {
|
|
return storage.getItem(storagePrefix + key);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function writeStorage(key, value) {
|
|
if (storage) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
}
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function () {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function () {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function saveBomTable(output) {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
var name = node.firstChild.nodeValue ?? "";
|
|
text += (output == 'csv' ? `"${name}"` : name);
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
let val = '';
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
val += '✓';
|
|
}
|
|
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
|
|
val += node.firstChild.nodeValue;
|
|
} else {
|
|
val += node.nodeValue;
|
|
}
|
|
}
|
|
if (output == 'csv') {
|
|
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
|
|
if (isNumeric(val)) {
|
|
val = +val; // use number
|
|
} else {
|
|
val = `"${val}"`; // enclosed within double-quote
|
|
}
|
|
}
|
|
text += val;
|
|
if (cell != row.lastChild) {
|
|
text += (output == 'csv' ? ',' : '\t');
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
|
|
if (output != 'clipboard') {
|
|
// To file: csv or txt
|
|
var blob = new Blob([text], {
|
|
type: `text/${output}`
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
|
|
} else {
|
|
// To clipboard
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
}
|
|
|
|
function isNumeric(str) {
|
|
/* https://stackoverflow.com/a/175787 */
|
|
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function (s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
valueAltRegex: 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"] = {};
|
|
var allList = getBomListByLayer('FB').flat();
|
|
for (var id in pcbdata.bom.fields) {
|
|
var ref_key = allList.find(item => item[1] == Number(id)) || [];
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index], ref_key[0] || '');
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
return unit[0];
|
|
}
|
|
|
|
var resarr = /^([a-z]+)\d+$/i.exec(ref);
|
|
switch (Array.isArray(resarr) && resarr[1].toLowerCase()) {
|
|
case "c": return 'f';
|
|
case "l": return 'h';
|
|
case "r":
|
|
case "rv": return 'r';
|
|
}
|
|
return null;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
if (Array.isArray(match)) {
|
|
var unit = inferUnit(match[3], ref);
|
|
var val_i = parseFloat(match[1]);
|
|
if (!unit) return null;
|
|
if (match[2]) {
|
|
val_i = val_i * units.getMultiplier(match[2]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
|
|
match = units.valueAltRegex.exec(val);
|
|
if (Array.isArray(match) && (match[1] || match[4])) {
|
|
var unit = inferUnit(match[2], ref);
|
|
var val_i = parseFloat(match[1] + "." + match[4]);
|
|
if (!unit) return null;
|
|
if (match[3]) {
|
|
val_i = val_i * units.getMultiplier(match[3]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {
|
|
type: "application/json"
|
|
});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function (e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch (e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function resetSettings() {
|
|
if (!confirm(
|
|
`This will reset all checkbox states and other settings.\n\n` +
|
|
`Press OK if you want to continue.`)) {
|
|
return;
|
|
}
|
|
if (storage) {
|
|
var keys = [];
|
|
for (var i = 0; i < storage.length; i++) {
|
|
var key = storage.key(i);
|
|
if (key.startsWith(storagePrefix)) keys.push(key);
|
|
}
|
|
for (var key of keys) storage.removeItem(key);
|
|
}
|
|
location.reload();
|
|
}
|
|
|
|
function overwriteSettings(newSettings) {
|
|
initDone = false;
|
|
Object.assign(settings, newSettings);
|
|
writeStorage("bomlayout", settings.bomlayout);
|
|
writeStorage("bommode", settings.bommode);
|
|
writeStorage("canvaslayout", settings.canvaslayout);
|
|
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
|
|
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
|
|
for (var checkbox of settings.checkboxes) {
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
}
|
|
writeStorage("markWhenChecked", settings.markWhenChecked);
|
|
padsVisible(settings.renderPads);
|
|
document.getElementById("padsCheckbox").checked = settings.renderPads;
|
|
fabricationVisible(settings.renderFabrication);
|
|
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
|
|
silkscreenVisible(settings.renderSilkscreen);
|
|
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
|
|
referencesVisible(settings.renderReferences);
|
|
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
|
|
valuesVisible(settings.renderValues);
|
|
document.getElementById("valuesCheckbox").checked = settings.renderValues;
|
|
tracksVisible(settings.renderTracks);
|
|
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
|
|
zonesVisible(settings.renderZones);
|
|
document.getElementById("zonesCheckbox").checked = settings.renderZones;
|
|
dnpOutline(settings.renderDnpOutline);
|
|
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
|
|
setRedrawOnDrag(settings.redrawOnDrag);
|
|
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
|
|
setHighlightRowOnClick(settings.highlightRowOnClick);
|
|
document.getElementById("highlightRowOnClickCheckbox").checked = settings.highlightRowOnClick;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
setOffsetBackRotation(settings.offsetBackRotation);
|
|
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
function saveFile(filename, blob) {
|
|
var link = document.createElement("a");
|
|
var objurl = URL.createObjectURL(blob);
|
|
link.download = filename;
|
|
link.href = objurl;
|
|
link.click();
|
|
}
|
|
|
|
function dataURLtoBlob(dataurl) {
|
|
var arr = dataurl.split(','),
|
|
mime = arr[0].match(/:(.*?);/)[1],
|
|
bstr = atob(arr[1]),
|
|
n = bstr.length,
|
|
u8arr = new Uint8Array(n);
|
|
while (n--) {
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new Blob([u8arr], {
|
|
type: mime
|
|
});
|
|
}
|
|
|
|
var settings = {
|
|
canvaslayout: "FB",
|
|
bomlayout: "left-right",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: "none",
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
offsetBackRotation: false,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
netColors: {},
|
|
}
|
|
|
|
function initDefaults() {
|
|
settings.bomlayout = readStorage("bomlayout");
|
|
if (settings.bomlayout === null) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
settings.bommode = readStorage("bommode");
|
|
if (settings.bommode === null) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (settings.bommode == "netlist" && !pcbdata.nets) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
settings.canvaslayout = readStorage("canvaslayout");
|
|
if (settings.canvaslayout === null) {
|
|
settings.canvaslayout = config.layer_view;
|
|
}
|
|
var bomCheckboxes = readStorage("bomCheckboxes");
|
|
if (bomCheckboxes === null) {
|
|
bomCheckboxes = config.checkboxes;
|
|
}
|
|
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
|
|
document.getElementById("bomCheckboxes").value = bomCheckboxes;
|
|
|
|
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
|
|
if (highlightpin1 === "false") highlightpin1 = "none";
|
|
if (highlightpin1 === "true") highlightpin1 = "all";
|
|
setHighlightPin1(highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
|
|
|
|
settings.markWhenChecked = readStorage("markWhenChecked") || "";
|
|
populateMarkWhenCheckedOptions();
|
|
|
|
function initBooleanSetting(storageString, def, elementId, func) {
|
|
var b = readStorage(storageString);
|
|
if (b === null) {
|
|
b = def;
|
|
} else {
|
|
b = (b == "true");
|
|
}
|
|
document.getElementById(elementId).checked = b;
|
|
func(b);
|
|
}
|
|
|
|
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
|
|
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
|
|
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
|
|
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
|
|
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
|
|
if ("tracks" in pcbdata) {
|
|
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
|
|
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
|
|
} else {
|
|
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
|
|
tracksVisible(false);
|
|
zonesVisible(false);
|
|
}
|
|
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
|
|
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
|
|
initBooleanSetting("highlightRowOnClick", false, "highlightRowOnClickCheckbox", setHighlightRowOnClick);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
|
|
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
|
|
var hcols = JSON.parse(readStorage("hiddenColumns"));
|
|
if (hcols === null) {
|
|
hcols = [];
|
|
}
|
|
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
|
|
|
|
var cord = JSON.parse(readStorage("columnOrder"));
|
|
if (cord === null) {
|
|
cord = fields;
|
|
} else {
|
|
cord = cord.filter(e => fields.includes(e));
|
|
if (cord.length != fields.length)
|
|
cord = fields;
|
|
}
|
|
settings.columnOrder = cord;
|
|
|
|
settings.boardRotation = readStorage("boardRotation");
|
|
if (settings.boardRotation === null) {
|
|
settings.boardRotation = config.board_rotation * 5;
|
|
} else {
|
|
settings.boardRotation = parseInt(settings.boardRotation);
|
|
}
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
|
|
|
|
settings.netColors = JSON.parse(readStorage("netColors")) || {};
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function () {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function (eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function (eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for (callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawText(ctx, text, color) {
|
|
if ("ref" in text && !settings.renderReferences) return;
|
|
if ("val" in text && !settings.renderValues) return;
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.lineWidth = text.thickness;
|
|
if ("svgpath" in text) {
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
if ("polygons" in text) {
|
|
ctx.fill(getPolygonsPath(text));
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (config.kicad_text_formatting) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
offsety += interline;
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
if ("svgpath" in edge) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
if (edge.type == "rect") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(edge.start[0], edge.end[1]);
|
|
ctx.lineTo(...edge.end);
|
|
ctx.lineTo(edge.end[0], edge.start[1]);
|
|
ctx.lineTo(...edge.start);
|
|
}
|
|
if (edge.type == "arc") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
deg2rad(edge.startangle),
|
|
deg2rad(edge.endangle));
|
|
}
|
|
if (edge.type == "circle") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
0, 2 * Math.PI);
|
|
ctx.closePath();
|
|
}
|
|
if (edge.type == "curve") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
|
|
}
|
|
if("filled" in edge && edge.filled)
|
|
ctx.fill();
|
|
else
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
|
|
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
|
|
var path = new Path2D();
|
|
var width = size[0];
|
|
var height = size[1];
|
|
var x = width * -0.5;
|
|
var y = height * -0.5;
|
|
var chamfOffset = Math.min(width, height) * chamfratio;
|
|
path.moveTo(x, 0);
|
|
if (chamfpos & 4) {
|
|
path.lineTo(x, y + height - chamfOffset);
|
|
path.lineTo(x + chamfOffset, y + height);
|
|
path.lineTo(0, y + height);
|
|
} else {
|
|
path.arcTo(x, y + height, x + width, y + height, radius);
|
|
}
|
|
if (chamfpos & 8) {
|
|
path.lineTo(x + width - chamfOffset, y + height);
|
|
path.lineTo(x + width, y + height - chamfOffset);
|
|
path.lineTo(x + width, 0);
|
|
} else {
|
|
path.arcTo(x + width, y + height, x + width, y, radius);
|
|
}
|
|
if (chamfpos & 2) {
|
|
path.lineTo(x + width, y + chamfOffset);
|
|
path.lineTo(x + width - chamfOffset, y);
|
|
path.lineTo(0, y);
|
|
} else {
|
|
path.arcTo(x + width, y, x, y, radius);
|
|
}
|
|
if (chamfpos & 1) {
|
|
path.lineTo(x + chamfOffset, y);
|
|
path.lineTo(x, y + chamfOffset);
|
|
path.lineTo(x, 0);
|
|
} else {
|
|
path.arcTo(x, y, x, y + height, radius);
|
|
}
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getOblongPath(size) {
|
|
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
|
|
}
|
|
|
|
function getPolygonsPath(shape) {
|
|
if (shape.path2d) {
|
|
return shape.path2d;
|
|
}
|
|
if ("svgpath" in shape) {
|
|
shape.path2d = new Path2D(shape.svgpath);
|
|
} else {
|
|
var path = new Path2D();
|
|
for (var polygon of shape.polygons) {
|
|
path.moveTo(...polygon[0]);
|
|
for (var i = 1; i < polygon.length; i++) {
|
|
path.lineTo(...polygon[i]);
|
|
}
|
|
path.closePath();
|
|
}
|
|
shape.path2d = path;
|
|
}
|
|
return shape.path2d;
|
|
}
|
|
|
|
function drawPolygonShape(ctx, scalefactor, shape, color) {
|
|
ctx.save();
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
if("filled" in shape && !shape.filled) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.stroke(getPolygonsPath(shape));
|
|
} else {
|
|
ctx.fillStyle = color;
|
|
ctx.fill(getPolygonsPath(shape));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, drawing, color);
|
|
} else {
|
|
drawText(ctx, drawing, color);
|
|
}
|
|
}
|
|
|
|
function getCirclePath(radius) {
|
|
var path = new Path2D();
|
|
path.arc(0, 0, radius, 0, 2 * Math.PI);
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getCachedPadPath(pad) {
|
|
if (!pad.path2d) {
|
|
// if path2d is not set, build one and cache it on pad object
|
|
if (pad.shape == "rect") {
|
|
pad.path2d = new Path2D();
|
|
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
|
|
} else if (pad.shape == "oval") {
|
|
pad.path2d = getOblongPath(pad.size);
|
|
} else if (pad.shape == "circle") {
|
|
pad.path2d = getCirclePath(pad.size[0] / 2);
|
|
} else if (pad.shape == "roundrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
|
|
} else if (pad.shape == "chamfrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
|
|
} else if (pad.shape == "custom") {
|
|
pad.path2d = getPolygonsPath(pad);
|
|
}
|
|
}
|
|
return pad.path2d;
|
|
}
|
|
|
|
function drawPad(ctx, pad, color, outline) {
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
if (pad.offset) {
|
|
ctx.translate(...pad.offset);
|
|
}
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
var path = getCachedPadPath(pad);
|
|
if (outline) {
|
|
ctx.stroke(path);
|
|
} else {
|
|
ctx.fill(path);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawPadHole(ctx, pad, padHoleColor) {
|
|
if (pad.type != "th") return;
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
ctx.rotate(-deg2rad(pad.angle));
|
|
ctx.fillStyle = padHoleColor;
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else if (pad.drillshape == "rect") {
|
|
ctx.fill(getChamferedRectPath(pad.drillsize, 0, 0, 0));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (footprint.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...footprint.bbox.pos);
|
|
ctx.rotate(deg2rad(-footprint.bbox.angle));
|
|
ctx.translate(...footprint.bbox.relpos);
|
|
ctx.fillStyle = colors.pad;
|
|
ctx.fillRect(0, 0, ...footprint.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = colors.pad;
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
ctx.strokeRect(0, 0, ...footprint.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of footprint.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
|
|
}
|
|
}
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, colors.pad, outline);
|
|
if (pad.pin1 &&
|
|
(settings.highlightpin1 == "all" ||
|
|
settings.highlightpin1 == "selected" && highlight)) {
|
|
drawPad(ctx, pad, colors.outline, true);
|
|
}
|
|
}
|
|
}
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, colors.padHole);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawDrawing(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawFootprints(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
|
|
var colors = {
|
|
pad: style.getPropertyValue('--pad-color'),
|
|
padHole: style.getPropertyValue('--pad-hole-color'),
|
|
outline: style.getPropertyValue('--pin1-outline-color'),
|
|
}
|
|
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var mod = pcbdata.footprints[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
var h = highlightedFootprints.includes(i);
|
|
var d = markedFootprints.has(i);
|
|
if (highlight) {
|
|
if(h && d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
|
|
} else if (h) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
} else if (d) {
|
|
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
|
|
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
|
|
}
|
|
}
|
|
if( h || d || !highlight) {
|
|
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata.drawings[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, scalefactor, d, polygonColor);
|
|
} else {
|
|
drawText(ctx, d, textColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawTracks(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineCap = "round";
|
|
|
|
var hasHole = (track) => (
|
|
'drillsize' in track &&
|
|
track.start[0] == track.end[0] &&
|
|
track.start[1] == track.end[1]);
|
|
|
|
// First draw tracks and tented vias
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (!hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
if ('radius' in track) {
|
|
ctx.arc(
|
|
...track.center,
|
|
track.radius,
|
|
deg2rad(track.startangle),
|
|
deg2rad(track.endangle));
|
|
} else {
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
// Second pass to draw untented vias
|
|
var style = getComputedStyle(topmostdiv);
|
|
var holeColor = style.getPropertyValue('--pad-hole-color')
|
|
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
ctx.strokeStyle = holeColor;
|
|
ctx.lineWidth = track.drillsize;
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
|
|
if (zone.width > 0) {
|
|
ctx.lineWidth = zone.width;
|
|
ctx.stroke(zone.path2d);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clearCanvas(canvas, color = null) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
if (color) {
|
|
ctx.fillStyle = color;
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
} else {
|
|
if (!window.matchMedia("print").matches)
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
if (highlightedNet !== null) {
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
drawFootprints(canvasdict.bg, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer === "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox, flip) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var flip = (layerdict.layer === "B");
|
|
var bbox = applyRotation(pcbdata.edges_bbox, flip);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function modulo(n, mod) {
|
|
return ((n % mod) + mod) % mod;
|
|
}
|
|
|
|
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
|
|
var dx = x - xc;
|
|
var dy = y - yc;
|
|
var r_sq = dx * dx + dy * dy;
|
|
var rmin = Math.max(0, radius - d);
|
|
var rmax = radius + d;
|
|
|
|
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
|
|
return false;
|
|
|
|
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
|
|
var dx1 = xc + radius * Math.cos(angle1) - x;
|
|
var dy1 = yc + radius * Math.sin(angle1) - y;
|
|
if (dx1 * dx1 + dy1 * dy1 <= d * d)
|
|
return true;
|
|
|
|
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
|
|
var dx2 = xc + radius * Math.cos(angle2) - x;
|
|
var dy2 = yc + radius * Math.sin(angle2) - y;
|
|
if (dx2 * dx2 + dy2 * dy2 <= d * d)
|
|
return true;
|
|
|
|
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
|
|
if (angle1 > angle2)
|
|
return (angle >= angle2 || angle <= angle1);
|
|
else
|
|
return (angle >= angle1 && angle <= angle2);
|
|
}
|
|
|
|
function pointWithinPad(x, y, pad) {
|
|
var v = [x - pad.pos[0], y - pad.pos[1]];
|
|
v = rotateVector(v, pad.angle);
|
|
if (pad.offset) {
|
|
v[0] -= pad.offset[0];
|
|
v[1] -= pad.offset[1];
|
|
}
|
|
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
|
|
}
|
|
|
|
function netHitScan(layer, x, y) {
|
|
// Check track segments
|
|
if (settings.renderTracks && pcbdata.tracks) {
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if ('radius' in track) {
|
|
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
} else {
|
|
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
for (var footprint of pcbdata.footprints) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinFootprintBbox(x, y, bbox) {
|
|
var v = [x - bbox.pos[0], y - bbox.pos[1]];
|
|
v = rotateVector(v, bbox.angle);
|
|
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
|
|
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
|
|
}
|
|
|
|
function bboxHitScan(layer, x, y) {
|
|
var result = [];
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var footprint = pcbdata.footprints[i];
|
|
if (footprint.layer == layer) {
|
|
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0 && e.button != 1) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
layerdict.pointerStates[e.pointerId] = {
|
|
distanceTravelled: 0,
|
|
lastX: e.offsetX,
|
|
lastY: e.offsetY,
|
|
downTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
function handleMouseClick(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var x = e.offsetX;
|
|
var y = e.offsetY;
|
|
var t = layerdict.transform;
|
|
var flip = layerdict.layer === "B";
|
|
if (flip) {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
|
|
} else {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
|
|
}
|
|
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
|
|
var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var footprints = bboxHitScan(layerdict.layer, ...v);
|
|
if (footprints.length > 0) {
|
|
footprintsClicked(footprints);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handlePointerLeave(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function resetTransform(layerdict) {
|
|
layerdict.transform.panx = 0;
|
|
layerdict.transform.pany = 0;
|
|
layerdict.transform.zoom = 1;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function handlePointerUp(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (e.button == 2) {
|
|
// Reset pan and zoom on right click.
|
|
resetTransform(layerdict);
|
|
layerdict.anotherPointerTapped = false;
|
|
return;
|
|
}
|
|
|
|
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
|
|
var ptr = layerdict.pointerStates[e.pointerId];
|
|
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
|
|
|
|
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
if (layerdict.anotherPointerTapped) {
|
|
// This is the second pointer coming off of a two-finger tap
|
|
resetTransform(layerdict);
|
|
} else {
|
|
// This is just a regular tap
|
|
handleMouseClick(e, layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
} else {
|
|
// This is the first finger coming off of what could become a two-finger tap
|
|
layerdict.anotherPointerTapped = true;
|
|
}
|
|
} else {
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function handlePointerMove(e, layerdict) {
|
|
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var thisPtr = layerdict.pointerStates[e.pointerId];
|
|
|
|
var dx = e.offsetX - thisPtr.lastX;
|
|
var dy = e.offsetY - thisPtr.lastY;
|
|
|
|
// If this number is low on pointer up, we count the action as a click
|
|
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
|
|
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
// This is a simple drag
|
|
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
|
|
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
|
|
} else if (Object.keys(layerdict.pointerStates).length == 2) {
|
|
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
|
|
|
|
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
|
|
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
|
|
|
|
var scaleFactor = newDist / oldDist;
|
|
|
|
if (scaleFactor != NaN) {
|
|
layerdict.transform.zoom *= scaleFactor;
|
|
|
|
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
|
|
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
|
|
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
|
|
}
|
|
}
|
|
|
|
thisPtr.lastX = e.offsetX;
|
|
thisPtr.lastY = e.offsetY;
|
|
|
|
if (settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
}
|
|
|
|
function handleMouseWheel(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var t = layerdict.transform;
|
|
var wheeldelta = e.deltaY;
|
|
if (e.deltaMode == 1) {
|
|
// FF only, scroll by lines
|
|
wheeldelta *= 30;
|
|
} else if (e.deltaMode == 2) {
|
|
wheeldelta *= 300;
|
|
}
|
|
var m = Math.pow(1.1, -wheeldelta / 40);
|
|
// Limit amount of zoom per tick.
|
|
if (m > 2) {
|
|
m = 2;
|
|
} else if (m < 0.5) {
|
|
m = 0.5;
|
|
}
|
|
t.zoom *= m;
|
|
var zoomd = (1 - m) / t.zoom;
|
|
t.panx += devicePixelRatio * e.offsetX * zoomd;
|
|
t.pany += devicePixelRatio * e.offsetY * zoomd;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function addMouseHandlers(div, layerdict) {
|
|
div.addEventListener("pointerdown", function(e) {
|
|
handlePointerDown(e, layerdict);
|
|
});
|
|
div.addEventListener("pointermove", function(e) {
|
|
handlePointerMove(e, layerdict);
|
|
});
|
|
div.addEventListener("pointerup", function(e) {
|
|
handlePointerUp(e, layerdict);
|
|
});
|
|
var pointerleave = function(e) {
|
|
handlePointerLeave(e, layerdict);
|
|
}
|
|
div.addEventListener("pointercancel", pointerleave);
|
|
div.addEventListener("pointerleave", pointerleave);
|
|
div.addEventListener("pointerout", pointerleave);
|
|
|
|
div.onwheel = function(e) {
|
|
handleMouseWheel(e, layerdict);
|
|
}
|
|
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
|
|
element.addEventListener("contextmenu", function(e) {
|
|
e.preventDefault();
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function setRedrawOnDrag(value) {
|
|
settings.redrawOnDrag = value;
|
|
writeStorage("redrawOnDrag", value);
|
|
}
|
|
|
|
function setBoardRotation(value) {
|
|
settings.boardRotation = value * 5;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
resizeAll();
|
|
}
|
|
|
|
function setOffsetBackRotation(value) {
|
|
settings.offsetBackRotation = value;
|
|
writeStorage("offsetBackRotation", value);
|
|
resizeAll();
|
|
}
|
|
|
|
function initRender() {
|
|
allcanvas = {
|
|
front: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("F_bg"),
|
|
fab: document.getElementById("F_fab"),
|
|
silk: document.getElementById("F_slk"),
|
|
highlight: document.getElementById("F_hl"),
|
|
layer: "F",
|
|
},
|
|
back: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("B_bg"),
|
|
fab: document.getElementById("B_fab"),
|
|
silk: document.getElementById("B_slk"),
|
|
highlight: document.getElementById("B_hl"),
|
|
layer: "B",
|
|
}
|
|
};
|
|
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
|
|
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*
|
|
* Table reordering via Drag'n'Drop
|
|
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
|
|
*/
|
|
|
|
function setBomHandlers() {
|
|
|
|
const bom = document.getElementById('bomtable');
|
|
|
|
let dragName;
|
|
let placeHolderElements;
|
|
let draggingElement;
|
|
let forcePopulation;
|
|
let xOffset;
|
|
let yOffset;
|
|
let wasDragged;
|
|
|
|
const mouseUpHandler = function(e) {
|
|
// Delete dragging element
|
|
draggingElement.remove();
|
|
|
|
// Make BOM selectable again
|
|
bom.style.removeProperty("userSelect");
|
|
|
|
// Remove listeners
|
|
document.removeEventListener('mousemove', mouseMoveHandler);
|
|
document.removeEventListener('mouseup', mouseUpHandler);
|
|
|
|
if (wasDragged) {
|
|
// Redraw whole BOM
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
const mouseMoveHandler = function(e) {
|
|
// Notice the dragging
|
|
wasDragged = true;
|
|
|
|
// Make the dragged element visible
|
|
draggingElement.style.removeProperty("display");
|
|
|
|
// Set elements position to mouse position
|
|
draggingElement.style.left = `${e.screenX - xOffset}px`;
|
|
draggingElement.style.top = `${e.screenY - yOffset}px`;
|
|
|
|
// Forced redrawing of BOM table
|
|
if (forcePopulation) {
|
|
forcePopulation = false;
|
|
// Copy array
|
|
phe = Array.from(placeHolderElements);
|
|
// populate BOM table again
|
|
populateBomHeader(dragName, phe);
|
|
populateBomBody(dragName, phe);
|
|
}
|
|
|
|
// Set up array of hidden columns
|
|
var hiddenColumns = Array.from(settings.hiddenColumns);
|
|
// In the ungrouped mode, quantity don't exist
|
|
if (settings.bommode === "ungrouped")
|
|
hiddenColumns.push("Quantity");
|
|
// If no checkbox fields can be found, we consider them hidden
|
|
if (settings.checkboxes.length == 0)
|
|
hiddenColumns.push("checkboxes");
|
|
|
|
// Get table headers and group them into checkboxes, extrafields and normal headers
|
|
const bh = document.getElementById("bomhead");
|
|
headers = Array.from(bh.querySelectorAll("th"))
|
|
headers.shift() // numCol is not part of the columnOrder
|
|
headerGroups = []
|
|
lastCompoundClass = null;
|
|
for (i = 0; i < settings.columnOrder.length; i++) {
|
|
cElem = settings.columnOrder[i];
|
|
if (hiddenColumns.includes(cElem)) {
|
|
// Hidden columns appear as a dummy element
|
|
headerGroups.push([]);
|
|
continue;
|
|
}
|
|
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
|
|
if (elem.classList.contains("bom-checkbox")) {
|
|
if (lastCompoundClass === "bom-checkbox") {
|
|
cbGroup = headerGroups.pop();
|
|
cbGroup.push(elem);
|
|
headerGroups.push(cbGroup);
|
|
} else {
|
|
lastCompoundClass = "bom-checkbox";
|
|
headerGroups.push([elem])
|
|
}
|
|
} else {
|
|
headerGroups.push([elem])
|
|
}
|
|
}
|
|
|
|
// Copy settings.columnOrder
|
|
var columns = Array.from(settings.columnOrder)
|
|
|
|
// Set up array with indices of hidden columns
|
|
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
|
|
var dragIndex = columns.indexOf(dragName);
|
|
var swapIndex = dragIndex;
|
|
var swapDone = false;
|
|
|
|
// Check if the current dragged element is swapable with the left or right element
|
|
if (dragIndex > 0) {
|
|
// Get left headers boundingbox
|
|
swapIndex = dragIndex - 1;
|
|
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
|
|
swapIndex--;
|
|
if (!hiddenIndices.includes(swapIndex)) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
|
|
// Get right headers boundingbox
|
|
swapIndex = dragIndex + 1;
|
|
while (hiddenIndices.includes(swapIndex))
|
|
swapIndex++;
|
|
if (swapIndex < headerGroups.length) {
|
|
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
|
|
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
|
|
swapElement = columns[dragIndex];
|
|
columns.splice(dragIndex, 1);
|
|
columns.splice(swapIndex, 0, swapElement);
|
|
forcePopulation = true;
|
|
swapDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Write back change to storage
|
|
if (swapDone) {
|
|
settings.columnOrder = columns
|
|
writeStorage("columnOrder", JSON.stringify(columns));
|
|
}
|
|
|
|
}
|
|
|
|
const mouseDownHandler = function(e) {
|
|
var target = e.target;
|
|
if (target.tagName.toLowerCase() != "td")
|
|
target = target.parentElement;
|
|
|
|
// Used to check if a dragging has ever happened
|
|
wasDragged = false;
|
|
|
|
// Create new element which will be displayed as the dragged column
|
|
draggingElement = document.createElement("div")
|
|
draggingElement.classList.add("dragging");
|
|
draggingElement.style.display = "none";
|
|
draggingElement.style.position = "absolute";
|
|
draggingElement.style.overflow = "hidden";
|
|
|
|
// Get bomhead and bombody elements
|
|
const bh = document.getElementById("bomhead");
|
|
const bb = document.getElementById("bombody");
|
|
|
|
// Get all compound headers for the current column
|
|
var compoundHeaders;
|
|
if (target.classList.contains("bom-checkbox")) {
|
|
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
|
|
} else {
|
|
compoundHeaders = [target];
|
|
}
|
|
|
|
// Create new table which will display the column
|
|
var newTable = document.createElement("table");
|
|
newTable.classList.add("bom");
|
|
newTable.style.background = "white";
|
|
draggingElement.append(newTable);
|
|
|
|
// Create new header element
|
|
var newHeader = document.createElement("thead");
|
|
newTable.append(newHeader);
|
|
|
|
// Set up array for storing all placeholder elements
|
|
placeHolderElements = [];
|
|
|
|
// Add all compound headers to the new thead element and placeholders
|
|
compoundHeaders.forEach(function(h) {
|
|
clone = cloneElementWithDimensions(h);
|
|
newHeader.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
|
|
// Create new body element
|
|
var newBody = document.createElement("tbody");
|
|
newTable.append(newBody);
|
|
|
|
// Get indices for compound headers
|
|
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
|
|
|
|
// For each row in the BOM body...
|
|
var rows = bb.querySelectorAll("tr");
|
|
rows.forEach(function(row) {
|
|
// ..get the cells for the compound column
|
|
const tds = row.querySelectorAll("td");
|
|
var copytds = idxs.map(i => tds[i]);
|
|
// Add them to the new element and the placeholders
|
|
var newRow = document.createElement("tr");
|
|
copytds.forEach(function(td) {
|
|
clone = cloneElementWithDimensions(td);
|
|
newRow.append(clone);
|
|
placeHolderElements.push(clone);
|
|
});
|
|
newBody.append(newRow);
|
|
});
|
|
|
|
// Compute width for compound header
|
|
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
|
|
draggingElement.style.width = `${width}px`;
|
|
|
|
// Insert the new dragging element and disable selection on BOM
|
|
bom.insertBefore(draggingElement, null);
|
|
bom.style.userSelect = "none";
|
|
|
|
// Determine the mouse position offset
|
|
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
|
|
yOffset = e.screenY - compoundHeaders[0].offsetTop;
|
|
|
|
// Get name for the column in settings.columnOrder
|
|
dragName = getColumnOrderName(target);
|
|
|
|
// Change text and class for placeholder elements
|
|
placeHolderElements = placeHolderElements.map(function(e) {
|
|
newElem = cloneElementWithDimensions(e);
|
|
newElem.textContent = "";
|
|
newElem.classList.add("placeholder");
|
|
return newElem;
|
|
});
|
|
|
|
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
|
|
forcePopulation = true;
|
|
|
|
// Add listeners for move and up on mouse
|
|
document.addEventListener('mousemove', mouseMoveHandler);
|
|
document.addEventListener('mouseup', mouseUpHandler);
|
|
}
|
|
|
|
// In netlist mode, there is nothing to reorder
|
|
if (settings.bommode === "netlist")
|
|
return;
|
|
|
|
// Add mouseDownHandler to every column except the numCol
|
|
bom.querySelectorAll("th")
|
|
.forEach(function(head) {
|
|
if (!head.classList.contains("numCol")) {
|
|
head.onmousedown = mouseDownHandler;
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function getBoundingClientRectFromMultiple(elements) {
|
|
var elems = Array.from(elements);
|
|
|
|
if (elems.length == 0)
|
|
return null;
|
|
|
|
var box = elems.shift()
|
|
.getBoundingClientRect();
|
|
|
|
elems.forEach(function(elem) {
|
|
var elembox = elem.getBoundingClientRect();
|
|
box.left = Math.min(elembox.left, box.left);
|
|
box.top = Math.min(elembox.top, box.top);
|
|
box.width += elembox.width;
|
|
box.height = Math.max(elembox.height, box.height);
|
|
});
|
|
|
|
return box;
|
|
}
|
|
|
|
function cloneElementWithDimensions(elem) {
|
|
var newElem = elem.cloneNode(true);
|
|
newElem.style.height = window.getComputedStyle(elem).height;
|
|
newElem.style.width = window.getComputedStyle(elem).width;
|
|
return newElem;
|
|
}
|
|
|
|
function getBomTableHeaderIndex(elem) {
|
|
const bh = document.getElementById('bomhead');
|
|
const ths = Array.from(bh.querySelectorAll("th"));
|
|
return ths.indexOf(elem);
|
|
}
|
|
|
|
function getColumnOrderName(elem) {
|
|
var cname = elem.getAttribute("col_name");
|
|
if (cname === "bom-checkbox")
|
|
return "checkboxes";
|
|
else
|
|
return cname;
|
|
}
|
|
|
|
function resizableGrid(tablehead) {
|
|
var cols = tablehead.firstElementChild.children;
|
|
var rowWidth = tablehead.offsetWidth;
|
|
|
|
for (var i = 1; i < cols.length; i++) {
|
|
if (cols[i].classList.contains("bom-checkbox"))
|
|
continue;
|
|
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
|
|
}
|
|
|
|
for (var i = 1; i < cols.length - 1; i++) {
|
|
var div = document.createElement('div');
|
|
div.className = "column-width-handle";
|
|
cols[i].appendChild(div);
|
|
setListeners(div);
|
|
}
|
|
|
|
function setListeners(div) {
|
|
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
|
|
|
|
div.addEventListener('mousedown', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
curCol = e.target.parentElement;
|
|
nxtCol = curCol.nextElementSibling;
|
|
startX = e.pageX;
|
|
|
|
var padding = paddingDiff(curCol);
|
|
|
|
rowWidth = curCol.parentElement.offsetWidth;
|
|
curColWidth = curCol.clientWidth - padding;
|
|
nxtColWidth = nxtCol.clientWidth - padding;
|
|
});
|
|
|
|
document.addEventListener('mousemove', function(e) {
|
|
if (startX) {
|
|
var diffX = e.pageX - startX;
|
|
diffX = -Math.min(-diffX, curColWidth - 20);
|
|
diffX = Math.min(diffX, nxtColWidth - 20);
|
|
|
|
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
|
|
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
|
|
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('mouseup', function(e) {
|
|
curCol = undefined;
|
|
nxtCol = undefined;
|
|
startX = undefined;
|
|
nxtColWidth = undefined;
|
|
curColWidth = undefined
|
|
});
|
|
}
|
|
|
|
function paddingDiff(col) {
|
|
|
|
if (getStyleVal(col, 'box-sizing') == 'border-box') {
|
|
return 0;
|
|
}
|
|
|
|
var padLeft = getStyleVal(col, 'padding-left');
|
|
var padRight = getStyleVal(col, 'padding-right');
|
|
return (parseInt(padLeft) + parseInt(padRight));
|
|
|
|
}
|
|
|
|
function getStyleVal(elm, css) {
|
|
return (window.getComputedStyle(elm, null).getPropertyValue(css))
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var markedFootprints = new Set();
|
|
var highlightedFootprints = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
function setShowBOMColumn(field, value) {
|
|
if (field === "references") {
|
|
var rl = document.getElementById("reflookup");
|
|
rl.disabled = !value;
|
|
if (!value) {
|
|
rl.value = "";
|
|
updateRefLookup("");
|
|
}
|
|
}
|
|
|
|
var n = settings.hiddenColumns.indexOf(field);
|
|
if (value) {
|
|
if (n != -1) {
|
|
settings.hiddenColumns.splice(n, 1);
|
|
}
|
|
} else {
|
|
if (n == -1) {
|
|
settings.hiddenColumns.push(field);
|
|
}
|
|
}
|
|
|
|
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
|
|
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
|
|
function setFullscreen(value) {
|
|
if (value) {
|
|
document.documentElement.requestFullscreen();
|
|
} else {
|
|
document.exitFullscreen();
|
|
}
|
|
}
|
|
|
|
function fabricationVisible(value) {
|
|
writeStorage("fabricationVisible", value);
|
|
settings.renderFabrication = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function silkscreenVisible(value) {
|
|
writeStorage("silkscreenVisible", value);
|
|
settings.renderSilkscreen = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightPin1(value) {
|
|
writeStorage("highlightpin1", value);
|
|
settings.highlightpin1 = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightRowOnClick(value) {
|
|
settings.highlightRowOnClick = value;
|
|
writeStorage("highlightRowOnClick", value);
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
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 createCheckboxHandlers(input, checkbox, references, row) {
|
|
var clickHandler = () => {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (input.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);
|
|
}
|
|
|
|
return [
|
|
(e) => {
|
|
clickHandler();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
if (row.onmousemove) row.onmousemove();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
input.checked = !input.checked;
|
|
input.indeterminate = false;
|
|
clickHandler();
|
|
}
|
|
];
|
|
}
|
|
|
|
function clearHighlightedFootprints() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedFootprints = [];
|
|
highlightedNet = null;
|
|
}
|
|
}
|
|
|
|
function createRowHighlightHandler(rowid, refs, net) {
|
|
return function () {
|
|
if (currentHighlightedRowId) {
|
|
if (currentHighlightedRowId == rowid) {
|
|
return;
|
|
}
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
}
|
|
document.getElementById(rowid).classList.add("highlighted");
|
|
currentHighlightedRowId = rowid;
|
|
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
function updateNetColors() {
|
|
writeStorage("netColors", JSON.stringify(settings.netColors));
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function netColorChangeHandler(net) {
|
|
return (event) => {
|
|
settings.netColors[net] = event.target.value;
|
|
updateNetColors();
|
|
}
|
|
}
|
|
|
|
function netColorRightClick(net) {
|
|
return (event) => {
|
|
if (event.button == 2) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
event.target.value = defaultNetColor;
|
|
delete settings.netColors[net];
|
|
updateNetColors();
|
|
}
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
if (!settings.hiddenColumns.includes("References")) {
|
|
for (var ref of entry) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// check fields
|
|
for (var i in config.fields) {
|
|
var f = config.fields[i];
|
|
if (!settings.hiddenColumns.includes(f)) {
|
|
for (var ref of entry) {
|
|
if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry.filter(r => r[0].toLowerCase() == reflookup);
|
|
}
|
|
|
|
function highlightFilter(s) {
|
|
if (!filter) {
|
|
return s;
|
|
}
|
|
var parts = s.toLowerCase().split(filter);
|
|
if (parts.length == 1) {
|
|
return s;
|
|
}
|
|
var r = "";
|
|
var pos = 0;
|
|
for (var i in parts) {
|
|
if (i > 0) {
|
|
r += '<mark class="highlight">' +
|
|
s.substring(pos, pos + filter.length) +
|
|
'</mark>';
|
|
pos += filter.length;
|
|
}
|
|
r += s.substring(pos, pos + parts[i].length);
|
|
pos += parts[i].length;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function getBomListByLayer(layer) {
|
|
switch (layer) {
|
|
case 'F': return pcbdata.bom.F.slice();
|
|
case 'B': return pcbdata.bom.B.slice();
|
|
case 'FB': return pcbdata.bom.both.slice();
|
|
}
|
|
return [];
|
|
}
|
|
|
|
function getSelectedBomList() {
|
|
if (settings.bommode == "netlist") {
|
|
return pcbdata.nets.slice();
|
|
}
|
|
var out = getBomListByLayer(settings.canvaslayout);
|
|
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
var expandedTable = [];
|
|
for (var bomentry of out) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
return expandedTable;
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
function checkboxSetUnsetAllHandler(checkboxname) {
|
|
return function () {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var allset = true;
|
|
var checkbox;
|
|
var row;
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
if (!checkbox.checked || checkbox.indeterminate) {
|
|
allset = false;
|
|
break;
|
|
}
|
|
}
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = !allset;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
}
|
|
}
|
|
|
|
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
if (is_checkbox)
|
|
th.setAttribute("col_name", "bom-checkbox");
|
|
else
|
|
th.setAttribute("col_name", name);
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
var spacer = document.createElement("div");
|
|
spacer.className = "column-spacer";
|
|
th.appendChild(spacer);
|
|
spacer.onclick = function () {
|
|
if (currentSortColumn && th !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && th === currentSortColumn) {
|
|
// Already sorted by this column
|
|
if (currentSortOrder == "asc") {
|
|
// Sort by this column, descending order
|
|
bomSortFunction = function (a, b) {
|
|
return -comparator(a, b);
|
|
}
|
|
currentSortColumn.childNodes[1].classList.remove("asc");
|
|
currentSortColumn.childNodes[1].classList.add("desc");
|
|
currentSortOrder = "desc";
|
|
} else {
|
|
// Unsort
|
|
bomSortFunction = null;
|
|
currentSortColumn.childNodes[1].classList.remove("desc");
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
} else {
|
|
// Sort by this column, ascending order
|
|
bomSortFunction = comparator;
|
|
currentSortColumn = th;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
if (is_checkbox) {
|
|
spacer.onclick = fancyDblClickHandler(
|
|
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
|
|
var vismenu = document.createElement("div");
|
|
vismenu.id = "vismenu";
|
|
vismenu.classList.add("menu");
|
|
|
|
var visbutton = document.createElement("div");
|
|
visbutton.classList.add("visbtn");
|
|
visbutton.classList.add("hideonprint");
|
|
|
|
var viscontent = document.createElement("div");
|
|
viscontent.classList.add("menu-content");
|
|
viscontent.id = "vismenu-content";
|
|
|
|
settings.columnOrder.forEach(column => {
|
|
if (typeof column !== "string")
|
|
return;
|
|
|
|
// Skip empty columns
|
|
if (column === "checkboxes" && settings.checkboxes.length == 0)
|
|
return;
|
|
else if (column === "Quantity" && settings.bommode == "ungrouped")
|
|
return;
|
|
|
|
var label = document.createElement("label");
|
|
label.classList.add("menu-label");
|
|
|
|
var input = document.createElement("input");
|
|
input.classList.add("visibility_checkbox");
|
|
input.type = "checkbox";
|
|
input.onchange = function (e) {
|
|
setShowBOMColumn(column, e.target.checked)
|
|
};
|
|
input.checked = !(settings.hiddenColumns.includes(column));
|
|
|
|
label.appendChild(input);
|
|
if (column.length > 0)
|
|
label.append(column[0].toUpperCase() + column.slice(1));
|
|
|
|
viscontent.appendChild(label);
|
|
});
|
|
|
|
viscontent.childNodes[0].classList.add("menu-label-top");
|
|
|
|
vismenu.appendChild(visbutton);
|
|
if (settings.bommode != "netlist") {
|
|
vismenu.appendChild(viscontent);
|
|
th.appendChild(vismenu);
|
|
}
|
|
tr.appendChild(th);
|
|
|
|
var checkboxCompareClosure = function (checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a);
|
|
var stateB = getCheckboxState(checkbox, b);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
var stringFieldCompareClosure = function (fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
|
|
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
|
|
var compareRefs = (a, b) => {
|
|
var ra = referenceRegex.exec(a);
|
|
var rb = referenceRegex.exec(b);
|
|
if (ra === null || rb === null) {
|
|
if (a != b) return a > b ? 1 : -1;
|
|
return 0;
|
|
} else {
|
|
if (ra.groups.prefix != rb.groups.prefix) {
|
|
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
|
|
}
|
|
if (ra.groups.number != rb.groups.number) {
|
|
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
if (settings.bommode == "netlist") {
|
|
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
}));
|
|
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
|
|
return 0;
|
|
}));
|
|
} else {
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
var valueIndex = config.fields.indexOf("Value");
|
|
var footprintIndex = config.fields.indexOf("Footprint");
|
|
columns.forEach((column) => {
|
|
if (column === placeHolderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
|
|
tr.appendChild(th);
|
|
}
|
|
} else if (column === "References") {
|
|
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
|
|
var i = 0;
|
|
while (i < a.length && i < b.length) {
|
|
if (a[i][0] != b[i][0]) return compareRefs(a[i][0], b[i][0]);
|
|
i++;
|
|
}
|
|
return a.length - b.length;
|
|
}));
|
|
} else if (column === "Value") {
|
|
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
|
|
var ra = a[0][1], rb = b[0][1];
|
|
return valueCompare(
|
|
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
|
|
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
|
|
}));
|
|
return;
|
|
} else if (column === "Footprint") {
|
|
tr.appendChild(createColumnHeader(
|
|
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
|
|
return a.length - b.length;
|
|
}));
|
|
} else {
|
|
// Other fields
|
|
var i = config.fields.indexOf(column);
|
|
if (i < 0)
|
|
return;
|
|
tr.appendChild(createColumnHeader(
|
|
column, `field${i + 1}`, stringFieldCompareClosure(i)));
|
|
}
|
|
});
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
|
|
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
|
|
bomtable = getSelectedBomList();
|
|
|
|
if (bomSortFunction) {
|
|
bomtable = bomtable.sort(bomSortFunction);
|
|
}
|
|
for (var i in bomtable) {
|
|
var bomentry = bomtable[i];
|
|
if (filter && !entryMatches(bomentry)) {
|
|
continue;
|
|
}
|
|
var references = null;
|
|
var netname = null;
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
var rownum = +i + 1;
|
|
tr.id = "bomrow" + rownum;
|
|
td.textContent = rownum;
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "netlist") {
|
|
netname = bomentry;
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(netname ? netname : "<no net>");
|
|
tr.appendChild(td);
|
|
var color = settings.netColors[netname] || defaultNetColor;
|
|
td = document.createElement("TD");
|
|
var colorBox = document.createElement("INPUT");
|
|
colorBox.type = "color";
|
|
colorBox.value = color;
|
|
colorBox.onchange = netColorChangeHandler(netname);
|
|
colorBox.onmouseup = netColorRightClick(netname);
|
|
colorBox.oncontextmenu = (e) => e.preventDefault();
|
|
td.appendChild(colorBox);
|
|
td.classList.add("color-column");
|
|
tr.appendChild(td);
|
|
} else {
|
|
if (reflookup) {
|
|
references = findRefInEntry(bomentry);
|
|
if (references.length == 0) {
|
|
continue;
|
|
}
|
|
} else {
|
|
references = bomentry;
|
|
}
|
|
// Filter hidden columns
|
|
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
|
|
columns.forEach((column) => {
|
|
if (column === placeholderColumn) {
|
|
var n = 1;
|
|
if (column === "checkboxes")
|
|
n = settings.checkboxes.length;
|
|
for (i = 0; i < n; i++) {
|
|
td = placeHolderElements.shift();
|
|
tr.appendChild(td);
|
|
}
|
|
return;
|
|
} else if (column === "checkboxes") {
|
|
for (var checkbox of settings.checkboxes) {
|
|
if (checkbox) {
|
|
td = document.createElement("TD");
|
|
var input = document.createElement("input");
|
|
input.type = "checkbox";
|
|
[input.onchange, td.ontouchstart, td.ontouchend] = createCheckboxHandlers(input, checkbox, references, tr);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
if (input.checked && settings.markWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
} else if (column === "References") {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
} else if (column === "Quantity" && settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = references.length;
|
|
tr.appendChild(td);
|
|
} else {
|
|
// All the other fields
|
|
var field_index = config.fields.indexOf(column)
|
|
if (field_index < 0)
|
|
return;
|
|
var valueSet = new Set();
|
|
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
|
|
td = document.createElement("TD");
|
|
var output = new Array();
|
|
for (let item of valueSet) {
|
|
const visible = highlightFilter(String(item));
|
|
if (typeof item === 'string' && item.match(urlRegex)) {
|
|
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
|
|
} else {
|
|
output.push(visible);
|
|
}
|
|
}
|
|
td.innerHTML = output.join(", ");
|
|
tr.appendChild(td);
|
|
}
|
|
});
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
if (settings.highlightRowOnClick) {
|
|
tr.onmousedown = handler;
|
|
} else {
|
|
tr.onmousemove = handler;
|
|
}
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
setBomHandlers();
|
|
resizableGrid(bomhead);
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0,
|
|
fp_b = 0,
|
|
pads_f = 0,
|
|
pads_b = 0,
|
|
pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("topmostdiv").style.height = "";
|
|
document.getElementById("topmostdiv").style.display = "block";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
var chkbxs = document.getElementsByClassName("visibility_checkbox");
|
|
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = false;
|
|
}
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
for (var i = 0; i < chkbxs.length; i++) {
|
|
chkbxs[i].disabled = true;
|
|
}
|
|
}
|
|
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var childNum = checkboxnum + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].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 childNum = checkboxnum + 1 + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
|
|
prepCheckboxes();
|
|
populateMarkWhenCheckedOptions();
|
|
setMarkWhenChecked(settings.markWhenChecked);
|
|
}
|
|
|
|
function setMarkWhenChecked(value) {
|
|
writeStorage("markWhenChecked", value);
|
|
settings.markWhenChecked = value;
|
|
markedFootprints.clear();
|
|
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
|
|
markedFootprints.add(ref);
|
|
}
|
|
populateBomTable();
|
|
drawHighlights();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateMarkWhenCheckedOptions() {
|
|
var container = document.getElementById("markWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "markWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "markWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setMarkWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.markWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
function constrain(number, min, max) {
|
|
return Math.min(Math.max(parseInt(number), min), max);
|
|
}
|
|
|
|
document.onkeydown = function (e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowLeft":
|
|
case "ArrowRight":
|
|
if (document.activeElement.type != "text") {
|
|
e.preventDefault();
|
|
let boardRotationElement = document.getElementById("boardRotation")
|
|
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
|
|
if (e.key == "ArrowLeft") {
|
|
settings.boardRotation += 3; // 15 degrees
|
|
}
|
|
else {
|
|
settings.boardRotation -= 3;
|
|
}
|
|
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
|
|
boardRotationElement.value = settings.boardRotation
|
|
setBoardRotation(settings.boardRotation);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
e.preventDefault();
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
function topToggle() {
|
|
var top = document.getElementById("top");
|
|
var toptoggle = document.getElementById("toptoggle");
|
|
if (top.style.display === "none") {
|
|
top.style.display = "flex";
|
|
toptoggle.classList.remove("flipped");
|
|
} else {
|
|
top.style.display = "none";
|
|
toptoggle.classList.add("flipped");
|
|
}
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
initUtils();
|
|
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 id="fileinfodiv">
|
|
<table class="fileinfo">
|
|
<tbody>
|
|
<tr>
|
|
<td id="title" class="title" style="width: 70%">
|
|
Title
|
|
</td>
|
|
<td id="revision" class="title" style="width: 30%">
|
|
Revision
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="company">
|
|
Company
|
|
</td>
|
|
<td id="filedate">
|
|
Date
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="bomcontrols">
|
|
<div class="hideonprint menu">
|
|
<button class="menubtn"></button>
|
|
<div class="menu-content">
|
|
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
|
|
Full Screen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
|
|
Fab layer
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
|
|
Silkscreen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
|
|
References
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
|
|
Values
|
|
</label>
|
|
<div id="tracksAndZonesCheckboxes">
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
|
|
Tracks
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
|
|
Zones
|
|
</label>
|
|
</div>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Pads
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="highlightRowOnClickCheckbox" type="checkbox" checked onchange="setHighlightRowOnClick(this.checked)">
|
|
Highlight row on click
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
Highlight first pin
|
|
<form id="highlightpin1">
|
|
<div class="flexbox">
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
|
|
None
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
|
|
All
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
|
|
Selected
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</span>
|
|
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
|
|
Offset back rotation
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Bom checkboxes</div>
|
|
<input id="bomCheckboxes" class="menu-textbox" type=text
|
|
oninput="setBomCheckboxes(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Mark when checked</div>
|
|
<div id="markWhenCheckedContainer"></div>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span class="shameless-plug">
|
|
<span>Created using</span>
|
|
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
|
|
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint">
|
|
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
|
|
title="Front only">F
|
|
</button>
|
|
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
|
|
title="Front and Back">FB
|
|
</button>
|
|
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
|
|
title="Back only">B
|
|
</button>
|
|
</div>
|
|
<div class="button-container hideonprint">
|
|
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
|
|
title="BOM only"></button>
|
|
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
|
|
title="BOM left, drawings right"></button>
|
|
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
|
|
title="BOM top, drawings bot"></button>
|
|
</div>
|
|
<div class="button-container hideonprint">
|
|
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
|
|
title="Grouped BOM"></button>
|
|
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
|
|
title="Ungrouped BOM"></button>
|
|
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
|
|
title="Netlist"></button>
|
|
</div>
|
|
<div class="hideonprint menu">
|
|
<button class="statsbtn"></button>
|
|
<div class="menu-content">
|
|
<table class="stats">
|
|
<tbody>
|
|
<tr>
|
|
<td width="40%">Board stats</td>
|
|
<td>Front</td>
|
|
<td>Back</td>
|
|
<td>Total</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Components</td>
|
|
<td id="stats-components-front">~</td>
|
|
<td id="stats-components-back">~</td>
|
|
<td id="stats-components-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Groups</td>
|
|
<td id="stats-groups-front">~</td>
|
|
<td id="stats-groups-back">~</td>
|
|
<td id="stats-groups-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>SMD pads</td>
|
|
<td id="stats-smd-pads-front">~</td>
|
|
<td id="stats-smd-pads-back">~</td>
|
|
<td id="stats-smd-pads-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>TH pads</td>
|
|
<td colspan=3 id="stats-th-pads">~</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="stats">
|
|
<col width="40%"/><col />
|
|
<tbody id="checkbox-stats">
|
|
<tr>
|
|
<td colspan=2 style="border-top: 0">Checkboxes</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="hideonprint menu">
|
|
<button class="iobtn"></button>
|
|
<div class="menu-content">
|
|
<div class="menu-label menu-label-top">
|
|
<div style="margin-left: 5px;">Save board image</div>
|
|
<div class="flexbox">
|
|
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
<span>X</span>
|
|
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
</div>
|
|
<label>
|
|
<input id="render-save-transparent" type="checkbox">
|
|
Transparent background
|
|
</label>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveImage('F')">Front</button>
|
|
<button class="savebtn" onclick="saveImage('B')">Back</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Config and checkbox state</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveSettings()">Export</button>
|
|
<button class="savebtn" onclick="loadSettings()">Import</button>
|
|
<button class="savebtn" onclick="resetSettings()">Reset</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Save bom table as</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
|
|
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="topdivider">
|
|
<div class="hideonprint">
|
|
<div id="toptoggle" onclick="topToggle()">︽</div>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="flex: 1 1">
|
|
<div id="bomdiv" class="split split-horizontal">
|
|
<div style="width: 100%">
|
|
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
|
|
oninput="updateRefLookup(this.value)">
|
|
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
|
|
oninput="updateFilter(this.value)">
|
|
<div class="button-container hideonprint" style="float: left; margin: 0;">
|
|
<button id="copy" title="Copy bom table to clipboard"
|
|
onclick="saveBomTable('clipboard')"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom" id="bomtable">
|
|
<thead id="bomhead">
|
|
</thead>
|
|
<tbody id="bombody">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="canvasdiv" class="split split-horizontal">
|
|
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</body>
|
|
|
|
</html>
|