Esempio n. 1
0
def get_pad_list(fpname,fpdir, d):
    try:
        with open(os.path.join(fpdir,fpname+'.kicad_mod'),'r') as f:
            text = f.read()
            fp_sexpr = sexpr.parse_sexp(text)
            out = [str(x[1]) for x in fp_sexpr if (type(x) == list and 'pad' in x[0])]
            # if (fpname == "Module_WIZ810MJ" ):
            #     pprint.pprint(fp_sexpr)
            return out
    except Exception as e:
        # x = get_symbols_with_footprint(d,fpname)
        # for i in x:
        # print(d[i].get())
        print(get_symbols_with_footprint(d,fpname),'no file named', fpname)
        print(e)
        # print(get_symbols_with_footprint(d,fpname),'problem with', fpname ,e) ##todo remove global
        return None
Esempio n. 2
0
    def __init__(self, filename):
        self.filename = filename

        # read the s-expression data
        f = open(filename)
        sexpr_data = ''.join(f.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(sexpr_data)
        self.sexpr_data = sexpr_data

        # module name
        self.name = self.sexpr_data[1]

        # module layer
        self.layer = self._getValue('layer')

        # locked flag
        self.locked = True if self._hasValue(self.sexpr_data,
                                             'locked') else False

        # description
        self.description = self._getValue('descr')

        # tags
        self.tags = self._getValue('tags')

        # auto place settings
        self.autoplace_cost90 = self._getValue('autoplace_cost90', 0)
        self.autoplace_cost180 = self._getValue('autoplace_cost180', 0)

        # module clearance settings
        self.clearance = self._getValue('clearance', 0)
        self.solder_mask_margin = self._getValue('solder_mask_margin', 0)
        self.solder_paste_margin = self._getValue('solder_paste_margin', 0)
        self.solder_paste_ratio = self._getValue('solder_paste_ratio', 0)

        # attribute
        self.attribute = self._getValue('attr', 'pth')

        # reference
        self.reference = self._getText('reference')[0]

        # value
        self.value = self._getText('value')[0]

        # user text
        self.userText = self._getText('user')

        # lines
        self.lines = self._getLines()

        # circles
        self.circles = self._getCircles()

        # arcs
        self.arcs = self._getArcs()

        # pads
        self.pads = self._getPads()

        # models
        self.models = self._getModels()
Esempio n. 3
0
    def from_file(cls, filename):
        library = KicadLibrary(filename)

        # read the s-expression data
        f_name = open(filename)
        lines = ''.join(f_name.readlines())

        #i parse s-expr
        sexpr_data = sexpr.parse_sexp(lines)
        sym_list = _get_array(sexpr_data, 'symbol')
        f_name.close()

        # itertate over symbol
        for item in sym_list:
            if item.pop(0) != 'symbol':
              print ('unexpected token in file')
              continue
            name = item.pop(0)
            m0 = re.match(r'^(.*?):(.*)$', name)
            m1 = re.match(r'^.*_(\d+?)_(\d+?)$', name)
            if (m0 is not None):
                # we found a new part, split symbol and libname
                (libname, partname) = (m0.group(1), m0.group(2))
                symbol = KicadSymbol(str(partname), str(libname), filename = filename)

                # extract extends property
                extends = _get_array2(item, 'extends')
                if len(extends) > 0:
                  symbol.extends = extends[0][1]

                # extract properties
                for prop in _get_array(item, 'property'):
                    symbol.properties.append(Property.from_sexpr(prop))

                # get flags
                if _has_value(item, 'in_bom'):
                    symbol.in_bom = True
                if _has_value(item, 'power'):
                    symbol.is_power = True
                if _has_value(item, 'on_board'):
                    symbol.on_board = True

                # get pin-numbers properties
                pin_numbers_info = _get_array2(item, 'pin_numbers')
                if pin_numbers_info:
                    if 'hide' in pin_numbers_info[0]:
                        symbol.hide_pin_numbers = True

                # get pin-name properties
                pin_names_info = _get_array2(item, 'pin_names')
                if pin_names_info:
                    if 'hide' in pin_names_info[0]:
                        symbol.hide_pin_names = True
                    # sometimes the pin_name_offset value does not exist, then use 20mil as default
                    symbol.pin_names_offset = _get_value_of(pin_names_info[0], 'offset', 0.508)
             
                # add it to the list of symbols
                library.symbols.append(symbol)

            elif (m1 is not None):
                # we found a new 'subpart' (no clue how to call it properly)
                (unit, demorgan) = (m1.group(1), m1.group(2))
                unit = int(unit)
                demorgan = int(demorgan)

                # update the amount of units, alternative-styles (demorgan)
                symbol.unit_count = max(unit, symbol.unit_count)
                symbol.demorgan_count = max(demorgan, symbol.demorgan_count)

                # extract pins and graphical items
                for pin in _get_array(item, 'pin'):
                    symbol.pins.append(Pin.from_sexpr(pin, unit, demorgan))
                for circle in _get_array(item, 'circle'):
                    symbol.circles.append(Circle.from_sexpr(circle, unit, demorgan))
                for arc in _get_array(item, 'arc'):
                    symbol.arcs.append(Arc.from_sexpr(arc, unit, demorgan))
                for rect in _get_array(item, 'rectangle'):
                    #symbol.polylines.append(Rectangle.from_sexpr(rect, unit, demorgan).as_polyline())
                    symbol.rectangles.append(Rectangle.from_sexpr(rect, unit, demorgan))
                for poly in _get_array(item, 'polyline'):
                    symbol.polylines.append(Polyline.from_sexpr(poly, unit, demorgan))
                for text in _get_array(item, 'text'):
                    symbol.texts.append(Text.from_sexpr(text, unit, demorgan))

            else:
                print("could not match entry")
                continue

        return library
Esempio n. 4
0
    def __init__(self, filename):
        self.filename = filename

        # check file line-endings
        self.unix_line_endings = True
        filecontentsraw = open(filename, "rb").readline()

        LE1 = filecontentsraw[-2]
        LE2 = filecontentsraw[-1]

        # Ord is different for python3
        if sys.version_info.major >= 3:
            LE1 = chr(LE1)
            LE2 = chr(LE2)

        LE1 = ord(LE1)
        LE2 = ord(LE2)

        if (LE1 == 0x0D and LE2 == 0x0A) or (LE2 == 0x0D):
            self.unix_line_endings = False

        # read the s-expression data
        f = open(filename)
        sexpr_data = ''.join(f.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(sexpr_data)
        self.sexpr_data = sexpr_data

        # module name
        self.name = self.sexpr_data[1]

        # module layer
        self.layer = self._getValue('layer', 'pth', 2)

        # locked flag
        self.locked = self._getValue('locked', False, 2)

        # description
        self.description = self._getValue('descr', '', 2)

        # tags
        self.tags = self._getValue('tags', '', 2)

        # auto place settings
        self.autoplace_cost90 = self._getValue('autoplace_cost90', 0, 2)
        self.autoplace_cost180 = self._getValue('autoplace_cost180', 0, 2)

        # global footprint clearance settings
        self.clearance = self._getValue('clearance', 0)
        self.solder_mask_margin = self._getValue('solder_mask_margin', 0, 2)
        self.solder_paste_margin = self._getValue('solder_paste_margin', 0, 2)
        self.solder_paste_ratio = self._getValue('solder_paste_ratio', 0, 2)

        # attribute
        self.attribute = self._getValue('attr', 'pth', 2)

        # reference
        self.reference = self._getText('reference')[0]

        # value
        self.value = self._getText('value')[0]

        # user text
        self.userText = self._getText('user')

        # lines
        self.lines = self._getLines()

        # circles
        self.circles = self._getCircles()

        # arcs
        self.arcs = self._getArcs()

        # pads
        self.pads = self._getPads()

        # models
        self.models = self._getModels()
Esempio n. 5
0
    def __init__(self, filename):
        self.filename = filename

        # read the s-expression data
        f = open(filename)
        sexpr_data = ''.join(f.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(sexpr_data)
        self.sexpr_data = sexpr_data

        # module name
        self.name = self.sexpr_data[1]

        # module layer
        self.layer = self._getValue('layer')

        # locked flag
        self.locked = True if self._hasValue(self.sexpr_data, 'locked') else False

        # description
        self.description = self._getValue('descr')

        # tags
        self.tags = self._getValue('tags')

        # auto place settings
        self.autoplace_cost90 = self._getValue('autoplace_cost90', 0)
        self.autoplace_cost180 = self._getValue('autoplace_cost180', 0)

        # module clearance settings
        self.clearance = self._getValue('clearance', 0)
        self.solder_mask_margin = self._getValue('solder_mask_margin', 0)
        self.solder_paste_margin = self._getValue('solder_paste_margin', 0)
        self.solder_paste_ratio = self._getValue('solder_paste_ratio', 0)

        # attribute
        self.attribute =  self._getValue('attr', 'pth')

        # reference
        self.reference = self._getText('reference')[0]

        # value
        self.value = self._getText('value')[0]

        # user text
        self.userText = self._getText('user')

        # lines
        self.lines = self._getLines()

        # circles
        self.circles = self._getCircles()

        # arcs
        self.arcs = self._getArcs()

        # pads
        self.pads = self._getPads()

        # models
        self.models = self._getModels()
    def __init__(self, filename: str):
        self.filename: str = filename

        # read the s-expression data
        f = open(filename)
        sexpr_data = "".join(f.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(sexpr_data)
        self.sexpr_data = sexpr_data

        # module name
        self.name: str = str(self.sexpr_data[1])

        # file version
        self.version = self._getValue("version", 0, 2)

        # generator
        self.generator = self._getValue("generator", "", 2)

        # module layer
        self.layer = self._getValue("layer", "through_hole", 2)

        # locked flag
        self.locked = self._getValue("locked", False, 2)

        # description
        self.description = self._getValue("descr", "", 2)

        # tags
        self.tags = self._getValue("tags", "", 2)

        # auto place settings
        self.autoplace_cost90 = self._getValue("autoplace_cost90", 0, 2)
        self.autoplace_cost180 = self._getValue("autoplace_cost180", 0, 2)

        # global footprint clearance settings
        self.clearance = self._getValue("clearance", 0, 2)
        self.solder_mask_margin = self._getValue("solder_mask_margin", 0, 2)
        self.solder_paste_margin = self._getValue("solder_paste_margin", 0, 2)
        self.solder_paste_ratio = self._getValue("solder_paste_ratio", 0, 2)

        # attribute
        self._getAttributes()

        # reference
        self.reference = self._getText("reference")[0]

        # value
        self.value = self._getText("value")[0]

        # user text
        self.userText: List[Dict[str, Any]] = self._getText("user")

        # lines
        self.lines: List[Dict[str, Any]] = self._getLines()

        # rects
        self.rects = self._getRects()

        # circles
        self.circles = self._getCircles()

        # polygons
        self.polys = self._getPolys()

        # arcs
        self.arcs = self._getArcs()

        # pads
        self.pads = self._getPads()

        # models
        self.models = self._getModels()
Esempio n. 7
0
    def __init__(self, filename):
        self.filename = filename

        # read the s-expression data
        f = open(filename)
        sexpr_data = ''.join(f.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(sexpr_data)
        self.sexpr_data = sexpr_data

        # module name
        self.name = str(self.sexpr_data[1])

        # module layer
        self.layer = self._getValue('layer', 'through_hole', 2)

        # locked flag
        self.locked = self._getValue('locked', False, 2)

        # description
        self.description = self._getValue('descr', '', 2)

        # tags
        self.tags = self._getValue('tags', '', 2)

        # auto place settings
        self.autoplace_cost90 = self._getValue('autoplace_cost90', 0, 2)
        self.autoplace_cost180 = self._getValue('autoplace_cost180', 0, 2)

        # global footprint clearance settings
        self.clearance = self._getValue('clearance', 0, 2)
        self.solder_mask_margin = self._getValue('solder_mask_margin', 0, 2)
        self.solder_paste_margin = self._getValue('solder_paste_margin', 0, 2)
        self.solder_paste_ratio = self._getValue('solder_paste_ratio', 0, 2)

        # attribute
        self.attribute = self._getValue('attr', 'virtual', 2)

        # reference
        self.reference = self._getText('reference')[0]

        # value
        self.value = self._getText('value')[0]

        # user text
        self.userText = self._getText('user')

        # lines
        self.lines = self._getLines()

        # rects
        self.rects = self._getRects()

        # circles
        self.circles = self._getCircles()

        # arcs
        self.arcs = self._getArcs()

        # pads
        self.pads = self._getPads()

        # models
        self.models = self._getModels()
Esempio n. 8
0
    def from_file(cls, filename: str) -> "KicadLibrary":
        """
        Parse a symbol library from a file.

        raises KicadFileFormatError in case of problems
        """
        library = KicadLibrary(filename)

        # read the s-expression data
        f_name = open(filename)
        lines = "".join(f_name.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(lines)
        sym_list = _get_array(sexpr_data, "symbol", max_level=2)
        f_name.close()

        # Because of the various file format changes in the development of kicad v6 and v7, we want
        # to ensure that this parser is only used with v6 files. Any other version will most likely
        # not work as expected. So just don't load them at all.
        version = _get_value_of(sexpr_data, "version")
        if str(version) != "20211014":
            raise KicadFileFormatError(
                'Version of symbol file is not "20211014"')

        # itertate over symbol
        for item in sym_list:
            item_type = item.pop(0)
            if item_type != "symbol":
                raise KicadFileFormatError(
                    f"Unexpected token found: {item_type}")
            # retrieving the `partname`, even if formatted as `libname:partname` (legacy format)
            partname = item.pop(0).split(":")[-1]

            # we found a new part, extract the symbol name
            symbol = KicadSymbol(str(partname),
                                 libname=filename,
                                 filename=filename)

            # extract extends property
            extends = _get_array2(item, "extends")
            if extends:
                symbol.extends = extends[0][1]

            # extract properties
            for prop in _get_array(item, "property"):
                try:
                    # TODO: do not append the new property, if it is None
                    symbol.properties.append(Property.from_sexpr(prop))
                except ValueError as exc:
                    raise KicadFileFormatError(
                        f"Failed to import '{partname}': {exc}") from exc

            # get flags
            if _has_value(item, "in_bom"):
                symbol.in_bom = True
            if _has_value(item, "power"):
                symbol.is_power = True
            if _has_value(item, "on_board"):
                symbol.on_board = True

            # get pin-numbers properties
            pin_numbers_info = _get_array2(item, "pin_numbers")
            if pin_numbers_info:
                if "hide" in pin_numbers_info[0]:
                    symbol.hide_pin_numbers = True

            # get pin-name properties
            pin_names_info = _get_array2(item, "pin_names")
            if pin_names_info:
                if "hide" in pin_names_info[0]:
                    symbol.hide_pin_names = True
                # sometimes the pin_name_offset value does not exist, then use 20mil as default
                symbol.pin_names_offset = _get_value_of(
                    pin_names_info[0], "offset", 0.508)

            # get the actual geometry information
            # it is split over units
            subsymbols = _get_array2(item, "symbol")
            for unit_data in subsymbols:
                # we found a new 'subpart' (no clue how to call it properly)
                subpart_type = unit_data.pop(0)
                if subpart_type != "symbol":
                    raise KicadFileFormatError(
                        f"Unexpected token found as 'subsymbol' of {item_type}: {subpart_type}"
                    )
                name = unit_data.pop(0)

                # split the name
                m1 = re.match(r"^" + re.escape(partname) + r"_(\d+?)_(\d+?)$",
                              name)
                if not m1:
                    raise KicadFileFormatError(
                        "Failed to parse subsymbol due to invalid name: {name}"
                    )

                (unit_idx, demorgan_idx) = (m1.group(1), m1.group(2))
                unit_idx = int(unit_idx)
                demorgan_idx = int(demorgan_idx)

                # update the amount of units, alternative-styles (demorgan)
                symbol.unit_count = max(unit_idx, symbol.unit_count)
                symbol.demorgan_count = max(demorgan_idx,
                                            symbol.demorgan_count)

                # extract pins and graphical items
                for pin in _get_array(unit_data, "pin"):
                    symbol.pins.append(
                        Pin.from_sexpr(pin, unit_idx, demorgan_idx))
                for circle in _get_array(unit_data, "circle"):
                    symbol.circles.append(
                        Circle.from_sexpr(circle, unit_idx, demorgan_idx))
                for arc in _get_array(unit_data, "arc"):
                    symbol.arcs.append(
                        Arc.from_sexpr(arc, unit_idx, demorgan_idx))
                for rect in _get_array(unit_data, "rectangle"):
                    # symbol.polylines.append(
                    #     Rectangle.from_sexpr(rect, unit, demorgan).as_polyline()
                    # )
                    symbol.rectangles.append(
                        Rectangle.from_sexpr(rect, unit_idx, demorgan_idx))
                for poly in _get_array(unit_data, "polyline"):
                    symbol.polylines.append(
                        Polyline.from_sexpr(poly, unit_idx, demorgan_idx))
                for text in _get_array(unit_data, "text"):
                    symbol.texts.append(
                        Text.from_sexpr(text, unit_idx, demorgan_idx))

            # add it to the list of symbols
            library.symbols.append(symbol)

        return library
Esempio n. 9
0
    def __init__(self, filename):
        self.filename = filename
        
        # check file line-endings
        self.unix_line_endings=True
        filecontentsraw=open(filename,"rb").readline()
        if (filecontentsraw[-2]==0x0D and filecontentsraw[-1]==0x0A) or (filecontentsraw[-1]==0x0D):
            self.unix_line_endings=False

        # read the s-expression data
        f = open(filename)
        sexpr_data = ''.join(f.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(sexpr_data)
        self.sexpr_data = sexpr_data

        # module name
        self.name = self.sexpr_data[1]

        # module layer
        self.layer = self._getValue('layer', 'pth', 2)

        # locked flag
        self.locked = self._getValue('locked', False, 2)

        # description
        self.description = self._getValue('descr', '', 2)

        # tags
        self.tags = self._getValue('tags', '', 2)
        
        # auto place settings
        self.autoplace_cost90 = self._getValue('autoplace_cost90', 0, 2)
        self.autoplace_cost180 = self._getValue('autoplace_cost180', 0, 2)

        # global footprint clearance settings
        self.clearance = self._getValue('clearance', 0)
        self.solder_mask_margin = self._getValue('solder_mask_margin', 0, 2)
        self.solder_paste_margin = self._getValue('solder_paste_margin', 0, 2)
        self.solder_paste_ratio = self._getValue('solder_paste_ratio', 0, 2)

        # attribute
        self.attribute =  self._getValue('attr', 'pth', 2)

        # reference
        self.reference = self._getText('reference')[0]

        # value
        self.value = self._getText('value')[0]

        # user text
        self.userText = self._getText('user')

        # lines
        self.lines = self._getLines()

        # circles
        self.circles = self._getCircles()

        # arcs
        self.arcs = self._getArcs()

        # pads
        self.pads = self._getPads()

        # models
        self.models = self._getModels()
Esempio n. 10
0
    def __init__(self, filename=None):

        self.filename = filename

        if not filename:
            self.name = None
            #self.version = 20210108 # v5.99
            self.version = 20171130 # v5.1.9
            self.generator = "kicad_mod"
            self.layer = 'F.Cu'
            self.locked = False
            self.description = ''
            self.tags = ''
            self.autoplace_cost90 = 0
            self.autoplace_cost180 = 0
            self.clearance = 0
            self.solder_mask_margin = 0
            self.solder_paste_margin = 0
            self.solder_paste_ratio = 0
            self.attribute = 'through_hole'
            self.reference = self._new_text ('reference', 'REF**')
            self.value = self._new_text ('value', 'VAL')
            self.userText = []
            self.lines = []
            self.rects = []
            self.circles = []
            self.arcs = []
            self.polys = []
            self.pads = []
            self.models = []

            return

        # read the s-expression data
        f = open(filename)
        sexpr_data = ''.join(f.readlines())

        # parse s-expr
        sexpr_data = sexpr.parse_sexp(sexpr_data)
        self.sexpr_data = sexpr_data

        # module name
        self.name = str(self.sexpr_data[1])

        # version
        self.version = self._getValue('version', 20171130, 2)

        # generator
        self.generator = self._getValue('generator', '', 2)

        # module layer
        self.layer = self._getValue('layer', 'F.Cu', 2)

        # locked flag
        self.locked = self._getValue('locked', False, 2)

        # description
        self.description = self._getValue('descr', '', 2)

        # tags
        self.tags = self._getValue('tags', '', 2)

        # auto place settings
        self.autoplace_cost90 = self._getValue('autoplace_cost90', 0, 2)
        self.autoplace_cost180 = self._getValue('autoplace_cost180', 0, 2)

        # global footprint clearance settings
        self.clearance = self._getValue('clearance', 0, 2)
        self.solder_mask_margin = self._getValue('solder_mask_margin', 0, 2)
        self.solder_paste_margin = self._getValue('solder_paste_margin', 0, 2)
        self.solder_paste_ratio = self._getValue('solder_paste_ratio', 0, 2)

        # attribute
        self.attribute =  self._getValue('attr', 'virtual', 2)

        # reference
        self.reference = self._getText('reference')[0]

        # value
        self.value = self._getText('value')[0]

        # user text
        self.userText = self._getText('user')

        # lines
        self.lines = self._getLines()

        # rects
        self.rects = self._getRects()

        # circles
        self.circles = self._getCircles()

        # arcs
        self.arcs = self._getArcs()

        # pads
        self.pads = self._getPads()

        # models
        self.models = self._getModels()