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