ibom.html 321 KB

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