def command(args): from pylab import bar, yticks, subplots_adjust, show from numpy import arange import sr.tools.bom.bom as bom import sr.tools.bom.parts_db as parts_db db = parts_db.get_db() m = bom.MultiBoardBom(db) m.load_boards_args(args.arg) m.prime_cache() prices = [] for srcode, pg in m.items(): if srcode == "sr-nothing": continue prices.append((srcode, pg.get_price())) prices.sort(key=lambda x: x[1]) bar(0, 0.8, bottom=range(0, len(prices)), width=[x[1] for x in prices], orientation='horizontal') yticks(arange(0, len(prices)) + 0.4, [x[0] for x in prices]) subplots_adjust(left=0.35) show()
def command(args): import sys import sr.tools.bom.schem as schem import sr.tools.bom.parts_db as parts_db SCHEMATIC = args.schematic lib = parts_db.get_db() parts = schem.open_schem(SCHEMATIC) error = 0 found = 0 # Erroneous parts (key is type) err_parts = {} for id in parts.keys(): if parts[id] not in lib: err_parts.setdefault(parts[id], []).append(id) error += 1 else: found += 1 print("%i correct parts found." % found) if len(err_parts) > 0: print("The following %i parts are not in the SR parts database:" % error) for name, components in err_parts.items(): print("\t'%s': %s" % (name, " ".join(components))) sys.exit(2)
def command(args): import sr.tools.bom.bom as bom import sr.tools.bom.parts_db as parts_db db = parts_db.get_db() m = bom.MultiBoardBom(db) m.load_boards_args(args.arg) m.prime_cache() # Group the parts by distributor: # Keys of ths dictionary are the distributor dist = {} for srcode, pg in m.items(): if srcode == "sr-nothing": continue supplier = pg.part["supplier"] dist.setdefault(supplier, []).append(pg) for d, partgroups in dist.items(): print("Distributor: %s" % d) for pg in partgroups: n = pg.order_num() if n is None: print("FAIL :-(") else: if d == "farnell": print("%s, %i" % (pg.part["order-number"], pg.order_num())) else: print(" - %i * %s" % (pg.order_num(), pg.part["order-number"])) print("Total Price:", m.get_price())
def command(args): import os import sys import sr.tools.bom.parts_db as parts_db import sr.tools.bom.bom as bom import sr.tools.bom.geda as geda lib = parts_db.get_db() if os.path.splitext(args.outfile)[1] == '.sch': print("Output file has extension 'sch', " "aborting as this is almost certainly a mistake") sys.exit(1) pcb = None if args.layout: pcb = geda.PCB(args.layout) out_fn = args.outfile multibom = bom.MultiBoardBom(lib) multibom.load_boards_args(args.schematic, allow_multipliers=False) sorted_lines = sorted(multibom.values(), key=lambda x: x.part['sr-code']) lines = prep_parts(sorted_lines) if os.path.splitext(out_fn)[1] == ".xls": print("Writing XLS BOM") writeXLS(lines, out_fn) else: print("Writing HTML BOM") writeHTML(lines, out_fn, args, pcb)
def open_schem(fname): """ Open a schematics file. :returns: The parsed schematic as an object. :raises ValueError: If the file is not a gschem file. """ s = schem_type(fname) if s == GSCHEM: schem = geda.GSchem(fname) else: raise ValueError("We don't yet support exporting BOMs from " "gschem things.") # New items to add to the schematic new_items = {} # Items to remove from the schematic rem_keys = [] # Expand all assemblies into their component parts: for des, srcode in schem.items(): num = 1 if srcode[0:len("sr-asm-")] == "sr-asm-": # TODO: Don't parse the Db again! db = parts_db.get_db() desc = db[srcode]["description"] for s in desc.split(): if s == "+": continue r = re.compile("([0-9]+)\(([^)]+)\)") m = r.match(s) if m: quantity = int(m.group(1)) code = m.group(2) for x in range(quantity): newdes = "%s.%i" % (des, num) new_items[newdes] = code num = num + 1 rem_keys.append(des) schem.update(new_items) for des in rem_keys: schem.pop(des) return schem
def command(args): import sys import sr.tools.bom.bom as bom import sr.tools.bom.parts_db as parts_db db = parts_db.get_db() boards = bom.MultiBoardBom(db) boards.load_boards_args(args.arg) stock = {} n = 0 for x in boards.stockcheck(): stock.setdefault(x[0], []).append(x[1]) # Show stock checking progress: n = n + 1 sys.stdout.write("\rChecking: %i/%i" % (n, len(boards))) sys.stdout.flush() print if bom.STOCK_UNKNOWN in stock: print("Warning: Cannot check suppliers for these parts:") for part in stock[bom.STOCK_UNKNOWN]: print("\t- %s %s(%s)" % (part["sr-code"], part["supplier"], part["order-number"])) if bom.STOCK_OUT in stock: print("Out of stock:") for part in stock[bom.STOCK_OUT]: print("\t- %s %s(%s)" % (part["sr-code"], part["supplier"], part["order-number"])) sys.exit(1) print("All checkable parts are sufficiently in stock.")