Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/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 = []
posx = []
for i in range(0, self.unit_count + 1):
posy.append(0)
posx.append(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[page_num] = posy[page_num] - 50
posx[page_num] = posx[page_num] +50
self.pin_list.append(Pin(pin_number, pin_name, pin_type, direction, pin_page, posx[page_num], posy[page_num]))
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
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()