diff --git a/scripts/bom-in-python/bom_csv_sorted_by_ref.py b/scripts/bom-in-python/bom_csv_sorted_by_ref.py index 9c81b89935..e41d132135 100644 --- a/scripts/bom-in-python/bom_csv_sorted_by_ref.py +++ b/scripts/bom-in-python/bom_csv_sorted_by_ref.py @@ -40,7 +40,7 @@ out = csv.writer(f, lineterminator='\n', delimiter=',', quotechar="\"", quoting= def writerow( acsvwriter, columns ): utf8row = [] for col in columns: - utf8row.append( str(col).encode('utf8') ) + utf8row.append( str(col) ) acsvwriter.writerow( utf8row ) components = net.getInterestingComponents() diff --git a/scripts/bom-in-python/bom_html_by_value.py b/scripts/bom-in-python/bom_html_by_value.py index c8205b0a1b..93ea26fdcd 100644 --- a/scripts/bom-in-python/bom_html_by_value.py +++ b/scripts/bom-in-python/bom_html_by_value.py @@ -9,7 +9,7 @@ Generate a HTML BOM list. Components are sorted and grouped by ref Fields are (if exist) - Ref, Quantity, Value, Part, Datasheet, Description, Vendor + Ref, Quantity, Value, Symbol, footprint, Description, Vendor """ @@ -26,7 +26,7 @@ html = """ - KiCad BOM Example 5 + KiCad BOM grouped by value and footprint

@@ -60,12 +60,12 @@ def myEqu(self, other): result = False elif self.getFootprint() != other.getFootprint(): result = False - elif self.getField("Tolerance") != other.getField("Tolerance"): - result = False - elif self.getField("Manufacturer") != other.getField("Manufacturer"): - result = False - elif self.getField("Voltage") != other.getField("Voltage"): - result = False +# elif self.getField("Tolerance") != other.getField("Tolerance"): +# result = False +# elif self.getField("Manufacturer") != other.getField("Manufacturer"): +# result = False +# elif self.getField("Voltage") != other.getField("Voltage"): +# result = False return result @@ -97,10 +97,12 @@ html = html.replace('', "Component Count:" + \ str(len(components))) row = "Ref" + "Qnty" -row += "Value" + "Part" -row += "Description" -#row += "Datasheet" -row += "PartNumber" + "Vendor" +row += "Value" +row += "Symbol" +row += "Footprint" +row += "Description" +row += "PartNumber" +row += "Vendor" html = html.replace('', row + "") @@ -120,14 +122,17 @@ for group in grouped: refs += component.getRef() c = component - row = "" + refs +"" + str(len(group)) - row += "" + c.getValue() + "" - row += c.getLibName() + ":" + c.getPartName() + "" - #row += c.getDatasheet() + "" - row += c.getDescription() + "" - row += c.getField("PartNumber") + "" - row += c.getField("Vendor") - row += "" + row = "" + row += "" + refs +"" + row += "" + str(len(group)) + "" + row += "" + c.getValue() + "" +# row += "" + c.getLibName() + ":" + c.getPartName() + "" + row += "" + c.getPartName() + "" + row += "" + c.getFootprint() + "" + row += "" + c.getDescription() + "" + row += "" + c.getField("PartNumber") + "" + row += "" + c.getField("Vendor") + "" + row += "" html = html.replace('', row + "") diff --git a/scripts/bom-in-python/bom_sorted_by_ref.py b/scripts/bom-in-python/bom_sorted_by_ref.py index 8a21c9c84d..e13f3e66e0 100644 --- a/scripts/bom-in-python/bom_sorted_by_ref.py +++ b/scripts/bom-in-python/bom_sorted_by_ref.py @@ -40,7 +40,7 @@ def writerow( acsvwriter, columns ): utf8row = [] for col in columns: txt=str(col); - utf8row.append( txt.encode('utf-8') ) + utf8row.append( txt ) acsvwriter.writerow( utf8row ) components = net.getInterestingComponents() diff --git a/scripts/bom-in-python/kicad_netlist_reader.py b/scripts/bom-in-python/kicad_netlist_reader.py index df463278e4..407f572504 100644 --- a/scripts/bom-in-python/kicad_netlist_reader.py +++ b/scripts/bom-in-python/kicad_netlist_reader.py @@ -165,6 +165,7 @@ class xmlElement(): def addAttribute(self, attr, value): """Add an attribute to this element""" + if type(value) != str: value = value.encode('utf-8') self.attributes[attr] = value def setAttribute(self, attr, value): @@ -220,20 +221,31 @@ class xmlElement(): try: if attrmatch != "": if self.attributes[attribute] == attrmatch: - return self.chars + ret = self.chars + if type(ret) != str: ret = ret.encode('utf-8') + return ret else: - return self.attributes[attribute] + ret = self.attributes[attribute] + if type(ret) != str: ret = ret.encode('utf-8') + return ret except AttributeError: - return "" + ret = "" + if type(ret) != str: ret = ret.encode('utf-8') + return ret else: - return self.chars + ret = self.chars + if type(ret) != str: ret = ret.encode('utf-8') + return ret for child in self.children: ret = child.get(elemName, attribute, attrmatch) if ret != "": + if type(ret) != str: ret = ret.encode('utf-8') return ret - return "" + ret = "" + if type(ret) != str: ret = ret.encode('utf-8') + return ret @@ -345,7 +357,7 @@ class comp(): v.setChars(value) def getValue(self): - return self.element.get("value").encode( "utf-8" ) + return self.element.get("value") def getField(self, name, libraryToo=True): """Return the value of a field named name. The component is first @@ -361,7 +373,7 @@ class comp(): field = self.element.get("field", "name", name) if field == "" and libraryToo: - field = self.libpart.getField(name).encode( "utf-8" ) + field = self.libpart.getField(name) return field def getFieldNames(self): @@ -374,7 +386,7 @@ class comp(): fields = self.element.getChild('fields') if fields: for f in fields.getChildren(): - fieldNames.append( f.get('field','name').encode( "utf-8" ) ) + fieldNames.append( f.get('field','name') ) return fieldNames def getRef(self): @@ -396,7 +408,7 @@ class comp(): return self.element.get("tstamp") def getDescription(self): - return self.libpart.getDescription().encode( "utf-8" ) + return self.libpart.getDescription() class netlist(): @@ -607,7 +619,9 @@ class netlist(): ret.append(c) # Sort first by ref as this makes for easier to read BOM's - ret.sort(key=lambda g: g.getRef()) + def f(v): + return re.sub(r'([A-z]+)[0-9]+', r'\1', v) + '%08i' % int(re.sub(r'[A-z]+([0-9]+)', r'\1', v)) + ret.sort(key=lambda g: f(g.getRef())) return ret @@ -648,11 +662,13 @@ class netlist(): # Each group is a list of components, we need to sort each list first # to get them in order as this makes for easier to read BOM's + def f(v): + return re.sub(r'([A-z]+)[0-9]+', r'\1', v) + '%08i' % int(re.sub(r'[A-z]+([0-9]+)', r'\1', v)) for g in groups: - g = sorted(g, key=lambda g: g.getRef()) + g = sorted(g, key=lambda g: f(g.getRef())) # Finally, sort the groups to order the references alphabetically - groups = sorted(groups, key=lambda group: group[0].getRef()) + groups = sorted(groups, key=lambda group: f(group[0].getRef())) return groups