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