| <!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": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]} |
| /////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////// |
| var pcbdata = JSON.parse(LZString.decompressFromBase64("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ytDs92rmKvQa6Wr/Ks+a1818ySpa5qrtatG4pOrMmtYawVYiKv/QNZrlcvjC3Zr+ytrq44AFGvhq1RrbADWs/xwtGsdAPRrWDPhvBiUTGuiq600rGtPbfxzZ3iRs+DGMqv5qw9ahatxa91rmmuCa2Nr61bekFWraWvfyxlr9WtZa02r86u+q+1r5fOqa5arZWsvq7BrlbV3mKJrdADv82FzmWvoay0rx2sFayarRWv3s8urzKsOa8GrTmuhqxyrrmvxK0NrHmuiKyNrSMvgQmN1jUaTa4Frp5YZq5Kr7ysRa5sAy2vxs0+rUCvXa6krkOubpOnloWtFs9WrxKufK5CrDauNa2ZrgGv5a0irSmtnayprEGsla+pr62sJazirbuTVdfHQNWvOq4TrpKvE66Zr+qtdKwprVmuU6/SroSvfayRr5oBka+urAOubq1yr70D7q2DrwHMQ64HirfUayDDrF6tBa+gLIWsEq9Vz4Wthc1FrvGtFqzorGOvXK/Lr70SQvbjrl1qjqwTr46uHay9rSysk69zr5Outa/zrpqvFa2proyv663LrZWDNmDi0rOvpa3XlluvGa9lrx2uzqy1rPSsO659rnWurq4cr4usuazazoRDDa7LrR6tLlOG4E2uRAKmrDyvTa2vzQKhXC/NrtICLa7mrKOura+YA9Ot9qzirCetkrWqrjqt7a0jrPADPa37rb2sU66drAuvga4MrzutWqwJrsGsl60B8DqtIaxXrT2u+64tzOWsna1srAUu2a0Lr9msi645rYuvTsxLrmIC7q4kA0ut8q/Gr4QiZ2kVaSus+s0FIuStBkNFLd6tVcA+r8qt8a+jrretlq6AYS+tLs46rX6v+oD+rVus6q1zruWsFWHvlA+uFa0PraKuQay7rB+v8q6xwx+sFs6fr1YDfq83LROsma+6rpOt5a3fr72uLq7LzYeu/a91rvWsWs/1rIAA/s0kroOvz60er5VSY5snr56s+s3PQH0tAiPOLjjyBAAKQO+sxa2jr/ysuK+i8K6Sd63jr3+ssTbnrf+v96yAbBGvU603rl2vxa0XrsGskGyWkc8BVqxQb3isLKxzrM6u16/br9euO6y/rAKtVxoPtisATQBwb5osuq0dr06u0GzZrY4tMGzBrmOuuFrJYn+tIa5wbF+s16zIbdeuD6yTLFfOKq67rR6s+XN9aqhvkG5Ibv+s8GzQb2hsP67obQhsuK8wyKhsSG9aLGht963wbwesCG59rLevCG8zozE0mG5da6hvmG1Jrlhv8GzobT8vyG4XrihvXKwUGxhuOG/uIzhs480EbbhshGxAr4RvlaxDrQDXeWL4bR3P+GzKr1BuuGz6rSRs7ywobqRtIG1gz34gxG5QbaGuaG1YrVhsfa4/rpMspGwYbRuWZWMMg5RtcG0vLl+uzAHkbeGvuG3Ubehv8a14bzor8WPtgrRtSGx0bvBtaG8Eb1huhG/Ubeuuv6xDrDfIOG/dr2Ru5q7kbExuJG1MbyRuzG14b5RWLGybrWRtmGzkbFhtdG4prPRs2G54b/atINWUbSxsHGysbRxtrG/kbGxuFGw0bcxsni1RYuxvq634bNxuVGy4b9xvdGwUb+CtXay8bSP05tVcbextf88sb3xvxG8cbfOunG9MbfRv769sbIcUEwOIb1xtOG+zrgRvQm7AAbWsN6weLgJuIm/xUbBt+C6YbaJtLa6sb1RuTG7UbZxt4m+MrSJuz9cvmYJu0i18b3BsYm78bJxv/G7ibRRuNG0J4BJtPbCMb6Juuq5ib2JuCG+cb0wu0m3fgfJukm3cb5JvrG5SbcJu2GzirrBu0kmZ46qsQm8ybApusmzCb7Jvjy88b+JsiDD5mqJuxG/yb0hvSmw8bspubG/obQJvcm3qbySQSm1QbUpsBK38bjxsAm5yblpvz2roU9JsfG/sbJJt2myybJpuOm2abTxtbGzSbPJtdYLabTSv2m5ZrWJsh670b8pvKq2KbwxsGmxUbapvGmw6bbJtOmxybOpvBm9abSZhkG58b3pvhm76bqZuam+mb2ptBmwqbplhNZJmrSGvkS6MbVRtFm1GbsJvmm/0bxBsVmxkbVZt46zWbRptjGwkbppugG8/LLpsDG8obBvhdhCqbTJvtG3WbkZtCmx4b1Js4q0Yb6GQjm46rqpvjmz8bfptpmwGbzpuZm7ObObUYEmGbGMsrm/WbU5sxmyKbsGuPDvFkkUC7m8ubUJsamw2bWpv9m5ubsGvfpcoU7Zsrs2ObZ8u/q84ArMtB5k+LKUu49e/zIjrT8+z4uPWBi7kr8Hw4C/B86esiOr+bn4t6xN2LshtU63ebZZsPm0h++psMmzUIC2sSa8mb3ZuCm9GbVJsDmy4rj5t0my0mqFuGoOhbtZv7m5ObOFtym8ebmOtRG/ObF5tvm1hb15uHm7hb95uY6+kbO5uJm20bDFsTm7zrN5slmwhbFpsDG8gbuzD0WzeLKZsUW42bgZuCWy4ryBureNFLb7o1CGRbV5urm8Wb65sZm4hbmOvIGwwg8lvL+IagSlt+K0xblFtNmwibMltYM3/1iHON8wpbeltdmzxb9+tqW6Wb0lubawlYHFsMmyeYr5tiW4xbKlt8W/ZbAlvNm8XrwljDm6Jbv8ueWwebRltSW35byqutAMmkLXg6W6RbNlvkW7xbzFtUWzObkVupgPQkfECxW9nrGFsB5iflIVsSW7ebYRsaW/yrUVtJRERbnpuUc1ZbOesFm+qbXltJW8ZbRBuVKwpYdFucW3EbBlu1W2FbG5tFW95rE7XNW65bc8DuW8FbtltwWzibDlsRW2WrbxuBWy1bARs1W6FbkludW45byqu1SmebC5tqGwNbVCt5W4lbHVvqWwtbZavyjpWbVaudm5KbhZv5W/xbhVs7W2/r/JTGG8+bR3OHWz6bM1snWz5bZ1tjW9crips+IEFbcUsRm5tbc1vbW89bEOuKm+4Q71uyq/dbX1sFWzMb51t/W75UOOaA27lbQ1s1G32bT1smW+Wbohvim1NbR1vA23Zb8Ntg279bR6uKm43Y0Ntkm7NboNvwmw1bLBuQ29Ae+NufWxjbdBvD60RrK6sQGxHrk+tR69PrMesIG4er8wTtbEiYOji4MynryutxQOvrN6uN81vrKuW3Czrra2tdW/Hrdia/TXFAFzgjqxQbiRiQmxhrABu268AbcNvU20/rtOuxm2WrRWTB+KqC9Hifq3LbqGt7m/Eb/6uAG7frvcsUm5jbmGYj611rDNthq9AbrmsAAMoAAOrCK6zbXms42yXNCc1626gbsiviTDnL58BXC4fErADenlqrotsF6+Lb9G0cgnbdNeSvK6mAhsvZWzXdMNsJW1Tbchtmq8/r1FvXK5b576R9rvKNg4twC1aA+luva4Zb31v0G+arzespW0obgC6ezTHbxFsjJFnkhdsWK9hbJdu+W4jbsGsZstnb1OSZG8Dz+dvRBNVb4lsg26dbOyvW2+HrIauM231rQOtSULHrqSsmoNuoirhBxD7baatw68Fr11uUc5rr6Jth23hbqQsz24YtAWRe6+brd1tZaybbtutB672battp2xrbGdtIy9vbDXVxxOVb1Qtm67gVfdvdm0fbN+sSwCfb/puW219rtNs/a2Prf2sT63bbvBuua9azZ2hT25Ebh5SJ68KrPNs+s2nr0Fsr2y1mOcBxW0dbG9usW2A74q3ba2XrXeuPa3VrBNsPW5bbF2s9q5vbSFtoO3drfVvd69g7lNvDW4Ib4Bu/25Abzmvj27+z7msgALGr7ttG5T0z5jkC3QFrF6s2yvwLlvlwOxY8wdupgPgbK2uxa+Hb4NtHq44CTlpexESbfhslsyJArVtF2+1bzdvq2+XbhDuY6/lAHnofgNe4KpuyO09tCtsKO4Tbg9vE2xtrbevqCB5aUjscGzo7CdseW7DbFttn20Y7DOs3a1etPLLgw+qrgFskhvI7jdvF20Tbmtuja2w7aVQuO46rbjsqYB47UKtN2947l9tHq4BuMhj+O3A7TOpNS2ttejueO4o74TsV22A7cEVonVo7i5uWOyE7nRteO4Y7PjsQ6xI7HlqB0dI7WRvZO9Nb/dsp2/BbCNsk2zRb8uXFO9O4Fjv527o7RtttWwY7j1tY263bbFtOO2Lw0QSuO/nbwTsVOxtbVTsjWy3btTu+O5m4vTuxO1goKYCDO4cbx1sD2x079jvMG5pbPTvLUH07gTsDOwk7rTv6O7g7djsFOxLbWYLrlDetfVubWCjAVjuDW8nblDvTm6o71yvqOw076zPaO807FzvrWzY7Mpuf29Q7pgCi6z1rdDv225LrjDvMO+DrR6tB+G4r0itQO4xLTyvL2wjra7OV6x9b0WvCO4QbxjuY6yC7wKu5m0dzD9vzKzlb1Bsv2zOrnSt26+87djv4O6VrtzsQ6yi7eKtou4RLe2uP25hbfus4u4Hrezup21bb39vC61874+s/O5Hr9DvT66IuoDsQ2064lggr6xC7V6voCwLb/gtC2+J48+V56yI7JLse23y7n0D62yhrPevYuzbrr9sGwCrbtjuMu0S7dOsR27Z9TriJgvK7+AuG2wHm1et963S7eLtquwS7jLtf2wDzxGuj66y7f9vsu2PbfzvT69GrTDuea0C77e0DYMp4oLW8G2gbgrv823A7I2jvK+K7sVra67vruutiOx67rHgCJvdrZ+vy27FaxrvG28q7uLvma6cEDLvVO+fbKjsoO/GrXWDbbbgVstsKu+Q7gRumuym75run25a7nzvfO1Abg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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> |