Commit 63c3e38e authored by nats's avatar nats

moved csv2lib util from an other git repo

parent 336ef777
#!/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()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment