MNT Reform: Open Source Portable Computer https://mntre.com/reform
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3625 lines
256KB

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Interactive BOM for KiCAD</title>
  7. <style type="text/css">
  8. :root {
  9. --pcb-edge-color: black;
  10. --pad-color: #878787;
  11. --pad-color-highlight: #D04040;
  12. --pin1-outline-color: #ffb629;
  13. --pin1-outline-color-highlight: #b4ff03;
  14. --silkscreen-edge-color: #aa4;
  15. --silkscreen-polygon-color: #4aa;
  16. --silkscreen-text-color: #4aa;
  17. --fabrication-edge-color: #907651;
  18. --fabrication-polygon-color: #907651;
  19. --fabrication-text-color: #a27c24;
  20. --track-color: #def5f1;
  21. --track-color-highlight: #D04040;
  22. --zone-color: #def5f1;
  23. --zone-color-highlight: #d0404080;
  24. }
  25. html, body {
  26. margin: 0px;
  27. height: 100%;
  28. font-family: Verdana, sans-serif;
  29. }
  30. .dark.topmostdiv {
  31. --pcb-edge-color: #eee;
  32. --pad-color: #808080;
  33. --pin1-outline-color: #ffa800;
  34. --pin1-outline-color-highlight: #ccff00;
  35. --track-color: #42524f;
  36. --zone-color: #42524f;
  37. background-color: #252c30;
  38. color: #eee;
  39. }
  40. button {
  41. background-color: #eee;
  42. border: 1px solid #888;
  43. color: black;
  44. height: 44px;
  45. width: 44px;
  46. text-align: center;
  47. text-decoration: none;
  48. display: inline-block;
  49. font-size: 14px;
  50. font-weight: bolder;
  51. }
  52. .dark button {
  53. /* This will be inverted */
  54. background-color: #c3b7b5;
  55. }
  56. button.depressed {
  57. background-color: #0a0;
  58. color: white;
  59. }
  60. .dark button.depressed {
  61. /* This will be inverted */
  62. background-color: #b3b;
  63. }
  64. button:focus {
  65. outline: 0;
  66. }
  67. button#tb-btn {
  68. 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");
  69. }
  70. button#lr-btn {
  71. 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");
  72. }
  73. button#bom-btn {
  74. 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");
  75. }
  76. button#bom-grouped-btn {
  77. 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");
  78. }
  79. button#bom-ungrouped-btn {
  80. 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");
  81. }
  82. button#bom-netlist-btn {
  83. 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");
  84. }
  85. button#copy {
  86. 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");
  87. background-position: 6px 6px;
  88. background-repeat: no-repeat;
  89. background-size: 26px 26px;
  90. border-radius: 6px;
  91. height: 40px;
  92. width: 40px;
  93. margin: 10px 5px;
  94. }
  95. button#copy:active {
  96. box-shadow: inset 0px 0px 5px #6c6c6c;
  97. }
  98. textarea.clipboard-temp {
  99. position: fixed;
  100. top: 0;
  101. left: 0;
  102. width: 2em;
  103. height: 2em;
  104. padding: 0;
  105. border: None;
  106. outline: None;
  107. box-shadow: None;
  108. background: transparent;
  109. }
  110. .left-most-button {
  111. border-right: 0;
  112. border-top-left-radius: 6px;
  113. border-bottom-left-radius: 6px;
  114. }
  115. .middle-button {
  116. border-right: 0;
  117. }
  118. .right-most-button {
  119. border-top-right-radius: 6px;
  120. border-bottom-right-radius: 6px;
  121. }
  122. .button-container {
  123. font-size: 0;
  124. margin: 10px 10px 10px 0px;
  125. }
  126. .dark .button-container {
  127. filter: invert(1);
  128. }
  129. .button-container button {
  130. background-size: 32px 32px;
  131. background-position: 5px 5px;
  132. background-repeat: no-repeat;
  133. }
  134. @media print {
  135. .hideonprint {
  136. display: none;
  137. }
  138. }
  139. canvas {
  140. cursor: crosshair;
  141. }
  142. canvas:active {
  143. cursor: grabbing;
  144. }
  145. .fileinfo {
  146. width: 100%;
  147. max-width: 1000px;
  148. border: none;
  149. padding: 5px;
  150. }
  151. .fileinfo .title {
  152. font-size: 20pt;
  153. font-weight: bold;
  154. }
  155. .fileinfo td {
  156. overflow: hidden;
  157. white-space: nowrap;
  158. max-width: 1px;
  159. width: 50%;
  160. text-overflow: ellipsis;
  161. }
  162. .bom {
  163. border-collapse: collapse;
  164. font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  165. font-size: 10pt;
  166. table-layout: fixed;
  167. width: 100%;
  168. margin-top: 1px;
  169. }
  170. .bom th, .bom td {
  171. border: 1px solid black;
  172. padding: 5px;
  173. word-wrap: break-word;
  174. text-align: center;
  175. position: relative;
  176. }
  177. .dark .bom th, .dark .bom td {
  178. border: 1px solid #777;
  179. }
  180. .bom th {
  181. background-color: #CCCCCC;
  182. background-clip: padding-box;
  183. }
  184. .dark .bom th {
  185. background-color: #3b4749;
  186. }
  187. .bom tr.highlighted:nth-child(n) {
  188. background-color: #cfc;
  189. }
  190. .dark .bom tr.highlighted:nth-child(n) {
  191. background-color: #226022;
  192. }
  193. .bom tr:nth-child(even) {
  194. background-color: #f2f2f2;
  195. }
  196. .dark .bom tr:nth-child(even) {
  197. background-color: #313b40;
  198. }
  199. .bom tr.checked {
  200. color: #aaa;
  201. }
  202. .dark .bom tr.checked {
  203. color: #666;
  204. }
  205. .bom tr {
  206. transition: background-color 0.2s;
  207. }
  208. .bom .numCol {
  209. width: 25px;
  210. }
  211. .bom .Description {
  212. width: 10%;
  213. }
  214. .bom .Part {
  215. width: 10%;
  216. }
  217. .bom .Value {
  218. width: 15%;
  219. }
  220. .bom .Quantity {
  221. width: 65px;
  222. }
  223. .bom th .sortmark {
  224. position: absolute;
  225. right: 1px;
  226. top: 1px;
  227. margin-top: -5px;
  228. border-width: 5px;
  229. border-style: solid;
  230. border-color: transparent transparent #221 transparent;
  231. transform-origin: 50% 85%;
  232. transition: opacity 0.2s, transform 0.4s;
  233. }
  234. .dark .bom th .sortmark {
  235. filter: invert(1);
  236. }
  237. .bom th .sortmark.none {
  238. opacity: 0;
  239. }
  240. .bom th .sortmark.desc {
  241. transform: rotate(180deg);
  242. }
  243. .bom th:hover .sortmark.none {
  244. opacity: 0.5;
  245. }
  246. .bom .bom-checkbox {
  247. width: 30px;
  248. position: relative;
  249. user-select: none;
  250. -moz-user-select: none;
  251. }
  252. .bom .bom-checkbox:before {
  253. content: "";
  254. position: absolute;
  255. border-width: 15px;
  256. border-style: solid;
  257. border-color: #51829f transparent transparent transparent;
  258. visibility: hidden;
  259. top: -15px;
  260. }
  261. .bom .bom-checkbox:after {
  262. content: "Double click to set/unset all";
  263. position: absolute;
  264. color: white;
  265. top: -35px;
  266. left: -26px;
  267. background: #51829f;
  268. padding: 5px 15px;
  269. border-radius: 8px;
  270. white-space: nowrap;
  271. visibility: hidden;
  272. }
  273. .bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
  274. visibility: visible;
  275. transition: visibility 0.2s linear 1s;
  276. }
  277. .split {
  278. -webkit-box-sizing: border-box;
  279. -moz-box-sizing: border-box;
  280. box-sizing: border-box;
  281. overflow-y: auto;
  282. overflow-x: hidden;
  283. background-color: inherit;
  284. }
  285. .split.split-horizontal, .gutter.gutter-horizontal {
  286. height: 100%;
  287. float: left;
  288. }
  289. .gutter {
  290. background-color: #ddd;
  291. background-repeat: no-repeat;
  292. background-position: 50%;
  293. transition: background-color 0.3s;
  294. }
  295. .dark .gutter {
  296. background-color: #777;
  297. }
  298. .gutter.gutter-horizontal {
  299. background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
  300. cursor: ew-resize;
  301. width: 5px;
  302. }
  303. .gutter.gutter-vertical {
  304. background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
  305. cursor: ns-resize;
  306. height: 5px;
  307. }
  308. .searchbox {
  309. float: left;
  310. height: 40px;
  311. margin: 10px 5px;
  312. padding: 12px 32px;
  313. font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  314. font-size: 18px;
  315. box-sizing: border-box;
  316. border: 1px solid #888;
  317. border-radius: 6px;
  318. outline: none;
  319. background-color: #eee;
  320. transition: background-color 0.2s, border 0.2s;
  321. 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==');
  322. background-position: 10px 10px;
  323. background-repeat: no-repeat;
  324. }
  325. .dark .searchbox {
  326. background-color: #111;
  327. color: #eee;
  328. }
  329. .searchbox::placeholder {
  330. color: #ccc;
  331. }
  332. .dark .searchbox::placeholder {
  333. color: #666;
  334. }
  335. .filter {
  336. width: calc(60% - 64px);
  337. }
  338. .reflookup {
  339. width: calc(40% - 10px);
  340. }
  341. input[type=text]:focus {
  342. background-color: white;
  343. border: 1px solid #333;
  344. }
  345. .dark input[type=text]:focus {
  346. background-color: #333;
  347. border: 1px solid #ccc;
  348. }
  349. mark.highlight {
  350. background-color: #5050ff;
  351. color: #fff;
  352. padding: 2px;
  353. border-radius: 6px;
  354. }
  355. .dark mark.highlight {
  356. background-color: #76a6da;
  357. color: #111;
  358. }
  359. .menubtn {
  360. background-color: white;
  361. border: none;
  362. 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");
  363. background-position: center;
  364. background-repeat: no-repeat;
  365. }
  366. .statsbtn {
  367. background-color: white;
  368. border: none;
  369. 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");
  370. background-position: center;
  371. background-repeat: no-repeat;
  372. }
  373. .iobtn {
  374. background-color: white;
  375. border: none;
  376. 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");
  377. background-position: center;
  378. background-repeat: no-repeat;
  379. }
  380. .dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
  381. filter: invert(1);
  382. }
  383. .flexbox {
  384. display: flex;
  385. align-items: center;
  386. justify-content: space-between;
  387. width: 100%;
  388. }
  389. .savebtn {
  390. background-color: #d6d6d6;
  391. width: auto;
  392. height: 30px;
  393. flex-grow: 1;
  394. margin: 5px;
  395. border-radius: 4px;
  396. }
  397. .savebtn:active {
  398. background-color: #0a0;
  399. color: white;
  400. }
  401. .dark .savebtn:active {
  402. /* This will be inverted */
  403. background-color: #b3b;
  404. }
  405. .stats {
  406. border-collapse: collapse;
  407. font-size: 12pt;
  408. table-layout: fixed;
  409. width: 100%;
  410. min-width: 450px;
  411. }
  412. .dark .stats td {
  413. border: 1px solid #bbb;
  414. }
  415. .stats td {
  416. border: 1px solid black;
  417. padding: 5px;
  418. word-wrap: break-word;
  419. text-align: center;
  420. position: relative;
  421. }
  422. #checkbox-stats div {
  423. position: absolute;
  424. left: 0;
  425. top: 0;
  426. height: 100%;
  427. width: 100%;
  428. display: flex;
  429. align-items: center;
  430. justify-content: center;
  431. }
  432. #checkbox-stats .bar {
  433. background-color: rgba(28, 251, 0, 0.6);
  434. }
  435. .menu {
  436. position: relative;
  437. display: inline-block;
  438. margin: 10px 10px 10px 0px;
  439. }
  440. .menu-content {
  441. display: none;
  442. position: absolute;
  443. background-color: white;
  444. right: 0;
  445. min-width: 300px;
  446. box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  447. z-index: 100;
  448. padding: 8px;
  449. }
  450. .dark .menu-content {
  451. background-color: #111;
  452. }
  453. .menu:hover .menu-content {
  454. display: block;
  455. }
  456. .menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
  457. background-color: #eee;
  458. }
  459. .menu-label {
  460. display: inline-block;
  461. padding: 8px;
  462. border: 1px solid #ccc;
  463. border-top: 0;
  464. width: calc(100% - 18px);
  465. }
  466. .menu-label-top {
  467. border-top: 1px solid #ccc;
  468. }
  469. .menu-textbox {
  470. float: left;
  471. height: 24px;
  472. margin: 10px 5px;
  473. padding: 5px 5px;
  474. font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  475. font-size: 14px;
  476. box-sizing: border-box;
  477. border: 1px solid #888;
  478. border-radius: 4px;
  479. outline: none;
  480. background-color: #eee;
  481. transition: background-color 0.2s, border 0.2s;
  482. width: calc(100% - 10px);
  483. }
  484. .menu-textbox.invalid, .dark .menu-textbox.invalid {
  485. color: red;
  486. }
  487. .dark .menu-textbox {
  488. background-color: #222;
  489. color: #eee;
  490. }
  491. .radio-container {
  492. margin: 4px;
  493. }
  494. .topmostdiv {
  495. width: 100%;
  496. height: 100%;
  497. background-color: white;
  498. transition: background-color 0.3s;
  499. }
  500. #top {
  501. height: 78px;
  502. border-bottom: 2px solid black;
  503. }
  504. .dark #top {
  505. border-bottom: 2px solid #ccc;
  506. }
  507. #dbg {
  508. display: block;
  509. }
  510. ::-webkit-scrollbar {
  511. width: 8px;
  512. }
  513. ::-webkit-scrollbar-track {
  514. background: #aaa;
  515. }
  516. ::-webkit-scrollbar-thumb {
  517. background: #666;
  518. border-radius: 3px;
  519. }
  520. ::-webkit-scrollbar-thumb:hover {
  521. background: #555;
  522. }
  523. .slider {
  524. -webkit-appearance: none;
  525. width: 100%;
  526. margin: 3px 0;
  527. padding: 0;
  528. outline: none;
  529. opacity: 0.7;
  530. -webkit-transition: .2s;
  531. transition: opacity .2s;
  532. border-radius: 3px;
  533. }
  534. .slider:hover {
  535. opacity: 1;
  536. }
  537. .slider:focus {
  538. outline: none;
  539. }
  540. .slider::-webkit-slider-runnable-track {
  541. -webkit-appearance: none;
  542. width: 100%;
  543. height: 8px;
  544. background: #d3d3d3;
  545. border-radius: 3px;
  546. border: none;
  547. }
  548. .slider::-webkit-slider-thumb {
  549. -webkit-appearance: none;
  550. width: 15px;
  551. height: 15px;
  552. border-radius: 50%;
  553. background: #0a0;
  554. cursor: pointer;
  555. margin-top: -4px;
  556. }
  557. .dark .slider::-webkit-slider-thumb {
  558. background: #3d3;
  559. }
  560. .slider::-moz-range-thumb {
  561. width: 15px;
  562. height: 15px;
  563. border-radius: 50%;
  564. background: #0a0;
  565. cursor: pointer;
  566. }
  567. .slider::-moz-range-track {
  568. height: 8px;
  569. background: #d3d3d3;
  570. border-radius: 3px;
  571. }
  572. .dark .slider::-moz-range-thumb {
  573. background: #3d3;
  574. }
  575. .slider::-ms-track {
  576. width: 100%;
  577. height: 8px;
  578. border-width: 3px 0;
  579. background: transparent;
  580. border-color: transparent;
  581. color: transparent;
  582. transition: opacity .2s;
  583. }
  584. .slider::-ms-fill-lower {
  585. background: #d3d3d3;
  586. border: none;
  587. border-radius: 3px;
  588. }
  589. .slider::-ms-fill-upper {
  590. background: #d3d3d3;
  591. border: none;
  592. border-radius: 3px;
  593. }
  594. .slider::-ms-thumb {
  595. width: 15px;
  596. height: 15px;
  597. border-radius: 50%;
  598. background: #0a0;
  599. cursor: pointer;
  600. margin: 0;
  601. }
  602. .shameless-plug {
  603. font-size: 0.8em;
  604. text-align: center;
  605. display: block;
  606. }
  607. a {
  608. color: #0278a4;
  609. }
  610. .dark a {
  611. color: #00b9fd;
  612. }
  613. #frontcanvas, #backcanvas {
  614. touch-action: none;
  615. }
  616. </style>
  617. <script type="text/javascript" >
  618. ///////////////////////////////////////////////
  619. /*
  620. Split.js - v1.3.5
  621. MIT License
  622. https://github.com/nathancahill/Split.js
  623. */
  624. !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}}});
  625. ///////////////////////////////////////////////
  626. ///////////////////////////////////////////////
  627. // Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
  628. // This work is free. You can redistribute it and/or modify it
  629. // under the terms of the WTFPL, Version 2
  630. // For more information see LICENSE.txt or http://www.wtfpl.net/
  631. //
  632. // For more information, the home page:
  633. // http://pieroxy.net/blog/pages/lz-string/testing.html
  634. //
  635. // LZ-based compression algorithm, version 1.4.4
  636. 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});
  637. ///////////////////////////////////////////////
  638. ///////////////////////////////////////////////
  639. /*!
  640. * PEP v0.4.3 | https://github.com/jquery/PEP
  641. * Copyright jQuery Foundation and other contributors | http://jquery.org/license
  642. */
  643. !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);
  644. for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
  645. 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}})}
  646. 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++)
  647. b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
  648. 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){
  649. for(var b=a;b.parentNode;)b=b.parentNode;
  650. 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);
  651. 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){
  652. //
  653. 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))},
  654. 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){
  655. var b=x(a,this.findElements,this);
  656. 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){}
  657. 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:[],
  658. 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++){
  659. 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);
  660. 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];
  661. c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
  662. 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),
  663. 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),
  664. 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);
  665. 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){
  666. (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,
  667. c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
  668. 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))},
  669. shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
  670. b=!1;else if("XY"===c)
  671. 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]);
  672. 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},
  673. vacuumTouches:function(a){var b=a.touches;
  674. if(R.size>=b.length){var c=[];R.forEach(function(a,d){
  675. 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);
  676. if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
  677. d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
  678. 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)},
  679. dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
  680. if(this.isPrimaryTouch(c)){
  681. 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});
  682. ///////////////////////////////////////////////
  683. ///////////////////////////////////////////////
  684. var config = {"dark_mode": true, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0.0, "checkboxes": "Sourced,Placed", "bom_view": "top-bottom", "layer_view": "F", "extra_fields": ["Manufacturer", "Manufacturer_No"]}
  685. ///////////////////////////////////////////////
  686. ///////////////////////////////////////////////
  687. var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
  688. ///////////////////////////////////////////////
  689. ///////////////////////////////////////////////
  690. /* Utility functions */
  691. var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
  692. pcbdata.metadata.revision + '__#';
  693. var storage;
  694. function initStorage(key) {
  695. try {
  696. window.localStorage.getItem("blank");
  697. storage = window.localStorage;
  698. } catch (e) {
  699. // localStorage not available
  700. }
  701. if (!storage) {
  702. try {
  703. window.sessionStorage.getItem("blank");
  704. storage = window.sessionStorage;
  705. } catch (e) {
  706. // sessionStorage also not available
  707. }
  708. }
  709. }
  710. function readStorage(key) {
  711. if (storage) {
  712. return storage.getItem(storagePrefix + key);
  713. } else {
  714. return null;
  715. }
  716. }
  717. function writeStorage(key, value) {
  718. if (storage) {
  719. storage.setItem(storagePrefix + key, value);
  720. }
  721. }
  722. function fancyDblClickHandler(el, onsingle, ondouble) {
  723. return function() {
  724. if (el.getAttribute("data-dblclick") == null) {
  725. el.setAttribute("data-dblclick", 1);
  726. setTimeout(function() {
  727. if (el.getAttribute("data-dblclick") == 1) {
  728. onsingle();
  729. }
  730. el.removeAttribute("data-dblclick");
  731. }, 200);
  732. } else {
  733. el.removeAttribute("data-dblclick");
  734. ondouble();
  735. }
  736. }
  737. }
  738. function smoothScrollToRow(rowid) {
  739. document.getElementById(rowid).scrollIntoView({
  740. behavior: "smooth",
  741. block: "center",
  742. inline: "nearest"
  743. });
  744. }
  745. function focusInputField(input) {
  746. input.scrollIntoView(false);
  747. input.focus();
  748. input.select();
  749. }
  750. function copyToClipboard() {
  751. var text = '';
  752. for (var node of bomhead.childNodes[0].childNodes) {
  753. if (node.firstChild) {
  754. text = text + node.firstChild.nodeValue;
  755. }
  756. if (node != bomhead.childNodes[0].lastChild) {
  757. text += '\t';
  758. }
  759. }
  760. text += '\n';
  761. for (var row of bombody.childNodes) {
  762. for (var cell of row.childNodes) {
  763. for (var node of cell.childNodes) {
  764. if (node.nodeName == "INPUT") {
  765. if (node.checked) {
  766. text = text + '✓';
  767. }
  768. } else if (node.nodeName == "MARK") {
  769. text = text + node.firstChild.nodeValue;
  770. } else {
  771. text = text + node.nodeValue;
  772. }
  773. }
  774. if (cell != row.lastChild) {
  775. text += '\t';
  776. }
  777. }
  778. text += '\n';
  779. }
  780. var textArea = document.createElement("textarea");
  781. textArea.classList.add('clipboard-temp');
  782. textArea.value = text;
  783. document.body.appendChild(textArea);
  784. textArea.focus();
  785. textArea.select();
  786. try {
  787. if (document.execCommand('copy')) {
  788. console.log('Bom copied to clipboard.');
  789. }
  790. } catch (err) {
  791. console.log('Can not copy to clipboard.');
  792. }
  793. document.body.removeChild(textArea);
  794. }
  795. function removeGutterNode(node) {
  796. for (var i = 0; i < node.childNodes.length; i++) {
  797. if (node.childNodes[i].classList &&
  798. node.childNodes[i].classList.contains("gutter")) {
  799. node.removeChild(node.childNodes[i]);
  800. break;
  801. }
  802. }
  803. }
  804. function cleanGutters() {
  805. removeGutterNode(document.getElementById("bot"));
  806. removeGutterNode(document.getElementById("canvasdiv"));
  807. }
  808. var units = {
  809. prefixes: {
  810. giga: ["G", "g", "giga", "Giga", "GIGA"],
  811. mega: ["M", "mega", "Mega", "MEGA"],
  812. kilo: ["K", "k", "kilo", "Kilo", "KILO"],
  813. milli: ["m", "milli", "Milli", "MILLI"],
  814. micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
  815. nano: ["N", "n", "nano", "Nano", "NANO"],
  816. pico: ["P", "p", "pico", "Pico", "PICO"],
  817. },
  818. unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  819. unitsLong: [
  820. "OHM", "Ohm", "ohm", "ohms",
  821. "FARAD", "Farad", "farad",
  822. "HENRY", "Henry", "henry"
  823. ],
  824. getMultiplier: function(s) {
  825. if (this.prefixes.giga.includes(s)) return 1e9;
  826. if (this.prefixes.mega.includes(s)) return 1e6;
  827. if (this.prefixes.kilo.includes(s)) return 1e3;
  828. if (this.prefixes.milli.includes(s)) return 1e-3;
  829. if (this.prefixes.micro.includes(s)) return 1e-6;
  830. if (this.prefixes.nano.includes(s)) return 1e-9;
  831. if (this.prefixes.pico.includes(s)) return 1e-12;
  832. return 1;
  833. },
  834. valueRegex: null,
  835. }
  836. function initUtils() {
  837. var allPrefixes = units.prefixes.giga
  838. .concat(units.prefixes.mega)
  839. .concat(units.prefixes.kilo)
  840. .concat(units.prefixes.milli)
  841. .concat(units.prefixes.micro)
  842. .concat(units.prefixes.nano)
  843. .concat(units.prefixes.pico);
  844. var allUnits = units.unitsShort.concat(units.unitsLong);
  845. units.valueRegex = new RegExp("^([0-9\.]+)" +
  846. "\\s*(" + allPrefixes.join("|") + ")?" +
  847. "(" + allUnits.join("|") + ")?" +
  848. "(\\b.*)?$", "");
  849. units.valueAltRegex = new RegExp("^([0-9]*)" +
  850. "(" + units.unitsShort.join("|") + ")?" +
  851. "([GgMmKkUuNnPp])?" +
  852. "([0-9]*)" +
  853. "(\\b.*)?$", "");
  854. for (var bom_type of ["both", "F", "B"]) {
  855. for (var row of pcbdata.bom[bom_type]) {
  856. row.push(parseValue(row[1], row[3][0][0]));
  857. }
  858. }
  859. }
  860. function parseValue(val, ref) {
  861. var inferUnit = (unit, ref) => {
  862. if (unit) {
  863. unit = unit.toLowerCase();
  864. if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
  865. unit = 'r';
  866. }
  867. unit = unit[0];
  868. } else {
  869. ref = /^([a-z]+)\d+$/i.exec(ref);
  870. if (ref) {
  871. ref = ref[1].toLowerCase();
  872. if (ref == "c") unit = 'f';
  873. else if (ref == "l") unit = 'h';
  874. else if (ref == "r" || ref == "rv") unit = 'r';
  875. else unit = null;
  876. }
  877. }
  878. return unit;
  879. };
  880. val = val.replace(/,/g, "");
  881. var match = units.valueRegex.exec(val);
  882. var unit;
  883. if (match) {
  884. val = parseFloat(match[1]);
  885. if (match[2]) {
  886. val = val * units.getMultiplier(match[2]);
  887. }
  888. unit = inferUnit(match[3], ref);
  889. if (!unit) return null;
  890. else return {
  891. val: val,
  892. unit: unit,
  893. extra: match[4],
  894. }
  895. }
  896. match = units.valueAltRegex.exec(val);
  897. if (match && (match[1] || match[4])) {
  898. val = parseFloat(match[1] + "." + match[4]);
  899. if (match[3]) {
  900. val = val * units.getMultiplier(match[3]);
  901. }
  902. unit = inferUnit(match[2], ref);
  903. if (!unit) return null;
  904. else return {
  905. val: val,
  906. unit: unit,
  907. extra: match[5],
  908. }
  909. }
  910. return null;
  911. }
  912. function valueCompare(a, b, stra, strb) {
  913. if (a === null && b === null) {
  914. // Failed to parse both values, compare them as strings.
  915. if (stra != strb) return stra > strb ? 1 : -1;
  916. else return 0;
  917. } else if (a === null) {
  918. return 1;
  919. } else if (b === null) {
  920. return -1;
  921. } else {
  922. if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
  923. else if (a.val != b.val) return a.val > b.val ? 1 : -1;
  924. else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
  925. else return 0;
  926. }
  927. }
  928. function validateSaveImgDimension(element) {
  929. var valid = false;
  930. var intValue = 0;
  931. if (/^[1-9]\d*$/.test(element.value)) {
  932. intValue = parseInt(element.value);
  933. if (intValue <= 16000) {
  934. valid = true;
  935. }
  936. }
  937. if (valid) {
  938. element.classList.remove("invalid");
  939. } else {
  940. element.classList.add("invalid");
  941. }
  942. return intValue;
  943. }
  944. function saveImage(layer) {
  945. var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  946. var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  947. var bgcolor = null;
  948. if (!document.getElementById("render-save-transparent").checked) {
  949. var style = getComputedStyle(topmostdiv);
  950. bgcolor = style.getPropertyValue("background-color");
  951. }
  952. if (!width || !height) return;
  953. // Prepare image
  954. var canvas = document.createElement("canvas");
  955. var layerdict = {
  956. transform: {
  957. x: 0,
  958. y: 0,
  959. s: 1,
  960. panx: 0,
  961. pany: 0,
  962. zoom: 1,
  963. },
  964. bg: canvas,
  965. fab: canvas,
  966. silk: canvas,
  967. highlight: canvas,
  968. layer: layer,
  969. }
  970. // Do the rendering
  971. recalcLayerScale(layerdict, width, height);
  972. prepareLayer(layerdict);
  973. clearCanvas(canvas, bgcolor);
  974. drawBackground(layerdict, false);
  975. drawHighlightsOnLayer(layerdict, false);
  976. // Save image
  977. var imgdata = canvas.toDataURL("image/png");
  978. var filename = pcbdata.metadata.title;
  979. if (pcbdata.metadata.revision) {
  980. filename += `.${pcbdata.metadata.revision}`;
  981. }
  982. filename += `.${layer}.png`;
  983. saveFile(filename, dataURLtoBlob(imgdata));
  984. }
  985. function saveSettings() {
  986. var data = {
  987. type: "InteractiveHtmlBom settings",
  988. version: 1,
  989. pcbmetadata: pcbdata.metadata,
  990. settings: settings,
  991. }
  992. var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
  993. saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
  994. }
  995. function loadSettings() {
  996. var input = document.createElement("input");
  997. input.type = "file";
  998. input.accept = ".settings.json";
  999. input.onchange = function(e) {
  1000. var file = e.target.files[0];
  1001. var reader = new FileReader();
  1002. reader.onload = readerEvent => {
  1003. var content = readerEvent.target.result;
  1004. var newSettings;
  1005. try {
  1006. newSettings = JSON.parse(content);
  1007. } catch(e) {
  1008. alert("Selected file is not InteractiveHtmlBom settings file.");
  1009. return;
  1010. }
  1011. if (newSettings.type != "InteractiveHtmlBom settings") {
  1012. alert("Selected file is not InteractiveHtmlBom settings file.");
  1013. return;
  1014. }
  1015. var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
  1016. if (metadataMatches) {
  1017. for (var k in pcbdata.metadata) {
  1018. if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
  1019. metadataMatches = false;
  1020. }
  1021. }
  1022. }
  1023. if (!metadataMatches) {
  1024. var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
  1025. var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
  1026. if (!confirm(
  1027. `Settins file metadata does not match current metadata.\n\n` +
  1028. `Page metadata:\n${currentMetadata}\n\n` +
  1029. `Settings file metadata:\n${fileMetadata}\n\n` +
  1030. `Press OK if you would like to import settings anyway.`)) {
  1031. return;
  1032. }
  1033. }
  1034. overwriteSettings(newSettings.settings);
  1035. }
  1036. reader.readAsText(file, 'UTF-8');
  1037. }
  1038. input.click();
  1039. }
  1040. function overwriteSettings(newSettings) {
  1041. initDone = false;
  1042. Object.assign(settings, newSettings);
  1043. writeStorage("bomlayout", settings.bomlayout);
  1044. writeStorage("bommode", settings.bommode);
  1045. writeStorage("canvaslayout", settings.canvaslayout);
  1046. writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  1047. document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  1048. for (var checkbox of settings.checkboxes) {
  1049. writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  1050. }
  1051. writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
  1052. padsVisible(settings.renderPads);
  1053. document.getElementById("padsCheckbox").checked = settings.renderPads;
  1054. fabricationVisible(settings.renderFabrication);
  1055. document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  1056. silkscreenVisible(settings.renderSilkscreen);
  1057. document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  1058. referencesVisible(settings.renderReferences);
  1059. document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  1060. valuesVisible(settings.renderValues);
  1061. document.getElementById("valuesCheckbox").checked = settings.renderValues;
  1062. tracksVisible(settings.renderTracks);
  1063. document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  1064. zonesVisible(settings.renderZones);
  1065. document.getElementById("zonesCheckbox").checked = settings.renderZones;
  1066. dnpOutline(settings.renderDnpOutline);
  1067. document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  1068. setRedrawOnDrag(settings.redrawOnDrag);
  1069. document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  1070. setDarkMode(settings.darkMode);
  1071. document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  1072. setHighlightPin1(settings.highlightpin1);
  1073. document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
  1074. writeStorage("boardRotation", settings.boardRotation);
  1075. document.getElementById("boardRotation").value = settings.boardRotation / 5;
  1076. document.getElementById("rotationDegree").textContent = settings.boardRotation;
  1077. initDone = true;
  1078. prepCheckboxes();
  1079. changeBomLayout(settings.bomlayout);
  1080. }
  1081. function saveFile(filename, blob) {
  1082. var link = document.createElement("a");
  1083. var objurl = URL.createObjectURL(blob);
  1084. link.download = filename;
  1085. link.href = objurl;
  1086. link.click();
  1087. }
  1088. function dataURLtoBlob(dataurl) {
  1089. var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
  1090. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  1091. while(n--){
  1092. u8arr[n] = bstr.charCodeAt(n);
  1093. }
  1094. return new Blob([u8arr], {type:mime});
  1095. }
  1096. var settings = {
  1097. canvaslayout: "default",
  1098. bomlayout: "default",
  1099. bommode: "grouped",
  1100. checkboxes: [],
  1101. checkboxStoredRefs: {},
  1102. darkMode: false,
  1103. highlightpin1: false,
  1104. redrawOnDrag: true,
  1105. boardRotation: 0,
  1106. renderPads: true,
  1107. renderReferences: true,
  1108. renderValues: true,
  1109. renderSilkscreen: true,
  1110. renderFabrication: true,
  1111. renderDnpOutline: false,
  1112. renderTracks: true,
  1113. renderZones: true,
  1114. }
  1115. function initDefaults() {
  1116. settings.bomlayout = readStorage("bomlayout");
  1117. if (settings.bomlayout === null) {
  1118. settings.bomlayout = config.bom_view;
  1119. }
  1120. if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
  1121. settings.bomlayout = config.bom_view;
  1122. }
  1123. settings.bommode = readStorage("bommode");
  1124. if (settings.bommode === null) {
  1125. settings.bommode = "grouped";
  1126. }
  1127. if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
  1128. settings.bommode = "grouped";
  1129. }
  1130. settings.canvaslayout = readStorage("canvaslayout");
  1131. if (settings.canvaslayout === null) {
  1132. settings.canvaslayout = config.layer_view;
  1133. }
  1134. var bomCheckboxes = readStorage("bomCheckboxes");
  1135. if (bomCheckboxes === null) {
  1136. bomCheckboxes = config.checkboxes;
  1137. }
  1138. settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  1139. document.getElementById("bomCheckboxes").value = bomCheckboxes;
  1140. settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
  1141. populateDarkenWhenCheckedOptions();
  1142. function initBooleanSetting(storageString, def, elementId, func) {
  1143. var b = readStorage(storageString);
  1144. if (b === null) {
  1145. b = def;
  1146. } else {
  1147. b = (b == "true");
  1148. }
  1149. document.getElementById(elementId).checked = b;
  1150. func(b);
  1151. }
  1152. initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  1153. initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  1154. initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  1155. initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  1156. initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
  1157. if ("tracks" in pcbdata) {
  1158. initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
  1159. initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  1160. } else {
  1161. document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
  1162. tracksVisible(false);
  1163. zonesVisible(false);
  1164. }
  1165. initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  1166. initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  1167. initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
  1168. initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
  1169. settings.boardRotation = readStorage("boardRotation");
  1170. if (settings.boardRotation === null) {
  1171. settings.boardRotation = config.board_rotation * 5;
  1172. } else {
  1173. settings.boardRotation = parseInt(settings.boardRotation);
  1174. }
  1175. document.getElementById("boardRotation").value = settings.boardRotation / 5;
  1176. document.getElementById("rotationDegree").textContent = settings.boardRotation;
  1177. }
  1178. // Helper classes for user js callbacks.
  1179. const IBOM_EVENT_TYPES = {
  1180. ALL: "all",
  1181. HIGHLIGHT_EVENT: "highlightEvent",
  1182. CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
  1183. BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
  1184. }
  1185. const EventHandler = {
  1186. callbacks: {},
  1187. init: function() {
  1188. for (eventType of Object.values(IBOM_EVENT_TYPES))
  1189. this.callbacks[eventType] = [];
  1190. },
  1191. registerCallback: function(eventType, callback) {
  1192. this.callbacks[eventType].push(callback);
  1193. },
  1194. emitEvent: function(eventType, eventArgs) {
  1195. event = {
  1196. eventType: eventType,
  1197. args: eventArgs,
  1198. }
  1199. var callback;
  1200. for(callback of this.callbacks[eventType])
  1201. callback(event);
  1202. for(callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
  1203. callback(event);
  1204. }
  1205. }
  1206. EventHandler.init();
  1207. ///////////////////////////////////////////////
  1208. ///////////////////////////////////////////////
  1209. /* PCB rendering code */
  1210. var emptyContext2d = document.createElement("canvas").getContext("2d");
  1211. function deg2rad(deg) {
  1212. return deg * Math.PI / 180;
  1213. }
  1214. function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  1215. var point = [
  1216. linepoint[0] * text.width + offsetx,
  1217. linepoint[1] * text.height + offsety
  1218. ];
  1219. // This approximates pcbnew behavior with how text tilts depending on horizontal justification
  1220. point[0] -= (linepoint[1] + 0.5 * (1 + text.horiz_justify)) * text.height * tilt;
  1221. return point;
  1222. }
  1223. function drawtext(ctx, text, color, flip) {
  1224. if ("ref" in text && !settings.renderReferences) return;
  1225. if ("val" in text && !settings.renderValues) return;
  1226. ctx.save();
  1227. ctx.fillStyle = color;
  1228. ctx.strokeStyle = color;
  1229. ctx.lineCap = "round";
  1230. ctx.lineJoin = "round";
  1231. ctx.lineWidth = text.thickness;
  1232. if (text.svgpath) {
  1233. ctx.stroke(new Path2D(text.svgpath));
  1234. ctx.restore();
  1235. return;
  1236. }
  1237. ctx.translate(...text.pos);
  1238. ctx.translate(text.thickness * 0.5, 0);
  1239. var angle = -text.angle;
  1240. if (text.attr.includes("mirrored")) {
  1241. ctx.scale(-1, 1);
  1242. angle = -angle;
  1243. }
  1244. var tilt = 0;
  1245. if (text.attr.includes("italic")) {
  1246. tilt = 0.125;
  1247. }
  1248. var interline = (text.height * 1.5 + text.thickness) / 2;
  1249. var txt = text.text.split("\n");
  1250. // KiCad ignores last empty line.
  1251. if (txt[txt.length - 1] == '') txt.pop();
  1252. ctx.rotate(deg2rad(angle));
  1253. for (var i in txt) {
  1254. var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
  1255. var lineWidth = text.thickness + interline * tilt;
  1256. for (var j = 0; j < txt[i].length; j++) {
  1257. if (txt[i][j] == '\t') {
  1258. var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
  1259. lineWidth += fourSpaces - lineWidth % fourSpaces;
  1260. } else {
  1261. if (txt[i][j] == '~') {
  1262. j++;
  1263. if (j == txt[i].length)
  1264. break;
  1265. }
  1266. lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
  1267. }
  1268. }
  1269. var offsetx = 0;
  1270. switch (text.horiz_justify) {
  1271. case -1:
  1272. // Justify left, do nothing
  1273. break;
  1274. case 0:
  1275. // Justify center
  1276. offsetx -= lineWidth / 2;
  1277. break;
  1278. case 1:
  1279. // Justify right
  1280. offsetx -= lineWidth;
  1281. break;
  1282. }
  1283. var inOverbar = false;
  1284. for (var j = 0; j < txt[i].length; j++) {
  1285. if (txt[i][j] == '\t') {
  1286. var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
  1287. offsetx += fourSpaces - offsetx % fourSpaces;
  1288. continue;
  1289. } else if (txt[i][j] == '~') {
  1290. j++;
  1291. if (j == txt[i].length)
  1292. break;
  1293. if (txt[i][j] != '~') {
  1294. inOverbar = !inOverbar;
  1295. }
  1296. }
  1297. var glyph = pcbdata.font_data[txt[i][j]];
  1298. if (inOverbar) {
  1299. var overbarStart = [offsetx, -text.height * 1.4 + offsety];
  1300. var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
  1301. if (!lastHadOverbar) {
  1302. overbarStart[0] += text.height * 1.4 * tilt;
  1303. lastHadOverbar = true;
  1304. }
  1305. ctx.beginPath();
  1306. ctx.moveTo(...overbarStart);
  1307. ctx.lineTo(...overbarEnd);
  1308. ctx.stroke();
  1309. } else {
  1310. lastHadOverbar = false;
  1311. }
  1312. for (var line of glyph.l) {
  1313. ctx.beginPath();
  1314. ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
  1315. for (var k = 1; k < line.length; k++) {
  1316. ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
  1317. }
  1318. ctx.stroke();
  1319. }
  1320. offsetx += glyph.w * text.width;
  1321. }
  1322. }
  1323. ctx.restore();
  1324. }
  1325. function drawedge(ctx, scalefactor, edge, color) {
  1326. ctx.strokeStyle = color;
  1327. ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  1328. ctx.lineCap = "round";
  1329. if (edge.svgpath) {
  1330. ctx.stroke(new Path2D(edge.svgpath));
  1331. } else {
  1332. ctx.beginPath();
  1333. if (edge.type == "segment") {
  1334. ctx.moveTo(...edge.start);
  1335. ctx.lineTo(...edge.end);
  1336. }
  1337. if (edge.type == "arc") {
  1338. ctx.arc(
  1339. ...edge.start,
  1340. edge.radius,
  1341. deg2rad(edge.startangle),
  1342. deg2rad(edge.endangle));
  1343. }
  1344. if (edge.type == "circle") {
  1345. ctx.arc(
  1346. ...edge.start,
  1347. edge.radius,
  1348. 0, 2 * Math.PI);
  1349. ctx.closePath();
  1350. }
  1351. if (edge.type == "curve") {
  1352. ctx.moveTo(...edge.start);
  1353. ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
  1354. }
  1355. ctx.stroke();
  1356. }
  1357. }
  1358. function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  1359. // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  1360. var path = new Path2D();
  1361. var width = size[0];
  1362. var height = size[1];
  1363. var x = width * -0.5;
  1364. var y = height * -0.5;
  1365. var chamfOffset = Math.min(width, height) * chamfratio;
  1366. path.moveTo(x, 0);
  1367. if (chamfpos & 4) {
  1368. path.lineTo(x, y + height - chamfOffset);
  1369. path.lineTo(x + chamfOffset, y + height);
  1370. path.lineTo(0, y + height);
  1371. } else {
  1372. path.arcTo(x, y + height, x + width, y + height, radius);
  1373. }
  1374. if (chamfpos & 8) {
  1375. path.lineTo(x + width - chamfOffset, y + height);
  1376. path.lineTo(x + width, y + height - chamfOffset);
  1377. path.lineTo(x + width, 0);
  1378. } else {
  1379. path.arcTo(x + width, y + height, x + width, y, radius);
  1380. }
  1381. if (chamfpos & 2) {
  1382. path.lineTo(x + width, y + chamfOffset);
  1383. path.lineTo(x + width - chamfOffset, y);
  1384. path.lineTo(0, y);
  1385. } else {
  1386. path.arcTo(x + width, y, x, y, radius);
  1387. }
  1388. if (chamfpos & 1) {
  1389. path.lineTo(x + chamfOffset, y);
  1390. path.lineTo(x, y + chamfOffset);
  1391. path.lineTo(x, 0);
  1392. } else {
  1393. path.arcTo(x, y, x, y + height, radius);
  1394. }
  1395. path.closePath();
  1396. return path;
  1397. }
  1398. function getOblongPath(size) {
  1399. return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
  1400. }
  1401. function getPolygonsPath(shape) {
  1402. if (shape.path2d) {
  1403. return shape.path2d;
  1404. }
  1405. if (shape.svgpath) {
  1406. shape.path2d = new Path2D(shape.svgpath);
  1407. } else {
  1408. var path = new Path2D();
  1409. for (var polygon of shape.polygons) {
  1410. path.moveTo(...polygon[0]);
  1411. for (var i = 1; i < polygon.length; i++) {
  1412. path.lineTo(...polygon[i]);
  1413. }
  1414. path.closePath();
  1415. }
  1416. shape.path2d = path;
  1417. }
  1418. return shape.path2d;
  1419. }
  1420. function drawPolygonShape(ctx, shape, color) {
  1421. ctx.save();
  1422. ctx.fillStyle = color;
  1423. if (!shape.svgpath) {
  1424. ctx.translate(...shape.pos);
  1425. ctx.rotate(deg2rad(-shape.angle));
  1426. }
  1427. ctx.fill(getPolygonsPath(shape));
  1428. ctx.restore();
  1429. }
  1430. function drawDrawing(ctx, layer, scalefactor, drawing, color) {
  1431. if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
  1432. drawedge(ctx, scalefactor, drawing, color);
  1433. } else if (drawing.type == "polygon") {
  1434. drawPolygonShape(ctx, drawing, color);
  1435. } else {
  1436. drawtext(ctx, drawing, color, layer == "B");
  1437. }
  1438. }
  1439. function getCirclePath(radius) {
  1440. var path = new Path2D();
  1441. path.arc(0, 0, radius, 0, 2 * Math.PI);
  1442. path.closePath();
  1443. return path;
  1444. }
  1445. function getCachedPadPath(pad) {
  1446. if (!pad.path2d) {
  1447. // if path2d is not set, build one and cache it on pad object
  1448. if (pad.shape == "rect") {
  1449. pad.path2d = new Path2D();
  1450. pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
  1451. } else if (pad.shape == "oval") {
  1452. pad.path2d = getOblongPath(pad.size);
  1453. } else if (pad.shape == "circle") {
  1454. pad.path2d = getCirclePath(pad.size[0] / 2);
  1455. } else if (pad.shape == "roundrect") {
  1456. pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
  1457. } else if (pad.shape == "chamfrect") {
  1458. pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
  1459. } else if (pad.shape == "custom") {
  1460. pad.path2d = getPolygonsPath(pad);
  1461. }
  1462. }
  1463. return pad.path2d;
  1464. }
  1465. function drawPad(ctx, pad, color, outline, hole) {
  1466. ctx.save();
  1467. ctx.translate(...pad.pos);
  1468. ctx.rotate(deg2rad(pad.angle));
  1469. if (pad.offset) {
  1470. ctx.translate(...pad.offset);
  1471. }
  1472. ctx.fillStyle = color;
  1473. ctx.strokeStyle = color;
  1474. var path = getCachedPadPath(pad);
  1475. if (outline) {
  1476. ctx.stroke(path);
  1477. } else {
  1478. ctx.fill(path);
  1479. }
  1480. if (pad.type == "th" && hole) {
  1481. if (pad.offset) {
  1482. ctx.translate(-pad.offset[0], -pad.offset[1]);
  1483. }
  1484. ctx.fillStyle = "#CCCCCC";
  1485. if (pad.drillshape == "oblong") {
  1486. ctx.fill(getOblongPath(pad.drillsize));
  1487. } else {
  1488. ctx.fill(getCirclePath(pad.drillsize[0] / 2));
  1489. }
  1490. }
  1491. ctx.restore();
  1492. }
  1493. function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
  1494. if (highlight) {
  1495. // draw bounding box
  1496. if (module.layer == layer) {
  1497. ctx.save();
  1498. ctx.globalAlpha = 0.2;
  1499. ctx.translate(...module.bbox.pos);
  1500. ctx.rotate(deg2rad(-module.bbox.angle));
  1501. ctx.translate(...module.bbox.relpos);
  1502. ctx.fillStyle = padcolor;
  1503. ctx.fillRect(0, 0, ...module.bbox.size);
  1504. ctx.globalAlpha = 1;
  1505. ctx.strokeStyle = padcolor;
  1506. ctx.strokeRect(0, 0, ...module.bbox.size);
  1507. ctx.restore();
  1508. }
  1509. }
  1510. // draw drawings
  1511. for (var drawing of module.drawings) {
  1512. if (drawing.layer == layer) {
  1513. drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
  1514. }
  1515. }
  1516. // draw pads
  1517. if (settings.renderPads) {
  1518. for (var pad of module.pads) {
  1519. if (pad.layers.includes(layer)) {
  1520. drawPad(ctx, pad, padcolor, outline, true);
  1521. if (pad.pin1 && settings.highlightpin1) {
  1522. drawPad(ctx, pad, outlinecolor, true, false);
  1523. }
  1524. }
  1525. }
  1526. }
  1527. }
  1528. function drawEdgeCuts(canvas, scalefactor) {
  1529. var ctx = canvas.getContext("2d");
  1530. var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  1531. for (var edge of pcbdata.edges) {
  1532. drawedge(ctx, scalefactor, edge, edgecolor);
  1533. }
  1534. }
  1535. function drawModules(canvas, layer, scalefactor, highlight) {
  1536. var ctx = canvas.getContext("2d");
  1537. ctx.lineWidth = 3 / scalefactor;
  1538. var style = getComputedStyle(topmostdiv);
  1539. var padcolor = style.getPropertyValue('--pad-color');
  1540. var outlinecolor = style.getPropertyValue('--pin1-outline-color');
  1541. if (highlight) {
  1542. padcolor = style.getPropertyValue('--pad-color-highlight');
  1543. outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
  1544. }
  1545. for (var i = 0; i < pcbdata.modules.length; i++) {
  1546. var mod = pcbdata.modules[i];
  1547. var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
  1548. if (!highlight || highlightedModules.includes(i)) {
  1549. drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
  1550. }
  1551. }
  1552. }
  1553. function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  1554. var ctx = canvas.getContext("2d");
  1555. for (var d of pcbdata[layername][layer]) {
  1556. if (["segment", "arc", "circle", "curve"].includes(d.type)) {
  1557. drawedge(ctx, scalefactor, d, edgeColor);
  1558. } else if (d.type == "polygon") {
  1559. drawPolygonShape(ctx, d, polygonColor);
  1560. } else {
  1561. drawtext(ctx, d, textColor, layer == "B");
  1562. }
  1563. }
  1564. }
  1565. function drawTracks(canvas, layer, color, highlight) {
  1566. ctx = canvas.getContext("2d");
  1567. ctx.strokeStyle = color;
  1568. ctx.lineCap = "round";
  1569. for(var track of pcbdata.tracks[layer]) {
  1570. if (highlight && highlightedNet != track.net) continue;
  1571. ctx.lineWidth = track.width;
  1572. ctx.beginPath();
  1573. ctx.moveTo(...track.start);
  1574. ctx.lineTo(...track.end);
  1575. ctx.stroke();
  1576. }
  1577. }
  1578. function drawZones(canvas, layer, color, highlight) {
  1579. ctx = canvas.getContext("2d");
  1580. ctx.strokeStyle = color;
  1581. ctx.fillStyle = color;
  1582. ctx.lineJoin = "round";
  1583. for(var zone of pcbdata.zones[layer]) {
  1584. if (!zone.path2d) {
  1585. zone.path2d = getPolygonsPath(zone);
  1586. }
  1587. if (highlight && highlightedNet != zone.net) continue;
  1588. ctx.lineWidth = zone.width ? zone.width : 0;
  1589. ctx.fill(zone.path2d);
  1590. ctx.stroke(zone.path2d);
  1591. }
  1592. }
  1593. function clearCanvas(canvas, color = null) {
  1594. var ctx = canvas.getContext("2d");
  1595. ctx.save();
  1596. ctx.setTransform(1, 0, 0, 1, 0, 0);
  1597. if (color) {
  1598. ctx.fillStyle = color;
  1599. ctx.fillRect(0, 0, canvas.width, canvas.height);
  1600. } else {
  1601. ctx.clearRect(0, 0, canvas.width, canvas.height);
  1602. }
  1603. ctx.restore();
  1604. }
  1605. function drawNets(canvas, layer, highlight) {
  1606. var style = getComputedStyle(topmostdiv);
  1607. if (settings.renderTracks) {
  1608. var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
  1609. drawTracks(canvas, layer, trackColor, highlight);
  1610. }
  1611. if (settings.renderZones) {
  1612. var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
  1613. drawZones(canvas, layer, zoneColor, highlight);
  1614. }
  1615. if (highlight && settings.renderPads) {
  1616. var padColor = style.getPropertyValue('--pad-color-highlight');
  1617. var ctx = canvas.getContext("2d");
  1618. for (var mod of pcbdata.modules) {
  1619. // draw pads
  1620. for (var pad of mod.pads) {
  1621. if (highlightedNet != pad.net) continue;
  1622. if (pad.layers.includes(layer)) {
  1623. drawPad(ctx, pad, padColor, false, true);
  1624. }
  1625. }
  1626. }
  1627. }
  1628. }
  1629. function drawHighlightsOnLayer(canvasdict, clear = true) {
  1630. if (clear) {
  1631. clearCanvas(canvasdict.highlight);
  1632. }
  1633. if (highlightedModules.length > 0) {
  1634. drawModules(canvasdict.highlight, canvasdict.layer,
  1635. canvasdict.transform.s * canvasdict.transform.zoom, true);
  1636. }
  1637. if (highlightedNet !== null) {
  1638. drawNets(canvasdict.highlight, canvasdict.layer, true);
  1639. }
  1640. }
  1641. function drawHighlights() {
  1642. drawHighlightsOnLayer(allcanvas.front);
  1643. drawHighlightsOnLayer(allcanvas.back);
  1644. }
  1645. function drawBackground(canvasdict, clear = true) {
  1646. if (clear) {
  1647. clearCanvas(canvasdict.bg);
  1648. clearCanvas(canvasdict.fab);
  1649. clearCanvas(canvasdict.silk);
  1650. }
  1651. drawNets(canvasdict.bg, canvasdict.layer, false);
  1652. drawModules(canvasdict.bg, canvasdict.layer,
  1653. canvasdict.transform.s * canvasdict.transform.zoom, false);
  1654. drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
  1655. var style = getComputedStyle(topmostdiv);
  1656. var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  1657. var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  1658. var textColor = style.getPropertyValue('--silkscreen-text-color');
  1659. if (settings.renderSilkscreen) {
  1660. drawBgLayer(
  1661. "silkscreen", canvasdict.silk, canvasdict.layer,
  1662. canvasdict.transform.s * canvasdict.transform.zoom,
  1663. edgeColor, polygonColor, textColor);
  1664. }
  1665. edgeColor = style.getPropertyValue('--fabrication-edge-color');
  1666. polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  1667. textColor = style.getPropertyValue('--fabrication-text-color');
  1668. if (settings.renderFabrication) {
  1669. drawBgLayer(
  1670. "fabrication", canvasdict.fab, canvasdict.layer,
  1671. canvasdict.transform.s * canvasdict.transform.zoom,
  1672. edgeColor, polygonColor, textColor);
  1673. }
  1674. }
  1675. function prepareCanvas(canvas, flip, transform) {
  1676. var ctx = canvas.getContext("2d");
  1677. ctx.setTransform(1, 0, 0, 1, 0, 0);
  1678. var fontsize = 1.55;
  1679. ctx.scale(transform.zoom, transform.zoom);
  1680. ctx.translate(transform.panx, transform.pany);
  1681. if (flip) {
  1682. ctx.scale(-1, 1);
  1683. }
  1684. ctx.translate(transform.x, transform.y);
  1685. ctx.rotate(deg2rad(settings.boardRotation));
  1686. ctx.scale(transform.s, transform.s);
  1687. }
  1688. function prepareLayer(canvasdict) {
  1689. var flip = (canvasdict.layer == "B");
  1690. for (var c of ["bg", "fab", "silk", "highlight"]) {
  1691. prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  1692. }
  1693. }
  1694. function rotateVector(v, angle) {
  1695. angle = deg2rad(angle);
  1696. return [
  1697. v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
  1698. v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  1699. ];
  1700. }
  1701. function applyRotation(bbox) {
  1702. var corners = [
  1703. [bbox.minx, bbox.miny],
  1704. [bbox.minx, bbox.maxy],
  1705. [bbox.maxx, bbox.miny],
  1706. [bbox.maxx, bbox.maxy],
  1707. ];
  1708. corners = corners.map((v) => rotateVector(v, settings.boardRotation));
  1709. return {
  1710. minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
  1711. miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
  1712. maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
  1713. maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  1714. }
  1715. }
  1716. function recalcLayerScale(layerdict, width, height) {
  1717. var bbox = applyRotation(pcbdata.edges_bbox);
  1718. var scalefactor = 0.98 * Math.min(
  1719. width / (bbox.maxx - bbox.minx),
  1720. height / (bbox.maxy - bbox.miny)
  1721. );
  1722. if (scalefactor < 0.1) {
  1723. scalefactor = 1;
  1724. }
  1725. layerdict.transform.s = scalefactor;
  1726. var flip = (layerdict.layer == "B");
  1727. if (flip) {
  1728. layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  1729. } else {
  1730. layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  1731. }
  1732. layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  1733. for (var c of ["bg", "fab", "silk", "highlight"]) {
  1734. canvas = layerdict[c];
  1735. canvas.width = width;
  1736. canvas.height = height;
  1737. canvas.style.width = (width / devicePixelRatio) + "px";
  1738. canvas.style.height = (height / devicePixelRatio) + "px";
  1739. }
  1740. }
  1741. function redrawCanvas(layerdict) {
  1742. prepareLayer(layerdict);
  1743. drawBackground(layerdict);
  1744. drawHighlightsOnLayer(layerdict);
  1745. }
  1746. function resizeCanvas(layerdict) {
  1747. var canvasdivid = {
  1748. "F": "frontcanvas",
  1749. "B": "backcanvas"
  1750. } [layerdict.layer];
  1751. var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  1752. var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  1753. recalcLayerScale(layerdict, width, height);
  1754. redrawCanvas(layerdict);
  1755. }
  1756. function resizeAll() {
  1757. resizeCanvas(allcanvas.front);
  1758. resizeCanvas(allcanvas.back);
  1759. }
  1760. function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  1761. var A = x - x1;
  1762. var B = y - y1;
  1763. var C = x2 - x1;
  1764. var D = y2 - y1;
  1765. var dot = A * C + B * D;
  1766. var len_sq = C * C + D * D;
  1767. var dx, dy;
  1768. if (len_sq == 0) {
  1769. // start and end of the segment coincide
  1770. dx = x - x1;
  1771. dy = y - y1;
  1772. } else {
  1773. var param = dot / len_sq;
  1774. var xx, yy;
  1775. if (param < 0) {
  1776. xx = x1;
  1777. yy = y1;
  1778. } else if (param > 1) {
  1779. xx = x2;
  1780. yy = y2;
  1781. } else {
  1782. xx = x1 + param * C;
  1783. yy = y1 + param * D;
  1784. }
  1785. dx = x - xx;
  1786. dy = y - yy;
  1787. }
  1788. return dx * dx + dy * dy <= d * d;
  1789. }
  1790. function pointWithinPad(x, y, pad) {
  1791. var v = [x - pad.pos[0], y - pad.pos[1]];
  1792. v = rotateVector(v, -pad.angle);
  1793. if (pad.offset) {
  1794. v[0] -= pad.offset[0];
  1795. v[1] -= pad.offset[1];
  1796. }
  1797. return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
  1798. }
  1799. function netHitScan(layer, x, y) {
  1800. // Check track segments
  1801. if (settings.renderTracks && pcbdata.tracks) {
  1802. for(var track of pcbdata.tracks[layer]) {
  1803. if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
  1804. return track.net;
  1805. }
  1806. }
  1807. }
  1808. // Check pads
  1809. if (settings.renderPads) {
  1810. for (var mod of pcbdata.modules) {
  1811. for(var pad of mod.pads) {
  1812. if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
  1813. return pad.net;
  1814. }
  1815. }
  1816. }
  1817. }
  1818. return null;
  1819. }
  1820. function pointWithinModuleBbox(x, y, bbox) {
  1821. var v = [x - bbox.pos[0], y - bbox.pos[1]];
  1822. v = rotateVector(v, bbox.angle);
  1823. return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
  1824. bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
  1825. }
  1826. function bboxHitScan(layer, x, y) {
  1827. var result = [];
  1828. for (var i = 0; i < pcbdata.modules.length; i++) {
  1829. var module = pcbdata.modules[i];
  1830. if (module.layer == layer) {
  1831. if (pointWithinModuleBbox(x, y, module.bbox)) {
  1832. result.push(i);
  1833. }
  1834. }
  1835. }
  1836. return result;
  1837. }
  1838. function handlePointerDown(e, layerdict) {
  1839. if (e.button != 0) {
  1840. return;
  1841. }
  1842. e.preventDefault();
  1843. e.stopPropagation();
  1844. if (!e.hasOwnProperty("offsetX")) {
  1845. // The polyfill doesn't set this properly
  1846. e.offsetX = e.pageX - e.currentTarget.offsetLeft;
  1847. e.offsetY = e.pageY - e.currentTarget.offsetTop;
  1848. }
  1849. layerdict.pointerStates[e.pointerId] = {
  1850. distanceTravelled: 0,
  1851. lastX: e.offsetX,
  1852. lastY: e.offsetY,
  1853. downTime: Date.now(),
  1854. };
  1855. }
  1856. function handleMouseClick(e, layerdict) {
  1857. if (!e.hasOwnProperty("offsetX")) {
  1858. // The polyfill doesn't set this properly
  1859. e.offsetX = e.pageX - e.currentTarget.offsetLeft;
  1860. e.offsetY = e.pageY - e.currentTarget.offsetTop;
  1861. }
  1862. var x = e.offsetX;
  1863. var y = e.offsetY;
  1864. var t = layerdict.transform;
  1865. if (layerdict.layer == "B") {
  1866. x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  1867. } else {
  1868. x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  1869. }
  1870. y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  1871. var v = rotateVector([x, y], -settings.boardRotation);
  1872. if ("nets" in pcbdata) {
  1873. var net = netHitScan(layerdict.layer, ...v);
  1874. if (net !== highlightedNet) {
  1875. netClicked(net);
  1876. }
  1877. }
  1878. if (highlightedNet === null) {
  1879. var modules = bboxHitScan(layerdict.layer, ...v);
  1880. if (modules.length > 0) {
  1881. modulesClicked(modules);
  1882. }
  1883. }
  1884. }
  1885. function handlePointerLeave(e, layerdict) {
  1886. e.preventDefault();
  1887. e.stopPropagation();
  1888. if (!settings.redrawOnDrag) {
  1889. redrawCanvas(layerdict);
  1890. }
  1891. delete layerdict.pointerStates[e.pointerId];
  1892. }
  1893. function resetTransform(layerdict) {
  1894. layerdict.transform.panx = 0;
  1895. layerdict.transform.pany = 0;
  1896. layerdict.transform.zoom = 1;
  1897. redrawCanvas(layerdict);
  1898. }
  1899. function handlePointerUp(e, layerdict) {
  1900. if (!e.hasOwnProperty("offsetX")) {
  1901. // The polyfill doesn't set this properly
  1902. e.offsetX = e.pageX - e.currentTarget.offsetLeft;
  1903. e.offsetY = e.pageY - e.currentTarget.offsetTop;
  1904. }
  1905. e.preventDefault();
  1906. e.stopPropagation();
  1907. if (e.button == 2) {
  1908. // Reset pan and zoom on right click.
  1909. resetTransform(layerdict);
  1910. layerdict.anotherPointerTapped = false;
  1911. return;
  1912. }
  1913. // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  1914. var ptr = layerdict.pointerStates[e.pointerId];
  1915. ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
  1916. if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
  1917. if (Object.keys(layerdict.pointerStates).length == 1) {
  1918. if (layerdict.anotherPointerTapped) {
  1919. // This is the second pointer coming off of a two-finger tap
  1920. resetTransform(layerdict);
  1921. } else {
  1922. // This is just a regular tap
  1923. handleMouseClick(e, layerdict);
  1924. }
  1925. layerdict.anotherPointerTapped = false;
  1926. } else {
  1927. // This is the first finger coming off of what could become a two-finger tap
  1928. layerdict.anotherPointerTapped = true;
  1929. }
  1930. } else {
  1931. if (!settings.redrawOnDrag) {
  1932. redrawCanvas(layerdict);
  1933. }
  1934. layerdict.anotherPointerTapped = false;
  1935. }
  1936. delete layerdict.pointerStates[e.pointerId];
  1937. }
  1938. function handlePointerMove(e, layerdict) {
  1939. if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
  1940. return;
  1941. }
  1942. e.preventDefault();
  1943. e.stopPropagation();
  1944. if (!e.hasOwnProperty("offsetX")) {
  1945. // The polyfill doesn't set this properly
  1946. e.offsetX = e.pageX - e.currentTarget.offsetLeft;
  1947. e.offsetY = e.pageY - e.currentTarget.offsetTop;
  1948. }
  1949. var thisPtr = layerdict.pointerStates[e.pointerId];
  1950. var dx = e.offsetX - thisPtr.lastX;
  1951. var dy = e.offsetY - thisPtr.lastY;
  1952. // If this number is low on pointer up, we count the action as a click
  1953. thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
  1954. if (Object.keys(layerdict.pointerStates).length == 1) {
  1955. // This is a simple drag
  1956. layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
  1957. layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  1958. } else if (Object.keys(layerdict.pointerStates).length == 2) {
  1959. var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
  1960. var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
  1961. var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
  1962. var scaleFactor = newDist/oldDist;
  1963. if (scaleFactor != NaN) {
  1964. layerdict.transform.zoom *= scaleFactor;
  1965. var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
  1966. layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
  1967. layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
  1968. }
  1969. }
  1970. thisPtr.lastX = e.offsetX;
  1971. thisPtr.lastY = e.offsetY;
  1972. if (settings.redrawOnDrag) {
  1973. redrawCanvas(layerdict);
  1974. }
  1975. }
  1976. function handleMouseWheel(e, layerdict) {
  1977. e.preventDefault();
  1978. e.stopPropagation();
  1979. var t = layerdict.transform;
  1980. var wheeldelta = e.deltaY;
  1981. if (e.deltaMode == 1) {
  1982. // FF only, scroll by lines
  1983. wheeldelta *= 30;
  1984. } else if (e.deltaMode == 2) {
  1985. wheeldelta *= 300;
  1986. }
  1987. var m = Math.pow(1.1, -wheeldelta / 40);
  1988. // Limit amount of zoom per tick.
  1989. if (m > 2) {
  1990. m = 2;
  1991. } else if (m < 0.5) {
  1992. m = 0.5;
  1993. }
  1994. t.zoom *= m;
  1995. var zoomd = (1 - m) / t.zoom;
  1996. t.panx += devicePixelRatio * e.offsetX * zoomd;
  1997. t.pany += devicePixelRatio * e.offsetY * zoomd;
  1998. redrawCanvas(layerdict);
  1999. }
  2000. function addMouseHandlers(div, layerdict) {
  2001. div.addEventListener("pointerdown", function(e) {
  2002. handlePointerDown(e, layerdict);
  2003. });
  2004. div.addEventListener("pointermove", function(e) {
  2005. handlePointerMove(e, layerdict);
  2006. });
  2007. div.addEventListener("pointerup", function(e) {
  2008. handlePointerUp(e, layerdict);
  2009. });
  2010. var pointerleave = function(e) {
  2011. handlePointerLeave(e, layerdict);
  2012. }
  2013. div.addEventListener("pointercancel", pointerleave);
  2014. div.addEventListener("pointerleave", pointerleave);
  2015. div.addEventListener("pointerout", pointerleave);
  2016. div.onwheel = function(e) {
  2017. handleMouseWheel(e, layerdict);
  2018. }
  2019. for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
  2020. element.addEventListener("contextmenu", function(e) {
  2021. e.preventDefault();
  2022. }, false);
  2023. }
  2024. }
  2025. function setRedrawOnDrag(value) {
  2026. settings.redrawOnDrag = value;
  2027. writeStorage("redrawOnDrag", value);
  2028. }
  2029. function setBoardRotation(value) {
  2030. settings.boardRotation = value * 5;
  2031. writeStorage("boardRotation", settings.boardRotation);
  2032. document.getElementById("rotationDegree").textContent = settings.boardRotation;
  2033. resizeAll();
  2034. }
  2035. function initRender() {
  2036. allcanvas = {
  2037. front: {
  2038. transform: {
  2039. x: 0,
  2040. y: 0,
  2041. s: 1,
  2042. panx: 0,
  2043. pany: 0,
  2044. zoom: 1,
  2045. },
  2046. pointerStates: {},
  2047. anotherPointerTapped: false,
  2048. bg: document.getElementById("F_bg"),
  2049. fab: document.getElementById("F_fab"),
  2050. silk: document.getElementById("F_slk"),
  2051. highlight: document.getElementById("F_hl"),
  2052. layer: "F",
  2053. },
  2054. back: {
  2055. transform: {
  2056. x: 0,
  2057. y: 0,
  2058. s: 1,
  2059. panx: 0,
  2060. pany: 0,
  2061. zoom: 1,
  2062. },
  2063. pointerStates: {},
  2064. anotherPointerTapped: false,
  2065. bg: document.getElementById("B_bg"),
  2066. fab: document.getElementById("B_fab"),
  2067. silk: document.getElementById("B_slk"),
  2068. highlight: document.getElementById("B_hl"),
  2069. layer: "B",
  2070. }
  2071. };
  2072. addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  2073. addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
  2074. }
  2075. ///////////////////////////////////////////////
  2076. ///////////////////////////////////////////////
  2077. /* DOM manipulation and misc code */
  2078. var bomsplit;
  2079. var canvassplit;
  2080. var initDone = false;
  2081. var bomSortFunction = null;
  2082. var currentSortColumn = null;
  2083. var currentSortOrder = null;
  2084. var currentHighlightedRowId;
  2085. var highlightHandlers = [];
  2086. var moduleIndexToHandler = {};
  2087. var netsToHandler = {};
  2088. var highlightedModules = [];
  2089. var highlightedNet = null;
  2090. var lastClicked;
  2091. function dbg(html) {
  2092. dbgdiv.innerHTML = html;
  2093. }
  2094. function redrawIfInitDone() {
  2095. if (initDone) {
  2096. redrawCanvas(allcanvas.front);
  2097. redrawCanvas(allcanvas.back);
  2098. }
  2099. }
  2100. function padsVisible(value) {
  2101. writeStorage("padsVisible", value);
  2102. settings.renderPads = value;
  2103. redrawIfInitDone();
  2104. }
  2105. function referencesVisible(value) {
  2106. writeStorage("referencesVisible", value);
  2107. settings.renderReferences = value;
  2108. redrawIfInitDone();
  2109. }
  2110. function valuesVisible(value) {
  2111. writeStorage("valuesVisible", value);
  2112. settings.renderValues = value;
  2113. redrawIfInitDone();
  2114. }
  2115. function tracksVisible(value) {
  2116. writeStorage("tracksVisible", value);
  2117. settings.renderTracks = value;
  2118. redrawIfInitDone();
  2119. }
  2120. function zonesVisible(value) {
  2121. writeStorage("zonesVisible", value);
  2122. settings.renderZones = value;
  2123. redrawIfInitDone();
  2124. }
  2125. function dnpOutline(value) {
  2126. writeStorage("dnpOutline", value);
  2127. settings.renderDnpOutline = value;
  2128. redrawIfInitDone();
  2129. }
  2130. function setDarkMode(value) {
  2131. if (value) {
  2132. topmostdiv.classList.add("dark");
  2133. } else {
  2134. topmostdiv.classList.remove("dark");
  2135. }
  2136. writeStorage("darkmode", value);
  2137. settings.darkMode = value;
  2138. redrawIfInitDone();
  2139. }
  2140. function setFullscreen(value) {
  2141. if (value) {
  2142. document.documentElement.requestFullscreen();
  2143. } else {
  2144. document.exitFullscreen();
  2145. }
  2146. }
  2147. function fabricationVisible(value) {
  2148. writeStorage("fabricationVisible", value);
  2149. settings.renderFabrication = value;
  2150. redrawIfInitDone();
  2151. }
  2152. function silkscreenVisible(value) {
  2153. writeStorage("silkscreenVisible", value);
  2154. settings.renderSilkscreen = value;
  2155. redrawIfInitDone();
  2156. }
  2157. function setHighlightPin1(value) {
  2158. writeStorage("highlightpin1", value);
  2159. settings.highlightpin1 = value;
  2160. redrawIfInitDone();
  2161. }
  2162. function getStoredCheckboxRefs(checkbox) {
  2163. function convert(ref) {
  2164. var intref = parseInt(ref);
  2165. if (isNaN(intref)) {
  2166. for (var i = 0; i < pcbdata.modules.length; i++) {
  2167. if (pcbdata.modules[i].ref == ref) {
  2168. return i;
  2169. }
  2170. }
  2171. return -1;
  2172. } else {
  2173. return intref;
  2174. }
  2175. }
  2176. if (!(checkbox in settings.checkboxStoredRefs)) {
  2177. var val = readStorage("checkbox_" + checkbox);
  2178. settings.checkboxStoredRefs[checkbox] = val ? val : "";
  2179. }
  2180. if (!settings.checkboxStoredRefs[checkbox]) {
  2181. return new Set();
  2182. } else {
  2183. return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
  2184. }
  2185. }
  2186. function getCheckboxState(checkbox, references) {
  2187. var storedRefsSet = getStoredCheckboxRefs(checkbox);
  2188. var currentRefsSet = new Set(references.map(r => r[1]));
  2189. // Get difference of current - stored
  2190. var difference = new Set(currentRefsSet);
  2191. for (ref of storedRefsSet) {
  2192. difference.delete(ref);
  2193. }
  2194. if (difference.size == 0) {
  2195. // All the current refs are stored
  2196. return "checked";
  2197. } else if (difference.size == currentRefsSet.size) {
  2198. // None of the current refs are stored
  2199. return "unchecked";
  2200. } else {
  2201. // Some of the refs are stored
  2202. return "indeterminate";
  2203. }
  2204. }
  2205. function setBomCheckboxState(checkbox, element, references) {
  2206. var state = getCheckboxState(checkbox, references);
  2207. element.checked = (state == "checked");
  2208. element.indeterminate = (state == "indeterminate");
  2209. }
  2210. function createCheckboxChangeHandler(checkbox, references) {
  2211. return function(evt) {
  2212. refsSet = getStoredCheckboxRefs(checkbox);
  2213. var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
  2214. eventArgs = {
  2215. checkbox: checkbox,
  2216. refs: references,
  2217. }
  2218. if (this.checked) {
  2219. // checkbox ticked
  2220. for (var ref of references) {
  2221. refsSet.add(ref[1]);
  2222. }
  2223. if (darkenWhenChecked) {
  2224. evt.target.parentElement.parentElement.classList.add("checked");
  2225. }
  2226. eventArgs.state = 'checked';
  2227. } else {
  2228. // checkbox unticked
  2229. for (var ref of references) {
  2230. refsSet.delete(ref[1]);
  2231. }
  2232. if (darkenWhenChecked) {
  2233. evt.target.parentElement.parentElement.classList.remove("checked");
  2234. }
  2235. eventArgs.state = 'unchecked';
  2236. }
  2237. settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
  2238. writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  2239. updateCheckboxStats(checkbox);
  2240. EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
  2241. }
  2242. }
  2243. function clearHighlightedModules() {
  2244. if (currentHighlightedRowId) {
  2245. document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
  2246. currentHighlightedRowId = null;
  2247. highlightedModules = [];
  2248. highlightedNet = null;
  2249. }
  2250. }
  2251. function createRowHighlightHandler(rowid, refs, net) {
  2252. return function() {
  2253. if (currentHighlightedRowId) {
  2254. if (currentHighlightedRowId == rowid) {
  2255. return;
  2256. }
  2257. document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
  2258. }
  2259. document.getElementById(rowid).classList.add("highlighted");
  2260. currentHighlightedRowId = rowid;
  2261. highlightedModules = refs ? refs.map(r => r[1]) : [];
  2262. highlightedNet = net;
  2263. drawHighlights();
  2264. EventHandler.emitEvent(
  2265. IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
  2266. {
  2267. rowid: rowid,
  2268. refs: refs,
  2269. net: net
  2270. });
  2271. }
  2272. }
  2273. function entryMatches(entry) {
  2274. if (settings.bommode == "netlist") {
  2275. // entry is just a net name
  2276. return entry.toLowerCase().indexOf(filter) >= 0;
  2277. }
  2278. // check refs
  2279. for (var ref of entry[3]) {
  2280. if (ref[0].toLowerCase().indexOf(filter) >= 0) {
  2281. return true;
  2282. }
  2283. }
  2284. // check extra fields
  2285. for (var i in config.extra_fields) {
  2286. if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
  2287. return true;
  2288. }
  2289. }
  2290. // check value
  2291. if (entry[1].toLowerCase().indexOf(filter) >= 0) {
  2292. return true;
  2293. }
  2294. // check footprint
  2295. if (entry[2].toLowerCase().indexOf(filter) >= 0) {
  2296. return true;
  2297. }
  2298. return false;
  2299. }
  2300. function findRefInEntry(entry) {
  2301. return entry[3].filter(r => r[0].toLowerCase() == reflookup);
  2302. }
  2303. function highlightFilter(s) {
  2304. if (!filter) {
  2305. return s;
  2306. }
  2307. var parts = s.toLowerCase().split(filter);
  2308. if (parts.length == 1) {
  2309. return s;
  2310. }
  2311. var r = "";
  2312. var pos = 0;
  2313. for (var i in parts) {
  2314. if (i > 0) {
  2315. r += '<mark class="highlight">' +
  2316. s.substring(pos, pos + filter.length) +
  2317. '</mark>';
  2318. pos += filter.length;
  2319. }
  2320. r += s.substring(pos, pos + parts[i].length);
  2321. pos += parts[i].length;
  2322. }
  2323. return r;
  2324. }
  2325. function checkboxSetUnsetAllHandler(checkboxname) {
  2326. return function() {
  2327. var checkboxnum = 0;
  2328. while (checkboxnum < settings.checkboxes.length &&
  2329. settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
  2330. checkboxnum++;
  2331. }
  2332. if (checkboxnum >= settings.checkboxes.length) {
  2333. return;
  2334. }
  2335. var allset = true;
  2336. var checkbox;
  2337. var row;
  2338. for (row of bombody.childNodes) {
  2339. checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
  2340. if (!checkbox.checked || checkbox.indeterminate) {
  2341. allset = false;
  2342. break;
  2343. }
  2344. }
  2345. for (row of bombody.childNodes) {
  2346. checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
  2347. checkbox.checked = !allset;
  2348. checkbox.indeterminate = false;
  2349. checkbox.onchange();
  2350. }
  2351. }
  2352. }
  2353. function createColumnHeader(name, cls, comparator) {
  2354. var th = document.createElement("TH");
  2355. th.innerHTML = name;
  2356. th.classList.add(cls);
  2357. th.style.cursor = "pointer";
  2358. var span = document.createElement("SPAN");
  2359. span.classList.add("sortmark");
  2360. span.classList.add("none");
  2361. th.appendChild(span);
  2362. th.onclick = function() {
  2363. if (currentSortColumn && this !== currentSortColumn) {
  2364. // Currently sorted by another column
  2365. currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
  2366. currentSortColumn.childNodes[1].classList.add("none");
  2367. currentSortColumn = null;
  2368. currentSortOrder = null;
  2369. }
  2370. if (currentSortColumn && this === currentSortColumn) {
  2371. // Already sorted by this column
  2372. if (currentSortOrder == "asc") {
  2373. // Sort by this column, descending order
  2374. bomSortFunction = function(a, b) {
  2375. return -comparator(a, b);
  2376. }
  2377. currentSortColumn.childNodes[1].classList.remove("asc");
  2378. currentSortColumn.childNodes[1].classList.add("desc");
  2379. currentSortOrder = "desc";
  2380. } else {
  2381. // Unsort
  2382. bomSortFunction = null;
  2383. currentSortColumn.childNodes[1].classList.remove("desc");
  2384. currentSortColumn.childNodes[1].classList.add("none");
  2385. currentSortColumn = null;
  2386. currentSortOrder = null;
  2387. }
  2388. } else {
  2389. // Sort by this column, ascending order
  2390. bomSortFunction = comparator;
  2391. currentSortColumn = this;
  2392. currentSortColumn.childNodes[1].classList.remove("none");
  2393. currentSortColumn.childNodes[1].classList.add("asc");
  2394. currentSortOrder = "asc";
  2395. }
  2396. populateBomBody();
  2397. }
  2398. return th;
  2399. }
  2400. function populateBomHeader() {
  2401. while (bomhead.firstChild) {
  2402. bomhead.removeChild(bomhead.firstChild);
  2403. }
  2404. var tr = document.createElement("TR");
  2405. var th = document.createElement("TH");
  2406. th.classList.add("numCol");
  2407. tr.appendChild(th);
  2408. var checkboxCompareClosure = function(checkbox) {
  2409. return (a, b) => {
  2410. var stateA = getCheckboxState(checkbox, a[3]);
  2411. var stateB = getCheckboxState(checkbox, b[3]);
  2412. if (stateA > stateB) return -1;
  2413. if (stateA < stateB) return 1;
  2414. return 0;
  2415. }
  2416. }
  2417. if (settings.bommode == "netlist") {
  2418. th = createColumnHeader("Net name", "bom-netname", (a, b) => {
  2419. if (a > b) return -1;
  2420. if (a < b) return 1;
  2421. return 0;
  2422. });
  2423. tr.appendChild(th);
  2424. } else {
  2425. for (var checkbox of settings.checkboxes) {
  2426. th = createColumnHeader(
  2427. checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
  2428. th.onclick = fancyDblClickHandler(
  2429. th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
  2430. tr.appendChild(th);
  2431. }
  2432. tr.appendChild(createColumnHeader("References", "References", (a, b) => {
  2433. var i = 0;
  2434. while (i < a[3].length && i < b[3].length) {
  2435. if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
  2436. i++;
  2437. }
  2438. return a[3].length - b[3].length;
  2439. }));
  2440. // Extra fields
  2441. if (config.extra_fields.length > 0) {
  2442. var extraFieldCompareClosure = function(fieldIndex) {
  2443. return (a, b) => {
  2444. var fa = a[4][fieldIndex];
  2445. var fb = b[4][fieldIndex];
  2446. if (fa != fb) return fa > fb ? 1 : -1;
  2447. else return 0;
  2448. }
  2449. }
  2450. for (var i in config.extra_fields) {
  2451. tr.appendChild(createColumnHeader(
  2452. config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
  2453. }
  2454. }
  2455. tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
  2456. return valueCompare(a[5], b[5], a[1], b[1]);
  2457. }));
  2458. tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
  2459. if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
  2460. else return 0;
  2461. }));
  2462. if (settings.bommode == "grouped") {
  2463. tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
  2464. return a[3].length - b[3].length;
  2465. }));
  2466. }
  2467. }
  2468. bomhead.appendChild(tr);
  2469. }
  2470. function populateBomBody() {
  2471. while (bom.firstChild) {
  2472. bom.removeChild(bom.firstChild);
  2473. }
  2474. highlightHandlers = [];
  2475. moduleIndexToHandler = {};
  2476. netsToHandler = {};
  2477. currentHighlightedRowId = null;
  2478. var first = true;
  2479. if (settings.bommode == "netlist") {
  2480. bomtable = pcbdata.nets.slice();
  2481. } else {
  2482. switch (settings.canvaslayout) {
  2483. case 'F':
  2484. bomtable = pcbdata.bom.F.slice();
  2485. break;
  2486. case 'FB':
  2487. bomtable = pcbdata.bom.both.slice();
  2488. break;
  2489. case 'B':
  2490. bomtable = pcbdata.bom.B.slice();
  2491. break;
  2492. }
  2493. if (settings.bommode == "ungrouped") {
  2494. // expand bom table
  2495. expandedTable = []
  2496. for (var bomentry of bomtable) {
  2497. for (var ref of bomentry[3]) {
  2498. expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
  2499. }
  2500. }
  2501. bomtable = expandedTable;
  2502. }
  2503. }
  2504. if (bomSortFunction) {
  2505. bomtable = bomtable.sort(bomSortFunction);
  2506. }
  2507. for (var i in bomtable) {
  2508. var bomentry = bomtable[i];
  2509. if (filter && !entryMatches(bomentry)) {
  2510. continue;
  2511. }
  2512. var references = null;
  2513. var netname = null;
  2514. var tr = document.createElement("TR");
  2515. var td = document.createElement("TD");
  2516. var rownum = +i + 1;
  2517. tr.id = "bomrow" + rownum;
  2518. td.textContent = rownum;
  2519. tr.appendChild(td);
  2520. if (settings.bommode == "netlist") {
  2521. netname = bomentry;
  2522. td = document.createElement("TD");
  2523. td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
  2524. tr.appendChild(td);
  2525. } else {
  2526. if (reflookup) {
  2527. references = findRefInEntry(bomentry);
  2528. if (references.length == 0) {
  2529. continue;
  2530. }
  2531. } else {
  2532. references = bomentry[3];
  2533. }
  2534. // Checkboxes
  2535. for (var checkbox of settings.checkboxes) {
  2536. if (checkbox) {
  2537. td = document.createElement("TD");
  2538. var input = document.createElement("input");
  2539. input.type = "checkbox";
  2540. input.onchange = createCheckboxChangeHandler(checkbox, references);
  2541. setBomCheckboxState(checkbox, input, references);
  2542. if (input.checked && settings.darkenWhenChecked == checkbox) {
  2543. tr.classList.add("checked");
  2544. }
  2545. td.appendChild(input);
  2546. tr.appendChild(td);
  2547. }
  2548. }
  2549. // References
  2550. td = document.createElement("TD");
  2551. td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
  2552. tr.appendChild(td);
  2553. // Extra fields
  2554. for (var i in config.extra_fields) {
  2555. td = document.createElement("TD");
  2556. td.innerHTML = highlightFilter(bomentry[4][i]);
  2557. tr.appendChild(td);
  2558. }
  2559. // Value
  2560. td = document.createElement("TD");
  2561. td.innerHTML = highlightFilter(bomentry[1]);
  2562. tr.appendChild(td);
  2563. // Footprint
  2564. td = document.createElement("TD");
  2565. td.innerHTML = highlightFilter(bomentry[2]);
  2566. tr.appendChild(td);
  2567. if (settings.bommode == "grouped") {
  2568. // Quantity
  2569. td = document.createElement("TD");
  2570. td.textContent = bomentry[3].length;
  2571. tr.appendChild(td);
  2572. }
  2573. }
  2574. bom.appendChild(tr);
  2575. var handler = createRowHighlightHandler(tr.id, references, netname);
  2576. tr.onmousemove = handler;
  2577. highlightHandlers.push({
  2578. id: tr.id,
  2579. handler: handler,
  2580. });
  2581. if (references !== null) {
  2582. for (var refIndex of references.map(r => r[1])) {
  2583. moduleIndexToHandler[refIndex] = handler;
  2584. }
  2585. }
  2586. if (netname !== null) {
  2587. netsToHandler[netname] = handler;
  2588. }
  2589. if ((filter || reflookup) && first) {
  2590. handler();
  2591. first = false;
  2592. }
  2593. }
  2594. EventHandler.emitEvent(
  2595. IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT,
  2596. {
  2597. filter: filter,
  2598. reflookup: reflookup,
  2599. checkboxes: settings.checkboxes,
  2600. bommode: settings.bommode,
  2601. });
  2602. }
  2603. function highlightPreviousRow() {
  2604. if (!currentHighlightedRowId) {
  2605. highlightHandlers[highlightHandlers.length - 1].handler();
  2606. } else {
  2607. if (highlightHandlers.length > 1 &&
  2608. highlightHandlers[0].id == currentHighlightedRowId) {
  2609. highlightHandlers[highlightHandlers.length - 1].handler();
  2610. } else {
  2611. for (var i = 0; i < highlightHandlers.length - 1; i++) {
  2612. if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
  2613. highlightHandlers[i].handler();
  2614. break;
  2615. }
  2616. }
  2617. }
  2618. }
  2619. smoothScrollToRow(currentHighlightedRowId);
  2620. }
  2621. function highlightNextRow() {
  2622. if (!currentHighlightedRowId) {
  2623. highlightHandlers[0].handler();
  2624. } else {
  2625. if (highlightHandlers.length > 1 &&
  2626. highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
  2627. highlightHandlers[0].handler();
  2628. } else {
  2629. for (var i = 1; i < highlightHandlers.length; i++) {
  2630. if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
  2631. highlightHandlers[i].handler();
  2632. break;
  2633. }
  2634. }
  2635. }
  2636. }
  2637. smoothScrollToRow(currentHighlightedRowId);
  2638. }
  2639. function populateBomTable() {
  2640. populateBomHeader();
  2641. populateBomBody();
  2642. }
  2643. function modulesClicked(moduleIndexes) {
  2644. var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
  2645. for (var i = 1; i <= moduleIndexes.length; i++) {
  2646. var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
  2647. if (refIndex in moduleIndexToHandler) {
  2648. lastClicked = refIndex;
  2649. moduleIndexToHandler[refIndex]();
  2650. smoothScrollToRow(currentHighlightedRowId);
  2651. break;
  2652. }
  2653. }
  2654. }
  2655. function netClicked(net) {
  2656. if (net in netsToHandler) {
  2657. netsToHandler[net]();
  2658. smoothScrollToRow(currentHighlightedRowId);
  2659. } else {
  2660. clearHighlightedModules();
  2661. highlightedNet = net;
  2662. drawHighlights();
  2663. }
  2664. }
  2665. function updateFilter(input) {
  2666. filter = input.toLowerCase();
  2667. populateBomTable();
  2668. }
  2669. function updateRefLookup(input) {
  2670. reflookup = input.toLowerCase();
  2671. populateBomTable();
  2672. }
  2673. function changeCanvasLayout(layout) {
  2674. document.getElementById("fl-btn").classList.remove("depressed");
  2675. document.getElementById("fb-btn").classList.remove("depressed");
  2676. document.getElementById("bl-btn").classList.remove("depressed");
  2677. switch (layout) {
  2678. case 'F':
  2679. document.getElementById("fl-btn").classList.add("depressed");
  2680. if (settings.bomlayout != "bom-only") {
  2681. canvassplit.collapse(1);
  2682. }
  2683. break;
  2684. case 'B':
  2685. document.getElementById("bl-btn").classList.add("depressed");
  2686. if (settings.bomlayout != "bom-only") {
  2687. canvassplit.collapse(0);
  2688. }
  2689. break;
  2690. default:
  2691. document.getElementById("fb-btn").classList.add("depressed");
  2692. if (settings.bomlayout != "bom-only") {
  2693. canvassplit.setSizes([50, 50]);
  2694. }
  2695. }
  2696. settings.canvaslayout = layout;
  2697. writeStorage("canvaslayout", layout);
  2698. resizeAll();
  2699. changeBomMode(settings.bommode);
  2700. }
  2701. function populateMetadata() {
  2702. document.getElementById("title").innerHTML = pcbdata.metadata.title;
  2703. document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  2704. document.getElementById("company").innerHTML = pcbdata.metadata.company;
  2705. document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  2706. if (pcbdata.metadata.title != "") {
  2707. document.title = pcbdata.metadata.title + " BOM";
  2708. }
  2709. // Calculate board stats
  2710. var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
  2711. for (var i = 0; i < pcbdata.modules.length; i++) {
  2712. if (pcbdata.bom.skipped.includes(i)) continue;
  2713. var mod = pcbdata.modules[i];
  2714. if (mod.layer == "F") {
  2715. fp_f++;
  2716. } else {
  2717. fp_b++;
  2718. }
  2719. for (var pad of mod.pads) {
  2720. if (pad.type == "th") {
  2721. pads_th++;
  2722. } else {
  2723. if (pad.layers.includes("F")) {
  2724. pads_f++;
  2725. }
  2726. if (pad.layers.includes("B")) {
  2727. pads_b++;
  2728. }
  2729. }
  2730. }
  2731. }
  2732. document.getElementById("stats-components-front").innerHTML = fp_f;
  2733. document.getElementById("stats-components-back").innerHTML = fp_b;
  2734. document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  2735. document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  2736. document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  2737. document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  2738. document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  2739. document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  2740. document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  2741. document.getElementById("stats-th-pads").innerHTML = pads_th;
  2742. // Update version string
  2743. document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
  2744. /^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
  2745. }
  2746. function changeBomLayout(layout) {
  2747. document.getElementById("bom-btn").classList.remove("depressed");
  2748. document.getElementById("lr-btn").classList.remove("depressed");
  2749. document.getElementById("tb-btn").classList.remove("depressed");
  2750. switch (layout) {
  2751. case 'bom-only':
  2752. document.getElementById("bom-btn").classList.add("depressed");
  2753. if (bomsplit) {
  2754. bomsplit.destroy();
  2755. bomsplit = null;
  2756. canvassplit.destroy();
  2757. canvassplit = null;
  2758. }
  2759. document.getElementById("frontcanvas").style.display = "none";
  2760. document.getElementById("backcanvas").style.display = "none";
  2761. document.getElementById("bot").style.height = "";
  2762. break;
  2763. case 'top-bottom':
  2764. document.getElementById("tb-btn").classList.add("depressed");
  2765. document.getElementById("frontcanvas").style.display = "";
  2766. document.getElementById("backcanvas").style.display = "";
  2767. document.getElementById("bot").style.height = "calc(100% - 80px)";
  2768. document.getElementById("bomdiv").classList.remove("split-horizontal");
  2769. document.getElementById("canvasdiv").classList.remove("split-horizontal");
  2770. document.getElementById("frontcanvas").classList.add("split-horizontal");
  2771. document.getElementById("backcanvas").classList.add("split-horizontal");
  2772. if (bomsplit) {
  2773. bomsplit.destroy();
  2774. bomsplit = null;
  2775. canvassplit.destroy();
  2776. canvassplit = null;
  2777. }
  2778. bomsplit = Split(['#bomdiv', '#canvasdiv'], {
  2779. sizes: [50, 50],
  2780. onDragEnd: resizeAll,
  2781. direction: "vertical",
  2782. gutterSize: 5
  2783. });
  2784. canvassplit = Split(['#frontcanvas', '#backcanvas'], {
  2785. sizes: [50, 50],
  2786. gutterSize: 5,
  2787. onDragEnd: resizeAll
  2788. });
  2789. break;
  2790. case 'left-right':
  2791. document.getElementById("lr-btn").classList.add("depressed");
  2792. document.getElementById("frontcanvas").style.display = "";
  2793. document.getElementById("backcanvas").style.display = "";
  2794. document.getElementById("bot").style.height = "calc(100% - 80px)";
  2795. document.getElementById("bomdiv").classList.add("split-horizontal");
  2796. document.getElementById("canvasdiv").classList.add("split-horizontal");
  2797. document.getElementById("frontcanvas").classList.remove("split-horizontal");
  2798. document.getElementById("backcanvas").classList.remove("split-horizontal");
  2799. if (bomsplit) {
  2800. bomsplit.destroy();
  2801. bomsplit = null;
  2802. canvassplit.destroy();
  2803. canvassplit = null;
  2804. }
  2805. bomsplit = Split(['#bomdiv', '#canvasdiv'], {
  2806. sizes: [50, 50],
  2807. onDragEnd: resizeAll,
  2808. gutterSize: 5
  2809. });
  2810. canvassplit = Split(['#frontcanvas', '#backcanvas'], {
  2811. sizes: [50, 50],
  2812. gutterSize: 5,
  2813. direction: "vertical",
  2814. onDragEnd: resizeAll
  2815. });
  2816. }
  2817. settings.bomlayout = layout;
  2818. writeStorage("bomlayout", layout);
  2819. changeCanvasLayout(settings.canvaslayout);
  2820. }
  2821. function changeBomMode(mode) {
  2822. document.getElementById("bom-grouped-btn").classList.remove("depressed");
  2823. document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
  2824. document.getElementById("bom-netlist-btn").classList.remove("depressed");
  2825. switch (mode) {
  2826. case 'grouped':
  2827. document.getElementById("bom-grouped-btn").classList.add("depressed");
  2828. break;
  2829. case 'ungrouped':
  2830. document.getElementById("bom-ungrouped-btn").classList.add("depressed");
  2831. break;
  2832. case 'netlist':
  2833. document.getElementById("bom-netlist-btn").classList.add("depressed");
  2834. }
  2835. writeStorage("bommode", mode);
  2836. if (mode != settings.bommode) {
  2837. settings.bommode = mode;
  2838. bomSortFunction = null;
  2839. currentSortColumn = null;
  2840. currentSortOrder = null;
  2841. clearHighlightedModules();
  2842. }
  2843. populateBomTable();
  2844. }
  2845. function focusFilterField() {
  2846. focusInputField(document.getElementById("filter"));
  2847. }
  2848. function focusRefLookupField() {
  2849. focusInputField(document.getElementById("reflookup"));
  2850. }
  2851. function toggleBomCheckbox(bomrowid, checkboxnum) {
  2852. if (!bomrowid || checkboxnum > settings.checkboxes.length) {
  2853. return;
  2854. }
  2855. var bomrow = document.getElementById(bomrowid);
  2856. var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
  2857. checkbox.checked = !checkbox.checked;
  2858. checkbox.indeterminate = false;
  2859. checkbox.onchange();
  2860. }
  2861. function checkBomCheckbox(bomrowid, checkboxname) {
  2862. var checkboxnum = 0;
  2863. while (checkboxnum < settings.checkboxes.length &&
  2864. settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
  2865. checkboxnum++;
  2866. }
  2867. if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
  2868. return;
  2869. }
  2870. var bomrow = document.getElementById(bomrowid);
  2871. var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
  2872. checkbox.checked = true;
  2873. checkbox.indeterminate = false;
  2874. checkbox.onchange();
  2875. }
  2876. function setBomCheckboxes(value) {
  2877. writeStorage("bomCheckboxes", value);
  2878. settings.checkboxes = value.split(",").filter((e) => e);
  2879. prepCheckboxes();
  2880. populateBomTable();
  2881. populateDarkenWhenCheckedOptions();
  2882. }
  2883. function setDarkenWhenChecked(value) {
  2884. writeStorage("darkenWhenChecked", value);
  2885. settings.darkenWhenChecked = value;
  2886. populateBomTable();
  2887. }
  2888. function prepCheckboxes() {
  2889. var table = document.getElementById("checkbox-stats");
  2890. while (table.childElementCount > 1) {
  2891. table.removeChild(table.lastChild);
  2892. }
  2893. if (settings.checkboxes.length) {
  2894. table.style.display = "";
  2895. } else {
  2896. table.style.display = "none";
  2897. }
  2898. for (var checkbox of settings.checkboxes) {
  2899. var tr = document.createElement("TR");
  2900. var td = document.createElement("TD");
  2901. td.innerHTML = checkbox;
  2902. tr.appendChild(td);
  2903. td = document.createElement("TD");
  2904. td.id = "checkbox-stats-" + checkbox;
  2905. var progressbar = document.createElement("div");
  2906. progressbar.classList.add("bar");
  2907. td.appendChild(progressbar);
  2908. var text = document.createElement("div");
  2909. text.classList.add("text");
  2910. td.appendChild(text);
  2911. tr.appendChild(td);
  2912. table.appendChild(tr);
  2913. updateCheckboxStats(checkbox);
  2914. }
  2915. }
  2916. function populateDarkenWhenCheckedOptions() {
  2917. var container = document.getElementById("darkenWhenCheckedContainer");
  2918. if (settings.checkboxes.length == 0) {
  2919. container.parentElement.style.display = "none";
  2920. return;
  2921. }
  2922. container.innerHTML = '';
  2923. container.parentElement.style.display = "inline-block";
  2924. function createOption(name, displayName) {
  2925. var id = "darkenWhenChecked-" + name;
  2926. var div = document.createElement("div");
  2927. div.classList.add("radio-container");
  2928. var input = document.createElement("input");
  2929. input.type = "radio";
  2930. input.name = "darkenWhenChecked";
  2931. input.value = name;
  2932. input.id = id;
  2933. input.onchange = () => setDarkenWhenChecked(name);
  2934. div.appendChild(input);
  2935. // Preserve the selected element when the checkboxes change
  2936. if (name == settings.darkenWhenChecked) {
  2937. input.checked = true;
  2938. }
  2939. var label = document.createElement("label");
  2940. label.innerHTML = displayName;
  2941. label.htmlFor = id;
  2942. div.appendChild(label);
  2943. container.appendChild(div);
  2944. }
  2945. createOption("", "None");
  2946. for (var checkbox of settings.checkboxes) {
  2947. createOption(checkbox, checkbox);
  2948. }
  2949. }
  2950. function updateCheckboxStats(checkbox) {
  2951. var checked = getStoredCheckboxRefs(checkbox).size;
  2952. var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
  2953. var percent = checked * 100.0 / total;
  2954. var td = document.getElementById("checkbox-stats-" + checkbox);
  2955. td.firstChild.style.width = percent + "%";
  2956. td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
  2957. }
  2958. document.onkeydown = function(e) {
  2959. switch (e.key) {
  2960. case "n":
  2961. if (document.activeElement.type == "text") {
  2962. return;
  2963. }
  2964. if (currentHighlightedRowId !== null) {
  2965. checkBomCheckbox(currentHighlightedRowId, "placed");
  2966. highlightNextRow();
  2967. e.preventDefault();
  2968. }
  2969. break;
  2970. case "ArrowUp":
  2971. highlightPreviousRow();
  2972. e.preventDefault();
  2973. break;
  2974. case "ArrowDown":
  2975. highlightNextRow();
  2976. e.preventDefault();
  2977. break;
  2978. default:
  2979. break;
  2980. }
  2981. if (e.altKey) {
  2982. switch (e.key) {
  2983. case "f":
  2984. focusFilterField();
  2985. e.preventDefault();
  2986. break;
  2987. case "r":
  2988. focusRefLookupField();
  2989. e.preventDefault();
  2990. break;
  2991. case "z":
  2992. changeBomLayout("bom-only");
  2993. e.preventDefault();
  2994. break;
  2995. case "x":
  2996. changeBomLayout("left-right");
  2997. e.preventDefault();
  2998. break;
  2999. case "c":
  3000. changeBomLayout("top-bottom");
  3001. e.preventDefault();
  3002. break;
  3003. case "v":
  3004. changeCanvasLayout("F");
  3005. e.preventDefault();
  3006. break;
  3007. case "b":
  3008. changeCanvasLayout("FB");
  3009. e.preventDefault();
  3010. break;
  3011. case "n":
  3012. changeCanvasLayout("B");
  3013. e.preventDefault();
  3014. break;
  3015. default:
  3016. break;
  3017. }
  3018. if (e.key >= '1' && e.key <= '9') {
  3019. toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
  3020. }
  3021. }
  3022. }
  3023. function hideNetlistButton() {
  3024. document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
  3025. document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
  3026. document.getElementById("bom-netlist-btn").style.display = "none";
  3027. }
  3028. window.onload = function(e) {
  3029. initUtils();
  3030. initRender();
  3031. initStorage();
  3032. initDefaults();
  3033. cleanGutters();
  3034. populateMetadata();
  3035. dbgdiv = document.getElementById("dbg");
  3036. bom = document.getElementById("bombody");
  3037. bomhead = document.getElementById("bomhead");
  3038. filter = "";
  3039. reflookup = "";
  3040. if (!("nets" in pcbdata)) {
  3041. hideNetlistButton();
  3042. }
  3043. initDone = true;
  3044. prepCheckboxes();
  3045. // Triggers render
  3046. changeBomLayout(settings.bomlayout);
  3047. // Users may leave fullscreen without touching the checkbox. Uncheck.
  3048. document.addEventListener('fullscreenchange', () => {
  3049. if (!document.fullscreenElement)
  3050. document.getElementById('fullscreenCheckbox').checked = false;
  3051. });
  3052. }
  3053. window.onresize = resizeAll;
  3054. window.matchMedia("print").addListener(resizeAll);
  3055. ///////////////////////////////////////////////
  3056. ///////////////////////////////////////////////
  3057. window.setTimeout(function() {
  3058. //tracksVisible(true);
  3059. },1000);
  3060. ///////////////////////////////////////////////
  3061. </script>
  3062. </head>
  3063. <body>
  3064. <div id="topmostdiv" class="topmostdiv">
  3065. <div id="top">
  3066. <div style="float: right; height: 100%;">
  3067. <div class="hideonprint menu" style="float: right; top: 8px;">
  3068. <button class="menubtn"></button>
  3069. <div class="menu-content">
  3070. <label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
  3071. <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
  3072. Dark mode
  3073. </label><!-- This comment eats space! All of it!
  3074. --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
  3075. <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
  3076. Full Screen
  3077. </label>
  3078. <label class="menu-label" style="width: calc(50% - 18px)">
  3079. <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
  3080. Fab layer
  3081. </label><!-- This comment eats space! All of it!
  3082. --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
  3083. <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
  3084. Silkscreen
  3085. </label>
  3086. <label class="menu-label" style="width: calc(50% - 18px)">
  3087. <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
  3088. References
  3089. </label><!-- This comment eats space! All of it!
  3090. --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
  3091. <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
  3092. Values
  3093. </label>
  3094. <div id="tracksAndZonesCheckboxes">
  3095. <label class="menu-label" style="width: calc(50% - 18px)">
  3096. <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
  3097. Tracks
  3098. </label><!-- This comment eats space! All of it!
  3099. --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
  3100. <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
  3101. Zones
  3102. </label>
  3103. </div>
  3104. <label class="menu-label" style="width: calc(50% - 18px)">
  3105. <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
  3106. Pads
  3107. </label><!-- This comment eats space! All of it!
  3108. --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
  3109. <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
  3110. DNP outlined
  3111. </label>
  3112. <label class="menu-label">
  3113. <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
  3114. Highlight first pin
  3115. </label>
  3116. <label class="menu-label">
  3117. <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
  3118. Continuous redraw on drag
  3119. </label>
  3120. <label class="menu-label">
  3121. <span>Board rotation</span>
  3122. <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
  3123. <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
  3124. </label>
  3125. <label class="menu-label">
  3126. <div style="margin-left: 5px">Bom checkboxes</div>
  3127. <input id="bomCheckboxes" class="menu-textbox" type=text
  3128. oninput="setBomCheckboxes(this.value)">
  3129. </label>
  3130. <label class="menu-label">
  3131. <div style="margin-left: 5px">Darken when checked</div>
  3132. <div id="darkenWhenCheckedContainer"></div>
  3133. </label>
  3134. <label class="menu-label">
  3135. <span class="shameless-plug">
  3136. <span>Created using</span>
  3137. <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
  3138. </span>
  3139. </label>
  3140. </div>
  3141. </div>
  3142. <div class="button-container hideonprint"
  3143. style="float: right; position: relative; top: 8px">
  3144. <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
  3145. title="Front only">F
  3146. </button>
  3147. <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
  3148. title="Front and Back">FB
  3149. </button>
  3150. <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
  3151. title="Back only">B
  3152. </button>
  3153. </div>
  3154. <div class="button-container hideonprint"
  3155. style="float: right; position: relative; top: 8px">
  3156. <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
  3157. title="BOM only"></button>
  3158. <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
  3159. title="BOM left, drawings right"></button>
  3160. <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
  3161. title="BOM top, drawings bot"></button>
  3162. </div>
  3163. <div class="button-container hideonprint"
  3164. style="float: right; position: relative; top: 8px">
  3165. <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
  3166. title="Grouped BOM"></button>
  3167. <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
  3168. title="Ungrouped BOM"></button>
  3169. <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
  3170. title="Netlist"></button>
  3171. </div>
  3172. <div class="hideonprint menu" style="float: right; top: 8px;">
  3173. <button class="statsbtn"></button>
  3174. <div class="menu-content">
  3175. <table class="stats">
  3176. <tbody>
  3177. <tr>
  3178. <td width="40%">Board stats</td>
  3179. <td>Front</td>
  3180. <td>Back</td>
  3181. <td>Total</td>
  3182. </tr>
  3183. <tr>
  3184. <td>Components</td>
  3185. <td id="stats-components-front">~</td>
  3186. <td id="stats-components-back">~</td>
  3187. <td id="stats-components-total">~</td>
  3188. </tr>
  3189. <tr>
  3190. <td>Groups</td>
  3191. <td id="stats-groups-front">~</td>
  3192. <td id="stats-groups-back">~</td>
  3193. <td id="stats-groups-total">~</td>
  3194. </tr>
  3195. <tr>
  3196. <td>SMD pads</td>
  3197. <td id="stats-smd-pads-front">~</td>
  3198. <td id="stats-smd-pads-back">~</td>
  3199. <td id="stats-smd-pads-total">~</td>
  3200. </tr>
  3201. <tr>
  3202. <td>TH pads</td>
  3203. <td colspan=3 id="stats-th-pads">~</td>
  3204. </tr>
  3205. </tbody>
  3206. </table>
  3207. <table class="stats">
  3208. <col width="40%"/><col />
  3209. <tbody id="checkbox-stats">
  3210. <tr>
  3211. <td colspan=2 style="border-top: 0">Checkboxes</td>
  3212. </tr>
  3213. </tbody>
  3214. </table>
  3215. </div>
  3216. </div>
  3217. <div class="hideonprint menu" style="float: right; top: 8px;">
  3218. <button class="iobtn"></button>
  3219. <div class="menu-content">
  3220. <div class="menu-label menu-label-top">
  3221. <div style="margin-left: 5px;">Save board image</div>
  3222. <div class="flexbox">
  3223. <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
  3224. style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
  3225. <span>X</span>
  3226. <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
  3227. style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
  3228. </div>
  3229. <label>
  3230. <input id="render-save-transparent" type="checkbox">
  3231. Transparent background
  3232. </label>
  3233. <div class="flexbox">
  3234. <button class="savebtn" onclick="saveImage('F')">Front</button>
  3235. <button class="savebtn" onclick="saveImage('B')">Back</button>
  3236. </div>
  3237. </div>
  3238. <div class="menu-label">
  3239. <span style="margin-left: 5px;">Config and checkbox state</span>
  3240. <div class="flexbox">
  3241. <button class="savebtn" onclick="saveSettings()">Export</button>
  3242. <button class="savebtn" onclick="loadSettings()">Import</button>
  3243. </div>
  3244. </div>
  3245. </div>
  3246. </div>
  3247. </div>
  3248. <div id="fileinfodiv" style="overflow: auto;">
  3249. <table class="fileinfo">
  3250. <tbody>
  3251. <tr>
  3252. <td id="title" class="title" style="width: 70%">
  3253. Title
  3254. </td>
  3255. <td id="revision" class="title" style="width: 30%">
  3256. Revision
  3257. </td>
  3258. </tr>
  3259. <tr>
  3260. <td id="company">
  3261. Company
  3262. </td>
  3263. <td id="filedate">
  3264. Date
  3265. </td>
  3266. </tr>
  3267. </tbody>
  3268. </table>
  3269. </div>
  3270. </div>
  3271. <div id="bot" class="split" style="height: calc(100% - 80px)">
  3272. <div id="bomdiv" class="split split-horizontal">
  3273. <div style="width: 100%">
  3274. <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
  3275. oninput="updateRefLookup(this.value)">
  3276. <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
  3277. oninput="updateFilter(this.value)">
  3278. <div class="button-container hideonprint" style="float: left; margin: 0;">
  3279. <button id="copy" title="Copy bom table to clipboard"
  3280. onclick="copyToClipboard()"></button>
  3281. </div>
  3282. </div>
  3283. <div id="dbg"></div>
  3284. <table class="bom">
  3285. <thead id="bomhead">
  3286. </thead>
  3287. <tbody id="bombody">
  3288. </tbody>
  3289. </table>
  3290. </div>
  3291. <div id="canvasdiv" class="split split-horizontal">
  3292. <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
  3293. <div style="position: relative; width: 100%; height: 100%;">
  3294. <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
  3295. <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
  3296. <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
  3297. <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
  3298. </div>
  3299. </div>
  3300. <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
  3301. <div style="position: relative; width: 100%; height: 100%;">
  3302. <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
  3303. <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
  3304. <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
  3305. <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
  3306. </div>
  3307. </div>
  3308. </div>
  3309. </div>
  3310. </div>
  3311. </body>
  3312. </html>