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