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