123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624 |
- <!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-color-highlight: #D04040;
- --pin1-outline-color: #ffb629;
- --pin1-outline-color-highlight: #b4ff03;
- --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: 10px 10px 10px 0px;
- }
- .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: 5px;
- }
- .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;
- }
- .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: #aaa;
- }
- .dark .bom tr.checked {
- color: #666;
- }
- .bom tr {
- transition: background-color 0.2s;
- }
- .bom .numCol {
- width: 25px;
- }
- .bom .Description {
- width: 10%;
- }
- .bom .Part {
- width: 10%;
- }
- .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;
- }
- .dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
- 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: 10px 10px 10px 0px;
- }
- .menu-content {
- 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 {
- width: 100%;
- height: 100%;
- background-color: white;
- transition: background-color 0.3s;
- }
- #top {
- height: 78px;
- border-bottom: 2px solid black;
- }
- .dark #top {
- border-bottom: 2px solid #ccc;
- }
- #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;
- }
- </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": true, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0.0, "checkboxes": "Sourced,Placed", "bom_view": "top-bottom", "layer_view": "F", "extra_fields": ["Manufacturer", "Manufacturer_No"]}
- ///////////////////////////////////////////////
- ///////////////////////////////////////////////
- var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
- ///////////////////////////////////////////////
- ///////////////////////////////////////////////
- /* Utility functions */
- var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
- pcbdata.metadata.revision + '__#';
- var storage;
- function initStorage(key) {
- try {
- window.localStorage.getItem("blank");
- storage = window.localStorage;
- } catch (e) {
- // localStorage not available
- }
- if (!storage) {
- try {
- window.sessionStorage.getItem("blank");
- storage = window.sessionStorage;
- } catch (e) {
- // sessionStorage also not available
- }
- }
- }
- function readStorage(key) {
- if (storage) {
- return storage.getItem(storagePrefix + key);
- } else {
- return null;
- }
- }
- function writeStorage(key, value) {
- if (storage) {
- storage.setItem(storagePrefix + key, value);
- }
- }
- function fancyDblClickHandler(el, onsingle, ondouble) {
- return function() {
- if (el.getAttribute("data-dblclick") == null) {
- el.setAttribute("data-dblclick", 1);
- setTimeout(function() {
- if (el.getAttribute("data-dblclick") == 1) {
- onsingle();
- }
- el.removeAttribute("data-dblclick");
- }, 200);
- } else {
- el.removeAttribute("data-dblclick");
- ondouble();
- }
- }
- }
- function smoothScrollToRow(rowid) {
- document.getElementById(rowid).scrollIntoView({
- behavior: "smooth",
- block: "center",
- inline: "nearest"
- });
- }
- function focusInputField(input) {
- input.scrollIntoView(false);
- input.focus();
- input.select();
- }
- function copyToClipboard() {
- var text = '';
- for (var node of bomhead.childNodes[0].childNodes) {
- if (node.firstChild) {
- text = text + node.firstChild.nodeValue;
- }
- if (node != bomhead.childNodes[0].lastChild) {
- text += '\t';
- }
- }
- text += '\n';
- for (var row of bombody.childNodes) {
- for (var cell of row.childNodes) {
- for (var node of cell.childNodes) {
- if (node.nodeName == "INPUT") {
- if (node.checked) {
- text = text + '✓';
- }
- } else if (node.nodeName == "MARK") {
- text = text + node.firstChild.nodeValue;
- } else {
- text = text + node.nodeValue;
- }
- }
- if (cell != row.lastChild) {
- text += '\t';
- }
- }
- text += '\n';
- }
- 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 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.*)?$", "");
- for (var bom_type of ["both", "F", "B"]) {
- for (var row of pcbdata.bom[bom_type]) {
- row.push(parseValue(row[1], row[3][0][0]));
- }
- }
- }
- 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 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("darkenWhenChecked", settings.darkenWhenChecked);
- 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.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
- writeStorage("boardRotation", settings.boardRotation);
- document.getElementById("boardRotation").value = settings.boardRotation / 5;
- document.getElementById("rotationDegree").textContent = settings.boardRotation;
- 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: "default",
- bomlayout: "default",
- bommode: "grouped",
- checkboxes: [],
- checkboxStoredRefs: {},
- darkMode: false,
- highlightpin1: false,
- redrawOnDrag: true,
- boardRotation: 0,
- renderPads: true,
- renderReferences: true,
- renderValues: true,
- renderSilkscreen: true,
- renderFabrication: true,
- renderDnpOutline: false,
- renderTracks: true,
- renderZones: true,
- }
- 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 (!["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;
- settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
- populateDarkenWhenCheckedOptions();
- 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);
- initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
- 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;
- }
- // 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.horiz_justify)) * text.height * tilt;
- return point;
- }
- function drawtext(ctx, text, color, flip) {
- 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 (text.svgpath) {
- ctx.stroke(new Path2D(text.svgpath));
- 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) / 2;
- var txt = text.text.split("\n");
- // KiCad ignores last empty line.
- if (txt[txt.length - 1] == '') txt.pop();
- ctx.rotate(deg2rad(angle));
- for (var i in txt) {
- var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
- var lineWidth = text.thickness + interline * 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 = 0;
- switch (text.horiz_justify) {
- case -1:
- // Justify left, do nothing
- break;
- case 0:
- // Justify center
- offsetx -= lineWidth / 2;
- break;
- case 1:
- // Justify right
- offsetx -= lineWidth;
- break;
- }
- var inOverbar = false;
- for (var j = 0; j < txt[i].length; j++) {
- 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;
- }
- }
- ctx.restore();
- }
- function drawedge(ctx, scalefactor, edge, color) {
- ctx.strokeStyle = color;
- ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
- ctx.lineCap = "round";
- if (edge.svgpath) {
- ctx.stroke(new Path2D(edge.svgpath));
- } else {
- ctx.beginPath();
- if (edge.type == "segment") {
- ctx.moveTo(...edge.start);
- ctx.lineTo(...edge.end);
- }
- 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);
- }
- 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 (shape.svgpath) {
- 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, shape, color) {
- ctx.save();
- ctx.fillStyle = color;
- if (!shape.svgpath) {
- ctx.translate(...shape.pos);
- ctx.rotate(deg2rad(-shape.angle));
- }
- ctx.fill(getPolygonsPath(shape));
- ctx.restore();
- }
- function drawDrawing(ctx, layer, scalefactor, drawing, color) {
- if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
- drawedge(ctx, scalefactor, drawing, color);
- } else if (drawing.type == "polygon") {
- drawPolygonShape(ctx, drawing, color);
- } else {
- drawtext(ctx, drawing, color, layer == "B");
- }
- }
- 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, hole) {
- 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);
- }
- if (pad.type == "th" && hole) {
- if (pad.offset) {
- ctx.translate(-pad.offset[0], -pad.offset[1]);
- }
- ctx.fillStyle = "#CCCCCC";
- if (pad.drillshape == "oblong") {
- ctx.fill(getOblongPath(pad.drillsize));
- } else {
- ctx.fill(getCirclePath(pad.drillsize[0] / 2));
- }
- }
- ctx.restore();
- }
- function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
- if (highlight) {
- // draw bounding box
- if (module.layer == layer) {
- ctx.save();
- ctx.globalAlpha = 0.2;
- ctx.translate(...module.bbox.pos);
- ctx.rotate(deg2rad(-module.bbox.angle));
- ctx.translate(...module.bbox.relpos);
- ctx.fillStyle = padcolor;
- ctx.fillRect(0, 0, ...module.bbox.size);
- ctx.globalAlpha = 1;
- ctx.strokeStyle = padcolor;
- ctx.strokeRect(0, 0, ...module.bbox.size);
- ctx.restore();
- }
- }
- // draw drawings
- for (var drawing of module.drawings) {
- if (drawing.layer == layer) {
- drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
- }
- }
- // draw pads
- if (settings.renderPads) {
- for (var pad of module.pads) {
- if (pad.layers.includes(layer)) {
- drawPad(ctx, pad, padcolor, outline, true);
- if (pad.pin1 && settings.highlightpin1) {
- drawPad(ctx, pad, outlinecolor, true, false);
- }
- }
- }
- }
- }
- function drawEdgeCuts(canvas, scalefactor) {
- var ctx = canvas.getContext("2d");
- var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
- for (var edge of pcbdata.edges) {
- drawedge(ctx, scalefactor, edge, edgecolor);
- }
- }
- function drawModules(canvas, layer, scalefactor, highlight) {
- var ctx = canvas.getContext("2d");
- ctx.lineWidth = 3 / scalefactor;
- var style = getComputedStyle(topmostdiv);
- var padcolor = style.getPropertyValue('--pad-color');
- var outlinecolor = style.getPropertyValue('--pin1-outline-color');
- if (highlight) {
- padcolor = style.getPropertyValue('--pad-color-highlight');
- outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
- }
- for (var i = 0; i < pcbdata.modules.length; i++) {
- var mod = pcbdata.modules[i];
- var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
- if (!highlight || highlightedModules.includes(i)) {
- drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
- }
- }
- }
- function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
- var ctx = canvas.getContext("2d");
- for (var d of pcbdata[layername][layer]) {
- if (["segment", "arc", "circle", "curve"].includes(d.type)) {
- drawedge(ctx, scalefactor, d, edgeColor);
- } else if (d.type == "polygon") {
- drawPolygonShape(ctx, d, polygonColor);
- } else {
- drawtext(ctx, d, textColor, layer == "B");
- }
- }
- }
- function drawTracks(canvas, layer, color, highlight) {
- ctx = canvas.getContext("2d");
- ctx.strokeStyle = color;
- ctx.lineCap = "round";
- for(var track of pcbdata.tracks[layer]) {
- if (highlight && highlightedNet != track.net) continue;
- ctx.lineWidth = track.width;
- ctx.beginPath();
- ctx.moveTo(...track.start);
- ctx.lineTo(...track.end);
- ctx.stroke();
- }
- }
- function drawZones(canvas, layer, color, highlight) {
- ctx = canvas.getContext("2d");
- ctx.strokeStyle = color;
- ctx.fillStyle = color;
- ctx.lineJoin = "round";
- for(var zone of pcbdata.zones[layer]) {
- if (!zone.path2d) {
- zone.path2d = getPolygonsPath(zone);
- }
- if (highlight && highlightedNet != zone.net) continue;
- ctx.lineWidth = zone.width ? zone.width : 0;
- ctx.fill(zone.path2d);
- 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 {
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- }
- ctx.restore();
- }
- function drawNets(canvas, layer, highlight) {
- var style = getComputedStyle(topmostdiv);
- if (settings.renderTracks) {
- var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
- drawTracks(canvas, layer, trackColor, highlight);
- }
- if (settings.renderZones) {
- var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
- drawZones(canvas, layer, zoneColor, highlight);
- }
- if (highlight && settings.renderPads) {
- var padColor = style.getPropertyValue('--pad-color-highlight');
- var ctx = canvas.getContext("2d");
- for (var mod of pcbdata.modules) {
- // draw pads
- for (var pad of mod.pads) {
- if (highlightedNet != pad.net) continue;
- if (pad.layers.includes(layer)) {
- drawPad(ctx, pad, padColor, false, true);
- }
- }
- }
- }
- }
- function drawHighlightsOnLayer(canvasdict, clear = true) {
- if (clear) {
- clearCanvas(canvasdict.highlight);
- }
- if (highlightedModules.length > 0) {
- drawModules(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);
- drawModules(canvasdict.bg, canvasdict.layer,
- canvasdict.transform.s * canvasdict.transform.zoom, false);
- drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
- 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);
- var fontsize = 1.55;
- 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));
- 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) {
- 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));
- 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 bbox = applyRotation(pcbdata.edges_bbox);
- 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;
- var flip = (layerdict.layer == "B");
- 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 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 (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
- return track.net;
- }
- }
- }
- // Check pads
- if (settings.renderPads) {
- for (var mod of pcbdata.modules) {
- for(var pad of mod.pads) {
- if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
- return pad.net;
- }
- }
- }
- }
- return null;
- }
- function pointWithinModuleBbox(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.modules.length; i++) {
- var module = pcbdata.modules[i];
- if (module.layer == layer) {
- if (pointWithinModuleBbox(x, y, module.bbox)) {
- result.push(i);
- }
- }
- }
- return result;
- }
- function handlePointerDown(e, layerdict) {
- if (e.button != 0) {
- 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;
- if (layerdict.layer == "B") {
- 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);
- if ("nets" in pcbdata) {
- var net = netHitScan(layerdict.layer, ...v);
- if (net !== highlightedNet) {
- netClicked(net);
- }
- }
- if (highlightedNet === null) {
- var modules = bboxHitScan(layerdict.layer, ...v);
- if (modules.length > 0) {
- modulesClicked(modules);
- }
- }
- }
- 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 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);
- }
- ///////////////////////////////////////////////
- ///////////////////////////////////////////////
- /* 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 moduleIndexToHandler = {};
- var netsToHandler = {};
- var highlightedModules = [];
- 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();
- }
- 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.modules.length; i++) {
- if (pcbdata.modules[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) {
- return function(evt) {
- refsSet = getStoredCheckboxRefs(checkbox);
- var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
- eventArgs = {
- checkbox: checkbox,
- refs: references,
- }
- if (this.checked) {
- // checkbox ticked
- for (var ref of references) {
- refsSet.add(ref[1]);
- }
- if (darkenWhenChecked) {
- evt.target.parentElement.parentElement.classList.add("checked");
- }
- eventArgs.state = 'checked';
- } else {
- // checkbox unticked
- for (var ref of references) {
- refsSet.delete(ref[1]);
- }
- if (darkenWhenChecked) {
- evt.target.parentElement.parentElement.classList.remove("checked");
- }
- 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 clearHighlightedModules() {
- if (currentHighlightedRowId) {
- document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
- currentHighlightedRowId = null;
- highlightedModules = [];
- 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;
- highlightedModules = refs ? refs.map(r => r[1]) : [];
- highlightedNet = net;
- drawHighlights();
- EventHandler.emitEvent(
- IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
- {
- rowid: rowid,
- refs: refs,
- net: net
- });
- }
- }
- function entryMatches(entry) {
- if (settings.bommode == "netlist") {
- // entry is just a net name
- return entry.toLowerCase().indexOf(filter) >= 0;
- }
- // check refs
- for (var ref of entry[3]) {
- if (ref[0].toLowerCase().indexOf(filter) >= 0) {
- return true;
- }
- }
- // check extra fields
- for (var i in config.extra_fields) {
- if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
- return true;
- }
- }
- // check value
- if (entry[1].toLowerCase().indexOf(filter) >= 0) {
- return true;
- }
- // check footprint
- if (entry[2].toLowerCase().indexOf(filter) >= 0) {
- return true;
- }
- return false;
- }
- function findRefInEntry(entry) {
- return entry[3].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) {
- var th = document.createElement("TH");
- th.innerHTML = name;
- th.classList.add(cls);
- th.style.cursor = "pointer";
- var span = document.createElement("SPAN");
- span.classList.add("sortmark");
- span.classList.add("none");
- th.appendChild(span);
- th.onclick = function() {
- if (currentSortColumn && this !== currentSortColumn) {
- // Currently sorted by another column
- currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
- currentSortColumn.childNodes[1].classList.add("none");
- currentSortColumn = null;
- currentSortOrder = null;
- }
- if (currentSortColumn && this === 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 = this;
- currentSortColumn.childNodes[1].classList.remove("none");
- currentSortColumn.childNodes[1].classList.add("asc");
- currentSortOrder = "asc";
- }
- populateBomBody();
- }
- return th;
- }
- function populateBomHeader() {
- while (bomhead.firstChild) {
- bomhead.removeChild(bomhead.firstChild);
- }
- var tr = document.createElement("TR");
- var th = document.createElement("TH");
- th.classList.add("numCol");
- tr.appendChild(th);
- var checkboxCompareClosure = function(checkbox) {
- return (a, b) => {
- var stateA = getCheckboxState(checkbox, a[3]);
- var stateB = getCheckboxState(checkbox, b[3]);
- if (stateA > stateB) return -1;
- if (stateA < stateB) return 1;
- return 0;
- }
- }
- if (settings.bommode == "netlist") {
- th = createColumnHeader("Net name", "bom-netname", (a, b) => {
- if (a > b) return -1;
- if (a < b) return 1;
- return 0;
- });
- tr.appendChild(th);
- } else {
- for (var checkbox of settings.checkboxes) {
- th = createColumnHeader(
- checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
- th.onclick = fancyDblClickHandler(
- th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
- tr.appendChild(th);
- }
- tr.appendChild(createColumnHeader("References", "References", (a, b) => {
- var i = 0;
- while (i < a[3].length && i < b[3].length) {
- if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
- i++;
- }
- return a[3].length - b[3].length;
- }));
- // Extra fields
- if (config.extra_fields.length > 0) {
- var extraFieldCompareClosure = function(fieldIndex) {
- return (a, b) => {
- var fa = a[4][fieldIndex];
- var fb = b[4][fieldIndex];
- if (fa != fb) return fa > fb ? 1 : -1;
- else return 0;
- }
- }
- for (var i in config.extra_fields) {
- tr.appendChild(createColumnHeader(
- config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
- }
- }
- tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
- return valueCompare(a[5], b[5], a[1], b[1]);
- }));
- tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
- if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
- else return 0;
- }));
- if (settings.bommode == "grouped") {
- tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
- return a[3].length - b[3].length;
- }));
- }
- }
- bomhead.appendChild(tr);
- }
- function populateBomBody() {
- while (bom.firstChild) {
- bom.removeChild(bom.firstChild);
- }
- highlightHandlers = [];
- moduleIndexToHandler = {};
- netsToHandler = {};
- currentHighlightedRowId = null;
- var first = true;
- 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[3]) {
- expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
- }
- }
- 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);
- } else {
- if (reflookup) {
- references = findRefInEntry(bomentry);
- if (references.length == 0) {
- continue;
- }
- } else {
- references = bomentry[3];
- }
- // 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);
- setBomCheckboxState(checkbox, input, references);
- if (input.checked && settings.darkenWhenChecked == checkbox) {
- tr.classList.add("checked");
- }
- td.appendChild(input);
- tr.appendChild(td);
- }
- }
- // References
- td = document.createElement("TD");
- td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
- tr.appendChild(td);
- // Extra fields
- for (var i in config.extra_fields) {
- td = document.createElement("TD");
- td.innerHTML = highlightFilter(bomentry[4][i]);
- tr.appendChild(td);
- }
- // Value
- td = document.createElement("TD");
- td.innerHTML = highlightFilter(bomentry[1]);
- tr.appendChild(td);
- // Footprint
- td = document.createElement("TD");
- td.innerHTML = highlightFilter(bomentry[2]);
- tr.appendChild(td);
- if (settings.bommode == "grouped") {
- // Quantity
- td = document.createElement("TD");
- td.textContent = bomentry[3].length;
- 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])) {
- moduleIndexToHandler[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();
- }
- function modulesClicked(moduleIndexes) {
- var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
- for (var i = 1; i <= moduleIndexes.length; i++) {
- var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
- if (refIndex in moduleIndexToHandler) {
- lastClicked = refIndex;
- moduleIndexToHandler[refIndex]();
- smoothScrollToRow(currentHighlightedRowId);
- break;
- }
- }
- }
- function netClicked(net) {
- if (net in netsToHandler) {
- netsToHandler[net]();
- smoothScrollToRow(currentHighlightedRowId);
- } else {
- clearHighlightedModules();
- 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.modules.length; i++) {
- if (pcbdata.bom.skipped.includes(i)) continue;
- var mod = pcbdata.modules[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("bot").style.height = "";
- break;
- case 'top-bottom':
- document.getElementById("tb-btn").classList.add("depressed");
- document.getElementById("frontcanvas").style.display = "";
- document.getElementById("backcanvas").style.display = "";
- document.getElementById("bot").style.height = "calc(100% - 80px)";
- 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("bot").style.height = "calc(100% - 80px)";
- 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");
- switch (mode) {
- case 'grouped':
- document.getElementById("bom-grouped-btn").classList.add("depressed");
- break;
- case 'ungrouped':
- document.getElementById("bom-ungrouped-btn").classList.add("depressed");
- break;
- case 'netlist':
- document.getElementById("bom-netlist-btn").classList.add("depressed");
- }
- writeStorage("bommode", mode);
- if (mode != settings.bommode) {
- settings.bommode = mode;
- bomSortFunction = null;
- currentSortColumn = null;
- currentSortOrder = null;
- clearHighlightedModules();
- }
- 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(",").filter((e) => e);
- prepCheckboxes();
- populateBomTable();
- populateDarkenWhenCheckedOptions();
- }
- function setDarkenWhenChecked(value) {
- writeStorage("darkenWhenChecked", value);
- settings.darkenWhenChecked = value;
- populateBomTable();
- }
- 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 populateDarkenWhenCheckedOptions() {
- var container = document.getElementById("darkenWhenCheckedContainer");
- 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 = "darkenWhenChecked-" + name;
- var div = document.createElement("div");
- div.classList.add("radio-container");
- var input = document.createElement("input");
- input.type = "radio";
- input.name = "darkenWhenChecked";
- input.value = name;
- input.id = id;
- input.onchange = () => setDarkenWhenChecked(name);
- div.appendChild(input);
- // Preserve the selected element when the checkboxes change
- if (name == settings.darkenWhenChecked) {
- 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.modules.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) + "%)";
- }
- 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;
- 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));
- }
- }
- }
- 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";
- }
- 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;
- prepCheckboxes();
- // 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);
- ///////////////////////////////////////////////
- ///////////////////////////////////////////////
- window.setTimeout(function() {
- //tracksVisible(true);
- },1000);
- ///////////////////////////////////////////////
- </script>
- </head>
- <body>
- <div id="topmostdiv" class="topmostdiv">
- <div id="top">
- <div style="float: right; height: 100%;">
- <div class="hideonprint menu" style="float: right; top: 8px;">
- <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="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
- Highlight first pin
- </label>
- <label class="menu-label">
- <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
- Continuous redraw on drag
- </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">
- <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">Darken when checked</div>
- <div id="darkenWhenCheckedContainer"></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>
- </span>
- </label>
- </div>
- </div>
- <div class="button-container hideonprint"
- style="float: right; position: relative; top: 8px">
- <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"
- style="float: right; position: relative; top: 8px">
- <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"
- style="float: right; position: relative; top: 8px">
- <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" style="float: right; top: 8px;">
- <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" style="float: right; top: 8px;">
- <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>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div id="fileinfodiv" style="overflow: auto;">
- <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>
- <div id="bot" class="split" style="height: calc(100% - 80px)">
- <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="copyToClipboard()"></button>
- </div>
- </div>
- <div id="dbg"></div>
- <table class="bom">
- <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>
|