ibom.html 324 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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aAfAAQF0vnmgAr52CAcBfJ5wgXe+dIF0wAh+dMADnnoDCn50h8WBeRcIwXQjDX5zCAt+cV50QXNBdGAM/n/+ev50wAHecVAKPnPefEF4oXpBcqF5QXQBeSFwCAYBfggGwXUBccFzAXXBfCgPAXu+f/APvnAhcoF0fnzucssqZyF8nYMAYXJecyF+XnVRL35woXHwBKF2QXahf0F/oXPhdMAH4XuhcMF5fn0+fMF7PnJhfQFwUAsBeWFzwX1heygLYXIACCFyAAwhfqMKIXtWyY/a4XERegF3gXshdeF/IXj+faF3QXb+cIMBQXDBfBFyAAoReBF5oXeRdSF1EX4BcL5+wX/wCcF14A3Bc754gXmef2F0IXaBfqMBgXa8kDdHCADReGFwUXnhew9t4XJRe+FzoXpoABFxoX3+fVF7UXCxfAF1fnTRfGFy0XphdtF+YXHRcJF10XfBc9F6gXjhdZFx10sM7YF6MX7heYkBMX8ftTF7/nZReqF+/n6heAF5oXSxezFysXbhdGF6wXmxexF4wA8Re1AFYX3RfIF0cXuef0rXFnQgYfF+MXBBdyF6pYWhczF/cX5BdPF3oXLxfTFyEXbxfPF9/nFxefF0wAMRdmF3EXFhf/F4kXgJd2F8CXIheIcF3i5M4SF5iXkJfLANCXjICvF/CX8xfol9QXKJc1F2iXSJcYlyAXjRel580XkBc/F1+JyfJ7F7wXNhf8F6kXvRfpF/0X1niDF/LnZ7aUl5yXYxc359cXtvu3F7QXyhdzF48XdReLFyyXyxdMlx8X6xdfF7yXuJe/F/iXieeElwcXQJcOFyfnZJf557HispdX59SXxgC0lyiAsJeolwyX6pfvF/SXqpfvF5iXepfYl98Xhpf8l50XQpfJFyKXaRcZF9Z4Jxd3g412VgBUlwqXUJdFFzCXHpf+F26XOpeJl2EX+hfel9yXGxcGl9sXeJe7FwSX+xfCl4cXFpfoF/StK6CVVT8AMZceF3GXkxfFF3cXnpcPFxUXiJdVF1qXbJfhF3KXxwAwgDyXrReygO0XApf5l0GXGgApF6GXEpciirnwd4fllyMX7ZfSF1cX1Zc3F7WXKpdJl42XGpfMl3WXZBdtl2sXmZf6l92XGgC9l4GXSReDlyGXYpdhly7ncZWO/qq0EJexlzSX8Zd0ly2XrpdLl+6Xt5f1l+yXqxeRF5uXvpfZlz2XOxd9lyaXBZfBl0WXfRfHF1aXaWxQrecXU5f2l4QXCZePl4uXRICVF0EXUFdpl/UXU5c+l3Pnfpc5l0aXeZc/lwOXQ5dHlyOXThchMCBY0ZdgV5eXDpfXl06XqZdql/eXKZfwV8uXupdvlyhXH5c7l1+Xe5dEl6KXJJeZF0BXn4LDFxeXVZdXlzWXkFerl7oXjJfPl86XrJfwl+uXr5edl1mX25e7l4KX+5fYV2xXkpd4rUPsuRdEVzxXJFd8VzeXAlcUVzBXTZdwV1pXXpdIV3RXOJdoVwGXslcsV8OXgFdjl/Ru4JeVlzOXvFdzl/xXC5eCV8mXwlfkVwZXG5eSV1uXWxefl7mX35cgAACXZpfEl8WXAxdKV6KIoFd2l8RXEFeaV05X2ldGALBXyJf6VzqXGZeeV++X0ldMV2ZXgVesV8FXilenl/WgKlcRV2pXUVdkV9RX5Rc6VzRXbldJV4ZXKVf0V2lXvlfMV5lXFleWl1ZXdXxn8uCA3Fd2V+pXDlfRV6UXT5dCV82XiVfCV8lXLBepV95XjFd1VxlXhZfmlwBXIJdxlQbSF7DtV/gX9ldKl/OXPVfQV3FXulcJVzFX7lcSV8NXNVejVzJX/ZdyV4eXClejlxCYc1f5V7gXkVeOl1YAFVcIl+VXJVeVVx5Xu1fGVz5X6Fd+VwFXk1dBV9NXJZezV4MEF1f5F1dXpFc3Vw9Xd1cPlwNX4ldMF0ZXqFevV6ZXh1fmVzhXlldnV39X4VeXV4VX11c/ALdXfVd6V1tXj1c7V9EX0NdjV29X9VefV1lX31chV3GVBKz/V1IX4Ffo11XnINdY15tXq1cIVxyXT1f41wxXB1eYV0dX/5fil4jXFux6iijXANdo10DXGNf01y5X/Vc414NXVVfPVwTXHNf+V6aXJNeNVz9XKZVSYFTX8pdC1xpXxVcDVwzXmpfg1+mXUtds17VXRNcTV3+XU1c8101XEJgRkjZXqlcdV0VXwNda12LX2NdM1zRXQ1cG1/tX6Vdw1w1XCNczVymVrsgC19TXgNca13bXEtfa1yuXEtcQ11yX1VcvV4TXsNec1/DXJ1djXM1XekjvthWX1teLV51Xy1eOV07XpVfrV/dXuteIV6zXXZdu1+NXHtcK117XpJeJ16s4vte2l6jXNte01yJX2peg11RXedcs13jXhdd8l38Xsdee1/HXUpdbJvNXtldp17bXItf215RXrlcg1+HXhhfIV1HXstcfVybXX1dm1+XXFteb3dXXgte118LXdNfD12VXYNdh13rXBddSV0XXRtcl17PXpNfz1+TX0WZwiKrXlxcD13XXmNcO14zXcJdPl+PXHZfS1+zX7ted16XX8dcRl5gbZ6IX56nXhReB10PXwde31zrX29f5163Xe9ft18aXcte/lweX3NfHl3hX55hqyBfX05dX12vX9ddslyHXaDdiVzvXYDdeVxA3GFdQN1hXx1fZV6dXVJiIN37Xater1//X69eANyPX4tdZ17jXkNeR1zLXr9cEN1zXptdwN1KXwUpW1wVXlDddV5rXNDeb103XIDct14w3z9eG1zHXrDdx18Q3CdfLmKlqSDc016g3N9e0N47X99drl9g3ojeu13g371fy10fXiten19yYYgaEVzw3KDdUN5g3vVdAN6HX9DeS17vXuDf+lx3Xkjdd19I3Upc3S/I3Add8N0HXVjcYN7dXj9dYl3tXWjfE17o3ZdfsVxXXadLeFAtXf9fuNwA3njcWN2Y3ajegNxo3bdd2N5A3M9cwN+w3uFef1y435DeX1xE3GdfdV6o3zlfKN3fXLpcP1+o3EddiN/vXEjcpN/JXTjf0rRdc3Dc11yY3kTfUN9E3hTfAN1Y3PjeT18w3xddv14E3H9ccV8Ci7AY/18Y3OTfWWMqXLTeCN6PXzdcvlwk34DdJN/g3VTdEN2TXOVfT3elArjfq1003sTcFNxM3dDf5N87X+teJNyZXsBexgPGAxABQAKbn4IBWF0YAhYCegFOwRgAAACJbLSAAdufCAKAAcDdNI+JqWZWg9J7nEpesgN2sjAB2+yjAbVejFxjUjABOo4qXoxux534ACecON4WXJ1eACfhqnzeTl6Hn5pCl58jiS1fWWJnXHwBN52PQ4oh4AKGAtjeHN7Pn6+dEAJvnXVILN0E31njXsMJqiLcGFyi3MIBot+nXGLd5N6D0zeexV8PQeLemgFPXTFfHN/wACYBnN0nyfACXNx8A1zfCgLc3HwB3N9aazzcO5yOXnrM+Gp5YHudhl783gcH/N4QtQLdylyC32ABgt7OXAVgeAJC38edFgDC3f5dwt4OmARrhGrS3vAD0t+C3bIBjN1i3YACst9nX7Lf4tyNXWjdr5xvn9jzkt3C3MXCmt6rXdLdGkFa3CfuYtyy3OLfmMBy3BLcw10c3o+e8t6c35zeCt4kXVzfq4GK3TACW5/nrUrc4AK83I5e/cIwZK3obfZFw2YDfN97nZZrAsAC3c6Rqt6HnVSCuAGBIVrf5AHq30Lfkt2k3zueZt/rwxoZrN7w3tvuBtx1S9rcNl9s3KjfFN3E3IjdlN5o3czfZ5263W+c6N6k3c9fHl423wzDki1k3yDcjN2yA7bcoAOS6DreqFxtXbTe7N9tXMzdht9HXEbeAF1G3iYACt0wAQrdMACK3tQCJt1bnkreoAC83J9cVAiLaNYjhGnm3ireFtyq37Cmlt5oA5beKgJW32rcQt2vnULcGt3W3E7cZtzhSTbdJSW+3K9eNN223zLcdt8G3rTeWNxu3DDcDtwc34bdEtyO3ZLdjt9U3Szc08PrwWHQttxB3TLf8N0YAS7dGqiu3GuC518I30zeId7M3hLcdFzy3fLcxt0e3cbfCtwm3nVIgAAAAygAA6phUTACpt7UAk7cuYsP6oam5twq3PzfSJP83N/iB5xcXdNh3xJoGVbe6t7+3+rdF8oa347fH13x35K3KSH3XU5fBXBeA/rftt9i3bLert2R37TelN4xX4bg2kFR3yHfOgMS3pLe/YgB3KncZt/x3mPQhymB3Uhdad3NSytyLt8u3Xbc511vXRnfxN5+XpnciQOZ3O7fJN+h3izc3tzU2jAaIgbO3rnc6d1B3RHdQyiR38Vfrt723zNcUdyZ3Rpf1VFy33TdKdxh34XdOyBNIZvDRd6Xnbnc3dh53xHdedx8ASXdwdyl3ezfItyJAGXdBd9PXoXewNyOXjLqC+uxIxhhFdzCAJXdVEmV3CXcVdwZ3Pnfwd9Y3ZhcBd5l3XTcH1z03ynd6NyoIcejuCD/wXXfL0LF3BHcfAPF3+nekd0N3NXebt/53DXfbt0130De5d8eXbXcoyCnKzneGFzF337cLt3F3nneN15M35Hfmt2N3jXcsN7Z3M3fvkq6Qn5Yad1fnF3fot1d3K3fYlzd3Xjdj18Z3NpC7d863Q7eKALR30beHt6w38bc3Nyx3dzekdTx36bfO50SShTES/iJoj7cid2fF/zfZTBJ3cpeaBqXnqPuXdxyANbf/t813J1eo93kxR3Vz1A93uuDugPSg/rc+3CJXdecN53GAdrct53LceID18GBwuL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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>