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
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 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
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()
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()
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()
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
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()
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()