Beispiel #1
0
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()
Beispiel #2
0
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)
Beispiel #3
0
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())
Beispiel #4
0
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)
Beispiel #5
0
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())
Beispiel #6
0
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)
Beispiel #7
0
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
Beispiel #8
0
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.")
Beispiel #9
0
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.")