PCB element Python types
Stefan Schuermans authored 3 years ago
|
1) """
2) Types representing entities of GNU PCB files.
3) """
4)
5) import collections
6)
7)
|
PCB coordinate type
Stefan Schuermans authored 3 years ago
|
8) class Coordinate():
9) """
10) A coordinate in a PCB file.
11) """
12)
13) MIL = 1e2
14) MM = 1e5 / 25.4
15)
16) def __init__(self, raw: float = 0):
17) self._raw = round(raw)
18)
19) def __repr__(self) -> str:
20) return f'Coordinate({self._raw:d})'
21)
22) def _compare(self, other) -> int:
23) if not isinstance(other, Coordinate):
24) raise ValueError(f'{type(self).__name__:s} cannot be'
25) f' compared to {type(other).__name__:s}')
26) if self._raw < other._raw:
27) return -1
28) if self._raw > other._raw:
29) return 1
30) return 0
31)
32) def __eq__(self, other) -> bool:
33) return self._compare(other) == 0
34)
35) def __ne__(self, other) -> bool:
36) return self._compare(other) != 0
37)
38) def __lt__(self, other) -> bool:
39) return self._compare(other) < 0
40)
41) def __le__(self, other) -> bool:
42) return self._compare(other) <= 0
43)
44) def __gt__(self, other) -> bool:
45) return self._compare(other) > 0
46)
47) def __ge__(self, other) -> bool:
48) return self._compare(other) >= 0
49)
50) @property
51) def mil(self) -> float:
52) return self._raw / self.MIL
53)
54) @mil.setter
55) def mil(self, mil: float):
56) self._raw = round(mil * self.MIL)
57)
58) @property
59) def mm(self) -> float:
60) return self._raw / self.MM
61)
62) @mm.setter
63) def mm(self, mm: float):
64) self._raw = round(mm * self.MM)
65)
66) @property
67) def raw(self) -> int:
68) return self._raw
69)
70) @raw.setter
71) def raw(self, raw: float):
72) self._raw = round(raw)
73)
74)
|
PCB element Python types
Stefan Schuermans authored 3 years ago
|
75) class Struct:
76) """
77) Base class for struct-like Python objects
78) """
79)
80) _attrs = collections.OrderedDict() # attribute name: str -> default value
81)
82) def __init__(self, **kwargs):
83) for name, def_val in self._attrs.items():
84) setattr(self, name, def_val)
85) for name, val in kwargs.items():
86) if name not in self._attrs:
87) raise ValueError(
88) f'{type(self).__name__:s} does not have attribute {name:s}'
89) )
90) setattr(self, name, val)
91)
92) def __repr__(self) -> str:
93) vals = ', '.join([
94) f'{name:s}={repr(getattr(self, name)):s}'
95) for name in self._attrs.keys()
96) ])
97) return f'{type(self).__name__:s}({vals:s})'
98)
99) def _compare(self, other) -> int:
100) if self._attrs != other._attrs:
101) raise ValueError(f'{type(self).__name__:s} cannot be'
102) f' compared to {type(other).__name__:s}')
103) for name in self._attrs:
104) s = getattr(self, name)
105) o = getattr(other, name)
106) if s < o:
107) return -1
108) if s > o:
109) return 1
110) return 0
111)
112) def __eq__(self, other) -> bool:
113) return self._compare(other) == 0
114)
115) def __ne__(self, other) -> bool:
116) return self._compare(other) != 0
117)
118) def __lt__(self, other) -> bool:
119) return self._compare(other) < 0
120)
121) def __le__(self, other) -> bool:
122) return self._compare(other) <= 0
123)
124) def __gt__(self, other) -> bool:
125) return self._compare(other) > 0
126)
127) def __ge__(self, other) -> bool:
128) return self._compare(other) >= 0
129)
130)
131) class Element(Struct):
132) """
133) Element entity in a GNU PCB file.
134) """
135)
|
PCB coordinate type
Stefan Schuermans authored 3 years ago
|
136) _attrs = collections.OrderedDict([
137) # attributes
138) ('s_flags', []),
139) ('desc', ''),
140) ('name', ''),
141) ('value', ''),
142) ('m_x', Coordinate(0)),
143) ('m_y', Coordinate(0)),
144) ('t_x', Coordinate(0)),
145) ('t_y', Coordinate(0)),
146) ('t_dir', 0),
147) ('t_scale', 0.0),
148) ('t_s_flags', []),
149) ('body', [])
150) ])
|
PCB element Python types
Stefan Schuermans authored 3 years ago
|
151)
152) def __init__(self, **kwargs):
153) super().__init__(**kwargs)
154)
155)
156) class ElementArc(Struct):
157) """
158) ElementArc entity in a GNU PCB file.
159) """
160)
|
PCB coordinate type
Stefan Schuermans authored 3 years ago
|
161) _attrs = collections.OrderedDict([
162) # attributes
163) ('r_x', Coordinate(0)),
164) ('r_y', Coordinate(0)),
165) ('width', Coordinate(0)),
166) ('height', Coordinate(0)),
167) ('start_angle', 0.0),
168) ('end_angle', 0.0),
169) ('thickness', Coordinate(0))
170) ])
|
PCB element Python types
Stefan Schuermans authored 3 years ago
|
171)
172) def __init__(self, **kwargs):
173) super().__init__(**kwargs)
174)
175)
176) class ElementLine(Struct):
177) """
178) ElementLine entity in a GNU PCB file.
179) """
180)
|
PCB coordinate type
Stefan Schuermans authored 3 years ago
|
181) _attrs = collections.OrderedDict([
182) # attributes
183) ('r_x1', Coordinate(0)),
184) ('r_y1', Coordinate(0)),
185) ('r_x2', Coordinate(0)),
186) ('r_y2', Coordinate(0)),
187) ('thickness', Coordinate(0))
188) ])
|
PCB element Python types
Stefan Schuermans authored 3 years ago
|
189)
190) def __init__(self, **kwargs):
191) super().__init__(**kwargs)
192)
193)
194) class Pad(Struct):
195) """
196) Pad entity in a GNU PCB file.
197) """
198)
199) _attrs = collections.OrderedDict([
|
PCB coordinate type
Stefan Schuermans authored 3 years ago
|
200) # attributes
201) ('r_x1', Coordinate(0)),
202) ('r_y1', Coordinate(0)),
203) ('r_x2', Coordinate(0)),
204) ('r_y2', Coordinate(0)),
205) ('thickness', Coordinate(0)),
206) ('clearance', Coordinate(0)),
207) ('mask', Coordinate(0)),
|
PCB element Python types
Stefan Schuermans authored 3 years ago
|
208) ('name', ''),
209) ('number', ''),
210) ('s_flags', []),
211) ])
212)
213) def __init__(self, **kwargs):
214) super().__init__(**kwargs)
215)
216)
217) class Pin(Struct):
218) """
219) Pin entity in a GNU PCB file.
220) """
221)
222) _attrs = collections.OrderedDict([
|
PCB coordinate type
Stefan Schuermans authored 3 years ago
|
223) # attributes
224) ('r_x', Coordinate(0)),
225) ('r_y', Coordinate(0)),
226) ('thickness', Coordinate(0)),
227) ('clearance', Coordinate(0)),
228) ('mask', Coordinate(0)),
229) ('drill', Coordinate(0)),
|