diff --git a/utils/csv2lib.py b/utils/csv2lib.py new file mode 100644 index 0000000000000000000000000000000000000000..50cce4f28c34298eb7cc8676b2288199536de63f --- /dev/null +++ b/utils/csv2lib.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python + +import sys +import csv + +class Pin(): + def __init__(self, number, name, pin_type, direction, page, posx, posy): + self.number = number + self.name = name + self.pin_type = pin_type + self.direction = direction + self.page = page + self.posx = posx + self.posy = posy + +class Part(): + def __init__(self, name, ref, disp_number, disp_name, unit_count, unit_locked, part_type, csv_stream, out_stream): + self.name = name + self.ref = ref + ''' Y or N for text displayin ''' + self.disp_number = disp_number + self.disp_name = disp_name + ''' Number of unit in the schematic part // Unit different = L same = F''' + self.unit_count = int(unit_count) + self.unit_locked = unit_locked + '''part type: N (normal) P(power)''' + self.part_type = part_type + self.pin_list = [] + self.csv_stream = csv_stream + self.out_stream = out_stream + + def write_pins_text(self): + for pin in self.pin_list: + pin_text = "X %s %s %s %s 50 %s 25 25 %s 1 %s\n" % (pin.name, pin.number, pin.posx, pin.posy, pin.direction, pin.page, pin.pin_type) + self.out_stream.write(pin_text) + + def generate_pins(self): + ''' Pin Format: X name number posx posy length orientation Snum Snom unit convert Etype [shape] ''' + index = 0 + p_index = 0 + page_dict = dict() + posy = 0 + posx = 0 + for row in self.csv_stream.data: + if (index != 0): + pin_number = row[self.csv_stream.pack_col_index] + if (self.unit_count > 1): + pin_page = row[self.csv_stream.page_col_index] + else: + pin_page = "1" + pin_name = row[self.csv_stream.name_col_index] + pin_type = self.get_pin_type(row[self.csv_stream.type_col_index]) + if(pin_number != "0"): + if (self.csv_stream.has_dir == 1): + direction = row[self.csv_stream.direc_col_index] + else: + direction = "L" + + if(pin_page in page_dict): + page_dict[pin_page] = page_dict[pin_page] + 1 + p_index = page_dict[pin_page] + else: + page_dict[pin_page] = 1 + p_index = 1 + + ''' For the moment we will only prepare the file for editing ''' + ''' posy = ((p_index * -1) - 1) * 50 + posx = 100''' + if (direction == "L" or direction == "R"): + posy = posy - 50 + else: + posx = posx +50 + self.pin_list.append(Pin(pin_number, pin_name, pin_type, direction, pin_page, posx, posy)) + print(pin_number) + + index = index + 1 + pass + + def get_pin_type(self, pin_type_csv): + pin_type = pin_type_csv + if (pin_type == "I/O"): + pin_type = "B" + elif (pin_type == "I"): + pin_type = "I" + elif (pin_type == "O"): + pin_type = "O" + elif (pin_type == "S"): + pin_type = "W" + else: + pin_type = "B" + return pin_type + + def write_header_text(self): + ''' replace with date ''' + header_text = "EESchema-LIBRARY Version 2.3 Date: 17/06/2012 19:45:46\n" + ''' Define the general settings of the component ''' + header_text += "DEF %s %s 0 40 %s %s %s %s %s\n" % (self.name, self.ref, self.disp_number, self.disp_name, self.unit_count, self.unit_locked, self.part_type) + ''' F0 = reference F1 = name the user will place it in the kicad editor''' + header_text += "F0 \"%s\" 0 0 50 H V C CNN\n" % (self.ref) + header_text += "F1 \"%s\" 0 0 50 H V C CNN\n" % (self.name) + header_text += "DRAW\n" + self.out_stream.write(header_text) + + def write_footer_text(self): + footer_text = "ENDDRAW\nENDDEF\n#\n#End Library" + self.out_stream.write(footer_text) + +class ExcelDefaultFR(csv.excel): + delimiter = ";" + +class CSV_Utils(): + def __init__(self, fname, package): + self.fname = fname + self.current_line = 0 + self.package = package + self.has_dir = 0 + + def read_file(self): + datafile = open(self.fname, "r") + ''' render the csv data subscriptable ''' + self.data = list(csv.reader(datafile, ExcelDefaultFR())) + datafile.close() + return self.check_csvdata() + + def check_csvdata(self): + self.header = self.data[0] + if self.package in self.header: + print("Package %s found\n" % self.package) + package_page = "%s_PAGE" % self.package + if package_page in self.header: + self.pack_col_index = self.header.index(self.package) + self.page_col_index = self.header.index(package_page) + self.name_col_index = self.header.index("NAME") + self.type_col_index = self.header.index("TYPE") + if "PIN_DIRECTION" in self.header: + self.direc_col_index = self.header.index("PIN_DIRECTION") + self.has_dir = 1 + return 1 + print("Please correct your CSV file Header\n") + return 0 + +class OutFile(): + def __init__(self, fname): + self.filename = fname + pass + + def write(self, buffer): + self.file.write(buffer) + + def open_out_file(self): + self.file = open(self.filename, "w") + + def close_file(self): + self.file.close() + +class Utils(): + def __init__(self): + pass + + ''' kicad_unit = int(mm * 39.3700787402 * 10) ''' + @staticmethod + def get_kicad_unit(mm): + print("mm: %s - kicad: %s\n" % (mm, (mm * 39.3700787402 * 10.0))) + return (mm * 39.3700787402 * 10.0) + +def main(): + if len(sys.argv) < 3: + print("python csv2lib.py datafile package part_name unit_count ref outfile\n") + sys.exit(2) + fname = sys.argv[1] + package = sys.argv[2] + part_name = sys.argv[3] + unit_count = sys.argv[4] + ref = sys.argv[5] + outfile = sys.argv[6] + csv_stream = CSV_Utils(fname, package) + if (csv_stream.read_file() != 1): + sys.exit(2) + out_stream = OutFile(outfile) + out_stream.open_out_file() + part = Part(part_name, ref, "Y", "Y", unit_count, "L", "N", csv_stream, out_stream) + part.write_header_text() + part.generate_pins() + part.write_pins_text() + part.write_footer_text() + out_stream.close_file() + +if __name__ == '__main__': + main() +