From 9e7d2deae923ad055d530ab9c9a525577e3ca3d7 Mon Sep 17 00:00:00 2001 From: Willem Oldemans Date: Tue, 20 Apr 2021 08:20:43 +0200 Subject: [PATCH] added bom.py --- .DS_Store | Bin 12292 -> 12292 bytes BOM scripts/bom.py | 109 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 BOM scripts/bom.py diff --git a/.DS_Store b/.DS_Store index 69893685dd5f08d534c2308645a9af1ee9a86a41..47a623a3e587491810fc154c292f35a0f57d0ea9 100644 GIT binary patch literal 12292 zcmeHNYit`u5T3cDaOOyJ2`!-}0Yjjnty}EoSwz8k6lhaO$fHRgG_`%#B!mP=fCS9$o+HOeoPw0J7Ik!cKrOY0tkKPJE76(K zM+|+mFK(IX;RLmm#iM3CP0V_;X?7cT2<~{wGR;oQHXOrBZ0~pU{SIqmH=5Mczr(gt zPAk7zzd`pGT;=Q;9ZA;N-lnH)qCVftODifbyK?o_bsILe+|b@}v{WrCzhIf7>@YMv z;TU@jJ=HsEXwJ~~s2$f6nvodn8!>DnX6ikO=&)XfL7$KJx@d*p-=B^dx2FwfOs$q> zUR!mEU)iP6KyJ1)b~jCZT^9V8U*h-gWG$^JovxbOVP%b9>9J{8YSd+16I7I*eMUl4 zZTC^3u;TAEqcPo7HJ^A+eS_lf8xf;Y+uh1*mMQ-JxHUXXL$Teu>#q0vceBTCjoMB} zQcut;9de)DO0Tq?wKZ!Rf1z@|%|okr*)?nsk~3B57N$jy(A}*Z1lOvoDmY1p(j!t&W65Sw%81RS<#}*aEvr z>&D;#cm$q;*Wh({13rS!;24~MAK(}G9sYnn;V&%45-dd(%g~QCxC&R}8mz+zHe(C6 zV<&cDH}>Fd7()$p+=~{baTNFC7~YHb)G6LwVqXwTI|RvIrLL$m6pN;I zc9Z7!Se7~QKN{Oc+Bu*uYqb(i)F2@5a4^u+SbyMvPp-H!ym9lM;jue1cOJOwG4UFheYw)?Yq|7sM%_j^ z&)(;;dPPqHo&^4n5@72?fHI>ImyQd{mkzox2*KJJgy4z(lOMqA0xpfXbX-v0mHP0m zL`7F-0Yp3RPW1t|9C7KmprSjV=nm*U8C?$rMR&jeX9tW3>RmkvcoLW@fu&S67wn%D z*k3w0J@&7>@utmN+8Y-v_CK~%p#9|+Rs@&}(6q660xb)8oki5SIGuy@Nsyj{a}Hkf zfb~)G2`;XzQZCK94Ee4^FX1|Uzs#Hn^<2SyxpIX}s9s$niZ#kAnee=Njwl8z*U98T zs1h$K;mTSc`3Y)~C>XO3y7CL(rxFxT$c@*r@G( zE^sLOxqLn0Die+`k#FOWpSwvdu8+{U(EWu1veN9h86zKuf=&wLuZ32U zZXMC~Y_LB^nun*6=4r($7iBW*n;L_G^>tw$+^lN|2I_0WQ-Yg3cuDxp4Fy1caPtYi zYR)+1TuBy?Or8wI9C}wz0*gul%>S367TWl(y+MwT4tCC>u$UZ}DdWst38plfgW+!4 zP)oAuu3b9t;dFu;w%XcUA5q>~@~3{^&+j)+&!^3aFFBO+%)tQNYU+7o<#bTRfI-UpNae>! z{c|_KO{$NPG^3Pr5yxWs9OfZ`tazD1&ZAqN$Y+f+<|yqaXBv#G$YdHCLbTBuu5B#1 z)ymKYr5Vx4LGKK~DV-shqjR)4&k&Ge6>yy>p7x*pf4cJ$rnhwVkL~|&A{S(a^M9Pl zyLb}tB(OLofW>XyZ7npmtV5kYOt#k^puC4NON?(^P~L?u?shzH<6H4m7a|s(=zoO$ nAv!K7{iAf+4*|^Mpp|F;`Ju)$e}>Sr|GAFIq%F!*vH$-9YrQR| delta 2391 zcmeH{ZERCj7{|~5t{eBRm+h|Wwr=#&cI(*Ky3p>ufb4w&V~nv)w(&B$wPTg89qmA1 z>QG2DD2h3Wf({H4@dX27kJ{G#HDxz!B|7B3x7 zmQoCQqduLkNHIuW&iN=?GD4Zd*19}32@Mtv18boPY?2id1b zV!2wmo|n$@tCTk{@#3Yo#VSB1D>$2 z<$<6td^_LD^F30snpY|%H+cQSp}$u^31n1}l@&);ZTq8e|>*NNx z1sxJ$gc-TWLq2Ar7$qn}IqI+o%~*_X^uddMtU&l*g2@m5jJdW*n0?*)iynsE} zivu`}H*o~-;xsH`B4L6lb;;h_Eu7E4#=5bZre6E%2 z=6bjRqW*D+UCB!As$IDIwHtaVdy~lSwdZ(!G=)#sMQ4a#$3di$E{~Q-mMNBd=Py{; zR2IFK5r>2h)->Nnl@4i&f(<{e5M#^MTcmi_!&o>YkA(@WeX+36VX;UY!zLCwT^79* z$Dk0@y=4v-LJQop^?FIi@QAI=lUYc#ptg>cQF_huIn`SbYlOj2-8BOaCi6U0GpXy* zz@%P+rD#JtR-y+U^fKWC2x1895XJ}|!YH=j5hnYS*ny|;9CkD5$C&sB@G4%z>xkkg zj^hM9XgEcGv>6ikL_Tq9BAv+UozC+DFZ4*Jkr7vg(_wX$mp zGS(H*pGMU#?88ggk2i1<@8Nx%!daZdd5q&re1!>I!S@XJ8@R~{oPkT_j9ea<&$+nS zTpeS50o|UliYaPtWPplIcPeVRQ_+h_iU6s`wDb(CA}n)5y2sSPq*$I(B#Cy#dZc(2 zMRT4=ote`bM3=claV;rMO^Xh*UPD=Qi*pqBl60{ZS*#KSiNto-npG>36h0>>@h9Xw zxk#>%ADF~{G9wXSf{j_oEVxmnaova(jcY~N7}s75YFtO~pvLv1OkjoUXBpSF-ON?S z@G=AY6$bWOD%i(x0`K5Me9DBr7;VnlkEoIVB@P)h#b%6JtrNIA@0D(s!&>1i`xozJ z^klXLgqcZ}6jU^gm5kbQ_A4TTEFU4m#7Dw3H`OwUr+3-qI}U8o20W7u zcxk2EVJ&hh2X;9t*y-J_aymD+*u#$UpTCBgKtOeY$!wwn_U1``6f block in kicad_netlist_reader.py + components = net.getInterestingComponents() + + compfields = net.gatherComponentFieldUnion(components) + partfields = net.gatherLibPartFieldUnion() + + # remove Reference, Value, Datasheet, and Footprint, they will come from 'columns' below + partfields -= set( ['Reference', 'Value', 'Datasheet', 'Footprint'] ) + + columnset = compfields | partfields # union + + # prepend an initial 'hard coded' list and put the enchillada into list 'columns' + columns = ['Item', 'Qty', 'Reference(s)', 'Value', 'LibPart', 'Footprint', 'Datasheet'] + sorted(list(columnset)) + + # Create a new csv writer object to use as the output formatter + out = csv.writer(f, lineterminator='\n', delimiter=',', quotechar='\"', quoting=csv.QUOTE_MINIMAL) + + row = [] + + # Get all of the components in groups of matching parts + values + # (see kicad_netlist_reader.py) + if args.single: + grouped = [[c] for c in components] + else: + grouped = net.groupComponents(components) + + # Output header row + out.writerow(columns) + + # Output component information organized by group, aka as collated: + item = 0 + for group in grouped: + del row[:] + refs = [] + + # Add the reference of every component in the group and keep a reference + # to the component so that the other data can be filled in once per group + for component in group: + refs.append(component.getRef()) + c = component + + ref_string = ", ".join(natsort.natsorted(refs)) + if args.digikey and len(ref_string) > 48: + ref_string = ref_string[:45] + "..." + + # Fill in the component groups common data + # columns = ['Item', 'Qty', 'Reference(s)', 'Value', 'LibPart', 'Footprint', 'Datasheet'] + sorted(list(columnset)) + item += 1 + row.append( item ) + row.append( len(group) * args.quantity ) + row.append( ref_string ) + row.append( c.getValue() ) + row.append( c.getLibName() + ":" + c.getPartName() ) + row.append( net.getGroupFootprint(group) ) + row.append( net.getGroupDatasheet(group) ) + + # from column 7 upwards, use the fieldnames to grab the data + for field in columns[7:]: + row.append( net.getGroupField(group, field) ); + + out.writerow(row) + + f.close() + +if __name__ == "__main__": + main()