-
Notifications
You must be signed in to change notification settings - Fork 0
/
gen.py
223 lines (162 loc) · 6.56 KB
/
gen.py
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#!/usr/bin/python
# -*- coding: utf8 -*-
# TODO:
# единицы измерения номиналов при создании пикадовой схемы писать строго обязательно:
# (kOhm, MOhm, pF). При задании номинала конденсатора в P-CAD писать в следующем
# порядке: вольтаж, емкость, процентность использовать исключительно латиницу:
# uF, V
# Сжимать позиционные обозначения по горизонтали, только если одно из них
# перевалило за 10
# Функция pe3 содержит данные, почти готовые для создания спецификации. Надо
# их или временно сохранить и потом передать дальше, или вынести это в одну
# (несколько?) внешнюю функцию
#print tab.dtype.names
import string
import re
import os
import tabular as tb
from operator import itemgetter # for sort() and sorted()
import argparse
import sys
import prepare
import utils
import pe3
from globalvars import *
def deleterow(input_tab, m): #{{{
""" Функция удаления рядов из таблицы.
Принимает входную таблицу и номер ряда, который надо удалить.
Возвращает таблицу без указанного ряда.
Удалить напрямую нельзя, зато можно откусить 2 куска,
а потом склеить их вместе.
"""
if m == 0:
return input_tab[1:]
elif m == len(tmp_tab):
return input_tab[:-1]
else:
aa = input_tab[:m]
bb = input_tab[(m+1):]
aa = aa.rowstack(bb)
aa = prepare.columnwider(aa) # раздуем таблицу
return aa
#}}}
def savelatex(filename, array): #{{{
""" Функция сохранения таблицы в файл.
Принимает имя выходного файла и таблицу, которую надо сохранить
Не возвращает ничего
Функция сохранения, встроенная в tabular, вписывает названия колонок в
первую строку выходного файла. Нам это не подходит. Придется удалять уже
после сохранения файла на диск.
"""
array.saveSV('table.tmp', delimiter='&')
f = open('table.tmp','r')
aa = f.readlines()
aa = aa[1:]
f.close()
f = open(filename,'w')
m = 0
while m < len(aa):
f.write(aa[m])
m += 1
f.close()
os.remove('table.tmp')
#}}}
# command line parser {{{
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
# Usage text
description=('''\
------------------------ P-CAD section ---------------------------------------
Open schematic design in P-CAD. Go to menu File -> Reports.
You will see configuration dialog. Tune them.
Report destination: File
Style Format: Separated List
List Separator: &
Reports to generate: check only "Attributes (atr)"
Press "Customize"
On tab "Format":
Ensure that "Include Column Header" is checked (by default is checked)
On tab "Selection":
Chose needed component attributes (all by default)
On tab "Sort":
"Selected Field" must be "RefDes" (by default)
Other tabs leave as is.
Press "OK"
On main dialog specify output filename
Press "Generate"
Note: You may record all this actions to P-CAD macro, and call them later.
Now you have list of components.
Process generated list by this script.
------------------------ Script section --------------------------------------
'''))
parser.add_argument('input_file',
metavar='filename',
type=file,
help='path to file, generated by P-CAD')
parser.add_argument('-p','--pe3',
metavar='FILENAME',
type=str,
default='pe3_table.tex',
help='save pe3 to %(metavar)s (default: %(default)s)')
parser.add_argument('-s','--spec',
metavar='FILENAME',
type=str,
default='spec_table.tex',
help='save specification to %(metavar)s (default: %(default)s)')
parser.add_argument('-b','--bill',
metavar='FILENAME',
type=str,
default='bill_table.tex',
help='save bill list to %(metavar)s (default: %(default)s)')
args = parser.parse_args()
# cleaning input file and reading it to table
# read input file to the buffer
raw_input_file = args.input_file.readlines()
out = open('cleaned_output.tmp','w')
out = open('cleaned_output.tmp','r+')
# delete empty lines and redundant quotes
for line in (raw_input_file):
# использование в регулярках '$' тут почему-то не прокатывает
# \r\n - виндовый конец строки, \n - юниксовый, так, на всякий случай
if re.search('^[ ]*\r\n|^[ ]*\n', line) == None: # if string non empty
line = re.sub('"','',line) # delete all quotes
line = re.sub('[ ]*&[ ]*','&',line) # delete unneeded spaces
# screaning latex special symbols
line = re.sub('\\\\','\\\\textbackslash ',line)
line = re.sub('%','\%',line)
line = re.sub('_','\_',line)
line = re.sub('#','\#',line)
line = re.sub('\^','\^',line)
line = re.sub('~','\~',line)
line = re.sub('{','\{',line)
line = re.sub('}','\}',line)
line = re.sub('\$','\$',line)
out.write(line)
# Hack!
# This line tells tabarray, that all columns contain string values
# not a numbers. Remove it after loading file
last_line = re.sub('[\t]','fake\t',raw_input_file[0])
out.write(last_line)
out.close()
# reading file into array
raw = tb.tabarray(SVfile = "cleaned_output.tmp",delimiter = '\t')
raw = raw[:-1] # remove hack-line
raw = utils.columnwider(raw)
tmp_tab = raw # create temporal array
os.remove("cleaned_output.tmp") # remove temporal file
#}}}
# create common data base for later processing
bd = prepare.prepare(raw)
# build component list PE3
pe3_array = pe3.pe3(bd)
# save table to file
savelatex(args.pe3, pe3_array)
# автоматический aggregate годится только для генерации спецификации
# aggregate rows
#def refdes_agg(i):
# return i[0]
#
#tmp_tab = raw.aggregate(On=['Title','Type','SType','Value','Docum','Addit','Note','OrderCode'])
#
#print tmp_tab
#