mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2025-07-24 21:37:21 +02:00
4670 lines
346 KiB
HTML
Generated
4670 lines
346 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>
|